@configjs/cli 1.1.16 → 1.1.17

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 (34) hide show
  1. package/dist/{angular-command-XN26G6L3.js → angular-command-WRBFDIV6.js} +8 -8
  2. package/dist/{angular-installer-FY43HE72.js → angular-installer-TKZDPFLD.js} +9 -1
  3. package/dist/angular-setup-QDTWXOB4.js +30 -0
  4. package/dist/check-5QZOSS2F.js +168 -0
  5. package/dist/{chunk-NYCK4R4K.js → chunk-56AR5ZW2.js} +361 -96
  6. package/dist/{chunk-TN27AX4L.js → chunk-5FBN3L7R.js} +797 -18
  7. package/dist/{chunk-FIB2J36N.js → chunk-5NXT5HCC.js} +142 -20
  8. package/dist/chunk-EDCNW4UO.js +92 -0
  9. package/dist/{chunk-UKEHW2LH.js → chunk-F3VNGA2S.js} +17 -3
  10. package/dist/{chunk-JYWGJJ4M.js → chunk-IY4KX4KL.js} +476 -28
  11. package/dist/chunk-V2IBYLVH.js +932 -0
  12. package/dist/chunk-VN4XTFDK.js +315 -0
  13. package/dist/cli.js +31 -21
  14. package/dist/{installed-D6CUYQM5.js → installed-DI77OQIT.js} +4 -4
  15. package/dist/{list-VZDUWV5O.js → list-HWRVKXWR.js} +4 -4
  16. package/dist/{nextjs-command-WKKOAY7I.js → nextjs-command-H5WRXK5R.js} +8 -9
  17. package/dist/{nextjs-installer-2ZC5IWJ6.js → nextjs-installer-UM3YQT5Z.js} +9 -2
  18. package/dist/{nextjs-setup-DYOFF72S.js → nextjs-setup-JIKPIJCX.js} +21 -9
  19. package/dist/{react-command-2T6IOTHB.js → react-command-XNOHP6WY.js} +8 -9
  20. package/dist/{remove-ZY3MLPGN.js → remove-AJK2IHVJ.js} +4 -4
  21. package/dist/{svelte-command-B2DNNQ5Z.js → svelte-command-Q7UBBWXP.js} +8 -8
  22. package/dist/svelte-installer-WLGID6Z2.js +105 -0
  23. package/dist/{svelte-setup-FWXLXJAC.js → svelte-setup-33E46IBT.js} +16 -5
  24. package/dist/{vite-installer-Y6VMFHIM.js → vite-installer-U7XUU3D7.js} +9 -2
  25. package/dist/{vite-setup-JRELX6K2.js → vite-setup-VO5BOI46.js} +16 -4
  26. package/dist/{vue-command-IOTC32AI.js → vue-command-FL6OQ6GV.js} +8 -9
  27. package/dist/{vue-installer-DGBBVF6F.js → vue-installer-BH2O2Y3M.js} +9 -2
  28. package/dist/{vue-setup-G44DLT2U.js → vue-setup-FK5QT7AY.js} +16 -4
  29. package/package.json +12 -4
  30. package/dist/angular-setup-Z6TCKNBG.js +0 -18
  31. package/dist/check-KNGZSCMM.js +0 -131
  32. package/dist/chunk-6GV4NKUX.js +0 -122
  33. package/dist/chunk-QPEUT7QG.js +0 -157
  34. package/dist/svelte-installer-EOSC3EP3.js +0 -65
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  pluginRegistry
3
- } from "./chunk-JYWGJJ4M.js";
3
+ } from "./chunk-IY4KX4KL.js";
4
4
  import {
5
5
  getModuleLogger
6
- } from "./chunk-QPEUT7QG.js";
6
+ } from "./chunk-VN4XTFDK.js";
7
7
 
8
8
  // src/core/compatibility-generator.ts
9
9
  var logger = getModuleLogger();
@@ -158,6 +158,300 @@ function generateRecommendsRules(plugins) {
158
158
  return rules;
159
159
  }
160
160
 
