@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.
- package/dist/{angular-command-XN26G6L3.js → angular-command-WRBFDIV6.js} +8 -8
- package/dist/{angular-installer-FY43HE72.js → angular-installer-TKZDPFLD.js} +9 -1
- package/dist/angular-setup-QDTWXOB4.js +30 -0
- package/dist/check-5QZOSS2F.js +168 -0
- package/dist/{chunk-NYCK4R4K.js → chunk-56AR5ZW2.js} +361 -96
- package/dist/{chunk-TN27AX4L.js → chunk-5FBN3L7R.js} +797 -18
- package/dist/{chunk-FIB2J36N.js → chunk-5NXT5HCC.js} +142 -20
- package/dist/chunk-EDCNW4UO.js +92 -0
- package/dist/{chunk-UKEHW2LH.js → chunk-F3VNGA2S.js} +17 -3
- package/dist/{chunk-JYWGJJ4M.js → chunk-IY4KX4KL.js} +476 -28
- package/dist/chunk-V2IBYLVH.js +932 -0
- package/dist/chunk-VN4XTFDK.js +315 -0
- package/dist/cli.js +31 -21
- package/dist/{installed-D6CUYQM5.js → installed-DI77OQIT.js} +4 -4
- package/dist/{list-VZDUWV5O.js → list-HWRVKXWR.js} +4 -4
- package/dist/{nextjs-command-WKKOAY7I.js → nextjs-command-H5WRXK5R.js} +8 -9
- package/dist/{nextjs-installer-2ZC5IWJ6.js → nextjs-installer-UM3YQT5Z.js} +9 -2
- package/dist/{nextjs-setup-DYOFF72S.js → nextjs-setup-JIKPIJCX.js} +21 -9
- package/dist/{react-command-2T6IOTHB.js → react-command-XNOHP6WY.js} +8 -9
- package/dist/{remove-ZY3MLPGN.js → remove-AJK2IHVJ.js} +4 -4
- package/dist/{svelte-command-B2DNNQ5Z.js → svelte-command-Q7UBBWXP.js} +8 -8
- package/dist/svelte-installer-WLGID6Z2.js +105 -0
- package/dist/{svelte-setup-FWXLXJAC.js → svelte-setup-33E46IBT.js} +16 -5
- package/dist/{vite-installer-Y6VMFHIM.js → vite-installer-U7XUU3D7.js} +9 -2
- package/dist/{vite-setup-JRELX6K2.js → vite-setup-VO5BOI46.js} +16 -4
- package/dist/{vue-command-IOTC32AI.js → vue-command-FL6OQ6GV.js} +8 -9
- package/dist/{vue-installer-DGBBVF6F.js → vue-installer-BH2O2Y3M.js} +9 -2
- package/dist/{vue-setup-G44DLT2U.js → vue-setup-FK5QT7AY.js} +16 -4
- package/package.json +12 -4
- package/dist/angular-setup-Z6TCKNBG.js +0 -18
- package/dist/check-KNGZSCMM.js +0 -131
- package/dist/chunk-6GV4NKUX.js +0 -122
- package/dist/chunk-QPEUT7QG.js +0 -157
- package/dist/svelte-installer-EOSC3EP3.js +0 -65
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
pluginRegistry
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-IY4KX4KL.js";
|
|
4
4
|
import {
|
|
5
5
|
getModuleLogger
|
|
6
|
-
} from "./chunk-
|
|
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
|
|
192
|
-
plugins,
|
|
490
|
+
const exclusivityViolations = this.checkExclusivity(
|
|
193
491
|
pluginNames,
|
|
194
492
|
applicableRules
|
|
195
493
|
);
|
|
196
|
-
const
|
|
197
|
-
const
|
|
198
|
-
for (const
|
|
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 === "
|
|
500
|
+
(r) => r.type === "EXCLUSIVE" && plugins2.every((p) => r.plugins?.includes(p))
|
|
201
501
|
);
|
|
202
|
-
if (rule?.severity === "
|
|
203
|
-
|
|
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(
|
|
521
|
+
conflictWarnings.push(error);
|
|
206
522
|
}
|
|
207
523
|
}
|
|
208
|
-
const frameworkConflicts = ctx ? this.checkFrameworkConflicts(
|
|
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
|
|
222
|
-
|
|
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
|
-
...
|
|
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:
|
|
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(
|
|
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(
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
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(
|
|
343
|
-
|
|
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(
|
|
645
|
+
checkDependencies(pluginNames, _rules = this.rules, ctx) {
|
|
377
646
|
const errors = [];
|
|
378
|
-
|
|
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(
|
|
691
|
+
checkRecommendations(pluginNames, _rules = this.rules) {
|
|
425
692
|
const suggestions = [];
|
|
426
|
-
|
|
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
|
);
|