@atlaskit/eslint-plugin-platform 2.7.1 → 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 +7 -0
- package/dist/cjs/index.js +4 -7
- package/dist/cjs/rules/constants.js +1 -1
- package/dist/cjs/rules/ensure-critical-dependency-resolutions/index.js +5 -5
- 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 +1 -1
- 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/es2019/index.js +4 -7
- package/dist/es2019/rules/constants.js +1 -1
- package/dist/es2019/rules/ensure-critical-dependency-resolutions/index.js +5 -5
- 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 +1 -1
- 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/esm/index.js +4 -7
- package/dist/esm/rules/constants.js +1 -1
- package/dist/esm/rules/ensure-critical-dependency-resolutions/index.js +5 -5
- 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 +1 -1
- 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/types/index.d.ts +2 -14
- package/dist/types-ts4.5/index.d.ts +2 -26
- package/package.json +1 -4
- package/dist/cjs/rules/ensure-feature-flag-prefix/index.js +0 -75
- package/dist/es2019/rules/ensure-feature-flag-prefix/index.js +0 -65
- package/dist/esm/rules/ensure-feature-flag-prefix/index.js +0 -69
- /package/dist/types/rules/{ensure-feature-flag-prefix → 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,7 +1,7 @@
|
|
|
1
1
|
// We will be removing sparse checkout from pipelines in CI completely due to the load it causes on BBC.
|
|
2
2
|
// We will be incrementally removing sparse-checkout from the files below as it is probably unnecessasry.
|
|
3
3
|
// If you must add an exception below, please go through the chopper process before doing so
|
|
4
|
-
var sparseCheckoutExceptions = ['
|
|
4
|
+
var sparseCheckoutExceptions = ['pipeline-definitions/pipelines/custom/run-issue-automat.ts', 'pipeline-definitions/pipelines/custom/marketplace/utils.ts', 'pipeline-definitions/pipelines/custom/confluence/utils/index.ts', 'pipeline-definitions/pipelines/custom/afm-tools/upload-afm-dependency-graph-cache.ts', 'pipeline-definitions/pipelines/custom/afm-tools/default-afm-tools.ts', 'pipeline-definitions/pipelines/custom/marketplace/utils.ts', 'pipeline-definitions/pipelines/custom/afm-git-hooks.ts', 'pipeline-definitions/pipelines/custom/update-codeowners-and-teams-gen.ts', 'pipeline-definitions/pipelines/custom/run-issue-automat.ts'];
|
|
5
5
|
var rule = {
|
|
6
6
|
meta: {
|
|
7
7
|
docs: {
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
2
|
+
|
|
3
|
+
var rule = {
|
|
4
|
+
meta: {
|
|
5
|
+
type: 'problem',
|
|
6
|
+
// Problem type = can be error
|
|
7
|
+
docs: {
|
|
8
|
+
description: 'Prefer crypto.randomUUID() over uuid library. The uuid package causes Jest mocking issues.',
|
|
9
|
+
recommended: true
|
|
10
|
+
},
|
|
11
|
+
fixable: 'code',
|
|
12
|
+
// Enables --fix
|
|
13
|
+
messages: {
|
|
14
|
+
preferCryptoRandomUUID: 'Use crypto.randomUUID() instead of the uuid library. Run `eslint --fix` to auto-migrate.'
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
create: function create(context) {
|
|
18
|
+
var uuidImports = new Map(); // Track imported names
|
|
19
|
+
|
|
20
|
+
return {
|
|
21
|
+
ImportDeclaration: function ImportDeclaration(node) {
|
|
22
|
+
if (node.type !== 'ImportDeclaration') {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
var source = node.source.value;
|
|
26
|
+
if (typeof source === 'string' && (source === 'uuid' || /^uuid\/v[14]$/.test(source))) {
|
|
27
|
+
// Track imported name (e.g., uuid, v4, etc.)
|
|
28
|
+
var specifier = node.specifiers[0];
|
|
29
|
+
if (specifier) {
|
|
30
|
+
uuidImports.set(specifier.local.name, node);
|
|
31
|
+
}
|
|
32
|
+
context.report({
|
|
33
|
+
node: node,
|
|
34
|
+
messageId: 'preferCryptoRandomUUID',
|
|
35
|
+
fix: function fix(fixer) {
|
|
36
|
+
// Remove the import - usages will be fixed separately
|
|
37
|
+
return fixer.remove(node);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
CallExpression: function CallExpression(node) {
|
|
43
|
+
var _node$arguments$;
|
|
44
|
+
if (node.type !== 'CallExpression') {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Handle direct uuid() or v4() calls
|
|
49
|
+
if (node.callee.type === 'Identifier') {
|
|
50
|
+
var calleeName = node.callee.name;
|
|
51
|
+
if (uuidImports.has(calleeName)) {
|
|
52
|
+
context.report({
|
|
53
|
+
node: node,
|
|
54
|
+
messageId: 'preferCryptoRandomUUID',
|
|
55
|
+
fix: function fix(fixer) {
|
|
56
|
+
// Replace uuid() with crypto.randomUUID()
|
|
57
|
+
return fixer.replaceText(node.callee, 'crypto.randomUUID');
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Handle require('uuid')
|
|
64
|
+
if (node.callee.type === 'Identifier' && node.callee.name === 'require' && ((_node$arguments$ = node.arguments[0]) === null || _node$arguments$ === void 0 ? void 0 : _node$arguments$.type) === 'Literal') {
|
|
65
|
+
var arg = node.arguments[0].value;
|
|
66
|
+
if (typeof arg === 'string' && (arg === 'uuid' || /^uuid\/v[14]$/.test(arg))) {
|
|
67
|
+
context.report({
|
|
68
|
+
node: node,
|
|
69
|
+
messageId: 'preferCryptoRandomUUID'
|
|
70
|
+
// require() needs manual refactoring
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
'Program:exit': function ProgramExit() {
|
|
76
|
+
uuidImports.clear();
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
export default rule;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
var rule = {
|
|
2
2
|
meta: {
|
|
3
3
|
docs: {
|
|
4
|
-
url: 'https://
|
|
4
|
+
url: 'https://bitbucket.org/atlassian/atlassian-frontend-monorepo/src/master/platform/packages/platform/eslint-plugin/src/rules/use-entrypoints-in-examples/README.md',
|
|
5
5
|
description: 'Encourage usage of package entrypoints in examples.'
|
|
6
6
|
},
|
|
7
7
|
messages: {
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import type { ESLint, Linter } from 'eslint';
|
|
2
2
|
declare const rules: {
|
|
3
3
|
'ensure-feature-flag-registration': import("eslint").Rule.RuleModule;
|
|
4
|
-
'ensure-feature-flag-prefix': import("eslint").Rule.RuleModule;
|
|
5
4
|
'ensure-test-runner-arguments': import("eslint").Rule.RuleModule;
|
|
6
5
|
'ensure-test-runner-nested-count': import("eslint").Rule.RuleModule;
|
|
7
6
|
'ensure-atlassian-team': import("eslint").Rule.RuleModule;
|
|
@@ -29,6 +28,7 @@ declare const rules: {
|
|
|
29
28
|
'no-sparse-checkout': import("eslint").Rule.RuleModule;
|
|
30
29
|
'no-direct-document-usage': import("eslint").Rule.RuleModule;
|
|
31
30
|
'no-set-immediate': import("eslint").Rule.RuleModule;
|
|
31
|
+
'prefer-crypto-random-uuid': import("eslint").Rule.RuleModule;
|
|
32
32
|
};
|
|
33
33
|
declare const plugin: {
|
|
34
34
|
meta: {
|
|
@@ -37,7 +37,6 @@ declare const plugin: {
|
|
|
37
37
|
};
|
|
38
38
|
rules: {
|
|
39
39
|
'ensure-feature-flag-registration': import("eslint").Rule.RuleModule;
|
|
40
|
-
'ensure-feature-flag-prefix': import("eslint").Rule.RuleModule;
|
|
41
40
|
'ensure-test-runner-arguments': import("eslint").Rule.RuleModule;
|
|
42
41
|
'ensure-test-runner-nested-count': import("eslint").Rule.RuleModule;
|
|
43
42
|
'ensure-atlassian-team': import("eslint").Rule.RuleModule;
|
|
@@ -65,6 +64,7 @@ declare const plugin: {
|
|
|
65
64
|
'no-sparse-checkout': import("eslint").Rule.RuleModule;
|
|
66
65
|
'no-direct-document-usage': import("eslint").Rule.RuleModule;
|
|
67
66
|
'no-set-immediate': import("eslint").Rule.RuleModule;
|
|
67
|
+
'prefer-crypto-random-uuid': import("eslint").Rule.RuleModule;
|
|
68
68
|
};
|
|
69
69
|
configs: {
|
|
70
70
|
recommended: {
|
|
@@ -77,9 +77,6 @@ declare const plugin: {
|
|
|
77
77
|
'@atlaskit/platform/prefer-fg': "error";
|
|
78
78
|
'@atlaskit/platform/no-alias': "error";
|
|
79
79
|
'@atlaskit/platform/ensure-feature-flag-registration': "error";
|
|
80
|
-
'@atlaskit/platform/ensure-feature-flag-prefix': ["warn", {
|
|
81
|
-
allowedPrefixes: string[];
|
|
82
|
-
}];
|
|
83
80
|
'@atlaskit/platform/ensure-test-runner-arguments': "error";
|
|
84
81
|
'@atlaskit/platform/ensure-test-runner-nested-count': "warn";
|
|
85
82
|
'@atlaskit/platform/no-invalid-feature-flag-usage': "error";
|
|
@@ -111,9 +108,6 @@ declare const plugin: {
|
|
|
111
108
|
'@atlaskit/platform/prefer-fg': "error";
|
|
112
109
|
'@atlaskit/platform/no-alias': "error";
|
|
113
110
|
'@atlaskit/platform/ensure-feature-flag-registration': "error";
|
|
114
|
-
'@atlaskit/platform/ensure-feature-flag-prefix': ["warn", {
|
|
115
|
-
allowedPrefixes: string[];
|
|
116
|
-
}];
|
|
117
111
|
'@atlaskit/platform/ensure-test-runner-arguments': "error";
|
|
118
112
|
'@atlaskit/platform/ensure-test-runner-nested-count': "warn";
|
|
119
113
|
'@atlaskit/platform/no-invalid-feature-flag-usage': "error";
|
|
@@ -194,9 +188,6 @@ declare const configs: {
|
|
|
194
188
|
'@atlaskit/platform/prefer-fg': "error";
|
|
195
189
|
'@atlaskit/platform/no-alias': "error";
|
|
196
190
|
'@atlaskit/platform/ensure-feature-flag-registration': "error";
|
|
197
|
-
'@atlaskit/platform/ensure-feature-flag-prefix': ["warn", {
|
|
198
|
-
allowedPrefixes: string[];
|
|
199
|
-
}];
|
|
200
191
|
'@atlaskit/platform/ensure-test-runner-arguments': "error";
|
|
201
192
|
'@atlaskit/platform/ensure-test-runner-nested-count': "warn";
|
|
202
193
|
'@atlaskit/platform/no-invalid-feature-flag-usage': "error";
|
|
@@ -228,9 +219,6 @@ declare const configs: {
|
|
|
228
219
|
'@atlaskit/platform/prefer-fg': "error";
|
|
229
220
|
'@atlaskit/platform/no-alias': "error";
|
|
230
221
|
'@atlaskit/platform/ensure-feature-flag-registration': "error";
|
|
231
|
-
'@atlaskit/platform/ensure-feature-flag-prefix': ["warn", {
|
|
232
|
-
allowedPrefixes: string[];
|
|
233
|
-
}];
|
|
234
222
|
'@atlaskit/platform/ensure-test-runner-arguments': "error";
|
|
235
223
|
'@atlaskit/platform/ensure-test-runner-nested-count': "warn";
|
|
236
224
|
'@atlaskit/platform/no-invalid-feature-flag-usage': "error";
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import type { ESLint, Linter } from 'eslint';
|
|
2
2
|
declare const rules: {
|
|
3
3
|
'ensure-feature-flag-registration': import("eslint").Rule.RuleModule;
|
|
4
|
-
'ensure-feature-flag-prefix': import("eslint").Rule.RuleModule;
|
|
5
4
|
'ensure-test-runner-arguments': import("eslint").Rule.RuleModule;
|
|
6
5
|
'ensure-test-runner-nested-count': import("eslint").Rule.RuleModule;
|
|
7
6
|
'ensure-atlassian-team': import("eslint").Rule.RuleModule;
|
|
@@ -29,6 +28,7 @@ declare const rules: {
|
|
|
29
28
|
'no-sparse-checkout': import("eslint").Rule.RuleModule;
|
|
30
29
|
'no-direct-document-usage': import("eslint").Rule.RuleModule;
|
|
31
30
|
'no-set-immediate': import("eslint").Rule.RuleModule;
|
|
31
|
+
'prefer-crypto-random-uuid': import("eslint").Rule.RuleModule;
|
|
32
32
|
};
|
|
33
33
|
declare const plugin: {
|
|
34
34
|
meta: {
|
|
@@ -37,7 +37,6 @@ declare const plugin: {
|
|
|
37
37
|
};
|
|
38
38
|
rules: {
|
|
39
39
|
'ensure-feature-flag-registration': import("eslint").Rule.RuleModule;
|
|
40
|
-
'ensure-feature-flag-prefix': import("eslint").Rule.RuleModule;
|
|
41
40
|
'ensure-test-runner-arguments': import("eslint").Rule.RuleModule;
|
|
42
41
|
'ensure-test-runner-nested-count': import("eslint").Rule.RuleModule;
|
|
43
42
|
'ensure-atlassian-team': import("eslint").Rule.RuleModule;
|
|
@@ -65,6 +64,7 @@ declare const plugin: {
|
|
|
65
64
|
'no-sparse-checkout': import("eslint").Rule.RuleModule;
|
|
66
65
|
'no-direct-document-usage': import("eslint").Rule.RuleModule;
|
|
67
66
|
'no-set-immediate': import("eslint").Rule.RuleModule;
|
|
67
|
+
'prefer-crypto-random-uuid': import("eslint").Rule.RuleModule;
|
|
68
68
|
};
|
|
69
69
|
configs: {
|
|
70
70
|
recommended: {
|
|
@@ -77,12 +77,6 @@ declare const plugin: {
|
|
|
77
77
|
'@atlaskit/platform/prefer-fg': "error";
|
|
78
78
|
'@atlaskit/platform/no-alias': "error";
|
|
79
79
|
'@atlaskit/platform/ensure-feature-flag-registration': "error";
|
|
80
|
-
'@atlaskit/platform/ensure-feature-flag-prefix': [
|
|
81
|
-
"warn",
|
|
82
|
-
{
|
|
83
|
-
allowedPrefixes: string[];
|
|
84
|
-
}
|
|
85
|
-
];
|
|
86
80
|
'@atlaskit/platform/ensure-test-runner-arguments': "error";
|
|
87
81
|
'@atlaskit/platform/ensure-test-runner-nested-count': "warn";
|
|
88
82
|
'@atlaskit/platform/no-invalid-feature-flag-usage': "error";
|
|
@@ -117,12 +111,6 @@ declare const plugin: {
|
|
|
117
111
|
'@atlaskit/platform/prefer-fg': "error";
|
|
118
112
|
'@atlaskit/platform/no-alias': "error";
|
|
119
113
|
'@atlaskit/platform/ensure-feature-flag-registration': "error";
|
|
120
|
-
'@atlaskit/platform/ensure-feature-flag-prefix': [
|
|
121
|
-
"warn",
|
|
122
|
-
{
|
|
123
|
-
allowedPrefixes: string[];
|
|
124
|
-
}
|
|
125
|
-
];
|
|
126
114
|
'@atlaskit/platform/ensure-test-runner-arguments': "error";
|
|
127
115
|
'@atlaskit/platform/ensure-test-runner-nested-count': "warn";
|
|
128
116
|
'@atlaskit/platform/no-invalid-feature-flag-usage': "error";
|
|
@@ -212,12 +200,6 @@ declare const configs: {
|
|
|
212
200
|
'@atlaskit/platform/prefer-fg': "error";
|
|
213
201
|
'@atlaskit/platform/no-alias': "error";
|
|
214
202
|
'@atlaskit/platform/ensure-feature-flag-registration': "error";
|
|
215
|
-
'@atlaskit/platform/ensure-feature-flag-prefix': [
|
|
216
|
-
"warn",
|
|
217
|
-
{
|
|
218
|
-
allowedPrefixes: string[];
|
|
219
|
-
}
|
|
220
|
-
];
|
|
221
203
|
'@atlaskit/platform/ensure-test-runner-arguments': "error";
|
|
222
204
|
'@atlaskit/platform/ensure-test-runner-nested-count': "warn";
|
|
223
205
|
'@atlaskit/platform/no-invalid-feature-flag-usage': "error";
|
|
@@ -252,12 +234,6 @@ declare const configs: {
|
|
|
252
234
|
'@atlaskit/platform/prefer-fg': "error";
|
|
253
235
|
'@atlaskit/platform/no-alias': "error";
|
|
254
236
|
'@atlaskit/platform/ensure-feature-flag-registration': "error";
|
|
255
|
-
'@atlaskit/platform/ensure-feature-flag-prefix': [
|
|
256
|
-
"warn",
|
|
257
|
-
{
|
|
258
|
-
allowedPrefixes: string[];
|
|
259
|
-
}
|
|
260
|
-
];
|
|
261
237
|
'@atlaskit/platform/ensure-test-runner-arguments': "error";
|
|
262
238
|
'@atlaskit/platform/ensure-test-runner-nested-count': "warn";
|
|
263
239
|
'@atlaskit/platform/no-invalid-feature-flag-usage': "error";
|
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": "2.7.
|
|
4
|
+
"version": "2.7.2",
|
|
5
5
|
"author": "Atlassian Pty Ltd",
|
|
6
6
|
"atlassian": {
|
|
7
7
|
"team": "Build Infra",
|
|
@@ -29,9 +29,6 @@
|
|
|
29
29
|
"*.compiled.css"
|
|
30
30
|
],
|
|
31
31
|
"atlaskit:src": "src/index.tsx",
|
|
32
|
-
"af:exports": {
|
|
33
|
-
".": "./src/index.tsx"
|
|
34
|
-
},
|
|
35
32
|
"dependencies": {
|
|
36
33
|
"@atlaskit/eslint-utils": "^2.0.0",
|
|
37
34
|
"@babel/runtime": "^7.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,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,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;
|
/package/dist/types/rules/{ensure-feature-flag-prefix → prefer-crypto-random-uuid}/index.d.ts
RENAMED
|
File without changes
|
/package/dist/types-ts4.5/rules/{ensure-feature-flag-prefix → prefer-crypto-random-uuid}/index.d.ts
RENAMED
|
File without changes
|