@opensip-cli/checks-universal 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/NOTICE +8 -0
- package/README.md +31 -0
- package/dist/__tests__/all-checks-execute.test.d.ts +17 -0
- package/dist/__tests__/all-checks-execute.test.d.ts.map +1 -0
- package/dist/__tests__/all-checks-execute.test.js +452 -0
- package/dist/__tests__/all-checks-execute.test.js.map +1 -0
- package/dist/__tests__/behavior-fixtures-10.test.d.ts +8 -0
- package/dist/__tests__/behavior-fixtures-10.test.d.ts.map +1 -0
- package/dist/__tests__/behavior-fixtures-10.test.js +200 -0
- package/dist/__tests__/behavior-fixtures-10.test.js.map +1 -0
- package/dist/__tests__/behavior-fixtures-11.test.d.ts +8 -0
- package/dist/__tests__/behavior-fixtures-11.test.d.ts.map +1 -0
- package/dist/__tests__/behavior-fixtures-11.test.js +120 -0
- package/dist/__tests__/behavior-fixtures-11.test.js.map +1 -0
- package/dist/__tests__/behavior-fixtures-12.test.d.ts +8 -0
- package/dist/__tests__/behavior-fixtures-12.test.d.ts.map +1 -0
- package/dist/__tests__/behavior-fixtures-12.test.js +157 -0
- package/dist/__tests__/behavior-fixtures-12.test.js.map +1 -0
- package/dist/__tests__/behavior-fixtures-2.test.d.ts +8 -0
- package/dist/__tests__/behavior-fixtures-2.test.d.ts.map +1 -0
- package/dist/__tests__/behavior-fixtures-2.test.js +785 -0
- package/dist/__tests__/behavior-fixtures-2.test.js.map +1 -0
- package/dist/__tests__/behavior-fixtures-3.test.d.ts +6 -0
- package/dist/__tests__/behavior-fixtures-3.test.d.ts.map +1 -0
- package/dist/__tests__/behavior-fixtures-3.test.js +663 -0
- package/dist/__tests__/behavior-fixtures-3.test.js.map +1 -0
- package/dist/__tests__/behavior-fixtures-4.test.d.ts +5 -0
- package/dist/__tests__/behavior-fixtures-4.test.d.ts.map +1 -0
- package/dist/__tests__/behavior-fixtures-4.test.js +612 -0
- package/dist/__tests__/behavior-fixtures-4.test.js.map +1 -0
- package/dist/__tests__/behavior-fixtures-5.test.d.ts +5 -0
- package/dist/__tests__/behavior-fixtures-5.test.d.ts.map +1 -0
- package/dist/__tests__/behavior-fixtures-5.test.js +469 -0
- package/dist/__tests__/behavior-fixtures-5.test.js.map +1 -0
- package/dist/__tests__/behavior-fixtures-6.test.d.ts +8 -0
- package/dist/__tests__/behavior-fixtures-6.test.d.ts.map +1 -0
- package/dist/__tests__/behavior-fixtures-6.test.js +591 -0
- package/dist/__tests__/behavior-fixtures-6.test.js.map +1 -0
- package/dist/__tests__/behavior-fixtures-7.test.d.ts +5 -0
- package/dist/__tests__/behavior-fixtures-7.test.d.ts.map +1 -0
- package/dist/__tests__/behavior-fixtures-7.test.js +662 -0
- package/dist/__tests__/behavior-fixtures-7.test.js.map +1 -0
- package/dist/__tests__/behavior-fixtures-8.test.d.ts +11 -0
- package/dist/__tests__/behavior-fixtures-8.test.d.ts.map +1 -0
- package/dist/__tests__/behavior-fixtures-8.test.js +634 -0
- package/dist/__tests__/behavior-fixtures-8.test.js.map +1 -0
- package/dist/__tests__/behavior-fixtures-9.test.d.ts +11 -0
- package/dist/__tests__/behavior-fixtures-9.test.d.ts.map +1 -0
- package/dist/__tests__/behavior-fixtures-9.test.js +271 -0
- package/dist/__tests__/behavior-fixtures-9.test.js.map +1 -0
- package/dist/__tests__/behavior-fixtures.test.d.ts +14 -0
- package/dist/__tests__/behavior-fixtures.test.d.ts.map +1 -0
- package/dist/__tests__/behavior-fixtures.test.js +1423 -0
- package/dist/__tests__/behavior-fixtures.test.js.map +1 -0
- package/dist/__tests__/checks.test.d.ts +2 -0
- package/dist/__tests__/checks.test.d.ts.map +1 -0
- package/dist/__tests__/checks.test.js +61 -0
- package/dist/__tests__/checks.test.js.map +1 -0
- package/dist/__tests__/env-var-validation.test.d.ts +14 -0
- package/dist/__tests__/env-var-validation.test.d.ts.map +1 -0
- package/dist/__tests__/env-var-validation.test.js +53 -0
- package/dist/__tests__/env-var-validation.test.js.map +1 -0
- package/dist/__tests__/file-length-limit.test.d.ts +2 -0
- package/dist/__tests__/file-length-limit.test.d.ts.map +1 -0
- package/dist/__tests__/file-length-limit.test.js +29 -0
- package/dist/__tests__/file-length-limit.test.js.map +1 -0
- package/dist/__tests__/fixture-coverage.allowlist.d.ts +18 -0
- package/dist/__tests__/fixture-coverage.allowlist.d.ts.map +1 -0
- package/dist/__tests__/fixture-coverage.allowlist.js +35 -0
- package/dist/__tests__/fixture-coverage.allowlist.js.map +1 -0
- package/dist/__tests__/fixture-coverage.test.d.ts +13 -0
- package/dist/__tests__/fixture-coverage.test.d.ts.map +1 -0
- package/dist/__tests__/fixture-coverage.test.js +57 -0
- package/dist/__tests__/fixture-coverage.test.js.map +1 -0
- package/dist/__tests__/iic.test.d.ts +15 -0
- package/dist/__tests__/iic.test.d.ts.map +1 -0
- package/dist/__tests__/iic.test.js +316 -0
- package/dist/__tests__/iic.test.js.map +1 -0
- package/dist/__tests__/no-skipped-tests.test.d.ts +14 -0
- package/dist/__tests__/no-skipped-tests.test.d.ts.map +1 -0
- package/dist/__tests__/no-skipped-tests.test.js +144 -0
- package/dist/__tests__/no-skipped-tests.test.js.map +1 -0
- package/dist/__tests__/no-todo-comments.test.d.ts +2 -0
- package/dist/__tests__/no-todo-comments.test.d.ts.map +1 -0
- package/dist/__tests__/no-todo-comments.test.js +31 -0
- package/dist/__tests__/no-todo-comments.test.js.map +1 -0
- package/dist/__tests__/no-unimplemented-markers.test.d.ts +2 -0
- package/dist/__tests__/no-unimplemented-markers.test.d.ts.map +1 -0
- package/dist/__tests__/no-unimplemented-markers.test.js +140 -0
- package/dist/__tests__/no-unimplemented-markers.test.js.map +1 -0
- package/dist/__tests__/public-api-jsdoc-scope.test.d.ts +10 -0
- package/dist/__tests__/public-api-jsdoc-scope.test.d.ts.map +1 -0
- package/dist/__tests__/public-api-jsdoc-scope.test.js +176 -0
- package/dist/__tests__/public-api-jsdoc-scope.test.js.map +1 -0
- package/dist/__tests__/resilience-fp.test.d.ts +14 -0
- package/dist/__tests__/resilience-fp.test.d.ts.map +1 -0
- package/dist/__tests__/resilience-fp.test.js +110 -0
- package/dist/__tests__/resilience-fp.test.js.map +1 -0
- package/dist/checks/architecture/__tests__/no-kebab-option-indexing.test.d.ts +2 -0
- package/dist/checks/architecture/__tests__/no-kebab-option-indexing.test.d.ts.map +1 -0
- package/dist/checks/architecture/__tests__/no-kebab-option-indexing.test.js +32 -0
- package/dist/checks/architecture/__tests__/no-kebab-option-indexing.test.js.map +1 -0
- package/dist/checks/architecture/__tests__/tool-has-manifest.test.d.ts +2 -0
- package/dist/checks/architecture/__tests__/tool-has-manifest.test.d.ts.map +1 -0
- package/dist/checks/architecture/__tests__/tool-has-manifest.test.js +152 -0
- package/dist/checks/architecture/__tests__/tool-has-manifest.test.js.map +1 -0
- package/dist/checks/architecture/__tests__/vitest-config-required-with-tests.test.d.ts +2 -0
- package/dist/checks/architecture/__tests__/vitest-config-required-with-tests.test.d.ts.map +1 -0
- package/dist/checks/architecture/__tests__/vitest-config-required-with-tests.test.js +129 -0
- package/dist/checks/architecture/__tests__/vitest-config-required-with-tests.test.js.map +1 -0
- package/dist/checks/architecture/_yaml-doc-bindings.d.ts +23 -0
- package/dist/checks/architecture/_yaml-doc-bindings.d.ts.map +1 -0
- package/dist/checks/architecture/_yaml-doc-bindings.js +29 -0
- package/dist/checks/architecture/_yaml-doc-bindings.js.map +1 -0
- package/dist/checks/architecture/dependencies/index.d.ts +2 -0
- package/dist/checks/architecture/dependencies/index.d.ts.map +1 -0
- package/dist/checks/architecture/dependencies/index.js +2 -0
- package/dist/checks/architecture/dependencies/index.js.map +1 -0
- package/dist/checks/architecture/dependencies/no-duplicate-packages.d.ts +11 -0
- package/dist/checks/architecture/dependencies/no-duplicate-packages.d.ts.map +1 -0
- package/dist/checks/architecture/dependencies/no-duplicate-packages.js +171 -0
- package/dist/checks/architecture/dependencies/no-duplicate-packages.js.map +1 -0
- package/dist/checks/architecture/docker-best-practices.d.ts +23 -0
- package/dist/checks/architecture/docker-best-practices.d.ts.map +1 -0
- package/dist/checks/architecture/docker-best-practices.js +427 -0
- package/dist/checks/architecture/docker-best-practices.js.map +1 -0
- package/dist/checks/architecture/docker-ignore-validation.d.ts +18 -0
- package/dist/checks/architecture/docker-ignore-validation.d.ts.map +1 -0
- package/dist/checks/architecture/docker-ignore-validation.js +117 -0
- package/dist/checks/architecture/docker-ignore-validation.js.map +1 -0
- package/dist/checks/architecture/docker-version-sync.d.ts +16 -0
- package/dist/checks/architecture/docker-version-sync.d.ts.map +1 -0
- package/dist/checks/architecture/docker-version-sync.js +193 -0
- package/dist/checks/architecture/docker-version-sync.js.map +1 -0
- package/dist/checks/architecture/env-var-validation.d.ts +14 -0
- package/dist/checks/architecture/env-var-validation.d.ts.map +1 -0
- package/dist/checks/architecture/env-var-validation.js +289 -0
- package/dist/checks/architecture/env-var-validation.js.map +1 -0
- package/dist/checks/architecture/heavy-import-detection.d.ts +11 -0
- package/dist/checks/architecture/heavy-import-detection.d.ts.map +1 -0
- package/dist/checks/architecture/heavy-import-detection.js +91 -0
- package/dist/checks/architecture/heavy-import-detection.js.map +1 -0
- package/dist/checks/architecture/index.d.ts +16 -0
- package/dist/checks/architecture/index.d.ts.map +1 -0
- package/dist/checks/architecture/index.js +16 -0
- package/dist/checks/architecture/index.js.map +1 -0
- package/dist/checks/architecture/modules/empty-package-detection.d.ts +11 -0
- package/dist/checks/architecture/modules/empty-package-detection.d.ts.map +1 -0
- package/dist/checks/architecture/modules/empty-package-detection.js +277 -0
- package/dist/checks/architecture/modules/empty-package-detection.js.map +1 -0
- package/dist/checks/architecture/modules/index.d.ts +3 -0
- package/dist/checks/architecture/modules/index.d.ts.map +1 -0
- package/dist/checks/architecture/modules/index.js +3 -0
- package/dist/checks/architecture/modules/index.js.map +1 -0
- package/dist/checks/architecture/modules/interface-implementation-consistency.d.ts +12 -0
- package/dist/checks/architecture/modules/interface-implementation-consistency.d.ts.map +1 -0
- package/dist/checks/architecture/modules/interface-implementation-consistency.js +555 -0
- package/dist/checks/architecture/modules/interface-implementation-consistency.js.map +1 -0
- package/dist/checks/architecture/no-custom-event-emitter.d.ts +11 -0
- package/dist/checks/architecture/no-custom-event-emitter.d.ts.map +1 -0
- package/dist/checks/architecture/no-custom-event-emitter.js +123 -0
- package/dist/checks/architecture/no-custom-event-emitter.js.map +1 -0
- package/dist/checks/architecture/no-kebab-option-indexing.d.ts +33 -0
- package/dist/checks/architecture/no-kebab-option-indexing.d.ts.map +1 -0
- package/dist/checks/architecture/no-kebab-option-indexing.js +81 -0
- package/dist/checks/architecture/no-kebab-option-indexing.js.map +1 -0
- package/dist/checks/architecture/node-version-consistency.d.ts +22 -0
- package/dist/checks/architecture/node-version-consistency.d.ts.map +1 -0
- package/dist/checks/architecture/node-version-consistency.js +225 -0
- package/dist/checks/architecture/node-version-consistency.js.map +1 -0
- package/dist/checks/architecture/project-readme-existence.d.ts +13 -0
- package/dist/checks/architecture/project-readme-existence.d.ts.map +1 -0
- package/dist/checks/architecture/project-readme-existence.js +55 -0
- package/dist/checks/architecture/project-readme-existence.js.map +1 -0
- package/dist/checks/architecture/stale-build-artifacts.d.ts +10 -0
- package/dist/checks/architecture/stale-build-artifacts.d.ts.map +1 -0
- package/dist/checks/architecture/stale-build-artifacts.js +55 -0
- package/dist/checks/architecture/stale-build-artifacts.js.map +1 -0
- package/dist/checks/architecture/tool-has-manifest.d.ts +27 -0
- package/dist/checks/architecture/tool-has-manifest.d.ts.map +1 -0
- package/dist/checks/architecture/tool-has-manifest.js +135 -0
- package/dist/checks/architecture/tool-has-manifest.js.map +1 -0
- package/dist/checks/architecture/vitest-config-extends-base.d.ts +15 -0
- package/dist/checks/architecture/vitest-config-extends-base.d.ts.map +1 -0
- package/dist/checks/architecture/vitest-config-extends-base.js +104 -0
- package/dist/checks/architecture/vitest-config-extends-base.js.map +1 -0
- package/dist/checks/architecture/vitest-config-required-with-tests.d.ts +49 -0
- package/dist/checks/architecture/vitest-config-required-with-tests.d.ts.map +1 -0
- package/dist/checks/architecture/vitest-config-required-with-tests.js +199 -0
- package/dist/checks/architecture/vitest-config-required-with-tests.js.map +1 -0
- package/dist/checks/documentation/_directives/eslint.d.ts +9 -0
- package/dist/checks/documentation/_directives/eslint.d.ts.map +1 -0
- package/dist/checks/documentation/_directives/eslint.js +168 -0
- package/dist/checks/documentation/_directives/eslint.js.map +1 -0
- package/dist/checks/documentation/_directives/fitness.d.ts +9 -0
- package/dist/checks/documentation/_directives/fitness.d.ts.map +1 -0
- package/dist/checks/documentation/_directives/fitness.js +64 -0
- package/dist/checks/documentation/_directives/fitness.js.map +1 -0
- package/dist/checks/documentation/_directives/graph.d.ts +10 -0
- package/dist/checks/documentation/_directives/graph.d.ts.map +1 -0
- package/dist/checks/documentation/_directives/graph.js +65 -0
- package/dist/checks/documentation/_directives/graph.js.map +1 -0
- package/dist/checks/documentation/_directives/graph.test.d.ts +2 -0
- package/dist/checks/documentation/_directives/graph.test.d.ts.map +1 -0
- package/dist/checks/documentation/_directives/graph.test.js +54 -0
- package/dist/checks/documentation/_directives/graph.test.js.map +1 -0
- package/dist/checks/documentation/_directives/semgrep.d.ts +8 -0
- package/dist/checks/documentation/_directives/semgrep.d.ts.map +1 -0
- package/dist/checks/documentation/_directives/semgrep.js +72 -0
- package/dist/checks/documentation/_directives/semgrep.js.map +1 -0
- package/dist/checks/documentation/_directives/types.d.ts +21 -0
- package/dist/checks/documentation/_directives/types.d.ts.map +1 -0
- package/dist/checks/documentation/_directives/types.js +9 -0
- package/dist/checks/documentation/_directives/types.js.map +1 -0
- package/dist/checks/documentation/_directives/typescript.d.ts +10 -0
- package/dist/checks/documentation/_directives/typescript.d.ts.map +1 -0
- package/dist/checks/documentation/_directives/typescript.js +54 -0
- package/dist/checks/documentation/_directives/typescript.js.map +1 -0
- package/dist/checks/documentation/_public-api-graph.d.ts +30 -0
- package/dist/checks/documentation/_public-api-graph.d.ts.map +1 -0
- package/dist/checks/documentation/_public-api-graph.js +304 -0
- package/dist/checks/documentation/_public-api-graph.js.map +1 -0
- package/dist/checks/documentation/directive-audit.d.ts +26 -0
- package/dist/checks/documentation/directive-audit.d.ts.map +1 -0
- package/dist/checks/documentation/directive-audit.js +144 -0
- package/dist/checks/documentation/directive-audit.js.map +1 -0
- package/dist/checks/documentation/index.d.ts +3 -0
- package/dist/checks/documentation/index.d.ts.map +1 -0
- package/dist/checks/documentation/index.js +3 -0
- package/dist/checks/documentation/index.js.map +1 -0
- package/dist/checks/documentation/public-api-jsdoc.d.ts +10 -0
- package/dist/checks/documentation/public-api-jsdoc.d.ts.map +1 -0
- package/dist/checks/documentation/public-api-jsdoc.js +131 -0
- package/dist/checks/documentation/public-api-jsdoc.js.map +1 -0
- package/dist/checks/file-length-limit.d.ts +16 -0
- package/dist/checks/file-length-limit.d.ts.map +1 -0
- package/dist/checks/file-length-limit.js +47 -0
- package/dist/checks/file-length-limit.js.map +1 -0
- package/dist/checks/index.d.ts +16 -0
- package/dist/checks/index.d.ts.map +1 -0
- package/dist/checks/index.js +16 -0
- package/dist/checks/index.js.map +1 -0
- package/dist/checks/no-todo-comments.d.ts +18 -0
- package/dist/checks/no-todo-comments.d.ts.map +1 -0
- package/dist/checks/no-todo-comments.js +79 -0
- package/dist/checks/no-todo-comments.js.map +1 -0
- package/dist/checks/no-unimplemented-markers.d.ts +24 -0
- package/dist/checks/no-unimplemented-markers.d.ts.map +1 -0
- package/dist/checks/no-unimplemented-markers.js +198 -0
- package/dist/checks/no-unimplemented-markers.js.map +1 -0
- package/dist/checks/quality/api/graphql-offset-pagination.d.ts +9 -0
- package/dist/checks/quality/api/graphql-offset-pagination.d.ts.map +1 -0
- package/dist/checks/quality/api/graphql-offset-pagination.js +63 -0
- package/dist/checks/quality/api/graphql-offset-pagination.js.map +1 -0
- package/dist/checks/quality/api/index.d.ts +3 -0
- package/dist/checks/quality/api/index.d.ts.map +1 -0
- package/dist/checks/quality/api/index.js +3 -0
- package/dist/checks/quality/api/index.js.map +1 -0
- package/dist/checks/quality/api/zod-openapi-sync.d.ts +13 -0
- package/dist/checks/quality/api/zod-openapi-sync.d.ts.map +1 -0
- package/dist/checks/quality/api/zod-openapi-sync.js +88 -0
- package/dist/checks/quality/api/zod-openapi-sync.js.map +1 -0
- package/dist/checks/quality/code-structure/dead-code.d.ts +12 -0
- package/dist/checks/quality/code-structure/dead-code.d.ts.map +1 -0
- package/dist/checks/quality/code-structure/dead-code.js +238 -0
- package/dist/checks/quality/code-structure/dead-code.js.map +1 -0
- package/dist/checks/quality/code-structure/index.d.ts +5 -0
- package/dist/checks/quality/code-structure/index.d.ts.map +1 -0
- package/dist/checks/quality/code-structure/index.js +5 -0
- package/dist/checks/quality/code-structure/index.js.map +1 -0
- package/dist/checks/quality/code-structure/no-ai-attribution.d.ts +25 -0
- package/dist/checks/quality/code-structure/no-ai-attribution.d.ts.map +1 -0
- package/dist/checks/quality/code-structure/no-ai-attribution.js +76 -0
- package/dist/checks/quality/code-structure/no-ai-attribution.js.map +1 -0
- package/dist/checks/quality/code-structure/no-console-log.d.ts +17 -0
- package/dist/checks/quality/code-structure/no-console-log.d.ts.map +1 -0
- package/dist/checks/quality/code-structure/no-console-log.js +106 -0
- package/dist/checks/quality/code-structure/no-console-log.js.map +1 -0
- package/dist/checks/quality/code-structure/no-process-artifacts.d.ts +25 -0
- package/dist/checks/quality/code-structure/no-process-artifacts.d.ts.map +1 -0
- package/dist/checks/quality/code-structure/no-process-artifacts.js +104 -0
- package/dist/checks/quality/code-structure/no-process-artifacts.js.map +1 -0
- package/dist/checks/quality/dependency-version-consistency.d.ts +20 -0
- package/dist/checks/quality/dependency-version-consistency.d.ts.map +1 -0
- package/dist/checks/quality/dependency-version-consistency.js +266 -0
- package/dist/checks/quality/dependency-version-consistency.js.map +1 -0
- package/dist/checks/quality/fitness-ignore-hygiene.d.ts +10 -0
- package/dist/checks/quality/fitness-ignore-hygiene.d.ts.map +1 -0
- package/dist/checks/quality/fitness-ignore-hygiene.js +93 -0
- package/dist/checks/quality/fitness-ignore-hygiene.js.map +1 -0
- package/dist/checks/quality/frontend/expo-vector-icons.d.ts +13 -0
- package/dist/checks/quality/frontend/expo-vector-icons.d.ts.map +1 -0
- package/dist/checks/quality/frontend/expo-vector-icons.js +80 -0
- package/dist/checks/quality/frontend/expo-vector-icons.js.map +1 -0
- package/dist/checks/quality/frontend/image-optimization.d.ts +13 -0
- package/dist/checks/quality/frontend/image-optimization.d.ts.map +1 -0
- package/dist/checks/quality/frontend/image-optimization.js +166 -0
- package/dist/checks/quality/frontend/image-optimization.js.map +1 -0
- package/dist/checks/quality/frontend/index.d.ts +4 -0
- package/dist/checks/quality/frontend/index.d.ts.map +1 -0
- package/dist/checks/quality/frontend/index.js +4 -0
- package/dist/checks/quality/frontend/index.js.map +1 -0
- package/dist/checks/quality/frontend/navigation-typing.d.ts +12 -0
- package/dist/checks/quality/frontend/navigation-typing.d.ts.map +1 -0
- package/dist/checks/quality/frontend/navigation-typing.js +77 -0
- package/dist/checks/quality/frontend/navigation-typing.js.map +1 -0
- package/dist/checks/quality/graph-ignore-hygiene.d.ts +10 -0
- package/dist/checks/quality/graph-ignore-hygiene.d.ts.map +1 -0
- package/dist/checks/quality/graph-ignore-hygiene.js +95 -0
- package/dist/checks/quality/graph-ignore-hygiene.js.map +1 -0
- package/dist/checks/quality/graph-ignore-hygiene.test.d.ts +14 -0
- package/dist/checks/quality/graph-ignore-hygiene.test.d.ts.map +1 -0
- package/dist/checks/quality/graph-ignore-hygiene.test.js +58 -0
- package/dist/checks/quality/graph-ignore-hygiene.test.js.map +1 -0
- package/dist/checks/quality/index.d.ts +16 -0
- package/dist/checks/quality/index.d.ts.map +1 -0
- package/dist/checks/quality/index.js +16 -0
- package/dist/checks/quality/index.js.map +1 -0
- package/dist/checks/quality/linting/eslint-justifications.d.ts +12 -0
- package/dist/checks/quality/linting/eslint-justifications.d.ts.map +1 -0
- package/dist/checks/quality/linting/eslint-justifications.js +328 -0
- package/dist/checks/quality/linting/eslint-justifications.js.map +1 -0
- package/dist/checks/quality/linting/index.d.ts +4 -0
- package/dist/checks/quality/linting/index.d.ts.map +1 -0
- package/dist/checks/quality/linting/index.js +4 -0
- package/dist/checks/quality/linting/index.js.map +1 -0
- package/dist/checks/quality/linting/semgrep-justifications.d.ts +16 -0
- package/dist/checks/quality/linting/semgrep-justifications.d.ts.map +1 -0
- package/dist/checks/quality/linting/semgrep-justifications.js +229 -0
- package/dist/checks/quality/linting/semgrep-justifications.js.map +1 -0
- package/dist/checks/quality/linting/typescript-directive-hygiene.d.ts +12 -0
- package/dist/checks/quality/linting/typescript-directive-hygiene.d.ts.map +1 -0
- package/dist/checks/quality/linting/typescript-directive-hygiene.js +142 -0
- package/dist/checks/quality/linting/typescript-directive-hygiene.js.map +1 -0
- package/dist/checks/quality/no-compatibility-layer-names.d.ts +13 -0
- package/dist/checks/quality/no-compatibility-layer-names.d.ts.map +1 -0
- package/dist/checks/quality/no-compatibility-layer-names.js +100 -0
- package/dist/checks/quality/no-compatibility-layer-names.js.map +1 -0
- package/dist/checks/quality/no-deprecated-tags.d.ts +11 -0
- package/dist/checks/quality/no-deprecated-tags.d.ts.map +1 -0
- package/dist/checks/quality/no-deprecated-tags.js +76 -0
- package/dist/checks/quality/no-deprecated-tags.js.map +1 -0
- package/dist/checks/quality/no-markdown-references.d.ts +16 -0
- package/dist/checks/quality/no-markdown-references.d.ts.map +1 -0
- package/dist/checks/quality/no-markdown-references.js +145 -0
- package/dist/checks/quality/no-markdown-references.js.map +1 -0
- package/dist/checks/quality/no-raw-regex-on-code.d.ts +9 -0
- package/dist/checks/quality/no-raw-regex-on-code.d.ts.map +1 -0
- package/dist/checks/quality/no-raw-regex-on-code.js +61 -0
- package/dist/checks/quality/no-raw-regex-on-code.js.map +1 -0
- package/dist/checks/quality/no-temporary-workarounds.d.ts +11 -0
- package/dist/checks/quality/no-temporary-workarounds.d.ts.map +1 -0
- package/dist/checks/quality/no-temporary-workarounds.js +69 -0
- package/dist/checks/quality/no-temporary-workarounds.js.map +1 -0
- package/dist/checks/quality/no-window-alert.d.ts +19 -0
- package/dist/checks/quality/no-window-alert.d.ts.map +1 -0
- package/dist/checks/quality/no-window-alert.js +74 -0
- package/dist/checks/quality/no-window-alert.js.map +1 -0
- package/dist/checks/quality/observability/index.d.ts +2 -0
- package/dist/checks/quality/observability/index.d.ts.map +1 -0
- package/dist/checks/quality/observability/index.js +2 -0
- package/dist/checks/quality/observability/index.js.map +1 -0
- package/dist/checks/quality/observability/pino-serializer-coverage.d.ts +15 -0
- package/dist/checks/quality/observability/pino-serializer-coverage.d.ts.map +1 -0
- package/dist/checks/quality/observability/pino-serializer-coverage.js +209 -0
- package/dist/checks/quality/observability/pino-serializer-coverage.js.map +1 -0
- package/dist/checks/quality/patterns/async-state-pattern.d.ts +14 -0
- package/dist/checks/quality/patterns/async-state-pattern.d.ts.map +1 -0
- package/dist/checks/quality/patterns/async-state-pattern.js +80 -0
- package/dist/checks/quality/patterns/async-state-pattern.js.map +1 -0
- package/dist/checks/quality/patterns/index.d.ts +4 -0
- package/dist/checks/quality/patterns/index.d.ts.map +1 -0
- package/dist/checks/quality/patterns/index.js +4 -0
- package/dist/checks/quality/patterns/index.js.map +1 -0
- package/dist/checks/quality/patterns/no-non-null-assertions.d.ts +10 -0
- package/dist/checks/quality/patterns/no-non-null-assertions.d.ts.map +1 -0
- package/dist/checks/quality/patterns/no-non-null-assertions.js +97 -0
- package/dist/checks/quality/patterns/no-non-null-assertions.js.map +1 -0
- package/dist/checks/quality/patterns/performance-anti-patterns.d.ts +16 -0
- package/dist/checks/quality/patterns/performance-anti-patterns.d.ts.map +1 -0
- package/dist/checks/quality/patterns/performance-anti-patterns.js +239 -0
- package/dist/checks/quality/patterns/performance-anti-patterns.js.map +1 -0
- package/dist/checks/resilience/_helpers/config-validation.d.ts +27 -0
- package/dist/checks/resilience/_helpers/config-validation.d.ts.map +1 -0
- package/dist/checks/resilience/_helpers/config-validation.js +61 -0
- package/dist/checks/resilience/_helpers/config-validation.js.map +1 -0
- package/dist/checks/resilience/batch-operations.d.ts +22 -0
- package/dist/checks/resilience/batch-operations.d.ts.map +1 -0
- package/dist/checks/resilience/batch-operations.js +422 -0
- package/dist/checks/resilience/batch-operations.js.map +1 -0
- package/dist/checks/resilience/cache-ttl-validation.d.ts +13 -0
- package/dist/checks/resilience/cache-ttl-validation.d.ts.map +1 -0
- package/dist/checks/resilience/cache-ttl-validation.js +222 -0
- package/dist/checks/resilience/cache-ttl-validation.js.map +1 -0
- package/dist/checks/resilience/catch-clause-safety.d.ts +12 -0
- package/dist/checks/resilience/catch-clause-safety.d.ts.map +1 -0
- package/dist/checks/resilience/catch-clause-safety.js +110 -0
- package/dist/checks/resilience/catch-clause-safety.js.map +1 -0
- package/dist/checks/resilience/dangerous-config-defaults.d.ts +11 -0
- package/dist/checks/resilience/dangerous-config-defaults.d.ts.map +1 -0
- package/dist/checks/resilience/dangerous-config-defaults.js +304 -0
- package/dist/checks/resilience/dangerous-config-defaults.js.map +1 -0
- package/dist/checks/resilience/error-code-registration.d.ts +11 -0
- package/dist/checks/resilience/error-code-registration.d.ts.map +1 -0
- package/dist/checks/resilience/error-code-registration.js +88 -0
- package/dist/checks/resilience/error-code-registration.js.map +1 -0
- package/dist/checks/resilience/event-patterns.d.ts +21 -0
- package/dist/checks/resilience/event-patterns.d.ts.map +1 -0
- package/dist/checks/resilience/event-patterns.js +232 -0
- package/dist/checks/resilience/event-patterns.js.map +1 -0
- package/dist/checks/resilience/exit-code-correctness.d.ts +12 -0
- package/dist/checks/resilience/exit-code-correctness.d.ts.map +1 -0
- package/dist/checks/resilience/exit-code-correctness.js +107 -0
- package/dist/checks/resilience/exit-code-correctness.js.map +1 -0
- package/dist/checks/resilience/index.d.ts +18 -0
- package/dist/checks/resilience/index.d.ts.map +1 -0
- package/dist/checks/resilience/index.js +18 -0
- package/dist/checks/resilience/index.js.map +1 -0
- package/dist/checks/resilience/no-hardcoded-timeouts.d.ts +10 -0
- package/dist/checks/resilience/no-hardcoded-timeouts.d.ts.map +1 -0
- package/dist/checks/resilience/no-hardcoded-timeouts.js +291 -0
- package/dist/checks/resilience/no-hardcoded-timeouts.js.map +1 -0
- package/dist/checks/resilience/no-process-exit-in-finally.d.ts +11 -0
- package/dist/checks/resilience/no-process-exit-in-finally.d.ts.map +1 -0
- package/dist/checks/resilience/no-process-exit-in-finally.js +89 -0
- package/dist/checks/resilience/no-process-exit-in-finally.js.map +1 -0
- package/dist/checks/resilience/readline-cleanup.d.ts +11 -0
- package/dist/checks/resilience/readline-cleanup.d.ts.map +1 -0
- package/dist/checks/resilience/readline-cleanup.js +107 -0
- package/dist/checks/resilience/readline-cleanup.js.map +1 -0
- package/dist/checks/resilience/recovery-patterns.d.ts +25 -0
- package/dist/checks/resilience/recovery-patterns.d.ts.map +1 -0
- package/dist/checks/resilience/recovery-patterns.js +273 -0
- package/dist/checks/resilience/recovery-patterns.js.map +1 -0
- package/dist/checks/resilience/reentrancy-guard.d.ts +12 -0
- package/dist/checks/resilience/reentrancy-guard.d.ts.map +1 -0
- package/dist/checks/resilience/reentrancy-guard.js +86 -0
- package/dist/checks/resilience/reentrancy-guard.js.map +1 -0
- package/dist/checks/resilience/retry-config-validation.d.ts +13 -0
- package/dist/checks/resilience/retry-config-validation.d.ts.map +1 -0
- package/dist/checks/resilience/retry-config-validation.js +159 -0
- package/dist/checks/resilience/retry-config-validation.js.map +1 -0
- package/dist/checks/resilience/sentry/_helpers/sentry.d.ts +25 -0
- package/dist/checks/resilience/sentry/_helpers/sentry.d.ts.map +1 -0
- package/dist/checks/resilience/sentry/_helpers/sentry.js +68 -0
- package/dist/checks/resilience/sentry/_helpers/sentry.js.map +1 -0
- package/dist/checks/resilience/sentry/index.d.ts +8 -0
- package/dist/checks/resilience/sentry/index.d.ts.map +1 -0
- package/dist/checks/resilience/sentry/index.js +8 -0
- package/dist/checks/resilience/sentry/index.js.map +1 -0
- package/dist/checks/resilience/sentry/sentry-dsn-configured.d.ts +12 -0
- package/dist/checks/resilience/sentry/sentry-dsn-configured.d.ts.map +1 -0
- package/dist/checks/resilience/sentry/sentry-dsn-configured.js +55 -0
- package/dist/checks/resilience/sentry/sentry-dsn-configured.js.map +1 -0
- package/dist/checks/resilience/sentry/sentry-environment-set.d.ts +12 -0
- package/dist/checks/resilience/sentry/sentry-environment-set.d.ts.map +1 -0
- package/dist/checks/resilience/sentry/sentry-environment-set.js +51 -0
- package/dist/checks/resilience/sentry/sentry-environment-set.js.map +1 -0
- package/dist/checks/resilience/sentry/sentry-error-boundary.d.ts +12 -0
- package/dist/checks/resilience/sentry/sentry-error-boundary.d.ts.map +1 -0
- package/dist/checks/resilience/sentry/sentry-error-boundary.js +75 -0
- package/dist/checks/resilience/sentry/sentry-error-boundary.js.map +1 -0
- package/dist/checks/resilience/sentry/sentry-pii-scrubbing.d.ts +13 -0
- package/dist/checks/resilience/sentry/sentry-pii-scrubbing.d.ts.map +1 -0
- package/dist/checks/resilience/sentry/sentry-pii-scrubbing.js +125 -0
- package/dist/checks/resilience/sentry/sentry-pii-scrubbing.js.map +1 -0
- package/dist/checks/resilience/sentry/sentry-release-set.d.ts +12 -0
- package/dist/checks/resilience/sentry/sentry-release-set.d.ts.map +1 -0
- package/dist/checks/resilience/sentry/sentry-release-set.js +51 -0
- package/dist/checks/resilience/sentry/sentry-release-set.js.map +1 -0
- package/dist/checks/resilience/sentry/sentry-sample-rate.d.ts +12 -0
- package/dist/checks/resilience/sentry/sentry-sample-rate.d.ts.map +1 -0
- package/dist/checks/resilience/sentry/sentry-sample-rate.js +78 -0
- package/dist/checks/resilience/sentry/sentry-sample-rate.js.map +1 -0
- package/dist/checks/resilience/sentry/sentry-source-maps.d.ts +12 -0
- package/dist/checks/resilience/sentry/sentry-source-maps.d.ts.map +1 -0
- package/dist/checks/resilience/sentry/sentry-source-maps.js +83 -0
- package/dist/checks/resilience/sentry/sentry-source-maps.js.map +1 -0
- package/dist/checks/resilience/service-patterns.d.ts +18 -0
- package/dist/checks/resilience/service-patterns.d.ts.map +1 -0
- package/dist/checks/resilience/service-patterns.js +230 -0
- package/dist/checks/resilience/service-patterns.js.map +1 -0
- package/dist/checks/resilience/timer-lifecycle.d.ts +10 -0
- package/dist/checks/resilience/timer-lifecycle.d.ts.map +1 -0
- package/dist/checks/resilience/timer-lifecycle.js +78 -0
- package/dist/checks/resilience/timer-lifecycle.js.map +1 -0
- package/dist/checks/resilience/transaction-patterns.d.ts +21 -0
- package/dist/checks/resilience/transaction-patterns.d.ts.map +1 -0
- package/dist/checks/resilience/transaction-patterns.js +258 -0
- package/dist/checks/resilience/transaction-patterns.js.map +1 -0
- package/dist/checks/security/__tests__/no-hardcoded-secrets.test.d.ts +9 -0
- package/dist/checks/security/__tests__/no-hardcoded-secrets.test.d.ts.map +1 -0
- package/dist/checks/security/__tests__/no-hardcoded-secrets.test.js +37 -0
- package/dist/checks/security/__tests__/no-hardcoded-secrets.test.js.map +1 -0
- package/dist/checks/security/__tests__/package-supply-chain-policy.test.d.ts +2 -0
- package/dist/checks/security/__tests__/package-supply-chain-policy.test.d.ts.map +1 -0
- package/dist/checks/security/__tests__/package-supply-chain-policy.test.js +128 -0
- package/dist/checks/security/__tests__/package-supply-chain-policy.test.js.map +1 -0
- package/dist/checks/security/api-key-rotation.d.ts +10 -0
- package/dist/checks/security/api-key-rotation.d.ts.map +1 -0
- package/dist/checks/security/api-key-rotation.js +186 -0
- package/dist/checks/security/api-key-rotation.js.map +1 -0
- package/dist/checks/security/auth-middleware-coverage.d.ts +11 -0
- package/dist/checks/security/auth-middleware-coverage.d.ts.map +1 -0
- package/dist/checks/security/auth-middleware-coverage.js +210 -0
- package/dist/checks/security/auth-middleware-coverage.js.map +1 -0
- package/dist/checks/security/auth-route-guard.d.ts +12 -0
- package/dist/checks/security/auth-route-guard.d.ts.map +1 -0
- package/dist/checks/security/auth-route-guard.js +70 -0
- package/dist/checks/security/auth-route-guard.js.map +1 -0
- package/dist/checks/security/cors-configuration.d.ts +11 -0
- package/dist/checks/security/cors-configuration.d.ts.map +1 -0
- package/dist/checks/security/cors-configuration.js +126 -0
- package/dist/checks/security/cors-configuration.js.map +1 -0
- package/dist/checks/security/csp-headers.d.ts +11 -0
- package/dist/checks/security/csp-headers.d.ts.map +1 -0
- package/dist/checks/security/csp-headers.js +192 -0
- package/dist/checks/security/csp-headers.js.map +1 -0
- package/dist/checks/security/dependency-vulnerability-audit.d.ts +15 -0
- package/dist/checks/security/dependency-vulnerability-audit.d.ts.map +1 -0
- package/dist/checks/security/dependency-vulnerability-audit.js +184 -0
- package/dist/checks/security/dependency-vulnerability-audit.js.map +1 -0
- package/dist/checks/security/env-secret-exposure.d.ts +11 -0
- package/dist/checks/security/env-secret-exposure.d.ts.map +1 -0
- package/dist/checks/security/env-secret-exposure.js +127 -0
- package/dist/checks/security/env-secret-exposure.js.map +1 -0
- package/dist/checks/security/hasura-production-config.d.ts +11 -0
- package/dist/checks/security/hasura-production-config.d.ts.map +1 -0
- package/dist/checks/security/hasura-production-config.js +122 -0
- package/dist/checks/security/hasura-production-config.js.map +1 -0
- package/dist/checks/security/index.d.ts +17 -0
- package/dist/checks/security/index.d.ts.map +1 -0
- package/dist/checks/security/index.js +17 -0
- package/dist/checks/security/index.js.map +1 -0
- package/dist/checks/security/jwt-validation.d.ts +11 -0
- package/dist/checks/security/jwt-validation.d.ts.map +1 -0
- package/dist/checks/security/jwt-validation.js +294 -0
- package/dist/checks/security/jwt-validation.js.map +1 -0
- package/dist/checks/security/no-eval.d.ts +16 -0
- package/dist/checks/security/no-eval.d.ts.map +1 -0
- package/dist/checks/security/no-eval.js +83 -0
- package/dist/checks/security/no-eval.js.map +1 -0
- package/dist/checks/security/no-hardcoded-secrets.d.ts +28 -0
- package/dist/checks/security/no-hardcoded-secrets.d.ts.map +1 -0
- package/dist/checks/security/no-hardcoded-secrets.js +209 -0
- package/dist/checks/security/no-hardcoded-secrets.js.map +1 -0
- package/dist/checks/security/package-supply-chain-policy.d.ts +12 -0
- package/dist/checks/security/package-supply-chain-policy.d.ts.map +1 -0
- package/dist/checks/security/package-supply-chain-policy.js +534 -0
- package/dist/checks/security/package-supply-chain-policy.js.map +1 -0
- package/dist/checks/security/rate-limit-coverage.d.ts +10 -0
- package/dist/checks/security/rate-limit-coverage.d.ts.map +1 -0
- package/dist/checks/security/rate-limit-coverage.js +143 -0
- package/dist/checks/security/rate-limit-coverage.js.map +1 -0
- package/dist/checks/security/semgrep-scan.d.ts +13 -0
- package/dist/checks/security/semgrep-scan.d.ts.map +1 -0
- package/dist/checks/security/semgrep-scan.js +86 -0
- package/dist/checks/security/semgrep-scan.js.map +1 -0
- package/dist/checks/security/use-centralized-crypto.d.ts +11 -0
- package/dist/checks/security/use-centralized-crypto.d.ts.map +1 -0
- package/dist/checks/security/use-centralized-crypto.js +129 -0
- package/dist/checks/security/use-centralized-crypto.js.map +1 -0
- package/dist/checks/security/webhook-signature-verification.d.ts +10 -0
- package/dist/checks/security/webhook-signature-verification.d.ts.map +1 -0
- package/dist/checks/security/webhook-signature-verification.js +183 -0
- package/dist/checks/security/webhook-signature-verification.js.map +1 -0
- package/dist/checks/testing/index.d.ts +6 -0
- package/dist/checks/testing/index.d.ts.map +1 -0
- package/dist/checks/testing/index.js +6 -0
- package/dist/checks/testing/index.js.map +1 -0
- package/dist/checks/testing/no-skipped-tests.d.ts +40 -0
- package/dist/checks/testing/no-skipped-tests.d.ts.map +1 -0
- package/dist/checks/testing/no-skipped-tests.js +174 -0
- package/dist/checks/testing/no-skipped-tests.js.map +1 -0
- package/dist/checks/testing/no-stub-tests.d.ts +11 -0
- package/dist/checks/testing/no-stub-tests.d.ts.map +1 -0
- package/dist/checks/testing/no-stub-tests.js +103 -0
- package/dist/checks/testing/no-stub-tests.js.map +1 -0
- package/dist/checks/testing/test-convention-consistency.d.ts +14 -0
- package/dist/checks/testing/test-convention-consistency.d.ts.map +1 -0
- package/dist/checks/testing/test-convention-consistency.js +93 -0
- package/dist/checks/testing/test-convention-consistency.js.map +1 -0
- package/dist/checks/testing/test-file-naming.d.ts +13 -0
- package/dist/checks/testing/test-file-naming.d.ts.map +1 -0
- package/dist/checks/testing/test-file-naming.js +218 -0
- package/dist/checks/testing/test-file-naming.js.map +1 -0
- package/dist/checks/testing/test-file-pairing.d.ts +13 -0
- package/dist/checks/testing/test-file-pairing.d.ts.map +1 -0
- package/dist/checks/testing/test-file-pairing.js +274 -0
- package/dist/checks/testing/test-file-pairing.js.map +1 -0
- package/dist/display/architecture.d.ts +9 -0
- package/dist/display/architecture.d.ts.map +1 -0
- package/dist/display/architecture.js +29 -0
- package/dist/display/architecture.js.map +1 -0
- package/dist/display/index.d.ts +20 -0
- package/dist/display/index.d.ts.map +1 -0
- package/dist/display/index.js +30 -0
- package/dist/display/index.js.map +1 -0
- package/dist/display/quality.d.ts +7 -0
- package/dist/display/quality.d.ts.map +1 -0
- package/dist/display/quality.js +34 -0
- package/dist/display/quality.js.map +1 -0
- package/dist/display/resilience.d.ts +7 -0
- package/dist/display/resilience.d.ts.map +1 -0
- package/dist/display/resilience.js +36 -0
- package/dist/display/resilience.js.map +1 -0
- package/dist/display/security-testing.d.ts +9 -0
- package/dist/display/security-testing.d.ts.map +1 -0
- package/dist/display/security-testing.js +31 -0
- package/dist/display/security-testing.js.map +1 -0
- package/dist/display/types.d.ts +6 -0
- package/dist/display/types.d.ts.map +1 -0
- package/dist/display/types.js +6 -0
- package/dist/display/types.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
// @fitness-ignore-file recovery-patterns -- Check definition contains custom timeout pattern strings it detects
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview Enforce use of canonical recovery patterns
|
|
4
|
+
*/
|
|
5
|
+
import { logger } from '@opensip-cli/core';
|
|
6
|
+
import { defineCheck, isCommentLine } from '@opensip-cli/fitness';
|
|
7
|
+
// Recovery patterns
|
|
8
|
+
const RECOVERY_PATTERNS = [
|
|
9
|
+
{
|
|
10
|
+
id: 'manual-retry-loop',
|
|
11
|
+
// Pattern: for (let retry... or for (let numRetry...
|
|
12
|
+
regex: /for\s{0,10}\(\s{0,10}let\s{1,10}\w{0,30}[Rr]etry/g,
|
|
13
|
+
message: 'Manual retry loop detected',
|
|
14
|
+
suggestion: 'Use a shared recovery/retry utility with standardized backoff and jitter instead of manual retry loops',
|
|
15
|
+
severity: 'error',
|
|
16
|
+
skipInComments: true,
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
id: 'manual-retry-while',
|
|
20
|
+
// Pattern: while (x < retries) or while (x < maxRetries)
|
|
21
|
+
regex: /while\s{0,10}\(\s{0,10}\w{1,30}\s{0,10}<\s{0,10}(?:max)?[Rr]etries?\s{0,10}\)/g,
|
|
22
|
+
message: 'Manual retry while-loop detected',
|
|
23
|
+
suggestion: 'Use a shared recovery/retry utility with standardized backoff and jitter instead of manual retry loops',
|
|
24
|
+
severity: 'error',
|
|
25
|
+
skipInComments: true,
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
id: 'custom-circuit-breaker',
|
|
29
|
+
// Pattern: circuitState = or isOpen: or consecutiveFailures =
|
|
30
|
+
regex: /(?:circuitState|isOpen|consecutiveFailures)\s{0,10}[=:]/g,
|
|
31
|
+
message: 'Custom circuit breaker state detected',
|
|
32
|
+
suggestion: 'Use a shared recovery/retry utility with circuit breaker support instead of custom circuit breaker state',
|
|
33
|
+
severity: 'error',
|
|
34
|
+
skipInComments: true,
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
id: 'custom-timeout',
|
|
38
|
+
// Pattern: new Promise((resolve, reject) => { ... setTimeout ... reject
|
|
39
|
+
regex: /new\s{1,10}Promise\s{0,10}\(\s{0,10}\(resolve,\s{0,10}reject\)\s{0,10}=>\s{0,10}\{[\s\S]{0,500}?setTimeout[\s\S]{0,500}?reject/g,
|
|
40
|
+
message: 'Custom timeout wrapper detected',
|
|
41
|
+
suggestion: 'Use a shared timeout utility instead of custom Promise-based timeout wrappers',
|
|
42
|
+
severity: 'warning',
|
|
43
|
+
skipInComments: true,
|
|
44
|
+
multiline: true,
|
|
45
|
+
},
|
|
46
|
+
];
|
|
47
|
+
// Cache patterns
|
|
48
|
+
const CACHE_PATTERNS = [
|
|
49
|
+
{
|
|
50
|
+
id: 'custom-cache-map',
|
|
51
|
+
// Pattern: private cache = new Map or private readonly myCache: new Map
|
|
52
|
+
regex: /private\s{1,10}(?:readonly\s{1,10})?\w{0,30}[Cc]ache\s{0,10}[=:]\s{0,10}new\s{1,10}Map/g,
|
|
53
|
+
message: 'Custom Map-based cache detected',
|
|
54
|
+
suggestion: 'Use a shared cache abstraction with TTL management and eviction policies instead of custom Map-based caches',
|
|
55
|
+
severity: 'warning',
|
|
56
|
+
skipInComments: true,
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
id: 'custom-cache-object',
|
|
60
|
+
// Pattern: private cache = {} or private readonly myCache: {}
|
|
61
|
+
regex: /private\s{1,10}(?:readonly\s{1,10})?\w{0,30}[Cc]ache\s{0,10}[=:]\s{0,10}\{\s{0,10}\}/g,
|
|
62
|
+
message: 'Custom object-based cache detected',
|
|
63
|
+
suggestion: 'Use a shared cache abstraction with TTL management and eviction policies instead of custom object-based caches',
|
|
64
|
+
severity: 'warning',
|
|
65
|
+
skipInComments: true,
|
|
66
|
+
},
|
|
67
|
+
];
|
|
68
|
+
// Rate limiter patterns
|
|
69
|
+
const RATE_LIMITER_PATTERNS = [
|
|
70
|
+
{
|
|
71
|
+
id: 'custom-rate-limiter',
|
|
72
|
+
regex: /(?:requestCount|rateLimitWindow|tokensRemaining)\s{0,10}[=:]/g,
|
|
73
|
+
message: 'Custom rate limiting detected',
|
|
74
|
+
suggestion: 'Use a shared rate limiter instead of custom rate limiting implementations',
|
|
75
|
+
severity: 'warning',
|
|
76
|
+
skipInComments: true,
|
|
77
|
+
},
|
|
78
|
+
];
|
|
79
|
+
// =============================================================================
|
|
80
|
+
// HELPER FUNCTIONS
|
|
81
|
+
// =============================================================================
|
|
82
|
+
/** Check if file path matches exclusion pattern */
|
|
83
|
+
function matchesExclusionPattern(filePath, patterns) {
|
|
84
|
+
logger.debug({
|
|
85
|
+
evt: 'fitness.checks.recovery_patterns.matches_exclusion_pattern',
|
|
86
|
+
msg: 'Checking if file path matches exclusion pattern',
|
|
87
|
+
});
|
|
88
|
+
for (const pattern of patterns) {
|
|
89
|
+
// Convert glob pattern to simple substring match for common cases
|
|
90
|
+
const normalizedPattern = pattern.replaceAll('**', '').replaceAll('*', '');
|
|
91
|
+
if (normalizedPattern && filePath.includes(normalizedPattern)) {
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
function createViolation(pattern, lineNumber, matchText) {
|
|
98
|
+
logger.debug({
|
|
99
|
+
evt: 'fitness.checks.recovery_patterns.create_violation',
|
|
100
|
+
msg: 'Creating violation record for detected pattern',
|
|
101
|
+
});
|
|
102
|
+
return {
|
|
103
|
+
line: lineNumber,
|
|
104
|
+
message: pattern.message,
|
|
105
|
+
severity: pattern.severity,
|
|
106
|
+
suggestion: pattern.suggestion,
|
|
107
|
+
match: matchText,
|
|
108
|
+
type: pattern.id,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
function detectMultilinePattern(content, pattern) {
|
|
112
|
+
logger.debug({
|
|
113
|
+
evt: 'fitness.checks.recovery_patterns.detect_multiline_pattern',
|
|
114
|
+
msg: 'Detecting multiline pattern violations',
|
|
115
|
+
});
|
|
116
|
+
const violations = [];
|
|
117
|
+
pattern.regex.lastIndex = 0;
|
|
118
|
+
let match;
|
|
119
|
+
while ((match = pattern.regex.exec(content)) !== null) {
|
|
120
|
+
const lineNumber = content.slice(0, match.index).split('\n').length;
|
|
121
|
+
violations.push(createViolation(pattern, lineNumber, match[0].slice(0, 100)));
|
|
122
|
+
}
|
|
123
|
+
return violations;
|
|
124
|
+
}
|
|
125
|
+
function detectSingleLinePattern(lines, pattern) {
|
|
126
|
+
logger.debug({
|
|
127
|
+
evt: 'fitness.checks.recovery_patterns.detect_single_line_pattern',
|
|
128
|
+
msg: 'Detecting single line pattern violations',
|
|
129
|
+
});
|
|
130
|
+
const violations = [];
|
|
131
|
+
for (const [i, line] of lines.entries()) {
|
|
132
|
+
/* v8 ignore next -- defensive: lines.entries() never yields undefined */
|
|
133
|
+
if (line === undefined)
|
|
134
|
+
continue;
|
|
135
|
+
if (pattern.skipInComments && isCommentLine(line))
|
|
136
|
+
continue;
|
|
137
|
+
if (pattern.regex.global) {
|
|
138
|
+
pattern.regex.lastIndex = 0;
|
|
139
|
+
}
|
|
140
|
+
const match = pattern.regex.exec(line);
|
|
141
|
+
if (match) {
|
|
142
|
+
violations.push(createViolation(pattern, i + 1, match[0]));
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return violations;
|
|
146
|
+
}
|
|
147
|
+
function detectPatternViolations(content, lines, pattern) {
|
|
148
|
+
logger.debug({
|
|
149
|
+
evt: 'fitness.checks.recovery_patterns.detect_pattern_violations',
|
|
150
|
+
msg: 'Detecting pattern violations for content',
|
|
151
|
+
});
|
|
152
|
+
if (pattern.regex.global) {
|
|
153
|
+
pattern.regex.lastIndex = 0;
|
|
154
|
+
}
|
|
155
|
+
if (pattern.multiline) {
|
|
156
|
+
return detectMultilinePattern(content, pattern);
|
|
157
|
+
}
|
|
158
|
+
return detectSingleLinePattern(lines, pattern);
|
|
159
|
+
}
|
|
160
|
+
function detectPatterns(content, filePath, patterns, excludePaths) {
|
|
161
|
+
logger.debug({
|
|
162
|
+
evt: 'fitness.checks.recovery_patterns.detect_patterns',
|
|
163
|
+
msg: 'Running pattern detection on file content',
|
|
164
|
+
});
|
|
165
|
+
if (matchesExclusionPattern(filePath, excludePaths)) {
|
|
166
|
+
return [];
|
|
167
|
+
}
|
|
168
|
+
const lines = content.split('\n');
|
|
169
|
+
const violations = [];
|
|
170
|
+
for (const pattern of patterns) {
|
|
171
|
+
const patternViolations = detectPatternViolations(content, lines, pattern);
|
|
172
|
+
for (const violation of patternViolations) {
|
|
173
|
+
violations.push(violation);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return violations;
|
|
177
|
+
}
|
|
178
|
+
// =============================================================================
|
|
179
|
+
// CHECK DEFINITIONS
|
|
180
|
+
// =============================================================================
|
|
181
|
+
/**
|
|
182
|
+
* Check: resilience/recovery-patterns
|
|
183
|
+
*
|
|
184
|
+
* Ensures code uses a shared recovery/retry utility
|
|
185
|
+
* instead of custom retry loops, circuit breakers, or timeout wrappers.
|
|
186
|
+
*/
|
|
187
|
+
export const recoveryPatterns = defineCheck({
|
|
188
|
+
id: '64f07f7e-baed-4946-83be-2b8102a9f98b',
|
|
189
|
+
slug: 'recovery-patterns',
|
|
190
|
+
disabled: true,
|
|
191
|
+
scope: { languages: ['typescript'], concerns: ['backend', 'server'] },
|
|
192
|
+
contentFilter: 'strip-strings',
|
|
193
|
+
confidence: 'medium',
|
|
194
|
+
description: 'Enforce use of shared recovery/retry utilities instead of hand-rolled retry loops',
|
|
195
|
+
longDescription: `**Purpose:** Prevents hand-rolled retry loops, circuit breakers, and timeout wrappers in favor of the canonical recovery module.
|
|
196
|
+
|
|
197
|
+
**Detects:**
|
|
198
|
+
- Manual retry for-loops: \`for (let *retry\` or \`for (let *Retry\`
|
|
199
|
+
- Manual retry while-loops: \`while (x < retries)\` or \`while (x < maxRetries)\`
|
|
200
|
+
- Custom circuit breaker state: \`circuitState =\`, \`isOpen:\`, \`consecutiveFailures =\`
|
|
201
|
+
- Custom timeout wrappers: \`new Promise((resolve, reject) => { ... setTimeout ... reject\` (multiline)
|
|
202
|
+
- Skips comment lines when \`skipInComments\` is set
|
|
203
|
+
|
|
204
|
+
**Why it matters:** Custom recovery logic duplicates proven patterns and lacks standardized backoff, jitter, and observability.
|
|
205
|
+
|
|
206
|
+
**Scope:** Codebase-specific convention. Analyzes each file individually via regex.`,
|
|
207
|
+
tags: ['resilience', 'recovery', 'canonical'],
|
|
208
|
+
fileTypes: ['ts'],
|
|
209
|
+
analyze(content, filePath) {
|
|
210
|
+
return detectPatterns(content, filePath, RECOVERY_PATTERNS, [
|
|
211
|
+
'foundation/src/recovery',
|
|
212
|
+
'__tests__',
|
|
213
|
+
]);
|
|
214
|
+
},
|
|
215
|
+
});
|
|
216
|
+
/**
|
|
217
|
+
* Check: resilience/no-custom-cache
|
|
218
|
+
*
|
|
219
|
+
* Ensures code uses a shared cache abstraction
|
|
220
|
+
* instead of custom Map-based caches.
|
|
221
|
+
*/
|
|
222
|
+
export const noCustomCache = defineCheck({
|
|
223
|
+
id: '4c389ae7-ea92-42ff-bcec-0eb9d5d69e3e',
|
|
224
|
+
slug: 'no-custom-cache',
|
|
225
|
+
disabled: true,
|
|
226
|
+
description: 'Enforce use of a shared cache abstraction instead of custom Map-based caches',
|
|
227
|
+
longDescription: `**Purpose:** Prevents custom Map- or object-based caches in favor of the canonical CacheClient from infrastructure.
|
|
228
|
+
|
|
229
|
+
**Detects:**
|
|
230
|
+
- \`private [readonly] *cache = new Map\` pattern (Map-based cache)
|
|
231
|
+
- \`private [readonly] *cache = {}\` pattern (object-based cache)
|
|
232
|
+
- Skips comment lines
|
|
233
|
+
|
|
234
|
+
**Why it matters:** Custom caches lack TTL management, eviction policies, distributed invalidation, and observability that the canonical CacheClient provides.
|
|
235
|
+
|
|
236
|
+
**Scope:** Codebase-specific convention. Analyzes each file individually via regex.`,
|
|
237
|
+
tags: ['resilience', 'canonical', 'cache'],
|
|
238
|
+
analyze(content, filePath) {
|
|
239
|
+
return detectPatterns(content, filePath, CACHE_PATTERNS, [
|
|
240
|
+
'infrastructure/src/cache',
|
|
241
|
+
'__tests__',
|
|
242
|
+
]);
|
|
243
|
+
},
|
|
244
|
+
});
|
|
245
|
+
/**
|
|
246
|
+
* Check: resilience/no-custom-rate-limiter
|
|
247
|
+
*
|
|
248
|
+
* Ensures code uses a shared rate limiter
|
|
249
|
+
* instead of custom rate limiting implementations.
|
|
250
|
+
*/
|
|
251
|
+
export const noCustomRateLimiter = defineCheck({
|
|
252
|
+
id: '330407bb-d139-48f3-b51e-61516eb93929',
|
|
253
|
+
slug: 'no-custom-rate-limiter',
|
|
254
|
+
disabled: true,
|
|
255
|
+
description: 'Enforce use of a shared rate limiter instead of custom rate limiting implementations',
|
|
256
|
+
longDescription: `**Purpose:** Prevents custom rate limiting implementations in favor of the canonical RateLimiter from infrastructure.
|
|
257
|
+
|
|
258
|
+
**Detects:**
|
|
259
|
+
- Custom rate limiter state variables: \`requestCount =\`, \`rateLimitWindow =\`, \`tokensRemaining =\`
|
|
260
|
+
- Skips comment lines
|
|
261
|
+
|
|
262
|
+
**Why it matters:** Custom rate limiters lack distributed coordination, sliding window accuracy, and configuration consistency that the canonical module provides.
|
|
263
|
+
|
|
264
|
+
**Scope:** Codebase-specific convention. Analyzes each file individually via regex.`,
|
|
265
|
+
tags: ['resilience', 'canonical', 'rate-limiting'],
|
|
266
|
+
analyze(content, filePath) {
|
|
267
|
+
return detectPatterns(content, filePath, RATE_LIMITER_PATTERNS, [
|
|
268
|
+
'infrastructure/src/rate-limiting',
|
|
269
|
+
'__tests__',
|
|
270
|
+
]);
|
|
271
|
+
},
|
|
272
|
+
});
|
|
273
|
+
//# sourceMappingURL=recovery-patterns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery-patterns.js","sourceRoot":"","sources":["../../../src/checks/resilience/recovery-patterns.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Detects boolean flag reentrancy guards that should use counters or mutexes
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Check: resilience/reentrancy-guard
|
|
6
|
+
*
|
|
7
|
+
* Detects module-scoped boolean flags used as reentrancy guards
|
|
8
|
+
* (e.g., `let serverRunning = false` with `if (serverRunning) return`).
|
|
9
|
+
* These are not re-entrant and can corrupt state with concurrent calls.
|
|
10
|
+
*/
|
|
11
|
+
export declare const reentrancyGuard: import("@opensip-cli/fitness").Check;
|
|
12
|
+
//# sourceMappingURL=reentrancy-guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reentrancy-guard.d.ts","sourceRoot":"","sources":["../../../src/checks/resilience/reentrancy-guard.ts"],"names":[],"mappings":"AAEA;;GAEG;AAmBH;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,sCAuE1B,CAAC"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
// @fitness-ignore-file project-readme-existence -- internal module, not a package root
|
|
2
|
+
// @fitness-ignore-file fitness-check-coverage -- check implementation with framework-managed coverage
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview Detects boolean flag reentrancy guards that should use counters or mutexes
|
|
5
|
+
*/
|
|
6
|
+
import { defineCheck, getLineNumber } from '@opensip-cli/fitness';
|
|
7
|
+
/**
|
|
8
|
+
* Pattern for detecting module-scoped boolean state flags used as reentrancy guards.
|
|
9
|
+
* Matches: let serverRunning = false, let isRunning = false, etc.
|
|
10
|
+
*/
|
|
11
|
+
const BOOLEAN_FLAG_PATTERN = /^(?:let|var)\s+(\w+(?:Running|Started|Active|Initialized|Locked))\s*(?::\s*boolean\s*)?=\s*false/gm;
|
|
12
|
+
/**
|
|
13
|
+
* Pattern for early return based on the flag (reentrancy guard)
|
|
14
|
+
*/
|
|
15
|
+
function createFlagCheckPattern(flagName) {
|
|
16
|
+
// @fitness-ignore-next-line semgrep-scan -- non-literal RegExp is intentional; flagName is extracted from regex match on source code identifiers (\w+), not user input
|
|
17
|
+
return new RegExp(String.raw `if\s*\(\s*${flagName}\s*\)\s*(?:return|\{)`);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Check: resilience/reentrancy-guard
|
|
21
|
+
*
|
|
22
|
+
* Detects module-scoped boolean flags used as reentrancy guards
|
|
23
|
+
* (e.g., `let serverRunning = false` with `if (serverRunning) return`).
|
|
24
|
+
* These are not re-entrant and can corrupt state with concurrent calls.
|
|
25
|
+
*/
|
|
26
|
+
export const reentrancyGuard = defineCheck({
|
|
27
|
+
id: 'd7f35c3b-af42-435f-b953-ee167060fecb',
|
|
28
|
+
slug: 'reentrancy-guard',
|
|
29
|
+
scope: { languages: ['typescript'], concerns: ['backend', 'frontend', 'cli'] },
|
|
30
|
+
contentFilter: 'strip-strings',
|
|
31
|
+
confidence: 'medium',
|
|
32
|
+
description: 'Detect boolean reentrancy guards that need counter/mutex semantics',
|
|
33
|
+
longDescription: `**Purpose:** Detects module-scoped boolean flags used as reentrancy guards that can fail under concurrent or nested calls.
|
|
34
|
+
|
|
35
|
+
**Detects:**
|
|
36
|
+
- Module-scoped \`let\` boolean variables with names like \`*Running\`, \`*Started\`, \`*Active\`, \`*Initialized\`, \`*Locked\` initialized to \`false\`
|
|
37
|
+
- Paired with an \`if (flag) return\` guard pattern indicating reentrancy protection
|
|
38
|
+
- These boolean guards are not re-entrant: nested calls will see the flag as \`true\` and silently skip, and concurrent calls can interleave flag reads/writes
|
|
39
|
+
|
|
40
|
+
**Why it matters:** Boolean flags for reentrancy create race conditions where concurrent callers skip initialization or corrupt shared state. A reference counter or mutex provides correct semantics.
|
|
41
|
+
|
|
42
|
+
**Scope:** General best practice. Analyzes each file individually via regex.`,
|
|
43
|
+
tags: ['resilience', 'concurrency', 'reentrancy'],
|
|
44
|
+
fileTypes: ['ts'],
|
|
45
|
+
analyze(content, filePath) {
|
|
46
|
+
const violations = [];
|
|
47
|
+
// Skip test files
|
|
48
|
+
if (filePath.includes('.test.') ||
|
|
49
|
+
filePath.includes('.spec.') ||
|
|
50
|
+
filePath.includes('__tests__')) {
|
|
51
|
+
return violations;
|
|
52
|
+
}
|
|
53
|
+
// Quick check
|
|
54
|
+
if (!content.includes('Running') &&
|
|
55
|
+
!content.includes('Started') &&
|
|
56
|
+
!content.includes('Active') &&
|
|
57
|
+
!content.includes('Initialized') &&
|
|
58
|
+
!content.includes('Locked')) {
|
|
59
|
+
return violations;
|
|
60
|
+
}
|
|
61
|
+
BOOLEAN_FLAG_PATTERN.lastIndex = 0;
|
|
62
|
+
let match;
|
|
63
|
+
while ((match = BOOLEAN_FLAG_PATTERN.exec(content)) !== null) {
|
|
64
|
+
const flagName = match[1];
|
|
65
|
+
if (!flagName)
|
|
66
|
+
continue;
|
|
67
|
+
// Check if there's a corresponding guard pattern
|
|
68
|
+
const guardPattern = createFlagCheckPattern(flagName);
|
|
69
|
+
if (!guardPattern.test(content))
|
|
70
|
+
continue;
|
|
71
|
+
const lineNumber = getLineNumber(content, match.index);
|
|
72
|
+
violations.push({
|
|
73
|
+
line: lineNumber,
|
|
74
|
+
column: 0,
|
|
75
|
+
message: `Boolean reentrancy guard '${flagName}' is not safe for concurrent or nested calls`,
|
|
76
|
+
severity: 'warning',
|
|
77
|
+
suggestion: 'Replace the boolean flag with a reference counter (increment on enter, decrement on exit) or use a mutex/semaphore for proper reentrancy protection.',
|
|
78
|
+
match: match[0],
|
|
79
|
+
type: 'boolean-reentrancy-guard',
|
|
80
|
+
filePath,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
return violations;
|
|
84
|
+
},
|
|
85
|
+
});
|
|
86
|
+
//# sourceMappingURL=reentrancy-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reentrancy-guard.js","sourceRoot":"","sources":["../../../src/checks/resilience/reentrancy-guard.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,sGAAsG;AACtG;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAuB,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAEvF;;;GAGG;AACH,MAAM,oBAAoB,GACxB,oGAAoG,CAAC;AAEvG;;GAEG;AACH,SAAS,sBAAsB,CAAC,QAAgB;IAC9C,uKAAuK;IACvK,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAA,aAAa,QAAQ,uBAAuB,CAAC,CAAC;AAC5E,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,WAAW,CAAC;IACzC,EAAE,EAAE,sCAAsC;IAC1C,IAAI,EAAE,kBAAkB;IACxB,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,QAAQ;IACpB,WAAW,EAAE,oEAAoE;IACjF,eAAe,EAAE;;;;;;;;;6EAS0D;IAC3E,IAAI,EAAE,CAAC,YAAY,EAAE,aAAa,EAAE,YAAY,CAAC;IACjD,SAAS,EAAE,CAAC,IAAI,CAAC;IAEjB,OAAO,CAAC,OAAe,EAAE,QAAgB;QACvC,MAAM,UAAU,GAAqB,EAAE,CAAC;QAExC,kBAAkB;QAClB,IACE,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC3B,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC3B,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,EAC9B,CAAC;YACD,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,cAAc;QACd,IACE,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;YAC5B,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;YAC5B,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC3B,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC;YAChC,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAC3B,CAAC;YACD,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,oBAAoB,CAAC,SAAS,GAAG,CAAC,CAAC;QACnC,IAAI,KAAK,CAAC;QACV,OAAO,CAAC,KAAK,GAAG,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC7D,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,CAAC,QAAQ;gBAAE,SAAS;YAExB,iDAAiD;YACjD,MAAM,YAAY,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC;YACtD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC;gBAAE,SAAS;YAE1C,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YAEvD,UAAU,CAAC,IAAI,CAAC;gBACd,IAAI,EAAE,UAAU;gBAChB,MAAM,EAAE,CAAC;gBACT,OAAO,EAAE,6BAA6B,QAAQ,8CAA8C;gBAC5F,QAAQ,EAAE,SAAS;gBACnB,UAAU,EACR,sJAAsJ;gBACxJ,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;gBACf,IAAI,EAAE,0BAA0B;gBAChC,QAAQ;aACT,CAAC,CAAC;QACL,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Retry configuration validation check
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Check: resilience/retry-config-validation
|
|
6
|
+
*
|
|
7
|
+
* Validates retry configuration values to prevent:
|
|
8
|
+
* - Too many retries (resource exhaustion)
|
|
9
|
+
* - Too few retries (no fault tolerance)
|
|
10
|
+
* - Excessive backoff delays
|
|
11
|
+
*/
|
|
12
|
+
export declare const retryConfigValidation: import("@opensip-cli/fitness").Check;
|
|
13
|
+
//# sourceMappingURL=retry-config-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-config-validation.d.ts","sourceRoot":"","sources":["../../../src/checks/resilience/retry-config-validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AA6IH;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,sCA+DhC,CAAC"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Retry configuration validation check
|
|
3
|
+
*/
|
|
4
|
+
import { logger } from '@opensip-cli/core';
|
|
5
|
+
import { defineCheck } from '@opensip-cli/fitness';
|
|
6
|
+
import { stripStringLiterals, stripStringsAndComments } from '@opensip-cli/fitness';
|
|
7
|
+
import { isDigit } from './_helpers/config-validation.js';
|
|
8
|
+
// =============================================================================
|
|
9
|
+
// CONFIG PARSING
|
|
10
|
+
// =============================================================================
|
|
11
|
+
/**
|
|
12
|
+
* Parse a config value from a line using string matching.
|
|
13
|
+
*/
|
|
14
|
+
function parseConfigValueFromLine(line, configKey) {
|
|
15
|
+
logger.debug({
|
|
16
|
+
evt: 'fitness.checks.retry_config_validation.parse_config_value_from_line',
|
|
17
|
+
msg: 'Parsing config value from line',
|
|
18
|
+
});
|
|
19
|
+
const lowerLine = line.toLowerCase();
|
|
20
|
+
const lowerKey = configKey.toLowerCase();
|
|
21
|
+
const idx = lowerLine.indexOf(lowerKey);
|
|
22
|
+
if (idx === -1)
|
|
23
|
+
return null;
|
|
24
|
+
const afterKey = line.slice(Math.max(0, idx + configKey.length));
|
|
25
|
+
let i = 0;
|
|
26
|
+
// Skip whitespace
|
|
27
|
+
while (i < afterKey.length && (afterKey[i] === ' ' || afterKey[i] === '\t')) {
|
|
28
|
+
i++;
|
|
29
|
+
}
|
|
30
|
+
// Check for = or :
|
|
31
|
+
if (afterKey[i] !== '=' && afterKey[i] !== ':') {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
i++;
|
|
35
|
+
// Skip whitespace
|
|
36
|
+
while (i < afterKey.length && (afterKey[i] === ' ' || afterKey[i] === '\t')) {
|
|
37
|
+
i++;
|
|
38
|
+
}
|
|
39
|
+
// Parse digits
|
|
40
|
+
const digitStart = i;
|
|
41
|
+
while (i < afterKey.length && isDigit(afterKey[i])) {
|
|
42
|
+
i++;
|
|
43
|
+
}
|
|
44
|
+
if (digitStart === i) {
|
|
45
|
+
return null; // No digits found
|
|
46
|
+
}
|
|
47
|
+
// @fitness-ignore-next-line numeric-validation -- substring is guaranteed digit-only by isDigit loop above
|
|
48
|
+
const value = Number.parseInt(afterKey.slice(digitStart, i), 10);
|
|
49
|
+
return {
|
|
50
|
+
value,
|
|
51
|
+
matchText: `${configKey}${afterKey.slice(0, Math.max(0, i))}`,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
function checkMaxRetriesValue(value) {
|
|
55
|
+
logger.debug({
|
|
56
|
+
evt: 'fitness.checks.retry_config_validation.check_max_retries_value',
|
|
57
|
+
msg: 'Checking maxRetries value for excessive count',
|
|
58
|
+
});
|
|
59
|
+
if (value <= 10)
|
|
60
|
+
return null;
|
|
61
|
+
return {
|
|
62
|
+
message: `maxRetries of ${value} is excessive`,
|
|
63
|
+
severity: 'warning',
|
|
64
|
+
suggestion: 'Consider reducing maxRetries to 3-5 with exponential backoff. Use a shared retry utility for proper retry handling.',
|
|
65
|
+
type: 'excessive-retries',
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
function checkBaseDelayValue(value) {
|
|
69
|
+
logger.debug({
|
|
70
|
+
evt: 'fitness.checks.retry_config_validation.check_base_delay_value',
|
|
71
|
+
msg: 'Checking baseDelay value for aggressive timing',
|
|
72
|
+
});
|
|
73
|
+
if (value >= 100)
|
|
74
|
+
return null;
|
|
75
|
+
return {
|
|
76
|
+
message: `baseDelay of ${value}ms may be too aggressive`,
|
|
77
|
+
severity: 'warning',
|
|
78
|
+
suggestion: 'Consider a baseDelay of at least 100ms to avoid overwhelming downstream services. Use exponential backoff for better resilience.',
|
|
79
|
+
type: 'aggressive-retry-delay',
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
// =============================================================================
|
|
83
|
+
// LINE CHECKING
|
|
84
|
+
// =============================================================================
|
|
85
|
+
function checkConfigOnLine(strippedLine, configKey, checker, lineNumber, filePath) {
|
|
86
|
+
const result = parseConfigValueFromLine(strippedLine, configKey);
|
|
87
|
+
if (!result)
|
|
88
|
+
return null;
|
|
89
|
+
const violation = checker(result.value);
|
|
90
|
+
if (!violation)
|
|
91
|
+
return null;
|
|
92
|
+
return {
|
|
93
|
+
line: lineNumber,
|
|
94
|
+
column: 0,
|
|
95
|
+
message: violation.message,
|
|
96
|
+
severity: violation.severity,
|
|
97
|
+
suggestion: violation.suggestion,
|
|
98
|
+
match: result.matchText,
|
|
99
|
+
type: violation.type,
|
|
100
|
+
filePath,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
// =============================================================================
|
|
104
|
+
// CHECK DEFINITION
|
|
105
|
+
// =============================================================================
|
|
106
|
+
/**
|
|
107
|
+
* Check: resilience/retry-config-validation
|
|
108
|
+
*
|
|
109
|
+
* Validates retry configuration values to prevent:
|
|
110
|
+
* - Too many retries (resource exhaustion)
|
|
111
|
+
* - Too few retries (no fault tolerance)
|
|
112
|
+
* - Excessive backoff delays
|
|
113
|
+
*/
|
|
114
|
+
export const retryConfigValidation = defineCheck({
|
|
115
|
+
id: '174659f8-56b5-4e8d-a495-3c3188fddaf8',
|
|
116
|
+
slug: 'retry-config-validation',
|
|
117
|
+
scope: { languages: ['typescript'], concerns: ['backend', 'server'] },
|
|
118
|
+
contentFilter: 'strip-strings',
|
|
119
|
+
confidence: 'medium',
|
|
120
|
+
description: 'Validate retry configs: flag excessive maxRetries (>10) and aggressive baseDelay (<100ms)',
|
|
121
|
+
longDescription: `**Purpose:** Validates retry configuration values to prevent resource exhaustion from too many retries or aggressive retry timing.
|
|
122
|
+
|
|
123
|
+
**Detects:**
|
|
124
|
+
- \`maxRetries = N\` or \`maxRetries: N\` where N > 10 (excessive retries)
|
|
125
|
+
- \`baseDelay = N\` or \`baseDelay: N\` where N < 100ms (too aggressive)
|
|
126
|
+
- Only scans files containing \`retry\` or \`attempt\` keywords
|
|
127
|
+
|
|
128
|
+
**Why it matters:** Excessive retries can amplify failures into cascading outages; aggressive retry delays overwhelm already-struggling downstream services.
|
|
129
|
+
|
|
130
|
+
**Scope:** General best practice. Analyzes each file individually via string parsing.`,
|
|
131
|
+
tags: ['resilience', 'retry', 'config'],
|
|
132
|
+
fileTypes: ['ts'],
|
|
133
|
+
analyze(content, filePath) {
|
|
134
|
+
const violations = [];
|
|
135
|
+
const strippedContent = stripStringsAndComments(content).toLowerCase();
|
|
136
|
+
if (!strippedContent.includes('retry') && !strippedContent.includes('attempt')) {
|
|
137
|
+
return violations;
|
|
138
|
+
}
|
|
139
|
+
const lines = content.split('\n');
|
|
140
|
+
for (const [i, line] of lines.entries()) {
|
|
141
|
+
if (!line)
|
|
142
|
+
continue;
|
|
143
|
+
const strippedLine = stripStringLiterals(line);
|
|
144
|
+
const trimmed = strippedLine.trim();
|
|
145
|
+
if (trimmed.startsWith('//') || trimmed.startsWith('*')) {
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
const lineNumber = i + 1;
|
|
149
|
+
const maxRetriesViolation = checkConfigOnLine(strippedLine, 'maxRetries', checkMaxRetriesValue, lineNumber, filePath);
|
|
150
|
+
if (maxRetriesViolation)
|
|
151
|
+
violations.push(maxRetriesViolation);
|
|
152
|
+
const baseDelayViolation = checkConfigOnLine(strippedLine, 'baseDelay', checkBaseDelayValue, lineNumber, filePath);
|
|
153
|
+
if (baseDelayViolation)
|
|
154
|
+
violations.push(baseDelayViolation);
|
|
155
|
+
}
|
|
156
|
+
return violations;
|
|
157
|
+
},
|
|
158
|
+
});
|
|
159
|
+
//# sourceMappingURL=retry-config-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-config-validation.js","sourceRoot":"","sources":["../../../src/checks/resilience/retry-config-validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Shared helpers for Sentry fitness checks
|
|
3
|
+
* @module checks-builtin/checks/resilience/sentry/_helpers/sentry
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Quick bail-out: returns true if the file references Sentry at all.
|
|
7
|
+
* All Sentry checks should call this first to avoid unnecessary work.
|
|
8
|
+
*/
|
|
9
|
+
export declare function hasSentryUsage(content: string): boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Returns true if the file contains a `Sentry.init(` call.
|
|
12
|
+
* Used by checks that validate init configuration.
|
|
13
|
+
*/
|
|
14
|
+
export declare function hasSentryInit(content: string): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Extracts the Sentry.init() call block from file content.
|
|
17
|
+
* Returns the line range (start/end indices) and the content of the init block.
|
|
18
|
+
* Handles multi-line init calls by tracking brace depth.
|
|
19
|
+
*/
|
|
20
|
+
export declare function extractSentryInitBlock(content: string): {
|
|
21
|
+
startLine: number;
|
|
22
|
+
endLine: number;
|
|
23
|
+
block: string;
|
|
24
|
+
} | null;
|
|
25
|
+
//# sourceMappingURL=sentry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sentry.d.ts","sourceRoot":"","sources":["../../../../../src/checks/resilience/sentry/_helpers/sentry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED;;;;GAIG;AAEH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,GACd;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAgD9D"}
|