161
+ // src/core/indexing.ts
162
+ var ConflictIndex = class _ConflictIndex {
163
+ pluginToRules;
164
+ // private readonly categoryIndex: Map<string, string[]> // Reserved for future use
165
+ constructor(pluginToRules, _categoryIndex) {
166
+ this.pluginToRules = pluginToRules;
167
+ }
168
+ /**
169
+ * Build conflict index from rules
170
+ * Time complexity: O(rules × plugins per rule)
171
+ * Space complexity: O(rules × average plugins per rule)
172
+ *
173
+ * @param rules - All compatibility rules
174
+ * @returns ConflictIndex instance
175
+ */
176
+ static build(rules) {
177
+ const pluginToRules = /* @__PURE__ */ new Map();
178
+ const categoryIndex = /* @__PURE__ */ new Map();
179
+ for (const rule of rules) {
180
+ if (rule.type !== "CONFLICT" || !rule.plugins) {
181
+ continue;
182
+ }
183
+ for (const pluginName of rule.plugins) {
184
+ if (!pluginToRules.has(pluginName)) {
185
+ pluginToRules.set(pluginName, []);
186
+ }
187
+ const rules2 = pluginToRules.get(pluginName);
188
+ if (rules2) {
189
+ rules2.push(rule);
190
+ }
191
+ }
192
+ }
193
+ return new _ConflictIndex(pluginToRules, categoryIndex);
194
+ }
195
+ /**
196
+ * Get all conflicts for a set of plugins
197
+ * Time complexity: O(selectedPlugins) + O(rules found)
198
+ *
199
+ * @param pluginNames - Set of plugin names to check
200
+ * @param rules - Rules array for fallback filtering
201
+ * @returns Array of applicable conflict rules
202
+ */
203
+ getConflicts(pluginNames, rules) {
204
+ const conflicts = [];
205
+ const seen = /* @__PURE__ */ new Set();
206
+ for (const pluginName of pluginNames) {
207
+ const rulesForPlugin = this.pluginToRules.get(pluginName);
208
+ if (rulesForPlugin) {
209
+ for (const rule of rulesForPlugin) {
210
+ if (seen.has(rule)) {
211
+ continue;
212
+ }
213
+ seen.add(rule);
214
+ if (rule.plugins) {
215
+ const selectedCount = rule.plugins.filter(
216
+ (p) => pluginNames.has(p)
217
+ ).length;
218
+ if (selectedCount > 1) {
219
+ conflicts.push(rule);
220
+ }
221
+ }
222
+ }
223
+ }
224
+ }
225
+ for (const rule of rules) {
226
+ if (seen.has(rule) || rule.type !== "CONFLICT" || !rule.plugins) {
227
+ continue;
228
+ }
229
+ const selectedCount = rule.plugins.filter(
230
+ (p) => pluginNames.has(p)
231
+ ).length;
232
+ if (selectedCount > 1) {
233
+ conflicts.push(rule);
234
+ }
235
+ }
236
+ return conflicts;
237
+ }
238
+ };
239
+ var DependencyIndex = class _DependencyIndex {
240
+ pluginToDeps;
241
+ reverseDeps;
242
+ // dep → plugins that require it
243
+ constructor(pluginToDeps, reverseDeps) {
244
+ this.pluginToDeps = pluginToDeps;
245
+ this.reverseDeps = reverseDeps;
246
+ }
247
+ /**
248
+ * Build dependency index from rules
249
+ * Time complexity: O(rules × requires per rule)
250
+ * Space complexity: O(rules + total dependencies)
251
+ *
252
+ * @param rules - All compatibility rules
253
+ * @returns DependencyIndex instance
254
+ */
255
+ static build(rules) {
256
+ const pluginToDeps = /* @__PURE__ */ new Map();
257
+ const reverseDeps = /* @__PURE__ */ new Map();
258
+ for (const rule of rules) {
259
+ if (rule.type !== "REQUIRES" || !rule.plugin || !rule.requires) {
260
+ continue;
261
+ }
262
+ pluginToDeps.set(rule.plugin, rule);
263
+ for (const dep of rule.requires) {
264
+ const depName = dep.split("@")[0];
265
+ if (!depName) continue;
266
+ if (!reverseDeps.has(depName)) {
267
+ reverseDeps.set(depName, /* @__PURE__ */ new Set());
268
+ }
269
+ const revDeps = reverseDeps.get(depName);
270
+ if (revDeps) {
271
+ revDeps.add(rule.plugin);
272
+ }
273
+ }
274
+ }
275
+ return new _DependencyIndex(pluginToDeps, reverseDeps);
276
+ }
277
+ /**
278
+ * Get dependencies for a plugin
279
+ * Time complexity: O(1)
280
+ *
281
+ * @param pluginName - Plugin name
282
+ * @returns CompatibilityRule or undefined
283
+ */
284
+ getDependencies(pluginName) {
285
+ return this.pluginToDeps.get(pluginName);
286
+ }
287
+ /**
288
+ * Get all dependencies for a set of plugins
289
+ * Time complexity: O(selectedPlugins)
290
+ *
291
+ * @param pluginNames - Set of plugin names
292
+ * @returns Array of REQUIRES rules for selected plugins
293
+ */
294
+ getAllDependencies(pluginNames) {
295
+ const deps = [];
296
+ for (const pluginName of pluginNames) {
297
+ const rule = this.pluginToDeps.get(pluginName);
298
+ if (rule) {
299
+ deps.push(rule);
300
+ }
301
+ }
302
+ return deps;
303
+ }
304
+ /**
305
+ * Get which plugins require a specific dependency
306
+ * Time complexity: O(1)
307
+ *
308
+ * @param depName - Dependency name
309
+ * @returns Set of plugin names that require this dependency
310
+ */
311
+ getPluginsRequiring(depName) {
312
+ return this.reverseDeps.get(depName) ?? /* @__PURE__ */ new Set();
313
+ }
314
+ };
315
+ var RecommendationIndex = class _RecommendationIndex {
316
+ pluginToRecs;
317
+ constructor(pluginToRecs) {
318
+ this.pluginToRecs = pluginToRecs;
319
+ }
320
+ /**
321
+ * Build recommendation index from rules
322
+ * Time complexity: O(rules)
323
+ * Space complexity: O(rules)
324
+ *
325
+ * @param rules - All compatibility rules
326
+ * @returns RecommendationIndex instance
327
+ */
328
+ static build(rules) {
329
+ const pluginToRecs = /* @__PURE__ */ new Map();
330
+ for (const rule of rules) {
331
+ if (rule.type !== "RECOMMENDS" || !rule.plugin) {
332
+ continue;
333
+ }
334
+ pluginToRecs.set(rule.plugin, rule);
335
+ }
336
+ return new _RecommendationIndex(pluginToRecs);
337
+ }
338
+ /**
339
+ * Get recommendations for a plugin
340
+ * Time complexity: O(1)
341
+ *
342
+ * @param pluginName - Plugin name
343
+ * @returns CompatibilityRule or undefined
344
+ */
345
+ getRecommendations(pluginName) {
346
+ return this.pluginToRecs.get(pluginName);
347
+ }
348
+ /**
349
+ * Get all recommendations for a set of plugins
350
+ * Time complexity: O(selectedPlugins)
351
+ *
352
+ * @param pluginNames - Set of plugin names
353
+ * @returns Array of RECOMMENDS rules for selected plugins
354
+ */
355
+ getAllRecommendations(pluginNames) {
356
+ const recs = [];
357
+ for (const pluginName of pluginNames) {
358
+ const rule = this.pluginToRecs.get(pluginName);
359
+ if (rule) {
360
+ recs.push(rule);
361
+ }
362
+ }
363
+ return recs;
364
+ }
365
+ };
366
+ var ExclusivityIndex = class _ExclusivityIndex {
367
+ // private readonly exclusivityGroups: Map<string, CompatibilityRule> // Reserved for future use
368
+ pluginToRule;
369
+ constructor(_exclusivityGroups, pluginToRule) {
370
+ this.pluginToRule = pluginToRule;
371
+ }
372
+ /**
373
+ * Build exclusivity index from rules
374
+ * Time complexity: O(rules × plugins per rule)
375
+ * Space complexity: O(rules + total plugins in exclusive rules)
376
+ *
377
+ * @param rules - All compatibility rules
378
+ * @returns ExclusivityIndex instance
379
+ */
380
+ static build(rules) {
381
+ const exclusivityGroups = /* @__PURE__ */ new Map();
382
+ const pluginToRule = /* @__PURE__ */ new Map();
383
+ let groupId = 0;
384
+ for (const rule of rules) {
385
+ if (rule.type !== "EXCLUSIVE" || !rule.plugins) {
386
+ continue;
387
+ }
388
+ const key = `exclusive-group-${groupId++}`;
389
+ exclusivityGroups.set(key, rule);
390
+ for (const pluginName of rule.plugins) {
391
+ pluginToRule.set(pluginName, rule);
392
+ }
393
+ }
394
+ return new _ExclusivityIndex(exclusivityGroups, pluginToRule);
395
+ }
396
+ /**
397
+ * Get exclusivity violations for a set of plugins
398
+ * Time complexity: O(selectedPlugins)
399
+ *
400
+ * @param pluginNames - Set of plugin names to check
401
+ * @returns Array of EXCLUSIVE violations with error properties
402
+ */
403
+ getViolations(pluginNames) {
404
+ const violations = [];
405
+ const seenRules = /* @__PURE__ */ new Set();
406
+ for (const pluginName of pluginNames) {
407
+ const rule = this.pluginToRule.get(pluginName);
408
+ if (rule && rule.plugins && !seenRules.has(rule)) {
409
+ seenRules.add(rule);
410
+ const selectedCount = rule.plugins.filter(
411
+ (p) => pluginNames.has(p)
412
+ ).length;
413
+ if (selectedCount > 1) {
414
+ violations.push({
415
+ type: "EXCLUSIVE",
416
+ plugins: rule.plugins.filter((p) => pluginNames.has(p)),
417
+ message: rule.reason,
418
+ canOverride: rule.allowOverride ?? false
419
+ });
420
+ }
421
+ }
422
+ }
423
+ return violations;
424
+ }
425
+ };
426
+ var ValidationIndex = class _ValidationIndex {
427
+ conflicts;
428
+ dependencies;
429
+ recommendations;
430
+ exclusivity;
431
+ constructor(conflicts, dependencies, recommendations, exclusivity) {
432
+ this.conflicts = conflicts;
433
+ this.dependencies = dependencies;
434
+ this.recommendations = recommendations;
435
+ this.exclusivity = exclusivity;
436
+ }
437
+ /**
438
+ * Build complete validation index from rules
439
+ * Time complexity: O(rules × average items per rule)
440
+ * Space complexity: O(rules + total indexed items)
441
+ *
442
+ * @param rules - All compatibility rules
443
+ * @returns ValidationIndex instance ready for validation
444
+ */
445
+ static build(rules) {
446
+ return new _ValidationIndex(
447
+ ConflictIndex.build(rules),
448
+ DependencyIndex.build(rules),
449
+ RecommendationIndex.build(rules),
450
+ ExclusivityIndex.build(rules)
451
+ );
452
+ }
453
+ };
454
+
161
455
  // src/core/validator.ts
