@atlaskit/eslint-plugin-design-system 13.30.1 → 13.32.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 (51) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.md +75 -75
  3. package/dist/cjs/presets/all-flat.codegen.js +3 -3
  4. package/dist/cjs/presets/all.codegen.js +3 -3
  5. package/dist/cjs/presets/recommended-flat.codegen.js +2 -2
  6. package/dist/cjs/presets/recommended.codegen.js +2 -2
  7. package/dist/cjs/rules/index.codegen.js +5 -5
  8. package/dist/cjs/rules/lozenge-badge-tag-labelling-system-migration/index.js +712 -0
  9. package/dist/cjs/rules/no-placeholder/index.js +162 -0
  10. package/dist/es2019/presets/all-flat.codegen.js +3 -3
  11. package/dist/es2019/presets/all.codegen.js +3 -3
  12. package/dist/es2019/presets/recommended-flat.codegen.js +2 -2
  13. package/dist/es2019/presets/recommended.codegen.js +2 -2
  14. package/dist/es2019/rules/index.codegen.js +5 -5
  15. package/dist/es2019/rules/lozenge-badge-tag-labelling-system-migration/index.js +702 -0
  16. package/dist/es2019/rules/no-placeholder/index.js +142 -0
  17. package/dist/esm/presets/all-flat.codegen.js +3 -3
  18. package/dist/esm/presets/all.codegen.js +3 -3
  19. package/dist/esm/presets/recommended-flat.codegen.js +2 -2
  20. package/dist/esm/presets/recommended.codegen.js +2 -2
  21. package/dist/esm/rules/index.codegen.js +5 -5
  22. package/dist/esm/rules/lozenge-badge-tag-labelling-system-migration/index.js +705 -0
  23. package/dist/esm/rules/no-placeholder/index.js +154 -0
  24. package/dist/types/presets/all-flat.codegen.d.ts +1 -1
  25. package/dist/types/presets/all.codegen.d.ts +1 -1
  26. package/dist/types/presets/recommended-flat.codegen.d.ts +1 -1
  27. package/dist/types/presets/recommended.codegen.d.ts +1 -1
  28. package/dist/types/rules/index.codegen.d.ts +1 -1
  29. package/dist/types/rules/no-placeholder/index.d.ts +6 -0
  30. package/dist/types-ts4.5/presets/all-flat.codegen.d.ts +1 -1
  31. package/dist/types-ts4.5/presets/all.codegen.d.ts +1 -1
  32. package/dist/types-ts4.5/presets/recommended-flat.codegen.d.ts +1 -1
  33. package/dist/types-ts4.5/presets/recommended.codegen.d.ts +1 -1
  34. package/dist/types-ts4.5/rules/index.codegen.d.ts +1 -1
  35. package/dist/types-ts4.5/rules/no-placeholder/index.d.ts +6 -0
  36. package/package.json +2 -2
  37. package/dist/cjs/rules/lozenge-isBold-and-lozenge-badge-appearance-migration/index.js +0 -332
  38. package/dist/cjs/rules/no-utility-icons/checks.js +0 -246
  39. package/dist/cjs/rules/no-utility-icons/index.js +0 -49
  40. package/dist/es2019/rules/lozenge-isBold-and-lozenge-badge-appearance-migration/index.js +0 -324
  41. package/dist/es2019/rules/no-utility-icons/checks.js +0 -177
  42. package/dist/es2019/rules/no-utility-icons/index.js +0 -44
  43. package/dist/esm/rules/lozenge-isBold-and-lozenge-badge-appearance-migration/index.js +0 -326
  44. package/dist/esm/rules/no-utility-icons/checks.js +0 -239
  45. package/dist/esm/rules/no-utility-icons/index.js +0 -43
  46. package/dist/types/rules/lozenge-isBold-and-lozenge-badge-appearance-migration/index.d.ts +0 -3
  47. package/dist/types/rules/no-utility-icons/checks.d.ts +0 -10
  48. package/dist/types/rules/no-utility-icons/index.d.ts +0 -3
  49. package/dist/types-ts4.5/rules/no-utility-icons/checks.d.ts +0 -10
  50. /package/dist/{types-ts4.5/rules/no-utility-icons → types/rules/lozenge-badge-tag-labelling-system-migration}/index.d.ts +0 -0
  51. /package/dist/types-ts4.5/rules/{lozenge-isBold-and-lozenge-badge-appearance-migration → lozenge-badge-tag-labelling-system-migration}/index.d.ts +0 -0
