@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,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Pino Serializer Coverage Check
|
|
3
|
+
*
|
|
4
|
+
* Validates that complex objects logged with Pino have serializers:
|
|
5
|
+
* - Objects without registered serializers break structured logging
|
|
6
|
+
* - Circular references cause logging failures
|
|
7
|
+
* - Large objects need truncation
|
|
8
|
+
*/
|
|
9
|
+
import { defineCheck } from '@opensip-cli/fitness';
|
|
10
|
+
/**
|
|
11
|
+
* Pre-compiled patterns for complex objects that need serializers.
|
|
12
|
+
* These patterns are intentional and safe for static code analysis.
|
|
13
|
+
* They detect object references in log statements, not user input.
|
|
14
|
+
*/
|
|
15
|
+
const REQUEST_PATTERN = new RegExp(String.raw `\breq\s*[,}]`);
|
|
16
|
+
const QUERY_RUNNER_PATTERN = new RegExp(String.raw `queryRunner\s*[,}]`, 'i');
|
|
17
|
+
const ENTITY_PATTERN = new RegExp(String.raw `\bentity\s*[,}]`, 'i');
|
|
18
|
+
/**
|
|
19
|
+
* Known complex objects that need serializers
|
|
20
|
+
*/
|
|
21
|
+
const COMPLEX_OBJECTS = [
|
|
22
|
+
{ pattern: REQUEST_PATTERN, name: 'Request' },
|
|
23
|
+
{ pattern: QUERY_RUNNER_PATTERN, name: 'QueryRunner' },
|
|
24
|
+
{ pattern: ENTITY_PATTERN, name: 'Entity' },
|
|
25
|
+
];
|
|
26
|
+
/**
|
|
27
|
+
* Pre-compiled patterns for safe serialization indicators.
|
|
28
|
+
* These patterns are intentional and safe for static code analysis.
|
|
29
|
+
* Using escaped dot (\\.) instead of character class [.] per sonarjs/single-char-in-character-classes.
|
|
30
|
+
*/
|
|
31
|
+
const SAFE_ID_PATTERN = /\.id\s{0,10}[,}]/;
|
|
32
|
+
const SAFE_NAME_PATTERN = /\.name\s{0,10}[,}]/;
|
|
33
|
+
const SAFE_TO_STRING_PATTERN = /\.toString\s{0,10}\(\)/;
|
|
34
|
+
const SAFE_JSON_STRINGIFY_PATTERN = /JSON\.stringify/;
|
|
35
|
+
const SAFE_TO_JSON_PATTERN = /\.toJSON\s{0,10}\(\)/;
|
|
36
|
+
/**
|
|
37
|
+
* Safe patterns that indicate proper serialization
|
|
38
|
+
*/
|
|
39
|
+
const SAFE_PATTERNS = [
|
|
40
|
+
SAFE_ID_PATTERN,
|
|
41
|
+
SAFE_NAME_PATTERN,
|
|
42
|
+
SAFE_TO_STRING_PATTERN,
|
|
43
|
+
SAFE_JSON_STRINGIFY_PATTERN,
|
|
44
|
+
SAFE_TO_JSON_PATTERN,
|
|
45
|
+
];
|
|
46
|
+
/**
|
|
47
|
+
* Pre-compiled pattern for detecting logger calls with objects.
|
|
48
|
+
* This pattern is intentional and safe for static code analysis.
|
|
49
|
+
* Using bounded quantifiers for safety.
|
|
50
|
+
*/
|
|
51
|
+
const LOG_CALL_PATTERN = /logger\.(info|warn|error|debug|trace)\s{0,10}\(\s{0,10}\{/;
|
|
52
|
+
/**
|
|
53
|
+
* Pre-compiled pattern for detecting circular reference issues.
|
|
54
|
+
* This pattern is intentional and safe for static code analysis.
|
|
55
|
+
* Using bounded quantifiers for safety.
|
|
56
|
+
*/
|
|
57
|
+
const THIS_PATTERN = /:\s{0,10}this\s{0,10}[,}]/;
|
|
58
|
+
/**
|
|
59
|
+
* Counts brackets in a line
|
|
60
|
+
* @param line - The line to count brackets in
|
|
61
|
+
* @returns The net bracket count (open minus close)
|
|
62
|
+
*/
|
|
63
|
+
function countBrackets(line) {
|
|
64
|
+
let openCount = 0;
|
|
65
|
+
let closeCount = 0;
|
|
66
|
+
for (const char of line) {
|
|
67
|
+
if (char === '{')
|
|
68
|
+
openCount++;
|
|
69
|
+
if (char === '}')
|
|
70
|
+
closeCount++;
|
|
71
|
+
}
|
|
72
|
+
return openCount - closeCount;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Builds the complete log statement from multiple lines
|
|
76
|
+
* @param lines - All lines in the file
|
|
77
|
+
* @param startIndex - Starting line index
|
|
78
|
+
* @returns The complete log statement
|
|
79
|
+
*/
|
|
80
|
+
function buildLogStatement(lines, startIndex) {
|
|
81
|
+
const firstLine = lines[startIndex];
|
|
82
|
+
if (!firstLine)
|
|
83
|
+
return '';
|
|
84
|
+
let logStatement = firstLine;
|
|
85
|
+
let bracketCount = countBrackets(firstLine);
|
|
86
|
+
let j = startIndex + 1;
|
|
87
|
+
while (bracketCount > 0 && j < lines.length) {
|
|
88
|
+
const nextLine = lines[j];
|
|
89
|
+
if (nextLine) {
|
|
90
|
+
logStatement += '\n' + nextLine;
|
|
91
|
+
bracketCount += countBrackets(nextLine);
|
|
92
|
+
}
|
|
93
|
+
j++;
|
|
94
|
+
}
|
|
95
|
+
return logStatement;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Creates complex object violation info
|
|
99
|
+
*/
|
|
100
|
+
function createComplexObjectViolation(lineNum, objectName, match) {
|
|
101
|
+
const lowerName = objectName.toLowerCase();
|
|
102
|
+
return {
|
|
103
|
+
lineNum,
|
|
104
|
+
message: `Logging ${objectName} object without serializer`,
|
|
105
|
+
suggestion: `Register a Pino serializer for ${objectName} objects, or extract specific fields: { ${lowerName}Id: ${lowerName}.id, ${lowerName}Name: ${lowerName}.name }`,
|
|
106
|
+
match,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Creates circular reference violation info
|
|
111
|
+
*/
|
|
112
|
+
function createCircularReferenceViolation(lineNum, match) {
|
|
113
|
+
return {
|
|
114
|
+
lineNum,
|
|
115
|
+
message: 'Logging "this" directly may cause circular reference',
|
|
116
|
+
suggestion: 'Extract specific properties from "this" instead of logging the entire object: { className: this.constructor.name, id: this.id }',
|
|
117
|
+
match,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Checks for complex object violations in log statement
|
|
122
|
+
*/
|
|
123
|
+
function checkComplexObjects(logStatement, lineNum, match, violationInfos) {
|
|
124
|
+
for (const { pattern, name } of COMPLEX_OBJECTS) {
|
|
125
|
+
if (pattern.test(logStatement)) {
|
|
126
|
+
violationInfos.push(createComplexObjectViolation(lineNum, name, match));
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Checks for circular reference violations in log statement
|
|
132
|
+
*/
|
|
133
|
+
function checkCircularReferences(logStatement, lineNum, match, violationInfos) {
|
|
134
|
+
if (THIS_PATTERN.test(logStatement)) {
|
|
135
|
+
violationInfos.push(createCircularReferenceViolation(lineNum, match));
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Analyze a file for Pino serializer coverage issues
|
|
140
|
+
*/
|
|
141
|
+
function analyzeFile(content, _filePath) {
|
|
142
|
+
const violations = [];
|
|
143
|
+
// Quick filter: skip files without logger patterns
|
|
144
|
+
if (!content.includes('logger.info') &&
|
|
145
|
+
!content.includes('logger.warn') &&
|
|
146
|
+
!content.includes('logger.error') &&
|
|
147
|
+
!content.includes('logger.debug')) {
|
|
148
|
+
return violations;
|
|
149
|
+
}
|
|
150
|
+
const lines = content.split('\n');
|
|
151
|
+
for (let i = 0; i < lines.length; i++) {
|
|
152
|
+
const line = lines[i];
|
|
153
|
+
if (!line)
|
|
154
|
+
continue;
|
|
155
|
+
// Check for logger calls with objects
|
|
156
|
+
if (!LOG_CALL_PATTERN.test(line))
|
|
157
|
+
continue;
|
|
158
|
+
// Get the full log statement (may span multiple lines)
|
|
159
|
+
const logStatement = buildLogStatement(lines, i);
|
|
160
|
+
// Check if any safe patterns are used
|
|
161
|
+
const isSafe = SAFE_PATTERNS.some((p) => p.test(logStatement));
|
|
162
|
+
if (isSafe)
|
|
163
|
+
continue;
|
|
164
|
+
const lineNum = i + 1;
|
|
165
|
+
const violationInfos = [];
|
|
166
|
+
checkComplexObjects(logStatement, lineNum, line, violationInfos);
|
|
167
|
+
checkCircularReferences(logStatement, lineNum, line, violationInfos);
|
|
168
|
+
for (const info of violationInfos) {
|
|
169
|
+
violations.push({
|
|
170
|
+
line: info.lineNum,
|
|
171
|
+
column: 0,
|
|
172
|
+
message: info.message,
|
|
173
|
+
severity: 'warning',
|
|
174
|
+
suggestion: info.suggestion,
|
|
175
|
+
match: info.match,
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return violations;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Check: quality/pino-serializer-coverage
|
|
183
|
+
*
|
|
184
|
+
* Validates that complex objects logged have proper Pino serializers.
|
|
185
|
+
*/
|
|
186
|
+
export const pinoSerializerCoverage = defineCheck({
|
|
187
|
+
id: 'e54a6ff0-332e-4848-bc62-d7df37b4795a',
|
|
188
|
+
slug: 'pino-serializer-coverage',
|
|
189
|
+
scope: { languages: ['typescript'], concerns: ['backend', 'server'] },
|
|
190
|
+
contentFilter: 'strip-strings-and-comments',
|
|
191
|
+
confidence: 'medium',
|
|
192
|
+
description: 'Validates that complex objects logged have proper Pino serializers',
|
|
193
|
+
longDescription: `**Purpose:** Validates that complex objects passed to Pino logger calls have proper serializers registered, preventing structured logging failures from circular references or oversized objects.
|
|
194
|
+
|
|
195
|
+
**Detects:**
|
|
196
|
+
- \`logger.(info|warn|error|debug|trace)\` calls containing complex object references: \`req\` (Request), \`queryRunner\` (QueryRunner), \`entity\` (Entity) without safe serialization
|
|
197
|
+
- Logging \`this\` directly (matched via \`:\\s*this\\s*[,}]\`), which risks circular reference errors
|
|
198
|
+
- Skips log statements that use safe patterns: \`.id\`, \`.name\`, \`.toString()\`, \`JSON.stringify\`, or \`.toJSON()\`
|
|
199
|
+
|
|
200
|
+
**Why it matters:** Logging unserialized complex objects causes Pino to fail silently, produce truncated output, or throw circular reference errors -- all of which degrade observability in production.
|
|
201
|
+
|
|
202
|
+
**Scope:** General best practice. Analyzes each file individually using regex-based log statement scanning.`,
|
|
203
|
+
tags: ['logging', 'quality'],
|
|
204
|
+
fileTypes: ['ts'],
|
|
205
|
+
// @fitness-ignore-next-line no-hardcoded-timeouts -- framework default for fitness check execution
|
|
206
|
+
timeout: 180_000, // 3 minutes - scans log statements across codebase
|
|
207
|
+
analyze: analyzeFile,
|
|
208
|
+
});
|
|
209
|
+
//# sourceMappingURL=pino-serializer-coverage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pino-serializer-coverage.js","sourceRoot":"","sources":["../../../../src/checks/quality/observability/pino-serializer-coverage.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,WAAW,EAAuB,MAAM,sBAAsB,CAAC;AAExE;;;;GAIG;AACH,MAAM,eAAe,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAA,cAAc,CAAC,CAAC;AAC7D,MAAM,oBAAoB,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAA,oBAAoB,EAAE,GAAG,CAAC,CAAC;AAC7E,MAAM,cAAc,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAA,iBAAiB,EAAE,GAAG,CAAC,CAAC;AAEpE;;GAEG;AACH,MAAM,eAAe,GAAG;IACtB,EAAE,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,SAAS,EAAE;IAC7C,EAAE,OAAO,EAAE,oBAAoB,EAAE,IAAI,EAAE,aAAa,EAAE;IACtD,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,QAAQ,EAAE;CAC5C,CAAC;AAEF;;;;GAIG;AACH,MAAM,eAAe,GAAG,kBAAkB,CAAC;AAC3C,MAAM,iBAAiB,GAAG,oBAAoB,CAAC;AAC/C,MAAM,sBAAsB,GAAG,wBAAwB,CAAC;AACxD,MAAM,2BAA2B,GAAG,iBAAiB,CAAC;AACtD,MAAM,oBAAoB,GAAG,sBAAsB,CAAC;AAEpD;;GAEG;AACH,MAAM,aAAa,GAAG;IACpB,eAAe;IACf,iBAAiB;IACjB,sBAAsB;IACtB,2BAA2B;IAC3B,oBAAoB;CACrB,CAAC;AAEF;;;;GAIG;AACH,MAAM,gBAAgB,GAAG,2DAA2D,CAAC;AAErF;;;;GAIG;AACH,MAAM,YAAY,GAAG,2BAA2B,CAAC;AAEjD;;;;GAIG;AACH,SAAS,aAAa,CAAC,IAAY;IACjC,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,IAAI,IAAI,KAAK,GAAG;YAAE,SAAS,EAAE,CAAC;QAC9B,IAAI,IAAI,KAAK,GAAG;YAAE,UAAU,EAAE,CAAC;IACjC,CAAC;IACD,OAAO,SAAS,GAAG,UAAU,CAAC;AAChC,CAAC;AAED;;;;;GAKG;AACH,SAAS,iBAAiB,CAAC,KAAe,EAAE,UAAkB;IAC5D,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;IACpC,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,CAAC;IAE1B,IAAI,YAAY,GAAG,SAAS,CAAC;IAC7B,IAAI,YAAY,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;IAC5C,IAAI,CAAC,GAAG,UAAU,GAAG,CAAC,CAAC;IAEvB,OAAO,YAAY,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QAC5C,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,QAAQ,EAAE,CAAC;YACb,YAAY,IAAI,IAAI,GAAG,QAAQ,CAAC;YAChC,YAAY,IAAI,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC1C,CAAC;QACD,CAAC,EAAE,CAAC;IACN,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AASD;;GAEG;AACH,SAAS,4BAA4B,CACnC,OAAe,EACf,UAAkB,EAClB,KAAa;IAEb,MAAM,SAAS,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;IAC3C,OAAO;QACL,OAAO;QACP,OAAO,EAAE,WAAW,UAAU,4BAA4B;QAC1D,UAAU,EAAE,kCAAkC,UAAU,2CAA2C,SAAS,OAAO,SAAS,QAAQ,SAAS,SAAS,SAAS,SAAS;QACxK,KAAK;KACN,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,gCAAgC,CAAC,OAAe,EAAE,KAAa;IACtE,OAAO;QACL,OAAO;QACP,OAAO,EAAE,sDAAsD;QAC/D,UAAU,EACR,iIAAiI;QACnI,KAAK;KACN,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAC1B,YAAoB,EACpB,OAAe,EACf,KAAa,EACb,cAA+B;IAE/B,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,eAAe,EAAE,CAAC;QAChD,IAAI,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;YAC/B,cAAc,CAAC,IAAI,CAAC,4BAA4B,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,uBAAuB,CAC9B,YAAoB,EACpB,OAAe,EACf,KAAa,EACb,cAA+B;IAE/B,IAAI,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;QACpC,cAAc,CAAC,IAAI,CAAC,gCAAgC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IACxE,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,OAAe,EAAE,SAAiB;IACrD,MAAM,UAAU,GAAqB,EAAE,CAAC;IAExC,mDAAmD;IACnD,IACE,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC;QAChC,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC;QAChC,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;QACjC,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,EACjC,CAAC;QACD,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC,IAAI;YAAE,SAAS;QAEpB,sCAAsC;QACtC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,SAAS;QAE3C,uDAAuD;QACvD,MAAM,YAAY,GAAG,iBAAiB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAEjD,sCAAsC;QACtC,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;QAC/D,IAAI,MAAM;YAAE,SAAS;QAErB,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;QACtB,MAAM,cAAc,GAAoB,EAAE,CAAC;QAE3C,mBAAmB,CAAC,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;QACjE,uBAAuB,CAAC,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;QAErE,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;YAClC,UAAU,CAAC,IAAI,CAAC;gBACd,IAAI,EAAE,IAAI,CAAC,OAAO;gBAClB,MAAM,EAAE,CAAC;gBACT,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,QAAQ,EAAE,SAAS;gBACnB,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,KAAK,EAAE,IAAI,CAAC,KAAK;aAClB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,WAAW,CAAC;IAChD,EAAE,EAAE,sCAAsC;IAC1C,IAAI,EAAE,0BAA0B;IAChC,KAAK,EAAE,EAAE,SAAS,EAAE,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE;IACrE,aAAa,EAAE,4BAA4B;IAE3C,UAAU,EAAE,QAAQ;IACpB,WAAW,EAAE,oEAAoE;IACjF,eAAe,EAAE;;;;;;;;;4GASyF;IAC1G,IAAI,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;IAC5B,SAAS,EAAE,CAAC,IAAI,CAAC;IACjB,mGAAmG;IACnG,OAAO,EAAE,OAAO,EAAE,mDAAmD;IAErE,OAAO,EAAE,WAAW;CACrB,CAAC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Async State Pattern Check
|
|
3
|
+
*
|
|
4
|
+
* Enforces that data-driven screens are wrapped in the AsyncState pattern.
|
|
5
|
+
* Screens using TanStack Query should use AsyncState for consistent loading/error handling.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Check: quality/async-state-pattern
|
|
9
|
+
*
|
|
10
|
+
* Ensures data-driven screens use AsyncState pattern for consistent
|
|
11
|
+
* loading and error state handling with TanStack Query.
|
|
12
|
+
*/
|
|
13
|
+
export declare const asyncStatePattern: import("@opensip-cli/fitness").Check;
|
|
14
|
+
//# sourceMappingURL=async-state-pattern.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"async-state-pattern.d.ts","sourceRoot":"","sources":["../../../../src/checks/quality/patterns/async-state-pattern.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAiBH;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,sCAgE5B,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Async State Pattern Check
|
|
3
|
+
*
|
|
4
|
+
* Enforces that data-driven screens are wrapped in the AsyncState pattern.
|
|
5
|
+
* Screens using TanStack Query should use AsyncState for consistent loading/error handling.
|
|
6
|
+
*/
|
|
7
|
+
// @fitness-ignore-next-line no-markdown-references -- rule provenance reference for developer context
|
|
8
|
+
// Rule source: .augment/rules/ui-patterns.md
|
|
9
|
+
import { defineCheck, extractSnippet } from '@opensip-cli/fitness';
|
|
10
|
+
/**
|
|
11
|
+
* Paths to exclude from checking
|
|
12
|
+
*/
|
|
13
|
+
const NON_SCREEN_PATTERNS = [
|
|
14
|
+
/node_modules/,
|
|
15
|
+
/__tests__/,
|
|
16
|
+
/\.test\./,
|
|
17
|
+
/\.spec\./,
|
|
18
|
+
/components\/patterns\//, // The pattern components themselves
|
|
19
|
+
];
|
|
20
|
+
/**
|
|
21
|
+
* Check: quality/async-state-pattern
|
|
22
|
+
*
|
|
23
|
+
* Ensures data-driven screens use AsyncState pattern for consistent
|
|
24
|
+
* loading and error state handling with TanStack Query.
|
|
25
|
+
*/
|
|
26
|
+
export const asyncStatePattern = defineCheck({
|
|
27
|
+
id: '3bc0cb23-7354-4f85-b39f-d21813e6394c',
|
|
28
|
+
slug: 'async-state-pattern',
|
|
29
|
+
disabled: true,
|
|
30
|
+
scope: { languages: ['typescript'], concerns: ['backend', 'server'] },
|
|
31
|
+
contentFilter: 'strip-strings',
|
|
32
|
+
confidence: 'medium',
|
|
33
|
+
description: 'Ensure data-driven screens use AsyncState pattern',
|
|
34
|
+
longDescription: `**Purpose:** Enforces that data-driven screens wrap TanStack Query results in the AsyncState component for consistent loading/error handling.
|
|
35
|
+
|
|
36
|
+
**Detects:** Analyzes each file individually. Screen files in \`/screens/\` that import \`useQuery\`, \`useMutation\`, or \`useInfiniteQuery\` but do not reference \`AsyncState\` or \`<AsyncState\`.
|
|
37
|
+
|
|
38
|
+
**Why it matters:** Without AsyncState, each screen implements its own loading/error UI, leading to inconsistent user experience and duplicated boilerplate.
|
|
39
|
+
|
|
40
|
+
**Scope:** Codebase-specific convention (rule source: .augment/rules/ui-patterns.md)`,
|
|
41
|
+
tags: ['quality', 'frontend', 'patterns', 'tanstack-query', 'consistency'],
|
|
42
|
+
fileTypes: ['ts', 'tsx'],
|
|
43
|
+
analyze(content, filePath) {
|
|
44
|
+
// Only check screen files
|
|
45
|
+
if (!filePath.includes('/screens/') ||
|
|
46
|
+
(!filePath.endsWith('.ts') && !filePath.endsWith('.tsx'))) {
|
|
47
|
+
return [];
|
|
48
|
+
}
|
|
49
|
+
// Skip excluded paths
|
|
50
|
+
if (NON_SCREEN_PATTERNS.some((pattern) => pattern.test(filePath))) {
|
|
51
|
+
return [];
|
|
52
|
+
}
|
|
53
|
+
const violations = [];
|
|
54
|
+
// Check if file uses TanStack Query (useQuery, useMutation)
|
|
55
|
+
const usesQuery = /use(Query|Mutation|InfiniteQuery)\s*\(/.test(content);
|
|
56
|
+
if (!usesQuery) {
|
|
57
|
+
return violations; // Not a data-driven screen
|
|
58
|
+
}
|
|
59
|
+
// Check if file imports or uses AsyncState pattern
|
|
60
|
+
const hasAsyncState = /AsyncState|<AsyncState/.test(content);
|
|
61
|
+
if (!hasAsyncState) {
|
|
62
|
+
// Find the useQuery line for better context
|
|
63
|
+
const queryMatch = /use(Query|Mutation|InfiniteQuery)\s*\(/.exec(content);
|
|
64
|
+
const queryLine = queryMatch ? content.slice(0, queryMatch.index).split('\n').length : 1;
|
|
65
|
+
extractSnippet(content, queryLine, 3);
|
|
66
|
+
const matchText = queryMatch?.[0] ?? 'useQuery';
|
|
67
|
+
violations.push({
|
|
68
|
+
line: queryLine,
|
|
69
|
+
column: 0,
|
|
70
|
+
message: 'Data-driven screen uses TanStack Query but not AsyncState pattern',
|
|
71
|
+
severity: 'warning',
|
|
72
|
+
suggestion: "Import AsyncState from 'components/patterns/' and wrap data display: <AsyncState isLoading={isLoading} error={error} data={data}>{...}</AsyncState>",
|
|
73
|
+
type: 'missing-async-state',
|
|
74
|
+
match: matchText,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
return violations;
|
|
78
|
+
},
|
|
79
|
+
});
|
|
80
|
+
//# sourceMappingURL=async-state-pattern.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"async-state-pattern.js","sourceRoot":"","sources":["../../../../src/checks/quality/patterns/async-state-pattern.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,sGAAsG;AACtG,6CAA6C;AAE7C,OAAO,EAAE,WAAW,EAAuB,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAExF;;GAEG;AACH,MAAM,mBAAmB,GAAG;IAC1B,cAAc;IACd,WAAW;IACX,UAAU;IACV,UAAU;IACV,wBAAwB,EAAE,oCAAoC;CAC/D,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,WAAW,CAAC;IAC3C,EAAE,EAAE,sCAAsC;IAC1C,IAAI,EAAE,qBAAqB;IAC3B,QAAQ,EAAE,IAAI;IACd,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,mDAAmD;IAChE,eAAe,EAAE;;;;;;qFAMkE;IACnF,IAAI,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,aAAa,CAAC;IAC1E,SAAS,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC;IAExB,OAAO,CAAC,OAAO,EAAE,QAAQ;QACvB,0BAA0B;QAC1B,IACE,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC;YAC/B,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EACzD,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,sBAAsB;QACtB,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;YAClE,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,UAAU,GAAqB,EAAE,CAAC;QAExC,4DAA4D;QAC5D,MAAM,SAAS,GAAG,wCAAwC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzE,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,UAAU,CAAC,CAAC,2BAA2B;QAChD,CAAC;QAED,mDAAmD;QACnD,MAAM,aAAa,GAAG,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7D,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,4CAA4C;YAC5C,MAAM,UAAU,GAAG,wCAAwC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC1E,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YACzF,cAAc,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;YACtC,MAAM,SAAS,GAAG,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC;YAEhD,UAAU,CAAC,IAAI,CAAC;gBACd,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE,CAAC;gBACT,OAAO,EAAE,mEAAmE;gBAC5E,QAAQ,EAAE,SAAS;gBACnB,UAAU,EACR,qJAAqJ;gBACvJ,IAAI,EAAE,qBAAqB;gBAC3B,KAAK,EAAE,SAAS;aACjB,CAAC,CAAC;QACL,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/checks/quality/patterns/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,gCAAgC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/checks/quality/patterns/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,gCAAgC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview No non-null assertions check
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Check: quality/no-non-null-assertions
|
|
6
|
+
*
|
|
7
|
+
* Detects TypeScript non-null assertion operator (!) usage in production code.
|
|
8
|
+
*/
|
|
9
|
+
export declare const noNonNullAssertions: import("@opensip-cli/fitness").Check;
|
|
10
|
+
//# sourceMappingURL=no-non-null-assertions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-non-null-assertions.d.ts","sourceRoot":"","sources":["../../../../src/checks/quality/patterns/no-non-null-assertions.ts"],"names":[],"mappings":"AAAA;;GAEG;AA0EH;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,sCA0B9B,CAAC"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview No non-null assertions check
|
|
3
|
+
*/
|
|
4
|
+
import { defineCheck, isTestFile } from '@opensip-cli/fitness';
|
|
5
|
+
/**
|
|
6
|
+
* Regex to detect non-null assertion operator usage.
|
|
7
|
+
* Matches patterns like: expr!. or expr![ or expr!) where expr is an identifier.
|
|
8
|
+
* Avoids matching !== and != comparisons.
|
|
9
|
+
*/
|
|
10
|
+
// eslint-disable-next-line sonarjs/slow-regex -- character class has no overlap; '!' acts as fixed delimiter
|
|
11
|
+
const NON_NULL_ASSERTION_REGEX = /([\w.[\]]+)!\s*[.[;,)]/g;
|
|
12
|
+
/**
|
|
13
|
+
* Analyze a file for non-null assertion operator usage
|
|
14
|
+
*/
|
|
15
|
+
// eslint-disable-next-line sonarjs/cognitive-complexity -- Inherent complexity: template literal tracking + regex matching + multiple skip conditions
|
|
16
|
+
function analyzeNonNullAssertions(content, _filePath) {
|
|
17
|
+
const violations = [];
|
|
18
|
+
const lines = content.split('\n');
|
|
19
|
+
// Track template literal nesting to skip lines inside multi-line template literals
|
|
20
|
+
let inTemplateLiteral = false;
|
|
21
|
+
for (const [i, line_] of lines.entries()) {
|
|
22
|
+
const line = line_ ?? '';
|
|
23
|
+
const trimmed = line.trim();
|
|
24
|
+
// Track template literal boundaries (count unescaped backticks)
|
|
25
|
+
let backtickCount = 0;
|
|
26
|
+
for (let c = 0; c < line.length; c++) {
|
|
27
|
+
if (line[c] === '`' && (c === 0 || line[c - 1] !== '\\'))
|
|
28
|
+
backtickCount++;
|
|
29
|
+
}
|
|
30
|
+
if (backtickCount % 2 === 1)
|
|
31
|
+
inTemplateLiteral = !inTemplateLiteral;
|
|
32
|
+
// Skip lines inside multi-line template literals (e.g., longDescription text)
|
|
33
|
+
if (inTemplateLiteral && backtickCount % 2 === 0)
|
|
34
|
+
continue;
|
|
35
|
+
// Skip comments, imports, and type declarations
|
|
36
|
+
if (trimmed.startsWith('//') || trimmed.startsWith('*') || trimmed.startsWith('import '))
|
|
37
|
+
continue;
|
|
38
|
+
if (trimmed.startsWith('type ') ||
|
|
39
|
+
trimmed.startsWith('interface ') ||
|
|
40
|
+
trimmed.startsWith('export type ') ||
|
|
41
|
+
trimmed.startsWith('export interface '))
|
|
42
|
+
continue;
|
|
43
|
+
// Skip lines that are string literals (rough heuristic)
|
|
44
|
+
if (trimmed.startsWith("'") || trimmed.startsWith('"') || trimmed.startsWith('`'))
|
|
45
|
+
continue;
|
|
46
|
+
NON_NULL_ASSERTION_REGEX.lastIndex = 0;
|
|
47
|
+
let match;
|
|
48
|
+
while ((match = NON_NULL_ASSERTION_REGEX.exec(line)) !== null) {
|
|
49
|
+
// Make sure this isn't part of !== or !=
|
|
50
|
+
const bangPos = match.index + (match[1]?.length ?? 0);
|
|
51
|
+
const nextChar = line[bangPos + 1];
|
|
52
|
+
if (nextChar === '=')
|
|
53
|
+
continue;
|
|
54
|
+
violations.push({
|
|
55
|
+
line: i + 1,
|
|
56
|
+
message: `Non-null assertion operator (\`!\`) used on '${match[1]}' — this bypasses TypeScript null checking`,
|
|
57
|
+
severity: 'warning',
|
|
58
|
+
suggestion: 'Use optional chaining (?.), nullish coalescing (??), or a proper null guard instead of the ! operator',
|
|
59
|
+
type: 'non-null-assertion',
|
|
60
|
+
match: trimmed.slice(0, 120),
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return violations;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Check: quality/no-non-null-assertions
|
|
68
|
+
*
|
|
69
|
+
* Detects TypeScript non-null assertion operator (!) usage in production code.
|
|
70
|
+
*/
|
|
71
|
+
export const noNonNullAssertions = defineCheck({
|
|
72
|
+
id: 'd1e51952-5758-40f3-999b-b83f57db9a42',
|
|
73
|
+
slug: 'no-non-null-assertions',
|
|
74
|
+
scope: { languages: ['typescript'], concerns: ['backend', 'server'] },
|
|
75
|
+
contentFilter: 'strip-strings',
|
|
76
|
+
confidence: 'medium',
|
|
77
|
+
description: 'Detects TypeScript non-null assertion operator (!) usage in production code — prefer proper null handling',
|
|
78
|
+
longDescription: `**Purpose:** Detects uses of the TypeScript non-null assertion operator (\`!\`) which bypasses null checking and can mask real null/undefined bugs at runtime.
|
|
79
|
+
|
|
80
|
+
**Detects:**
|
|
81
|
+
- \`expr!.property\` — non-null assertion before property access
|
|
82
|
+
- \`expr![index]\` — non-null assertion before index access
|
|
83
|
+
- Excludes \`!==\` and \`!=\` comparisons (not assertions)
|
|
84
|
+
|
|
85
|
+
**Why it matters:** Non-null assertions are type-safety escape hatches. They tell TypeScript "trust me, this is not null" without any runtime check. When wrong, they cause runtime errors.
|
|
86
|
+
|
|
87
|
+
**Scope:** Production code. Analyzes each file individually via regex.`,
|
|
88
|
+
tags: ['type-safety', 'quality', 'typescript'],
|
|
89
|
+
fileTypes: ['ts', 'tsx'],
|
|
90
|
+
analyze(content, filePath) {
|
|
91
|
+
// Skip test files — non-null assertions in tests are low-risk due to controlled inputs
|
|
92
|
+
if (isTestFile(filePath))
|
|
93
|
+
return [];
|
|
94
|
+
return analyzeNonNullAssertions(content, filePath);
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
//# sourceMappingURL=no-non-null-assertions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-non-null-assertions.js","sourceRoot":"","sources":["../../../../src/checks/quality/patterns/no-non-null-assertions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Performance Anti-Patterns Check
|
|
3
|
+
*
|
|
4
|
+
* Detects common performance anti-patterns:
|
|
5
|
+
* - Sequential awaits in loops
|
|
6
|
+
* - Spread operators in loops
|
|
7
|
+
* - String concatenation in loops
|
|
8
|
+
* - Nested O(n^2) loops
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Check: quality/performance-anti-patterns
|
|
12
|
+
*
|
|
13
|
+
* Detects common performance anti-patterns in code.
|
|
14
|
+
*/
|
|
15
|
+
export declare const performanceAntiPatterns: import("@opensip-cli/fitness").Check;
|
|
16
|
+
//# sourceMappingURL=performance-anti-patterns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"performance-anti-patterns.d.ts","sourceRoot":"","sources":["../../../../src/checks/quality/patterns/performance-anti-patterns.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AA4NH;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,sCAuDlC,CAAC"}
|