@hyperfrontend/project-scope 0.1.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/CHANGELOG.md +15 -3
  2. package/README.md +2 -0
  3. package/analyze.d.ts.map +1 -1
  4. package/cli/commands/analyze.d.ts +8 -0
  5. package/cli/commands/analyze.d.ts.map +1 -1
  6. package/cli/commands/config.d.ts +7 -0
  7. package/cli/commands/config.d.ts.map +1 -1
  8. package/cli/commands/deps.d.ts +6 -0
  9. package/cli/commands/deps.d.ts.map +1 -1
  10. package/cli/commands/tree.d.ts +12 -0
  11. package/cli/commands/tree.d.ts.map +1 -1
  12. package/cli/index.cjs.js +73 -206
  13. package/cli/index.cjs.js.map +1 -1
  14. package/cli/index.esm.js +73 -206
  15. package/cli/index.esm.js.map +1 -1
  16. package/cli/run.d.ts.map +1 -1
  17. package/core/cache.d.ts +1 -0
  18. package/core/cache.d.ts.map +1 -1
  19. package/core/encoding/convert.d.ts.map +1 -1
  20. package/core/encoding/detect.d.ts +5 -0
  21. package/core/encoding/detect.d.ts.map +1 -1
  22. package/core/encoding/index.cjs.js +2 -23
  23. package/core/encoding/index.cjs.js.map +1 -1
  24. package/core/encoding/index.esm.js +2 -23
  25. package/core/encoding/index.esm.js.map +1 -1
  26. package/core/errors/structured-errors.d.ts +2 -0
  27. package/core/errors/structured-errors.d.ts.map +1 -1
  28. package/core/fs/directory.d.ts +3 -0
  29. package/core/fs/directory.d.ts.map +1 -1
  30. package/core/fs/index.cjs.js +0 -14
  31. package/core/fs/index.cjs.js.map +1 -1
  32. package/core/fs/index.esm.js +0 -14
  33. package/core/fs/index.esm.js.map +1 -1
  34. package/core/fs/read.d.ts +11 -3
  35. package/core/fs/read.d.ts.map +1 -1
  36. package/core/fs/traversal.d.ts.map +1 -1
  37. package/core/index.cjs.js +11 -63
  38. package/core/index.cjs.js.map +1 -1
  39. package/core/index.esm.js +11 -63
  40. package/core/index.esm.js.map +1 -1
  41. package/core/logger.d.ts.map +1 -1
  42. package/core/path/index.cjs.js +5 -2
  43. package/core/path/index.cjs.js.map +1 -1
  44. package/core/path/index.esm.js +5 -2
  45. package/core/path/index.esm.js.map +1 -1
  46. package/core/path/normalize.d.ts.map +1 -1
  47. package/core/patterns/glob.d.ts +0 -4
  48. package/core/patterns/glob.d.ts.map +1 -1
  49. package/core/platform/detect.d.ts.map +1 -1
  50. package/core/platform/index.cjs.js +0 -10
  51. package/core/platform/index.cjs.js.map +1 -1
  52. package/core/platform/index.esm.js +0 -10
  53. package/core/platform/index.esm.js.map +1 -1
  54. package/core/platform/line-endings.d.ts.map +1 -1
  55. package/heuristics/dependencies/analyze.d.ts.map +1 -1
  56. package/heuristics/dependencies/index.cjs.js +0 -17
  57. package/heuristics/dependencies/index.cjs.js.map +1 -1
  58. package/heuristics/dependencies/index.esm.js +0 -17
  59. package/heuristics/dependencies/index.esm.js.map +1 -1
  60. package/heuristics/entry-points/discover.d.ts +34 -7
  61. package/heuristics/entry-points/discover.d.ts.map +1 -1
  62. package/heuristics/entry-points/index.cjs.js +6 -34
  63. package/heuristics/entry-points/index.cjs.js.map +1 -1
  64. package/heuristics/entry-points/index.esm.js +6 -34
  65. package/heuristics/entry-points/index.esm.js.map +1 -1
  66. package/heuristics/framework/index.cjs.js +1 -63
  67. package/heuristics/framework/index.cjs.js.map +1 -1
  68. package/heuristics/framework/index.esm.js +1 -63
  69. package/heuristics/framework/index.esm.js.map +1 -1
  70. package/heuristics/index.cjs.js +7 -88
  71. package/heuristics/index.cjs.js.map +1 -1
  72. package/heuristics/index.esm.js +7 -88
  73. package/heuristics/index.esm.js.map +1 -1
  74. package/heuristics/project-type/index.cjs.js +1 -63
  75. package/heuristics/project-type/index.cjs.js.map +1 -1
  76. package/heuristics/project-type/index.esm.js +1 -63
  77. package/heuristics/project-type/index.esm.js.map +1 -1
  78. package/index.cjs.js +86 -294
  79. package/index.cjs.js.map +1 -1
  80. package/index.esm.js +86 -294
  81. package/index.esm.js.map +1 -1
  82. package/nx/detect.d.ts.map +1 -1
  83. package/nx/devkit-loader.d.ts.map +1 -1
  84. package/nx/index.cjs.js +0 -29
  85. package/nx/index.cjs.js.map +1 -1
  86. package/nx/index.esm.js +0 -29
  87. package/nx/index.esm.js.map +1 -1
  88. package/nx/project-config.d.ts +2 -0
  89. package/nx/project-config.d.ts.map +1 -1
  90. package/package.json +9 -9
  91. package/project/config/index.cjs.js +4 -46
  92. package/project/config/index.cjs.js.map +1 -1
  93. package/project/config/index.esm.js +4 -46
  94. package/project/config/index.esm.js.map +1 -1
  95. package/project/config/patterns.d.ts.map +1 -1
  96. package/project/index.cjs.js +4 -47
  97. package/project/index.cjs.js.map +1 -1
  98. package/project/index.esm.js +4 -47
  99. package/project/index.esm.js.map +1 -1
  100. package/project/package/index.cjs.js +0 -11
  101. package/project/package/index.cjs.js.map +1 -1
  102. package/project/package/index.esm.js +0 -11
  103. package/project/package/index.esm.js.map +1 -1
  104. package/project/package/read.d.ts +1 -0
  105. package/project/package/read.d.ts.map +1 -1
  106. package/project/root/index.cjs.js +0 -11
  107. package/project/root/index.cjs.js.map +1 -1
  108. package/project/root/index.esm.js +0 -11
  109. package/project/root/index.esm.js.map +1 -1
  110. package/project/traversal/index.cjs.js +4 -28
  111. package/project/traversal/index.cjs.js.map +1 -1
  112. package/project/traversal/index.esm.js +4 -28
  113. package/project/traversal/index.esm.js.map +1 -1
  114. package/tech/backend/express.d.ts.map +1 -1
  115. package/tech/backend/fastify.d.ts.map +1 -1
  116. package/tech/backend/index.cjs.js +0 -17
  117. package/tech/backend/index.cjs.js.map +1 -1
  118. package/tech/backend/index.esm.js +0 -17
  119. package/tech/backend/index.esm.js.map +1 -1
  120. package/tech/backend/koa.d.ts.map +1 -1
  121. package/tech/backend/nestjs.d.ts.map +1 -1
  122. package/tech/build/index.cjs.js +0 -12
  123. package/tech/build/index.cjs.js.map +1 -1
  124. package/tech/build/index.esm.js +0 -12
  125. package/tech/build/index.esm.js.map +1 -1
  126. package/tech/frontend/index.cjs.js +0 -16
  127. package/tech/frontend/index.cjs.js.map +1 -1
  128. package/tech/frontend/index.esm.js +0 -16
  129. package/tech/frontend/index.esm.js.map +1 -1
  130. package/tech/frontend/qwik.d.ts.map +1 -1
  131. package/tech/frontend/remix.d.ts.map +1 -1
  132. package/tech/frontend/sveltekit.d.ts.map +1 -1
  133. package/tech/index.cjs.js +1 -63
  134. package/tech/index.cjs.js.map +1 -1
  135. package/tech/index.d.ts.map +1 -1
  136. package/tech/index.esm.js +1 -63
  137. package/tech/index.esm.js.map +1 -1
  138. package/tech/legacy/angularjs.d.ts.map +1 -1
  139. package/tech/legacy/backbone.d.ts.map +1 -1
  140. package/tech/legacy/ember.d.ts.map +1 -1
  141. package/tech/legacy/index.cjs.js +0 -26
  142. package/tech/legacy/index.cjs.js.map +1 -1
  143. package/tech/legacy/index.esm.js +0 -26
  144. package/tech/legacy/index.esm.js.map +1 -1
  145. package/tech/legacy/jquery.d.ts.map +1 -1
  146. package/tech/linting/biome.d.ts.map +1 -1
  147. package/tech/linting/index.cjs.js +0 -14
  148. package/tech/linting/index.cjs.js.map +1 -1
  149. package/tech/linting/index.esm.js +0 -14
  150. package/tech/linting/index.esm.js.map +1 -1
  151. package/tech/linting/prettier.d.ts.map +1 -1
  152. package/tech/monorepo/index.cjs.js +1 -13
  153. package/tech/monorepo/index.cjs.js.map +1 -1
  154. package/tech/monorepo/index.esm.js +1 -13
  155. package/tech/monorepo/index.esm.js.map +1 -1
  156. package/tech/monorepo/types.d.ts +1 -1
  157. package/tech/monorepo/types.d.ts.map +1 -1
  158. package/tech/shared-utils/detector-helpers.d.ts.map +1 -1
  159. package/tech/testing/index.cjs.js +0 -12
  160. package/tech/testing/index.cjs.js.map +1 -1
  161. package/tech/testing/index.esm.js +0 -12
  162. package/tech/testing/index.esm.js.map +1 -1
  163. package/tech/types/detectors.d.ts.map +1 -1
  164. package/tech/types/index.cjs.js +0 -27
  165. package/tech/types/index.cjs.js.map +1 -1
  166. package/tech/types/index.esm.js +0 -27
  167. package/tech/types/index.esm.js.map +1 -1
  168. package/vfs/commit.d.ts.map +1 -1
  169. package/vfs/diff.d.ts.map +1 -1
  170. package/vfs/factory.d.ts.map +1 -1
  171. package/vfs/fs-tree.d.ts.map +1 -1
  172. package/vfs/index.cjs.js +5 -46
  173. package/vfs/index.cjs.js.map +1 -1
  174. package/vfs/index.esm.js +5 -46
  175. package/vfs/index.esm.js.map +1 -1
  176. package/vfs/types.d.ts +1 -0
  177. package/vfs/types.d.ts.map +1 -1
