mirror of
https://github.com/millionco/react-doctor.git
synced 2026-09-14 20:00:24 +08:00
5915a58231
Refresh the pinned delta-audit baseline after reviewed detector precision changes. The corpus, pinned SHAs, thresholds, and runner are unchanged.
389 lines
18 KiB
JSON
389 lines
18 KiB
JSON
{
|
|
"generatedAt": "2026-07-15T17:07:21.407Z",
|
|
"cliVersion": "0.7.9",
|
|
"repositories": [
|
|
{
|
|
"repo": "shadcn-ui/taxonomy",
|
|
"sha": "298a8857c7128a0d121e7f699dfd729f23b3966d",
|
|
"ruleCounts": {
|
|
"react-doctor/nextjs-no-use-search-params-without-suspense": 2,
|
|
"react-doctor/nextjs-no-vercel-og-import": 1,
|
|
"react-doctor/nextjs-no-side-effect-in-get-handler": 1,
|
|
"react-doctor/no-effect-chain": 1,
|
|
"react-doctor/no-array-index-as-key": 6,
|
|
"react-doctor/button-has-type": 2,
|
|
"react-doctor/nextjs-no-img-element": 1,
|
|
"react-doctor/only-export-components": 6,
|
|
"react-doctor/prefer-module-scope-pure-function": 1,
|
|
"react-doctor/jsx-key": 1,
|
|
"react-doctor/effect-needs-cleanup": 1,
|
|
"react-doctor/rendering-hydration-no-flicker": 1,
|
|
"react-doctor/no-vulnerable-react-server-components": 1,
|
|
"react-doctor/require-pnpm-hardening": 2
|
|
}
|
|
},
|
|
{
|
|
"repo": "alan2207/bulletproof-react",
|
|
"sha": "9506629ed003a561c6627735480cce4994244bb4",
|
|
"ruleCounts": {
|
|
"react-doctor/only-export-components": 9,
|
|
"react-doctor/no-impure-state-updater": 1,
|
|
"react-doctor/jsx-no-constructed-context-values": 2,
|
|
"react-doctor/button-has-type": 1,
|
|
"react-doctor/no-redundant-roles": 1,
|
|
"react-doctor/prefer-tag-over-role": 1,
|
|
"react-doctor/no-array-index-as-key": 1
|
|
}
|
|
},
|
|
{
|
|
"repo": "shadcn-ui/ui",
|
|
"sha": "68e1f171aa8c6ce2e38cb9a7d1463d6bcf357e91",
|
|
"ruleCounts": {
|
|
"react-doctor/rendering-svg-precision": 6,
|
|
"react-doctor/js-combine-iterations": 63,
|
|
"react-doctor/nextjs-no-client-side-redirect": 1,
|
|
"react-doctor/iframe-missing-sandbox": 4,
|
|
"react-doctor/no-giant-component": 10,
|
|
"react-doctor/anchor-has-content": 50,
|
|
"react-doctor/no-pass-data-to-parent": 1,
|
|
"react-doctor/no-prop-callback-in-effect": 1,
|
|
"react-doctor/prefer-use-effect-event": 3,
|
|
"react-doctor/js-set-map-lookups": 8,
|
|
"react-doctor/async-await-in-loop": 2,
|
|
"react-doctor/prefer-tag-over-role": 45,
|
|
"react-doctor/no-array-index-as-key": 119,
|
|
"react-doctor/prefer-dynamic-import": 125,
|
|
"react-doctor/rerender-lazy-state-init": 7,
|
|
"react-doctor/only-export-components": 167,
|
|
"react-doctor/no-prevent-default": 8,
|
|
"react-doctor/no-derived-useState": 11,
|
|
"react-doctor/exhaustive-deps": 33,
|
|
"react-doctor/no-effect-with-fresh-deps": 4,
|
|
"react-doctor/rerender-memo-with-default-value": 2,
|
|
"react-doctor/js-hoist-intl": 9,
|
|
"react-doctor/jsx-max-depth": 1,
|
|
"react-doctor/server-sequential-independent-await": 1,
|
|
"react-doctor/jsx-no-constructed-context-values": 68,
|
|
"react-doctor/iframe-has-title": 2,
|
|
"react-doctor/rendering-hoist-jsx": 2,
|
|
"react-doctor/effect-needs-cleanup": 27,
|
|
"react-doctor/button-has-type": 4,
|
|
"react-doctor/use-lazy-motion": 1,
|
|
"react-doctor/no-unguarded-browser-global-in-render-or-hook-init": 1,
|
|
"react-doctor/rendering-hydration-no-flicker": 5,
|
|
"react-doctor/no-usememo-simple-expression": 3,
|
|
"react-doctor/server-auth-actions": 4,
|
|
"react-doctor/js-flatmap-filter": 1,
|
|
"react-doctor/nextjs-no-img-element": 6,
|
|
"react-doctor/public-debug-artifact": 19,
|
|
"react-doctor/nextjs-missing-metadata": 73,
|
|
"react-doctor/img-redundant-alt": 20,
|
|
"react-doctor/label-has-associated-control": 1,
|
|
"react-doctor/prefer-useReducer": 2,
|
|
"react-doctor/rerender-lazy-ref-init": 4,
|
|
"react-doctor/anchor-ambiguous-text": 2,
|
|
"react-doctor/no-locale-format-in-render": 21,
|
|
"react-doctor/rerender-memo-before-early-return": 21,
|
|
"react-doctor/no-redundant-roles": 21,
|
|
"react-doctor/no-reset-all-state-on-prop-change": 1,
|
|
"react-doctor/no-dynamic-import-path": 1,
|
|
"react-doctor/no-children-prop": 14,
|
|
"react-doctor/no-ref-current-in-render": 6
|
|
}
|
|
},
|
|
{
|
|
"repo": "excalidraw/excalidraw",
|
|
"sha": "ba0387d186b361d8d9a2390f396cb17527073442",
|
|
"ruleCounts": {
|
|
"react-doctor/no-giant-component": 12,
|
|
"react-doctor/effect-needs-cleanup": 6,
|
|
"react-doctor/no-fetch-in-effect": 2,
|
|
"react-doctor/only-export-components": 224,
|
|
"react-doctor/js-combine-iterations": 28,
|
|
"react-doctor/no-array-index-as-key": 10,
|
|
"react-doctor/jsx-no-target-blank": 7,
|
|
"react-doctor/button-has-type": 20,
|
|
"react-doctor/label-has-associated-control": 2,
|
|
"react-doctor/control-has-associated-label": 7,
|
|
"react-doctor/async-defer-await": 1,
|
|
"react-doctor/async-await-in-loop": 3,
|
|
"react-doctor/js-set-map-lookups": 16,
|
|
"react-doctor/server-sequential-independent-await": 2,
|
|
"react-doctor/no-derived-state-effect": 1,
|
|
"react-doctor/no-chain-state-updates": 1,
|
|
"react-doctor/no-barrel-import": 40,
|
|
"react-doctor/click-events-have-key-events": 12,
|
|
"react-doctor/no-static-element-interactions": 15,
|
|
"react-doctor/no-inline-exhaustive-style": 2,
|
|
"react-doctor/prefer-module-scope-static-value": 1,
|
|
"react-doctor/no-did-mount-set-state": 1,
|
|
"react-doctor/no-did-update-set-state": 3,
|
|
"react-doctor/no-mirror-prop-effect": 2,
|
|
"react-doctor/dialog-has-accessible-name": 2,
|
|
"react-doctor/prefer-html-dialog": 4,
|
|
"react-doctor/no-multi-comp": 5,
|
|
"react-doctor/no-impure-state-updater": 1,
|
|
"react-doctor/no-effect-chain": 1,
|
|
"react-doctor/prefer-module-scope-pure-function": 4,
|
|
"react-doctor/no-flush-sync": 1,
|
|
"react-doctor/no-noninteractive-element-interactions": 1,
|
|
"react-doctor/insecure-crypto-risk": 1,
|
|
"react-doctor/no-pass-data-to-parent": 2,
|
|
"react-doctor/exhaustive-deps": 2,
|
|
"react-doctor/no-effect-with-fresh-deps": 2,
|
|
"react-doctor/no-prop-callback-in-render": 4,
|
|
"react-doctor/rerender-memo-with-default-value": 1,
|
|
"react-doctor/no-derived-useState": 5,
|
|
"react-doctor/rerender-state-only-in-handlers": 2,
|
|
"react-doctor/rerender-functional-setstate": 1,
|
|
"react-doctor/rerender-lazy-ref-init": 4,
|
|
"react-doctor/no-noninteractive-tabindex": 1,
|
|
"react-doctor/rerender-lazy-state-init": 3,
|
|
"react-doctor/prefer-tag-over-role": 1,
|
|
"react-doctor/no-ref-current-in-render": 9,
|
|
"react-doctor/jsx-key": 2,
|
|
"react-doctor/no-autofocus": 1,
|
|
"react-doctor/jsx-no-constructed-context-values": 1,
|
|
"react-doctor/no-redundant-roles": 1,
|
|
"react-doctor/rendering-svg-precision": 1,
|
|
"react-doctor/js-cache-property-access": 2,
|
|
"react-doctor/iframe-missing-sandbox": 1,
|
|
"react-doctor/nextjs-missing-metadata": 1,
|
|
"react-doctor/nextjs-no-a-element": 2,
|
|
"react-doctor/js-batch-dom-css": 1
|
|
}
|
|
},
|
|
{
|
|
"repo": "infinitered/ChainReactApp2023",
|
|
"sha": "cb1c2b9e6225dbfbe4077f6ddfbca3d5c9629237",
|
|
"ruleCounts": {
|
|
"react-doctor/no-barrel-import": 44,
|
|
"react-doctor/effect-needs-cleanup": 1,
|
|
"react-doctor/rn-prefer-expo-image": 4,
|
|
"react-doctor/only-export-components": 4,
|
|
"react-doctor/no-array-index-as-key": 7,
|
|
"react-doctor/rn-prefer-pressable": 3,
|
|
"react-doctor/prefer-module-scope-pure-function": 4,
|
|
"react-doctor/exhaustive-deps": 10,
|
|
"react-doctor/js-combine-iterations": 8,
|
|
"react-doctor/jsx-key": 1,
|
|
"react-doctor/rn-no-inline-object-in-list-item": 1,
|
|
"react-doctor/no-effect-with-fresh-deps": 1,
|
|
"react-doctor/rules-of-hooks": 5,
|
|
"react-doctor/no-impure-state-updater": 1,
|
|
"react-doctor/rn-no-inline-flatlist-renderitem": 4,
|
|
"react-doctor/rerender-lazy-state-init": 1,
|
|
"react-doctor/rerender-lazy-ref-init": 1,
|
|
"react-doctor/query-no-rest-destructuring": 1,
|
|
"react-doctor/async-await-in-loop": 1,
|
|
"react-doctor/js-hoist-intl": 1,
|
|
"react-doctor/expo-no-redundant-dependency": 1
|
|
}
|
|
},
|
|
{
|
|
"repo": "pierrecomputer/pierre",
|
|
"sha": "66562caf7305dff1392d4c3c2964d9cabfdcf09f",
|
|
"ruleCounts": {
|
|
"react-doctor/js-cache-property-access": 4,
|
|
"react-doctor/no-barrel-import": 6,
|
|
"react-doctor/no-flush-sync": 1,
|
|
"react-doctor/no-giant-component": 7,
|
|
"react-doctor/rerender-lazy-ref-init": 2,
|
|
"react-doctor/no-array-index-as-key": 7,
|
|
"react-doctor/no-json-parse-stringify-clone": 1,
|
|
"react-doctor/dangerous-html-sink": 11,
|
|
"react-doctor/rendering-hoist-jsx": 1,
|
|
"react-doctor/preact-no-children-length": 2,
|
|
"react-doctor/js-combine-iterations": 8,
|
|
"react-doctor/no-ref-current-in-render": 12,
|
|
"react-doctor/rendering-hydration-no-flicker": 6,
|
|
"react-doctor/prefer-module-scope-pure-function": 3,
|
|
"react-doctor/js-tosorted-immutable": 1,
|
|
"react-doctor/react-compiler-no-manual-memoization": 83,
|
|
"react-doctor/nextjs-no-img-element": 1,
|
|
"react-hooks-js/set-state-in-effect": 19,
|
|
"react-doctor/no-effect-chain": 1,
|
|
"react-doctor/no-pass-live-state-to-parent": 2,
|
|
"react-doctor/no-prop-callback-in-effect": 3,
|
|
"react-hooks-js/refs": 9,
|
|
"react-doctor/no-unguarded-browser-global-in-render-or-hook-init": 1,
|
|
"react-hooks-js/todo": 10,
|
|
"react-doctor/control-has-associated-label": 2,
|
|
"react-hooks-js/static-components": 1,
|
|
"react-doctor/async-await-in-loop": 2,
|
|
"react-doctor/no-derived-useState": 4,
|
|
"react-doctor/effect-needs-cleanup": 4,
|
|
"react-doctor/button-has-type": 12,
|
|
"react-doctor/no-impure-state-updater": 2,
|
|
"react-doctor/click-events-have-key-events": 6,
|
|
"react-doctor/nextjs-no-a-element": 1,
|
|
"react-doctor/jsx-key": 26,
|
|
"react-doctor/interactive-supports-focus": 1,
|
|
"react-doctor/anchor-is-valid": 1,
|
|
"react-doctor/prefer-tag-over-role": 1,
|
|
"react-doctor/no-usememo-simple-expression": 1,
|
|
"react-doctor/no-chain-state-updates": 1,
|
|
"react-doctor/no-mirror-prop-effect": 2,
|
|
"react-doctor/no-adjust-state-on-prop-change": 2,
|
|
"react-doctor/js-set-map-lookups": 1,
|
|
"react-doctor/no-static-element-interactions": 3,
|
|
"react-doctor/no-noninteractive-element-interactions": 3,
|
|
"react-doctor/rerender-state-only-in-handlers": 1,
|
|
"react-doctor/no-inline-prop-on-memo-component": 6,
|
|
"react-doctor/server-sequential-independent-await": 2,
|
|
"react-doctor/nextjs-no-use-search-params-without-suspense": 1,
|
|
"react-doctor/rendering-svg-precision": 1,
|
|
"react-doctor/no-noninteractive-tabindex": 1
|
|
}
|
|
},
|
|
{
|
|
"repo": "outline/outline",
|
|
"sha": "25e8b6f518d1bfce912433af6201131d22fe3559",
|
|
"ruleCounts": {
|
|
"react-doctor/effect-needs-cleanup": 10,
|
|
"react-doctor/exhaustive-deps": 60,
|
|
"react-doctor/no-effect-with-fresh-deps": 24,
|
|
"react-doctor/prefer-module-scope-pure-function": 7,
|
|
"react-doctor/only-export-components": 34,
|
|
"react-doctor/no-many-boolean-props": 5,
|
|
"react-doctor/no-array-index-as-key": 38,
|
|
"react-doctor/js-combine-iterations": 60,
|
|
"react-doctor/js-flatmap-filter": 25,
|
|
"react-doctor/no-ref-current-in-render": 11,
|
|
"react-doctor/no-adjust-state-on-prop-change": 1,
|
|
"react-doctor/click-events-have-key-events": 3,
|
|
"react-doctor/no-static-element-interactions": 2,
|
|
"react-doctor/jsx-key": 1,
|
|
"react-doctor/no-multi-comp": 6,
|
|
"react-doctor/rendering-svg-precision": 21,
|
|
"react-doctor/no-derived-useState": 7,
|
|
"react-doctor/no-giant-component": 16,
|
|
"react-doctor/no-chain-state-updates": 14,
|
|
"react-doctor/no-pass-live-state-to-parent": 2,
|
|
"react-doctor/no-prop-callback-in-effect": 6,
|
|
"react-doctor/no-effect-chain": 10,
|
|
"react-doctor/js-set-map-lookups": 52,
|
|
"react-doctor/rerender-state-only-in-handlers": 3,
|
|
"react-doctor/no-mirror-prop-effect": 2,
|
|
"react-doctor/control-has-associated-label": 4,
|
|
"react-doctor/jsx-no-constructed-context-values": 2,
|
|
"react-doctor/rendering-hydration-no-flicker": 1,
|
|
"react-doctor/no-barrel-import": 10,
|
|
"react-doctor/label-has-associated-control": 1,
|
|
"react-doctor/rerender-memo-with-default-value": 2,
|
|
"react-doctor/prefer-useReducer": 1,
|
|
"react-doctor/rerender-lazy-state-init": 5,
|
|
"react-doctor/no-reset-all-state-on-prop-change": 4,
|
|
"react-doctor/rerender-lazy-ref-init": 3,
|
|
"react-doctor/no-layout-property-animation": 1,
|
|
"react-doctor/jsx-no-jsx-as-prop": 2,
|
|
"react-doctor/prefer-module-scope-static-value": 5,
|
|
"react-doctor/async-await-in-loop": 67,
|
|
"react-doctor/no-create-ref-in-function-component": 2,
|
|
"react-doctor/no-prop-callback-in-render": 1,
|
|
"react-doctor/no-impure-state-updater": 8,
|
|
"react-doctor/client-passive-event-listeners": 1,
|
|
"react-doctor/jsx-no-target-blank": 1,
|
|
"react-doctor/no-effect-event-handler": 1,
|
|
"react-doctor/js-hoist-intl": 2,
|
|
"react-doctor/require-reduced-motion": 1,
|
|
"react-doctor/server-sequential-independent-await": 10,
|
|
"react-doctor/no-tiny-text": 1,
|
|
"react-doctor/zod-v4-prefer-top-level-string-formats": 14,
|
|
"react-doctor/zod-v4-no-deprecated-schema-apis": 3,
|
|
"react-doctor/mcp-tool-capability-risk": 1,
|
|
"TS/2309": 1,
|
|
"react-doctor/rules-of-hooks": 3,
|
|
"react-doctor/no-noninteractive-element-interactions": 1,
|
|
"react-doctor/js-cache-property-access": 2,
|
|
"react-doctor/js-length-check-first": 1,
|
|
"react-doctor/no-json-parse-stringify-clone": 1
|
|
}
|
|
},
|
|
{
|
|
"repo": "bluesky-social/social-app",
|
|
"sha": "ea3d6827c75c2c2063bdb8d3240c62d8f041c7fa",
|
|
"ruleCounts": {
|
|
"react-doctor/plugin-update-trust-risk": 1,
|
|
"react-doctor/click-events-have-key-events": 2,
|
|
"react-doctor/no-static-element-interactions": 4,
|
|
"react-hooks-js/error-boundaries": 22,
|
|
"react-doctor/alt-text": 25,
|
|
"react-doctor/js-combine-iterations": 50,
|
|
"react-doctor/no-array-index-as-key": 33,
|
|
"react-doctor/prefer-module-scope-pure-function": 9,
|
|
"react-doctor/no-unknown-property": 4,
|
|
"react-doctor/rendering-svg-precision": 13,
|
|
"react-hooks-js/todo": 316,
|
|
"react-doctor/label-has-associated-control": 2,
|
|
"react-doctor/control-has-associated-label": 6,
|
|
"react-doctor/no-multi-comp": 13,
|
|
"react-doctor/no-autofocus": 2,
|
|
"react-doctor/button-has-type": 2,
|
|
"react-doctor/async-await-in-loop": 25,
|
|
"react-doctor/no-inline-exhaustive-style": 7,
|
|
"react-doctor/no-giant-component": 51,
|
|
"react-doctor/server-sequential-independent-await": 2,
|
|
"react-doctor/js-set-map-lookups": 32,
|
|
"react-doctor/rn-no-dimensions-get": 9,
|
|
"react-doctor/only-export-components": 155,
|
|
"react-doctor/react-compiler-no-manual-memoization": 1085,
|
|
"react-doctor/no-barrel-import": 16,
|
|
"react-doctor/require-pnpm-hardening": 4,
|
|
"react-doctor/jsx-max-depth": 3,
|
|
"react-hooks-js/hooks": 4,
|
|
"react-doctor/rn-prefer-expo-image": 4,
|
|
"react-doctor/rn-no-single-element-style-array": 1021,
|
|
"react-doctor/rendering-hoist-jsx": 1,
|
|
"react-doctor/aria-props": 5,
|
|
"react-doctor/no-pass-data-to-parent": 12,
|
|
"react-doctor/query-mutation-missing-invalidation": 29,
|
|
"react-doctor/jsx-key": 1,
|
|
"react-doctor/rerender-lazy-state-init": 14,
|
|
"react-hooks-js/immutability": 20,
|
|
"react-hooks-js/purity": 10,
|
|
"react-doctor/exhaustive-deps": 38,
|
|
"react-doctor/no-ref-current-in-render": 9,
|
|
"react-hooks-js/refs": 50,
|
|
"react-doctor/effect-needs-cleanup": 16,
|
|
"react-doctor/rn-prefer-pressable": 7,
|
|
"react-doctor/no-prop-callback-in-effect": 9,
|
|
"react-doctor/rn-no-scroll-state": 1,
|
|
"react-doctor/prefer-html-dialog": 1,
|
|
"react-doctor/no-derived-useState": 6,
|
|
"react-doctor/rn-prefer-reanimated": 20,
|
|
"react-doctor/rn-no-legacy-shadow-styles": 7,
|
|
"react-doctor/no-many-boolean-props": 11,
|
|
"react-doctor/no-effect-with-fresh-deps": 15,
|
|
"react-doctor/rerender-state-only-in-handlers": 2,
|
|
"react-doctor/media-has-caption": 1,
|
|
"react-doctor/advanced-event-handler-refs": 5,
|
|
"react-doctor/no-pass-live-state-to-parent": 6,
|
|
"react-doctor/no-tiny-text": 1,
|
|
"react-doctor/no-permanent-will-change": 1,
|
|
"react-doctor/no-usememo-simple-expression": 3,
|
|
"react-doctor/js-cache-property-access": 13,
|
|
"react-doctor/rn-style-prefer-boxshadow": 4,
|
|
"react-doctor/rerender-lazy-ref-init": 3,
|
|
"react-hooks-js/set-state-in-effect": 16,
|
|
"react-doctor/js-flatmap-filter": 6,
|
|
"react-hooks-js/preserve-manual-memoization": 4,
|
|
"react-doctor/js-index-maps": 2,
|
|
"react-doctor/no-chain-state-updates": 4,
|
|
"react-doctor/no-adjust-state-on-prop-change": 3,
|
|
"react-doctor/rn-scrollview-dynamic-padding": 1,
|
|
"react-doctor/no-derived-state-effect": 1,
|
|
"react-doctor/query-no-query-in-effect": 1,
|
|
"react-doctor/iframe-has-title": 1,
|
|
"react-doctor/iframe-missing-sandbox": 1,
|
|
"react-doctor/prefer-use-effect-event": 1,
|
|
"react-doctor/rn-no-scrollview-mapped-list": 1,
|
|
"react-doctor/rerender-memo-before-early-return": 1,
|
|
"react-doctor/no-fetch-in-effect": 1,
|
|
"react-doctor/no-reset-all-state-on-prop-change": 2,
|
|
"react-doctor/rn-scrollview-flex-in-content-container": 1
|
|
}
|
|
}
|
|
]
|
|
}
|