@atlaskit/eslint-plugin-platform 0.6.1 → 0.7.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 (126) hide show
  1. package/CHANGELOG.md +103 -28
  2. package/afm-jira/tsconfig.json +20 -0
  3. package/dist/cjs/index.js +48 -2
  4. package/dist/cjs/rules/constants.js +11 -0
  5. package/dist/cjs/rules/ensure-critical-dependency-resolutions/index.js +54 -6
  6. package/dist/cjs/rules/ensure-native-and-af-exports-synced/index.js +16 -7
  7. package/dist/cjs/rules/ensure-valid-emotion-css-prop/index.js +91 -0
  8. package/dist/cjs/rules/inline-usage/index.js +94 -0
  9. package/dist/cjs/rules/no-alias/index.js +64 -0
  10. package/dist/cjs/rules/no-module-level-eval/index.js +45 -0
  11. package/dist/cjs/rules/no-preconditioning/index.js +108 -0
  12. package/dist/cjs/rules/prefer-fg/index.js +106 -0
  13. package/dist/cjs/rules/static-feature-flags/index.js +63 -0
  14. package/dist/cjs/rules/use-recommended-utils/index.js +47 -0
  15. package/dist/cjs/rules/util/registration-utils.js +2 -1
  16. package/dist/cjs/rules/utils.js +53 -0
  17. package/dist/es2019/index.js +52 -2
  18. package/dist/es2019/rules/constants.js +5 -0
  19. package/dist/es2019/rules/ensure-critical-dependency-resolutions/index.js +52 -6
  20. package/dist/es2019/rules/ensure-native-and-af-exports-synced/index.js +15 -7
  21. package/dist/es2019/rules/ensure-valid-emotion-css-prop/index.js +87 -0
  22. package/dist/es2019/rules/inline-usage/index.js +90 -0
  23. package/dist/es2019/rules/no-alias/index.js +58 -0
  24. package/dist/es2019/rules/no-module-level-eval/index.js +39 -0
  25. package/dist/es2019/rules/no-preconditioning/index.js +105 -0
  26. package/dist/es2019/rules/prefer-fg/index.js +81 -0
  27. package/dist/es2019/rules/static-feature-flags/index.js +54 -0
  28. package/dist/es2019/rules/use-recommended-utils/index.js +41 -0
  29. package/dist/es2019/rules/util/registration-utils.js +2 -1
  30. package/dist/es2019/rules/utils.js +29 -0
  31. package/dist/esm/index.js +48 -2
  32. package/dist/esm/rules/constants.js +5 -0
  33. package/dist/esm/rules/ensure-critical-dependency-resolutions/index.js +54 -6
  34. package/dist/esm/rules/ensure-native-and-af-exports-synced/index.js +16 -7
  35. package/dist/esm/rules/ensure-valid-emotion-css-prop/index.js +85 -0
  36. package/dist/esm/rules/inline-usage/index.js +87 -0
  37. package/dist/esm/rules/no-alias/index.js +57 -0
  38. package/dist/esm/rules/no-module-level-eval/index.js +39 -0
  39. package/dist/esm/rules/no-preconditioning/index.js +102 -0
  40. package/dist/esm/rules/prefer-fg/index.js +99 -0
  41. package/dist/esm/rules/static-feature-flags/index.js +56 -0
  42. package/dist/esm/rules/use-recommended-utils/index.js +41 -0
  43. package/dist/esm/rules/util/registration-utils.js +2 -1
  44. package/dist/esm/rules/utils.js +45 -0
  45. package/dist/types/index.d.ts +15 -0
  46. package/dist/types/rules/constants.d.ts +3 -0
  47. package/dist/types/rules/ensure-valid-emotion-css-prop/index.d.ts +3 -0
  48. package/dist/types/rules/inline-usage/index.d.ts +3 -0
  49. package/dist/types/rules/no-alias/index.d.ts +3 -0
  50. package/dist/types/rules/no-module-level-eval/index.d.ts +3 -0
  51. package/dist/types/rules/no-preconditioning/index.d.ts +3 -0
  52. package/dist/types/rules/prefer-fg/index.d.ts +3 -0
  53. package/dist/types/rules/static-feature-flags/index.d.ts +3 -0
  54. package/dist/types/rules/use-recommended-utils/index.d.ts +3 -0
  55. package/dist/types/rules/util/registration-utils.d.ts +1 -0
  56. package/dist/types/rules/utils.d.ts +7 -0
  57. package/dist/types-ts4.5/index.d.ts +15 -0
  58. package/dist/types-ts4.5/rules/constants.d.ts +3 -0
  59. package/dist/types-ts4.5/rules/ensure-valid-emotion-css-prop/index.d.ts +3 -0
  60. package/dist/types-ts4.5/rules/inline-usage/index.d.ts +3 -0
  61. package/dist/types-ts4.5/rules/no-alias/index.d.ts +3 -0
  62. package/dist/types-ts4.5/rules/no-module-level-eval/index.d.ts +3 -0
  63. package/dist/types-ts4.5/rules/no-preconditioning/index.d.ts +3 -0
  64. package/dist/types-ts4.5/rules/prefer-fg/index.d.ts +3 -0
  65. package/dist/types-ts4.5/rules/static-feature-flags/index.d.ts +3 -0
  66. package/dist/types-ts4.5/rules/use-recommended-utils/index.d.ts +3 -0
  67. package/dist/types-ts4.5/rules/util/registration-utils.d.ts +1 -0
  68. package/dist/types-ts4.5/rules/utils.d.ts +7 -0
  69. package/index.js +9 -9
  70. package/package.json +43 -44
  71. package/report.api.md +31 -30
  72. package/src/__tests__/utils/_tester.tsx +16 -16
  73. package/src/index.tsx +102 -51
  74. package/src/rules/constants.tsx +20 -0
  75. package/src/rules/ensure-atlassian-team/__tests__/unit/rule.test.ts +19 -19
  76. package/src/rules/ensure-atlassian-team/index.ts +39 -52
  77. package/src/rules/ensure-critical-dependency-resolutions/__test__/unit/rule.test.tsx +146 -81
  78. package/src/rules/ensure-critical-dependency-resolutions/index.tsx +152 -97
  79. package/src/rules/ensure-feature-flag-prefix/__tests__/unit/rule.test.tsx +51 -51
  80. package/src/rules/ensure-feature-flag-prefix/index.tsx +65 -80
  81. package/src/rules/ensure-feature-flag-registration/__tests__/unit/rule.test.tsx +97 -97
  82. package/src/rules/ensure-feature-flag-registration/index.tsx +88 -105
  83. package/src/rules/ensure-native-and-af-exports-synced/__tests__/unit/rule.test.tsx +180 -180
  84. package/src/rules/ensure-native-and-af-exports-synced/index.tsx +162 -168
  85. package/src/rules/ensure-publish-valid/__tests__/unit/rule.test.ts +34 -36
  86. package/src/rules/ensure-publish-valid/index.ts +66 -81
  87. package/src/rules/ensure-test-runner-arguments/__tests__/unit/rule.test.tsx +93 -93
  88. package/src/rules/ensure-test-runner-arguments/index.tsx +107 -121
  89. package/src/rules/ensure-test-runner-nested-count/__tests__/unit/rule.test.tsx +43 -43
  90. package/src/rules/ensure-test-runner-nested-count/index.tsx +68 -70
  91. package/src/rules/ensure-valid-emotion-css-prop/__tests__/unit/rule.test.ts +142 -0
  92. package/src/rules/ensure-valid-emotion-css-prop/index.ts +96 -0
  93. package/src/rules/inline-usage/README.md +53 -0
  94. package/src/rules/inline-usage/__tests__/rule.test.tsx +106 -0
  95. package/src/rules/inline-usage/index.tsx +130 -0
  96. package/src/rules/no-alias/README.md +29 -0
  97. package/src/rules/no-alias/__tests__/rule.test.tsx +76 -0
  98. package/src/rules/no-alias/index.tsx +75 -0
  99. package/src/rules/no-duplicate-dependencies/__tests__/unit/rule.test.ts +44 -44
  100. package/src/rules/no-duplicate-dependencies/index.ts +68 -73
  101. package/src/rules/no-invalid-feature-flag-usage/__tests__/unit/rule.test.tsx +64 -64
  102. package/src/rules/no-invalid-feature-flag-usage/index.tsx +105 -112
  103. package/src/rules/no-invalid-storybook-decorator-usage/__tests__/unit/rule.test.tsx +13 -13
  104. package/src/rules/no-invalid-storybook-decorator-usage/index.tsx +28 -30
  105. package/src/rules/no-module-level-eval/README.md +53 -0
  106. package/src/rules/no-module-level-eval/__tests__/test.tsx +133 -0
  107. package/src/rules/no-module-level-eval/index.tsx +52 -0
  108. package/src/rules/no-pre-post-installs/__tests__/unit/rule.test.ts +36 -36
  109. package/src/rules/no-pre-post-installs/index.ts +27 -27
  110. package/src/rules/no-preconditioning/README.md +69 -0
  111. package/src/rules/no-preconditioning/__tests__/rule.test.tsx +164 -0
  112. package/src/rules/no-preconditioning/index.tsx +138 -0
  113. package/src/rules/prefer-fg/README.md +3 -0
  114. package/src/rules/prefer-fg/__tests__/rule.test.tsx +83 -0
  115. package/src/rules/prefer-fg/index.tsx +108 -0
  116. package/src/rules/static-feature-flags/README.md +3 -0
  117. package/src/rules/static-feature-flags/__tests__/test.tsx +135 -0
  118. package/src/rules/static-feature-flags/index.tsx +103 -0
  119. package/src/rules/use-recommended-utils/README.md +67 -0
  120. package/src/rules/use-recommended-utils/__tests__/rule.test.tsx +78 -0
  121. package/src/rules/use-recommended-utils/index.tsx +57 -0
  122. package/src/rules/util/handle-ast-object.ts +21 -32
  123. package/src/rules/util/registration-utils.ts +31 -30
  124. package/src/rules/utils.tsx +46 -0
  125. package/tsconfig.app.json +35 -35
  126. package/tsconfig.dev.json +39 -39
