@atlaskit/eslint-plugin-platform 0.3.0 → 0.4.1
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 +12 -0
- package/afm-cc/tsconfig.json +21 -0
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/rules/ensure-atlassian-team/index.js +2 -0
- package/dist/cjs/rules/ensure-critical-dependency-resolutions/index.js +22 -11
- package/dist/cjs/rules/ensure-feature-flag-prefix/index.js +2 -0
- package/dist/cjs/rules/ensure-feature-flag-registration/index.js +1 -1
- package/dist/cjs/rules/ensure-publish-valid/index.js +2 -0
- package/dist/cjs/rules/ensure-test-runner-arguments/index.js +2 -0
- package/dist/cjs/rules/ensure-test-runner-nested-count/index.js +2 -0
- package/dist/cjs/rules/no-duplicate-dependencies/index.js +2 -0
- package/dist/cjs/rules/no-invalid-feature-flag-usage/index.js +24 -1
- package/dist/cjs/rules/no-invalid-storybook-decorator-usage/index.js +2 -0
- package/dist/cjs/rules/no-pre-post-installs/index.js +2 -0
- package/dist/es2019/index.js +2 -0
- package/dist/es2019/rules/ensure-atlassian-team/index.js +2 -0
- package/dist/es2019/rules/ensure-critical-dependency-resolutions/index.js +8 -4
- package/dist/es2019/rules/ensure-feature-flag-prefix/index.js +2 -0
- package/dist/es2019/rules/ensure-feature-flag-registration/index.js +2 -0
- package/dist/es2019/rules/ensure-publish-valid/index.js +2 -0
- package/dist/es2019/rules/ensure-test-runner-arguments/index.js +2 -0
- package/dist/es2019/rules/ensure-test-runner-nested-count/index.js +2 -0
- package/dist/es2019/rules/no-duplicate-dependencies/index.js +2 -0
- package/dist/es2019/rules/no-invalid-feature-flag-usage/index.js +24 -1
- package/dist/es2019/rules/no-invalid-storybook-decorator-usage/index.js +2 -0
- package/dist/es2019/rules/no-pre-post-installs/index.js +2 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/rules/ensure-atlassian-team/index.js +2 -0
- package/dist/esm/rules/ensure-critical-dependency-resolutions/index.js +22 -11
- package/dist/esm/rules/ensure-feature-flag-prefix/index.js +2 -0
- package/dist/esm/rules/ensure-feature-flag-registration/index.js +2 -0
- package/dist/esm/rules/ensure-publish-valid/index.js +2 -0
- package/dist/esm/rules/ensure-test-runner-arguments/index.js +2 -0
- package/dist/esm/rules/ensure-test-runner-nested-count/index.js +2 -0
- package/dist/esm/rules/no-duplicate-dependencies/index.js +2 -0
- package/dist/esm/rules/no-invalid-feature-flag-usage/index.js +24 -1
- package/dist/esm/rules/no-invalid-storybook-decorator-usage/index.js +2 -0
- package/dist/esm/rules/no-pre-post-installs/index.js +2 -0
- package/package.json +2 -1
- package/src/index.tsx +1 -0
- package/src/rules/ensure-atlassian-team/index.ts +1 -0
- package/src/rules/ensure-critical-dependency-resolutions/__test__/unit/rule.test.tsx +10 -0
- package/src/rules/ensure-critical-dependency-resolutions/index.tsx +13 -10
- package/src/rules/ensure-feature-flag-prefix/index.tsx +1 -0
- package/src/rules/ensure-feature-flag-registration/index.tsx +1 -0
- package/src/rules/ensure-publish-valid/index.ts +1 -0
- package/src/rules/ensure-test-runner-arguments/index.tsx +1 -0
- package/src/rules/ensure-test-runner-nested-count/index.tsx +1 -0
- package/src/rules/no-duplicate-dependencies/index.ts +1 -0
- package/src/rules/no-invalid-feature-flag-usage/__tests__/unit/rule.test.tsx +9 -0
- package/src/rules/no-invalid-feature-flag-usage/index.tsx +25 -0
- package/src/rules/no-invalid-storybook-decorator-usage/index.tsx +1 -0
- package/src/rules/no-pre-post-installs/index.ts +1 -0
- package/tsconfig.app.json +2 -1
- package/tsconfig.dev.json +2 -1
- package/tmp/api-report-tmp.d.ts +0 -50
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @atlaskit/eslint-plugin-platform
|
|
2
2
|
|
|
3
|
+
## 0.4.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#78702](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/78702) [`6b76dabb8255`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/6b76dabb8255) - Add rule to check for invalid flag usages in exports
|
|
8
|
+
|
|
9
|
+
## 0.4.0
|
|
10
|
+
|
|
11
|
+
### Minor Changes
|
|
12
|
+
|
|
13
|
+
- [#43563](https://bitbucket.org/atlassian/atlassian-frontend/pull-requests/43563) [`51f9f6e2f10`](https://bitbucket.org/atlassian/atlassian-frontend/commits/51f9f6e2f10) - Add @types/react v18.2 to critical deps whitelist
|
|
14
|
+
|
|
3
15
|
## 0.3.0
|
|
4
16
|
|
|
5
17
|
### Minor Changes
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "../../../../tsconfig.entry-points.confluence.json",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"target": "es5",
|
|
5
|
+
"composite": true,
|
|
6
|
+
"outDir": "../dist",
|
|
7
|
+
"rootDir": "../",
|
|
8
|
+
"baseUrl": "../"
|
|
9
|
+
},
|
|
10
|
+
"include": [
|
|
11
|
+
"../src/**/*.ts",
|
|
12
|
+
"../src/**/*.tsx"
|
|
13
|
+
],
|
|
14
|
+
"exclude": [
|
|
15
|
+
"../src/**/__tests__/*",
|
|
16
|
+
"../__tests__/*",
|
|
17
|
+
"../src/**/*.test.*",
|
|
18
|
+
"../src/**/test.*"
|
|
19
|
+
],
|
|
20
|
+
"references": []
|
|
21
|
+
}
|
package/dist/cjs/index.js
CHANGED
|
@@ -18,7 +18,7 @@ var _ensureCriticalDependencyResolutions = _interopRequireDefault(require("./rul
|
|
|
18
18
|
var _noInvalidStorybookDecoratorUsage = _interopRequireDefault(require("./rules/no-invalid-storybook-decorator-usage"));
|
|
19
19
|
var _ensurePublishValid = _interopRequireDefault(require("./rules/ensure-publish-valid"));
|
|
20
20
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
21
|
-
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
21
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } // eslint-disable-next-line import/no-extraneous-dependencies
|
|
22
22
|
var rules = exports.rules = {
|
|
23
23
|
'ensure-feature-flag-registration': _ensureFeatureFlagRegistration.default,
|
|
24
24
|
'ensure-feature-flag-prefix': _ensureFeatureFlagPrefix.default,
|
|
@@ -8,11 +8,13 @@ exports.default = void 0;
|
|
|
8
8
|
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
9
9
|
var _findRoot = require("@manypkg/find-root");
|
|
10
10
|
var _handleAstObject = require("../util/handle-ast-object");
|
|
11
|
+
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
12
|
+
|
|
11
13
|
// Here we only need to specify the major and minor versions
|
|
12
14
|
// In matchMinorVersion, we will check if the versions in resolutions fall in the right ranges.
|
|
13
15
|
var DESIRED_PKG_VERSIONS = {
|
|
14
|
-
typescript: '4.9',
|
|
15
|
-
'@types/react': '16.14'
|
|
16
|
+
typescript: ['4.9'],
|
|
17
|
+
'@types/react': ['16.14', '18.2']
|
|
16
18
|
};
|
|
17
19
|
var matchMinorVersion = function matchMinorVersion(desiredVersion, versionInResolutions) {
|
|
18
20
|
var firstChar = versionInResolutions[0];
|
|
@@ -67,16 +69,25 @@ var rule = {
|
|
|
67
69
|
var rootDir = (0, _findRoot.findRootSync)(process.cwd());
|
|
68
70
|
var isRootPackageJson = fileName.endsWith("".concat(rootDir, "/package.json"));
|
|
69
71
|
if (packageResolutions !== null) {
|
|
72
|
+
var _loop = function _loop() {
|
|
73
|
+
var _Object$entries$_i = (0, _slicedToArray2.default)(_Object$entries[_i], 2),
|
|
74
|
+
key = _Object$entries$_i[0],
|
|
75
|
+
values = _Object$entries$_i[1];
|
|
76
|
+
if (!values.some(function (value) {
|
|
77
|
+
return verifyResolutionFromObject(packageResolutions, key, value, !isRootPackageJson);
|
|
78
|
+
})) {
|
|
79
|
+
return {
|
|
80
|
+
v: context.report({
|
|
81
|
+
node: node,
|
|
82
|
+
messageId: 'invalidPackageResolution'
|
|
83
|
+
})
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
_ret;
|
|
70
88
|
for (var _i = 0, _Object$entries = Object.entries(DESIRED_PKG_VERSIONS); _i < _Object$entries.length; _i++) {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
value = _Object$entries$_i[1];
|
|
74
|
-
if (!verifyResolutionFromObject(packageResolutions, key, value, !isRootPackageJson)) {
|
|
75
|
-
return context.report({
|
|
76
|
-
node: node,
|
|
77
|
-
messageId: 'invalidPackageResolution'
|
|
78
|
-
});
|
|
79
|
-
}
|
|
89
|
+
_ret = _loop();
|
|
90
|
+
if (_ret) return _ret.v;
|
|
80
91
|
}
|
|
81
92
|
}
|
|
82
93
|
})
|
|
@@ -8,7 +8,7 @@ exports.default = void 0;
|
|
|
8
8
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
9
9
|
var _registrationUtils = require("../util/registration-utils");
|
|
10
10
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
11
|
-
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
11
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } // eslint-disable-next-line import/no-extraneous-dependencies
|
|
12
12
|
var rule = {
|
|
13
13
|
meta: {
|
|
14
14
|
docs: {
|
|
@@ -6,6 +6,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
});
|
|
7
7
|
exports.default = void 0;
|
|
8
8
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
9
|
+
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
10
|
+
|
|
9
11
|
var TEST_RUNNER_IDENTIFIER = 'ffTest';
|
|
10
12
|
var rule = {
|
|
11
13
|
meta: {
|
|
@@ -8,6 +8,8 @@ exports.default = void 0;
|
|
|
8
8
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
9
9
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
10
10
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
11
|
+
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
12
|
+
|
|
11
13
|
var NESTED_LIMIT = 4;
|
|
12
14
|
var TEST_RUNNER_IDENTIFIER = 'ffTest';
|
|
13
15
|
var getDepthOfNestedRunner = function getDepthOfNestedRunner(node) {
|
|
@@ -9,6 +9,8 @@ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/sli
|
|
|
9
9
|
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, 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 normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
|
|
10
10
|
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
11
11
|
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
12
|
+
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
13
|
+
|
|
12
14
|
var rule = {
|
|
13
15
|
meta: {
|
|
14
16
|
type: 'problem',
|
|
@@ -6,6 +6,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
});
|
|
7
7
|
exports.default = void 0;
|
|
8
8
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
9
|
+
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
10
|
+
|
|
9
11
|
var FF_GETTER_BOOLEAN_IDENTIFIER = 'getBooleanFF';
|
|
10
12
|
var __isOnlyOneFlagCheckInExpression = function __isOnlyOneFlagCheckInExpression(root, ignoredNode) {
|
|
11
13
|
switch (root.type) {
|
|
@@ -48,11 +50,13 @@ var rule = {
|
|
|
48
50
|
messages: {
|
|
49
51
|
onlyInlineIf: "Only call feature flags as part of an expression, don't assign to a variable! See http://go/pff-eslint for more details",
|
|
50
52
|
onlyStringLiteral: "Only get feature flags by string literal, don't use variables! See http://go/pff-eslint for more details",
|
|
51
|
-
multipleFlagCheckInExpression: "Only check one flag per expression! See http://go/pff-eslint for more details"
|
|
53
|
+
multipleFlagCheckInExpression: "Only check one flag per expression! See http://go/pff-eslint for more details",
|
|
54
|
+
noModuleScope: "Don't use platform feature flags in module scope! See http://go/pff-eslint for more details"
|
|
52
55
|
}
|
|
53
56
|
},
|
|
54
57
|
create: function create(context) {
|
|
55
58
|
return (0, _defineProperty2.default)({}, "CallExpression[callee.name=/".concat(FF_GETTER_BOOLEAN_IDENTIFIER, "/]"), function CallExpressionCalleeName(node) {
|
|
59
|
+
var _node$parent2;
|
|
56
60
|
// to make typescript happy
|
|
57
61
|
if (node.type === 'CallExpression') {
|
|
58
62
|
var _node$parent;
|
|
@@ -65,7 +69,26 @@ var rule = {
|
|
|
65
69
|
}
|
|
66
70
|
switch ((_node$parent = node.parent) === null || _node$parent === void 0 ? void 0 : _node$parent.type) {
|
|
67
71
|
case 'IfStatement':
|
|
72
|
+
break;
|
|
68
73
|
case 'ConditionalExpression':
|
|
74
|
+
switch ((_node$parent2 = node.parent) === null || _node$parent2 === void 0 ? void 0 : _node$parent2.parent.type) {
|
|
75
|
+
case 'ExportDefaultDeclaration':
|
|
76
|
+
// handles "export default getBooleanFF('test-flag') ? "this is" : "not good";"
|
|
77
|
+
context.report({
|
|
78
|
+
node: node,
|
|
79
|
+
messageId: 'noModuleScope'
|
|
80
|
+
});
|
|
81
|
+
break;
|
|
82
|
+
case 'VariableDeclarator':
|
|
83
|
+
// handles "export const foo = getBooleanFF('test-flag') ? 'this is' : 'not good';"
|
|
84
|
+
if (node.parent.parent.parent.type === 'VariableDeclaration' && node.parent.parent.parent.parent.type === 'ExportNamedDeclaration') {
|
|
85
|
+
context.report({
|
|
86
|
+
node: node,
|
|
87
|
+
messageId: 'noModuleScope'
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
69
92
|
break;
|
|
70
93
|
case 'UnaryExpression':
|
|
71
94
|
case 'LogicalExpression':
|
|
@@ -6,6 +6,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
});
|
|
7
7
|
exports.default = void 0;
|
|
8
8
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
9
|
+
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
10
|
+
|
|
9
11
|
var STORYBOOK_DECORATOR_IDENTIFIER = 'withPlatformFeatureFlags';
|
|
10
12
|
var rule = {
|
|
11
13
|
meta: {
|
package/dist/es2019/index.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
2
|
+
|
|
1
3
|
import ensureFeatureFlagRegistration from './rules/ensure-feature-flag-registration';
|
|
2
4
|
import noPreAndPostInstallScripts from './rules/no-pre-post-installs';
|
|
3
5
|
import ensureTestRunnerArguments from './rules/ensure-test-runner-arguments';
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { findRootSync } from '@manypkg/find-root';
|
|
2
|
+
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
3
|
+
|
|
2
4
|
import { getObjectPropertyAsObject } from '../util/handle-ast-object';
|
|
3
5
|
|
|
4
6
|
// Here we only need to specify the major and minor versions
|
|
5
7
|
// In matchMinorVersion, we will check if the versions in resolutions fall in the right ranges.
|
|
6
8
|
const DESIRED_PKG_VERSIONS = {
|
|
7
|
-
typescript: '4.9',
|
|
8
|
-
'@types/react': '16.14'
|
|
9
|
+
typescript: ['4.9'],
|
|
10
|
+
'@types/react': ['16.14', '18.2']
|
|
9
11
|
};
|
|
10
12
|
const matchMinorVersion = (desiredVersion, versionInResolutions) => {
|
|
11
13
|
const firstChar = versionInResolutions[0];
|
|
@@ -48,8 +50,10 @@ const rule = {
|
|
|
48
50
|
const rootDir = findRootSync(process.cwd());
|
|
49
51
|
const isRootPackageJson = fileName.endsWith(`${rootDir}/package.json`);
|
|
50
52
|
if (packageResolutions !== null) {
|
|
51
|
-
for (const [key,
|
|
52
|
-
if (!
|
|
53
|
+
for (const [key, values] of Object.entries(DESIRED_PKG_VERSIONS)) {
|
|
54
|
+
if (!values.some(value => {
|
|
55
|
+
return verifyResolutionFromObject(packageResolutions, key, value, !isRootPackageJson);
|
|
56
|
+
})) {
|
|
53
57
|
return context.report({
|
|
54
58
|
node,
|
|
55
59
|
messageId: 'invalidPackageResolution'
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
2
|
+
|
|
1
3
|
const FF_GETTER_BOOLEAN_IDENTIFIER = 'getBooleanFF';
|
|
2
4
|
const __isOnlyOneFlagCheckInExpression = (root, ignoredNode) => {
|
|
3
5
|
switch (root.type) {
|
|
@@ -40,12 +42,14 @@ const rule = {
|
|
|
40
42
|
messages: {
|
|
41
43
|
onlyInlineIf: "Only call feature flags as part of an expression, don't assign to a variable! See http://go/pff-eslint for more details",
|
|
42
44
|
onlyStringLiteral: "Only get feature flags by string literal, don't use variables! See http://go/pff-eslint for more details",
|
|
43
|
-
multipleFlagCheckInExpression: `Only check one flag per expression! See http://go/pff-eslint for more details
|
|
45
|
+
multipleFlagCheckInExpression: `Only check one flag per expression! See http://go/pff-eslint for more details`,
|
|
46
|
+
noModuleScope: `Don't use platform feature flags in module scope! See http://go/pff-eslint for more details`
|
|
44
47
|
}
|
|
45
48
|
},
|
|
46
49
|
create(context) {
|
|
47
50
|
return {
|
|
48
51
|
[`CallExpression[callee.name=/${FF_GETTER_BOOLEAN_IDENTIFIER}/]`]: node => {
|
|
52
|
+
var _node$parent2;
|
|
49
53
|
// to make typescript happy
|
|
50
54
|
if (node.type === 'CallExpression') {
|
|
51
55
|
var _node$parent;
|
|
@@ -58,7 +62,26 @@ const rule = {
|
|
|
58
62
|
}
|
|
59
63
|
switch ((_node$parent = node.parent) === null || _node$parent === void 0 ? void 0 : _node$parent.type) {
|
|
60
64
|
case 'IfStatement':
|
|
65
|
+
break;
|
|
61
66
|
case 'ConditionalExpression':
|
|
67
|
+
switch ((_node$parent2 = node.parent) === null || _node$parent2 === void 0 ? void 0 : _node$parent2.parent.type) {
|
|
68
|
+
case 'ExportDefaultDeclaration':
|
|
69
|
+
// handles "export default getBooleanFF('test-flag') ? "this is" : "not good";"
|
|
70
|
+
context.report({
|
|
71
|
+
node,
|
|
72
|
+
messageId: 'noModuleScope'
|
|
73
|
+
});
|
|
74
|
+
break;
|
|
75
|
+
case 'VariableDeclarator':
|
|
76
|
+
// handles "export const foo = getBooleanFF('test-flag') ? 'this is' : 'not good';"
|
|
77
|
+
if (node.parent.parent.parent.type === 'VariableDeclaration' && node.parent.parent.parent.parent.type === 'ExportNamedDeclaration') {
|
|
78
|
+
context.report({
|
|
79
|
+
node,
|
|
80
|
+
messageId: 'noModuleScope'
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
62
85
|
break;
|
|
63
86
|
case 'UnaryExpression':
|
|
64
87
|
case 'LogicalExpression':
|
package/dist/esm/index.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
2
2
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
3
3
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
4
|
+
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
5
|
+
|
|
4
6
|
import ensureFeatureFlagRegistration from './rules/ensure-feature-flag-registration';
|
|
5
7
|
import noPreAndPostInstallScripts from './rules/no-pre-post-installs';
|
|
6
8
|
import ensureTestRunnerArguments from './rules/ensure-test-runner-arguments';
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
2
2
|
import { findRootSync } from '@manypkg/find-root';
|
|
3
|
+
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
4
|
+
|
|
3
5
|
import { getObjectPropertyAsObject } from '../util/handle-ast-object';
|
|
4
6
|
|
|
5
7
|
// Here we only need to specify the major and minor versions
|
|
6
8
|
// In matchMinorVersion, we will check if the versions in resolutions fall in the right ranges.
|
|
7
9
|
var DESIRED_PKG_VERSIONS = {
|
|
8
|
-
typescript: '4.9',
|
|
9
|
-
'@types/react': '16.14'
|
|
10
|
+
typescript: ['4.9'],
|
|
11
|
+
'@types/react': ['16.14', '18.2']
|
|
10
12
|
};
|
|
11
13
|
var matchMinorVersion = function matchMinorVersion(desiredVersion, versionInResolutions) {
|
|
12
14
|
var firstChar = versionInResolutions[0];
|
|
@@ -61,16 +63,25 @@ var rule = {
|
|
|
61
63
|
var rootDir = findRootSync(process.cwd());
|
|
62
64
|
var isRootPackageJson = fileName.endsWith("".concat(rootDir, "/package.json"));
|
|
63
65
|
if (packageResolutions !== null) {
|
|
66
|
+
var _loop = function _loop() {
|
|
67
|
+
var _Object$entries$_i = _slicedToArray(_Object$entries[_i], 2),
|
|
68
|
+
key = _Object$entries$_i[0],
|
|
69
|
+
values = _Object$entries$_i[1];
|
|
70
|
+
if (!values.some(function (value) {
|
|
71
|
+
return verifyResolutionFromObject(packageResolutions, key, value, !isRootPackageJson);
|
|
72
|
+
})) {
|
|
73
|
+
return {
|
|
74
|
+
v: context.report({
|
|
75
|
+
node: node,
|
|
76
|
+
messageId: 'invalidPackageResolution'
|
|
77
|
+
})
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
_ret;
|
|
64
82
|
for (var _i = 0, _Object$entries = Object.entries(DESIRED_PKG_VERSIONS); _i < _Object$entries.length; _i++) {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
value = _Object$entries$_i[1];
|
|
68
|
-
if (!verifyResolutionFromObject(packageResolutions, key, value, !isRootPackageJson)) {
|
|
69
|
-
return context.report({
|
|
70
|
-
node: node,
|
|
71
|
-
messageId: 'invalidPackageResolution'
|
|
72
|
-
});
|
|
73
|
-
}
|
|
83
|
+
_ret = _loop();
|
|
84
|
+
if (_ret) return _ret.v;
|
|
74
85
|
}
|
|
75
86
|
}
|
|
76
87
|
})
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
2
2
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
3
3
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
4
|
+
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
5
|
+
|
|
4
6
|
import { getMetadataForFilename, getterIdentifierToFlagTypeMap } from '../util/registration-utils';
|
|
5
7
|
var rule = {
|
|
6
8
|
meta: {
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
2
2
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
3
3
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
4
|
+
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
5
|
+
|
|
4
6
|
var NESTED_LIMIT = 4;
|
|
5
7
|
var TEST_RUNNER_IDENTIFIER = 'ffTest';
|
|
6
8
|
var getDepthOfNestedRunner = function getDepthOfNestedRunner(node) {
|
|
@@ -2,6 +2,8 @@ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
|
2
2
|
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, 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 normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
|
|
3
3
|
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
4
4
|
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
5
|
+
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
6
|
+
|
|
5
7
|
var rule = {
|
|
6
8
|
meta: {
|
|
7
9
|
type: 'problem',
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
2
|
+
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
3
|
+
|
|
2
4
|
var FF_GETTER_BOOLEAN_IDENTIFIER = 'getBooleanFF';
|
|
3
5
|
var __isOnlyOneFlagCheckInExpression = function __isOnlyOneFlagCheckInExpression(root, ignoredNode) {
|
|
4
6
|
switch (root.type) {
|
|
@@ -41,11 +43,13 @@ var rule = {
|
|
|
41
43
|
messages: {
|
|
42
44
|
onlyInlineIf: "Only call feature flags as part of an expression, don't assign to a variable! See http://go/pff-eslint for more details",
|
|
43
45
|
onlyStringLiteral: "Only get feature flags by string literal, don't use variables! See http://go/pff-eslint for more details",
|
|
44
|
-
multipleFlagCheckInExpression: "Only check one flag per expression! See http://go/pff-eslint for more details"
|
|
46
|
+
multipleFlagCheckInExpression: "Only check one flag per expression! See http://go/pff-eslint for more details",
|
|
47
|
+
noModuleScope: "Don't use platform feature flags in module scope! See http://go/pff-eslint for more details"
|
|
45
48
|
}
|
|
46
49
|
},
|
|
47
50
|
create: function create(context) {
|
|
48
51
|
return _defineProperty({}, "CallExpression[callee.name=/".concat(FF_GETTER_BOOLEAN_IDENTIFIER, "/]"), function CallExpressionCalleeName(node) {
|
|
52
|
+
var _node$parent2;
|
|
49
53
|
// to make typescript happy
|
|
50
54
|
if (node.type === 'CallExpression') {
|
|
51
55
|
var _node$parent;
|
|
@@ -58,7 +62,26 @@ var rule = {
|
|
|
58
62
|
}
|
|
59
63
|
switch ((_node$parent = node.parent) === null || _node$parent === void 0 ? void 0 : _node$parent.type) {
|
|
60
64
|
case 'IfStatement':
|
|
65
|
+
break;
|
|
61
66
|
case 'ConditionalExpression':
|
|
67
|
+
switch ((_node$parent2 = node.parent) === null || _node$parent2 === void 0 ? void 0 : _node$parent2.parent.type) {
|
|
68
|
+
case 'ExportDefaultDeclaration':
|
|
69
|
+
// handles "export default getBooleanFF('test-flag') ? "this is" : "not good";"
|
|
70
|
+
context.report({
|
|
71
|
+
node: node,
|
|
72
|
+
messageId: 'noModuleScope'
|
|
73
|
+
});
|
|
74
|
+
break;
|
|
75
|
+
case 'VariableDeclarator':
|
|
76
|
+
// handles "export const foo = getBooleanFF('test-flag') ? 'this is' : 'not good';"
|
|
77
|
+
if (node.parent.parent.parent.type === 'VariableDeclaration' && node.parent.parent.parent.parent.type === 'ExportNamedDeclaration') {
|
|
78
|
+
context.report({
|
|
79
|
+
node: node,
|
|
80
|
+
messageId: 'noModuleScope'
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
62
85
|
break;
|
|
63
86
|
case 'UnaryExpression':
|
|
64
87
|
case 'LogicalExpression':
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atlaskit/eslint-plugin-platform",
|
|
3
3
|
"description": "The essential plugin for use with Atlassian frontend platform tools",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.4.1",
|
|
5
5
|
"author": "Atlassian Pty Ltd",
|
|
6
6
|
"atlassian": {
|
|
7
7
|
"team": "UIP - Platform Integration Trust (PITa)",
|
|
@@ -37,6 +37,7 @@
|
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
39
|
"@atlassian/atlassian-frontend-prettier-config-1.0.1": "npm:@atlassian/atlassian-frontend-prettier-config@1.0.1",
|
|
40
|
+
"@types/eslint": "^8.4.5",
|
|
40
41
|
"eslint": "^7.7.0",
|
|
41
42
|
"tsconfig-paths": "^4.2.0"
|
|
42
43
|
},
|
package/src/index.tsx
CHANGED
|
@@ -16,6 +16,16 @@ describe('test ensure-critical-dependency-resolutions rule', () => {
|
|
|
16
16
|
}`,
|
|
17
17
|
filename: `${cwd}/package.json`,
|
|
18
18
|
},
|
|
19
|
+
// Root package.json, have all of the correct resolutions
|
|
20
|
+
{
|
|
21
|
+
code: `const foo = {
|
|
22
|
+
"resolutions": {
|
|
23
|
+
"@types/react": "18.2.28",
|
|
24
|
+
"typescript": "4.9.5",
|
|
25
|
+
}
|
|
26
|
+
}`,
|
|
27
|
+
filename: `${cwd}/package.json`,
|
|
28
|
+
},
|
|
19
29
|
// Root package.json, have all of the correct resolutions with ~
|
|
20
30
|
{
|
|
21
31
|
code: `const foo = {
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { findRootSync } from '@manypkg/find-root';
|
|
2
|
+
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
2
3
|
import type { Rule } from 'eslint';
|
|
3
4
|
import type { ObjectExpression } from 'estree';
|
|
4
5
|
import { getObjectPropertyAsObject } from '../util/handle-ast-object';
|
|
5
6
|
|
|
6
7
|
// Here we only need to specify the major and minor versions
|
|
7
8
|
// In matchMinorVersion, we will check if the versions in resolutions fall in the right ranges.
|
|
8
|
-
const DESIRED_PKG_VERSIONS: Record<string, string> = {
|
|
9
|
-
typescript: '4.9',
|
|
10
|
-
'@types/react': '16.14',
|
|
9
|
+
const DESIRED_PKG_VERSIONS: Record<string, string[]> = {
|
|
10
|
+
typescript: ['4.9'],
|
|
11
|
+
'@types/react': ['16.14', '18.2'],
|
|
11
12
|
};
|
|
12
13
|
|
|
13
14
|
const matchMinorVersion = (
|
|
@@ -89,14 +90,16 @@ const rule: Rule.RuleModule = {
|
|
|
89
90
|
const isRootPackageJson = fileName.endsWith(`${rootDir}/package.json`);
|
|
90
91
|
|
|
91
92
|
if (packageResolutions !== null) {
|
|
92
|
-
for (const [key,
|
|
93
|
+
for (const [key, values] of Object.entries(DESIRED_PKG_VERSIONS)) {
|
|
93
94
|
if (
|
|
94
|
-
!
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
95
|
+
!values.some((value) => {
|
|
96
|
+
return verifyResolutionFromObject(
|
|
97
|
+
packageResolutions as ObjectExpression,
|
|
98
|
+
key,
|
|
99
|
+
value,
|
|
100
|
+
!isRootPackageJson,
|
|
101
|
+
);
|
|
102
|
+
})
|
|
100
103
|
) {
|
|
101
104
|
return context.report({
|
|
102
105
|
node,
|
|
@@ -55,6 +55,15 @@ describe('enforce-feature-flag-usage-structure tests', () => {
|
|
|
55
55
|
{ messageId: 'multipleFlagCheckInExpression' },
|
|
56
56
|
],
|
|
57
57
|
},
|
|
58
|
+
{
|
|
59
|
+
code: `export default getBooleanFF('test-flag') ? "this is" : "not good";`,
|
|
60
|
+
errors: [{ messageId: 'noModuleScope' }],
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
only: true,
|
|
64
|
+
code: `export const foo = getBooleanFF('test-flag') ? "this is" : "not good";`,
|
|
65
|
+
errors: [{ messageId: 'noModuleScope' }],
|
|
66
|
+
},
|
|
58
67
|
],
|
|
59
68
|
});
|
|
60
69
|
});
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
1
2
|
import type { Rule } from 'eslint';
|
|
2
3
|
import type { Node, Expression } from 'estree';
|
|
3
4
|
|
|
@@ -62,6 +63,7 @@ const rule: Rule.RuleModule = {
|
|
|
62
63
|
onlyStringLiteral:
|
|
63
64
|
"Only get feature flags by string literal, don't use variables! See http://go/pff-eslint for more details",
|
|
64
65
|
multipleFlagCheckInExpression: `Only check one flag per expression! See http://go/pff-eslint for more details`,
|
|
66
|
+
noModuleScope: `Don't use platform feature flags in module scope! See http://go/pff-eslint for more details`,
|
|
65
67
|
},
|
|
66
68
|
},
|
|
67
69
|
create(context) {
|
|
@@ -82,7 +84,30 @@ const rule: Rule.RuleModule = {
|
|
|
82
84
|
|
|
83
85
|
switch (node.parent?.type) {
|
|
84
86
|
case 'IfStatement':
|
|
87
|
+
break;
|
|
85
88
|
case 'ConditionalExpression':
|
|
89
|
+
switch (node.parent?.parent.type) {
|
|
90
|
+
case 'ExportDefaultDeclaration':
|
|
91
|
+
// handles "export default getBooleanFF('test-flag') ? "this is" : "not good";"
|
|
92
|
+
context.report({
|
|
93
|
+
node,
|
|
94
|
+
messageId: 'noModuleScope',
|
|
95
|
+
});
|
|
96
|
+
break;
|
|
97
|
+
case 'VariableDeclarator':
|
|
98
|
+
// handles "export const foo = getBooleanFF('test-flag') ? 'this is' : 'not good';"
|
|
99
|
+
if (
|
|
100
|
+
node.parent.parent.parent.type === 'VariableDeclaration' &&
|
|
101
|
+
node.parent.parent.parent.parent.type ===
|
|
102
|
+
'ExportNamedDeclaration'
|
|
103
|
+
) {
|
|
104
|
+
context.report({
|
|
105
|
+
node,
|
|
106
|
+
messageId: 'noModuleScope',
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
break;
|
|
110
|
+
}
|
|
86
111
|
break;
|
|
87
112
|
case 'UnaryExpression':
|
|
88
113
|
case 'LogicalExpression':
|
package/tsconfig.app.json
CHANGED
package/tsconfig.dev.json
CHANGED
package/tmp/api-report-tmp.d.ts
DELETED
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
## API Report File for "@atlaskit/eslint-plugin-platform"
|
|
2
|
-
|
|
3
|
-
> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
|
|
4
|
-
|
|
5
|
-
```ts
|
|
6
|
-
|
|
7
|
-
import type { Linter } from 'eslint';
|
|
8
|
-
import { Rule } from 'eslint';
|
|
9
|
-
|
|
10
|
-
// @public (undocumented)
|
|
11
|
-
export const configs: {
|
|
12
|
-
recommended: {
|
|
13
|
-
plugins: string[];
|
|
14
|
-
rules: {
|
|
15
|
-
'@atlaskit/platform/ensure-feature-flag-registration': string;
|
|
16
|
-
'@atlaskit/platform/ensure-feature-flag-prefix': (string | {
|
|
17
|
-
allowedPrefixes: string[];
|
|
18
|
-
})[];
|
|
19
|
-
'@atlaskit/platform/ensure-test-runner-arguments': string;
|
|
20
|
-
'@atlaskit/platform/ensure-test-runner-nested-count': string;
|
|
21
|
-
'@atlaskit/platform/no-invalid-feature-flag-usage': string;
|
|
22
|
-
'@atlaskit/platform/no-invalid-storybook-decorator-usage': string;
|
|
23
|
-
'@atlaskit/platform/ensure-atlassian-team': string;
|
|
24
|
-
};
|
|
25
|
-
};
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
// @public (undocumented)
|
|
29
|
-
export const processors: {
|
|
30
|
-
'package-json-processor': Linter.Processor<Linter.ProcessorFile | string>;
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
// @public (undocumented)
|
|
34
|
-
export const rules: {
|
|
35
|
-
'ensure-feature-flag-registration': Rule.RuleModule;
|
|
36
|
-
'ensure-feature-flag-prefix': Rule.RuleModule;
|
|
37
|
-
'ensure-test-runner-arguments': Rule.RuleModule;
|
|
38
|
-
'ensure-test-runner-nested-count': Rule.RuleModule;
|
|
39
|
-
'ensure-atlassian-team': Rule.RuleModule;
|
|
40
|
-
'ensure-critical-dependency-resolutions': Rule.RuleModule;
|
|
41
|
-
'no-duplicate-dependencies': Rule.RuleModule;
|
|
42
|
-
'no-invalid-feature-flag-usage': Rule.RuleModule;
|
|
43
|
-
'no-pre-post-install-scripts': Rule.RuleModule;
|
|
44
|
-
'no-invalid-storybook-decorator-usage': Rule.RuleModule;
|
|
45
|
-
'ensure-publish-valid': Rule.RuleModule;
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
// (No @packageDocumentation comment for this package)
|
|
49
|
-
|
|
50
|
-
```
|