eslint-plugin-jest 22.15.0 → 22.17.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/README.md +42 -40
- package/docs/rules/prefer-to-be-null.md +7 -2
- package/docs/rules/prefer-to-be-undefined.md +7 -2
- package/docs/rules/prefer-to-contain.md +8 -10
- package/docs/rules/prefer-to-have-length.md +7 -3
- package/docs/rules/require-top-level-describe.md +52 -0
- package/lib/__tests__/rules.test.js +5 -4
- package/lib/index.js +2 -3
- package/lib/rules/consistent-test-it.js +7 -7
- package/lib/rules/expect-expect.js +3 -3
- package/lib/rules/lowercase-name.js +3 -3
- package/lib/rules/no-alias-methods.js +18 -14
- package/lib/rules/no-commented-out-tests.js +2 -2
- package/lib/rules/no-disabled-tests.js +4 -4
- package/lib/rules/no-duplicate-hooks.js +5 -5
- package/lib/rules/no-empty-title.js +8 -14
- package/lib/rules/no-expect-resolves.js +3 -3
- package/lib/rules/no-export.js +3 -3
- package/lib/rules/no-focused-tests.js +4 -4
- package/lib/rules/no-hooks.js +3 -3
- package/lib/rules/no-identical-title.js +9 -9
- package/lib/rules/no-if.js +5 -5
- package/lib/rules/no-jasmine-globals.js +4 -4
- package/lib/rules/no-jest-import.js +2 -2
- package/lib/rules/no-large-snapshots.js +25 -18
- package/lib/rules/no-mocks-import.js +18 -7
- package/lib/rules/no-standalone-expect.js +8 -8
- package/lib/rules/no-test-callback.js +5 -5
- package/lib/rules/no-test-prefixes.js +4 -4
- package/lib/rules/no-test-return-statement.js +4 -4
- package/lib/rules/no-truthy-falsy.js +31 -19
- package/lib/rules/no-try-expect.js +5 -5
- package/lib/rules/prefer-called-with.js +23 -11
- package/lib/rules/prefer-expect-assertions.js +45 -34
- package/lib/rules/prefer-inline-snapshots.js +2 -2
- package/lib/rules/prefer-spy-on.js +4 -4
- package/lib/rules/prefer-strict-equal.js +10 -12
- package/lib/rules/prefer-to-be-null.js +34 -16
- package/lib/rules/prefer-to-be-undefined.js +34 -16
- package/lib/rules/prefer-to-contain.js +112 -51
- package/lib/rules/prefer-to-have-length.js +47 -14
- package/lib/rules/prefer-todo.js +13 -17
- package/lib/rules/require-top-level-describe.js +66 -0
- package/lib/rules/require-tothrow-message.js +20 -15
- package/lib/rules/utils.js +486 -0
- package/lib/rules/valid-describe.js +36 -44
- package/lib/rules/valid-expect-in-promise.js +71 -66
- package/lib/rules/valid-expect.js +140 -173
- package/package.json +6 -5
- package/lib/rules/tsUtils.js +0 -250
- package/lib/rules/util.js +0 -100
package/lib/rules/tsUtils.js
DELETED
|
@@ -1,250 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.getNodeName = getNodeName;
|
|
7
|
-
exports.scopeHasLocalReference = exports.getStringValue = exports.hasExpressions = exports.isStringNode = exports.isTemplateLiteral = exports.isStringLiteral = exports.isLiteralNode = exports.isDescribe = exports.isTestCase = exports.isHook = exports.isFunction = exports.TestCaseProperty = exports.DescribeProperty = exports.HookName = exports.TestCaseName = exports.DescribeAlias = exports.isExpectCallWithParent = exports.isExpectCall = exports.createRule = void 0;
|
|
8
|
-
|
|
9
|
-
var _path = require("path");
|
|
10
|
-
|
|
11
|
-
var _experimentalUtils = require("@typescript-eslint/experimental-utils");
|
|
12
|
-
|
|
13
|
-
var _package = require("../../package.json");
|
|
14
|
-
|
|
15
|
-
// TODO: rename to utils.ts when TS migration is complete
|
|
16
|
-
const REPO_URL = 'https://github.com/jest-community/eslint-plugin-jest';
|
|
17
|
-
|
|
18
|
-
const createRule = _experimentalUtils.ESLintUtils.RuleCreator(name => {
|
|
19
|
-
const ruleName = (0, _path.basename)(name, '.ts');
|
|
20
|
-
return `${REPO_URL}/blob/v${_package.version}/docs/rules/${ruleName}.md`;
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
exports.createRule = createRule;
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Checks if the given `node` is considered a {@link JestExpectIdentifier}.
|
|
27
|
-
*
|
|
28
|
-
* A `node` is considered to be as such if it is of type `Identifier`,
|
|
29
|
-
* and `name`d `"expect"`.
|
|
30
|
-
*
|
|
31
|
-
* @param {Node} node
|
|
32
|
-
*
|
|
33
|
-
* @return {node is JestExpectIdentifier}
|
|
34
|
-
*/
|
|
35
|
-
const isExpectIdentifier = node => node.type === _experimentalUtils.AST_NODE_TYPES.Identifier && node.name === 'expect'; // represents "expect()" specifically
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Checks if the given `node` is a {@link JestExpectCallExpression}.
|
|
40
|
-
*
|
|
41
|
-
* @param {Node} node
|
|
42
|
-
*
|
|
43
|
-
* @return {node is JestExpectCallExpression}
|
|
44
|
-
*/
|
|
45
|
-
const isExpectCall = node => node.type === _experimentalUtils.AST_NODE_TYPES.CallExpression && isExpectIdentifier(node.callee);
|
|
46
|
-
|
|
47
|
-
exports.isExpectCall = isExpectCall;
|
|
48
|
-
|
|
49
|
-
const isExpectCallWithParent = node => isExpectCall(node) && node.parent !== undefined && node.parent.type === _experimentalUtils.AST_NODE_TYPES.MemberExpression && node.parent.property.type === _experimentalUtils.AST_NODE_TYPES.Identifier;
|
|
50
|
-
|
|
51
|
-
exports.isExpectCallWithParent = isExpectCallWithParent;
|
|
52
|
-
let DescribeAlias;
|
|
53
|
-
exports.DescribeAlias = DescribeAlias;
|
|
54
|
-
|
|
55
|
-
(function (DescribeAlias) {
|
|
56
|
-
DescribeAlias["describe"] = "describe";
|
|
57
|
-
DescribeAlias["fdescribe"] = "fdescribe";
|
|
58
|
-
DescribeAlias["xdescribe"] = "xdescribe";
|
|
59
|
-
})(DescribeAlias || (exports.DescribeAlias = DescribeAlias = {}));
|
|
60
|
-
|
|
61
|
-
let TestCaseName;
|
|
62
|
-
exports.TestCaseName = TestCaseName;
|
|
63
|
-
|
|
64
|
-
(function (TestCaseName) {
|
|
65
|
-
TestCaseName["fit"] = "fit";
|
|
66
|
-
TestCaseName["it"] = "it";
|
|
67
|
-
TestCaseName["test"] = "test";
|
|
68
|
-
TestCaseName["xit"] = "xit";
|
|
69
|
-
TestCaseName["xtest"] = "xtest";
|
|
70
|
-
})(TestCaseName || (exports.TestCaseName = TestCaseName = {}));
|
|
71
|
-
|
|
72
|
-
let HookName;
|
|
73
|
-
exports.HookName = HookName;
|
|
74
|
-
|
|
75
|
-
(function (HookName) {
|
|
76
|
-
HookName["beforeAll"] = "beforeAll";
|
|
77
|
-
HookName["beforeEach"] = "beforeEach";
|
|
78
|
-
HookName["afterAll"] = "afterAll";
|
|
79
|
-
HookName["afterEach"] = "afterEach";
|
|
80
|
-
})(HookName || (exports.HookName = HookName = {}));
|
|
81
|
-
|
|
82
|
-
let DescribeProperty;
|
|
83
|
-
exports.DescribeProperty = DescribeProperty;
|
|
84
|
-
|
|
85
|
-
(function (DescribeProperty) {
|
|
86
|
-
DescribeProperty["each"] = "each";
|
|
87
|
-
DescribeProperty["only"] = "only";
|
|
88
|
-
DescribeProperty["skip"] = "skip";
|
|
89
|
-
})(DescribeProperty || (exports.DescribeProperty = DescribeProperty = {}));
|
|
90
|
-
|
|
91
|
-
let TestCaseProperty;
|
|
92
|
-
exports.TestCaseProperty = TestCaseProperty;
|
|
93
|
-
|
|
94
|
-
(function (TestCaseProperty) {
|
|
95
|
-
TestCaseProperty["each"] = "each";
|
|
96
|
-
TestCaseProperty["only"] = "only";
|
|
97
|
-
TestCaseProperty["skip"] = "skip";
|
|
98
|
-
TestCaseProperty["todo"] = "todo";
|
|
99
|
-
})(TestCaseProperty || (exports.TestCaseProperty = TestCaseProperty = {}));
|
|
100
|
-
|
|
101
|
-
function getNodeName(node) {
|
|
102
|
-
function joinNames(a, b) {
|
|
103
|
-
return a && b ? `${a}.${b}` : null;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
switch (node.type) {
|
|
107
|
-
case _experimentalUtils.AST_NODE_TYPES.Identifier:
|
|
108
|
-
return node.name;
|
|
109
|
-
|
|
110
|
-
case _experimentalUtils.AST_NODE_TYPES.Literal:
|
|
111
|
-
return `${node.value}`;
|
|
112
|
-
|
|
113
|
-
case _experimentalUtils.AST_NODE_TYPES.TemplateLiteral:
|
|
114
|
-
if (node.expressions.length === 0) return node.quasis[0].value.cooked;
|
|
115
|
-
break;
|
|
116
|
-
|
|
117
|
-
case _experimentalUtils.AST_NODE_TYPES.MemberExpression:
|
|
118
|
-
return joinNames(getNodeName(node.object), getNodeName(node.property));
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
return null;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
const isFunction = node => node.type === _experimentalUtils.AST_NODE_TYPES.FunctionExpression || node.type === _experimentalUtils.AST_NODE_TYPES.ArrowFunctionExpression;
|
|
125
|
-
|
|
126
|
-
exports.isFunction = isFunction;
|
|
127
|
-
|
|
128
|
-
const isHook = node => {
|
|
129
|
-
return node.callee.type === _experimentalUtils.AST_NODE_TYPES.Identifier && HookName.hasOwnProperty(node.callee.name);
|
|
130
|
-
};
|
|
131
|
-
|
|
132
|
-
exports.isHook = isHook;
|
|
133
|
-
|
|
134
|
-
const isTestCase = node => {
|
|
135
|
-
return node.callee.type === _experimentalUtils.AST_NODE_TYPES.Identifier && TestCaseName.hasOwnProperty(node.callee.name) || node.callee.type === _experimentalUtils.AST_NODE_TYPES.MemberExpression && node.callee.object.type === _experimentalUtils.AST_NODE_TYPES.Identifier && TestCaseName.hasOwnProperty(node.callee.object.name) && node.callee.property.type === _experimentalUtils.AST_NODE_TYPES.Identifier && TestCaseProperty.hasOwnProperty(node.callee.property.name);
|
|
136
|
-
};
|
|
137
|
-
|
|
138
|
-
exports.isTestCase = isTestCase;
|
|
139
|
-
|
|
140
|
-
const isDescribe = node => {
|
|
141
|
-
return node.callee.type === _experimentalUtils.AST_NODE_TYPES.Identifier && DescribeAlias.hasOwnProperty(node.callee.name) || node.callee.type === _experimentalUtils.AST_NODE_TYPES.MemberExpression && node.callee.object.type === _experimentalUtils.AST_NODE_TYPES.Identifier && DescribeAlias.hasOwnProperty(node.callee.object.name) && node.callee.property.type === _experimentalUtils.AST_NODE_TYPES.Identifier && DescribeProperty.hasOwnProperty(node.callee.property.name);
|
|
142
|
-
};
|
|
143
|
-
|
|
144
|
-
exports.isDescribe = isDescribe;
|
|
145
|
-
|
|
146
|
-
const isLiteralNode = node => node.type === _experimentalUtils.AST_NODE_TYPES.Literal;
|
|
147
|
-
|
|
148
|
-
exports.isLiteralNode = isLiteralNode;
|
|
149
|
-
|
|
150
|
-
const isStringLiteral = node => node.type === _experimentalUtils.AST_NODE_TYPES.Literal && typeof node.value === 'string';
|
|
151
|
-
|
|
152
|
-
exports.isStringLiteral = isStringLiteral;
|
|
153
|
-
|
|
154
|
-
const isTemplateLiteral = node => node && node.type === _experimentalUtils.AST_NODE_TYPES.TemplateLiteral;
|
|
155
|
-
|
|
156
|
-
exports.isTemplateLiteral = isTemplateLiteral;
|
|
157
|
-
|
|
158
|
-
const isStringNode = node => node !== undefined && (isStringLiteral(node) || isTemplateLiteral(node));
|
|
159
|
-
|
|
160
|
-
exports.isStringNode = isStringNode;
|
|
161
|
-
|
|
162
|
-
const hasExpressions = node => 'expressions' in node && node.expressions.length > 0;
|
|
163
|
-
/* istanbul ignore next we'll need this later */
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
exports.hasExpressions = hasExpressions;
|
|
167
|
-
|
|
168
|
-
const getStringValue = arg => isTemplateLiteral(arg) ? arg.quasis[0].value.raw : arg.value;
|
|
169
|
-
|
|
170
|
-
exports.getStringValue = getStringValue;
|
|
171
|
-
|
|
172
|
-
const collectReferences = scope => {
|
|
173
|
-
const locals = new Set();
|
|
174
|
-
const unresolved = new Set();
|
|
175
|
-
let currentScope = scope;
|
|
176
|
-
|
|
177
|
-
while (currentScope !== null) {
|
|
178
|
-
var _iteratorNormalCompletion = true;
|
|
179
|
-
var _didIteratorError = false;
|
|
180
|
-
var _iteratorError = undefined;
|
|
181
|
-
|
|
182
|
-
try {
|
|
183
|
-
for (var _iterator = currentScope.variables[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
|
|
184
|
-
const ref = _step.value;
|
|
185
|
-
const isReferenceDefined = ref.defs.some(def => {
|
|
186
|
-
return def.type !== 'ImplicitGlobalVariable';
|
|
187
|
-
});
|
|
188
|
-
|
|
189
|
-
if (isReferenceDefined) {
|
|
190
|
-
locals.add(ref.name);
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
} catch (err) {
|
|
194
|
-
_didIteratorError = true;
|
|
195
|
-
_iteratorError = err;
|
|
196
|
-
} finally {
|
|
197
|
-
try {
|
|
198
|
-
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
199
|
-
_iterator.return();
|
|
200
|
-
}
|
|
201
|
-
} finally {
|
|
202
|
-
if (_didIteratorError) {
|
|
203
|
-
throw _iteratorError;
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
var _iteratorNormalCompletion2 = true;
|
|
209
|
-
var _didIteratorError2 = false;
|
|
210
|
-
var _iteratorError2 = undefined;
|
|
211
|
-
|
|
212
|
-
try {
|
|
213
|
-
for (var _iterator2 = currentScope.through[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
|
|
214
|
-
const ref = _step2.value;
|
|
215
|
-
unresolved.add(ref.identifier.name);
|
|
216
|
-
}
|
|
217
|
-
} catch (err) {
|
|
218
|
-
_didIteratorError2 = true;
|
|
219
|
-
_iteratorError2 = err;
|
|
220
|
-
} finally {
|
|
221
|
-
try {
|
|
222
|
-
if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
|
|
223
|
-
_iterator2.return();
|
|
224
|
-
}
|
|
225
|
-
} finally {
|
|
226
|
-
if (_didIteratorError2) {
|
|
227
|
-
throw _iteratorError2;
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
currentScope = currentScope.upper;
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
return {
|
|
236
|
-
locals,
|
|
237
|
-
unresolved
|
|
238
|
-
};
|
|
239
|
-
};
|
|
240
|
-
|
|
241
|
-
const scopeHasLocalReference = (scope, referenceName) => {
|
|
242
|
-
const references = collectReferences(scope);
|
|
243
|
-
return (// referenceName was found as a local variable or function declaration.
|
|
244
|
-
references.locals.has(referenceName) || // referenceName was not found as an unresolved reference,
|
|
245
|
-
// meaning it is likely not an implicit global reference.
|
|
246
|
-
!references.unresolved.has(referenceName)
|
|
247
|
-
);
|
|
248
|
-
};
|
|
249
|
-
|
|
250
|
-
exports.scopeHasLocalReference = scopeHasLocalReference;
|
package/lib/rules/util.js
DELETED
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.getDocsUrl = exports.getStringValue = exports.isFunction = exports.argument2 = exports.argument = exports.method2 = exports.method = exports.expectNotToEqualCase = exports.expectToEqualCase = exports.expectNotToBeCase = exports.expectToBeCase = exports.expectNotRejectsCase = exports.expectRejectsCase = exports.expectNotResolvesCase = exports.expectResolvesCase = exports.expectNotCase = exports.expectCaseWithParent = exports.expectCase = void 0;
|
|
7
|
-
|
|
8
|
-
var _path = require("path");
|
|
9
|
-
|
|
10
|
-
var _package = require("../../package.json");
|
|
11
|
-
|
|
12
|
-
const REPO_URL = 'https://github.com/jest-community/eslint-plugin-jest';
|
|
13
|
-
|
|
14
|
-
const expectCase = node => node && node.callee && node.callee.name === 'expect';
|
|
15
|
-
|
|
16
|
-
exports.expectCase = expectCase;
|
|
17
|
-
|
|
18
|
-
const expectCaseWithParent = node => expectCase(node) && node.parent && node.parent.type === 'MemberExpression' && node.parent.parent;
|
|
19
|
-
|
|
20
|
-
exports.expectCaseWithParent = expectCaseWithParent;
|
|
21
|
-
|
|
22
|
-
const expectNotCase = node => expectCase(node) && node.parent.parent.type === 'MemberExpression' && methodName(node) === 'not';
|
|
23
|
-
|
|
24
|
-
exports.expectNotCase = expectNotCase;
|
|
25
|
-
|
|
26
|
-
const expectResolvesCase = node => expectCase(node) && node.parent.parent.type === 'MemberExpression' && methodName(node) === 'resolves';
|
|
27
|
-
|
|
28
|
-
exports.expectResolvesCase = expectResolvesCase;
|
|
29
|
-
|
|
30
|
-
const expectNotResolvesCase = node => expectNotCase(node) && node.parent.parent.type === 'MemberExpression' && methodName(node.parent) === 'resolves';
|
|
31
|
-
|
|
32
|
-
exports.expectNotResolvesCase = expectNotResolvesCase;
|
|
33
|
-
|
|
34
|
-
const expectRejectsCase = node => expectCase(node) && node.parent.parent.type === 'MemberExpression' && methodName(node) === 'rejects';
|
|
35
|
-
|
|
36
|
-
exports.expectRejectsCase = expectRejectsCase;
|
|
37
|
-
|
|
38
|
-
const expectNotRejectsCase = node => expectNotCase(node) && node.parent.parent.type === 'MemberExpression' && methodName(node.parent) === 'rejects';
|
|
39
|
-
|
|
40
|
-
exports.expectNotRejectsCase = expectNotRejectsCase;
|
|
41
|
-
|
|
42
|
-
const expectToBeCase = (node, arg) => !(expectNotCase(node) || expectResolvesCase(node) || expectRejectsCase(node)) && expectCase(node) && methodName(node) === 'toBe' && argument(node) && (argument(node).type === 'Literal' && argument(node).value === null && arg === null || argument(node).name === 'undefined' && arg === undefined);
|
|
43
|
-
|
|
44
|
-
exports.expectToBeCase = expectToBeCase;
|
|
45
|
-
|
|
46
|
-
const expectNotToBeCase = (node, arg) => expectNotCase(node) && methodName2(node) === 'toBe' && argument2(node) && (argument2(node).type === 'Literal' && argument2(node).value === null && arg === null || argument2(node).name === 'undefined' && arg === undefined);
|
|
47
|
-
|
|
48
|
-
exports.expectNotToBeCase = expectNotToBeCase;
|
|
49
|
-
|
|
50
|
-
const expectToEqualCase = (node, arg) => !(expectNotCase(node) || expectResolvesCase(node) || expectRejectsCase(node)) && expectCase(node) && methodName(node) === 'toEqual' && argument(node) && (argument(node).type === 'Literal' && argument(node).value === null && arg === null || argument(node).name === 'undefined' && arg === undefined);
|
|
51
|
-
|
|
52
|
-
exports.expectToEqualCase = expectToEqualCase;
|
|
53
|
-
|
|
54
|
-
const expectNotToEqualCase = (node, arg) => expectNotCase(node) && methodName2(node) === 'toEqual' && argument2(node) && (argument2(node).type === 'Literal' && argument2(node).value === null && arg === null || argument2(node).name === 'undefined' && arg === undefined);
|
|
55
|
-
|
|
56
|
-
exports.expectNotToEqualCase = expectNotToEqualCase;
|
|
57
|
-
|
|
58
|
-
const method = node => node.parent.property;
|
|
59
|
-
|
|
60
|
-
exports.method = method;
|
|
61
|
-
|
|
62
|
-
const method2 = node => node.parent.parent.property;
|
|
63
|
-
|
|
64
|
-
exports.method2 = method2;
|
|
65
|
-
|
|
66
|
-
const methodName = node => method(node) && method(node).name;
|
|
67
|
-
|
|
68
|
-
const methodName2 = node => method2(node) && method2(node).name;
|
|
69
|
-
|
|
70
|
-
const argument = node => node.parent.parent.arguments && node.parent.parent.arguments[0];
|
|
71
|
-
|
|
72
|
-
exports.argument = argument;
|
|
73
|
-
|
|
74
|
-
const argument2 = node => node.parent.parent.parent.arguments && node.parent.parent.parent.arguments[0];
|
|
75
|
-
|
|
76
|
-
exports.argument2 = argument2;
|
|
77
|
-
|
|
78
|
-
const isFunction = node => node && (node.type === 'FunctionExpression' || node.type === 'ArrowFunctionExpression');
|
|
79
|
-
|
|
80
|
-
exports.isFunction = isFunction;
|
|
81
|
-
|
|
82
|
-
const getStringValue = arg => arg.quasis[0].value.raw;
|
|
83
|
-
/**
|
|
84
|
-
* Generates the URL to documentation for the given rule name. It uses the
|
|
85
|
-
* package version to build the link to a tagged version of the
|
|
86
|
-
* documentation file.
|
|
87
|
-
*
|
|
88
|
-
* @param {string} filename - Name of the eslint rule
|
|
89
|
-
* @returns {string} URL to the documentation for the given rule
|
|
90
|
-
*/
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
exports.getStringValue = getStringValue;
|
|
94
|
-
|
|
95
|
-
const getDocsUrl = filename => {
|
|
96
|
-
const ruleName = (0, _path.basename)(filename, '.js');
|
|
97
|
-
return `${REPO_URL}/blob/v${_package.version}/docs/rules/${ruleName}.md`;
|
|
98
|
-
};
|
|
99
|
-
|
|
100
|
-
exports.getDocsUrl = getDocsUrl;
|