@@ -1,95 +1,80 @@
1
1
  // eslint-disable-next-line import/no-extraneous-dependencies
2
2
  import type { Rule } from 'eslint';
3
- import {
4
- getMetadataForFilename,
5
- getterIdentifierToFlagTypeMap,
6
- } from '../util/registration-utils';
3
+ import { getMetadataForFilename, getterIdentifierToFlagTypeMap } from '../util/registration-utils';
7
4
 
8
5
  type RuleOptions = {
9
- allowedPrefixes: string[];
6
+ allowedPrefixes: string[];
10
7
  };
11
8
 
12
9
  const rule: Rule.RuleModule = {
13
- meta: {
14
- docs: {
15
- recommended: false,
16
- },
17
- type: 'problem',
18
- messages: {
19
- featureFlagIncorrectPrefix: `Please change your flag "{{ featureFlag }}" to have a valid prefix, options are [{{ allowedPrefixes }}]. See http://go/pff-eslint for details`,
20
- },
21
- hasSuggestions: true,
22
- schema: [
23
- {
24
- type: 'object',
25
- properties: {
26
- allowedPrefixes: {
27
- type: 'array',
28
- items: [
29
- {
30
- type: 'string',
31
- },
32
- ],
33
- },
34
- },
35
- required: ['allowedPrefixes'],
36
- },
37
- ],
38
- },
39
- create(context) {
40
- const { allowedPrefixes } = (context.options?.[0] as RuleOptions) ?? {};
10
+ meta: {
11
+ docs: {
12
+ recommended: false,
13
+ },
14
+ type: 'problem',
15
+ messages: {
16
+ featureFlagIncorrectPrefix: `Please change your flag "{{ featureFlag }}" to have a valid prefix, options are [{{ allowedPrefixes }}]. See http://go/pff-eslint for details`,
17
+ },
18
+ hasSuggestions: true,
19
+ schema: [
20
+ {
21
+ type: 'object',
22
+ properties: {
23
+ allowedPrefixes: {
24
+ type: 'array',
25
+ items: [
26
+ {
27
+ type: 'string',
28
+ },
29
+ ],
30
+ },
31
+ },
32
+ required: ['allowedPrefixes'],
33
+ },
34
+ ],
35
+ },
36
+ create(context) {
37
+ const { allowedPrefixes } = (context.options?.[0] as RuleOptions) ?? {};
41
38
 
42
- return Object.fromEntries(
43
- (
44
- Object.keys(
45
- getterIdentifierToFlagTypeMap,
46
- ) as (keyof typeof getterIdentifierToFlagTypeMap)[]
47
- ).map((getterIdentifier) => [
48
- `CallExpression[callee.name=/${getterIdentifier}/]`,
49
- (node: Rule.Node) => {
50
- // to make typescript happy
51
- if (node.type === 'CallExpression') {
52
- const args = node.arguments;
39
+ return Object.fromEntries(
40
+ (
41
+ Object.keys(getterIdentifierToFlagTypeMap) as (keyof typeof getterIdentifierToFlagTypeMap)[]
42
+ ).map((getterIdentifier) => [
43
+ `CallExpression[callee.name=/${getterIdentifier}/]`,
44
+ (node: Rule.Node) => {
45
+ // to make typescript happy
46
+ if (node.type === 'CallExpression') {
47
+ const args = node.arguments;
53
48
 
54
- const filename = context.getFilename();
55
- const { pkgJson: packageJson } = getMetadataForFilename(filename);
56
- const platformFeatureFlags = packageJson['platform-feature-flags'];
49
+ const filename = context.getFilename();
50
+ const { pkgJson: packageJson } = getMetadataForFilename(filename);
51
+ const platformFeatureFlags = packageJson['platform-feature-flags'];
57
52
 
58
- // existence of registration section is done in 'ensure-feature-flag-registration'
59
- if (!platformFeatureFlags) {
60
- return {};
61
- }
53
+ // existence of registration section is done in 'ensure-feature-flag-registration'
54
+ if (!platformFeatureFlags) {
55
+ return {};
56
+ }
62
57
 
63
- if (
64
- args.length === 1 &&
65
- args[0].type === 'Literal' &&
66
- args[0].raw
67
- ) {
68
- const featureFlag = args[0].value as string;
69
- if (
70
- !allowedPrefixes.some((prefix) =>
71
- featureFlag.startsWith(prefix),
72
- )
73
- ) {
74
- return context.report({
75
- node: args[0],
76
- messageId: 'featureFlagIncorrectPrefix',
77
- data: {
78
- allowedPrefixes: allowedPrefixes
79
- .map((p) => `${p}`)
80
- .join(','),
81
- featureFlag,
82
- },
83
- });
84
- }
85
- }
86
- }
58
+ if (args.length === 1 && args[0].type === 'Literal' && args[0].raw) {
59
+ const featureFlag = args[0].value as string;
60
+ if (!allowedPrefixes.some((prefix) => featureFlag.startsWith(prefix))) {
61
+ return context.report({
62
+ node: args[0],
63
+ messageId: 'featureFlagIncorrectPrefix',
64
+ data: {
65
+ allowedPrefixes: allowedPrefixes.map((p) => `${p}`).join(','),
66
+ featureFlag,
67
+ },
68
+ });
69
+ }
70
+ }
71
+ }
87
72
 
88
- return {};
89
- },
90
- ]),
91
- );
92
- },
73
+ return {};
74
+ },
75
+ ]),
76
+ );
77
+ },
93
78
  };
