@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 CHANGED
@@ -1,5 +1,7 @@
1
1
  # @akinon/eslint-plugin-projectzero
2
2
 
3
+ ## 2.0.0-beta.8
4
+
3
5
  ## 2.0.0-beta.7
4
6
 
5
7
  ## 2.0.0-beta.6
@@ -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',
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@akinon/eslint-plugin-projectzero",
3
- "version": "2.0.0-beta.7",
3
+ "version": "2.0.0-beta.8",
4
4
  "private": false,
5
5
  "description": "ESLint plugin for Project Zero Next",
6
6
  "main": "dist/index.js",
@@ -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 };