@opensip-cli/checks-universal 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-10.test.d.ts.map +1 -1
- package/dist/__tests__/behavior-fixtures-10.test.js +0 -1
- package/dist/__tests__/behavior-fixtures-10.test.js.map +1 -1
- package/dist/__tests__/behavior-fixtures-11.test.d.ts.map +1 -1
- package/dist/__tests__/behavior-fixtures-11.test.js +0 -1
- package/dist/__tests__/behavior-fixtures-11.test.js.map +1 -1
- package/dist/__tests__/behavior-fixtures-12.test.d.ts.map +1 -1
- package/dist/__tests__/behavior-fixtures-12.test.js +0 -1
- package/dist/__tests__/behavior-fixtures-12.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.d.ts.map +1 -1
- package/dist/__tests__/behavior-fixtures-6.test.js +0 -1
- package/dist/__tests__/behavior-fixtures-6.test.js.map +1 -1
- package/dist/__tests__/behavior-fixtures-7.test.d.ts.map +1 -1
- package/dist/__tests__/behavior-fixtures-7.test.js +0 -1
- package/dist/__tests__/behavior-fixtures-7.test.js.map +1 -1
- package/dist/__tests__/behavior-fixtures-8.test.d.ts.map +1 -1
- package/dist/__tests__/behavior-fixtures-8.test.js +2 -3
- package/dist/__tests__/behavior-fixtures-8.test.js.map +1 -1
- package/dist/__tests__/behavior-fixtures-9.test.d.ts.map +1 -1
- package/dist/__tests__/behavior-fixtures-9.test.js +0 -1
- package/dist/__tests__/behavior-fixtures-9.test.js.map +1 -1
- package/dist/__tests__/behavior-fixtures.test.d.ts.map +1 -1
- package/dist/__tests__/behavior-fixtures.test.js +10 -9
- package/dist/__tests__/behavior-fixtures.test.js.map +1 -1
- package/dist/__tests__/file-length-limit.test.js +12 -1
- package/dist/__tests__/file-length-limit.test.js.map +1 -1
- package/dist/__tests__/resilience-fp.test.js +42 -0
- package/dist/__tests__/resilience-fp.test.js.map +1 -1
- package/dist/checks/architecture/__tests__/tool-identity-single-source.test.d.ts +2 -0
- package/dist/checks/architecture/__tests__/tool-identity-single-source.test.d.ts.map +1 -0
- package/dist/checks/architecture/__tests__/tool-identity-single-source.test.js +61 -0
- package/dist/checks/architecture/__tests__/tool-identity-single-source.test.js.map +1 -0
- package/dist/checks/architecture/dependencies/no-duplicate-packages.d.ts.map +1 -1
- package/dist/checks/architecture/dependencies/no-duplicate-packages.js +0 -2
- package/dist/checks/architecture/dependencies/no-duplicate-packages.js.map +1 -1
- package/dist/checks/architecture/docker-best-practices-analyze.d.ts +7 -0
- package/dist/checks/architecture/docker-best-practices-analyze.d.ts.map +1 -0
- package/dist/checks/architecture/docker-best-practices-analyze.js +301 -0
- package/dist/checks/architecture/docker-best-practices-analyze.js.map +1 -0
- package/dist/checks/architecture/docker-best-practices-patterns.d.ts +50 -0
- package/dist/checks/architecture/docker-best-practices-patterns.d.ts.map +1 -0
- package/dist/checks/architecture/docker-best-practices-patterns.js +51 -0
- package/dist/checks/architecture/docker-best-practices-patterns.js.map +1 -0
- package/dist/checks/architecture/docker-best-practices.d.ts.map +1 -1
- package/dist/checks/architecture/docker-best-practices.js +1 -367
- package/dist/checks/architecture/docker-best-practices.js.map +1 -1
- package/dist/checks/architecture/docker-ignore-validation.d.ts.map +1 -1
- package/dist/checks/architecture/docker-ignore-validation.js +0 -1
- package/dist/checks/architecture/docker-ignore-validation.js.map +1 -1
- package/dist/checks/architecture/docker-version-sync.d.ts.map +1 -1
- package/dist/checks/architecture/docker-version-sync.js +0 -1
- package/dist/checks/architecture/docker-version-sync.js.map +1 -1
- package/dist/checks/architecture/heavy-import-detection.d.ts.map +1 -1
- package/dist/checks/architecture/heavy-import-detection.js +1 -0
- package/dist/checks/architecture/heavy-import-detection.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/modules/empty-package-detection.d.ts.map +1 -1
- package/dist/checks/architecture/modules/empty-package-detection.js +0 -3
- package/dist/checks/architecture/modules/empty-package-detection.js.map +1 -1
- package/dist/checks/architecture/modules/interface-implementation-consistency-constants.d.ts +16 -0
- package/dist/checks/architecture/modules/interface-implementation-consistency-constants.d.ts.map +1 -0
- package/dist/checks/architecture/modules/interface-implementation-consistency-constants.js +182 -0
- package/dist/checks/architecture/modules/interface-implementation-consistency-constants.js.map +1 -0
- package/dist/checks/architecture/modules/interface-implementation-consistency-parse.d.ts +23 -0
- package/dist/checks/architecture/modules/interface-implementation-consistency-parse.d.ts.map +1 -0
- package/dist/checks/architecture/modules/interface-implementation-consistency-parse.js +235 -0
- package/dist/checks/architecture/modules/interface-implementation-consistency-parse.js.map +1 -0
- package/dist/checks/architecture/modules/interface-implementation-consistency.d.ts.map +1 -1
- package/dist/checks/architecture/modules/interface-implementation-consistency.js +4 -462
- package/dist/checks/architecture/modules/interface-implementation-consistency.js.map +1 -1
- package/dist/checks/architecture/node-version-consistency.d.ts.map +1 -1
- package/dist/checks/architecture/node-version-consistency.js +0 -2
- package/dist/checks/architecture/node-version-consistency.js.map +1 -1
- package/dist/checks/architecture/project-readme-existence.d.ts.map +1 -1
- package/dist/checks/architecture/project-readme-existence.js +0 -1
- package/dist/checks/architecture/project-readme-existence.js.map +1 -1
- package/dist/checks/architecture/stale-build-artifacts.d.ts.map +1 -1
- package/dist/checks/architecture/stale-build-artifacts.js +0 -1
- package/dist/checks/architecture/stale-build-artifacts.js.map +1 -1
- package/dist/checks/architecture/tool-has-manifest.d.ts.map +1 -1
- package/dist/checks/architecture/tool-has-manifest.js +0 -1
- package/dist/checks/architecture/tool-has-manifest.js.map +1 -1
- package/dist/checks/architecture/tool-identity-single-source.d.ts +23 -0
- package/dist/checks/architecture/tool-identity-single-source.d.ts.map +1 -0
- package/dist/checks/architecture/tool-identity-single-source.js +126 -0
- package/dist/checks/architecture/tool-identity-single-source.js.map +1 -0
- package/dist/checks/architecture/vitest-config-required-with-tests.d.ts.map +1 -1
- package/dist/checks/architecture/vitest-config-required-with-tests.js +0 -1
- package/dist/checks/architecture/vitest-config-required-with-tests.js.map +1 -1
- package/dist/checks/documentation/_directives/fitness.d.ts.map +1 -1
- package/dist/checks/documentation/_directives/fitness.js +7 -52
- package/dist/checks/documentation/_directives/fitness.js.map +1 -1
- package/dist/checks/documentation/_directives/graph.d.ts.map +1 -1
- package/dist/checks/documentation/_directives/graph.js +7 -52
- package/dist/checks/documentation/_directives/graph.js.map +1 -1
- package/dist/checks/documentation/_directives/semgrep.d.ts.map +1 -1
- package/dist/checks/documentation/_directives/semgrep.js +2 -12
- package/dist/checks/documentation/_directives/semgrep.js.map +1 -1
- package/dist/checks/documentation/_directives/shared.d.ts +9 -0
- package/dist/checks/documentation/_directives/shared.d.ts.map +1 -0
- package/dist/checks/documentation/_directives/shared.js +53 -0
- package/dist/checks/documentation/_directives/shared.js.map +1 -0
- package/dist/checks/documentation/_public-api-graph.d.ts +3 -26
- package/dist/checks/documentation/_public-api-graph.d.ts.map +1 -1
- package/dist/checks/documentation/_public-api-graph.js +3 -300
- package/dist/checks/documentation/_public-api-graph.js.map +1 -1
- package/dist/checks/documentation/directive-audit.d.ts.map +1 -1
- package/dist/checks/documentation/directive-audit.js +0 -1
- package/dist/checks/documentation/directive-audit.js.map +1 -1
- package/dist/checks/file-length-limit.d.ts +7 -0
- package/dist/checks/file-length-limit.d.ts.map +1 -1
- package/dist/checks/file-length-limit.js +14 -2
- package/dist/checks/file-length-limit.js.map +1 -1
- package/dist/checks/quality/code-structure/dead-code.d.ts.map +1 -1
- package/dist/checks/quality/code-structure/dead-code.js +0 -1
- package/dist/checks/quality/code-structure/dead-code.js.map +1 -1
- package/dist/checks/quality/dependency-version-consistency.d.ts.map +1 -1
- package/dist/checks/quality/dependency-version-consistency.js +0 -3
- package/dist/checks/quality/dependency-version-consistency.js.map +1 -1
- package/dist/checks/quality/frontend/navigation-typing.d.ts.map +1 -1
- package/dist/checks/quality/frontend/navigation-typing.js +0 -1
- package/dist/checks/quality/frontend/navigation-typing.js.map +1 -1
- package/dist/checks/quality/index.d.ts +1 -0
- package/dist/checks/quality/index.d.ts.map +1 -1
- package/dist/checks/quality/index.js +1 -0
- package/dist/checks/quality/index.js.map +1 -1
- package/dist/checks/quality/linting/eslint-justifications.d.ts.map +1 -1
- package/dist/checks/quality/linting/eslint-justifications.js +1 -1
- package/dist/checks/quality/linting/eslint-justifications.js.map +1 -1
- package/dist/checks/quality/no-raw-regex-on-code.d.ts.map +1 -1
- package/dist/checks/quality/no-raw-regex-on-code.js +2 -3
- package/dist/checks/quality/no-raw-regex-on-code.js.map +1 -1
- package/dist/checks/quality/patterns/__tests__/performance-anti-patterns-fp.test.d.ts +5 -0
- package/dist/checks/quality/patterns/__tests__/performance-anti-patterns-fp.test.d.ts.map +1 -0
- package/dist/checks/quality/patterns/__tests__/performance-anti-patterns-fp.test.js +66 -0
- package/dist/checks/quality/patterns/__tests__/performance-anti-patterns-fp.test.js.map +1 -0
- package/dist/checks/quality/patterns/performance-anti-patterns.d.ts +3 -0
- package/dist/checks/quality/patterns/performance-anti-patterns.d.ts.map +1 -1
- package/dist/checks/quality/patterns/performance-anti-patterns.js +47 -30
- package/dist/checks/quality/patterns/performance-anti-patterns.js.map +1 -1
- package/dist/checks/quality/yagni-ignore-hygiene.d.ts +10 -0
- package/dist/checks/quality/yagni-ignore-hygiene.d.ts.map +1 -0
- package/dist/checks/quality/yagni-ignore-hygiene.js +87 -0
- package/dist/checks/quality/yagni-ignore-hygiene.js.map +1 -0
- package/dist/checks/quality/yagni-ignore-hygiene.test.d.ts +5 -0
- package/dist/checks/quality/yagni-ignore-hygiene.test.d.ts.map +1 -0
- package/dist/checks/quality/yagni-ignore-hygiene.test.js +37 -0
- package/dist/checks/quality/yagni-ignore-hygiene.test.js.map +1 -0
- package/dist/checks/resilience/batch-operation-limits.d.ts +13 -0
- package/dist/checks/resilience/batch-operation-limits.d.ts.map +1 -0
- package/dist/checks/resilience/batch-operation-limits.js +214 -0
- package/dist/checks/resilience/batch-operation-limits.js.map +1 -0
- package/dist/checks/resilience/batch-operations.d.ts +2 -21
- package/dist/checks/resilience/batch-operations.d.ts.map +1 -1
- package/dist/checks/resilience/batch-operations.js +2 -420
- package/dist/checks/resilience/batch-operations.js.map +1 -1
- package/dist/checks/resilience/dangerous-config-defaults.d.ts.map +1 -1
- package/dist/checks/resilience/dangerous-config-defaults.js +0 -1
- package/dist/checks/resilience/dangerous-config-defaults.js.map +1 -1
- package/dist/checks/resilience/exit-code-correctness.d.ts.map +1 -1
- package/dist/checks/resilience/exit-code-correctness.js +0 -1
- package/dist/checks/resilience/exit-code-correctness.js.map +1 -1
- package/dist/checks/resilience/no-process-exit-in-finally.d.ts.map +1 -1
- package/dist/checks/resilience/no-process-exit-in-finally.js +0 -1
- package/dist/checks/resilience/no-process-exit-in-finally.js.map +1 -1
- package/dist/checks/resilience/readline-cleanup.d.ts.map +1 -1
- package/dist/checks/resilience/readline-cleanup.js +0 -1
- package/dist/checks/resilience/readline-cleanup.js.map +1 -1
- package/dist/checks/resilience/reentrancy-guard.d.ts.map +1 -1
- package/dist/checks/resilience/reentrancy-guard.js +0 -1
- package/dist/checks/resilience/reentrancy-guard.js.map +1 -1
- package/dist/checks/resilience/sentry/_helpers/sentry.d.ts +10 -0
- package/dist/checks/resilience/sentry/_helpers/sentry.d.ts.map +1 -1
- package/dist/checks/resilience/sentry/_helpers/sentry.js +21 -0
- package/dist/checks/resilience/sentry/_helpers/sentry.js.map +1 -1
- package/dist/checks/resilience/sentry/sentry-dsn-configured.d.ts.map +1 -1
- package/dist/checks/resilience/sentry/sentry-dsn-configured.js +8 -23
- package/dist/checks/resilience/sentry/sentry-dsn-configured.js.map +1 -1
- package/dist/checks/resilience/sentry/sentry-environment-set.d.ts.map +1 -1
- package/dist/checks/resilience/sentry/sentry-environment-set.js +8 -20
- package/dist/checks/resilience/sentry/sentry-environment-set.js.map +1 -1
- package/dist/checks/resilience/sentry/sentry-release-set.d.ts.map +1 -1
- package/dist/checks/resilience/sentry/sentry-release-set.js +8 -20
- package/dist/checks/resilience/sentry/sentry-release-set.js.map +1 -1
- package/dist/checks/resilience/service-patterns.d.ts.map +1 -1
- package/dist/checks/resilience/service-patterns.js +0 -1
- package/dist/checks/resilience/service-patterns.js.map +1 -1
- package/dist/checks/resilience/unbounded-memory.d.ts +13 -0
- package/dist/checks/resilience/unbounded-memory.d.ts.map +1 -0
- package/dist/checks/resilience/unbounded-memory.js +274 -0
- package/dist/checks/resilience/unbounded-memory.js.map +1 -0
- package/dist/checks/security/csp-headers.d.ts.map +1 -1
- package/dist/checks/security/csp-headers.js +0 -1
- package/dist/checks/security/csp-headers.js.map +1 -1
- package/dist/checks/security/hasura-production-config.d.ts.map +1 -1
- package/dist/checks/security/hasura-production-config.js +0 -1
- package/dist/checks/security/hasura-production-config.js.map +1 -1
- package/dist/checks/security/jwt-validation.d.ts.map +1 -1
- package/dist/checks/security/jwt-validation.js +0 -2
- package/dist/checks/security/jwt-validation.js.map +1 -1
- package/dist/checks/security/package-supply-chain-policy.d.ts.map +1 -1
- package/dist/checks/security/package-supply-chain-policy.js +9 -16
- package/dist/checks/security/package-supply-chain-policy.js.map +1 -1
- package/dist/checks/security/semgrep-scan.d.ts.map +1 -1
- package/dist/checks/security/semgrep-scan.js +0 -1
- package/dist/checks/security/semgrep-scan.js.map +1 -1
- package/dist/checks/security/use-centralized-crypto.d.ts.map +1 -1
- package/dist/checks/security/use-centralized-crypto.js +2 -3
- package/dist/checks/security/use-centralized-crypto.js.map +1 -1
- package/dist/checks/testing/test-convention-consistency.d.ts.map +1 -1
- package/dist/checks/testing/test-convention-consistency.js +0 -2
- package/dist/checks/testing/test-convention-consistency.js.map +1 -1
- package/dist/checks/testing/test-file-naming.d.ts.map +1 -1
- package/dist/checks/testing/test-file-naming.js +0 -1
- package/dist/checks/testing/test-file-naming.js.map +1 -1
- package/dist/checks/testing/test-file-pairing.d.ts.map +1 -1
- package/dist/checks/testing/test-file-pairing.js +3 -7
- package/dist/checks/testing/test-file-pairing.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/quality.d.ts.map +1 -1
- package/dist/display/quality.js +1 -0
- package/dist/display/quality.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 +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eslint-justifications.js","sourceRoot":"","sources":["../../../../src/checks/quality/linting/eslint-justifications.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"eslint-justifications.js","sourceRoot":"","sources":["../../../../src/checks/quality/linting/eslint-justifications.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-raw-regex-on-code.d.ts","sourceRoot":"","sources":["../../../src/checks/quality/no-raw-regex-on-code.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,eAAO,MAAM,gBAAgB,
|
|
1
|
+
{"version":3,"file":"no-raw-regex-on-code.d.ts","sourceRoot":"","sources":["../../../src/checks/quality/no-raw-regex-on-code.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,eAAO,MAAM,gBAAgB,sCAmD3B,CAAC"}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* without declaring contentFilter: 'strip-strings', which may lead to
|
|
6
6
|
* false positives from string literal and comment content.
|
|
7
7
|
*/
|
|
8
|
-
import { defineCheck } from '@opensip-cli/fitness';
|
|
8
|
+
import { defineCheck, isCheckAuthoringSource } from '@opensip-cli/fitness';
|
|
9
9
|
const REGEX_USAGE_PATTERN = /\.(test|match|exec|search)\s*\(/;
|
|
10
10
|
const CONTENT_FILTER_PATTERN = /contentFilter\s*:\s*['"](raw|strip-strings|strip-strings-and-comments)['"]/;
|
|
11
11
|
const DEFINE_CHECK_PATTERN = /defineCheck\s*\(/;
|
|
@@ -27,8 +27,7 @@ export const noRawRegexOnCode = defineCheck({
|
|
|
27
27
|
tags: ['quality', 'internal', 'meta', 'content-filter'],
|
|
28
28
|
fileTypes: ['ts'],
|
|
29
29
|
analyze(content, filePath) {
|
|
30
|
-
|
|
31
|
-
if (!filePath.includes('fitness/src/checks/'))
|
|
30
|
+
if (!isCheckAuthoringSource(filePath))
|
|
32
31
|
return [];
|
|
33
32
|
// Must be a defineCheck file
|
|
34
33
|
if (!DEFINE_CHECK_PATTERN.test(content))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-raw-regex-on-code.js","sourceRoot":"","sources":["../../../src/checks/quality/no-raw-regex-on-code.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,WAAW,EAAuB,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"no-raw-regex-on-code.js","sourceRoot":"","sources":["../../../src/checks/quality/no-raw-regex-on-code.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAuB,MAAM,sBAAsB,CAAC;AAEhG,MAAM,mBAAmB,GAAG,iCAAiC,CAAC;AAC9D,MAAM,sBAAsB,GAC1B,4EAA4E,CAAC;AAC/E,MAAM,oBAAoB,GAAG,kBAAkB,CAAC;AAEhD,MAAM,CAAC,MAAM,gBAAgB,GAAG,WAAW,CAAC;IAC1C,EAAE,EAAE,sCAAsC;IAC1C,IAAI,EAAE,sBAAsB;IAC5B,KAAK,EAAE,EAAE,SAAS,EAAE,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,CAAC,SAAS,CAAC,EAAE;IAE3D,UAAU,EAAE,QAAQ;IACpB,WAAW,EAAE,kEAAkE;IAC/E,eAAe,EAAE;;;;;;;;qCAQkB;IACnC,IAAI,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,gBAAgB,CAAC;IACvD,SAAS,EAAE,CAAC,IAAI,CAAC;IAEjB,OAAO,CAAC,OAAO,EAAE,QAAQ;QACvB,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC;YAAE,OAAO,EAAE,CAAC;QAEjD,6BAA6B;QAC7B,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,EAAE,CAAC;QAEnD,iCAAiC;QACjC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,EAAE,CAAC;QAElD,4DAA4D;QAC5D,IAAI,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,EAAE,CAAC;QAEpD,yDAAyD;QACzD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClC,KAAK,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;YACxC,IAAI,IAAI,IAAI,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5C,OAAO;oBACL;wBACE,IAAI,EAAE,CAAC,GAAG,CAAC;wBACX,MAAM,EAAE,CAAC;wBACT,OAAO,EAAE,qEAAqE;wBAC9E,QAAQ,EAAE,SAAS;wBACnB,IAAI,EAAE,wBAAwB;wBAC9B,UAAU,EACR,gJAAgJ;qBACnJ;iBACF,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,EAAE,CAAC;IACZ,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"performance-anti-patterns-fp.test.d.ts","sourceRoot":"","sources":["../../../../../src/checks/quality/patterns/__tests__/performance-anti-patterns-fp.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Regression tests for performance-anti-patterns FP fixes.
|
|
3
|
+
*/
|
|
4
|
+
import { describe, expect, it } from 'vitest';
|
|
5
|
+
import { analyzeFileForPerformancePatterns } from '../performance-anti-patterns.js';
|
|
6
|
+
function analyze(src, path = 'src/svc/sample.ts') {
|
|
7
|
+
return analyzeFileForPerformancePatterns(src, path);
|
|
8
|
+
}
|
|
9
|
+
describe('performance-anti-patterns — intentional sequential await', () => {
|
|
10
|
+
it('does not flag retry backoff with await new Promise(setTimeout)', () => {
|
|
11
|
+
const src = `
|
|
12
|
+
export async function withRetry(fn: () => Promise<void>) {
|
|
13
|
+
for (let attempt = 1; attempt <= 3; attempt++) {
|
|
14
|
+
try {
|
|
15
|
+
return await fn();
|
|
16
|
+
} catch {
|
|
17
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
`;
|
|
22
|
+
expect(analyze(src, 'packages/core/src/lib/retry.ts')).toHaveLength(0);
|
|
23
|
+
});
|
|
24
|
+
it('does not flag Promise.race back-pressure in a while loop', () => {
|
|
25
|
+
const src = `
|
|
26
|
+
async function gate(inFlight: Set<Promise<void>>) {
|
|
27
|
+
while (inFlight.size >= 2) {
|
|
28
|
+
await Promise.race(inFlight);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
`;
|
|
32
|
+
expect(analyze(src)).toHaveLength(0);
|
|
33
|
+
});
|
|
34
|
+
it('does not flag Promise.all batching inside a for loop', () => {
|
|
35
|
+
const src = `
|
|
36
|
+
export async function load(packages: string[]) {
|
|
37
|
+
for (let i = 0; i < packages.length; i += 2) {
|
|
38
|
+
const batch = packages.slice(i, i + 2);
|
|
39
|
+
await Promise.all(batch.map((p) => import(p)));
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
`;
|
|
43
|
+
expect(analyze(src, 'packages/core/src/plugins/capability-discovery.ts')).toHaveLength(0);
|
|
44
|
+
});
|
|
45
|
+
it('does not flag sequential plugin admission over packages', () => {
|
|
46
|
+
const src = `
|
|
47
|
+
export async function register(packages: string[]) {
|
|
48
|
+
for (const packageName of packages) {
|
|
49
|
+
await admit(packageName);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
`;
|
|
53
|
+
expect(analyze(src, 'packages/cli/src/bootstrap/register-tools.ts')).toHaveLength(0);
|
|
54
|
+
});
|
|
55
|
+
it('STILL flags unbounded sequential await in a data loop', () => {
|
|
56
|
+
const src = `
|
|
57
|
+
export async function load(ids: string[]) {
|
|
58
|
+
for (const id of ids) {
|
|
59
|
+
await fetchRow(id);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
`;
|
|
63
|
+
expect(analyze(src).length).toBeGreaterThan(0);
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
//# sourceMappingURL=performance-anti-patterns-fp.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"performance-anti-patterns-fp.test.js","sourceRoot":"","sources":["../../../../../src/checks/quality/patterns/__tests__/performance-anti-patterns-fp.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,iCAAiC,EAAE,MAAM,iCAAiC,CAAC;AAEpF,SAAS,OAAO,CACd,GAAW,EACX,IAAI,GAAG,mBAAmB;IAE1B,OAAO,iCAAiC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACtD,CAAC;AAED,QAAQ,CAAC,0DAA0D,EAAE,GAAG,EAAE;IACxE,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,MAAM,GAAG,GAAG;;;;;;;;;;KAUX,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,gCAAgC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,GAAG,GAAG;;;;;;KAMX,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,GAAG,GAAG;;;;;;;KAOX,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,mDAAmD,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC5F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,GAAG,GAAG;;;;;;KAMX,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,8CAA8C,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,GAAG,GAAG;;;;;;KAMX,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"}
|
|
@@ -7,6 +7,9 @@
|
|
|
7
7
|
* - String concatenation in loops
|
|
8
8
|
* - Nested O(n^2) loops
|
|
9
9
|
*/
|
|
10
|
+
import { type CheckViolation } from '@opensip-cli/fitness';
|
|
11
|
+
/** Exported for FP regression tests. */
|
|
12
|
+
export declare function analyzeFileForPerformancePatterns(content: string, filePath: string): CheckViolation[];
|
|
10
13
|
/**
|
|
11
14
|
* Check: quality/performance-anti-patterns
|
|
12
15
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"performance-anti-patterns.d.ts","sourceRoot":"","sources":["../../../../src/checks/quality/patterns/performance-anti-patterns.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"performance-anti-patterns.d.ts","sourceRoot":"","sources":["../../../../src/checks/quality/patterns/performance-anti-patterns.ts"],"names":[],"mappings":"AACA;;;;;;;;GAQG;AAEH,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,sBAAsB,CAAC;AAqH9B,wCAAwC;AACxC,wBAAgB,iCAAiC,CAC/C,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf,cAAc,EAAE,CAgBlB;AAqID;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,sCA0BlC,CAAC"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
// @fitness-ignore-file no-unbounded-concurrency -- Concurrency bounded by design in this context
|
|
2
|
-
// @fitness-ignore-file performance-anti-patterns -- this file IS the performance-anti-patterns check; loop body iterates the PATTERNS array (small, constant) and "await" appears in surrounding comments describing what the check detects
|
|
3
2
|
/**
|
|
4
3
|
* @fileoverview Performance Anti-Patterns Check
|
|
5
4
|
*
|
|
@@ -9,7 +8,7 @@
|
|
|
9
8
|
* - String concatenation in loops
|
|
10
9
|
* - Nested O(n^2) loops
|
|
11
10
|
*/
|
|
12
|
-
import { defineCheck, isTestFile } from '@opensip-cli/fitness';
|
|
11
|
+
import { defineCheck, isCheckAuthoringSource, isTestFile, } from '@opensip-cli/fitness';
|
|
13
12
|
// Anti-pattern type identifiers
|
|
14
13
|
const ANTI_PATTERN_TYPES = {
|
|
15
14
|
SEQUENTIAL_AWAIT: 'sequential-await',
|
|
@@ -69,6 +68,50 @@ const PATTERNS = [
|
|
|
69
68
|
* Bounded quantifiers prevent ReDoS — context is at most 8 lines.
|
|
70
69
|
*/
|
|
71
70
|
const RETRY_LOOP_BODY = /await\s{1,5}(delay|sleep|wait|setTimeout|backoff|pause)\s{0,5}\(/;
|
|
71
|
+
const RETRY_SETTLE_BODY = /await\s+new\s+Promise[\s\S]{0,400}?setTimeout/;
|
|
72
|
+
/** Parallel batching / back-pressure / cooperative-yield awaits inside loops. */
|
|
73
|
+
const PARALLEL_OR_GATE_AWAIT = /await\s+Promise\.(all|allSettled|race)\s*\(|await\s+(yieldToEventLoop|yieldEventLoop)\s*\(/;
|
|
74
|
+
/**
|
|
75
|
+
* Bounded, intentional serial loops (plugin admission, adapter discovery,
|
|
76
|
+
* glob deduplication) — not data-volume waterfalls.
|
|
77
|
+
*/
|
|
78
|
+
const INTENTIONAL_SERIAL_LOOP_CONTEXT = [
|
|
79
|
+
/for\s*\(\s*const\s+\w+\s+of\s+packages\b/,
|
|
80
|
+
/for\s*\(\s*const\s+\w+\s+of\s+discovered\b/,
|
|
81
|
+
/for\s*\(\s*const\s+adapter\s+of\s+adapters\b/,
|
|
82
|
+
/for\s*\(\s*const\s+pattern\s+of\s+patterns\b/,
|
|
83
|
+
/for\s*\(\s*let\s+\w+\s*=\s*0\s*;\s*\w+\s*<\s*packages\.length\b/,
|
|
84
|
+
];
|
|
85
|
+
function isIntentionalSequentialAwait(line, context, retryContext) {
|
|
86
|
+
if (RETRY_LOOP_BODY.test(retryContext) || RETRY_SETTLE_BODY.test(retryContext)) {
|
|
87
|
+
return true;
|
|
88
|
+
}
|
|
89
|
+
if (PARALLEL_OR_GATE_AWAIT.test(line))
|
|
90
|
+
return true;
|
|
91
|
+
return INTENTIONAL_SERIAL_LOOP_CONTEXT.some((re) => re.test(context));
|
|
92
|
+
}
|
|
93
|
+
/** Exported for FP regression tests. */
|
|
94
|
+
export function analyzeFileForPerformancePatterns(content, filePath) {
|
|
95
|
+
if (isTestFile(filePath))
|
|
96
|
+
return [];
|
|
97
|
+
if (isCheckAuthoringSource(filePath))
|
|
98
|
+
return [];
|
|
99
|
+
if (filePath.includes('/diagnostics'))
|
|
100
|
+
return [];
|
|
101
|
+
if (!content.includes('await') && !content.includes('for') && !content.includes('while')) {
|
|
102
|
+
return [];
|
|
103
|
+
}
|
|
104
|
+
if (content.includes('@sequential-ok'))
|
|
105
|
+
return [];
|
|
106
|
+
const violations = [];
|
|
107
|
+
const lines = content.split('\n');
|
|
108
|
+
for (let i = 0; i < lines.length; i++) {
|
|
109
|
+
const violation = checkLineForPerformancePatterns({ lines, index: i });
|
|
110
|
+
if (violation)
|
|
111
|
+
violations.push(violation);
|
|
112
|
+
}
|
|
113
|
+
return violations;
|
|
114
|
+
}
|
|
72
115
|
/* v8 ignore start -- multi-pattern AST-style detector with many type-specific branches; covered indirectly */
|
|
73
116
|
function checkLineForPerformancePatterns(options) {
|
|
74
117
|
const { lines, index } = options;
|
|
@@ -93,7 +136,7 @@ function checkLineForPerformancePatterns(options) {
|
|
|
93
136
|
// pattern (a spread or string-concat in a retry loop is still a
|
|
94
137
|
// real bug).
|
|
95
138
|
if (patternConfig.type === ANTI_PATTERN_TYPES.SEQUENTIAL_AWAIT &&
|
|
96
|
-
|
|
139
|
+
isIntentionalSequentialAwait(line, context, retryContext)) {
|
|
97
140
|
continue;
|
|
98
141
|
}
|
|
99
142
|
// Check if this line contains the key indicator
|
|
@@ -207,33 +250,7 @@ export const performanceAntiPatterns = defineCheck({
|
|
|
207
250
|
// @fitness-ignore-next-line no-hardcoded-timeouts -- framework default for fitness check execution
|
|
208
251
|
timeout: 180_000, // 3 minutes - parses AST for all production files
|
|
209
252
|
analyze(content, filePath) {
|
|
210
|
-
|
|
211
|
-
if (isTestFile(filePath))
|
|
212
|
-
return [];
|
|
213
|
-
// Skip fitness check definitions — they iterate files with sequential async operations
|
|
214
|
-
// as part of analysis, which is bounded by the check's file set
|
|
215
|
-
if (filePath.includes('/fitness/src/checks/'))
|
|
216
|
-
return [];
|
|
217
|
-
// Skip diagnostic/debug endpoints — sequential processing is acceptable for diagnostics
|
|
218
|
-
if (filePath.includes('/diagnostics'))
|
|
219
|
-
return [];
|
|
220
|
-
// @lazy-ok -- 'await' appears as a string literal, not an actual await expression
|
|
221
|
-
// Quick filter: skip files without performance-related patterns
|
|
222
|
-
if (!content.includes('await') && !content.includes('for') && !content.includes('while')) {
|
|
223
|
-
return [];
|
|
224
|
-
}
|
|
225
|
-
// Skip files with explicit sequential-ok marker (intentional sequential processing)
|
|
226
|
-
if (content.includes('@sequential-ok'))
|
|
227
|
-
return [];
|
|
228
|
-
const violations = [];
|
|
229
|
-
const lines = content.split('\n');
|
|
230
|
-
for (let i = 0; i < lines.length; i++) {
|
|
231
|
-
const violation = checkLineForPerformancePatterns({ lines, index: i });
|
|
232
|
-
if (violation) {
|
|
233
|
-
violations.push(violation);
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
return violations;
|
|
253
|
+
return analyzeFileForPerformancePatterns(content, filePath);
|
|
237
254
|
},
|
|
238
255
|
});
|
|
239
256
|
//# sourceMappingURL=performance-anti-patterns.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"performance-anti-patterns.js","sourceRoot":"","sources":["../../../../src/checks/quality/patterns/performance-anti-patterns.ts"],"names":[],"mappings":"AAAA,iGAAiG;AACjG
|
|
1
|
+
{"version":3,"file":"performance-anti-patterns.js","sourceRoot":"","sources":["../../../../src/checks/quality/patterns/performance-anti-patterns.ts"],"names":[],"mappings":"AAAA,iGAAiG;AACjG;;;;;;;;GAQG;AAEH,OAAO,EACL,WAAW,EACX,sBAAsB,EACtB,UAAU,GAEX,MAAM,sBAAsB,CAAC;AAmB9B,gCAAgC;AAChC,MAAM,kBAAkB,GAAG;IACzB,gBAAgB,EAAE,kBAAkB;IACpC,cAAc,EAAE,gBAAgB;IAChC,qBAAqB,EAAE,uBAAuB;CACtC,CAAC;AAEX,oEAAoE;AACpE,MAAM,QAAQ,GAAoB;IAChC;QACE,0CAA0C;QAC1C,OAAO,EAAE,sDAAsD;QAC/D,IAAI,EAAE,kBAAkB,CAAC,gBAAgB;QACzC,OAAO,EAAE,uDAAuD;QAChE,QAAQ,EAAE,SAAS;KACpB;IACD;QACE,0CAA0C;QAC1C,OAAO,EAAE,wDAAwD;QACjE,IAAI,EAAE,kBAAkB,CAAC,gBAAgB;QACzC,OAAO,EAAE,yDAAyD;QAClE,QAAQ,EAAE,SAAS;KACpB;IACD;QACE,0CAA0C;QAC1C,OAAO,EAAE,qDAAqD;QAC9D,IAAI,EAAE,kBAAkB,CAAC,gBAAgB;QACzC,OAAO,EAAE,+DAA+D;QACxE,QAAQ,EAAE,SAAS;KACpB;IACD;QACE,0EAA0E;QAC1E,sEAAsE;QACtE,4DAA4D;QAC5D,uEAAuE;QACvE,2CAA2C;QAC3C,OAAO,EAAE,gEAAgE;QACzE,IAAI,EAAE,kBAAkB,CAAC,cAAc;QACvC,OAAO,EACL,sJAAsJ;QACxJ,QAAQ,EAAE,SAAS;KACpB;IACD;QACE,0CAA0C;QAC1C,OAAO,EAAE,8DAA8D;QACvE,IAAI,EAAE,kBAAkB,CAAC,qBAAqB;QAC9C,OAAO,EAAE,yDAAyD;QAClE,QAAQ,EAAE,SAAS;KACpB;CACF,CAAC;AAOF;;;;;;;;;GASG;AACH,MAAM,eAAe,GAAG,kEAAkE,CAAC;AAE3F,MAAM,iBAAiB,GAAG,+CAA+C,CAAC;AAE1E,iFAAiF;AACjF,MAAM,sBAAsB,GAC1B,4FAA4F,CAAC;AAE/F;;;GAGG;AACH,MAAM,+BAA+B,GAAG;IACtC,0CAA0C;IAC1C,4CAA4C;IAC5C,8CAA8C;IAC9C,8CAA8C;IAC9C,iEAAiE;CAClE,CAAC;AAEF,SAAS,4BAA4B,CACnC,IAAY,EACZ,OAAe,EACf,YAAoB;IAEpB,IAAI,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,iBAAiB,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;QAC/E,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnD,OAAO,+BAA+B,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AACxE,CAAC;AAED,wCAAwC;AACxC,MAAM,UAAU,iCAAiC,CAC/C,OAAe,EACf,QAAgB;IAEhB,IAAI,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,CAAC;IACpC,IAAI,sBAAsB,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,CAAC;IAChD,IAAI,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC;QAAE,OAAO,EAAE,CAAC;IACjD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACzF,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QAAE,OAAO,EAAE,CAAC;IAElD,MAAM,UAAU,GAAqB,EAAE,CAAC;IACxC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,SAAS,GAAG,+BAA+B,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QACvE,IAAI,SAAS;YAAE,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,8GAA8G;AAC9G,SAAS,+BAA+B,CACtC,OAA+C;IAE/C,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IACjC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1B,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,4CAA4C;IAC5C,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEjE,mEAAmE;IACnE,oEAAoE;IACpE,sEAAsE;IACtE,gEAAgE;IAChE,+CAA+C;IAC/C,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,GAAG,EAAE,CAAC,CAAC;IAC3D,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE3E,KAAK,MAAM,aAAa,IAAI,QAAQ,EAAE,CAAC;QACrC,IAAI,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACxC,gEAAgE;YAChE,gEAAgE;YAChE,gEAAgE;YAChE,aAAa;YACb,IACE,aAAa,CAAC,IAAI,KAAK,kBAAkB,CAAC,gBAAgB;gBAC1D,4BAA4B,CAAC,IAAI,EAAE,OAAO,EAAE,YAAY,CAAC,EACzD,CAAC;gBACD,SAAS;YACX,CAAC;YAED,gDAAgD;YAChD,6CAA6C;YAC7C,MAAM,iBAAiB,GACrB,aAAa,CAAC,IAAI,KAAK,kBAAkB,CAAC,gBAAgB,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACvF,MAAM,cAAc,GAClB,aAAa,CAAC,IAAI,KAAK,kBAAkB,CAAC,cAAc,IAAI,oBAAoB,CAAC,IAAI,CAAC,CAAC;YACzF,MAAM,oBAAoB,GACxB,aAAa,CAAC,IAAI,KAAK,kBAAkB,CAAC,qBAAqB;gBAC/D,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/B,MAAM,cAAc,GAAG,iBAAiB,IAAI,cAAc,IAAI,oBAAoB,CAAC;YAEnF,IAAI,cAAc,EAAE,CAAC;gBACnB,MAAM,OAAO,GAAG,KAAK,GAAG,CAAC,CAAC;gBAE1B,MAAM,UAAU,GAAG,wBAAwB,CAAC,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;gBAEvF,OAAO;oBACL,IAAI,EAAE,OAAO;oBACb,MAAM,EAAE,CAAC;oBACT,OAAO,EAAE,aAAa,CAAC,OAAO;oBAC9B,QAAQ,EAAE,aAAa,CAAC,QAAQ;oBAChC,UAAU;oBACV,KAAK,EAAE,IAAI;iBACZ,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AACD,oBAAoB;AAEpB;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,SAAS,oBAAoB,CAAC,IAAY;IACxC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACxC,2EAA2E;IAC3E,sEAAsE;IACtE,qCAAqC;IACrC,IAAI,sEAAsE,CAAC,IAAI,CAAC,IAAI,CAAC;QACnF,OAAO,IAAI,CAAC;IACd,0EAA0E;IAC1E,IAAI,iFAAiF,CAAC,IAAI,CAAC,IAAI,CAAC;QAC9F,OAAO,IAAI,CAAC;IACd,oDAAoD;IACpD,IACE,uFAAuF,CAAC,IAAI,CAC1F,IAAI,CACL;QAED,OAAO,IAAI,CAAC;IACd,OAAO,KAAK,CAAC;AACf,CAAC;AAED,mFAAmF;AACnF,SAAS,wBAAwB,CAAC,IAAqB,EAAE,cAAsB;IAC7E,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,kBAAkB,CAAC,CAAC,CAAC;YACxB,OAAO,8JAA8J,CAAC;QACxK,CAAC;QACD,KAAK,gBAAgB,CAAC,CAAC,CAAC;YACtB,OAAO,8NAA8N,CAAC;QACxO,CAAC;QACD,KAAK,uBAAuB,CAAC,CAAC,CAAC;YAC7B,OAAO,2GAA2G,CAAC;QACrH,CAAC;QACD,OAAO,CAAC,CAAC,CAAC;YACR,OAAO,cAAc,CAAC;QACxB,CAAC;IACH,CAAC;AACH,CAAC;AACD,oBAAoB;AAEpB;;;;GAIG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,WAAW,CAAC;IACjD,EAAE,EAAE,sCAAsC;IAC1C,IAAI,EAAE,2BAA2B;IACjC,KAAK,EAAE,EAAE,SAAS,EAAE,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE;IACrE,aAAa,EAAE,eAAe;IAE9B,UAAU,EAAE,QAAQ;IACpB,WAAW,EAAE,8EAA8E;IAC3F,eAAe,EAAE;;;;;;;;;iCASc;IAC/B,IAAI,EAAE,CAAC,aAAa,EAAE,SAAS,CAAC;IAChC,SAAS,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC;IACxB,mGAAmG;IACnG,OAAO,EAAE,OAAO,EAAE,kDAAkD;IAEpE,OAAO,CAAC,OAAO,EAAE,QAAQ;QACvB,OAAO,iCAAiC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC9D,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Yagni ignore hygiene check
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Check: quality/yagni-ignore-hygiene
|
|
6
|
+
*
|
|
7
|
+
* Validates that @yagni-ignore directives have valid detector slugs and reason comments.
|
|
8
|
+
*/
|
|
9
|
+
export declare const yagniIgnoreHygiene: import("@opensip-cli/fitness").Check;
|
|
10
|
+
//# sourceMappingURL=yagni-ignore-hygiene.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yagni-ignore-hygiene.d.ts","sourceRoot":"","sources":["../../../src/checks/quality/yagni-ignore-hygiene.ts"],"names":[],"mappings":"AACA;;GAEG;AAkEH;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,sCAwB7B,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
// @fitness-ignore-file yagni-ignore-hygiene -- check references internal slugs that may differ from registered slugs
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview Yagni ignore hygiene check
|
|
4
|
+
*/
|
|
5
|
+
import { defineCheck } from '@opensip-cli/fitness';
|
|
6
|
+
/** Regex to match @yagni-ignore directives */
|
|
7
|
+
const YAGNI_IGNORE_REGEX = /@yagni-ignore(?:-file|-next-line)?\s+(\S+)/g;
|
|
8
|
+
/** Valid detector slug format: kebab-case or yagni-prefixed */
|
|
9
|
+
const VALID_DETECTOR_PATTERN = /^(?:yagni:)?[a-z][a-z0-9-]*$/;
|
|
10
|
+
function analyzeIgnoreHygiene(content, _filePath) {
|
|
11
|
+
const violations = [];
|
|
12
|
+
const lines = content.split('\n');
|
|
13
|
+
let totalIgnoreDirectives = 0;
|
|
14
|
+
for (const [i, line_] of lines.entries()) {
|
|
15
|
+
const line = line_ ?? '';
|
|
16
|
+
if (!line.trim().startsWith('//'))
|
|
17
|
+
continue;
|
|
18
|
+
YAGNI_IGNORE_REGEX.lastIndex = 0;
|
|
19
|
+
const ignoreMatches = [...line.matchAll(YAGNI_IGNORE_REGEX)];
|
|
20
|
+
for (const match of ignoreMatches) {
|
|
21
|
+
totalIgnoreDirectives++;
|
|
22
|
+
const detectorSlug = match[1];
|
|
23
|
+
if (detectorSlug && !VALID_DETECTOR_PATTERN.test(detectorSlug)) {
|
|
24
|
+
violations.push({
|
|
25
|
+
line: i + 1,
|
|
26
|
+
message: `@yagni-ignore references '${detectorSlug}' which is not a valid detector slug (expected kebab-case)`,
|
|
27
|
+
severity: 'warning',
|
|
28
|
+
suggestion: 'Use a valid detector slug like "unused-config-surface" or "yagni:unused-config-surface"',
|
|
29
|
+
type: 'invalid-ignore-slug',
|
|
30
|
+
match: line.trim().slice(0, 120),
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
const afterMatch = line.slice(match.index + match[0].length);
|
|
34
|
+
const hasReason = afterMatch.includes('--');
|
|
35
|
+
if (!hasReason) {
|
|
36
|
+
violations.push({
|
|
37
|
+
line: i + 1,
|
|
38
|
+
message: `@yagni-ignore directive for '${detectorSlug ?? 'unknown'}' missing a reason comment`,
|
|
39
|
+
severity: 'warning',
|
|
40
|
+
suggestion: 'Add a reason: @yagni-ignore detector-slug -- Reason why this is suppressed',
|
|
41
|
+
type: 'ignore-without-reason',
|
|
42
|
+
match: line.trim().slice(0, 120),
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if (totalIgnoreDirectives > 7) {
|
|
48
|
+
violations.push({
|
|
49
|
+
line: 1,
|
|
50
|
+
message: `File has ${totalIgnoreDirectives} @yagni-ignore directives — consider fixing the underlying issues instead of suppressing`,
|
|
51
|
+
severity: 'warning',
|
|
52
|
+
suggestion: 'Review each suppression to determine if the underlying issue can be fixed',
|
|
53
|
+
type: 'excessive-ignores',
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
return violations;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Check: quality/yagni-ignore-hygiene
|
|
60
|
+
*
|
|
61
|
+
* Validates that @yagni-ignore directives have valid detector slugs and reason comments.
|
|
62
|
+
*/
|
|
63
|
+
export const yagniIgnoreHygiene = defineCheck({
|
|
64
|
+
id: 'a8f3c2e1-5b4d-4a9f-9c1e-7d2f8e6a4b30',
|
|
65
|
+
slug: 'yagni-ignore-hygiene',
|
|
66
|
+
scope: {
|
|
67
|
+
languages: ['typescript'],
|
|
68
|
+
concerns: ['backend', 'frontend', 'cli'],
|
|
69
|
+
},
|
|
70
|
+
contentFilter: 'raw',
|
|
71
|
+
description: 'Validates that @yagni-ignore directives have valid detector slugs and reason comments',
|
|
72
|
+
longDescription: `**Purpose:** Validates the quality of \`@yagni-ignore\` directives to prevent stale or undocumented suppressions.
|
|
73
|
+
|
|
74
|
+
**Detects:**
|
|
75
|
+
- Directives with invalid detector slugs (not kebab-case)
|
|
76
|
+
- Directives missing a reason comment (\`-- reason\`)
|
|
77
|
+
- Files with more than 7 ignore directives (suggests fixing underlying issues)
|
|
78
|
+
|
|
79
|
+
**Why it matters:** Undocumented suppressions accumulate over time and can mask real reduction opportunities when detector scopes change.
|
|
80
|
+
|
|
81
|
+
**Scope:** General TypeScript source. Analyzes each file individually via regex.`,
|
|
82
|
+
tags: ['quality', 'yagni', 'hygiene'],
|
|
83
|
+
fileTypes: ['ts'],
|
|
84
|
+
confidence: 'medium',
|
|
85
|
+
analyze: analyzeIgnoreHygiene,
|
|
86
|
+
});
|
|
87
|
+
//# sourceMappingURL=yagni-ignore-hygiene.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yagni-ignore-hygiene.js","sourceRoot":"","sources":["../../../src/checks/quality/yagni-ignore-hygiene.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yagni-ignore-hygiene.test.d.ts","sourceRoot":"","sources":["../../../src/checks/quality/yagni-ignore-hygiene.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coverage for the `yagni-ignore-hygiene` check (ADR-0014).
|
|
3
|
+
*/
|
|
4
|
+
import { mkdtemp, rm, writeFile } from 'node:fs/promises';
|
|
5
|
+
import { tmpdir } from 'node:os';
|
|
6
|
+
import { join } from 'node:path';
|
|
7
|
+
import { makeFitnessTestScope, withScope } from '@opensip-cli/test-support';
|
|
8
|
+
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
9
|
+
import { yagniIgnoreHygiene } from './yagni-ignore-hygiene.js';
|
|
10
|
+
let root;
|
|
11
|
+
beforeEach(async () => {
|
|
12
|
+
root = await mkdtemp(join(tmpdir(), 'yagni-hygiene-'));
|
|
13
|
+
});
|
|
14
|
+
afterEach(async () => {
|
|
15
|
+
await rm(root, { recursive: true, force: true });
|
|
16
|
+
});
|
|
17
|
+
async function violationTypes(name, content) {
|
|
18
|
+
const filePath = join(root, name);
|
|
19
|
+
await writeFile(filePath, content, 'utf8');
|
|
20
|
+
const result = await withScope(makeFitnessTestScope(), () => yagniIgnoreHygiene.run(root, { targetFiles: [filePath] }));
|
|
21
|
+
return result.signals.map((s) => s.metadata.type);
|
|
22
|
+
}
|
|
23
|
+
describe('yagni-ignore-hygiene', () => {
|
|
24
|
+
it('flags a directive missing a -- reason as ignore-without-reason', async () => {
|
|
25
|
+
const types = await violationTypes('a.ts', '// @yagni-ignore-next-line unused-config-surface\nconst x = 1;\n');
|
|
26
|
+
expect(types).toContain('ignore-without-reason');
|
|
27
|
+
});
|
|
28
|
+
it('flags an invalid detector slug as invalid-ignore-slug', async () => {
|
|
29
|
+
const types = await violationTypes('b.ts', '// @yagni-ignore-next-line Bad_Slug -- has a reason\nconst x = 1;\n');
|
|
30
|
+
expect(types).toContain('invalid-ignore-slug');
|
|
31
|
+
});
|
|
32
|
+
it('accepts valid directives with reasons', async () => {
|
|
33
|
+
const types = await violationTypes('c.ts', '// @yagni-ignore-file unused-config-surface -- fixture intentionally unused\n');
|
|
34
|
+
expect(types).toHaveLength(0);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
//# sourceMappingURL=yagni-ignore-hygiene.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yagni-ignore-hygiene.test.js","sourceRoot":"","sources":["../../../src/checks/quality/yagni-ignore-hygiene.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC5E,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAErE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/D,IAAI,IAAY,CAAC;AAEjB,UAAU,CAAC,KAAK,IAAI,EAAE;IACpB,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC;AACzD,CAAC,CAAC,CAAC;AAEH,SAAS,CAAC,KAAK,IAAI,EAAE;IACnB,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACnD,CAAC,CAAC,CAAC;AAEH,KAAK,UAAU,cAAc,CAAC,IAAY,EAAE,OAAe;IACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAClC,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,oBAAoB,EAAE,EAAE,GAAG,EAAE,CAC1D,kBAAkB,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAC1D,CAAC;IACF,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAA0B,CAAC,CAAC;AAC1E,CAAC;AAED,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,KAAK,GAAG,MAAM,cAAc,CAChC,MAAM,EACN,kEAAkE,CACnE,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,KAAK,GAAG,MAAM,cAAc,CAChC,MAAM,EACN,qEAAqE,CACtE,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,KAAK,GAAG,MAAM,cAAc,CAChC,MAAM,EACN,+EAA+E,CAChF,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Batch operation limits check
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Check: resilience/batch-operation-limits
|
|
6
|
+
*
|
|
7
|
+
* Detects batch operations that may process unbounded data:
|
|
8
|
+
* - Array operations on potentially large datasets without pagination
|
|
9
|
+
* - Async operations without concurrency limits
|
|
10
|
+
* - Database queries without LIMIT clauses
|
|
11
|
+
*/
|
|
12
|
+
export declare const batchOperationLimits: import("@opensip-cli/fitness").Check;
|
|
13
|
+
//# sourceMappingURL=batch-operation-limits.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch-operation-limits.d.ts","sourceRoot":"","sources":["../../../src/checks/resilience/batch-operation-limits.ts"],"names":[],"mappings":"AAAA;;GAEG;AA2MH;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,sCA0C/B,CAAC"}
|