@@ -11,7 +11,6 @@ var node_fs = require('node:fs');
11
11
  *
12
12
  * @module @hyperfrontend/immutable-api-utils/built-in-copy/json
13
13
  */
14
- // Capture references at module initialization time
15
14
  const _JSON = globalThis.JSON;
16
15
  /**
17
16
  * (Safe copy) Converts a JavaScript Object Notation (JSON) string into an object.
@@ -30,7 +29,6 @@ const stringify = _JSON.stringify;
30
29
  *
31
30
  * @module @hyperfrontend/immutable-api-utils/built-in-copy/math
32
31
  */
33
- // Capture references at module initialization time
34
32
  const _Math = globalThis.Math;
35
33
  /**
36
34
  * (Safe copy) Returns the value of a number rounded to the nearest integer.
@@ -49,7 +47,6 @@ const min = _Math.min;
49
47
  *
50
48
  * @module @hyperfrontend/immutable-api-utils/built-in-copy/object
51
49
  */
52
- // Capture references at module initialization time
53
50
  const _Object = globalThis.Object;
54
51
  /**
55
52
  * (Safe copy) Prevents modification of existing property attributes and values,
@@ -84,7 +81,6 @@ const defineProperties = _Object.defineProperties;
84
81
  *
85
82
  * @module @hyperfrontend/immutable-api-utils/built-in-copy/error
86
83
  */
