@atlaskit/eslint-plugin-design-system 10.12.4 → 10.13.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.
Files changed (50) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/cjs/rules/no-legacy-icons/checks.js +90 -44
  3. package/dist/cjs/rules/no-legacy-icons/helpers.js +44 -12
  4. package/dist/cjs/rules/no-legacy-icons/index.js +5 -3
  5. package/dist/cjs/rules/use-heading/config/index.js +2 -1
  6. package/dist/cjs/rules/use-heading/transformers/native-elements.js +61 -31
  7. package/dist/cjs/rules/use-primitives-text/config/index.js +2 -1
  8. package/dist/cjs/rules/use-primitives-text/transformers/emphasis-elements.js +48 -26
  9. package/dist/cjs/rules/use-primitives-text/transformers/paragraph-elements.js +62 -51
  10. package/dist/cjs/rules/use-primitives-text/transformers/span-elements.js +56 -32
  11. package/dist/cjs/rules/use-primitives-text/transformers/strong-elements.js +48 -26
  12. package/dist/es2019/rules/no-legacy-icons/checks.js +75 -33
  13. package/dist/es2019/rules/no-legacy-icons/helpers.js +43 -11
  14. package/dist/es2019/rules/no-legacy-icons/index.js +5 -3
  15. package/dist/es2019/rules/use-heading/config/index.js +2 -1
  16. package/dist/es2019/rules/use-heading/transformers/native-elements.js +60 -29
  17. package/dist/es2019/rules/use-primitives-text/config/index.js +2 -1
  18. package/dist/es2019/rules/use-primitives-text/transformers/emphasis-elements.js +47 -24
  19. package/dist/es2019/rules/use-primitives-text/transformers/paragraph-elements.js +63 -52
  20. package/dist/es2019/rules/use-primitives-text/transformers/span-elements.js +55 -30
  21. package/dist/es2019/rules/use-primitives-text/transformers/strong-elements.js +47 -24
  22. package/dist/esm/rules/no-legacy-icons/checks.js +91 -45
  23. package/dist/esm/rules/no-legacy-icons/helpers.js +43 -11
  24. package/dist/esm/rules/no-legacy-icons/index.js +5 -3
  25. package/dist/esm/rules/use-heading/config/index.js +2 -1
  26. package/dist/esm/rules/use-heading/transformers/native-elements.js +61 -31
  27. package/dist/esm/rules/use-primitives-text/config/index.js +2 -1
  28. package/dist/esm/rules/use-primitives-text/transformers/emphasis-elements.js +48 -26
  29. package/dist/esm/rules/use-primitives-text/transformers/paragraph-elements.js +62 -51
  30. package/dist/esm/rules/use-primitives-text/transformers/span-elements.js +56 -32
  31. package/dist/esm/rules/use-primitives-text/transformers/strong-elements.js +48 -26
  32. package/dist/types/rules/no-legacy-icons/checks.d.ts +4 -1
  33. package/dist/types/rules/no-legacy-icons/helpers.d.ts +21 -14
  34. package/dist/types/rules/use-heading/config/index.d.ts +2 -1
  35. package/dist/types/rules/use-heading/transformers/native-elements.d.ts +5 -1
  36. package/dist/types/rules/use-primitives-text/config/index.d.ts +1 -0
  37. package/dist/types/rules/use-primitives-text/transformers/emphasis-elements.d.ts +6 -1
  38. package/dist/types/rules/use-primitives-text/transformers/paragraph-elements.d.ts +1 -0
  39. package/dist/types/rules/use-primitives-text/transformers/span-elements.d.ts +6 -1
  40. package/dist/types/rules/use-primitives-text/transformers/strong-elements.d.ts +6 -1
  41. package/dist/types-ts4.5/rules/no-legacy-icons/checks.d.ts +4 -1
  42. package/dist/types-ts4.5/rules/no-legacy-icons/helpers.d.ts +21 -14
  43. package/dist/types-ts4.5/rules/use-heading/config/index.d.ts +2 -1
  44. package/dist/types-ts4.5/rules/use-heading/transformers/native-elements.d.ts +5 -1
  45. package/dist/types-ts4.5/rules/use-primitives-text/config/index.d.ts +1 -0
  46. package/dist/types-ts4.5/rules/use-primitives-text/transformers/emphasis-elements.d.ts +6 -1
  47. package/dist/types-ts4.5/rules/use-primitives-text/transformers/paragraph-elements.d.ts +1 -0
  48. package/dist/types-ts4.5/rules/use-primitives-text/transformers/span-elements.d.ts +6 -1
  49. package/dist/types-ts4.5/rules/use-primitives-text/transformers/strong-elements.d.ts +6 -1
  50. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,29 @@
1
1
  # @atlaskit/eslint-plugin-design-system
2
2
 
