@checkdigit/eslint-plugin 4.0.0-beta.1 → 4.1.0-PR.32-b8ce
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/LICENSE.txt +1 -1
- package/README.md +6 -9
- package/SECURITY.md +14 -0
- package/dist/file-path-comment.d.ts +1 -0
- package/dist/file-path-comment.d.ts.map +1 -0
- package/dist/file-path-comment.js +1 -1
- package/dist/file-path-comment.js.map +1 -1
- package/dist/file-path-comment.spec.d.ts +1 -0
- package/dist/file-path-comment.spec.d.ts.map +1 -0
- package/dist/file-path-comment.spec.js +1 -1
- package/dist/file-path-comment.spec.js.map +1 -1
- package/dist/index.d.ts +4 -3
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -5
- package/dist/index.js.map +1 -1
- package/dist/no-card-numbers.d.ts +1 -0
- package/dist/no-card-numbers.d.ts.map +1 -0
- package/dist/no-card-numbers.js +10 -3
- package/dist/no-card-numbers.js.map +1 -1
- package/dist/no-card-numbers.spec.d.ts +1 -0
- package/dist/no-card-numbers.spec.d.ts.map +1 -0
- package/dist/no-card-numbers.spec.js +31 -1
- package/dist/no-card-numbers.spec.js.map +1 -1
- package/dist/{pure-functions.d.ts → no-uuid.d.ts} +1 -0
- package/dist/no-uuid.d.ts.map +1 -0
- package/dist/no-uuid.js +102 -0
- package/dist/no-uuid.js.map +1 -0
- package/dist/no-uuid.spec.d.ts +2 -0
- package/dist/no-uuid.spec.d.ts.map +1 -0
- package/dist/no-uuid.spec.js +78 -0
- package/dist/no-uuid.spec.js.map +1 -0
- package/package.json +1 -67
- package/src/file-path-comment.ts +1 -1
- package/src/index.ts +5 -5
- package/src/no-card-numbers.ts +14 -4
- package/src/no-uuid.ts +109 -0
- package/.eslintrc +0 -76
- package/coverage/clover.xml +0 -94
- package/coverage/coverage-final.json +0 -4
- package/coverage/lcov-report/base.css +0 -224
- package/coverage/lcov-report/block-navigation.js +0 -87
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/file-path-comment.ts.html +0 -349
- package/coverage/lcov-report/index.html +0 -146
- package/coverage/lcov-report/no-card-numbers.ts.html +0 -508
- package/coverage/lcov-report/prettify.css +0 -1
- package/coverage/lcov-report/prettify.js +0 -2
- package/coverage/lcov-report/pure-functions.ts.html +0 -301
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +0 -196
- package/coverage/lcov.info +0 -176
- package/dist/pure-functions.js +0 -55
- package/dist/pure-functions.js.map +0 -1
- package/dist/pure-functions.spec.d.ts +0 -1
- package/dist/pure-functions.spec.js +0 -90
- package/dist/pure-functions.spec.js.map +0 -1
- package/src/file-path-comment.spec.ts +0 -71
- package/src/no-card-numbers.spec.ts +0 -114
- package/src/pure-functions.spec.ts +0 -93
- package/src/pure-functions.ts +0 -72
- package/tsconfig.json +0 -12
package/coverage/lcov.info
DELETED
|
@@ -1,176 +0,0 @@
|
|
|
1
|
-
TN:
|
|
2
|
-
SF:src/file-path-comment.ts
|
|
3
|
-
FN:20,(anonymous_0)
|
|
4
|
-
FN:42,(anonymous_1)
|
|
5
|
-
FN:59,(anonymous_2)
|
|
6
|
-
FN:79,(anonymous_3)
|
|
7
|
-
FNF:4
|
|
8
|
-
FNH:4
|
|
9
|
-
FNDA:14,(anonymous_0)
|
|
10
|
-
FNDA:1,(anonymous_1)
|
|
11
|
-
FNDA:2,(anonymous_2)
|
|
12
|
-
FNDA:2,(anonymous_3)
|
|
13
|
-
DA:11,1
|
|
14
|
-
DA:21,14
|
|
15
|
-
DA:22,14
|
|
16
|
-
DA:24,14
|
|
17
|
-
DA:25,2
|
|
18
|
-
DA:28,12
|
|
19
|
-
DA:29,3
|
|
20
|
-
DA:30,1
|
|
21
|
-
DA:43,1
|
|
22
|
-
DA:47,2
|
|
23
|
-
DA:60,2
|
|
24
|
-
DA:65,9
|
|
25
|
-
DA:66,9
|
|
26
|
-
DA:67,2
|
|
27
|
-
DA:80,2
|
|
28
|
-
DA:86,12
|
|
29
|
-
LF:16
|
|
30
|
-
LH:16
|
|
31
|
-
BRDA:24,0,0,2
|
|
32
|
-
BRDA:28,1,0,3
|
|
33
|
-
BRDA:28,1,1,9
|
|
34
|
-
BRDA:29,2,0,1
|
|
35
|
-
BRDA:29,2,1,2
|
|
36
|
-
BRDA:66,3,0,2
|
|
37
|
-
BRF:6
|
|
38
|
-
BRH:6
|
|
39
|
-
end_of_record
|
|
40
|
-
TN:
|
|
41
|
-
SF:src/no-card-numbers.ts
|
|
42
|
-
FN:25,luhnCheck
|
|
43
|
-
FN:30,(anonymous_1)
|
|
44
|
-
FN:31,(anonymous_2)
|
|
45
|
-
FN:47,checkForCardNumbers
|
|
46
|
-
FN:52,(anonymous_4)
|
|
47
|
-
FN:110,(anonymous_5)
|
|
48
|
-
FN:114,(anonymous_6)
|
|
49
|
-
FN:120,(anonymous_7)
|
|
50
|
-
FN:130,(anonymous_8)
|
|
51
|
-
FNF:9
|
|
52
|
-
FNH:9
|
|
53
|
-
FNDA:18,luhnCheck
|
|
54
|
-
FNDA:297,(anonymous_1)
|
|
55
|
-
FNDA:297,(anonymous_2)
|
|
56
|
-
FNDA:28,checkForCardNumbers
|
|
57
|
-
FNDA:18,(anonymous_4)
|
|
58
|
-
FNDA:9,(anonymous_5)
|
|
59
|
-
FNDA:10,(anonymous_6)
|
|
60
|
-
FNDA:16,(anonymous_7)
|
|
61
|
-
FNDA:2,(anonymous_8)
|
|
62
|
-
DA:12,1
|
|
63
|
-
DA:13,1
|
|
64
|
-
DA:14,1
|
|
65
|
-
DA:15,1
|
|
66
|
-
DA:26,18
|
|
67
|
-
DA:30,297
|
|
68
|
-
DA:32,297
|
|
69
|
-
DA:33,297
|
|
70
|
-
DA:34,145
|
|
71
|
-
DA:36,145
|
|
72
|
-
DA:37,22
|
|
73
|
-
DA:40,297
|
|
74
|
-
DA:48,28
|
|
75
|
-
DA:49,28
|
|
76
|
-
DA:50,12
|
|
77
|
-
DA:52,18
|
|
78
|
-
DA:53,16
|
|
79
|
-
DA:54,2
|
|
80
|
-
DA:55,1
|
|
81
|
-
DA:62,1
|
|
82
|
-
DA:63,1
|
|
83
|
-
DA:74,14
|
|
84
|
-
DA:75,2
|
|
85
|
-
DA:76,1
|
|
86
|
-
DA:83,1
|
|
87
|
-
DA:84,1
|
|
88
|
-
DA:98,1
|
|
89
|
-
DA:111,9
|
|
90
|
-
DA:112,9
|
|
91
|
-
DA:114,9
|
|
92
|
-
DA:115,10
|
|
93
|
-
DA:116,10
|
|
94
|
-
DA:119,9
|
|
95
|
-
DA:121,16
|
|
96
|
-
DA:122,0
|
|
97
|
-
DA:124,16
|
|
98
|
-
DA:125,0
|
|
99
|
-
DA:127,16
|
|
100
|
-
DA:128,16
|
|
101
|
-
DA:131,2
|
|
102
|
-
DA:132,0
|
|
103
|
-
DA:134,2
|
|
104
|
-
DA:135,0
|
|
105
|
-
DA:137,2
|
|
106
|
-
LF:44
|
|
107
|
-
LH:40
|
|
108
|
-
BRDA:33,0,0,145
|
|
109
|
-
BRDA:36,1,0,22
|
|
110
|
-
BRDA:49,2,0,12
|
|
111
|
-
BRDA:52,3,0,18
|
|
112
|
-
BRDA:52,3,1,13
|
|
113
|
-
BRDA:53,4,0,2
|
|
114
|
-
BRDA:53,4,1,14
|
|
115
|
-
BRDA:54,5,0,1
|
|
116
|
-
BRDA:54,5,1,1
|
|
117
|
-
BRDA:62,6,0,1
|
|
118
|
-
BRDA:74,7,0,2
|
|
119
|
-
BRDA:75,8,0,1
|
|
120
|
-
BRDA:75,8,1,1
|
|
121
|
-
BRDA:83,9,0,1
|
|
122
|
-
BRDA:115,10,0,10
|
|
123
|
-
BRDA:115,11,0,10
|
|
124
|
-
BRDA:115,11,1,10
|
|
125
|
-
BRDA:121,12,0,0
|
|
126
|
-
BRDA:124,13,0,0
|
|
127
|
-
BRDA:124,14,0,16
|
|
128
|
-
BRDA:124,14,1,12
|
|
129
|
-
BRDA:131,15,0,0
|
|
130
|
-
BRDA:134,16,0,0
|
|
131
|
-
BRF:23
|
|
132
|
-
BRH:19
|
|
133
|
-
end_of_record
|
|
134
|
-
TN:
|
|
135
|
-
SF:src/pure-functions.ts
|
|
136
|
-
FN:25,(anonymous_0)
|
|
137
|
-
FN:29,check
|
|
138
|
-
FN:44,(anonymous_2)
|
|
139
|
-
FNF:3
|
|
140
|
-
FNH:3
|
|
141
|
-
FNDA:3,(anonymous_0)
|
|
142
|
-
FNDA:5,check
|
|
143
|
-
FNDA:12,(anonymous_2)
|
|
144
|
-
DA:12,1
|
|
145
|
-
DA:14,1
|
|
146
|
-
DA:26,3
|
|
147
|
-
DA:27,3
|
|
148
|
-
DA:30,5
|
|
149
|
-
DA:31,5
|
|
150
|
-
DA:32,5
|
|
151
|
-
DA:33,0
|
|
152
|
-
DA:36,5
|
|
153
|
-
DA:38,5
|
|
154
|
-
DA:39,6
|
|
155
|
-
DA:40,6
|
|
156
|
-
DA:41,12
|
|
157
|
-
DA:42,12
|
|
158
|
-
DA:45,12
|
|
159
|
-
DA:46,12
|
|
160
|
-
DA:47,12
|
|
161
|
-
DA:56,2
|
|
162
|
-
DA:66,3
|
|
163
|
-
LF:19
|
|
164
|
-
LH:18
|
|
165
|
-
BRDA:32,0,0,0
|
|
166
|
-
BRDA:42,1,0,2
|
|
167
|
-
BRDA:43,2,0,12
|
|
168
|
-
BRDA:43,2,1,12
|
|
169
|
-
BRDA:48,3,0,12
|
|
170
|
-
BRDA:48,3,1,9
|
|
171
|
-
BRDA:48,3,2,3
|
|
172
|
-
BRDA:50,4,0,3
|
|
173
|
-
BRDA:50,4,1,1
|
|
174
|
-
BRF:9
|
|
175
|
-
BRH:8
|
|
176
|
-
end_of_record
|
package/dist/pure-functions.js
DELETED
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
// pure-functions.ts
|
|
3
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
const INVALID_CLOSURE = 'INVALID_CLOSURE';
|
|
5
|
-
exports.default = {
|
|
6
|
-
meta: {
|
|
7
|
-
type: 'problem',
|
|
8
|
-
docs: {
|
|
9
|
-
description: 'disallow closures of anything other than const primitive values',
|
|
10
|
-
url: 'https://github.com/checkdigit/eslint-plugin',
|
|
11
|
-
},
|
|
12
|
-
messages: {
|
|
13
|
-
[INVALID_CLOSURE]: 'invalid closure over {{ name }}',
|
|
14
|
-
},
|
|
15
|
-
},
|
|
16
|
-
create(context) {
|
|
17
|
-
const sourceCode = context.getSourceCode();
|
|
18
|
-
const manager = sourceCode.scopeManager;
|
|
19
|
-
function check(node) {
|
|
20
|
-
const functionScope = manager.acquire(node);
|
|
21
|
-
const functionRange = node.range;
|
|
22
|
-
if (functionRange === undefined) {
|
|
23
|
-
return;
|
|
24
|
-
}
|
|
25
|
-
const queue = [functionScope];
|
|
26
|
-
let scope;
|
|
27
|
-
while ((scope = queue.pop())) {
|
|
28
|
-
queue.push(...scope.childScopes);
|
|
29
|
-
for (const reference of scope.references) {
|
|
30
|
-
const variable = reference.resolved;
|
|
31
|
-
if (variable !== null &&
|
|
32
|
-
variable.defs.every((definition) => {
|
|
33
|
-
const definitionNode = definition.node;
|
|
34
|
-
const definitionRange = definitionNode.range;
|
|
35
|
-
return ((functionRange[0] > definitionRange[0] || definitionRange[1] < functionRange[0]) &&
|
|
36
|
-
!(definition.kind === 'const' &&
|
|
37
|
-
definitionNode.init?.type === 'Literal'));
|
|
38
|
-
})) {
|
|
39
|
-
context.report({
|
|
40
|
-
node: reference.identifier,
|
|
41
|
-
messageId: INVALID_CLOSURE,
|
|
42
|
-
data: { name: variable.name },
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
return {
|
|
49
|
-
ArrowFunctionExpression: check,
|
|
50
|
-
FunctionDeclaration: check,
|
|
51
|
-
FunctionExpression: check,
|
|
52
|
-
};
|
|
53
|
-
},
|
|
54
|
-
};
|
|
55
|
-
//# sourceMappingURL=pure-functions.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pure-functions.js","sourceRoot":"","sources":["../src/pure-functions.ts"],"names":[],"mappings":";AAAA,oBAAoB;;AAWpB,MAAM,eAAe,GAAG,iBAAiB,CAAC;AAE1C,kBAAe;IACb,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EAAE,iEAAiE;YAC9E,GAAG,EAAE,6CAA6C;SACnD;QACD,QAAQ,EAAE;YACR,CAAC,eAAe,CAAC,EAAE,iCAAiC;SACrD;KACF;IACD,MAAM,CAAC,OAAyB;QAC9B,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,UAAU,CAAC,YAAY,CAAC;QAExC,SAAS,KAAK,CAAC,IAAiB;YAC9B,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC5C,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC;YACjC,IAAI,aAAa,KAAK,SAAS,EAAE;gBAC/B,OAAO;aACR;YAED,MAAM,KAAK,GAAG,CAAC,aAAa,CAAC,CAAC;YAC9B,IAAI,KAAK,CAAC;YACV,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE;gBAC5B,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC;gBACjC,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,UAAU,EAAE;oBACxC,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC;oBACpC,IACE,QAAQ,KAAK,IAAI;wBACjB,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,EAAE,EAAE;4BACjC,MAAM,cAAc,GAAG,UAAU,CAAC,IAA4D,CAAC;4BAC/F,MAAM,eAAe,GAAG,cAAc,CAAC,KAAK,CAAC;4BAC7C,OAAO,CACL,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,IAAI,eAAe,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;gCAChF,CAAC,CACE,UAA0C,CAAC,IAAI,KAAK,OAAO;oCAC5D,cAAc,CAAC,IAAI,EAAE,IAAI,KAAK,SAAS,CACxC,CACF,CAAC;wBACJ,CAAC,CAAC,EACF;wBACA,OAAO,CAAC,MAAM,CAAC;4BACb,IAAI,EAAE,SAAS,CAAC,UAAU;4BAC1B,SAAS,EAAE,eAAe;4BAC1B,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE;yBAC9B,CAAC,CAAC;qBACJ;iBACF;aACF;QACH,CAAC;QAED,OAAO;YACL,uBAAuB,EAAE,KAAK;YAC9B,mBAAmB,EAAE,KAAK;YAC1B,kBAAkB,EAAE,KAAK;SAC1B,CAAC;IACJ,CAAC;CACiB,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
// pure-functions.spec.ts
|
|
3
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
-
};
|
|
6
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
/*
|
|
8
|
-
* Copyright (c) 2021 Check Digit, LLC
|
|
9
|
-
*
|
|
10
|
-
* This code is licensed under the MIT license (see LICENSE.txt for details).
|
|
11
|
-
*/
|
|
12
|
-
const eslint_1 = require("eslint");
|
|
13
|
-
const pure_functions_1 = __importDefault(require("./pure-functions"));
|
|
14
|
-
const ONLY_PURE_FUNCTIONS = `
|
|
15
|
-
const a = 3;
|
|
16
|
-
let d = 4;
|
|
17
|
-
|
|
18
|
-
function x() {
|
|
19
|
-
const a = 3;
|
|
20
|
-
let d = 4;
|
|
21
|
-
return 3;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
function y() {
|
|
25
|
-
const a = 3;
|
|
26
|
-
let d = 4;
|
|
27
|
-
function z() {
|
|
28
|
-
return 123;
|
|
29
|
-
}
|
|
30
|
-
return z();
|
|
31
|
-
}
|
|
32
|
-
`;
|
|
33
|
-
const RECURSIVE_PURE_FUNCTIONS = `
|
|
34
|
-
function x(y) {
|
|
35
|
-
return x(y + 1);
|
|
36
|
-
}
|
|
37
|
-
x(0);
|
|
38
|
-
`;
|
|
39
|
-
const IMPURE_FUNCTIONS = `
|
|
40
|
-
const a = 3;
|
|
41
|
-
let d = 4;
|
|
42
|
-
var e = 5;
|
|
43
|
-
function b() {
|
|
44
|
-
const c = 2;
|
|
45
|
-
return a + c + d + e;
|
|
46
|
-
}
|
|
47
|
-
`;
|
|
48
|
-
// const IMPURE_FUNCTIONS_OUT_OF_ORDER = `
|
|
49
|
-
// const a = 3;
|
|
50
|
-
// let d = 4;
|
|
51
|
-
// function b() {
|
|
52
|
-
// const c = 2;
|
|
53
|
-
// return a + c + d + e;
|
|
54
|
-
// }
|
|
55
|
-
// var e = 5;
|
|
56
|
-
// `;
|
|
57
|
-
describe('pure-functions', () => {
|
|
58
|
-
const ruleTester = new eslint_1.RuleTester({ parserOptions: { ecmaVersion: 2020 } });
|
|
59
|
-
ruleTester.run('functions', pure_functions_1.default, {
|
|
60
|
-
valid: [
|
|
61
|
-
{
|
|
62
|
-
code: ONLY_PURE_FUNCTIONS,
|
|
63
|
-
parserOptions: {
|
|
64
|
-
project: './tsconfig.json',
|
|
65
|
-
},
|
|
66
|
-
},
|
|
67
|
-
{
|
|
68
|
-
code: RECURSIVE_PURE_FUNCTIONS,
|
|
69
|
-
filename: 'src/hello.ts',
|
|
70
|
-
parserOptions: {
|
|
71
|
-
project: './tsconfig.json',
|
|
72
|
-
},
|
|
73
|
-
},
|
|
74
|
-
],
|
|
75
|
-
invalid: [
|
|
76
|
-
{
|
|
77
|
-
code: IMPURE_FUNCTIONS,
|
|
78
|
-
errors: [
|
|
79
|
-
{
|
|
80
|
-
message: 'invalid closure over d',
|
|
81
|
-
},
|
|
82
|
-
{
|
|
83
|
-
message: 'invalid closure over e',
|
|
84
|
-
},
|
|
85
|
-
],
|
|
86
|
-
},
|
|
87
|
-
],
|
|
88
|
-
});
|
|
89
|
-
});
|
|
90
|
-
//# sourceMappingURL=pure-functions.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pure-functions.spec.js","sourceRoot":"","sources":["../src/pure-functions.spec.ts"],"names":[],"mappings":";AAAA,yBAAyB;;;;;AAEzB;;;;GAIG;AAEH,mCAAoC;AAEpC,sEAAoC;AAEpC,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;CAkB3B,CAAC;AAEF,MAAM,wBAAwB,GAAG;;;;;CAKhC,CAAC;AAEF,MAAM,gBAAgB,GAAG;;;;;;;;CAQxB,CAAC;AAEF,0CAA0C;AAC1C,eAAe;AACf,aAAa;AACb,iBAAiB;AACjB,iBAAiB;AACjB,0BAA0B;AAC1B,IAAI;AACJ,aAAa;AACb,KAAK;AAEL,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,MAAM,UAAU,GAAG,IAAI,mBAAU,CAAC,EAAE,aAAa,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IAE5E,UAAU,CAAC,GAAG,CAAC,WAAW,EAAE,wBAAI,EAAE;QAChC,KAAK,EAAE;YACL;gBACE,IAAI,EAAE,mBAAmB;gBACzB,aAAa,EAAE;oBACb,OAAO,EAAE,iBAAiB;iBAC3B;aACF;YACD;gBACE,IAAI,EAAE,wBAAwB;gBAC9B,QAAQ,EAAE,cAAc;gBACxB,aAAa,EAAE;oBACb,OAAO,EAAE,iBAAiB;iBAC3B;aACF;SACF;QACD,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,gBAAgB;gBACtB,MAAM,EAAE;oBACN;wBACE,OAAO,EAAE,wBAAwB;qBAClC;oBACD;wBACE,OAAO,EAAE,wBAAwB;qBAClC;iBACF;aACF;SACF;KACF,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
// file-path-comment.spec.ts
|
|
2
|
-
|
|
3
|
-
/*
|
|
4
|
-
* Copyright (c) 2021 Check Digit, LLC
|
|
5
|
-
*
|
|
6
|
-
* This code is licensed under the MIT license (see LICENSE.txt for details).
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import { RuleTester } from 'eslint';
|
|
10
|
-
|
|
11
|
-
import rule from './file-path-comment';
|
|
12
|
-
|
|
13
|
-
describe('file-path-comment', () => {
|
|
14
|
-
const ruleTester = new RuleTester({ parserOptions: { ecmaVersion: 2020 } });
|
|
15
|
-
|
|
16
|
-
ruleTester.run('file-path-comment', rule, {
|
|
17
|
-
valid: [
|
|
18
|
-
{
|
|
19
|
-
filename: 'src/world/hello.ts',
|
|
20
|
-
code: `// world/hello.ts`,
|
|
21
|
-
parserOptions: {
|
|
22
|
-
project: './tsconfig.json',
|
|
23
|
-
},
|
|
24
|
-
},
|
|
25
|
-
{
|
|
26
|
-
filename: 'src/hello.ts',
|
|
27
|
-
code: `// hello.ts\n`,
|
|
28
|
-
},
|
|
29
|
-
{
|
|
30
|
-
filename: 'hello.ts',
|
|
31
|
-
code: `// whatever does not matter\n`,
|
|
32
|
-
},
|
|
33
|
-
{
|
|
34
|
-
filename: 'source/hello.ts',
|
|
35
|
-
code: `// whatever does not matter\n`,
|
|
36
|
-
},
|
|
37
|
-
],
|
|
38
|
-
invalid: [
|
|
39
|
-
{
|
|
40
|
-
filename: 'src/hello.ts',
|
|
41
|
-
code: `// not-hello.ts`,
|
|
42
|
-
errors: [{ message: 'first line is a comment but is not a path to the file' }],
|
|
43
|
-
output: `// hello.ts`,
|
|
44
|
-
},
|
|
45
|
-
{
|
|
46
|
-
filename: 'src/hello.ts',
|
|
47
|
-
code: `//hello.ts\n`,
|
|
48
|
-
errors: [{ message: 'first line is a comment but is not a path to the file' }],
|
|
49
|
-
output: `// hello.ts\n`,
|
|
50
|
-
},
|
|
51
|
-
{
|
|
52
|
-
filename: 'src/hello.ts',
|
|
53
|
-
code: `/* not-hello.ts */`,
|
|
54
|
-
errors: [{ message: 'first line cannot be a block comment' }],
|
|
55
|
-
output: `// hello.ts\n\n/* not-hello.ts */`,
|
|
56
|
-
},
|
|
57
|
-
{
|
|
58
|
-
filename: 'src/hello.ts',
|
|
59
|
-
code: `const x = 123;`,
|
|
60
|
-
errors: [{ message: 'first line is not a comment with the file path' }],
|
|
61
|
-
output: `// hello.ts\n\nconst x = 123;`,
|
|
62
|
-
},
|
|
63
|
-
{
|
|
64
|
-
filename: 'src/hello.ts',
|
|
65
|
-
code: ``,
|
|
66
|
-
errors: [{ message: 'first line is not a comment with the file path' }],
|
|
67
|
-
output: `// hello.ts\n\n`,
|
|
68
|
-
},
|
|
69
|
-
],
|
|
70
|
-
});
|
|
71
|
-
});
|
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
// no-card-numbers.spec.ts
|
|
2
|
-
|
|
3
|
-
/*
|
|
4
|
-
* Copyright (c) 2021 Check Digit, LLC
|
|
5
|
-
*
|
|
6
|
-
* This code is licensed under the MIT license (see LICENSE.txt for details).
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import { RuleTester } from 'eslint';
|
|
10
|
-
|
|
11
|
-
import rule from './no-card-numbers';
|
|
12
|
-
|
|
13
|
-
const CARD_NUMBER_FOUND = 'CARD_NUMBER_FOUND';
|
|
14
|
-
const CARD_NUMBERS_FOUND = 'CARD_NUMBERS_FOUND';
|
|
15
|
-
|
|
16
|
-
const CARD_NUMBER_FOUND_MSG = {
|
|
17
|
-
messageId: CARD_NUMBER_FOUND,
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
const CARD_NUMBERS_FOUND_MSG = {
|
|
21
|
-
messageId: CARD_NUMBERS_FOUND,
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
const STRING_TEST = `
|
|
25
|
-
const NOT_A_SECRET = "I'm not a secret, I think";
|
|
26
|
-
`;
|
|
27
|
-
|
|
28
|
-
// eslint-disable-next-line no-template-curly-in-string
|
|
29
|
-
const TEMPLATE_TEST = "const NOT_A_SECRET = `A template that isn't a secret. ${1+1} = 2`";
|
|
30
|
-
|
|
31
|
-
const CONTAINS_CARD_NUMBER_IN_NUMBER = `
|
|
32
|
-
const foo = 4507894813950280;
|
|
33
|
-
`;
|
|
34
|
-
|
|
35
|
-
const CONTAINS_A_PASSING_CARD_NUMBER = `
|
|
36
|
-
const foo = 4111111111111111;
|
|
37
|
-
const fuz = 123111111111111111567;
|
|
38
|
-
const bar = 111111111111111;
|
|
39
|
-
const baz = 000000000000000;
|
|
40
|
-
const far = 0000000000000000;
|
|
41
|
-
const faz = 00000000000000000;
|
|
42
|
-
const doo = 000000000000000000;
|
|
43
|
-
const dar = 0000000000000000000;
|
|
44
|
-
`;
|
|
45
|
-
|
|
46
|
-
const CONTAINS_A_PASSING_CARD_NUMBER_IN_COMMENT = `
|
|
47
|
-
// 4111111111111111;
|
|
48
|
-
// 123111111111111111567;
|
|
49
|
-
// 111111111111111;
|
|
50
|
-
// 000000000000000;
|
|
51
|
-
// 0000000000000000;
|
|
52
|
-
// 00000000000000000;
|
|
53
|
-
// 000000000000000000;
|
|
54
|
-
// 0000000000000000000;
|
|
55
|
-
`;
|
|
56
|
-
|
|
57
|
-
const CONTAINS_SEVERAL_CARD_NUMBERS_IN_STRING = `
|
|
58
|
-
const foo = '4507894813950280 aa 4939816588221579';
|
|
59
|
-
`;
|
|
60
|
-
|
|
61
|
-
const CONTAINS_CARD_NUMBER_IN_COMMENT = `
|
|
62
|
-
// this test will be using this valid card number -> 4507894813950280
|
|
63
|
-
const foo = 'nothing wrong here';
|
|
64
|
-
`;
|
|
65
|
-
|
|
66
|
-
const CONTAINS_SEVERAL_CARD_NUMBERS_IN_COMMENT = `
|
|
67
|
-
// this test will be using these valid card numbers -> 4507894813950280 and 4732643354095204
|
|
68
|
-
const foo = 'nothing wrong here';
|
|
69
|
-
`;
|
|
70
|
-
|
|
71
|
-
const STRING_WITH_CARD_NUMBER_THAT_DOESNT_PASS_LUHN_CHECK = `
|
|
72
|
-
const foo = 4507894813950285;
|
|
73
|
-
`;
|
|
74
|
-
|
|
75
|
-
describe('no-card-numbers', () => {
|
|
76
|
-
const ruleTester = new RuleTester({ parserOptions: { ecmaVersion: 2020 } });
|
|
77
|
-
ruleTester.run('no-card-numbers', rule, {
|
|
78
|
-
valid: [
|
|
79
|
-
{
|
|
80
|
-
code: STRING_TEST,
|
|
81
|
-
},
|
|
82
|
-
{
|
|
83
|
-
code: TEMPLATE_TEST,
|
|
84
|
-
},
|
|
85
|
-
{
|
|
86
|
-
code: STRING_WITH_CARD_NUMBER_THAT_DOESNT_PASS_LUHN_CHECK,
|
|
87
|
-
},
|
|
88
|
-
{
|
|
89
|
-
code: CONTAINS_A_PASSING_CARD_NUMBER,
|
|
90
|
-
},
|
|
91
|
-
{
|
|
92
|
-
code: CONTAINS_A_PASSING_CARD_NUMBER_IN_COMMENT,
|
|
93
|
-
},
|
|
94
|
-
],
|
|
95
|
-
invalid: [
|
|
96
|
-
{
|
|
97
|
-
code: CONTAINS_CARD_NUMBER_IN_NUMBER,
|
|
98
|
-
errors: [CARD_NUMBER_FOUND_MSG],
|
|
99
|
-
},
|
|
100
|
-
{
|
|
101
|
-
code: CONTAINS_SEVERAL_CARD_NUMBERS_IN_STRING,
|
|
102
|
-
errors: [CARD_NUMBERS_FOUND_MSG],
|
|
103
|
-
},
|
|
104
|
-
{
|
|
105
|
-
code: CONTAINS_CARD_NUMBER_IN_COMMENT,
|
|
106
|
-
errors: [CARD_NUMBER_FOUND_MSG],
|
|
107
|
-
},
|
|
108
|
-
{
|
|
109
|
-
code: CONTAINS_SEVERAL_CARD_NUMBERS_IN_COMMENT,
|
|
110
|
-
errors: [CARD_NUMBERS_FOUND_MSG],
|
|
111
|
-
},
|
|
112
|
-
],
|
|
113
|
-
});
|
|
114
|
-
});
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
// pure-functions.spec.ts
|
|
2
|
-
|
|
3
|
-
/*
|
|
4
|
-
* Copyright (c) 2021 Check Digit, LLC
|
|
5
|
-
*
|
|
6
|
-
* This code is licensed under the MIT license (see LICENSE.txt for details).
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import { RuleTester } from 'eslint';
|
|
10
|
-
|
|
11
|
-
import rule from './pure-functions';
|
|
12
|
-
|
|
13
|
-
const ONLY_PURE_FUNCTIONS = `
|
|
14
|
-
const a = 3;
|
|
15
|
-
let d = 4;
|
|
16
|
-
|
|
17
|
-
function x() {
|
|
18
|
-
const a = 3;
|
|
19
|
-
let d = 4;
|
|
20
|
-
return 3;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
function y() {
|
|
24
|
-
const a = 3;
|
|
25
|
-
let d = 4;
|
|
26
|
-
function z() {
|
|
27
|
-
return 123;
|
|
28
|
-
}
|
|
29
|
-
return z();
|
|
30
|
-
}
|
|
31
|
-
`;
|
|
32
|
-
|
|
33
|
-
const RECURSIVE_PURE_FUNCTIONS = `
|
|
34
|
-
function x(y) {
|
|
35
|
-
return x(y + 1);
|
|
36
|
-
}
|
|
37
|
-
x(0);
|
|
38
|
-
`;
|
|
39
|
-
|
|
40
|
-
const IMPURE_FUNCTIONS = `
|
|
41
|
-
const a = 3;
|
|
42
|
-
let d = 4;
|
|
43
|
-
var e = 5;
|
|
44
|
-
function b() {
|
|
45
|
-
const c = 2;
|
|
46
|
-
return a + c + d + e;
|
|
47
|
-
}
|
|
48
|
-
`;
|
|
49
|
-
|
|
50
|
-
// const IMPURE_FUNCTIONS_OUT_OF_ORDER = `
|
|
51
|
-
// const a = 3;
|
|
52
|
-
// let d = 4;
|
|
53
|
-
// function b() {
|
|
54
|
-
// const c = 2;
|
|
55
|
-
// return a + c + d + e;
|
|
56
|
-
// }
|
|
57
|
-
// var e = 5;
|
|
58
|
-
// `;
|
|
59
|
-
|
|
60
|
-
describe('pure-functions', () => {
|
|
61
|
-
const ruleTester = new RuleTester({ parserOptions: { ecmaVersion: 2020 } });
|
|
62
|
-
|
|
63
|
-
ruleTester.run('functions', rule, {
|
|
64
|
-
valid: [
|
|
65
|
-
{
|
|
66
|
-
code: ONLY_PURE_FUNCTIONS,
|
|
67
|
-
parserOptions: {
|
|
68
|
-
project: './tsconfig.json',
|
|
69
|
-
},
|
|
70
|
-
},
|
|
71
|
-
{
|
|
72
|
-
code: RECURSIVE_PURE_FUNCTIONS,
|
|
73
|
-
filename: 'src/hello.ts',
|
|
74
|
-
parserOptions: {
|
|
75
|
-
project: './tsconfig.json',
|
|
76
|
-
},
|
|
77
|
-
},
|
|
78
|
-
],
|
|
79
|
-
invalid: [
|
|
80
|
-
{
|
|
81
|
-
code: IMPURE_FUNCTIONS,
|
|
82
|
-
errors: [
|
|
83
|
-
{
|
|
84
|
-
message: 'invalid closure over d',
|
|
85
|
-
},
|
|
86
|
-
{
|
|
87
|
-
message: 'invalid closure over e',
|
|
88
|
-
},
|
|
89
|
-
],
|
|
90
|
-
},
|
|
91
|
-
],
|
|
92
|
-
});
|
|
93
|
-
});
|
package/src/pure-functions.ts
DELETED
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
// pure-functions.ts
|
|
2
|
-
|
|
3
|
-
/*
|
|
4
|
-
* Copyright (c) 2021 Check Digit, LLC
|
|
5
|
-
*
|
|
6
|
-
* This code is licensed under the MIT license (see LICENSE.txt for details).
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import type * as ESTree from 'estree';
|
|
10
|
-
import type { Rule } from 'eslint';
|
|
11
|
-
|
|
12
|
-
const INVALID_CLOSURE = 'INVALID_CLOSURE';
|
|
13
|
-
|
|
14
|
-
export default {
|
|
15
|
-
meta: {
|
|
16
|
-
type: 'problem',
|
|
17
|
-
docs: {
|
|
18
|
-
description: 'disallow closures of anything other than const primitive values',
|
|
19
|
-
url: 'https://github.com/checkdigit/eslint-plugin',
|
|
20
|
-
},
|
|
21
|
-
messages: {
|
|
22
|
-
[INVALID_CLOSURE]: 'invalid closure over {{ name }}',
|
|
23
|
-
},
|
|
24
|
-
},
|
|
25
|
-
create(context: Rule.RuleContext) {
|
|
26
|
-
const sourceCode = context.getSourceCode();
|
|
27
|
-
const manager = sourceCode.scopeManager;
|
|
28
|
-
|
|
29
|
-
function check(node: ESTree.Node): void {
|
|
30
|
-
const functionScope = manager.acquire(node);
|
|
31
|
-
const functionRange = node.range;
|
|
32
|
-
if (functionRange === undefined) {
|
|
33
|
-
return;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
const queue = [functionScope];
|
|
37
|
-
let scope;
|
|
38
|
-
while ((scope = queue.pop())) {
|
|
39
|
-
queue.push(...scope.childScopes);
|
|
40
|
-
for (const reference of scope.references) {
|
|
41
|
-
const variable = reference.resolved;
|
|
42
|
-
if (
|
|
43
|
-
variable !== null &&
|
|
44
|
-
variable.defs.every((definition) => {
|
|
45
|
-
const definitionNode = definition.node as { range: [number, number]; init?: { type: string } };
|
|
46
|
-
const definitionRange = definitionNode.range;
|
|
47
|
-
return (
|
|
48
|
-
(functionRange[0] > definitionRange[0] || definitionRange[1] < functionRange[0]) &&
|
|
49
|
-
!(
|
|
50
|
-
(definition as unknown as { kind: string }).kind === 'const' &&
|
|
51
|
-
definitionNode.init?.type === 'Literal'
|
|
52
|
-
)
|
|
53
|
-
);
|
|
54
|
-
})
|
|
55
|
-
) {
|
|
56
|
-
context.report({
|
|
57
|
-
node: reference.identifier,
|
|
58
|
-
messageId: INVALID_CLOSURE,
|
|
59
|
-
data: { name: variable.name },
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
return {
|
|
67
|
-
ArrowFunctionExpression: check,
|
|
68
|
-
FunctionDeclaration: check,
|
|
69
|
-
FunctionExpression: check,
|
|
70
|
-
};
|
|
71
|
-
},
|
|
72
|
-
} as Rule.RuleModule;
|