@atlaskit/eslint-plugin-platform 2.7.0 → 2.7.2

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 (158) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/cjs/index.js +4 -9
  3. package/dist/cjs/rules/constants.js +1 -1
  4. package/dist/cjs/rules/ensure-critical-dependency-resolutions/index.js +7 -7
  5. package/dist/cjs/rules/ensure-native-and-af-exports-synced/index.js +3 -0
  6. package/dist/cjs/rules/ensure-no-private-dependencies/index.js +48 -66
  7. package/dist/cjs/rules/feature-gating/inline-usage/index.js +14 -3
  8. package/dist/cjs/rules/feature-gating/no-alias/index.js +2 -2
  9. package/dist/cjs/rules/feature-gating/no-module-level-eval/index.js +1 -1
  10. package/dist/cjs/rules/feature-gating/no-module-level-eval-nav4/index.js +1 -1
  11. package/dist/cjs/rules/feature-gating/no-preconditioning/index.js +4 -1
  12. package/dist/cjs/rules/feature-gating/prefer-fg/index.js +1 -1
  13. package/dist/cjs/rules/feature-gating/static-feature-flags/index.js +2 -2
  14. package/dist/cjs/rules/feature-gating/use-recommended-utils/index.js +1 -1
  15. package/dist/cjs/rules/no-invalid-storybook-decorator-usage/index.js +1 -1
  16. package/dist/cjs/rules/no-sparse-checkout/index.js +1 -1
  17. package/dist/cjs/rules/prefer-crypto-random-uuid/index.js +87 -0
  18. package/dist/cjs/rules/use-entrypoints-in-examples/index.js +1 -1
  19. package/dist/cjs/rules/util/context-compat.js +4 -2
  20. package/dist/es2019/index.js +4 -9
  21. package/dist/es2019/rules/constants.js +1 -1
  22. package/dist/es2019/rules/ensure-critical-dependency-resolutions/index.js +7 -7
  23. package/dist/es2019/rules/ensure-native-and-af-exports-synced/index.js +3 -0
  24. package/dist/es2019/rules/ensure-no-private-dependencies/index.js +10 -9
  25. package/dist/es2019/rules/feature-gating/inline-usage/index.js +14 -3
  26. package/dist/es2019/rules/feature-gating/no-alias/index.js +2 -2
  27. package/dist/es2019/rules/feature-gating/no-module-level-eval/index.js +1 -1
  28. package/dist/es2019/rules/feature-gating/no-module-level-eval-nav4/index.js +1 -1
  29. package/dist/es2019/rules/feature-gating/no-preconditioning/index.js +4 -1
  30. package/dist/es2019/rules/feature-gating/prefer-fg/index.js +1 -1
  31. package/dist/es2019/rules/feature-gating/static-feature-flags/index.js +2 -2
  32. package/dist/es2019/rules/feature-gating/use-recommended-utils/index.js +1 -1
  33. package/dist/es2019/rules/no-invalid-storybook-decorator-usage/index.js +1 -1
  34. package/dist/es2019/rules/no-sparse-checkout/index.js +1 -1
  35. package/dist/es2019/rules/prefer-crypto-random-uuid/index.js +81 -0
  36. package/dist/es2019/rules/use-entrypoints-in-examples/index.js +1 -1
  37. package/dist/es2019/rules/util/context-compat.js +4 -2
  38. package/dist/esm/index.js +4 -9
  39. package/dist/esm/rules/constants.js +1 -1
  40. package/dist/esm/rules/ensure-critical-dependency-resolutions/index.js +7 -7
  41. package/dist/esm/rules/ensure-native-and-af-exports-synced/index.js +3 -0
  42. package/dist/esm/rules/ensure-no-private-dependencies/index.js +48 -65
  43. package/dist/esm/rules/feature-gating/inline-usage/index.js +14 -3
  44. package/dist/esm/rules/feature-gating/no-alias/index.js +2 -2
  45. package/dist/esm/rules/feature-gating/no-module-level-eval/index.js +1 -1
  46. package/dist/esm/rules/feature-gating/no-module-level-eval-nav4/index.js +1 -1
  47. package/dist/esm/rules/feature-gating/no-preconditioning/index.js +4 -1
  48. package/dist/esm/rules/feature-gating/prefer-fg/index.js +1 -1
  49. package/dist/esm/rules/feature-gating/static-feature-flags/index.js +2 -2
  50. package/dist/esm/rules/feature-gating/use-recommended-utils/index.js +1 -1
  51. package/dist/esm/rules/no-invalid-storybook-decorator-usage/index.js +1 -1
  52. package/dist/esm/rules/no-sparse-checkout/index.js +1 -1
  53. package/dist/esm/rules/prefer-crypto-random-uuid/index.js +81 -0
  54. package/dist/esm/rules/use-entrypoints-in-examples/index.js +1 -1
  55. package/dist/esm/rules/util/context-compat.js +4 -2
  56. package/dist/types/index.d.ts +6 -20
  57. package/dist/types/rules/util/handle-ast-object.d.ts +1 -1
  58. package/dist/types-ts4.5/index.d.ts +6 -32
  59. package/dist/types-ts4.5/rules/util/handle-ast-object.d.ts +1 -1
  60. package/package.json +2 -5
  61. package/afm-cc/tsconfig.json +0 -24
  62. package/afm-jira/tsconfig.json +0 -24
  63. package/build/tsconfig.json +0 -17
  64. package/dist/cjs/rules/ensure-feature-flag-prefix/index.js +0 -75
  65. package/dist/cjs/rules/ensure-valid-platform-yarn-protocol-usage/index.js +0 -79
  66. package/dist/es2019/rules/ensure-feature-flag-prefix/index.js +0 -65
  67. package/dist/es2019/rules/ensure-valid-platform-yarn-protocol-usage/index.js +0 -62
  68. package/dist/esm/rules/ensure-feature-flag-prefix/index.js +0 -69
  69. package/dist/esm/rules/ensure-valid-platform-yarn-protocol-usage/index.js +0 -75
  70. package/dist/types/rules/ensure-feature-flag-prefix/index.d.ts +0 -3
  71. package/dist/types/rules/ensure-valid-platform-yarn-protocol-usage/index.d.ts +0 -3
  72. package/src/__tests__/utils/_tester.tsx +0 -26
  73. package/src/index.tsx +0 -254
  74. package/src/rules/compiled/README.md +0 -3
  75. package/src/rules/compiled/expand-background-shorthand/README.md +0 -23
  76. package/src/rules/compiled/expand-background-shorthand/__tests__/rule.test.ts +0 -160
  77. package/src/rules/compiled/expand-background-shorthand/index.tsx +0 -43
  78. package/src/rules/compiled/expand-border-shorthand/README.md +0 -51
  79. package/src/rules/compiled/expand-border-shorthand/__tests__/rule.test.ts +0 -211
  80. package/src/rules/compiled/expand-border-shorthand/index.ts +0 -103
  81. package/src/rules/compiled/expand-spacing-shorthand/README.md +0 -38
  82. package/src/rules/compiled/expand-spacing-shorthand/__tests__/rule.test.ts +0 -448
  83. package/src/rules/compiled/expand-spacing-shorthand/index.ts +0 -240
  84. package/src/rules/constants.tsx +0 -20
  85. package/src/rules/ensure-atlassian-team/__tests__/unit/rule.test.ts +0 -24
  86. package/src/rules/ensure-atlassian-team/index.ts +0 -51
  87. package/src/rules/ensure-critical-dependency-resolutions/__test__/unit/rule.test.tsx +0 -200
  88. package/src/rules/ensure-critical-dependency-resolutions/index.tsx +0 -172
  89. package/src/rules/ensure-feature-flag-prefix/__tests__/unit/rule.test.tsx +0 -65
  90. package/src/rules/ensure-feature-flag-prefix/index.tsx +0 -81
  91. package/src/rules/ensure-feature-flag-registration/__tests__/unit/rule.test.tsx +0 -115
  92. package/src/rules/ensure-feature-flag-registration/index.tsx +0 -106
  93. package/src/rules/ensure-native-and-af-exports-synced/__tests__/unit/rule.test.tsx +0 -199
  94. package/src/rules/ensure-native-and-af-exports-synced/index.tsx +0 -188
  95. package/src/rules/ensure-no-private-dependencies/__tests__/unit/rule.test.ts +0 -212
  96. package/src/rules/ensure-no-private-dependencies/index.ts +0 -64
  97. package/src/rules/ensure-publish-valid/__tests__/unit/rule.test.ts +0 -39
  98. package/src/rules/ensure-publish-valid/index.ts +0 -81
  99. package/src/rules/ensure-test-runner-arguments/__tests__/unit/rule.test.tsx +0 -298
  100. package/src/rules/ensure-test-runner-arguments/index.tsx +0 -121
  101. package/src/rules/ensure-test-runner-nested-count/__tests__/unit/rule.test.tsx +0 -308
  102. package/src/rules/ensure-test-runner-nested-count/index.tsx +0 -82
  103. package/src/rules/ensure-valid-bin-values/__tests__/unit/rule.test.ts +0 -159
  104. package/src/rules/ensure-valid-bin-values/index.ts +0 -70
  105. package/src/rules/ensure-valid-platform-yarn-protocol-usage/__tests__/unit/rule.test.ts +0 -147
  106. package/src/rules/ensure-valid-platform-yarn-protocol-usage/index.ts +0 -67
  107. package/src/rules/feature-gating/README.md +0 -8
  108. package/src/rules/feature-gating/inline-usage/README.md +0 -53
  109. package/src/rules/feature-gating/inline-usage/__tests__/rule.test.tsx +0 -106
  110. package/src/rules/feature-gating/inline-usage/index.tsx +0 -135
  111. package/src/rules/feature-gating/no-alias/README.md +0 -29
  112. package/src/rules/feature-gating/no-alias/__tests__/rule.test.tsx +0 -76
  113. package/src/rules/feature-gating/no-alias/index.tsx +0 -80
  114. package/src/rules/feature-gating/no-module-level-eval/README.md +0 -53
  115. package/src/rules/feature-gating/no-module-level-eval/__tests__/test.tsx +0 -133
  116. package/src/rules/feature-gating/no-module-level-eval/index.tsx +0 -54
  117. package/src/rules/feature-gating/no-module-level-eval-nav4/README.md +0 -8
  118. package/src/rules/feature-gating/no-module-level-eval-nav4/__tests__/test.tsx +0 -130
  119. package/src/rules/feature-gating/no-module-level-eval-nav4/index.tsx +0 -73
  120. package/src/rules/feature-gating/no-preconditioning/README.md +0 -69
  121. package/src/rules/feature-gating/no-preconditioning/__tests__/rule.test.tsx +0 -164
  122. package/src/rules/feature-gating/no-preconditioning/index.tsx +0 -138
  123. package/src/rules/feature-gating/prefer-fg/README.md +0 -3
  124. package/src/rules/feature-gating/prefer-fg/__tests__/rule.test.tsx +0 -83
  125. package/src/rules/feature-gating/prefer-fg/index.tsx +0 -110
  126. package/src/rules/feature-gating/static-feature-flags/README.md +0 -3
  127. package/src/rules/feature-gating/static-feature-flags/__tests__/test.tsx +0 -135
  128. package/src/rules/feature-gating/static-feature-flags/index.tsx +0 -103
  129. package/src/rules/feature-gating/use-recommended-utils/README.md +0 -67
  130. package/src/rules/feature-gating/use-recommended-utils/__tests__/rule.test.tsx +0 -78
  131. package/src/rules/feature-gating/use-recommended-utils/index.tsx +0 -57
  132. package/src/rules/feature-gating/utils.tsx +0 -48
  133. package/src/rules/no-direct-document-usage/index.tsx +0 -111
  134. package/src/rules/no-duplicate-dependencies/__tests__/unit/rule.test.ts +0 -116
  135. package/src/rules/no-duplicate-dependencies/index.ts +0 -79
  136. package/src/rules/no-invalid-feature-flag-usage/__tests__/unit/rule.test.tsx +0 -69
  137. package/src/rules/no-invalid-feature-flag-usage/index.tsx +0 -128
  138. package/src/rules/no-invalid-storybook-decorator-usage/__tests__/unit/rule.test.tsx +0 -18
  139. package/src/rules/no-invalid-storybook-decorator-usage/index.tsx +0 -39
  140. package/src/rules/no-pre-post-installs/__tests__/unit/rule.test.ts +0 -41
  141. package/src/rules/no-pre-post-installs/index.ts +0 -35
  142. package/src/rules/no-set-immediate/index.tsx +0 -43
  143. package/src/rules/no-sparse-checkout/__tests__/unit/rule.test.tsx +0 -48
  144. package/src/rules/no-sparse-checkout/index.tsx +0 -54
  145. package/src/rules/use-entrypoints-in-examples/README.md +0 -27
  146. package/src/rules/use-entrypoints-in-examples/__tests__/rule.test.tsx +0 -34
  147. package/src/rules/use-entrypoints-in-examples/index.tsx +0 -43
  148. package/src/rules/util/__tests__/context-compat.test.ts +0 -122
  149. package/src/rules/util/compiled-utils.ts +0 -27
  150. package/src/rules/util/context-compat.ts +0 -41
  151. package/src/rules/util/file-exclusions.ts +0 -39
  152. package/src/rules/util/handle-ast-object.ts +0 -33
  153. package/src/rules/util/registration-utils.ts +0 -59
  154. package/tsconfig.app.json +0 -43
  155. package/tsconfig.dev.json +0 -40
  156. package/tsconfig.json +0 -23
  157. /package/dist/{types-ts4.5/rules/ensure-valid-platform-yarn-protocol-usage → types/rules/prefer-crypto-random-uuid}/index.d.ts +0 -0
  158. /package/dist/types-ts4.5/rules/{ensure-feature-flag-prefix → prefer-crypto-random-uuid}/index.d.ts +0 -0
