@thethracian/oxlint-config 0.3.0 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -0
- package/dist/codemods/arrow-body-style.d.ts.map +1 -1
- package/dist/codemods/arrow-body-style.js +29 -68
- package/dist/codemods/arrow-body-style.js.map +1 -1
- package/dist/codemods/comment-format.d.ts.map +1 -1
- package/dist/codemods/comment-format.js +22 -32
- package/dist/codemods/comment-format.js.map +1 -1
- package/dist/codemods/explicit-return-types.d.ts.map +1 -1
- package/dist/codemods/explicit-return-types.js +58 -167
- package/dist/codemods/explicit-return-types.js.map +1 -1
- package/dist/codemods/format-file-header.d.ts.map +1 -1
- package/dist/codemods/format-file-header.js +33 -72
- package/dist/codemods/format-file-header.js.map +1 -1
- package/dist/codemods/format-jsdoc-comments.d.ts.map +1 -1
- package/dist/codemods/format-jsdoc-comments.js +58 -66
- package/dist/codemods/format-jsdoc-comments.js.map +1 -1
- package/dist/codemods/function-declarations.d.ts.map +1 -1
- package/dist/codemods/function-declarations.js +45 -80
- package/dist/codemods/function-declarations.js.map +1 -1
- package/dist/codemods/inline-export-lists.d.ts.map +1 -1
- package/dist/codemods/inline-export-lists.js +60 -108
- package/dist/codemods/inline-export-lists.js.map +1 -1
- package/dist/codemods/internal-export-docs.d.ts.map +1 -1
- package/dist/codemods/internal-export-docs.js +21 -59
- package/dist/codemods/internal-export-docs.js.map +1 -1
- package/dist/codemods/no-ternary-branch-initializers.d.ts.map +1 -1
- package/dist/codemods/no-ternary-branch-initializers.js +72 -144
- package/dist/codemods/no-ternary-branch-initializers.js.map +1 -1
- package/dist/codemods/no-ternary-variable-initializers.d.ts.map +1 -1
- package/dist/codemods/no-ternary-variable-initializers.js +69 -152
- package/dist/codemods/no-ternary-variable-initializers.js.map +1 -1
- package/dist/codemods/no-ternary.d.ts.map +1 -1
- package/dist/codemods/no-ternary.js +44 -108
- package/dist/codemods/no-ternary.js.map +1 -1
- package/dist/codemods/rename-acronyms.d.ts.map +1 -1
- package/dist/codemods/rename-acronyms.js +73 -99
- package/dist/codemods/rename-acronyms.js.map +1 -1
- package/dist/codemods/run.d.ts.map +1 -1
- package/dist/codemods/run.js +15 -7
- package/dist/codemods/run.js.map +1 -1
- package/dist/codemods/sort-imports.d.ts.map +1 -1
- package/dist/codemods/sort-imports.js +52 -94
- package/dist/codemods/sort-imports.js.map +1 -1
- package/dist/rules/acronym-case.d.ts.map +1 -1
- package/dist/rules/acronym-case.js +68 -141
- package/dist/rules/acronym-case.js.map +1 -1
- package/dist/rules/acronyms-1.d.ts +1 -1
- package/dist/rules/acronyms-1.d.ts.map +1 -1
- package/dist/rules/acronyms-1.js +2 -402
- package/dist/rules/acronyms-1.js.map +1 -1
- package/dist/rules/acronyms-2.d.ts +1 -1
- package/dist/rules/acronyms-2.d.ts.map +1 -1
- package/dist/rules/acronyms-2.js +2 -402
- package/dist/rules/acronyms-2.js.map +1 -1
- package/dist/rules/acronyms-3.d.ts +1 -1
- package/dist/rules/acronyms-3.d.ts.map +1 -1
- package/dist/rules/acronyms-3.js +2 -402
- package/dist/rules/acronyms-3.js.map +1 -1
- package/dist/rules/acronyms-4.d.ts +1 -1
- package/dist/rules/acronyms-4.d.ts.map +1 -1
- package/dist/rules/acronyms-4.js +2 -372
- package/dist/rules/acronyms-4.js.map +1 -1
- package/dist/rules/acronyms.d.ts.map +1 -1
- package/dist/rules/acronyms.js +3 -6
- package/dist/rules/acronyms.js.map +1 -1
- package/dist/rules/boolean-prefix.d.ts.map +1 -1
- package/dist/rules/boolean-prefix.js +25 -71
- package/dist/rules/boolean-prefix.js.map +1 -1
- package/dist/rules/camel-case-identifiers.d.ts.map +1 -1
- package/dist/rules/camel-case-identifiers.js +15 -54
- package/dist/rules/camel-case-identifiers.js.map +1 -1
- package/dist/rules/char-class.d.ts +1 -1
- package/dist/rules/char-class.d.ts.map +1 -1
- package/dist/rules/char-class.js +16 -16
- package/dist/rules/char-class.js.map +1 -1
- package/dist/rules/diagnostic-guidance.d.ts.map +1 -1
- package/dist/rules/diagnostic-guidance.js +11 -20
- package/dist/rules/diagnostic-guidance.js.map +1 -1
- package/dist/rules/effect-default-ast.d.ts.map +1 -1
- package/dist/rules/effect-default-ast.js +35 -116
- package/dist/rules/effect-default-ast.js.map +1 -1
- package/dist/rules/effect-default-compat-rules.d.ts.map +1 -1
- package/dist/rules/effect-default-compat-rules.js +41 -79
- package/dist/rules/effect-default-compat-rules.js.map +1 -1
- package/dist/rules/effect-default-env-rules.d.ts.map +1 -1
- package/dist/rules/effect-default-env-rules.js +23 -29
- package/dist/rules/effect-default-env-rules.js.map +1 -1
- package/dist/rules/effect-default-fiber-helpers.d.ts.map +1 -1
- package/dist/rules/effect-default-fiber-helpers.js +12 -26
- package/dist/rules/effect-default-fiber-helpers.js.map +1 -1
- package/dist/rules/effect-default-floating-helpers.d.ts.map +1 -1
- package/dist/rules/effect-default-floating-helpers.js +59 -67
- package/dist/rules/effect-default-floating-helpers.js.map +1 -1
- package/dist/rules/effect-default-resource-helpers.d.ts.map +1 -1
- package/dist/rules/effect-default-resource-helpers.js +36 -44
- package/dist/rules/effect-default-resource-helpers.js.map +1 -1
- package/dist/rules/effect-default-safety-helpers.d.ts.map +1 -1
- package/dist/rules/effect-default-safety-helpers.js +29 -68
- package/dist/rules/effect-default-safety-helpers.js.map +1 -1
- package/dist/rules/effect-default-scan-helpers.d.ts.map +1 -1
- package/dist/rules/effect-default-scan-helpers.js +51 -70
- package/dist/rules/effect-default-scan-helpers.js.map +1 -1
- package/dist/rules/effect-default-schema-helpers.d.ts.map +1 -1
- package/dist/rules/effect-default-schema-helpers.js +32 -43
- package/dist/rules/effect-default-schema-helpers.js.map +1 -1
- package/dist/rules/effect-default-test-helpers.d.ts.map +1 -1
- package/dist/rules/effect-default-test-helpers.js +13 -25
- package/dist/rules/effect-default-test-helpers.js.map +1 -1
- package/dist/rules/effect-default-workflow-helpers.d.ts.map +1 -1
- package/dist/rules/effect-default-workflow-helpers.js +53 -113
- package/dist/rules/effect-default-workflow-helpers.js.map +1 -1
- package/dist/rules/effect-exported-declarations.d.ts.map +1 -1
- package/dist/rules/effect-exported-declarations.js +90 -177
- package/dist/rules/effect-exported-declarations.js.map +1 -1
- package/dist/rules/effect-path-options.d.ts.map +1 -1
- package/dist/rules/effect-path-options.js +48 -58
- package/dist/rules/effect-path-options.js.map +1 -1
- package/dist/rules/effect-rule-aliases.d.ts.map +1 -1
- package/dist/rules/effect-rule-aliases.js +43 -101
- package/dist/rules/effect-rule-aliases.js.map +1 -1
- package/dist/rules/effect-rule-core.d.ts.map +1 -1
- package/dist/rules/effect-rule-core.js +42 -78
- package/dist/rules/effect-rule-core.js.map +1 -1
- package/dist/rules/effect-rule-names.d.ts +2 -2
- package/dist/rules/effect-rule-names.d.ts.map +1 -1
- package/dist/rules/effect-rule-names.js +3 -145
- package/dist/rules/effect-rule-names.js.map +1 -1
- package/dist/rules/effect-source-comments.d.ts.map +1 -1
- package/dist/rules/effect-source-comments.js +112 -167
- package/dist/rules/effect-source-comments.js.map +1 -1
- package/dist/rules/effect-source-navigation.d.ts.map +1 -1
- package/dist/rules/effect-source-navigation.js +103 -185
- package/dist/rules/effect-source-navigation.js.map +1 -1
- package/dist/rules/effect-source-regex-scan.d.ts +13 -0
- package/dist/rules/effect-source-regex-scan.d.ts.map +1 -0
- package/dist/rules/effect-source-regex-scan.js +126 -0
- package/dist/rules/effect-source-regex-scan.js.map +1 -0
- package/dist/rules/effect-source-scan.d.ts +1 -12
- package/dist/rules/effect-source-scan.d.ts.map +1 -1
- package/dist/rules/effect-source-scan.js +93 -239
- package/dist/rules/effect-source-scan.js.map +1 -1
- package/dist/rules/effect-strict-ast-specs.d.ts.map +1 -1
- package/dist/rules/effect-strict-ast-specs.js +11 -8
- package/dist/rules/effect-strict-ast-specs.js.map +1 -1
- package/dist/rules/effect-strict-boundary-helpers.d.ts.map +1 -1
- package/dist/rules/effect-strict-boundary-helpers.js +51 -87
- package/dist/rules/effect-strict-boundary-helpers.js.map +1 -1
- package/dist/rules/effect-strict-core-specs.d.ts.map +1 -1
- package/dist/rules/effect-strict-core-specs.js +8 -6
- package/dist/rules/effect-strict-core-specs.js.map +1 -1
- package/dist/rules/effect-strict-external-helpers.d.ts.map +1 -1
- package/dist/rules/effect-strict-external-helpers.js +20 -40
- package/dist/rules/effect-strict-external-helpers.js.map +1 -1
- package/dist/rules/effect-strict-helpers.d.ts.map +1 -1
- package/dist/rules/effect-strict-helpers.js +47 -72
- package/dist/rules/effect-strict-helpers.js.map +1 -1
- package/dist/rules/effect-strict-internals.d.ts.map +1 -1
- package/dist/rules/effect-strict-internals.js +46 -101
- package/dist/rules/effect-strict-internals.js.map +1 -1
- package/dist/rules/effect-strict-segment-helpers.d.ts.map +1 -1
- package/dist/rules/effect-strict-segment-helpers.js +103 -174
- package/dist/rules/effect-strict-segment-helpers.js.map +1 -1
- package/dist/rules/effect-strict.d.ts.map +1 -1
- package/dist/rules/effect-strict.js +3 -2
- package/dist/rules/effect-strict.js.map +1 -1
- package/dist/rules/max-import-depth.d.ts +2 -1
- package/dist/rules/max-import-depth.d.ts.map +1 -1
- package/dist/rules/max-import-depth.js +13 -15
- package/dist/rules/max-import-depth.js.map +1 -1
- package/dist/rules/max-line-length.d.ts.map +1 -1
- package/dist/rules/max-line-length.js +26 -39
- package/dist/rules/max-line-length.js.map +1 -1
- package/dist/rules/no-commented-out-code.d.ts.map +1 -1
- package/dist/rules/no-commented-out-code.js +53 -156
- package/dist/rules/no-commented-out-code.js.map +1 -1
- package/dist/rules/pascal-case-types.d.ts.map +1 -1
- package/dist/rules/pascal-case-types.js +16 -70
- package/dist/rules/pascal-case-types.js.map +1 -1
- package/dist/rules/plugin-commented-out-code-rule.d.ts.map +1 -1
- package/dist/rules/plugin-commented-out-code-rule.js +50 -77
- package/dist/rules/plugin-commented-out-code-rule.js.map +1 -1
- package/dist/rules/plugin.d.ts +5 -1
- package/dist/rules/plugin.d.ts.map +1 -1
- package/dist/rules/plugin.js +19 -36
- package/dist/rules/plugin.js.map +1 -1
- package/dist/rules/private-underscore.d.ts +3 -1
- package/dist/rules/private-underscore.d.ts.map +1 -1
- package/dist/rules/private-underscore.js +7 -9
- package/dist/rules/private-underscore.js.map +1 -1
- package/dist/rules/require-file-doc.d.ts.map +1 -1
- package/dist/rules/require-file-doc.js +28 -94
- package/dist/rules/require-file-doc.js.map +1 -1
- package/dist/rules/require-function-doc-ignored-text.d.ts.map +1 -1
- package/dist/rules/require-function-doc-ignored-text.js +6 -9
- package/dist/rules/require-function-doc-ignored-text.js.map +1 -1
- package/dist/rules/require-function-doc-local-exports.d.ts.map +1 -1
- package/dist/rules/require-function-doc-local-exports.js +16 -58
- package/dist/rules/require-function-doc-local-exports.js.map +1 -1
- package/dist/rules/require-function-doc.d.ts.map +1 -1
- package/dist/rules/require-function-doc.js +87 -196
- package/dist/rules/require-function-doc.js.map +1 -1
- package/dist/rules/source-cache.d.ts.map +1 -1
- package/dist/rules/source-cache.js +23 -33
- package/dist/rules/source-cache.js.map +1 -1
- package/package.json +3 -1
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/* -------------------------------------------------------------------------- */
|
|
2
2
|
/* Helper predicates for opt-in strict Effect lint rules. */
|
|
3
3
|
/* -------------------------------------------------------------------------- */
|
|
4
|
+
import { Array, String, pipe } from 'effect';
|
|
4
5
|
import { findStatementEnd, stripCommentsAndStrings } from './effect-source-helpers.js';
|
|
5
6
|
import { lineAround, localEffectCallSegment, localStatementSegment, testSegments, } from './effect-strict-segment-helpers.js';
|
|
6
7
|
import { hasEffectSignal } from './effect-rule-core.js';
|
|
@@ -8,24 +9,23 @@ export { hasBoundaryDataWithoutSchema, hasCommandHandlerWithoutSchema, hasHTTPSe
|
|
|
8
9
|
export { hasExternalEffectWithoutSpan, hasExternalEffectWithoutTimeout, hasIdempotentExternalEffectWithoutRetry, } from './effect-strict-external-helpers.js';
|
|
9
10
|
export { hasDuplicateLayerInstance, hasLayerFactory, hasLiveTestService, hasRealTestService, hasUnscopedResourceLayer, hasUnscopedResourceLoop, hasUnsafeResourceStream, } from './effect-strict-segment-helpers.js';
|
|
10
11
|
const RESOURCE_CONTEXT_WINDOW = 180;
|
|
12
|
+
const sourceIncludes = (needle) => (source) => pipe(source, String.includes(needle));
|
|
13
|
+
const matchesIn = (source, pattern) => pipe(source.matchAll(pattern), Array.fromIterable);
|
|
11
14
|
/**
|
|
12
15
|
* Internal helper exported for package-local composition.
|
|
13
16
|
*
|
|
14
17
|
* @internal
|
|
15
18
|
*/
|
|
16
19
|
export const hasOutputBoundaryWithoutSchema = (source) => {
|
|
17
|
-
if (!
|
|
20
|
+
if (!sourceIncludes('Response.json')(source) && !sourceIncludes('return json')(source)) {
|
|
18
21
|
return false;
|
|
19
22
|
}
|
|
20
23
|
const code = stripCommentsAndStrings(source);
|
|
21
|
-
|
|
24
|
+
return pipe(matchesIn(code, /\breturn\s+(?:Response\.json|json)\s*\(/g), Array.some((match) => {
|
|
22
25
|
const callOffset = match[0].search(/(?:Response\.json|json)\s*\(/);
|
|
23
26
|
const segment = localEffectCallSegment(source, match.index + callOffset);
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
return false;
|
|
27
|
+
return !/Schema\.(?:encode|decode)/.test(segment);
|
|
28
|
+
}));
|
|
29
29
|
};
|
|
30
30
|
/**
|
|
31
31
|
* Internal helper exported for package-local composition.
|
|
@@ -33,17 +33,14 @@ export const hasOutputBoundaryWithoutSchema = (source) => {
|
|
|
33
33
|
* @internal
|
|
34
34
|
*/
|
|
35
35
|
export const hasHTTPClientResponseWithoutSchema = (source) => {
|
|
36
|
-
if (!
|
|
36
|
+
if (!sourceIncludes('HttpClient.')(source) || !sourceIncludes('response.json')(source)) {
|
|
37
37
|
return false;
|
|
38
38
|
}
|
|
39
39
|
const code = stripCommentsAndStrings(source);
|
|
40
|
-
|
|
40
|
+
return pipe(matchesIn(code, /\bHttpClient\.[\s\S]*?\bresponse\.json\s*\(/g), Array.some((match) => {
|
|
41
41
|
const segment = localStatementSegment(source, match.index);
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
return false;
|
|
42
|
+
return !/Schema\.decode/.test(segment);
|
|
43
|
+
}));
|
|
47
44
|
};
|
|
48
45
|
/**
|
|
49
46
|
* Internal helper exported for package-local composition.
|
|
@@ -51,19 +48,16 @@ export const hasHTTPClientResponseWithoutSchema = (source) => {
|
|
|
51
48
|
* @internal
|
|
52
49
|
*/
|
|
53
50
|
export const hasSharedResourceForEachWithoutSemaphore = (source) => {
|
|
54
|
-
if (!
|
|
51
|
+
if (!sourceIncludes('Effect.forEach')(source)) {
|
|
55
52
|
return false;
|
|
56
53
|
}
|
|
57
54
|
const code = stripCommentsAndStrings(source);
|
|
58
|
-
|
|
55
|
+
return pipe(matchesIn(code, /\bEffect\.forEach\s*\(/g), Array.some((match) => {
|
|
59
56
|
const localStart = Math.max(0, match.index - RESOURCE_CONTEXT_WINDOW);
|
|
60
57
|
const segment = code.slice(localStart, findStatementEnd(code, match.index) + 1);
|
|
61
|
-
|
|
62
|
-
!/\bSemaphore\b/.test(segment))
|
|
63
|
-
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
return false;
|
|
58
|
+
return (/\b(?:pool|connection|client|browser|worker)\b/.test(segment) &&
|
|
59
|
+
!/\bSemaphore\b/.test(segment));
|
|
60
|
+
}));
|
|
67
61
|
};
|
|
68
62
|
/**
|
|
69
63
|
* Internal helper exported for package-local composition.
|
|
@@ -71,17 +65,14 @@ export const hasSharedResourceForEachWithoutSemaphore = (source) => {
|
|
|
71
65
|
* @internal
|
|
72
66
|
*/
|
|
73
67
|
export const hasEnsuringCleanupWithoutOnExit = (source) => {
|
|
74
|
-
if (!
|
|
68
|
+
if (!sourceIncludes('Effect.ensuring')(source) || !sourceIncludes('cleanup')(source)) {
|
|
75
69
|
return false;
|
|
76
70
|
}
|
|
77
71
|
const code = stripCommentsAndStrings(source);
|
|
78
|
-
|
|
72
|
+
return pipe(matchesIn(code, /\bEffect\.ensuring\s*\(/g), Array.some((match) => {
|
|
79
73
|
const segment = localEffectCallSegment(source, match.index);
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
return false;
|
|
74
|
+
return /\bcleanup\b/.test(segment) && !/\bonExit\b/.test(segment);
|
|
75
|
+
}));
|
|
85
76
|
};
|
|
86
77
|
/**
|
|
87
78
|
* Internal helper exported for package-local composition.
|
|
@@ -89,17 +80,14 @@ export const hasEnsuringCleanupWithoutOnExit = (source) => {
|
|
|
89
80
|
* @internal
|
|
90
81
|
*/
|
|
91
82
|
export const hasUnterminatedLongRunningStream = (source) => {
|
|
92
|
-
if (!
|
|
83
|
+
if (!sourceIncludes('Stream.')(source)) {
|
|
93
84
|
return false;
|
|
94
85
|
}
|
|
95
86
|
const code = stripCommentsAndStrings(source);
|
|
96
|
-
|
|
87
|
+
return pipe(matchesIn(code, /\bStream\.(?:repeat|forever|async|fromQueue)\s*\(/g), Array.some((match) => {
|
|
97
88
|
const segment = localEffectCallSegment(source, match.index);
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
return false;
|
|
89
|
+
return !/\b(?:takeUntil|interruptWhen|timeout)\b/.test(segment);
|
|
90
|
+
}));
|
|
103
91
|
};
|
|
104
92
|
/**
|
|
105
93
|
* Internal helper exported for package-local composition.
|
|
@@ -107,17 +95,14 @@ export const hasUnterminatedLongRunningStream = (source) => {
|
|
|
107
95
|
* @internal
|
|
108
96
|
*/
|
|
109
97
|
export const hasAsyncPushWithoutBuffer = (source) => {
|
|
110
|
-
if (!
|
|
98
|
+
if (!sourceIncludes('Stream.asyncPush')(source)) {
|
|
111
99
|
return false;
|
|
112
100
|
}
|
|
113
101
|
const code = stripCommentsAndStrings(source);
|
|
114
|
-
|
|
102
|
+
return pipe(matchesIn(code, /\bStream\.asyncPush\s*\(/g), Array.some((match) => {
|
|
115
103
|
const segment = localEffectCallSegment(source, match.index);
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
return false;
|
|
104
|
+
return !/\b(?:buffer|Queue\.bounded|Queue\.sliding)\b/.test(segment);
|
|
105
|
+
}));
|
|
121
106
|
};
|
|
122
107
|
/**
|
|
123
108
|
* Internal helper exported for package-local composition.
|
|
@@ -125,17 +110,14 @@ export const hasAsyncPushWithoutBuffer = (source) => {
|
|
|
125
110
|
* @internal
|
|
126
111
|
*/
|
|
127
112
|
export const hasUnbatchedResolver = (source) => {
|
|
128
|
-
if (!
|
|
113
|
+
if (!sourceIncludes('RequestResolver.make')(source)) {
|
|
129
114
|
return false;
|
|
130
115
|
}
|
|
131
116
|
const code = stripCommentsAndStrings(source);
|
|
132
|
-
|
|
117
|
+
return pipe(matchesIn(code, /\bRequestResolver\.make\s*\(/g), Array.some((match) => {
|
|
133
118
|
const segment = localEffectCallSegment(source, match.index);
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
return false;
|
|
119
|
+
return !/\b(?:makeBatched|batchN|grouped)\b/.test(segment);
|
|
120
|
+
}));
|
|
139
121
|
};
|
|
140
122
|
/**
|
|
141
123
|
* Internal helper exported for package-local composition.
|
|
@@ -143,18 +125,14 @@ export const hasUnbatchedResolver = (source) => {
|
|
|
143
125
|
* @internal
|
|
144
126
|
*/
|
|
145
127
|
export const hasNPlusOneWithoutBatchedResolver = (source) => {
|
|
146
|
-
if (!
|
|
128
|
+
if (!sourceIncludes('Effect.forEach')(source)) {
|
|
147
129
|
return false;
|
|
148
130
|
}
|
|
149
131
|
const code = stripCommentsAndStrings(source);
|
|
150
|
-
|
|
132
|
+
return pipe(matchesIn(code, /\bEffect\.forEach\s*\(/g), Array.some((match) => {
|
|
151
133
|
const segment = localEffectCallSegment(source, match.index);
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
return true;
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
return false;
|
|
134
|
+
return (/\b(?:findById|getById|loadById)\s*\(/.test(segment) && !/\bRequestResolver\b/.test(segment));
|
|
135
|
+
}));
|
|
158
136
|
};
|
|
159
137
|
/**
|
|
160
138
|
* Internal helper exported for package-local composition.
|
|
@@ -162,11 +140,13 @@ export const hasNPlusOneWithoutBatchedResolver = (source) => {
|
|
|
162
140
|
* @internal
|
|
163
141
|
*/
|
|
164
142
|
export const hasUnprovidedServiceInEffectTest = (source) => {
|
|
165
|
-
if (!
|
|
143
|
+
if (!sourceIncludes('Service')(source) &&
|
|
144
|
+
!sourceIncludes('Repo')(source) &&
|
|
145
|
+
!sourceIncludes('Client')(source)) {
|
|
166
146
|
return false;
|
|
167
147
|
}
|
|
168
|
-
return testSegments(source).some((segment) => /yield\*\s+[A-Z][\w$]*(?:Service|Repo|Client)\b/.test(segment) &&
|
|
169
|
-
!/\b(?:Effect\.)?provide[A-Za-z_$]*\s*\(/.test(segment));
|
|
148
|
+
return pipe(testSegments(source), Array.some((segment) => /yield\*\s+[A-Z][\w$]*(?:Service|Repo|Client)\b/.test(segment) &&
|
|
149
|
+
!/\b(?:Effect\.)?provide[A-Za-z_$]*\s*\(/.test(segment)));
|
|
170
150
|
};
|
|
171
151
|
/**
|
|
172
152
|
* Internal helper exported for package-local composition.
|
|
@@ -174,12 +154,12 @@ export const hasUnprovidedServiceInEffectTest = (source) => {
|
|
|
174
154
|
* @internal
|
|
175
155
|
*/
|
|
176
156
|
export const hasTimeCodeWithoutTestClock = (source) => {
|
|
177
|
-
if (!
|
|
178
|
-
!
|
|
179
|
-
!
|
|
157
|
+
if (!sourceIncludes('Effect.timeout')(source) &&
|
|
158
|
+
!sourceIncludes('Effect.delay')(source) &&
|
|
159
|
+
!sourceIncludes('Clock.')(source)) {
|
|
180
160
|
return false;
|
|
181
161
|
}
|
|
182
|
-
return testSegments(source).some((segment) => /Effect\.(?:timeout|delay)|Clock\./.test(segment) && !/TestClock/.test(segment));
|
|
162
|
+
return pipe(testSegments(source), Array.some((segment) => /Effect\.(?:timeout|delay)|Clock\./.test(segment) && !/TestClock/.test(segment)));
|
|
183
163
|
};
|
|
184
164
|
/**
|
|
185
165
|
* Internal helper exported for package-local composition.
|
|
@@ -187,18 +167,13 @@ export const hasTimeCodeWithoutTestClock = (source) => {
|
|
|
187
167
|
* @internal
|
|
188
168
|
*/
|
|
189
169
|
export const hasMutableStateWithoutRef = (source) => {
|
|
190
|
-
if (!
|
|
170
|
+
if (!sourceIncludes('let ')(source)) {
|
|
191
171
|
return false;
|
|
192
172
|
}
|
|
193
173
|
if (!hasEffectSignal(source)) {
|
|
194
174
|
return false;
|
|
195
175
|
}
|
|
196
|
-
|
|
197
|
-
if (!/\bRef\./.test(lineAround(source, match.index))) {
|
|
198
|
-
return true;
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
return false;
|
|
176
|
+
return pipe(matchesIn(source, /\blet\s+[A-Za-z_$][\w$]*\s*=/g), Array.some((match) => !/\bRef\./.test(lineAround(source, match.index))));
|
|
202
177
|
};
|
|
203
178
|
/**
|
|
204
179
|
* Internal helper exported for package-local composition.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"effect-strict-helpers.js","sourceRoot":"","sources":["../../src/rules/effect-strict-helpers.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,gFAAgF;AAChF,gFAAgF;AAChF,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AACpF,OAAO,EACL,UAAU,EACV,sBAAsB,EACtB,qBAAqB,EACrB,YAAY,GACb,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EACL,4BAA4B,EAC5B,8BAA8B,EAC9B,iCAAiC,EACjC,+BAA+B,GAChC,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,4BAA4B,EAC5B,+BAA+B,EAC/B,uCAAuC,GACxC,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,yBAAyB,EACzB,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,wBAAwB,EACxB,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,iCAAiC,CAAC;AAEzC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAEpC;;;;GAIG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,MAAc,EAAW,EAAE;IACxE,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"effect-strict-helpers.js","sourceRoot":"","sources":["../../src/rules/effect-strict-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"effect-strict-internals.d.ts","sourceRoot":"","sources":["../../src/rules/effect-strict-internals.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"effect-strict-internals.d.ts","sourceRoot":"","sources":["../../src/rules/effect-strict-internals.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
/* -------------------------------------------------------------------------- */
|
|
2
2
|
/* AST and source predicates for opt-in strict Effect lint rules. */
|
|
3
3
|
/* -------------------------------------------------------------------------- */
|
|
4
|
+
import { Array, HashSet, Option, pipe } from 'effect';
|
|
4
5
|
import { effectAPIAliases, effectFunctionAliases, effectImportAliases } from './effect-rule-core.js';
|
|
5
6
|
import { exportedDeclarationTexts, findBalancedCallEnd, findMatchingBrace, findStatementEnd, stripComments, stripCommentsAndStrings, } from './effect-source-helpers.js';
|
|
6
7
|
import { isConfiguredPath } from './effect-path-options.js';
|
|
7
8
|
export { hasEffectSignal, hasRuntimeCall } from './effect-rule-core.js';
|
|
9
|
+
const astValueTypes = HashSet.make('boolean', 'number', 'object', 'string');
|
|
10
|
+
const matchesIn = (source, pattern) => pipe(source.matchAll(pattern), Array.fromIterable);
|
|
11
|
+
const matchIndexOrFalse = (match) => pipe(Option.fromNullable(match), Option.map((value) => value.index), Option.getOrElse(() => false));
|
|
8
12
|
/**
|
|
9
13
|
* Internal helper exported for package-local composition.
|
|
10
14
|
*
|
|
@@ -13,9 +17,7 @@ export { hasEffectSignal, hasRuntimeCall } from './effect-rule-core.js';
|
|
|
13
17
|
export const reportAST = (context, message, node) => {
|
|
14
18
|
context.report({ message, node });
|
|
15
19
|
};
|
|
16
|
-
const isASTValue = (value) => value === undefined ||
|
|
17
|
-
value === null ||
|
|
18
|
-
['boolean', 'number', 'object', 'string'].includes(typeof value);
|
|
20
|
+
const isASTValue = (value) => value === undefined || value === null || HashSet.has(astValueTypes, typeof value);
|
|
19
21
|
/**
|
|
20
22
|
* Internal helper exported for package-local composition.
|
|
21
23
|
*
|
|
@@ -37,8 +39,8 @@ export const objectValue = (node, key) => {
|
|
|
37
39
|
* @internal
|
|
38
40
|
*/
|
|
39
41
|
export const arrayValue = (node) => {
|
|
40
|
-
if (Array.isArray(node)) {
|
|
41
|
-
return node.filter(isASTValue);
|
|
42
|
+
if (globalThis.Array.isArray(node)) {
|
|
43
|
+
return pipe(node, Array.filter(isASTValue));
|
|
42
44
|
}
|
|
43
45
|
return [];
|
|
44
46
|
};
|
|
@@ -118,7 +120,7 @@ export const isSchemaMember = (node, source, propertyName) => {
|
|
|
118
120
|
const parts = memberParts(node);
|
|
119
121
|
return Boolean(parts.objectName &&
|
|
120
122
|
parts.propertyName === propertyName &&
|
|
121
|
-
effectAPIAliases(source, 'Schema').
|
|
123
|
+
pipe(effectAPIAliases(source, 'Schema'), Array.contains(parts.objectName)));
|
|
122
124
|
};
|
|
123
125
|
/**
|
|
124
126
|
* Internal helper exported for package-local composition.
|
|
@@ -126,16 +128,16 @@ export const isSchemaMember = (node, source, propertyName) => {
|
|
|
126
128
|
* @internal
|
|
127
129
|
*/
|
|
128
130
|
export const effectCallPredicate = (source, names) => {
|
|
129
|
-
const memberNames =
|
|
130
|
-
const importAliases =
|
|
131
|
-
const functionAliases =
|
|
131
|
+
const memberNames = HashSet.fromIterable(names);
|
|
132
|
+
const importAliases = pipe(effectImportAliases(source), HashSet.fromIterable);
|
|
133
|
+
const functionAliases = pipe(names, Array.flatMap((name) => effectFunctionAliases(source, 'Effect', name)), HashSet.fromIterable);
|
|
132
134
|
return (callee) => {
|
|
133
135
|
const { objectName, propertyName } = memberParts(callee);
|
|
134
136
|
if (objectName && propertyName) {
|
|
135
|
-
return
|
|
137
|
+
return HashSet.has(importAliases, objectName) && HashSet.has(memberNames, propertyName);
|
|
136
138
|
}
|
|
137
139
|
const calleeName = identifierName(callee);
|
|
138
|
-
return Boolean(calleeName &&
|
|
140
|
+
return Boolean(calleeName && HashSet.has(functionAliases, calleeName));
|
|
139
141
|
};
|
|
140
142
|
};
|
|
141
143
|
const literalStringValue = (node) => {
|
|
@@ -145,14 +147,8 @@ const literalStringValue = (node) => {
|
|
|
145
147
|
}
|
|
146
148
|
return undefined;
|
|
147
149
|
};
|
|
148
|
-
const contextTagServiceKey = (innerArguments) =>
|
|
149
|
-
|
|
150
|
-
return literalStringValue(firstInnerArgument);
|
|
151
|
-
};
|
|
152
|
-
const effectServiceKey = (outerArguments) => {
|
|
153
|
-
const [firstOuterArgument] = arrayValue(outerArguments);
|
|
154
|
-
return literalStringValue(firstOuterArgument);
|
|
155
|
-
};
|
|
150
|
+
const contextTagServiceKey = (innerArguments) => pipe(arrayValue(innerArguments), Array.head, Option.flatMapNullable(literalStringValue), Option.getOrUndefined);
|
|
151
|
+
const effectServiceKey = (outerArguments) => pipe(arrayValue(outerArguments), Array.head, Option.flatMapNullable(literalStringValue), Option.getOrUndefined);
|
|
156
152
|
const contextTagKeyFromMember = (member, innerArguments) => {
|
|
157
153
|
if (member.objectName === 'Context' &&
|
|
158
154
|
(member.propertyName === 'Tag' || member.propertyName === 'GenericTag')) {
|
|
@@ -162,7 +158,7 @@ const contextTagKeyFromMember = (member, innerArguments) => {
|
|
|
162
158
|
};
|
|
163
159
|
const effectServiceKeyFromMember = (source, member, outerArguments) => {
|
|
164
160
|
if (member.objectName &&
|
|
165
|
-
effectImportAliases(source).
|
|
161
|
+
pipe(effectImportAliases(source), Array.contains(member.objectName)) &&
|
|
166
162
|
member.propertyName === 'Service') {
|
|
167
163
|
return effectServiceKey(outerArguments);
|
|
168
164
|
}
|
|
@@ -205,16 +201,11 @@ export const serviceKeyFromClass = (node, source) => {
|
|
|
205
201
|
*
|
|
206
202
|
* @internal
|
|
207
203
|
*/
|
|
208
|
-
export const hasRetryScheduleWithoutJitter = (source) => {
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
return true;
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
return false;
|
|
217
|
-
};
|
|
204
|
+
export const hasRetryScheduleWithoutJitter = (source) => pipe(matchesIn(source, /\bEffect\.retry\s*\(/g), Array.some((match) => {
|
|
205
|
+
const openParenIndex = source.indexOf('(', match.index);
|
|
206
|
+
const callBody = source.slice(openParenIndex + 1, findBalancedCallEnd(source, openParenIndex));
|
|
207
|
+
return /\bSchedule\./.test(callBody) && !/\bjitter(?:ed)?\b/.test(callBody);
|
|
208
|
+
}));
|
|
218
209
|
const declarationBeforeBody = (declaration) => {
|
|
219
210
|
const bodyStart = declaration.indexOf('{');
|
|
220
211
|
if (bodyStart === -1) {
|
|
@@ -258,7 +249,7 @@ const hasClassPromiseReturningPublicMember = (declaration) => {
|
|
|
258
249
|
*
|
|
259
250
|
* @internal
|
|
260
251
|
*/
|
|
261
|
-
export const hasPromiseReturningPublicAPI = (source) => exportedDeclarationTexts(source).some((declaration) => {
|
|
252
|
+
export const hasPromiseReturningPublicAPI = (source) => pipe(exportedDeclarationTexts(source), Array.some((declaration) => {
|
|
262
253
|
if (/^\s*(?:export\s+)?(?:default\s+)?(?:abstract\s+)?class\b/.test(declaration)) {
|
|
263
254
|
return hasClassPromiseReturningPublicMember(declaration);
|
|
264
255
|
}
|
|
@@ -266,13 +257,13 @@ export const hasPromiseReturningPublicAPI = (source) => exportedDeclarationTexts
|
|
|
266
257
|
return (/\bPromise\s*</.test(signature) ||
|
|
267
258
|
/^\s*(?:export\s+)?async\s+function\b/.test(signature) ||
|
|
268
259
|
/=\s*async\b/.test(signature));
|
|
269
|
-
});
|
|
260
|
+
}));
|
|
270
261
|
/**
|
|
271
262
|
* Internal helper exported for package-local composition.
|
|
272
263
|
*
|
|
273
264
|
* @internal
|
|
274
265
|
*/
|
|
275
|
-
export const hasExportedRunPromiseAPI = (source) => exportedDeclarationTexts(source).some((declaration) => /\bEffect\.runPromise\s*\(/.test(stripCommentsAndStrings(declaration)));
|
|
266
|
+
export const hasExportedRunPromiseAPI = (source) => pipe(exportedDeclarationTexts(source), Array.some((declaration) => /\bEffect\.runPromise\s*\(/.test(stripCommentsAndStrings(declaration))));
|
|
276
267
|
const functionBodySegment = (code, matchIndex) => {
|
|
277
268
|
const bodyStart = code.indexOf('{', matchIndex);
|
|
278
269
|
if (bodyStart === -1) {
|
|
@@ -291,29 +282,18 @@ const functionBodySegment = (code, matchIndex) => {
|
|
|
291
282
|
*/
|
|
292
283
|
export const hasRunSyncInServerRequestHandler = (source) => {
|
|
293
284
|
const code = stripCommentsAndStrings(source);
|
|
294
|
-
|
|
285
|
+
return (pipe(matchesIn(code, /\b(?:handler|route|loader|action)\s*=/g), Array.some((match) => {
|
|
295
286
|
const segment = code.slice(match.index, findStatementEnd(code, match.index) + 1);
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
}
|
|
300
|
-
for (const match of code.matchAll(/\bfunction\s+(?:handler|route|loader|action)\s*\(/g)) {
|
|
301
|
-
const body = functionBodySegment(code, match.index);
|
|
302
|
-
if (body && /\bEffect\.runSync\s*\(/.test(body)) {
|
|
303
|
-
return true;
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
return false;
|
|
287
|
+
return /\bEffect\.runSync\s*\(/.test(segment);
|
|
288
|
+
})) ||
|
|
289
|
+
pipe(matchesIn(code, /\bfunction\s+(?:handler|route|loader|action)\s*\(/g), Array.some((match) => pipe(Option.fromNullable(functionBodySegment(code, match.index)), Option.exists((body) => /\bEffect\.runSync\s*\(/.test(body))))));
|
|
307
290
|
};
|
|
308
291
|
/**
|
|
309
292
|
* Internal helper exported for package-local composition.
|
|
310
293
|
*
|
|
311
294
|
* @internal
|
|
312
295
|
*/
|
|
313
|
-
export const hasCryptoRandomUUID = (source) =>
|
|
314
|
-
const match = /\bcrypto\.randomUUID\s*\(/.exec(stripCommentsAndStrings(source));
|
|
315
|
-
return match?.index ?? false;
|
|
316
|
-
};
|
|
296
|
+
export const hasCryptoRandomUUID = (source) => matchIndexOrFalse(/\bcrypto\.randomUUID\s*\(/.exec(stripCommentsAndStrings(source)));
|
|
317
297
|
/**
|
|
318
298
|
* Internal helper exported for package-local composition.
|
|
319
299
|
*
|
|
@@ -321,36 +301,24 @@ export const hasCryptoRandomUUID = (source) => {
|
|
|
321
301
|
*/
|
|
322
302
|
export const hasSchemaInstanceof = (source) => {
|
|
323
303
|
const code = stripCommentsAndStrings(source);
|
|
324
|
-
|
|
325
|
-
return match?.index ?? false;
|
|
304
|
+
return matchIndexOrFalse(/\binstanceof\s+[A-Z][\w$]*(?:Schema|Request)\b/.exec(code));
|
|
326
305
|
};
|
|
327
306
|
/**
|
|
328
307
|
* Internal helper exported for package-local composition.
|
|
329
308
|
*
|
|
330
309
|
* @internal
|
|
331
310
|
*/
|
|
332
|
-
export const hasSchemaStructWithTag = (source) => {
|
|
333
|
-
const match = /\bSchema\.Struct\s*\(\s*{[\s\S]*?_tag\s*:\s*Schema\.Literal\s*\(/.exec(stripCommentsAndStrings(source));
|
|
334
|
-
return match?.index ?? false;
|
|
335
|
-
};
|
|
311
|
+
export const hasSchemaStructWithTag = (source) => matchIndexOrFalse(/\bSchema\.Struct\s*\(\s*{[\s\S]*?_tag\s*:\s*Schema\.Literal\s*\(/.exec(stripCommentsAndStrings(source)));
|
|
336
312
|
/**
|
|
337
313
|
* Internal helper exported for package-local composition.
|
|
338
314
|
*
|
|
339
315
|
* @internal
|
|
340
316
|
*/
|
|
341
|
-
export const hasSchemaUnionOfLiterals = (source) =>
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
};
|
|
345
|
-
|
|
346
|
-
for (const match of code.matchAll(pattern)) {
|
|
347
|
-
const [, className, key] = match;
|
|
348
|
-
if (className !== key && !key.endsWith(`/${className}`)) {
|
|
349
|
-
return match.index;
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
return undefined;
|
|
353
|
-
};
|
|
317
|
+
export const hasSchemaUnionOfLiterals = (source) => matchIndexOrFalse(/\bSchema\.Union\s*\(\s*Schema\.Literal\s*\([^)]*\)\s*,\s*Schema\.Literal\s*\(/.exec(stripCommentsAndStrings(source)));
|
|
318
|
+
const nonDeterministicServiceKeyIndex = (code, pattern) => pipe(matchesIn(code, pattern), Array.findFirst((match) => {
|
|
319
|
+
const [, className, key] = match;
|
|
320
|
+
return className !== key && !key.endsWith(`/${className}`);
|
|
321
|
+
}), Option.map((match) => match.index), Option.getOrUndefined);
|
|
354
322
|
/**
|
|
355
323
|
* Internal helper exported for package-local composition.
|
|
356
324
|
*
|
|
@@ -373,8 +341,7 @@ export const hasNonDeterministicServiceKey = (source) => {
|
|
|
373
341
|
*/
|
|
374
342
|
export const hasMultipleProvideChain = (source) => {
|
|
375
343
|
const code = stripCommentsAndStrings(source);
|
|
376
|
-
|
|
377
|
-
return match?.index ?? false;
|
|
344
|
+
return matchIndexOrFalse(/\.pipe\s*\([\s\S]*?Effect\.provide\s*\([\s\S]*?Effect\.provide\s*\(/.exec(code));
|
|
378
345
|
};
|
|
379
346
|
/**
|
|
380
347
|
* Internal helper exported for package-local composition.
|
|
@@ -383,18 +350,14 @@ export const hasMultipleProvideChain = (source) => {
|
|
|
383
350
|
*/
|
|
384
351
|
export const hasLayerEffectWithScope = (source) => {
|
|
385
352
|
const code = stripCommentsAndStrings(source);
|
|
386
|
-
|
|
387
|
-
return match?.index ?? false;
|
|
353
|
+
return matchIndexOrFalse(/\bLayer\.effect\s*\([\s\S]*?\b(?:Scope\.Scope|Scope)\b/.exec(code));
|
|
388
354
|
};
|
|
389
355
|
/**
|
|
390
356
|
* Internal helper exported for package-local composition.
|
|
391
357
|
*
|
|
392
358
|
* @internal
|
|
393
359
|
*/
|
|
394
|
-
export const hasNodeBuiltinImport = (source) =>
|
|
395
|
-
const match = /\bfrom\s+['"]node:(?:fs|fs\/promises|path|child_process|crypto|stream|http|https)['"]/.exec(stripComments(source));
|
|
396
|
-
return match?.index ?? false;
|
|
397
|
-
};
|
|
360
|
+
export const hasNodeBuiltinImport = (source) => matchIndexOrFalse(/\bfrom\s+['"]node:(?:fs|fs\/promises|path|child_process|crypto|stream|http|https)['"]/.exec(stripComments(source)));
|
|
398
361
|
/**
|
|
399
362
|
* Internal helper exported for package-local composition.
|
|
400
363
|
*
|
|
@@ -405,41 +368,26 @@ export const hasGlobalFetch = (source, context) => {
|
|
|
405
368
|
if (isConfiguredPath(context, 'adapterLayers')) {
|
|
406
369
|
return false;
|
|
407
370
|
}
|
|
408
|
-
|
|
409
|
-
const wrappedFetch = Boolean(effectWrapperStatement(code, match.index));
|
|
410
|
-
if (wrappedFetch) {
|
|
411
|
-
return match.index;
|
|
412
|
-
}
|
|
413
|
-
}
|
|
414
|
-
return false;
|
|
371
|
+
return pipe(matchesIn(code, /\bfetch\s*\(/g), Array.findFirst((match) => Boolean(effectWrapperStatement(code, match.index))), Option.map((match) => match.index), Option.getOrElse(() => false));
|
|
415
372
|
};
|
|
416
373
|
/**
|
|
417
374
|
* Internal helper exported for package-local composition.
|
|
418
375
|
*
|
|
419
376
|
* @internal
|
|
420
377
|
*/
|
|
421
|
-
export const hasEffectSucceedWithVoid = (source) =>
|
|
422
|
-
const match = /\bEffect\.succeed\s*\(\s*(?:undefined|void\s+0)?\s*\)/.exec(stripCommentsAndStrings(source));
|
|
423
|
-
return match?.index ?? false;
|
|
424
|
-
};
|
|
378
|
+
export const hasEffectSucceedWithVoid = (source) => matchIndexOrFalse(/\bEffect\.succeed\s*\(\s*(?:undefined|void\s+0)?\s*\)/.exec(stripCommentsAndStrings(source)));
|
|
425
379
|
/**
|
|
426
380
|
* Internal helper exported for package-local composition.
|
|
427
381
|
*
|
|
428
382
|
* @internal
|
|
429
383
|
*/
|
|
430
|
-
export const hasMapToVoid = (source) => {
|
|
431
|
-
const match = /\bEffect\.map\s*\(\s*\(\s*\)\s*=>\s*(?:undefined|void\s+0|\{\s*\})\s*\)/.exec(stripCommentsAndStrings(source));
|
|
432
|
-
return match?.index ?? false;
|
|
433
|
-
};
|
|
384
|
+
export const hasMapToVoid = (source) => matchIndexOrFalse(/\bEffect\.map\s*\(\s*\(\s*\)\s*=>\s*(?:undefined|void\s+0|\{\s*\})\s*\)/.exec(stripCommentsAndStrings(source)));
|
|
434
385
|
/**
|
|
435
386
|
* Internal helper exported for package-local composition.
|
|
436
387
|
*
|
|
437
388
|
* @internal
|
|
438
389
|
*/
|
|
439
|
-
export const hasMapFlatten = (source) =>
|
|
440
|
-
const match = /\bEffect\.map\s*\([\s\S]*?\)\s*,\s*Effect\.flatten\b|\bEffect\.map\s*\([\s\S]*?\)\.pipe\s*\(\s*Effect\.flatten\b/.exec(stripCommentsAndStrings(source));
|
|
441
|
-
return match?.index ?? false;
|
|
442
|
-
};
|
|
390
|
+
export const hasMapFlatten = (source) => matchIndexOrFalse(/\bEffect\.map\s*\([\s\S]*?\)\s*,\s*Effect\.flatten\b|\bEffect\.map\s*\([\s\S]*?\)\.pipe\s*\(\s*Effect\.flatten\b/.exec(stripCommentsAndStrings(source)));
|
|
443
391
|
/**
|
|
444
392
|
* Internal helper exported for package-local composition.
|
|
445
393
|
*
|
|
@@ -464,14 +412,11 @@ export const hasDirectPlatformAccess = (source, context) => {
|
|
|
464
412
|
return false;
|
|
465
413
|
}
|
|
466
414
|
const code = stripCommentsAndStrings(source);
|
|
467
|
-
|
|
415
|
+
return pipe(matchesIn(code, /\b(?:fetch|readFileSync|writeFileSync|createReadStream)\s*\(/g), Array.some((match) => {
|
|
468
416
|
if (!match[0].startsWith('fetch')) {
|
|
469
417
|
return true;
|
|
470
418
|
}
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
}
|
|
474
|
-
}
|
|
475
|
-
return false;
|
|
419
|
+
return !effectWrapperStatement(code, match.index);
|
|
420
|
+
}));
|
|
476
421
|
};
|
|
477
422
|
//# sourceMappingURL=effect-strict-internals.js.map
|