94
79
 
95
80
  export default rule;
@@ -1,115 +1,115 @@
1
1
  import { tester } from '../../../../__tests__/utils/_tester';
2
2
  import rule from '../../index';
3
- import { PackageJson } from 'read-pkg-up';
3
+ import { type PackageJson } from 'read-pkg-up';
4
4
 
5
5
  let mockPath = 'test/package.json';
6
6
 
7
7
  let mockPackageJson: PackageJson = {
8
- 'platform-feature-flags': {
9
- 'test-flag': {
10
- type: 'boolean',
11
- },
12
- },
8
+ 'platform-feature-flags': {
9
+ 'test-flag': {
10
+ type: 'boolean',
11
+ },
12
+ },
13
13
  };
14
14
  jest.mock('read-pkg-up', () => ({
15
- sync: () => ({
16
- path: mockPath,
17
- packageJson: mockPackageJson,
18
- }),
15
+ sync: () => ({
16
+ path: mockPath,
17
+ packageJson: mockPackageJson,
18
+ }),
19
19
  }));
20
20
 
21
21
  describe('with existing platform-feature-flags section', () => {
22
- beforeEach(() => {
23
- mockPath = 'test/package.json';
22
+ beforeEach(() => {
23
+ mockPath = 'test/package.json';
24
24
 
25
- mockPackageJson = {
26
- 'platform-feature-flags': {
27
- 'test-flag': {
28
- type: 'boolean',
29
- },
30
- 'string-flag': {
31
- type: 'string',
32
- },
33
- },
34
- };
35
- });
25
+ mockPackageJson = {
26
+ 'platform-feature-flags': {
27
+ 'test-flag': {
28
+ type: 'boolean',
29
+ },
30
+ 'string-flag': {
31
+ type: 'string',
32
+ },
33
+ },
34
+ };
35
+ });
36
36
 
37
- // this isolates the invalid case so we can test the suggestion properly
38
- tester.run('ensure-feature-flag-registration', rule, {
39
- valid: [
40
- {
41
- code: `getBooleanFF('test-flag')`,
42
- },
43
- {
44
- code: `ffTest('test-flag')`,
45
- },
46
- ],
47
- invalid: [
48
- {
49
- code: `ffTest('test-flag-invalid')`,
50
- errors: [
51
- {
52
- messageId: 'featureFlagMissing',
53
- suggestions: [
54
- {
55
- messageId: 'changeFeatureFlag',
56
- data: {
57
- closestFlag: 'test-flag',
58
- },
59
- output: `ffTest('test-flag')`,
60
- },
61
- ],
62
- },
63
- ],
64
- },
65
- {
66
- code: `getBooleanFF('test-flag-invalid')`,
67
- errors: [
68
- {
69
- messageId: 'featureFlagMissing',
70
- suggestions: [
71
- {
72
- messageId: 'changeFeatureFlag',
73
- data: {
74
- closestFlag: 'test-flag',
75
- },
76
- output: `getBooleanFF('test-flag')`,
77
- },
78
- ],
79
- },
80
- ],
81
- },
82
- {
83
- code: `getBooleanFF('string-flag')`,
84
- errors: [
85
- {
86
- messageId: 'featureFlagIncorrectType',
87
- data: {
88
- featureFlag: 'string-flag',
89
- expectedType: 'boolean',
90
- },
91
- },
92
- ],
93
- },
94
- ],
95
- });
37
+ // this isolates the invalid case so we can test the suggestion properly
38
+ tester.run('ensure-feature-flag-registration', rule, {
39
+ valid: [
40
+ {
41
+ code: `getBooleanFF('test-flag')`,
42
+ },
43
+ {
44
+ code: `ffTest('test-flag')`,
45
+ },
46
+ ],
47
+ invalid: [
48
+ {
49
+ code: `ffTest('test-flag-invalid')`,
50
+ errors: [
51
+ {
52
+ messageId: 'featureFlagMissing',
53
+ suggestions: [
54
+ {
55
+ messageId: 'changeFeatureFlag',
56
+ data: {
57
+ closestFlag: 'test-flag',
58
+ },
59
+ output: `ffTest('test-flag')`,
60
+ },
61
+ ],
62
+ },
63
+ ],
64
+ },
65
+ {
66
+ code: `getBooleanFF('test-flag-invalid')`,
67
+ errors: [
68
+ {
69
+ messageId: 'featureFlagMissing',
70
+ suggestions: [
71
+ {
72
+ messageId: 'changeFeatureFlag',
73
+ data: {
74
+ closestFlag: 'test-flag',
75
+ },
76
+ output: `getBooleanFF('test-flag')`,
77
+ },
78
+ ],
79
+ },
80
+ ],
81
+ },
82
+ {
83
+ code: `getBooleanFF('string-flag')`,
84
+ errors: [
85
+ {
86
+ messageId: 'featureFlagIncorrectType',
87
+ data: {
88
+ featureFlag: 'string-flag',
89
+ expectedType: 'boolean',
90
+ },
91
+ },
92
+ ],
93
+ },
94
+ ],
95
+ });
96
96
  });
