@atlaskit/eslint-plugin-platform 0.2.5 → 0.3.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 (47) hide show
  1. package/CHANGELOG.md +33 -21
  2. package/dist/cjs/index.js +28 -11
  3. package/dist/cjs/rules/ensure-atlassian-team/index.js +1 -2
  4. package/dist/cjs/rules/ensure-critical-dependency-resolutions/index.js +86 -0
  5. package/dist/cjs/rules/ensure-feature-flag-prefix/index.js +1 -2
  6. package/dist/cjs/rules/ensure-feature-flag-registration/index.js +3 -4
  7. package/dist/cjs/rules/ensure-publish-valid/index.js +5 -29
  8. package/dist/cjs/rules/ensure-test-runner-arguments/index.js +1 -2
  9. package/dist/cjs/rules/ensure-test-runner-nested-count/index.js +3 -4
  10. package/dist/cjs/rules/no-duplicate-dependencies/index.js +90 -0
  11. package/dist/cjs/rules/no-invalid-feature-flag-usage/index.js +1 -2
  12. package/dist/cjs/rules/no-invalid-storybook-decorator-usage/index.js +1 -2
  13. package/dist/cjs/rules/no-pre-post-installs/index.js +1 -2
  14. package/dist/cjs/rules/util/handle-ast-object.js +30 -0
  15. package/dist/cjs/rules/util/registration-utils.js +3 -5
  16. package/dist/es2019/index.js +25 -2
  17. package/dist/es2019/rules/ensure-critical-dependency-resolutions/index.js +64 -0
  18. package/dist/es2019/rules/ensure-publish-valid/index.js +1 -20
  19. package/dist/es2019/rules/no-duplicate-dependencies/index.js +65 -0
  20. package/dist/es2019/rules/util/handle-ast-object.js +20 -0
  21. package/dist/esm/index.js +24 -4
  22. package/dist/esm/rules/ensure-critical-dependency-resolutions/index.js +80 -0
  23. package/dist/esm/rules/ensure-feature-flag-registration/index.js +2 -2
  24. package/dist/esm/rules/ensure-publish-valid/index.js +1 -24
  25. package/dist/esm/rules/ensure-test-runner-nested-count/index.js +2 -2
  26. package/dist/esm/rules/no-duplicate-dependencies/index.js +83 -0
  27. package/dist/esm/rules/util/handle-ast-object.js +24 -0
  28. package/dist/types/index.d.ts +2 -0
  29. package/dist/types/rules/ensure-critical-dependency-resolutions/index.d.ts +3 -0
  30. package/dist/types/rules/no-duplicate-dependencies/index.d.ts +3 -0
  31. package/dist/types/rules/util/handle-ast-object.d.ts +3 -0
  32. package/dist/types-ts4.5/index.d.ts +2 -0
  33. package/dist/types-ts4.5/rules/ensure-critical-dependency-resolutions/index.d.ts +3 -0
  34. package/dist/types-ts4.5/rules/no-duplicate-dependencies/index.d.ts +3 -0
  35. package/dist/types-ts4.5/rules/util/handle-ast-object.d.ts +3 -0
  36. package/package.json +3 -2
  37. package/report.api.md +2 -0
  38. package/src/index.tsx +26 -4
  39. package/src/rules/ensure-critical-dependency-resolutions/__test__/unit/rule.test.tsx +125 -0
  40. package/src/rules/ensure-critical-dependency-resolutions/index.tsx +113 -0
  41. package/src/rules/ensure-publish-valid/index.ts +4 -43
  42. package/src/rules/no-duplicate-dependencies/__tests__/unit/rule.test.ts +116 -0
  43. package/src/rules/no-duplicate-dependencies/index.ts +83 -0
  44. package/src/rules/util/handle-ast-object.ts +44 -0
  45. package/tmp/api-report-tmp.d.ts +2 -0
  46. package/tsconfig.app.json +36 -0
  47. package/tsconfig.dev.json +40 -0
package/CHANGELOG.md CHANGED
@@ -1,127 +1,139 @@
1
1
  # @atlaskit/eslint-plugin-platform
2
2
 
