react-doctor 0.7.9-dev.a16e452 → 0.7.9-dev.ac392cb

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/cli.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]="5c4df375-a5c4-57d2-9076-4e54cbb8f3bd")}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]="9898ed05-f0d6-5dde-8b34-6d261cecec36")}catch(e){}}();
3
3
  import { createRequire } from "node:module";
4
4
  import * as NodeChildProcess from "node:child_process";
5
5
  import { execFile, execFileSync, spawn, spawnSync } from "node:child_process";
@@ -36252,6 +36252,53 @@ const SUPPLY_CHAIN_OVERLAP_TIMEOUT_MS = 9e4;
36252
36252
  const SUPPLY_CHAIN_CACHE_TTL_MS = 864e5;
36253
36253
  const SUPPLY_CHAIN_CACHE_SUBDIR = "supply-chain";
36254
36254
  const SUPPLY_CHAIN_IGNORED_PACKAGES = new Set(["next"]);
36255
+ const lastSourceMappingUrl = (fileContent) => {
36256
+ const lastReference = [...fileContent.matchAll(/\/\/# sourceMappingURL=(\S+)/g)].at(-1);
36257
+ return lastReference ? lastReference[1] : null;
36258
+ };
36259
+ const mapTargetsSource = (mapContent, input) => {
36260
+ const parsedMap = JSON.parse(mapContent);
36261
+ if (typeof parsedMap !== "object" || parsedMap === null) return false;
36262
+ const { file, sources } = parsedMap;
36263
+ if (file !== input.expectedFile) return false;
36264
+ if (!Array.isArray(sources) || sources.length !== 1 || typeof sources[0] !== "string") return false;
36265
+ return Path.posix.normalize(Path.posix.join(input.mapDirectory, sources[0])) === input.sourcePath;
36266
+ };
36267
+ const quartetProvesEmit = (stem, sourcePath, readFileText) => {
36268
+ try {
36269
+ const emitBaseName = Path.posix.basename(stem);
36270
+ const mapDirectory = Path.posix.dirname(stem);
36271
+ return lastSourceMappingUrl(readFileText(`${stem}.js`)) === `${emitBaseName}.js.map` && lastSourceMappingUrl(readFileText(`${stem}.d.ts`)) === `${emitBaseName}.d.ts.map` && mapTargetsSource(readFileText(`${stem}.js.map`), {
36272
+ expectedFile: `${emitBaseName}.js`,
36273
+ mapDirectory,
36274
+ sourcePath
36275
+ }) && mapTargetsSource(readFileText(`${stem}.d.ts.map`), {
36276
+ expectedFile: `${emitBaseName}.d.ts`,
36277
+ mapDirectory,
36278
+ sourcePath
36279
+ });
36280
+ } catch {
36281
+ return false;
36282
+ }
36283
+ };
36284
+ const collectTypeScriptEmitDuplicateJsPaths = (input) => {
36285
+ const untracked = new Set(input.untrackedPaths);
36286
+ const duplicateJsPaths = /* @__PURE__ */ new Set();
36287
+ for (const jsPath of untracked) {
36288
+ if (!jsPath.endsWith(".js")) continue;
36289
+ const stem = jsPath.slice(0, -3);
36290
+ if (![
36291
+ jsPath,
36292
+ `${stem}.js.map`,
36293
+ `${stem}.d.ts`,
36294
+ `${stem}.d.ts.map`
36295
+ ].every((emitPath) => untracked.has(emitPath) && !input.trackedPaths.has(emitPath))) continue;
36296
+ const sourcePath = [`${stem}.ts`, `${stem}.tsx`].find((candidatePath) => input.trackedPaths.has(candidatePath));
36297
+ if (!sourcePath) continue;
36298
+ if (quartetProvesEmit(stem, sourcePath, input.readFileText)) duplicateJsPaths.add(jsPath);
36299
+ }
36300
+ return duplicateJsPaths;
36301
+ };
36255
36302
  const isIgnoredDirectoryName = (directoryName) => IGNORED_DIRECTORIES.has(directoryName) || directoryName.startsWith(".") && !SCANNED_DOT_DIRECTORIES.has(directoryName);
36256
36303
  const hasIgnoredPathSegment = (relativePath) => relativePath.split(/[/\\]/).slice(0, -1).some((segment) => isIgnoredDirectoryName(segment));
36257
36304
  const isLintableSourceFile = (filePath) => SOURCE_FILE_PATTERN.test(filePath) && !GENERATED_BUNDLE_FILE_PATTERN.test(filePath) && !GENERATED_SOURCE_DIRECTORY_PATTERN.test(filePath);
@@ -36319,20 +36366,29 @@ const collectSizedSourceFiles = (rootDirectory, relativePaths) => {
36319
36366
  }
36320
36367
  return entries;
36321
36368
  };
36322
- const listSourceFilesViaGit = (rootDirectory) => {
36369
+ const gitLsFiles = (rootDirectory, flags) => {
36323
36370
  const result = spawnSync("git", [
36324
36371
  "ls-files",
36325
36372
  "-z",
36326
- "--cached",
36327
- "--others",
36328
- "--exclude-standard"
36373
+ ...flags
36329
36374
  ], {
36330
36375
  cwd: rootDirectory,
36331
36376
  encoding: "utf-8",
36332
36377
  maxBuffer: GIT_LS_FILES_MAX_BUFFER_BYTES
36333
36378
  });
36334
36379
  if (result.error || result.status !== 0) return null;
36335
- return result.stdout.split("\0").filter((filePath) => filePath.length > 0 && isLintableSourceFile(filePath) && !hasIgnoredPathSegment(filePath));
36380
+ return result.stdout.split("\0").filter((filePath) => filePath.length > 0);
36381
+ };
36382
+ const listSourceFilesViaGit = (rootDirectory) => {
36383
+ const trackedPaths = gitLsFiles(rootDirectory, ["--cached"]);
36384
+ const untrackedPaths = gitLsFiles(rootDirectory, ["--others", "--exclude-standard"]);
36385
+ if (trackedPaths === null || untrackedPaths === null) return null;
36386
+ const emitDuplicateJsPaths = collectTypeScriptEmitDuplicateJsPaths({
36387
+ trackedPaths: new Set(trackedPaths),
36388
+ untrackedPaths,
36389
+ readFileText: (relativePath) => NFS.readFileSync(Path.resolve(rootDirectory, relativePath), "utf-8")
36390
+ });
36391
+ return [...trackedPaths, ...untrackedPaths].filter((filePath) => isLintableSourceFile(filePath) && !hasIgnoredPathSegment(filePath) && !emitDuplicateJsPaths.has(filePath));
36336
36392
  };
36337
36393
  const listSourceFilesViaFilesystem = (rootDirectory) => {
36338
36394
  const filePaths = [];
@@ -42428,6 +42484,7 @@ var Git = class Git extends Service()("react-doctor/Git") {
42428
42484
  }
42429
42485
  const diff = yield* runGit(input.directory, [
42430
42486
  "diff",
42487
+ "--no-ext-diff",
42431
42488
  "-z",
42432
42489
  "--name-only",
42433
42490
  "--diff-filter=ACMR",
@@ -42474,6 +42531,7 @@ var Git = class Git extends Service()("react-doctor/Git") {
42474
42531
  if (resolvedCurrentBranch !== null && resolvedCurrentBranch === baseBranch) {
42475
42532
  const uncommitted = yield* runGit(directory, [
42476
42533
  "diff",
42534
+ "--no-ext-diff",
42477
42535
  "-z",
42478
42536
  "--name-only",
42479
42537
  "--diff-filter=ACMR",
@@ -42500,6 +42558,7 @@ var Git = class Git extends Service()("react-doctor/Git") {
42500
42558
  if (mergeBaseRef === null) return null;
42501
42559
  const diff = yield* runGit(directory, [
42502
42560
  "diff",
42561
+ "--no-ext-diff",
42503
42562
  "-z",
42504
42563
  "--name-only",
42505
42564
  "--diff-filter=ACMR",
@@ -42517,6 +42576,7 @@ var Git = class Git extends Service()("react-doctor/Git") {
42517
42576
  }).pipe(withSpan("Git.diffSelection")),
42518
42577
  stagedFilePaths: (directory) => runGit(directory, [
42519
42578
  "diff",
42579
+ "--no-ext-diff",
42520
42580
  "--cached",
42521
42581
  "-z",
42522
42582
  "--name-only",
@@ -42562,6 +42622,7 @@ var Git = class Git extends Service()("react-doctor/Git") {
42562
42622
  if (baseRef !== void 0 && !isSafeGitRevision(baseRef)) return null;
42563
42623
  const result = yield* runGit(directory, [
42564
42624
  "diff",
42625
+ "--no-ext-diff",
42565
42626
  "--unified=0",
42566
42627
  "--diff-filter=ACMR",
42567
42628
  "--relative",
@@ -47159,7 +47220,7 @@ const makeNoopConsole = () => ({
47159
47220
  });
47160
47221
  //#endregion
47161
47222
  //#region src/cli/utils/version.ts
47162
- const VERSION = "0.7.9-dev.a16e452";
47223
+ const VERSION = "0.7.9-dev.ac392cb";
47163
47224
  //#endregion
47164
47225
  //#region src/cli/utils/json-mode.ts
47165
47226
  let context = null;
@@ -47511,13 +47572,13 @@ const isDevVersion = (version) => version === "0.0.0" || version.includes("-");
47511
47572
  * uploads source-map artifacts under, so stack frames symbolicate. Honors the
47512
47573
  * standard `SENTRY_RELEASE` override.
47513
47574
  */
47514
- const resolveSentryRelease = () => process.env.SENTRY_RELEASE || `react-doctor@0.7.9-dev.a16e452`;
47575
+ const resolveSentryRelease = () => process.env.SENTRY_RELEASE || `react-doctor@0.7.9-dev.ac392cb`;
47515
47576
  /**
47516
47577
  * Deployment environment shown in Sentry's environment filter. Defaults to
47517
47578
  * `production` for tagged releases and `development` for dev/unbuilt versions,
47518
47579
  * overridable via the standard `SENTRY_ENVIRONMENT` env var.
47519
47580
  */
47520
- const resolveSentryEnvironment = () => process.env.SENTRY_ENVIRONMENT || (isDevVersion("0.7.9-dev.a16e452") ? "development" : "production");
47581
+ const resolveSentryEnvironment = () => process.env.SENTRY_ENVIRONMENT || (isDevVersion("0.7.9-dev.ac392cb") ? "development" : "production");
47521
47582
  /**
47522
47583
  * Performance-tracing sample rate in `[0, 1]`. Reads `SENTRY_TRACES_SAMPLE_RATE`
47523
47584
  * (set to `0` to disable tracing) and falls back to
@@ -65795,4 +65856,4 @@ Promise.resolve().then(() => assertNoRemovedFlags(process.argv)).then(() => prog
65795
65856
  export {};
65796
65857
 
65797
65858
  //# sourceMappingURL=cli.js.map
65798
- //# debugId=5c4df375-a5c4-57d2-9076-4e54cbb8f3bd
65859
+ //# debugId=9898ed05-f0d6-5dde-8b34-6d261cecec36
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]="526cf949-6544-5cb8-bf6d-3f4d854b6678")}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]="9b5de5c5-ef1b-5b8a-96f4-6ba90e254e08")}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";
@@ -33050,6 +33050,53 @@ const SUPPLY_CHAIN_OVERLAP_TIMEOUT_MS = 9e4;
33050
33050
  const SUPPLY_CHAIN_CACHE_TTL_MS = 864e5;
33051
33051
  const SUPPLY_CHAIN_CACHE_SUBDIR = "supply-chain";
33052
33052
  const SUPPLY_CHAIN_IGNORED_PACKAGES = new Set(["next"]);
33053
+ const lastSourceMappingUrl = (fileContent) => {
33054
+ const lastReference = [...fileContent.matchAll(/\/\/# sourceMappingURL=(\S+)/g)].at(-1);
33055
+ return lastReference ? lastReference[1] : null;
33056
+ };
33057
+ const mapTargetsSource = (mapContent, input) => {
33058
+ const parsedMap = JSON.parse(mapContent);
33059
+ if (typeof parsedMap !== "object" || parsedMap === null) return false;
33060
+ const { file, sources } = parsedMap;
33061
+ if (file !== input.expectedFile) return false;
33062
+ if (!Array.isArray(sources) || sources.length !== 1 || typeof sources[0] !== "string") return false;
33063
+ return Path.posix.normalize(Path.posix.join(input.mapDirectory, sources[0])) === input.sourcePath;
33064
+ };
33065
+ const quartetProvesEmit = (stem, sourcePath, readFileText) => {
33066
+ try {
33067
+ const emitBaseName = Path.posix.basename(stem);
33068
+ const mapDirectory = Path.posix.dirname(stem);
33069
+ return lastSourceMappingUrl(readFileText(`${stem}.js`)) === `${emitBaseName}.js.map` && lastSourceMappingUrl(readFileText(`${stem}.d.ts`)) === `${emitBaseName}.d.ts.map` && mapTargetsSource(readFileText(`${stem}.js.map`), {
33070
+ expectedFile: `${emitBaseName}.js`,
33071
+ mapDirectory,
33072
+ sourcePath
33073
+ }) && mapTargetsSource(readFileText(`${stem}.d.ts.map`), {
33074
+ expectedFile: `${emitBaseName}.d.ts`,
33075
+ mapDirectory,
33076
+ sourcePath
33077
+ });
33078
+ } catch {
33079
+ return false;
33080
+ }
33081
+ };
33082
+ const collectTypeScriptEmitDuplicateJsPaths = (input) => {
33083
+ const untracked = new Set(input.untrackedPaths);
33084
+ const duplicateJsPaths = /* @__PURE__ */ new Set();
33085
+ for (const jsPath of untracked) {
33086
+ if (!jsPath.endsWith(".js")) continue;
33087
+ const stem = jsPath.slice(0, -3);
33088
+ if (![
33089
+ jsPath,
33090
+ `${stem}.js.map`,
33091
+ `${stem}.d.ts`,
33092
+ `${stem}.d.ts.map`
33093
+ ].every((emitPath) => untracked.has(emitPath) && !input.trackedPaths.has(emitPath))) continue;
33094
+ const sourcePath = [`${stem}.ts`, `${stem}.tsx`].find((candidatePath) => input.trackedPaths.has(candidatePath));
33095
+ if (!sourcePath) continue;
33096
+ if (quartetProvesEmit(stem, sourcePath, input.readFileText)) duplicateJsPaths.add(jsPath);
33097
+ }
33098
+ return duplicateJsPaths;
33099
+ };
33053
33100
  const isIgnoredDirectoryName = (directoryName) => IGNORED_DIRECTORIES.has(directoryName) || directoryName.startsWith(".") && !SCANNED_DOT_DIRECTORIES.has(directoryName);
33054
33101
  const hasIgnoredPathSegment = (relativePath) => relativePath.split(/[/\\]/).slice(0, -1).some((segment) => isIgnoredDirectoryName(segment));
33055
33102
  const isLintableSourceFile = (filePath) => SOURCE_FILE_PATTERN.test(filePath) && !GENERATED_BUNDLE_FILE_PATTERN.test(filePath) && !GENERATED_SOURCE_DIRECTORY_PATTERN.test(filePath);
@@ -33120,20 +33167,29 @@ const collectSizedSourceFiles = (rootDirectory, relativePaths) => {
33120
33167
  }
33121
33168
  return entries;
33122
33169
  };
33123
- const listSourceFilesViaGit = (rootDirectory) => {
33170
+ const gitLsFiles = (rootDirectory, flags) => {
33124
33171
  const result = spawnSync("git", [
33125
33172
  "ls-files",
33126
33173
  "-z",
33127
- "--cached",
33128
- "--others",
33129
- "--exclude-standard"
33174
+ ...flags
33130
33175
  ], {
33131
33176
  cwd: rootDirectory,
33132
33177
  encoding: "utf-8",
33133
33178
  maxBuffer: GIT_LS_FILES_MAX_BUFFER_BYTES
33134
33179
  });
33135
33180
  if (result.error || result.status !== 0) return null;
33136
- return result.stdout.split("\0").filter((filePath) => filePath.length > 0 && isLintableSourceFile(filePath) && !hasIgnoredPathSegment(filePath));
33181
+ return result.stdout.split("\0").filter((filePath) => filePath.length > 0);
33182
+ };
33183
+ const listSourceFilesViaGit = (rootDirectory) => {
33184
+ const trackedPaths = gitLsFiles(rootDirectory, ["--cached"]);
33185
+ const untrackedPaths = gitLsFiles(rootDirectory, ["--others", "--exclude-standard"]);
33186
+ if (trackedPaths === null || untrackedPaths === null) return null;
33187
+ const emitDuplicateJsPaths = collectTypeScriptEmitDuplicateJsPaths({
33188
+ trackedPaths: new Set(trackedPaths),
33189
+ untrackedPaths,
33190
+ readFileText: (relativePath) => NFS.readFileSync(Path.resolve(rootDirectory, relativePath), "utf-8")
33191
+ });
33192
+ return [...trackedPaths, ...untrackedPaths].filter((filePath) => isLintableSourceFile(filePath) && !hasIgnoredPathSegment(filePath) && !emitDuplicateJsPaths.has(filePath));
33137
33193
  };
33138
33194
  const listSourceFilesViaFilesystem = (rootDirectory) => {
33139
33195
  const filePaths = [];
@@ -39184,6 +39240,7 @@ var Git = class Git extends Service()("react-doctor/Git") {
39184
39240
  }
39185
39241
  const diff = yield* runGit(input.directory, [
39186
39242
  "diff",
39243
+ "--no-ext-diff",
39187
39244
  "-z",
39188
39245
  "--name-only",
39189
39246
  "--diff-filter=ACMR",
@@ -39230,6 +39287,7 @@ var Git = class Git extends Service()("react-doctor/Git") {
39230
39287
  if (resolvedCurrentBranch !== null && resolvedCurrentBranch === baseBranch) {
39231
39288
  const uncommitted = yield* runGit(directory, [
39232
39289
  "diff",
39290
+ "--no-ext-diff",
39233
39291
  "-z",
39234
39292
  "--name-only",
39235
39293
  "--diff-filter=ACMR",
@@ -39256,6 +39314,7 @@ var Git = class Git extends Service()("react-doctor/Git") {
39256
39314
  if (mergeBaseRef === null) return null;
39257
39315
  const diff = yield* runGit(directory, [
39258
39316
  "diff",
39317
+ "--no-ext-diff",
39259
39318
  "-z",
39260
39319
  "--name-only",
39261
39320
  "--diff-filter=ACMR",
@@ -39273,6 +39332,7 @@ var Git = class Git extends Service()("react-doctor/Git") {
39273
39332
  }).pipe(withSpan("Git.diffSelection")),
39274
39333
  stagedFilePaths: (directory) => runGit(directory, [
39275
39334
  "diff",
39335
+ "--no-ext-diff",
39276
39336
  "--cached",
39277
39337
  "-z",
39278
39338
  "--name-only",
@@ -39318,6 +39378,7 @@ var Git = class Git extends Service()("react-doctor/Git") {
39318
39378
  if (baseRef !== void 0 && !isSafeGitRevision(baseRef)) return null;
39319
39379
  const result = yield* runGit(directory, [
39320
39380
  "diff",
39381
+ "--no-ext-diff",
39321
39382
  "--unified=0",
39322
39383
  "--diff-filter=ACMR",
39323
39384
  "--relative",
@@ -43663,4 +43724,4 @@ const toJsonReport = (result, options) => buildJsonReport({
43663
43724
  export { AmbiguousProjectError, NoReactDependencyError, NotADirectoryError, PackageJsonNotFoundError, ProjectNotFoundError, ReactDoctorError, buildJsonReport, buildJsonReportError, clearCaches, defineConfig, diagnose, filterSourceFiles, getDiffInfo, hasReactRuntime, isProjectDiscoveryError, isReactDoctorError, summarizeDiagnostics, toJsonReport };
43664
43725
 
43665
43726
  //# sourceMappingURL=index.js.map
43666
- //# debugId=526cf949-6544-5cb8-bf6d-3f4d854b6678
43727
+ //# debugId=9b5de5c5-ef1b-5b8a-96f4-6ba90e254e08
package/dist/lsp.js CHANGED
@@ -33102,6 +33102,53 @@ const SUPPLY_CHAIN_OVERLAP_TIMEOUT_MS = 9e4;
33102
33102
  const SUPPLY_CHAIN_CACHE_TTL_MS = 864e5;
33103
33103
  const SUPPLY_CHAIN_CACHE_SUBDIR = "supply-chain";
33104
33104
  const SUPPLY_CHAIN_IGNORED_PACKAGES = new Set(["next"]);
33105
+ const lastSourceMappingUrl = (fileContent) => {
33106
+ const lastReference = [...fileContent.matchAll(/\/\/# sourceMappingURL=(\S+)/g)].at(-1);
33107
+ return lastReference ? lastReference[1] : null;
33108
+ };
33109
+ const mapTargetsSource = (mapContent, input) => {
33110
+ const parsedMap = JSON.parse(mapContent);
33111
+ if (typeof parsedMap !== "object" || parsedMap === null) return false;
33112
+ const { file, sources } = parsedMap;
33113
+ if (file !== input.expectedFile) return false;
33114
+ if (!Array.isArray(sources) || sources.length !== 1 || typeof sources[0] !== "string") return false;
33115
+ return Path.posix.normalize(Path.posix.join(input.mapDirectory, sources[0])) === input.sourcePath;
33116
+ };
33117
+ const quartetProvesEmit = (stem, sourcePath, readFileText) => {
33118
+ try {
33119
+ const emitBaseName = Path.posix.basename(stem);
33120
+ const mapDirectory = Path.posix.dirname(stem);
33121
+ return lastSourceMappingUrl(readFileText(`${stem}.js`)) === `${emitBaseName}.js.map` && lastSourceMappingUrl(readFileText(`${stem}.d.ts`)) === `${emitBaseName}.d.ts.map` && mapTargetsSource(readFileText(`${stem}.js.map`), {
33122
+ expectedFile: `${emitBaseName}.js`,
33123
+ mapDirectory,
33124
+ sourcePath
33125
+ }) && mapTargetsSource(readFileText(`${stem}.d.ts.map`), {
33126
+ expectedFile: `${emitBaseName}.d.ts`,
33127
+ mapDirectory,
33128
+ sourcePath
33129
+ });
33130
+ } catch {
33131
+ return false;
33132
+ }
33133
+ };
33134
+ const collectTypeScriptEmitDuplicateJsPaths = (input) => {
33135
+ const untracked = new Set(input.untrackedPaths);
33136
+ const duplicateJsPaths = /* @__PURE__ */ new Set();
33137
+ for (const jsPath of untracked) {
33138
+ if (!jsPath.endsWith(".js")) continue;
33139
+ const stem = jsPath.slice(0, -3);
33140
+ if (![
33141
+ jsPath,
33142
+ `${stem}.js.map`,
33143
+ `${stem}.d.ts`,
33144
+ `${stem}.d.ts.map`
33145
+ ].every((emitPath) => untracked.has(emitPath) && !input.trackedPaths.has(emitPath))) continue;
33146
+ const sourcePath = [`${stem}.ts`, `${stem}.tsx`].find((candidatePath) => input.trackedPaths.has(candidatePath));
33147
+ if (!sourcePath) continue;
33148
+ if (quartetProvesEmit(stem, sourcePath, input.readFileText)) duplicateJsPaths.add(jsPath);
33149
+ }
33150
+ return duplicateJsPaths;
33151
+ };
33105
33152
  const isIgnoredDirectoryName = (directoryName) => IGNORED_DIRECTORIES.has(directoryName) || directoryName.startsWith(".") && !SCANNED_DOT_DIRECTORIES.has(directoryName);
33106
33153
  const hasIgnoredPathSegment = (relativePath) => relativePath.split(/[/\\]/).slice(0, -1).some((segment) => isIgnoredDirectoryName(segment));
33107
33154
  const isLintableSourceFile = (filePath) => SOURCE_FILE_PATTERN.test(filePath) && !GENERATED_BUNDLE_FILE_PATTERN.test(filePath) && !GENERATED_SOURCE_DIRECTORY_PATTERN.test(filePath);
@@ -33172,20 +33219,29 @@ const collectSizedSourceFiles = (rootDirectory, relativePaths) => {
33172
33219
  }
33173
33220
  return entries;
33174
33221
  };
33175
- const listSourceFilesViaGit = (rootDirectory) => {
33222
+ const gitLsFiles = (rootDirectory, flags) => {
33176
33223
  const result = spawnSync("git", [
33177
33224
  "ls-files",
33178
33225
  "-z",
33179
- "--cached",
33180
- "--others",
33181
- "--exclude-standard"
33226
+ ...flags
33182
33227
  ], {
33183
33228
  cwd: rootDirectory,
33184
33229
  encoding: "utf-8",
33185
33230
  maxBuffer: GIT_LS_FILES_MAX_BUFFER_BYTES
33186
33231
  });
33187
33232
  if (result.error || result.status !== 0) return null;
33188
- return result.stdout.split("\0").filter((filePath) => filePath.length > 0 && isLintableSourceFile(filePath) && !hasIgnoredPathSegment(filePath));
33233
+ return result.stdout.split("\0").filter((filePath) => filePath.length > 0);
33234
+ };
33235
+ const listSourceFilesViaGit = (rootDirectory) => {
33236
+ const trackedPaths = gitLsFiles(rootDirectory, ["--cached"]);
33237
+ const untrackedPaths = gitLsFiles(rootDirectory, ["--others", "--exclude-standard"]);
33238
+ if (trackedPaths === null || untrackedPaths === null) return null;
33239
+ const emitDuplicateJsPaths = collectTypeScriptEmitDuplicateJsPaths({
33240
+ trackedPaths: new Set(trackedPaths),
33241
+ untrackedPaths,
33242
+ readFileText: (relativePath) => NFS.readFileSync(Path.resolve(rootDirectory, relativePath), "utf-8")
33243
+ });
33244
+ return [...trackedPaths, ...untrackedPaths].filter((filePath) => isLintableSourceFile(filePath) && !hasIgnoredPathSegment(filePath) && !emitDuplicateJsPaths.has(filePath));
33189
33245
  };
33190
33246
  const listSourceFilesViaFilesystem = (rootDirectory) => {
33191
33247
  const filePaths = [];
@@ -39162,6 +39218,7 @@ var Git = class Git extends Service()("react-doctor/Git") {
39162
39218
  }
39163
39219
  const diff = yield* runGit(input.directory, [
39164
39220
  "diff",
39221
+ "--no-ext-diff",
39165
39222
  "-z",
39166
39223
  "--name-only",
39167
39224
  "--diff-filter=ACMR",
@@ -39208,6 +39265,7 @@ var Git = class Git extends Service()("react-doctor/Git") {
39208
39265
  if (resolvedCurrentBranch !== null && resolvedCurrentBranch === baseBranch) {
39209
39266
  const uncommitted = yield* runGit(directory, [
39210
39267
  "diff",
39268
+ "--no-ext-diff",
39211
39269
  "-z",
39212
39270
  "--name-only",
39213
39271
  "--diff-filter=ACMR",
@@ -39234,6 +39292,7 @@ var Git = class Git extends Service()("react-doctor/Git") {
39234
39292
  if (mergeBaseRef === null) return null;
39235
39293
  const diff = yield* runGit(directory, [
39236
39294
  "diff",
39295
+ "--no-ext-diff",
39237
39296
  "-z",
39238
39297
  "--name-only",
39239
39298
  "--diff-filter=ACMR",
@@ -39251,6 +39310,7 @@ var Git = class Git extends Service()("react-doctor/Git") {
39251
39310
  }).pipe(withSpan("Git.diffSelection")),
39252
39311
  stagedFilePaths: (directory) => runGit(directory, [
39253
39312
  "diff",
39313
+ "--no-ext-diff",
39254
39314
  "--cached",
39255
39315
  "-z",
39256
39316
  "--name-only",
@@ -39296,6 +39356,7 @@ var Git = class Git extends Service()("react-doctor/Git") {
39296
39356
  if (baseRef !== void 0 && !isSafeGitRevision(baseRef)) return null;
39297
39357
  const result = yield* runGit(directory, [
39298
39358
  "diff",
39359
+ "--no-ext-diff",
39299
39360
  "--unified=0",
39300
39361
  "--diff-filter=ACMR",
39301
39362
  "--relative",
@@ -45283,5 +45344,5 @@ const startLanguageServer = () => {
45283
45344
  };
45284
45345
  //#endregion
45285
45346
  export { startLanguageServer };
45286
- !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]="3eb1e331-d4d9-517d-a23d-3170e3d3203f")}catch(e){}}();
45287
- //# debugId=3eb1e331-d4d9-517d-a23d-3170e3d3203f
45347
+ !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]="04d3db08-86f8-5f5f-a193-609932e35579")}catch(e){}}();
45348
+ //# debugId=04d3db08-86f8-5f5f-a193-609932e35579
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-doctor",
3
- "version": "0.7.9-dev.a16e452",
3
+ "version": "0.7.9-dev.ac392cb",
4
4
  "description": "Your agent writes bad React. This catches it",
5
5
  "keywords": [
6
6
  "accessibility",
@@ -66,7 +66,7 @@
66
66
  "vscode-uri": "^3.1.0",
67
67
  "yaml": "^2.9.0",
68
68
  "deslop-js": "0.7.9",
69
- "oxlint-plugin-react-doctor": "0.7.9-dev.a16e452"
69
+ "oxlint-plugin-react-doctor": "0.7.9-dev.ac392cb"
70
70
  },
71
71
  "devDependencies": {
72
72
  "@types/babel__code-frame": "^7.27.0",