@atlaskit/eslint-plugin-platform 2.7.2 → 2.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -0
- package/dist/cjs/index.js +19 -3
- package/dist/cjs/rules/ensure-use-sync-external-store-server-snapshot/index.js +41 -0
- package/dist/cjs/rules/feature-gating/valid-gate-name/index.js +60 -0
- package/dist/cjs/rules/import/no-barrel-entry-imports/index.js +1279 -0
- package/dist/cjs/rules/import/no-barrel-entry-jest-mock/index.js +1659 -0
- package/dist/cjs/rules/import/no-conversation-assistant-barrel-imports/index.js +43 -0
- package/dist/cjs/rules/import/no-jest-mock-barrel-files/index.js +1402 -0
- package/dist/cjs/rules/import/no-relative-barrel-file-imports/index.js +781 -0
- package/dist/cjs/rules/import/shared/barrel-parsing.js +511 -0
- package/dist/cjs/rules/import/shared/file-system.js +186 -0
- package/dist/cjs/rules/import/shared/jest-utils.js +244 -0
- package/dist/cjs/rules/import/shared/package-registry.js +263 -0
- package/dist/cjs/rules/import/shared/package-resolution.js +318 -0
- package/dist/cjs/rules/import/shared/perf.js +89 -0
- package/dist/cjs/rules/import/shared/types.js +67 -0
- package/dist/cjs/rules/visit-example-type-import-required/index.js +409 -0
- package/dist/es2019/index.js +19 -3
- package/dist/es2019/rules/ensure-use-sync-external-store-server-snapshot/index.js +43 -0
- package/dist/es2019/rules/feature-gating/valid-gate-name/index.js +52 -0
- package/dist/es2019/rules/import/no-barrel-entry-imports/index.js +1158 -0
- package/dist/es2019/rules/import/no-barrel-entry-jest-mock/index.js +1341 -0
- package/dist/es2019/rules/import/no-conversation-assistant-barrel-imports/index.js +37 -0
- package/dist/es2019/rules/import/no-jest-mock-barrel-files/index.js +1180 -0
- package/dist/es2019/rules/import/no-relative-barrel-file-imports/index.js +742 -0
- package/dist/es2019/rules/import/shared/barrel-parsing.js +433 -0
- package/dist/es2019/rules/import/shared/file-system.js +174 -0
- package/dist/es2019/rules/import/shared/jest-utils.js +203 -0
- package/dist/es2019/rules/import/shared/package-registry.js +240 -0
- package/dist/es2019/rules/import/shared/package-resolution.js +253 -0
- package/dist/es2019/rules/import/shared/perf.js +83 -0
- package/dist/es2019/rules/import/shared/types.js +57 -0
- package/dist/es2019/rules/visit-example-type-import-required/index.js +375 -0
- package/dist/esm/index.js +19 -3
- package/dist/esm/rules/ensure-use-sync-external-store-server-snapshot/index.js +35 -0
- package/dist/esm/rules/feature-gating/valid-gate-name/index.js +53 -0
- package/dist/esm/rules/import/no-barrel-entry-imports/index.js +1272 -0
- package/dist/esm/rules/import/no-barrel-entry-jest-mock/index.js +1650 -0
- package/dist/esm/rules/import/no-conversation-assistant-barrel-imports/index.js +37 -0
- package/dist/esm/rules/import/no-jest-mock-barrel-files/index.js +1392 -0
- package/dist/esm/rules/import/no-relative-barrel-file-imports/index.js +774 -0
- package/dist/esm/rules/import/shared/barrel-parsing.js +500 -0
- package/dist/esm/rules/import/shared/file-system.js +176 -0
- package/dist/esm/rules/import/shared/jest-utils.js +231 -0
- package/dist/esm/rules/import/shared/package-registry.js +256 -0
- package/dist/esm/rules/import/shared/package-resolution.js +306 -0
- package/dist/esm/rules/import/shared/perf.js +80 -0
- package/dist/esm/rules/import/shared/types.js +61 -0
- package/dist/esm/rules/visit-example-type-import-required/index.js +402 -0
- package/dist/types/index.d.ts +28 -2
- package/dist/types/rules/ensure-use-sync-external-store-server-snapshot/index.d.ts +3 -0
- package/dist/types/rules/feature-gating/valid-gate-name/index.d.ts +3 -0
- package/dist/types/rules/import/no-barrel-entry-imports/index.d.ts +9 -0
- package/dist/types/rules/import/no-barrel-entry-jest-mock/index.d.ts +9 -0
- package/dist/types/rules/import/no-conversation-assistant-barrel-imports/index.d.ts +3 -0
- package/dist/types/rules/import/no-jest-mock-barrel-files/index.d.ts +22 -0
- package/dist/types/rules/import/no-relative-barrel-file-imports/index.d.ts +5 -0
- package/dist/types/rules/import/shared/barrel-parsing.d.ts +30 -0
- package/dist/types/rules/import/shared/file-system.d.ts +38 -0
- package/dist/types/rules/import/shared/jest-utils.d.ts +55 -0
- package/dist/types/rules/import/shared/package-registry.d.ts +26 -0
- package/dist/types/rules/import/shared/package-resolution.d.ts +58 -0
- package/dist/types/rules/import/shared/perf.d.ts +13 -0
- package/dist/types/rules/import/shared/types.d.ts +131 -0
- package/dist/types/rules/visit-example-type-import-required/index.d.ts +4 -0
- package/dist/types-ts4.5/index.d.ts +28 -2
- package/dist/types-ts4.5/rules/import/no-barrel-entry-imports/index.d.ts +9 -0
- package/dist/types-ts4.5/rules/import/no-barrel-entry-jest-mock/index.d.ts +9 -0
- package/dist/types-ts4.5/rules/import/no-conversation-assistant-barrel-imports/index.d.ts +3 -0
- package/dist/types-ts4.5/rules/import/no-jest-mock-barrel-files/index.d.ts +22 -0
- package/dist/types-ts4.5/rules/import/no-relative-barrel-file-imports/index.d.ts +5 -0
- package/dist/types-ts4.5/rules/import/shared/barrel-parsing.d.ts +30 -0
- package/dist/types-ts4.5/rules/import/shared/file-system.d.ts +38 -0
- package/dist/types-ts4.5/rules/import/shared/jest-utils.d.ts +55 -0
- package/dist/types-ts4.5/rules/import/shared/package-registry.d.ts +26 -0
- package/dist/types-ts4.5/rules/import/shared/package-resolution.d.ts +58 -0
- package/dist/types-ts4.5/rules/import/shared/perf.d.ts +13 -0
- package/dist/types-ts4.5/rules/import/shared/types.d.ts +131 -0
- package/dist/types-ts4.5/rules/visit-example-type-import-required/index.d.ts +4 -0
- package/package.json +6 -2
- package/dist/cjs/rules/ensure-native-and-af-exports-synced/index.js +0 -158
- package/dist/es2019/rules/ensure-native-and-af-exports-synced/index.js +0 -146
- package/dist/esm/rules/ensure-native-and-af-exports-synced/index.js +0 -151
- /package/dist/types-ts4.5/rules/{ensure-native-and-af-exports-synced → ensure-use-sync-external-store-server-snapshot}/index.d.ts +0 -0
- /package/dist/{types/rules/ensure-native-and-af-exports-synced → types-ts4.5/rules/feature-gating/valid-gate-name}/index.d.ts +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# @atlaskit/eslint-plugin-platform
|
|
2
2
|
|
|
3
|
+
## 2.9.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [`50be0b9fcf83d`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/50be0b9fcf83d) -
|
|
8
|
+
Added new ESLint rule `ensure-use-sync-external-store-server-snapshot` that enforces all
|
|
9
|
+
`useSyncExternalStore` calls include the third argument (`getServerSnapshot`) for SSR
|
|
10
|
+
compatibility. The rule is enabled as an error in all platform, jira, and confluence configs.
|
|
11
|
+
|
|
12
|
+
## 2.8.0
|
|
13
|
+
|
|
14
|
+
### Minor Changes
|
|
15
|
+
|
|
16
|
+
- [`390e72480c2f2`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/390e72480c2f2) -
|
|
17
|
+
Updated references to de-barreling eslint rules to point to new @atlaskit/platform rule prefix.
|
|
18
|
+
|
|
3
19
|
## 2.7.2
|
|
4
20
|
|
|
5
21
|
### Patch Changes
|
package/dist/cjs/index.js
CHANGED
|
@@ -20,7 +20,6 @@ var _ensureNoPrivateDependencies = _interopRequireDefault(require("./rules/ensur
|
|
|
20
20
|
var _expandBorderShorthand = _interopRequireDefault(require("./rules/compiled/expand-border-shorthand"));
|
|
21
21
|
var _noInvalidStorybookDecoratorUsage = _interopRequireDefault(require("./rules/no-invalid-storybook-decorator-usage"));
|
|
22
22
|
var _ensurePublishValid = _interopRequireDefault(require("./rules/ensure-publish-valid"));
|
|
23
|
-
var _ensureNativeAndAfExportsSynced = _interopRequireDefault(require("./rules/ensure-native-and-af-exports-synced"));
|
|
24
23
|
var _noModuleLevelEval = _interopRequireDefault(require("./rules/feature-gating/no-module-level-eval"));
|
|
25
24
|
var _noModuleLevelEvalNav = _interopRequireDefault(require("./rules/feature-gating/no-module-level-eval-nav4"));
|
|
26
25
|
var _staticFeatureFlags = _interopRequireDefault(require("./rules/feature-gating/static-feature-flags"));
|
|
@@ -30,12 +29,20 @@ var _preferFg = _interopRequireDefault(require("./rules/feature-gating/prefer-fg
|
|
|
30
29
|
var _noAlias = _interopRequireDefault(require("./rules/feature-gating/no-alias"));
|
|
31
30
|
var _useEntrypointsInExamples = _interopRequireDefault(require("./rules/use-entrypoints-in-examples"));
|
|
32
31
|
var _useRecommendedUtils = _interopRequireDefault(require("./rules/feature-gating/use-recommended-utils"));
|
|
32
|
+
var _validGateName = _interopRequireDefault(require("./rules/feature-gating/valid-gate-name"));
|
|
33
33
|
var _expandBackgroundShorthand = _interopRequireDefault(require("./rules/compiled/expand-background-shorthand"));
|
|
34
34
|
var _expandSpacingShorthand = _interopRequireDefault(require("./rules/compiled/expand-spacing-shorthand"));
|
|
35
35
|
var _noSparseCheckout = _interopRequireDefault(require("./rules/no-sparse-checkout"));
|
|
36
36
|
var _noDirectDocumentUsage = _interopRequireDefault(require("./rules/no-direct-document-usage"));
|
|
37
37
|
var _noSetImmediate = _interopRequireDefault(require("./rules/no-set-immediate"));
|
|
38
38
|
var _preferCryptoRandomUuid = _interopRequireDefault(require("./rules/prefer-crypto-random-uuid"));
|
|
39
|
+
var _noBarrelEntryImports = _interopRequireDefault(require("./rules/import/no-barrel-entry-imports"));
|
|
40
|
+
var _noBarrelEntryJestMock = _interopRequireDefault(require("./rules/import/no-barrel-entry-jest-mock"));
|
|
41
|
+
var _noJestMockBarrelFiles = _interopRequireDefault(require("./rules/import/no-jest-mock-barrel-files"));
|
|
42
|
+
var _noRelativeBarrelFileImports = _interopRequireDefault(require("./rules/import/no-relative-barrel-file-imports"));
|
|
43
|
+
var _noConversationAssistantBarrelImports = _interopRequireDefault(require("./rules/import/no-conversation-assistant-barrel-imports"));
|
|
44
|
+
var _visitExampleTypeImportRequired = _interopRequireDefault(require("./rules/visit-example-type-import-required"));
|
|
45
|
+
var _ensureUseSyncExternalStoreServerSnapshot = _interopRequireDefault(require("./rules/ensure-use-sync-external-store-server-snapshot"));
|
|
39
46
|
var _nodePath = require("node:path");
|
|
40
47
|
var _nodeFs = require("node:fs");
|
|
41
48
|
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; }
|
|
@@ -73,7 +80,6 @@ var rules = exports.rules = {
|
|
|
73
80
|
'no-pre-post-install-scripts': _noPrePostInstalls.default,
|
|
74
81
|
'no-invalid-storybook-decorator-usage': _noInvalidStorybookDecoratorUsage.default,
|
|
75
82
|
'ensure-publish-valid': _ensurePublishValid.default,
|
|
76
|
-
'ensure-native-and-af-exports-synced': _ensureNativeAndAfExportsSynced.default,
|
|
77
83
|
'no-module-level-eval': _noModuleLevelEval.default,
|
|
78
84
|
'no-module-level-eval-nav4': _noModuleLevelEvalNav.default,
|
|
79
85
|
'static-feature-flags': _staticFeatureFlags.default,
|
|
@@ -83,14 +89,23 @@ var rules = exports.rules = {
|
|
|
83
89
|
'no-alias': _noAlias.default,
|
|
84
90
|
'use-entrypoints-in-examples': _useEntrypointsInExamples.default,
|
|
85
91
|
'use-recommended-utils': _useRecommendedUtils.default,
|
|
92
|
+
'valid-gate-name': _validGateName.default,
|
|
86
93
|
'no-sparse-checkout': _noSparseCheckout.default,
|
|
87
94
|
'no-direct-document-usage': _noDirectDocumentUsage.default,
|
|
88
95
|
'no-set-immediate': _noSetImmediate.default,
|
|
89
|
-
'prefer-crypto-random-uuid': _preferCryptoRandomUuid.default
|
|
96
|
+
'prefer-crypto-random-uuid': _preferCryptoRandomUuid.default,
|
|
97
|
+
'no-barrel-entry-imports': _noBarrelEntryImports.default,
|
|
98
|
+
'no-barrel-entry-jest-mock': _noBarrelEntryJestMock.default,
|
|
99
|
+
'no-jest-mock-barrel-files': _noJestMockBarrelFiles.default,
|
|
100
|
+
'no-relative-barrel-file-imports': _noRelativeBarrelFileImports.default,
|
|
101
|
+
'no-conversation-assistant-barrel-imports': _noConversationAssistantBarrelImports.default,
|
|
102
|
+
'visit-example-type-import-required': _visitExampleTypeImportRequired.default,
|
|
103
|
+
'ensure-use-sync-external-store-server-snapshot': _ensureUseSyncExternalStoreServerSnapshot.default
|
|
90
104
|
};
|
|
91
105
|
var commonConfig = {
|
|
92
106
|
'@atlaskit/platform/ensure-test-runner-arguments': 'error',
|
|
93
107
|
'@atlaskit/platform/ensure-test-runner-nested-count': 'warn',
|
|
108
|
+
'@atlaskit/platform/ensure-use-sync-external-store-server-snapshot': 'error',
|
|
94
109
|
'@atlaskit/platform/no-invalid-feature-flag-usage': 'error',
|
|
95
110
|
'@atlaskit/platform/no-invalid-storybook-decorator-usage': 'error',
|
|
96
111
|
'@atlaskit/platform/ensure-atlassian-team': 'error',
|
|
@@ -116,6 +131,7 @@ var recommendedRules = _objectSpread(_objectSpread({}, commonConfig), {}, {
|
|
|
116
131
|
'@atlaskit/platform/inline-usage': 'error',
|
|
117
132
|
'@atlaskit/platform/prefer-fg': 'error',
|
|
118
133
|
'@atlaskit/platform/no-alias': 'error',
|
|
134
|
+
'@atlaskit/platform/valid-gate-name': 'error',
|
|
119
135
|
// end: feature-gating rules
|
|
120
136
|
'@atlaskit/platform/ensure-feature-flag-registration': 'error'
|
|
121
137
|
});
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
8
|
+
|
|
9
|
+
var FUNCTION_NAME = 'useSyncExternalStore';
|
|
10
|
+
var rule = {
|
|
11
|
+
meta: {
|
|
12
|
+
type: 'problem',
|
|
13
|
+
docs: {
|
|
14
|
+
description: "Enforce that ".concat(FUNCTION_NAME, " is called with a third argument (getServerSnapshot) for SSR compatibility"),
|
|
15
|
+
recommended: true
|
|
16
|
+
},
|
|
17
|
+
messages: {
|
|
18
|
+
missingServerSnapshot: "'".concat(FUNCTION_NAME, "' must be called with a third argument (getServerSnapshot). Without it, React will throw during server-side rendering.\n\nIf your component relies on browser-only APIs (e.g. localStorage, WebRTC, WebGL) and must not render on the server, pass `() => null` (or another stable fallback) as the third argument \u2014 this is the correct way to opt out of SSR, not an omission.\n\nPrefer higher-level APIs that wrap ").concat(FUNCTION_NAME, " where available, as they handle SSR concerns for you.\n\nSee the React docs for usage guidance: https://react.dev/reference/react/useSyncExternalStore")
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
create: function create(context) {
|
|
22
|
+
return {
|
|
23
|
+
CallExpression: function CallExpression(node) {
|
|
24
|
+
var callee = node.callee,
|
|
25
|
+
args = node.arguments;
|
|
26
|
+
var isDirectCall = callee.type === 'Identifier' && callee.name === FUNCTION_NAME;
|
|
27
|
+
var isMemberCall = callee.type === 'MemberExpression' && callee.property.type === 'Identifier' && callee.property.name === FUNCTION_NAME;
|
|
28
|
+
if (!isDirectCall && !isMemberCall) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
if (args.length < 3) {
|
|
32
|
+
context.report({
|
|
33
|
+
node: node,
|
|
34
|
+
messageId: 'missingServerSnapshot'
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
var _default = exports.default = rule;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.default = void 0;
|
|
8
|
+
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
9
|
+
var _constants = require("../../constants");
|
|
10
|
+
var _utils = require("../utils");
|
|
11
|
+
var IMPORT_SOURCES = new Set([].concat((0, _toConsumableArray2.default)(_constants.FEATURE_API_IMPORT_SOURCES), ['@atlassian/jira-feature-flagging-utils', '@atlassian/jira-feature-gate-component']));
|
|
12
|
+
var FUNCTION_NAMES = new Set(['ff', 'fg', 'getFeatureFlagValue', 'componentWithFF', 'componentWithFG', 'passGate', 'withGate', 'expVal', 'expValEquals', 'UNSAFE_noExposureExp', 'mockExp', 'withExp', 'wasExperimentManuallyExposed']);
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Valid gate names must only contain lowercase letters (a-z), numbers (0-9),
|
|
16
|
+
* underscores (_), hyphens (-), and dots (.).
|
|
17
|
+
* No spaces, capital letters, or other characters are allowed.
|
|
18
|
+
*/
|
|
19
|
+
var VALID_GATE_NAME_PATTERN = /^[a-z0-9_.-]+$/;
|
|
20
|
+
function isValidGateName(name) {
|
|
21
|
+
return VALID_GATE_NAME_PATTERN.test(name);
|
|
22
|
+
}
|
|
23
|
+
var rule = {
|
|
24
|
+
meta: {
|
|
25
|
+
type: 'problem',
|
|
26
|
+
docs: {
|
|
27
|
+
description: 'Ensure feature gate names contain only lowercase letters, numbers, underscores, and hyphens'
|
|
28
|
+
},
|
|
29
|
+
messages: {
|
|
30
|
+
invalidGateName: 'Feature gate name "{{name}}" is invalid. Gate names must contain only lowercase letters (a-z), numbers (0-9), underscores (_), hyphens (-), and dots (.).'
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
create: function create(context) {
|
|
34
|
+
return {
|
|
35
|
+
'CallExpression[callee.type="Identifier"][arguments.length>0][arguments.0.type="Literal"]': function CallExpressionCalleeTypeIdentifierArgumentsLength0Arguments0TypeLiteral(node) {
|
|
36
|
+
if (node.type !== 'CallExpression') {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
if (node.callee.type === 'Identifier' && (!FUNCTION_NAMES.has(node.callee.name) || !(0, _utils.isIdentifierImportedFrom)(node.callee.name, IMPORT_SOURCES, context, node))) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
var nameArgument = node.arguments[0];
|
|
43
|
+
if (nameArgument.type !== 'Literal' || typeof nameArgument.value !== 'string') {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
var gateName = nameArgument.value;
|
|
47
|
+
if (!isValidGateName(gateName)) {
|
|
48
|
+
context.report({
|
|
49
|
+
node: nameArgument,
|
|
50
|
+
messageId: 'invalidGateName',
|
|
51
|
+
data: {
|
|
52
|
+
name: gateName
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
var _default = exports.default = rule;
|