3
+ ## 0.3.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#41190](https://bitbucket.org/atlassian/atlassian-frontend/pull-requests/41190) [`a5047d254d4`](https://bitbucket.org/atlassian/atlassian-frontend/commits/a5047d254d4) - Add no-duplicate-dependencies rule and enable package-json-processor autofix
8
+
9
+ ## 0.2.6
10
+
11
+ ### Patch Changes
12
+
13
+ - [#39249](https://bitbucket.org/atlassian/atlassian-frontend/pull-requests/39249) [`7efeb93141c`](https://bitbucket.org/atlassian/atlassian-frontend/commits/7efeb93141c) - Add a rule to ensure critical packages are resolved to the correct versions
14
+
3
15
  ## 0.2.5
4
16
 
5
17
  ### Patch Changes
6
18
 
7
- - [`e5f52093b2a`](https://bitbucket.org/atlassian/atlassian-frontend/commits/e5f52093b2a) - Add a rule to ensure that publish config is correct for packages
19
+ - [#39049](https://bitbucket.org/atlassian/atlassian-frontend/pull-requests/39049) [`e5f52093b2a`](https://bitbucket.org/atlassian/atlassian-frontend/commits/e5f52093b2a) - Add a rule to ensure that publish config is correct for packages
8
20
 
9
21
  ## 0.2.4
10
22
 
11
23
  ### Patch Changes
12
24
 
13
- - [`eb64cbdd681`](https://bitbucket.org/atlassian/atlassian-frontend/commits/eb64cbdd681) - Add a new rule to verify that the atlassian team is defined if the relevant section exists in the package.json
25
+ - [#38261](https://bitbucket.org/atlassian/atlassian-frontend/pull-requests/38261) [`eb64cbdd681`](https://bitbucket.org/atlassian/atlassian-frontend/commits/eb64cbdd681) - Add a new rule to verify that the atlassian team is defined if the relevant section exists in the package.json
14
26
 
15
27
  ## 0.2.3
16
28
 
17
29
  ### Patch Changes
18
30
 
19
- - [`0bf64fb3dd0`](https://bitbucket.org/atlassian/atlassian-frontend/commits/0bf64fb3dd0) - Update to support unary expressions like negation
31
+ - [#33879](https://bitbucket.org/atlassian/atlassian-frontend/pull-requests/33879) [`0bf64fb3dd0`](https://bitbucket.org/atlassian/atlassian-frontend/commits/0bf64fb3dd0) - Update to support unary expressions like negation
20
32
 
21
33
  ## 0.2.2
22
34
 
23
35
  ### Patch Changes
24
36
 
25
- - [`9d00501a414`](https://bitbucket.org/atlassian/atlassian-frontend/commits/9d00501a414) - Ensure legacy types are published for TS 4.5-4.8
37
+ - [#33793](https://bitbucket.org/atlassian/atlassian-frontend/pull-requests/33793) [`9d00501a414`](https://bitbucket.org/atlassian/atlassian-frontend/commits/9d00501a414) - Ensure legacy types are published for TS 4.5-4.8
26
38
 
27
39
  ## 0.2.1
28
40
 
29
41
  ### Patch Changes
30
42
 
31
- - [`41fae2c6f68`](https://bitbucket.org/atlassian/atlassian-frontend/commits/41fae2c6f68) - Upgrade Typescript from `4.5.5` to `4.9.5`
43
+ - [#33649](https://bitbucket.org/atlassian/atlassian-frontend/pull-requests/33649) [`41fae2c6f68`](https://bitbucket.org/atlassian/atlassian-frontend/commits/41fae2c6f68) - Upgrade Typescript from `4.5.5` to `4.9.5`
32
44
 
33
45
  ## 0.2.0
34
46
 
35
47
  ### Minor Changes
36
48
 
37
- - [`56507598609`](https://bitbucket.org/atlassian/atlassian-frontend/commits/56507598609) - Skip minor dependency bump
49
+ - [#33258](https://bitbucket.org/atlassian/atlassian-frontend/pull-requests/33258) [`56507598609`](https://bitbucket.org/atlassian/atlassian-frontend/commits/56507598609) - Skip minor dependency bump
38
50
 
39
51
  ## 0.1.8
40
52
 
41
53
  ### Patch Changes
42
54
 
43
- - [`cb0e94d2ce4`](https://bitbucket.org/atlassian/atlassian-frontend/commits/cb0e94d2ce4) - Fix prefixes for all flags being checked at any callsite, only the current flag will be checked from now on
55
+ - [#32441](https://bitbucket.org/atlassian/atlassian-frontend/pull-requests/32441) [`cb0e94d2ce4`](https://bitbucket.org/atlassian/atlassian-frontend/commits/cb0e94d2ce4) - Fix prefixes for all flags being checked at any callsite, only the current flag will be checked from now on
44
56
 
45
57
  ## 0.1.7
46
58
 
47
59
  ### Patch Changes
48
60
 
49
- - [`2e01c9c74b5`](https://bitbucket.org/atlassian/atlassian-frontend/commits/2e01c9c74b5) - DUMMY remove before merging to master; dupe adf-schema via adf-utils
61
+ - [#32424](https://bitbucket.org/atlassian/atlassian-frontend/pull-requests/32424) [`2e01c9c74b5`](https://bitbucket.org/atlassian/atlassian-frontend/commits/2e01c9c74b5) - DUMMY remove before merging to master; dupe adf-schema via adf-utils
50
62
 
51
63
  ## 0.1.6
52
64
 
53
65
  ### Patch Changes
54
66
 
55
- - [`e8a8808f299`](https://bitbucket.org/atlassian/atlassian-frontend/commits/e8a8808f299) - Add a new eslint rule that enforces prefixes on platform feature flags. Ignore existing usages.
67
+ - [#31962](https://bitbucket.org/atlassian/atlassian-frontend/pull-requests/31962) [`e8a8808f299`](https://bitbucket.org/atlassian/atlassian-frontend/commits/e8a8808f299) - Add a new eslint rule that enforces prefixes on platform feature flags. Ignore existing usages.
56
68
 
57
69
  ## 0.1.5
58
70
 
59
71
  ### Patch Changes
60
72
 
61
- - [`b47e48ad163`](https://bitbucket.org/atlassian/atlassian-frontend/commits/b47e48ad163) - Adds an eslint rule to confirm that storybooks only get passed an object - to ensure that codemods work correctly.
73
+ - [#31956](https://bitbucket.org/atlassian/atlassian-frontend/pull-requests/31956) [`b47e48ad163`](https://bitbucket.org/atlassian/atlassian-frontend/commits/b47e48ad163) - Adds an eslint rule to confirm that storybooks only get passed an object - to ensure that codemods work correctly.
62
74
 
63
75
  ## 0.1.4
64
76
 
65
77
  ### Patch Changes
66
78
 
67
- - [`971489f4ff4`](https://bitbucket.org/atlassian/atlassian-frontend/commits/971489f4ff4) - Add test runner to identified calls that require registration of platform feature flags
79
+ - [#31631](https://bitbucket.org/atlassian/atlassian-frontend/pull-requests/31631) [`971489f4ff4`](https://bitbucket.org/atlassian/atlassian-frontend/commits/971489f4ff4) - Add test runner to identified calls that require registration of platform feature flags
68
80
 
69
81
  ## 0.1.3
70
82
 
71
83
  ### Patch Changes
72
84
 
73
- - [`7facf919a4e`](https://bitbucket.org/atlassian/atlassian-frontend/commits/7facf919a4e) - Remove product specific rules and make it so the recommended set is used everywhere instead
85
+ - [#31581](https://bitbucket.org/atlassian/atlassian-frontend/pull-requests/31581) [`7facf919a4e`](https://bitbucket.org/atlassian/atlassian-frontend/commits/7facf919a4e) - Remove product specific rules and make it so the recommended set is used everywhere instead
74
86
 
75
87
  ## 0.1.2
76
88
 
77
89
  ### Patch Changes
78
90
 
79
- - [`166815fbd8f`](https://bitbucket.org/atlassian/atlassian-frontend/commits/166815fbd8f) - Add recommended set of flags for use in products
91
+ - [#31440](https://bitbucket.org/atlassian/atlassian-frontend/pull-requests/31440) [`166815fbd8f`](https://bitbucket.org/atlassian/atlassian-frontend/commits/166815fbd8f) - Add recommended set of flags for use in products
80
92
 
81
93
  ## 0.1.1
82
94
 
83
95
  ### Patch Changes
84
96
 
85
- - [`7edd9e8b4b1`](https://bitbucket.org/atlassian/atlassian-frontend/commits/7edd9e8b4b1) - Add suggestion to change feature flag to the closest matching feature flag using fuzzy search
97
+ - [#30710](https://bitbucket.org/atlassian/atlassian-frontend/pull-requests/30710) [`7edd9e8b4b1`](https://bitbucket.org/atlassian/atlassian-frontend/commits/7edd9e8b4b1) - Add suggestion to change feature flag to the closest matching feature flag using fuzzy search
86
98
 
87
99
  ## 0.1.0
88
100
 
89
101
  ### Minor Changes
90
102
 
91
- - [`6339334e3ac`](https://bitbucket.org/atlassian/atlassian-frontend/commits/6339334e3ac) - Adds new rule to disallow pre/post install scripts in package.json.
103
+ - [#30401](https://bitbucket.org/atlassian/atlassian-frontend/pull-requests/30401) [`6339334e3ac`](https://bitbucket.org/atlassian/atlassian-frontend/commits/6339334e3ac) - Adds new rule to disallow pre/post install scripts in package.json.
92
104
 
93
105
  ## 0.0.7
94
106
 
95
107
  ### Patch Changes
96
108
 
97
- - [`0cab60b90c3`](https://bitbucket.org/atlassian/atlassian-frontend/commits/0cab60b90c3) - Add fix to eslint rule on the arguments of nested test runner
109
+ - [#30777](https://bitbucket.org/atlassian/atlassian-frontend/pull-requests/30777) [`0cab60b90c3`](https://bitbucket.org/atlassian/atlassian-frontend/commits/0cab60b90c3) - Add fix to eslint rule on the arguments of nested test runner
98
110
 
99
111
  ## 0.0.6
100
112
 
101
113
  ### Patch Changes
102
114
 
103
- - [`99449cce7f5`](https://bitbucket.org/atlassian/atlassian-frontend/commits/99449cce7f5) - Eslint rules around test runner arguments and limit on nested test runners
115
+ - [#30491](https://bitbucket.org/atlassian/atlassian-frontend/pull-requests/30491) [`99449cce7f5`](https://bitbucket.org/atlassian/atlassian-frontend/commits/99449cce7f5) - Eslint rules around test runner arguments and limit on nested test runners
104
116
 
105
117
  ## 0.0.5
106
118
 
107
119
  ### Patch Changes
108
120
 
109
- - [`aeb52cac34c`](https://bitbucket.org/atlassian/atlassian-frontend/commits/aeb52cac34c) - Split feature flag registration rule into two to more easily use it in products
121
+ - [#30484](https://bitbucket.org/atlassian/atlassian-frontend/pull-requests/30484) [`aeb52cac34c`](https://bitbucket.org/atlassian/atlassian-frontend/commits/aeb52cac34c) - Split feature flag registration rule into two to more easily use it in products
110
122
 
111
123
  ## 0.0.4
112
124
 
113
125
  ### Patch Changes
114
126
 
115
- - [`cd5b194f403`](https://bitbucket.org/atlassian/atlassian-frontend/commits/cd5b194f403) - Add check to ensure that there is only one feature flag call per expression
127
+ - [#30432](https://bitbucket.org/atlassian/atlassian-frontend/pull-requests/30432) [`cd5b194f403`](https://bitbucket.org/atlassian/atlassian-frontend/commits/cd5b194f403) - Add check to ensure that there is only one feature flag call per expression
116
128
 
117
129
  ## 0.0.3
118
130
 
119
131
  ### Patch Changes
120
132
 
121
- - [`11706c3e7c5`](https://bitbucket.org/atlassian/atlassian-frontend/commits/11706c3e7c5) - Publish platform eslint rules to npm to be consumed in other products
133
+ - [#30320](https://bitbucket.org/atlassian/atlassian-frontend/pull-requests/30320) [`11706c3e7c5`](https://bitbucket.org/atlassian/atlassian-frontend/commits/11706c3e7c5) - Publish platform eslint rules to npm to be consumed in other products
122
134
 
123
135
  ## 0.0.2
124
136
 
125
137
  ### Patch Changes
126
138
 
127
- - [`85dc0230439`](https://bitbucket.org/atlassian/atlassian-frontend/commits/85dc0230439) - Add eslint rule to allow for platform feature flag usage
139
+ - [#28303](https://bitbucket.org/atlassian/atlassian-frontend/pull-requests/28303) [`85dc0230439`](https://bitbucket.org/atlassian/atlassian-frontend/commits/85dc0230439) - Add eslint rule to allow for platform feature flag usage
package/dist/cjs/index.js CHANGED
@@ -5,28 +5,34 @@ Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
7
  exports.rules = exports.processors = exports.configs = void 0;
8
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
8
9
  var _ensureFeatureFlagRegistration = _interopRequireDefault(require("./rules/ensure-feature-flag-registration"));
9
10
  var _noPrePostInstalls = _interopRequireDefault(require("./rules/no-pre-post-installs"));
10
11
  var _ensureTestRunnerArguments = _interopRequireDefault(require("./rules/ensure-test-runner-arguments"));
11
12
  var _ensureTestRunnerNestedCount = _interopRequireDefault(require("./rules/ensure-test-runner-nested-count"));
12
13
  var _ensureAtlassianTeam = _interopRequireDefault(require("./rules/ensure-atlassian-team"));
14
+ var _noDuplicateDependencies = _interopRequireDefault(require("./rules/no-duplicate-dependencies"));
13
15
  var _noInvalidFeatureFlagUsage = _interopRequireDefault(require("./rules/no-invalid-feature-flag-usage"));
14
16
  var _ensureFeatureFlagPrefix = _interopRequireDefault(require("./rules/ensure-feature-flag-prefix"));
17
+ var _ensureCriticalDependencyResolutions = _interopRequireDefault(require("./rules/ensure-critical-dependency-resolutions"));
15
18
  var _noInvalidStorybookDecoratorUsage = _interopRequireDefault(require("./rules/no-invalid-storybook-decorator-usage"));
16
19
  var _ensurePublishValid = _interopRequireDefault(require("./rules/ensure-publish-valid"));
17
- var rules = {
20
+ 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; }
21
+ 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; }
22
+ var rules = exports.rules = {
18
23
  'ensure-feature-flag-registration': _ensureFeatureFlagRegistration.default,
19
24
  'ensure-feature-flag-prefix': _ensureFeatureFlagPrefix.default,
20
25
  'ensure-test-runner-arguments': _ensureTestRunnerArguments.default,
21
26
  'ensure-test-runner-nested-count': _ensureTestRunnerNestedCount.default,
22
27
  'ensure-atlassian-team': _ensureAtlassianTeam.default,
28
+ 'ensure-critical-dependency-resolutions': _ensureCriticalDependencyResolutions.default,
29
+ 'no-duplicate-dependencies': _noDuplicateDependencies.default,
23
30
  'no-invalid-feature-flag-usage': _noInvalidFeatureFlagUsage.default,
24
31
  'no-pre-post-install-scripts': _noPrePostInstalls.default,
25
32
  'no-invalid-storybook-decorator-usage': _noInvalidStorybookDecoratorUsage.default,
26
33
  'ensure-publish-valid': _ensurePublishValid.default
27
34
  };
28
- exports.rules = rules;
29
- var configs = {
35
+ var configs = exports.configs = {
30
36
  recommended: {
31
37
  plugins: ['@atlaskit/platform'],
32
38
  rules: {
@@ -42,16 +48,27 @@ var configs = {
42
48
  }
43
49
  }
44
50
  };
45
- exports.configs = configs;
46
- var processors = {
51
+ var jsonPrefix = '/* eslint-disable quote-props, comma-dangle, quotes, semi, eol-last, @typescript-eslint/semi, no-template-curly-in-string */ module.exports = ';
52
+ var processors = exports.processors = {
47
53
  'package-json-processor': {
48
54
  preprocess: function preprocess(source) {
49
55
  // augment the json into a js file
50
- return ["/* eslint-disable quote-props, comma-dangle, quotes, semi, eol-last, @typescript-eslint/semi, no-template-curly-in-string */ module.exports = ".concat(source.trim())];
56
+ return [jsonPrefix + source.trim()];
51
57
  },
52
- postprocess: function postprocess(errors) {
53
- return errors[0];
54
- }
58
+ postprocess: function postprocess(messages) {
59
+ return messages[0].map(function (message) {
60
+ var fix = message.fix;
61
+ if (!fix) {
62
+ return message;
63
+ }
64
+ var offset = jsonPrefix.length;
65
+ return _objectSpread(_objectSpread({}, message), {}, {
66
+ fix: _objectSpread(_objectSpread({}, fix), {}, {
67
+ range: [fix.range[0] - offset, fix.range[1] - offset]
68
+ })
69
+ });
70
+ });
71
+ },
72
+ supportsAutofix: true
55
73
  }
56
- };
57
- exports.processors = processors;
74
+ };
@@ -46,5 +46,4 @@ var rule = {
46
46
  };
47
47
  }
48
48
  };
49
- var _default = rule;
50
- exports.default = _default;
49
+ var _default = exports.default = rule;
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
9
+ var _findRoot = require("@manypkg/find-root");
10
+ var _handleAstObject = require("../util/handle-ast-object");
11
+ // Here we only need to specify the major and minor versions
12
+ // In matchMinorVersion, we will check if the versions in resolutions fall in the right ranges.
13
+ var DESIRED_PKG_VERSIONS = {
14
+ typescript: '4.9',
15
+ '@types/react': '16.14'
16
+ };
17
+ var matchMinorVersion = function matchMinorVersion(desiredVersion, versionInResolutions) {
18
+ var firstChar = versionInResolutions[0];
19
+ // The version is invalid if it doesn't start with a number or ~
20
+ if (!/^\d$/.test(firstChar) && firstChar !== '~') {
21
+ return false;
22
+ }
23
+ return versionInResolutions.startsWith(desiredVersion) || versionInResolutions.startsWith('~' + desiredVersion);
24
+ };
25
+ var verifyResolutionFromObject = function verifyResolutionFromObject(node, pkg, version, optional) {
26
+ // For root package.json, we require the critical packages' resolutions exist and with matching version
27
+ // For individual package's package.json, it's ok if resolutions don't exist. But if they do, the version should match
28
+ var resolutionExist = node.properties.some(function (p) {
29
+ return p.type === 'Property' && p.key.type === 'Literal' && p.key.value === pkg;
30
+ });
31
+ if (!resolutionExist) {
32
+ return optional;
33
+ }
34
+ var resolutionExistAndMatch = node.properties.some(function (p) {
35
+ return p.type === 'Property' && p.key.type === 'Literal' && p.key.value === pkg && p.value.type === 'Literal' && matchMinorVersion(version, p.value.value);
36
+ });
37
+ return resolutionExistAndMatch;
38
+ };
39
+ var rule = {
40
+ meta: {
41
+ type: 'problem',
42
+ docs: {
43
+ description: 'Enforce the versions of critical packages are within desired ranges by checking resolutions section in package.json',
44
+ recommended: true
45
+ },
46
+ hasSuggestions: false,
47
+ messages: {
48
+ invalidPackageResolution: "Make sure the resolutions for the following packages match major and minor version ranges ".concat(JSON.stringify(DESIRED_PKG_VERSIONS))
49
+ }
50
+ },
51
+ create: function create(context) {
52
+ var fileName = context.getFilename();
53
+ return {
54
+ ObjectExpression: function (_ObjectExpression) {
55
+ function ObjectExpression(_x) {
56
+ return _ObjectExpression.apply(this, arguments);
57
+ }
58
+ ObjectExpression.toString = function () {
59
+ return _ObjectExpression.toString();
60
+ };
61
+ return ObjectExpression;
62
+ }(function (node) {
63
+ if (!fileName.endsWith('package.json') || node.type !== 'ObjectExpression') {
64
+ return;
65
+ }
66
+ var packageResolutions = (0, _handleAstObject.getObjectPropertyAsObject)(node, 'resolutions');
67
+ var rootDir = (0, _findRoot.findRootSync)(process.cwd());
68
+ var isRootPackageJson = fileName.endsWith("".concat(rootDir, "/package.json"));
69
+ if (packageResolutions !== null) {
70
+ for (var _i = 0, _Object$entries = Object.entries(DESIRED_PKG_VERSIONS); _i < _Object$entries.length; _i++) {
71
+ var _Object$entries$_i = (0, _slicedToArray2.default)(_Object$entries[_i], 2),
72
+ key = _Object$entries$_i[0],
73
+ value = _Object$entries$_i[1];
74
+ if (!verifyResolutionFromObject(packageResolutions, key, value, !isRootPackageJson)) {
75
+ return context.report({
76
+ node: node,
77
+ messageId: 'invalidPackageResolution'
78
+ });
79
+ }
80
+ }
81
+ }
82
+ })
83
+ };
84
+ }
85
+ };
86
+ var _default = exports.default = rule;
@@ -69,5 +69,4 @@ var rule = {
69
69
  }));
70
70
  }
71
71
  };
72
- var _default = rule;
73
- exports.default = _default;
72
+ var _default = exports.default = rule;
@@ -7,8 +7,8 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports.default = void 0;
8
8
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
9
  var _registrationUtils = require("../util/registration-utils");
10
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
11
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
10
+ 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; }
11
+ 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; }
12
12
  var rule = {
13
13
  meta: {
14
14
  docs: {
@@ -91,5 +91,4 @@ var rule = {
91
91
  }));
92
92
  }
93
93
  };
94
- var _default = rule;
95
- exports.default = _default;
94
+ var _default = exports.default = rule;
@@ -4,30 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
- var getObjectPropertyAsLiteral = function getObjectPropertyAsLiteral(node, property) {
8
- var prop = node.properties.find(function (p) {
9
- return p.type === 'Property' && p.key.type === 'Literal' && p.key.value === property;
10
- });
11
-
12
- // double check for property is to make typescript happy
13
- if ((prop === null || prop === void 0 ? void 0 : prop.type) === 'Property' && (prop === null || prop === void 0 ? void 0 : prop.value.type) === 'Literal') {
14
- var _prop$value$value;
15
- return (_prop$value$value = prop.value.value) !== null && _prop$value$value !== void 0 ? _prop$value$value : null;
16
- }
17
- return null;
18
- };
19
- var getObjectPropertyAsObject = function getObjectPropertyAsObject(node, property) {
20
- var prop = node.properties.find(function (p) {
21
- return p.type === 'Property' && p.key.type === 'Literal' && p.key.value === property;
22
- });
23
-
24
- // double check for property is to make typescript happy
25
- if ((prop === null || prop === void 0 ? void 0 : prop.type) === 'Property' && (prop === null || prop === void 0 ? void 0 : prop.value.type) === 'ObjectExpression') {
26
- var _prop$value;
27
- return (_prop$value = prop.value) !== null && _prop$value !== void 0 ? _prop$value : null;
28
- }
29
- return null;
30
- };
7
+ var _handleAstObject = require("../util/handle-ast-object");
31
8
  var rule = {
32
9
  meta: {
33
10
  type: 'problem',
@@ -61,9 +38,9 @@ var rule = {
61
38
  if (!context.getFilename().endsWith('package.json') || node.type !== 'ObjectExpression') {
62
39
  return;
63
40
  }
64
- var packageName = getObjectPropertyAsLiteral(node, 'name');
65
- var packagePrivate = getObjectPropertyAsLiteral(node, 'private');
66
- var packagePublishConfig = getObjectPropertyAsObject(node, 'publishConfig');
41
+ var packageName = (0, _handleAstObject.getObjectPropertyAsLiteral)(node, 'name');
42
+ var packagePrivate = (0, _handleAstObject.getObjectPropertyAsLiteral)(node, 'private');
43
+ var packagePublishConfig = (0, _handleAstObject.getObjectPropertyAsObject)(node, 'publishConfig');
67
44
 
68
45
  // exit if package is on known exception list
69
46
  if (exceptions && exceptions.findIndex(function (name) {
@@ -95,5 +72,4 @@ var rule = {
95
72
  };
96
73
  }
97
74
  };
98
- var _default = rule;
99
- exports.default = _default;
75
+ var _default = exports.default = rule;
@@ -102,5 +102,4 @@ var rule = {
102
102
  });
103
103
  }
104
104
  };
105
- var _default = rule;
106
- exports.default = _default;
105
+ var _default = exports.default = rule;
@@ -6,8 +6,8 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.default = void 0;
8
8
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
10
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
9
+ 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; }
10
+ 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; }
11
11
  var NESTED_LIMIT = 4;
12
12
  var TEST_RUNNER_IDENTIFIER = 'ffTest';
13
13
  var getDepthOfNestedRunner = function getDepthOfNestedRunner(node) {
@@ -65,5 +65,4 @@ var rule = {
65
65
  });
66
66
  }
67
67
  };
68
- var _default = rule;
69
- exports.default = _default;
68
+ var _default = exports.default = rule;
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
9
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, 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 normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
10
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
11
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
12
+ var rule = {
13
+ meta: {
14
+ type: 'problem',
15
+ docs: {
16
+ description: 'This rule disallows a dependency to be defined in both dependencies and devDependencies',
17
+ recommended: false
18
+ },
19
+ fixable: 'code',
20
+ messages: {
21
+ unexpectedDuplicateDependency: 'Unexpected duplicate dependency {{name}}'
22
+ }
23
+ },
24
+ create: function create(context) {
25
+ var dependencies = new Map();
26
+ var devDependencies = new Map();
27
+ return {
28
+ 'ObjectExpression Property[key.value=dependencies] Property': function ObjectExpressionPropertyKeyValueDependenciesProperty(node) {
29
+ // @ts-expect-error
30
+ dependencies.set(node.key.value, node.key);
31
+ },
32
+ 'ObjectExpression Property[key.value=devDependencies] Property': function ObjectExpressionPropertyKeyValueDevDependenciesProperty(node) {
33
+ // @ts-expect-error
34
+ devDependencies.set(node.key.value, node.key);
35
+ },
36
+ 'Program:exit': function ProgramExit() {
37
+ var _iterator = _createForOfIteratorHelper(devDependencies),
38
+ _step;
39
+ try {
40
+ var _loop = function _loop() {
41
+ var _step$value = (0, _slicedToArray2.default)(_step.value, 2),
42
+ dependency = _step$value[0],
43
+ node = _step$value[1];
44
+ if (dependencies.has(dependency)) {
45
+ context.report({
46
+ data: {
47
+ name: dependency
48
+ },
49
+ fix: function fix(fixer) {
50
+ var _sourceCode$getTokenA;
51
+ var sourceCode = context.getSourceCode();
52
+ var property = node.parent;
53
+ var isLastLine = ((_sourceCode$getTokenA = sourceCode.getTokenAfter(property)) === null || _sourceCode$getTokenA === void 0 ? void 0 : _sourceCode$getTokenA.value) === '}';
54
+ var end = property.loc.end;
55
+ if (!isLastLine) {
56
+ return fixer.removeRange([sourceCode.getIndexFromLoc({
57
+ line: property.loc.start.line,
58
+ column: 0
59
+ }), sourceCode.getIndexFromLoc({
60
+ line: end.line + 1,
61
+ column: 0
62
+ })]);
63
+ }
64
+ var previousToken = sourceCode.getTokenBefore(property);
65
+ return fixer.removeRange([sourceCode.getIndexFromLoc({
66
+ line: previousToken.loc.end.line,
67
+ column: previousToken.loc.end.column - 1
68
+ }), sourceCode.getIndexFromLoc({
69
+ line: end.line,
70
+ column: end.column
71
+ })]);
72
+ },
73
+ messageId: 'unexpectedDuplicateDependency',
74
+ node: node
75
+ });
76
+ }
77
+ };
78
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
79
+ _loop();
80
+ }
81
+ } catch (err) {
82
+ _iterator.e(err);
83
+ } finally {
84
+ _iterator.f();
85
+ }
86
+ }
87
+ };
88
+ }
89
+ };
90
+ var _default = exports.default = rule;
@@ -87,5 +87,4 @@ var rule = {
87
87
  });
88
88
  }
89
89
  };
90
- var _default = rule;
91
- exports.default = _default;
90
+ var _default = exports.default = rule;
@@ -34,5 +34,4 @@ var rule = {
34
34
  });
35
35
  }
36
36
  };
37
- var _default = rule;
38
- exports.default = _default;
37
+ var _default = exports.default = rule;
@@ -30,5 +30,4 @@ var rule = {
30
30
  };
31
31
  }
32
32
  };
33
- var _default = rule;
34
- exports.default = _default;
33
+ var _default = exports.default = rule;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getObjectPropertyAsObject = exports.getObjectPropertyAsLiteral = void 0;
7
+ var getObjectPropertyAsLiteral = exports.getObjectPropertyAsLiteral = function getObjectPropertyAsLiteral(node, property) {
8
+ var prop = node.properties.find(function (p) {
9
+ return p.type === 'Property' && p.key.type === 'Literal' && p.key.value === property;
10
+ });
11
+
12
+ // double check for property is to make typescript happy
13
+ if ((prop === null || prop === void 0 ? void 0 : prop.type) === 'Property' && (prop === null || prop === void 0 ? void 0 : prop.value.type) === 'Literal') {
14
+ var _prop$value$value;
15
+ return (_prop$value$value = prop.value.value) !== null && _prop$value$value !== void 0 ? _prop$value$value : null;
16
+ }
17
+ return null;
18
+ };
19
+ var getObjectPropertyAsObject = exports.getObjectPropertyAsObject = function getObjectPropertyAsObject(node, property) {
20
+ var prop = node.properties.find(function (p) {
21
+ return p.type === 'Property' && p.key.type === 'Literal' && p.key.value === property;
22
+ });
23
+
24
+ // double check for property is to make typescript happy
25
+ if ((prop === null || prop === void 0 ? void 0 : prop.type) === 'Property' && (prop === null || prop === void 0 ? void 0 : prop.value.type) === 'ObjectExpression') {
26
+ var _prop$value;
27
+ return (_prop$value = prop.value) !== null && _prop$value !== void 0 ? _prop$value : null;
28
+ }
29
+ return null;
30
+ };
@@ -11,15 +11,14 @@ var _path = _interopRequireDefault(require("path"));
11
11
  var _fuse = _interopRequireDefault(require("fuse.js"));
12
12
  // defines a "getter" to "type" map, if more types are required for feature flags (like string) add it here!
13
13
  // if you don't want to verify the type use `null` as the value
14
- var getterIdentifierToFlagTypeMap = {
14
+ var getterIdentifierToFlagTypeMap = exports.getterIdentifierToFlagTypeMap = {
15
15
  getBooleanFF: 'boolean',
16
16
  ffTest: 'boolean'
17
17
  };
18
- exports.getterIdentifierToFlagTypeMap = getterIdentifierToFlagTypeMap;
19
18
  // make sure we cache reading the package.json so we don't end up reading it for every instance of this rule.
20
19
  var pkgJsonCache = new Map();
21
20
  // get the ancestor package.json for a given file
22
- var getMetadataForFilename = function getMetadataForFilename(filename) {
21
+ var getMetadataForFilename = exports.getMetadataForFilename = function getMetadataForFilename(filename) {
23
22
  var splitFilename = filename.split(_path.default.sep);
24
23
  for (var i = 0; i < splitFilename.length; i++) {
25
24
  // attempt to search using the filename in the cache to see if we've read the package.json for a sibling file before
@@ -43,5 +42,4 @@ var getMetadataForFilename = function getMetadataForFilename(filename) {
43
42
  };
44
43
  pkgJsonCache.set(pkgJsonPath, metaData);
45
44
  return metaData;
46
- };
47
- exports.getMetadataForFilename = getMetadataForFilename;
45
+ };