@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
@@ -3,6 +3,7 @@ import Fuse from 'fuse.js';
3
3
  export declare const getterIdentifierToFlagTypeMap: {
4
4
  readonly getBooleanFF: "boolean";
5
5
  readonly ffTest: "boolean";
6
+ readonly fg: "boolean";
6
7
  };
7
8
  export type PlatformFeatureFlagRegistrationSection = {
8
9
  [key: string]: {
@@ -0,0 +1,7 @@
1
+ import type { Rule, Scope } from 'eslint';
2
+ export declare function isIdentifierImportedFrom(identifierName: string, sources: Set<string>, context: Rule.RuleContext): boolean;
3
+ export declare function isAPIimport(functionName: string, context: Rule.RuleContext): boolean;
4
+ export declare function getDef(name: string, context: Rule.RuleContext): Scope.Definition | null | undefined;
5
+ export type Node<T extends Rule.Node['type']> = Extract<Rule.Node, {
6
+ type: T;
7
+ }>;
package/index.js CHANGED
@@ -6,19 +6,19 @@ const path = require('path');
6
6
  const paths = require('tsconfig-paths');
7
7
 
8
8
  if (!require.extensions['.ts']) {
9
- // ts-node can only handle being registered once, see https://github.com/TypeStrong/ts-node/issues/409
10
- require('ts-node').register({
11
- project: path.join(__dirname, 'tsconfig.json'),
12
- });
9
+ // ts-node can only handle being registered once, see https://github.com/TypeStrong/ts-node/issues/409
10
+ require('ts-node').register({
11
+ project: path.join(__dirname, 'tsconfig.json'),
12
+ });
13
13
  }
14
14
 
15
15
  try {
16
- // We programatically register tsconfig paths here so it picks up the tsconfig here
17
- // instead of in root CWD.
18
- paths.register(paths.loadConfig(__dirname));
16
+ // We programatically register tsconfig paths here so it picks up the tsconfig here
17
+ // instead of in root CWD.
18
+ paths.register(paths.loadConfig(__dirname));
19
19
  } catch (e) {
20
- // eslint-disable-next-line no-console
21
- console.log(e);
20
+ // eslint-disable-next-line no-console
21
+ console.log(e);
22
22
  }
23
23
 
24
24
  module.exports = require('./src/index');
package/package.json CHANGED
@@ -1,45 +1,44 @@
1
1
  {
2
- "name": "@atlaskit/eslint-plugin-platform",
3
- "description": "The essential plugin for use with Atlassian frontend platform tools",
4
- "version": "0.6.1",
5
- "author": "Atlassian Pty Ltd",
6
- "atlassian": {
7
- "team": "UIP - Platform Integration Trust (PITa)",
8
- "releaseModel": "continuous",
9
- "inPublicMirror": true
10
- },
11
- "publishConfig": {
12
- "registry": "https://registry.npmjs.org/"
13
- },
14
- "repository": "https://bitbucket.org/atlassian/atlassian-frontend-mirror",
15
- "main": "dist/cjs/index.js",
16
- "module": "dist/esm/index.js",
17
- "module:es2019": "dist/es2019/index.js",
18
- "types": "dist/types/index.d.ts",
19
- "typesVersions": {
20
- ">=4.5 <4.9": {
21
- "*": [
22
- "dist/types-ts4.5/*",
23
- "dist/types-ts4.5/index.d.ts"
24
- ]
25
- }
26
- },
27
- "sideEffects": false,
28
- "atlaskit:src": "src/index.tsx",
29
- "af:exports": {
30
- ".": "./src/index.tsx"
31
- },
32
- "dependencies": {
33
- "@babel/runtime": "^7.0.0",
34
- "@manypkg/find-root": "^1.1.0",
35
- "fuse.js": "^6.6.2",
36
- "read-pkg-up": "^7.0.1"
37
- },
38
- "devDependencies": {
39
- "@atlassian/atlassian-frontend-prettier-config-1.0.1": "npm:@atlassian/atlassian-frontend-prettier-config@1.0.1",
40
- "@types/eslint": "^8.4.5",
41
- "eslint": "^8.49.0",
42
- "tsconfig-paths": "^4.2.0"
43
- },
44
- "prettier": "@atlassian/atlassian-frontend-prettier-config-1.0.1"
45
- }
2
+ "name": "@atlaskit/eslint-plugin-platform",
3
+ "description": "The essential plugin for use with Atlassian frontend platform tools",
4
+ "version": "0.7.0",
5
+ "author": "Atlassian Pty Ltd",
6
+ "atlassian": {
7
+ "team": "UIP - Platform Integration Trust (PITa)",
8
+ "releaseModel": "continuous",
9
+ "inPublicMirror": true
10
+ },
11
+ "publishConfig": {
12
+ "registry": "https://registry.npmjs.org/"
13
+ },
14
+ "repository": "https://bitbucket.org/atlassian/atlassian-frontend-mirror",
15
+ "main": "dist/cjs/index.js",
16
+ "module": "dist/esm/index.js",
17
+ "module:es2019": "dist/es2019/index.js",
18
+ "types": "dist/types/index.d.ts",
19
+ "typesVersions": {
20
+ ">=4.5 <4.9": {
21
+ "*": [
22
+ "dist/types-ts4.5/*",
23
+ "dist/types-ts4.5/index.d.ts"
24
+ ]
25
+ }
26
+ },
27
+ "sideEffects": false,
28
+ "atlaskit:src": "src/index.tsx",
29
+ "af:exports": {
30
+ ".": "./src/index.tsx"
31
+ },
32
+ "dependencies": {
33
+ "@babel/runtime": "^7.0.0",
34
+ "@manypkg/find-root": "^1.1.0",
35
+ "fuse.js": "^6.6.2",
36
+ "read-pkg-up": "^7.0.1"
37
+ },
38
+ "devDependencies": {
39
+ "@types/eslint": "^8.56.6",
40
+ "eslint": "^8.49.0",
41
+ "outdent": "^0.5.0",
42
+ "tsconfig-paths": "^4.2.0"
43
+ }
44
+ }
package/report.api.md CHANGED
@@ -2,7 +2,8 @@
2
2
 
3
3
  ## API Report File for "@atlaskit/eslint-plugin-platform"
4
4
 
5
- > Do not edit this file. This report is auto-generated using [API Extractor](https://api-extractor.com/).
5
+ > Do not edit this file. This report is auto-generated using
6
+ > [API Extractor](https://api-extractor.com/).
6
7
  > [Learn more about API reports](https://hello.atlassian.net/wiki/spaces/UR/pages/1825484529/Package+API+Reports)
7
8
 
8
9
  ### Table of contents
@@ -20,43 +21,43 @@ import { Rule } from 'eslint';
20
21
 
21
22
  // @public (undocumented)
22
23
  export const configs: {
23
- recommended: {
24
- plugins: string[];
25
- rules: {
26
- '@atlaskit/platform/ensure-feature-flag-registration': string;
27
- '@atlaskit/platform/ensure-feature-flag-prefix': (
28
- | string
29
- | {
30
- allowedPrefixes: string[];
31
- }
32
- )[];
33
- '@atlaskit/platform/ensure-test-runner-arguments': string;
34
- '@atlaskit/platform/ensure-test-runner-nested-count': string;
35
- '@atlaskit/platform/no-invalid-feature-flag-usage': string;
36
- '@atlaskit/platform/no-invalid-storybook-decorator-usage': string;
37
- '@atlaskit/platform/ensure-atlassian-team': string;
38
- };
39
- };
24
+ recommended: {
25
+ plugins: string[];
26
+ rules: {
27
+ '@atlaskit/platform/ensure-feature-flag-registration': string;
28
+ '@atlaskit/platform/ensure-feature-flag-prefix': (
29
+ | string
30
+ | {
31
+ allowedPrefixes: string[];
32
+ }
33
+ )[];
34
+ '@atlaskit/platform/ensure-test-runner-arguments': string;
35
+ '@atlaskit/platform/ensure-test-runner-nested-count': string;
36
+ '@atlaskit/platform/no-invalid-feature-flag-usage': string;
37
+ '@atlaskit/platform/no-invalid-storybook-decorator-usage': string;
38
+ '@atlaskit/platform/ensure-atlassian-team': string;
39
+ };
40
+ };
40
41
  };
41
42
 
42
43
  // @public (undocumented)
43
44
  export const processors: {
44
- 'package-json-processor': Linter.Processor<Linter.ProcessorFile | string>;
45
+ 'package-json-processor': Linter.Processor<Linter.ProcessorFile | string>;
45
46
  };
46
47
 
47
48
  // @public (undocumented)
48
49
  export const rules: {
49
- 'ensure-feature-flag-registration': Rule.RuleModule;
50
- 'ensure-feature-flag-prefix': Rule.RuleModule;
51
- 'ensure-test-runner-arguments': Rule.RuleModule;
52
- 'ensure-test-runner-nested-count': Rule.RuleModule;
53
- 'ensure-atlassian-team': Rule.RuleModule;
54
- 'ensure-critical-dependency-resolutions': Rule.RuleModule;
55
- 'no-duplicate-dependencies': Rule.RuleModule;
56
- 'no-invalid-feature-flag-usage': Rule.RuleModule;
57
- 'no-pre-post-install-scripts': Rule.RuleModule;
58
- 'no-invalid-storybook-decorator-usage': Rule.RuleModule;
59
- 'ensure-publish-valid': Rule.RuleModule;
50
+ 'ensure-feature-flag-registration': Rule.RuleModule;
51
+ 'ensure-feature-flag-prefix': Rule.RuleModule;
52
+ 'ensure-test-runner-arguments': Rule.RuleModule;
53
+ 'ensure-test-runner-nested-count': Rule.RuleModule;
54
+ 'ensure-atlassian-team': Rule.RuleModule;
55
+ 'ensure-critical-dependency-resolutions': Rule.RuleModule;
56
+ 'no-duplicate-dependencies': Rule.RuleModule;
57
+ 'no-invalid-feature-flag-usage': Rule.RuleModule;
58
+ 'no-pre-post-install-scripts': Rule.RuleModule;
59
+ 'no-invalid-storybook-decorator-usage': Rule.RuleModule;
60
+ 'ensure-publish-valid': Rule.RuleModule;
60
61
  };
61
62
 
62
63
  // (No @packageDocumentation comment for this package)
@@ -3,24 +3,24 @@
3
3
  import { RuleTester } from 'eslint';
4
4
 
5
5
  (RuleTester as any).describe = (text: string, method: Function) => {
6
- const origHasAssertions = expect.hasAssertions;
7
- describe(text, () => {
8
- beforeAll(() => {
9
- // Stub out expect.hasAssertions beforeEach from jest-presetup.js
10
- expect.hasAssertions = () => {};
11
- });
12
- afterAll(() => {
13
- expect.hasAssertions = origHasAssertions;
14
- });
6
+ const origHasAssertions = expect.hasAssertions;
7
+ describe(text, () => {
8
+ beforeAll(() => {
9
+ // Stub out expect.hasAssertions beforeEach from jest-presetup.js
10
+ expect.hasAssertions = () => {};
11
+ });
12
+ afterAll(() => {
13
+ expect.hasAssertions = origHasAssertions;
14
+ });
15
15
 
16
- method();
17
- });
16
+ method();
17
+ });
18
18
  };
19
19
 
20
20
  export const tester = new RuleTester({
21
- parser: require.resolve('@babel/eslint-parser'),
22
- parserOptions: {
23
- ecmaVersion: 6,
24
- sourceType: 'module',
25
- },
21
+ parser: require.resolve('@babel/eslint-parser'),
22
+ parserOptions: {
23
+ ecmaVersion: 6,
24
+ sourceType: 'module',
25
+ },
26
26
  });
package/src/index.tsx CHANGED
@@ -9,69 +9,120 @@ import noDuplicateDependencies from './rules/no-duplicate-dependencies';
9
9
  import noInvalidFeatureFlagUsage from './rules/no-invalid-feature-flag-usage';
10
10
  import ensureFeatureFlagPrefix from './rules/ensure-feature-flag-prefix';
11
11
  import ensureCriticalDependencyResolutions from './rules/ensure-critical-dependency-resolutions';
12
+ import ensureValidEmotionCssProp from './rules/ensure-valid-emotion-css-prop';
12
13
  import noInvalidStorybookDecoratorUsage from './rules/no-invalid-storybook-decorator-usage';
13
14
  import ensurePublishValid from './rules/ensure-publish-valid';
14
15
  import ensureNativeAndAfExportsSynced from './rules/ensure-native-and-af-exports-synced';
16
+ import noModuleLevelEval from './rules/no-module-level-eval';
17
+ import staticFeatureFlags from './rules/static-feature-flags';
18
+ import noPreconditioning from './rules/no-preconditioning';
19
+ import inlineUsage from './rules/inline-usage';
20
+ import preferFG from './rules/prefer-fg';
21
+ import noAlias from './rules/no-alias';
22
+ import useRecommendedUtils from './rules/use-recommended-utils';
15
23
 
16
24
  export const rules = {
17
- 'ensure-feature-flag-registration': ensureFeatureFlagRegistration,
18
- 'ensure-feature-flag-prefix': ensureFeatureFlagPrefix,
19
- 'ensure-test-runner-arguments': ensureTestRunnerArguments,
20
- 'ensure-test-runner-nested-count': ensureTestRunnerNestedCount,
21
- 'ensure-atlassian-team': ensureAtlassianTeam,
22
- 'ensure-critical-dependency-resolutions': ensureCriticalDependencyResolutions,
23
- 'no-duplicate-dependencies': noDuplicateDependencies,
24
- 'no-invalid-feature-flag-usage': noInvalidFeatureFlagUsage,
25
- 'no-pre-post-install-scripts': noPreAndPostInstallScripts,
26
- 'no-invalid-storybook-decorator-usage': noInvalidStorybookDecoratorUsage,
27
- 'ensure-publish-valid': ensurePublishValid,
28
- 'ensure-native-and-af-exports-synced': ensureNativeAndAfExportsSynced,
25
+ 'ensure-feature-flag-registration': ensureFeatureFlagRegistration,
26
+ 'ensure-feature-flag-prefix': ensureFeatureFlagPrefix,
27
+ 'ensure-test-runner-arguments': ensureTestRunnerArguments,
28
+ 'ensure-test-runner-nested-count': ensureTestRunnerNestedCount,
29
+ 'ensure-atlassian-team': ensureAtlassianTeam,
30
+ 'ensure-critical-dependency-resolutions': ensureCriticalDependencyResolutions,
31
+ 'ensure-valid-emotion-css-prop': ensureValidEmotionCssProp,
32
+ 'no-duplicate-dependencies': noDuplicateDependencies,
33
+ 'no-invalid-feature-flag-usage': noInvalidFeatureFlagUsage,
34
+ 'no-pre-post-install-scripts': noPreAndPostInstallScripts,
35
+ 'no-invalid-storybook-decorator-usage': noInvalidStorybookDecoratorUsage,
36
+ 'ensure-publish-valid': ensurePublishValid,
37
+ 'ensure-native-and-af-exports-synced': ensureNativeAndAfExportsSynced,
38
+ 'no-module-level-eval': noModuleLevelEval,
39
+ 'static-feature-flags': staticFeatureFlags,
40
+ 'no-preconditioning': noPreconditioning,
41
+ 'inline-usage': inlineUsage,
42
+ 'prefer-fg': preferFG,
43
+ 'no-alias': noAlias,
44
+ 'use-recommended-utils': useRecommendedUtils,
29
45
  };
30
46
 
31
47
  export const configs = {
32
- recommended: {
33
- plugins: ['@atlaskit/platform'],
34
- rules: {
35
- '@atlaskit/platform/ensure-feature-flag-registration': 'error',
36
- '@atlaskit/platform/ensure-feature-flag-prefix': [
37
- 'error',
38
- { allowedPrefixes: ['platform.'] },
39
- ],
40
- '@atlaskit/platform/ensure-test-runner-arguments': 'error',
41
- '@atlaskit/platform/ensure-test-runner-nested-count': 'warn',
42
- '@atlaskit/platform/no-invalid-feature-flag-usage': 'error',
43
- '@atlaskit/platform/no-invalid-storybook-decorator-usage': 'error',
44
- '@atlaskit/platform/ensure-atlassian-team': 'error',
45
- },
46
- },
48
+ recommended: {
49
+ plugins: ['@atlaskit/platform'],
50
+ rules: {
51
+ '@atlaskit/platform/ensure-feature-flag-registration': 'error',
52
+ '@atlaskit/platform/ensure-feature-flag-prefix': [
53
+ 'error',
54
+ { allowedPrefixes: ['platform.'] },
55
+ ],
56
+ '@atlaskit/platform/ensure-test-runner-arguments': 'error',
57
+ '@atlaskit/platform/ensure-test-runner-nested-count': 'warn',
58
+ '@atlaskit/platform/no-invalid-feature-flag-usage': 'error',
59
+ '@atlaskit/platform/no-invalid-storybook-decorator-usage': 'error',
60
+ '@atlaskit/platform/ensure-atlassian-team': 'error',
61
+ '@atlaskit/platform/no-module-level-eval': 'error',
62
+ '@atlaskit/platform/static-feature-flags': 'error',
63
+ '@atlaskit/platform/no-preconditioning': 'error',
64
+ '@atlaskit/platform/inline-usage': 'error',
65
+ '@atlaskit/platform/prefer-fg': 'error',
66
+ '@atlaskit/platform/no-alias': 'error',
67
+ },
68
+ },
47
69
  };
48
70
 
49
71
  const jsonPrefix =
50
- '/* eslint-disable quote-props, comma-dangle, quotes, semi, eol-last, @typescript-eslint/semi, no-template-curly-in-string */ module.exports = ';
72
+ '/* eslint-disable quote-props, comma-dangle, quotes, semi, eol-last, @typescript-eslint/semi, no-template-curly-in-string */ module.exports = ';
73
+
74
+ const jsonPrefixForFlatConfig =
75
+ '/* eslint-disable quote-props, comma-dangle, quotes, semi, eol-last, no-template-curly-in-string */ module.exports = ';
51
76
 
52
77
  export const processors = {
53
- 'package-json-processor': {
54
- preprocess: (source: string) => {
55
- // augment the json into a js file
56
- return [jsonPrefix + source.trim()];
57
- },
58
- postprocess: (messages) => {
59
- return messages[0].map((message) => {
60
- const { fix } = message;
61
- if (!fix) {
62
- return message;
63
- }
78
+ 'package-json-processor': {
79
+ preprocess: (source: string) => {
80
+ // augment the json into a js file
81
+ return [jsonPrefix + source.trim()];
82
+ },
83
+ postprocess: (messages) => {
84
+ return messages[0].map((message) => {
85
+ const { fix } = message;
86
+ if (!fix) {
87
+ return message;
88
+ }
89
+
90
+ const offset = jsonPrefix.length;
91
+ return {
92
+ ...message,
93
+ fix: {
94
+ ...fix,
95
+ range: [fix.range[0] - offset, fix.range[1] - offset],
96
+ },
97
+ };
98
+ });
99
+ },
100
+ supportsAutofix: true,
101
+ } as Linter.Processor,
102
+ // This processor is used for ESLint FlatConfig,
103
+ // once we roll out FlatConfig, we can remove the above processor
104
+ 'package-json-processor-for-flat-config': {
105
+ preprocess: (source: string) => {
106
+ // augment the json into a js file
107
+ return [jsonPrefixForFlatConfig + source.trim()];
108
+ },
109
+ postprocess: (messages) => {
110
+ return messages[0].map((message) => {
111
+ const { fix } = message;
112
+ if (!fix) {
113
+ return message;
114
+ }
64
115
 
65
- const offset = jsonPrefix.length;
66
- return {
67
- ...message,
68
- fix: {
69
- ...fix,
70
- range: [fix.range[0] - offset, fix.range[1] - offset],
71
- },
72
- };
73
- });
74
- },
75
- supportsAutofix: true,
76
- } as Linter.Processor,
116
+ const offset = jsonPrefixForFlatConfig.length;
117
+ return {
118
+ ...message,
119
+ fix: {
120
+ ...fix,
121
+ range: [fix.range[0] - offset, fix.range[1] - offset],
122
+ },
123
+ };
124
+ });
125
+ },
126
+ supportsAutofix: true,
127
+ } as Linter.Processor,
77
128
  };
@@ -0,0 +1,20 @@
1
+ // List of libraries that we maintain or have worked on
2
+ // - eg `@atlaskit/feature-gate-js-client` shouldn't be included in here
3
+ export const FEATURE_API_IMPORT_SOURCES = new Set([
4
+ '@atlassian/jira-feature-flagging',
5
+ '@atlassian/jira-feature-flagging-using-meta',
6
+ '@atlassian/jira-feature-gating',
7
+ '@atlassian/jira-feature-experiments',
8
+ '@atlaskit/platform-feature-flags',
9
+ ]);
10
+
11
+ export const FEATURE_MOCKS_IMPORT_SOURCES = new Set([
12
+ '@atlassian/jira-feature-flagging-mocks',
13
+ '@atlassian/jira-feature-gates-test-mocks',
14
+ '@atlassian/jira-feature-gates-storybook-mocks',
15
+ ]);
16
+
17
+ export const FEATURE_UTILS_IMPORT_SOURCES = new Set([
18
+ '@atlassian/jira-feature-flagging-utils',
19
+ '@atlassian/jira-feature-gate-component',
20
+ ]);
@@ -2,23 +2,23 @@ import { tester } from '../../../../__tests__/utils/_tester';
2
2
  import rule from '../../index';
3
3
 
4
4
  describe('test no-pre-post-installs rule', () => {
5
- tester.run('no-pre-post-installs', rule, {
6
- valid: [
7
- {
8
- code: `const foo = {}`,
9
- filename: 'package.json',
10
- },
11
- {
12
- code: `const foo = { "atlassian": { "team": "bar" } }`,
13
- filename: 'foo/package.json',
14
- },
15
- ],
16
- invalid: [
17
- {
18
- code: `const foo = { "atlassian": {} }`,
19
- filename: 'foo/package.json',
20
- errors: [{ messageId: 'atlassianTeamRequired' }],
21
- },
22
- ],
23
- });
5
+ tester.run('no-pre-post-installs', rule, {
6
+ valid: [
7
+ {
8
+ code: `const foo = {}`,
9
+ filename: 'package.json',
10
+ },
11
+ {
12
+ code: `const foo = { "atlassian": { "team": "bar" } }`,
13
+ filename: 'foo/package.json',
14
+ },
15
+ ],
16
+ invalid: [
17
+ {
18
+ code: `const foo = { "atlassian": {} }`,
19
+ filename: 'foo/package.json',
20
+ errors: [{ messageId: 'atlassianTeamRequired' }],
21
+ },
22
+ ],
23
+ });
24
24
  });
@@ -2,63 +2,50 @@
2
2
  import type { Rule } from 'eslint';
3
3
 
4
4
  const rule: Rule.RuleModule = {
5
- meta: {
6
- type: 'problem',
7
- docs: {
8
- description:
9
- 'This rule ensures that the internal packages have a responsible team attached.',
10
- recommended: true,
11
- },
12
- hasSuggestions: false,
13
- messages: {
14
- atlassianTeamRequired: 'The atlassian.team property is required',
15
- },
16
- },
17
- create(context) {
18
- return {
19
- ObjectExpression: (node: Rule.Node) => {
20
- if (
21
- !context.getFilename().endsWith('package.json') ||
22
- node.type !== 'ObjectExpression'
23
- ) {
24
- return;
25
- }
5
+ meta: {
6
+ type: 'problem',
7
+ docs: {
8
+ description: 'This rule ensures that the internal packages have a responsible team attached.',
9
+ recommended: true,
10
+ },
11
+ hasSuggestions: false,
12
+ messages: {
13
+ atlassianTeamRequired: 'The atlassian.team property is required',
14
+ },
15
+ },
16
+ create(context) {
17
+ return {
18
+ ObjectExpression: (node: Rule.Node) => {
19
+ if (!context.getFilename().endsWith('package.json') || node.type !== 'ObjectExpression') {
20
+ return;
21
+ }
26
22
 
27
- const atlassianProp = node.properties.find(
28
- (p) =>
29
- p.type === 'Property' &&
30
- p.key.type === 'Literal' &&
31
- p.key.value === 'atlassian',
32
- );
23
+ const atlassianProp = node.properties.find(
24
+ (p) => p.type === 'Property' && p.key.type === 'Literal' && p.key.value === 'atlassian',
25
+ );
33
26
 
34
- if (!atlassianProp) {
35
- return;
36
- }
27
+ if (!atlassianProp) {
28
+ return;
29
+ }
37
30
 
38
- if (
39
- atlassianProp.type !== 'Property' ||
40
- atlassianProp.value.type !== 'ObjectExpression'
41
- ) {
42
- return;
43
- }
31
+ if (atlassianProp.type !== 'Property' || atlassianProp.value.type !== 'ObjectExpression') {
32
+ return;
33
+ }
44
34
 
45
- const teamProp = atlassianProp.value.properties.find(
46
- (p) =>
47
- p.type === 'Property' &&
48
- p.key.type === 'Literal' &&
49
- p.key.value === 'team',
50
- );
35
+ const teamProp = atlassianProp.value.properties.find(
36
+ (p) => p.type === 'Property' && p.key.type === 'Literal' && p.key.value === 'team',
37
+ );
51
38
 
52
- // this just checks for existence, we can potentially cross-reference it with teams.json to make sure its valid in the future.
53
- if (!teamProp) {
54
- return context.report({
55
- node,
56
- messageId: 'atlassianTeamRequired',
57
- });
58
- }
59
- },
60
- };
61
- },
39
+ // this just checks for existence, we can potentially cross-reference it with teams.json to make sure its valid in the future.
40
+ if (!teamProp) {
41
+ return context.report({
42
+ node,
43
+ messageId: 'atlassianTeamRequired',
44
+ });
45
+ }
46
+ },
47
+ };
48
+ },
62
49
  };
63
50
 
64
51
  export default rule;