97
97
 
98
98
  describe('with missing platform-feature-flags section', () => {
99
- beforeEach(() => {
100
- // change path to bust cache
101
- mockPath = 'invalid-pkg/package.json';
102
- mockPackageJson = {};
103
- });
99
+ beforeEach(() => {
100
+ // change path to bust cache
101
+ mockPath = 'invalid-pkg/package.json';
102
+ mockPackageJson = {};
103
+ });
104
104
 
105
- tester.run('ensure-feature-flag-registration', rule, {
106
- valid: [],
107
- invalid: [
108
- {
109
- filename: 'other-directory/index.ts',
110
- code: `if(getBooleanFF('test-flag')) { }`,
111
- errors: [{ messageId: 'registrationSectionMissing' }],
112
- },
113
- ],
114
- });
105
+ tester.run('ensure-feature-flag-registration', rule, {
106
+ valid: [],
107
+ invalid: [
108
+ {
109
+ filename: 'other-directory/index.ts',
110
+ code: `if(getBooleanFF('test-flag')) { }`,
111
+ errors: [{ messageId: 'registrationSectionMissing' }],
112
+ },
113
+ ],
114
+ });
115
115
  });
@@ -1,123 +1,106 @@
1
1
  // eslint-disable-next-line import/no-extraneous-dependencies
