@akinon/eslint-plugin-projectzero 2.0.0-beta.7 → 2.0.0-beta.8
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 +2 -0
- package/dist/rules/check-pre-order-middleware-order.js +87 -0
- package/dist/rules/check-sentry-options.js +1 -11
- package/dist/rules/index.js +3 -1
- package/package.json +1 -1
- package/rules/check-pre-order-middleware-order.ts +116 -0
- package/rules/check-sentry-options.ts +1 -12
- package/rules/index.ts +3 -1
package/CHANGELOG.md
CHANGED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const utils_1 = require("@typescript-eslint/utils");
|
|
4
|
+
const CORRECT_PRE_ORDER_MIDDLEWARE_ORDER = [
|
|
5
|
+
'shippingStepMiddleware',
|
|
6
|
+
'installmentOptionMiddleware',
|
|
7
|
+
'paymentOptionMiddleware',
|
|
8
|
+
'attributeBasedShippingOptionMiddleware',
|
|
9
|
+
'dataSourceShippingOptionMiddleware',
|
|
10
|
+
'shippingOptionMiddleware',
|
|
11
|
+
'setAddressMiddleware',
|
|
12
|
+
'deliveryOptionMiddleware',
|
|
13
|
+
'setPreOrderMiddleware',
|
|
14
|
+
'redirectionMiddleware',
|
|
15
|
+
'preOrderValidationMiddleware'
|
|
16
|
+
];
|
|
17
|
+
exports.default = utils_1.ESLintUtils.RuleCreator.withoutDocs({
|
|
18
|
+
create(context) {
|
|
19
|
+
function checkPreOrderMiddlewareOrder(node) {
|
|
20
|
+
if (!isPreOrderMiddlewaresDeclaration(node)) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const arrayExpression = node.init;
|
|
24
|
+
const foundOrder = extractMiddlewareNames(arrayExpression);
|
|
25
|
+
validateMiddlewareOrder(foundOrder, node);
|
|
26
|
+
}
|
|
27
|
+
function isPreOrderMiddlewaresDeclaration(node) {
|
|
28
|
+
var _a;
|
|
29
|
+
return (node.id.type === utils_1.AST_NODE_TYPES.Identifier &&
|
|
30
|
+
node.id.name === 'preOrderMiddlewares' &&
|
|
31
|
+
((_a = node.init) === null || _a === void 0 ? void 0 : _a.type) === utils_1.AST_NODE_TYPES.ArrayExpression);
|
|
32
|
+
}
|
|
33
|
+
function extractMiddlewareNames(arrayExpression) {
|
|
34
|
+
return arrayExpression.elements
|
|
35
|
+
.map((element) => {
|
|
36
|
+
if ((element === null || element === void 0 ? void 0 : element.type) === utils_1.AST_NODE_TYPES.Identifier) {
|
|
37
|
+
return element.name;
|
|
38
|
+
}
|
|
39
|
+
return null;
|
|
40
|
+
})
|
|
41
|
+
.filter((name) => Boolean(name));
|
|
42
|
+
}
|
|
43
|
+
function validateMiddlewareOrder(foundOrder, node) {
|
|
44
|
+
for (let i = 0; i < foundOrder.length; i++) {
|
|
45
|
+
const middleware = foundOrder[i];
|
|
46
|
+
const correctIndex = CORRECT_PRE_ORDER_MIDDLEWARE_ORDER.indexOf(middleware);
|
|
47
|
+
if (correctIndex === -1) {
|
|
48
|
+
context.report({
|
|
49
|
+
node,
|
|
50
|
+
messageId: 'unknownMiddleware',
|
|
51
|
+
data: { middleware }
|
|
52
|
+
});
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
if (i !== correctIndex) {
|
|
56
|
+
context.report({
|
|
57
|
+
node,
|
|
58
|
+
messageId: 'incorrectPreOrderMiddlewarePosition',
|
|
59
|
+
data: {
|
|
60
|
+
middleware,
|
|
61
|
+
currentPosition: i + 1,
|
|
62
|
+
expectedPosition: correctIndex + 1
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return {
|
|
70
|
+
VariableDeclarator: checkPreOrderMiddlewareOrder
|
|
71
|
+
};
|
|
72
|
+
},
|
|
73
|
+
meta: {
|
|
74
|
+
type: 'problem',
|
|
75
|
+
docs: {
|
|
76
|
+
description: 'Enforces the correct order of pre-order middlewares',
|
|
77
|
+
// @ts-expect-error
|
|
78
|
+
recommended: 'error'
|
|
79
|
+
},
|
|
80
|
+
schema: [],
|
|
81
|
+
messages: {
|
|
82
|
+
incorrectPreOrderMiddlewarePosition: '{{middleware}} is at position {{currentPosition}}, but it should be at position {{expectedPosition}}.',
|
|
83
|
+
unknownMiddleware: '{{middleware}} is not recognized as a valid pre-order middleware.'
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
defaultOptions: []
|
|
87
|
+
});
|
|
@@ -33,15 +33,6 @@ exports.default = utils_1.ESLintUtils.RuleCreator.withoutDocs({
|
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
35
|
}
|
|
36
|
-
if (key === 'tracesSampleRate') {
|
|
37
|
-
const traceRate = property.value.value;
|
|
38
|
-
if (traceRate !== 1.0) {
|
|
39
|
-
context.report({
|
|
40
|
-
node: property,
|
|
41
|
-
messageId: 'incorrectTraceRate'
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
36
|
}
|
|
46
37
|
});
|
|
47
38
|
}
|
|
@@ -51,8 +42,7 @@ exports.default = utils_1.ESLintUtils.RuleCreator.withoutDocs({
|
|
|
51
42
|
},
|
|
52
43
|
meta: {
|
|
53
44
|
messages: {
|
|
54
|
-
invalidDsn: 'Sentry DSN should not be empty.'
|
|
55
|
-
incorrectTraceRate: 'Sentry tracesSampleRate should be set to 1.0.'
|
|
45
|
+
invalidDsn: 'Sentry DSN should not be empty.'
|
|
56
46
|
},
|
|
57
47
|
type: 'problem',
|
|
58
48
|
fixable: 'code',
|
package/dist/rules/index.js
CHANGED
|
@@ -17,6 +17,7 @@ const invalid_imports_1 = __importDefault(require("./invalid-imports"));
|
|
|
17
17
|
const case_warning_1 = __importDefault(require("./case-warning"));
|
|
18
18
|
const check_sentry_options_1 = __importDefault(require("./check-sentry-options"));
|
|
19
19
|
const check_menu_depth_1 = __importDefault(require("./check-menu-depth"));
|
|
20
|
+
const check_pre_order_middleware_order_1 = __importDefault(require("./check-pre-order-middleware-order"));
|
|
20
21
|
const rules = {
|
|
21
22
|
'client-url': client_url_1.default,
|
|
22
23
|
'image-import': image_import_1.default,
|
|
@@ -30,6 +31,7 @@ const rules = {
|
|
|
30
31
|
'invalid-imports': invalid_imports_1.default,
|
|
31
32
|
'case-warning': case_warning_1.default,
|
|
32
33
|
'check-sentry-options': check_sentry_options_1.default,
|
|
33
|
-
'check-menu-depth': check_menu_depth_1.default
|
|
34
|
+
'check-menu-depth': check_menu_depth_1.default,
|
|
35
|
+
'check-pre-order-middleware-order': check_pre_order_middleware_order_1.default
|
|
34
36
|
};
|
|
35
37
|
exports.rules = rules;
|
package/package.json
CHANGED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AST_NODE_TYPES,
|
|
3
|
+
ESLintUtils,
|
|
4
|
+
TSESTree
|
|
5
|
+
} from '@typescript-eslint/utils';
|
|
6
|
+
import { RuleContext } from '@typescript-eslint/utils/dist/ts-eslint';
|
|
7
|
+
|
|
8
|
+
const CORRECT_PRE_ORDER_MIDDLEWARE_ORDER = [
|
|
9
|
+
'shippingStepMiddleware',
|
|
10
|
+
'installmentOptionMiddleware',
|
|
11
|
+
'paymentOptionMiddleware',
|
|
12
|
+
'attributeBasedShippingOptionMiddleware',
|
|
13
|
+
'dataSourceShippingOptionMiddleware',
|
|
14
|
+
'shippingOptionMiddleware',
|
|
15
|
+
'setAddressMiddleware',
|
|
16
|
+
'deliveryOptionMiddleware',
|
|
17
|
+
'setPreOrderMiddleware',
|
|
18
|
+
'redirectionMiddleware',
|
|
19
|
+
'preOrderValidationMiddleware'
|
|
20
|
+
];
|
|
21
|
+
|
|
22
|
+
type MessageIds = 'incorrectPreOrderMiddlewarePosition' | 'unknownMiddleware';
|
|
23
|
+
type Options = [];
|
|
24
|
+
|
|
25
|
+
export default ESLintUtils.RuleCreator.withoutDocs({
|
|
26
|
+
create(context: RuleContext<MessageIds, Options>) {
|
|
27
|
+
function checkPreOrderMiddlewareOrder(
|
|
28
|
+
node: TSESTree.VariableDeclarator
|
|
29
|
+
): void {
|
|
30
|
+
if (!isPreOrderMiddlewaresDeclaration(node)) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const arrayExpression = node.init as TSESTree.ArrayExpression;
|
|
35
|
+
const foundOrder = extractMiddlewareNames(arrayExpression);
|
|
36
|
+
|
|
37
|
+
validateMiddlewareOrder(foundOrder, node);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function isPreOrderMiddlewaresDeclaration(
|
|
41
|
+
node: TSESTree.VariableDeclarator
|
|
42
|
+
): boolean {
|
|
43
|
+
return (
|
|
44
|
+
node.id.type === AST_NODE_TYPES.Identifier &&
|
|
45
|
+
node.id.name === 'preOrderMiddlewares' &&
|
|
46
|
+
node.init?.type === AST_NODE_TYPES.ArrayExpression
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function extractMiddlewareNames(
|
|
51
|
+
arrayExpression: TSESTree.ArrayExpression
|
|
52
|
+
): string[] {
|
|
53
|
+
return arrayExpression.elements
|
|
54
|
+
.map((element) => {
|
|
55
|
+
if (element?.type === AST_NODE_TYPES.Identifier) {
|
|
56
|
+
return element.name;
|
|
57
|
+
}
|
|
58
|
+
return null;
|
|
59
|
+
})
|
|
60
|
+
.filter((name): name is string => Boolean(name));
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function validateMiddlewareOrder(
|
|
64
|
+
foundOrder: string[],
|
|
65
|
+
node: TSESTree.Node
|
|
66
|
+
): void {
|
|
67
|
+
for (let i = 0; i < foundOrder.length; i++) {
|
|
68
|
+
const middleware = foundOrder[i];
|
|
69
|
+
const correctIndex =
|
|
70
|
+
CORRECT_PRE_ORDER_MIDDLEWARE_ORDER.indexOf(middleware);
|
|
71
|
+
|
|
72
|
+
if (correctIndex === -1) {
|
|
73
|
+
context.report({
|
|
74
|
+
node,
|
|
75
|
+
messageId: 'unknownMiddleware',
|
|
76
|
+
data: { middleware }
|
|
77
|
+
});
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
if (i !== correctIndex) {
|
|
82
|
+
context.report({
|
|
83
|
+
node,
|
|
84
|
+
messageId: 'incorrectPreOrderMiddlewarePosition',
|
|
85
|
+
data: {
|
|
86
|
+
middleware,
|
|
87
|
+
currentPosition: i + 1,
|
|
88
|
+
expectedPosition: correctIndex + 1
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
return {
|
|
97
|
+
VariableDeclarator: checkPreOrderMiddlewareOrder
|
|
98
|
+
};
|
|
99
|
+
},
|
|
100
|
+
meta: {
|
|
101
|
+
type: 'problem',
|
|
102
|
+
docs: {
|
|
103
|
+
description: 'Enforces the correct order of pre-order middlewares',
|
|
104
|
+
// @ts-expect-error
|
|
105
|
+
recommended: 'error'
|
|
106
|
+
},
|
|
107
|
+
schema: [],
|
|
108
|
+
messages: {
|
|
109
|
+
incorrectPreOrderMiddlewarePosition:
|
|
110
|
+
'{{middleware}} is at position {{currentPosition}}, but it should be at position {{expectedPosition}}.',
|
|
111
|
+
unknownMiddleware:
|
|
112
|
+
'{{middleware}} is not recognized as a valid pre-order middleware.'
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
defaultOptions: []
|
|
116
|
+
});
|
|
@@ -42,16 +42,6 @@ export default ESLintUtils.RuleCreator.withoutDocs({
|
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
44
|
}
|
|
45
|
-
|
|
46
|
-
if (key === 'tracesSampleRate') {
|
|
47
|
-
const traceRate = (property.value as TSESTree.Literal).value;
|
|
48
|
-
if (traceRate !== 1.0) {
|
|
49
|
-
context.report({
|
|
50
|
-
node: property,
|
|
51
|
-
messageId: 'incorrectTraceRate'
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
45
|
}
|
|
56
46
|
});
|
|
57
47
|
}
|
|
@@ -61,8 +51,7 @@ export default ESLintUtils.RuleCreator.withoutDocs({
|
|
|
61
51
|
},
|
|
62
52
|
meta: {
|
|
63
53
|
messages: {
|
|
64
|
-
invalidDsn: 'Sentry DSN should not be empty.'
|
|
65
|
-
incorrectTraceRate: 'Sentry tracesSampleRate should be set to 1.0.'
|
|
54
|
+
invalidDsn: 'Sentry DSN should not be empty.'
|
|
66
55
|
},
|
|
67
56
|
type: 'problem',
|
|
68
57
|
fixable: 'code',
|
package/rules/index.ts
CHANGED
|
@@ -11,6 +11,7 @@ import invalidImports from './invalid-imports';
|
|
|
11
11
|
import caseWarning from './case-warning';
|
|
12
12
|
import checkSentryOptions from './check-sentry-options';
|
|
13
13
|
import checkMenuDepth from './check-menu-depth';
|
|
14
|
+
import checkPreOrderMiddlewareOrder from './check-pre-order-middleware-order';
|
|
14
15
|
|
|
15
16
|
const rules = {
|
|
16
17
|
'client-url': clientUrl,
|
|
@@ -25,7 +26,8 @@ const rules = {
|
|
|
25
26
|
'invalid-imports': invalidImports,
|
|
26
27
|
'case-warning': caseWarning,
|
|
27
28
|
'check-sentry-options': checkSentryOptions,
|
|
28
|
-
'check-menu-depth': checkMenuDepth
|
|
29
|
+
'check-menu-depth': checkMenuDepth,
|
|
30
|
+
'check-pre-order-middleware-order': checkPreOrderMiddlewareOrder
|
|
29
31
|
};
|
|
30
32
|
|
|
31
33
|
export { rules };
|