@@ -0,0 +1,142 @@
1
+ import { isNodeOfType } from 'eslint-codemod-utils';
2
+ import * as ast from '../../ast-nodes';
3
+ import { createLintRule } from '../utils/create-rule';
4
+ export const AFFECTED_HTML_ELEMENTS = ['input', 'textarea'];
5
+ export const AFFECTED_ATLASKIT_PACKAGES = {
6
+ '@atlaskit/datetime-picker': ['DatePicker', 'TimePicker', 'DateTimePicker'],
7
+ '@atlaskit/select': ['default', 'AsyncCreatableSelect', 'CheckboxSelect', 'CountrySelect', 'CreatableSelect', 'PopupSelect', 'RadioSelect'],
8
+ '@atlaskit/textarea': ['default'],
9
+ '@atlaskit/textfield': ['default']
10
+ };
11
+ export const ATLASKIT_FORM_PACKAGE = '@atlaskit/form';
12
+ export const ATLASKIT_FIELD_IMPORT = 'Field';
13
+ const rule = createLintRule({
14
+ meta: {
15
+ name: 'no-placeholder',
16
+ type: 'problem',
17
+ docs: {
18
+ description: 'Placeholders should not be used. If information should be given to the user about the proper type or formatting of a value, this should be included using a helper message that is associated to the input instead.',
19
+ recommended: true,
20
+ severity: 'warn'
21
+ },
22
+ messages: {
23
+ noPlaceholder: 'Placeholders should not be used. Use separate information to help users associated using `aria-describedby` instead.',
24
+ noPlaceholderOnSimpleField: 'Placeholders should not be used. Use the `helperMessage` prop instead.',
25
+ noPlaceholderOnComplexField: 'Placeholders should not be used. Use the `HelperMessage` component instead.'
26
+ }
27
+ },
28
+ create(context) {
29
+ let hasFieldImport = false;
30
+ let fieldLocalName = null;
31
+ const localComponentNames = [];
32
+ return {
33
+ ImportDeclaration(node) {
34
+ const source = node.source.value;
35
+ if (typeof source !== 'string') {
36
+ return;
37
+ }
38
+
39
+ // Ignore non-atlaskit input/form packages
40
+ if (!Object.keys(AFFECTED_ATLASKIT_PACKAGES).includes(source) && ATLASKIT_FORM_PACKAGE !== source) {
41
+ return;
42
+ }
43
+ if (!node.specifiers.length) {
44
+ return;
45
+ }
46
+ const defaultImport = node.specifiers.filter(spec => spec.type === 'ImportDefaultSpecifier');
47
+ const namedImport = node.specifiers.filter(spec => spec.type === 'ImportSpecifier');
48
+ if (source === ATLASKIT_FORM_PACKAGE) {
49
+ if (namedImport.length && namedImport[0].type === 'ImportSpecifier' && 'name' in namedImport[0].imported && namedImport[0].imported.name === ATLASKIT_FIELD_IMPORT) {
50
+ hasFieldImport = true;
51
+ fieldLocalName = namedImport[0].local.name;
52
+ }
53
+ } else {
54
+ const importNames = AFFECTED_ATLASKIT_PACKAGES[source];
55
+ const usesDefaultImport = importNames.includes('default');
56
+ const possibleNamedImports = importNames.filter(importName => importName !== 'default');
57
+ if (usesDefaultImport && defaultImport.length && defaultImport[0].local) {
58
+ localComponentNames.push(defaultImport[0].local.name);
59
+ // or if popup and using a named import
60
+ } else if (possibleNamedImports.length >= 1 && namedImport.length) {
61
+ namedImport.forEach(imp => {
62
+ if (imp.type === 'ImportSpecifier' && 'name' in imp.imported && possibleNamedImports.includes(imp.imported.name)) {
63
+ localComponentNames.push(imp.local.name);
64
+ }
65
+ });
66
+ }
67
+ }
68
+ },
69
+ JSXElement(node) {
70
+ if (!isNodeOfType(node, 'JSXElement')) {
71
+ return false;
72
+ }
73
+ const elName = ast.JSXElement.getName(node);
74
+ if (!elName) {
75
+ return false;
76
+ }
77
+
78
+ // If it is one of the affected native HTML elements
79
+ if (AFFECTED_HTML_ELEMENTS.includes(elName)) {
80
+ // if has a placeholder attribute
81
+ const hasPlaceholderAttribute = node.openingElement.attributes.find(attr => isNodeOfType(attr, 'JSXAttribute') && attr.name.name === 'placeholder');
82
+ if (hasPlaceholderAttribute) {
83
+ return context.report({
84
+ node: node.openingElement,
85
+ messageId: 'noPlaceholder'
86
+ });
87
+ }
88
+ // Else, it is a React component
89
+ } else {
90
+ // if none of the affected packages is imported, return
91
+ if (localComponentNames.length === 0) {
92
+ return;
93
+ }
94
+ // if component name is not in the list, exit
95
+ if (!isNodeOfType(node.openingElement.name, 'JSXIdentifier') || !localComponentNames.includes(node.openingElement.name.name)) {
96
+ return;
97
+ }
98
+ if (hasFieldImport && fieldLocalName) {
99
+ let _node = node;
100
+ let hasParentField = false;
101
+ let fieldType = 'Complex';
102
+ // If node is a Field element or if
103
+ while (isNodeOfType(_node, 'JSXElement') && isNodeOfType(_node.openingElement.name, 'JSXIdentifier') && !hasParentField) {
104
+ const name = _node.openingElement.name.name;
105
+ hasParentField = hasParentField || name === fieldLocalName;
106
+ _node = _node.parent;
107
+ // Skip up until a JSXElement or JSXAttribute is reached
108
+ if (isNodeOfType(_node, 'JSXFragment') || isNodeOfType(_node, 'ArrowFunctionExpression') || isNodeOfType(_node, 'JSXExpressionContainer') || isNodeOfType(_node, 'JSXAttribute')) {
109
+ while (_node && !isNodeOfType(_node, 'JSXElement') && !isNodeOfType(_node, 'Program')) {
110
+ if (isNodeOfType(_node, 'JSXAttribute')) {
111
+ fieldType = 'Simple';
112
+ }
113
+ _node = _node.parent;
114
+ }
115
+ }
116
+ }
117
+ if (hasParentField) {
118
+ // if has a placeholder attribute
119
+ const hasPlaceholderAttribute = node.openingElement.attributes.find(attr => isNodeOfType(attr, 'JSXAttribute') && attr.name.name === 'placeholder');
120
+ if (hasPlaceholderAttribute) {
121
+ return context.report({
122
+ node: node.openingElement,
123
+ messageId: `noPlaceholderOn${fieldType}Field`
124
+ });
125
+ }
126
+ }
127
+ } else {
128
+ // if has a placeholder attribute
129
+ const hasPlaceholderAttribute = node.openingElement.attributes.find(attr => isNodeOfType(attr, 'JSXAttribute') && attr.name.name === 'placeholder');
130
+ if (hasPlaceholderAttribute) {
131
+ return context.report({
132
+ node: node.openingElement,
133
+ messageId: 'noPlaceholder'
134
+ });
135
+ }
136
+ }
137
+ }
138
+ }
139
+ };
140
+ }
141
+ });
142
+ export default rule;
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * THIS FILE WAS CREATED VIA CODEGEN DO NOT MODIFY {@see http://go/af-codegen}
3
- * @codegen <<SignedSource::131350ebc877f42247042c6e7327fe18>>
3
+ * @codegen <<SignedSource::4fa72535ce2bc0a19a6fb01c951150db>>
4
4
  * @codegenCommand yarn workspace @atlaskit/eslint-plugin-design-system codegen
5
5
  */
6
6
 
@@ -15,7 +15,7 @@ var rules = {
15
15
  '@atlaskit/design-system/ensure-icon-color': 'error',
16
16
  '@atlaskit/design-system/ensure-proper-xcss-usage': 'error',
17
17
  '@atlaskit/design-system/icon-label': 'warn',
18
- '@atlaskit/design-system/lozenge-isBold-and-lozenge-badge-appearance-migration': 'warn',
18
+ '@atlaskit/design-system/lozenge-badge-tag-labelling-system-migration': 'warn',
19
19
  '@atlaskit/design-system/no-banned-imports': 'error',
20
20
  '@atlaskit/design-system/no-boolean-autofocus-on-modal-dialog': 'warn',
21
21
  '@atlaskit/design-system/no-css-tagged-template-expression': 'error',
@@ -45,6 +45,7 @@ var rules = {
45
45
  '@atlaskit/design-system/no-margin': 'warn',
46
46
  '@atlaskit/design-system/no-nested-styles': 'error',
47
47
  '@atlaskit/design-system/no-physical-properties': 'error',
48
+ '@atlaskit/design-system/no-placeholder': 'warn',
48
49
  '@atlaskit/design-system/no-separator-with-list-elements': 'warn',
49
50
  '@atlaskit/design-system/no-styled-tagged-template-expression': 'error',
50
51
  '@atlaskit/design-system/no-to-match-snapshot': 'error',
@@ -53,7 +54,6 @@ var rules = {
53
54
  '@atlaskit/design-system/no-unsafe-style-overrides': 'warn',
54
55
  '@atlaskit/design-system/no-unsupported-drag-and-drop-libraries': 'error',
55
56
  '@atlaskit/design-system/no-unused-css-map': 'warn',
56
- '@atlaskit/design-system/no-utility-icons': 'warn',
57
57
  '@atlaskit/design-system/prefer-primitives': 'warn',
58
58
  '@atlaskit/design-system/use-button-group-label': 'warn',
59
59
  '@atlaskit/design-system/use-character-counter-field': 'warn',
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * THIS FILE WAS CREATED VIA CODEGEN DO NOT MODIFY {@see http://go/af-codegen}
3
- * @codegen <<SignedSource::b3ddf9ee0a27aaf8a318a6579d48ce99>>
3
+ * @codegen <<SignedSource::dcf6bf4496c97fd6ad4c1d8d65337a6b>>
4
4
  * @codegenCommand yarn workspace @atlaskit/eslint-plugin-design-system codegen
5
5
  */
6
6
 
@@ -14,7 +14,7 @@ var rules = {
14
14
  '@atlaskit/design-system/ensure-icon-color': 'error',
15
15
  '@atlaskit/design-system/ensure-proper-xcss-usage': 'error',
16
16
  '@atlaskit/design-system/icon-label': 'warn',
17
- '@atlaskit/design-system/lozenge-isBold-and-lozenge-badge-appearance-migration': 'warn',
17
+ '@atlaskit/design-system/lozenge-badge-tag-labelling-system-migration': 'warn',
18
18
  '@atlaskit/design-system/no-banned-imports': 'error',
19
19
  '@atlaskit/design-system/no-boolean-autofocus-on-modal-dialog': 'warn',
20
20
  '@atlaskit/design-system/no-css-tagged-template-expression': 'error',
@@ -44,6 +44,7 @@ var rules = {
44
44
  '@atlaskit/design-system/no-margin': 'warn',
45
45
  '@atlaskit/design-system/no-nested-styles': 'error',
46
46
  '@atlaskit/design-system/no-physical-properties': 'error',
47
+ '@atlaskit/design-system/no-placeholder': 'warn',
47
48
  '@atlaskit/design-system/no-separator-with-list-elements': 'warn',
48
49
  '@atlaskit/design-system/no-styled-tagged-template-expression': 'error',
49
50
  '@atlaskit/design-system/no-to-match-snapshot': 'error',
@@ -52,7 +53,6 @@ var rules = {
52
53
  '@atlaskit/design-system/no-unsafe-style-overrides': 'warn',
53
54
  '@atlaskit/design-system/no-unsupported-drag-and-drop-libraries': 'error',
54
55
  '@atlaskit/design-system/no-unused-css-map': 'warn',
55
- '@atlaskit/design-system/no-utility-icons': 'warn',
56
56
  '@atlaskit/design-system/prefer-primitives': 'warn',
57
57
  '@atlaskit/design-system/use-button-group-label': 'warn',
58
58
  '@atlaskit/design-system/use-character-counter-field': 'warn',
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * THIS FILE WAS CREATED VIA CODEGEN DO NOT MODIFY {@see http://go/af-codegen}
3
- * @codegen <<SignedSource::ba71ef89188bdc20d0ec948cc00f6436>>
3
+ * @codegen <<SignedSource::27c9a3631c47b134bfb9da3e921e0601>>
4
4
  * @codegenCommand yarn workspace @atlaskit/eslint-plugin-design-system codegen
5
5
  */
6
6
 
@@ -32,12 +32,12 @@ var rules = {
32
32
  allowedFunctionCalls: [['@atlaskit/tokens', 'token']]
33
33
  }],
34
34
  '@atlaskit/design-system/no-nested-styles': 'error',
35
+ '@atlaskit/design-system/no-placeholder': 'warn',
35
36
  '@atlaskit/design-system/no-separator-with-list-elements': 'warn',
36
37
  '@atlaskit/design-system/no-unsafe-design-token-usage': 'error',
37
38
  '@atlaskit/design-system/no-unsafe-style-overrides': 'warn',
38
39
  '@atlaskit/design-system/no-unsupported-drag-and-drop-libraries': 'error',
39
40
  '@atlaskit/design-system/no-unused-css-map': 'warn',
40
- '@atlaskit/design-system/no-utility-icons': 'warn',
41
41
  '@atlaskit/design-system/use-button-group-label': 'warn',
42
42
  '@atlaskit/design-system/use-character-counter-field': 'warn',
43
43
  '@atlaskit/design-system/use-correct-field': 'warn',
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * THIS FILE WAS CREATED VIA CODEGEN DO NOT MODIFY {@see http://go/af-codegen}
3
- * @codegen <<SignedSource::5c119e0ab08e1f39d471b2b827bbb4de>>
3
+ * @codegen <<SignedSource::52a31bc6cdeb7a9818a0e225d21c88f2>>
4
4
  * @codegenCommand yarn workspace @atlaskit/eslint-plugin-design-system codegen
5
5
  */
6
6
 
@@ -31,12 +31,12 @@ var rules = {
31
31
  allowedFunctionCalls: [['@atlaskit/tokens', 'token']]
32
32
  }],
33
33
  '@atlaskit/design-system/no-nested-styles': 'error',
34
+ '@atlaskit/design-system/no-placeholder': 'warn',
34
35
  '@atlaskit/design-system/no-separator-with-list-elements': 'warn',
35
36
  '@atlaskit/design-system/no-unsafe-design-token-usage': 'error',
36
37
  '@atlaskit/design-system/no-unsafe-style-overrides': 'warn',
37
38
  '@atlaskit/design-system/no-unsupported-drag-and-drop-libraries': 'error',
38
39
  '@atlaskit/design-system/no-unused-css-map': 'warn',
39
- '@atlaskit/design-system/no-utility-icons': 'warn',
40
40
  '@atlaskit/design-system/use-button-group-label': 'warn',
41
41
  '@atlaskit/design-system/use-character-counter-field': 'warn',
42
42
  '@atlaskit/design-system/use-correct-field': 'warn',
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * THIS FILE WAS CREATED VIA CODEGEN DO NOT MODIFY {@see http://go/af-codegen}
3
- * @codegen <<SignedSource::02be73e0813b6f22038f0f3f2ad6865d>>
3
+ * @codegen <<SignedSource::ca89575f70ae79af2f43113bdc77c0c5>>
4
4
  * @codegenCommand yarn workspace @atlaskit/eslint-plugin-design-system codegen
5
5
  */
6
6
 
@@ -11,7 +11,7 @@ import ensureDesignTokenUsagePreview from './ensure-design-token-usage-preview';
11
11
  import ensureIconColor from './ensure-icon-color';
12
12
  import ensureProperXcssUsage from './ensure-proper-xcss-usage';
13
13
  import iconLabel from './icon-label';
14
- import lozengeIsBoldAndLozengeBadgeAppearanceMigration from './lozenge-isBold-and-lozenge-badge-appearance-migration';
14
+ import lozengeBadgeTagLabellingSystemMigration from './lozenge-badge-tag-labelling-system-migration';
15
15
  import noBannedImports from './no-banned-imports';
16
16
  import noBooleanAutofocusOnModalDialog from './no-boolean-autofocus-on-modal-dialog';
17
17
  import noCssTaggedTemplateExpression from './no-css-tagged-template-expression';
@@ -42,6 +42,7 @@ import noLegacyIcons from './no-legacy-icons';
42
42
  import noMargin from './no-margin';
43
43
  import noNestedStyles from './no-nested-styles';
44
44
  import noPhysicalProperties from './no-physical-properties';
45
+ import noPlaceholder from './no-placeholder';
45
46
  import noSeparatorWithListElements from './no-separator-with-list-elements';
46
47
  import noStyledTaggedTemplateExpression from './no-styled-tagged-template-expression';
47
48
  import noToMatchSnapshot from './no-to-match-snapshot';
@@ -50,7 +51,6 @@ import noUnsafeInlineSnapshot from './no-unsafe-inline-snapshot';
50
51
  import noUnsafeStyleOverrides from './no-unsafe-style-overrides';
51
52
  import noUnsupportedDragAndDropLibraries from './no-unsupported-drag-and-drop-libraries';
52
53
  import noUnusedCssMap from './no-unused-css-map';
53
- import noUtilityIcons from './no-utility-icons';
54
54
  import preferPrimitives from './prefer-primitives';
55
55
  import useButtonGroupLabel from './use-button-group-label';
56
56
  import useCharacterCounterField from './use-character-counter-field';
@@ -85,7 +85,7 @@ export var rules = {
85
85
  'ensure-icon-color': ensureIconColor,
86
86
  'ensure-proper-xcss-usage': ensureProperXcssUsage,
87
87
  'icon-label': iconLabel,
88
- 'lozenge-isBold-and-lozenge-badge-appearance-migration': lozengeIsBoldAndLozengeBadgeAppearanceMigration,
88
+ 'lozenge-badge-tag-labelling-system-migration': lozengeBadgeTagLabellingSystemMigration,
89
89
  'no-banned-imports': noBannedImports,
90
90
  'no-boolean-autofocus-on-modal-dialog': noBooleanAutofocusOnModalDialog,
91
91
  'no-css-tagged-template-expression': noCssTaggedTemplateExpression,
@@ -116,6 +116,7 @@ export var rules = {
116
116
  'no-margin': noMargin,
117
117
  'no-nested-styles': noNestedStyles,
118
118
  'no-physical-properties': noPhysicalProperties,
119
+ 'no-placeholder': noPlaceholder,
119
120
  'no-separator-with-list-elements': noSeparatorWithListElements,
120
121
  'no-styled-tagged-template-expression': noStyledTaggedTemplateExpression,
121
122
  'no-to-match-snapshot': noToMatchSnapshot,
@@ -124,7 +125,6 @@ export var rules = {
124
125
  'no-unsafe-style-overrides': noUnsafeStyleOverrides,
125
126
  'no-unsupported-drag-and-drop-libraries': noUnsupportedDragAndDropLibraries,
126
127
  'no-unused-css-map': noUnusedCssMap,
127
- 'no-utility-icons': noUtilityIcons,
128
128
  'prefer-primitives': preferPrimitives,
129
129
  'use-button-group-label': useButtonGroupLabel,
130
130
  'use-character-counter-field': useCharacterCounterField,