@@ -1,75 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
- var _registrationUtils = require("../util/registration-utils");
8
- // eslint-disable-next-line import/no-extraneous-dependencies
9
-
10
- var rule = {
11
- meta: {
12
- docs: {
13
- url: 'http://go/pff-eslint',
14
- recommended: false
15
- },
16
- type: 'problem',
17
- messages: {
18
- featureFlagIncorrectPrefix: "Is this a LaunchDarkly feature flag? It needs a prefix so Confluence picks it up: [{{ allowedPrefixes }}]. Statsig feature gates don't need a prefix."
19
- },
20
- hasSuggestions: true,
21
- schema: [{
22
- type: 'object',
23
- properties: {
24
- allowedPrefixes: {
25
- type: 'array',
26
- items: [{
27
- type: 'string'
28
- }]
29
- }
30
- },
31
- required: ['allowedPrefixes']
32
- }]
33
- },
34
- create: function create(context) {
35
- var _ref2, _context$options;
36
- var _ref = (_ref2 = (_context$options = context.options) === null || _context$options === void 0 ? void 0 : _context$options[0]) !== null && _ref2 !== void 0 ? _ref2 : {},
37
- allowedPrefixes = _ref.allowedPrefixes;
38
- return Object.fromEntries(Object.keys(_registrationUtils.getterIdentifierToFlagTypeMap).map(function (getterIdentifier) {
39
- return ["CallExpression[callee.name=/".concat(getterIdentifier, "/]"), function (node) {
40
- // to make typescript happy
41
- if (node.type === 'CallExpression') {
42
- var args = node.arguments;
43
- var filename = context.getFilename();
44
- var _getMetadataForFilena = (0, _registrationUtils.getMetadataForFilename)(filename),
45
- packageJson = _getMetadataForFilena.pkgJson;
46
- var platformFeatureFlags = packageJson['platform-feature-flags'];
47
-
48
- // existence of registration section is done in 'ensure-feature-flag-registration'
49
- if (!platformFeatureFlags) {
50
- return {};
51
- }
52
- if (args.length === 1 && args[0].type === 'Literal' && args[0].raw) {
53
- var featureFlag = args[0].value;
54
- if (!allowedPrefixes.some(function (prefix) {
55
- return featureFlag.startsWith(prefix);
56
- })) {
57
- return context.report({
58
- node: args[0],
59
- messageId: 'featureFlagIncorrectPrefix',
60
- data: {
61
- allowedPrefixes: allowedPrefixes.map(function (p) {
62
- return "".concat(p);
63
- }).join(','),
64
- featureFlag: featureFlag
65
- }
66
- });
67
- }
68
- }
69
- }
70
- return {};
71
- }];
72
- }));
73
- }
74
- };
75
- var _default = exports.default = rule;
@@ -1,79 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
- var _handleAstObject = require("../util/handle-ast-object");
8
- function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }
9
- function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
10
- function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } // eslint-disable-next-line import/no-extraneous-dependencies
11
- var rootProtocolRegex = /^root:[\^~\*]$/;
12
-
13
- /**
14
- * Checks if the 'workspace:' and 'root:' protocol are used as either dependencies or devDependencies
15
- */
16
- function getYarnProtocolsUsed(node) {
17
- var protocolsUsed = {
18
- workspace: false,
19
- root: false
20
- };
21
- var dependencies = (0, _handleAstObject.getObjectPropertyAsObject)(node, 'dependencies');
22
- var devDependencies = (0, _handleAstObject.getObjectPropertyAsObject)(node, 'devDependencies');
23
- var peerDependencies = (0, _handleAstObject.getObjectPropertyAsObject)(node, 'peerDependencies');
24
- for (var _i = 0, _arr = [dependencies, devDependencies, peerDependencies]; _i < _arr.length; _i++) {
25
- var obj = _arr[_i];
26
- var _iterator = _createForOfIteratorHelper((obj === null || obj === void 0 ? void 0 : obj.properties) || []),
27
- _step;
28
- try {
29
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
30
- var p = _step.value;
31
- if (p.type === 'Property' && p.value.type === 'Literal') {
32
- if (typeof p.value.value === 'string') {
33
- if (rootProtocolRegex.test(p.value.value)) {
34
- protocolsUsed.root = true;
35
- }
36
- }
37
- }
38
- }
39
- } catch (err) {
40
- _iterator.e(err);
41
- } finally {
42
- _iterator.f();
43
- }
44
- }
45
- return protocolsUsed;
46
- }
47
- var rule = {
48
- meta: {
49
- type: 'problem',
50
- docs: {
51
- description: "Ensures that yarn protocols 'workspace:' and 'root:' are used correctly.",
52
- recommended: true
53
- },
54
- hasSuggestions: false,
55
- messages: {
56
- invalidWorkspaceProtocolUsage: "The 'workspace:^'protocol is Used. To resolve this error, please use the 'workspace:*' protocol instead.",
57
- invalidRootProtocolUsage: "The 'root:' protocol is not allowed in platform packages. To resolve this error, replace the 'root:' protocol with specific package versions (e.g. '^1.0.0')."
58
- }
59
- },
60
- create: function create(context) {
61
- return {
62
- ObjectExpression: function ObjectExpression(node) {
63
- if (!context.filename.endsWith('package.json') || node.type !== 'ObjectExpression') {
64
- return;
65
- }
66
- var yarnProtocolsUsed = getYarnProtocolsUsed(node);
67
-
68
- // The 'root:' protocol can not be used in any platform packages
69
- if (yarnProtocolsUsed.root) {
70
- context.report({
71
- node: node,
72
- messageId: 'invalidRootProtocolUsage'
73
- });
74
- }
75
- }
76
- };
77
- }
78
- };
79
- var _default = exports.default = rule;
@@ -1,65 +0,0 @@
1
- // eslint-disable-next-line import/no-extraneous-dependencies
2
-
3
- import { getMetadataForFilename, getterIdentifierToFlagTypeMap } from '../util/registration-utils';
4
- const rule = {
5
- meta: {
6
- docs: {
7
- url: 'http://go/pff-eslint',
8
- recommended: false
9
- },
10
- type: 'problem',
11
- messages: {
12
- featureFlagIncorrectPrefix: `Is this a LaunchDarkly feature flag? It needs a prefix so Confluence picks it up: [{{ allowedPrefixes }}]. Statsig feature gates don't need a prefix.`
13
- },
14
- hasSuggestions: true,
15
- schema: [{
16
- type: 'object',
17
- properties: {
18
- allowedPrefixes: {
19
- type: 'array',
20
- items: [{
21
- type: 'string'
22
- }]
23
- }
24
- },
25
- required: ['allowedPrefixes']
26
- }]
27
- },
28
- create(context) {
29
- var _ref, _context$options;
30
- const {
31
- allowedPrefixes
32
- } = (_ref = (_context$options = context.options) === null || _context$options === void 0 ? void 0 : _context$options[0]) !== null && _ref !== void 0 ? _ref : {};
33
- return Object.fromEntries(Object.keys(getterIdentifierToFlagTypeMap).map(getterIdentifier => [`CallExpression[callee.name=/${getterIdentifier}/]`, node => {
34
- // to make typescript happy
35
- if (node.type === 'CallExpression') {
36
- const args = node.arguments;
37
- const filename = context.getFilename();
38
- const {
39
- pkgJson: packageJson
40
- } = getMetadataForFilename(filename);
41
- const platformFeatureFlags = packageJson['platform-feature-flags'];
42
-
43
- // existence of registration section is done in 'ensure-feature-flag-registration'
44
- if (!platformFeatureFlags) {
45
- return {};
46
- }
47
- if (args.length === 1 && args[0].type === 'Literal' && args[0].raw) {
48
- const featureFlag = args[0].value;
49
- if (!allowedPrefixes.some(prefix => featureFlag.startsWith(prefix))) {
50
- return context.report({
51
- node: args[0],
52
- messageId: 'featureFlagIncorrectPrefix',
53
- data: {
54
- allowedPrefixes: allowedPrefixes.map(p => `${p}`).join(','),
55
- featureFlag
56
- }
57
- });
58
- }
59
- }
60
- }
61
- return {};
62
- }]));
63
- }
64
- };
65
- export default rule;
@@ -1,62 +0,0 @@
1
- // eslint-disable-next-line import/no-extraneous-dependencies
2
-
3
- import { getObjectPropertyAsObject } from '../util/handle-ast-object';
4
- const rootProtocolRegex = /^root:[\^~\*]$/;
5
-
6
- /**
7
- * Checks if the 'workspace:' and 'root:' protocol are used as either dependencies or devDependencies
8
- */
9
- function getYarnProtocolsUsed(node) {
10
- const protocolsUsed = {
11
- workspace: false,
12
- root: false
13
- };
14
- const dependencies = getObjectPropertyAsObject(node, 'dependencies');
15
- const devDependencies = getObjectPropertyAsObject(node, 'devDependencies');
16
- const peerDependencies = getObjectPropertyAsObject(node, 'peerDependencies');
17
- for (const obj of [dependencies, devDependencies, peerDependencies]) {
18
- for (const p of (obj === null || obj === void 0 ? void 0 : obj.properties) || []) {
19
- if (p.type === 'Property' && p.value.type === 'Literal') {
20
- if (typeof p.value.value === 'string') {
21
- if (rootProtocolRegex.test(p.value.value)) {
22
- protocolsUsed.root = true;
23
- }
24
- }
25
- }
26
- }
27
- }
28
- return protocolsUsed;
29
- }
30
- const rule = {
31
- meta: {
32
- type: 'problem',
33
- docs: {
34
- description: `Ensures that yarn protocols 'workspace:' and 'root:' are used correctly.`,
35
- recommended: true
36
- },
37
- hasSuggestions: false,
38
- messages: {
39
- invalidWorkspaceProtocolUsage: `The 'workspace:^'protocol is Used. To resolve this error, please use the 'workspace:*' protocol instead.`,
40
- invalidRootProtocolUsage: `The 'root:' protocol is not allowed in platform packages. To resolve this error, replace the 'root:' protocol with specific package versions (e.g. '^1.0.0').`
41
- }
42
- },
43
- create(context) {
44
- return {
45
- ObjectExpression: node => {
46
- if (!context.filename.endsWith('package.json') || node.type !== 'ObjectExpression') {
47
- return;
48
- }
49
- const yarnProtocolsUsed = getYarnProtocolsUsed(node);
50
-
51
- // The 'root:' protocol can not be used in any platform packages
52
- if (yarnProtocolsUsed.root) {
53
- context.report({
54
- node,
55
- messageId: 'invalidRootProtocolUsage'
56
- });
57
- }
58
- }
59
- };
60
- }
61
- };
62
- export default rule;
@@ -1,69 +0,0 @@
1
- // eslint-disable-next-line import/no-extraneous-dependencies
2
-
3
- import { getMetadataForFilename, getterIdentifierToFlagTypeMap } from '../util/registration-utils';
4
- var rule = {
5
- meta: {
6
- docs: {
7
- url: 'http://go/pff-eslint',
8
- recommended: false
9
- },
10
- type: 'problem',
11
- messages: {
12
- featureFlagIncorrectPrefix: "Is this a LaunchDarkly feature flag? It needs a prefix so Confluence picks it up: [{{ allowedPrefixes }}]. Statsig feature gates don't need a prefix."
13
- },
14
- hasSuggestions: true,
15
- schema: [{
16
- type: 'object',
17
- properties: {
18
- allowedPrefixes: {
19
- type: 'array',
20
- items: [{
21
- type: 'string'
22
- }]
23
- }
24
- },
25
- required: ['allowedPrefixes']
26
- }]
27
- },
28
- create: function create(context) {
29
- var _ref2, _context$options;
30
- var _ref = (_ref2 = (_context$options = context.options) === null || _context$options === void 0 ? void 0 : _context$options[0]) !== null && _ref2 !== void 0 ? _ref2 : {},
31
- allowedPrefixes = _ref.allowedPrefixes;
32
- return Object.fromEntries(Object.keys(getterIdentifierToFlagTypeMap).map(function (getterIdentifier) {
33
- return ["CallExpression[callee.name=/".concat(getterIdentifier, "/]"), function (node) {
34
- // to make typescript happy
35
- if (node.type === 'CallExpression') {
36
- var args = node.arguments;
37
- var filename = context.getFilename();
38
- var _getMetadataForFilena = getMetadataForFilename(filename),
39
- packageJson = _getMetadataForFilena.pkgJson;
40
- var platformFeatureFlags = packageJson['platform-feature-flags'];
41
-
42
- // existence of registration section is done in 'ensure-feature-flag-registration'
43
- if (!platformFeatureFlags) {
44
- return {};
45
- }
46
- if (args.length === 1 && args[0].type === 'Literal' && args[0].raw) {
47
- var featureFlag = args[0].value;
48
- if (!allowedPrefixes.some(function (prefix) {
49
- return featureFlag.startsWith(prefix);
50
- })) {
51
- return context.report({
52
- node: args[0],
53
- messageId: 'featureFlagIncorrectPrefix',
54
- data: {
55
- allowedPrefixes: allowedPrefixes.map(function (p) {
56
- return "".concat(p);
57
- }).join(','),
58
- featureFlag: featureFlag
59
- }
60
- });
61
- }
62
- }
63
- }
64
- return {};
65
- }];
66
- }));
67
- }
68
- };
69
- export default rule;
@@ -1,75 +0,0 @@
1
- function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }
2
- function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
3
- function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
4
- // eslint-disable-next-line import/no-extraneous-dependencies
5
-
6
- import { getObjectPropertyAsObject } from '../util/handle-ast-object';
7
- var rootProtocolRegex = /^root:[\^~\*]$/;
8
-
9
- /**
10
- * Checks if the 'workspace:' and 'root:' protocol are used as either dependencies or devDependencies
11
- */
12
- function getYarnProtocolsUsed(node) {
13
- var protocolsUsed = {
14
- workspace: false,
15
- root: false
16
- };
17
- var dependencies = getObjectPropertyAsObject(node, 'dependencies');
18
- var devDependencies = getObjectPropertyAsObject(node, 'devDependencies');
19
- var peerDependencies = getObjectPropertyAsObject(node, 'peerDependencies');
20
- for (var _i = 0, _arr = [dependencies, devDependencies, peerDependencies]; _i < _arr.length; _i++) {
21
- var obj = _arr[_i];
22
- var _iterator = _createForOfIteratorHelper((obj === null || obj === void 0 ? void 0 : obj.properties) || []),
23
- _step;
24
- try {
25
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
26
- var p = _step.value;
27
- if (p.type === 'Property' && p.value.type === 'Literal') {
28
- if (typeof p.value.value === 'string') {
29
- if (rootProtocolRegex.test(p.value.value)) {
30
- protocolsUsed.root = true;
31
- }
32
- }
33
- }
34
- }
35
- } catch (err) {
36
- _iterator.e(err);
37
- } finally {
38
- _iterator.f();
39
- }
40
- }
41
- return protocolsUsed;
42
- }
43
- var rule = {
44
- meta: {
45
- type: 'problem',
46
- docs: {
47
- description: "Ensures that yarn protocols 'workspace:' and 'root:' are used correctly.",
48
- recommended: true
49
- },
50
- hasSuggestions: false,
51
- messages: {
52
- invalidWorkspaceProtocolUsage: "The 'workspace:^'protocol is Used. To resolve this error, please use the 'workspace:*' protocol instead.",
53
- invalidRootProtocolUsage: "The 'root:' protocol is not allowed in platform packages. To resolve this error, replace the 'root:' protocol with specific package versions (e.g. '^1.0.0')."
54
- }
55
- },
56
- create: function create(context) {
57
- return {
58
- ObjectExpression: function ObjectExpression(node) {
59
- if (!context.filename.endsWith('package.json') || node.type !== 'ObjectExpression') {
60
- return;
61
- }
62
- var yarnProtocolsUsed = getYarnProtocolsUsed(node);
63
-
64
- // The 'root:' protocol can not be used in any platform packages
65
- if (yarnProtocolsUsed.root) {
66
- context.report({
67
- node: node,
68
- messageId: 'invalidRootProtocolUsage'
69
- });
70
- }
71
- }
72
- };
73
- }
74
- };
75
- export default rule;
@@ -1,3 +0,0 @@
1
- import type { Rule } from 'eslint';
2
- declare const rule: Rule.RuleModule;
3
- export default rule;
@@ -1,3 +0,0 @@
1
- import type { Rule } from 'eslint';
2
- declare const rule: Rule.RuleModule;
3
- export default rule;
@@ -1,26 +0,0 @@
1
- /* eslint-disable @repo/internal/fs/filename-pattern-match */
2
- /* eslint-disable no-undef */
3
- import { RuleTester } from 'eslint';
4
-
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
- });
15
-
16
- method();
17
- });
18
- };
19
-
20
- export const tester = new RuleTester({
21
- parser: require.resolve('@babel/eslint-parser'),
22
- parserOptions: {
23
- ecmaVersion: 6,
24
- sourceType: 'module',
25
- },
26
- });