@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.
- package/CHANGELOG.md +14 -0
- package/dist/cjs/index.js +4 -9
- package/dist/cjs/rules/constants.js +1 -1
- package/dist/cjs/rules/ensure-critical-dependency-resolutions/index.js +7 -7
- package/dist/cjs/rules/ensure-native-and-af-exports-synced/index.js +3 -0
- package/dist/cjs/rules/ensure-no-private-dependencies/index.js +48 -66
- package/dist/cjs/rules/feature-gating/inline-usage/index.js +14 -3
- package/dist/cjs/rules/feature-gating/no-alias/index.js +2 -2
- package/dist/cjs/rules/feature-gating/no-module-level-eval/index.js +1 -1
- package/dist/cjs/rules/feature-gating/no-module-level-eval-nav4/index.js +1 -1
- package/dist/cjs/rules/feature-gating/no-preconditioning/index.js +4 -1
- package/dist/cjs/rules/feature-gating/prefer-fg/index.js +1 -1
- package/dist/cjs/rules/feature-gating/static-feature-flags/index.js +2 -2
- package/dist/cjs/rules/feature-gating/use-recommended-utils/index.js +1 -1
- package/dist/cjs/rules/no-invalid-storybook-decorator-usage/index.js +1 -1
- package/dist/cjs/rules/no-sparse-checkout/index.js +1 -1
- package/dist/cjs/rules/prefer-crypto-random-uuid/index.js +87 -0
- package/dist/cjs/rules/use-entrypoints-in-examples/index.js +1 -1
- package/dist/cjs/rules/util/context-compat.js +4 -2
- package/dist/es2019/index.js +4 -9
- package/dist/es2019/rules/constants.js +1 -1
- package/dist/es2019/rules/ensure-critical-dependency-resolutions/index.js +7 -7
- package/dist/es2019/rules/ensure-native-and-af-exports-synced/index.js +3 -0
- package/dist/es2019/rules/ensure-no-private-dependencies/index.js +10 -9
- package/dist/es2019/rules/feature-gating/inline-usage/index.js +14 -3
- package/dist/es2019/rules/feature-gating/no-alias/index.js +2 -2
- package/dist/es2019/rules/feature-gating/no-module-level-eval/index.js +1 -1
- package/dist/es2019/rules/feature-gating/no-module-level-eval-nav4/index.js +1 -1
- package/dist/es2019/rules/feature-gating/no-preconditioning/index.js +4 -1
- package/dist/es2019/rules/feature-gating/prefer-fg/index.js +1 -1
- package/dist/es2019/rules/feature-gating/static-feature-flags/index.js +2 -2
- package/dist/es2019/rules/feature-gating/use-recommended-utils/index.js +1 -1
- package/dist/es2019/rules/no-invalid-storybook-decorator-usage/index.js +1 -1
- package/dist/es2019/rules/no-sparse-checkout/index.js +1 -1
- package/dist/es2019/rules/prefer-crypto-random-uuid/index.js +81 -0
- package/dist/es2019/rules/use-entrypoints-in-examples/index.js +1 -1
- package/dist/es2019/rules/util/context-compat.js +4 -2
- package/dist/esm/index.js +4 -9
- package/dist/esm/rules/constants.js +1 -1
- package/dist/esm/rules/ensure-critical-dependency-resolutions/index.js +7 -7
- package/dist/esm/rules/ensure-native-and-af-exports-synced/index.js +3 -0
- package/dist/esm/rules/ensure-no-private-dependencies/index.js +48 -65
- package/dist/esm/rules/feature-gating/inline-usage/index.js +14 -3
- package/dist/esm/rules/feature-gating/no-alias/index.js +2 -2
- package/dist/esm/rules/feature-gating/no-module-level-eval/index.js +1 -1
- package/dist/esm/rules/feature-gating/no-module-level-eval-nav4/index.js +1 -1
- package/dist/esm/rules/feature-gating/no-preconditioning/index.js +4 -1
- package/dist/esm/rules/feature-gating/prefer-fg/index.js +1 -1
- package/dist/esm/rules/feature-gating/static-feature-flags/index.js +2 -2
- package/dist/esm/rules/feature-gating/use-recommended-utils/index.js +1 -1
- package/dist/esm/rules/no-invalid-storybook-decorator-usage/index.js +1 -1
- package/dist/esm/rules/no-sparse-checkout/index.js +1 -1
- package/dist/esm/rules/prefer-crypto-random-uuid/index.js +81 -0
- package/dist/esm/rules/use-entrypoints-in-examples/index.js +1 -1
- package/dist/esm/rules/util/context-compat.js +4 -2
- package/dist/types/index.d.ts +6 -20
- package/dist/types/rules/util/handle-ast-object.d.ts +1 -1
- package/dist/types-ts4.5/index.d.ts +6 -32
- package/dist/types-ts4.5/rules/util/handle-ast-object.d.ts +1 -1
- package/package.json +2 -5
- package/afm-cc/tsconfig.json +0 -24
- package/afm-jira/tsconfig.json +0 -24
- package/build/tsconfig.json +0 -17
- package/dist/cjs/rules/ensure-feature-flag-prefix/index.js +0 -75
- package/dist/cjs/rules/ensure-valid-platform-yarn-protocol-usage/index.js +0 -79
- package/dist/es2019/rules/ensure-feature-flag-prefix/index.js +0 -65
- package/dist/es2019/rules/ensure-valid-platform-yarn-protocol-usage/index.js +0 -62
- package/dist/esm/rules/ensure-feature-flag-prefix/index.js +0 -69
- package/dist/esm/rules/ensure-valid-platform-yarn-protocol-usage/index.js +0 -75
- package/dist/types/rules/ensure-feature-flag-prefix/index.d.ts +0 -3
- package/dist/types/rules/ensure-valid-platform-yarn-protocol-usage/index.d.ts +0 -3
- package/src/__tests__/utils/_tester.tsx +0 -26
- package/src/index.tsx +0 -254
- package/src/rules/compiled/README.md +0 -3
- package/src/rules/compiled/expand-background-shorthand/README.md +0 -23
- package/src/rules/compiled/expand-background-shorthand/__tests__/rule.test.ts +0 -160
- package/src/rules/compiled/expand-background-shorthand/index.tsx +0 -43
- package/src/rules/compiled/expand-border-shorthand/README.md +0 -51
- package/src/rules/compiled/expand-border-shorthand/__tests__/rule.test.ts +0 -211
- package/src/rules/compiled/expand-border-shorthand/index.ts +0 -103
- package/src/rules/compiled/expand-spacing-shorthand/README.md +0 -38
- package/src/rules/compiled/expand-spacing-shorthand/__tests__/rule.test.ts +0 -448
- package/src/rules/compiled/expand-spacing-shorthand/index.ts +0 -240
- package/src/rules/constants.tsx +0 -20
- package/src/rules/ensure-atlassian-team/__tests__/unit/rule.test.ts +0 -24
- package/src/rules/ensure-atlassian-team/index.ts +0 -51
- package/src/rules/ensure-critical-dependency-resolutions/__test__/unit/rule.test.tsx +0 -200
- package/src/rules/ensure-critical-dependency-resolutions/index.tsx +0 -172
- package/src/rules/ensure-feature-flag-prefix/__tests__/unit/rule.test.tsx +0 -65
- package/src/rules/ensure-feature-flag-prefix/index.tsx +0 -81
- package/src/rules/ensure-feature-flag-registration/__tests__/unit/rule.test.tsx +0 -115
- package/src/rules/ensure-feature-flag-registration/index.tsx +0 -106
- package/src/rules/ensure-native-and-af-exports-synced/__tests__/unit/rule.test.tsx +0 -199
- package/src/rules/ensure-native-and-af-exports-synced/index.tsx +0 -188
- package/src/rules/ensure-no-private-dependencies/__tests__/unit/rule.test.ts +0 -212
- package/src/rules/ensure-no-private-dependencies/index.ts +0 -64
- package/src/rules/ensure-publish-valid/__tests__/unit/rule.test.ts +0 -39
- package/src/rules/ensure-publish-valid/index.ts +0 -81
- package/src/rules/ensure-test-runner-arguments/__tests__/unit/rule.test.tsx +0 -298
- package/src/rules/ensure-test-runner-arguments/index.tsx +0 -121
- package/src/rules/ensure-test-runner-nested-count/__tests__/unit/rule.test.tsx +0 -308
- package/src/rules/ensure-test-runner-nested-count/index.tsx +0 -82
- package/src/rules/ensure-valid-bin-values/__tests__/unit/rule.test.ts +0 -159
- package/src/rules/ensure-valid-bin-values/index.ts +0 -70
- package/src/rules/ensure-valid-platform-yarn-protocol-usage/__tests__/unit/rule.test.ts +0 -147
- package/src/rules/ensure-valid-platform-yarn-protocol-usage/index.ts +0 -67
- package/src/rules/feature-gating/README.md +0 -8
- package/src/rules/feature-gating/inline-usage/README.md +0 -53
- package/src/rules/feature-gating/inline-usage/__tests__/rule.test.tsx +0 -106
- package/src/rules/feature-gating/inline-usage/index.tsx +0 -135
- package/src/rules/feature-gating/no-alias/README.md +0 -29
- package/src/rules/feature-gating/no-alias/__tests__/rule.test.tsx +0 -76
- package/src/rules/feature-gating/no-alias/index.tsx +0 -80
- package/src/rules/feature-gating/no-module-level-eval/README.md +0 -53
- package/src/rules/feature-gating/no-module-level-eval/__tests__/test.tsx +0 -133
- package/src/rules/feature-gating/no-module-level-eval/index.tsx +0 -54
- package/src/rules/feature-gating/no-module-level-eval-nav4/README.md +0 -8
- package/src/rules/feature-gating/no-module-level-eval-nav4/__tests__/test.tsx +0 -130
- package/src/rules/feature-gating/no-module-level-eval-nav4/index.tsx +0 -73
- package/src/rules/feature-gating/no-preconditioning/README.md +0 -69
- package/src/rules/feature-gating/no-preconditioning/__tests__/rule.test.tsx +0 -164
- package/src/rules/feature-gating/no-preconditioning/index.tsx +0 -138
- package/src/rules/feature-gating/prefer-fg/README.md +0 -3
- package/src/rules/feature-gating/prefer-fg/__tests__/rule.test.tsx +0 -83
- package/src/rules/feature-gating/prefer-fg/index.tsx +0 -110
- package/src/rules/feature-gating/static-feature-flags/README.md +0 -3
- package/src/rules/feature-gating/static-feature-flags/__tests__/test.tsx +0 -135
- package/src/rules/feature-gating/static-feature-flags/index.tsx +0 -103
- package/src/rules/feature-gating/use-recommended-utils/README.md +0 -67
- package/src/rules/feature-gating/use-recommended-utils/__tests__/rule.test.tsx +0 -78
- package/src/rules/feature-gating/use-recommended-utils/index.tsx +0 -57
- package/src/rules/feature-gating/utils.tsx +0 -48
- package/src/rules/no-direct-document-usage/index.tsx +0 -111
- package/src/rules/no-duplicate-dependencies/__tests__/unit/rule.test.ts +0 -116
- package/src/rules/no-duplicate-dependencies/index.ts +0 -79
- package/src/rules/no-invalid-feature-flag-usage/__tests__/unit/rule.test.tsx +0 -69
- package/src/rules/no-invalid-feature-flag-usage/index.tsx +0 -128
- package/src/rules/no-invalid-storybook-decorator-usage/__tests__/unit/rule.test.tsx +0 -18
- package/src/rules/no-invalid-storybook-decorator-usage/index.tsx +0 -39
- package/src/rules/no-pre-post-installs/__tests__/unit/rule.test.ts +0 -41
- package/src/rules/no-pre-post-installs/index.ts +0 -35
- package/src/rules/no-set-immediate/index.tsx +0 -43
- package/src/rules/no-sparse-checkout/__tests__/unit/rule.test.tsx +0 -48
- package/src/rules/no-sparse-checkout/index.tsx +0 -54
- package/src/rules/use-entrypoints-in-examples/README.md +0 -27
- package/src/rules/use-entrypoints-in-examples/__tests__/rule.test.tsx +0 -34
- package/src/rules/use-entrypoints-in-examples/index.tsx +0 -43
- package/src/rules/util/__tests__/context-compat.test.ts +0 -122
- package/src/rules/util/compiled-utils.ts +0 -27
- package/src/rules/util/context-compat.ts +0 -41
- package/src/rules/util/file-exclusions.ts +0 -39
- package/src/rules/util/handle-ast-object.ts +0 -33
- package/src/rules/util/registration-utils.ts +0 -59
- package/tsconfig.app.json +0 -43
- package/tsconfig.dev.json +0 -40
- package/tsconfig.json +0 -23
- /package/dist/{types-ts4.5/rules/ensure-valid-platform-yarn-protocol-usage → types/rules/prefer-crypto-random-uuid}/index.d.ts +0 -0
- /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,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
|
-
});
|