@atlaskit/eslint-plugin-platform 0.12.0 → 0.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 (91) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/README.md +3 -1
  3. package/afm-cc/tsconfig.json +1 -2
  4. package/afm-jira/tsconfig.json +19 -19
  5. package/dist/cjs/index.js +40 -22
  6. package/dist/cjs/rules/compiled/expand-border-shorthand/index.js +100 -0
  7. package/dist/cjs/rules/{no-alias → feature-gating/no-alias}/index.js +1 -1
  8. package/dist/cjs/rules/{prefer-fg → feature-gating/prefer-fg}/index.js +1 -1
  9. package/dist/cjs/rules/{static-feature-flags → feature-gating/static-feature-flags}/index.js +1 -1
  10. package/dist/cjs/rules/{utils.js → feature-gating/utils.js} +1 -1
  11. package/dist/es2019/index.js +41 -20
  12. package/dist/es2019/rules/compiled/expand-border-shorthand/index.js +92 -0
  13. package/dist/es2019/rules/{no-alias → feature-gating/no-alias}/index.js +1 -1
  14. package/dist/es2019/rules/{prefer-fg → feature-gating/prefer-fg}/index.js +1 -1
  15. package/dist/es2019/rules/{static-feature-flags → feature-gating/static-feature-flags}/index.js +1 -1
  16. package/dist/es2019/rules/{utils.js → feature-gating/utils.js} +1 -1
  17. package/dist/esm/index.js +40 -22
  18. package/dist/esm/rules/compiled/expand-border-shorthand/index.js +94 -0
  19. package/dist/esm/rules/{no-alias → feature-gating/no-alias}/index.js +1 -1
  20. package/dist/esm/rules/{prefer-fg → feature-gating/prefer-fg}/index.js +1 -1
  21. package/dist/esm/rules/{static-feature-flags → feature-gating/static-feature-flags}/index.js +1 -1
  22. package/dist/esm/rules/{utils.js → feature-gating/utils.js} +1 -1
  23. package/dist/types/index.d.ts +30 -6
  24. package/dist/types/rules/compiled/expand-border-shorthand/index.d.ts +3 -0
  25. package/dist/types-ts4.5/index.d.ts +30 -6
  26. package/dist/types-ts4.5/rules/compiled/expand-border-shorthand/index.d.ts +3 -0
  27. package/package.json +2 -2
  28. package/src/index.tsx +45 -20
  29. package/src/rules/compiled/README.md +3 -0
  30. package/src/rules/compiled/expand-border-shorthand/README.md +51 -0
  31. package/src/rules/compiled/expand-border-shorthand/__tests__/rule.test.ts +186 -0
  32. package/src/rules/compiled/expand-border-shorthand/index.ts +109 -0
  33. package/src/rules/feature-gating/README.md +8 -0
  34. package/src/rules/{inline-usage → feature-gating/inline-usage}/__tests__/rule.test.tsx +1 -1
  35. package/src/rules/{no-alias → feature-gating/no-alias}/__tests__/rule.test.tsx +1 -1
  36. package/src/rules/{no-alias → feature-gating/no-alias}/index.tsx +1 -1
  37. package/src/rules/{no-module-level-eval → feature-gating/no-module-level-eval}/__tests__/test.tsx +1 -1
  38. package/src/rules/{no-module-level-eval-nav4 → feature-gating/no-module-level-eval-nav4}/__tests__/test.tsx +1 -1
  39. package/src/rules/{no-preconditioning → feature-gating/no-preconditioning}/__tests__/rule.test.tsx +1 -1
  40. package/src/rules/{prefer-fg → feature-gating/prefer-fg}/__tests__/rule.test.tsx +1 -1
  41. package/src/rules/{prefer-fg → feature-gating/prefer-fg}/index.tsx +1 -1
  42. package/src/rules/{static-feature-flags → feature-gating/static-feature-flags}/__tests__/test.tsx +1 -1
  43. package/src/rules/{static-feature-flags → feature-gating/static-feature-flags}/index.tsx +1 -1
  44. package/src/rules/{use-recommended-utils → feature-gating/use-recommended-utils}/__tests__/rule.test.tsx +1 -1
  45. package/src/rules/{utils.tsx → feature-gating/utils.tsx} +1 -1
  46. /package/dist/cjs/rules/{inline-usage → feature-gating/inline-usage}/index.js +0 -0
  47. /package/dist/cjs/rules/{no-module-level-eval → feature-gating/no-module-level-eval}/index.js +0 -0
  48. /package/dist/cjs/rules/{no-module-level-eval-nav4 → feature-gating/no-module-level-eval-nav4}/index.js +0 -0
  49. /package/dist/cjs/rules/{no-preconditioning → feature-gating/no-preconditioning}/index.js +0 -0
  50. /package/dist/cjs/rules/{use-recommended-utils → feature-gating/use-recommended-utils}/index.js +0 -0
  51. /package/dist/es2019/rules/{inline-usage → feature-gating/inline-usage}/index.js +0 -0
  52. /package/dist/es2019/rules/{no-module-level-eval → feature-gating/no-module-level-eval}/index.js +0 -0
  53. /package/dist/es2019/rules/{no-module-level-eval-nav4 → feature-gating/no-module-level-eval-nav4}/index.js +0 -0
  54. /package/dist/es2019/rules/{no-preconditioning → feature-gating/no-preconditioning}/index.js +0 -0
  55. /package/dist/es2019/rules/{use-recommended-utils → feature-gating/use-recommended-utils}/index.js +0 -0
  56. /package/dist/esm/rules/{inline-usage → feature-gating/inline-usage}/index.js +0 -0
  57. /package/dist/esm/rules/{no-module-level-eval → feature-gating/no-module-level-eval}/index.js +0 -0
  58. /package/dist/esm/rules/{no-module-level-eval-nav4 → feature-gating/no-module-level-eval-nav4}/index.js +0 -0
  59. /package/dist/esm/rules/{no-preconditioning → feature-gating/no-preconditioning}/index.js +0 -0
  60. /package/dist/esm/rules/{use-recommended-utils → feature-gating/use-recommended-utils}/index.js +0 -0
  61. /package/dist/types/rules/{inline-usage → feature-gating/inline-usage}/index.d.ts +0 -0
  62. /package/dist/types/rules/{no-alias → feature-gating/no-alias}/index.d.ts +0 -0
  63. /package/dist/types/rules/{no-module-level-eval → feature-gating/no-module-level-eval}/index.d.ts +0 -0
  64. /package/dist/types/rules/{no-module-level-eval-nav4 → feature-gating/no-module-level-eval-nav4}/index.d.ts +0 -0
  65. /package/dist/types/rules/{no-preconditioning → feature-gating/no-preconditioning}/index.d.ts +0 -0
  66. /package/dist/types/rules/{prefer-fg → feature-gating/prefer-fg}/index.d.ts +0 -0
  67. /package/dist/types/rules/{static-feature-flags → feature-gating/static-feature-flags}/index.d.ts +0 -0
  68. /package/dist/types/rules/{use-recommended-utils → feature-gating/use-recommended-utils}/index.d.ts +0 -0
  69. /package/dist/types/rules/{utils.d.ts → feature-gating/utils.d.ts} +0 -0
  70. /package/dist/types-ts4.5/rules/{inline-usage → feature-gating/inline-usage}/index.d.ts +0 -0
  71. /package/dist/types-ts4.5/rules/{no-alias → feature-gating/no-alias}/index.d.ts +0 -0
  72. /package/dist/types-ts4.5/rules/{no-module-level-eval → feature-gating/no-module-level-eval}/index.d.ts +0 -0
  73. /package/dist/types-ts4.5/rules/{no-module-level-eval-nav4 → feature-gating/no-module-level-eval-nav4}/index.d.ts +0 -0
  74. /package/dist/types-ts4.5/rules/{no-preconditioning → feature-gating/no-preconditioning}/index.d.ts +0 -0
  75. /package/dist/types-ts4.5/rules/{prefer-fg → feature-gating/prefer-fg}/index.d.ts +0 -0
  76. /package/dist/types-ts4.5/rules/{static-feature-flags → feature-gating/static-feature-flags}/index.d.ts +0 -0
  77. /package/dist/types-ts4.5/rules/{use-recommended-utils → feature-gating/use-recommended-utils}/index.d.ts +0 -0
  78. /package/dist/types-ts4.5/rules/{utils.d.ts → feature-gating/utils.d.ts} +0 -0
  79. /package/src/rules/{inline-usage → feature-gating/inline-usage}/README.md +0 -0
  80. /package/src/rules/{inline-usage → feature-gating/inline-usage}/index.tsx +0 -0
  81. /package/src/rules/{no-alias → feature-gating/no-alias}/README.md +0 -0
  82. /package/src/rules/{no-module-level-eval → feature-gating/no-module-level-eval}/README.md +0 -0
  83. /package/src/rules/{no-module-level-eval → feature-gating/no-module-level-eval}/index.tsx +0 -0
  84. /package/src/rules/{no-module-level-eval-nav4 → feature-gating/no-module-level-eval-nav4}/README.md +0 -0
  85. /package/src/rules/{no-module-level-eval-nav4 → feature-gating/no-module-level-eval-nav4}/index.tsx +0 -0
  86. /package/src/rules/{no-preconditioning → feature-gating/no-preconditioning}/README.md +0 -0
  87. /package/src/rules/{no-preconditioning → feature-gating/no-preconditioning}/index.tsx +0 -0
  88. /package/src/rules/{prefer-fg → feature-gating/prefer-fg}/README.md +0 -0
  89. /package/src/rules/{static-feature-flags → feature-gating/static-feature-flags}/README.md +0 -0
  90. /package/src/rules/{use-recommended-utils → feature-gating/use-recommended-utils}/README.md +0 -0
  91. /package/src/rules/{use-recommended-utils → feature-gating/use-recommended-utils}/index.tsx +0 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # @atlaskit/eslint-plugin-platform
