react-doctor 0.8.1-dev.5774353 → 0.8.1-dev.5b468f8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
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]="9a89aa42-c62d-57b9-a5d7-36051dd45bb3")}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]="d6dc69de-43c3-570a-8cc4-be7d4a3605ac")}catch(e){}}();
3
3
  import { r as __toESM$1, t as __commonJSMin$1 } from "./chunk-N93fKeF6.js";
4
4
  import { createRequire } from "node:module";
5
5
  import reactDoctorPlugin, { 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_RULES, classifySecurityScanFile, collectCrossFileDependencyProbes, resetManifestCaches, shouldReadSecurityScanContent } from "oxlint-plugin-react-doctor";
@@ -32854,44 +32854,6 @@ var AmbiguousProjectError = class extends Error {
32854
32854
  }
32855
32855
  };
32856
32856
  const isProjectDiscoveryError = (value) => value instanceof ProjectNotFoundError || value instanceof NoReactDependencyError || value instanceof PackageJsonNotFoundError || value instanceof NotADirectoryError || value instanceof AmbiguousProjectError;
32857
- const isErrnoException = (error) => error instanceof Error && "code" in error;
32858
- const IGNORABLE_READDIR_ERROR_CODES = new Set([
32859
- "EACCES",
32860
- "EPERM",
32861
- "ENOENT",
32862
- "ENOTDIR",
32863
- "EINVAL",
32864
- "ELOOP",
32865
- "ENAMETOOLONG"
32866
- ]);
32867
- const isIgnorableReaddirError = (error) => isErrnoException(error) && typeof error.code === "string" && IGNORABLE_READDIR_ERROR_CODES.has(error.code);
32868
- const readDirectoryEntries = (directoryPath) => {
32869
- try {
32870
- return NFS.readdirSync(directoryPath, { withFileTypes: true });
32871
- } catch (error) {
32872
- if (isIgnorableReaddirError(error)) return [];
32873
- throw error;
32874
- }
32875
- };
32876
- const isFile = (filePath) => {
32877
- try {
32878
- return NFS.statSync(filePath).isFile();
32879
- } catch {
32880
- return false;
32881
- }
32882
- };
32883
- const isDirectory = (directoryPath) => {
32884
- try {
32885
- return NFS.statSync(directoryPath).isDirectory();
32886
- } catch {
32887
- return false;
32888
- }
32889
- };
32890
- const isPlainObject = (value) => {
32891
- if (typeof value !== "object" || value === null || Array.isArray(value)) return false;
32892
- const prototype = Object.getPrototypeOf(value);
32893
- return prototype === null || prototype === Object.prototype;
32894
- };
32895
32857
  const SOURCE_FILE_PATTERN = /\.(tsx?|jsx?|mts|mjs)$/;
32896
32858
  const GENERATED_BUNDLE_FILE_PATTERN = /\.(iife|umd|global|min)\.m?js$/i;
32897
32859
  const GENERATED_SOURCE_DIRECTORY_PATTERN = /(?:^|\/)__generated__\//;
@@ -33050,6 +33012,44 @@ const SUPPLY_CHAIN_OVERLAP_TIMEOUT_MS = 9e4;
33050
33012
  const SUPPLY_CHAIN_CACHE_TTL_MS = 864e5;
33051
33013
  const SUPPLY_CHAIN_CACHE_SUBDIR = "supply-chain";
33052
33014
  const SUPPLY_CHAIN_IGNORED_PACKAGES = new Set(["next"]);