87
- // Capture references at module initialization time
88
84
  const _Error = globalThis.Error;
89
85
  const _Reflect$2 = globalThis.Reflect;
90
86
  /**
@@ -105,7 +101,6 @@ const createError = (message, options) => _Reflect$2.construct(_Error, [message,
105
101
  *
106
102
  * @module @hyperfrontend/immutable-api-utils/built-in-copy/array
107
103
  */
108
- // Capture references at module initialization time
109
104
  const _Array = globalThis.Array;
110
105
  /**
111
106
  * (Safe copy) Determines whether the passed value is an Array.
@@ -120,7 +115,6 @@ const isArray = _Array.isArray;
120
115
  *
121
116
  * @module @hyperfrontend/immutable-api-utils/built-in-copy/console
122
117
  */
123
- // Capture references at module initialization time
124
118
  const _console = globalThis.console;
125
119
  /**
126
120
  * (Safe copy) Outputs a message to the console.
@@ -206,7 +200,6 @@ _console.timeLog.bind(_console);
206
200
  *
207
201
  * @module @hyperfrontend/immutable-api-utils/built-in-copy/set
208
202
  */
209
- // Capture references at module initialization time
210
203
  const _Set = globalThis.Set;
211
204
  const _Reflect$1 = globalThis.Reflect;