2
2
 
3
+ ## 0.13.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#169492](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/169492)
8
+ [`31cbda90535ea`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/31cbda90535ea) -
9
+ New eslint rule to expand css shorthand property 'border' into 'borderWidth',
10
+ 'borderStyle','borderColor'
11
+
3
12
  ## 0.12.0
4
13
 
5
14
  ### Minor Changes
package/README.md CHANGED
@@ -1,6 +1,8 @@
1
1
  # Atlassian platform ESLint Plugin
2
2
 
3
- This plugin contains eslint plugins that are to be used when working on Atlassian platform
3
+ This plugin contains eslint rules that are to be used when working on Atlassian platform or common
4
+ rules that are product agnostic.
4
5
 
5
6
  ## Installation
7
+
6
8
  Not intended for use outside the Atlassian frontend repository.
@@ -4,8 +4,7 @@
4
4
  "target": "es5",
5
5
  "composite": true,
6
6
  "outDir": "../dist",
7
- "rootDir": "../",
8
- "baseUrl": "../"
7
+ "rootDir": "../"
9
8
  },
10
9
  "include": [
11
10
  "../src/**/*.ts",
@@ -1,20 +1,20 @@
1
1
  {
2
- "extends": "../../../../tsconfig.entry-points.jira.json",
3
- "compilerOptions": {
4
- "target": "es5",
5
- "outDir": "../../../../../tsDist/@atlaskit__eslint-plugin-platform/app",
6
- "composite": true,
7
- "rootDir": "../"
8
- },
9
- "include": [
10
- "../src/**/*.ts",
11
- "../src/**/*.tsx"
12
- ],
13
- "exclude": [
14
- "../src/**/__tests__/*",
15
- "../__tests__/*",
16
- "../src/**/*.test.*",
17
- "../src/**/test.*"
18
- ],
19
- "references": []
20
- }
2
+ "extends": "../../../../tsconfig.entry-points.jira.json",
3
+ "compilerOptions": {
4
+ "target": "es5",
5
+ "outDir": "../../../../../tsDist/@atlaskit__eslint-plugin-platform/app",
6
+ "rootDir": "../",
7
+ "composite": true
8
+ },
9
+ "include": [
10
+ "../src/**/*.ts",
11
+ "../src/**/*.tsx"
12
+ ],
13
+ "exclude": [
14
+ "../src/**/__tests__/*",
15
+ "../__tests__/*",
16
+ "../src/**/*.test.*",
17
+ "../src/**/test.*"
18
+ ],
19
+ "references": []
20
+ }
package/dist/cjs/index.js CHANGED
@@ -17,18 +17,19 @@ var _ensureFeatureFlagPrefix = _interopRequireDefault(require("./rules/ensure-fe
17
17
  var _ensureCriticalDependencyResolutions = _interopRequireDefault(require("./rules/ensure-critical-dependency-resolutions"));
18
18
  var _ensureValidPlatformYarnProtocolUsage = _interopRequireDefault(require("./rules/ensure-valid-platform-yarn-protocol-usage"));
19
19
  var _ensureValidBinValues = _interopRequireDefault(require("./rules/ensure-valid-bin-values"));
20
+ var _expandBorderShorthand = _interopRequireDefault(require("./rules/compiled/expand-border-shorthand"));
20
21
  var _noInvalidStorybookDecoratorUsage = _interopRequireDefault(require("./rules/no-invalid-storybook-decorator-usage"));
21
22
  var _ensurePublishValid = _interopRequireDefault(require("./rules/ensure-publish-valid"));
22
23
  var _ensureNativeAndAfExportsSynced = _interopRequireDefault(require("./rules/ensure-native-and-af-exports-synced"));
23
- var _noModuleLevelEval = _interopRequireDefault(require("./rules/no-module-level-eval"));
24
- var _noModuleLevelEvalNav = _interopRequireDefault(require("./rules/no-module-level-eval-nav4"));
25
- var _staticFeatureFlags = _interopRequireDefault(require("./rules/static-feature-flags"));
26
- var _noPreconditioning = _interopRequireDefault(require("./rules/no-preconditioning"));
27
- var _inlineUsage = _interopRequireDefault(require("./rules/inline-usage"));
28
- var _preferFg = _interopRequireDefault(require("./rules/prefer-fg"));
29
- var _noAlias = _interopRequireDefault(require("./rules/no-alias"));
24
+ var _noModuleLevelEval = _interopRequireDefault(require("./rules/feature-gating/no-module-level-eval"));
25
+ var _noModuleLevelEvalNav = _interopRequireDefault(require("./rules/feature-gating/no-module-level-eval-nav4"));
26
+ var _staticFeatureFlags = _interopRequireDefault(require("./rules/feature-gating/static-feature-flags"));
27
+ var _noPreconditioning = _interopRequireDefault(require("./rules/feature-gating/no-preconditioning"));
28
+ var _inlineUsage = _interopRequireDefault(require("./rules/feature-gating/inline-usage"));
29
+ var _preferFg = _interopRequireDefault(require("./rules/feature-gating/prefer-fg"));
30
+ var _noAlias = _interopRequireDefault(require("./rules/feature-gating/no-alias"));
30
31
  var _useEntrypointsInExamples = _interopRequireDefault(require("./rules/use-entrypoints-in-examples"));
31
- var _useRecommendedUtils = _interopRequireDefault(require("./rules/use-recommended-utils"));
32
+ var _useRecommendedUtils = _interopRequireDefault(require("./rules/feature-gating/use-recommended-utils"));
32
33
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
33
34
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } // eslint-disable-next-line import/no-extraneous-dependencies
34
35
  var rules = exports.rules = {
@@ -40,6 +41,7 @@ var rules = exports.rules = {
40
41
  'ensure-critical-dependency-resolutions': _ensureCriticalDependencyResolutions.default,
41
42
  'ensure-valid-platform-yarn-protocol-usage': _ensureValidPlatformYarnProtocolUsage.default,
42
43
  'ensure-valid-bin-values': _ensureValidBinValues.default,
44
+ 'expand-border-shorthand': _expandBorderShorthand.default,
43
45
  'no-duplicate-dependencies': _noDuplicateDependencies.default,
44
46
  'no-invalid-feature-flag-usage': _noInvalidFeatureFlagUsage.default,
45
47
  'no-pre-post-install-scripts': _noPrePostInstalls.default,
@@ -56,27 +58,43 @@ var rules = exports.rules = {
56
58
  'use-entrypoints-in-examples': _useEntrypointsInExamples.default,
57
59
  'use-recommended-utils': _useRecommendedUtils.default
58
60
  };
61
+ var commonConfig = {
62
+ '@atlaskit/platform/ensure-test-runner-arguments': 'error',
63
+ '@atlaskit/platform/ensure-test-runner-nested-count': 'warn',
64
+ '@atlaskit/platform/no-invalid-feature-flag-usage': 'error',
65
+ '@atlaskit/platform/no-invalid-storybook-decorator-usage': 'error',
66
+ '@atlaskit/platform/ensure-atlassian-team': 'error',
67
+ '@atlaskit/platform/no-module-level-eval-nav4': 'error',
68
+ // Compiled: rules that are not included via `@compiled/recommended
69
+ '@atlaskit/platform/expand-border-shorthand': 'warn',
70
+ '@compiled/jsx-pragma': ['error', {
71
+ importSources: ['@atlaskit/css'],
72
+ onlyRunIfImportingCompiled: true,
73
+ runtime: 'classic'
74
+ }]
75
+ };
59
76
  var configs = exports.configs = {
60
77
  recommended: {
61
- plugins: ['@atlaskit/platform'],
62
- rules: {
63
- '@atlaskit/platform/ensure-feature-flag-registration': 'error',
64
- '@atlaskit/platform/ensure-feature-flag-prefix': ['warn', {
65
- allowedPrefixes: ['platform.', 'platform_']
66
- }],
67
- '@atlaskit/platform/ensure-test-runner-arguments': 'error',
68
- '@atlaskit/platform/ensure-test-runner-nested-count': 'warn',
69
- '@atlaskit/platform/no-invalid-feature-flag-usage': 'error',
70
- '@atlaskit/platform/no-invalid-storybook-decorator-usage': 'error',
71
- '@atlaskit/platform/ensure-atlassian-team': 'error',
78
+ plugins: ['@atlaskit/platform', '@compiled'],
79
+ rules: _objectSpread(_objectSpread({}, commonConfig), {}, {
80
+ // See platform/packages/platform/eslint-plugin/src/rules/feature-gating/README.md
81
+ // These rules are specific to `platform` and seem a WIP; jira and confluence currently have their own rules
72
82
  '@atlaskit/platform/no-module-level-eval': 'error',
73
- '@atlaskit/platform/no-module-level-eval-nav4': 'error',
74
83
  '@atlaskit/platform/static-feature-flags': 'error',
75
84
  '@atlaskit/platform/no-preconditioning': 'error',
76
85
  '@atlaskit/platform/inline-usage': 'error',
77
86
  '@atlaskit/platform/prefer-fg': 'error',
78
- '@atlaskit/platform/no-alias': 'error'
79
- }
87
+ '@atlaskit/platform/no-alias': 'error',
88
+ // end: feature-gating rules
89
+ '@atlaskit/platform/ensure-feature-flag-registration': 'error',
90
+ '@atlaskit/platform/ensure-feature-flag-prefix': ['warn', {
91
+ allowedPrefixes: ['platform.', 'platform_']
92
+ }]
93
+ })
94
+ },
95
+ jira: {
96
+ plugins: ['@atlaskit/platform', '@compiled'],
97
+ rules: _objectSpread({}, commonConfig)
80
98
  }
81
99
  };
82
100
  var jsonPrefix = '/* eslint-disable quote-props, comma-dangle, quotes, semi, eol-last, @typescript-eslint/semi, no-template-curly-in-string */ module.exports = ';
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.expandBorderShorthand = exports.default = void 0;
7
+ var EXCLUDED_VALUES = ['0', 'none', 'unset', 'none !important'];
8
+ var findCallExpression = function findCallExpression(node) {
9
+ var parent = node.parent;
10
+ if (!parent) {
11
+ return null;
12
+ }
13
+ if (parent.type === 'CallExpression') {
14
+ return parent;
15
+ }
16
+ return findCallExpression(parent);
17
+ };
18
+ var separateBorderProperties = function separateBorderProperties(borderString, property, context) {
19
+ if (EXCLUDED_VALUES.includes(borderString)) {
20
+ return;
21
+ }
22
+ context.report({
23
+ node: property,
24
+ messageId: 'expandBorderShorthand'
25
+ });
26
+ };
27
+
28
+ // checks if the function that holds the border property is using an import package that this rule is targeting
29
+ var isCompiledAPI = function isCompiledAPI(importDeclaration, callExpression) {
30
+ var functionName;
31
+ if (callExpression.callee.type === 'Identifier') {
32
+ functionName = callExpression.callee.name;
33
+ } else if (callExpression.callee.type === 'MemberExpression') {
34
+ if (callExpression.callee.object.type === 'Identifier') {
35
+ functionName = callExpression.callee.object.name;
36
+ }
37
+ }
38
+ if (!functionName) {
39
+ return;
40
+ }
41
+ return importDeclaration.specifiers.some(function (specifier) {
42
+ return specifier.type === 'ImportSpecifier' && specifier.imported.name === functionName;
43
+ });
44
+ };
45
+ var expandBorderShorthand = exports.expandBorderShorthand = {
46
+ meta: {
47
+ docs: {
48
+ url: 'https://bitbucket.org/atlassian/atlassian-frontend-monorepo/src/master/platform/packages/platform/eslint-plugin/src/rules/compiled/expand-border-shorthand'
49
+ },
50
+ messages: {
51
+ expandBorderShorthand: 'Use borderColor, borderStyle, and borderWidth instead of border shorthand'
52
+ },
53
+ type: 'problem'
54
+ },
55
+ create: function create(context) {
56
+ var importDeclaration;
57
+ return {
58
+ 'ImportDeclaration[source.value="@compiled/react"], ImportDeclaration[source.value="@atlaskit/css"]': function ImportDeclarationSourceValueCompiledReactImportDeclarationSourceValueAtlaskitCss(node) {
59
+ importDeclaration = node;
60
+ },
61
+ 'Property[key.name="border"]': function PropertyKeyNameBorder(node) {
62
+ var callExpression = findCallExpression(node);
63
+ if (!callExpression) {
64
+ return;
65
+ }
66
+ if (importDeclaration) {
67
+ if (isCompiledAPI(importDeclaration, callExpression)) {
68
+ if (node.value.type === 'Literal' && node.value.value !== null) {
69
+ if (typeof node.value.value === 'string') {
70
+ var borderString = node.value.value;
71
+ separateBorderProperties(borderString, node, context);
72
+ } else if (node.value.raw) {
73
+ var _borderString = node.value.raw;
74
+ separateBorderProperties(_borderString, node, context);
75
+ }
76
+ } else if (node.value.type === 'TemplateLiteral') {
77
+ if (node.value.quasis.length > 1 || node.value.expressions.length > 0) {
78
+ context.report({
79
+ node: node,
80
+ messageId: 'expandBorderShorthand'
81
+ });
82
+ return;
83
+ }
84
+ if (node.value.quasis.length === 1 && node.value.quasis[0].value.cooked) {
85
+ var borderQuasis = node.value.quasis[0].value.cooked;
86
+ separateBorderProperties(borderQuasis, node, context);
87
+ }
88
+ } else if (node.value.type === 'CallExpression') {
89
+ context.report({
90
+ node: node,
91
+ messageId: 'expandBorderShorthand'
92
+ });
93
+ }
94
+ }
95
+ }
96
+ }
97
+ };
98
+ }
99
+ };
100
+ var _default = exports.default = expandBorderShorthand;
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.default = void 0;
8
8
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
9
- var _constants = require("../constants");
9
+ var _constants = require("../../constants");
10
10
  var _utils = require("../utils");
11
11
  var IMPORT_SOURCES = new Set([].concat((0, _toConsumableArray2.default)(_constants.FEATURE_API_IMPORT_SOURCES), (0, _toConsumableArray2.default)(_constants.FEATURE_MOCKS_IMPORT_SOURCES), (0, _toConsumableArray2.default)(_constants.FEATURE_UTILS_IMPORT_SOURCES)));
12
12
  var rule = {
@@ -8,7 +8,7 @@ exports.default = void 0;
8
8
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
9
9
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
10
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
11
- var _constants = require("../constants");
11
+ var _constants = require("../../constants");
12
12
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
13
13
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
14
14
  var validateUsage = function validateUsage(node, utilName, context, changeMap) {
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.default = void 0;
8
8
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
9
- var _constants = require("../constants");
9
+ var _constants = require("../../constants");
10
10
  var _utils = require("../utils");
11
11
  var IMPORT_SOURCES = new Set([].concat((0, _toConsumableArray2.default)(_constants.FEATURE_API_IMPORT_SOURCES), ['@atlassian/jira-feature-flagging-utils', '@atlassian/jira-feature-gate-component', '@atlassian/jira-feature-gates-test-mocks', '@atlassian/jira-feature-gates-storybook-mocks']));
12
12
 
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.getDef = getDef;
7
7
  exports.isAPIimport = isAPIimport;
8
8
  exports.isIdentifierImportedFrom = isIdentifierImportedFrom;
9
- var _constants = require("./constants");
9
+ var _constants = require("../constants");
10
10
  function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }
11
11
  function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
12
12
  function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
@@ -11,18 +11,19 @@ import ensureFeatureFlagPrefix from './rules/ensure-feature-flag-prefix';
11
11
  import ensureCriticalDependencyResolutions from './rules/ensure-critical-dependency-resolutions';
12
12
  import ensureValidPlatformYarnProtocolUsage from './rules/ensure-valid-platform-yarn-protocol-usage';
13
13
  import ensureValidBinValues from './rules/ensure-valid-bin-values';
14
+ import expandBorderShorthand from './rules/compiled/expand-border-shorthand';
14
15
  import noInvalidStorybookDecoratorUsage from './rules/no-invalid-storybook-decorator-usage';
15
16
  import ensurePublishValid from './rules/ensure-publish-valid';
16
17
  import ensureNativeAndAfExportsSynced from './rules/ensure-native-and-af-exports-synced';
17
- import noModuleLevelEval from './rules/no-module-level-eval';
18
- import noModuleLevelEvalNav4 from './rules/no-module-level-eval-nav4';
19
- import staticFeatureFlags from './rules/static-feature-flags';
20
- import noPreconditioning from './rules/no-preconditioning';
21
- import inlineUsage from './rules/inline-usage';
22
- import preferFG from './rules/prefer-fg';
23
- import noAlias from './rules/no-alias';
18
+ import noModuleLevelEval from './rules/feature-gating/no-module-level-eval';
19
+ import noModuleLevelEvalNav4 from './rules/feature-gating/no-module-level-eval-nav4';
20
+ import staticFeatureFlags from './rules/feature-gating/static-feature-flags';
21
+ import noPreconditioning from './rules/feature-gating/no-preconditioning';
22
+ import inlineUsage from './rules/feature-gating/inline-usage';
23
+ import preferFG from './rules/feature-gating/prefer-fg';
24
+ import noAlias from './rules/feature-gating/no-alias';
24
25
  import useEntrypointsInExamples from './rules/use-entrypoints-in-examples';
25
- import useRecommendedUtils from './rules/use-recommended-utils';
26
+ import useRecommendedUtils from './rules/feature-gating/use-recommended-utils';
26
27
  export const rules = {
27
28
  'ensure-feature-flag-registration': ensureFeatureFlagRegistration,
28
29
  'ensure-feature-flag-prefix': ensureFeatureFlagPrefix,
@@ -32,6 +33,7 @@ export const rules = {
32
33
  'ensure-critical-dependency-resolutions': ensureCriticalDependencyResolutions,
33
34
  'ensure-valid-platform-yarn-protocol-usage': ensureValidPlatformYarnProtocolUsage,
34
35
  'ensure-valid-bin-values': ensureValidBinValues,
36
+ 'expand-border-shorthand': expandBorderShorthand,
35
37
  'no-duplicate-dependencies': noDuplicateDependencies,
36
38
  'no-invalid-feature-flag-usage': noInvalidFeatureFlagUsage,
37
39
  'no-pre-post-install-scripts': noPreAndPostInstallScripts,
@@ -48,26 +50,45 @@ export const rules = {
48
50
  'use-entrypoints-in-examples': useEntrypointsInExamples,
49
51
  'use-recommended-utils': useRecommendedUtils
50
52
  };
53
+ const commonConfig = {
54
+ '@atlaskit/platform/ensure-test-runner-arguments': 'error',
55
+ '@atlaskit/platform/ensure-test-runner-nested-count': 'warn',
56
+ '@atlaskit/platform/no-invalid-feature-flag-usage': 'error',
57
+ '@atlaskit/platform/no-invalid-storybook-decorator-usage': 'error',
58
+ '@atlaskit/platform/ensure-atlassian-team': 'error',
59
+ '@atlaskit/platform/no-module-level-eval-nav4': 'error',
60
+ // Compiled: rules that are not included via `@compiled/recommended
61
+ '@atlaskit/platform/expand-border-shorthand': 'warn',
62
+ '@compiled/jsx-pragma': ['error', {
63
+ importSources: ['@atlaskit/css'],
64
+ onlyRunIfImportingCompiled: true,
65
+ runtime: 'classic'
66
+ }]
67
+ };
51
68
  export const configs = {
52
69
  recommended: {
53
- plugins: ['@atlaskit/platform'],
70
+ plugins: ['@atlaskit/platform', '@compiled'],
54
71
  rules: {
55
- '@atlaskit/platform/ensure-feature-flag-registration': 'error',
56
- '@atlaskit/platform/ensure-feature-flag-prefix': ['warn', {
57
- allowedPrefixes: ['platform.', 'platform_']
58
- }],
59
- '@atlaskit/platform/ensure-test-runner-arguments': 'error',
60
- '@atlaskit/platform/ensure-test-runner-nested-count': 'warn',
61
- '@atlaskit/platform/no-invalid-feature-flag-usage': 'error',
62
- '@atlaskit/platform/no-invalid-storybook-decorator-usage': 'error',
63
- '@atlaskit/platform/ensure-atlassian-team': 'error',
72
+ ...commonConfig,
73
+ // See platform/packages/platform/eslint-plugin/src/rules/feature-gating/README.md
74
+ // These rules are specific to `platform` and seem a WIP; jira and confluence currently have their own rules
64
75
  '@atlaskit/platform/no-module-level-eval': 'error',
65
- '@atlaskit/platform/no-module-level-eval-nav4': 'error',
66
76
  '@atlaskit/platform/static-feature-flags': 'error',
67
77
  '@atlaskit/platform/no-preconditioning': 'error',
68
78
  '@atlaskit/platform/inline-usage': 'error',
69
79
  '@atlaskit/platform/prefer-fg': 'error',
70
- '@atlaskit/platform/no-alias': 'error'
80
+ '@atlaskit/platform/no-alias': 'error',
81
+ // end: feature-gating rules
82
+ '@atlaskit/platform/ensure-feature-flag-registration': 'error',
83
+ '@atlaskit/platform/ensure-feature-flag-prefix': ['warn', {
84
+ allowedPrefixes: ['platform.', 'platform_']
85
+ }]
86
+ }
87
+ },
88
+ jira: {
89
+ plugins: ['@atlaskit/platform', '@compiled'],
90
+ rules: {
91
+ ...commonConfig
71
92
  }
72
93
  }
73
94
  };
@@ -0,0 +1,92 @@
1
+ const EXCLUDED_VALUES = ['0', 'none', 'unset', 'none !important'];
2
+ const findCallExpression = node => {
3
+ const parent = node.parent;
4
+ if (!parent) {
5
+ return null;
6
+ }
7
+ if (parent.type === 'CallExpression') {
8
+ return parent;
9
+ }
10
+ return findCallExpression(parent);
11
+ };
12
+ const separateBorderProperties = (borderString, property, context) => {
13
+ if (EXCLUDED_VALUES.includes(borderString)) {
14
+ return;
15
+ }
16
+ context.report({
17
+ node: property,
18
+ messageId: 'expandBorderShorthand'
19
+ });
20
+ };
21
+
22
+ // checks if the function that holds the border property is using an import package that this rule is targeting
23
+ const isCompiledAPI = (importDeclaration, callExpression) => {
24
+ let functionName;
25
+ if (callExpression.callee.type === 'Identifier') {
26
+ functionName = callExpression.callee.name;
27
+ } else if (callExpression.callee.type === 'MemberExpression') {
28
+ if (callExpression.callee.object.type === 'Identifier') {
29
+ functionName = callExpression.callee.object.name;
30
+ }
31
+ }
32
+ if (!functionName) {
33
+ return;
34
+ }
35
+ return importDeclaration.specifiers.some(specifier => specifier.type === 'ImportSpecifier' && specifier.imported.name === functionName);
36
+ };
37
+ export const expandBorderShorthand = {
38
+ meta: {
39
+ docs: {
40
+ url: 'https://bitbucket.org/atlassian/atlassian-frontend-monorepo/src/master/platform/packages/platform/eslint-plugin/src/rules/compiled/expand-border-shorthand'
41
+ },
42
+ messages: {
43
+ expandBorderShorthand: 'Use borderColor, borderStyle, and borderWidth instead of border shorthand'
44
+ },
45
+ type: 'problem'
46
+ },
47
+ create(context) {
48
+ let importDeclaration;
49
+ return {
50
+ 'ImportDeclaration[source.value="@compiled/react"], ImportDeclaration[source.value="@atlaskit/css"]': function (node) {
51
+ importDeclaration = node;
52
+ },
53
+ 'Property[key.name="border"]': function (node) {
54
+ const callExpression = findCallExpression(node);
55
+ if (!callExpression) {
56
+ return;
57
+ }
58
+ if (importDeclaration) {
59
+ if (isCompiledAPI(importDeclaration, callExpression)) {
60
+ if (node.value.type === 'Literal' && node.value.value !== null) {
61
+ if (typeof node.value.value === 'string') {
62
+ const borderString = node.value.value;
63
+ separateBorderProperties(borderString, node, context);
64
+ } else if (node.value.raw) {
65
+ const borderString = node.value.raw;
66
+ separateBorderProperties(borderString, node, context);
67
+ }
68
+ } else if (node.value.type === 'TemplateLiteral') {
69
+ if (node.value.quasis.length > 1 || node.value.expressions.length > 0) {
70
+ context.report({
71
+ node,
72
+ messageId: 'expandBorderShorthand'
73
+ });
74
+ return;
75
+ }
76
+ if (node.value.quasis.length === 1 && node.value.quasis[0].value.cooked) {
77
+ const borderQuasis = node.value.quasis[0].value.cooked;
78
+ separateBorderProperties(borderQuasis, node, context);
79
+ }
80
+ } else if (node.value.type === 'CallExpression') {
81
+ context.report({
82
+ node,
83
+ messageId: 'expandBorderShorthand'
84
+ });
85
+ }
86
+ }
87
+ }
88
+ }
89
+ };
90
+ }
91
+ };
92
+ export default expandBorderShorthand;
@@ -1,4 +1,4 @@
1
- import { FEATURE_API_IMPORT_SOURCES, FEATURE_MOCKS_IMPORT_SOURCES, FEATURE_UTILS_IMPORT_SOURCES } from '../constants';
1
+ import { FEATURE_API_IMPORT_SOURCES, FEATURE_MOCKS_IMPORT_SOURCES, FEATURE_UTILS_IMPORT_SOURCES } from '../../constants';
2
2
  import { isIdentifierImportedFrom } from '../utils';
3
3
  const IMPORT_SOURCES = new Set([...FEATURE_API_IMPORT_SOURCES, ...FEATURE_MOCKS_IMPORT_SOURCES, ...FEATURE_UTILS_IMPORT_SOURCES]);
4
4
  const rule = {
@@ -1,4 +1,4 @@
1
- import { FEATURE_API_IMPORT_SOURCES } from '../constants';
1
+ import { FEATURE_API_IMPORT_SOURCES } from '../../constants';
2
2
  const validateUsage = (node, utilName, context, changeMap) => {
3
3
  var _context$getScope$ref;
4
4
  const resolved = (_context$getScope$ref = context.getScope().references.find(ref => ref.identifier.name === utilName)) === null || _context$getScope$ref === void 0 ? void 0 : _context$getScope$ref.resolved;
@@ -1,4 +1,4 @@
1
- import { FEATURE_API_IMPORT_SOURCES } from '../constants';
1
+ import { FEATURE_API_IMPORT_SOURCES } from '../../constants';
2
2
  import { getDef, isIdentifierImportedFrom } from '../utils';
3
3
  const IMPORT_SOURCES = new Set([...FEATURE_API_IMPORT_SOURCES, '@atlassian/jira-feature-flagging-utils', '@atlassian/jira-feature-gate-component', '@atlassian/jira-feature-gates-test-mocks', '@atlassian/jira-feature-gates-storybook-mocks']);
4
4
 
@@ -1,4 +1,4 @@
1
- import { FEATURE_API_IMPORT_SOURCES } from './constants';
1
+ import { FEATURE_API_IMPORT_SOURCES } from '../constants';
2
2
  export function isIdentifierImportedFrom(identifierName, sources, context) {
3
3
  if (sources.size > 0) {
4
4
  var _context$getScope$ref, _context$getScope$ref2, _context$getScope$ref3;
package/dist/esm/index.js CHANGED
@@ -14,18 +14,19 @@ import ensureFeatureFlagPrefix from './rules/ensure-feature-flag-prefix';
14
14
  import ensureCriticalDependencyResolutions from './rules/ensure-critical-dependency-resolutions';
15
15
  import ensureValidPlatformYarnProtocolUsage from './rules/ensure-valid-platform-yarn-protocol-usage';
16
16
  import ensureValidBinValues from './rules/ensure-valid-bin-values';
17
+ import expandBorderShorthand from './rules/compiled/expand-border-shorthand';
17
18
  import noInvalidStorybookDecoratorUsage from './rules/no-invalid-storybook-decorator-usage';
18
19
  import ensurePublishValid from './rules/ensure-publish-valid';
19
20
  import ensureNativeAndAfExportsSynced from './rules/ensure-native-and-af-exports-synced';
20
- import noModuleLevelEval from './rules/no-module-level-eval';
21
- import noModuleLevelEvalNav4 from './rules/no-module-level-eval-nav4';
22
- import staticFeatureFlags from './rules/static-feature-flags';
23
- import noPreconditioning from './rules/no-preconditioning';
24
- import inlineUsage from './rules/inline-usage';
25
- import preferFG from './rules/prefer-fg';
26
- import noAlias from './rules/no-alias';
21
+ import noModuleLevelEval from './rules/feature-gating/no-module-level-eval';
22
+ import noModuleLevelEvalNav4 from './rules/feature-gating/no-module-level-eval-nav4';
23
+ import staticFeatureFlags from './rules/feature-gating/static-feature-flags';
24
+ import noPreconditioning from './rules/feature-gating/no-preconditioning';
25
+ import inlineUsage from './rules/feature-gating/inline-usage';
26
+ import preferFG from './rules/feature-gating/prefer-fg';
27
+ import noAlias from './rules/feature-gating/no-alias';
27
28
  import useEntrypointsInExamples from './rules/use-entrypoints-in-examples';
28
- import useRecommendedUtils from './rules/use-recommended-utils';
29
+ import useRecommendedUtils from './rules/feature-gating/use-recommended-utils';
29
30
  export var rules = {
30
31
  'ensure-feature-flag-registration': ensureFeatureFlagRegistration,
31
32
  'ensure-feature-flag-prefix': ensureFeatureFlagPrefix,
@@ -35,6 +36,7 @@ export var rules = {
35
36
  'ensure-critical-dependency-resolutions': ensureCriticalDependencyResolutions,
36
37
  'ensure-valid-platform-yarn-protocol-usage': ensureValidPlatformYarnProtocolUsage,
37
38
  'ensure-valid-bin-values': ensureValidBinValues,
39
+ 'expand-border-shorthand': expandBorderShorthand,
38
40
  'no-duplicate-dependencies': noDuplicateDependencies,
39
41
  'no-invalid-feature-flag-usage': noInvalidFeatureFlagUsage,
40
42
  'no-pre-post-install-scripts': noPreAndPostInstallScripts,
@@ -51,27 +53,43 @@ export var rules = {
51
53
  'use-entrypoints-in-examples': useEntrypointsInExamples,
52
54
  'use-recommended-utils': useRecommendedUtils
53
55
  };
56
+ var commonConfig = {
57
+ '@atlaskit/platform/ensure-test-runner-arguments': 'error',
58
+ '@atlaskit/platform/ensure-test-runner-nested-count': 'warn',
59
+ '@atlaskit/platform/no-invalid-feature-flag-usage': 'error',
60
+ '@atlaskit/platform/no-invalid-storybook-decorator-usage': 'error',
61
+ '@atlaskit/platform/ensure-atlassian-team': 'error',
62
+ '@atlaskit/platform/no-module-level-eval-nav4': 'error',
63
+ // Compiled: rules that are not included via `@compiled/recommended
64
+ '@atlaskit/platform/expand-border-shorthand': 'warn',
65
+ '@compiled/jsx-pragma': ['error', {
66
+ importSources: ['@atlaskit/css'],
67
+ onlyRunIfImportingCompiled: true,
68
+ runtime: 'classic'
69
+ }]
70
+ };
54
71
  export var configs = {
55
72
  recommended: {
56
- plugins: ['@atlaskit/platform'],
57
- rules: {
58
- '@atlaskit/platform/ensure-feature-flag-registration': 'error',
59
- '@atlaskit/platform/ensure-feature-flag-prefix': ['warn', {
60
- allowedPrefixes: ['platform.', 'platform_']
61
- }],
62
- '@atlaskit/platform/ensure-test-runner-arguments': 'error',
63
- '@atlaskit/platform/ensure-test-runner-nested-count': 'warn',
64
- '@atlaskit/platform/no-invalid-feature-flag-usage': 'error',
65
- '@atlaskit/platform/no-invalid-storybook-decorator-usage': 'error',
66
- '@atlaskit/platform/ensure-atlassian-team': 'error',
73
+ plugins: ['@atlaskit/platform', '@compiled'],
74
+ rules: _objectSpread(_objectSpread({}, commonConfig), {}, {
75
+ // See platform/packages/platform/eslint-plugin/src/rules/feature-gating/README.md
76
+ // These rules are specific to `platform` and seem a WIP; jira and confluence currently have their own rules
67
77
  '@atlaskit/platform/no-module-level-eval': 'error',
68
- '@atlaskit/platform/no-module-level-eval-nav4': 'error',
69
78
  '@atlaskit/platform/static-feature-flags': 'error',
70
79
  '@atlaskit/platform/no-preconditioning': 'error',
71
80
  '@atlaskit/platform/inline-usage': 'error',
72
81
  '@atlaskit/platform/prefer-fg': 'error',
73
- '@atlaskit/platform/no-alias': 'error'
74
- }
82
+ '@atlaskit/platform/no-alias': 'error',
83
+ // end: feature-gating rules
84
+ '@atlaskit/platform/ensure-feature-flag-registration': 'error',
85
+ '@atlaskit/platform/ensure-feature-flag-prefix': ['warn', {
86
+ allowedPrefixes: ['platform.', 'platform_']
87
+ }]
88
+ })
89
+ },
90
+ jira: {
91
+ plugins: ['@atlaskit/platform', '@compiled'],
92
+ rules: _objectSpread({}, commonConfig)
75
93
  }
76
94
  };
77
95
  var jsonPrefix = '/* eslint-disable quote-props, comma-dangle, quotes, semi, eol-last, @typescript-eslint/semi, no-template-curly-in-string */ module.exports = ';