@atlaskit/eslint-plugin-platform 0.2.6 → 0.4.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 (62) hide show
  1. package/CHANGELOG.md +34 -22
  2. package/dist/cjs/index.js +26 -11
  3. package/dist/cjs/rules/ensure-atlassian-team/index.js +3 -2
  4. package/dist/cjs/rules/ensure-critical-dependency-resolutions/index.js +23 -13
  5. package/dist/cjs/rules/ensure-feature-flag-prefix/index.js +3 -2
  6. package/dist/cjs/rules/ensure-feature-flag-registration/index.js +2 -3
  7. package/dist/cjs/rules/ensure-publish-valid/index.js +3 -2
  8. package/dist/cjs/rules/ensure-test-runner-arguments/index.js +3 -2
  9. package/dist/cjs/rules/ensure-test-runner-nested-count/index.js +3 -2
  10. package/dist/cjs/rules/no-duplicate-dependencies/index.js +92 -0
  11. package/dist/cjs/rules/no-invalid-feature-flag-usage/index.js +3 -2
  12. package/dist/cjs/rules/no-invalid-storybook-decorator-usage/index.js +3 -2
  13. package/dist/cjs/rules/no-pre-post-installs/index.js +3 -2
  14. package/dist/cjs/rules/util/handle-ast-object.js +3 -5
  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-atlassian-team/index.js +2 -0
  18. package/dist/es2019/rules/ensure-critical-dependency-resolutions/index.js +8 -4
  19. package/dist/es2019/rules/ensure-feature-flag-prefix/index.js +2 -0
  20. package/dist/es2019/rules/ensure-feature-flag-registration/index.js +2 -0
  21. package/dist/es2019/rules/ensure-publish-valid/index.js +2 -0
  22. package/dist/es2019/rules/ensure-test-runner-arguments/index.js +2 -0
  23. package/dist/es2019/rules/ensure-test-runner-nested-count/index.js +2 -0
  24. package/dist/es2019/rules/no-duplicate-dependencies/index.js +67 -0
  25. package/dist/es2019/rules/no-invalid-feature-flag-usage/index.js +2 -0
  26. package/dist/es2019/rules/no-invalid-storybook-decorator-usage/index.js +2 -0
  27. package/dist/es2019/rules/no-pre-post-installs/index.js +2 -0
  28. package/dist/esm/index.js +24 -4
  29. package/dist/esm/rules/ensure-atlassian-team/index.js +2 -0
  30. package/dist/esm/rules/ensure-critical-dependency-resolutions/index.js +22 -11
  31. package/dist/esm/rules/ensure-feature-flag-prefix/index.js +2 -0
  32. package/dist/esm/rules/ensure-feature-flag-registration/index.js +2 -0
  33. package/dist/esm/rules/ensure-publish-valid/index.js +2 -0
  34. package/dist/esm/rules/ensure-test-runner-arguments/index.js +2 -0
  35. package/dist/esm/rules/ensure-test-runner-nested-count/index.js +2 -0
  36. package/dist/esm/rules/no-duplicate-dependencies/index.js +85 -0
  37. package/dist/esm/rules/no-invalid-feature-flag-usage/index.js +2 -0
  38. package/dist/esm/rules/no-invalid-storybook-decorator-usage/index.js +2 -0
  39. package/dist/esm/rules/no-pre-post-installs/index.js +2 -0
  40. package/dist/types/index.d.ts +1 -0
  41. package/dist/types/rules/no-duplicate-dependencies/index.d.ts +3 -0
  42. package/dist/types-ts4.5/index.d.ts +1 -0
  43. package/dist/types-ts4.5/rules/no-duplicate-dependencies/index.d.ts +3 -0
  44. package/package.json +3 -2
  45. package/report.api.md +1 -0
  46. package/src/index.tsx +25 -4
  47. package/src/rules/ensure-atlassian-team/index.ts +1 -0
  48. package/src/rules/ensure-critical-dependency-resolutions/__test__/unit/rule.test.tsx +10 -0
  49. package/src/rules/ensure-critical-dependency-resolutions/index.tsx +13 -10
  50. package/src/rules/ensure-feature-flag-prefix/index.tsx +1 -0
  51. package/src/rules/ensure-feature-flag-registration/index.tsx +1 -0
  52. package/src/rules/ensure-publish-valid/index.ts +1 -0
  53. package/src/rules/ensure-test-runner-arguments/index.tsx +1 -0
  54. package/src/rules/ensure-test-runner-nested-count/index.tsx +1 -0
  55. package/src/rules/no-duplicate-dependencies/__tests__/unit/rule.test.ts +116 -0
  56. package/src/rules/no-duplicate-dependencies/index.ts +84 -0
  57. package/src/rules/no-invalid-feature-flag-usage/index.tsx +1 -0
  58. package/src/rules/no-invalid-storybook-decorator-usage/index.tsx +1 -0
  59. package/src/rules/no-pre-post-installs/index.ts +1 -0
  60. package/tmp/api-report-tmp.d.ts +1 -0
  61. package/tsconfig.app.json +2 -1
  62. package/tsconfig.dev.json +2 -1