2
2
  import type { Rule } from 'eslint';
3
- import {
4
- getMetadataForFilename,
5
- getterIdentifierToFlagTypeMap,
6
- } from '../util/registration-utils';
3
+ import { getMetadataForFilename, getterIdentifierToFlagTypeMap } from '../util/registration-utils';
7
4
 
8
5
  const rule: Rule.RuleModule = {
9
- meta: {
10
- docs: {
11
- recommended: false,
12
- },
13
- type: 'problem',
14
- messages: {
15
- registrationSectionMissing:
16
- 'Please add a "platform-feature-flags" section to your package.json! See http://go/pff-eslint for more details',
17
- featureFlagMissing: `Please add a "{{ featureFlag }}" section to the "platform-feature-flags" section in your package.json. See http://go/pff-eslint for more details`,
18
- changeFeatureFlag: `Change flag key to "{{ closestFlag }}" already defined in package.json`,
19
- featureFlagIncorrectType: `Please change the type for "{{ featureFlag }}" to "{{ expectedType }}" in the section to the "platform-feature-flags" section in your package.json. See http://go/pff-eslint for more details"`,
20
- },
6
+ meta: {
7
+ docs: {
8
+ recommended: false,
9
+ },
10
+ type: 'problem',
11
+ messages: {
12
+ registrationSectionMissing:
13
+ 'Please add a "platform-feature-flags" section to your package.json! See http://go/pff-eslint for more details',
14
+ featureFlagMissing: `Please add a "{{ featureFlag }}" section to the "platform-feature-flags" section in your package.json. See http://go/pff-eslint for more details`,
15
+ changeFeatureFlag: `Change flag key to "{{ closestFlag }}" already defined in package.json`,
16
+ featureFlagIncorrectType: `Please change the type for "{{ featureFlag }}" to "{{ expectedType }}" in the section to the "platform-feature-flags" section in your package.json. See http://go/pff-eslint for more details"`,
17
+ },
21
18
 
22
- hasSuggestions: true,
23
- },
24
- create(context) {
25
- return Object.fromEntries(
26
- (
27
- Object.keys(
28
- getterIdentifierToFlagTypeMap,
29
- ) as (keyof typeof getterIdentifierToFlagTypeMap)[]
30
- ).map((getterIdentifier) => [
31
- `CallExpression[callee.name=/${getterIdentifier}/]`,
32
- (node: Rule.Node) => {
33
- // to make typescript happy
34
- if (node.type === 'CallExpression') {
35
- const args = node.arguments;
19
+ hasSuggestions: true,
20
+ },
21
+ create(context) {
22
+ return Object.fromEntries(
23
+ (
24
+ Object.keys(getterIdentifierToFlagTypeMap) as (keyof typeof getterIdentifierToFlagTypeMap)[]
25
+ ).map((getterIdentifier) => [
26
+ `CallExpression[callee.name=/${getterIdentifier}/]`,
27
+ (node: Rule.Node) => {
28
+ // to make typescript happy
29
+ if (node.type === 'CallExpression') {
30
+ const args = node.arguments;
36
31
 
37
- const filename = context.getFilename();
38
- const { pkgJson: packageJson, fuse } =
39
- getMetadataForFilename(filename);
40
- const platformFeatureFlags = packageJson['platform-feature-flags'];
32
+ const filename = context.getFilename();
33
+ const { pkgJson: packageJson, fuse } = getMetadataForFilename(filename);
34
+ const platformFeatureFlags = packageJson['platform-feature-flags'];
41
35
 
42
- if (!platformFeatureFlags) {
43
- return context.report({
44
- node: node,
45
- messageId: 'registrationSectionMissing',
46
- });
47
- }
36
+ if (!platformFeatureFlags) {
37
+ return context.report({
38
+ node: node,
39
+ messageId: 'registrationSectionMissing',
40
+ });
41
+ }
48
42
 
49
- if (
50
- args.length === 1 &&
51
- args[0].type === 'Literal' &&
52
- args[0].raw
53
- ) {
54
- const featureFlag = args[0].value as string;
55
- const featureFlagRegistration = platformFeatureFlags[featureFlag];
43
+ if (args.length === 1 && args[0].type === 'Literal' && args[0].raw) {
44
+ const featureFlag = args[0].value as string;
45
+ const featureFlagRegistration = platformFeatureFlags[featureFlag];
56
46
 
57
- const expectedType =
58
- getterIdentifierToFlagTypeMap[getterIdentifier];
47
+ const expectedType = getterIdentifierToFlagTypeMap[getterIdentifier];
59
48
 
60
- // ensure the flag type matches what is registered
61
- if (
62
- featureFlagRegistration != null &&
63
- expectedType != null &&
64
- featureFlagRegistration?.type !== expectedType
65
- ) {
66
- return context.report({
67
- node: args[0],
68
- messageId: 'featureFlagIncorrectType',
69
- data: {
70
- featureFlag,
71
- expectedType,
72
- },
73
- });
74
- }
49
+ // ensure the flag type matches what is registered
50
+ if (
51
+ featureFlagRegistration != null &&
52
+ expectedType != null &&
53
+ featureFlagRegistration?.type !== expectedType
54
+ ) {
55
+ return context.report({
56
+ node: args[0],
57
+ messageId: 'featureFlagIncorrectType',
58
+ data: {
59
+ featureFlag,
60
+ expectedType,
61
+ },
62
+ });
63
+ }
75
64
 
76
- if (!featureFlagRegistration) {
77
- // find the closest match in existing section for suggestion text
78
- let closestMatchFix: Rule.SuggestionReportDescriptor | null =
79
- null;
65
+ if (!featureFlagRegistration) {
66
+ // find the closest match in existing section for suggestion text
67
+ let closestMatchFix: Rule.SuggestionReportDescriptor | null = null;
80
68
 
81
- if (fuse) {
82
- const closestFlagMatches = fuse.search(featureFlag);
83
- if (closestFlagMatches.length > 0) {
84
- const closestFlag = closestFlagMatches[0].item;
69
+ if (fuse) {
70
+ const closestFlagMatches = fuse.search(featureFlag);
71
+ if (closestFlagMatches.length > 0) {
72
+ const closestFlag = closestFlagMatches[0].item;
85
73
 
86
- closestMatchFix = {
87
- messageId: 'changeFeatureFlag',
88
- data: {
89
- closestFlag,
90
- },
91
- fix: (fixer) => {
92
- return fixer.replaceText(
93
- node.arguments[0],
94
- `'${closestFlag}'`,
95
- );
96
- },
97
- };
98
- }
99
- }
74
+ closestMatchFix = {
75
+ messageId: 'changeFeatureFlag',
76
+ data: {
77
+ closestFlag,
78
+ },
79
+ fix: (fixer) => {
80
+ return fixer.replaceText(node.arguments[0], `'${closestFlag}'`);
81
+ },
82
+ };
83
+ }
84
+ }
100
85
 
101
- return context.report({
102
- node: args[0],
103
- messageId: 'featureFlagMissing',
104
- data: {
105
- featureFlag,
106
- },
107
- // only suggest if we have a close flag to match
108
- ...(closestMatchFix != null
109
- ? { suggest: [closestMatchFix] }
110
- : {}),
111
- });
112
- }
113
- }
114
- }
86
+ return context.report({
87
+ node: args[0],
88
+ messageId: 'featureFlagMissing',
89
+ data: {
90
+ featureFlag,
91
+ },
92
+ // only suggest if we have a close flag to match
93
+ ...(closestMatchFix != null ? { suggest: [closestMatchFix] } : {}),
94
+ });
95
+ }
96
+ }
97
+ }
115
98
 
116
- return {};
117
- },
118
- ]),
119
- );
120
- },
99
+ return {};
100
+ },
101
+ ]),
102
+ );
103
+ },
121
104
  };
122
105
 
123
106
  export default rule;