@thethracian/oxlint-config 0.1.0 → 0.2.1
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 +19 -0
- package/README.md +62 -2
- package/dist/index.d.ts +34 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +73 -2
- package/dist/index.js.map +1 -1
- package/dist/rules/acronym-case.d.ts.map +1 -1
- package/dist/rules/acronym-case.js +0 -2
- package/dist/rules/acronym-case.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 +536 -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 +882 -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 +60 -0
- package/dist/rules/effect-rule-core.d.ts.map +1 -0
- package/dist/rules/effect-rule-core.js +509 -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 +359 -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 +364 -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 +500 -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 +727 -0
- package/dist/rules/effect-strict.js.map +1 -0
- package/dist/rules/max-line-length.d.ts.map +1 -1
- package/dist/rules/max-line-length.js +25 -7
- package/dist/rules/max-line-length.js.map +1 -1
- package/dist/rules/plugin.d.ts +2 -121
- package/dist/rules/plugin.d.ts.map +1 -1
- package/dist/rules/plugin.js +94 -101
- package/dist/rules/plugin.js.map +1 -1
- package/dist/rules/require-function-doc.d.ts.map +1 -1
- package/dist/rules/require-function-doc.js +32 -21
- package/dist/rules/require-function-doc.js.map +1 -1
- package/dist/rules/source-cache.d.ts +11 -0
- package/dist/rules/source-cache.d.ts.map +1 -0
- package/dist/rules/source-cache.js +50 -0
- package/dist/rules/source-cache.js.map +1 -0
- package/package.json +13 -4
|
@@ -0,0 +1,536 @@
|
|
|
1
|
+
import { effectImportAliases, hasRuntimeCall } from './effect-rule-core.js';
|
|
2
|
+
import { findBalancedCallEnd, findMatchingBrace, findStatementEnd, isInsideCall, sameFunctionTail, stripComments, stripCommentsAndStrings, } from './effect-source-helpers.js';
|
|
3
|
+
const EFFECT_PATTERN_CACHE_MAX = 256;
|
|
4
|
+
const effectAliasesPatternCache = new Map();
|
|
5
|
+
const effectCallPatternCache = new Map();
|
|
6
|
+
const floatingEffectPatternCache = new Map();
|
|
7
|
+
function escapeRegExp(value) {
|
|
8
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
9
|
+
}
|
|
10
|
+
function setBoundedCacheValue(cache, key, value) {
|
|
11
|
+
if (cache.size >= EFFECT_PATTERN_CACHE_MAX) {
|
|
12
|
+
const firstKey = cache.keys().next().value;
|
|
13
|
+
if (firstKey !== undefined) {
|
|
14
|
+
cache.delete(firstKey);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
cache.set(key, value);
|
|
18
|
+
return value;
|
|
19
|
+
}
|
|
20
|
+
function effectAliasesPattern(source) {
|
|
21
|
+
const cachedPattern = effectAliasesPatternCache.get(source);
|
|
22
|
+
if (cachedPattern !== undefined) {
|
|
23
|
+
return cachedPattern;
|
|
24
|
+
}
|
|
25
|
+
return setBoundedCacheValue(effectAliasesPatternCache, source, effectImportAliases(source).map(escapeRegExp).join('|'));
|
|
26
|
+
}
|
|
27
|
+
function effectCallPattern(source, methods) {
|
|
28
|
+
let sourceCache = effectCallPatternCache.get(source);
|
|
29
|
+
if (sourceCache === undefined) {
|
|
30
|
+
sourceCache = setBoundedCacheValue(effectCallPatternCache, source, new Map());
|
|
31
|
+
}
|
|
32
|
+
const cachedPattern = sourceCache.get(methods);
|
|
33
|
+
if (cachedPattern !== undefined) {
|
|
34
|
+
return cachedPattern;
|
|
35
|
+
}
|
|
36
|
+
const pattern = new RegExp(`\\b(?:${effectAliasesPattern(source)})\\.(?:${methods})\\s*\\(`, 'g');
|
|
37
|
+
sourceCache.set(methods, pattern);
|
|
38
|
+
return pattern;
|
|
39
|
+
}
|
|
40
|
+
function floatingEffectPatterns(aliasPattern) {
|
|
41
|
+
const cachedPatterns = floatingEffectPatternCache.get(aliasPattern);
|
|
42
|
+
if (cachedPatterns !== undefined) {
|
|
43
|
+
return cachedPatterns;
|
|
44
|
+
}
|
|
45
|
+
const runtimeMethods = 'runPromise|runPromiseExit|runSync|runSyncExit|runFork';
|
|
46
|
+
return setBoundedCacheValue(floatingEffectPatternCache, aliasPattern, {
|
|
47
|
+
floatingEffectCall: new RegExp(`^(?:void\\s+)?\\(*\\s*(?:${aliasPattern})\\.(?!(?:${runtimeMethods})\\b)[A-Za-z_$][\\w$]*\\s*\\(`),
|
|
48
|
+
guardedAndEffectCall: new RegExp(`^[A-Za-z_$][\\w$]*(?:\\.[A-Za-z_$][\\w$]*)?\\s*&&\\s*(?:${aliasPattern})\\.(?!(?:${runtimeMethods})\\b)[A-Za-z_$][\\w$]*\\s*\\(`),
|
|
49
|
+
guardedOrEffectCall: new RegExp(`^[A-Za-z_$][\\w$]*(?:\\.[A-Za-z_$][\\w$]*)?\\s*\\|\\|\\s*(?:${aliasPattern})\\.(?!(?:${runtimeMethods})\\b)[A-Za-z_$][\\w$]*\\s*\\(`),
|
|
50
|
+
inlineIfEffectCall: new RegExp(`^if\\s*\\([^)]*\\)\\s*(?:${aliasPattern})\\.(?!(?:${runtimeMethods})\\b)[A-Za-z_$][\\w$]*\\s*\\(`),
|
|
51
|
+
ternaryEffectCall: new RegExp(`\\?\\s*(?:${aliasPattern})\\.(?!(?:${runtimeMethods})\\b)[A-Za-z_$][\\w$]*\\s*\\(`),
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
function hasFloatingEffectCandidateLine(line, aliasNeedles) {
|
|
55
|
+
if (line.includes('.pipe') || line.includes('Schema.decode')) {
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
return aliasNeedles.some((needle) => line.includes(needle));
|
|
59
|
+
}
|
|
60
|
+
function hasRuntimeInEffect(source) {
|
|
61
|
+
return someEffectWorkflowBody(source, (body) => hasRuntimeCall(body));
|
|
62
|
+
}
|
|
63
|
+
function hasNestedFlatMap(source) {
|
|
64
|
+
const code = stripCommentsAndStrings(source);
|
|
65
|
+
return (/Effect\.flatMap\s*\([\s\S]*?=>[\s\S]*?\.pipe\s*\(\s*Effect\.flatMap/s.test(code) ||
|
|
66
|
+
/Effect\.flatMap\s*\([^,]+,\s*(?:\([^)]*\)|[A-Za-z_$][\w$]*)\s*=>[\s\S]*?Effect\.flatMap\s*\(/s.test(code));
|
|
67
|
+
}
|
|
68
|
+
function localCallSegment(source, targetIndex) {
|
|
69
|
+
const openParenIndex = source.indexOf('(', targetIndex);
|
|
70
|
+
if (openParenIndex === -1) {
|
|
71
|
+
return source.slice(targetIndex, findStatementEnd(source, targetIndex) + 1);
|
|
72
|
+
}
|
|
73
|
+
return source.slice(targetIndex, findBalancedCallEnd(source, openParenIndex) + 1);
|
|
74
|
+
}
|
|
75
|
+
function hasUnboundedEffectConcurrency(source) {
|
|
76
|
+
const code = stripCommentsAndStrings(source);
|
|
77
|
+
for (const match of code.matchAll(/\bEffect\.(?:forEach|all)\s*\(/g)) {
|
|
78
|
+
if (/\{[\s\S]*?\bconcurrency\s*:\s*['"]unbounded['"]/.test(stripComments(localCallSegment(source, match.index)))) {
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
function hasUnboundedFlatMapConcurrency(source) {
|
|
85
|
+
const code = stripCommentsAndStrings(source);
|
|
86
|
+
for (const match of code.matchAll(/\bEffect\.flatMap\s*\(/g)) {
|
|
87
|
+
if (/\{[\s\S]*?\bconcurrency\s*:\s*['"]unbounded['"]/.test(stripComments(localCallSegment(source, match.index)))) {
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
function hasParsedJsonNumberFromString(source) {
|
|
94
|
+
const code = stripCommentsAndStrings(source);
|
|
95
|
+
for (const match of code.matchAll(/\bJSON\.parse\s*\(/g)) {
|
|
96
|
+
const statementStart = Math.max(code.lastIndexOf(';', match.index) + 1, code.lastIndexOf('\n', match.index) + 1);
|
|
97
|
+
const statementEnd = findStatementEnd(code, statementStart);
|
|
98
|
+
if (/\b(?:[A-Za-z_$][\w$]*NumberFromString|Schema\.NumberFromString)\b/.test(code.slice(statementStart, statementEnd + 1))) {
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
function hasEffectInArrayForEach(source) {
|
|
105
|
+
const code = stripCommentsAndStrings(source);
|
|
106
|
+
for (const match of code.matchAll(/\b(?!Effect\b)[A-Za-z_$][\w$]*\.forEach\s*\(/g)) {
|
|
107
|
+
const openParenIndex = source.indexOf('(', match.index);
|
|
108
|
+
const callBody = source.slice(openParenIndex + 1, findBalancedCallEnd(source, openParenIndex));
|
|
109
|
+
if (/(?:=>|function\b)[\s\S]*?\bEffect\./.test(stripCommentsAndStrings(callBody))) {
|
|
110
|
+
return true;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
function hasEffectInPromiseCallback(source) {
|
|
116
|
+
const code = stripCommentsAndStrings(source);
|
|
117
|
+
for (const match of code.matchAll(/\.(?:then|catch)\s*\(/g)) {
|
|
118
|
+
const openParenIndex = source.indexOf('(', match.index);
|
|
119
|
+
const callBody = source.slice(openParenIndex + 1, findBalancedCallEnd(source, openParenIndex));
|
|
120
|
+
if (/(?:=>|function\b)[\s\S]*?\bEffect\./.test(stripCommentsAndStrings(callBody))) {
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
function enclosingPipeBody(source, targetIndex) {
|
|
127
|
+
for (const match of source.matchAll(/\.pipe\s*\(/g)) {
|
|
128
|
+
const openParenIndex = source.indexOf('(', match.index);
|
|
129
|
+
if (openParenIndex === -1 || openParenIndex > targetIndex) {
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
const endIndex = findBalancedCallEnd(source, openParenIndex);
|
|
133
|
+
if (targetIndex <= endIndex) {
|
|
134
|
+
return source.slice(openParenIndex + 1, endIndex);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return undefined;
|
|
138
|
+
}
|
|
139
|
+
function effectCallBodies(source, callPattern) {
|
|
140
|
+
const code = stripCommentsAndStrings(source);
|
|
141
|
+
const bodies = [];
|
|
142
|
+
for (const match of code.matchAll(callPattern)) {
|
|
143
|
+
const openParenIndex = source.indexOf('(', match.index);
|
|
144
|
+
if (openParenIndex === -1) {
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
bodies.push(source.slice(openParenIndex + 1, findBalancedCallEnd(source, openParenIndex)));
|
|
148
|
+
}
|
|
149
|
+
return bodies;
|
|
150
|
+
}
|
|
151
|
+
function someEffectWorkflowBody(source, predicate) {
|
|
152
|
+
const code = stripCommentsAndStrings(source);
|
|
153
|
+
for (const match of code.matchAll(effectCallPattern(source, 'gen'))) {
|
|
154
|
+
const openParenIndex = source.indexOf('(', match.index);
|
|
155
|
+
if (openParenIndex === -1) {
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
if (predicate(source.slice(openParenIndex + 1, findBalancedCallEnd(source, openParenIndex)))) {
|
|
159
|
+
return true;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
for (const match of code.matchAll(effectCallPattern(source, 'fn'))) {
|
|
163
|
+
const openParenIndex = source.indexOf('(', match.index);
|
|
164
|
+
if (openParenIndex === -1) {
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
const firstCallEnd = findBalancedCallEnd(source, openParenIndex);
|
|
168
|
+
const nextCallMatch = /^\s*\(/.exec(source.slice(firstCallEnd + 1));
|
|
169
|
+
if (!nextCallMatch) {
|
|
170
|
+
if (predicate(source.slice(openParenIndex + 1, firstCallEnd))) {
|
|
171
|
+
return true;
|
|
172
|
+
}
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
const nextOpenParenIndex = firstCallEnd + 1 + nextCallMatch[0].lastIndexOf('(');
|
|
176
|
+
if (predicate(source.slice(nextOpenParenIndex + 1, findBalancedCallEnd(source, nextOpenParenIndex)))) {
|
|
177
|
+
return true;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
function hasReturnEffectInGen(source) {
|
|
183
|
+
const returnEffectPattern = new RegExp(`\\breturn\\s+(?:${effectAliasesPattern(source)})\\.(?!isEffect\\b|serviceFunction\\b)`);
|
|
184
|
+
return effectCallBodies(source, effectCallPattern(source, 'gen')).some((body) => returnEffectPattern.test(stripCommentsAndStrings(body)));
|
|
185
|
+
}
|
|
186
|
+
function hasYieldWithoutStarInGen(source) {
|
|
187
|
+
const code = stripCommentsAndStrings(source);
|
|
188
|
+
for (const match of code.matchAll(effectCallPattern(source, 'gen'))) {
|
|
189
|
+
const openParenIndex = source.indexOf('(', match.index);
|
|
190
|
+
if (openParenIndex === -1) {
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
const bodyStart = openParenIndex + 1;
|
|
194
|
+
const body = source.slice(bodyStart, findBalancedCallEnd(source, openParenIndex));
|
|
195
|
+
const bodyCode = stripCommentsAndStrings(body);
|
|
196
|
+
const yieldMatch = /(?:^|[^\w$])(yield\s+(?!\*)[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)?)/.exec(bodyCode);
|
|
197
|
+
if (yieldMatch?.index !== undefined) {
|
|
198
|
+
return bodyStart + yieldMatch.index + yieldMatch[0].indexOf(yieldMatch[1]);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return false;
|
|
202
|
+
}
|
|
203
|
+
function hasAsyncAwaitInEffect(source) {
|
|
204
|
+
return someEffectWorkflowBody(source, (body) => /(?:^|[({,]\s*)async\b|\bawait\b/.test(stripCommentsAndStrings(body)));
|
|
205
|
+
}
|
|
206
|
+
function hasSyncForPromise(source) {
|
|
207
|
+
return effectCallBodies(source, effectCallPattern(source, 'sync')).some((body) => {
|
|
208
|
+
const code = stripCommentsAndStrings(body);
|
|
209
|
+
return /^\s*async\b/.test(code) || /\b(?:fetch|Promise\.)\s*\(/.test(code);
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
function hasSyncForThrowingOps(source) {
|
|
213
|
+
return effectCallBodies(source, effectCallPattern(source, 'sync')).some((body) => /\b(?:throw\b|JSON\.parse\s*\()/.test(stripCommentsAndStrings(body)));
|
|
214
|
+
}
|
|
215
|
+
function hasThrowInEffect(source) {
|
|
216
|
+
return someEffectWorkflowBody(source, (body) => /\bthrow\b/.test(stripCommentsAndStrings(body)));
|
|
217
|
+
}
|
|
218
|
+
function hasFloatingEffect(source) {
|
|
219
|
+
const code = stripCommentsAndStrings(source);
|
|
220
|
+
const aliasNeedles = effectImportAliases(source).map((alias) => `${alias}.`);
|
|
221
|
+
const aliases = effectAliasesPattern(source);
|
|
222
|
+
let patterns = undefined;
|
|
223
|
+
let previous = '';
|
|
224
|
+
let lineStart = 0;
|
|
225
|
+
while (lineStart <= code.length) {
|
|
226
|
+
const newlineIndex = code.indexOf('\n', lineStart);
|
|
227
|
+
const lineEnd = newlineIndex === -1 ? code.length : newlineIndex;
|
|
228
|
+
const line = code.slice(lineStart, lineEnd);
|
|
229
|
+
if (!hasFloatingEffectCandidateLine(line, aliasNeedles)) {
|
|
230
|
+
const trimmed = line.trim();
|
|
231
|
+
if (trimmed !== '') {
|
|
232
|
+
previous = trimmed;
|
|
233
|
+
}
|
|
234
|
+
if (newlineIndex === -1) {
|
|
235
|
+
break;
|
|
236
|
+
}
|
|
237
|
+
lineStart = newlineIndex + 1;
|
|
238
|
+
continue;
|
|
239
|
+
}
|
|
240
|
+
const trimmed = line.trim();
|
|
241
|
+
patterns ??= floatingEffectPatterns(aliases);
|
|
242
|
+
if (patterns.floatingEffectCall.test(trimmed) &&
|
|
243
|
+
!/[=(:,[]\s*$/.test(previous) &&
|
|
244
|
+
!previous.endsWith('.pipe(') &&
|
|
245
|
+
!trimmed.endsWith(',')) {
|
|
246
|
+
return true;
|
|
247
|
+
}
|
|
248
|
+
if (/^[A-Za-z_$][\w$]*\.pipe\s*\([\s\S]*?\bEffect\./.test(trimmed) &&
|
|
249
|
+
!/[=(:,[]\s*$/.test(previous)) {
|
|
250
|
+
return true;
|
|
251
|
+
}
|
|
252
|
+
if (/^Schema\.decode[A-Za-z]*\s*\([^)]*\)\s*\([^)]*\)\s*;?$/.test(trimmed)) {
|
|
253
|
+
return true;
|
|
254
|
+
}
|
|
255
|
+
if (patterns.inlineIfEffectCall.test(trimmed)) {
|
|
256
|
+
return true;
|
|
257
|
+
}
|
|
258
|
+
if (patterns.guardedAndEffectCall.test(trimmed)) {
|
|
259
|
+
return true;
|
|
260
|
+
}
|
|
261
|
+
if (patterns.guardedOrEffectCall.test(trimmed)) {
|
|
262
|
+
return true;
|
|
263
|
+
}
|
|
264
|
+
if (patterns.ternaryEffectCall.test(trimmed)) {
|
|
265
|
+
return true;
|
|
266
|
+
}
|
|
267
|
+
if (trimmed !== '') {
|
|
268
|
+
previous = trimmed;
|
|
269
|
+
}
|
|
270
|
+
if (newlineIndex === -1) {
|
|
271
|
+
break;
|
|
272
|
+
}
|
|
273
|
+
lineStart = newlineIndex + 1;
|
|
274
|
+
}
|
|
275
|
+
for (const match of code.matchAll(/^\s*[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)?\.pipe\s*\(/gm)) {
|
|
276
|
+
const statementPrefix = code.slice(code.lastIndexOf(';', match.index) + 1, match.index);
|
|
277
|
+
if (/[=(:,[]\s*$/.test(statementPrefix.trimEnd())) {
|
|
278
|
+
continue;
|
|
279
|
+
}
|
|
280
|
+
const openParenIndex = code.indexOf('(', match.index);
|
|
281
|
+
const pipeCall = code.slice(match.index, findBalancedCallEnd(code, openParenIndex) + 1);
|
|
282
|
+
if (/\bEffect\./.test(pipeCall)) {
|
|
283
|
+
return true;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
return false;
|
|
287
|
+
}
|
|
288
|
+
function isUnobservedForkMatch(source, match) {
|
|
289
|
+
const [, fiberName] = match;
|
|
290
|
+
const lineStart = source.lastIndexOf('\n', match.index) + 1;
|
|
291
|
+
const prefix = source.slice(lineStart, match.index);
|
|
292
|
+
if (!fiberName && /\breturn\s+$/.test(prefix)) {
|
|
293
|
+
return false;
|
|
294
|
+
}
|
|
295
|
+
if (!fiberName) {
|
|
296
|
+
return true;
|
|
297
|
+
}
|
|
298
|
+
const observedFiberPattern = new RegExp(`(?:yield\\*\\s+Fiber\\.(?:join|interrupt)\\s*\\(\\s*${fiberName}\\b|yield\\*\\s+${fiberName}\\.await\\b)`);
|
|
299
|
+
return !observedFiberPattern.test(sameFunctionTail(source, match.index + match[0].length));
|
|
300
|
+
}
|
|
301
|
+
function hasUnobservedFork(source) {
|
|
302
|
+
const code = stripCommentsAndStrings(source);
|
|
303
|
+
const forkPatterns = [
|
|
304
|
+
/\b(?:(?:const|let)\s+([A-Za-z_$][\w$]*)\s*=\s*)?yield\*\s+Effect\.fork\s*\(/g,
|
|
305
|
+
/\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,
|
|
306
|
+
];
|
|
307
|
+
for (const pattern of forkPatterns) {
|
|
308
|
+
for (const match of code.matchAll(pattern)) {
|
|
309
|
+
if (isUnobservedForkMatch(code, match)) {
|
|
310
|
+
return true;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
return (/^\s*Effect\.fork\s*\(/m.test(code) ||
|
|
315
|
+
/^\s*[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)?\.pipe\s*\(\s*Effect\.fork\b/m.test(code));
|
|
316
|
+
}
|
|
317
|
+
function hasRunForkWithoutObserver(source) {
|
|
318
|
+
const code = stripCommentsAndStrings(source);
|
|
319
|
+
const assignedForks = [
|
|
320
|
+
...code.matchAll(/\b(?:const|let)\s+([A-Za-z_$][\w$]*)\s*=\s*Effect\.runFork\s*\(/g),
|
|
321
|
+
];
|
|
322
|
+
for (const [index, match] of assignedForks.entries()) {
|
|
323
|
+
const [, fiberName] = match;
|
|
324
|
+
const nextSameNameFork = assignedForks
|
|
325
|
+
.slice(index + 1)
|
|
326
|
+
.find((nextMatch) => nextMatch[1] === fiberName);
|
|
327
|
+
const localSource = sameFunctionTail(code, match.index).slice(0, nextSameNameFork ? nextSameNameFork.index - match.index : undefined);
|
|
328
|
+
const observedPattern = new RegExp(`\\b${fiberName}\\.addObserver\\b`);
|
|
329
|
+
if (!observedPattern.test(localSource)) {
|
|
330
|
+
return true;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
const unassignedSource = code.replace(/\b(?:const|let)\s+[A-Za-z_$][\w$]*\s*=\s*Effect\.runFork\s*\(/g, '');
|
|
334
|
+
return /Effect\.runFork\s*\(/.test(unassignedSource);
|
|
335
|
+
}
|
|
336
|
+
function hasUnsafeLazyEvaluation(source) {
|
|
337
|
+
const code = stripCommentsAndStrings(source);
|
|
338
|
+
for (const match of code.matchAll(/Effect\.succeed\s*\(\s*(?:Date\.now|Math\.random|new\s+Date|JSON\.parse)\s*\(/g)) {
|
|
339
|
+
if (!isInsideCall(code, match.index, /Effect\.suspend\s*\(/g)) {
|
|
340
|
+
return true;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
return false;
|
|
344
|
+
}
|
|
345
|
+
function hasSchemaSyncDecodeInEffectWorkflow(source) {
|
|
346
|
+
return someEffectWorkflowBody(source, (body) => /Schema\.decode(?:Unknown)?Sync\s*\(/.test(stripCommentsAndStrings(body)));
|
|
347
|
+
}
|
|
348
|
+
function hasSchemaPromiseDecode(source) {
|
|
349
|
+
return /Schema\.decode[A-Za-z]*Promise\s*\(/.test(stripCommentsAndStrings(source));
|
|
350
|
+
}
|
|
351
|
+
function hasTryPromiseWithoutTypedCatch(source) {
|
|
352
|
+
const code = stripCommentsAndStrings(source);
|
|
353
|
+
if (/\bEffect\.tryPromise\s*\(\s*(?:async\s*)?(?:\([^)]*\)|[A-Za-z_$][\w$]*)\s*=>/.test(code)) {
|
|
354
|
+
return true;
|
|
355
|
+
}
|
|
356
|
+
for (const match of code.matchAll(/Effect\.tryPromise\s*\(\s*{/g)) {
|
|
357
|
+
const objectStart = code.indexOf('{', match.index);
|
|
358
|
+
const objectEnd = findMatchingBrace(code, objectStart);
|
|
359
|
+
if (objectEnd === -1) {
|
|
360
|
+
continue;
|
|
361
|
+
}
|
|
362
|
+
const body = code.slice(objectStart + 1, objectEnd);
|
|
363
|
+
if (/\btry\s*:/.test(body) && !/\bcatch\s*:/.test(body)) {
|
|
364
|
+
return true;
|
|
365
|
+
}
|
|
366
|
+
const rawBody = source.slice(objectStart + 1, objectEnd);
|
|
367
|
+
const catchIndex = body.search(/\bcatch\s*:/);
|
|
368
|
+
const catchTail = catchIndex === -1 ? '' : stripComments(rawBody.slice(catchIndex));
|
|
369
|
+
if (/^\s*catch\s*:[\s\S]*?=>\s*(?:new\s+Error\s*\(|['"`])/.test(catchTail) ||
|
|
370
|
+
/^\s*catch\s*:[\s\S]*?=>\s*\(\s*{(?![\s\S]*\b_tag\s*:)/.test(catchTail)) {
|
|
371
|
+
return true;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
return false;
|
|
375
|
+
}
|
|
376
|
+
function hasExternalJsonWithoutDecodeUnknown(source) {
|
|
377
|
+
const code = stripCommentsAndStrings(source);
|
|
378
|
+
for (const match of code.matchAll(/\b(?:response|res)\.json\s*\(\s*\)/g)) {
|
|
379
|
+
const callSegment = localCallSegment(code, match.index);
|
|
380
|
+
if (!isInsideCall(code, match.index, /Schema\.decodeUnknown\s*\(/g) &&
|
|
381
|
+
!/Schema\.decodeUnknown/.test(callSegment)) {
|
|
382
|
+
return true;
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
return false;
|
|
386
|
+
}
|
|
387
|
+
function hasCastAfterSchemaDecode(source) {
|
|
388
|
+
const code = stripCommentsAndStrings(source);
|
|
389
|
+
for (const match of code.matchAll(/Schema\.decode[A-Za-z]*\s*\(/g)) {
|
|
390
|
+
const lineStart = Math.max(code.lastIndexOf(';', match.index) + 1, code.lastIndexOf('\n', match.index) + 1);
|
|
391
|
+
const line = code.slice(lineStart, code.indexOf('\n', match.index) === -1 ? code.length : code.indexOf('\n', match.index));
|
|
392
|
+
const bindingName = /\b(?:const|let|var)\s+([A-Za-z_$][\w$]*)\s*=/.exec(line)?.[1];
|
|
393
|
+
if (/Schema\.decode[A-Za-z]*\s*\([^)]*\)\s*\([^)]*\)\s+as\s+[A-Za-z_$][\w$]*/.test(line)) {
|
|
394
|
+
return true;
|
|
395
|
+
}
|
|
396
|
+
if (bindingName) {
|
|
397
|
+
const tail = code.slice(match.index + match[0].length, match.index + match[0].length + 240);
|
|
398
|
+
if (new RegExp(`\\b${bindingName}\\s+as\\s+[A-Za-z_$][\\w$]*`).test(tail)) {
|
|
399
|
+
return true;
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
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)) {
|
|
404
|
+
const [, bindingName] = match;
|
|
405
|
+
const tail = code.slice(match.index + match[0].length, match.index + match[0].length + 240);
|
|
406
|
+
if (new RegExp(`\\b${bindingName}\\s+as\\s+[A-Za-z_$][\\w$]*`).test(tail)) {
|
|
407
|
+
return true;
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
return false;
|
|
411
|
+
}
|
|
412
|
+
function hasUnhandledSchemaEffectDecode(source) {
|
|
413
|
+
const code = stripCommentsAndStrings(source);
|
|
414
|
+
for (const match of code.matchAll(/\b(?:const|let|var)\s+([A-Za-z_$][\w$]*)\s*=\s*Schema\.decodeUnknown\s*\([^)]*\)\s*\([^)]*\)/g)) {
|
|
415
|
+
const [, bindingName] = match;
|
|
416
|
+
const tail = code.slice(match.index + match[0].length);
|
|
417
|
+
const handledPattern = new RegExp(`(?:yield\\*\\s+${bindingName}\\b|return\\s+${bindingName}\\b)`);
|
|
418
|
+
if (!handledPattern.test(tail)) {
|
|
419
|
+
return true;
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
return /Schema\.decodeUnknown\s*\([^)]*\)\s*\([^)]*\)\.pipe\s*\(\s*Effect\.(?:orDie|ignore)\b/.test(code);
|
|
423
|
+
}
|
|
424
|
+
function hasJsonParsedBeforeSchemaStringDecode(source) {
|
|
425
|
+
return /Schema\.decode[A-Za-z]*\s*\((?![^)]*Schema\.parseJson)[\s\S]*?\)\s*\(\s*JSON\.parse\s*\(/.test(stripCommentsAndStrings(source));
|
|
426
|
+
}
|
|
427
|
+
function hasUnsafeRecursiveBody(name, body) {
|
|
428
|
+
const code = stripCommentsAndStrings(body);
|
|
429
|
+
if (!/\bEffect\.(?:flatMap|forEach|gen)\b/.test(code)) {
|
|
430
|
+
return false;
|
|
431
|
+
}
|
|
432
|
+
const recursiveCallPattern = new RegExp(`\\b${name}\\s*\\(`, 'g');
|
|
433
|
+
for (const match of code.matchAll(recursiveCallPattern)) {
|
|
434
|
+
if (!isInsideCall(code, match.index, /Effect\.suspend\s*\(/g)) {
|
|
435
|
+
return true;
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
return false;
|
|
439
|
+
}
|
|
440
|
+
function hasRecursiveEffectWithoutSuspend(source) {
|
|
441
|
+
for (const match of source.matchAll(/\bfunction\s+([A-Za-z_$][\w$]*)\s*\([^)]*\)\s*{/g)) {
|
|
442
|
+
const [, name] = match;
|
|
443
|
+
const bodyStart = source.indexOf('{', match.index);
|
|
444
|
+
const bodyEnd = findMatchingBrace(source, bodyStart);
|
|
445
|
+
if (bodyEnd !== -1 && hasUnsafeRecursiveBody(name, source.slice(bodyStart + 1, bodyEnd))) {
|
|
446
|
+
return true;
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
for (const match of source.matchAll(/\bconst\s+([A-Za-z_$][\w$]*)\s*=\s*(?:\([^)]*\)|[A-Za-z_$][\w$]*)\s*=>\s*/g)) {
|
|
450
|
+
const [, name] = match;
|
|
451
|
+
const bodyStart = match.index + match[0].length;
|
|
452
|
+
const expressionEnd = source.indexOf(';', bodyStart);
|
|
453
|
+
const body = source[bodyStart] === '{'
|
|
454
|
+
? source.slice(bodyStart + 1, findMatchingBrace(source, bodyStart))
|
|
455
|
+
: source.slice(bodyStart, expressionEnd === -1 ? source.length : expressionEnd);
|
|
456
|
+
if (hasUnsafeRecursiveBody(name, body)) {
|
|
457
|
+
return true;
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
return false;
|
|
461
|
+
}
|
|
462
|
+
function hasUnloggedIgnore(source) {
|
|
463
|
+
for (const match of source.matchAll(/\bEffect\.ignore\b/g)) {
|
|
464
|
+
const pipeBody = enclosingPipeBody(source, match.index);
|
|
465
|
+
const localPrefix = pipeBody
|
|
466
|
+
? pipeBody.slice(0, Math.max(0, match.index - source.indexOf(pipeBody)))
|
|
467
|
+
: source.slice(Math.max(0, match.index - 160), match.index);
|
|
468
|
+
if (!/\b(?:Effect\.log|tapError|tapBoth|catchAll)\b/.test(localPrefix)) {
|
|
469
|
+
return true;
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
return false;
|
|
473
|
+
}
|
|
474
|
+
function hasMultipleCatchTagsInOnePipe(source) {
|
|
475
|
+
const code = stripCommentsAndStrings(source);
|
|
476
|
+
for (const match of code.matchAll(/\.pipe\s*\(/g)) {
|
|
477
|
+
const openParenIndex = source.indexOf('(', match.index);
|
|
478
|
+
if (openParenIndex === -1) {
|
|
479
|
+
continue;
|
|
480
|
+
}
|
|
481
|
+
const pipeBody = source.slice(match.index, findBalancedCallEnd(source, openParenIndex) + 1);
|
|
482
|
+
const catchTagCount = [...pipeBody.matchAll(/Effect\.catchTag\s*\(/g)].length;
|
|
483
|
+
if (catchTagCount > 1 && !/Effect\.catchTags\s*\(/.test(pipeBody)) {
|
|
484
|
+
return true;
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
return false;
|
|
488
|
+
}
|
|
489
|
+
function hasBroadCatchAllWithoutRethrow(source) {
|
|
490
|
+
const code = stripCommentsAndStrings(source);
|
|
491
|
+
for (const match of code.matchAll(/Effect\.catchAll\s*\(/g)) {
|
|
492
|
+
const openParenIndex = source.indexOf('(', match.index);
|
|
493
|
+
if (openParenIndex === -1) {
|
|
494
|
+
continue;
|
|
495
|
+
}
|
|
496
|
+
const callBody = source.slice(openParenIndex + 1, findBalancedCallEnd(source, openParenIndex));
|
|
497
|
+
if (!/=>\s*Effect\.fail\s*\(/.test(callBody)) {
|
|
498
|
+
return true;
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
return false;
|
|
502
|
+
}
|
|
503
|
+
function hasErrorMappingWithoutCause(source) {
|
|
504
|
+
const code = stripCommentsAndStrings(source);
|
|
505
|
+
for (const match of code.matchAll(/(?:mapError|catchAll)\s*\(/g)) {
|
|
506
|
+
const openParenIndex = source.indexOf('(', match.index);
|
|
507
|
+
if (openParenIndex === -1) {
|
|
508
|
+
continue;
|
|
509
|
+
}
|
|
510
|
+
const callBody = source.slice(openParenIndex + 1, findBalancedCallEnd(source, openParenIndex));
|
|
511
|
+
for (const errorMatch of callBody.matchAll(/new\s+[A-Z][\w$]*Error\s*\(/g)) {
|
|
512
|
+
const errorOpenParenIndex = callBody.indexOf('(', errorMatch.index);
|
|
513
|
+
const errorArgs = callBody.slice(errorOpenParenIndex + 1, findBalancedCallEnd(callBody, errorOpenParenIndex));
|
|
514
|
+
if (!/\bcause\b/.test(errorArgs)) {
|
|
515
|
+
return true;
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
return false;
|
|
520
|
+
}
|
|
521
|
+
function hasForkDaemonWithoutCleanup(source) {
|
|
522
|
+
return effectCallBodies(source, /\bEffect\.forkDaemon\s*\(/g).some((body) => !/\b(?:Effect\.)?(?:ensuring|onExit|onInterrupt|supervised)\b|Supervisor\./.test(body));
|
|
523
|
+
}
|
|
524
|
+
function hasForkInUninterruptibleWithoutRestore(source) {
|
|
525
|
+
const code = stripCommentsAndStrings(source);
|
|
526
|
+
for (const match of code.matchAll(/\bEffect\.uninterruptible\s*\(/g)) {
|
|
527
|
+
const openParenIndex = source.indexOf('(', match.index);
|
|
528
|
+
const callBody = source.slice(openParenIndex + 1, findBalancedCallEnd(source, openParenIndex));
|
|
529
|
+
if (/\bEffect\.fork\b/.test(callBody) && !/\brestore\s*\(/.test(callBody)) {
|
|
530
|
+
return true;
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
return false;
|
|
534
|
+
}
|
|
535
|
+
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, };
|
|
536
|
+
//# 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
|