@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.
- package/CHANGELOG.md +34 -22
- package/dist/cjs/index.js +26 -11
- package/dist/cjs/rules/ensure-atlassian-team/index.js +3 -2
- package/dist/cjs/rules/ensure-critical-dependency-resolutions/index.js +23 -13
- package/dist/cjs/rules/ensure-feature-flag-prefix/index.js +3 -2
- package/dist/cjs/rules/ensure-feature-flag-registration/index.js +2 -3
- package/dist/cjs/rules/ensure-publish-valid/index.js +3 -2
- package/dist/cjs/rules/ensure-test-runner-arguments/index.js +3 -2
- package/dist/cjs/rules/ensure-test-runner-nested-count/index.js +3 -2
- package/dist/cjs/rules/no-duplicate-dependencies/index.js +92 -0
- package/dist/cjs/rules/no-invalid-feature-flag-usage/index.js +3 -2
- package/dist/cjs/rules/no-invalid-storybook-decorator-usage/index.js +3 -2
- package/dist/cjs/rules/no-pre-post-installs/index.js +3 -2
- package/dist/cjs/rules/util/handle-ast-object.js +3 -5
- package/dist/cjs/rules/util/registration-utils.js +3 -5
- package/dist/es2019/index.js +25 -2
- package/dist/es2019/rules/ensure-atlassian-team/index.js +2 -0
- package/dist/es2019/rules/ensure-critical-dependency-resolutions/index.js +8 -4
- package/dist/es2019/rules/ensure-feature-flag-prefix/index.js +2 -0
- package/dist/es2019/rules/ensure-feature-flag-registration/index.js +2 -0
- package/dist/es2019/rules/ensure-publish-valid/index.js +2 -0
- package/dist/es2019/rules/ensure-test-runner-arguments/index.js +2 -0
- package/dist/es2019/rules/ensure-test-runner-nested-count/index.js +2 -0
- package/dist/es2019/rules/no-duplicate-dependencies/index.js +67 -0
- package/dist/es2019/rules/no-invalid-feature-flag-usage/index.js +2 -0
- package/dist/es2019/rules/no-invalid-storybook-decorator-usage/index.js +2 -0
- package/dist/es2019/rules/no-pre-post-installs/index.js +2 -0
- package/dist/esm/index.js +24 -4
- package/dist/esm/rules/ensure-atlassian-team/index.js +2 -0
- package/dist/esm/rules/ensure-critical-dependency-resolutions/index.js +22 -11
- package/dist/esm/rules/ensure-feature-flag-prefix/index.js +2 -0
- package/dist/esm/rules/ensure-feature-flag-registration/index.js +2 -0
- package/dist/esm/rules/ensure-publish-valid/index.js +2 -0
- package/dist/esm/rules/ensure-test-runner-arguments/index.js +2 -0
- package/dist/esm/rules/ensure-test-runner-nested-count/index.js +2 -0
- package/dist/esm/rules/no-duplicate-dependencies/index.js +85 -0
- package/dist/esm/rules/no-invalid-feature-flag-usage/index.js +2 -0
- package/dist/esm/rules/no-invalid-storybook-decorator-usage/index.js +2 -0
- package/dist/esm/rules/no-pre-post-installs/index.js +2 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/rules/no-duplicate-dependencies/index.d.ts +3 -0
- package/dist/types-ts4.5/index.d.ts +1 -0
- package/dist/types-ts4.5/rules/no-duplicate-dependencies/index.d.ts +3 -0
- package/package.json +3 -2
- package/report.api.md +1 -0
- package/src/index.tsx +25 -4
- package/src/rules/ensure-atlassian-team/index.ts +1 -0
- package/src/rules/ensure-critical-dependency-resolutions/__test__/unit/rule.test.tsx +10 -0
- package/src/rules/ensure-critical-dependency-resolutions/index.tsx +13 -10
- package/src/rules/ensure-feature-flag-prefix/index.tsx +1 -0
- package/src/rules/ensure-feature-flag-registration/index.tsx +1 -0
- package/src/rules/ensure-publish-valid/index.ts +1 -0
- package/src/rules/ensure-test-runner-arguments/index.tsx +1 -0
- package/src/rules/ensure-test-runner-nested-count/index.tsx +1 -0
- package/src/rules/no-duplicate-dependencies/__tests__/unit/rule.test.ts +116 -0
- package/src/rules/no-duplicate-dependencies/index.ts +84 -0
- package/src/rules/no-invalid-feature-flag-usage/index.tsx +1 -0
- package/src/rules/no-invalid-storybook-decorator-usage/index.tsx +1 -0
- package/src/rules/no-pre-post-installs/index.ts +1 -0
- package/tmp/api-report-tmp.d.ts +1 -0
- package/tsconfig.app.json +2 -1
- 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,
|
|
93
|
+
for (const [key, values] of Object.entries(DESIRED_PKG_VERSIONS)) {
|
|
93
94
|
if (
|
|
94
|
-
!
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
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,
|
|
@@ -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;
|
package/tmp/api-report-tmp.d.ts
CHANGED
|
@@ -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