@thethracian/oxlint-config 0.2.0 → 0.3.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 +125 -19
- package/dist/codemod-fix/cli.d.ts +3 -0
- package/dist/codemod-fix/cli.d.ts.map +1 -0
- package/dist/codemod-fix/cli.js +22 -0
- package/dist/codemod-fix/cli.js.map +1 -0
- package/dist/codemod-fix/index.d.ts +44 -0
- package/dist/codemod-fix/index.d.ts.map +1 -0
- package/dist/codemod-fix/index.js +110 -0
- package/dist/codemod-fix/index.js.map +1 -0
- package/dist/codemods/arrow-body-style.d.ts +7 -0
- package/dist/codemods/arrow-body-style.d.ts.map +1 -0
- package/dist/codemods/arrow-body-style.js +106 -0
- package/dist/codemods/arrow-body-style.js.map +1 -0
- package/dist/codemods/comment-format.d.ts +24 -0
- package/dist/codemods/comment-format.d.ts.map +1 -0
- package/dist/codemods/comment-format.js +100 -0
- package/dist/codemods/comment-format.js.map +1 -0
- package/dist/codemods/explicit-return-types.d.ts +7 -0
- package/dist/codemods/explicit-return-types.d.ts.map +1 -0
- package/dist/codemods/explicit-return-types.js +350 -0
- package/dist/codemods/explicit-return-types.js.map +1 -0
- package/dist/codemods/format-file-header.d.ts +7 -0
- package/dist/codemods/format-file-header.d.ts.map +1 -0
- package/dist/codemods/format-file-header.js +163 -0
- package/dist/codemods/format-file-header.js.map +1 -0
- package/dist/codemods/format-jsdoc-comments.d.ts +7 -0
- package/dist/codemods/format-jsdoc-comments.d.ts.map +1 -0
- package/dist/codemods/format-jsdoc-comments.js +129 -0
- package/dist/codemods/format-jsdoc-comments.js.map +1 -0
- package/dist/codemods/function-declarations.d.ts +7 -0
- package/dist/codemods/function-declarations.d.ts.map +1 -0
- package/dist/codemods/function-declarations.js +202 -0
- package/dist/codemods/function-declarations.js.map +1 -0
- package/dist/codemods/inline-export-lists.d.ts +7 -0
- package/dist/codemods/inline-export-lists.d.ts.map +1 -0
- package/dist/codemods/inline-export-lists.js +168 -0
- package/dist/codemods/inline-export-lists.js.map +1 -0
- package/dist/codemods/internal-export-docs.d.ts +7 -0
- package/dist/codemods/internal-export-docs.d.ts.map +1 -0
- package/dist/codemods/internal-export-docs.js +93 -0
- package/dist/codemods/internal-export-docs.js.map +1 -0
- package/dist/codemods/no-ternary-branch-initializers.d.ts +14 -0
- package/dist/codemods/no-ternary-branch-initializers.d.ts.map +1 -0
- package/dist/codemods/no-ternary-branch-initializers.js +240 -0
- package/dist/codemods/no-ternary-branch-initializers.js.map +1 -0
- package/dist/codemods/no-ternary-variable-initializers.d.ts +14 -0
- package/dist/codemods/no-ternary-variable-initializers.d.ts.map +1 -0
- package/dist/codemods/no-ternary-variable-initializers.js +235 -0
- package/dist/codemods/no-ternary-variable-initializers.js.map +1 -0
- package/dist/codemods/no-ternary.d.ts +7 -0
- package/dist/codemods/no-ternary.d.ts.map +1 -0
- package/dist/codemods/no-ternary.js +215 -0
- package/dist/codemods/no-ternary.js.map +1 -0
- package/dist/codemods/rename-acronyms.d.ts +8 -0
- package/dist/codemods/rename-acronyms.d.ts.map +1 -0
- package/dist/codemods/rename-acronyms.js +193 -0
- package/dist/codemods/rename-acronyms.js.map +1 -0
- package/dist/codemods/run.d.ts +2 -0
- package/dist/codemods/run.d.ts.map +1 -0
- package/dist/codemods/run.js +14 -0
- package/dist/codemods/run.js.map +1 -0
- package/dist/codemods/sort-imports.d.ts +7 -0
- package/dist/codemods/sort-imports.d.ts.map +1 -0
- package/dist/codemods/sort-imports.js +235 -0
- package/dist/codemods/sort-imports.js.map +1 -0
- package/dist/index.d.ts +30 -96
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +157 -95
- package/dist/index.js.map +1 -1
- package/dist/rules/acronym-case.d.ts +7 -3
- package/dist/rules/acronym-case.d.ts.map +1 -1
- package/dist/rules/acronym-case.js +129 -120
- package/dist/rules/acronym-case.js.map +1 -1
- package/dist/rules/acronyms-1.d.ts +3 -0
- package/dist/rules/acronyms-1.d.ts.map +1 -0
- package/dist/rules/acronyms-1.js +407 -0
- package/dist/rules/acronyms-1.js.map +1 -0
- package/dist/rules/acronyms-2.d.ts +3 -0
- package/dist/rules/acronyms-2.d.ts.map +1 -0
- package/dist/rules/acronyms-2.js +407 -0
- package/dist/rules/acronyms-2.js.map +1 -0
- package/dist/rules/acronyms-3.d.ts +3 -0
- package/dist/rules/acronyms-3.d.ts.map +1 -0
- package/dist/rules/acronyms-3.js +407 -0
- package/dist/rules/acronyms-3.js.map +1 -0
- package/dist/rules/acronyms-4.d.ts +3 -0
- package/dist/rules/acronyms-4.d.ts.map +1 -0
- package/dist/rules/acronyms-4.js +377 -0
- package/dist/rules/acronyms-4.js.map +1 -0
- package/dist/rules/acronyms.d.ts +1 -8
- package/dist/rules/acronyms.d.ts.map +1 -1
- package/dist/rules/acronyms.js +14 -1578
- package/dist/rules/acronyms.js.map +1 -1
- package/dist/rules/boolean-prefix.d.ts +11 -2
- package/dist/rules/boolean-prefix.d.ts.map +1 -1
- package/dist/rules/boolean-prefix.js +95 -59
- package/dist/rules/boolean-prefix.js.map +1 -1
- package/dist/rules/camel-case-identifiers.d.ts +3 -4
- package/dist/rules/camel-case-identifiers.d.ts.map +1 -1
- package/dist/rules/camel-case-identifiers.js +59 -40
- package/dist/rules/camel-case-identifiers.js.map +1 -1
- package/dist/rules/char-class.d.ts +26 -13
- package/dist/rules/char-class.d.ts.map +1 -1
- package/dist/rules/char-class.js +56 -24
- package/dist/rules/char-class.js.map +1 -1
- package/dist/rules/diagnostic-guidance.d.ts +91 -0
- package/dist/rules/diagnostic-guidance.d.ts.map +1 -0
- package/dist/rules/diagnostic-guidance.js +243 -0
- package/dist/rules/diagnostic-guidance.js.map +1 -0
- package/dist/rules/effect-default-ast.d.ts +89 -0
- package/dist/rules/effect-default-ast.d.ts.map +1 -0
- package/dist/rules/effect-default-ast.js +208 -0
- package/dist/rules/effect-default-ast.js.map +1 -0
- package/dist/rules/effect-default-compat-rules.d.ts +76 -0
- package/dist/rules/effect-default-compat-rules.d.ts.map +1 -0
- package/dist/rules/effect-default-compat-rules.js +270 -0
- package/dist/rules/effect-default-compat-rules.js.map +1 -0
- package/dist/rules/effect-default-env-rules.d.ts +60 -0
- package/dist/rules/effect-default-env-rules.d.ts.map +1 -0
- package/dist/rules/effect-default-env-rules.js +259 -0
- package/dist/rules/effect-default-env-rules.js.map +1 -0
- package/dist/rules/effect-default-fiber-helpers.d.ts +13 -0
- package/dist/rules/effect-default-fiber-helpers.d.ts.map +1 -0
- package/dist/rules/effect-default-fiber-helpers.js +76 -0
- package/dist/rules/effect-default-fiber-helpers.js.map +1 -0
- package/dist/rules/effect-default-floating-helpers.d.ts +7 -0
- package/dist/rules/effect-default-floating-helpers.d.ts.map +1 -0
- package/dist/rules/effect-default-floating-helpers.js +113 -0
- package/dist/rules/effect-default-floating-helpers.js.map +1 -0
- package/dist/rules/effect-default-helpers.d.ts +8 -32
- package/dist/rules/effect-default-helpers.d.ts.map +1 -1
- package/dist/rules/effect-default-helpers.js +11 -458
- package/dist/rules/effect-default-helpers.js.map +1 -1
- package/dist/rules/effect-default-resource-helpers.d.ts +18 -4
- package/dist/rules/effect-default-resource-helpers.d.ts.map +1 -1
- package/dist/rules/effect-default-resource-helpers.js +30 -13
- package/dist/rules/effect-default-resource-helpers.js.map +1 -1
- package/dist/rules/effect-default-safety-helpers.d.ts +43 -0
- package/dist/rules/effect-default-safety-helpers.d.ts.map +1 -0
- package/dist/rules/effect-default-safety-helpers.js +126 -0
- package/dist/rules/effect-default-safety-helpers.js.map +1 -0
- package/dist/rules/effect-default-scan-helpers.d.ts +43 -0
- package/dist/rules/effect-default-scan-helpers.d.ts.map +1 -0
- package/dist/rules/effect-default-scan-helpers.js +141 -0
- package/dist/rules/effect-default-scan-helpers.js.map +1 -0
- package/dist/rules/effect-default-schema-helpers.d.ts +37 -0
- package/dist/rules/effect-default-schema-helpers.d.ts.map +1 -0
- package/dist/rules/effect-default-schema-helpers.js +104 -0
- package/dist/rules/effect-default-schema-helpers.js.map +1 -0
- package/dist/rules/effect-default-test-helpers.d.ts +18 -4
- package/dist/rules/effect-default-test-helpers.d.ts.map +1 -1
- package/dist/rules/effect-default-test-helpers.js +41 -20
- package/dist/rules/effect-default-test-helpers.js.map +1 -1
- package/dist/rules/effect-default-workflow-helpers.d.ts +91 -0
- package/dist/rules/effect-default-workflow-helpers.d.ts.map +1 -0
- package/dist/rules/effect-default-workflow-helpers.js +247 -0
- package/dist/rules/effect-default-workflow-helpers.js.map +1 -0
- package/dist/rules/effect-default.d.ts +1 -1
- package/dist/rules/effect-default.d.ts.map +1 -1
- package/dist/rules/effect-default.js +198 -637
- package/dist/rules/effect-default.js.map +1 -1
- package/dist/rules/effect-exported-declarations.d.ts +19 -0
- package/dist/rules/effect-exported-declarations.d.ts.map +1 -0
- package/dist/rules/effect-exported-declarations.js +237 -0
- package/dist/rules/effect-exported-declarations.js.map +1 -0
- package/dist/rules/effect-path-options.d.ts +49 -11
- package/dist/rules/effect-path-options.d.ts.map +1 -1
- package/dist/rules/effect-path-options.js +85 -52
- package/dist/rules/effect-path-options.js.map +1 -1
- package/dist/rules/effect-rule-aliases.d.ts +55 -0
- package/dist/rules/effect-rule-aliases.d.ts.map +1 -0
- package/dist/rules/effect-rule-aliases.js +278 -0
- package/dist/rules/effect-rule-aliases.js.map +1 -0
- package/dist/rules/effect-rule-core.d.ts +46 -24
- package/dist/rules/effect-rule-core.d.ts.map +1 -1
- package/dist/rules/effect-rule-core.js +263 -303
- package/dist/rules/effect-rule-core.js.map +1 -1
- package/dist/rules/effect-rule-names.d.ts +12 -3
- package/dist/rules/effect-rule-names.d.ts.map +1 -1
- package/dist/rules/effect-rule-names.js +15 -3
- package/dist/rules/effect-rule-names.js.map +1 -1
- package/dist/rules/effect-source-comments.d.ts +7 -0
- package/dist/rules/effect-source-comments.d.ts.map +1 -0
- package/dist/rules/effect-source-comments.js +227 -0
- package/dist/rules/effect-source-comments.js.map +1 -0
- package/dist/rules/effect-source-helpers.d.ts +4 -9
- package/dist/rules/effect-source-helpers.d.ts.map +1 -1
- package/dist/rules/effect-source-helpers.js +7 -333
- package/dist/rules/effect-source-helpers.js.map +1 -1
- package/dist/rules/effect-source-navigation.d.ts +25 -0
- package/dist/rules/effect-source-navigation.d.ts.map +1 -0
- package/dist/rules/effect-source-navigation.js +244 -0
- package/dist/rules/effect-source-navigation.js.map +1 -0
- package/dist/rules/effect-source-scan.d.ts +30 -7
- package/dist/rules/effect-source-scan.d.ts.map +1 -1
- package/dist/rules/effect-source-scan.js +377 -297
- package/dist/rules/effect-source-scan.js.map +1 -1
- package/dist/rules/effect-strict-ast-specs.d.ts +8 -0
- package/dist/rules/effect-strict-ast-specs.d.ts.map +1 -0
- package/dist/rules/effect-strict-ast-specs.js +166 -0
- package/dist/rules/effect-strict-ast-specs.js.map +1 -0
- package/dist/rules/effect-strict-boundary-helpers.d.ts +25 -0
- package/dist/rules/effect-strict-boundary-helpers.d.ts.map +1 -0
- package/dist/rules/effect-strict-boundary-helpers.js +127 -0
- package/dist/rules/effect-strict-boundary-helpers.js.map +1 -0
- package/dist/rules/effect-strict-core-specs.d.ts +8 -0
- package/dist/rules/effect-strict-core-specs.d.ts.map +1 -0
- package/dist/rules/effect-strict-core-specs.js +334 -0
- package/dist/rules/effect-strict-core-specs.js.map +1 -0
- package/dist/rules/effect-strict-external-helpers.d.ts +25 -0
- package/dist/rules/effect-strict-external-helpers.d.ts.map +1 -0
- package/dist/rules/effect-strict-external-helpers.js +87 -0
- package/dist/rules/effect-strict-external-helpers.js.map +1 -0
- package/dist/rules/effect-strict-helpers.d.ts +75 -33
- package/dist/rules/effect-strict-helpers.d.ts.map +1 -1
- package/dist/rules/effect-strict-helpers.js +124 -246
- package/dist/rules/effect-strict-helpers.js.map +1 -1
- package/dist/rules/effect-strict-internals.d.ts +198 -0
- package/dist/rules/effect-strict-internals.d.ts.map +1 -0
- package/dist/rules/effect-strict-internals.js +477 -0
- package/dist/rules/effect-strict-internals.js.map +1 -0
- package/dist/rules/effect-strict-segment-helpers.d.ts +79 -0
- package/dist/rules/effect-strict-segment-helpers.d.ts.map +1 -0
- package/dist/rules/effect-strict-segment-helpers.js +308 -0
- package/dist/rules/effect-strict-segment-helpers.js.map +1 -0
- package/dist/rules/effect-strict.d.ts +1 -1
- package/dist/rules/effect-strict.d.ts.map +1 -1
- package/dist/rules/effect-strict.js +10 -661
- package/dist/rules/effect-strict.js.map +1 -1
- package/dist/rules/max-import-depth.d.ts +2 -2
- package/dist/rules/max-import-depth.d.ts.map +1 -1
- package/dist/rules/max-import-depth.js +52 -17
- package/dist/rules/max-import-depth.js.map +1 -1
- package/dist/rules/max-line-length.d.ts +9 -2
- package/dist/rules/max-line-length.d.ts.map +1 -1
- package/dist/rules/max-line-length.js +62 -7
- package/dist/rules/max-line-length.js.map +1 -1
- package/dist/rules/no-commented-out-code.d.ts +3 -7
- package/dist/rules/no-commented-out-code.d.ts.map +1 -1
- package/dist/rules/no-commented-out-code.js +157 -102
- package/dist/rules/no-commented-out-code.js.map +1 -1
- package/dist/rules/pascal-case-types.d.ts +1 -1
- package/dist/rules/pascal-case-types.d.ts.map +1 -1
- package/dist/rules/pascal-case-types.js +65 -46
- package/dist/rules/pascal-case-types.js.map +1 -1
- package/dist/rules/plugin-commented-out-code-rule.d.ts +32 -0
- package/dist/rules/plugin-commented-out-code-rule.d.ts.map +1 -0
- package/dist/rules/plugin-commented-out-code-rule.js +135 -0
- package/dist/rules/plugin-commented-out-code-rule.js.map +1 -0
- package/dist/rules/plugin.d.ts +3 -121
- package/dist/rules/plugin.d.ts.map +1 -1
- package/dist/rules/plugin.js +195 -201
- package/dist/rules/plugin.js.map +1 -1
- package/dist/rules/private-underscore.d.ts +1 -1
- package/dist/rules/private-underscore.d.ts.map +1 -1
- package/dist/rules/private-underscore.js +11 -4
- package/dist/rules/private-underscore.js.map +1 -1
- package/dist/rules/require-file-doc.d.ts +5 -6
- package/dist/rules/require-file-doc.d.ts.map +1 -1
- package/dist/rules/require-file-doc.js +127 -78
- package/dist/rules/require-file-doc.js.map +1 -1
- package/dist/rules/require-function-doc-ignored-text.d.ts +7 -0
- package/dist/rules/require-function-doc-ignored-text.d.ts.map +1 -0
- package/dist/rules/require-function-doc-ignored-text.js +67 -0
- package/dist/rules/require-function-doc-ignored-text.js.map +1 -0
- package/dist/rules/require-function-doc-local-exports.d.ts +7 -0
- package/dist/rules/require-function-doc-local-exports.d.ts.map +1 -0
- package/dist/rules/require-function-doc-local-exports.js +114 -0
- package/dist/rules/require-function-doc-local-exports.js.map +1 -0
- package/dist/rules/require-function-doc.d.ts +3 -18
- package/dist/rules/require-function-doc.d.ts.map +1 -1
- package/dist/rules/require-function-doc.js +404 -218
- package/dist/rules/require-function-doc.js.map +1 -1
- package/dist/rules/source-cache.d.ts +19 -0
- package/dist/rules/source-cache.d.ts.map +1 -0
- package/dist/rules/source-cache.js +63 -0
- package/dist/rules/source-cache.js.map +1 -0
- package/package.json +15 -10
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal helper exported for package-local composition.
|
|
3
|
+
*
|
|
4
|
+
* @internal
|
|
5
|
+
*/
|
|
6
|
+
export declare const hasUnsafeLazyEvaluation: (source: string) => boolean;
|
|
7
|
+
/**
|
|
8
|
+
* Internal helper exported for package-local composition.
|
|
9
|
+
*
|
|
10
|
+
* @internal
|
|
11
|
+
*/
|
|
12
|
+
export declare const hasUnloggedIgnore: (source: string) => boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Internal helper exported for package-local composition.
|
|
15
|
+
*
|
|
16
|
+
* @internal
|
|
17
|
+
*/
|
|
18
|
+
export declare const hasMultipleCatchTagsInOnePipe: (source: string) => boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Internal helper exported for package-local composition.
|
|
21
|
+
*
|
|
22
|
+
* @internal
|
|
23
|
+
*/
|
|
24
|
+
export declare const hasBroadCatchAllWithoutRethrow: (source: string) => boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Internal helper exported for package-local composition.
|
|
27
|
+
*
|
|
28
|
+
* @internal
|
|
29
|
+
*/
|
|
30
|
+
export declare const hasErrorMappingWithoutCause: (source: string) => boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Internal helper exported for package-local composition.
|
|
33
|
+
*
|
|
34
|
+
* @internal
|
|
35
|
+
*/
|
|
36
|
+
export declare const hasForkDaemonWithoutCleanup: (source: string) => boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Internal helper exported for package-local composition.
|
|
39
|
+
*
|
|
40
|
+
* @internal
|
|
41
|
+
*/
|
|
42
|
+
export declare const hasForkInUninterruptibleWithoutRestore: (source: string) => boolean;
|
|
43
|
+
//# sourceMappingURL=effect-default-safety-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effect-default-safety-helpers.d.ts","sourceRoot":"","sources":["../../src/rules/effect-default-safety-helpers.ts"],"names":[],"mappings":"AAYA;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,GAAI,QAAQ,MAAM,KAAG,OAWxD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,GAAI,QAAQ,MAAM,KAAG,OAgBlD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,6BAA6B,GAAI,QAAQ,MAAM,KAAG,OAc9D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,8BAA8B,GAAI,QAAQ,MAAM,KAAG,OAgB/D,CAAC;AAiBF;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,GAAI,QAAQ,MAAM,KAAG,OAgB5D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,GAAI,QAAQ,MAAM,KAAG,OAI1D,CAAC;AAEJ;;;;GAIG;AACH,eAAO,MAAM,sCAAsC,GAAI,QAAQ,MAAM,KAAG,OAWvE,CAAC"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/* -------------------------------------------------------------------------- */
|
|
2
|
+
/* Error-handling and cleanup predicates for always-on Effect rules. */
|
|
3
|
+
/* -------------------------------------------------------------------------- */
|
|
4
|
+
import { effectCallBodies, enclosingPipeBody } from './effect-default-scan-helpers.js';
|
|
5
|
+
import { findBalancedCallEnd, isInsideCall, stripCommentsAndStrings, } from './effect-source-helpers.js';
|
|
6
|
+
const LOCAL_PREFIX_SCAN_WINDOW = 160;
|
|
7
|
+
/**
|
|
8
|
+
* Internal helper exported for package-local composition.
|
|
9
|
+
*
|
|
10
|
+
* @internal
|
|
11
|
+
*/
|
|
12
|
+
export const hasUnsafeLazyEvaluation = (source) => {
|
|
13
|
+
const code = stripCommentsAndStrings(source);
|
|
14
|
+
for (const match of code.matchAll(/Effect\.succeed\s*\(\s*(?:Date\.now|Math\.random|new\s+Date|JSON\.parse)\s*\(/g)) {
|
|
15
|
+
if (!isInsideCall(code, match.index, /Effect\.suspend\s*\(/g)) {
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return false;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Internal helper exported for package-local composition.
|
|
23
|
+
*
|
|
24
|
+
* @internal
|
|
25
|
+
*/
|
|
26
|
+
export const hasUnloggedIgnore = (source) => {
|
|
27
|
+
for (const match of source.matchAll(/\bEffect\.ignore\b/g)) {
|
|
28
|
+
const pipeBody = enclosingPipeBody(source, match.index);
|
|
29
|
+
let localPrefix = source.slice(Math.max(0, match.index - LOCAL_PREFIX_SCAN_WINDOW), match.index);
|
|
30
|
+
if (pipeBody) {
|
|
31
|
+
localPrefix = pipeBody.slice(0, Math.max(0, match.index - source.indexOf(pipeBody)));
|
|
32
|
+
}
|
|
33
|
+
if (!/\b(?:Effect\.log|tapError|tapBoth|catchAll)\b/.test(localPrefix)) {
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return false;
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Internal helper exported for package-local composition.
|
|
41
|
+
*
|
|
42
|
+
* @internal
|
|
43
|
+
*/
|
|
44
|
+
export const hasMultipleCatchTagsInOnePipe = (source) => {
|
|
45
|
+
const code = stripCommentsAndStrings(source);
|
|
46
|
+
for (const match of code.matchAll(/\.pipe\s*\(/g)) {
|
|
47
|
+
const openParenIndex = source.indexOf('(', match.index);
|
|
48
|
+
if (openParenIndex !== -1) {
|
|
49
|
+
const pipeBody = source.slice(match.index, findBalancedCallEnd(source, openParenIndex) + 1);
|
|
50
|
+
const catchTagCount = [...pipeBody.matchAll(/Effect\.catchTag\s*\(/g)].length;
|
|
51
|
+
if (catchTagCount > 1 && !/Effect\.catchTags\s*\(/.test(pipeBody)) {
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return false;
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* Internal helper exported for package-local composition.
|
|
60
|
+
*
|
|
61
|
+
* @internal
|
|
62
|
+
*/
|
|
63
|
+
export const hasBroadCatchAllWithoutRethrow = (source) => {
|
|
64
|
+
const code = stripCommentsAndStrings(source);
|
|
65
|
+
for (const match of code.matchAll(/Effect\.catchAll\s*\(/g)) {
|
|
66
|
+
const openParenIndex = source.indexOf('(', match.index);
|
|
67
|
+
if (openParenIndex !== -1) {
|
|
68
|
+
const callBody = source.slice(openParenIndex + 1, findBalancedCallEnd(source, openParenIndex));
|
|
69
|
+
if (!/=>\s*Effect\.fail\s*\(/.test(callBody)) {
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return false;
|
|
75
|
+
};
|
|
76
|
+
const hasErrorWithoutCause = (callBody) => {
|
|
77
|
+
for (const errorMatch of callBody.matchAll(/new\s+[A-Z][\w$]*Error\s*\(/g)) {
|
|
78
|
+
const errorOpenParenIndex = callBody.indexOf('(', errorMatch.index);
|
|
79
|
+
const errorArgs = callBody.slice(errorOpenParenIndex + 1, findBalancedCallEnd(callBody, errorOpenParenIndex));
|
|
80
|
+
if (!/\bcause\b/.test(errorArgs)) {
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return false;
|
|
85
|
+
};
|
|
86
|
+
/**
|
|
87
|
+
* Internal helper exported for package-local composition.
|
|
88
|
+
*
|
|
89
|
+
* @internal
|
|
90
|
+
*/
|
|
91
|
+
export const hasErrorMappingWithoutCause = (source) => {
|
|
92
|
+
const code = stripCommentsAndStrings(source);
|
|
93
|
+
for (const match of code.matchAll(/(?:mapError|catchAll)\s*\(/g)) {
|
|
94
|
+
const openParenIndex = source.indexOf('(', match.index);
|
|
95
|
+
if (openParenIndex !== -1) {
|
|
96
|
+
const callBody = source.slice(openParenIndex + 1, findBalancedCallEnd(source, openParenIndex));
|
|
97
|
+
if (hasErrorWithoutCause(callBody)) {
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return false;
|
|
103
|
+
};
|
|
104
|
+
/**
|
|
105
|
+
* Internal helper exported for package-local composition.
|
|
106
|
+
*
|
|
107
|
+
* @internal
|
|
108
|
+
*/
|
|
109
|
+
export const hasForkDaemonWithoutCleanup = (source) => effectCallBodies(source, /\bEffect\.forkDaemon\s*\(/g).some((body) => !/\b(?:Effect\.)?(?:ensuring|onExit|onInterrupt|supervised)\b|Supervisor\./.test(body));
|
|
110
|
+
/**
|
|
111
|
+
* Internal helper exported for package-local composition.
|
|
112
|
+
*
|
|
113
|
+
* @internal
|
|
114
|
+
*/
|
|
115
|
+
export const hasForkInUninterruptibleWithoutRestore = (source) => {
|
|
116
|
+
const code = stripCommentsAndStrings(source);
|
|
117
|
+
for (const match of code.matchAll(/\bEffect\.uninterruptible\s*\(/g)) {
|
|
118
|
+
const openParenIndex = source.indexOf('(', match.index);
|
|
119
|
+
const callBody = source.slice(openParenIndex + 1, findBalancedCallEnd(source, openParenIndex));
|
|
120
|
+
if (/\bEffect\.fork\b/.test(callBody) && !/\brestore\s*\(/.test(callBody)) {
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return false;
|
|
125
|
+
};
|
|
126
|
+
//# sourceMappingURL=effect-default-safety-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effect-default-safety-helpers.js","sourceRoot":"","sources":["../../src/rules/effect-default-safety-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal helper exported for package-local composition.
|
|
3
|
+
*
|
|
4
|
+
* @internal
|
|
5
|
+
*/
|
|
6
|
+
export declare const effectAliasesPattern: (source: string) => string;
|
|
7
|
+
/**
|
|
8
|
+
* Internal helper exported for package-local composition.
|
|
9
|
+
*
|
|
10
|
+
* @internal
|
|
11
|
+
*/
|
|
12
|
+
export declare const effectCallPattern: (source: string, methods: string) => RegExp;
|
|
13
|
+
/**
|
|
14
|
+
* Internal helper exported for package-local composition.
|
|
15
|
+
*
|
|
16
|
+
* @internal
|
|
17
|
+
*/
|
|
18
|
+
export declare const localCallSegment: (source: string, targetIndex: number) => string;
|
|
19
|
+
/**
|
|
20
|
+
* Internal helper exported for package-local composition.
|
|
21
|
+
*
|
|
22
|
+
* @internal
|
|
23
|
+
*/
|
|
24
|
+
export declare const effectCallBodies: (source: string, callPattern: RegExp) => string[];
|
|
25
|
+
/**
|
|
26
|
+
* Internal helper exported for package-local composition.
|
|
27
|
+
*
|
|
28
|
+
* @internal
|
|
29
|
+
*/
|
|
30
|
+
export declare const someEffectWorkflowBody: (source: string, predicate: (body: string) => boolean) => boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Internal helper exported for package-local composition.
|
|
33
|
+
*
|
|
34
|
+
* @internal
|
|
35
|
+
*/
|
|
36
|
+
export declare const enclosingPipeBody: (source: string, targetIndex: number) => string | undefined;
|
|
37
|
+
/**
|
|
38
|
+
* Internal helper exported for package-local composition.
|
|
39
|
+
*
|
|
40
|
+
* @internal
|
|
41
|
+
*/
|
|
42
|
+
export declare const strippedCallSegment: (source: string, targetIndex: number) => string;
|
|
43
|
+
//# sourceMappingURL=effect-default-scan-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effect-default-scan-helpers.d.ts","sourceRoot":"","sources":["../../src/rules/effect-default-scan-helpers.ts"],"names":[],"mappings":"AAiCA;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,GAAI,QAAQ,MAAM,KAAG,MAWrD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,GAAI,QAAQ,MAAM,EAAE,SAAS,MAAM,KAAG,MAcnE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,QAAQ,MAAM,EAAE,aAAa,MAAM,KAAG,MAMtE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,QAAQ,MAAM,EAAE,aAAa,MAAM,KAAG,MAAM,EAW5E,CAAC;AAiDF;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,GACjC,QAAQ,MAAM,EACd,WAAW,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,KACnC,OAGF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,GAAI,QAAQ,MAAM,EAAE,aAAa,MAAM,KAAG,MAAM,GAAG,SAYhF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,GAAI,QAAQ,MAAM,EAAE,aAAa,MAAM,KAAG,MACpB,CAAC"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/* -------------------------------------------------------------------------- */
|
|
2
|
+
/* Shared scan helpers for always-on Effect lint predicates. */
|
|
3
|
+
/* -------------------------------------------------------------------------- */
|
|
4
|
+
import { findBalancedCallEnd, findStatementEnd, stripComments, stripCommentsAndStrings, } from './effect-source-helpers.js';
|
|
5
|
+
import { effectImportAliases } from './effect-rule-core.js';
|
|
6
|
+
const EFFECT_PATTERN_CACHE_MAX = 256;
|
|
7
|
+
const effectAliasesPatternCache = new Map();
|
|
8
|
+
const effectCallPatternCache = new Map();
|
|
9
|
+
const escapeRegExp = (value) => value.replace(/[.*+?^${}()|[\]\\]/g, String.raw `\$&`);
|
|
10
|
+
const 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
|
+
/**
|
|
21
|
+
* Internal helper exported for package-local composition.
|
|
22
|
+
*
|
|
23
|
+
* @internal
|
|
24
|
+
*/
|
|
25
|
+
export const effectAliasesPattern = (source) => {
|
|
26
|
+
const cachedPattern = effectAliasesPatternCache.get(source);
|
|
27
|
+
if (cachedPattern !== undefined) {
|
|
28
|
+
return cachedPattern;
|
|
29
|
+
}
|
|
30
|
+
return setBoundedCacheValue(effectAliasesPatternCache, source, effectImportAliases(source).map(escapeRegExp).join('|'));
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Internal helper exported for package-local composition.
|
|
34
|
+
*
|
|
35
|
+
* @internal
|
|
36
|
+
*/
|
|
37
|
+
export const effectCallPattern = (source, methods) => {
|
|
38
|
+
let sourceCache = effectCallPatternCache.get(source);
|
|
39
|
+
if (sourceCache === undefined) {
|
|
40
|
+
sourceCache = setBoundedCacheValue(effectCallPatternCache, source, new Map());
|
|
41
|
+
}
|
|
42
|
+
const cachedPattern = sourceCache.get(methods);
|
|
43
|
+
if (cachedPattern !== undefined) {
|
|
44
|
+
return cachedPattern;
|
|
45
|
+
}
|
|
46
|
+
const pattern = new RegExp(`\\b(?:${effectAliasesPattern(source)})\\.(?:${methods})\\s*\\(`, 'g');
|
|
47
|
+
sourceCache.set(methods, pattern);
|
|
48
|
+
return pattern;
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Internal helper exported for package-local composition.
|
|
52
|
+
*
|
|
53
|
+
* @internal
|
|
54
|
+
*/
|
|
55
|
+
export const localCallSegment = (source, targetIndex) => {
|
|
56
|
+
const openParenIndex = source.indexOf('(', targetIndex);
|
|
57
|
+
if (openParenIndex === -1) {
|
|
58
|
+
return source.slice(targetIndex, findStatementEnd(source, targetIndex) + 1);
|
|
59
|
+
}
|
|
60
|
+
return source.slice(targetIndex, findBalancedCallEnd(source, openParenIndex) + 1);
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* Internal helper exported for package-local composition.
|
|
64
|
+
*
|
|
65
|
+
* @internal
|
|
66
|
+
*/
|
|
67
|
+
export const effectCallBodies = (source, callPattern) => {
|
|
68
|
+
const code = stripCommentsAndStrings(source);
|
|
69
|
+
const bodies = [];
|
|
70
|
+
for (const match of code.matchAll(callPattern)) {
|
|
71
|
+
const openParenIndex = source.indexOf('(', match.index);
|
|
72
|
+
if (openParenIndex !== -1) {
|
|
73
|
+
bodies.push(source.slice(openParenIndex + 1, findBalancedCallEnd(source, openParenIndex)));
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return bodies;
|
|
77
|
+
};
|
|
78
|
+
const effectGenHasBody = (source, code, predicate) => {
|
|
79
|
+
for (const match of code.matchAll(effectCallPattern(source, 'gen'))) {
|
|
80
|
+
const openParenIndex = source.indexOf('(', match.index);
|
|
81
|
+
if (openParenIndex !== -1 &&
|
|
82
|
+
predicate(source.slice(openParenIndex + 1, findBalancedCallEnd(source, openParenIndex)))) {
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return false;
|
|
87
|
+
};
|
|
88
|
+
const effectFnBodyBounds = (source, openParenIndex) => {
|
|
89
|
+
const firstCallEnd = findBalancedCallEnd(source, openParenIndex);
|
|
90
|
+
const nextCallMatch = /^\s*\(/.exec(source.slice(firstCallEnd + 1));
|
|
91
|
+
if (nextCallMatch) {
|
|
92
|
+
const start = firstCallEnd + 1 + nextCallMatch[0].lastIndexOf('(');
|
|
93
|
+
return { end: findBalancedCallEnd(source, start), start };
|
|
94
|
+
}
|
|
95
|
+
return { end: firstCallEnd, start: openParenIndex };
|
|
96
|
+
};
|
|
97
|
+
const effectFnHasBody = (source, code, predicate) => {
|
|
98
|
+
for (const match of code.matchAll(effectCallPattern(source, 'fn'))) {
|
|
99
|
+
const openParenIndex = source.indexOf('(', match.index);
|
|
100
|
+
if (openParenIndex !== -1) {
|
|
101
|
+
const bounds = effectFnBodyBounds(source, openParenIndex);
|
|
102
|
+
if (predicate(source.slice(bounds.start + 1, bounds.end))) {
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return false;
|
|
108
|
+
};
|
|
109
|
+
/**
|
|
110
|
+
* Internal helper exported for package-local composition.
|
|
111
|
+
*
|
|
112
|
+
* @internal
|
|
113
|
+
*/
|
|
114
|
+
export const someEffectWorkflowBody = (source, predicate) => {
|
|
115
|
+
const code = stripCommentsAndStrings(source);
|
|
116
|
+
return effectGenHasBody(source, code, predicate) || effectFnHasBody(source, code, predicate);
|
|
117
|
+
};
|
|
118
|
+
/**
|
|
119
|
+
* Internal helper exported for package-local composition.
|
|
120
|
+
*
|
|
121
|
+
* @internal
|
|
122
|
+
*/
|
|
123
|
+
export const enclosingPipeBody = (source, targetIndex) => {
|
|
124
|
+
for (const match of source.matchAll(/\.pipe\s*\(/g)) {
|
|
125
|
+
const openParenIndex = source.indexOf('(', match.index);
|
|
126
|
+
if (openParenIndex !== -1 && openParenIndex <= targetIndex) {
|
|
127
|
+
const endIndex = findBalancedCallEnd(source, openParenIndex);
|
|
128
|
+
if (targetIndex <= endIndex) {
|
|
129
|
+
return source.slice(openParenIndex + 1, endIndex);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return undefined;
|
|
134
|
+
};
|
|
135
|
+
/**
|
|
136
|
+
* Internal helper exported for package-local composition.
|
|
137
|
+
*
|
|
138
|
+
* @internal
|
|
139
|
+
*/
|
|
140
|
+
export const strippedCallSegment = (source, targetIndex) => stripComments(localCallSegment(source, targetIndex));
|
|
141
|
+
//# sourceMappingURL=effect-default-scan-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effect-default-scan-helpers.js","sourceRoot":"","sources":["../../src/rules/effect-default-scan-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal helper exported for package-local composition.
|
|
3
|
+
*
|
|
4
|
+
* @internal
|
|
5
|
+
*/
|
|
6
|
+
export declare const hasSchemaSyncDecodeInEffectWorkflow: (source: string) => boolean;
|
|
7
|
+
/**
|
|
8
|
+
* Internal helper exported for package-local composition.
|
|
9
|
+
*
|
|
10
|
+
* @internal
|
|
11
|
+
*/
|
|
12
|
+
export declare const hasSchemaPromiseDecode: (source: string) => boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Internal helper exported for package-local composition.
|
|
15
|
+
*
|
|
16
|
+
* @internal
|
|
17
|
+
*/
|
|
18
|
+
export declare const hasExternalJSONWithoutDecodeUnknown: (source: string) => boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Internal helper exported for package-local composition.
|
|
21
|
+
*
|
|
22
|
+
* @internal
|
|
23
|
+
*/
|
|
24
|
+
export declare const hasCastAfterSchemaDecode: (source: string) => boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Internal helper exported for package-local composition.
|
|
27
|
+
*
|
|
28
|
+
* @internal
|
|
29
|
+
*/
|
|
30
|
+
export declare const hasUnhandledSchemaEffectDecode: (source: string) => boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Internal helper exported for package-local composition.
|
|
33
|
+
*
|
|
34
|
+
* @internal
|
|
35
|
+
*/
|
|
36
|
+
export declare const hasJSONParsedBeforeSchemaStringDecode: (source: string) => boolean;
|
|
37
|
+
//# sourceMappingURL=effect-default-schema-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effect-default-schema-helpers.d.ts","sourceRoot":"","sources":["../../src/rules/effect-default-schema-helpers.ts"],"names":[],"mappings":"AAQA;;;;GAIG;AACH,eAAO,MAAM,mCAAmC,GAAI,QAAQ,MAAM,KAAG,OAGlE,CAAC;AAEJ;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,GAAI,QAAQ,MAAM,KAAG,OACqB,CAAC;AAE9E;;;;GAIG;AACH,eAAO,MAAM,mCAAmC,GAAI,QAAQ,MAAM,KAAG,OAapE,CAAC;AAgDF;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,GAAI,QAAQ,MAAM,KAAG,OASzD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,8BAA8B,GAAI,QAAQ,MAAM,KAAG,OAkB/D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,qCAAqC,GAAI,QAAQ,MAAM,KAAG,OAGpE,CAAC"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/* -------------------------------------------------------------------------- */
|
|
2
|
+
/* Schema boundary predicates for always-on Effect rules. */
|
|
3
|
+
/* -------------------------------------------------------------------------- */
|
|
4
|
+
import { isInsideCall, stripCommentsAndStrings } from './effect-source-helpers.js';
|
|
5
|
+
import { localCallSegment, someEffectWorkflowBody } from './effect-default-scan-helpers.js';
|
|
6
|
+
const SCHEMA_ASSERTION_SCAN_WINDOW = 240;
|
|
7
|
+
/**
|
|
8
|
+
* Internal helper exported for package-local composition.
|
|
9
|
+
*
|
|
10
|
+
* @internal
|
|
11
|
+
*/
|
|
12
|
+
export const hasSchemaSyncDecodeInEffectWorkflow = (source) => someEffectWorkflowBody(source, (body) => /Schema\.decode(?:Unknown)?Sync\s*\(/.test(stripCommentsAndStrings(body)));
|
|
13
|
+
/**
|
|
14
|
+
* Internal helper exported for package-local composition.
|
|
15
|
+
*
|
|
16
|
+
* @internal
|
|
17
|
+
*/
|
|
18
|
+
export const hasSchemaPromiseDecode = (source) => /Schema\.decode[A-Za-z]*Promise\s*\(/.test(stripCommentsAndStrings(source));
|
|
19
|
+
/**
|
|
20
|
+
* Internal helper exported for package-local composition.
|
|
21
|
+
*
|
|
22
|
+
* @internal
|
|
23
|
+
*/
|
|
24
|
+
export const hasExternalJSONWithoutDecodeUnknown = (source) => {
|
|
25
|
+
const code = stripCommentsAndStrings(source);
|
|
26
|
+
for (const match of code.matchAll(/\b(?:response|res)\.json\s*\(\s*\)/g)) {
|
|
27
|
+
const callSegment = localCallSegment(code, match.index);
|
|
28
|
+
if (!isInsideCall(code, match.index, /Schema\.decodeUnknown\s*\(/g) &&
|
|
29
|
+
!/Schema\.decodeUnknown/.test(callSegment)) {
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return false;
|
|
34
|
+
};
|
|
35
|
+
const schemaDecodeLine = (code, index) => {
|
|
36
|
+
const lineStart = Math.max(code.lastIndexOf(';', index) + 1, code.lastIndexOf('\n', index) + 1);
|
|
37
|
+
const lineBreakIndex = code.indexOf('\n', index);
|
|
38
|
+
let lineEnd = lineBreakIndex;
|
|
39
|
+
if (lineEnd === -1) {
|
|
40
|
+
lineEnd = code.length;
|
|
41
|
+
}
|
|
42
|
+
return code.slice(lineStart, lineEnd);
|
|
43
|
+
};
|
|
44
|
+
const schemaAssertionTail = (code, match) => code.slice((match.index ?? 0) + match[0].length, (match.index ?? 0) + match[0].length + SCHEMA_ASSERTION_SCAN_WINDOW);
|
|
45
|
+
const hasBindingAssertion = (bindingName, tail) => Boolean(bindingName && new RegExp(`\\b${bindingName}\\s+as\\s+[A-Za-z_$][\\w$]*`).test(tail));
|
|
46
|
+
const hasInlineSchemaDecodeCast = (line) => /Schema\.decode[A-Za-z]*\s*\([^)]*\)\s*\([^)]*\)\s+as\s+[A-Za-z_$][\w$]*/.test(line);
|
|
47
|
+
const hasCastAfterSchemaDecodeMatch = (code, match) => {
|
|
48
|
+
if (match.index === undefined) {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
const line = schemaDecodeLine(code, match.index);
|
|
52
|
+
if (hasInlineSchemaDecodeCast(line)) {
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
const bindingName = /\b(?:const|let|var)\s+([A-Za-z_$][\w$]*)\s*=/.exec(line)?.[1];
|
|
56
|
+
return hasBindingAssertion(bindingName, schemaAssertionTail(code, match));
|
|
57
|
+
};
|
|
58
|
+
const hasCastAfterSchemaDecodeBinding = (code) => {
|
|
59
|
+
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)) {
|
|
60
|
+
const [, bindingName] = match;
|
|
61
|
+
if (hasBindingAssertion(bindingName, schemaAssertionTail(code, match))) {
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return false;
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* Internal helper exported for package-local composition.
|
|
69
|
+
*
|
|
70
|
+
* @internal
|
|
71
|
+
*/
|
|
72
|
+
export const hasCastAfterSchemaDecode = (source) => {
|
|
73
|
+
const code = stripCommentsAndStrings(source);
|
|
74
|
+
for (const match of code.matchAll(/Schema\.decode[A-Za-z]*\s*\(/g)) {
|
|
75
|
+
if (hasCastAfterSchemaDecodeMatch(code, match)) {
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return hasCastAfterSchemaDecodeBinding(code);
|
|
80
|
+
};
|
|
81
|
+
/**
|
|
82
|
+
* Internal helper exported for package-local composition.
|
|
83
|
+
*
|
|
84
|
+
* @internal
|
|
85
|
+
*/
|
|
86
|
+
export const hasUnhandledSchemaEffectDecode = (source) => {
|
|
87
|
+
const code = stripCommentsAndStrings(source);
|
|
88
|
+
for (const match of code.matchAll(/\b(?:const|let|var)\s+([A-Za-z_$][\w$]*)\s*=\s*Schema\.decodeUnknown\s*\([^)]*\)\s*\([^)]*\)/g)) {
|
|
89
|
+
const [, bindingName] = match;
|
|
90
|
+
const tail = code.slice(match.index + match[0].length);
|
|
91
|
+
const handledPattern = new RegExp(`(?:yield\\*\\s+${bindingName}\\b|return\\s+${bindingName}\\b)`);
|
|
92
|
+
if (!handledPattern.test(tail)) {
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return /Schema\.decodeUnknown\s*\([^)]*\)\s*\([^)]*\)\.pipe\s*\(\s*Effect\.(?:orDie|ignore)\b/.test(code);
|
|
97
|
+
};
|
|
98
|
+
/**
|
|
99
|
+
* Internal helper exported for package-local composition.
|
|
100
|
+
*
|
|
101
|
+
* @internal
|
|
102
|
+
*/
|
|
103
|
+
export const hasJSONParsedBeforeSchemaStringDecode = (source) => /Schema\.decode[A-Za-z]*\s*\((?![^)]*Schema\.parseJson)[\s\S]*?\)\s*\(\s*JSON\.parse\s*\(/.test(stripCommentsAndStrings(source));
|
|
104
|
+
//# sourceMappingURL=effect-default-schema-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effect-default-schema-helpers.js","sourceRoot":"","sources":["../../src/rules/effect-default-schema-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,19 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Internal helper exported for package-local composition.
|
|
3
|
+
*
|
|
4
|
+
* @internal
|
|
5
|
+
*/
|
|
6
|
+
export declare const hasForkBeforeTestClockAdjust: (source: string) => boolean;
|
|
7
|
+
/**
|
|
8
|
+
* Internal helper exported for package-local composition.
|
|
9
|
+
*
|
|
10
|
+
* @internal
|
|
11
|
+
*/
|
|
12
|
+
export declare const hasRealSleepWithoutTestClock: (source: string) => boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Internal helper exported for package-local composition.
|
|
15
|
+
*
|
|
16
|
+
* @internal
|
|
17
|
+
*/
|
|
18
|
+
export declare const hasTestClockWithoutEffectContext: (source: string) => boolean;
|
|
5
19
|
//# sourceMappingURL=effect-default-test-helpers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"effect-default-test-helpers.d.ts","sourceRoot":"","sources":["../../src/rules/effect-default-test-helpers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"effect-default-test-helpers.d.ts","sourceRoot":"","sources":["../../src/rules/effect-default-test-helpers.ts"],"names":[],"mappings":"AAiBA;;;;GAIG;AACH,eAAO,MAAM,4BAA4B,GAAI,QAAQ,MAAM,KAAG,OAoB7D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,4BAA4B,GAAI,QAAQ,MAAM,KAAG,OAY7D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,gCAAgC,GAAI,QAAQ,MAAM,KAAG,OAYjE,CAAC"}
|
|
@@ -1,5 +1,21 @@
|
|
|
1
|
+
/* -------------------------------------------------------------------------- */
|
|
2
|
+
/* Helpers for Effect test-determinism lint rules. */
|
|
3
|
+
/* -------------------------------------------------------------------------- */
|
|
1
4
|
import { stripCommentsAndStrings } from './effect-source-helpers.js';
|
|
2
|
-
|
|
5
|
+
const testStartPattern = /\bit(?:\.effect)?\s*\(/g;
|
|
6
|
+
const testStartsIn = (code) => [...code.matchAll(testStartPattern)].map((match) => match.index);
|
|
7
|
+
const enclosingTestBody = (code, testStarts, index) => {
|
|
8
|
+
const previousStarts = testStarts.filter((start) => start < index);
|
|
9
|
+
const testStart = previousStarts.at(-1) ?? 0;
|
|
10
|
+
const nextTestStart = testStarts.find((start) => start > index) ?? code.length;
|
|
11
|
+
return code.slice(testStart, nextTestStart);
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Internal helper exported for package-local composition.
|
|
15
|
+
*
|
|
16
|
+
* @internal
|
|
17
|
+
*/
|
|
18
|
+
export const hasForkBeforeTestClockAdjust = (source) => {
|
|
3
19
|
const code = stripCommentsAndStrings(source);
|
|
4
20
|
const adjustMatches = [...code.matchAll(/TestClock\.adjust\s*\(/g)];
|
|
5
21
|
if (adjustMatches.length === 0) {
|
|
@@ -8,39 +24,44 @@ function hasForkBeforeTestClockAdjust(source) {
|
|
|
8
24
|
return adjustMatches.every((match) => {
|
|
9
25
|
const adjustIndex = match.index;
|
|
10
26
|
const testStart = Math.max(code.lastIndexOf('it.effect', adjustIndex), code.lastIndexOf('it(', adjustIndex));
|
|
11
|
-
|
|
27
|
+
let segmentStart = testStart;
|
|
28
|
+
if (segmentStart === -1) {
|
|
29
|
+
segmentStart = 0;
|
|
30
|
+
}
|
|
31
|
+
const segment = code.slice(segmentStart, adjustIndex);
|
|
12
32
|
return /Effect\.fork(?:Scoped)?\b/.test(segment);
|
|
13
33
|
});
|
|
14
|
-
}
|
|
15
|
-
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Internal helper exported for package-local composition.
|
|
37
|
+
*
|
|
38
|
+
* @internal
|
|
39
|
+
*/
|
|
40
|
+
export const hasRealSleepWithoutTestClock = (source) => {
|
|
16
41
|
const code = stripCommentsAndStrings(source);
|
|
17
|
-
const
|
|
18
|
-
const testStarts = [...code.matchAll(testStartPattern)].map((match) => match.index);
|
|
42
|
+
const testStarts = testStartsIn(code);
|
|
19
43
|
for (const sleepMatch of code.matchAll(/Effect\.sleep\s*\(/g)) {
|
|
20
|
-
const
|
|
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);
|
|
44
|
+
const testBody = enclosingTestBody(code, testStarts, sleepMatch.index);
|
|
24
45
|
if (!/TestClock\./.test(testBody)) {
|
|
25
46
|
return true;
|
|
26
47
|
}
|
|
27
48
|
}
|
|
28
49
|
return false;
|
|
29
|
-
}
|
|
30
|
-
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Internal helper exported for package-local composition.
|
|
53
|
+
*
|
|
54
|
+
* @internal
|
|
55
|
+
*/
|
|
56
|
+
export const hasTestClockWithoutEffectContext = (source) => {
|
|
31
57
|
const code = stripCommentsAndStrings(source);
|
|
32
|
-
const
|
|
33
|
-
const testStarts = [...code.matchAll(testStartPattern)].map((match) => match.index);
|
|
58
|
+
const testStarts = testStartsIn(code);
|
|
34
59
|
for (const clockMatch of code.matchAll(/TestClock\./g)) {
|
|
35
|
-
const
|
|
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);
|
|
60
|
+
const testBody = enclosingTestBody(code, testStarts, clockMatch.index);
|
|
39
61
|
if (!/(?:it\.effect|TestContext)/.test(testBody)) {
|
|
40
62
|
return true;
|
|
41
63
|
}
|
|
42
64
|
}
|
|
43
65
|
return false;
|
|
44
|
-
}
|
|
45
|
-
export { hasForkBeforeTestClockAdjust, hasRealSleepWithoutTestClock, hasTestClockWithoutEffectContext, };
|
|
66
|
+
};
|
|
46
67
|
//# sourceMappingURL=effect-default-test-helpers.js.map
|