@o3r/eslint-plugin 10.2.0-prerelease.5 → 10.2.0-prerelease.7

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.5",
3
+ "version": "10.2.0-prerelease.7",
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.5",
68
- "@o3r/test-helpers": "^10.2.0-prerelease.5",
67
+ "@o3r/build-helpers": "^10.2.0-prerelease.7",
68
+ "@o3r/test-helpers": "^10.2.0-prerelease.7",
69
69
  "@stylistic/eslint-plugin-ts": "^1.5.4",
70
70
  "@types/jest": "~29.5.2",
71
71
  "@types/node": "^20.0.0",
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../schematics/ng-add/index.ts"],"names":[],"mappings":";;;AAAA,2DAAkD;AAGlD;;GAEG;AACH,SAAgB,KAAK;IACnB,kBAAkB;IAClB,OAAO,IAAA,iBAAI,GAAE,CAAC;AAChB,CAAC;AAHD,sBAGC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../schematics/ng-add/schema.ts"],"names":[],"mappings":""}
@@ -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;
@@ -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 }) => options.dependencyTypes.includes(key.type === 'JSONLiteral' ? key.value.toString() : key.name));
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
- depGroup.properties.forEach((dep) => {
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[name].path
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
  }