react-doctor 0.8.1-dev.5b468f8 → 0.8.1-dev.6fcd9c9
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/README.md +4 -14
- package/dist/cli.js +147 -524
- package/dist/index.d.ts +0 -17
- package/dist/index.js +103 -433
- package/dist/lsp.js +103 -433
- package/dist/skills/react-doctor/SKILL.md +0 -5
- package/package.json +5 -5
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]="
|
|
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]="6aa1c6e1-8fcc-50d4-a076-3e864425bdc5")}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,6 +32854,44 @@ 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
|
+
};
|
|
32857
32895
|
const SOURCE_FILE_PATTERN = /\.(tsx?|jsx?|mts|mjs)$/;
|
|
32858
32896
|
const GENERATED_BUNDLE_FILE_PATTERN = /\.(iife|umd|global|min)\.m?js$/i;
|
|
32859
32897
|
const GENERATED_SOURCE_DIRECTORY_PATTERN = /(?:^|\/)__generated__\//;
|
|
@@ -33012,44 +33050,6 @@ const SUPPLY_CHAIN_OVERLAP_TIMEOUT_MS = 9e4;
|
|
|
33012
33050
|
const SUPPLY_CHAIN_CACHE_TTL_MS = 864e5;
|
|
33013
33051
|
const SUPPLY_CHAIN_CACHE_SUBDIR = "supply-chain";
|
|
33014
33052
|
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
|
-
"@remix-run/react": "remix",
|
|
33379
|
-
gatsby: "gatsby",
|
|
33380
33378
|
vite: "vite",
|
|
33381
33379
|
"react-scripts": "cra",
|
|
33380
|
+
"@remix-run/react": "remix",
|
|
33381
|
+
gatsby: "gatsby",
|
|
33382
33382
|
expo: "expo",
|
|
33383
33383
|
"react-native": "react-native"
|
|
33384
33384
|
};
|
|
@@ -33402,17 +33402,11 @@ const NEXT_CONFIG_FILENAMES = [
|
|
|
33402
33402
|
];
|
|
33403
33403
|
const BABEL_CONFIG_FILENAMES = [
|
|
33404
33404
|
".babelrc",
|
|
33405
|
-
".babelrc.js",
|
|
33406
33405
|
".babelrc.json",
|
|
33407
|
-
".babelrc.cjs",
|
|
33408
|
-
".babelrc.mjs",
|
|
33409
|
-
".babelrc.cts",
|
|
33410
33406
|
"babel.config.js",
|
|
33411
33407
|
"babel.config.json",
|
|
33412
33408
|
"babel.config.cjs",
|
|
33413
|
-
"babel.config.mjs"
|
|
33414
|
-
"babel.config.ts",
|
|
33415
|
-
"babel.config.cts"
|
|
33409
|
+
"babel.config.mjs"
|
|
33416
33410
|
];
|
|
33417
33411
|
const VITE_CONFIG_FILENAMES = [
|
|
33418
33412
|
"vite.config.js",
|
|
@@ -33424,28 +33418,12 @@ const VITE_CONFIG_FILENAMES = [
|
|
|
33424
33418
|
"vitest.config.ts",
|
|
33425
33419
|
"vitest.config.js"
|
|
33426
33420
|
];
|
|
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
|
-
];
|
|
33443
33421
|
const EXPO_APP_CONFIG_FILENAMES = [
|
|
33444
33422
|
"app.json",
|
|
33445
33423
|
"app.config.js",
|
|
33446
33424
|
"app.config.ts"
|
|
33447
33425
|
];
|
|
33448
|
-
const REACT_COMPILER_PACKAGE_REFERENCE_PATTERN = /babel-plugin-react-compiler|react-compiler-runtime|
|
|
33426
|
+
const REACT_COMPILER_PACKAGE_REFERENCE_PATTERN = /babel-plugin-react-compiler|react-compiler-runtime|["']react-compiler["']/;
|
|
33449
33427
|
const REACT_COMPILER_ENABLED_FLAG_PATTERN = /["']?reactCompiler["']?\s*:\s*(?:true\b|\{)/;
|
|
33450
33428
|
const STATIC_EXPORT_OUTPUT_PATTERN = /(?:^|[^.\w])["']?output["']?\s*:\s*["']export["']/m;
|
|
33451
33429
|
const hasCompilerPackage = (packageJson, compilerPackages) => {
|
|
@@ -33480,8 +33458,6 @@ const detectReactCompiler = (directory, packageJson) => {
|
|
|
33480
33458
|
if (hasCompilerInConfigFiles(directory, NEXT_CONFIG_FILENAMES)) return true;
|
|
33481
33459
|
if (hasCompilerInConfigFiles(directory, BABEL_CONFIG_FILENAMES)) return true;
|
|
33482
33460
|
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;
|
|
33485
33461
|
if (hasCompilerInConfigFiles(directory, EXPO_APP_CONFIG_FILENAMES)) return true;
|
|
33486
33462
|
return hasCompilerPackageInAncestors(directory, REACT_COMPILER_TRANSFORM_PACKAGES);
|
|
33487
33463
|
};
|
|
@@ -33490,7 +33466,7 @@ const detectNextjsStaticExport = (directory) => NEXT_CONFIG_FILENAMES.some((file
|
|
|
33490
33466
|
const filePath = Path.join(directory, filename);
|
|
33491
33467
|
return isFile(filePath) && STATIC_EXPORT_OUTPUT_PATTERN.test(NFS.readFileSync(filePath, "utf-8"));
|
|
33492
33468
|
});
|
|
33493
|
-
const UNRESOLVABLE_PROTOCOL_VERSION = /^(?:
|
|
33469
|
+
const UNRESOLVABLE_PROTOCOL_VERSION = /^(?:file|git|github|https?|link|patch|portal|workspace|npm):/i;
|
|
33494
33470
|
const DIST_TAG_VERSION = /^[a-z][a-z0-9._-]*$/i;
|
|
33495
33471
|
const WILDCARD_VERSION = /^[*xX](?:\.[*xX])*$/;
|
|
33496
33472
|
const NPM_ALIAS_VERSION = /^npm:(?:@[^/]+\/[^@]+|[^@]+)@(.+)$/i;
|
|
@@ -33623,16 +33599,6 @@ const getLowestDependencyMajor = (version) => {
|
|
|
33623
33599
|
}
|
|
33624
33600
|
return lowestMajor;
|
|
33625
33601
|
};
|
|
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
|
-
};
|
|
33636
33602
|
const isConcreteDependencyVersion = (version) => {
|
|
33637
33603
|
const normalizedVersion = normalizeDependencyVersion(version);
|
|
33638
33604
|
return normalizedVersion !== null && /\d/.test(normalizedVersion);
|
|
@@ -33676,18 +33642,9 @@ const parseReactMajorMinor = (reactVersion) => {
|
|
|
33676
33642
|
};
|
|
33677
33643
|
};
|
|
33678
33644
|
const parseLowerBoundVersion = (versionSpec) => import_semver.validRange(versionSpec) !== null ? import_semver.minVersion(versionSpec) : import_semver.coerce(versionSpec);
|
|
33679
|
-
const
|
|
33680
|
-
if (typeof
|
|
33681
|
-
const
|
|
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();
|
|
33645
|
+
const parseTailwindMajorMinor = (tailwindVersion) => {
|
|
33646
|
+
if (typeof tailwindVersion !== "string") return null;
|
|
33647
|
+
const trimmed = tailwindVersion.trim();
|
|
33691
33648
|
if (trimmed.length === 0) return null;
|
|
33692
33649
|
const lowerBound = parseLowerBoundVersion(trimmed);
|
|
33693
33650
|
if (lowerBound === null || lowerBound.major <= 0) return null;
|
|
@@ -33696,7 +33653,6 @@ const parseDependencyMajorMinor = (dependencyVersion) => {
|
|
|
33696
33653
|
minor: lowerBound.minor
|
|
33697
33654
|
};
|
|
33698
33655
|
};
|
|
33699
|
-
const parseTailwindMajorMinor = (tailwindVersion) => parseDependencyMajorMinor(tailwindVersion);
|
|
33700
33656
|
const hasUpperBoundOnlyPeerRange = (range) => {
|
|
33701
33657
|
if (typeof range !== "string") return false;
|
|
33702
33658
|
const normalizedRange = normalizeDependencyVersion(range);
|
|
@@ -33718,7 +33674,7 @@ const resolveEffectiveReactMajor = (reactVersion, packageJson) => {
|
|
|
33718
33674
|
if (peerFloor === null) return hasUpperBoundOnlyPeerRange(peerReactRange) ? null : installedReactMajor;
|
|
33719
33675
|
return installedReactMajor !== null ? Math.min(installedReactMajor, peerFloor) : peerFloor;
|
|
33720
33676
|
};
|
|
33721
|
-
const isCatalogReference = (version) =>
|
|
33677
|
+
const isCatalogReference = (version) => version.startsWith("catalog:");
|
|
33722
33678
|
const extractCatalogName = (version) => {
|
|
33723
33679
|
if (!isCatalogReference(version)) return null;
|
|
33724
33680
|
const name = version.slice(8).trim();
|
|
@@ -33868,12 +33824,6 @@ const TAILWIND_ZOD_SECTIONS = [
|
|
|
33868
33824
|
"devDependencies",
|
|
33869
33825
|
"peerDependencies"
|
|
33870
33826
|
];
|
|
33871
|
-
const DEPENDENCY_SPEC_SECTIONS = [
|
|
33872
|
-
"dependencies",
|
|
33873
|
-
"devDependencies",
|
|
33874
|
-
"peerDependencies",
|
|
33875
|
-
"optionalDependencies"
|
|
33876
|
-
];
|
|
33877
33827
|
const EMPTY_DEPENDENCY_INFO = {
|
|
33878
33828
|
reactVersion: null,
|
|
33879
33829
|
tailwindVersion: null,
|
|
@@ -33883,7 +33833,7 @@ const EMPTY_DEPENDENCY_INFO = {
|
|
|
33883
33833
|
const pickConcreteVersion = (packageJson, packageName, sections) => {
|
|
33884
33834
|
for (const section of sections) {
|
|
33885
33835
|
const version = packageJson[section]?.[packageName];
|
|
33886
|
-
if (
|
|
33836
|
+
if (version === void 0) continue;
|
|
33887
33837
|
if (isCatalogReference(version)) return null;
|
|
33888
33838
|
if (isConcreteDependencyVersion(version)) return version;
|
|
33889
33839
|
}
|
|
@@ -33915,16 +33865,13 @@ const extractDependencyInfo = (packageJson) => {
|
|
|
33915
33865
|
};
|
|
33916
33866
|
};
|
|
33917
33867
|
const getDependencySpec = (packageJson, packageName) => {
|
|
33918
|
-
|
|
33919
|
-
|
|
33920
|
-
if (typeof spec === "string") return spec;
|
|
33921
|
-
}
|
|
33922
|
-
return null;
|
|
33868
|
+
const spec = packageJson.dependencies?.[packageName] ?? packageJson.devDependencies?.[packageName] ?? packageJson.peerDependencies?.[packageName] ?? packageJson.optionalDependencies?.[packageName];
|
|
33869
|
+
return typeof spec === "string" ? spec : null;
|
|
33923
33870
|
};
|
|
33924
33871
|
const getDependencyDeclaration = ({ packageJson, packageName, sections }) => {
|
|
33925
33872
|
for (const section of sections) {
|
|
33926
33873
|
const version = packageJson[section]?.[packageName];
|
|
33927
|
-
if (
|
|
33874
|
+
if (version === void 0) continue;
|
|
33928
33875
|
return {
|
|
33929
33876
|
catalogReference: extractCatalogName(version) ?? null,
|
|
33930
33877
|
hasDeclaration: true,
|
|
@@ -33958,15 +33905,24 @@ const getPreactVersion = (packageJson) => {
|
|
|
33958
33905
|
...packageJson.devDependencies
|
|
33959
33906
|
}.preact ?? null;
|
|
33960
33907
|
};
|
|
33961
|
-
const
|
|
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 }) => {
|
|
33962
33922
|
if (version === null || !isCatalogReference(version)) return version;
|
|
33963
33923
|
const catalogName = extractCatalogName(version);
|
|
33964
|
-
const
|
|
33965
|
-
if (
|
|
33966
|
-
if (sourceDirectory !== rootDirectory || sourcePackageJson !== rootPackageJson) {
|
|
33967
|
-
const resolvedRootVersion = resolveCatalogVersion(rootPackageJson, packageName, rootDirectory, catalogName);
|
|
33968
|
-
if (resolvedRootVersion) return resolvedRootVersion;
|
|
33969
|
-
}
|
|
33924
|
+
const resolvedLocalVersion = resolveCatalogVersion(rootPackageJson, packageName, rootDirectory, catalogName);
|
|
33925
|
+
if (resolvedLocalVersion) return resolvedLocalVersion;
|
|
33970
33926
|
const monorepoRoot = findMonorepoRoot(rootDirectory);
|
|
33971
33927
|
if (!monorepoRoot) return version;
|
|
33972
33928
|
const monorepoPackageJsonPath = Path.join(monorepoRoot, "package.json");
|
|
@@ -34164,75 +34120,11 @@ const listWorkspacePackages = (rootDirectory) => {
|
|
|
34164
34120
|
}
|
|
34165
34121
|
return packages;
|
|
34166
34122
|
};
|
|
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
|
-
};
|
|
34216
34123
|
const REANIMATED_DEPENDENCY_NAME = "react-native-reanimated";
|
|
34217
34124
|
const MOBX_REACT_PACKAGE_NAME = "mobx-react";
|
|
34218
34125
|
const MOBX_REACT_LITE_PACKAGE_NAME = "mobx-react-lite";
|
|
34219
34126
|
const MOBX_STATE_TREE_PACKAGE_NAME = "mobx-state-tree";
|
|
34220
34127
|
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"];
|
|
34236
34128
|
const SHOPIFY_FLASH_LIST_PACKAGE_NAME = "@shopify/flash-list";
|
|
34237
34129
|
const resolveWorkspaceDependencyVersion = ({ concreteVersion, packageName, rootDirectory, rootPackageJson, sections, workspaceDirectory, workspacePackageJson }) => {
|
|
34238
34130
|
const dependencyDeclaration = getDependencyDeclaration({
|
|
@@ -34243,7 +34135,7 @@ const resolveWorkspaceDependencyVersion = ({ concreteVersion, packageName, rootD
|
|
|
34243
34135
|
if (!dependencyDeclaration.hasDeclaration) return null;
|
|
34244
34136
|
return concreteVersion ?? resolveCatalogVersion(workspacePackageJson, packageName, workspaceDirectory, dependencyDeclaration.catalogReference) ?? resolveCatalogVersion(rootPackageJson, packageName, rootDirectory, dependencyDeclaration.catalogReference);
|
|
34245
34137
|
};
|
|
34246
|
-
const
|
|
34138
|
+
const shouldReplaceReactVersion = (currentVersion, nextVersion) => {
|
|
34247
34139
|
if (!currentVersion) return true;
|
|
34248
34140
|
const currentMajor = parseReactMajor(currentVersion);
|
|
34249
34141
|
const nextMajor = parseReactMajor(nextVersion);
|
|
@@ -34262,50 +34154,6 @@ const shouldReplaceSupportedDependencyFact = (currentFact, nextFact, latestSuppo
|
|
|
34262
34154
|
if (nextMajor > latestSupportedMajor) return true;
|
|
34263
34155
|
return nextMajor < currentMajor;
|
|
34264
34156
|
};
|
|
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
34157
|
const evaluateManifestFacts = (facts, packageJson, directory, rootDirectory, rootPackageJson) => {
|
|
34310
34158
|
if (facts.expo.version === null) {
|
|
34311
34159
|
const spec = getDependencySpec(packageJson, "expo");
|
|
@@ -34339,10 +34187,10 @@ const evaluateManifestFacts = (facts, packageJson, directory, rootDirectory, roo
|
|
|
34339
34187
|
}),
|
|
34340
34188
|
sourceDirectory: directory
|
|
34341
34189
|
};
|
|
34342
|
-
if (
|
|
34190
|
+
if (shouldReplaceSupportedDependencyFact(facts.mobx, nextMobxFact, 6)) facts.mobx = nextMobxFact;
|
|
34343
34191
|
}
|
|
34344
|
-
|
|
34345
|
-
|
|
34192
|
+
facts.hasMobxReact = facts.hasMobxReact || getDependencySpec(packageJson, MOBX_REACT_PACKAGE_NAME) !== null;
|
|
34193
|
+
facts.hasMobxReactLite = facts.hasMobxReactLite || getDependencySpec(packageJson, MOBX_REACT_LITE_PACKAGE_NAME) !== null;
|
|
34346
34194
|
facts.hasMobxStateTree = facts.hasMobxStateTree || getDependencySpec(packageJson, MOBX_STATE_TREE_PACKAGE_NAME) !== null;
|
|
34347
34195
|
facts.hasMobxReactObserver = facts.hasMobxReactObserver || getDependencySpec(packageJson, MOBX_REACT_OBSERVER_PACKAGE_NAME) !== null;
|
|
34348
34196
|
const zustandSpec = getDependencySpec(packageJson, "zustand");
|
|
@@ -34366,52 +34214,6 @@ const evaluateManifestFacts = (facts, packageJson, directory, rootDirectory, roo
|
|
|
34366
34214
|
const spec = getDependencySpec(packageJson, "valtio");
|
|
34367
34215
|
if (spec !== null) facts.valtioVersion = spec;
|
|
34368
34216
|
}
|
|
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
|
-
}
|
|
34415
34217
|
facts.hasReactNativeAwarePackage = facts.hasReactNativeAwarePackage || isPackageJsonReactNativeAware(packageJson);
|
|
34416
34218
|
facts.hasReanimatedAwarePackage = facts.hasReanimatedAwarePackage || isPackageJsonReanimatedAware(packageJson);
|
|
34417
34219
|
facts.hasSsrDependency = facts.hasSsrDependency || isPackageJsonSsrAware(packageJson);
|
|
@@ -34433,8 +34235,6 @@ const evaluateManifestFacts = (facts, packageJson, directory, rootDirectory, roo
|
|
|
34433
34235
|
if (currentRemotionMajorVersion === null || remotionMajorVersion < currentRemotionMajorVersion) facts.remotionVersion = resolvedRemotionVersion;
|
|
34434
34236
|
}
|
|
34435
34237
|
}
|
|
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);
|
|
34438
34238
|
};
|
|
34439
34239
|
const collectWorkspaceFacts = (rootDirectory, rootPackageJson, { collectReactGroup }) => {
|
|
34440
34240
|
const facts = {
|
|
@@ -34460,32 +34260,19 @@ const collectWorkspaceFacts = (rootDirectory, rootPackageJson, { collectReactGro
|
|
|
34460
34260
|
sourceDirectory: null
|
|
34461
34261
|
},
|
|
34462
34262
|
hasMobxReact: false,
|
|
34463
|
-
mobxReactVersion: null,
|
|
34464
34263
|
hasMobxReactLite: false,
|
|
34465
|
-
mobxReactLiteVersion: null,
|
|
34466
34264
|
hasMobxStateTree: false,
|
|
34467
34265
|
hasMobxReactObserver: false,
|
|
34468
34266
|
zustand: {
|
|
34469
34267
|
version: null,
|
|
34470
34268
|
sourceDirectory: null
|
|
34471
34269
|
},
|
|
34472
|
-
tanstackQueryVersion: null,
|
|
34473
|
-
styledComponentsVersion: null,
|
|
34474
|
-
hasI18nLibrary: false,
|
|
34475
34270
|
hasReactNativeAwarePackage: false,
|
|
34476
34271
|
hasReanimatedAwarePackage: false,
|
|
34477
34272
|
hasSsrDependency: false,
|
|
34478
34273
|
hasRemotionDependency: false,
|
|
34479
34274
|
hasUnknownRemotionVersion: false,
|
|
34480
34275
|
remotionVersion: null,
|
|
34481
|
-
hasThree: false,
|
|
34482
|
-
threeVersion: null,
|
|
34483
|
-
hasReactThreeFiber: false,
|
|
34484
|
-
reactThreeFiber: {
|
|
34485
|
-
packageName: null,
|
|
34486
|
-
version: null,
|
|
34487
|
-
sourceDirectory: null
|
|
34488
|
-
},
|
|
34489
34276
|
reanimatedVersion: null
|
|
34490
34277
|
};
|
|
34491
34278
|
evaluateManifestFacts(facts, rootPackageJson, rootDirectory, rootDirectory, rootPackageJson);
|
|
@@ -34528,7 +34315,7 @@ const collectWorkspaceFacts = (rootDirectory, rootPackageJson, { collectReactGro
|
|
|
34528
34315
|
workspaceDirectory,
|
|
34529
34316
|
workspacePackageJson
|
|
34530
34317
|
});
|
|
34531
|
-
if (reactVersion &&
|
|
34318
|
+
if (reactVersion && shouldReplaceReactVersion(facts.reactVersion, reactVersion)) facts.reactVersion = reactVersion;
|
|
34532
34319
|
if (tailwindVersion && !facts.tailwindVersion) facts.tailwindVersion = tailwindVersion;
|
|
34533
34320
|
if (zodVersion && !facts.zodVersion) facts.zodVersion = zodVersion;
|
|
34534
34321
|
const settledReactMajor = parseReactMajor(facts.reactVersion);
|
|
@@ -34724,9 +34511,7 @@ const discoverProjectWithoutPackageJson = (directory) => {
|
|
|
34724
34511
|
mobxVersion: null,
|
|
34725
34512
|
mobxMajorVersion: null,
|
|
34726
34513
|
hasMobxReact: false,
|
|
34727
|
-
mobxReactVersion: null,
|
|
34728
34514
|
hasMobxReactLite: false,
|
|
34729
|
-
mobxReactLiteVersion: null,
|
|
34730
34515
|
hasMobxStateTree: false,
|
|
34731
34516
|
hasMobxReactObserver: false,
|
|
34732
34517
|
zustandVersion: null,
|
|
@@ -34741,15 +34526,6 @@ const discoverProjectWithoutPackageJson = (directory) => {
|
|
|
34741
34526
|
hasRemotion: false,
|
|
34742
34527
|
remotionVersion: null,
|
|
34743
34528
|
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,
|
|
34753
34529
|
hasSsrDependency: false,
|
|
34754
34530
|
preactVersion: null,
|
|
34755
34531
|
preactMajorVersion: null,
|
|
@@ -34876,19 +34652,6 @@ const discoverProject = (directory) => {
|
|
|
34876
34652
|
});
|
|
34877
34653
|
const preactVersion = getPreactVersion(packageJson);
|
|
34878
34654
|
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
|
-
});
|
|
34892
34655
|
const isPreES2023Target = hasTypeScript && detectPreES2023Target(directory);
|
|
34893
34656
|
const projectInfo = {
|
|
34894
34657
|
rootDirectory: directory,
|
|
@@ -34899,11 +34662,9 @@ const discoverProject = (directory) => {
|
|
|
34899
34662
|
zodVersion,
|
|
34900
34663
|
zodMajorVersion: zodVersion === null ? null : getLowestDependencyMajor(zodVersion),
|
|
34901
34664
|
mobxVersion,
|
|
34902
|
-
mobxMajorVersion: mobxVersion === null ? null :
|
|
34665
|
+
mobxMajorVersion: mobxVersion === null ? null : getLowestDependencyMajor(mobxVersion),
|
|
34903
34666
|
hasMobxReact: workspaceFacts.hasMobxReact,
|
|
34904
|
-
mobxReactVersion: workspaceFacts.mobxReactVersion,
|
|
34905
34667
|
hasMobxReactLite: workspaceFacts.hasMobxReactLite,
|
|
34906
|
-
mobxReactLiteVersion: workspaceFacts.mobxReactLiteVersion,
|
|
34907
34668
|
hasMobxStateTree: workspaceFacts.hasMobxStateTree,
|
|
34908
34669
|
hasMobxReactObserver: workspaceFacts.hasMobxReactObserver,
|
|
34909
34670
|
zustandVersion,
|
|
@@ -34912,21 +34673,12 @@ const discoverProject = (directory) => {
|
|
|
34912
34673
|
hasTypeScript,
|
|
34913
34674
|
hasReactCompiler: detectReactCompiler(directory, packageJson),
|
|
34914
34675
|
hasReactCompilerLintPlugin: detectReactCompilerLintPlugin(directory, packageJson),
|
|
34915
|
-
hasTanStackQuery:
|
|
34916
|
-
hasI18nLibrary: workspaceFacts.hasI18nLibrary,
|
|
34917
|
-
tanstackQueryVersion,
|
|
34918
|
-
styledComponentsVersion: workspaceFacts.styledComponentsVersion,
|
|
34676
|
+
hasTanStackQuery: hasTanStackQuery(packageJson),
|
|
34919
34677
|
valtioVersion,
|
|
34920
34678
|
valtioMajorVersion: valtioVersion === null ? null : getLowestDependencyMajor(valtioVersion),
|
|
34921
34679
|
hasRemotion: workspaceFacts.hasRemotionDependency,
|
|
34922
34680
|
remotionVersion,
|
|
34923
34681
|
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),
|
|
34930
34682
|
hasSsrDependency: workspaceFacts.hasSsrDependency,
|
|
34931
34683
|
preactVersion,
|
|
34932
34684
|
preactMajorVersion: parseReactMajor(preactVersion),
|
|
@@ -38201,10 +37953,10 @@ const SSR_FRAMEWORKS = new Set([
|
|
|
38201
37953
|
"gatsby",
|
|
38202
37954
|
"tanstack-start"
|
|
38203
37955
|
]);
|
|
38204
|
-
const
|
|
38205
|
-
if (
|
|
38206
|
-
const
|
|
38207
|
-
for (let candidate = earliest; candidate <=
|
|
37956
|
+
const addMajorLadder = (capabilities, name, major, earliest, latest) => {
|
|
37957
|
+
if (major === null) return;
|
|
37958
|
+
const cappedMajor = Math.min(major, latest);
|
|
37959
|
+
for (let candidate = earliest; candidate <= cappedMajor; candidate += 1) capabilities.add(`${name}:${candidate}`);
|
|
38208
37960
|
};
|
|
38209
37961
|
const buildCapabilities = (project) => {
|
|
38210
37962
|
const capabilities = /* @__PURE__ */ new Set();
|
|
@@ -38217,77 +37969,39 @@ const buildCapabilities = (project) => {
|
|
|
38217
37969
|
if (CLIENT_ONLY_FRAMEWORKS.has(project.framework)) capabilities.add("client-only");
|
|
38218
37970
|
if (project.isStaticExport) capabilities.add("nextjs:static-export");
|
|
38219
37971
|
if (project.nextjsMajorVersion !== null && project.nextjsMajorVersion >= 15) capabilities.add("nextjs:15");
|
|
38220
|
-
|
|
38221
|
-
addVersionCapabilityLadder(capabilities, "react", project.reactMajorVersion, 17, 30);
|
|
37972
|
+
addMajorLadder(capabilities, "react", project.reactMajorVersion, 17, 30);
|
|
38222
37973
|
if (project.reactMajorVersion !== null && project.reactMajorVersion >= 19 && isMajorMinorAtLeast(parseReactMajorMinor(project.reactVersion), {
|
|
38223
37974
|
major: 19,
|
|
38224
37975
|
minor: 2
|
|
38225
37976
|
})) capabilities.add("react:19.2");
|
|
38226
|
-
if (project.tailwindVersion !== null)
|
|
38227
|
-
|
|
38228
|
-
|
|
38229
|
-
|
|
38230
|
-
|
|
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
|
-
}
|
|
37977
|
+
if (project.tailwindVersion !== null) capabilities.add("tailwind");
|
|
37978
|
+
if (project.tailwindVersion !== null && isMajorMinorAtLeast(parseTailwindMajorMinor(project.tailwindVersion), {
|
|
37979
|
+
major: 3,
|
|
37980
|
+
minor: 4
|
|
37981
|
+
})) capabilities.add("tailwind:3.4");
|
|
38238
37982
|
if (project.zodVersion !== null) capabilities.add("zod");
|
|
38239
37983
|
if (project.zodMajorVersion !== null && project.zodMajorVersion >= 4) capabilities.add("zod:4");
|
|
38240
37984
|
if (project.mobxVersion !== void 0 && project.mobxVersion !== null || project.hasMobxReact === true || project.hasMobxReactLite === true || project.hasMobxStateTree === true || project.hasMobxReactObserver === true) capabilities.add("mobx");
|
|
38241
37985
|
if (project.hasMobxReact === true) capabilities.add("mobx-react");
|
|
38242
37986
|
if (project.hasMobxReactLite === true) capabilities.add("mobx-react-lite");
|
|
38243
37987
|
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
37988
|
if (project.hasMobxStateTree === true) capabilities.add("mobx-state-tree");
|
|
38258
37989
|
if (project.hasMobxReactObserver === true) capabilities.add("mobx-react-observer");
|
|
38259
|
-
if (project.mobxMajorVersion !== void 0 && project.mobxMajorVersion !== null && project.mobxMajorVersion >= 4 && project.mobxMajorVersion <= 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");
|
|
37990
|
+
if (project.mobxMajorVersion !== void 0 && project.mobxMajorVersion !== null && project.mobxMajorVersion >= 4 && project.mobxMajorVersion <= 6) addMajorLadder(capabilities, "mobx", project.mobxMajorVersion, 4, 6);
|
|
38265
37991
|
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)
|
|
37992
|
+
if (project.zustandMajorVersion !== void 0 && project.zustandMajorVersion !== null && project.zustandMajorVersion >= 1 && project.zustandMajorVersion <= 5) addMajorLadder(capabilities, "zustand", project.zustandMajorVersion, 1, 5);
|
|
38267
37993
|
if (project.isPreES2023Target) capabilities.add("pre-es2023");
|
|
38268
37994
|
if (project.hasReactCompiler) capabilities.add("react-compiler");
|
|
38269
|
-
if (
|
|
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");
|
|
37995
|
+
if (project.hasTanStackQuery) capabilities.add("tanstack-query");
|
|
38276
37996
|
if (project.valtioVersion !== null) capabilities.add("valtio");
|
|
38277
|
-
|
|
37997
|
+
addMajorLadder(capabilities, "valtio", project.valtioMajorVersion, 1, 10);
|
|
38278
37998
|
if (project.hasRemotion) {
|
|
38279
37999
|
capabilities.add("remotion");
|
|
38280
|
-
|
|
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);
|
|
38000
|
+
addMajorLadder(capabilities, "remotion", project.remotionMajorVersion ?? null, 4, 30);
|
|
38287
38001
|
}
|
|
38288
38002
|
if (project.hasTypeScript) capabilities.add("typescript");
|
|
38289
38003
|
if (project.preactVersion !== null) capabilities.add("preact");
|
|
38290
|
-
|
|
38004
|
+
addMajorLadder(capabilities, "preact", project.preactMajorVersion, 10, 20);
|
|
38291
38005
|
if (project.preactVersion !== null && project.reactVersion === null) capabilities.add("pure-preact");
|
|
38292
38006
|
return capabilities;
|
|
38293
38007
|
};
|
|
@@ -38299,7 +38013,7 @@ const getCapabilities = (project) => {
|
|
|
38299
38013
|
capabilitiesByProject.set(project, capabilities);
|
|
38300
38014
|
return capabilities;
|
|
38301
38015
|
};
|
|
38302
|
-
const shouldEnableRule = (requires, tags, capabilities, ignoredTags, disabledWhen
|
|
38016
|
+
const shouldEnableRule = (requires, tags, capabilities, ignoredTags, disabledWhen) => {
|
|
38303
38017
|
if (requires) {
|
|
38304
38018
|
for (const capability of requires) if (!capabilities.has(capability)) return false;
|
|
38305
38019
|
}
|
|
@@ -38310,29 +38024,20 @@ const shouldEnableRule = (requires, tags, capabilities, ignoredTags, disabledWhe
|
|
|
38310
38024
|
if (tags) {
|
|
38311
38025
|
for (const tag of tags) if (ignoredTags.has(tag)) return false;
|
|
38312
38026
|
}
|
|
38313
|
-
if (includedTags && includedTags.size > 0) {
|
|
38314
|
-
if (!tags?.some((tag) => includedTags.has(tag))) return false;
|
|
38315
|
-
}
|
|
38316
38027
|
return true;
|
|
38317
38028
|
};
|
|
38318
|
-
const shouldEnableRuleByDefaultStatus = (options) => options.defaultEnabled !== false || options.hasExplicitOverride === true || options.includeTagDefaults && options.hasIncludedTags;
|
|
38319
38029
|
const yieldToEventLoop = () => new Promise((resolve) => {
|
|
38320
38030
|
setImmediate(resolve);
|
|
38321
38031
|
});
|
|
38322
38032
|
const createSecurityScanSession = (rootDirectory, options) => {
|
|
38323
38033
|
const capabilities = options.project ? getCapabilities(options.project) : /* @__PURE__ */ new Set();
|
|
38324
38034
|
const ignoredTags = options.ignoredTags ?? /* @__PURE__ */ new Set();
|
|
38325
|
-
const includedTags = options.includedTags ?? /* @__PURE__ */ new Set();
|
|
38326
38035
|
const enabledScanRules = REACT_DOCTOR_RULES.flatMap((entry) => {
|
|
38327
38036
|
const rule = entry.rule;
|
|
38328
38037
|
const scan = rule.scan;
|
|
38329
38038
|
if (typeof scan !== "function") return [];
|
|
38330
|
-
if (
|
|
38331
|
-
|
|
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 [];
|
|
38039
|
+
if (rule.defaultEnabled === false) return [];
|
|
38040
|
+
if (!shouldEnableRule(rule.requires, rule.tags, capabilities, ignoredTags, rule.disabledWhen)) return [];
|
|
38336
38041
|
return [{
|
|
38337
38042
|
entry,
|
|
38338
38043
|
scan,
|
|
@@ -40318,9 +40023,8 @@ const buildUserPluginRules = (userPlugin, severityControls) => {
|
|
|
40318
40023
|
}
|
|
40319
40024
|
return enabled;
|
|
40320
40025
|
};
|
|
40321
|
-
const createOxlintConfig = ({ pluginPath, project, customRulesOnly = false, extendsPaths = [], ignoredTags = /* @__PURE__ */ new Set(),
|
|
40322
|
-
const
|
|
40323
|
-
const reactHooksJsPlugin = disableReactHooksJsPlugin || ruleSelection === "sidecar" || hasIncludedTags ? null : resolveReactHooksJsPlugin(project.hasReactCompiler || project.hasReactCompilerLintPlugin === true, customRulesOnly);
|
|
40026
|
+
const createOxlintConfig = ({ pluginPath, project, customRulesOnly = false, extendsPaths = [], ignoredTags = /* @__PURE__ */ new Set(), serverAuthFunctionNames, severityControls, userPlugins = [], disableReactHooksJsPlugin = false, ruleSelection, sidecarRuleIdFilter }) => {
|
|
40027
|
+
const reactHooksJsPlugin = disableReactHooksJsPlugin || ruleSelection === "sidecar" ? null : resolveReactHooksJsPlugin(project.hasReactCompiler || project.hasReactCompilerLintPlugin === true, customRulesOnly);
|
|
40324
40028
|
const reactCompilerRules = reactHooksJsPlugin ? applyRuleSeverityControls(filterRulesToAvailable(REACT_COMPILER_RULES, "react-hooks-js", reactHooksJsPlugin.availableRuleNames), severityControls) : {};
|
|
40325
40029
|
const jsPlugins = [];
|
|
40326
40030
|
if (reactHooksJsPlugin) jsPlugins.push(reactHooksJsPlugin.entry);
|
|
@@ -40335,14 +40039,9 @@ const createOxlintConfig = ({ pluginPath, project, customRulesOnly = false, exte
|
|
|
40335
40039
|
if (rule.scan !== void 0) continue;
|
|
40336
40040
|
if (customRulesOnly && registryEntry.originallyExternal) continue;
|
|
40337
40041
|
if (rule.framework !== "global" && !rule.requires) continue;
|
|
40338
|
-
if (!shouldEnableRule(rule.requires, rule.tags, capabilities, ignoredTags, rule.disabledWhen
|
|
40042
|
+
if (!shouldEnableRule(rule.requires, rule.tags, capabilities, ignoredTags, rule.disabledWhen)) continue;
|
|
40339
40043
|
const explicitRuleOverride = resolveRuleSeverityOverride({ ruleKey: registryEntry.key }, severityControls);
|
|
40340
|
-
if (
|
|
40341
|
-
defaultEnabled: rule.defaultEnabled,
|
|
40342
|
-
includeTagDefaults,
|
|
40343
|
-
hasIncludedTags,
|
|
40344
|
-
hasExplicitOverride: explicitRuleOverride !== void 0
|
|
40345
|
-
})) continue;
|
|
40044
|
+
if (rule.defaultEnabled === false && explicitRuleOverride === void 0) continue;
|
|
40346
40045
|
const severity = resolveRuleSeverityOverride({
|
|
40347
40046
|
ruleKey: registryEntry.key,
|
|
40348
40047
|
category: rule.category
|
|
@@ -40351,7 +40050,7 @@ const createOxlintConfig = ({ pluginPath, project, customRulesOnly = false, exte
|
|
|
40351
40050
|
enabledReactDoctorRules[registryEntry.key] = severity;
|
|
40352
40051
|
}
|
|
40353
40052
|
const userPluginRules = {};
|
|
40354
|
-
if (ruleSelection !== "sidecar"
|
|
40053
|
+
if (ruleSelection !== "sidecar") for (const userPlugin of userPlugins) {
|
|
40355
40054
|
Object.assign(userPluginRules, buildUserPluginRules(userPlugin, severityControls));
|
|
40356
40055
|
jsPlugins.push(userPlugin.entry);
|
|
40357
40056
|
}
|
|
@@ -40568,19 +40267,6 @@ const createSidecarLintCache = (cacheDirectory, rulesetHash) => {
|
|
|
40568
40267
|
}
|
|
40569
40268
|
};
|
|
40570
40269
|
};
|
|
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
|
-
};
|
|
40584
40270
|
const bundledRequire = createRequire(import.meta.url);
|
|
40585
40271
|
const childNodeVersionByBinaryPath = /* @__PURE__ */ new Map();
|
|
40586
40272
|
const resolveChildNodeVersion = (nodeBinaryPath) => {
|
|
@@ -40604,13 +40290,6 @@ const TOOLCHAIN_PACKAGE_SPECIFIERS = [
|
|
|
40604
40290
|
"oxlint-plugin-react-doctor/package.json",
|
|
40605
40291
|
"eslint-plugin-react-hooks/package.json"
|
|
40606
40292
|
];
|
|
40607
|
-
const resolvePluginFingerprint = () => {
|
|
40608
|
-
try {
|
|
40609
|
-
return fingerprintFileContents(bundledRequire.resolve("oxlint-plugin-react-doctor"), 16);
|
|
40610
|
-
} catch {
|
|
40611
|
-
return "unresolved";
|
|
40612
|
-
}
|
|
40613
|
-
};
|
|
40614
40293
|
const resolveOxlintToolchainVersions = (nodeBinaryPath = process.execPath) => {
|
|
40615
40294
|
const versions = [`node=${resolveChildNodeVersion(nodeBinaryPath)}`];
|
|
40616
40295
|
for (const specifier of TOOLCHAIN_PACKAGE_SPECIFIERS) try {
|
|
@@ -40620,7 +40299,6 @@ const resolveOxlintToolchainVersions = (nodeBinaryPath = process.execPath) => {
|
|
|
40620
40299
|
} catch {
|
|
40621
40300
|
versions.push(`${specifier}=missing`);
|
|
40622
40301
|
}
|
|
40623
|
-
versions.push(`oxlint-plugin-react-doctor#fingerprint=${resolvePluginFingerprint()}`);
|
|
40624
40302
|
return versions;
|
|
40625
40303
|
};
|
|
40626
40304
|
const esmRequire = createRequire(import.meta.url);
|
|
@@ -42096,7 +41774,7 @@ const reactHooksJsPluginDropNote = (error) => {
|
|
|
42096
41774
|
* 6. always restore disable directives + clean up the temp dir
|
|
42097
41775
|
*/
|
|
42098
41776
|
const runOxlint = async (options) => {
|
|
42099
|
-
const { rootDirectory, project, includePaths, nodeBinaryPath = process.execPath, customRulesOnly = false, respectInlineDisables = true, adoptExistingLintConfig = true, ignoredTags = /* @__PURE__ */ new Set(),
|
|
41777
|
+
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;
|
|
42100
41778
|
const serverAuthFunctionNames = Array.isArray(userConfig?.serverAuthFunctionNames) ? userConfig.serverAuthFunctionNames.filter((entry) => typeof entry === "string" && entry.length > 0) : void 0;
|
|
42101
41779
|
const severityControls = buildRuleSeverityControls(userConfig);
|
|
42102
41780
|
validateRuleRegistration();
|
|
@@ -42110,15 +41788,13 @@ const runOxlint = async (options) => {
|
|
|
42110
41788
|
}
|
|
42111
41789
|
const pluginPath = resolvePluginPath();
|
|
42112
41790
|
const extendsPaths = (adoptExistingLintConfig && !customRulesOnly ? detectUserLintConfigPaths(rootDirectory) : []).filter(canOxlintExtendConfig);
|
|
42113
|
-
const userPlugins =
|
|
41791
|
+
const userPlugins = resolveUserPlugins(userConfig?.plugins, configSourceDirectory);
|
|
42114
41792
|
const buildConfig = (overrides) => createOxlintConfig({
|
|
42115
41793
|
pluginPath,
|
|
42116
41794
|
project,
|
|
42117
41795
|
customRulesOnly,
|
|
42118
41796
|
extendsPaths: overrides.extendsPaths,
|
|
42119
41797
|
ignoredTags,
|
|
42120
|
-
includedTags,
|
|
42121
|
-
includeTagDefaults,
|
|
42122
41798
|
serverAuthFunctionNames,
|
|
42123
41799
|
severityControls,
|
|
42124
41800
|
userPlugins,
|
|
@@ -42507,8 +42183,6 @@ var Linter = class Linter extends Service()("react-doctor/Linter") {
|
|
|
42507
42183
|
respectInlineDisables: input.respectInlineDisables,
|
|
42508
42184
|
adoptExistingLintConfig: input.adoptExistingLintConfig,
|
|
42509
42185
|
ignoredTags: input.ignoredTags,
|
|
42510
|
-
includedTags: input.includedTags,
|
|
42511
|
-
includeTagDefaults: input.includeTagDefaults,
|
|
42512
42186
|
userConfig: input.userConfig ?? null,
|
|
42513
42187
|
configSourceDirectory: input.configSourceDirectory,
|
|
42514
42188
|
onPartialFailure: (reason) => {
|
|
@@ -43357,9 +43031,7 @@ const runInspect = (input, hooks = {}) => gen(function* () {
|
|
|
43357
43031
|
const securityScanFailedRef = yield* make$13(false);
|
|
43358
43032
|
const securityScanFiber = yield* forkChild(runCollect(applyPerElementPipeline(isDiffMode ? empty$4 : unwrap(tryPromise(() => checkSecurityScanCooperative(scanDirectory, {
|
|
43359
43033
|
project,
|
|
43360
|
-
ignoredTags: input.ignoredTags
|
|
43361
|
-
includedTags: input.includedTags,
|
|
43362
|
-
includeTagDefaults: input.includeTagDefaults
|
|
43034
|
+
ignoredTags: input.ignoredTags
|
|
43363
43035
|
})).pipe(map$3((diagnostics) => fromIterable$1(diagnostics)), catch_$1(() => set(securityScanFailedRef, true).pipe(as(empty$4))))))).pipe(withSpan("SecurityScan.run")));
|
|
43364
43036
|
const shouldRunSupplyChain = !isDiffMode || (input.supplyChainManifestChanged ?? false);
|
|
43365
43037
|
const supplyChainOverlapTimeout = yield* SupplyChainOverlapTimeoutMs;
|
|
@@ -43450,8 +43122,6 @@ const runInspect = (input, hooks = {}) => gen(function* () {
|
|
|
43450
43122
|
respectInlineDisables: input.respectInlineDisables,
|
|
43451
43123
|
adoptExistingLintConfig: input.adoptExistingLintConfig,
|
|
43452
43124
|
ignoredTags: input.ignoredTags,
|
|
43453
|
-
includedTags: input.includedTags,
|
|
43454
|
-
includeTagDefaults: input.includeTagDefaults,
|
|
43455
43125
|
userConfig: resolvedConfig.config ?? void 0,
|
|
43456
43126
|
configSourceDirectory: resolvedConfig.configSourceDirectory ?? void 0,
|
|
43457
43127
|
onFileProgress: (scannedFileCount, totalFileCount) => {
|
|
@@ -44312,4 +43982,4 @@ const toJsonReport = (result, options) => buildJsonReport({
|
|
|
44312
43982
|
export { AmbiguousProjectError, NoReactDependencyError, NotADirectoryError, PackageJsonNotFoundError, ProjectNotFoundError, ReactDoctorError, buildJsonReport, buildJsonReportError, clearCaches, defineConfig, diagnose, filterSourceFiles, getDiffInfo, hasReactRuntime, isProjectDiscoveryError, isReactDoctorError, summarizeDiagnostics, toJsonReport };
|
|
44313
43983
|
|
|
44314
43984
|
//# sourceMappingURL=index.js.map
|
|
44315
|
-
//# debugId=
|
|
43985
|
+
//# debugId=6aa1c6e1-8fcc-50d4-a076-3e864425bdc5
|