@opensip-cli/checks-typescript 0.1.10 → 0.1.11
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 -3
- 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/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 +115 -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 +0 -4
- package/dist/checks/quality/unused-config-options.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/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,6 +1,4 @@
|
|
|
1
1
|
// @fitness-ignore-file throws-documentation -- Functions throw self-documenting typed errors
|
|
2
|
-
// @fitness-ignore-file toctou-race-condition -- TOCTOU acceptable in this non-concurrent context
|
|
3
|
-
// @fitness-ignore-file file-length-limit -- complex check with tightly coupled hash/normalization/scoring logic; splitting would risk losing the duplicate-detection contract
|
|
4
2
|
/**
|
|
5
3
|
* @fileoverview Duplicate Utility Functions check
|
|
6
4
|
*
|
|
@@ -9,410 +7,9 @@
|
|
|
9
7
|
* 1. Identical implementations - true duplicates that must be deduplicated
|
|
10
8
|
* 2. Same-named functions with different implementations - consolidation opportunities
|
|
11
9
|
*/
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
|
|
15
|
-
import { getSharedSourceFile } from '@opensip-cli/lang-typescript';
|
|
16
|
-
import * as ts from 'typescript';
|
|
17
|
-
/**
|
|
18
|
-
* Common utility function name patterns
|
|
19
|
-
*/
|
|
20
|
-
const UTILITY_PATTERNS = [
|
|
21
|
-
/^format[A-Z]/, // formatDate, formatCurrency
|
|
22
|
-
/^parse[A-Z]/, // parseJson, parseDate
|
|
23
|
-
/^is[A-Z]/, // isValid, isEmpty
|
|
24
|
-
/^has[A-Z]/, // hasValue, hasKey
|
|
25
|
-
/^to[A-Z]/, // toString, toNumber
|
|
26
|
-
/^get[A-Z]/, // getValue, getDefault
|
|
27
|
-
/^validate[A-Z]/, // validateEmail, validatePhone
|
|
28
|
-
/^sanitize[A-Z]/, // sanitizeInput, sanitizeHtml
|
|
29
|
-
/^normalize[A-Z]/, // normalizeUrl, normalizeText
|
|
30
|
-
/^debounce/,
|
|
31
|
-
/^throttle/,
|
|
32
|
-
/^sleep/,
|
|
33
|
-
/^delay/,
|
|
34
|
-
/^retry/,
|
|
35
|
-
/^clamp/,
|
|
36
|
-
/^range/,
|
|
37
|
-
/^chunk/,
|
|
38
|
-
/^unique/,
|
|
39
|
-
/^flatten/,
|
|
40
|
-
];
|
|
41
|
-
/**
|
|
42
|
-
* Minimum function body length (characters) to consider for duplicate detection.
|
|
43
|
-
* Very short functions (1-2 lines) are often trivial and not worth flagging.
|
|
44
|
-
*/
|
|
45
|
-
const MIN_FUNCTION_BODY_LENGTH = 50;
|
|
46
|
-
/**
|
|
47
|
-
* Functions that are intentionally domain-specific and should NOT be flagged
|
|
48
|
-
* as duplicates. Limited to genuinely generic identifiers — config / factory
|
|
49
|
-
* / logger / common type-guard names — that almost any TS codebase will hit.
|
|
50
|
-
*
|
|
51
|
-
* Project-specific names (e.g. opensip's `getCurrentCorrelationId`,
|
|
52
|
-
* `formatDuration`, `getRemoteUrl`, `sanitizeFilename`) belong in a recipe's
|
|
53
|
-
* `checks.config['duplicate-utility-functions'].additionalDomainSpecificFunctions`
|
|
54
|
-
* block. The check reads that list via {@link getCheckConfig} and merges it
|
|
55
|
-
* with these defaults.
|
|
56
|
-
*/
|
|
57
|
-
export const DOMAIN_SPECIFIC_FUNCTION_NAMES = [
|
|
58
|
-
// Config / factory pattern - each domain has its own configuration
|
|
59
|
-
'getConfig',
|
|
60
|
-
'getDefaultConfig',
|
|
61
|
-
'getContainer',
|
|
62
|
-
'getFactory',
|
|
63
|
-
// Logger / shared singletons
|
|
64
|
-
'getLogger',
|
|
65
|
-
// Common predicates that have multiple legitimate definitions
|
|
66
|
-
'isPlainObject',
|
|
67
|
-
'isStringArray',
|
|
68
|
-
'isCommentLine',
|
|
69
|
-
'isTestFile',
|
|
70
|
-
'isValidEmail',
|
|
71
|
-
// Common formatter / parser names that vary by input shape
|
|
72
|
-
'formatDate',
|
|
73
|
-
'formatTimestamp',
|
|
74
|
-
'parseArgs',
|
|
75
|
-
// Common validation entry points
|
|
76
|
-
'validateConfig',
|
|
77
|
-
'validateSchema',
|
|
78
|
-
// Common error-message helper
|
|
79
|
-
'getErrorMessage',
|
|
80
|
-
// AST predicates / shared kernel helpers — each layer (engine, lang adapter,
|
|
81
|
-
// graph adapter) legitimately defines its own implementation tuned to its
|
|
82
|
-
// node shape; the architecture rules prevent cross-layer imports.
|
|
83
|
-
'isPropertyAccess',
|
|
84
|
-
'isFunctionLike',
|
|
85
|
-
'getSharedSourceFile',
|
|
86
|
-
'getLineNumber',
|
|
87
|
-
'isReturnValueDiscarded',
|
|
88
|
-
// Plugin / package discovery (mirrored in fitness + simulation discovery walkers)
|
|
89
|
-
'hasPackageJson',
|
|
90
|
-
// Language-adapter parsers and dir normalizers — one per graph-* pack
|
|
91
|
-
// (graph-go, graph-java, graph-python, graph-rust, graph-typescript) by
|
|
92
|
-
// design; cross-pack imports are forbidden by .config/dependency-cruiser.cjs.
|
|
93
|
-
'normalizeProjectDir',
|
|
94
|
-
'parseProject',
|
|
95
|
-
// Tokenizer helper present in several language-adapter strip-comment passes
|
|
96
|
-
'isIdentChar',
|
|
97
|
-
// Assertion validation — fitness engine + simulation engine each own one
|
|
98
|
-
'validateAssertions',
|
|
99
|
-
];
|
|
100
|
-
// Built once at module load from the immutable name list above. Kept private (a
|
|
101
|
-
// module-level `new Set()` is mutable shared state); the de-leak guard test
|
|
102
|
-
// imports the readonly DOMAIN_SPECIFIC_FUNCTION_NAMES instead.
|
|
103
|
-
const DOMAIN_SPECIFIC_FUNCTIONS = new Set(DOMAIN_SPECIFIC_FUNCTION_NAMES);
|
|
104
|
-
/**
|
|
105
|
-
* Build the effective domain-specific set by merging built-in defaults with
|
|
106
|
-
* the recipe-provided augmentation for `duplicate-utility-functions`.
|
|
107
|
-
*/
|
|
108
|
-
function buildEffectiveDomainSpecificSet() {
|
|
109
|
-
const cfg = getCheckConfig('duplicate-utility-functions');
|
|
110
|
-
if (!cfg.additionalDomainSpecificFunctions ||
|
|
111
|
-
cfg.additionalDomainSpecificFunctions.length === 0) {
|
|
112
|
-
return DOMAIN_SPECIFIC_FUNCTIONS;
|
|
113
|
-
}
|
|
114
|
-
const merged = new Set(DOMAIN_SPECIFIC_FUNCTIONS);
|
|
115
|
-
for (const name of cfg.additionalDomainSpecificFunctions)
|
|
116
|
-
merged.add(name);
|
|
117
|
-
return merged;
|
|
118
|
-
}
|
|
119
|
-
/**
|
|
120
|
-
* Get unique directories from a list of function locations
|
|
121
|
-
*/
|
|
122
|
-
function getUniqueDirectories(locations) {
|
|
123
|
-
/* v8 ignore next -- defensive guard */
|
|
124
|
-
if (!Array.isArray(locations)) {
|
|
125
|
-
return new Set();
|
|
126
|
-
}
|
|
127
|
-
return new Set(locations.map((l) => dirname(l.file)));
|
|
128
|
-
}
|
|
129
|
-
/**
|
|
130
|
-
* Flatten all locations from hash groups into a single array
|
|
131
|
-
*/
|
|
132
|
-
function flattenHashGroups(hashGroups) {
|
|
133
|
-
const allLocations = [];
|
|
134
|
-
if (hashGroups.size === 0) {
|
|
135
|
-
return allLocations;
|
|
136
|
-
}
|
|
137
|
-
for (const locations of hashGroups.values()) {
|
|
138
|
-
if (Array.isArray(locations) && locations.length > 0) {
|
|
139
|
-
allLocations.push(...locations);
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
return allLocations;
|
|
143
|
-
}
|
|
144
|
-
/**
|
|
145
|
-
* Get first location from each hash group (unique implementations)
|
|
146
|
-
*/
|
|
147
|
-
function getFirstFromEachHashGroup(hashGroups) {
|
|
148
|
-
const uniqueImpls = [];
|
|
149
|
-
if (hashGroups.size === 0) {
|
|
150
|
-
return uniqueImpls;
|
|
151
|
-
}
|
|
152
|
-
for (const locations of hashGroups.values()) {
|
|
153
|
-
/* v8 ignore next -- defensive guard */
|
|
154
|
-
if (!Array.isArray(locations) || locations.length === 0) {
|
|
155
|
-
continue;
|
|
156
|
-
}
|
|
157
|
-
const first = locations[0];
|
|
158
|
-
if (first) {
|
|
159
|
-
uniqueImpls.push(first);
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
return uniqueImpls;
|
|
163
|
-
}
|
|
164
|
-
/**
|
|
165
|
-
* Format other files for display in violation message
|
|
166
|
-
*/
|
|
167
|
-
function formatOtherFiles(locations) {
|
|
168
|
-
const otherFiles = locations
|
|
169
|
-
.slice(1)
|
|
170
|
-
.map((l) => basename(l.file))
|
|
171
|
-
.slice(0, 3);
|
|
172
|
-
const moreCount = locations.length > 4 ? ` (+${locations.length - 4} more)` : '';
|
|
173
|
-
return `${otherFiles.join(', ')}${moreCount}`;
|
|
174
|
-
}
|
|
175
|
-
/**
|
|
176
|
-
* Add a function to the functions-by-name collection
|
|
177
|
-
*/
|
|
178
|
-
function addFunctionToCollection(functionsByName, fn) {
|
|
179
|
-
let nameGroup = functionsByName.get(fn.name);
|
|
180
|
-
if (!nameGroup) {
|
|
181
|
-
nameGroup = new Map();
|
|
182
|
-
functionsByName.set(fn.name, nameGroup);
|
|
183
|
-
}
|
|
184
|
-
let hashGroup = nameGroup.get(fn.bodyHash);
|
|
185
|
-
if (!hashGroup) {
|
|
186
|
-
hashGroup = [];
|
|
187
|
-
nameGroup.set(fn.bodyHash, hashGroup);
|
|
188
|
-
}
|
|
189
|
-
hashGroup.push(fn);
|
|
190
|
-
}
|
|
191
|
-
/**
|
|
192
|
-
* Check if locations represent a valid duplicate across multiple directories.
|
|
193
|
-
*/
|
|
194
|
-
function isValidCrossDirectoryDuplicate(locations) {
|
|
195
|
-
/* v8 ignore next -- defensive guard */
|
|
196
|
-
if (!Array.isArray(locations) || locations.length <= 1) {
|
|
197
|
-
return false;
|
|
198
|
-
}
|
|
199
|
-
const locationDirs = getUniqueDirectories(locations);
|
|
200
|
-
return locationDirs.size > 1;
|
|
201
|
-
}
|
|
202
|
-
/**
|
|
203
|
-
* Remove single-line comments from code
|
|
204
|
-
*/
|
|
205
|
-
function removeSingleLineComments(code) {
|
|
206
|
-
return code
|
|
207
|
-
.split('\n')
|
|
208
|
-
.map((line) => {
|
|
209
|
-
const commentIndex = line.indexOf('//');
|
|
210
|
-
return commentIndex === -1 ? line : line.slice(0, commentIndex);
|
|
211
|
-
})
|
|
212
|
-
.join('\n');
|
|
213
|
-
}
|
|
214
|
-
/**
|
|
215
|
-
* Remove multi-line comments from code
|
|
216
|
-
* Uses iterative approach to avoid regex backtracking issues.
|
|
217
|
-
*/
|
|
218
|
-
function removeMultiLineComments(code) {
|
|
219
|
-
let result = '';
|
|
220
|
-
let i = 0;
|
|
221
|
-
while (i < code.length) {
|
|
222
|
-
if (code[i] === '/' && code[i + 1] === '*') {
|
|
223
|
-
const endIndex = code.indexOf('*/', i + 2);
|
|
224
|
-
if (endIndex === -1) {
|
|
225
|
-
break;
|
|
226
|
-
}
|
|
227
|
-
i = endIndex + 2;
|
|
228
|
-
}
|
|
229
|
-
else {
|
|
230
|
-
result += code[i];
|
|
231
|
-
i++;
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
return result;
|
|
235
|
-
}
|
|
236
|
-
/**
|
|
237
|
-
* Normalize function body for comparison.
|
|
238
|
-
* Removes whitespace, comments, and normalizes identifiers.
|
|
239
|
-
*/
|
|
240
|
-
function normalizeBody(body) {
|
|
241
|
-
let normalized = body;
|
|
242
|
-
normalized = removeSingleLineComments(normalized);
|
|
243
|
-
normalized = removeMultiLineComments(normalized);
|
|
244
|
-
normalized = normalized.replaceAll(/\s+/g, ' ');
|
|
245
|
-
normalized = normalized.trim();
|
|
246
|
-
return normalized;
|
|
247
|
-
}
|
|
248
|
-
/**
|
|
249
|
-
* Generate a hash of the normalized function body.
|
|
250
|
-
* Uses SHA-256 for content-addressable deduplication (not for security purposes).
|
|
251
|
-
*/
|
|
252
|
-
function hashBody(body) {
|
|
253
|
-
const normalized = normalizeBody(body);
|
|
254
|
-
return createHash('sha256').update(normalized).digest('hex');
|
|
255
|
-
}
|
|
256
|
-
/**
|
|
257
|
-
* Check if function name matches utility patterns. The `domainSpecific`
|
|
258
|
-
* argument is the effective allowlist (built-in defaults plus any
|
|
259
|
-
* recipe-supplied augmentation).
|
|
260
|
-
*/
|
|
261
|
-
function isUtilityFunction(name, domainSpecific) {
|
|
262
|
-
if (domainSpecific.has(name)) {
|
|
263
|
-
return false;
|
|
264
|
-
}
|
|
265
|
-
return UTILITY_PATTERNS.some((pattern) => pattern.test(name));
|
|
266
|
-
}
|
|
267
|
-
/**
|
|
268
|
-
* Extract utility functions from a file with their body hashes
|
|
269
|
-
*/
|
|
270
|
-
function extractUtilityFunctionsWithBody(filePath, content, domainSpecific) {
|
|
271
|
-
const functions = [];
|
|
272
|
-
try {
|
|
273
|
-
const sourceFile = getSharedSourceFile(filePath, content);
|
|
274
|
-
/* v8 ignore next -- defensive guard */
|
|
275
|
-
if (!sourceFile)
|
|
276
|
-
return [];
|
|
277
|
-
const visit = (node) => {
|
|
278
|
-
// Check function declarations
|
|
279
|
-
if (ts.isFunctionDeclaration(node) && node.name && node.body) {
|
|
280
|
-
const name = node.name.text;
|
|
281
|
-
if (isUtilityFunction(name, domainSpecific)) {
|
|
282
|
-
const { line } = sourceFile.getLineAndCharacterOfPosition(node.getStart());
|
|
283
|
-
const body = node.body.getText(sourceFile);
|
|
284
|
-
functions.push({
|
|
285
|
-
name,
|
|
286
|
-
line: line + 1,
|
|
287
|
-
file: filePath,
|
|
288
|
-
bodyHash: hashBody(body),
|
|
289
|
-
bodyLength: body.length,
|
|
290
|
-
});
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
// Check arrow functions assigned to variables
|
|
294
|
-
if (ts.isVariableDeclaration(node) &&
|
|
295
|
-
ts.isIdentifier(node.name) &&
|
|
296
|
-
node.initializer &&
|
|
297
|
-
ts.isArrowFunction(node.initializer)) {
|
|
298
|
-
const name = node.name.text;
|
|
299
|
-
if (isUtilityFunction(name, domainSpecific)) {
|
|
300
|
-
const { line } = sourceFile.getLineAndCharacterOfPosition(node.getStart());
|
|
301
|
-
const body = node.initializer.body.getText(sourceFile);
|
|
302
|
-
functions.push({
|
|
303
|
-
name,
|
|
304
|
-
line: line + 1,
|
|
305
|
-
file: filePath,
|
|
306
|
-
bodyHash: hashBody(body),
|
|
307
|
-
bodyLength: body.length,
|
|
308
|
-
});
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
ts.forEachChild(node, visit);
|
|
312
|
-
};
|
|
313
|
-
visit(sourceFile);
|
|
314
|
-
/* v8 ignore next 1 -- defensive catch: parse failures already handled */
|
|
315
|
-
}
|
|
316
|
-
catch {
|
|
317
|
-
// @swallow-ok Ignore parse errors
|
|
318
|
-
}
|
|
319
|
-
return functions;
|
|
320
|
-
}
|
|
321
|
-
/**
|
|
322
|
-
* Create a violation for identical implementations
|
|
323
|
-
*/
|
|
324
|
-
function createIdenticalViolation(name, locations) {
|
|
325
|
-
const first = locations[0];
|
|
326
|
-
if (!first) {
|
|
327
|
-
throw new Error(`createIdenticalViolation called with empty locations array for '${name}'`);
|
|
328
|
-
}
|
|
329
|
-
const otherFilesStr = formatOtherFiles(locations);
|
|
330
|
-
return {
|
|
331
|
-
line: first.line,
|
|
332
|
-
message: `Utility function '${name}' has identical implementation in ${locations.length} locations`,
|
|
333
|
-
severity: 'warning',
|
|
334
|
-
suggestion: `Move '${name}' to packages/shared/backend/foundation/utils/ or a relevant domain utils module. Also in: ${otherFilesStr}`,
|
|
335
|
-
type: 'duplicate-utility-identical',
|
|
336
|
-
match: name,
|
|
337
|
-
filePath: first.file,
|
|
338
|
-
};
|
|
339
|
-
}
|
|
340
|
-
/**
|
|
341
|
-
* Create a violation for similar implementations (same name, different body)
|
|
342
|
-
*/
|
|
343
|
-
function createSimilarViolation(name, uniqueImpls) {
|
|
344
|
-
const first = uniqueImpls[0];
|
|
345
|
-
if (!first) {
|
|
346
|
-
throw new Error(`createSimilarViolation called with empty uniqueImpls array for '${name}'`);
|
|
347
|
-
}
|
|
348
|
-
const otherFilesStr = formatOtherFiles(uniqueImpls);
|
|
349
|
-
const numImplementations = uniqueImpls.length;
|
|
350
|
-
return {
|
|
351
|
-
line: first.line,
|
|
352
|
-
message: `Utility function '${name}' has ${numImplementations} different implementations - consider consolidation with options`,
|
|
353
|
-
severity: 'warning',
|
|
354
|
-
suggestion: `Create a unified '${name}' function with configurable options in packages/shared/backend/foundation/utils/. Different implementations found in: ${otherFilesStr}`,
|
|
355
|
-
type: 'duplicate-utility-similar',
|
|
356
|
-
match: name,
|
|
357
|
-
filePath: first.file,
|
|
358
|
-
};
|
|
359
|
-
}
|
|
360
|
-
async function collectFunctionsFromFiles(files, domainSpecific) {
|
|
361
|
-
const functionsByName = new Map();
|
|
362
|
-
for (const filePath of files.paths) {
|
|
363
|
-
try {
|
|
364
|
-
// @fitness-ignore-next-line performance-anti-patterns -- sequential file reading to control memory; FileAccessor is lazy
|
|
365
|
-
const content = await files.read(filePath);
|
|
366
|
-
const functions = extractUtilityFunctionsWithBody(filePath, content, domainSpecific);
|
|
367
|
-
const validFunctions = functions.filter((fn) => fn.bodyLength >= MIN_FUNCTION_BODY_LENGTH);
|
|
368
|
-
for (const fn of validFunctions) {
|
|
369
|
-
void addFunctionToCollection(functionsByName, fn);
|
|
370
|
-
}
|
|
371
|
-
/* v8 ignore next 1 -- defensive catch: parse failures already handled */
|
|
372
|
-
}
|
|
373
|
-
catch {
|
|
374
|
-
// @swallow-ok Skip unreadable files
|
|
375
|
-
}
|
|
376
|
-
}
|
|
377
|
-
return functionsByName;
|
|
378
|
-
}
|
|
379
|
-
function findIdenticalViolations(name, hashGroups) {
|
|
380
|
-
const violations = [];
|
|
381
|
-
for (const locations of hashGroups.values()) {
|
|
382
|
-
if (isValidCrossDirectoryDuplicate(locations)) {
|
|
383
|
-
violations.push(createIdenticalViolation(name, locations));
|
|
384
|
-
}
|
|
385
|
-
}
|
|
386
|
-
return violations;
|
|
387
|
-
}
|
|
388
|
-
function findSimilarViolation(name, hashGroups) {
|
|
389
|
-
if (hashGroups.size <= 1) {
|
|
390
|
-
return null;
|
|
391
|
-
}
|
|
392
|
-
const uniqueImpls = getFirstFromEachHashGroup(hashGroups);
|
|
393
|
-
/* v8 ignore next -- defensive guard */
|
|
394
|
-
if (!Array.isArray(uniqueImpls) || uniqueImpls.length <= 1) {
|
|
395
|
-
return null;
|
|
396
|
-
}
|
|
397
|
-
const implDirs = getUniqueDirectories(uniqueImpls);
|
|
398
|
-
if (implDirs.size <= 1) {
|
|
399
|
-
return null;
|
|
400
|
-
}
|
|
401
|
-
return createSimilarViolation(name, uniqueImpls);
|
|
402
|
-
}
|
|
403
|
-
function processFunctionGroup(name, hashGroups) {
|
|
404
|
-
const allLocations = flattenHashGroups(hashGroups);
|
|
405
|
-
const dirs = getUniqueDirectories(allLocations);
|
|
406
|
-
if (dirs.size <= 1 || hashGroups.size === 0) {
|
|
407
|
-
return [];
|
|
408
|
-
}
|
|
409
|
-
const violations = [...findIdenticalViolations(name, hashGroups)];
|
|
410
|
-
const similarViolation = findSimilarViolation(name, hashGroups);
|
|
411
|
-
if (similarViolation) {
|
|
412
|
-
violations.push(similarViolation);
|
|
413
|
-
}
|
|
414
|
-
return violations;
|
|
415
|
-
}
|
|
10
|
+
import { defineCheck } from '@opensip-cli/fitness';
|
|
11
|
+
import { buildEffectiveDomainSpecificSet, collectFunctionsFromFiles, processFunctionGroup, } from './duplicate-utility-functions-helpers.js';
|
|
12
|
+
export { DOMAIN_SPECIFIC_FUNCTION_NAMES, } from './duplicate-utility-functions-config.js';
|
|
416
13
|
/**
|
|
417
14
|
* Check: quality/duplicate-utility-functions
|
|
418
15
|
*
|
|
@@ -446,7 +43,6 @@ export const duplicateUtilityFunctions = defineCheck({
|
|
|
446
43
|
const functionsByName = await collectFunctionsFromFiles(files, domainSpecific);
|
|
447
44
|
const violations = [];
|
|
448
45
|
for (const [name, hashGroups] of functionsByName) {
|
|
449
|
-
// @fitness-ignore-next-line performance-anti-patterns -- spread aggregates small violation arrays from pure function
|
|
450
46
|
violations.push(...processFunctionGroup(name, hashGroups));
|
|
451
47
|
}
|
|
452
48
|
return violations;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"duplicate-utility-functions.js","sourceRoot":"","sources":["../../../../src/checks/quality/code-structure/duplicate-utility-functions.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"duplicate-utility-functions.js","sourceRoot":"","sources":["../../../../src/checks/quality/code-structure/duplicate-utility-functions.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F;;;;;;;GAOG;AAEH,OAAO,EAAE,WAAW,EAAuB,MAAM,sBAAsB,CAAC;AAExE,OAAO,EACL,+BAA+B,EAC/B,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,0CAA0C,CAAC;AAElD,OAAO,EACL,8BAA8B,GAE/B,MAAM,yCAAyC,CAAC;AAEjD;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,WAAW,CAAC;IACnD,EAAE,EAAE,sCAAsC;IAC1C,IAAI,EAAE,6BAA6B;IACnC,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,gDAAgD;IAC7D,eAAe,EAAE;;;;;;;;;;iCAUc;IAC/B,IAAI,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,aAAa,CAAC;IACpD,SAAS,EAAE,CAAC,IAAI,CAAC;IAEjB,KAAK,CAAC,UAAU,CAAC,KAAK;QACpB,MAAM,cAAc,GAAG,+BAA+B,EAAE,CAAC;QACzD,MAAM,eAAe,GAAG,MAAM,yBAAyB,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;QAC/E,MAAM,UAAU,GAAqB,EAAE,CAAC;QAExC,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,eAAe,EAAE,CAAC;YACjD,UAAU,CAAC,IAAI,CAAC,GAAG,oBAAoB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;QAC7D,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -13,8 +13,8 @@
|
|
|
13
13
|
*/
|
|
14
14
|
import { describe, expect, it } from 'vitest';
|
|
15
15
|
import { analyzeNullSafety } from '../null-safety.js';
|
|
16
|
-
function analyze(src) {
|
|
17
|
-
return analyzeNullSafety(src,
|
|
16
|
+
function analyze(src, path = 'src/svc/sample.ts') {
|
|
17
|
+
return analyzeNullSafety(src, path);
|
|
18
18
|
}
|
|
19
19
|
describe('null-safety — FP regression suite', () => {
|
|
20
20
|
it('does NOT flag element access guarded by an enclosing if on a previous line', () => {
|
|
@@ -39,6 +39,43 @@ describe('null-safety — FP regression suite', () => {
|
|
|
39
39
|
`;
|
|
40
40
|
expect(analyze(src)).toHaveLength(0);
|
|
41
41
|
});
|
|
42
|
+
it('does NOT flag schema builder chains on *Schema identifiers', () => {
|
|
43
|
+
const src = `
|
|
44
|
+
const GraphConfigSchema = z.object({});
|
|
45
|
+
export function load(documentGraph: unknown) {
|
|
46
|
+
return GraphConfigSchema.strict().safeParse(documentGraph);
|
|
47
|
+
}
|
|
48
|
+
`;
|
|
49
|
+
expect(analyze(src, 'packages/graph/engine/src/cli/graph-config.ts')).toHaveLength(0);
|
|
50
|
+
});
|
|
51
|
+
it('does NOT flag repoFor() factory chains', () => {
|
|
52
|
+
const src = `
|
|
53
|
+
function repoFor() { return { put() {}, list() { return []; } }; }
|
|
54
|
+
export function build() {
|
|
55
|
+
return {
|
|
56
|
+
put: () => { repoFor().put('fit', 'k', {}); },
|
|
57
|
+
list: () => repoFor().list('fit'),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
`;
|
|
61
|
+
expect(analyze(src, 'packages/cli/src/bootstrap/state-seams.ts')).toHaveLength(0);
|
|
62
|
+
});
|
|
63
|
+
it('does NOT flag Commander optsWithGlobals().cloud access', () => {
|
|
64
|
+
const src = `
|
|
65
|
+
export function hook(actionCommand: { optsWithGlobals(): { cloud?: boolean } }) {
|
|
66
|
+
return actionCommand.optsWithGlobals().cloud === false;
|
|
67
|
+
}
|
|
68
|
+
`;
|
|
69
|
+
expect(analyze(src, 'packages/cli/src/bootstrap/pre-action-hook.ts')).toHaveLength(0);
|
|
70
|
+
});
|
|
71
|
+
it('does NOT flag callback-index access chunks[i].signals', () => {
|
|
72
|
+
const src = `
|
|
73
|
+
export function timeoutFor(chunks: { signals: unknown[] }[]) {
|
|
74
|
+
return (_chunk: unknown, i: number) => chunks[i].signals.length;
|
|
75
|
+
}
|
|
76
|
+
`;
|
|
77
|
+
expect(analyze(src, 'packages/output/src/sink/cloud-signal-sink.ts')).toHaveLength(0);
|
|
78
|
+
});
|
|
42
79
|
it('STILL flags an unguarded property access on an element-access result', () => {
|
|
43
80
|
const src = `
|
|
44
81
|
function firstHash(rows: { bodyHash: string }[]) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"null-safety-fp.test.js","sourceRoot":"","sources":["../../../../../src/checks/quality/data-integrity/__tests__/null-safety-fp.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,SAAS,OAAO,CAAC,GAAW;
|
|
1
|
+
{"version":3,"file":"null-safety-fp.test.js","sourceRoot":"","sources":["../../../../../src/checks/quality/data-integrity/__tests__/null-safety-fp.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,SAAS,OAAO,CAAC,GAAW,EAAE,IAAI,GAAG,mBAAmB;IACtD,OAAO,iBAAiB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACtC,CAAC;AAED,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;IACjD,EAAE,CAAC,4EAA4E,EAAE,GAAG,EAAE;QACpF,MAAM,GAAG,GAAG;;;;;;;KAOX,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,GAAG,GAAG;;;;;;;KAOX,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,MAAM,GAAG,GAAG;;;;;KAKX,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,+CAA+C,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACxF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,GAAG,GAAG;;;;;;;;KAQX,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,2CAA2C,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,GAAG,GAAG;;;;KAIX,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,+CAA+C,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACxF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,GAAG,GAAG;;;;KAIX,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,+CAA+C,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACxF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,GAAG,EAAE;QAC9E,MAAM,GAAG,GAAG;;;;KAIX,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import * as ts from 'typescript';
|
|
2
|
+
export declare const QUICK_FILTER_KEYWORDS: string[];
|
|
3
|
+
export declare function isTopLevelArrayType(typeNode: ts.TypeNode): boolean;
|
|
4
|
+
export declare function isRelaxedValidationPath(filePath: string): boolean;
|
|
5
|
+
export declare function isComplexNestedType(typeText: string): boolean;
|
|
6
|
+
export declare function isLengthAccess(node: ts.Node, paramName: string, sourceFile: ts.SourceFile): boolean;
|
|
7
|
+
export declare function isArrayIsArrayCall(node: ts.Node, paramName: string, sourceFile: ts.SourceFile): boolean;
|
|
8
|
+
export declare function isZodValidationCall(node: ts.Node, sourceFile: ts.SourceFile): boolean;
|
|
9
|
+
export declare function isValidationFunctionCall(node: ts.Node): boolean;
|
|
10
|
+
export declare function isIterationOverParam(node: ts.Node, paramName: string, sourceFile: ts.SourceFile): boolean;
|
|
11
|
+
export declare function isOutSinkUsage(node: ts.Node, paramName: string, sourceFile: ts.SourceFile): boolean;
|
|
12
|
+
export declare function isIndexedAccess(node: ts.Node, paramName: string, sourceFile: ts.SourceFile): boolean;
|
|
13
|
+
export declare function isSpreadOfParam(node: ts.Node, paramName: string, sourceFile: ts.SourceFile): boolean;
|
|
14
|
+
export declare function isForwardedToCall(node: ts.Node, paramName: string, _sourceFile: ts.SourceFile): boolean;
|
|
15
|
+
export declare function isShorthandPropertyReference(node: ts.Node, paramName: string): boolean;
|
|
16
|
+
export declare function isOptionalHandling(node: ts.Node, paramName: string, sourceFile: ts.SourceFile): boolean;
|
|
17
|
+
//# sourceMappingURL=array-validation-detectors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"array-validation-detectors.d.ts","sourceRoot":"","sources":["../../../../src/checks/quality/data-integrity/array-validation-detectors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAEjC,eAAO,MAAM,qBAAqB,UASjC,CAAC;AAYF,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,GAAG,OAAO,CAwBlE;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEjE;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE7D;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,EAAE,CAAC,IAAI,EACb,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,EAAE,CAAC,UAAU,GACxB,OAAO,CAKT;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,EAAE,CAAC,IAAI,EACb,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,EAAE,CAAC,UAAU,GACxB,OAAO,CAMT;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,CAAC,UAAU,GAAG,OAAO,CAKrF;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,OAAO,CAK/D;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,EAAE,CAAC,IAAI,EACb,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,EAAE,CAAC,UAAU,GACxB,OAAO,CA8CT;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,EAAE,CAAC,IAAI,EACb,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,EAAE,CAAC,UAAU,GACxB,OAAO,CAOT;AAED,wBAAgB,eAAe,CAC7B,IAAI,EAAE,EAAE,CAAC,IAAI,EACb,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,EAAE,CAAC,UAAU,GACxB,OAAO,CAGT;AAED,wBAAgB,eAAe,CAC7B,IAAI,EAAE,EAAE,CAAC,IAAI,EACb,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,EAAE,CAAC,UAAU,GACxB,OAAO,CAKT;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,EAAE,CAAC,IAAI,EACb,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,EAAE,CAAC,UAAU,GACzB,OAAO,CAgBT;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAGtF;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,EAAE,CAAC,IAAI,EACb,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,EAAE,CAAC,UAAU,GACxB,OAAO,CAeT"}
|