@o3r/eslint-plugin 10.2.0-prerelease.2 → 10.2.0-prerelease.20
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
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@o3r/eslint-plugin",
|
|
3
|
-
"version": "10.2.0-prerelease.
|
|
3
|
+
"version": "10.2.0-prerelease.20",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -64,8 +64,8 @@
|
|
|
64
64
|
"@compodoc/compodoc": "^1.1.19",
|
|
65
65
|
"@nx/eslint-plugin": "~18.0.2",
|
|
66
66
|
"@nx/jest": "~18.0.2",
|
|
67
|
-
"@o3r/build-helpers": "^10.2.0-prerelease.
|
|
68
|
-
"@o3r/test-helpers": "^10.2.0-prerelease.
|
|
67
|
+
"@o3r/build-helpers": "^10.2.0-prerelease.20",
|
|
68
|
+
"@o3r/test-helpers": "^10.2.0-prerelease.20",
|
|
69
69
|
"@stylistic/eslint-plugin-ts": "^1.5.4",
|
|
70
70
|
"@types/jest": "~29.5.2",
|
|
71
71
|
"@types/node": "^20.0.0",
|
package/src/rules/json/json-dependency-versions-harmonize/json-dependency-versions-harmonize.d.ts
CHANGED
|
@@ -10,6 +10,8 @@ interface Options {
|
|
|
10
10
|
* If not set, the version will be aligned with the latest range if the latest range is not intersected with the current range.
|
|
11
11
|
*/
|
|
12
12
|
alignPeerDependencies: boolean;
|
|
13
|
+
/** Align the resolutions/overrides dependency rules with the latest determined range */
|
|
14
|
+
alignResolutions: boolean;
|
|
13
15
|
}
|
|
14
16
|
declare const _default: import("@typescript-eslint/utils/dist/ts-eslint/Rule").RuleModule<"error" | "versionUpdate", [Options, ...any[]], any>;
|
|
15
17
|
export default _default;
|
package/src/rules/json/json-dependency-versions-harmonize/json-dependency-versions-harmonize.js
CHANGED
|
@@ -9,6 +9,7 @@ const defaultOptions = [{
|
|
|
9
9
|
ignoredDependencies: [],
|
|
10
10
|
dependencyTypes: ['optionalDependencies', 'dependencies', 'devDependencies', 'peerDependencies', 'generatorDependencies'],
|
|
11
11
|
alignPeerDependencies: false,
|
|
12
|
+
alignResolutions: true,
|
|
12
13
|
ignoredPackages: []
|
|
13
14
|
}];
|
|
14
15
|
exports.default = (0, utils_1.createRule)({
|
|
@@ -49,6 +50,10 @@ exports.default = (0, utils_1.createRule)({
|
|
|
49
50
|
items: {
|
|
50
51
|
type: 'string'
|
|
51
52
|
}
|
|
53
|
+
},
|
|
54
|
+
alignResolutions: {
|
|
55
|
+
type: 'boolean',
|
|
56
|
+
description: 'Align the resolutions dependencies with the latest determined range.'
|
|
52
57
|
}
|
|
53
58
|
},
|
|
54
59
|
additionalProperties: false
|
|
@@ -62,30 +67,26 @@ exports.default = (0, utils_1.createRule)({
|
|
|
62
67
|
},
|
|
63
68
|
defaultOptions,
|
|
64
69
|
create: (context, [options]) => {
|
|
70
|
+
const resolutionsFields = ['resolutions', 'overrides'];
|
|
65
71
|
const parserServices = (0, utils_2.getJsoncParserServices)(context);
|
|
66
72
|
const dirname = path.dirname(context.getFilename());
|
|
67
73
|
const workspace = (0, version_harmonize_1.findWorkspacePackageJsons)(dirname);
|
|
68
74
|
const bestRanges = workspace && (0, version_harmonize_1.getBestRanges)(options.dependencyTypes, workspace.packages.filter(({ content }) => !content.name || !options.ignoredPackages.includes(content.name)));
|
|
69
75
|
const ignoredDependencies = options.ignoredDependencies.map((dep) => new RegExp(dep.replace(/[.+?^${}()|[\]\\]/g, '\\$&').replace(/\*/g, '.*')));
|
|
76
|
+
const dependencyTypes = [...options.dependencyTypes, ...(options.alignResolutions ? resolutionsFields : [])];
|
|
70
77
|
if (parserServices.isJSON) {
|
|
71
78
|
return {
|
|
72
79
|
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
73
80
|
'JSONExpressionStatement': (node) => {
|
|
74
81
|
if (node.expression.type === 'JSONObjectExpression') {
|
|
75
82
|
const deps = node.expression.properties
|
|
76
|
-
.filter(({ key }) =>
|
|
83
|
+
.filter(({ key }) => dependencyTypes.includes(key.type === 'JSONLiteral' ? key.value.toString() : key.name));
|
|
77
84
|
if (deps.length > 0 && bestRanges) {
|
|
78
85
|
deps
|
|
79
86
|
.map((depGroup) => depGroup.value)
|
|
80
87
|
.filter((depGroup) => depGroup.type === 'JSONObjectExpression')
|
|
81
88
|
.forEach((depGroup) => {
|
|
82
|
-
|
|
83
|
-
const name = dep.key.type === 'JSONLiteral' ? dep.key.value.toString() : dep.key.name;
|
|
84
|
-
if (ignoredDependencies.some((ignore) => ignore.test(name))) {
|
|
85
|
-
return;
|
|
86
|
-
}
|
|
87
|
-
const range = dep.value.type === 'JSONLiteral' ? dep.value.value : (dep.value.type === 'JSONIdentifier' ? dep.value.name : undefined);
|
|
88
|
-
const bestRange = (0, version_harmonize_1.getBestRange)(range, bestRanges[name]?.range);
|
|
89
|
+
const report = (name, resolvedName, dep, range, bestRange) => {
|
|
89
90
|
if (bestRange && bestRange !== range) {
|
|
90
91
|
if (!options.alignPeerDependencies && depGroup.parent.type === 'JSONProperty' && range &&
|
|
91
92
|
(depGroup.parent.key.type === 'JSONLiteral' ? depGroup.parent.key.value.toString() : depGroup.parent.key.name) === 'peerDependencies' &&
|
|
@@ -98,7 +99,7 @@ exports.default = (0, utils_1.createRule)({
|
|
|
98
99
|
data: {
|
|
99
100
|
depName: name,
|
|
100
101
|
version: bestRange,
|
|
101
|
-
packageJsonFile: bestRanges[
|
|
102
|
+
packageJsonFile: bestRanges[resolvedName].path
|
|
102
103
|
},
|
|
103
104
|
fix: (fixer) => fixer.replaceTextRange(dep.value.range, `"${bestRange}"`),
|
|
104
105
|
suggest: [
|
|
@@ -112,6 +113,27 @@ exports.default = (0, utils_1.createRule)({
|
|
|
112
113
|
]
|
|
113
114
|
});
|
|
114
115
|
}
|
|
116
|
+
};
|
|
117
|
+
depGroup.properties.forEach((dependencyNode) => {
|
|
118
|
+
const isResolutionsField = options.alignResolutions && depGroup.parent.type === 'JSONProperty' &&
|
|
119
|
+
resolutionsFields.includes(depGroup.parent.key.type === 'JSONLiteral' ? depGroup.parent.key.value.toString() : depGroup.parent.key.name);
|
|
120
|
+
const getNodeDetails = (dep) => {
|
|
121
|
+
const name = dep.key.type === 'JSONLiteral' ? dep.key.value.toString() : dep.key.name;
|
|
122
|
+
const nameParts = name.split('/');
|
|
123
|
+
if (ignoredDependencies.some((ignore) => ignore.test(name))) {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
const range = dep.value.type === 'JSONLiteral' ? dep.value.value : (dep.value.type === 'JSONIdentifier' ? dep.value.name : undefined);
|
|
127
|
+
if (!range && dep.value.type === 'JSONObjectExpression') {
|
|
128
|
+
return dep.value.properties
|
|
129
|
+
.forEach((prop) => getNodeDetails(prop));
|
|
130
|
+
}
|
|
131
|
+
const resolutionSubNameIndex = isResolutionsField ? nameParts.findIndex((_, i) => !!bestRanges[nameParts.slice(nameParts.length - i).join('/')]) : -1;
|
|
132
|
+
const resolvedName = resolutionSubNameIndex > -1 ? nameParts.slice(nameParts.length - resolutionSubNameIndex).join('/') : name;
|
|
133
|
+
const bestRange = (0, version_harmonize_1.getBestRange)(range, bestRanges[resolvedName]?.range);
|
|
134
|
+
report(name, resolvedName, dep, range, bestRange);
|
|
135
|
+
};
|
|
136
|
+
getNodeDetails(dependencyNode);
|
|
115
137
|
});
|
|
116
138
|
});
|
|
117
139
|
}
|