162
456
  var CompatibilityValidator = class {
163
457
  /**
@@ -165,11 +459,16 @@ var CompatibilityValidator = class {
165
459
  */
166
460
  constructor(rules) {
167
461
  this.rules = rules;
462
+ this.validationIndex = ValidationIndex.build(rules);
168
463
  }
169
464
  logger = getModuleLogger();
465
+ validationIndex;
170
466
  /**
171
467
  * Valide la compatibilité d'un ensemble de plugins
172
468
  *
469
+ * Time complexity: O(n) where n = number of plugins (previously O(n²))
470
+ * Space complexity: O(n) for index structures
471
+ *
173
472
  * @param plugins - Liste des plugins à valider
174
473
  * @param ctx - Contexte du projet (optionnel, pour règles spécifiques framework)
175
474
  * @returns Résultat de la validation avec erreurs, warnings et suggestions
@@ -188,27 +487,45 @@ var CompatibilityValidator = class {
188
487
  const applicableRules = ctx ? this.rules.filter(
189
488
  (rule) => !rule.framework || rule.framework === ctx.framework
190
489
  ) : this.rules.filter((rule) => !rule.framework);
191
- const allConflicts = this.checkConflicts(
192
- plugins,
490
+ const exclusivityViolations = this.checkExclusivity(
193
491
  pluginNames,
194
492
  applicableRules
195
493
  );
196
- const conflictErrors = [];
197
- const conflictWarnings = [];
198
- for (const conflict of allConflicts) {
494
+ const exclusivityErrors = [];
495
+ const exclusivityWarnings = [];
496
+ for (const violation of exclusivityViolations) {
497
+ if (!violation.plugins) continue;
498
+ const plugins2 = violation.plugins;
199
499
  const rule = applicableRules.find(
200
- (r) => r.type === "CONFLICT" && r.plugins?.every((p) => conflict.plugins?.includes(p))
500
+ (r) => r.type === "EXCLUSIVE" && plugins2.every((p) => r.plugins?.includes(p))
201
501
  );
202
- if (rule?.severity === "error") {
203
- conflictErrors.push(conflict);
502
+ if (rule?.severity === "warning") {
503
+ exclusivityWarnings.push(violation);
504
+ } else {
505
+ exclusivityErrors.push(violation);
506
+ }
507
+ }
508
+ const conflictResults = this.checkConflicts(pluginNames, applicableRules);
509
+ const conflictErrors = [];
510
+ const conflictWarnings = [];
511
+ for (const rule of conflictResults) {
512
+ const error = {
513
+ plugin: rule.plugin,
514
+ plugins: rule.plugins,
515
+ message: rule.reason,
516
+ type: rule.type
517
+ };
518
+ if (rule.severity === "error") {
519
+ conflictErrors.push(error);
204
520
  } else {
205
- conflictWarnings.push(conflict);
521
+ conflictWarnings.push(error);
206
522
  }
207
523
  }
208
- const frameworkConflicts = ctx ? this.checkFrameworkConflicts(plugins, pluginNames, ctx, applicableRules) : [];
524
+ const frameworkConflicts = ctx ? this.checkFrameworkConflicts(pluginNames, ctx, applicableRules) : [];
209
525
  const frameworkErrors = [];
210
526
  const frameworkWarnings = [];
211
527
  for (const conflict of frameworkConflicts) {
528
+ if (!conflict.plugins) continue;
212
529
  const rule = applicableRules.find(
213
530
  (r) => r.type === "CONFLICT" && r.framework === ctx?.framework && r.plugins?.some((p) => conflict.plugins?.includes(p))
214
531
  );
@@ -218,27 +535,19 @@ var CompatibilityValidator = class {
218
535
  frameworkWarnings.push(conflict);
219
536
  }
220
537
  }
221
- const exclusivityResults = this.checkExclusivity(
222
- plugins,
538
+ const dependencyErrors = this.checkDependencies(
539
+ pluginNames,
540
+ applicableRules,
541
+ ctx
542
+ );
543
+ const suggestionsList = this.checkRecommendations(
223
544
  pluginNames,
224
545
  applicableRules
225
546
  );
226
- const exclusivityErrors = [];
227
- const exclusivityWarnings = [];
228
- for (const result of exclusivityResults) {
229
- const rule = applicableRules.find(
230
- (r) => r.type === "EXCLUSIVE" && result.plugins?.every((p) => r.plugins?.includes(p))
231
- );
232
- if (rule?.severity === "warning") {
233
- exclusivityWarnings.push(result);
234
- } else {
235
- exclusivityErrors.push(result);
236
- }
237
- }
238
547
  const errors = [
239
548
  ...exclusivityErrors,
240
549
  ...conflictErrors,
241
- ...this.checkDependencies(plugins, pluginNames, applicableRules, ctx),
550
+ ...dependencyErrors,
242
551
  ...frameworkErrors
243
552
  ];
244
553
  const warnings = [
@@ -246,28 +555,23 @@ var CompatibilityValidator = class {
246
555
  ...conflictWarnings,
247
556
  ...frameworkWarnings
248
557
  ];
249
- const suggestions = this.checkRecommendations(
250
- plugins,
251
- pluginNames,
252
- applicableRules
253
- );
254
558
  const valid = errors.length === 0;
255
559
  this.logger.debug(`Validation result: ${valid ? "valid" : "invalid"}`, {
256
560
  errors: errors.length,
257
561
  warnings: warnings.length,
258
- suggestions: suggestions.length
562
+ suggestions: suggestionsList.length
259
563
  });
260
564
  return {
261
565
  valid,
262
566
  errors,
263
567
  warnings,
264
- suggestions
568
+ suggestions: suggestionsList
265
569
  };
266
570
  }
267
571
  /**
268
- * Vérifie les conflits avec le framework
572
+ * Vérifie les conflits avec le framework (optimized with indexing)
573
+ * Time complexity: O(selectedPlugins) instead of O(rules × plugins)
269
574
  *
270
- * @param _plugins - Liste des plugins (non utilisée, conservée pour cohérence)
271
575
  * @param pluginNames - Set des noms de plugins pour lookup rapide
272
576
  * @param ctx - Contexte du projet
273
577
  * @param rules - Règles applicables
@@ -275,7 +579,7 @@ var CompatibilityValidator = class {
275
579
  *
276
580
  * @internal
277
581
  */
278
- checkFrameworkConflicts(_plugins, pluginNames, ctx, rules) {
582
+ checkFrameworkConflicts(pluginNames, ctx, rules) {
279
583
  const conflicts = [];
280
584
  for (const rule of rules) {
281
585
  if (rule.type !== "CONFLICT" || !rule.framework || rule.framework !== ctx.framework) {
@@ -300,72 +604,37 @@ var CompatibilityValidator = class {
300
604
  return conflicts;
301
605
  }
302
606
  /**
303
- * Vérifie les règles d'exclusivité (EXCLUSIVE)
607
+ * Vérifie les règles d'exclusivité (EXCLUSIVE) - Optimized with indexing
608
+ * Time complexity: O(selectedPlugins) instead of O(rules × plugins)
304
609
  *
305
- * @param _plugins - Liste des plugins (non utilisée, conservée pour cohérence)
306
610
  * @param pluginNames - Set des noms de plugins pour lookup rapide
307
611
  * @param rules - Règles applicables
308
612
  * @returns Liste des erreurs d'exclusivité
309
613
  *
310
614
  * @internal
311
615
  */
312
- checkExclusivity(_plugins, pluginNames, rules = this.rules) {
313
- const errors = [];
314
- for (const rule of rules) {
315
- if (rule.type !== "EXCLUSIVE" || !rule.plugins) {
316
- continue;
317
- }
318
- const selectedExclusivePlugins = rule.plugins.filter(
319
- (pluginName) => pluginNames.has(pluginName)
320
- );
321
- if (selectedExclusivePlugins.length > 1) {
322
- errors.push({
323
- type: "EXCLUSIVE",
324
- plugins: selectedExclusivePlugins,
325
- message: rule.reason,
326
- canOverride: rule.allowOverride ?? false
327
- });
328
- }
329
- }
330
- return errors;
616
+ checkExclusivity(pluginNames, _rules = this.rules) {
617
+ return this.validationIndex.exclusivity.getViolations(
618
+ pluginNames
619
+ );
331
620
  }
332
621
  /**
333
- * Vérifie les conflits entre plugins (CONFLICT)
622
+ * Vérifie les conflits entre plugins (CONFLICT) - Optimized with indexing
623
+ * Time complexity: O(selectedPlugins) instead of O(rules × plugins)
334
624
  *
335
- * @param _plugins - Liste des plugins (non utilisée, conservée pour cohérence)
336
625
  * @param pluginNames - Set des noms de plugins pour lookup rapide
337
626
  * @param rules - Règles applicables
338
627
  * @returns Liste des warnings/erreurs de conflit
339
628
  *
340
629
  * @internal
341
630
  */
342
- checkConflicts(_plugins, pluginNames, rules = this.rules) {
343
- const conflicts = [];
344
- for (const rule of rules) {
345
- if (rule.framework) {
346
- continue;
347
- }
348
- if (rule.type !== "CONFLICT" || !rule.plugins) {
349
- continue;
350
- }
351
- const conflictingPlugins = rule.plugins.filter(
352
- (pluginName) => pluginNames.has(pluginName)
353
- );
354
- if (conflictingPlugins.length > 1) {
355
- conflicts.push({
356
- type: "CONFLICT",
357
- plugins: conflictingPlugins,
358
- message: rule.reason,
359
- canOverride: rule.allowOverride ?? true
360
- });
361
- }
362
- }
363
- return conflicts;
631
+ checkConflicts(pluginNames, _rules = this.rules) {
632
+ return this.validationIndex.conflicts.getConflicts(pluginNames, _rules);
364
633
  }
365
634
  /**
366
- * Vérifie les dépendances requises (REQUIRES)
635
+ * Vérifie les dépendances requises (REQUIRES) - Optimized with indexing
636
+ * Time complexity: O(selectedPlugins) instead of O(rules × plugins)
367
637
  *
368
- * @param _plugins - Liste des plugins (non utilisée, conservée pour cohérence)
369
638
  * @param pluginNames - Set des noms de plugins pour lookup rapide
370
639
  * @param rules - Règles applicables
371
640
  * @param ctx - Contexte du projet (optionnel)
@@ -373,15 +642,13 @@ var CompatibilityValidator = class {
373
642
  *
374
643
  * @internal
375
644
  */
376
- checkDependencies(_plugins, pluginNames, rules = this.rules, ctx) {
645
+ checkDependencies(pluginNames, _rules = this.rules, ctx) {
377
646
  const errors = [];
378
- for (const rule of rules) {
647
+ const dependencyRules = this.validationIndex.dependencies.getAllDependencies(pluginNames);
648
+ for (const rule of dependencyRules) {
379
649
  if (rule.type !== "REQUIRES" || !rule.plugin || !rule.requires) {
380
650
  continue;
381
651
  }
382
- if (!pluginNames.has(rule.plugin)) {
383
- continue;
384
- }
385
652
  const missingDependencies = [];
386
653
  for (const dep of rule.requires) {
387
654
  const pluginName = dep.split("@")[0];
@@ -412,24 +679,22 @@ var CompatibilityValidator = class {
412
679
  return errors;
413
680
  }
414
681
  /**
415
- * Vérifie les recommandations (RECOMMENDS)
682
+ * Vérifie les recommandations (RECOMMENDS) - Optimized with indexing
683
+ * Time complexity: O(selectedPlugins) instead of O(rules × plugins)
416
684
  *
417
- * @param _plugins - Liste des plugins (non utilisée, conservée pour cohérence)
418
685
  * @param pluginNames - Set des noms de plugins pour lookup rapide
419
686
  * @param rules - Règles applicables
420
687
  * @returns Liste des suggestions de plugins recommandés
421
688
  *
422
689
  * @internal
423
690
  */
424
- checkRecommendations(_plugins, pluginNames, rules = this.rules) {
691
+ checkRecommendations(pluginNames, _rules = this.rules) {
425
692
  const suggestions = [];
426
- for (const rule of rules) {
693
+ const recommendationRules = this.validationIndex.recommendations.getAllRecommendations(pluginNames);
694
+ for (const rule of recommendationRules) {
427
695
  if (rule.type !== "RECOMMENDS" || !rule.plugin || !rule.recommends) {
428
696
  continue;
429
697
  }
430
- if (!pluginNames.has(rule.plugin)) {
431
- continue;
432
- }
433
698
  const missingRecommendations = rule.recommends.filter(
434
699
  (rec) => !pluginNames.has(rec)
435
700
  );