@opensip-cli/checks-typescript 0.1.10 → 0.1.12
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/README.md +4 -2
- package/dist/__tests__/all-checks-execute.test.d.ts.map +1 -1
- package/dist/__tests__/all-checks-execute.test.js +0 -1
- package/dist/__tests__/all-checks-execute.test.js.map +1 -1
- package/dist/__tests__/behavior-fixtures-2.test.d.ts.map +1 -1
- package/dist/__tests__/behavior-fixtures-2.test.js +0 -1
- package/dist/__tests__/behavior-fixtures-2.test.js.map +1 -1
- package/dist/__tests__/behavior-fixtures-3.test.d.ts.map +1 -1
- package/dist/__tests__/behavior-fixtures-3.test.js +0 -1
- package/dist/__tests__/behavior-fixtures-3.test.js.map +1 -1
- package/dist/__tests__/behavior-fixtures-4.test.d.ts.map +1 -1
- package/dist/__tests__/behavior-fixtures-4.test.js +0 -1
- package/dist/__tests__/behavior-fixtures-4.test.js.map +1 -1
- package/dist/__tests__/behavior-fixtures-5.test.d.ts.map +1 -1
- package/dist/__tests__/behavior-fixtures-5.test.js +0 -1
- package/dist/__tests__/behavior-fixtures-5.test.js.map +1 -1
- package/dist/__tests__/behavior-fixtures-6.test.js +10 -0
- package/dist/__tests__/behavior-fixtures-6.test.js.map +1 -1
- package/dist/__tests__/behavior-fixtures.test.d.ts.map +1 -1
- package/dist/__tests__/behavior-fixtures.test.js +2 -4
- package/dist/__tests__/behavior-fixtures.test.js.map +1 -1
- package/dist/__tests__/branch-fixtures-2.test.d.ts.map +1 -1
- package/dist/__tests__/branch-fixtures-2.test.js +0 -1
- package/dist/__tests__/branch-fixtures-2.test.js.map +1 -1
- package/dist/__tests__/branch-fixtures-3.test.d.ts.map +1 -1
- package/dist/__tests__/branch-fixtures-3.test.js +0 -1
- package/dist/__tests__/branch-fixtures-3.test.js.map +1 -1
- package/dist/__tests__/branch-fixtures.test.d.ts.map +1 -1
- package/dist/__tests__/branch-fixtures.test.js +0 -1
- package/dist/__tests__/branch-fixtures.test.js.map +1 -1
- package/dist/checks/architecture/__tests__/live-view-through-cli-live.test.d.ts +2 -0
- package/dist/checks/architecture/__tests__/live-view-through-cli-live.test.d.ts.map +1 -0
- package/dist/checks/architecture/__tests__/live-view-through-cli-live.test.js +13 -0
- package/dist/checks/architecture/__tests__/live-view-through-cli-live.test.js.map +1 -0
- package/dist/checks/architecture/contracts-schema-consistency.d.ts.map +1 -1
- package/dist/checks/architecture/contracts-schema-consistency.js +0 -3
- package/dist/checks/architecture/contracts-schema-consistency.js.map +1 -1
- package/dist/checks/architecture/drizzle-orm-migration-guardrails.d.ts.map +1 -1
- package/dist/checks/architecture/drizzle-orm-migration-guardrails.js +1 -0
- package/dist/checks/architecture/drizzle-orm-migration-guardrails.js.map +1 -1
- package/dist/checks/architecture/index.d.ts +1 -0
- package/dist/checks/architecture/index.d.ts.map +1 -1
- package/dist/checks/architecture/index.js +1 -0
- package/dist/checks/architecture/index.js.map +1 -1
- package/dist/checks/architecture/live-view-through-cli-live.d.ts +8 -0
- package/dist/checks/architecture/live-view-through-cli-live.d.ts.map +1 -0
- package/dist/checks/architecture/live-view-through-cli-live.js +43 -0
- package/dist/checks/architecture/live-view-through-cli-live.js.map +1 -0
- package/dist/checks/architecture/missing-type-exports.d.ts.map +1 -1
- package/dist/checks/architecture/missing-type-exports.js +1 -1
- package/dist/checks/architecture/missing-type-exports.js.map +1 -1
- package/dist/checks/architecture/module-coupling-fan-out.d.ts.map +1 -1
- package/dist/checks/architecture/module-coupling-fan-out.js +6 -2
- package/dist/checks/architecture/module-coupling-fan-out.js.map +1 -1
- package/dist/checks/architecture/no-bootstrap-tool-import.d.ts.map +1 -1
- package/dist/checks/architecture/no-bootstrap-tool-import.js +1 -0
- package/dist/checks/architecture/no-bootstrap-tool-import.js.map +1 -1
- package/dist/checks/architecture/no-run-done-result.d.ts.map +1 -1
- package/dist/checks/architecture/no-run-done-result.js +1 -0
- package/dist/checks/architecture/no-run-done-result.js.map +1 -1
- package/dist/checks/architecture/package-json-exports-field.d.ts.map +1 -1
- package/dist/checks/architecture/package-json-exports-field.js +1 -1
- package/dist/checks/architecture/package-json-exports-field.js.map +1 -1
- package/dist/checks/architecture/phantom-dependency-detection.d.ts.map +1 -1
- package/dist/checks/architecture/phantom-dependency-detection.js +0 -4
- package/dist/checks/architecture/phantom-dependency-detection.js.map +1 -1
- package/dist/checks/architecture/tsconfig-extends-validation.d.ts.map +1 -1
- package/dist/checks/architecture/tsconfig-extends-validation.js +0 -2
- package/dist/checks/architecture/tsconfig-extends-validation.js.map +1 -1
- package/dist/checks/quality/api/fastify-schema-coverage.d.ts.map +1 -1
- package/dist/checks/quality/api/fastify-schema-coverage.js +21 -10
- package/dist/checks/quality/api/fastify-schema-coverage.js.map +1 -1
- package/dist/checks/quality/code-structure/__tests__/duplicate-utility-lang-substrate.test.d.ts +5 -0
- package/dist/checks/quality/code-structure/__tests__/duplicate-utility-lang-substrate.test.d.ts.map +1 -0
- package/dist/checks/quality/code-structure/__tests__/duplicate-utility-lang-substrate.test.js +17 -0
- package/dist/checks/quality/code-structure/__tests__/duplicate-utility-lang-substrate.test.js.map +1 -0
- package/dist/checks/quality/code-structure/duplicate-utility-functions-config.d.ts +18 -0
- package/dist/checks/quality/code-structure/duplicate-utility-functions-config.d.ts.map +1 -0
- package/dist/checks/quality/code-structure/duplicate-utility-functions-config.js +36 -0
- package/dist/checks/quality/code-structure/duplicate-utility-functions-config.js.map +1 -0
- package/dist/checks/quality/code-structure/duplicate-utility-functions-helpers.d.ts +15 -0
- package/dist/checks/quality/code-structure/duplicate-utility-functions-helpers.d.ts.map +1 -0
- package/dist/checks/quality/code-structure/duplicate-utility-functions-helpers.js +288 -0
- package/dist/checks/quality/code-structure/duplicate-utility-functions-helpers.js.map +1 -0
- package/dist/checks/quality/code-structure/duplicate-utility-functions.d.ts +1 -26
- package/dist/checks/quality/code-structure/duplicate-utility-functions.d.ts.map +1 -1
- package/dist/checks/quality/code-structure/duplicate-utility-functions.js +3 -407
- package/dist/checks/quality/code-structure/duplicate-utility-functions.js.map +1 -1
- package/dist/checks/quality/data-integrity/__tests__/null-safety-fp.test.js +39 -2
- package/dist/checks/quality/data-integrity/__tests__/null-safety-fp.test.js.map +1 -1
- package/dist/checks/quality/data-integrity/array-validation-detectors.d.ts +17 -0
- package/dist/checks/quality/data-integrity/array-validation-detectors.d.ts.map +1 -0
- package/dist/checks/quality/data-integrity/array-validation-detectors.js +184 -0
- package/dist/checks/quality/data-integrity/array-validation-detectors.js.map +1 -0
- package/dist/checks/quality/data-integrity/array-validation.d.ts +0 -2
- package/dist/checks/quality/data-integrity/array-validation.d.ts.map +1 -1
- package/dist/checks/quality/data-integrity/array-validation.js +2 -360
- package/dist/checks/quality/data-integrity/array-validation.js.map +1 -1
- package/dist/checks/quality/data-integrity/database-schema-validation.d.ts.map +1 -1
- package/dist/checks/quality/data-integrity/database-schema-validation.js +0 -1
- package/dist/checks/quality/data-integrity/database-schema-validation.js.map +1 -1
- package/dist/checks/quality/data-integrity/null-safety-analyze.d.ts +33 -0
- package/dist/checks/quality/data-integrity/null-safety-analyze.d.ts.map +1 -0
- package/dist/checks/quality/data-integrity/null-safety-analyze.js +164 -0
- package/dist/checks/quality/data-integrity/null-safety-analyze.js.map +1 -0
- package/dist/checks/quality/data-integrity/null-safety-config.d.ts +50 -0
- package/dist/checks/quality/data-integrity/null-safety-config.d.ts.map +1 -0
- package/dist/checks/quality/data-integrity/null-safety-config.js +69 -0
- package/dist/checks/quality/data-integrity/null-safety-config.js.map +1 -0
- package/dist/checks/quality/data-integrity/null-safety-heuristics.d.ts +76 -0
- package/dist/checks/quality/data-integrity/null-safety-heuristics.d.ts.map +1 -0
- package/dist/checks/quality/data-integrity/null-safety-heuristics.js +276 -0
- package/dist/checks/quality/data-integrity/null-safety-heuristics.js.map +1 -0
- package/dist/checks/quality/data-integrity/null-safety-prefixes.d.ts +13 -0
- package/dist/checks/quality/data-integrity/null-safety-prefixes.d.ts.map +1 -0
- package/dist/checks/quality/data-integrity/null-safety-prefixes.js +333 -0
- package/dist/checks/quality/data-integrity/null-safety-prefixes.js.map +1 -0
- package/dist/checks/quality/data-integrity/null-safety.d.ts +2 -82
- package/dist/checks/quality/data-integrity/null-safety.d.ts.map +1 -1
- package/dist/checks/quality/data-integrity/null-safety.js +3 -796
- package/dist/checks/quality/data-integrity/null-safety.js.map +1 -1
- package/dist/checks/quality/frontend/test-only-frontend-modules.d.ts.map +1 -1
- package/dist/checks/quality/frontend/test-only-frontend-modules.js +0 -2
- package/dist/checks/quality/frontend/test-only-frontend-modules.js.map +1 -1
- package/dist/checks/quality/linting/typescript-frontend.d.ts.map +1 -1
- package/dist/checks/quality/linting/typescript-frontend.js +1 -0
- package/dist/checks/quality/linting/typescript-frontend.js.map +1 -1
- package/dist/checks/quality/observability/logger-event-name-format.d.ts.map +1 -1
- package/dist/checks/quality/observability/logger-event-name-format.js +0 -1
- package/dist/checks/quality/observability/logger-event-name-format.js.map +1 -1
- package/dist/checks/quality/observability/no-hardcoded-correlation-id.d.ts.map +1 -1
- package/dist/checks/quality/observability/no-hardcoded-correlation-id.js +2 -3
- package/dist/checks/quality/observability/no-hardcoded-correlation-id.js.map +1 -1
- package/dist/checks/quality/patterns/__tests__/async-waterfall-sequential.test.d.ts +8 -0
- package/dist/checks/quality/patterns/__tests__/async-waterfall-sequential.test.d.ts.map +1 -0
- package/dist/checks/quality/patterns/__tests__/async-waterfall-sequential.test.js +87 -0
- package/dist/checks/quality/patterns/__tests__/async-waterfall-sequential.test.js.map +1 -0
- package/dist/checks/quality/patterns/__tests__/error-handling-probes.test.d.ts +2 -0
- package/dist/checks/quality/patterns/__tests__/error-handling-probes.test.d.ts.map +1 -0
- package/dist/checks/quality/patterns/__tests__/error-handling-probes.test.js +51 -0
- package/dist/checks/quality/patterns/__tests__/error-handling-probes.test.js.map +1 -0
- package/dist/checks/quality/patterns/__tests__/result-pattern-registration-guards.test.d.ts +2 -0
- package/dist/checks/quality/patterns/__tests__/result-pattern-registration-guards.test.d.ts.map +1 -0
- package/dist/checks/quality/patterns/__tests__/result-pattern-registration-guards.test.js +89 -0
- package/dist/checks/quality/patterns/__tests__/result-pattern-registration-guards.test.js.map +1 -0
- package/dist/checks/quality/patterns/__tests__/throws-documentation-analyze.test.d.ts +5 -0
- package/dist/checks/quality/patterns/__tests__/throws-documentation-analyze.test.d.ts.map +1 -0
- package/dist/checks/quality/patterns/__tests__/throws-documentation-analyze.test.js +78 -0
- package/dist/checks/quality/patterns/__tests__/throws-documentation-analyze.test.js.map +1 -0
- package/dist/checks/quality/patterns/__tests__/toctou-fp.test.js +44 -0
- package/dist/checks/quality/patterns/__tests__/toctou-fp.test.js.map +1 -1
- package/dist/checks/quality/patterns/async-waterfall-analysis.d.ts +17 -0
- package/dist/checks/quality/patterns/async-waterfall-analysis.d.ts.map +1 -0
- package/dist/checks/quality/patterns/async-waterfall-analysis.js +215 -0
- package/dist/checks/quality/patterns/async-waterfall-analysis.js.map +1 -0
- package/dist/checks/quality/patterns/async-waterfall-branch-keys.d.ts +6 -0
- package/dist/checks/quality/patterns/async-waterfall-branch-keys.d.ts.map +1 -0
- package/dist/checks/quality/patterns/async-waterfall-branch-keys.js +54 -0
- package/dist/checks/quality/patterns/async-waterfall-branch-keys.js.map +1 -0
- package/dist/checks/quality/patterns/async-waterfall-detection.d.ts.map +1 -1
- package/dist/checks/quality/patterns/async-waterfall-detection.js +3 -352
- package/dist/checks/quality/patterns/async-waterfall-detection.js.map +1 -1
- package/dist/checks/quality/patterns/containing-function-name.d.ts +3 -0
- package/dist/checks/quality/patterns/containing-function-name.d.ts.map +1 -0
- package/dist/checks/quality/patterns/containing-function-name.js +21 -0
- package/dist/checks/quality/patterns/containing-function-name.js.map +1 -0
- package/dist/checks/quality/patterns/error-handling-quality.d.ts +3 -0
- package/dist/checks/quality/patterns/error-handling-quality.d.ts.map +1 -1
- package/dist/checks/quality/patterns/error-handling-quality.js +150 -30
- package/dist/checks/quality/patterns/error-handling-quality.js.map +1 -1
- package/dist/checks/quality/patterns/result-pattern-consistency.d.ts +3 -0
- package/dist/checks/quality/patterns/result-pattern-consistency.d.ts.map +1 -1
- package/dist/checks/quality/patterns/result-pattern-consistency.js +136 -69
- package/dist/checks/quality/patterns/result-pattern-consistency.js.map +1 -1
- package/dist/checks/quality/patterns/throws-documentation-analyze.d.ts +14 -0
- package/dist/checks/quality/patterns/throws-documentation-analyze.d.ts.map +1 -0
- package/dist/checks/quality/patterns/throws-documentation-analyze.js +352 -0
- package/dist/checks/quality/patterns/throws-documentation-analyze.js.map +1 -0
- package/dist/checks/quality/patterns/throws-documentation-constants.d.ts +15 -0
- package/dist/checks/quality/patterns/throws-documentation-constants.d.ts.map +1 -0
- package/dist/checks/quality/patterns/throws-documentation-constants.js +94 -0
- package/dist/checks/quality/patterns/throws-documentation-constants.js.map +1 -0
- package/dist/checks/quality/patterns/throws-documentation.d.ts +1 -11
- package/dist/checks/quality/patterns/throws-documentation.d.ts.map +1 -1
- package/dist/checks/quality/patterns/throws-documentation.js +4 -472
- package/dist/checks/quality/patterns/throws-documentation.js.map +1 -1
- package/dist/checks/quality/patterns/toctou-race-condition-classify.d.ts +23 -0
- package/dist/checks/quality/patterns/toctou-race-condition-classify.d.ts.map +1 -0
- package/dist/checks/quality/patterns/toctou-race-condition-classify.js +125 -0
- package/dist/checks/quality/patterns/toctou-race-condition-classify.js.map +1 -0
- package/dist/checks/quality/patterns/toctou-race-condition-collection.d.ts +24 -0
- package/dist/checks/quality/patterns/toctou-race-condition-collection.d.ts.map +1 -0
- package/dist/checks/quality/patterns/toctou-race-condition-collection.js +248 -0
- package/dist/checks/quality/patterns/toctou-race-condition-collection.js.map +1 -0
- package/dist/checks/quality/patterns/toctou-race-condition-constants.d.ts +32 -0
- package/dist/checks/quality/patterns/toctou-race-condition-constants.d.ts.map +1 -0
- package/dist/checks/quality/patterns/toctou-race-condition-constants.js +116 -0
- package/dist/checks/quality/patterns/toctou-race-condition-constants.js.map +1 -0
- package/dist/checks/quality/patterns/toctou-race-condition.d.ts +1 -29
- package/dist/checks/quality/patterns/toctou-race-condition.d.ts.map +1 -1
- package/dist/checks/quality/patterns/toctou-race-condition.js +11 -536
- package/dist/checks/quality/patterns/toctou-race-condition.js.map +1 -1
- package/dist/checks/quality/unused-config-options.d.ts.map +1 -1
- package/dist/checks/quality/unused-config-options.js +1 -4
- package/dist/checks/quality/unused-config-options.js.map +1 -1
- package/dist/checks/resilience/__tests__/context-mutation.test.js +8 -0
- package/dist/checks/resilience/__tests__/context-mutation.test.js.map +1 -1
- package/dist/checks/resilience/__tests__/detached-promises-sync-detection.test.d.ts +2 -0
- package/dist/checks/resilience/__tests__/detached-promises-sync-detection.test.d.ts.map +1 -0
- package/dist/checks/resilience/__tests__/detached-promises-sync-detection.test.js +98 -0
- package/dist/checks/resilience/__tests__/detached-promises-sync-detection.test.js.map +1 -0
- package/dist/checks/resilience/callback-invocation-safe.d.ts.map +1 -1
- package/dist/checks/resilience/callback-invocation-safe.js +0 -1
- package/dist/checks/resilience/callback-invocation-safe.js.map +1 -1
- package/dist/checks/resilience/context-leakage.d.ts.map +1 -1
- package/dist/checks/resilience/context-leakage.js +1 -0
- package/dist/checks/resilience/context-leakage.js.map +1 -1
- package/dist/checks/resilience/context-mutation.d.ts.map +1 -1
- package/dist/checks/resilience/context-mutation.js +30 -4
- package/dist/checks/resilience/context-mutation.js.map +1 -1
- package/dist/checks/resilience/detached-promises-detection.d.ts +7 -0
- package/dist/checks/resilience/detached-promises-detection.d.ts.map +1 -0
- package/dist/checks/resilience/detached-promises-detection.js +228 -0
- package/dist/checks/resilience/detached-promises-detection.js.map +1 -0
- package/dist/checks/resilience/detached-promises-sync-constants.d.ts +36 -0
- package/dist/checks/resilience/detached-promises-sync-constants.d.ts.map +1 -0
- package/dist/checks/resilience/detached-promises-sync-constants.js +299 -0
- package/dist/checks/resilience/detached-promises-sync-constants.js.map +1 -0
- package/dist/checks/resilience/detached-promises-sync-detection.d.ts +14 -0
- package/dist/checks/resilience/detached-promises-sync-detection.d.ts.map +1 -0
- package/dist/checks/resilience/detached-promises-sync-detection.js +69 -0
- package/dist/checks/resilience/detached-promises-sync-detection.js.map +1 -0
- package/dist/checks/resilience/detached-promises.d.ts +1 -14
- package/dist/checks/resilience/detached-promises.d.ts.map +1 -1
- package/dist/checks/resilience/detached-promises.js +2 -598
- package/dist/checks/resilience/detached-promises.js.map +1 -1
- package/dist/checks/resilience/no-raw-fetch.d.ts.map +1 -1
- package/dist/checks/resilience/no-raw-fetch.js +1 -0
- package/dist/checks/resilience/no-raw-fetch.js.map +1 -1
- package/dist/checks/resilience/no-unbounded-concurrency.d.ts.map +1 -1
- package/dist/checks/resilience/no-unbounded-concurrency.js +1 -0
- package/dist/checks/resilience/no-unbounded-concurrency.js.map +1 -1
- package/dist/checks/security/sql-injection.d.ts.map +1 -1
- package/dist/checks/security/sql-injection.js +0 -1
- package/dist/checks/security/sql-injection.js.map +1 -1
- package/dist/display/architecture.d.ts.map +1 -1
- package/dist/display/architecture.js +1 -0
- package/dist/display/architecture.js.map +1 -1
- package/dist/display/types.d.ts.map +1 -1
- package/dist/display/types.js +0 -1
- package/dist/display/types.js.map +1 -1
- package/package.json +5 -5
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
// @fitness-ignore-file file-length-limit -- AST detection requires both an AST visitor pipeline and the merged sync-call constants kept in this file
|
|
2
1
|
// @fitness-ignore-file unused-config-options -- Config options reserved for future use or environment-specific
|
|
3
2
|
// @fitness-ignore-file canonical-result-usage -- References Result pattern in comments and regex patterns for detection, not actual Result usage
|
|
4
3
|
/**
|
|
@@ -14,602 +13,8 @@
|
|
|
14
13
|
* {@link DetachedPromisesConfig}. The check reads that block via
|
|
15
14
|
* `getCheckConfig` and merges it into the effective sync-call sets.
|
|
16
15
|
*/
|
|
17
|
-
import { defineCheck,
|
|
18
|
-
import {
|
|
19
|
-
import * as ts from 'typescript';
|
|
20
|
-
/**
|
|
21
|
-
* Known synchronous functions that do NOT return promises. Limited to
|
|
22
|
-
* generic JS / TS / Node defaults; framework-specific entries live in
|
|
23
|
-
* recipe config under `additionalSyncFunctions`.
|
|
24
|
-
*/
|
|
25
|
-
const KNOWN_SYNC_FUNCTIONS = new Set([
|
|
26
|
-
// Node.js sync filesystem / process methods
|
|
27
|
-
'execSync',
|
|
28
|
-
'readFileSync',
|
|
29
|
-
'writeFileSync',
|
|
30
|
-
'existsSync',
|
|
31
|
-
'mkdirSync',
|
|
32
|
-
'rmdirSync',
|
|
33
|
-
'readdirSync',
|
|
34
|
-
'statSync',
|
|
35
|
-
'lstatSync',
|
|
36
|
-
'unlinkSync',
|
|
37
|
-
'copyFileSync',
|
|
38
|
-
'renameSync',
|
|
39
|
-
'accessSync',
|
|
40
|
-
// Timer clearing/scheduling helpers (sync side)
|
|
41
|
-
'clearTimeout',
|
|
42
|
-
'clearInterval',
|
|
43
|
-
'clearImmediate',
|
|
44
|
-
// Console (synchronous)
|
|
45
|
-
'log',
|
|
46
|
-
'time',
|
|
47
|
-
'timeEnd',
|
|
48
|
-
// Promise resolution helpers (sync wrappers)
|
|
49
|
-
'reject',
|
|
50
|
-
'resolve',
|
|
51
|
-
// Builder / coercion terminators
|
|
52
|
-
'build',
|
|
53
|
-
'toJSON',
|
|
54
|
-
'toString',
|
|
55
|
-
'valueOf',
|
|
56
|
-
// Array methods (synchronous)
|
|
57
|
-
'map',
|
|
58
|
-
'filter',
|
|
59
|
-
'reduce',
|
|
60
|
-
'find',
|
|
61
|
-
'findIndex',
|
|
62
|
-
'some',
|
|
63
|
-
'every',
|
|
64
|
-
'includes',
|
|
65
|
-
'indexOf',
|
|
66
|
-
'slice',
|
|
67
|
-
'concat',
|
|
68
|
-
'join',
|
|
69
|
-
'sort',
|
|
70
|
-
'reverse',
|
|
71
|
-
'push',
|
|
72
|
-
'pop',
|
|
73
|
-
'shift',
|
|
74
|
-
'unshift',
|
|
75
|
-
'splice',
|
|
76
|
-
'fill',
|
|
77
|
-
'copyWithin',
|
|
78
|
-
'flat',
|
|
79
|
-
'flatMap',
|
|
80
|
-
'forEach',
|
|
81
|
-
// String methods (synchronous)
|
|
82
|
-
'toLowerCase',
|
|
83
|
-
'toUpperCase',
|
|
84
|
-
'trim',
|
|
85
|
-
'trimStart',
|
|
86
|
-
'trimEnd',
|
|
87
|
-
'split',
|
|
88
|
-
'replace',
|
|
89
|
-
'replaceAll',
|
|
90
|
-
'substring',
|
|
91
|
-
'substr',
|
|
92
|
-
'charAt',
|
|
93
|
-
'charCodeAt',
|
|
94
|
-
'codePointAt',
|
|
95
|
-
'startsWith',
|
|
96
|
-
'endsWith',
|
|
97
|
-
'padStart',
|
|
98
|
-
'padEnd',
|
|
99
|
-
'repeat',
|
|
100
|
-
'match',
|
|
101
|
-
'matchAll',
|
|
102
|
-
'search',
|
|
103
|
-
'normalize',
|
|
104
|
-
'localeCompare',
|
|
105
|
-
// Object methods (synchronous)
|
|
106
|
-
'keys',
|
|
107
|
-
'values',
|
|
108
|
-
'entries',
|
|
109
|
-
'assign',
|
|
110
|
-
'freeze',
|
|
111
|
-
'seal',
|
|
112
|
-
'fromEntries',
|
|
113
|
-
'create',
|
|
114
|
-
'defineProperty',
|
|
115
|
-
'defineProperties',
|
|
116
|
-
'getOwnPropertyNames',
|
|
117
|
-
'getOwnPropertyDescriptor',
|
|
118
|
-
'getPrototypeOf',
|
|
119
|
-
'setPrototypeOf',
|
|
120
|
-
'hasOwnProperty',
|
|
121
|
-
'isPrototypeOf',
|
|
122
|
-
'propertyIsEnumerable',
|
|
123
|
-
// JSON methods
|
|
124
|
-
'stringify',
|
|
125
|
-
'parse',
|
|
126
|
-
// Math methods
|
|
127
|
-
'floor',
|
|
128
|
-
'ceil',
|
|
129
|
-
'round',
|
|
130
|
-
'max',
|
|
131
|
-
'min',
|
|
132
|
-
'abs',
|
|
133
|
-
'random',
|
|
134
|
-
'pow',
|
|
135
|
-
'sqrt',
|
|
136
|
-
'sign',
|
|
137
|
-
'trunc',
|
|
138
|
-
// Set/Map/WeakMap/WeakSet methods (synchronous)
|
|
139
|
-
'add',
|
|
140
|
-
'delete',
|
|
141
|
-
'has',
|
|
142
|
-
'clear',
|
|
143
|
-
'get',
|
|
144
|
-
'set',
|
|
145
|
-
'size',
|
|
146
|
-
// EventEmitter methods (synchronous)
|
|
147
|
-
'emit',
|
|
148
|
-
'on',
|
|
149
|
-
'off',
|
|
150
|
-
'once',
|
|
151
|
-
'addListener',
|
|
152
|
-
'removeListener',
|
|
153
|
-
'removeAllListeners',
|
|
154
|
-
'prependListener',
|
|
155
|
-
'prependOnceListener',
|
|
156
|
-
'eventNames',
|
|
157
|
-
'listeners',
|
|
158
|
-
'listenerCount',
|
|
159
|
-
'rawListeners',
|
|
160
|
-
// Date methods (synchronous)
|
|
161
|
-
'getTime',
|
|
162
|
-
'getDate',
|
|
163
|
-
'getDay',
|
|
164
|
-
'getFullYear',
|
|
165
|
-
'getHours',
|
|
166
|
-
'getMinutes',
|
|
167
|
-
'getSeconds',
|
|
168
|
-
'getMilliseconds',
|
|
169
|
-
'setTime',
|
|
170
|
-
'setDate',
|
|
171
|
-
'setFullYear',
|
|
172
|
-
'setHours',
|
|
173
|
-
'setMinutes',
|
|
174
|
-
'setSeconds',
|
|
175
|
-
'setMilliseconds',
|
|
176
|
-
'toISOString',
|
|
177
|
-
'toDateString',
|
|
178
|
-
'toTimeString',
|
|
179
|
-
'toLocaleDateString',
|
|
180
|
-
'toLocaleTimeString',
|
|
181
|
-
'toLocaleString',
|
|
182
|
-
'now',
|
|
183
|
-
]);
|
|
184
|
-
/**
|
|
185
|
-
* Known synchronous receiver identifiers — generic JS / Node namespaces.
|
|
186
|
-
* When the receiver (object before the dot) matches these, the call is
|
|
187
|
-
* likely synchronous. Framework-specific receivers (Fastify, Pyroscope,
|
|
188
|
-
* OTel propagation, Vitest, etc.) live in recipe config under
|
|
189
|
-
* `additionalSyncReceivers`.
|
|
190
|
-
*/
|
|
191
|
-
const KNOWN_SYNC_RECEIVERS = new Set([
|
|
192
|
-
// Logging/output (synchronous — write to buffer). `log` is the common
|
|
193
|
-
// logger-variable shorthand; the receiver-pattern list below only matches
|
|
194
|
-
// names containing the literal `logger`, so `log.info(...)` (a void logger
|
|
195
|
-
// call) would otherwise be a false positive. Exact match avoids the
|
|
196
|
-
// substring breadth of adding `log` to the pattern list (catalog/dialog).
|
|
197
|
-
'console',
|
|
198
|
-
'log',
|
|
199
|
-
// Node.js built-ins (synchronous APIs)
|
|
200
|
-
'path',
|
|
201
|
-
'fs',
|
|
202
|
-
'process',
|
|
203
|
-
// JavaScript built-in objects (synchronous)
|
|
204
|
-
'JSON',
|
|
205
|
-
'Math',
|
|
206
|
-
'Object',
|
|
207
|
-
'Array',
|
|
208
|
-
'String',
|
|
209
|
-
'Number',
|
|
210
|
-
'Date',
|
|
211
|
-
'RegExp',
|
|
212
|
-
'Symbol',
|
|
213
|
-
'Boolean',
|
|
214
|
-
'Error',
|
|
215
|
-
'Map',
|
|
216
|
-
'Set',
|
|
217
|
-
'WeakMap',
|
|
218
|
-
'WeakSet',
|
|
219
|
-
'Reflect',
|
|
220
|
-
'Proxy',
|
|
221
|
-
'Intl',
|
|
222
|
-
]);
|
|
223
|
-
/**
|
|
224
|
-
* Substrings to match against receiver variable names (case-insensitive).
|
|
225
|
-
* If a receiver name contains any of these, the call is likely synchronous.
|
|
226
|
-
*/
|
|
227
|
-
const KNOWN_SYNC_RECEIVER_PATTERNS = [
|
|
228
|
-
'logger',
|
|
229
|
-
'writer',
|
|
230
|
-
'emitter',
|
|
231
|
-
'registry',
|
|
232
|
-
'cache',
|
|
233
|
-
'store',
|
|
234
|
-
'queue',
|
|
235
|
-
'buffer',
|
|
236
|
-
'timer',
|
|
237
|
-
'counter',
|
|
238
|
-
'gauge',
|
|
239
|
-
// The scope-owned DiagnosticsBus is a synchronous event sink (its `event` /
|
|
240
|
-
// `counter` / `emit` push onto an in-memory array and return void), exactly
|
|
241
|
-
// like a logger/emitter — `diagnostics.event(...)` is never a detached promise.
|
|
242
|
-
'diagnostics',
|
|
243
|
-
];
|
|
244
|
-
/**
|
|
245
|
-
* File path patterns that indicate CLI commands or route registrations.
|
|
246
|
-
* These files are dominated by sync calls in async contexts and produce
|
|
247
|
-
* excessive false positives.
|
|
248
|
-
*/
|
|
249
|
-
const FILE_SKIP_PATTERNS = [
|
|
250
|
-
'/commands/',
|
|
251
|
-
'/routes/',
|
|
252
|
-
'/route-handlers/',
|
|
253
|
-
'/handlers/',
|
|
254
|
-
'/plugins/',
|
|
255
|
-
'register-routes',
|
|
256
|
-
'register-plugins',
|
|
257
|
-
];
|
|
258
|
-
/**
|
|
259
|
-
* Method-name prefixes that indicate synchronous calls. Limited to broadly
|
|
260
|
-
* applicable JS conventions — boolean predicates, property accessors and
|
|
261
|
-
* mutators, EventEmitter-style. Project-specific prefixes (e.g. `wire`,
|
|
262
|
-
* `enforce`, `init` for DBOS step `.init`) come from the recipe via
|
|
263
|
-
* `additionalSyncPrefixes`.
|
|
264
|
-
*/
|
|
265
|
-
const KNOWN_SYNC_PREFIXES = [
|
|
266
|
-
// Property accessors & mutators
|
|
267
|
-
'set',
|
|
268
|
-
'get',
|
|
269
|
-
'add',
|
|
270
|
-
'remove',
|
|
271
|
-
'delete',
|
|
272
|
-
'clear',
|
|
273
|
-
'reset',
|
|
274
|
-
// Boolean predicates
|
|
275
|
-
'is',
|
|
276
|
-
'has',
|
|
277
|
-
'can',
|
|
278
|
-
'should',
|
|
279
|
-
'was',
|
|
280
|
-
'will',
|
|
281
|
-
// Assertions — `assert*` functions (Node `assert`, TS assertion signatures,
|
|
282
|
-
// test-framework asserts) throw or return void synchronously by convention.
|
|
283
|
-
'assert',
|
|
284
|
-
// EventEmitter-style
|
|
285
|
-
'emit',
|
|
286
|
-
'on',
|
|
287
|
-
'off',
|
|
288
|
-
'once',
|
|
289
|
-
'dispatch',
|
|
290
|
-
];
|
|
291
|
-
/**
|
|
292
|
-
* Method name suffixes that indicate synchronous calls.
|
|
293
|
-
* Methods ending with these suffixes are synchronous by convention.
|
|
294
|
-
*/
|
|
295
|
-
const KNOWN_SYNC_SUFFIXES = ['Sync'];
|
|
296
|
-
/**
|
|
297
|
-
* Fire-and-forget patterns that are intentionally not awaited.
|
|
298
|
-
* These are scheduler functions that run callbacks async.
|
|
299
|
-
*/
|
|
300
|
-
const FIRE_AND_FORGET_PATTERNS = new Set([
|
|
301
|
-
'setImmediate',
|
|
302
|
-
'setTimeout',
|
|
303
|
-
'setInterval',
|
|
304
|
-
'nextTick',
|
|
305
|
-
'queueMicrotask',
|
|
306
|
-
]);
|
|
307
|
-
/**
|
|
308
|
-
* Build effective sync-call lookup sets by merging built-in defaults with the
|
|
309
|
-
* recipe-provided augmentation for `detached-promises`.
|
|
310
|
-
*/
|
|
311
|
-
function buildEffectiveSyncSets() {
|
|
312
|
-
const cfg = getCheckConfig('detached-promises');
|
|
313
|
-
const fns = new Set(KNOWN_SYNC_FUNCTIONS);
|
|
314
|
-
for (const name of cfg.additionalSyncFunctions ?? [])
|
|
315
|
-
fns.add(name);
|
|
316
|
-
const recvs = new Set(KNOWN_SYNC_RECEIVERS);
|
|
317
|
-
for (const name of cfg.additionalSyncReceivers ?? [])
|
|
318
|
-
recvs.add(name);
|
|
319
|
-
const prefixes = [...KNOWN_SYNC_PREFIXES, ...(cfg.additionalSyncPrefixes ?? [])];
|
|
320
|
-
return { syncFunctions: fns, syncReceivers: recvs, syncPrefixes: prefixes };
|
|
321
|
-
}
|
|
322
|
-
/**
|
|
323
|
-
* Check if a method call expression is to a known synchronous receiver or method.
|
|
324
|
-
*/
|
|
325
|
-
// eslint-disable-next-line sonarjs/cognitive-complexity -- multi-pattern dispatcher: distinguishes receivers, methods, and aliased members across N known sync APIs
|
|
326
|
-
function isKnownSyncMethodCall(expr, sets) {
|
|
327
|
-
const methodName = expr.name.text;
|
|
328
|
-
const receiverExpr = expr.expression;
|
|
329
|
-
// Check if method is known sync, fire-and-forget, or matches sync prefix
|
|
330
|
-
if (sets.syncFunctions.has(methodName) ||
|
|
331
|
-
FIRE_AND_FORGET_PATTERNS.has(methodName) ||
|
|
332
|
-
matchesSyncNamePattern(methodName, sets)) {
|
|
333
|
-
return true;
|
|
334
|
-
}
|
|
335
|
-
// Check if receiver is known sync object: logger.info(), path.join(), etc.
|
|
336
|
-
if (ts.isIdentifier(receiverExpr)) {
|
|
337
|
-
const receiverName = receiverExpr.text;
|
|
338
|
-
if (sets.syncReceivers.has(receiverName)) {
|
|
339
|
-
return true;
|
|
340
|
-
}
|
|
341
|
-
// Handle this.logger.info() via logger at end
|
|
342
|
-
if (receiverName === 'this') {
|
|
343
|
-
return false;
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
// Handle nested: this.logger.info(), this.config.get(), this.callbacks.onUpdate()
|
|
347
|
-
if (ts.isPropertyAccessExpression(receiverExpr)) {
|
|
348
|
-
const nestedName = receiverExpr.name.text;
|
|
349
|
-
if (sets.syncReceivers.has(nestedName)) {
|
|
350
|
-
return true;
|
|
351
|
-
}
|
|
352
|
-
// Also walk to the root identifier of the chain. e.g. Pyroscope.default.start()
|
|
353
|
-
// — the call's receiver is `Pyroscope.default` (PropertyAccess); the rightmost
|
|
354
|
-
// segment is `default`, but the SDK identity is `Pyroscope`. Walk left to find it.
|
|
355
|
-
let cursor = receiverExpr.expression;
|
|
356
|
-
while (cursor && ts.isPropertyAccessExpression(cursor)) {
|
|
357
|
-
cursor = cursor.expression;
|
|
358
|
-
}
|
|
359
|
-
if (ts.isIdentifier(cursor) && sets.syncReceivers.has(cursor.text)) {
|
|
360
|
-
return true;
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
// Check receiver name pattern matching (e.g. myLogger.info(), cliWriter.output())
|
|
364
|
-
if (ts.isIdentifier(receiverExpr)) {
|
|
365
|
-
const receiverName = receiverExpr.text.toLowerCase();
|
|
366
|
-
if (KNOWN_SYNC_RECEIVER_PATTERNS.some((pattern) => receiverName.includes(pattern))) {
|
|
367
|
-
return true;
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
return false;
|
|
371
|
-
}
|
|
372
|
-
/**
|
|
373
|
-
* Check if a function/method name matches a known synchronous prefix or suffix.
|
|
374
|
-
*/
|
|
375
|
-
function matchesSyncNamePattern(name, sets) {
|
|
376
|
-
if (sets.syncPrefixes.some((prefix) => name.startsWith(prefix)))
|
|
377
|
-
return true;
|
|
378
|
-
if (KNOWN_SYNC_SUFFIXES.some((suffix) => name.endsWith(suffix)))
|
|
379
|
-
return true;
|
|
380
|
-
return false;
|
|
381
|
-
}
|
|
382
|
-
/**
|
|
383
|
-
* Check if a call expression is to a known synchronous function
|
|
384
|
-
*/
|
|
385
|
-
function isKnownSyncCall(node, sets) {
|
|
386
|
-
const expr = node.expression;
|
|
387
|
-
// super() calls — constructor delegation, always synchronous
|
|
388
|
-
if (expr.kind === ts.SyntaxKind.SuperKeyword) {
|
|
389
|
-
return true;
|
|
390
|
-
}
|
|
391
|
-
// Direct function call: functionName()
|
|
392
|
-
if (ts.isIdentifier(expr)) {
|
|
393
|
-
const name = expr.text;
|
|
394
|
-
if (sets.syncFunctions.has(name) ||
|
|
395
|
-
FIRE_AND_FORGET_PATTERNS.has(name) ||
|
|
396
|
-
matchesSyncNamePattern(name, sets)) {
|
|
397
|
-
return true;
|
|
398
|
-
}
|
|
399
|
-
}
|
|
400
|
-
// Method call: receiver.method()
|
|
401
|
-
if (ts.isPropertyAccessExpression(expr)) {
|
|
402
|
-
return isKnownSyncMethodCall(expr, sets);
|
|
403
|
-
}
|
|
404
|
-
return false;
|
|
405
|
-
}
|
|
406
|
-
/**
|
|
407
|
-
* Check if a call expression has explicit promise handling via .then/.catch/.finally chain
|
|
408
|
-
*/
|
|
409
|
-
function hasPromiseChainHandling(node) {
|
|
410
|
-
const expr = node.expression;
|
|
411
|
-
if (!ts.isCallExpression(expr))
|
|
412
|
-
return false;
|
|
413
|
-
// Check if the call itself is a .then/.catch/.finally method
|
|
414
|
-
if (ts.isPropertyAccessExpression(expr.expression)) {
|
|
415
|
-
const methodName = expr.expression.name.text;
|
|
416
|
-
if (methodName === 'then' || methodName === 'catch' || methodName === 'finally') {
|
|
417
|
-
return true;
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
return false;
|
|
421
|
-
}
|
|
422
|
-
/**
|
|
423
|
-
* Check if a statement is a floating expression (not assigned, awaited, or returned)
|
|
424
|
-
*/
|
|
425
|
-
function isFloatingExpression(node) {
|
|
426
|
-
const expr = node.expression;
|
|
427
|
-
// Check for void prefix: void doSomething()
|
|
428
|
-
if (expr.kind === ts.SyntaxKind.VoidExpression) {
|
|
429
|
-
return false; // Explicitly voided
|
|
430
|
-
}
|
|
431
|
-
// Must be a call expression
|
|
432
|
-
if (!ts.isCallExpression(expr))
|
|
433
|
-
return false;
|
|
434
|
-
// Pattern: `(await x.foo()).bar()` and similar paren-wrapped awaits with a chained call.
|
|
435
|
-
// The outer call is a CallExpression whose callee descends through PropertyAccess/Element
|
|
436
|
-
// access into a ParenthesizedExpression wrapping an AwaitExpression. The await is the
|
|
437
|
-
// real promise consumer; the chained sync call after it is not a floating promise.
|
|
438
|
-
if (containsAwaitedReceiver(expr))
|
|
439
|
-
return false;
|
|
440
|
-
// Pattern: `unwrap(await x.foo())`, `assertOk(await fn())`, `expectSuccess(await ...)`.
|
|
441
|
-
// The outer call wraps an awaited promise — a sync helper that consumes a Result/value.
|
|
442
|
-
// The await is the real promise consumer; the floating outer call only operates on the
|
|
443
|
-
// already-resolved value. Marking the statement as floating produces false positives at
|
|
444
|
-
// every boundary that uses a sync result-unwrap helper.
|
|
445
|
-
if (hasAwaitedArgument(expr))
|
|
446
|
-
return false;
|
|
447
|
-
return true;
|
|
448
|
-
}
|
|
449
|
-
/**
|
|
450
|
-
* Return true if any direct argument of the call is an `await` expression
|
|
451
|
-
* (or an `await` wrapped in parentheses / a non-null assertion). A floating
|
|
452
|
-
* `outer(await inner())` statement has the await as its real promise
|
|
453
|
-
* consumer; the outer sync wrapper is not a detached promise.
|
|
454
|
-
*/
|
|
455
|
-
function hasAwaitedArgument(call) {
|
|
456
|
-
for (const arg of call.arguments) {
|
|
457
|
-
if (isAwaitedExpression(arg))
|
|
458
|
-
return true;
|
|
459
|
-
}
|
|
460
|
-
return false;
|
|
461
|
-
}
|
|
462
|
-
/**
|
|
463
|
-
* Walk through paren-wrap / non-null-assertion noise to determine whether
|
|
464
|
-
* the underlying expression is an `await`.
|
|
465
|
-
*/
|
|
466
|
-
function isAwaitedExpression(node) {
|
|
467
|
-
let current = node;
|
|
468
|
-
while (current) {
|
|
469
|
-
if (ts.isAwaitExpression(current))
|
|
470
|
-
return true;
|
|
471
|
-
if (ts.isParenthesizedExpression(current)) {
|
|
472
|
-
current = current.expression;
|
|
473
|
-
continue;
|
|
474
|
-
}
|
|
475
|
-
if (ts.isNonNullExpression(current)) {
|
|
476
|
-
current = current.expression;
|
|
477
|
-
continue;
|
|
478
|
-
}
|
|
479
|
-
break;
|
|
480
|
-
}
|
|
481
|
-
return false;
|
|
482
|
-
}
|
|
483
|
-
/**
|
|
484
|
-
* Walk a call expression's receiver chain and return true if it descends into
|
|
485
|
-
* a `(await X)` parenthesized await. Handles `(await x.f()).g()` and longer
|
|
486
|
-
* tails like `(await x.f()).g().h`.
|
|
487
|
-
*/
|
|
488
|
-
function containsAwaitedReceiver(call) {
|
|
489
|
-
let current = call.expression;
|
|
490
|
-
while (current) {
|
|
491
|
-
if (ts.isParenthesizedExpression(current)) {
|
|
492
|
-
const inner = current.expression;
|
|
493
|
-
if (ts.isAwaitExpression(inner))
|
|
494
|
-
return true;
|
|
495
|
-
current = inner;
|
|
496
|
-
continue;
|
|
497
|
-
}
|
|
498
|
-
if (ts.isPropertyAccessExpression(current) || ts.isElementAccessExpression(current)) {
|
|
499
|
-
current = current.expression;
|
|
500
|
-
continue;
|
|
501
|
-
}
|
|
502
|
-
if (ts.isCallExpression(current)) {
|
|
503
|
-
current = current.expression;
|
|
504
|
-
continue;
|
|
505
|
-
}
|
|
506
|
-
if (ts.isNonNullExpression(current)) {
|
|
507
|
-
current = current.expression;
|
|
508
|
-
continue;
|
|
509
|
-
}
|
|
510
|
-
break;
|
|
511
|
-
}
|
|
512
|
-
return false;
|
|
513
|
-
}
|
|
514
|
-
/**
|
|
515
|
-
* Check if a `this.methodName()` call targets a method defined as synchronous
|
|
516
|
-
* in the same class. Walks up to the enclosing class declaration, finds a
|
|
517
|
-
* method with the matching name, and returns true only when it lacks the
|
|
518
|
-
* `async` modifier.
|
|
519
|
-
*/
|
|
520
|
-
function isDefinedAsSyncInSameFile(expr) {
|
|
521
|
-
// Must be this.method() pattern
|
|
522
|
-
if (!ts.isPropertyAccessExpression(expr.expression))
|
|
523
|
-
return false;
|
|
524
|
-
const propAccess = expr.expression;
|
|
525
|
-
if (propAccess.expression.kind !== ts.SyntaxKind.ThisKeyword)
|
|
526
|
-
return false;
|
|
527
|
-
const methodName = propAccess.name.text;
|
|
528
|
-
// Walk up to the enclosing class
|
|
529
|
-
let current = expr.parent;
|
|
530
|
-
while (current && !ts.isClassDeclaration(current) && !ts.isClassExpression(current)) {
|
|
531
|
-
current = current.parent;
|
|
532
|
-
}
|
|
533
|
-
if (!current)
|
|
534
|
-
return false;
|
|
535
|
-
// Look for a method with the same name in the class
|
|
536
|
-
for (const member of current.members) {
|
|
537
|
-
if (!ts.isMethodDeclaration(member))
|
|
538
|
-
continue;
|
|
539
|
-
if (!ts.isIdentifier(member.name))
|
|
540
|
-
continue;
|
|
541
|
-
if (member.name.text !== methodName)
|
|
542
|
-
continue;
|
|
543
|
-
// Found the method — check if it is NOT async
|
|
544
|
-
const isAsync = member.modifiers?.some((m) => m.kind === ts.SyntaxKind.AsyncKeyword);
|
|
545
|
-
return !isAsync;
|
|
546
|
-
}
|
|
547
|
-
return false;
|
|
548
|
-
}
|
|
549
|
-
/**
|
|
550
|
-
* Analyze a file for detached promise issues
|
|
551
|
-
*/
|
|
552
|
-
function analyzeFileForDetachedPromises(content, filePath) {
|
|
553
|
-
const violations = [];
|
|
554
|
-
// Skip CLI command files and route registrations — dominated by sync calls in async contexts
|
|
555
|
-
if (FILE_SKIP_PATTERNS.some((pattern) => filePath.includes(pattern))) {
|
|
556
|
-
return violations;
|
|
557
|
-
}
|
|
558
|
-
// Build the effective sync-call sets once per file from defaults + recipe config.
|
|
559
|
-
const sets = buildEffectiveSyncSets();
|
|
560
|
-
try {
|
|
561
|
-
// @lazy-ok -- 'await' appears in string literals, not actual await expression
|
|
562
|
-
const sourceFile = getSharedSourceFile(filePath, content);
|
|
563
|
-
if (!sourceFile)
|
|
564
|
-
return [];
|
|
565
|
-
const visit = (node) => {
|
|
566
|
-
ts.forEachChild(node, visit);
|
|
567
|
-
// Only check expression statements (standalone calls ending with ;)
|
|
568
|
-
if (!ts.isExpressionStatement(node))
|
|
569
|
-
return;
|
|
570
|
-
// Skip void expressions entirely (explicitly fire-and-forget)
|
|
571
|
-
if (node.expression.kind === ts.SyntaxKind.VoidExpression)
|
|
572
|
-
return;
|
|
573
|
-
// Skip expressions with .then/.catch/.finally chains (explicitly handled)
|
|
574
|
-
if (hasPromiseChainHandling(node))
|
|
575
|
-
return;
|
|
576
|
-
// Must be a call expression
|
|
577
|
-
const expr = node.expression;
|
|
578
|
-
if (!ts.isCallExpression(expr))
|
|
579
|
-
return;
|
|
580
|
-
// Must be inside an async context
|
|
581
|
-
if (!isInAsyncContext(node))
|
|
582
|
-
return;
|
|
583
|
-
// Skip known synchronous calls
|
|
584
|
-
if (isKnownSyncCall(expr, sets))
|
|
585
|
-
return;
|
|
586
|
-
// Skip this.method() calls where method is defined as sync in the same class
|
|
587
|
-
if (isDefinedAsSyncInSameFile(expr))
|
|
588
|
-
return;
|
|
589
|
-
// Skip if this is a floating expression that's not a detached promise
|
|
590
|
-
if (!isFloatingExpression(node))
|
|
591
|
-
return;
|
|
592
|
-
const { line, character } = sourceFile.getLineAndCharacterOfPosition(node.getStart());
|
|
593
|
-
const lineNum = line + 1;
|
|
594
|
-
const matchText = node.getText(sourceFile);
|
|
595
|
-
violations.push({
|
|
596
|
-
line: lineNum,
|
|
597
|
-
column: character + 1,
|
|
598
|
-
message: 'Possible detached promise (missing await)',
|
|
599
|
-
severity: 'warning',
|
|
600
|
-
type: 'detached-promise',
|
|
601
|
-
suggestion: 'Add await to ensure the promise is handled, or use void with error handling if intentionally fire-and-forget',
|
|
602
|
-
match: matchText,
|
|
603
|
-
filePath,
|
|
604
|
-
});
|
|
605
|
-
};
|
|
606
|
-
visit(sourceFile);
|
|
607
|
-
}
|
|
608
|
-
catch {
|
|
609
|
-
// @swallow-ok Skip files that fail to parse
|
|
610
|
-
}
|
|
611
|
-
return violations;
|
|
612
|
-
}
|
|
16
|
+
import { defineCheck, isTestFile } from '@opensip-cli/fitness';
|
|
17
|
+
import { analyzeFileForDetachedPromises } from './detached-promises-detection.js';
|
|
613
18
|
/**
|
|
614
19
|
* Check: resilience/detached-promises
|
|
615
20
|
*
|
|
@@ -641,7 +46,6 @@ export const detachedPromises = defineCheck({
|
|
|
641
46
|
tags: ['resilience', 'async', 'promises'],
|
|
642
47
|
fileTypes: ['ts'],
|
|
643
48
|
analyze(content, filePath) {
|
|
644
|
-
// Skip test files — detached promises in tests are low-risk
|
|
645
49
|
if (isTestFile(filePath))
|
|
646
50
|
return [];
|
|
647
51
|
return analyzeFileForDetachedPromises(content, filePath);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detached-promises.js","sourceRoot":"","sources":["../../../src/checks/resilience/detached-promises.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"detached-promises.js","sourceRoot":"","sources":["../../../src/checks/resilience/detached-promises.ts"],"names":[],"mappings":"AAAA,+GAA+G;AAC/G,iJAAiJ;AACjJ;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,WAAW,EAAE,UAAU,EAAuB,MAAM,sBAAsB,CAAC;AAEpF,OAAO,EAAE,8BAA8B,EAAE,MAAM,kCAAkC,CAAC;AAElF;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,WAAW,CAAC;IAC1C,EAAE,EAAE,sCAAsC;IAC1C,IAAI,EAAE,mBAAmB;IACzB,KAAK,EAAE,EAAE,SAAS,EAAE,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,KAAK,CAAC,EAAE;IAC9E,aAAa,EAAE,eAAe;IAE9B,UAAU,EAAE,MAAM;IAClB,WAAW,EAAE,qEAAqE;IAClF,eAAe,EAAE;;;;;;;;;gGAS6E;IAC9F,IAAI,EAAE,CAAC,YAAY,EAAE,OAAO,EAAE,UAAU,CAAC;IACzC,SAAS,EAAE,CAAC,IAAI,CAAC;IAEjB,OAAO,CAAC,OAAe,EAAE,QAAgB;QACvC,IAAI,UAAU,CAAC,QAAQ,CAAC;YAAE,OAAO,EAAE,CAAC;QACpC,OAAO,8BAA8B,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC3D,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-raw-fetch.d.ts","sourceRoot":"","sources":["../../../src/checks/resilience/no-raw-fetch.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH;;;;;GAKG;AACH,MAAM,WAAW,gBAAiB,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC/D;;;;OAIG;IACH,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC/B;AAkBD;;;;GAIG;AACH,eAAO,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"no-raw-fetch.d.ts","sourceRoot":"","sources":["../../../src/checks/resilience/no-raw-fetch.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH;;;;;GAKG;AACH,MAAM,WAAW,gBAAiB,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC/D;;;;OAIG;IACH,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC/B;AAkBD;;;;GAIG;AACH,eAAO,MAAM,UAAU,sCAoGrB,CAAC"}
|
|
@@ -26,6 +26,7 @@ const RAW_FETCH_PATTERN = /(?<![\w$.])fetch\s{0,10}\(/g;
|
|
|
26
26
|
export const noRawFetch = defineCheck({
|
|
27
27
|
id: 'cfeba2d8-0f62-4b64-b625-f5ba8a0f3b11',
|
|
28
28
|
slug: 'no-raw-fetch',
|
|
29
|
+
contentFilter: 'strip-strings',
|
|
29
30
|
fileTypes: ['ts', 'tsx', 'js', 'jsx'],
|
|
30
31
|
description: 'Detect direct fetch() calls that should use wrapped HTTP clients',
|
|
31
32
|
longDescription: `**Purpose:** Enforces use of the platform HTTP client wrapper instead of raw \`fetch()\` calls.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-raw-fetch.js","sourceRoot":"","sources":["../../../src/checks/resilience/no-raw-fetch.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"no-raw-fetch.js","sourceRoot":"","sources":["../../../src/checks/resilience/no-raw-fetch.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-unbounded-concurrency.d.ts","sourceRoot":"","sources":["../../../src/checks/resilience/no-unbounded-concurrency.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAkCH;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,
|
|
1
|
+
{"version":3,"file":"no-unbounded-concurrency.d.ts","sourceRoot":"","sources":["../../../src/checks/resilience/no-unbounded-concurrency.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAkCH;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,sCAsFjC,CAAC"}
|
|
@@ -39,6 +39,7 @@ function hasBoundedConcurrencyPattern(content) {
|
|
|
39
39
|
export const noUnboundedConcurrency = defineCheck({
|
|
40
40
|
id: 'fc2a0fee-8374-432b-a7ef-763aea867855',
|
|
41
41
|
slug: 'no-unbounded-concurrency',
|
|
42
|
+
contentFilter: 'strip-strings',
|
|
42
43
|
description: 'Detect Promise.all with unbounded concurrency',
|
|
43
44
|
longDescription: `**Purpose:** Prevents unbounded parallel execution that can overwhelm downstream services or exhaust system resources.
|
|
44
45
|
|