33015
+ const isErrnoException = (error) => error instanceof Error && "code" in error;
33016
+ const IGNORABLE_READDIR_ERROR_CODES = new Set([
33017
+ "EACCES",
33018
+ "EPERM",
33019
+ "ENOENT",
33020
+ "ENOTDIR",
33021
+ "EINVAL",
33022
+ "ELOOP",
33023
+ "ENAMETOOLONG"
33024
+ ]);
33025
+ const isIgnorableReaddirError = (error) => isErrnoException(error) && typeof error.code === "string" && IGNORABLE_READDIR_ERROR_CODES.has(error.code);
33026
+ const readDirectoryEntries = (directoryPath) => {
33027
+ try {
33028
+ return NFS.readdirSync(directoryPath, { withFileTypes: true });
33029
+ } catch (error) {
33030
+ if (isIgnorableReaddirError(error)) return [];
33031
+ throw error;
33032
+ }
33033
+ };
33034
+ const isFile = (filePath) => {
33035
+ try {
33036
+ return NFS.statSync(filePath).isFile();
33037
+ } catch {
33038
+ return false;
33039
+ }
33040
+ };
33041
+ const isDirectory = (directoryPath) => {
33042
+ try {
33043
+ return NFS.statSync(directoryPath).isDirectory();
33044
+ } catch {
33045
+ return false;
33046
+ }
33047
+ };
33048
+ const isPlainObject = (value) => {
33049
+ if (typeof value !== "object" || value === null || Array.isArray(value)) return false;
33050
+ const prototype = Object.getPrototypeOf(value);
33051
+ return prototype === null || prototype === Object.prototype;
33052
+ };
33053
33053
  const lastSourceMappingUrl = (fileContent) => {
33054
33054
  const lastReference = [...fileContent.matchAll(/\/\/# sourceMappingURL=(\S+)/g)].at(-1);
33055
33055
  return lastReference ? lastReference[1] : null;
@@ -33375,10 +33375,10 @@ const FALLBACK_TSCONFIG_FILENAMES = ["tsconfig.app.json", "tsconfig.build.json"]
33375
33375
  const FRAMEWORK_PACKAGES = {
33376
33376
  next: "nextjs",
33377
33377
  "@tanstack/react-start": "tanstack-start",
33378
- vite: "vite",
33379
- "react-scripts": "cra",
33380
33378
  "@remix-run/react": "remix",
33381
33379
  gatsby: "gatsby",
33380
+ vite: "vite",
33381
+ "react-scripts": "cra",
33382
33382
  expo: "expo",
33383
33383
  "react-native": "react-native"
33384
33384
  };
@@ -33402,11 +33402,17 @@ const NEXT_CONFIG_FILENAMES = [
33402
33402
  ];
33403
33403
  const BABEL_CONFIG_FILENAMES = [
33404
33404
  ".babelrc",
33405
+ ".babelrc.js",
33405
33406
  ".babelrc.json",
33407
+ ".babelrc.cjs",
33408
+ ".babelrc.mjs",
33409
+ ".babelrc.cts",
33406
33410
  "babel.config.js",
33407
33411
  "babel.config.json",
33408
33412
  "babel.config.cjs",
33409
- "babel.config.mjs"
33413
+ "babel.config.mjs",
33414
+ "babel.config.ts",
33415
+ "babel.config.cts"
33410
33416
  ];
33411
33417
  const VITE_CONFIG_FILENAMES = [
33412
33418
  "vite.config.js",
@@ -33418,12 +33424,28 @@ const VITE_CONFIG_FILENAMES = [
33418
33424
  "vitest.config.ts",
33419
33425
  "vitest.config.js"
33420
33426
  ];
33427
+ const RSBUILD_CONFIG_FILENAMES = [
33428
+ "rsbuild.config.ts",
33429
+ "rsbuild.config.js",
33430
+ "rsbuild.config.mts",
33431
+ "rsbuild.config.mjs",
33432
+ "rsbuild.config.cts",
33433
+ "rsbuild.config.cjs"
33434
+ ];
33435
+ const RSPACK_CONFIG_FILENAMES = [
33436
+ "rspack.config.ts",
33437
+ "rspack.config.js",
33438
+ "rspack.config.mts",
33439
+ "rspack.config.mjs",
33440
+ "rspack.config.cts",
33441
+ "rspack.config.cjs"
33442
+ ];
33421
33443
  const EXPO_APP_CONFIG_FILENAMES = [
33422
33444
  "app.json",
33423
33445
  "app.config.js",
33424
33446
  "app.config.ts"
33425
33447
  ];
33426
- const REACT_COMPILER_PACKAGE_REFERENCE_PATTERN = /babel-plugin-react-compiler|react-compiler-runtime|["']react-compiler["']/;
33448
+ const REACT_COMPILER_PACKAGE_REFERENCE_PATTERN = /babel-plugin-react-compiler|react-compiler-runtime|reactCompilerPreset\s*\(|["']react-compiler["']/;
33427
33449
  const REACT_COMPILER_ENABLED_FLAG_PATTERN = /["']?reactCompiler["']?\s*:\s*(?:true\b|\{)/;
33428
33450
  const STATIC_EXPORT_OUTPUT_PATTERN = /(?:^|[^.\w])["']?output["']?\s*:\s*["']export["']/m;
33429
33451
  const hasCompilerPackage = (packageJson, compilerPackages) => {
@@ -33458,6 +33480,8 @@ const detectReactCompiler = (directory, packageJson) => {
33458
33480
  if (hasCompilerInConfigFiles(directory, NEXT_CONFIG_FILENAMES)) return true;
33459
33481
  if (hasCompilerInConfigFiles(directory, BABEL_CONFIG_FILENAMES)) return true;
33460
33482
  if (hasCompilerInConfigFiles(directory, VITE_CONFIG_FILENAMES)) return true;
33483
+ if (hasCompilerInConfigFiles(directory, RSBUILD_CONFIG_FILENAMES)) return true;
33484
+ if (hasCompilerInConfigFiles(directory, RSPACK_CONFIG_FILENAMES)) return true;
33461
33485
  if (hasCompilerInConfigFiles(directory, EXPO_APP_CONFIG_FILENAMES)) return true;
33462
33486
  return hasCompilerPackageInAncestors(directory, REACT_COMPILER_TRANSFORM_PACKAGES);
33463
33487
  };
@@ -33466,7 +33490,7 @@ const detectNextjsStaticExport = (directory) => NEXT_CONFIG_FILENAMES.some((file
33466
33490
  const filePath = Path.join(directory, filename);
33467
33491
  return isFile(filePath) && STATIC_EXPORT_OUTPUT_PATTERN.test(NFS.readFileSync(filePath, "utf-8"));
33468
33492
  });
33469
- const UNRESOLVABLE_PROTOCOL_VERSION = /^(?:file|git|github|https?|link|patch|portal|workspace|npm):/i;
33493
+ const UNRESOLVABLE_PROTOCOL_VERSION = /^(?:catalog|file|git|github|https?|link|patch|portal|workspace|npm):/i;
33470
33494
  const DIST_TAG_VERSION = /^[a-z][a-z0-9._-]*$/i;
33471
33495
  const WILDCARD_VERSION = /^[*xX](?:\.[*xX])*$/;
33472
33496
  const NPM_ALIAS_VERSION = /^npm:(?:@[^/]+\/[^@]+|[^@]+)@(.+)$/i;
@@ -33599,6 +33623,16 @@ const getLowestDependencyMajor = (version) => {
33599
33623
  }
33600
33624
  return lowestMajor;
33601
33625
  };
33626
+ const getDependencyMajorWithinSupportedRange = (version, latestSupportedMajor) => {
33627
+ const normalizedVersion = normalizeDependencyVersion(version);
33628
+ if (normalizedVersion === null) return null;
33629
+ const validRange = import_semver.validRange(normalizedVersion);
33630
+ if (validRange === null) return null;
33631
+ const minimumVersion = import_semver.minVersion(validRange);
33632
+ if (minimumVersion === null || minimumVersion.major > latestSupportedMajor) return null;
33633
+ if (import_semver.intersects(validRange, `>=${latestSupportedMajor + 1}.0.0`)) return null;
33634
+ return minimumVersion.major;
33635
+ };
33602
33636
  const isConcreteDependencyVersion = (version) => {
33603
33637
  const normalizedVersion = normalizeDependencyVersion(version);
33604
33638
  return normalizedVersion !== null && /\d/.test(normalizedVersion);
@@ -33642,9 +33676,18 @@ const parseReactMajorMinor = (reactVersion) => {
33642
33676
  };
33643
33677
  };
33644
33678
  const parseLowerBoundVersion = (versionSpec) => import_semver.validRange(versionSpec) !== null ? import_semver.minVersion(versionSpec) : import_semver.coerce(versionSpec);
33645
- const parseTailwindMajorMinor = (tailwindVersion) => {
33646
- if (typeof tailwindVersion !== "string") return null;
33647
- const trimmed = tailwindVersion.trim();
33679
+ const parseThreeRelease = (threeVersion) => {
33680
+ if (typeof threeVersion !== "string") return null;
33681
+ const normalizedVersion = normalizeDependencyVersion(threeVersion);
33682
+ if (normalizedVersion === null) return null;
33683
+ const lowerBound = parseLowerBoundVersion(normalizedVersion);
33684
+ if (lowerBound === null) return null;
33685
+ if (lowerBound.major > 0) return Number.MAX_SAFE_INTEGER;
33686
+ return lowerBound.minor > 0 ? lowerBound.minor : null;
33687
+ };
33688
+ const parseDependencyMajorMinor = (dependencyVersion) => {
33689
+ if (typeof dependencyVersion !== "string") return null;
33690
+ const trimmed = dependencyVersion.trim();
33648
33691
  if (trimmed.length === 0) return null;
33649
33692
  const lowerBound = parseLowerBoundVersion(trimmed);
33650
33693
  if (lowerBound === null || lowerBound.major <= 0) return null;
@@ -33653,6 +33696,7 @@ const parseTailwindMajorMinor = (tailwindVersion) => {
33653
33696
  minor: lowerBound.minor
33654
33697
  };
33655
33698
  };
33699
+ const parseTailwindMajorMinor = (tailwindVersion) => parseDependencyMajorMinor(tailwindVersion);
33656
33700
  const hasUpperBoundOnlyPeerRange = (range) => {
33657
33701
  if (typeof range !== "string") return false;
33658
33702
  const normalizedRange = normalizeDependencyVersion(range);
@@ -33674,7 +33718,7 @@ const resolveEffectiveReactMajor = (reactVersion, packageJson) => {
33674
33718
  if (peerFloor === null) return hasUpperBoundOnlyPeerRange(peerReactRange) ? null : installedReactMajor;
33675
33719
  return installedReactMajor !== null ? Math.min(installedReactMajor, peerFloor) : peerFloor;
33676
33720
  };
33677
- const isCatalogReference = (version) => version.startsWith("catalog:");
33721
+ const isCatalogReference = (version) => typeof version === "string" && version.startsWith("catalog:");
33678
33722
  const extractCatalogName = (version) => {
33679
33723
  if (!isCatalogReference(version)) return null;
33680
33724
  const name = version.slice(8).trim();
@@ -33824,6 +33868,12 @@ const TAILWIND_ZOD_SECTIONS = [
33824
33868
  "devDependencies",
33825
33869
  "peerDependencies"
33826
33870
  ];
33871
+ const DEPENDENCY_SPEC_SECTIONS = [
33872
+ "dependencies",
33873
+ "devDependencies",
33874
+ "peerDependencies",
33875
+ "optionalDependencies"
33876
+ ];
33827
33877
  const EMPTY_DEPENDENCY_INFO = {
33828
33878
  reactVersion: null,
33829
33879
  tailwindVersion: null,
@@ -33833,7 +33883,7 @@ const EMPTY_DEPENDENCY_INFO = {
33833
33883
  const pickConcreteVersion = (packageJson, packageName, sections) => {
33834
33884
  for (const section of sections) {
33835
33885
  const version = packageJson[section]?.[packageName];
33836
- if (version === void 0) continue;
33886
+ if (typeof version !== "string") continue;
33837
33887
  if (isCatalogReference(version)) return null;
33838
33888
  if (isConcreteDependencyVersion(version)) return version;
33839
33889
  }
@@ -33865,13 +33915,16 @@ const extractDependencyInfo = (packageJson) => {
33865
33915
  };
33866
33916
  };
33867
33917
  const getDependencySpec = (packageJson, packageName) => {
33868
- const spec = packageJson.dependencies?.[packageName] ?? packageJson.devDependencies?.[packageName] ?? packageJson.peerDependencies?.[packageName] ?? packageJson.optionalDependencies?.[packageName];
33869
- return typeof spec === "string" ? spec : null;
33918
+ for (const section of DEPENDENCY_SPEC_SECTIONS) {
33919
+ const spec = packageJson[section]?.[packageName];
33920
+ if (typeof spec === "string") return spec;
33921
+ }
33922
+ return null;
33870
33923
  };
33871
33924
  const getDependencyDeclaration = ({ packageJson, packageName, sections }) => {
33872
33925
  for (const section of sections) {
33873
33926
  const version = packageJson[section]?.[packageName];
33874
- if (version === void 0) continue;
33927
+ if (typeof version !== "string") continue;
33875
33928
  return {
33876
33929
  catalogReference: extractCatalogName(version) ?? null,
33877
33930
  hasDeclaration: true,
@@ -33905,24 +33958,15 @@ const getPreactVersion = (packageJson) => {
33905
33958
  ...packageJson.devDependencies
33906
33959
  }.preact ?? null;
33907
33960
  };
33908
- const TANSTACK_QUERY_PACKAGES = new Set([
33909
- "@tanstack/react-query",
33910
- "@tanstack/query-core",
33911
- "react-query"
33912
- ]);
33913
- const hasTanStackQuery = (packageJson) => {
33914
- const allDependencies = {
33915
- ...packageJson.peerDependencies,
33916
- ...packageJson.dependencies,
33917
- ...packageJson.devDependencies
33918
- };
33919
- return Object.keys(allDependencies).some((packageName) => TANSTACK_QUERY_PACKAGES.has(packageName));
33920
- };
33921
- const resolveCatalogBackedDependencyVersion = ({ rootDirectory, rootPackageJson, packageName, version }) => {
33961
+ const resolveCatalogBackedDependencyVersion = ({ rootDirectory, rootPackageJson, packageName, sourceDirectory = rootDirectory, sourcePackageJson = rootPackageJson, version }) => {
33922
33962
  if (version === null || !isCatalogReference(version)) return version;
33923
33963
  const catalogName = extractCatalogName(version);
33924
- const resolvedLocalVersion = resolveCatalogVersion(rootPackageJson, packageName, rootDirectory, catalogName);
33925
- if (resolvedLocalVersion) return resolvedLocalVersion;
33964
+ const resolvedSourceVersion = resolveCatalogVersion(sourcePackageJson, packageName, sourceDirectory, catalogName);
33965
+ if (resolvedSourceVersion) return resolvedSourceVersion;
33966
+ if (sourceDirectory !== rootDirectory || sourcePackageJson !== rootPackageJson) {
33967
+ const resolvedRootVersion = resolveCatalogVersion(rootPackageJson, packageName, rootDirectory, catalogName);
33968
+ if (resolvedRootVersion) return resolvedRootVersion;
33969
+ }
33926
33970
  const monorepoRoot = findMonorepoRoot(rootDirectory);
33927
33971
  if (!monorepoRoot) return version;
33928
33972
  const monorepoPackageJsonPath = Path.join(monorepoRoot, "package.json");
@@ -34120,7 +34164,75 @@ const listWorkspacePackages = (rootDirectory) => {
34120
34164
  }
34121
34165
  return packages;
34122
34166
  };
34167
+ const getPreferredDependencyVersion = ({ packageJson, packageNames }) => {
34168
+ const allDependencies = {
34169
+ ...packageJson.devDependencies,
34170
+ ...packageJson.peerDependencies,
34171
+ ...packageJson.dependencies
34172
+ };
34173
+ for (const packageName of packageNames) {
34174
+ const version = allDependencies[packageName];
34175
+ if (version !== void 0) return version;
34176
+ }
34177
+ return null;
34178
+ };
34179
+ const TANSTACK_REACT_QUERY_PACKAGES = ["@tanstack/react-query", "react-query"];
34180
+ const getTanStackQueryVersion = (packageJson) => {
34181
+ return getPreferredDependencyVersion({
34182
+ packageJson,
34183
+ packageNames: TANSTACK_REACT_QUERY_PACKAGES
34184
+ });
34185
+ };
34186
+ const STYLED_COMPONENTS_PACKAGES = ["styled-components"];
34187
+ const getStyledComponentsVersion = (packageJson) => {
34188
+ return getPreferredDependencyVersion({
34189
+ packageJson,
34190
+ packageNames: STYLED_COMPONENTS_PACKAGES
34191
+ });
34192
+ };
34193
+ const I18N_PACKAGES = [
34194
+ "i18next",
34195
+ "react-i18next",
34196
+ "next-i18next",
34197
+ "react-intl",
34198
+ "next-intl",
34199
+ "use-intl",
34200
+ "@formatjs/intl",
34201
+ "@lingui/core",
34202
+ "@lingui/react",
34203
+ "typesafe-i18n",
34204
+ "@tolgee/react",
34205
+ "react-intl-universal"
34206
+ ];
34207
+ const hasI18nDependency = (packageJson) => {
34208
+ const allDependencies = {
34209
+ ...packageJson.peerDependencies,
34210
+ ...packageJson.dependencies,
34211
+ ...packageJson.devDependencies,
34212
+ ...packageJson.optionalDependencies
34213
+ };
34214
+ return I18N_PACKAGES.some((packageName) => allDependencies[packageName] !== void 0);
34215
+ };
34123
34216
  const REANIMATED_DEPENDENCY_NAME = "react-native-reanimated";
34217
+ const MOBX_REACT_PACKAGE_NAME = "mobx-react";
34218
+ const MOBX_REACT_LITE_PACKAGE_NAME = "mobx-react-lite";
34219
+ const MOBX_STATE_TREE_PACKAGE_NAME = "mobx-state-tree";
34220
+ const MOBX_REACT_OBSERVER_PACKAGE_NAME = "mobx-react-observer";
34221
+ const REACT_THREE_FIBER_DEPENDENCY_NAMES = ["@react-three/fiber", "react-three-fiber"];
34222
+ const REACT_THREE_FIBER_SECTIONS = [
34223
+ "dependencies",
34224
+ "peerDependencies",
34225
+ "optionalDependencies",
34226
+ "devDependencies"
34227
+ ];
34228
+ const THREE_DEPENDENCY_SECTIONS = [
34229
+ "dependencies",
34230
+ "peerDependencies",
34231
+ "optionalDependencies",
34232
+ "devDependencies"
34233
+ ];
34234
+ const REACT_THREE_FIBER_ECOSYSTEM_DEPENDENCY_NAMES = [...REACT_THREE_FIBER_DEPENDENCY_NAMES, "@react-three/drei"];
34235
+ const THREE_DEPENDENCY_NAMES = [...REACT_THREE_FIBER_ECOSYSTEM_DEPENDENCY_NAMES, "three"];
34124
34236
  const SHOPIFY_FLASH_LIST_PACKAGE_NAME = "@shopify/flash-list";
34125
34237
  const resolveWorkspaceDependencyVersion = ({ concreteVersion, packageName, rootDirectory, rootPackageJson, sections, workspaceDirectory, workspacePackageJson }) => {
34126
34238
  const dependencyDeclaration = getDependencyDeclaration({
@@ -34131,7 +34243,7 @@ const resolveWorkspaceDependencyVersion = ({ concreteVersion, packageName, rootD
34131
34243
  if (!dependencyDeclaration.hasDeclaration) return null;
34132
34244
  return concreteVersion ?? resolveCatalogVersion(workspacePackageJson, packageName, workspaceDirectory, dependencyDeclaration.catalogReference) ?? resolveCatalogVersion(rootPackageJson, packageName, rootDirectory, dependencyDeclaration.catalogReference);
34133
34245
  };
34134
- const shouldReplaceReactVersion = (currentVersion, nextVersion) => {
34246
+ const shouldReplaceWithLowerMajor = (currentVersion, nextVersion) => {
34135
34247
  if (!currentVersion) return true;
34136
34248
  const currentMajor = parseReactMajor(currentVersion);
34137
34249
  const nextMajor = parseReactMajor(nextVersion);
@@ -34139,7 +34251,62 @@ const shouldReplaceReactVersion = (currentVersion, nextVersion) => {
34139
34251
  if (nextMajor === null) return false;
34140
34252
  return nextMajor < currentMajor;
34141
34253
  };
34142
- const evaluateManifestFacts = (facts, packageJson, directory) => {
34254
+ const shouldReplaceSupportedDependencyFact = (currentFact, nextFact, latestSupportedMajor) => {
34255
+ if (currentFact.version === null) return true;
34256
+ if (nextFact.version === null) return false;
34257
+ const currentMajor = getLowestDependencyMajor(currentFact.version);
34258
+ const nextMajor = getLowestDependencyMajor(nextFact.version);
34259
+ if (currentMajor === null) return false;
34260
+ if (nextMajor === null) return true;
34261
+ if (currentMajor > latestSupportedMajor) return false;
34262
+ if (nextMajor > latestSupportedMajor) return true;
34263
+ return nextMajor < currentMajor;
34264
+ };
34265
+ const shouldReplaceStyledComponentsVersion = (currentVersion, nextVersion) => {
34266
+ if (!currentVersion) return true;
34267
+ const currentMajor = getLowestDependencyMajor(currentVersion);
34268
+ const nextMajor = getLowestDependencyMajor(nextVersion);
34269
+ if (currentMajor === null) return nextMajor !== null && nextMajor < 6;
34270
+ if (nextMajor === null) return currentMajor >= 6;
34271
+ return nextMajor < currentMajor;
34272
+ };
34273
+ const selectOldestDependencyVersion = (currentVersion, nextVersion) => {
34274
+ if (currentVersion === null || nextVersion === null) return null;
34275
+ const current = parseDependencyMajorMinor(currentVersion);
34276
+ const next = parseDependencyMajorMinor(nextVersion);
34277
+ if (current === null) return currentVersion;
34278
+ if (next === null) return nextVersion;
34279
+ if (next.major !== current.major) return next.major < current.major ? nextVersion : currentVersion;
34280
+ return next.minor < current.minor ? nextVersion : currentVersion;
34281
+ };
34282
+ const shouldReplaceMobxFact = (currentFact, nextFact) => {
34283
+ if (currentFact.sourceDirectory === null) return true;
34284
+ if (currentFact.version === null) return false;
34285
+ if (nextFact.version === null) return true;
34286
+ const currentMajor = getDependencyMajorWithinSupportedRange(currentFact.version, 6);
34287
+ const nextMajor = getDependencyMajorWithinSupportedRange(nextFact.version, 6);
34288
+ if (currentMajor === null) return false;
34289
+ if (nextMajor === null) return true;
34290
+ return selectOldestDependencyVersion(currentFact.version, nextFact.version) === nextFact.version;
34291
+ };
34292
+ const collectBindingVersion = (facts, packageJson, directory, packageName) => {
34293
+ const version = getDependencySpec(packageJson, packageName);
34294
+ if (version === null) return;
34295
+ const resolvedVersion = resolveCatalogBackedDependencyVersion({
34296
+ rootDirectory: directory,
34297
+ rootPackageJson: packageJson,
34298
+ packageName,
34299
+ version
34300
+ });
34301
+ if (packageName === MOBX_REACT_PACKAGE_NAME) {
34302
+ facts.mobxReactVersion = facts.hasMobxReact ? selectOldestDependencyVersion(facts.mobxReactVersion, resolvedVersion) : resolvedVersion;
34303
+ facts.hasMobxReact = true;
34304
+ return;
34305
+ }
34306
+ facts.mobxReactLiteVersion = facts.hasMobxReactLite ? selectOldestDependencyVersion(facts.mobxReactLiteVersion, resolvedVersion) : resolvedVersion;
34307
+ facts.hasMobxReactLite = true;
34308
+ };
34309
+ const evaluateManifestFacts = (facts, packageJson, directory, rootDirectory, rootPackageJson) => {
34143
34310
  if (facts.expo.version === null) {
34144
34311
  const spec = getDependencySpec(packageJson, "expo");
34145
34312
  if (spec !== null) facts.expo = {
@@ -34161,6 +34328,36 @@ const evaluateManifestFacts = (facts, packageJson, directory) => {
34161
34328
  sourceDirectory: directory
34162
34329
  };
34163
34330
  }
34331
+ const mobxSpec = getDependencySpec(packageJson, "mobx");
34332
+ if (mobxSpec !== null) {
34333
+ const nextMobxFact = {
34334
+ version: resolveCatalogBackedDependencyVersion({
34335
+ rootDirectory: directory,
34336
+ rootPackageJson: packageJson,
34337
+ packageName: "mobx",
34338
+ version: mobxSpec
34339
+ }),
34340
+ sourceDirectory: directory
34341
+ };
34342
+ if (shouldReplaceMobxFact(facts.mobx, nextMobxFact)) facts.mobx = nextMobxFact;
34343
+ }
34344
+ collectBindingVersion(facts, packageJson, directory, MOBX_REACT_PACKAGE_NAME);
34345
+ collectBindingVersion(facts, packageJson, directory, MOBX_REACT_LITE_PACKAGE_NAME);
34346
+ facts.hasMobxStateTree = facts.hasMobxStateTree || getDependencySpec(packageJson, MOBX_STATE_TREE_PACKAGE_NAME) !== null;
34347
+ facts.hasMobxReactObserver = facts.hasMobxReactObserver || getDependencySpec(packageJson, MOBX_REACT_OBSERVER_PACKAGE_NAME) !== null;
34348
+ const zustandSpec = getDependencySpec(packageJson, "zustand");
34349
+ if (zustandSpec !== null) {
34350
+ const nextZustandFact = {
34351
+ version: resolveCatalogBackedDependencyVersion({
34352
+ rootDirectory: directory,
34353
+ rootPackageJson: packageJson,
34354
+ packageName: "zustand",
34355
+ version: zustandSpec
34356
+ }),
34357
+ sourceDirectory: directory
34358
+ };
34359
+ if (shouldReplaceSupportedDependencyFact(facts.zustand, nextZustandFact, 5)) facts.zustand = nextZustandFact;
34360
+ }
34164
34361
  if (facts.reanimatedVersion === null) {
34165
34362
  const spec = getDependencySpec(packageJson, REANIMATED_DEPENDENCY_NAME);
34166
34363
  if (spec !== null) facts.reanimatedVersion = spec;
@@ -34169,9 +34366,75 @@ const evaluateManifestFacts = (facts, packageJson, directory) => {
34169
34366
  const spec = getDependencySpec(packageJson, "valtio");
34170
34367
  if (spec !== null) facts.valtioVersion = spec;
34171
34368
  }
34369
+ facts.tanstackQueryVersion ??= getTanStackQueryVersion(packageJson);
34370
+ const styledComponentsVersion = resolveCatalogBackedDependencyVersion({
34371
+ rootDirectory: directory,
34372
+ rootPackageJson: packageJson,
34373
+ packageName: "styled-components",
34374
+ version: getStyledComponentsVersion(packageJson)
34375
+ });
34376
+ if (styledComponentsVersion && shouldReplaceStyledComponentsVersion(facts.styledComponentsVersion, styledComponentsVersion)) facts.styledComponentsVersion = styledComponentsVersion;
34377
+ facts.hasI18nLibrary = facts.hasI18nLibrary || hasI18nDependency(packageJson);
34378
+ for (const packageName of REACT_THREE_FIBER_DEPENDENCY_NAMES) {
34379
+ const version = resolveCatalogBackedDependencyVersion({
34380
+ rootDirectory,
34381
+ rootPackageJson,
34382
+ sourceDirectory: directory,
34383
+ sourcePackageJson: packageJson,
34384
+ packageName,
34385
+ version: getDependencyDeclaration({
34386
+ packageName,
34387
+ packageJson,
34388
+ sections: REACT_THREE_FIBER_SECTIONS
34389
+ }).version
34390
+ });
34391
+ if (version === null) continue;
34392
+ if (shouldReplaceWithLowerMajor(facts.reactThreeFiber.version, version)) facts.reactThreeFiber = {
34393
+ packageName,
34394
+ version,
34395
+ sourceDirectory: directory
34396
+ };
34397
+ }
34398
+ const threeVersion = resolveCatalogBackedDependencyVersion({
34399
+ rootDirectory,
34400
+ rootPackageJson,
34401
+ sourceDirectory: directory,
34402
+ sourcePackageJson: packageJson,
34403
+ packageName: "three",
34404
+ version: getDependencyDeclaration({
34405
+ packageName: "three",
34406
+ packageJson,
34407
+ sections: THREE_DEPENDENCY_SECTIONS
34408
+ }).version
34409
+ });
34410
+ if (threeVersion !== null) {
34411
+ const currentRelease = parseThreeRelease(facts.threeVersion);
34412
+ const nextRelease = parseThreeRelease(threeVersion);
34413
+ if (facts.threeVersion === null || nextRelease !== null && (currentRelease === null || nextRelease < currentRelease)) facts.threeVersion = threeVersion;
34414
+ }
34172
34415
  facts.hasReactNativeAwarePackage = facts.hasReactNativeAwarePackage || isPackageJsonReactNativeAware(packageJson);
34173
34416
  facts.hasReanimatedAwarePackage = facts.hasReanimatedAwarePackage || isPackageJsonReanimatedAware(packageJson);
34174
34417
  facts.hasSsrDependency = facts.hasSsrDependency || isPackageJsonSsrAware(packageJson);
34418
+ const remotionSpec = getDependencySpec(packageJson, "remotion");
34419
+ if (remotionSpec !== null) {
34420
+ facts.hasRemotionDependency = true;
34421
+ const resolvedRemotionVersion = resolveCatalogBackedDependencyVersion({
34422
+ rootDirectory,
34423
+ rootPackageJson,
34424
+ packageName: "remotion",
34425
+ version: remotionSpec
34426
+ });
34427
+ const remotionMajorVersion = resolvedRemotionVersion === null ? null : getLowestDependencyMajor(resolvedRemotionVersion);
34428
+ if (remotionMajorVersion === null) {
34429
+ facts.hasUnknownRemotionVersion = true;
34430
+ facts.remotionVersion = null;
34431
+ } else if (!facts.hasUnknownRemotionVersion) {
34432
+ const currentRemotionMajorVersion = facts.remotionVersion === null ? null : getLowestDependencyMajor(facts.remotionVersion);
34433
+ if (currentRemotionMajorVersion === null || remotionMajorVersion < currentRemotionMajorVersion) facts.remotionVersion = resolvedRemotionVersion;
34434
+ }
34435
+ }
34436
+ facts.hasThree = facts.hasThree || THREE_DEPENDENCY_NAMES.some((dependencyName) => getDependencySpec(packageJson, dependencyName) !== null);
34437
+ facts.hasReactThreeFiber = facts.hasReactThreeFiber || REACT_THREE_FIBER_ECOSYSTEM_DEPENDENCY_NAMES.some((dependencyName) => getDependencySpec(packageJson, dependencyName) !== null);
34175
34438
  };
34176
34439
  const collectWorkspaceFacts = (rootDirectory, rootPackageJson, { collectReactGroup }) => {
34177
34440
  const facts = {
@@ -34192,12 +34455,40 @@ const collectWorkspaceFacts = (rootDirectory, rootPackageJson, { collectReactGro
34192
34455
  sourceDirectory: null
34193
34456
  },
34194
34457
  valtioVersion: null,
34458
+ mobx: {
34459
+ version: null,
34460
+ sourceDirectory: null
34461
+ },
34462
+ hasMobxReact: false,
34463
+ mobxReactVersion: null,
34464
+ hasMobxReactLite: false,
34465
+ mobxReactLiteVersion: null,
34466
+ hasMobxStateTree: false,
34467
+ hasMobxReactObserver: false,
34468
+ zustand: {
34469
+ version: null,
34470
+ sourceDirectory: null
34471
+ },
34472
+ tanstackQueryVersion: null,
34473
+ styledComponentsVersion: null,
34474
+ hasI18nLibrary: false,
34195
34475
  hasReactNativeAwarePackage: false,
34196
34476
  hasReanimatedAwarePackage: false,
34197
34477
  hasSsrDependency: false,
34478
+ hasRemotionDependency: false,
34479
+ hasUnknownRemotionVersion: false,
34480
+ remotionVersion: null,
34481
+ hasThree: false,
34482
+ threeVersion: null,
34483
+ hasReactThreeFiber: false,
34484
+ reactThreeFiber: {
34485
+ packageName: null,
34486
+ version: null,
34487
+ sourceDirectory: null
34488
+ },
34198
34489
  reanimatedVersion: null
34199
34490
  };
34200
- evaluateManifestFacts(facts, rootPackageJson, rootDirectory);
34491
+ evaluateManifestFacts(facts, rootPackageJson, rootDirectory, rootDirectory, rootPackageJson);
34201
34492
  let isReactGroupSettled = !collectReactGroup;
34202
34493
  const visitedDirectories = /* @__PURE__ */ new Set();
34203
34494
  for (const pattern of getWorkspacePatterns(rootDirectory, rootPackageJson)) {
@@ -34206,7 +34497,7 @@ const collectWorkspaceFacts = (rootDirectory, rootPackageJson, { collectReactGro
34206
34497
  if (visitedDirectories.has(workspaceDirectory)) continue;
34207
34498
  visitedDirectories.add(workspaceDirectory);
34208
34499
  const workspacePackageJson = readPackageJson(Path.join(workspaceDirectory, "package.json"));
34209
- evaluateManifestFacts(facts, workspacePackageJson, workspaceDirectory);
34500
+ evaluateManifestFacts(facts, workspacePackageJson, workspaceDirectory, rootDirectory, rootPackageJson);
34210
34501
  const info = extractDependencyInfo(workspacePackageJson);
34211
34502
  if (info.framework !== "unknown" && frameworkMergeRank(info.framework) < frameworkMergeRank(facts.framework)) facts.framework = info.framework;
34212
34503
  if (isReactGroupSettled) continue;
@@ -34237,7 +34528,7 @@ const collectWorkspaceFacts = (rootDirectory, rootPackageJson, { collectReactGro
34237
34528
  workspaceDirectory,
34238
34529
  workspacePackageJson
34239
34530
  });
34240
- if (reactVersion && shouldReplaceReactVersion(facts.reactVersion, reactVersion)) facts.reactVersion = reactVersion;
34531
+ if (reactVersion && shouldReplaceWithLowerMajor(facts.reactVersion, reactVersion)) facts.reactVersion = reactVersion;
34241
34532
  if (tailwindVersion && !facts.tailwindVersion) facts.tailwindVersion = tailwindVersion;
34242
34533
  if (zodVersion && !facts.zodVersion) facts.zodVersion = zodVersion;
34243
34534
  const settledReactMajor = parseReactMajor(facts.reactVersion);
@@ -34430,6 +34721,16 @@ const discoverProjectWithoutPackageJson = (directory) => {
34430
34721
  tailwindVersion: null,
34431
34722
  zodVersion: null,
34432
34723
  zodMajorVersion: null,
34724
+ mobxVersion: null,
34725
+ mobxMajorVersion: null,
34726
+ hasMobxReact: false,
34727
+ mobxReactVersion: null,
34728
+ hasMobxReactLite: false,
34729
+ mobxReactLiteVersion: null,
34730
+ hasMobxStateTree: false,
34731
+ hasMobxReactObserver: false,
34732
+ zustandVersion: null,
34733
+ zustandMajorVersion: null,
34433
34734
  framework: "unknown",
34434
34735
  hasTypeScript: hasOwnTsConfig,
34435
34736
  hasReactCompiler: false,
@@ -34437,6 +34738,18 @@ const discoverProjectWithoutPackageJson = (directory) => {
34437
34738
  hasTanStackQuery: false,
34438
34739
  valtioVersion: null,
34439
34740
  valtioMajorVersion: null,
34741
+ hasRemotion: false,
34742
+ remotionVersion: null,
34743
+ remotionMajorVersion: null,
34744
+ hasI18nLibrary: false,
34745
+ tanstackQueryVersion: null,
34746
+ styledComponentsVersion: null,
34747
+ hasThree: false,
34748
+ threeVersion: null,
34749
+ threeRelease: null,
34750
+ hasReactThreeFiber: false,
34751
+ reactThreeFiberVersion: null,
34752
+ reactThreeFiberMajorVersion: null,
34440
34753
  hasSsrDependency: false,
34441
34754
  preactVersion: null,
34442
34755
  preactMajorVersion: null,
@@ -34535,6 +34848,12 @@ const discoverProject = (directory) => {
34535
34848
  packageName: SHOPIFY_FLASH_LIST_PACKAGE_NAME,
34536
34849
  version: workspaceFacts.shopifyFlashList.version
34537
34850
  }) : null;
34851
+ const zustandVersion = resolveCatalogBackedDependencyVersion({
34852
+ rootDirectory: directory,
34853
+ rootPackageJson: packageJson,
34854
+ packageName: "zustand",
34855
+ version: workspaceFacts.zustand.version
34856
+ });
34538
34857
  const hasReanimated = hasReactNativeWorkspace && workspaceFacts.hasReanimatedAwarePackage;
34539
34858
  const reanimatedVersion = hasReanimated ? workspaceFacts.reanimatedVersion : null;
34540
34859
  const nextjsVersion = framework === "nextjs" ? resolveCatalogBackedDependencyVersion({
@@ -34549,7 +34868,27 @@ const discoverProject = (directory) => {
34549
34868
  packageName: "valtio",
34550
34869
  version: workspaceFacts.valtioVersion
34551
34870
  });
34871
+ const mobxVersion = resolveCatalogBackedDependencyVersion({
34872
+ rootDirectory: directory,
34873
+ rootPackageJson: packageJson,
34874
+ packageName: "mobx",
34875
+ version: workspaceFacts.mobx.version
34876
+ });
34552
34877
  const preactVersion = getPreactVersion(packageJson);
34878
+ const remotionVersion = workspaceFacts.remotionVersion;
34879
+ const tanstackQueryVersion = getTanStackQueryVersion(packageJson) ?? workspaceFacts.tanstackQueryVersion;
34880
+ const reactThreeFiberVersion = workspaceFacts.reactThreeFiber.packageName ? resolveCatalogBackedDependencyVersion({
34881
+ rootDirectory: directory,
34882
+ rootPackageJson: packageJson,
34883
+ packageName: workspaceFacts.reactThreeFiber.packageName,
34884
+ version: workspaceFacts.reactThreeFiber.version
34885
+ }) : null;
34886
+ const threeVersion = resolveCatalogBackedDependencyVersion({
34887
+ rootDirectory: directory,
34888
+ rootPackageJson: packageJson,
34889
+ packageName: "three",
34890
+ version: workspaceFacts.threeVersion
34891
+ });
34553
34892
  const isPreES2023Target = hasTypeScript && detectPreES2023Target(directory);
34554
34893
  const projectInfo = {
34555
34894
  rootDirectory: directory,
@@ -34559,13 +34898,35 @@ const discoverProject = (directory) => {
34559
34898
  tailwindVersion,
34560
34899
  zodVersion,
34561
34900
  zodMajorVersion: zodVersion === null ? null : getLowestDependencyMajor(zodVersion),
34901
+ mobxVersion,
34902
+ mobxMajorVersion: mobxVersion === null ? null : getDependencyMajorWithinSupportedRange(mobxVersion, 6),
34903
+ hasMobxReact: workspaceFacts.hasMobxReact,
34904
+ mobxReactVersion: workspaceFacts.mobxReactVersion,
34905
+ hasMobxReactLite: workspaceFacts.hasMobxReactLite,
34906
+ mobxReactLiteVersion: workspaceFacts.mobxReactLiteVersion,
34907
+ hasMobxStateTree: workspaceFacts.hasMobxStateTree,
34908
+ hasMobxReactObserver: workspaceFacts.hasMobxReactObserver,
34909
+ zustandVersion,
34910
+ zustandMajorVersion: zustandVersion === null ? null : getLowestDependencyMajor(zustandVersion),
34562
34911
  framework,
34563
34912
  hasTypeScript,
34564
34913
  hasReactCompiler: detectReactCompiler(directory, packageJson),
34565
34914
  hasReactCompilerLintPlugin: detectReactCompilerLintPlugin(directory, packageJson),
34566
- hasTanStackQuery: hasTanStackQuery(packageJson),
34915
+ hasTanStackQuery: tanstackQueryVersion !== null,
34916
+ hasI18nLibrary: workspaceFacts.hasI18nLibrary,
34917
+ tanstackQueryVersion,
34918
+ styledComponentsVersion: workspaceFacts.styledComponentsVersion,
34567
34919
  valtioVersion,
34568
34920
  valtioMajorVersion: valtioVersion === null ? null : getLowestDependencyMajor(valtioVersion),
34921
+ hasRemotion: workspaceFacts.hasRemotionDependency,
34922
+ remotionVersion,
34923
+ remotionMajorVersion: remotionVersion === null ? null : getLowestDependencyMajor(remotionVersion),
34924
+ hasThree: workspaceFacts.hasThree,
34925
+ threeVersion,
34926
+ threeRelease: parseThreeRelease(threeVersion),
34927
+ hasReactThreeFiber: workspaceFacts.hasReactThreeFiber,
34928
+ reactThreeFiberVersion,
34929
+ reactThreeFiberMajorVersion: reactThreeFiberVersion === null ? null : getLowestDependencyMajor(reactThreeFiberVersion),
34569
34930
  hasSsrDependency: workspaceFacts.hasSsrDependency,
34570
34931
  preactVersion,
34571
34932
  preactMajorVersion: parseReactMajor(preactVersion),
@@ -37840,10 +38201,10 @@ const SSR_FRAMEWORKS = new Set([
37840
38201
  "gatsby",
37841
38202
  "tanstack-start"
37842
38203
  ]);
37843
- const addMajorLadder = (capabilities, name, major, earliest, latest) => {
37844
- if (major === null) return;
37845
- const cappedMajor = Math.min(major, latest);
37846
- for (let candidate = earliest; candidate <= cappedMajor; candidate += 1) capabilities.add(`${name}:${candidate}`);
38204
+ const addVersionCapabilityLadder = (capabilities, name, detectedVersion, earliest, latest) => {
38205
+ if (detectedVersion === null) return;
38206
+ const cappedVersion = Math.min(detectedVersion, latest);
38207
+ for (let candidate = earliest; candidate <= cappedVersion; candidate += 1) capabilities.add(`${name}:${candidate}`);
37847
38208
  };
37848
38209
  const buildCapabilities = (project) => {
37849
38210
  const capabilities = /* @__PURE__ */ new Set();
@@ -37856,26 +38217,77 @@ const buildCapabilities = (project) => {
37856
38217
  if (CLIENT_ONLY_FRAMEWORKS.has(project.framework)) capabilities.add("client-only");
37857
38218
  if (project.isStaticExport) capabilities.add("nextjs:static-export");
37858
38219
  if (project.nextjsMajorVersion !== null && project.nextjsMajorVersion >= 15) capabilities.add("nextjs:15");
37859
- addMajorLadder(capabilities, "react", project.reactMajorVersion, 17, 30);
38220
+ if (project.nextjsMajorVersion !== null && project.nextjsMajorVersion >= 16) capabilities.add("nextjs:16");
38221
+ addVersionCapabilityLadder(capabilities, "react", project.reactMajorVersion, 17, 30);
37860
38222
  if (project.reactMajorVersion !== null && project.reactMajorVersion >= 19 && isMajorMinorAtLeast(parseReactMajorMinor(project.reactVersion), {
37861
38223
  major: 19,
37862
38224
  minor: 2
37863
38225
  })) capabilities.add("react:19.2");
37864
- if (project.tailwindVersion !== null) capabilities.add("tailwind");
37865
- if (project.tailwindVersion !== null && isMajorMinorAtLeast(parseTailwindMajorMinor(project.tailwindVersion), {
37866
- major: 3,
37867
- minor: 4
37868
- })) capabilities.add("tailwind:3.4");
38226
+ if (project.tailwindVersion !== null) {
38227
+ capabilities.add("tailwind");
38228
+ const tailwindVersion = parseTailwindMajorMinor(project.tailwindVersion);
38229
+ if (isMajorMinorAtLeast(tailwindVersion, {
38230
+ major: 3,
38231
+ minor: 4
38232
+ })) capabilities.add("tailwind:3.4");
38233
+ if (tailwindVersion !== null && isMajorMinorAtLeast(tailwindVersion, {
38234
+ major: 4,
38235
+ minor: 0
38236
+ })) capabilities.add("tailwind:4");
38237
+ }
37869
38238
  if (project.zodVersion !== null) capabilities.add("zod");
37870
38239
  if (project.zodMajorVersion !== null && project.zodMajorVersion >= 4) capabilities.add("zod:4");
38240
+ if (project.mobxVersion !== void 0 && project.mobxVersion !== null || project.hasMobxReact === true || project.hasMobxReactLite === true || project.hasMobxStateTree === true || project.hasMobxReactObserver === true) capabilities.add("mobx");
38241
+ if (project.hasMobxReact === true) capabilities.add("mobx-react");
38242
+ if (project.hasMobxReactLite === true) capabilities.add("mobx-react-lite");
38243
+ if (project.hasMobxReact === true || project.hasMobxReactLite === true) capabilities.add("mobx-react-binding");
38244
+ const mobxReactVersion = parseDependencyMajorMinor(project.mobxReactVersion);
38245
+ const mobxReactLiteVersion = parseDependencyMajorMinor(project.mobxReactLiteVersion);
38246
+ const hasMobxReactObserverMemoGuard = mobxReactVersion !== null && isMajorMinorAtLeast(mobxReactVersion, {
38247
+ major: 7,
38248
+ minor: 3
38249
+ });
38250
+ const hasMobxReactLiteObserverMemoGuard = mobxReactLiteVersion !== null && isMajorMinorAtLeast(mobxReactLiteVersion, {
38251
+ major: 3,
38252
+ minor: 3
38253
+ });
38254
+ if (hasMobxReactObserverMemoGuard) capabilities.add("mobx-react-observer-memo-guard");
38255
+ if (hasMobxReactLiteObserverMemoGuard) capabilities.add("mobx-react-lite-observer-memo-guard");
38256
+ if (hasMobxReactObserverMemoGuard || hasMobxReactLiteObserverMemoGuard) capabilities.add("mobx-react-binding-observer-memo-guard");
38257
+ if (project.hasMobxStateTree === true) capabilities.add("mobx-state-tree");
38258
+ if (project.hasMobxReactObserver === true) capabilities.add("mobx-react-observer");
38259
+ if (project.mobxMajorVersion !== void 0 && project.mobxMajorVersion !== null && project.mobxMajorVersion >= 4 && project.mobxMajorVersion <= 6) addVersionCapabilityLadder(capabilities, "mobx", project.mobxMajorVersion, 4, 6);
38260
+ const mobxVersion = parseDependencyMajorMinor(project.mobxVersion);
38261
+ if (project.mobxMajorVersion === 6 && mobxVersion !== null && isMajorMinorAtLeast(mobxVersion, {
38262
+ major: 6,
38263
+ minor: 10
38264
+ })) capabilities.add("mobx:6.10");
38265
+ if (project.zustandVersion !== void 0 && project.zustandVersion !== null) capabilities.add("zustand");
38266
+ if (project.zustandMajorVersion !== void 0 && project.zustandMajorVersion !== null && project.zustandMajorVersion >= 1 && project.zustandMajorVersion <= 5) addVersionCapabilityLadder(capabilities, "zustand", project.zustandMajorVersion, 1, 5);
37871
38267
  if (project.isPreES2023Target) capabilities.add("pre-es2023");
37872
38268
  if (project.hasReactCompiler) capabilities.add("react-compiler");
37873
- if (project.hasTanStackQuery) capabilities.add("tanstack-query");
38269
+ if (Boolean(project.hasTanStackQuery) || Boolean(project.tanstackQueryVersion)) capabilities.add("tanstack-query");
38270
+ if (project.styledComponentsVersion) {
38271
+ capabilities.add("styled-components");
38272
+ const styledComponentsMajor = getLowestDependencyMajor(project.styledComponentsVersion);
38273
+ if (styledComponentsMajor !== null && styledComponentsMajor >= 6) capabilities.add("styled-components:6");
38274
+ }
38275
+ if (project.hasI18nLibrary) capabilities.add("i18n");
37874
38276
  if (project.valtioVersion !== null) capabilities.add("valtio");
37875
- addMajorLadder(capabilities, "valtio", project.valtioMajorVersion, 1, 10);
38277
+ addVersionCapabilityLadder(capabilities, "valtio", project.valtioMajorVersion, 1, 10);
38278
+ if (project.hasRemotion) {
38279
+ capabilities.add("remotion");
38280
+ addVersionCapabilityLadder(capabilities, "remotion", project.remotionMajorVersion ?? null, 4, 30);
38281
+ }
38282
+ if (project.hasThree || project.hasReactThreeFiber) capabilities.add("three");
38283
+ addVersionCapabilityLadder(capabilities, "three", project.threeRelease ?? null, 145, 250);
38284
+ if (project.hasReactThreeFiber) {
38285
+ capabilities.add("r3f");
38286
+ addVersionCapabilityLadder(capabilities, "r3f", project.reactThreeFiberMajorVersion ?? null, 3, 10);
38287
+ }
37876
38288
  if (project.hasTypeScript) capabilities.add("typescript");
37877
38289
  if (project.preactVersion !== null) capabilities.add("preact");
37878
- addMajorLadder(capabilities, "preact", project.preactMajorVersion, 10, 20);
38290
+ addVersionCapabilityLadder(capabilities, "preact", project.preactMajorVersion, 10, 20);
37879
38291
  if (project.preactVersion !== null && project.reactVersion === null) capabilities.add("pure-preact");
37880
38292
  return capabilities;
37881
38293
  };
@@ -37887,7 +38299,7 @@ const getCapabilities = (project) => {
37887
38299
  capabilitiesByProject.set(project, capabilities);
37888
38300
  return capabilities;
37889
38301
  };
37890
- const shouldEnableRule = (requires, tags, capabilities, ignoredTags, disabledWhen) => {
38302
+ const shouldEnableRule = (requires, tags, capabilities, ignoredTags, disabledWhen, includedTags) => {
37891
38303
  if (requires) {
37892
38304
  for (const capability of requires) if (!capabilities.has(capability)) return false;
37893
38305
  }
@@ -37898,20 +38310,29 @@ const shouldEnableRule = (requires, tags, capabilities, ignoredTags, disabledWhe
37898
38310
  if (tags) {
37899
38311
  for (const tag of tags) if (ignoredTags.has(tag)) return false;
37900
38312
  }
38313
+ if (includedTags && includedTags.size > 0) {
38314
+ if (!tags?.some((tag) => includedTags.has(tag))) return false;
38315
+ }
37901
38316
  return true;
37902
38317
  };
38318
+ const shouldEnableRuleByDefaultStatus = (options) => options.defaultEnabled !== false || options.hasExplicitOverride === true || options.includeTagDefaults && options.hasIncludedTags;
37903
38319
  const yieldToEventLoop = () => new Promise((resolve) => {
37904
38320
  setImmediate(resolve);
37905
38321
  });
37906
38322
  const createSecurityScanSession = (rootDirectory, options) => {
37907
38323
  const capabilities = options.project ? getCapabilities(options.project) : /* @__PURE__ */ new Set();
37908
38324
  const ignoredTags = options.ignoredTags ?? /* @__PURE__ */ new Set();
38325
+ const includedTags = options.includedTags ?? /* @__PURE__ */ new Set();
37909
38326
  const enabledScanRules = REACT_DOCTOR_RULES.flatMap((entry) => {
37910
38327
  const rule = entry.rule;
37911
38328
  const scan = rule.scan;
37912
38329
  if (typeof scan !== "function") return [];
37913
- if (rule.defaultEnabled === false) return [];
37914
- if (!shouldEnableRule(rule.requires, rule.tags, capabilities, ignoredTags, rule.disabledWhen)) return [];
38330
+ if (!shouldEnableRuleByDefaultStatus({
38331
+ defaultEnabled: rule.defaultEnabled,
38332
+ includeTagDefaults: options.includeTagDefaults === true,
38333
+ hasIncludedTags: includedTags.size > 0
38334
+ })) return [];
38335
+ if (!shouldEnableRule(rule.requires, rule.tags, capabilities, ignoredTags, rule.disabledWhen, includedTags)) return [];
37915
38336
  return [{
37916
38337
  entry,
37917
38338
  scan,
@@ -39897,8 +40318,9 @@ const buildUserPluginRules = (userPlugin, severityControls) => {
39897
40318
  }
39898
40319
  return enabled;
39899
40320
  };
39900
- const createOxlintConfig = ({ pluginPath, project, customRulesOnly = false, extendsPaths = [], ignoredTags = /* @__PURE__ */ new Set(), serverAuthFunctionNames, severityControls, userPlugins = [], disableReactHooksJsPlugin = false, ruleSelection, sidecarRuleIdFilter }) => {
39901
- const reactHooksJsPlugin = disableReactHooksJsPlugin || ruleSelection === "sidecar" ? null : resolveReactHooksJsPlugin(project.hasReactCompiler || project.hasReactCompilerLintPlugin === true, customRulesOnly);
40321
+ const createOxlintConfig = ({ pluginPath, project, customRulesOnly = false, extendsPaths = [], ignoredTags = /* @__PURE__ */ new Set(), includedTags = /* @__PURE__ */ new Set(), includeTagDefaults = false, serverAuthFunctionNames, severityControls, userPlugins = [], disableReactHooksJsPlugin = false, ruleSelection, sidecarRuleIdFilter }) => {
40322
+ const hasIncludedTags = includedTags.size > 0;
40323
+ const reactHooksJsPlugin = disableReactHooksJsPlugin || ruleSelection === "sidecar" || hasIncludedTags ? null : resolveReactHooksJsPlugin(project.hasReactCompiler || project.hasReactCompilerLintPlugin === true, customRulesOnly);
39902
40324
  const reactCompilerRules = reactHooksJsPlugin ? applyRuleSeverityControls(filterRulesToAvailable(REACT_COMPILER_RULES, "react-hooks-js", reactHooksJsPlugin.availableRuleNames), severityControls) : {};
39903
40325
  const jsPlugins = [];
39904
40326
  if (reactHooksJsPlugin) jsPlugins.push(reactHooksJsPlugin.entry);
@@ -39913,9 +40335,14 @@ const createOxlintConfig = ({ pluginPath, project, customRulesOnly = false, exte
39913
40335
  if (rule.scan !== void 0) continue;
39914
40336
  if (customRulesOnly && registryEntry.originallyExternal) continue;
39915
40337
  if (rule.framework !== "global" && !rule.requires) continue;
39916
- if (!shouldEnableRule(rule.requires, rule.tags, capabilities, ignoredTags, rule.disabledWhen)) continue;
40338
+ if (!shouldEnableRule(rule.requires, rule.tags, capabilities, ignoredTags, rule.disabledWhen, includedTags)) continue;
39917
40339
  const explicitRuleOverride = resolveRuleSeverityOverride({ ruleKey: registryEntry.key }, severityControls);
39918
- if (rule.defaultEnabled === false && explicitRuleOverride === void 0) continue;
40340
+ if (!shouldEnableRuleByDefaultStatus({
40341
+ defaultEnabled: rule.defaultEnabled,
40342
+ includeTagDefaults,
40343
+ hasIncludedTags,
40344
+ hasExplicitOverride: explicitRuleOverride !== void 0
40345
+ })) continue;
39919
40346
  const severity = resolveRuleSeverityOverride({
39920
40347
  ruleKey: registryEntry.key,
39921
40348
  category: rule.category
@@ -39924,7 +40351,7 @@ const createOxlintConfig = ({ pluginPath, project, customRulesOnly = false, exte
39924
40351
  enabledReactDoctorRules[registryEntry.key] = severity;
39925
40352
  }
39926
40353
  const userPluginRules = {};
39927
- if (ruleSelection !== "sidecar") for (const userPlugin of userPlugins) {
40354
+ if (ruleSelection !== "sidecar" && !hasIncludedTags) for (const userPlugin of userPlugins) {
39928
40355
  Object.assign(userPluginRules, buildUserPluginRules(userPlugin, severityControls));
39929
40356
  jsPlugins.push(userPlugin.entry);
39930
40357
  }
@@ -40141,6 +40568,19 @@ const createSidecarLintCache = (cacheDirectory, rulesetHash) => {
40141
40568
  }
40142
40569
  };
40143
40570
  };
40571
+ const fingerprintCacheByFilePath = /* @__PURE__ */ new Map();
40572
+ const fingerprintFileContents = (filePath, fingerprintLength) => {
40573
+ const fileStats = NFS.statSync(filePath, { bigint: true });
40574
+ const cachedFingerprint = fingerprintCacheByFilePath.get(filePath);
40575
+ if (cachedFingerprint?.modifiedTimeNanoseconds === fileStats.mtimeNs && cachedFingerprint.sizeBytes === fileStats.size) return cachedFingerprint.fingerprint;
40576
+ const fingerprint = crypto.createHash("sha256").update(NFS.readFileSync(filePath)).digest("hex").slice(0, fingerprintLength);
40577
+ fingerprintCacheByFilePath.set(filePath, {
40578
+ fingerprint,
40579
+ modifiedTimeNanoseconds: fileStats.mtimeNs,
40580
+ sizeBytes: fileStats.size
40581
+ });
40582
+ return fingerprint;
40583
+ };
40144
40584
  const bundledRequire = createRequire(import.meta.url);
40145
40585
  const childNodeVersionByBinaryPath = /* @__PURE__ */ new Map();
40146
40586
  const resolveChildNodeVersion = (nodeBinaryPath) => {
@@ -40164,6 +40604,13 @@ const TOOLCHAIN_PACKAGE_SPECIFIERS = [
40164
40604
  "oxlint-plugin-react-doctor/package.json",
40165
40605
  "eslint-plugin-react-hooks/package.json"
40166
40606
  ];
40607
+ const resolvePluginFingerprint = () => {
40608
+ try {
40609
+ return fingerprintFileContents(bundledRequire.resolve("oxlint-plugin-react-doctor"), 16);
40610
+ } catch {
40611
+ return "unresolved";
40612
+ }
40613
+ };
40167
40614
  const resolveOxlintToolchainVersions = (nodeBinaryPath = process.execPath) => {
40168
40615
  const versions = [`node=${resolveChildNodeVersion(nodeBinaryPath)}`];
40169
40616
  for (const specifier of TOOLCHAIN_PACKAGE_SPECIFIERS) try {
@@ -40173,6 +40620,7 @@ const resolveOxlintToolchainVersions = (nodeBinaryPath = process.execPath) => {
40173
40620
  } catch {
40174
40621
  versions.push(`${specifier}=missing`);
40175
40622
  }
40623
+ versions.push(`oxlint-plugin-react-doctor#fingerprint=${resolvePluginFingerprint()}`);
40176
40624
  return versions;
40177
40625
  };
40178
40626
  const esmRequire = createRequire(import.meta.url);
@@ -41648,7 +42096,7 @@ const reactHooksJsPluginDropNote = (error) => {
41648
42096
  * 6. always restore disable directives + clean up the temp dir
41649
42097
  */
41650
42098
  const runOxlint = async (options) => {
41651
- const { rootDirectory, project, includePaths, nodeBinaryPath = process.execPath, customRulesOnly = false, respectInlineDisables = true, adoptExistingLintConfig = true, ignoredTags = /* @__PURE__ */ new Set(), userConfig, configSourceDirectory = rootDirectory, onPartialFailure, onFileCoverage, perFileLintCacheEnabled = false, sidecarLintCacheEnabled = false, onCacheStats, onSidecarStats, spawnTimeoutMs, outputMaxBytes, lintBatchOrdering = "cost" } = options;
42099
+ const { rootDirectory, project, includePaths, nodeBinaryPath = process.execPath, customRulesOnly = false, respectInlineDisables = true, adoptExistingLintConfig = true, ignoredTags = /* @__PURE__ */ new Set(), includedTags = /* @__PURE__ */ new Set(), includeTagDefaults = false, userConfig, configSourceDirectory = rootDirectory, onPartialFailure, onFileCoverage, perFileLintCacheEnabled = false, sidecarLintCacheEnabled = false, onCacheStats, onSidecarStats, spawnTimeoutMs, outputMaxBytes, lintBatchOrdering = "cost" } = options;
41652
42100
  const serverAuthFunctionNames = Array.isArray(userConfig?.serverAuthFunctionNames) ? userConfig.serverAuthFunctionNames.filter((entry) => typeof entry === "string" && entry.length > 0) : void 0;
41653
42101
  const severityControls = buildRuleSeverityControls(userConfig);
41654
42102
  validateRuleRegistration();
@@ -41662,13 +42110,15 @@ const runOxlint = async (options) => {
41662
42110
  }
41663
42111
  const pluginPath = resolvePluginPath();
41664
42112
  const extendsPaths = (adoptExistingLintConfig && !customRulesOnly ? detectUserLintConfigPaths(rootDirectory) : []).filter(canOxlintExtendConfig);
41665
- const userPlugins = resolveUserPlugins(userConfig?.plugins, configSourceDirectory);
42113
+ const userPlugins = includedTags.size > 0 ? [] : resolveUserPlugins(userConfig?.plugins, configSourceDirectory);
41666
42114
  const buildConfig = (overrides) => createOxlintConfig({
41667
42115
  pluginPath,
41668
42116
  project,
41669
42117
  customRulesOnly,
41670
42118
  extendsPaths: overrides.extendsPaths,
41671
42119
  ignoredTags,
42120
+ includedTags,
42121
+ includeTagDefaults,
41672
42122
  serverAuthFunctionNames,
41673
42123
  severityControls,
41674
42124
  userPlugins,
@@ -42057,6 +42507,8 @@ var Linter = class Linter extends Service()("react-doctor/Linter") {
42057
42507
  respectInlineDisables: input.respectInlineDisables,
42058
42508
  adoptExistingLintConfig: input.adoptExistingLintConfig,
42059
42509
  ignoredTags: input.ignoredTags,
42510
+ includedTags: input.includedTags,
42511
+ includeTagDefaults: input.includeTagDefaults,
42060
42512
  userConfig: input.userConfig ?? null,
42061
42513
  configSourceDirectory: input.configSourceDirectory,
42062
42514
  onPartialFailure: (reason) => {
@@ -42905,7 +43357,9 @@ const runInspect = (input, hooks = {}) => gen(function* () {
42905
43357
  const securityScanFailedRef = yield* make$13(false);
42906
43358
  const securityScanFiber = yield* forkChild(runCollect(applyPerElementPipeline(isDiffMode ? empty$4 : unwrap(tryPromise(() => checkSecurityScanCooperative(scanDirectory, {
42907
43359
  project,
42908
- ignoredTags: input.ignoredTags
43360
+ ignoredTags: input.ignoredTags,
43361
+ includedTags: input.includedTags,
43362
+ includeTagDefaults: input.includeTagDefaults
42909
43363
  })).pipe(map$3((diagnostics) => fromIterable$1(diagnostics)), catch_$1(() => set(securityScanFailedRef, true).pipe(as(empty$4))))))).pipe(withSpan("SecurityScan.run")));
42910
43364
  const shouldRunSupplyChain = !isDiffMode || (input.supplyChainManifestChanged ?? false);
42911
43365
  const supplyChainOverlapTimeout = yield* SupplyChainOverlapTimeoutMs;
@@ -42996,6 +43450,8 @@ const runInspect = (input, hooks = {}) => gen(function* () {
42996
43450
  respectInlineDisables: input.respectInlineDisables,
42997
43451
  adoptExistingLintConfig: input.adoptExistingLintConfig,
42998
43452
  ignoredTags: input.ignoredTags,
43453
+ includedTags: input.includedTags,
43454
+ includeTagDefaults: input.includeTagDefaults,
42999
43455
  userConfig: resolvedConfig.config ?? void 0,
43000
43456
  configSourceDirectory: resolvedConfig.configSourceDirectory ?? void 0,
43001
43457
  onFileProgress: (scannedFileCount, totalFileCount) => {
@@ -43856,4 +44312,4 @@ const toJsonReport = (result, options) => buildJsonReport({
43856
44312
  export { AmbiguousProjectError, NoReactDependencyError, NotADirectoryError, PackageJsonNotFoundError, ProjectNotFoundError, ReactDoctorError, buildJsonReport, buildJsonReportError, clearCaches, defineConfig, diagnose, filterSourceFiles, getDiffInfo, hasReactRuntime, isProjectDiscoveryError, isReactDoctorError, summarizeDiagnostics, toJsonReport };
43857
44313
 
43858
44314
  //# sourceMappingURL=index.js.map
43859
- //# debugId=9a89aa42-c62d-57b9-a5d7-36051dd45bb3
44315
+ //# debugId=d6dc69de-43c3-570a-8cc4-be7d4a3605ac