3
+ ## 10.13.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#128427](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/128427)
8
+ [`ade1e717764e2`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/ade1e717764e2) -
9
+ Update no-legacy-icons eslint rule following changes to color prop of new icon components
10
+
11
+ ### Patch Changes
12
+
13
+ - [#127303](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/127303)
14
+ [`8c7d9e510fc2a`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/8c7d9e510fc2a) -
15
+ New rule config option `enableUnsafeReport` for `use-primitives-text` and `use-heading` to enable
16
+ error reporting for native typography elements that are not autofixable.
17
+ - Updated dependencies
18
+
19
+ ## 10.12.5
20
+
21
+ ### Patch Changes
22
+
23
+ - [#127454](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/127454)
24
+ [`e869f31dbe200`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/e869f31dbe200) -
25
+ No-legacy-icons ESLint rule errors at all references to a legacy icon.
26
+
3
27
  ## 10.12.4
4
28
 
5
29
  ### Patch Changes
@@ -27,6 +27,9 @@ var createChecks = exports.createChecks = function createChecks(context) {
27
27
  var shouldErrorForAutoMigration = getConfigFlag('shouldErrorForAutoMigration', true);
28
28
  var isQuietMode = getConfigFlag('quiet', false);
29
29
 
30
+ // Sorted list of ranges
31
+ var errorRanges = [];
32
+
30
33
  /**
31
34
  * Adds the legacy Icon and new button imports to the correct global arrays to be used by the other checks
32
35
  * @param node The import node found by ESLint
@@ -90,8 +93,8 @@ var createChecks = exports.createChecks = function createChecks(context) {
90
93
  try {
91
94
  for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
92
95
  var decl = _step3.value;
93
- if ((0, _eslintCodemodUtils.isNodeOfType)(decl, 'VariableDeclarator') && 'init' in decl && 'id' in decl && decl.init && decl.id && 'name' in decl.id && decl.id.name && (0, _eslintCodemodUtils.isNodeOfType)(decl.init, 'Identifier')) {
94
- if (decl.init.name in legacyIconImports) {
96
+ if ((0, _eslintCodemodUtils.isNodeOfType)(decl, 'VariableDeclarator') && Object.keys(decl).includes('init') && Object.keys(decl).includes('id') && decl.init && decl.id && 'name' in decl.id && decl.id.name && (0, _eslintCodemodUtils.isNodeOfType)(decl.init, 'Identifier')) {
97
+ if (Object.keys(legacyIconImports).includes(decl.init.name)) {
95
98
  legacyIconImports[decl.id.name] = {
96
99
  packageName: legacyIconImports[decl.init.name].packageName,
97
100
  exported: legacyIconImports[decl.init.name].exported || isExported
@@ -116,16 +119,17 @@ var createChecks = exports.createChecks = function createChecks(context) {
116
119
  var checkExportDefaultDeclaration = function checkExportDefaultDeclaration(node) {
117
120
  var exportName = '';
118
121
  var packageName = '';
119
- if ('declaration' in node && node.declaration && (0, _eslintCodemodUtils.isNodeOfType)(node.declaration, 'Identifier') && node.declaration.name in legacyIconImports) {
122
+ if (Object.keys(node).includes('declaration') && node.declaration && (0, _eslintCodemodUtils.isNodeOfType)(node.declaration, 'Identifier') && Object.keys(legacyIconImports).includes(node.declaration.name)) {
120
123
  packageName = legacyIconImports[node.declaration.name].packageName;
121
124
  exportName = 'Default export';
122
- } else if ('declaration' in node && node.declaration && (0, _eslintCodemodUtils.isNodeOfType)(node.declaration, 'AssignmentExpression') && (0, _eslintCodemodUtils.isNodeOfType)(node.declaration.left, 'Identifier') && (0, _eslintCodemodUtils.isNodeOfType)(node.declaration.right, 'Identifier') && node.declaration.right.name in legacyIconImports) {
125
+ } else if (Object.keys(node).includes('declaration') && node.declaration && (0, _eslintCodemodUtils.isNodeOfType)(node.declaration, 'AssignmentExpression') && (0, _eslintCodemodUtils.isNodeOfType)(node.declaration.left, 'Identifier') && (0, _eslintCodemodUtils.isNodeOfType)(node.declaration.right, 'Identifier') && Object.keys(legacyIconImports).includes(node.declaration.right.name)) {
123
126
  packageName = legacyIconImports[node.declaration.right.name].packageName;
124
127
  exportName = node.declaration.left.name;
125
128
  } else {
126
129
  return;
127
130
  }
128
131
  (0, _helpers.createCantMigrateReExportError)(node, packageName, exportName, errorsManual);
132
+ (0, _helpers.addToListOfRanges)(node, errorRanges);
129
133
  guidance[(0, _helpers.locToString)(node)] = (0, _helpers.createGuidance)(packageName);
130
134
  };
131
135
 
@@ -135,7 +139,7 @@ var createChecks = exports.createChecks = function createChecks(context) {
135
139
  */
136
140
  var checkExportNamedVariables = function checkExportNamedVariables(node) {
137
141
  // export {default as AddIcon} from '@atlaskit/icon/glyph/add';
138
- if (node.source && (0, _eslintCodemodUtils.isNodeOfType)(node.source, 'Literal') && 'value' in node.source) {
142
+ if (node.source && (0, _eslintCodemodUtils.isNodeOfType)(node.source, 'Literal') && Object.keys(node.source).includes('value')) {
139
143
  var moduleSource = node.source.value;
140
144
  if (typeof moduleSource === 'string' && ['@atlaskit/icon/glyph/', '@atlaskit/icon-object/glyph/'].find(function (val) {
141
145
  return moduleSource.startsWith(val);
@@ -146,6 +150,7 @@ var createChecks = exports.createChecks = function createChecks(context) {
146
150
  for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
147
151
  var spec = _step4.value;
148
152
  (0, _helpers.createCantMigrateReExportError)(spec, moduleSource, spec.exported.name, errorsManual);
153
+ (0, _helpers.addToListOfRanges)(spec, errorRanges);
149
154
  guidance[(0, _helpers.locToString)(spec)] = (0, _helpers.createGuidance)(moduleSource);
150
155
  }
151
156
  } catch (err) {
@@ -161,8 +166,9 @@ var createChecks = exports.createChecks = function createChecks(context) {
161
166
  try {
162
167
  for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
163
168
  var decl = _step5.value;
164
- if ((0, _eslintCodemodUtils.isNodeOfType)(decl, 'VariableDeclarator') && 'init' in decl && decl.init && (0, _eslintCodemodUtils.isNodeOfType)(decl.init, 'Identifier') && decl.init.name in legacyIconImports) {
169
+ if ((0, _eslintCodemodUtils.isNodeOfType)(decl, 'VariableDeclarator') && Object.keys(decl).includes('init') && decl.init && (0, _eslintCodemodUtils.isNodeOfType)(decl.init, 'Identifier') && Object.keys(legacyIconImports).includes(decl.init.name)) {
165
170
  (0, _helpers.createCantMigrateReExportError)(node, legacyIconImports[decl.init.name].packageName, decl.init.name, errorsManual);
171
+ (0, _helpers.addToListOfRanges)(node, errorRanges);
166
172
  guidance[(0, _helpers.locToString)(node)] = (0, _helpers.createGuidance)(legacyIconImports[decl.init.name].packageName);
167
173
  }
168
174
  }
@@ -183,13 +189,14 @@ var createChecks = exports.createChecks = function createChecks(context) {
183
189
  try {
184
190
  for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
185
191
  var _spec2 = _step6.value;
186
- if (_spec2.local.name in legacyIconImports) {
192
+ if (Object.keys(legacyIconImports).includes(_spec2.local.name)) {
187
193
  //update legacy imports to be exported
188
194
  legacyIconImports[_spec2.local.name] = {
189
195
  packageName: legacyIconImports[_spec2.local.name].packageName,
190
196
  exported: true
191
197
  };
192
198
  (0, _helpers.createCantMigrateReExportError)(_spec2, legacyIconImports[_spec2.local.name].packageName, _spec2.exported.name, errorsManual);
199
+ (0, _helpers.addToListOfRanges)(_spec2, errorRanges);
193
200
  guidance[(0, _helpers.locToString)(_spec2)] = (0, _helpers.createGuidance)(legacyIconImports[_spec2.local.name].packageName);
194
201
  }
195
202
  }
@@ -209,8 +216,9 @@ var createChecks = exports.createChecks = function createChecks(context) {
209
216
  if (!(0, _eslintCodemodUtils.isNodeOfType)(node, 'Identifier')) {
210
217
  return;
211
218
  }
212
- if (node.name && node.name in legacyIconImports && legacyIconImports[node.name].packageName) {
213
- (0, _helpers.createCantMigrateIdentifierError)(node, legacyIconImports[node.name].packageName, node.name, errorsManual);
219
+ if (node.name && Object.keys(legacyIconImports).includes(node.name) && legacyIconImports[node.name].packageName) {
220
+ (0, _helpers.createCantMigrateIdentifierMapOrArrayError)(node, legacyIconImports[node.name].packageName, node.name, errorsManual);
221
+ (0, _helpers.addToListOfRanges)(node, errorRanges);
214
222
  guidance[(0, _helpers.locToString)(node)] = (0, _helpers.createGuidance)(legacyIconImports[node.name].packageName);
215
223
  }
216
224
  };
@@ -229,7 +237,7 @@ var createChecks = exports.createChecks = function createChecks(context) {
229
237
  if (!(0, _eslintCodemodUtils.isNodeOfType)(node.parent, 'JSXExpressionContainer') || !(0, _eslintCodemodUtils.isNodeOfType)(node.parent.parent, 'JSXAttribute') || !(0, _eslintCodemodUtils.isNodeOfType)(node.parent.parent.parent, 'JSXOpeningElement')) {
230
238
  return;
231
239
  }
232
- if (node.name in legacyIconImports && (0, _eslintCodemodUtils.isNodeOfType)(node.parent.parent.name, 'JSXIdentifier') && node.parent.parent.name.name !== 'LEGACY_fallbackIcon') {
240
+ if (Object.keys(legacyIconImports).includes(node.name) && (0, _eslintCodemodUtils.isNodeOfType)(node.parent.parent.name, 'JSXIdentifier') && node.parent.parent.name.name !== 'LEGACY_fallbackIcon') {
233
241
  var _migrationMapObject$s;
234
242
  var migrationMapObject = (0, _helpers.getMigrationMapObject)(legacyIconImports[node.name].packageName);
235
243
  var upcomingIcon = (0, _helpers.getUpcomingIcons)(legacyIconImports[node.name].packageName);
@@ -238,16 +246,35 @@ var createChecks = exports.createChecks = function createChecks(context) {
238
246
  var isInNewButton = (0, _eslintCodemodUtils.isNodeOfType)(node.parent.parent.parent.name, 'JSXIdentifier') && newButtonImports.has(node.parent.parent.parent.name.name);
239
247
  if (newIcon && isInNewButton && isNewIconMigratable || upcomingIcon && isInNewButton && isNewIconMigratable) {
240
248
  (0, _helpers.createAutoMigrationError)(node, legacyIconImports[node.name].packageName, node.name, errorsAuto);
249
+ (0, _helpers.addToListOfRanges)(node, errorRanges);
241
250
  guidance[(0, _helpers.locToString)(node)] = (0, _helpers.createGuidance)(legacyIconImports[node.name].packageName, isInNewButton, 'medium');
242
251
  } else if (!newIcon && !upcomingIcon || !isNewIconMigratable) {
243
252
  (0, _helpers.createCantFindSuitableReplacementError)(node, legacyIconImports[node.name].packageName, node.name, errorsManual);
253
+ (0, _helpers.addToListOfRanges)(node, errorRanges);
244
254
  guidance[(0, _helpers.locToString)(node)] = (0, _helpers.createGuidance)(legacyIconImports[node.name].packageName, isInNewButton);
245
255
  } else if (!isInNewButton) {
246
256
  (0, _helpers.createCantMigrateFunctionUnknownError)(node, legacyIconImports[node.name].packageName, node.name, errorsManual);
257
+ (0, _helpers.addToListOfRanges)(node, errorRanges);
247
258
  guidance[(0, _helpers.locToString)(node)] = (0, _helpers.createGuidance)(legacyIconImports[node.name].packageName, isInNewButton);
248
259
  }
249
260
  }
250
261
  };
262
+ var checkIconReference = function checkIconReference(node) {
263
+ //check the reference to see if it's a legacy icon, if not exit early
264
+ if (!Object.keys(legacyIconImports).includes(node.name)) {
265
+ return;
266
+ }
267
+ //if this is an import statement then exit early
268
+ if (node.parent && ((0, _eslintCodemodUtils.isNodeOfType)(node.parent, 'ImportSpecifier') || (0, _eslintCodemodUtils.isNodeOfType)(node.parent, 'ImportDefaultSpecifier'))) {
269
+ return;
270
+ }
271
+ //if in Fallback prop, do not error
272
+ if (node.parent && node.parent.parent && (0, _eslintCodemodUtils.isNodeOfType)(node.parent.parent, 'JSXAttribute') && (0, _eslintCodemodUtils.isNodeOfType)(node.parent.parent.name, 'JSXIdentifier') && node.parent.parent.name.name === 'LEGACY_fallbackIcon') {
273
+ return;
274
+ }
275
+ // manually error
276
+ (0, _helpers.createCantMigrateIdentifierError)(node, legacyIconImports[node.name].packageName, node.name, errorsManual);
277
+ };
251
278
 
252
279
  /**
253
280
  * Checks if a legacy icon is being rendered and stores the errors in the global array
@@ -265,7 +292,7 @@ var createChecks = exports.createChecks = function createChecks(context) {
265
292
  }
266
293
  var name = node.openingElement.name.name;
267
294
  // Legacy icons rendered as JSX elements
268
- if (name in legacyIconImports) {
295
+ if (Object.keys(legacyIconImports).includes(name)) {
269
296
  var _node$parent2, _node$parent3, _size, _size2;
270
297
  // Determine if inside a new button - if so:
271
298
  // - Assume spread props are safe - still error if props explicitly set to unmigratable values
@@ -358,6 +385,7 @@ var createChecks = exports.createChecks = function createChecks(context) {
358
385
  } else if ((!newIcon && !upcomingIcon || !isNewIconMigratable) && size) {
359
386
  (0, _helpers.createCantFindSuitableReplacementError)(node, legacyIconImports[name].packageName, name, errorsManual, upcomingIcon ? true : migrationMapObject ? true : false);
360
387
  }
388
+ (0, _helpers.addToListOfRanges)(node, errorRanges);
361
389
  guidance[(0, _helpers.locToString)(node)] = (0, _helpers.createGuidance)(legacyIconImports[name].packageName, insideNewButton, size && (0, _helpers.isSize)(size) ? size : undefined);
362
390
  }
363
391
  };
@@ -367,14 +395,15 @@ var createChecks = exports.createChecks = function createChecks(context) {
367
395
  * @param node The function call node found by ESLint
368
396
  */
369
397
  var checkCallExpression = function checkCallExpression(node) {
370
- if ('arguments' in node && node.arguments.length) {
398
+ if (Object.keys(node).includes('arguments') && node.arguments.length) {
371
399
  var _iterator8 = _createForOfIteratorHelper(node.arguments),
372
400
  _step8;
373
401
  try {
374
402
  for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) {
375
403
  var arg = _step8.value;
376
- if ((0, _eslintCodemodUtils.isNodeOfType)(arg, 'Identifier') && arg.name in legacyIconImports && legacyIconImports[arg.name].packageName) {
404
+ if ((0, _eslintCodemodUtils.isNodeOfType)(arg, 'Identifier') && Object.keys(legacyIconImports).includes(arg.name) && legacyIconImports[arg.name].packageName) {
377
405
  (0, _helpers.createCantMigrateFunctionUnknownError)(node, legacyIconImports[arg.name].packageName, arg.name, errorsManual);
406
+ (0, _helpers.addToListOfRanges)(node, errorRanges);
378
407
  guidance[(0, _helpers.locToString)(node)] = (0, _helpers.createGuidance)(legacyIconImports[arg.name].packageName);
379
408
  }
380
409
  }
@@ -395,30 +424,41 @@ var createChecks = exports.createChecks = function createChecks(context) {
395
424
  var _Object$entries$_i = (0, _slicedToArray2.default)(_Object$entries[_i], 2),
396
425
  _key = _Object$entries$_i[0],
397
426
  errorList = _Object$entries$_i[1];
398
- var node = 'node' in errorList.errors[0] ? errorList.errors[0].node : null;
399
- if (node) {
400
- var guidanceMessage = _key in guidance ? guidance[_key] : '';
401
- context.report({
402
- node: node,
403
- messageId: 'noLegacyIconsManualMigration',
404
- data: {
405
- iconName: errorList.iconName,
406
- importSource: errorList.importSource,
407
- guidance: isQuietMode ? guidanceMessage : "".concat(guidanceMessage, "For more information see the below errors.\n")
408
- }
409
- });
410
- if (!isQuietMode) {
411
- var _iterator9 = _createForOfIteratorHelper(errorList.errors),
412
- _step9;
413
- try {
414
- for (_iterator9.s(); !(_step9 = _iterator9.n()).done;) {
415
- var error = _step9.value;
416
- context.report(error);
427
+ var _node = 'node' in errorList.errors[0] ? errorList.errors[0].node : null;
428
+ var cantMigrateIdentifierError = errorList.errors.find(function (x) {
429
+ return 'messageId' in x && x.messageId === 'cantMigrateIdentifier';
430
+ });
431
+ if (_node) {
432
+ var isInRange = false;
433
+ if (cantMigrateIdentifierError && (0, _helpers.isInRangeList)(_node, errorRanges)) {
434
+ isInRange = true;
435
+ }
436
+ if (isInRange && errorList.errors.length - 1 > 0 || !isInRange && errorList.errors.length > 0) {
437
+ var guidanceMessage = Object.keys(guidance).includes(_key) ? guidance[_key] : '';
438
+ context.report({
439
+ node: _node,
440
+ messageId: 'noLegacyIconsManualMigration',
441
+ data: {
442
+ iconName: errorList.iconName,
443
+ importSource: errorList.importSource,
444
+ guidance: isQuietMode ? guidanceMessage : "".concat(guidanceMessage, "For more information see the below errors.\n")
445
+ }
446
+ });
447
+ if (!isQuietMode) {
448
+ var _iterator9 = _createForOfIteratorHelper(errorList.errors),
449
+ _step9;
450
+ try {
451
+ for (_iterator9.s(); !(_step9 = _iterator9.n()).done;) {
452
+ var error = _step9.value;
453
+ if ('messageId' in error && (error.messageId !== 'cantMigrateIdentifier' || error.messageId === 'cantMigrateIdentifier' && !isInRange)) {
454
+ context.report(error);
455
+ }
456
+ }
457
+ } catch (err) {
458
+ _iterator9.e(err);
459
+ } finally {
460
+ _iterator9.f();
417
461
  }
418
- } catch (err) {
419
- _iterator9.e(err);
420
- } finally {
421
- _iterator9.f();
422
462
  }
423
463
  }
424
464
  }
@@ -431,14 +471,19 @@ var createChecks = exports.createChecks = function createChecks(context) {
431
471
  _error = _Object$entries2$_i[1];
432
472
  // If there's a manual error that exists for this same component,
433
473
  // don't throw the auto error
434
- if (_key2 in errorsManual) {
435
- delete errorsAuto[_key2];
436
- continue;
474
+ if (Object.keys(errorsManual).includes(_key2)) {
475
+ var _cantMigrateIdentifierError = errorsManual[_key2].errors.find(function (x) {
476
+ return 'messageId' in x && x.messageId === 'cantMigrateIdentifier';
477
+ });
478
+ if (!_cantMigrateIdentifierError || _cantMigrateIdentifierError && errorsManual[_key2].errors.length > 1) {
479
+ delete errorsAuto[_key2];
480
+ continue;
481
+ }
437
482
  }
438
- var _node = 'node' in _error ? _error.node : null;
439
- if (_node) {
440
- var _guidanceMessage = _key2 in guidance ? guidance[_key2] : '';
441
- if ('data' in _error && _error.data) {
483
+ var _node2 = 'node' in _error ? _error.node : null;
484
+ if (_node2) {
485
+ var _guidanceMessage = Object.keys(guidance).includes(_key2) ? guidance[_key2] : '';
486
+ if (Object.keys(_error).includes('data') && _error.data) {
442
487
  _error.data.guidance = _guidanceMessage;
443
488
  }
444
489
  context.report(_error);
@@ -455,6 +500,7 @@ var createChecks = exports.createChecks = function createChecks(context) {
455
500
  checkIconAsProp: checkIconAsProp,
456
501
  checkJSXElement: checkJSXElement,
457
502
  checkCallExpression: checkCallExpression,
458
- throwErrors: throwErrors
503
+ throwErrors: throwErrors,
504
+ checkIconReference: checkIconReference
459
505
  };
460
506
  };
@@ -5,7 +5,7 @@ var _typeof = require("@babel/runtime/helpers/typeof");
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.locToString = exports.isSize = exports.getUpcomingIcons = exports.getMigrationMapObject = exports.getLiteralStringValue = exports.createHelpers = exports.createGuidance = exports.createCantMigrateSpreadPropsError = exports.createCantMigrateSizeUnknown = exports.createCantMigrateReExportError = exports.createCantMigrateIdentifierError = exports.createCantMigrateFunctionUnknownError = exports.createCantMigrateColorError = exports.createCantFindSuitableReplacementError = exports.createAutoMigrationError = exports.canMigrateColor = exports.canAutoMigrateNewIconBasedOnSize = void 0;
8
+ exports.locToString = exports.isSize = exports.isInRangeList = exports.getUpcomingIcons = exports.getMigrationMapObject = exports.getLiteralStringValue = exports.createHelpers = exports.createGuidance = exports.createCantMigrateSpreadPropsError = exports.createCantMigrateSizeUnknown = exports.createCantMigrateReExportError = exports.createCantMigrateIdentifierMapOrArrayError = exports.createCantMigrateIdentifierError = exports.createCantMigrateFunctionUnknownError = exports.createCantMigrateColorError = exports.createCantFindSuitableReplacementError = exports.createAutoMigrationError = exports.canMigrateColor = exports.canAutoMigrateNewIconBasedOnSize = exports.addToListOfRanges = void 0;
9
9
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
10
10
  var _eslintCodemodUtils = require("eslint-codemod-utils");
11
11
  var _UNSAFE_migrationMap = _interopRequireWildcard(require("@atlaskit/icon/UNSAFE_migration-map"));
@@ -108,7 +108,7 @@ var createGuidance = exports.createGuidance = function createGuidance(iconPackag
108
108
  } else {
109
109
  _guidance += "No equivalent icon for this size, ".concat(size, ", in new set.");
110
110
  }
111
- _guidance += "".concat(migrationMapObject.sizeGuidance[size] in _UNSAFE_migrationMap.migrationOutcomeDescriptionMap ? " Please: ".concat(_UNSAFE_migrationMap.migrationOutcomeDescriptionMap[migrationMapObject.sizeGuidance[size]]) : ' No migration size advice given.', "\n");
111
+ _guidance += "".concat(Object.keys(_UNSAFE_migrationMap.migrationOutcomeDescriptionMap).includes(migrationMapObject.sizeGuidance[size]) ? " Please: ".concat(_UNSAFE_migrationMap.migrationOutcomeDescriptionMap[migrationMapObject.sizeGuidance[size]]) : ' No migration size advice given.', "\n");
112
112
  } else {
113
113
  _guidance = "Use ".concat(newIcon.name, " from ").concat(newIcon.package, "/").concat(newIcon.type, "/").concat(newIcon.name, " instead.\nMigration suggestions, depending on the legacy icon size:\n");
114
114
  Object.entries(migrationMapObject.sizeGuidance).forEach(function (_ref) {
@@ -116,7 +116,7 @@ var createGuidance = exports.createGuidance = function createGuidance(iconPackag
116
116
  size = _ref2[0],
117
117
  value = _ref2[1];
118
118
  _guidance += "\t- ".concat(size, ": ");
119
- if (!(value in _UNSAFE_migrationMap.migrationOutcomeDescriptionMap)) {
119
+ if (!Object.keys(_UNSAFE_migrationMap.migrationOutcomeDescriptionMap).includes(value)) {
120
120
  _guidance += 'No migration advice given.\n';
121
121
  } else {
122
122
  _guidance += "".concat(_UNSAFE_migrationMap.migrationOutcomeDescriptionMap[value], ".\n");
@@ -142,12 +142,12 @@ var createGuidance = exports.createGuidance = function createGuidance(iconPackag
142
142
  * @returns True if the color can be migrated, false otherwise
143
143
  */
144
144
  var canMigrateColor = exports.canMigrateColor = function canMigrateColor(color) {
145
- if (color.match(/^color\.text$/)) {
146
- return true;
147
- } else if (color.match(/^color\.icon/)) {
145
+ if (color.match(/^color\.icon/)) {
148
146
  return true;
149
147
  } else if (color.match(/^color\.link/)) {
150
148
  return true;
149
+ } else if (color.match(/^color\.text/)) {
150
+ return true;
151
151
  } else if (color === 'currentColor') {
152
152
  return true;
153
153
  } else {
@@ -155,8 +155,11 @@ var canMigrateColor = exports.canMigrateColor = function canMigrateColor(color)
155
155
  }
156
156
  };
157
157
  var locToString = exports.locToString = function locToString(node) {
158
- var _node$loc, _node$loc2, _node$loc3, _node$loc4;
159
- return "".concat((_node$loc = node.loc) === null || _node$loc === void 0 ? void 0 : _node$loc.start.line, ":").concat((_node$loc2 = node.loc) === null || _node$loc2 === void 0 ? void 0 : _node$loc2.start.column, ":").concat((_node$loc3 = node.loc) === null || _node$loc3 === void 0 ? void 0 : _node$loc3.end.line, ":").concat((_node$loc4 = node.loc) === null || _node$loc4 === void 0 ? void 0 : _node$loc4.end.column);
158
+ if (node.range && node.range.length >= 2) {
159
+ return "".concat(node.range[0], ":").concat(node.range[1]);
160
+ } else {
161
+ return '';
162
+ }
160
163
  };
161
164
  var createCantMigrateReExportError = exports.createCantMigrateReExportError = function createCantMigrateReExportError(node, packageName, exportName, errors) {
162
165
  var myError = {
@@ -169,10 +172,10 @@ var createCantMigrateReExportError = exports.createCantMigrateReExportError = fu
169
172
  };
170
173
  pushManualError(locToString(node), errors, myError, packageName, exportName);
171
174
  };
172
- var createCantMigrateIdentifierError = exports.createCantMigrateIdentifierError = function createCantMigrateIdentifierError(node, packageName, exportName, errors) {
175
+ var createCantMigrateIdentifierMapOrArrayError = exports.createCantMigrateIdentifierMapOrArrayError = function createCantMigrateIdentifierMapOrArrayError(node, packageName, exportName, errors) {
173
176
  var myError = {
174
177
  node: node,
175
- messageId: 'cantMigrateIdentifier',
178
+ messageId: 'cantMigrateIdentifierMapOrArray',
176
179
  data: {
177
180
  packageName: packageName,
178
181
  exportName: exportName
@@ -180,6 +183,17 @@ var createCantMigrateIdentifierError = exports.createCantMigrateIdentifierError
180
183
  };
181
184
  pushManualError(locToString(node), errors, myError, packageName, exportName);
182
185
  };
186
+ var createCantMigrateIdentifierError = exports.createCantMigrateIdentifierError = function createCantMigrateIdentifierError(node, packageName, exportName, errors) {
187
+ var myError = {
188
+ node: node,
189
+ messageId: 'cantMigrateIdentifier',
190
+ data: {
191
+ iconSource: packageName,
192
+ iconName: exportName
193
+ }
194
+ };
195
+ pushManualError(locToString(node), errors, myError, packageName, exportName);
196
+ };
183
197
  var createCantFindSuitableReplacementError = exports.createCantFindSuitableReplacementError = function createCantFindSuitableReplacementError(node, importSource, iconName, errors, sizeIssue) {
184
198
  var myError = {
185
199
  node: node,
@@ -242,7 +256,7 @@ var createAutoMigrationError = exports.createAutoMigrationError = function creat
242
256
  errors[locToString(node)] = myError;
243
257
  };
244
258
  var pushManualError = function pushManualError(key, errors, myError, importSource, iconName) {
245
- if (key in errors) {
259
+ if (Object.keys(errors).includes(key)) {
246
260
  errors[key].errors.push(myError);
247
261
  } else {
248
262
  errors[key] = {
@@ -290,7 +304,7 @@ var createHelpers = exports.createHelpers = function createHelpers(context) {
290
304
  * @returns defaultValue if the configuration flag is not set, the defaultValue of the configuration flag otherwise
291
305
  */
292
306
  var getConfigFlag = function getConfigFlag(key, defaultValue) {
293
- if (context.options.length > 0 && context.options[0] && key in context.options[0]) {
307
+ if (context.options.length > 0 && context.options[0] && Object.keys(context.options[0]).includes(key)) {
294
308
  return context.options[0][key] === !defaultValue ? !defaultValue : defaultValue;
295
309
  }
296
310
  return defaultValue;
@@ -307,4 +321,22 @@ var createHelpers = exports.createHelpers = function createHelpers(context) {
307
321
  getTokenCallValue: getTokenCallValue,
308
322
  getConfigFlag: getConfigFlag
309
323
  };
324
+ };
325
+ var addToListOfRanges = exports.addToListOfRanges = function addToListOfRanges(node, sortedListOfRangesForErrors) {
326
+ if (node.range && node.range.length >= 2) {
327
+ sortedListOfRangesForErrors.push({
328
+ start: node.range[0],
329
+ end: node.range[1]
330
+ });
331
+ }
332
+ };
333
+ var isInRangeList = exports.isInRangeList = function isInRangeList(node, sortedListOfRangesForErrors) {
334
+ var range = node.range;
335
+ if (!range || range.length < 2) {
336
+ return false;
337
+ }
338
+ var found = sortedListOfRangesForErrors.find(function (currRange) {
339
+ return range[0] >= currRange.start && range[1] <= currRange.end;
340
+ });
341
+ return !!found;
310
342
  };
@@ -41,8 +41,8 @@ var rule = (0, _createRule.createLintRule)({
41
41
  cantMigrateSpreadProps: "This usage of Icon uses spread props in a way that can't be automatically migrated. Please explicitly define the following props after spread: '{{missingProps}}' ",
42
42
  cantMigrateSizeUnknown: "This usage of Icon sets the size via a variable or function that can't be determined.",
43
43
  cantMigrateFunctionUnknown: "'{{iconName}}' from legacy '{{importSource}}' is used in unknown function/component. Please manually migrate this icon.",
44
- cantMigrateIdentifier: "This icon is passed to other components via a map or array, in a way that can't be automatically migrated. Please manually migrate wherever this expression is used and use the icon components directly.",
45
- cantMigrateUnsafeProp: "Property '{{propName}}' with value of '{{value}}' is unable to be auto-migrated to the new button. Please manually migrate this icon."
44
+ cantMigrateIdentifierMapOrArray: "This icon is passed to other components via a map or array, in a way that can't be automatically migrated. Please manually migrate wherever this expression is used and use the icon components directly.",
45
+ cantMigrateIdentifier: "This is a legacy icon, {{iconName}} from {{iconSource}}, being referenced. Please manually migrate."
46
46
  }
47
47
  },
48
48
  create: function create(context) {
@@ -58,7 +58,8 @@ var rule = (0, _createRule.createLintRule)({
58
58
  checkIconAsProp = _createChecks.checkIconAsProp,
59
59
  checkJSXElement = _createChecks.checkJSXElement,
60
60
  checkCallExpression = _createChecks.checkCallExpression,
61
- throwErrors = _createChecks.throwErrors;
61
+ throwErrors = _createChecks.throwErrors,
62
+ checkIconReference = _createChecks.checkIconReference;
62
63
  return (0, _errorBoundary.errorBoundary)({
63
64
  // Track imports of relevant components
64
65
  ImportDeclaration: checkImportDeclarations,
@@ -74,6 +75,7 @@ var rule = (0, _createRule.createLintRule)({
74
75
  JSXElement: checkJSXElement,
75
76
  // Icons called as an argument of a function (i.e. icon={DefaultIcon(AddIcon)})
76
77
  CallExpression: checkCallExpression,
78
+ Identifier: checkIconReference,
77
79
  'Program:exit': throwErrors
78
80
  }, failSilently);
79
81
  }
@@ -7,7 +7,8 @@ exports.getConfig = void 0;
7
7
  var defaults = {
8
8
  failSilently: false,
9
9
  patterns: ['native-elements'],
10
- enableUnsafeAutofix: false
10
+ enableUnsafeAutofix: false,
11
+ enableUnsafeReport: false
11
12
  };
12
13
  var getConfig = exports.getConfig = function getConfig(overrides) {
13
14
  return Object.assign({}, defaults, overrides);
@@ -28,63 +28,93 @@ var NativeElements = exports.NativeElements = {
28
28
  var context = _ref.context,
29
29
  config = _ref.config;
30
30
  // Check whether all criteria needed to make a transformation are met
31
- if (!NativeElements._check(node, {
32
- context: context,
33
- config: config
34
- })) {
35
- return;
36
- }
37
- var fix = NativeElements._fix(node, {
38
- context: context,
39
- config: config
40
- });
41
- context.report(_objectSpread({
42
- node: node,
43
- messageId: 'preferHeading'
44
- }, config.enableUnsafeAutofix ? {
45
- fix: fix
46
- } : {
47
- suggest: [{
48
- desc: "Convert to Heading",
31
+ var _NativeElements$_chec = NativeElements._check(node, {
32
+ context: context,
33
+ config: config
34
+ }),
35
+ success = _NativeElements$_chec.success,
36
+ autoFixable = _NativeElements$_chec.autoFixable;
37
+ if (success && autoFixable) {
38
+ var fix = NativeElements._fix(node, {
39
+ context: context,
40
+ config: config
41
+ });
42
+ context.report(_objectSpread({
43
+ node: node,
44
+ messageId: 'preferHeading'
45
+ }, config.enableUnsafeAutofix ? {
49
46
  fix: fix
50
- }]
51
- }));
47
+ } : {
48
+ suggest: [{
49
+ desc: "Convert to Heading",
50
+ fix: fix
51
+ }]
52
+ }));
53
+ } else if (success && config.enableUnsafeReport) {
54
+ context.report({
55
+ node: node,
56
+ messageId: 'preferHeading'
57
+ });
58
+ }
52
59
  },
53
60
  _check: function _check(node, _ref2) {
54
61
  var config = _ref2.config;
55
62
  if (!config.patterns.includes('native-elements')) {
56
- return false;
63
+ return {
64
+ success: false
65
+ };
57
66
  }
58
67
  if (!(0, _eslintCodemodUtils.isNodeOfType)(node, 'JSXElement')) {
59
- return false;
68
+ return {
69
+ success: false
70
+ };
60
71
  }
61
72
  if (!node.children.length) {
62
- return false;
63
- }
64
- if (!node.parent) {
65
- return false;
73
+ return {
74
+ success: false
75
+ };
66
76
  }
67
77
  var elementName = ast.JSXElement.getName(node);
68
78
  if (!Object.keys(tagSizeMap).includes(elementName)) {
69
- return false;
79
+ return {
80
+ success: false
81
+ };
82
+ }
83
+ if (!node.parent) {
84
+ return {
85
+ success: true,
86
+ autoFixable: false
87
+ };
70
88
  }
71
89
 
72
90
  // Element has to be first element of its siblings
73
91
  if (!((0, _eslintCodemodUtils.isNodeOfType)(node.parent, 'JSXElement') || (0, _eslintCodemodUtils.isNodeOfType)(node.parent, 'JSXFragment'))) {
74
- return false;
92
+ return {
93
+ success: true,
94
+ autoFixable: false
95
+ };
75
96
  }
76
97
  var siblings = ast.JSXElement.getChildren(node.parent);
77
98
  if (siblings.length > 1) {
78
99
  var _siblings$0$range, _node$range, _siblings$0$range2, _node$range2;
79
100
  // Only report if element is first child element
80
101
  if (((_siblings$0$range = siblings[0].range) === null || _siblings$0$range === void 0 ? void 0 : _siblings$0$range[0]) !== ((_node$range = node.range) === null || _node$range === void 0 ? void 0 : _node$range[0]) || ((_siblings$0$range2 = siblings[0].range) === null || _siblings$0$range2 === void 0 ? void 0 : _siblings$0$range2[1]) !== ((_node$range2 = node.range) === null || _node$range2 === void 0 ? void 0 : _node$range2[1])) {
81
- return false;
102
+ return {
103
+ success: true,
104
+ autoFixable: false
105
+ };
82
106
  }
83
107
  }
84
108
  if (!ast.JSXElement.hasAllowedAttrsOnly(node, _common.allowedAttrs)) {
85
- return false;
109
+ return {
110
+ success: true,
111
+ autoFixable: false
112
+ };
86
113
  }
87
- return true;
114
+ return {
115
+ success: true,
116
+ autoFixable: true
117
+ };
88
118
  },
89
119
  _fix: function _fix(node, _ref3) {
90
120
  var context = _ref3.context;
@@ -8,7 +8,8 @@ var defaults = {
8
8
  failSilently: false,
9
9
  patterns: ['paragraph-elements', 'span-elements', 'strong-elements', 'emphasis-elements'],
10
10
  inheritColor: false,
11
- enableUnsafeAutofix: false
11
+ enableUnsafeAutofix: false,
12
+ enableUnsafeReport: false
12
13
  };
13
14
  var getConfig = exports.getConfig = function getConfig(overrides) {
14
15
  return Object.assign({}, defaults, overrides);