@@ -1,13 +1,14 @@
1
1
  import { findRootSync } from '@manypkg/find-root';
2
+ // eslint-disable-next-line import/no-extraneous-dependencies
2
3
  import type { Rule } from 'eslint';
3
4
  import type { ObjectExpression } from 'estree';
4
5
  import { getObjectPropertyAsObject } from '../util/handle-ast-object';
5
6
 
6
7
  // Here we only need to specify the major and minor versions
7
8
  // In matchMinorVersion, we will check if the versions in resolutions fall in the right ranges.
8
- const DESIRED_PKG_VERSIONS: Record<string, string> = {
9
- typescript: '4.9',
10
- '@types/react': '16.14',
9
+ const DESIRED_PKG_VERSIONS: Record<string, string[]> = {
10
+ typescript: ['4.9'],
11
+ '@types/react': ['16.14', '18.2'],
11
12
  };
12
13
 
13
14
  const matchMinorVersion = (
@@ -89,14 +90,16 @@ const rule: Rule.RuleModule = {
89
90
  const isRootPackageJson = fileName.endsWith(`${rootDir}/package.json`);
90
91
 
91
92
  if (packageResolutions !== null) {
92
- for (const [key, value] of Object.entries(DESIRED_PKG_VERSIONS)) {
93
+ for (const [key, values] of Object.entries(DESIRED_PKG_VERSIONS)) {
93
94
  if (
94
- !verifyResolutionFromObject(
95
- packageResolutions as ObjectExpression,
96
- key,
97
- value,
98
- !isRootPackageJson,
99
- )
95
+ !values.some((value) => {
96
+ return verifyResolutionFromObject(
97
+ packageResolutions as ObjectExpression,
98
+ key,
99
+ value,
100
+ !isRootPackageJson,
101
+ );
102
+ })
100
103
  ) {
101
104
  return context.report({
102
105
  node,
@@ -1,3 +1,4 @@
1
+ // eslint-disable-next-line import/no-extraneous-dependencies
1
2
  import type { Rule } from 'eslint';
2
3
  import {
3
4
  getMetadataForFilename,
@@ -1,3 +1,4 @@
1
+ // eslint-disable-next-line import/no-extraneous-dependencies
1
2
  import type { Rule } from 'eslint';
2
3
  import {
3
4
  getMetadataForFilename,
@@ -1,3 +1,4 @@
1
+ // eslint-disable-next-line import/no-extraneous-dependencies
1
2
  import type { Rule } from 'eslint';
2
3
  import {
3
4
  getObjectPropertyAsLiteral,
@@ -1,3 +1,4 @@
1
+ // eslint-disable-next-line import/no-extraneous-dependencies
1
2
  import type { Rule } from 'eslint';
2
3
 
3
4
  const TEST_RUNNER_IDENTIFIER = 'ffTest' as const;
@@ -1,3 +1,4 @@
1
+ // eslint-disable-next-line import/no-extraneous-dependencies
1
2
  import type { Rule } from 'eslint';
2
3
  import type { SimpleCallExpression } from 'estree';
3
4
 
@@ -0,0 +1,116 @@
1
+ import { tester } from '../../../../__tests__/utils/_tester';
2
+ import rule from '../../index';
3
+
4
+ describe('test no-duplicate-dependencies rule', () => {
5
+ tester.run('no-duplicate-dependencies-rule', rule, {
6
+ valid: [
7
+ {
8
+ code: `
9
+ module.exports = {
10
+ "dependencies": {
11
+ "foo": "^1.0.0",
12
+ "bar": "^2.0.0"
13
+ }
14
+ };
15
+ `,
16
+ filename: 'dependencies.json',
17
+ },
18
+ {
19
+ code: `
20
+ module.exports = {
21
+ "devDependencies": {
22
+ "foo": "^1.0.0",
23
+ "bar": "^2.0.0"
24
+ }
25
+ };
26
+ `,
27
+ filename: 'devDependencies.json',
28
+ },
29
+ {
30
+ code: `
31
+ module.exports = {
32
+ "dependencies": {
33
+ "foo": "^1.0.0",
34
+ "bar": "^2.0.0"
35
+ },
36
+ "devDependencies": {
37
+ "baz": "^3.0.0",
38
+ "qux": "^4.0.0"
39
+ }
40
+ };
41
+ `,
42
+ filename: 'devAndDependencies.json',
43
+ },
44
+ ],
45
+ invalid: [
46
+ {
47
+ code: `
48
+ module.exports = {
49
+ "dependencies": {
50
+ "foo": "^1.0.0",
51
+ "bar": "^2.0.0"
52
+ },
53
+ "devDependencies": {
54
+ "foo": "^1.0.0",
55
+ "baz": "^3.0.0",
56
+ "qux": "^4.0.0"
57
+ }
58
+ };
59
+ `,
60
+ output: `
61
+ module.exports = {
62
+ "dependencies": {
63
+ "foo": "^1.0.0",
64
+ "bar": "^2.0.0"
65
+ },
66
+ "devDependencies": {
67
+ "baz": "^3.0.0",
68
+ "qux": "^4.0.0"
69
+ }
70
+ };
71
+ `,
72
+ errors: [
73
+ {
74
+ data: {
75
+ name: 'foo',
76
+ },
77
+ messageId: 'unexpectedDuplicateDependency',
78
+ },
79
+ ],
80
+ filename: 'duplicateDependenciesFirst.json',
81
+ },
82
+ {
83
+ code: `
84
+ module.exports = {
85
+ "dependencies": {
86
+ "bar": "^1.0.0"
87
+ },
88
+ "devDependencies": {
89
+ "foo": "^2.0.0",
90
+ "bar": "^1.0.0"
91
+ }
92
+ };
93
+ `,
94
+ output: `
95
+ module.exports = {
96
+ "dependencies": {
97
+ "bar": "^1.0.0"
98
+ },
99
+ "devDependencies": {
100
+ "foo": "^2.0.0"
101
+ }
102
+ };
103
+ `,
104
+ errors: [
105
+ {
106
+ data: {
107
+ name: 'bar',
108
+ },
109
+ messageId: 'unexpectedDuplicateDependency',
110
+ },
111
+ ],
112
+ filename: 'duplicateDependenciesLast.json',
113
+ },
114
+ ],
115
+ });
116
+ });
@@ -0,0 +1,84 @@
1
+ // eslint-disable-next-line import/no-extraneous-dependencies
2
+ import type { Rule } from 'eslint';
3
+
4
+ const rule: Rule.RuleModule = {
5
+ meta: {
6
+ type: 'problem',
7
+ docs: {
8
+ description:
9
+ 'This rule disallows a dependency to be defined in both dependencies and devDependencies',
10
+ recommended: false,
11
+ },
12
+ fixable: 'code',
13
+ messages: {
14
+ unexpectedDuplicateDependency: 'Unexpected duplicate dependency {{name}}',
15
+ },
16
+ },
17
+ create(context) {
18
+ const dependencies = new Map();
19
+ const devDependencies = new Map();
20
+
21
+ return {
22
+ 'ObjectExpression Property[key.value=dependencies] Property': (
23
+ node: Rule.Node,
24
+ ) => {
25
+ // @ts-expect-error
26
+ dependencies.set(node.key.value, node.key);
27
+ },
28
+ 'ObjectExpression Property[key.value=devDependencies] Property': (
29
+ node: Rule.Node,
30
+ ) => {
31
+ // @ts-expect-error
32
+ devDependencies.set(node.key.value, node.key);
33
+ },
34
+ 'Program:exit': () => {
35
+ for (const [dependency, node] of devDependencies) {
36
+ if (dependencies.has(dependency)) {
37
+ context.report({
38
+ data: {
39
+ name: dependency,
40
+ },
41
+ fix(fixer) {
42
+ const sourceCode = context.getSourceCode();
43
+ const property = node.parent;
44
+ const isLastLine =
45
+ sourceCode.getTokenAfter(property)?.value === '}';
46
+ const end = property.loc.end;
47
+
48
+ if (!isLastLine) {
49
+ return fixer.removeRange([
50
+ sourceCode.getIndexFromLoc({
51
+ line: property.loc.start.line,
52
+ column: 0,
53
+ }),
54
+ sourceCode.getIndexFromLoc({
55
+ line: end.line + 1,
56
+ column: 0,
57
+ }),
58
+ ]);
59
+ }
60
+
61
+ const previousToken = sourceCode.getTokenBefore(property)!;
62
+
63
+ return fixer.removeRange([
64
+ sourceCode.getIndexFromLoc({
65
+ line: previousToken.loc.end.line,
66
+ column: previousToken.loc.end.column - 1,
67
+ }),
68
+ sourceCode.getIndexFromLoc({
69
+ line: end.line,
70
+ column: end.column,
71
+ }),
72
+ ]);
73
+ },
74
+ messageId: 'unexpectedDuplicateDependency',
75
+ node,
76
+ });
77
+ }
78
+ }
79
+ },
80
+ };
81
+ },
82
+ };
83
+
84
+ export default rule;
@@ -1,3 +1,4 @@
1
+ // eslint-disable-next-line import/no-extraneous-dependencies
1
2
  import type { Rule } from 'eslint';
2
3
  import type { Node, Expression } from 'estree';
3
4
 
@@ -1,3 +1,4 @@
1
+ // eslint-disable-next-line import/no-extraneous-dependencies
1
2
  import type { Rule } from 'eslint';
2
3
 
3
4
  const STORYBOOK_DECORATOR_IDENTIFIER = 'withPlatformFeatureFlags' as const;
@@ -1,3 +1,4 @@
1
+ // eslint-disable-next-line import/no-extraneous-dependencies
1
2
  import type { Rule } from 'eslint';
2
3
 
3
4
  const rule: Rule.RuleModule = {
@@ -38,6 +38,7 @@ export const rules: {
38
38
  'ensure-test-runner-nested-count': Rule.RuleModule;
39
39
  'ensure-atlassian-team': Rule.RuleModule;
40
40
  'ensure-critical-dependency-resolutions': Rule.RuleModule;
41
+ 'no-duplicate-dependencies': Rule.RuleModule;
41
42
  'no-invalid-feature-flag-usage': Rule.RuleModule;
42
43
  'no-pre-post-install-scripts': Rule.RuleModule;
43
44
  'no-invalid-storybook-decorator-usage': Rule.RuleModule;
package/tsconfig.app.json CHANGED
@@ -32,5 +32,6 @@
32
32
  "composite": true,
33
33
  "outDir": "../../../tsDist/@atlaskit__eslint-plugin-platform/app"
34
34
  },
35
- "references": []
35
+ "references": [],
36
+ "files": []
36
37
  }
package/tsconfig.dev.json CHANGED
@@ -36,5 +36,6 @@
36
36
  {
37
37
  "path": "tsconfig.app.json"
38
38
  }
39
- ]
39
+ ],
40
+ "files": []
40
41
  }