@thethracian/oxlint-config 0.1.0 → 0.2.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 +13 -0
- package/README.md +61 -1
- package/dist/index.d.ts +32 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +71 -0
- package/dist/index.js.map +1 -1
- package/dist/rules/effect-default-helpers.d.ts +33 -0
- package/dist/rules/effect-default-helpers.d.ts.map +1 -0
- package/dist/rules/effect-default-helpers.js +459 -0
- package/dist/rules/effect-default-helpers.js.map +1 -0
- package/dist/rules/effect-default-resource-helpers.d.ts +5 -0
- package/dist/rules/effect-default-resource-helpers.d.ts.map +1 -0
- package/dist/rules/effect-default-resource-helpers.js +65 -0
- package/dist/rules/effect-default-resource-helpers.js.map +1 -0
- package/dist/rules/effect-default-test-helpers.d.ts +5 -0
- package/dist/rules/effect-default-test-helpers.d.ts.map +1 -0
- package/dist/rules/effect-default-test-helpers.js +46 -0
- package/dist/rules/effect-default-test-helpers.js.map +1 -0
- package/dist/rules/effect-default.d.ts +3 -0
- package/dist/rules/effect-default.d.ts.map +1 -0
- package/dist/rules/effect-default.js +746 -0
- package/dist/rules/effect-default.js.map +1 -0
- package/dist/rules/effect-path-options.d.ts +59 -0
- package/dist/rules/effect-path-options.d.ts.map +1 -0
- package/dist/rules/effect-path-options.js +114 -0
- package/dist/rules/effect-path-options.js.map +1 -0
- package/dist/rules/effect-rule-core.d.ts +52 -0
- package/dist/rules/effect-rule-core.d.ts.map +1 -0
- package/dist/rules/effect-rule-core.js +362 -0
- package/dist/rules/effect-rule-core.js.map +1 -0
- package/dist/rules/effect-rule-names.d.ts +4 -0
- package/dist/rules/effect-rule-names.d.ts.map +1 -0
- package/dist/rules/effect-rule-names.js +147 -0
- package/dist/rules/effect-rule-names.js.map +1 -0
- package/dist/rules/effect-source-helpers.d.ts +10 -0
- package/dist/rules/effect-source-helpers.d.ts.map +1 -0
- package/dist/rules/effect-source-helpers.js +334 -0
- package/dist/rules/effect-source-helpers.js.map +1 -0
- package/dist/rules/effect-source-scan.d.ts +8 -0
- package/dist/rules/effect-source-scan.d.ts.map +1 -0
- package/dist/rules/effect-source-scan.js +356 -0
- package/dist/rules/effect-source-scan.js.map +1 -0
- package/dist/rules/effect-strict-helpers.d.ts +34 -0
- package/dist/rules/effect-strict-helpers.d.ts.map +1 -0
- package/dist/rules/effect-strict-helpers.js +331 -0
- package/dist/rules/effect-strict-helpers.js.map +1 -0
- package/dist/rules/effect-strict.d.ts +3 -0
- package/dist/rules/effect-strict.d.ts.map +1 -0
- package/dist/rules/effect-strict.js +663 -0
- package/dist/rules/effect-strict.js.map +1 -0
- package/dist/rules/plugin.d.ts.map +1 -1
- package/dist/rules/plugin.js +16 -7
- package/dist/rules/plugin.js.map +1 -1
- package/package.json +15 -3
|
@@ -0,0 +1,459 @@
|
|
|
1
|
+
import { effectImportAliases, hasRuntimeCall } from './effect-rule-core.js';
|
|
2
|
+
import { findBalancedCallEnd, findMatchingBrace, findStatementEnd, isInsideCall, sameFunctionTail, stripComments, stripCommentsAndStrings, } from './effect-source-helpers.js';
|
|
3
|
+
function escapeRegExp(value) {
|
|
4
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
5
|
+
}
|
|
6
|
+
function effectAliasesPattern(source) {
|
|
7
|
+
return effectImportAliases(source).map(escapeRegExp).join('|');
|
|
8
|
+
}
|
|
9
|
+
function effectCallPattern(source, methods) {
|
|
10
|
+
return new RegExp(`\\b(?:${effectAliasesPattern(source)})\\.(?:${methods})\\s*\\(`, 'g');
|
|
11
|
+
}
|
|
12
|
+
function hasRuntimeInEffect(source) {
|
|
13
|
+
return effectWorkflowBodies(source).some((body) => hasRuntimeCall(body));
|
|
14
|
+
}
|
|
15
|
+
function hasNestedFlatMap(source) {
|
|
16
|
+
const code = stripCommentsAndStrings(source);
|
|
17
|
+
return (/Effect\.flatMap\s*\([\s\S]*?=>[\s\S]*?\.pipe\s*\(\s*Effect\.flatMap/s.test(code) ||
|
|
18
|
+
/Effect\.flatMap\s*\([^,]+,\s*(?:\([^)]*\)|[A-Za-z_$][\w$]*)\s*=>[\s\S]*?Effect\.flatMap\s*\(/s.test(code));
|
|
19
|
+
}
|
|
20
|
+
function localCallSegment(source, targetIndex) {
|
|
21
|
+
const openParenIndex = source.indexOf('(', targetIndex);
|
|
22
|
+
if (openParenIndex === -1) {
|
|
23
|
+
return source.slice(targetIndex, findStatementEnd(source, targetIndex) + 1);
|
|
24
|
+
}
|
|
25
|
+
return source.slice(targetIndex, findBalancedCallEnd(source, openParenIndex) + 1);
|
|
26
|
+
}
|
|
27
|
+
function hasUnboundedEffectConcurrency(source) {
|
|
28
|
+
const code = stripCommentsAndStrings(source);
|
|
29
|
+
for (const match of code.matchAll(/\bEffect\.(?:forEach|all)\s*\(/g)) {
|
|
30
|
+
if (/\{[\s\S]*?\bconcurrency\s*:\s*['"]unbounded['"]/.test(stripComments(localCallSegment(source, match.index)))) {
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
function hasUnboundedFlatMapConcurrency(source) {
|
|
37
|
+
const code = stripCommentsAndStrings(source);
|
|
38
|
+
for (const match of code.matchAll(/\bEffect\.flatMap\s*\(/g)) {
|
|
39
|
+
if (/\{[\s\S]*?\bconcurrency\s*:\s*['"]unbounded['"]/.test(stripComments(localCallSegment(source, match.index)))) {
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
function hasParsedJsonNumberFromString(source) {
|
|
46
|
+
const code = stripCommentsAndStrings(source);
|
|
47
|
+
for (const match of code.matchAll(/\bJSON\.parse\s*\(/g)) {
|
|
48
|
+
const statementStart = Math.max(code.lastIndexOf(';', match.index) + 1, code.lastIndexOf('\n', match.index) + 1);
|
|
49
|
+
const statementEnd = findStatementEnd(code, statementStart);
|
|
50
|
+
if (/\b(?:[A-Za-z_$][\w$]*NumberFromString|Schema\.NumberFromString)\b/.test(code.slice(statementStart, statementEnd + 1))) {
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
function hasEffectInArrayForEach(source) {
|
|
57
|
+
const code = stripCommentsAndStrings(source);
|
|
58
|
+
for (const match of code.matchAll(/\b(?!Effect\b)[A-Za-z_$][\w$]*\.forEach\s*\(/g)) {
|
|
59
|
+
const openParenIndex = source.indexOf('(', match.index);
|
|
60
|
+
const callBody = source.slice(openParenIndex + 1, findBalancedCallEnd(source, openParenIndex));
|
|
61
|
+
if (/(?:=>|function\b)[\s\S]*?\bEffect\./.test(stripCommentsAndStrings(callBody))) {
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
function hasEffectInPromiseCallback(source) {
|
|
68
|
+
const code = stripCommentsAndStrings(source);
|
|
69
|
+
for (const match of code.matchAll(/\.(?:then|catch)\s*\(/g)) {
|
|
70
|
+
const openParenIndex = source.indexOf('(', match.index);
|
|
71
|
+
const callBody = source.slice(openParenIndex + 1, findBalancedCallEnd(source, openParenIndex));
|
|
72
|
+
if (/(?:=>|function\b)[\s\S]*?\bEffect\./.test(stripCommentsAndStrings(callBody))) {
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
function enclosingPipeBody(source, targetIndex) {
|
|
79
|
+
for (const match of source.matchAll(/\.pipe\s*\(/g)) {
|
|
80
|
+
const openParenIndex = source.indexOf('(', match.index);
|
|
81
|
+
if (openParenIndex === -1 || openParenIndex > targetIndex) {
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
const endIndex = findBalancedCallEnd(source, openParenIndex);
|
|
85
|
+
if (targetIndex <= endIndex) {
|
|
86
|
+
return source.slice(openParenIndex + 1, endIndex);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return undefined;
|
|
90
|
+
}
|
|
91
|
+
function effectCallBodies(source, callPattern) {
|
|
92
|
+
const code = stripCommentsAndStrings(source);
|
|
93
|
+
const bodies = [];
|
|
94
|
+
for (const match of code.matchAll(callPattern)) {
|
|
95
|
+
const openParenIndex = source.indexOf('(', match.index);
|
|
96
|
+
if (openParenIndex === -1) {
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
bodies.push(source.slice(openParenIndex + 1, findBalancedCallEnd(source, openParenIndex)));
|
|
100
|
+
}
|
|
101
|
+
return bodies;
|
|
102
|
+
}
|
|
103
|
+
function effectWorkflowBodies(source) {
|
|
104
|
+
const code = stripCommentsAndStrings(source);
|
|
105
|
+
const bodies = effectCallBodies(source, effectCallPattern(source, 'gen'));
|
|
106
|
+
for (const match of code.matchAll(effectCallPattern(source, 'fn'))) {
|
|
107
|
+
const openParenIndex = source.indexOf('(', match.index);
|
|
108
|
+
if (openParenIndex === -1) {
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
const firstCallEnd = findBalancedCallEnd(source, openParenIndex);
|
|
112
|
+
const nextCallMatch = /^\s*\(/.exec(source.slice(firstCallEnd + 1));
|
|
113
|
+
if (!nextCallMatch) {
|
|
114
|
+
bodies.push(source.slice(openParenIndex + 1, firstCallEnd));
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
const nextOpenParenIndex = firstCallEnd + 1 + nextCallMatch[0].lastIndexOf('(');
|
|
118
|
+
bodies.push(source.slice(nextOpenParenIndex + 1, findBalancedCallEnd(source, nextOpenParenIndex)));
|
|
119
|
+
}
|
|
120
|
+
return bodies;
|
|
121
|
+
}
|
|
122
|
+
function hasReturnEffectInGen(source) {
|
|
123
|
+
const returnEffectPattern = new RegExp(`\\breturn\\s+(?:${effectAliasesPattern(source)})\\.(?!isEffect\\b|serviceFunction\\b)`);
|
|
124
|
+
return effectCallBodies(source, effectCallPattern(source, 'gen')).some((body) => returnEffectPattern.test(stripCommentsAndStrings(body)));
|
|
125
|
+
}
|
|
126
|
+
function hasYieldWithoutStarInGen(source) {
|
|
127
|
+
const code = stripCommentsAndStrings(source);
|
|
128
|
+
for (const match of code.matchAll(effectCallPattern(source, 'gen'))) {
|
|
129
|
+
const openParenIndex = source.indexOf('(', match.index);
|
|
130
|
+
if (openParenIndex === -1) {
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
const bodyStart = openParenIndex + 1;
|
|
134
|
+
const body = source.slice(bodyStart, findBalancedCallEnd(source, openParenIndex));
|
|
135
|
+
const bodyCode = stripCommentsAndStrings(body);
|
|
136
|
+
const yieldMatch = /(?:^|[^\w$])(yield\s+(?!\*)[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)?)/.exec(bodyCode);
|
|
137
|
+
if (yieldMatch?.index !== undefined) {
|
|
138
|
+
return bodyStart + yieldMatch.index + yieldMatch[0].indexOf(yieldMatch[1]);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
function hasAsyncAwaitInEffect(source) {
|
|
144
|
+
return effectWorkflowBodies(source).some((body) => /(?:^|[({,]\s*)async\b|\bawait\b/.test(stripCommentsAndStrings(body)));
|
|
145
|
+
}
|
|
146
|
+
function hasSyncForPromise(source) {
|
|
147
|
+
return effectCallBodies(source, effectCallPattern(source, 'sync')).some((body) => {
|
|
148
|
+
const code = stripCommentsAndStrings(body);
|
|
149
|
+
return /^\s*async\b/.test(code) || /\b(?:fetch|Promise\.)\s*\(/.test(code);
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
function hasSyncForThrowingOps(source) {
|
|
153
|
+
return effectCallBodies(source, effectCallPattern(source, 'sync')).some((body) => /\b(?:throw\b|JSON\.parse\s*\()/.test(stripCommentsAndStrings(body)));
|
|
154
|
+
}
|
|
155
|
+
function hasThrowInEffect(source) {
|
|
156
|
+
return effectWorkflowBodies(source).some((body) => /\bthrow\b/.test(stripCommentsAndStrings(body)));
|
|
157
|
+
}
|
|
158
|
+
function hasFloatingEffect(source) {
|
|
159
|
+
const lines = stripCommentsAndStrings(source).split('\n');
|
|
160
|
+
const aliases = effectAliasesPattern(source);
|
|
161
|
+
const runtimeMethods = 'runPromise|runPromiseExit|runSync|runSyncExit|runFork';
|
|
162
|
+
const floatingEffectCall = new RegExp(`^(?:void\\s+)?\\(*\\s*(?:${aliases})\\.(?!(?:${runtimeMethods})\\b)[A-Za-z_$][\\w$]*\\s*\\(`);
|
|
163
|
+
const inlineIfEffectCall = new RegExp(`^if\\s*\\([^)]*\\)\\s*(?:${aliases})\\.(?!(?:${runtimeMethods})\\b)[A-Za-z_$][\\w$]*\\s*\\(`);
|
|
164
|
+
const guardedAndEffectCall = new RegExp(`^[A-Za-z_$][\\w$]*(?:\\.[A-Za-z_$][\\w$]*)?\\s*&&\\s*(?:${aliases})\\.(?!(?:${runtimeMethods})\\b)[A-Za-z_$][\\w$]*\\s*\\(`);
|
|
165
|
+
const guardedOrEffectCall = new RegExp(`^[A-Za-z_$][\\w$]*(?:\\.[A-Za-z_$][\\w$]*)?\\s*\\|\\|\\s*(?:${aliases})\\.(?!(?:${runtimeMethods})\\b)[A-Za-z_$][\\w$]*\\s*\\(`);
|
|
166
|
+
const ternaryEffectCall = new RegExp(`\\?\\s*(?:${aliases})\\.(?!(?:${runtimeMethods})\\b)[A-Za-z_$][\\w$]*\\s*\\(`);
|
|
167
|
+
for (let index = 0; index < lines.length; index++) {
|
|
168
|
+
const trimmed = lines[index].trim();
|
|
169
|
+
const previousLine = [...lines.slice(0, index)].reverse().find((line) => line.trim() !== '');
|
|
170
|
+
const previous = previousLine?.trim() ?? '';
|
|
171
|
+
if (floatingEffectCall.test(trimmed) &&
|
|
172
|
+
!/[=(:,[]\s*$/.test(previous) &&
|
|
173
|
+
!previous.endsWith('.pipe(') &&
|
|
174
|
+
!trimmed.endsWith(',')) {
|
|
175
|
+
return true;
|
|
176
|
+
}
|
|
177
|
+
if (/^[A-Za-z_$][\w$]*\.pipe\s*\([\s\S]*?\bEffect\./.test(trimmed) &&
|
|
178
|
+
!/[=(:,[]\s*$/.test(previous)) {
|
|
179
|
+
return true;
|
|
180
|
+
}
|
|
181
|
+
if (/^Schema\.decode[A-Za-z]*\s*\([^)]*\)\s*\([^)]*\)\s*;?$/.test(trimmed)) {
|
|
182
|
+
return true;
|
|
183
|
+
}
|
|
184
|
+
if (inlineIfEffectCall.test(trimmed)) {
|
|
185
|
+
return true;
|
|
186
|
+
}
|
|
187
|
+
if (guardedAndEffectCall.test(trimmed)) {
|
|
188
|
+
return true;
|
|
189
|
+
}
|
|
190
|
+
if (guardedOrEffectCall.test(trimmed)) {
|
|
191
|
+
return true;
|
|
192
|
+
}
|
|
193
|
+
if (ternaryEffectCall.test(trimmed)) {
|
|
194
|
+
return true;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
const code = stripCommentsAndStrings(source);
|
|
198
|
+
for (const match of code.matchAll(/^\s*[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)?\.pipe\s*\(/gm)) {
|
|
199
|
+
const statementPrefix = code.slice(code.lastIndexOf(';', match.index) + 1, match.index);
|
|
200
|
+
if (/[=(:,[]\s*$/.test(statementPrefix.trimEnd())) {
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
const openParenIndex = code.indexOf('(', match.index);
|
|
204
|
+
const pipeCall = code.slice(match.index, findBalancedCallEnd(code, openParenIndex) + 1);
|
|
205
|
+
if (/\bEffect\./.test(pipeCall)) {
|
|
206
|
+
return true;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return false;
|
|
210
|
+
}
|
|
211
|
+
function isUnobservedForkMatch(source, match) {
|
|
212
|
+
const [, fiberName] = match;
|
|
213
|
+
const lineStart = source.lastIndexOf('\n', match.index) + 1;
|
|
214
|
+
const prefix = source.slice(lineStart, match.index);
|
|
215
|
+
if (!fiberName && /\breturn\s+$/.test(prefix)) {
|
|
216
|
+
return false;
|
|
217
|
+
}
|
|
218
|
+
if (!fiberName) {
|
|
219
|
+
return true;
|
|
220
|
+
}
|
|
221
|
+
const observedFiberPattern = new RegExp(`(?:yield\\*\\s+Fiber\\.(?:join|interrupt)\\s*\\(\\s*${fiberName}\\b|yield\\*\\s+${fiberName}\\.await\\b)`);
|
|
222
|
+
return !observedFiberPattern.test(sameFunctionTail(source, match.index + match[0].length));
|
|
223
|
+
}
|
|
224
|
+
function hasUnobservedFork(source) {
|
|
225
|
+
const code = stripCommentsAndStrings(source);
|
|
226
|
+
const forkPatterns = [
|
|
227
|
+
/\b(?:(?:const|let)\s+([A-Za-z_$][\w$]*)\s*=\s*)?yield\*\s+Effect\.fork\s*\(/g,
|
|
228
|
+
/\b(?:(?:const|let)\s+([A-Za-z_$][\w$]*)\s*=\s*)?yield\*\s+[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)?\.pipe\s*\(\s*Effect\.fork\b/g,
|
|
229
|
+
];
|
|
230
|
+
for (const pattern of forkPatterns) {
|
|
231
|
+
for (const match of code.matchAll(pattern)) {
|
|
232
|
+
if (isUnobservedForkMatch(code, match)) {
|
|
233
|
+
return true;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
return (/^\s*Effect\.fork\s*\(/m.test(code) ||
|
|
238
|
+
/^\s*[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)?\.pipe\s*\(\s*Effect\.fork\b/m.test(code));
|
|
239
|
+
}
|
|
240
|
+
function hasRunForkWithoutObserver(source) {
|
|
241
|
+
const code = stripCommentsAndStrings(source);
|
|
242
|
+
const assignedForks = [
|
|
243
|
+
...code.matchAll(/\b(?:const|let)\s+([A-Za-z_$][\w$]*)\s*=\s*Effect\.runFork\s*\(/g),
|
|
244
|
+
];
|
|
245
|
+
for (const [index, match] of assignedForks.entries()) {
|
|
246
|
+
const [, fiberName] = match;
|
|
247
|
+
const nextSameNameFork = assignedForks
|
|
248
|
+
.slice(index + 1)
|
|
249
|
+
.find((nextMatch) => nextMatch[1] === fiberName);
|
|
250
|
+
const localSource = sameFunctionTail(code, match.index).slice(0, nextSameNameFork ? nextSameNameFork.index - match.index : undefined);
|
|
251
|
+
const observedPattern = new RegExp(`\\b${fiberName}\\.addObserver\\b`);
|
|
252
|
+
if (!observedPattern.test(localSource)) {
|
|
253
|
+
return true;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
const unassignedSource = code.replace(/\b(?:const|let)\s+[A-Za-z_$][\w$]*\s*=\s*Effect\.runFork\s*\(/g, '');
|
|
257
|
+
return /Effect\.runFork\s*\(/.test(unassignedSource);
|
|
258
|
+
}
|
|
259
|
+
function hasUnsafeLazyEvaluation(source) {
|
|
260
|
+
const code = stripCommentsAndStrings(source);
|
|
261
|
+
for (const match of code.matchAll(/Effect\.succeed\s*\(\s*(?:Date\.now|Math\.random|new\s+Date|JSON\.parse)\s*\(/g)) {
|
|
262
|
+
if (!isInsideCall(code, match.index, /Effect\.suspend\s*\(/g)) {
|
|
263
|
+
return true;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
return false;
|
|
267
|
+
}
|
|
268
|
+
function hasSchemaSyncDecodeInEffectWorkflow(source) {
|
|
269
|
+
return effectWorkflowBodies(source).some((body) => /Schema\.decode(?:Unknown)?Sync\s*\(/.test(stripCommentsAndStrings(body)));
|
|
270
|
+
}
|
|
271
|
+
function hasSchemaPromiseDecode(source) {
|
|
272
|
+
return /Schema\.decode[A-Za-z]*Promise\s*\(/.test(stripCommentsAndStrings(source));
|
|
273
|
+
}
|
|
274
|
+
function hasTryPromiseWithoutTypedCatch(source) {
|
|
275
|
+
const code = stripCommentsAndStrings(source);
|
|
276
|
+
if (/\bEffect\.tryPromise\s*\(\s*(?:async\s*)?(?:\([^)]*\)|[A-Za-z_$][\w$]*)\s*=>/.test(code)) {
|
|
277
|
+
return true;
|
|
278
|
+
}
|
|
279
|
+
for (const match of code.matchAll(/Effect\.tryPromise\s*\(\s*{/g)) {
|
|
280
|
+
const objectStart = code.indexOf('{', match.index);
|
|
281
|
+
const objectEnd = findMatchingBrace(code, objectStart);
|
|
282
|
+
if (objectEnd === -1) {
|
|
283
|
+
continue;
|
|
284
|
+
}
|
|
285
|
+
const body = code.slice(objectStart + 1, objectEnd);
|
|
286
|
+
if (/\btry\s*:/.test(body) && !/\bcatch\s*:/.test(body)) {
|
|
287
|
+
return true;
|
|
288
|
+
}
|
|
289
|
+
const rawBody = source.slice(objectStart + 1, objectEnd);
|
|
290
|
+
const catchIndex = body.search(/\bcatch\s*:/);
|
|
291
|
+
const catchTail = catchIndex === -1 ? '' : stripComments(rawBody.slice(catchIndex));
|
|
292
|
+
if (/^\s*catch\s*:[\s\S]*?=>\s*(?:new\s+Error\s*\(|['"`])/.test(catchTail) ||
|
|
293
|
+
/^\s*catch\s*:[\s\S]*?=>\s*\(\s*{(?![\s\S]*\b_tag\s*:)/.test(catchTail)) {
|
|
294
|
+
return true;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
return false;
|
|
298
|
+
}
|
|
299
|
+
function hasExternalJsonWithoutDecodeUnknown(source) {
|
|
300
|
+
const code = stripCommentsAndStrings(source);
|
|
301
|
+
for (const match of code.matchAll(/\b(?:response|res)\.json\s*\(\s*\)/g)) {
|
|
302
|
+
const callSegment = localCallSegment(code, match.index);
|
|
303
|
+
if (!isInsideCall(code, match.index, /Schema\.decodeUnknown\s*\(/g) &&
|
|
304
|
+
!/Schema\.decodeUnknown/.test(callSegment)) {
|
|
305
|
+
return true;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
return false;
|
|
309
|
+
}
|
|
310
|
+
function hasCastAfterSchemaDecode(source) {
|
|
311
|
+
const code = stripCommentsAndStrings(source);
|
|
312
|
+
for (const match of code.matchAll(/Schema\.decode[A-Za-z]*\s*\(/g)) {
|
|
313
|
+
const lineStart = Math.max(code.lastIndexOf(';', match.index) + 1, code.lastIndexOf('\n', match.index) + 1);
|
|
314
|
+
const line = code.slice(lineStart, code.indexOf('\n', match.index) === -1 ? code.length : code.indexOf('\n', match.index));
|
|
315
|
+
const bindingName = /\b(?:const|let|var)\s+([A-Za-z_$][\w$]*)\s*=/.exec(line)?.[1];
|
|
316
|
+
if (/Schema\.decode[A-Za-z]*\s*\([^)]*\)\s*\([^)]*\)\s+as\s+[A-Za-z_$][\w$]*/.test(line)) {
|
|
317
|
+
return true;
|
|
318
|
+
}
|
|
319
|
+
if (bindingName) {
|
|
320
|
+
const tail = code.slice(match.index + match[0].length, match.index + match[0].length + 240);
|
|
321
|
+
if (new RegExp(`\\b${bindingName}\\s+as\\s+[A-Za-z_$][\\w$]*`).test(tail)) {
|
|
322
|
+
return true;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
for (const match of code.matchAll(/\b(?:const|let|var)\s+([A-Za-z_$][\w$]*)\s*=\s*Schema\.decode[A-Za-z]*\s*\([^)]*\)\s*\([^)]*\)/g)) {
|
|
327
|
+
const [, bindingName] = match;
|
|
328
|
+
const tail = code.slice(match.index + match[0].length, match.index + match[0].length + 240);
|
|
329
|
+
if (new RegExp(`\\b${bindingName}\\s+as\\s+[A-Za-z_$][\\w$]*`).test(tail)) {
|
|
330
|
+
return true;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
return false;
|
|
334
|
+
}
|
|
335
|
+
function hasUnhandledSchemaEffectDecode(source) {
|
|
336
|
+
const code = stripCommentsAndStrings(source);
|
|
337
|
+
for (const match of code.matchAll(/\b(?:const|let|var)\s+([A-Za-z_$][\w$]*)\s*=\s*Schema\.decodeUnknown\s*\([^)]*\)\s*\([^)]*\)/g)) {
|
|
338
|
+
const [, bindingName] = match;
|
|
339
|
+
const tail = code.slice(match.index + match[0].length);
|
|
340
|
+
const handledPattern = new RegExp(`(?:yield\\*\\s+${bindingName}\\b|return\\s+${bindingName}\\b)`);
|
|
341
|
+
if (!handledPattern.test(tail)) {
|
|
342
|
+
return true;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
return /Schema\.decodeUnknown\s*\([^)]*\)\s*\([^)]*\)\.pipe\s*\(\s*Effect\.(?:orDie|ignore)\b/.test(code);
|
|
346
|
+
}
|
|
347
|
+
function hasJsonParsedBeforeSchemaStringDecode(source) {
|
|
348
|
+
return /Schema\.decode[A-Za-z]*\s*\((?![^)]*Schema\.parseJson)[\s\S]*?\)\s*\(\s*JSON\.parse\s*\(/.test(stripCommentsAndStrings(source));
|
|
349
|
+
}
|
|
350
|
+
function hasUnsafeRecursiveBody(name, body) {
|
|
351
|
+
const code = stripCommentsAndStrings(body);
|
|
352
|
+
if (!/\bEffect\.(?:flatMap|forEach|gen)\b/.test(code)) {
|
|
353
|
+
return false;
|
|
354
|
+
}
|
|
355
|
+
const recursiveCallPattern = new RegExp(`\\b${name}\\s*\\(`, 'g');
|
|
356
|
+
for (const match of code.matchAll(recursiveCallPattern)) {
|
|
357
|
+
if (!isInsideCall(code, match.index, /Effect\.suspend\s*\(/g)) {
|
|
358
|
+
return true;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
return false;
|
|
362
|
+
}
|
|
363
|
+
function hasRecursiveEffectWithoutSuspend(source) {
|
|
364
|
+
for (const match of source.matchAll(/\bfunction\s+([A-Za-z_$][\w$]*)\s*\([^)]*\)\s*{/g)) {
|
|
365
|
+
const [, name] = match;
|
|
366
|
+
const bodyStart = source.indexOf('{', match.index);
|
|
367
|
+
const bodyEnd = findMatchingBrace(source, bodyStart);
|
|
368
|
+
if (bodyEnd !== -1 && hasUnsafeRecursiveBody(name, source.slice(bodyStart + 1, bodyEnd))) {
|
|
369
|
+
return true;
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
for (const match of source.matchAll(/\bconst\s+([A-Za-z_$][\w$]*)\s*=\s*(?:\([^)]*\)|[A-Za-z_$][\w$]*)\s*=>\s*/g)) {
|
|
373
|
+
const [, name] = match;
|
|
374
|
+
const bodyStart = match.index + match[0].length;
|
|
375
|
+
const expressionEnd = source.indexOf(';', bodyStart);
|
|
376
|
+
const body = source[bodyStart] === '{'
|
|
377
|
+
? source.slice(bodyStart + 1, findMatchingBrace(source, bodyStart))
|
|
378
|
+
: source.slice(bodyStart, expressionEnd === -1 ? source.length : expressionEnd);
|
|
379
|
+
if (hasUnsafeRecursiveBody(name, body)) {
|
|
380
|
+
return true;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
return false;
|
|
384
|
+
}
|
|
385
|
+
function hasUnloggedIgnore(source) {
|
|
386
|
+
for (const match of source.matchAll(/\bEffect\.ignore\b/g)) {
|
|
387
|
+
const pipeBody = enclosingPipeBody(source, match.index);
|
|
388
|
+
const localPrefix = pipeBody
|
|
389
|
+
? pipeBody.slice(0, Math.max(0, match.index - source.indexOf(pipeBody)))
|
|
390
|
+
: source.slice(Math.max(0, match.index - 160), match.index);
|
|
391
|
+
if (!/\b(?:Effect\.log|tapError|tapBoth|catchAll)\b/.test(localPrefix)) {
|
|
392
|
+
return true;
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
return false;
|
|
396
|
+
}
|
|
397
|
+
function hasMultipleCatchTagsInOnePipe(source) {
|
|
398
|
+
const code = stripCommentsAndStrings(source);
|
|
399
|
+
for (const match of code.matchAll(/\.pipe\s*\(/g)) {
|
|
400
|
+
const openParenIndex = source.indexOf('(', match.index);
|
|
401
|
+
if (openParenIndex === -1) {
|
|
402
|
+
continue;
|
|
403
|
+
}
|
|
404
|
+
const pipeBody = source.slice(match.index, findBalancedCallEnd(source, openParenIndex) + 1);
|
|
405
|
+
const catchTagCount = [...pipeBody.matchAll(/Effect\.catchTag\s*\(/g)].length;
|
|
406
|
+
if (catchTagCount > 1 && !/Effect\.catchTags\s*\(/.test(pipeBody)) {
|
|
407
|
+
return true;
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
return false;
|
|
411
|
+
}
|
|
412
|
+
function hasBroadCatchAllWithoutRethrow(source) {
|
|
413
|
+
const code = stripCommentsAndStrings(source);
|
|
414
|
+
for (const match of code.matchAll(/Effect\.catchAll\s*\(/g)) {
|
|
415
|
+
const openParenIndex = source.indexOf('(', match.index);
|
|
416
|
+
if (openParenIndex === -1) {
|
|
417
|
+
continue;
|
|
418
|
+
}
|
|
419
|
+
const callBody = source.slice(openParenIndex + 1, findBalancedCallEnd(source, openParenIndex));
|
|
420
|
+
if (!/=>\s*Effect\.fail\s*\(/.test(callBody)) {
|
|
421
|
+
return true;
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
return false;
|
|
425
|
+
}
|
|
426
|
+
function hasErrorMappingWithoutCause(source) {
|
|
427
|
+
const code = stripCommentsAndStrings(source);
|
|
428
|
+
for (const match of code.matchAll(/(?:mapError|catchAll)\s*\(/g)) {
|
|
429
|
+
const openParenIndex = source.indexOf('(', match.index);
|
|
430
|
+
if (openParenIndex === -1) {
|
|
431
|
+
continue;
|
|
432
|
+
}
|
|
433
|
+
const callBody = source.slice(openParenIndex + 1, findBalancedCallEnd(source, openParenIndex));
|
|
434
|
+
for (const errorMatch of callBody.matchAll(/new\s+[A-Z][\w$]*Error\s*\(/g)) {
|
|
435
|
+
const errorOpenParenIndex = callBody.indexOf('(', errorMatch.index);
|
|
436
|
+
const errorArgs = callBody.slice(errorOpenParenIndex + 1, findBalancedCallEnd(callBody, errorOpenParenIndex));
|
|
437
|
+
if (!/\bcause\b/.test(errorArgs)) {
|
|
438
|
+
return true;
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
return false;
|
|
443
|
+
}
|
|
444
|
+
function hasForkDaemonWithoutCleanup(source) {
|
|
445
|
+
return effectCallBodies(source, /\bEffect\.forkDaemon\s*\(/g).some((body) => !/\b(?:Effect\.)?(?:ensuring|onExit|onInterrupt|supervised)\b|Supervisor\./.test(body));
|
|
446
|
+
}
|
|
447
|
+
function hasForkInUninterruptibleWithoutRestore(source) {
|
|
448
|
+
const code = stripCommentsAndStrings(source);
|
|
449
|
+
for (const match of code.matchAll(/\bEffect\.uninterruptible\s*\(/g)) {
|
|
450
|
+
const openParenIndex = source.indexOf('(', match.index);
|
|
451
|
+
const callBody = source.slice(openParenIndex + 1, findBalancedCallEnd(source, openParenIndex));
|
|
452
|
+
if (/\bEffect\.fork\b/.test(callBody) && !/\brestore\s*\(/.test(callBody)) {
|
|
453
|
+
return true;
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
return false;
|
|
457
|
+
}
|
|
458
|
+
export { hasAsyncAwaitInEffect, hasEffectInArrayForEach, hasEffectInPromiseCallback, hasErrorMappingWithoutCause, hasFloatingEffect, hasForkDaemonWithoutCleanup, hasForkInUninterruptibleWithoutRestore, hasBroadCatchAllWithoutRethrow, hasJsonParsedBeforeSchemaStringDecode, hasMultipleCatchTagsInOnePipe, hasNestedFlatMap, hasRecursiveEffectWithoutSuspend, hasReturnEffectInGen, hasRunForkWithoutObserver, hasRuntimeInEffect, hasSchemaPromiseDecode, hasSchemaSyncDecodeInEffectWorkflow, hasSyncForPromise, hasSyncForThrowingOps, hasTryPromiseWithoutTypedCatch, hasUnhandledSchemaEffectDecode, hasParsedJsonNumberFromString, hasCastAfterSchemaDecode, hasExternalJsonWithoutDecodeUnknown, hasUnloggedIgnore, hasUnboundedEffectConcurrency, hasUnboundedFlatMapConcurrency, hasUnobservedFork, hasThrowInEffect, hasUnsafeLazyEvaluation, hasYieldWithoutStarInGen, };
|
|
459
|
+
//# sourceMappingURL=effect-default-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effect-default-helpers.js","sourceRoot":"","sources":["../../src/rules/effect-default-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
declare function hasUnreleasedAcquire(source: string): boolean;
|
|
2
|
+
declare function hasUnscopedAcquireRelease(source: string): boolean;
|
|
3
|
+
declare function hasUnscopedResourceWorkflow(source: string): boolean;
|
|
4
|
+
export { hasUnreleasedAcquire, hasUnscopedAcquireRelease, hasUnscopedResourceWorkflow };
|
|
5
|
+
//# sourceMappingURL=effect-default-resource-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effect-default-resource-helpers.d.ts","sourceRoot":"","sources":["../../src/rules/effect-default-resource-helpers.ts"],"names":[],"mappings":"AAMA,iBAAS,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAcrD;AAqCD,iBAAS,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAgB1D;AAED,iBAAS,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAW5D;AAED,OAAO,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,2BAA2B,EAAE,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { findBalancedCallEnd, isInsideCall, stripCommentsAndStrings, } from './effect-source-helpers.js';
|
|
2
|
+
function hasUnreleasedAcquire(source) {
|
|
3
|
+
const code = stripCommentsAndStrings(source);
|
|
4
|
+
for (const match of code.matchAll(/Effect\.(?:sync|try|tryPromise)\s*\(/g)) {
|
|
5
|
+
const openParenIndex = code.indexOf('(', match.index);
|
|
6
|
+
const callSource = code.slice(match.index, findBalancedCallEnd(code, openParenIndex) + 1);
|
|
7
|
+
if (/\b(?:open|connect|subscribe|listen)\w*\s*\(/.test(callSource) &&
|
|
8
|
+
!isInsideCall(code, match.index, /Effect\.acquireRelease\s*\(/g)) {
|
|
9
|
+
return true;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
function assignedBindingNameBefore(source, targetIndex) {
|
|
15
|
+
const statementStart = source.lastIndexOf(';', targetIndex) + 1;
|
|
16
|
+
const prefix = source.slice(statementStart, targetIndex);
|
|
17
|
+
return /\b(?:const|let)\s+([A-Za-z_$][\w$]*)\s*=\s*$/.exec(prefix)?.[1];
|
|
18
|
+
}
|
|
19
|
+
function isBindingUsedInScopedBoundary(source, bindingName) {
|
|
20
|
+
const bindingPattern = new RegExp(`\\b${bindingName}\\b`);
|
|
21
|
+
for (const match of source.matchAll(/\b(?:Effect|Layer)\.scoped\s*\(/g)) {
|
|
22
|
+
const openParenIndex = source.indexOf('(', match.index);
|
|
23
|
+
const scopedBody = source.slice(openParenIndex + 1, findBalancedCallEnd(source, openParenIndex));
|
|
24
|
+
if (bindingPattern.test(scopedBody)) {
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
function hasScopedPipeAfterCall(source, callEndIndex) {
|
|
31
|
+
const tail = source.slice(callEndIndex + 1);
|
|
32
|
+
const pipeMatch = /^\s*\.pipe\s*\(/.exec(tail);
|
|
33
|
+
if (!pipeMatch) {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
const pipeStart = callEndIndex + 1 + pipeMatch.index;
|
|
37
|
+
const openParenIndex = source.indexOf('(', pipeStart);
|
|
38
|
+
const pipeBody = source.slice(openParenIndex + 1, findBalancedCallEnd(source, openParenIndex));
|
|
39
|
+
return /\b(?:Effect|Layer)\.scoped\b/.test(pipeBody);
|
|
40
|
+
}
|
|
41
|
+
function hasUnscopedAcquireRelease(source) {
|
|
42
|
+
const code = stripCommentsAndStrings(source);
|
|
43
|
+
for (const match of code.matchAll(/Effect\.acquireRelease\s*\(/g)) {
|
|
44
|
+
const bindingName = assignedBindingNameBefore(code, match.index);
|
|
45
|
+
const openParenIndex = code.indexOf('(', match.index);
|
|
46
|
+
const callEndIndex = findBalancedCallEnd(code, openParenIndex);
|
|
47
|
+
if (!isInsideCall(code, match.index, /\b(?:Effect|Layer)\.scoped\s*\(/g) &&
|
|
48
|
+
!hasScopedPipeAfterCall(code, callEndIndex) &&
|
|
49
|
+
!(bindingName && isBindingUsedInScopedBoundary(code, bindingName))) {
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
function hasUnscopedResourceWorkflow(source) {
|
|
56
|
+
const code = stripCommentsAndStrings(source);
|
|
57
|
+
for (const match of code.matchAll(/\b(?:Socket|Connection)\.(?:open|connect|listen|subscribe)\w*\s*\(/g)) {
|
|
58
|
+
if (!isInsideCall(code, match.index, /\b(?:Effect|Layer)\.scoped\s*\(/g)) {
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
export { hasUnreleasedAcquire, hasUnscopedAcquireRelease, hasUnscopedResourceWorkflow };
|
|
65
|
+
//# sourceMappingURL=effect-default-resource-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effect-default-resource-helpers.js","sourceRoot":"","sources":["../../src/rules/effect-default-resource-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
declare function hasForkBeforeTestClockAdjust(source: string): boolean;
|
|
2
|
+
declare function hasRealSleepWithoutTestClock(source: string): boolean;
|
|
3
|
+
declare function hasTestClockWithoutEffectContext(source: string): boolean;
|
|
4
|
+
export { hasForkBeforeTestClockAdjust, hasRealSleepWithoutTestClock, hasTestClockWithoutEffectContext, };
|
|
5
|
+
//# sourceMappingURL=effect-default-test-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effect-default-test-helpers.d.ts","sourceRoot":"","sources":["../../src/rules/effect-default-test-helpers.ts"],"names":[],"mappings":"AAEA,iBAAS,4BAA4B,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAgB7D;AAED,iBAAS,4BAA4B,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAgB7D;AAED,iBAAS,gCAAgC,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAgBjE;AAED,OAAO,EACL,4BAA4B,EAC5B,4BAA4B,EAC5B,gCAAgC,GACjC,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { stripCommentsAndStrings } from './effect-source-helpers.js';
|
|
2
|
+
function hasForkBeforeTestClockAdjust(source) {
|
|
3
|
+
const code = stripCommentsAndStrings(source);
|
|
4
|
+
const adjustMatches = [...code.matchAll(/TestClock\.adjust\s*\(/g)];
|
|
5
|
+
if (adjustMatches.length === 0) {
|
|
6
|
+
return false;
|
|
7
|
+
}
|
|
8
|
+
return adjustMatches.every((match) => {
|
|
9
|
+
const adjustIndex = match.index;
|
|
10
|
+
const testStart = Math.max(code.lastIndexOf('it.effect', adjustIndex), code.lastIndexOf('it(', adjustIndex));
|
|
11
|
+
const segment = code.slice(testStart === -1 ? 0 : testStart, adjustIndex);
|
|
12
|
+
return /Effect\.fork(?:Scoped)?\b/.test(segment);
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
function hasRealSleepWithoutTestClock(source) {
|
|
16
|
+
const code = stripCommentsAndStrings(source);
|
|
17
|
+
const testStartPattern = /\bit(?:\.effect)?\s*\(/g;
|
|
18
|
+
const testStarts = [...code.matchAll(testStartPattern)].map((match) => match.index);
|
|
19
|
+
for (const sleepMatch of code.matchAll(/Effect\.sleep\s*\(/g)) {
|
|
20
|
+
const previousStarts = testStarts.filter((start) => start < sleepMatch.index);
|
|
21
|
+
const testStart = previousStarts.at(-1) ?? 0;
|
|
22
|
+
const nextTestStart = testStarts.find((start) => start > sleepMatch.index) ?? code.length;
|
|
23
|
+
const testBody = code.slice(testStart, nextTestStart);
|
|
24
|
+
if (!/TestClock\./.test(testBody)) {
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
function hasTestClockWithoutEffectContext(source) {
|
|
31
|
+
const code = stripCommentsAndStrings(source);
|
|
32
|
+
const testStartPattern = /\bit(?:\.effect)?\s*\(/g;
|
|
33
|
+
const testStarts = [...code.matchAll(testStartPattern)].map((match) => match.index);
|
|
34
|
+
for (const clockMatch of code.matchAll(/TestClock\./g)) {
|
|
35
|
+
const previousStarts = testStarts.filter((start) => start < clockMatch.index);
|
|
36
|
+
const testStart = previousStarts.at(-1) ?? 0;
|
|
37
|
+
const nextTestStart = testStarts.find((start) => start > clockMatch.index) ?? code.length;
|
|
38
|
+
const testBody = code.slice(testStart, nextTestStart);
|
|
39
|
+
if (!/(?:it\.effect|TestContext)/.test(testBody)) {
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
export { hasForkBeforeTestClockAdjust, hasRealSleepWithoutTestClock, hasTestClockWithoutEffectContext, };
|
|
46
|
+
//# sourceMappingURL=effect-default-test-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effect-default-test-helpers.js","sourceRoot":"","sources":["../../src/rules/effect-default-test-helpers.ts"],"names":[],"mappings":"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"}
|