212
205
  /**
@@ -254,7 +247,6 @@ const getType = (target) => {
254
247
  *
255
248
  * @module @hyperfrontend/immutable-api-utils/built-in-copy/map
256
249
  */
257
- // Capture references at module initialization time
258
250
  const _Map = globalThis.Map;
259
251
  const _Reflect = globalThis.Reflect;
260
252
  /**
@@ -532,14 +524,11 @@ function formatMessage(namespace, message, meta) {
532
524
  */
533
525
  function createScopedLogger(namespace, options = {}) {
534
526
  const { level = 'error', sanitizeSecrets = true } = options;
535
- // Create wrapper functions that add namespace prefix and sanitization
536
527
  const createLogFn = (baseFn) => (message, meta) => {
537
528
  const processedMeta = sanitizeSecrets && meta ? sanitize(meta) : meta;
538
529
  baseFn(formatMessage(namespace, message, processedMeta));
539
530
  };
540
- // Create base logger with wrapped functions
541
531
  const baseLogger = createLogger(createLogFn(error), createLogFn(warn), createLogFn(log), createLogFn(info), createLogFn(debug));
542
- // Set initial log level (use global override if set)
543
532
  baseLogger.setLogLevel(level);
544
533
  const scopedLogger = freeze({
545
534
  error: (message, meta) => baseLogger.error(message, meta),
@@ -550,7 +539,6 @@ function createScopedLogger(namespace, options = {}) {
550
539
  setLogLevel: baseLogger.setLogLevel,
551
540
  getLogLevel: baseLogger.getLogLevel,
552
541
  });
553
- // Register logger for global level management
554
542
  loggerRegistry.add(scopedLogger);
555
543
  return scopedLogger;
556
544
  }
@@ -842,7 +830,6 @@ const cacheRegistry = createSet();
842
830
  function createCache(options) {
843
831
  const { ttl, maxSize } = options ?? {};
844
832
  const store = createMap();
845
- // Track insertion order for FIFO eviction
846
833
  const insertionOrder = [];
847
834
  /**
848
835
  * Check if an entry is expired.
@@ -893,12 +880,10 @@ function createCache(options) {
893
880
  return entry.value;
894
881
  },
895
882
  set(key, value) {
896
- // If key exists, remove from order first
897
883
  if (store.has(key)) {
898
884
  removeFromOrder(key);
899
885
  }
900
886
  else {
901
- // Evict if needed before adding new entry
902
887
  evictIfNeeded();
903
888
  }
904
889
  // eslint-disable-next-line workspace/no-unsafe-builtin-methods -- Date.now() is needed for Jest fake timers compatibility
@@ -931,7 +916,6 @@ function createCache(options) {
931
916
  return [...insertionOrder];
932
917
  },
933
918
  };
934
- // Register cache for global operations
935
919
  cacheRegistry.add(cache);
936
920
  return freeze(cache);
937
921
  }
@@ -962,7 +946,6 @@ function collectAllDependencies(packageJson) {
962
946
  function parseVersionString(versionString) {
963
947
  if (versionString === undefined || versionString === null)
964
948
  return undefined;
965
- // Manual parsing instead of regex to avoid ReDoS
966
949
  let start = 0;
967
950
  while (start < versionString.length) {
968
951
  const char = versionString[start];
@@ -1023,7 +1006,6 @@ function expressDetector(projectPath, packageJson) {
1023
1006
  version = parseVersionString(deps['express']);
1024
1007
  sources.push({ type: 'package.json', field: 'dependencies.express' });
1025
1008
  }
1026
- // @types/express (indicates usage)
1027
1009
  if (deps['@types/express']) {
1028
1010
  confidence += 10;
1029
1011
  sources.push({ type: 'package.json', field: 'dependencies.@types/express' });
@@ -1059,13 +1041,11 @@ function nestDetector(projectPath, packageJson) {
1059
1041
  let version;
1060
1042
  let configPath;
1061
1043
  const deps = collectAllDependencies(pkg);
1062
- // @nestjs/core package
1063
1044
  if (deps['@nestjs/core']) {
1064
1045
  confidence += 70;
1065
1046
  version = parseVersionString(deps['@nestjs/core']);
1066
1047
  sources.push({ type: 'package.json', field: 'dependencies.@nestjs/core' });
1067
1048
  }
1068
- // @nestjs/common
1069
1049
  if (deps['@nestjs/common']) {
1070
1050
  confidence += 15;
1071
1051
  sources.push({ type: 'package.json', field: 'dependencies.@nestjs/common' });
@@ -1116,7 +1096,6 @@ function fastifyDetector(projectPath, packageJson) {
1116
1096
  confidence += 15;
1117
1097
  sources.push({ type: 'package.json', field: 'dependencies (fastify plugins)' });
1118
1098
  }
1119
- // @types/fastify (older versions)
1120
1099
  if (deps['@types/fastify']) {
1121
1100
  confidence += 5;
1122
1101
  sources.push({ type: 'package.json', field: 'dependencies.@types/fastify' });
@@ -1151,7 +1130,6 @@ function koaDetector(projectPath, packageJson) {
1151
1130
  version = parseVersionString(deps['koa']);
1152
1131
  sources.push({ type: 'package.json', field: 'dependencies.koa' });
1153
1132
  }
1154
- // @types/koa
1155
1133
  if (deps['@types/koa']) {
1156
1134
  confidence += 10;
1157
1135
  sources.push({ type: 'package.json', field: 'dependencies.@types/koa' });
@@ -1694,7 +1672,6 @@ function remixDetector(projectPath, packageJson) {
1694
1672
  let confidence = 0;
1695
1673
  let version;
1696
1674
  const deps = collectAllDependencies(pkg);
1697
- // @remix-run packages
1698
1675
  if (deps['@remix-run/react']) {
1699
1676
  confidence += 70;
1700
1677
  version = parseVersionString(deps['@remix-run/react']);
@@ -1970,7 +1947,6 @@ function sveltekitDetector(projectPath, packageJson) {
1970
1947
  let confidence = 0;
1971
1948
  let version;
1972
1949
  const deps = collectAllDependencies(pkg);
1973
- // @sveltejs/kit package
1974
1950
  if (deps['@sveltejs/kit']) {
1975
1951
  confidence += 70;
1976
1952
  version = parseVersionString(deps['@sveltejs/kit']);
@@ -2049,13 +2025,11 @@ function qwikDetector(projectPath, packageJson) {
2049
2025
  let confidence = 0;
2050
2026
  let version;
2051
2027
  const deps = collectAllDependencies(pkg);
2052
- // @builder.io/qwik package
2053
2028
  if (deps['@builder.io/qwik']) {
2054
2029
  confidence += 70;
2055
2030
  version = parseVersionString(deps['@builder.io/qwik']);
2056
2031
  sources.push({ type: 'package.json', field: 'dependencies.@builder.io/qwik' });
2057
2032
  }
2058
- // @builder.io/qwik-city
2059
2033
  if (deps['@builder.io/qwik-city']) {
2060
2034
  confidence += 20;
2061
2035
  sources.push({ type: 'package.json', field: 'dependencies.@builder.io/qwik-city' });
@@ -2148,23 +2122,19 @@ function angularJSDetector(projectPath, packageJson) {
2148
2122
  let confidence = 0;
2149
2123
  let version;
2150
2124
  const deps = collectAllDependencies(pkg);
2151
- // AngularJS package (angular, not @angular/core)
2152
2125
  if (deps['angular']) {
2153
2126
  confidence += 70;
2154
2127
  version = parseVersionString(deps['angular']);
2155
2128
  sources.push({ type: 'package.json', field: 'dependencies.angular' });
2156
2129
  }
2157
- // AngularJS router
2158
2130
  if (deps['angular-route']) {
2159
2131
  confidence += 15;
2160
2132
  sources.push({ type: 'package.json', field: 'dependencies.angular-route' });
2161
2133
  }
2162
- // AngularJS resource
2163
2134
  if (deps['angular-resource']) {
2164
2135
  confidence += 10;
2165
2136
  sources.push({ type: 'package.json', field: 'dependencies.angular-resource' });
2166
2137
  }
2167
- // AngularJS animate
2168
2138
  if (deps['angular-animate']) {
2169
2139
  confidence += 5;
2170
2140
  sources.push({ type: 'package.json', field: 'dependencies.angular-animate' });
@@ -2195,23 +2165,19 @@ function backboneDetector(projectPath, packageJson) {
2195
2165
  let confidence = 0;
2196
2166
  let version;
2197
2167
  const deps = collectAllDependencies(pkg);
2198
- // Backbone package
2199
2168
  if (deps['backbone']) {
2200
2169
  confidence += 70;
2201
2170
  version = parseVersionString(deps['backbone']);
2202
2171
  sources.push({ type: 'package.json', field: 'dependencies.backbone' });
2203
- // Underscore (commonly used with Backbone)
2204
2172
  if (deps['underscore']) {
2205
2173
  confidence += 15;
2206
2174
  sources.push({ type: 'package.json', field: 'dependencies.underscore' });
2207
2175
  }
2208
- // Lodash can be used as underscore replacement
2209
2176
  if (deps['lodash']) {
2210
2177
  confidence += 5;
2211
2178
  sources.push({ type: 'package.json', field: 'dependencies.lodash' });
2212
2179
  }
2213
2180
  }
2214
- // Marionette (Backbone framework)
2215
2181
  if (deps['backbone.marionette'] || deps['marionette']) {
2216
2182
  confidence += 10;
2217
2183
  sources.push({ type: 'package.json', field: 'dependencies.backbone.marionette' });
@@ -2242,18 +2208,15 @@ function emberDetector(projectPath, packageJson) {
2242
2208
  let confidence = 0;
2243
2209
  let version;
2244
2210
  const deps = collectAllDependencies(pkg);
2245
- // Ember source package
2246
2211
  if (deps['ember-source']) {
2247
2212
  confidence += 70;
2248
2213
  version = parseVersionString(deps['ember-source']);
2249
2214
  sources.push({ type: 'package.json', field: 'dependencies.ember-source' });
2250
2215
  }
2251
- // Ember CLI
2252
2216
  if (deps['ember-cli']) {
2253
2217
  confidence += 20;
2254
2218
  sources.push({ type: 'package.json', field: 'devDependencies.ember-cli' });
2255
2219
  }
2256
- // Ember Data
2257
2220
  if (deps['ember-data']) {
2258
2221
  confidence += 10;
2259
2222
  sources.push({ type: 'package.json', field: 'dependencies.ember-data' });
@@ -2284,18 +2247,15 @@ function jqueryDetector(projectPath, packageJson) {
2284
2247
  let confidence = 0;
2285
2248
  let version;
2286
2249
  const deps = collectAllDependencies(pkg);
2287
- // jQuery package
2288
2250
  if (deps['jquery']) {
2289
2251
  confidence += 80;
2290
2252
  version = parseVersionString(deps['jquery']);
2291
2253
  sources.push({ type: 'package.json', field: 'dependencies.jquery' });
2292
2254
  }
2293
- // jQuery UI
2294
2255
  if (deps['jquery-ui']) {
2295
2256
  confidence += 10;
2296
2257
  sources.push({ type: 'package.json', field: 'dependencies.jquery-ui' });
2297
2258
  }
2298
- // jQuery plugins
2299
2259
  if (deps['jquery-validation']) {
2300
2260
  confidence += 5;
2301
2261
  sources.push({ type: 'package.json', field: 'dependencies.jquery-validation' });
@@ -2424,7 +2384,6 @@ function prettierDetector(projectPath, packageJson) {
2424
2384
  confidence += 30;
2425
2385
  sources.push({ type: 'package.json', field: 'prettier' });
2426
2386
  }
2427
- // .prettierignore file
2428
2387
  if (exists(node_path.join(projectPath, '.prettierignore'))) {
2429
2388
  confidence += 10;
2430
2389
  sources.push({ type: 'config-file', path: '.prettierignore' });
@@ -2519,7 +2478,6 @@ function biomeDetector(projectPath, packageJson) {
2519
2478
  let configPath;
2520
2479
  let version;
2521
2480
  const deps = collectAllDependencies(pkg);
2522
- // @biomejs/biome package
2523
2481
  if (deps['@biomejs/biome']) {
2524
2482
  confidence += 70;
2525
2483
  version = parseVersionString(deps['@biomejs/biome']);
@@ -2788,7 +2746,7 @@ function npmWorkspacesDetector(workspacePath, packageJson) {
2788
2746
  sources.push({ type: 'lockfile', path: 'package-lock.json' });
2789
2747
  }
2790
2748
  if (exists(node_path.join(workspacePath, 'yarn.lock'))) {
2791
- return null; // Let yarn workspace detector handle this
2749
+ return null;
2792
2750
  }
2793
2751
  if (confidence === 0) {
2794
2752
  return null;
@@ -3131,7 +3089,6 @@ function checkTsConfigStrict(projectPath) {
3131
3089
  if (!content)
3132
3090
  return undefined;
3133
3091
  try {
3134
- // Simple JSON parsing - doesn't handle comments but good enough for strict check
3135
3092
  const cleanContent = content.replace(/\/\*[\s\S]*?\*\/|\/\/.*/g, '');
3136
3093
  const parsed = parse(cleanContent);
3137
3094
  return parsed?.compilerOptions?.strict === true;
@@ -3154,19 +3111,16 @@ function typescriptDetector(projectPath, packageJson) {
3154
3111
  let configPath;
3155
3112
  let version;
3156
3113
  const deps = collectAllDependencies(pkg);
3157
- // TypeScript package
3158
3114
  if (deps['typescript']) {
3159
3115
  confidence += 50;
3160
3116
  version = parseVersionString(deps['typescript']);
3161
3117
  sources.push({ type: 'package.json', field: 'dependencies.typescript' });
3162
3118
  }
3163
- // tsconfig.json
3164
3119
  if (exists(node_path.join(projectPath, 'tsconfig.json'))) {
3165
3120
  confidence += 40;
3166
3121
  configPath = 'tsconfig.json';
3167
3122
  sources.push({ type: 'config-file', path: 'tsconfig.json' });
3168
3123
  }
3169
- // tsconfig.*.json variants
3170
3124
  const tsconfigVariants = ['tsconfig.build.json', 'tsconfig.lib.json', 'tsconfig.spec.json', 'tsconfig.app.json'];
3171
3125
  for (const variant of tsconfigVariants) {
3172
3126
  if (exists(node_path.join(projectPath, variant))) {
@@ -3175,7 +3129,6 @@ function typescriptDetector(projectPath, packageJson) {
3175
3129
  break;
3176
3130
  }
3177
3131
  }
3178
- // @types packages
3179
3132
  const typePackages = keys(deps).filter((d) => d.startsWith('@types/'));
3180
3133
  if (typePackages.length > 0) {
3181
3134
  confidence += 10;
@@ -3209,24 +3162,20 @@ function flowDetector(projectPath, packageJson) {
3209
3162
  let configPath;
3210
3163
  let version;
3211
3164
  const deps = collectAllDependencies(pkg);
3212
- // flow-bin package
3213
3165
  if (deps['flow-bin']) {
3214
3166
  confidence += 60;
3215
3167
  version = parseVersionString(deps['flow-bin']);
3216
3168
  sources.push({ type: 'package.json', field: 'dependencies.flow-bin' });
3217
3169
  }
3218
- // .flowconfig
3219
3170
  if (exists(node_path.join(projectPath, '.flowconfig'))) {
3220
3171
  confidence += 40;
3221
3172
  configPath = '.flowconfig';
3222
3173
  sources.push({ type: 'config-file', path: '.flowconfig' });
3223
3174
  }
3224
- // flow-typed directory
3225
3175
  if (exists(node_path.join(projectPath, 'flow-typed'))) {
3226
3176
  confidence += 10;
3227
3177
  sources.push({ type: 'directory', path: 'flow-typed/' });
3228
3178
  }
3229
- // @babel/preset-flow
3230
3179
  if (deps['@babel/preset-flow']) {
3231
3180
  confidence += 10;
3232
3181
  sources.push({ type: 'package.json', field: 'dependencies.@babel/preset-flow' });
@@ -3250,7 +3199,6 @@ function flowDetector(projectPath, packageJson) {
3250
3199
  * @returns `true` if the content contains JSDoc type annotations.
3251
3200
  */
3252
3201
  function hasJsDocTypes(content) {
3253
- // Check for JSDoc type annotations
3254
3202
  return (content.includes('@type {') ||
3255
3203
  content.includes('@param {') ||
3256
3204
  content.includes('@returns {') ||
@@ -3269,14 +3217,11 @@ function jsdocDetector(projectPath, packageJson) {
3269
3217
  const sources = [];
3270
3218
  let confidence = 0;
3271
3219
  const deps = collectAllDependencies(pkg);
3272
- // jsdoc package
3273
3220
  if (deps['jsdoc']) {
3274
3221
  confidence += 30;
3275
3222
  sources.push({ type: 'package.json', field: 'dependencies.jsdoc' });
3276
3223
  }
3277
- // typescript with checkJs (JSDoc type checking)
3278
3224
  if (deps['typescript']) {
3279
- // Check if checkJs is enabled in tsconfig
3280
3225
  const tsconfigPath = node_path.join(projectPath, 'tsconfig.json');
3281
3226
  const content = readFileIfExists(tsconfigPath);
3282
3227
  if (content) {
@@ -3293,12 +3238,10 @@ function jsdocDetector(projectPath, packageJson) {
3293
3238
  }
3294
3239
  }
3295
3240
  }
3296
- // Check for jsconfig.json (VS Code JS type checking)
3297
3241
  if (exists(node_path.join(projectPath, 'jsconfig.json'))) {
3298
3242
  confidence += 40;
3299
3243
  sources.push({ type: 'config-file', path: 'jsconfig.json' });
3300
3244
  }
3301
- // Sample check for JSDoc annotations in source files
3302
3245
  const srcDir = node_path.join(projectPath, 'src');
3303
3246
  if (exists(srcDir)) {
3304
3247
  try {
@@ -3349,8 +3292,6 @@ const detectAllCache = createCache({ ttl: 60000, maxSize: 50 });
3349
3292
  function isDetectAllOptions(value) {
3350
3293
  if (typeof value !== 'object' || value === null)
3351
3294
  return false;
3352
- // DetectAllOptions has skipCache or packageJson fields specifically
3353
- // PackageJson never has skipCache field
3354
3295
  return 'skipCache' in value || 'packageJson' in value;
3355
3296
  }
3356
3297
  /**
@@ -3382,9 +3323,7 @@ function isDetectAllOptions(value) {
3382
3323
  * ```
3383
3324
  */
3384
3325
  function detectAll(projectPath, packageJsonOrOptions) {
3385
- // Handle backward-compatible arguments
3386
3326
  const options = isDetectAllOptions(packageJsonOrOptions) ? packageJsonOrOptions : { packageJson: packageJsonOrOptions };
3387
- // Check cache first (unless skipCache is true)
3388
3327
  if (!options.skipCache) {
3389
3328
  const cached = detectAllCache.get(projectPath);
3390
3329
  if (cached) {
@@ -3435,7 +3374,6 @@ function detectAll(projectPath, packageJsonOrOptions) {
3435
3374
  legacyFrameworks: result.legacyFrameworks.map((f) => f.id),
3436
3375
  testingFrameworks: result.testingFrameworks.map((f) => f.id),
3437
3376
  });
3438
- // Cache the result
3439
3377
  detectAllCache.set(projectPath, result);
3440
3378
  return result;
3441
3379
  }