@code-pushup/cli 0.57.0 → 0.58.0
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/package.json +4 -4
- package/src/lib/implementation/filter.middleware.d.ts +3 -0
- package/src/lib/implementation/filter.middleware.js +48 -28
- package/src/lib/implementation/filter.middleware.js.map +1 -1
- package/src/lib/implementation/filter.middleware.utils.d.ts +11 -0
- package/src/lib/implementation/filter.middleware.utils.js +41 -0
- package/src/lib/implementation/filter.middleware.utils.js.map +1 -0
- package/src/lib/implementation/validate-filter-options.utils.d.ts +6 -3
- package/src/lib/implementation/validate-filter-options.utils.js +51 -18
- package/src/lib/implementation/validate-filter-options.utils.js.map +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@code-pushup/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.58.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "A CLI to run all kinds of code quality measurements to align your team with company goals",
|
|
6
6
|
"homepage": "https://code-pushup.dev",
|
|
@@ -42,9 +42,9 @@
|
|
|
42
42
|
"code-pushup": "./src/index.js"
|
|
43
43
|
},
|
|
44
44
|
"dependencies": {
|
|
45
|
-
"@code-pushup/models": "0.
|
|
46
|
-
"@code-pushup/core": "0.
|
|
47
|
-
"@code-pushup/utils": "0.
|
|
45
|
+
"@code-pushup/models": "0.58.0",
|
|
46
|
+
"@code-pushup/core": "0.58.0",
|
|
47
|
+
"@code-pushup/utils": "0.58.0",
|
|
48
48
|
"yargs": "^17.7.2",
|
|
49
49
|
"ansis": "^3.3.0",
|
|
50
50
|
"simple-git": "^3.20.0"
|
|
@@ -1,2 +1,5 @@
|
|
|
1
|
+
import type { CoreConfig, PluginConfig } from '@code-pushup/models';
|
|
1
2
|
import type { FilterOptions } from './filter.model.js';
|
|
2
3
|
export declare function filterMiddleware<T extends FilterOptions>(originalProcessArgs: T): T;
|
|
4
|
+
export declare function filterSkippedInPlugins(plugins: PluginConfig[]): PluginConfig[];
|
|
5
|
+
export declare function filterSkippedCategories(categories: CoreConfig['categories'], plugins: CoreConfig['plugins']): CoreConfig['categories'];
|
|
@@ -1,45 +1,52 @@
|
|
|
1
1
|
import { filterItemRefsBy } from '@code-pushup/utils';
|
|
2
|
-
import {
|
|
2
|
+
import { applyFilters, extractSkippedItems, filterPluginsFromCategories, filterSkippedItems, isValidCategoryRef, } from './filter.middleware.utils.js';
|
|
3
|
+
import { handleConflictingOptions, validateFilterOption, validateFinalState, validateSkippedCategories, } from './validate-filter-options.utils.js';
|
|
4
|
+
// eslint-disable-next-line max-lines-per-function
|
|
3
5
|
export function filterMiddleware(originalProcessArgs) {
|
|
4
|
-
const {
|
|
6
|
+
const { categories: rcCategories, plugins: rcPlugins, skipCategories = [], onlyCategories = [], skipPlugins = [], onlyPlugins = [], verbose = false, } = originalProcessArgs;
|
|
7
|
+
const plugins = filterSkippedInPlugins(rcPlugins);
|
|
8
|
+
const categories = filterSkippedCategories(rcCategories, plugins);
|
|
5
9
|
if (skipCategories.length === 0 &&
|
|
6
10
|
onlyCategories.length === 0 &&
|
|
7
11
|
skipPlugins.length === 0 &&
|
|
8
12
|
onlyPlugins.length === 0) {
|
|
9
|
-
|
|
13
|
+
if (rcCategories && categories) {
|
|
14
|
+
validateSkippedCategories(rcCategories, categories, verbose);
|
|
15
|
+
}
|
|
16
|
+
return {
|
|
17
|
+
...originalProcessArgs,
|
|
18
|
+
...(categories && { categories }),
|
|
19
|
+
plugins,
|
|
20
|
+
};
|
|
10
21
|
}
|
|
11
22
|
handleConflictingOptions('categories', onlyCategories, skipCategories);
|
|
12
23
|
handleConflictingOptions('plugins', onlyPlugins, skipPlugins);
|
|
13
|
-
const
|
|
14
|
-
const
|
|
24
|
+
const skippedPlugins = extractSkippedItems(rcPlugins, plugins);
|
|
25
|
+
const skippedCategories = extractSkippedItems(rcCategories, categories);
|
|
26
|
+
const filteredCategories = applyCategoryFilters({ categories, plugins }, skippedCategories, { skipCategories, onlyCategories, verbose });
|
|
27
|
+
const filteredPlugins = applyPluginFilters({ categories: filteredCategories, plugins }, skippedPlugins, { skipPlugins, onlyPlugins, verbose });
|
|
15
28
|
const finalCategories = filteredCategories
|
|
16
29
|
? filterItemRefsBy(filteredCategories, ref => filteredPlugins.some(plugin => plugin.slug === ref.plugin))
|
|
17
30
|
: filteredCategories;
|
|
18
|
-
validateFinalState({ categories: finalCategories, plugins: filteredPlugins }, { categories, plugins });
|
|
31
|
+
validateFinalState({ categories: finalCategories, plugins: filteredPlugins }, { categories: rcCategories, plugins: rcPlugins });
|
|
19
32
|
return {
|
|
20
33
|
...originalProcessArgs,
|
|
21
34
|
plugins: filteredPlugins,
|
|
22
35
|
categories: finalCategories,
|
|
23
36
|
};
|
|
24
37
|
}
|
|
25
|
-
function
|
|
26
|
-
|
|
27
|
-
const itemKey = item[key];
|
|
28
|
-
return (!skipItems.includes(itemKey) &&
|
|
29
|
-
(onlyItems.length === 0 || onlyItems.includes(itemKey)));
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
function applyCategoryFilters({ categories, plugins }, skipCategories, onlyCategories, verbose) {
|
|
38
|
+
function applyCategoryFilters({ categories, plugins }, skippedCategories, options) {
|
|
39
|
+
const { skipCategories = [], onlyCategories = [], verbose = false } = options;
|
|
33
40
|
if ((skipCategories.length === 0 && onlyCategories.length === 0) ||
|
|
34
|
-
!categories ||
|
|
35
|
-
categories.length === 0) {
|
|
41
|
+
((!categories || categories.length === 0) && skippedCategories.length === 0)) {
|
|
36
42
|
return categories;
|
|
37
43
|
}
|
|
38
|
-
validateFilterOption('skipCategories', { plugins, categories }, { itemsToFilter: skipCategories, verbose });
|
|
39
|
-
validateFilterOption('onlyCategories', { plugins, categories }, { itemsToFilter: onlyCategories, verbose });
|
|
40
|
-
return applyFilters(categories, skipCategories, onlyCategories, 'slug');
|
|
44
|
+
validateFilterOption('skipCategories', { plugins, categories }, { itemsToFilter: skipCategories, skippedItems: skippedCategories, verbose });
|
|
45
|
+
validateFilterOption('onlyCategories', { plugins, categories }, { itemsToFilter: onlyCategories, skippedItems: skippedCategories, verbose });
|
|
46
|
+
return applyFilters(categories ?? [], skipCategories, onlyCategories, 'slug');
|
|
41
47
|
}
|
|
42
|
-
function applyPluginFilters({ categories, plugins },
|
|
48
|
+
function applyPluginFilters({ categories, plugins }, skippedPlugins, options) {
|
|
49
|
+
const { skipPlugins = [], onlyPlugins = [], verbose = false } = options;
|
|
43
50
|
const filteredPlugins = filterPluginsFromCategories({
|
|
44
51
|
categories,
|
|
45
52
|
plugins,
|
|
@@ -47,15 +54,28 @@ function applyPluginFilters({ categories, plugins }, skipPlugins, onlyPlugins, v
|
|
|
47
54
|
if (skipPlugins.length === 0 && onlyPlugins.length === 0) {
|
|
48
55
|
return filteredPlugins;
|
|
49
56
|
}
|
|
50
|
-
validateFilterOption('skipPlugins', { plugins: filteredPlugins, categories }, { itemsToFilter: skipPlugins, verbose });
|
|
51
|
-
validateFilterOption('onlyPlugins', { plugins: filteredPlugins, categories }, { itemsToFilter: onlyPlugins, verbose });
|
|
57
|
+
validateFilterOption('skipPlugins', { plugins: filteredPlugins, categories }, { itemsToFilter: skipPlugins, skippedItems: skippedPlugins, verbose });
|
|
58
|
+
validateFilterOption('onlyPlugins', { plugins: filteredPlugins, categories }, { itemsToFilter: onlyPlugins, skippedItems: skippedPlugins, verbose });
|
|
52
59
|
return applyFilters(filteredPlugins, skipPlugins, onlyPlugins, 'slug');
|
|
53
60
|
}
|
|
54
|
-
function
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
61
|
+
export function filterSkippedInPlugins(plugins) {
|
|
62
|
+
return plugins.map((plugin) => {
|
|
63
|
+
const filteredAudits = filterSkippedItems(plugin.audits);
|
|
64
|
+
return {
|
|
65
|
+
...plugin,
|
|
66
|
+
...(plugin.groups && {
|
|
67
|
+
groups: filterItemRefsBy(filterSkippedItems(plugin.groups), ref => filteredAudits.some(({ slug }) => slug === ref.slug)),
|
|
68
|
+
}),
|
|
69
|
+
audits: filteredAudits,
|
|
70
|
+
};
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
export function filterSkippedCategories(categories, plugins) {
|
|
74
|
+
return categories
|
|
75
|
+
?.map(category => {
|
|
76
|
+
const validRefs = category.refs.filter(ref => isValidCategoryRef(ref, plugins));
|
|
77
|
+
return validRefs.length > 0 ? { ...category, refs: validRefs } : null;
|
|
78
|
+
})
|
|
79
|
+
.filter((category) => category != null);
|
|
60
80
|
}
|
|
61
81
|
//# sourceMappingURL=filter.middleware.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filter.middleware.js","sourceRoot":"","sources":["../../../../../../packages/cli/src/lib/implementation/filter.middleware.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"filter.middleware.js","sourceRoot":"","sources":["../../../../../../packages/cli/src/lib/implementation/filter.middleware.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { CategoryRef, CoreConfig } from '@code-pushup/models';
|
|
2
|
+
import type { Filterables } from './filter.model';
|
|
3
|
+
export declare function applyFilters<T>(items: T[], skipItems: string[], onlyItems: string[], key: keyof T): T[];
|
|
4
|
+
export declare function extractSkippedItems<T extends {
|
|
5
|
+
slug: string;
|
|
6
|
+
}>(originalItems: T[] | undefined, filteredItems: T[] | undefined): string[];
|
|
7
|
+
export declare function filterSkippedItems<T extends {
|
|
8
|
+
isSkipped?: boolean;
|
|
9
|
+
}>(items: T[] | undefined): Omit<T, 'isSkipped'>[];
|
|
10
|
+
export declare function isValidCategoryRef(ref: CategoryRef, plugins: Filterables['plugins']): boolean;
|
|
11
|
+
export declare function filterPluginsFromCategories({ categories, plugins, }: Filterables): CoreConfig['plugins'];
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export function applyFilters(items, skipItems, onlyItems, key) {
|
|
2
|
+
return items.filter(item => {
|
|
3
|
+
const itemKey = item[key];
|
|
4
|
+
return (!skipItems.includes(itemKey) &&
|
|
5
|
+
(onlyItems.length === 0 || onlyItems.includes(itemKey)));
|
|
6
|
+
});
|
|
7
|
+
}
|
|
8
|
+
export function extractSkippedItems(originalItems, filteredItems) {
|
|
9
|
+
if (!originalItems || !filteredItems) {
|
|
10
|
+
return [];
|
|
11
|
+
}
|
|
12
|
+
const filteredSlugs = new Set(filteredItems.map(({ slug }) => slug));
|
|
13
|
+
return originalItems
|
|
14
|
+
.filter(({ slug }) => !filteredSlugs.has(slug))
|
|
15
|
+
.map(({ slug }) => slug);
|
|
16
|
+
}
|
|
17
|
+
export function filterSkippedItems(items) {
|
|
18
|
+
return (items ?? [])
|
|
19
|
+
.filter(({ isSkipped }) => isSkipped !== true)
|
|
20
|
+
.map(({ isSkipped, ...props }) => props);
|
|
21
|
+
}
|
|
22
|
+
export function isValidCategoryRef(ref, plugins) {
|
|
23
|
+
const plugin = plugins.find(({ slug }) => slug === ref.plugin);
|
|
24
|
+
if (!plugin) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
switch (ref.type) {
|
|
28
|
+
case 'audit':
|
|
29
|
+
return plugin.audits.some(({ slug }) => slug === ref.slug);
|
|
30
|
+
case 'group':
|
|
31
|
+
return plugin.groups?.some(({ slug }) => slug === ref.slug) ?? false;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export function filterPluginsFromCategories({ categories, plugins, }) {
|
|
35
|
+
if (!categories || categories.length === 0) {
|
|
36
|
+
return plugins;
|
|
37
|
+
}
|
|
38
|
+
const validPluginSlugs = new Set(categories.flatMap(category => category.refs.map(ref => ref.plugin)));
|
|
39
|
+
return plugins.filter(plugin => validPluginSlugs.has(plugin.slug));
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=filter.middleware.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter.middleware.utils.js","sourceRoot":"","sources":["../../../../../../packages/cli/src/lib/implementation/filter.middleware.utils.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,YAAY,CAC1B,KAAU,EACV,SAAmB,EACnB,SAAmB,EACnB,GAAY;IAEZ,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAsB,CAAC;QAC/C,OAAO,CACL,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC;YAC5B,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CACxD,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,aAA8B,EAC9B,aAA8B;IAE9B,IAAI,CAAC,aAAa,IAAI,CAAC,aAAa,EAAE,CAAC;QACrC,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IACrE,OAAO,aAAa;SACjB,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;SAC9C,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,KAAsB;IAEtB,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;SACjB,MAAM,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,SAAS,KAAK,IAAI,CAAC;SAC7C,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,GAAgB,EAChB,OAA+B;IAE/B,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,KAAK,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/D,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,KAAK,CAAC;IACf,CAAC;IACD,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,OAAO;YACV,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC;QAC7D,KAAK,OAAO;YACV,OAAO,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC;IACzE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,EAC1C,UAAU,EACV,OAAO,GACK;IACZ,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3C,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAC9B,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CACrE,CAAC;IACF,OAAO,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AACrE,CAAC"}
|
|
@@ -1,13 +1,16 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { PluginConfig } from '@code-pushup/models';
|
|
2
2
|
import type { FilterOptionType, Filterables } from './filter.model.js';
|
|
3
3
|
export declare class OptionValidationError extends Error {
|
|
4
4
|
}
|
|
5
|
-
export declare function validateFilterOption(option: FilterOptionType, { plugins, categories }: Filterables, { itemsToFilter, verbose }: {
|
|
5
|
+
export declare function validateFilterOption(option: FilterOptionType, { plugins, categories }: Filterables, { itemsToFilter, skippedItems, verbose, }: {
|
|
6
6
|
itemsToFilter: string[];
|
|
7
|
+
skippedItems: string[];
|
|
7
8
|
verbose: boolean;
|
|
8
9
|
}): void;
|
|
10
|
+
export declare function validateSkippedCategories(originalCategories: NonNullable<Filterables['categories']>, filteredCategories: NonNullable<Filterables['categories']>, verbose: boolean): void;
|
|
9
11
|
export declare function validateFinalState(filteredItems: Filterables, originalItems: Filterables): void;
|
|
12
|
+
export declare function pluginHasZeroWeightRefs(plugin: Pick<PluginConfig, 'groups' | 'audits'>): boolean;
|
|
10
13
|
export declare function isOnlyOption(option: FilterOptionType): boolean;
|
|
11
14
|
export declare function getItemType(option: FilterOptionType, count: number): string;
|
|
12
|
-
export declare function createValidationMessage(option: FilterOptionType, invalidItems: string[], validItems:
|
|
15
|
+
export declare function createValidationMessage(option: FilterOptionType, invalidItems: string[], validItems: Set<string>): string;
|
|
13
16
|
export declare function handleConflictingOptions(type: 'categories' | 'plugins', onlyItems: string[], skipItems: string[]): void;
|
|
@@ -1,32 +1,56 @@
|
|
|
1
1
|
import { capitalize, filterItemRefsBy, pluralize, ui, } from '@code-pushup/utils';
|
|
2
2
|
export class OptionValidationError extends Error {
|
|
3
3
|
}
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
// eslint-disable-next-line max-lines-per-function
|
|
5
|
+
export function validateFilterOption(option, { plugins, categories = [] }, { itemsToFilter, skippedItems, verbose, }) {
|
|
6
6
|
const validItems = isCategoryOption(option)
|
|
7
|
-
? categories
|
|
7
|
+
? categories.map(({ slug }) => slug)
|
|
8
8
|
: isPluginOption(option)
|
|
9
|
-
? plugins
|
|
9
|
+
? plugins.map(({ slug }) => slug)
|
|
10
10
|
: [];
|
|
11
|
-
const
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
11
|
+
const itemsToFilterSet = new Set(itemsToFilter);
|
|
12
|
+
const skippedItemsSet = new Set(skippedItems);
|
|
13
|
+
const validItemsSet = new Set(validItems);
|
|
14
|
+
const nonExistentItems = itemsToFilter.filter(item => !validItemsSet.has(item) && !skippedItemsSet.has(item));
|
|
15
|
+
const skippedValidItems = itemsToFilter.filter(item => skippedItemsSet.has(item));
|
|
16
|
+
if (nonExistentItems.length > 0) {
|
|
17
|
+
const message = createValidationMessage(option, nonExistentItems, validItemsSet);
|
|
18
|
+
if (isOnlyOption(option) &&
|
|
19
|
+
itemsToFilterSet.size > 0 &&
|
|
20
|
+
itemsToFilterSet.size === nonExistentItems.length) {
|
|
21
|
+
throw new OptionValidationError(message);
|
|
22
|
+
}
|
|
19
23
|
ui().logger.warning(message);
|
|
20
24
|
}
|
|
25
|
+
if (skippedValidItems.length > 0 && verbose) {
|
|
26
|
+
const item = getItemType(option, skippedValidItems.length);
|
|
27
|
+
const prefix = skippedValidItems.length === 1 ? `a skipped` : `skipped`;
|
|
28
|
+
ui().logger.warning(`The --${option} argument references ${prefix} ${item}: ${skippedValidItems.join(', ')}.`);
|
|
29
|
+
}
|
|
21
30
|
if (isPluginOption(option) && categories.length > 0 && verbose) {
|
|
22
|
-
const
|
|
31
|
+
const removedCategories = filterItemRefsBy(categories, ({ plugin }) => isOnlyOption(option)
|
|
23
32
|
? !itemsToFilterSet.has(plugin)
|
|
24
33
|
: itemsToFilterSet.has(plugin)).map(({ slug }) => slug);
|
|
25
|
-
if (
|
|
26
|
-
ui().logger.info(`The --${option} argument removed the following categories: ${
|
|
34
|
+
if (removedCategories.length > 0) {
|
|
35
|
+
ui().logger.info(`The --${option} argument removed the following categories: ${removedCategories.join(', ')}.`);
|
|
27
36
|
}
|
|
28
37
|
}
|
|
29
38
|
}
|
|
39
|
+
export function validateSkippedCategories(originalCategories, filteredCategories, verbose) {
|
|
40
|
+
const skippedCategories = originalCategories.filter(original => !filteredCategories.some(({ slug }) => slug === original.slug));
|
|
41
|
+
if (skippedCategories.length > 0 && verbose) {
|
|
42
|
+
skippedCategories.forEach(category => {
|
|
43
|
+
ui().logger.info(`Category ${category.slug} was removed because all its refs were skipped. Affected refs: ${category.refs
|
|
44
|
+
.map(ref => `${ref.slug} (${ref.type})`)
|
|
45
|
+
.join(', ')}`);
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
if (filteredCategories.length === 0) {
|
|
49
|
+
throw new OptionValidationError(`No categories remain after filtering. Removed categories: ${skippedCategories
|
|
50
|
+
.map(({ slug }) => slug)
|
|
51
|
+
.join(', ')}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
30
54
|
export function validateFinalState(filteredItems, originalItems) {
|
|
31
55
|
const { categories: filteredCategories = [], plugins: filteredPlugins } = filteredItems;
|
|
32
56
|
const { categories: originalCategories = [], plugins: originalPlugins } = originalItems;
|
|
@@ -37,6 +61,15 @@ export function validateFinalState(filteredItems, originalItems) {
|
|
|
37
61
|
const availableCategories = originalCategories.map(c => c.slug).join(', ') || 'none';
|
|
38
62
|
throw new OptionValidationError(`Nothing to report. No plugins or categories are available after filtering. Available plugins: ${availablePlugins}. Available categories: ${availableCategories}.`);
|
|
39
63
|
}
|
|
64
|
+
if (filteredPlugins.some(pluginHasZeroWeightRefs)) {
|
|
65
|
+
throw new OptionValidationError('Some groups in the filtered plugins have only zero-weight references. Please adjust your filters or weights.');
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export function pluginHasZeroWeightRefs(plugin) {
|
|
69
|
+
if (!plugin.groups || plugin.groups.length === 0) {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
return plugin.groups.some(group => group.refs.reduce((sum, ref) => sum + ref.weight, 0) === 0);
|
|
40
73
|
}
|
|
41
74
|
function isCategoryOption(option) {
|
|
42
75
|
return option.endsWith('Categories');
|
|
@@ -61,11 +94,11 @@ export function createValidationMessage(option, invalidItems, validItems) {
|
|
|
61
94
|
? `a ${invalidItem} that does not exist:`
|
|
62
95
|
: `${invalidItem} that do not exist:`;
|
|
63
96
|
const invalidSlugs = invalidItems.join(', ');
|
|
64
|
-
const validItem = getItemType(option, validItems.
|
|
65
|
-
const validItemText = validItems.
|
|
97
|
+
const validItem = getItemType(option, validItems.size);
|
|
98
|
+
const validItemText = validItems.size === 1
|
|
66
99
|
? `The only valid ${validItem} is`
|
|
67
100
|
: `Valid ${validItem} are`;
|
|
68
|
-
const validSlugs = validItems.
|
|
101
|
+
const validSlugs = [...validItems].join(', ');
|
|
69
102
|
return `The --${option} argument references ${invalidItemText} ${invalidSlugs}. ${validItemText} ${validSlugs}.`;
|
|
70
103
|
}
|
|
71
104
|
export function handleConflictingOptions(type, onlyItems, skipItems) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate-filter-options.utils.js","sourceRoot":"","sources":["../../../../../../packages/cli/src/lib/implementation/validate-filter-options.utils.ts"],"names":[],"mappings":"AACA,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,SAAS,EACT,EAAE,GACH,MAAM,oBAAoB,CAAC;AAG5B,MAAM,OAAO,qBAAsB,SAAQ,KAAK;CAAG;AAEnD,MAAM,UAAU,oBAAoB,CAClC,MAAwB,EACxB,EAAE,OAAO,EAAE,UAAU,GAAG,EAAE,EAAe,EACzC,
|
|
1
|
+
{"version":3,"file":"validate-filter-options.utils.js","sourceRoot":"","sources":["../../../../../../packages/cli/src/lib/implementation/validate-filter-options.utils.ts"],"names":[],"mappings":"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"}
|