Executive summary
facebook/flow is rated At risk because critical security findings are open, most of them in the build pipeline. Its score is held back because two passwords or keys sit in the current code and we found no automated security scanning of the code, its secrets or its dependencies. It scores 47 out of 100, which the At risk rating leaves unchanged.
Production Readiness, at 38, is the weakest lens and counts most in the score. The best first step is replacing the two exposed passwords or keys and switching the old ones off, worth about 8 points. Recording design decisions comes next, worth about 3 points. Raising Production Readiness to 70 would lift the score to about 53.
Sixty-three pipeline tools are referenced by a changeable name, so the build pipeline can be tampered with. Forty-two known security holes in the packages the code depends on can be used by attackers, and two passwords or keys in the code and two in the code's history are open to anyone who can read the repository. Pinning each tool to an exact version, updating the vulnerable packages and replacing each exposed password or key would close these risks. Fixing the weaknesses the scanner points to would fix the two security weaknesses in the code, and the two places where the code runs text as code or as a command need a direct call instead. The two loops of files that import each other need breaking.
The product code is 555,471 lines, about €560,000 to rebuild.
If Production Readiness rose from 38 to 70, the lowest score rated Strong, the score would rise from 47 to about 53.
New since the last survey: 61 findings
- Secret Scanning · REDACTED
- Secret Scanning · REDACTED
- Boundary Type-Coupling · Cross-context type T (newtests → flow-dev-tools) packages/flow-dev-tools/flow-typed/node.js
- Boundary Type-Coupling · Cross-context type T (newtests → flow-dev-tools) packages/flow-dev-tools/flow-typed/node.js
- Boundary Type-Coupling · Cross-context type T (newtests → flow-dev-tools) packages/flow-dev-tools/flow-typed/node.js
- Boundary Type-Coupling · Cross-context type T (newtests → flow-dev-tools) packages/flow-dev-tools/flow-typed/node.js
- Static Analysis (SAST) · REDACTED
- Static Analysis (SAST) · REDACTED
- Static Analysis (SAST) · REDACTED
- Static Analysis (SAST) · REDACTED
- Static Analysis (SAST) · REDACTED
- Static Analysis (SAST) · REDACTED
- Static Analysis (SAST) · REDACTED
- Static Analysis (SAST) · REDACTED
- Static Analysis (SAST) · REDACTED
- Static Analysis (SAST) · REDACTED
- Static Analysis (SAST) · REDACTED
- Static Analysis (SAST) · REDACTED
- Static Analysis (SAST) · REDACTED
- Static Analysis (SAST) · REDACTED
- Static Analysis (SAST) · REDACTED
- Static Analysis (SAST) · REDACTED
- Dependency Vulnerabilities · REDACTED
- Dependency Vulnerabilities · REDACTED
- Dependency Vulnerabilities · REDACTED
- Change Coupling · Change coupling: lib.rs ↔ any_helpers.rs rust_port/crates/flow_typing_debug/src/lib.rs
- Change Coupling · Change-coupling hub: default_resolve.rs → lib.rs, any_helpers.rs, type_util.rs rust_port/crates/flow_typing_flow_js/src/default_resolve.rs
- Change Coupling · Change-coupling hub: misc.js → flowlib_contents.rs, tslib_contents.rs, flow-loader.js lib/misc.js
- Change Coupling · Change coupling: any_helpers.rs ↔ implicit_instantiation.rs rust_port/crates/flow_typing_flow_js/src/flow_js/any_helpers.rs
- Supply-chain Provenance & Signing · REDACTED
- Code Duplication · Duplicated block with local edits (54 matched lines × 2 locations) packages/flow-dev-tools/flow-typed/npm/glob_v7.x.x.js
- Code Duplication · Duplicated block (39 lines × 2 locations) packages/flow-dev-tools/flow-typed/node.js
- Code Duplication · Duplicated block (31 lines × 2 locations) packages/flow-dev-tools/flow-typed/node.js
- Code Duplication · Duplicated block (29 lines × 9 locations) lib/lib.es5.js
- Code Duplication · Duplicated block (28 lines × 2 locations) packages/flow-dev-tools/flow-typed/node.js
- Cyclomatic Complexity · Complex function transform (cyclomatic 45, cognitive 26) packages/flow-parser/oxidized-src/estree/StripFlowTypes.js
- Large Files · newtests/lsp/completion/test.js: 10474 lines of code newtests/lsp/completion/test.js
- Large Files · packages/flow-dev-tools/flow-typed/node.js: 5655 lines of code packages/flow-dev-tools/flow-typed/node.js
- Large Files · packages/flow-api-translator/src/flowDefToTSDef.js: 4609 lines of code packages/flow-api-translator/src/flowDefToTSDef.js
- Large Files · lib/lib.es5.js: 3607 lines of code lib/lib.es5.js
- Large Files · packages/flow-estree/src/types.js: 2149 lines of code packages/flow-estree/src/types.js
- Large Files · packages/flow-api-translator/src/flowToFlowDef.js: 2063 lines of code packages/flow-api-translator/src/flowToFlowDef.js
- Large Files · REDACTED: 1995 lines of code REDACTED
- Large Files · packages/flow-parser/oxidized-src/estree/TransformMatchSyntax.js: 972 lines of code packages/flow-parser/oxidized-src/estree/TransformMatchSyntax.js
- Large Files · packages/flow-eslint/src/scope-manager/referencer/Referencer.js: 918 lines of code packages/flow-eslint/src/scope-manager/referencer/Referencer.js
- Large Files · REDACTED: 451 lines of code REDACTED
- Large Files · packages/flow-eslint/src/scope-manager/referencer/TypeVisitor.js: 419 lines of code packages/flow-eslint/src/scope-manager/referencer/TypeVisitor.js
- Large Files · lib/lib.es2015.core.js: 412 lines of code lib/lib.es2015.core.js
- Dead Code · Dead file (~10479 LoC) newtests/lsp/completion/test.js
- Dead Code · Dead file (~6098 LoC) packages/flow-dev-tools/flow-typed/node.js
- Dead Code · Dead file (~279 LoC) lib/misc.js
- Dead Code · Dead file (~181 LoC) packages/scripts/transform/genTransformNodeTypes.js
- Dead Code · Dead file (~159 LoC) packages/flow-dev-tools/flow-typed/npm/chalk_v4.x.x.js
- Dependency Hygiene · Unlisted import 'source-map' REDACTED
- Circular Imports · Import cycle (2 files) packages/flow-remove-types/loader.mjs
- Web-Security Posture · Weak hash algorithm rust_port/crates/flow_common_socket/src/socket.rs
- Web-Security Posture · Weak hash algorithm rust_port/crates/flow_server_files/src/server_files_js.rs
- Web-Security Posture · Weak hash algorithm rust_port/crates/flow_server_files/src/server_files_js.rs
- Exception handling · Swallowed exception (caught, then discarded) scripts/add-specific-error-code.js
- Exception handling · Swallowed exception (empty catch) packages/flow-upgrade/src/runCodemods.js
- Exception handling · Swallowed exception (empty catch) packages/flow-for-vscode/src/FlowLanguageClient/FlowLanguageClient.ts
Fixed since the last survey: 1057 findings
- Explicit Debt · TodoComment rust_port/crates/flow_env_builder_resolver/src/name_resolver.rs
- Explicit Debt · TodoComment rust_port/crates/flow_typing_flow_js/src/flow_js/dispatch.rs
- Explicit Debt · TodoComment rust_port/crates/flow_typing_statement/src/statement.rs
- Explicit Debt · TodoComment rust_port/crates/flow_typing_statement/src/statement.rs
- Static Analysis (SAST) · Medium: REDACTED packages/flow-parser/oxidized-src/FlowParser.js
- Static Analysis (SAST) · Medium: REDACTED packages/flow-parser/oxidized-src/FlowParser.js
- Static Analysis (SAST) · Medium: REDACTED packages/flow-parser/oxidized-src/FlowParser.js
- Static Analysis (SAST) · Medium: REDACTED packages/flow-parser/oxidized-src/FlowParser.js
- Static Analysis (SAST) · Medium: REDACTED packages/flow-remove-types/register.js
- Dependency Vulnerabilities · High CVE: [GHSA redacted] REDACTED
- Dependency Vulnerabilities · High CVE: [GHSA redacted] REDACTED
- Dependency Vulnerabilities · Medium CVE: [GHSA redacted] REDACTED
- Dependency Vulnerabilities · Medium CVE: REDACTED REDACTED
- Dependency Vulnerabilities · Medium CVE: REDACTED REDACTED
- Dependency Vulnerabilities · Medium CVE: REDACTED REDACTED
- Dependency Vulnerabilities · Medium vulnerability: [GHSA redacted] REDACTED
- Change Coupling · Change coupling: lib.rs ↔ default_resolve.rs rust_port/crates/flow_typing_debug/src/lib.rs
- Supply-chain Provenance & Signing REDACTED
- Code Duplication · Duplicated block with local edits (59 matched lines × 2 locations) packages/flow-eslint/src/scope-manager/referencer/Referencer.js
- Code Duplication · Duplicated block with local edits (58 matched lines × 2 locations) packages/flow-dev-tools/flow-typed/npm/glob_v7.x.x.js
- Code Duplication · Duplicated block (40 lines × 9 locations) lib/lib.es5.js
- Code Duplication · Duplicated block with local edits (25 matched lines × 2 locations) evals/evals/01_error_fixing/error_003_unknown_type_refinement/ideal/main.js
- Code Duplication · Duplicated block with local edits (25 matched lines × 2 locations) evals/evals/04_ts_to_flow/hook_utilities_complex/ideal/main.js
- Code Duplication · Duplicated block (25 lines × 8 locations) lib/lib.es2023.array.js
- Code Duplication · Duplicated block with local edits (25 matched lines × 2 locations) newtests/lsp/queries/outline.js
- Code Duplication · Duplicated block (25 lines × 2 locations) newtests/lsp/wait_for_recheck/test.js
- Code Duplication · Duplicated block (24 lines × 2 locations) evals/evals/01_error_fixing/error_005_array_variance/ideal/main.js
- Code Duplication · Duplicated block (24 lines × 2 locations) evals/evals/01_error_fixing/error_023_interface_property_variance/ideal/main.js
- Code Duplication · Duplicated block (24 lines × 3 locations) newtests/lsp/signatureHelp/calls_monomorphic.js
- Code Duplication · Duplicated block (24 lines × 2 locations) packages/flow-api-translator/src/flowToFlowDef.js
- Code Duplication · Duplicated block (24 lines × 3 locations) packages/flow-dev-tools/flow-typed/npm/chalk_v4.x.x.js
- Code Duplication · Duplicated block (23 lines × 2 locations) REDACTED
- Code Duplication · Duplicated block (23 lines × 2 locations) newtests/lsp/queries/test.js
- Code Duplication · Duplicated block (23 lines × 2 locations) packages/flow-api-translator/src/flowDefToTSDef.js
- Code Duplication · Duplicated block (22 lines × 2 locations) packages/flow-api-translator/src/flowDefToTSDef.js
- Code Duplication · Duplicated block (22 lines × 2 locations) packages/flow-eslint/src/scope-manager/referencer/Referencer.js
- Code Duplication · Duplicated block (22 lines × 2 locations) packages/flow-eslint/src/scope-manager/scope/ComponentScope.js
- Code Duplication · Duplicated block (21 lines × 2 locations) evals/evals/04_ts_to_flow/mapped_generic_props_factories/ideal/main.js
- Code Duplication · Duplicated block (21 lines × 2 locations) evals/evals/04_ts_to_flow/utility_type_mappings_keys_values/ideal/main.js
- Code Duplication · Duplicated block (21 lines × 11 locations) lib/lib.es2020.bigint.js
- Code Duplication · Duplicated block (21 lines × 2 locations) newtests/lsp/wait_for_recheck/test.js
- Code Duplication · Duplicated block (21 lines × 2 locations) REDACTED
- Code Duplication · Duplicated block (21 lines × 2 locations) packages/flow-parser/oxidized-src/estree/StripFlowTypesForBabel.js
- Code Duplication · Duplicated block (21 lines × 2 locations) packages/flow-transform/src/traverse/NodeEventGenerator.js
- Code Duplication · Duplicated block (21 lines × 2 locations) packages/flow-typed/jest.js
- Code Duplication · Duplicated block (20 lines × 2 locations) evals/evals/04_ts_to_flow/anonymous_interface_param/ideal/main.js
- Code Duplication · Duplicated block (20 lines × 2 locations) evals/evals/04_ts_to_flow/class_implements_utility_to_interface/ideal/main.js
- Code Duplication · Duplicated block (20 lines × 2 locations) evals/evals/04_ts_to_flow/variance_advanced/ideal/main.js
- Code Duplication · Duplicated block (20 lines × 2 locations) packages/flow-parser/oxidized-src/FlowParser.js
- Code Duplication · Duplicated block (19 lines × 2 locations) evals/evals/04_ts_to_flow/as_const_assertions/ideal/main.js
- Code Duplication · Duplicated block (19 lines × 4 locations) lib/lib.es2023.array.js
- Code Duplication · Duplicated block (19 lines × 2 locations) newtests/lsp/documentHighlight/test.js
- Code Duplication · Duplicated block (19 lines × 2 locations) packages/flow-api-translator/src/flowDefToTSDef.js
- Code Duplication · Duplicated block (19 lines × 2 locations) packages/flow-api-translator/src/flowToFlowDef.js
- Code Duplication · Duplicated block (19 lines × 2 locations) packages/flow-typed/jest.js
- Code Duplication · Duplicated block (19 lines × 2 locations) packages/flow-typed/jest.js
- Code Duplication · Duplicated block (18 lines × 3 locations) newtests/lsp/documentHighlight/test.js
- Code Duplication · Duplicated block (18 lines × 2 locations) packages/flow-api-translator/src/flowDefToTSDef.js
- Code Duplication · Duplicated block (18 lines × 2 locations) packages/flow-transform/src/transform/comments/prettier/language-js/comments.js
- Code Duplication · Duplicated block (17 lines × 2 locations) evals/evals/01_error_fixing/error_004_exact_objects_extra_props/ideal/main.js
- Code Duplication · Duplicated block (17 lines × 2 locations) evals/evals/01_error_fixing/error_006_generic_bounds/ideal/main.js
- Code Duplication · Duplicated block (17 lines × 3 locations) packages/flow-api-translator/src/flowDefToTSDef.js
- Code Duplication · Duplicated block (17 lines × 2 locations) packages/flow-api-translator/src/flowDefToTSDef.js
- Code Duplication · Duplicated block (17 lines × 2 locations) packages/flow-api-translator/src/flowDefToTSDef.js
- Code Duplication · Duplicated block (17 lines × 2 locations) packages/flow-api-translator/src/flowDefToTSDef.js
- Code Duplication · Duplicated block (17 lines × 2 locations) packages/flow-api-translator/src/flowToFlowDef.js
- Code Duplication · Duplicated block (17 lines × 2 locations) packages/flow-api-translator/src/flowToFlowDef.js
- Code Duplication · Duplicated block (17 lines × 2 locations) packages/flow-typed/jest.js
- Code Duplication · Duplicated block (17 lines × 2 locations) packages/scripts/transform/genTransformCloneTypes.js
- Code Duplication · Duplicated block (16 lines × 2 locations) evals/evals/01_error_fixing/error_009_react_props/ideal/main.js
- Code Duplication · Duplicated block (16 lines × 2 locations) evals/evals/01_error_fixing/error_026_asymmetric_subtyping/ideal/main.js
- Code Duplication · Duplicated block (16 lines × 2 locations) evals/evals/02_unique_features/match_021_instance_pattern_union/ideal/main.js
- Code Duplication · Duplicated block (16 lines × 2 locations) evals/evals/04_ts_to_flow/asymmetric_subtyping_kinds/ideal/main.js
- Code Duplication · Duplicated block with local edits (16 matched lines × 2 locations) evals/evals/04_ts_to_flow/component_props_element_ref/ideal/main.js
- Code Duplication · Duplicated block (16 lines × 2 locations) newtests/lsp/connection/test.js
- Code Duplication · Duplicated block (16 lines × 4 locations) newtests/lsp/documentHighlight/test.js
- Code Duplication · Duplicated block (16 lines × 3 locations) newtests/lsp/queries/test.js
- Code Duplication · Duplicated block (16 lines × 2 locations) packages/flow-api-translator/src/flowDefToTSDef.js
- Code Duplication · Duplicated block (16 lines × 2 locations) packages/flow-api-translator/src/flowToFlowDef.js
- Code Duplication · Duplicated block (16 lines × 4 locations) packages/flow-upgrade/flow-typed/npm/fs-extra_v10.x.x.js
- Code Duplication · Duplicated block (15 lines × 2 locations) evals/evals/01_error_fixing/error_027_interface_spread/ideal/main.js
- Code Duplication · Duplicated block (15 lines × 2 locations) evals/evals/01_error_fixing/error_030_this_type_variance/ideal/main.js
- Code Duplication · Duplicated block (15 lines × 2 locations) evals/evals/02_unique_features/react_util_001_element_type/ideal/main.js
- Code Duplication · Duplicated block (15 lines × 2 locations) evals/evals/04_ts_to_flow/intersection_function_overloads/ideal/main.js
- Code Duplication · Duplicated block (15 lines × 3 locations) newtests/lsp/completion/autoimports/test.js
- Code Duplication · Duplicated block (15 lines × 2 locations) newtests/lsp/completion/autoimports/test.js
- Code Duplication · Duplicated block (15 lines × 3 locations) packages/flow-eslint/src/scope-manager/referencer/Referencer.js
- Code Duplication · Duplicated block (15 lines × 9 locations) packages/flow-eslint/src/scope-manager/scope/BlockScope.js
- Code Duplication · Duplicated block (15 lines × 3 locations) packages/flow-upgrade/flow-typed/npm/semver_v7.x.x.js
- Code Duplication · Duplicated block with local edits (14 matched lines × 2 locations) evals/evals/02_unique_features/component_013_nested_component/ideal/main.js
- Code Duplication · Duplicated block (14 lines × 2 locations) evals/evals/04_ts_to_flow/opaque_type_branding/ideal/main.js
- Code Duplication · Duplicated block (14 lines × 2 locations) evals/evals/04_ts_to_flow/utility_types_filter_collections/ideal/main.js
- Code Duplication · Duplicated block (14 lines × 2 locations) evals/evals/05_code_generation/modernize_007_readonly_collections/ideal/main.js
- Code Duplication · Duplicated block (14 lines × 5 locations) packages/flow-eslint/src/scope-manager/scope/BlockScope.js
- Code Duplication · Duplicated block (14 lines × 2 locations) packages/flow-eslint/src/scope-manager/scope/ClassScope.js
- Code Duplication · Duplicated block (14 lines × 2 locations) packages/flow-eslint/src/scope-manager/scope/ScopeBase.js
- Code Duplication · Duplicated block (13 lines × 2 locations) evals/evals/01_error_fixing/error_001_refinement_invalidation/ideal/main.js
- Code Duplication · Duplicated block with local edits (13 matched lines × 2 locations) evals/evals/01_error_fixing/error_008_indexer_access/ideal/main.js
- Code Duplication · Duplicated block (13 lines × 2 locations) evals/evals/01_error_fixing/error_015_recursive_return_annot/ideal/main.js
- Code Duplication · Duplicated block (13 lines × 2 locations) evals/evals/01_error_fixing/error_027_interface_spread/ideal/main.js
Rebuild cost: about €560,000 · Estimate
| Cost to rebuild | €190,000 to €940,000, for 3,111 to 9,868 hours of work, about 3.9 person-years for 2 to 8 engineers |
|---|---|
| Difficulty of the problem | Standard, judged from the kind of software and how it is built. Code that solves a harder problem, such as payments or medical bookings, costs more per line to write. |
| Quality factor | ×0.7 at a score of 47. Better code takes more work to write, so the factor is ×1.0 at a score of 70, lower below it and higher above it. |
| Size | Very large: 555,471 lines of product code |
| What it is not | Not a quotation: nobody has offered to build it for that. Not a valuation: it says nothing about what the business is worth. Not a certified figure: no professional has signed it as one. |
Top priorities
Diagnosis: what the measurements show together
Architecture: which parts of the code depend on which
| uses → | 1 evals.evals.02_unique_features.enum_005_isvalid_valueof.ideal.main | 2 evals.evals.02_unique_features.match_018_invariant_throw.ideal.main | 3 evals.evals.04_ts_to_flow.opaque_type_branding.input.source | 4 lib.lib_es2015_iterable | 5 newtests.lsp.queries.hover_refs | 6 newtests.lsp.queries.outline | 7 packages.flow-eslint.src.scope-manager.definition.DefinitionBase | 8 packages.flow-eslint.src.scope-manager.scope.Scope | 9 packages.flow-for-vscode.src.utils.LanguageClient.types | 10 evals.evals.04_ts_to_flow.function_overloads_advanced.input.source | 11 lib.lib_es2015_collection | 12 lib.lib_es2015_core | 13 packages.flow-eslint.src.scope-manager.referencer.Reference | 14 evals.evals.04_ts_to_flow.function_overloads_advanced.ideal | 15 lib.lib_es5 | 16 packages.flow-api-translator.src.utils.ts-estree-ast-types | 17 packages.flow-typed.prettier | 18 lib.react | 19 packages.flow-dev-tools.flow-typed.node | 20 packages.flow-eslint.src.scope-manager.variable.VariableBase | 21 packages.flow-estree.src.types | 22 packages.flow-for-vscode.src.FlowLanguageClient.FlowLanguageClient | 23 packages.flow-for-vscode.src.utils.LanguageClient.StatusFeature.StatusProvider | 24 packages.flow-transform.src.transform | 25 packages.flow-api-translator.src.TSDefToFlowDef | 26 packages.flow-eslint.src.scope-manager.referencer.Visitor | 27 packages.flow-eslint.src.scope-manager.variable.Variable | 28 packages.flow-for-vscode.src.FlowClients | 29 packages.flow-parser.oxidized-src.estree | 30 packages.flow-transform.src.transform.comments | 31 packages.flow-transform.src.transform.mutations | 32 packages.flow-eslint.src.scope-manager.scope.ScopeBase | 33 packages.flow-for-vscode.src.FlowLanguageClient | 34 packages.flow-eslint.src.scope-manager.scope.ComponentScope | 35 packages.flow-eslint.src.scope-manager.scope.FunctionScope | 36 packages.flow-eslint.src.scope-manager.scope.HookScope | 37 packages.flow-eslint.src.scope-manager.ScopeManager | 38 packages.flow-api-translator.src | 39 packages.flow-eslint.src.scope-manager.referencer.Referencer | 40 packages.flow-transform.src.traverse |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 evals.evals.02_unique_features.enum_005_isvalid_valueof.ideal.main | ||||||||||||||||||||||||||||||||||||||||
| 2 evals.evals.02_unique_features.match_018_invariant_throw.ideal.main | ||||||||||||||||||||||||||||||||||||||||
| 3 evals.evals.04_ts_to_flow.opaque_type_branding.input.source | ||||||||||||||||||||||||||||||||||||||||
| 4 lib.lib_es2015_iterable | ||||||||||||||||||||||||||||||||||||||||
| 5 newtests.lsp.queries.hover_refs | ||||||||||||||||||||||||||||||||||||||||
| 6 newtests.lsp.queries.outline | ||||||||||||||||||||||||||||||||||||||||
| 7 packages.flow-eslint.src.scope-manager.definition.DefinitionBase | ||||||||||||||||||||||||||||||||||||||||
| 8 packages.flow-eslint.src.scope-manager.scope.Scope | ||||||||||||||||||||||||||||||||||||||||
| 9 packages.flow-for-vscode.src.utils.LanguageClient.types | ||||||||||||||||||||||||||||||||||||||||
| 10 evals.evals.04_ts_to_flow.function_overloads_advanced.input.source | 1 | |||||||||||||||||||||||||||||||||||||||
| 11 lib.lib_es2015_collection | 3 | |||||||||||||||||||||||||||||||||||||||
| 12 lib.lib_es2015_core | 1 | |||||||||||||||||||||||||||||||||||||||
| 13 packages.flow-eslint.src.scope-manager.referencer.Reference | 1 | |||||||||||||||||||||||||||||||||||||||
| 14 evals.evals.04_ts_to_flow.function_overloads_advanced.ideal | 1 | 1 | 1 | 1 | 1 | |||||||||||||||||||||||||||||||||||
| 15 lib.lib_es5 | 9 | 4 | 9 | |||||||||||||||||||||||||||||||||||||
| 16 packages.flow-api-translator.src.utils.ts-estree-ast-types | 1 | 48 | ||||||||||||||||||||||||||||||||||||||
| 17 packages.flow-typed.prettier | 1 | 1 | ||||||||||||||||||||||||||||||||||||||
| 18 lib.react | 1 | 1 | ||||||||||||||||||||||||||||||||||||||
| 19 packages.flow-dev-tools.flow-typed.node | 7 | 5 | 2 | 28 | 23 | |||||||||||||||||||||||||||||||||||
| 20 packages.flow-eslint.src.scope-manager.variable.VariableBase | 2 | 2 | 2 | 2 | ||||||||||||||||||||||||||||||||||||
| 21 packages.flow-estree.src.types | 1 | 57 | 163 | |||||||||||||||||||||||||||||||||||||
| 22 packages.flow-for-vscode.src.FlowLanguageClient.FlowLanguageClient | 1 | 1 | 2 | 1 | ||||||||||||||||||||||||||||||||||||
| 23 packages.flow-for-vscode.src.utils.LanguageClient.StatusFeature.StatusProvider | 1 | 1 | 1 | |||||||||||||||||||||||||||||||||||||
| 24 packages.flow-transform.src.transform | 1 | 1 | 2 | 1 | ||||||||||||||||||||||||||||||||||||
| 25 packages.flow-api-translator.src.TSDefToFlowDef | 2 | 51 | 40 | |||||||||||||||||||||||||||||||||||||
| 26 packages.flow-eslint.src.scope-manager.referencer.Visitor | 1 | |||||||||||||||||||||||||||||||||||||||
| 27 packages.flow-eslint.src.scope-manager.variable.Variable | 1 | |||||||||||||||||||||||||||||||||||||||
| 28 packages.flow-for-vscode.src.FlowClients | 1 | 1 | 2 | 1 | ||||||||||||||||||||||||||||||||||||
| 29 packages.flow-parser.oxidized-src.estree | 1 | 1 | 4 | 19 | 1 | 29 | ||||||||||||||||||||||||||||||||||
| 30 packages.flow-transform.src.transform.comments | 1 | 1 | 2 | 1 | ||||||||||||||||||||||||||||||||||||
| 31 packages.flow-transform.src.transform.mutations | 1 | 2 | 1 | 1 | 6 | |||||||||||||||||||||||||||||||||||
| 32 packages.flow-eslint.src.scope-manager.scope.ScopeBase | 1 | 2 | 1 | 1 | 1 | 1 | ||||||||||||||||||||||||||||||||||
| 33 packages.flow-for-vscode.src.FlowLanguageClient | 2 | 1 | 2 | 2 | ||||||||||||||||||||||||||||||||||||
| 34 packages.flow-eslint.src.scope-manager.scope.ComponentScope | 1 | 1 | 1 | 1 | ||||||||||||||||||||||||||||||||||||
| 35 packages.flow-eslint.src.scope-manager.scope.FunctionScope | 1 | 1 | 1 | 1 | ||||||||||||||||||||||||||||||||||||
| 36 packages.flow-eslint.src.scope-manager.scope.HookScope | 1 | 1 | 1 | 1 | ||||||||||||||||||||||||||||||||||||
| 37 packages.flow-eslint.src.scope-manager.ScopeManager | 1 | 1 | 1 | 2 | 1 | 1 | 1 | 1 | 1 | |||||||||||||||||||||||||||||||
| 38 packages.flow-api-translator.src | 2 | 1 | 1 | 9 | 1 | 4 | ||||||||||||||||||||||||||||||||||
| 39 packages.flow-eslint.src.scope-manager.referencer.Referencer | 1 | 39 | 32 | 1 | 1 | |||||||||||||||||||||||||||||||||||
| 40 packages.flow-transform.src.traverse | 2 | 1 | 1 | 1 | 1 |
10→5 evals.evals.04_ts_to_flow.function_overloads_advanced.input.source uses newtests.lsp.queries.hover_refs✕
- Connections
- 1 pair of types, where a type in evals.evals.04_ts_to_flow.function_overloads_advanced.input.source uses a type in newtests.lsp.queries.hover_refs.
- The types involved
evals.evals.04_ts_to_flow.function_overloads_advanced.input.source.Box→newtests.lsp.queries.hover_refs.T
- Direction
- evals.evals.04_ts_to_flow.function_overloads_advanced.input.source uses newtests.lsp.queries.hover_refs, so a change to newtests.lsp.queries.hover_refs can break evals.evals.04_ts_to_flow.function_overloads_advanced.input.source, while a change to evals.evals.04_ts_to_flow.function_overloads_advanced.input.source can't break newtests.lsp.queries.hover_refs.
- Position
- Below the diagonal: evals.evals.04_ts_to_flow.function_overloads_advanced.input.source uses a module listed above it, which is the healthy direction.
11→5 lib.lib_es2015_collection uses newtests.lsp.queries.hover_refs✕
- Connections
- 3 pairs of types, where a type in lib.lib_es2015_collection uses a type in newtests.lsp.queries.hover_refs.
- The types involved
lib.lib_es2015_collection.ReadonlySet→newtests.lsp.queries.hover_refs.Tlib.lib_es2015_collection.Set→newtests.lsp.queries.hover_refs.Tlib.lib_es2015_collection.WeakSet→newtests.lsp.queries.hover_refs.T
- Direction
- lib.lib_es2015_collection uses newtests.lsp.queries.hover_refs, so a change to newtests.lsp.queries.hover_refs can break lib.lib_es2015_collection, while a change to lib.lib_es2015_collection can't break newtests.lsp.queries.hover_refs.
- Position
- Below the diagonal: lib.lib_es2015_collection uses a module listed above it, which is the healthy direction.
12→5 lib.lib_es2015_core uses newtests.lsp.queries.hover_refs✕
- Connections
- 1 pair of types, where a type in lib.lib_es2015_core uses a type in newtests.lsp.queries.hover_refs.
- The types involved
lib.lib_es2015_core.Array→newtests.lsp.queries.hover_refs.T
- Direction
- lib.lib_es2015_core uses newtests.lsp.queries.hover_refs, so a change to newtests.lsp.queries.hover_refs can break lib.lib_es2015_core, while a change to lib.lib_es2015_core can't break newtests.lsp.queries.hover_refs.
- Position
- Below the diagonal: lib.lib_es2015_core uses a module listed above it, which is the healthy direction.
13→8 packages.flow-eslint.src.scope-manager.referencer.Reference uses packages.flow-eslint.src.scope-manager.scope.Scope✕
- Connections
- 1 pair of types, where a type in packages.flow-eslint.src.scope-manager.referencer.Reference uses a type in packages.flow-eslint.src.scope-manager.scope.Scope.
- The types involved
packages.flow-eslint.src.scope-manager.referencer.Reference.Reference→packages.flow-eslint.src.scope-manager.scope.Scope.Scope
- Direction
- packages.flow-eslint.src.scope-manager.referencer.Reference uses packages.flow-eslint.src.scope-manager.scope.Scope, so a change to packages.flow-eslint.src.scope-manager.scope.Scope can break packages.flow-eslint.src.scope-manager.referencer.Reference, while a change to packages.flow-eslint.src.scope-manager.referencer.Reference can't break packages.flow-eslint.src.scope-manager.scope.Scope.
- Position
- Below the diagonal: packages.flow-eslint.src.scope-manager.referencer.Reference uses a module listed above it, which is the healthy direction.
14→1 evals.evals.04_ts_to_flow.function_overloads_advanced.ideal uses evals.evals.02_unique_features.enum_005_isvalid_valueof.ideal.main✕
- Connections
- 1 pair of types, where a type in evals.evals.04_ts_to_flow.function_overloads_advanced.ideal uses a type in evals.evals.02_unique_features.enum_005_isvalid_valueof.ideal.main.
- The types involved
evals.evals.04_ts_to_flow.function_overloads_advanced.ideal.main→evals.evals.02_unique_features.enum_005_isvalid_valueof.ideal.main.Theme
- Direction
- evals.evals.04_ts_to_flow.function_overloads_advanced.ideal uses evals.evals.02_unique_features.enum_005_isvalid_valueof.ideal.main, so a change to evals.evals.02_unique_features.enum_005_isvalid_valueof.ideal.main can break evals.evals.04_ts_to_flow.function_overloads_advanced.ideal, while a change to evals.evals.04_ts_to_flow.function_overloads_advanced.ideal can't break evals.evals.02_unique_features.enum_005_isvalid_valueof.ideal.main.
- Position
- Below the diagonal: evals.evals.04_ts_to_flow.function_overloads_advanced.ideal uses a module listed above it, which is the healthy direction.
14→5 evals.evals.04_ts_to_flow.function_overloads_advanced.ideal uses newtests.lsp.queries.hover_refs✕
- Connections
- 1 pair of types, where a type in evals.evals.04_ts_to_flow.function_overloads_advanced.ideal uses a type in newtests.lsp.queries.hover_refs.
- The types involved
evals.evals.04_ts_to_flow.function_overloads_advanced.ideal.main→newtests.lsp.queries.hover_refs.T
- Direction
- evals.evals.04_ts_to_flow.function_overloads_advanced.ideal uses newtests.lsp.queries.hover_refs, so a change to newtests.lsp.queries.hover_refs can break evals.evals.04_ts_to_flow.function_overloads_advanced.ideal, while a change to evals.evals.04_ts_to_flow.function_overloads_advanced.ideal can't break newtests.lsp.queries.hover_refs.
- Position
- Below the diagonal: evals.evals.04_ts_to_flow.function_overloads_advanced.ideal uses a module listed above it, which is the healthy direction.
14→10 evals.evals.04_ts_to_flow.function_overloads_advanced.ideal uses evals.evals.04_ts_to_flow.function_overloads_advanced.input.source✕
- Connections
- 1 pair of types, where a type in evals.evals.04_ts_to_flow.function_overloads_advanced.ideal uses a type in evals.evals.04_ts_to_flow.function_overloads_advanced.input.source.
- The types involved
evals.evals.04_ts_to_flow.function_overloads_advanced.ideal.main→evals.evals.04_ts_to_flow.function_overloads_advanced.input.source.Box
- Direction
- evals.evals.04_ts_to_flow.function_overloads_advanced.ideal uses evals.evals.04_ts_to_flow.function_overloads_advanced.input.source, so a change to evals.evals.04_ts_to_flow.function_overloads_advanced.input.source can break evals.evals.04_ts_to_flow.function_overloads_advanced.ideal, while a change to evals.evals.04_ts_to_flow.function_overloads_advanced.ideal can't break evals.evals.04_ts_to_flow.function_overloads_advanced.input.source.
- Position
- Below the diagonal: evals.evals.04_ts_to_flow.function_overloads_advanced.ideal uses a module listed above it, which is the healthy direction.
14→11 evals.evals.04_ts_to_flow.function_overloads_advanced.ideal uses lib.lib_es2015_collection✕
- Connections
- 1 pair of types, where a type in evals.evals.04_ts_to_flow.function_overloads_advanced.ideal uses a type in lib.lib_es2015_collection.
- The types involved
evals.evals.04_ts_to_flow.function_overloads_advanced.ideal.main→lib.lib_es2015_collection.Map
- Direction
- evals.evals.04_ts_to_flow.function_overloads_advanced.ideal uses lib.lib_es2015_collection, so a change to lib.lib_es2015_collection can break evals.evals.04_ts_to_flow.function_overloads_advanced.ideal, while a change to evals.evals.04_ts_to_flow.function_overloads_advanced.ideal can't break lib.lib_es2015_collection.
- Position
- Below the diagonal: evals.evals.04_ts_to_flow.function_overloads_advanced.ideal uses a module listed above it, which is the healthy direction.
14→12 evals.evals.04_ts_to_flow.function_overloads_advanced.ideal uses lib.lib_es2015_core✕
- Connections
- 1 pair of types, where a type in evals.evals.04_ts_to_flow.function_overloads_advanced.ideal uses a type in lib.lib_es2015_core.
- The types involved
evals.evals.04_ts_to_flow.function_overloads_advanced.ideal.main→lib.lib_es2015_core.ReadonlyArray
- Direction
- evals.evals.04_ts_to_flow.function_overloads_advanced.ideal uses lib.lib_es2015_core, so a change to lib.lib_es2015_core can break evals.evals.04_ts_to_flow.function_overloads_advanced.ideal, while a change to evals.evals.04_ts_to_flow.function_overloads_advanced.ideal can't break lib.lib_es2015_core.
- Position
- Below the diagonal: evals.evals.04_ts_to_flow.function_overloads_advanced.ideal uses a module listed above it, which is the healthy direction.
15→4 lib.lib_es5 uses lib.lib_es2015_iterable✕
- Connections
- 9 pairs of types, where a type in lib.lib_es5 uses a type in lib.lib_es2015_iterable.
- The types involved
lib.lib_es5.Float32Array→lib.lib_es2015_iterable.Float32Arraylib.lib_es5.Float64Array→lib.lib_es2015_iterable.Float64Arraylib.lib_es5.Int16Array→lib.lib_es2015_iterable.Int16Arraylib.lib_es5.Int32Array→lib.lib_es2015_iterable.Int32Arraylib.lib_es5.Int8Array→lib.lib_es2015_iterable.Int8Arraylib.lib_es5.Uint16Array→lib.lib_es2015_iterable.Uint16Arraylib.lib_es5.Uint32Array→lib.lib_es2015_iterable.Uint32Arraylib.lib_es5.Uint8Array→lib.lib_es2015_iterable.Uint8Arraylib.lib_es5.Uint8ClampedArray→lib.lib_es2015_iterable.Uint8ClampedArray
- Direction
- lib.lib_es5 uses lib.lib_es2015_iterable, so a change to lib.lib_es2015_iterable can break lib.lib_es5, while a change to lib.lib_es5 can't break lib.lib_es2015_iterable.
- Position
- Below the diagonal: lib.lib_es5 uses a module listed above it, which is the healthy direction.
15→5 lib.lib_es5 uses newtests.lsp.queries.hover_refs✕
- Connections
- 4 pairs of types, where a type in lib.lib_es5 uses a type in newtests.lsp.queries.hover_refs.
- The types involved
lib.lib_es5.Array→newtests.lsp.queries.hover_refs.Tlib.lib_es5.Object→newtests.lsp.queries.hover_refs.Tlib.lib_es5.ReadonlyArray→newtests.lsp.queries.hover_refs.Tlib.lib_es5.TypedPropertyDescriptor→newtests.lsp.queries.hover_refs.T
- Direction
- lib.lib_es5 uses newtests.lsp.queries.hover_refs, so a change to newtests.lsp.queries.hover_refs can break lib.lib_es5, while a change to lib.lib_es5 can't break newtests.lsp.queries.hover_refs.
- Position
- Below the diagonal: lib.lib_es5 uses a module listed above it, which is the healthy direction.
15→12 lib.lib_es5 uses lib.lib_es2015_core✕
- Connections
- 9 pairs of types, where a type in lib.lib_es5 uses a type in lib.lib_es2015_core.
- The types involved
lib.lib_es5.Array→lib.lib_es2015_core.Arraylib.lib_es5.Array→lib.lib_es2015_core.ReadonlyArraylib.lib_es5.Object→lib.lib_es2015_core.Arraylib.lib_es5.Object→lib.lib_es2015_core.Stringlib.lib_es5.ReadonlyArray→lib.lib_es2015_core.Arraylib.lib_es5.RegExp→lib.lib_es2015_core.RegExplib.lib_es5.RegExpConstructor→lib.lib_es2015_core.RegExplib.lib_es5.StringConstructor→lib.lib_es2015_core.Stringlib.lib_es5.TaggedTemplateLiteralArray→lib.lib_es2015_core.ReadonlyArray
- Direction
- lib.lib_es5 uses lib.lib_es2015_core, so a change to lib.lib_es2015_core can break lib.lib_es5, while a change to lib.lib_es5 can't break lib.lib_es2015_core.
- Position
- Below the diagonal: lib.lib_es5 uses a module listed above it, which is the healthy direction.
16→2 packages.flow-api-translator.src.utils.ts-estree-ast-types uses evals.evals.02_unique_features.match_018_invariant_throw.ideal.main✕
- Connections
- 1 pair of types, where a type in packages.flow-api-translator.src.utils.ts-estree-ast-types uses a type in evals.evals.02_unique_features.match_018_invariant_throw.ideal.main.
- The types involved
packages.flow-api-translator.src.utils.ts-estree-ast-types.Program→evals.evals.02_unique_features.match_018_invariant_throw.ideal.main.Token
- Direction
- packages.flow-api-translator.src.utils.ts-estree-ast-types uses evals.evals.02_unique_features.match_018_invariant_throw.ideal.main, so a change to evals.evals.02_unique_features.match_018_invariant_throw.ideal.main can break packages.flow-api-translator.src.utils.ts-estree-ast-types, while a change to packages.flow-api-translator.src.utils.ts-estree-ast-types can't break evals.evals.02_unique_features.match_018_invariant_throw.ideal.main.
- Position
- Below the diagonal: packages.flow-api-translator.src.utils.ts-estree-ast-types uses a module listed above it, which is the healthy direction.
16→12 packages.flow-api-translator.src.utils.ts-estree-ast-types uses lib.lib_es2015_core✕
- Connections
- 48 pairs of types, where a type in packages.flow-api-translator.src.utils.ts-estree-ast-types uses a type in lib.lib_es2015_core. Showing 25 of them; the rest are in namespace-graph.json in this report's bundle.
- The types involved
packages.flow-api-translator.src.utils.ts-estree-ast-types.ArrayExpression→lib.lib_es2015_core.ReadonlyArraypackages.flow-api-translator.src.utils.ts-estree-ast-types.ArrayPattern→lib.lib_es2015_core.ReadonlyArraypackages.flow-api-translator.src.utils.ts-estree-ast-types.ArrowFunctionExpression→lib.lib_es2015_core.ReadonlyArraypackages.flow-api-translator.src.utils.ts-estree-ast-types.AssignmentPattern→lib.lib_es2015_core.ReadonlyArraypackages.flow-api-translator.src.utils.ts-estree-ast-types.BlockStatement→lib.lib_es2015_core.ReadonlyArraypackages.flow-api-translator.src.utils.ts-estree-ast-types.CallExpression→lib.lib_es2015_core.ReadonlyArraypackages.flow-api-translator.src.utils.ts-estree-ast-types.ClassBase→lib.lib_es2015_core.ReadonlyArraypackages.flow-api-translator.src.utils.ts-estree-ast-types.ClassBody→lib.lib_es2015_core.ReadonlyArraypackages.flow-api-translator.src.utils.ts-estree-ast-types.ExportAllDeclaration→lib.lib_es2015_core.ReadonlyArraypackages.flow-api-translator.src.utils.ts-estree-ast-types.ExportNamedDeclarationBase→lib.lib_es2015_core.ReadonlyArraypackages.flow-api-translator.src.utils.ts-estree-ast-types.ExportNamedDeclarationWithSource→lib.lib_es2015_core.ReadonlyArraypackages.flow-api-translator.src.utils.ts-estree-ast-types.ExportNamedDeclarationWithoutSourceWithMultiple→lib.lib_es2015_core.ReadonlyArraypackages.flow-api-translator.src.utils.ts-estree-ast-types.ExportNamedDeclarationWithoutSourceWithSingle→lib.lib_es2015_core.ReadonlyArraypackages.flow-api-translator.src.utils.ts-estree-ast-types.FunctionBase→lib.lib_es2015_core.ReadonlyArraypackages.flow-api-translator.src.utils.ts-estree-ast-types.Identifier→lib.lib_es2015_core.ReadonlyArraypackages.flow-api-translator.src.utils.ts-estree-ast-types.ImportDeclaration→lib.lib_es2015_core.ReadonlyArraypackages.flow-api-translator.src.utils.ts-estree-ast-types.JSXElement→lib.lib_es2015_core.ReadonlyArraypackages.flow-api-translator.src.utils.ts-estree-ast-types.JSXFragment→lib.lib_es2015_core.ReadonlyArraypackages.flow-api-translator.src.utils.ts-estree-ast-types.JSXOpeningElement→lib.lib_es2015_core.ReadonlyArraypackages.flow-api-translator.src.utils.ts-estree-ast-types.MethodDefinitionBase→lib.lib_es2015_core.ReadonlyArraypackages.flow-api-translator.src.utils.ts-estree-ast-types.NewExpression→lib.lib_es2015_core.ReadonlyArraypackages.flow-api-translator.src.utils.ts-estree-ast-types.ObjectExpression→lib.lib_es2015_core.ReadonlyArraypackages.flow-api-translator.src.utils.ts-estree-ast-types.ObjectPattern→lib.lib_es2015_core.ReadonlyArraypackages.flow-api-translator.src.utils.ts-estree-ast-types.Program→lib.lib_es2015_core.ReadonlyArraypackages.flow-api-translator.src.utils.ts-estree-ast-types.PropertyDefinitionBase→lib.lib_es2015_core.ReadonlyArray
- Direction
- packages.flow-api-translator.src.utils.ts-estree-ast-types uses lib.lib_es2015_core, so a change to lib.lib_es2015_core can break packages.flow-api-translator.src.utils.ts-estree-ast-types, while a change to packages.flow-api-translator.src.utils.ts-estree-ast-types can't break lib.lib_es2015_core.
- Position
- Below the diagonal: packages.flow-api-translator.src.utils.ts-estree-ast-types uses a module listed above it, which is the healthy direction.
17→5 packages.flow-typed.prettier uses newtests.lsp.queries.hover_refs✕
- Connections
- 1 pair of types, where a type in packages.flow-typed.prettier uses a type in newtests.lsp.queries.hover_refs.
- The types involved
packages.flow-typed.prettier.AstPath→newtests.lsp.queries.hover_refs.T
- Direction
- packages.flow-typed.prettier uses newtests.lsp.queries.hover_refs, so a change to newtests.lsp.queries.hover_refs can break packages.flow-typed.prettier, while a change to packages.flow-typed.prettier can't break newtests.lsp.queries.hover_refs.
- Position
- Below the diagonal: packages.flow-typed.prettier uses a module listed above it, which is the healthy direction.
17→12 packages.flow-typed.prettier uses lib.lib_es2015_core✕
- Connections
- 1 pair of types, where a type in packages.flow-typed.prettier uses a type in lib.lib_es2015_core.
- The types involved
packages.flow-typed.prettier.AstPath→lib.lib_es2015_core.Array
- Direction
- packages.flow-typed.prettier uses lib.lib_es2015_core, so a change to lib.lib_es2015_core can break packages.flow-typed.prettier, while a change to packages.flow-typed.prettier can't break lib.lib_es2015_core.
- Position
- Below the diagonal: packages.flow-typed.prettier uses a module listed above it, which is the healthy direction.
18→6 lib.react uses newtests.lsp.queries.outline✕
- Connections
- 1 pair of types, where a type in lib.react uses a type in newtests.lsp.queries.outline.
- The types involved
lib.react.Component→newtests.lsp.queries.outline.State
- Direction
- lib.react uses newtests.lsp.queries.outline, so a change to newtests.lsp.queries.outline can break lib.react, while a change to lib.react can't break newtests.lsp.queries.outline.
- Position
- Below the diagonal: lib.react uses a module listed above it, which is the healthy direction.
18→15 lib.react uses lib.lib_es5✕
- Connections
- 1 pair of types, where a type in lib.react uses a type in lib.lib_es5.
- The types involved
lib.react.Component→lib.lib_es5.Error
- Direction
- lib.react uses lib.lib_es5, so a change to lib.lib_es5 can break lib.react, while a change to lib.react can't break lib.lib_es5.
- Position
- Below the diagonal: lib.react uses a module listed above it, which is the healthy direction.
19→4 packages.flow-dev-tools.flow-typed.node uses lib.lib_es2015_iterable✕
- Connections
- 7 pairs of types, where a type in packages.flow-dev-tools.flow-typed.node uses a type in lib.lib_es2015_iterable.
- The types involved
packages.flow-dev-tools.flow-typed.node.Buffer→lib.lib_es2015_iterable.IteratorObjectpackages.flow-dev-tools.flow-typed.node.Buffer→lib.lib_es2015_iterable.Uint8Arraypackages.flow-dev-tools.flow-typed.node.DatabaseSync→lib.lib_es2015_iterable.Uint8Arraypackages.flow-dev-tools.flow-typed.node.MIMEParams→lib.lib_es2015_iterable.Iteratorpackages.flow-dev-tools.flow-typed.node.Session→lib.lib_es2015_iterable.Uint8Arraypackages.flow-dev-tools.flow-typed.node.TextEncoder→lib.lib_es2015_iterable.Uint8Arraypackages.flow-dev-tools.flow-typed.node.URLSearchParams→lib.lib_es2015_iterable.Iterator
- Direction
- packages.flow-dev-tools.flow-typed.node uses lib.lib_es2015_iterable, so a change to lib.lib_es2015_iterable can break packages.flow-dev-tools.flow-typed.node, while a change to packages.flow-dev-tools.flow-typed.node can't break lib.lib_es2015_iterable.
- Position
- Below the diagonal: packages.flow-dev-tools.flow-typed.node uses a module listed above it, which is the healthy direction.
19→5 packages.flow-dev-tools.flow-typed.node uses newtests.lsp.queries.hover_refs✕
- Connections
- 5 pairs of types, where a type in packages.flow-dev-tools.flow-typed.node uses a type in newtests.lsp.queries.hover_refs.
- The types involved
packages.flow-dev-tools.flow-typed.node.FileHandle→newtests.lsp.queries.hover_refs.Tpackages.flow-dev-tools.flow-typed.node.Performance→newtests.lsp.queries.hover_refs.Tpackages.flow-dev-tools.flow-typed.node.PerformanceMark→newtests.lsp.queries.hover_refs.Tpackages.flow-dev-tools.flow-typed.node.PerformanceMeasure→newtests.lsp.queries.hover_refs.Tpackages.flow-dev-tools.flow-typed.node.stream$Readable→newtests.lsp.queries.hover_refs.T
- Direction
- packages.flow-dev-tools.flow-typed.node uses newtests.lsp.queries.hover_refs, so a change to newtests.lsp.queries.hover_refs can break packages.flow-dev-tools.flow-typed.node, while a change to packages.flow-dev-tools.flow-typed.node can't break newtests.lsp.queries.hover_refs.
- Position
- Below the diagonal: packages.flow-dev-tools.flow-typed.node uses a module listed above it, which is the healthy direction.
19→11 packages.flow-dev-tools.flow-typed.node uses lib.lib_es2015_collection✕
- Connections
- 2 pairs of types, where a type in packages.flow-dev-tools.flow-typed.node uses a type in lib.lib_es2015_collection.
- The types involved
packages.flow-dev-tools.flow-typed.node.Histogram→lib.lib_es2015_collection.Mappackages.flow-dev-tools.flow-typed.node.Process→lib.lib_es2015_collection.Set
- Direction
- packages.flow-dev-tools.flow-typed.node uses lib.lib_es2015_collection, so a change to lib.lib_es2015_collection can break packages.flow-dev-tools.flow-typed.node, while a change to packages.flow-dev-tools.flow-typed.node can't break lib.lib_es2015_collection.
- Position
- Below the diagonal: packages.flow-dev-tools.flow-typed.node uses a module listed above it, which is the healthy direction.
19→12 packages.flow-dev-tools.flow-typed.node uses lib.lib_es2015_core✕
- Connections
- 28 pairs of types, where a type in packages.flow-dev-tools.flow-typed.node uses a type in lib.lib_es2015_core. Showing 25 of them; the rest are in namespace-graph.json in this report's bundle.
- The types involved
packages.flow-dev-tools.flow-typed.node.Agent→lib.lib_es2015_core.Functionpackages.flow-dev-tools.flow-typed.node.Buffer→lib.lib_es2015_core.Arraypackages.flow-dev-tools.flow-typed.node.MessagePort→lib.lib_es2015_core.Arraypackages.flow-dev-tools.flow-typed.node.Performance→lib.lib_es2015_core.Arraypackages.flow-dev-tools.flow-typed.node.PerformanceObserver→lib.lib_es2015_core.Arraypackages.flow-dev-tools.flow-typed.node.PerformanceObserver→lib.lib_es2015_core.ReadonlyArraypackages.flow-dev-tools.flow-typed.node.PerformanceObserverEntryList→lib.lib_es2015_core.Arraypackages.flow-dev-tools.flow-typed.node.Process→lib.lib_es2015_core.Arraypackages.flow-dev-tools.flow-typed.node.StatementSync→lib.lib_es2015_core.Arraypackages.flow-dev-tools.flow-typed.node.StatementSync→lib.lib_es2015_core.ReadonlyArraypackages.flow-dev-tools.flow-typed.node.Worker→lib.lib_es2015_core.Functionpackages.flow-dev-tools.flow-typed.node.child_process$ChildProcessTyped→lib.lib_es2015_core.Arraypackages.flow-dev-tools.flow-typed.node.child_process$Error→lib.lib_es2015_core.Arraypackages.flow-dev-tools.flow-typed.node.crypto$X509Certificate→lib.lib_es2015_core.Arraypackages.flow-dev-tools.flow-typed.node.domain$Domain→lib.lib_es2015_core.Arraypackages.flow-dev-tools.flow-typed.node.domain$Domain→lib.lib_es2015_core.Functionpackages.flow-dev-tools.flow-typed.node.events$EventEmitter→lib.lib_es2015_core.Arraypackages.flow-dev-tools.flow-typed.node.events$EventEmitter→lib.lib_es2015_core.Functionpackages.flow-dev-tools.flow-typed.node.http$ClientRequest→lib.lib_es2015_core.Functionpackages.flow-dev-tools.flow-typed.node.http$IncomingMessage→lib.lib_es2015_core.Arraypackages.flow-dev-tools.flow-typed.node.http$IncomingMessage→lib.lib_es2015_core.Functionpackages.flow-dev-tools.flow-typed.node.http$Server→lib.lib_es2015_core.Functionpackages.flow-dev-tools.flow-typed.node.https$Server→lib.lib_es2015_core.Functionpackages.flow-dev-tools.flow-typed.node.net$Server→lib.lib_es2015_core.Functionpackages.flow-dev-tools.flow-typed.node.net$Socket→lib.lib_es2015_core.Function
- Direction
- packages.flow-dev-tools.flow-typed.node uses lib.lib_es2015_core, so a change to lib.lib_es2015_core can break packages.flow-dev-tools.flow-typed.node, while a change to packages.flow-dev-tools.flow-typed.node can't break lib.lib_es2015_core.
- Position
- Below the diagonal: packages.flow-dev-tools.flow-typed.node uses a module listed above it, which is the healthy direction.
19→15 packages.flow-dev-tools.flow-typed.node uses lib.lib_es5✕
- Connections
- 23 pairs of types, where a type in packages.flow-dev-tools.flow-typed.node uses a type in lib.lib_es5.
- The types involved
packages.flow-dev-tools.flow-typed.node.AssertionError→lib.lib_es5.Errorpackages.flow-dev-tools.flow-typed.node.Cluster→lib.lib_es5.Objectpackages.flow-dev-tools.flow-typed.node.Console→lib.lib_es5.Objectpackages.flow-dev-tools.flow-typed.node.Deserializer→lib.lib_es5.ArrayBufferpackages.flow-dev-tools.flow-typed.node.Dir→lib.lib_es5.Promisepackages.flow-dev-tools.flow-typed.node.ErrnoError→lib.lib_es5.Objectpackages.flow-dev-tools.flow-typed.node.FileHandle→lib.lib_es5.Promisepackages.flow-dev-tools.flow-typed.node.Process→lib.lib_es5.Objectpackages.flow-dev-tools.flow-typed.node.Recoverable→lib.lib_es5.Errorpackages.flow-dev-tools.flow-typed.node.Recoverable→lib.lib_es5.SyntaxErrorpackages.flow-dev-tools.flow-typed.node.Serializer→lib.lib_es5.ArrayBufferpackages.flow-dev-tools.flow-typed.node.Stats→lib.lib_es5.Datepackages.flow-dev-tools.flow-typed.node.Worker→lib.lib_es5.Objectpackages.flow-dev-tools.flow-typed.node.child_process$Error→lib.lib_es5.Errorpackages.flow-dev-tools.flow-typed.node.crypto$X509Certificate→lib.lib_es5.Datepackages.flow-dev-tools.flow-typed.node.http$IncomingMessage→lib.lib_es5.Objectpackages.flow-dev-tools.flow-typed.node.net$Server→lib.lib_es5.Objectpackages.flow-dev-tools.flow-typed.node.net$Socket→lib.lib_es5.Objectpackages.flow-dev-tools.flow-typed.node.stream$Readable→lib.lib_es5.Errorpackages.flow-dev-tools.flow-typed.node.stream$Writable→lib.lib_es5.Errorpackages.flow-dev-tools.flow-typed.node.tls$Server→lib.lib_es5.Objectpackages.flow-dev-tools.flow-typed.node.tls$TLSSocket→lib.lib_es5.Objectpackages.flow-dev-tools.flow-typed.node.tty$ReadStream→lib.lib_es5.Object
- Direction
- packages.flow-dev-tools.flow-typed.node uses lib.lib_es5, so a change to lib.lib_es5 can break packages.flow-dev-tools.flow-typed.node, while a change to packages.flow-dev-tools.flow-typed.node can't break lib.lib_es5.
- Position
- Below the diagonal: packages.flow-dev-tools.flow-typed.node uses a module listed above it, which is the healthy direction.
20→8 packages.flow-eslint.src.scope-manager.variable.VariableBase uses packages.flow-eslint.src.scope-manager.scope.Scope✕
- Connections
- 2 pairs of types, where a type in packages.flow-eslint.src.scope-manager.variable.VariableBase uses a type in packages.flow-eslint.src.scope-manager.scope.Scope.
- The types involved
packages.flow-eslint.src.scope-manager.variable.VariableBase.IVariableBase→packages.flow-eslint.src.scope-manager.scope.Scope.Scopepackages.flow-eslint.src.scope-manager.variable.VariableBase.VariableBase→packages.flow-eslint.src.scope-manager.scope.Scope.Scope
- Direction
- packages.flow-eslint.src.scope-manager.variable.VariableBase uses packages.flow-eslint.src.scope-manager.scope.Scope, so a change to packages.flow-eslint.src.scope-manager.scope.Scope can break packages.flow-eslint.src.scope-manager.variable.VariableBase, while a change to packages.flow-eslint.src.scope-manager.variable.VariableBase can't break packages.flow-eslint.src.scope-manager.scope.Scope.
- Position
- Below the diagonal: packages.flow-eslint.src.scope-manager.variable.VariableBase uses a module listed above it, which is the healthy direction.
20→12 packages.flow-eslint.src.scope-manager.variable.VariableBase uses lib.lib_es2015_core✕
- Connections
- 2 pairs of types, where a type in packages.flow-eslint.src.scope-manager.variable.VariableBase uses a type in lib.lib_es2015_core.
- The types involved
packages.flow-eslint.src.scope-manager.variable.VariableBase.IVariableBase→lib.lib_es2015_core.Arraypackages.flow-eslint.src.scope-manager.variable.VariableBase.VariableBase→lib.lib_es2015_core.Array
- Direction
- packages.flow-eslint.src.scope-manager.variable.VariableBase uses lib.lib_es2015_core, so a change to lib.lib_es2015_core can break packages.flow-eslint.src.scope-manager.variable.VariableBase, while a change to packages.flow-eslint.src.scope-manager.variable.VariableBase can't break lib.lib_es2015_core.
- Position
- Below the diagonal: packages.flow-eslint.src.scope-manager.variable.VariableBase uses a module listed above it, which is the healthy direction.
20→13 packages.flow-eslint.src.scope-manager.variable.VariableBase uses packages.flow-eslint.src.scope-manager.referencer.Reference✕
- Connections
- 2 pairs of types, where a type in packages.flow-eslint.src.scope-manager.variable.VariableBase uses a type in packages.flow-eslint.src.scope-manager.referencer.Reference.
- The types involved
packages.flow-eslint.src.scope-manager.variable.VariableBase.IVariableBase→packages.flow-eslint.src.scope-manager.referencer.Reference.Referencepackages.flow-eslint.src.scope-manager.variable.VariableBase.VariableBase→packages.flow-eslint.src.scope-manager.referencer.Reference.Reference
- Direction
- packages.flow-eslint.src.scope-manager.variable.VariableBase uses packages.flow-eslint.src.scope-manager.referencer.Reference, so a change to packages.flow-eslint.src.scope-manager.referencer.Reference can break packages.flow-eslint.src.scope-manager.variable.VariableBase, while a change to packages.flow-eslint.src.scope-manager.variable.VariableBase can't break packages.flow-eslint.src.scope-manager.referencer.Reference.
- Position
- Below the diagonal: packages.flow-eslint.src.scope-manager.variable.VariableBase uses a module listed above it, which is the healthy direction.
20→16 packages.flow-eslint.src.scope-manager.variable.VariableBase uses packages.flow-api-translator.src.utils.ts-estree-ast-types✕
- Connections
- 2 pairs of types, where a type in packages.flow-eslint.src.scope-manager.variable.VariableBase uses a type in packages.flow-api-translator.src.utils.ts-estree-ast-types.
- The types involved
packages.flow-eslint.src.scope-manager.variable.VariableBase.IVariableBase→packages.flow-api-translator.src.utils.ts-estree-ast-types.Identifierpackages.flow-eslint.src.scope-manager.variable.VariableBase.VariableBase→packages.flow-api-translator.src.utils.ts-estree-ast-types.Identifier
- Direction
- packages.flow-eslint.src.scope-manager.variable.VariableBase uses packages.flow-api-translator.src.utils.ts-estree-ast-types, so a change to packages.flow-api-translator.src.utils.ts-estree-ast-types can break packages.flow-eslint.src.scope-manager.variable.VariableBase, while a change to packages.flow-eslint.src.scope-manager.variable.VariableBase can't break packages.flow-api-translator.src.utils.ts-estree-ast-types.
- Position
- Below the diagonal: packages.flow-eslint.src.scope-manager.variable.VariableBase uses a module listed above it, which is the healthy direction.
21→2 packages.flow-estree.src.types uses evals.evals.02_unique_features.match_018_invariant_throw.ideal.main✕
- Connections
- 1 pair of types, where a type in packages.flow-estree.src.types uses a type in evals.evals.02_unique_features.match_018_invariant_throw.ideal.main.
- The types involved
packages.flow-estree.src.types.Program→evals.evals.02_unique_features.match_018_invariant_throw.ideal.main.Token
- Direction
- packages.flow-estree.src.types uses evals.evals.02_unique_features.match_018_invariant_throw.ideal.main, so a change to evals.evals.02_unique_features.match_018_invariant_throw.ideal.main can break packages.flow-estree.src.types, while a change to packages.flow-estree.src.types can't break evals.evals.02_unique_features.match_018_invariant_throw.ideal.main.
- Position
- Below the diagonal: packages.flow-estree.src.types uses a module listed above it, which is the healthy direction.
21→12 packages.flow-estree.src.types uses lib.lib_es2015_core✕
- Connections
- 57 pairs of types, where a type in packages.flow-estree.src.types uses a type in lib.lib_es2015_core. Showing 25 of them; the rest are in namespace-graph.json in this report's bundle.
- The types involved
packages.flow-estree.src.types.ArrayExpression→lib.lib_es2015_core.ReadonlyArraypackages.flow-estree.src.types.ArrayPattern→lib.lib_es2015_core.ReadonlyArraypackages.flow-estree.src.types.BaseCallExpression→lib.lib_es2015_core.ReadonlyArraypackages.flow-estree.src.types.BaseClass→lib.lib_es2015_core.ReadonlyArraypackages.flow-estree.src.types.BaseFunction→lib.lib_es2015_core.ReadonlyArraypackages.flow-estree.src.types.BaseInterfaceNode→lib.lib_es2015_core.ReadonlyArraypackages.flow-estree.src.types.BlockStatement→lib.lib_es2015_core.ReadonlyArraypackages.flow-estree.src.types.ClassBody→lib.lib_es2015_core.ReadonlyArraypackages.flow-estree.src.types.ComponentDeclaration→lib.lib_es2015_core.ReadonlyArraypackages.flow-estree.src.types.ComponentTypeAnnotation→lib.lib_es2015_core.ReadonlyArraypackages.flow-estree.src.types.ConstructorTypeAnnotation→lib.lib_es2015_core.ReadonlyArraypackages.flow-estree.src.types.DeclareClass→lib.lib_es2015_core.ReadonlyArraypackages.flow-estree.src.types.DeclareComponent→lib.lib_es2015_core.ReadonlyArraypackages.flow-estree.src.types.DeclareExportDeclarationBase→lib.lib_es2015_core.ReadonlyArraypackages.flow-estree.src.types.DeclareExportDeclarationNamedWithSpecifiers→lib.lib_es2015_core.ReadonlyArraypackages.flow-estree.src.types.DeclareVariable→lib.lib_es2015_core.ReadonlyArraypackages.flow-estree.src.types.EnumBody→lib.lib_es2015_core.ReadonlyArraypackages.flow-estree.src.types.ExportAllDeclaration→lib.lib_es2015_core.ReadonlyArraypackages.flow-estree.src.types.ExportNamedDeclarationBase→lib.lib_es2015_core.ReadonlyArraypackages.flow-estree.src.types.ExportNamedDeclarationWithSpecifiers→lib.lib_es2015_core.ReadonlyArraypackages.flow-estree.src.types.FunctionTypeAnnotation→lib.lib_es2015_core.ReadonlyArraypackages.flow-estree.src.types.HookDeclaration→lib.lib_es2015_core.ReadonlyArraypackages.flow-estree.src.types.HookTypeAnnotation→lib.lib_es2015_core.ReadonlyArraypackages.flow-estree.src.types.ImportDeclaration→lib.lib_es2015_core.ReadonlyArraypackages.flow-estree.src.types.IntersectionTypeAnnotation→lib.lib_es2015_core.ReadonlyArray
- Direction
- packages.flow-estree.src.types uses lib.lib_es2015_core, so a change to lib.lib_es2015_core can break packages.flow-estree.src.types, while a change to packages.flow-estree.src.types can't break lib.lib_es2015_core.
- Position
- Below the diagonal: packages.flow-estree.src.types uses a module listed above it, which is the healthy direction.
21→16 packages.flow-estree.src.types uses packages.flow-api-translator.src.utils.ts-estree-ast-types✕
- Connections
- 163 pairs of types, where a type in packages.flow-estree.src.types uses a type in packages.flow-api-translator.src.utils.ts-estree-ast-types. Showing 25 of them; the rest are in namespace-graph.json in this report's bundle.
- The types involved
packages.flow-estree.src.types.AbstractMethodDefinitionBase→packages.flow-api-translator.src.utils.ts-estree-ast-types.ClassBodypackages.flow-estree.src.types.AbstractMethodDefinitionWithNonComputedName→packages.flow-api-translator.src.utils.ts-estree-ast-types.ClassPropertyNameNonComputedpackages.flow-estree.src.types.AbstractPropertyDefinitionBase→packages.flow-api-translator.src.utils.ts-estree-ast-types.ClassBodypackages.flow-estree.src.types.AbstractPropertyDefinitionWithNonComputedName→packages.flow-api-translator.src.utils.ts-estree-ast-types.ClassPropertyNameNonComputedpackages.flow-estree.src.types.AsConstExpression→packages.flow-api-translator.src.utils.ts-estree-ast-types.Expressionpackages.flow-estree.src.types.AsExpression→packages.flow-api-translator.src.utils.ts-estree-ast-types.Expressionpackages.flow-estree.src.types.AssignmentExpression→packages.flow-api-translator.src.utils.ts-estree-ast-types.Expressionpackages.flow-estree.src.types.AssignmentPattern→packages.flow-api-translator.src.utils.ts-estree-ast-types.BindingNamepackages.flow-estree.src.types.AssignmentPattern→packages.flow-api-translator.src.utils.ts-estree-ast-types.Expressionpackages.flow-estree.src.types.AwaitExpression→packages.flow-api-translator.src.utils.ts-estree-ast-types.Expressionpackages.flow-estree.src.types.BaseClass→packages.flow-api-translator.src.utils.ts-estree-ast-types.ClassBodypackages.flow-estree.src.types.BaseClass→packages.flow-api-translator.src.utils.ts-estree-ast-types.Decoratorpackages.flow-estree.src.types.BaseForXStatement→packages.flow-api-translator.src.utils.ts-estree-ast-types.Expressionpackages.flow-estree.src.types.BaseForXStatement→packages.flow-api-translator.src.utils.ts-estree-ast-types.Statementpackages.flow-estree.src.types.BaseInterfaceDeclaration→packages.flow-api-translator.src.utils.ts-estree-ast-types.Identifierpackages.flow-estree.src.types.BaseOpaqueType→packages.flow-api-translator.src.utils.ts-estree-ast-types.Identifierpackages.flow-estree.src.types.BaseToken→packages.flow-api-translator.src.utils.ts-estree-ast-types.SourceLocationpackages.flow-estree.src.types.BaseTypeAlias→packages.flow-api-translator.src.utils.ts-estree-ast-types.Identifierpackages.flow-estree.src.types.BinaryExpressionIn→packages.flow-api-translator.src.utils.ts-estree-ast-types.Expressionpackages.flow-estree.src.types.BinaryExpressionWithoutIn→packages.flow-api-translator.src.utils.ts-estree-ast-types.Expressionpackages.flow-estree.src.types.CatchClause→packages.flow-api-translator.src.utils.ts-estree-ast-types.BlockStatementpackages.flow-estree.src.types.ChainExpression→packages.flow-api-translator.src.utils.ts-estree-ast-types.ChainElementpackages.flow-estree.src.types.ComponentDeclaration→packages.flow-api-translator.src.utils.ts-estree-ast-types.BlockStatementpackages.flow-estree.src.types.ComponentDeclaration→packages.flow-api-translator.src.utils.ts-estree-ast-types.Identifierpackages.flow-estree.src.types.ConditionalExpression→packages.flow-api-translator.src.utils.ts-estree-ast-types.Expression
- Direction
- packages.flow-estree.src.types uses packages.flow-api-translator.src.utils.ts-estree-ast-types, so a change to packages.flow-api-translator.src.utils.ts-estree-ast-types can break packages.flow-estree.src.types, while a change to packages.flow-estree.src.types can't break packages.flow-api-translator.src.utils.ts-estree-ast-types.
- Position
- Below the diagonal: packages.flow-estree.src.types uses a module listed above it, which is the healthy direction.
22→9 packages.flow-for-vscode.src.FlowLanguageClient.FlowLanguageClient uses packages.flow-for-vscode.src.utils.LanguageClient.types✕
- Connections
- 1 pair of types, where a type in packages.flow-for-vscode.src.FlowLanguageClient.FlowLanguageClient uses a type in packages.flow-for-vscode.src.utils.LanguageClient.types.
- The types involved
packages.flow-for-vscode.src.FlowLanguageClient.FlowLanguageClient.FlowLanguageClient→packages.flow-for-vscode.src.utils.LanguageClient.types.ILanguageClient
- Direction
- packages.flow-for-vscode.src.FlowLanguageClient.FlowLanguageClient uses packages.flow-for-vscode.src.utils.LanguageClient.types, so a change to packages.flow-for-vscode.src.utils.LanguageClient.types can break packages.flow-for-vscode.src.FlowLanguageClient.FlowLanguageClient, while a change to packages.flow-for-vscode.src.FlowLanguageClient.FlowLanguageClient can't break packages.flow-for-vscode.src.utils.LanguageClient.types.
- Position
- Below the diagonal: packages.flow-for-vscode.src.FlowLanguageClient.FlowLanguageClient uses a module listed above it, which is the healthy direction.
22→11 packages.flow-for-vscode.src.FlowLanguageClient.FlowLanguageClient uses lib.lib_es2015_collection✕
- Connections
- 1 pair of types, where a type in packages.flow-for-vscode.src.FlowLanguageClient.FlowLanguageClient uses a type in lib.lib_es2015_collection.
- The types involved
packages.flow-for-vscode.src.FlowLanguageClient.FlowLanguageClient.FlowLanguageClient→lib.lib_es2015_collection.Map
- Direction
- packages.flow-for-vscode.src.FlowLanguageClient.FlowLanguageClient uses lib.lib_es2015_collection, so a change to lib.lib_es2015_collection can break packages.flow-for-vscode.src.FlowLanguageClient.FlowLanguageClient, while a change to packages.flow-for-vscode.src.FlowLanguageClient.FlowLanguageClient can't break lib.lib_es2015_collection.
- Position
- Below the diagonal: packages.flow-for-vscode.src.FlowLanguageClient.FlowLanguageClient uses a module listed above it, which is the healthy direction.
22→15 packages.flow-for-vscode.src.FlowLanguageClient.FlowLanguageClient uses lib.lib_es5✕
- Connections
- 2 pairs of types, where a type in packages.flow-for-vscode.src.FlowLanguageClient.FlowLanguageClient uses a type in lib.lib_es5.
- The types involved
packages.flow-for-vscode.src.FlowLanguageClient.FlowLanguageClient.FlowLanguageClient→lib.lib_es5.Errorpackages.flow-for-vscode.src.FlowLanguageClient.FlowLanguageClient.FlowLanguageClient→lib.lib_es5.Promise
- Direction
- packages.flow-for-vscode.src.FlowLanguageClient.FlowLanguageClient uses lib.lib_es5, so a change to lib.lib_es5 can break packages.flow-for-vscode.src.FlowLanguageClient.FlowLanguageClient, while a change to packages.flow-for-vscode.src.FlowLanguageClient.FlowLanguageClient can't break lib.lib_es5.
- Position
- Below the diagonal: packages.flow-for-vscode.src.FlowLanguageClient.FlowLanguageClient uses a module listed above it, which is the healthy direction.
22→17 packages.flow-for-vscode.src.FlowLanguageClient.FlowLanguageClient uses packages.flow-typed.prettier✕
- Connections
- 1 pair of types, where a type in packages.flow-for-vscode.src.FlowLanguageClient.FlowLanguageClient uses a type in packages.flow-typed.prettier.
- The types involved
packages.flow-for-vscode.src.FlowLanguageClient.FlowLanguageClient.FlowLanguageClient→packages.flow-typed.prettier.Options
- Direction
- packages.flow-for-vscode.src.FlowLanguageClient.FlowLanguageClient uses packages.flow-typed.prettier, so a change to packages.flow-typed.prettier can break packages.flow-for-vscode.src.FlowLanguageClient.FlowLanguageClient, while a change to packages.flow-for-vscode.src.FlowLanguageClient.FlowLanguageClient can't break packages.flow-typed.prettier.
- Position
- Below the diagonal: packages.flow-for-vscode.src.FlowLanguageClient.FlowLanguageClient uses a module listed above it, which is the healthy direction.
23→9 packages.flow-for-vscode.src.utils.LanguageClient.StatusFeature.StatusProvider uses packages.flow-for-vscode.src.utils.LanguageClient.types✕
- Connections
- 1 pair of types, where a type in packages.flow-for-vscode.src.utils.LanguageClient.StatusFeature.StatusProvider uses a type in packages.flow-for-vscode.src.utils.LanguageClient.types.
- The types involved
packages.flow-for-vscode.src.utils.LanguageClient.StatusFeature.StatusProvider.StatusProvider→packages.flow-for-vscode.src.utils.LanguageClient.types.ILanguageClient
- Direction
- packages.flow-for-vscode.src.utils.LanguageClient.StatusFeature.StatusProvider uses packages.flow-for-vscode.src.utils.LanguageClient.types, so a change to packages.flow-for-vscode.src.utils.LanguageClient.types can break packages.flow-for-vscode.src.utils.LanguageClient.StatusFeature.StatusProvider, while a change to packages.flow-for-vscode.src.utils.LanguageClient.StatusFeature.StatusProvider can't break packages.flow-for-vscode.src.utils.LanguageClient.types.
- Position
- Below the diagonal: packages.flow-for-vscode.src.utils.LanguageClient.StatusFeature.StatusProvider uses a module listed above it, which is the healthy direction.
23→12 packages.flow-for-vscode.src.utils.LanguageClient.StatusFeature.StatusProvider uses lib.lib_es2015_core✕
- Connections
- 1 pair of types, where a type in packages.flow-for-vscode.src.utils.LanguageClient.StatusFeature.StatusProvider uses a type in lib.lib_es2015_core.
- The types involved
packages.flow-for-vscode.src.utils.LanguageClient.StatusFeature.StatusProvider.StatusProvider→lib.lib_es2015_core.Array
- Direction
- packages.flow-for-vscode.src.utils.LanguageClient.StatusFeature.StatusProvider uses lib.lib_es2015_core, so a change to lib.lib_es2015_core can break packages.flow-for-vscode.src.utils.LanguageClient.StatusFeature.StatusProvider, while a change to packages.flow-for-vscode.src.utils.LanguageClient.StatusFeature.StatusProvider can't break lib.lib_es2015_core.
- Position
- Below the diagonal: packages.flow-for-vscode.src.utils.LanguageClient.StatusFeature.StatusProvider uses a module listed above it, which is the healthy direction.
23→15 packages.flow-for-vscode.src.utils.LanguageClient.StatusFeature.StatusProvider uses lib.lib_es5✕
- Connections
- 1 pair of types, where a type in packages.flow-for-vscode.src.utils.LanguageClient.StatusFeature.StatusProvider uses a type in lib.lib_es5.
- The types involved
packages.flow-for-vscode.src.utils.LanguageClient.StatusFeature.StatusProvider.StatusProvider→lib.lib_es5.Promise
- Direction
- packages.flow-for-vscode.src.utils.LanguageClient.StatusFeature.StatusProvider uses lib.lib_es5, so a change to lib.lib_es5 can break packages.flow-for-vscode.src.utils.LanguageClient.StatusFeature.StatusProvider, while a change to packages.flow-for-vscode.src.utils.LanguageClient.StatusFeature.StatusProvider can't break lib.lib_es5.
- Position
- Below the diagonal: packages.flow-for-vscode.src.utils.LanguageClient.StatusFeature.StatusProvider uses a module listed above it, which is the healthy direction.
24→5 packages.flow-transform.src.transform uses newtests.lsp.queries.hover_refs✕
- Connections
- 1 pair of types, where a type in packages.flow-transform.src.transform uses a type in newtests.lsp.queries.hover_refs.
- The types involved
packages.flow-transform.src.transform.TransformContext→newtests.lsp.queries.hover_refs.T
- Direction
- packages.flow-transform.src.transform uses newtests.lsp.queries.hover_refs, so a change to newtests.lsp.queries.hover_refs can break packages.flow-transform.src.transform, while a change to packages.flow-transform.src.transform can't break newtests.lsp.queries.hover_refs.
- Position
- Below the diagonal: packages.flow-transform.src.transform uses a module listed above it, which is the healthy direction.
24→12 packages.flow-transform.src.transform uses lib.lib_es2015_core✕
- Connections
- 1 pair of types, where a type in packages.flow-transform.src.transform uses a type in lib.lib_es2015_core.
- The types involved
packages.flow-transform.src.transform.TransformContext→lib.lib_es2015_core.ReadonlyArray
- Direction
- packages.flow-transform.src.transform uses lib.lib_es2015_core, so a change to lib.lib_es2015_core can break packages.flow-transform.src.transform, while a change to packages.flow-transform.src.transform can't break lib.lib_es2015_core.
- Position
- Below the diagonal: packages.flow-transform.src.transform uses a module listed above it, which is the healthy direction.
24→15 packages.flow-transform.src.transform uses lib.lib_es5✕
- Connections
- 2 pairs of types, where a type in packages.flow-transform.src.transform uses a type in lib.lib_es5.
- The types involved
packages.flow-transform.src.transform.print→lib.lib_es5.Promisepackages.flow-transform.src.transform.transform→lib.lib_es5.Promise
- Direction
- packages.flow-transform.src.transform uses lib.lib_es5, so a change to lib.lib_es5 can break packages.flow-transform.src.transform, while a change to packages.flow-transform.src.transform can't break lib.lib_es5.
- Position
- Below the diagonal: packages.flow-transform.src.transform uses a module listed above it, which is the healthy direction.
24→16 packages.flow-transform.src.transform uses packages.flow-api-translator.src.utils.ts-estree-ast-types✕
- Connections
- 1 pair of types, where a type in packages.flow-transform.src.transform uses a type in packages.flow-api-translator.src.utils.ts-estree-ast-types.
- The types involved
packages.flow-transform.src.transform.print→packages.flow-api-translator.src.utils.ts-estree-ast-types.Program
- Direction
- packages.flow-transform.src.transform uses packages.flow-api-translator.src.utils.ts-estree-ast-types, so a change to packages.flow-api-translator.src.utils.ts-estree-ast-types can break packages.flow-transform.src.transform, while a change to packages.flow-transform.src.transform can't break packages.flow-api-translator.src.utils.ts-estree-ast-types.
- Position
- Below the diagonal: packages.flow-transform.src.transform uses a module listed above it, which is the healthy direction.
25→12 packages.flow-api-translator.src.TSDefToFlowDef uses lib.lib_es2015_core✕
- Connections
- 2 pairs of types, where a type in packages.flow-api-translator.src.TSDefToFlowDef uses a type in lib.lib_es2015_core.
- The types involved
packages.flow-api-translator.src.TSDefToFlowDef.Transform→lib.lib_es2015_core.Arraypackages.flow-api-translator.src.TSDefToFlowDef.Transform→lib.lib_es2015_core.ReadonlyArray
- Direction
- packages.flow-api-translator.src.TSDefToFlowDef uses lib.lib_es2015_core, so a change to lib.lib_es2015_core can break packages.flow-api-translator.src.TSDefToFlowDef, while a change to packages.flow-api-translator.src.TSDefToFlowDef can't break lib.lib_es2015_core.
- Position
- Below the diagonal: packages.flow-api-translator.src.TSDefToFlowDef uses a module listed above it, which is the healthy direction.
25→16 packages.flow-api-translator.src.TSDefToFlowDef uses packages.flow-api-translator.src.utils.ts-estree-ast-types✕
- Connections
- 51 pairs of types, where a type in packages.flow-api-translator.src.TSDefToFlowDef uses a type in packages.flow-api-translator.src.utils.ts-estree-ast-types. Showing 25 of them; the rest are in namespace-graph.json in this report's bundle.
- The types involved
packages.flow-api-translator.src.TSDefToFlowDef.Transform→packages.flow-api-translator.src.utils.ts-estree-ast-types.BlockStatementpackages.flow-api-translator.src.TSDefToFlowDef.Transform→packages.flow-api-translator.src.utils.ts-estree-ast-types.ClassBodypackages.flow-api-translator.src.TSDefToFlowDef.Transform→packages.flow-api-translator.src.utils.ts-estree-ast-types.ClassDeclarationWithNamepackages.flow-api-translator.src.TSDefToFlowDef.Transform→packages.flow-api-translator.src.utils.ts-estree-ast-types.DebuggerStatementpackages.flow-api-translator.src.TSDefToFlowDef.Transform→packages.flow-api-translator.src.utils.ts-estree-ast-types.EntityNamepackages.flow-api-translator.src.TSDefToFlowDef.Transform→packages.flow-api-translator.src.utils.ts-estree-ast-types.ExportAllDeclarationpackages.flow-api-translator.src.TSDefToFlowDef.Transform→packages.flow-api-translator.src.utils.ts-estree-ast-types.ExportDefaultDeclarationpackages.flow-api-translator.src.TSDefToFlowDef.Transform→packages.flow-api-translator.src.utils.ts-estree-ast-types.ExportNamedDeclarationpackages.flow-api-translator.src.TSDefToFlowDef.Transform→packages.flow-api-translator.src.utils.ts-estree-ast-types.Expressionpackages.flow-api-translator.src.TSDefToFlowDef.Transform→packages.flow-api-translator.src.utils.ts-estree-ast-types.FunctionDeclarationWithNamepackages.flow-api-translator.src.TSDefToFlowDef.Transform→packages.flow-api-translator.src.utils.ts-estree-ast-types.Identifierpackages.flow-api-translator.src.TSDefToFlowDef.Transform→packages.flow-api-translator.src.utils.ts-estree-ast-types.ImportDeclarationpackages.flow-api-translator.src.TSDefToFlowDef.Transform→packages.flow-api-translator.src.utils.ts-estree-ast-types.LabeledStatementpackages.flow-api-translator.src.TSDefToFlowDef.Transform→packages.flow-api-translator.src.utils.ts-estree-ast-types.Literalpackages.flow-api-translator.src.TSDefToFlowDef.Transform→packages.flow-api-translator.src.utils.ts-estree-ast-types.Parameterpackages.flow-api-translator.src.TSDefToFlowDef.Transform→packages.flow-api-translator.src.utils.ts-estree-ast-types.Statementpackages.flow-api-translator.src.TSDefToFlowDef.Transform→packages.flow-api-translator.src.utils.ts-estree-ast-types.TSArrayTypepackages.flow-api-translator.src.TSDefToFlowDef.Transform→packages.flow-api-translator.src.utils.ts-estree-ast-types.TSClassImplementspackages.flow-api-translator.src.TSDefToFlowDef.Transform→packages.flow-api-translator.src.utils.ts-estree-ast-types.TSConditionalTypepackages.flow-api-translator.src.TSDefToFlowDef.Transform→packages.flow-api-translator.src.utils.ts-estree-ast-types.TSConstructorTypepackages.flow-api-translator.src.TSDefToFlowDef.Transform→packages.flow-api-translator.src.utils.ts-estree-ast-types.TSDeclareFunctionpackages.flow-api-translator.src.TSDefToFlowDef.Transform→packages.flow-api-translator.src.utils.ts-estree-ast-types.TSEnumDeclarationpackages.flow-api-translator.src.TSDefToFlowDef.Transform→packages.flow-api-translator.src.utils.ts-estree-ast-types.TSExportAssignmentpackages.flow-api-translator.src.TSDefToFlowDef.Transform→packages.flow-api-translator.src.utils.ts-estree-ast-types.TSFunctionTypepackages.flow-api-translator.src.TSDefToFlowDef.Transform→packages.flow-api-translator.src.utils.ts-estree-ast-types.TSImportEqualsDeclaration
- Direction
- packages.flow-api-translator.src.TSDefToFlowDef uses packages.flow-api-translator.src.utils.ts-estree-ast-types, so a change to packages.flow-api-translator.src.utils.ts-estree-ast-types can break packages.flow-api-translator.src.TSDefToFlowDef, while a change to packages.flow-api-translator.src.TSDefToFlowDef can't break packages.flow-api-translator.src.utils.ts-estree-ast-types.
- Position
- Below the diagonal: packages.flow-api-translator.src.TSDefToFlowDef uses a module listed above it, which is the healthy direction.
25→21 packages.flow-api-translator.src.TSDefToFlowDef uses packages.flow-estree.src.types✕
- Connections
- 40 pairs of types, where a type in packages.flow-api-translator.src.TSDefToFlowDef uses a type in packages.flow-estree.src.types. Showing 25 of them; the rest are in namespace-graph.json in this report's bundle.
- The types involved
packages.flow-api-translator.src.TSDefToFlowDef.Transform→packages.flow-estree.src.types.AnyTypeAnnotationpackages.flow-api-translator.src.TSDefToFlowDef.Transform→packages.flow-estree.src.types.ArrayTypeAnnotationpackages.flow-api-translator.src.TSDefToFlowDef.Transform→packages.flow-estree.src.types.BigIntTypeAnnotationpackages.flow-api-translator.src.TSDefToFlowDef.Transform→packages.flow-estree.src.types.BooleanTypeAnnotationpackages.flow-api-translator.src.TSDefToFlowDef.Transform→packages.flow-estree.src.types.ClassImplementspackages.flow-api-translator.src.TSDefToFlowDef.Transform→packages.flow-estree.src.types.ConditionalTypeAnnotationpackages.flow-api-translator.src.TSDefToFlowDef.Transform→packages.flow-estree.src.types.DeclareClasspackages.flow-api-translator.src.TSDefToFlowDef.Transform→packages.flow-estree.src.types.DeclareExportDefaultDeclarationpackages.flow-api-translator.src.TSDefToFlowDef.Transform→packages.flow-estree.src.types.DeclareFunctionpackages.flow-api-translator.src.TSDefToFlowDef.Transform→packages.flow-estree.src.types.DeclareModuleExportspackages.flow-api-translator.src.TSDefToFlowDef.Transform→packages.flow-estree.src.types.DeclareVariablepackages.flow-api-translator.src.TSDefToFlowDef.Transform→packages.flow-estree.src.types.EmptyTypeAnnotationpackages.flow-api-translator.src.TSDefToFlowDef.Transform→packages.flow-estree.src.types.FunctionTypeAnnotationpackages.flow-api-translator.src.TSDefToFlowDef.Transform→packages.flow-estree.src.types.GenericTypeAnnotationpackages.flow-api-translator.src.TSDefToFlowDef.Transform→packages.flow-estree.src.types.IndexedAccessTypepackages.flow-api-translator.src.TSDefToFlowDef.Transform→packages.flow-estree.src.types.InferTypeAnnotationpackages.flow-api-translator.src.TSDefToFlowDef.Transform→packages.flow-estree.src.types.InterfaceDeclarationpackages.flow-api-translator.src.TSDefToFlowDef.Transform→packages.flow-estree.src.types.InterfaceExtendspackages.flow-api-translator.src.TSDefToFlowDef.Transform→packages.flow-estree.src.types.InterfaceTypeAnnotationpackages.flow-api-translator.src.TSDefToFlowDef.Transform→packages.flow-estree.src.types.IntersectionTypeAnnotationpackages.flow-api-translator.src.TSDefToFlowDef.Transform→packages.flow-estree.src.types.MixedTypeAnnotationpackages.flow-api-translator.src.TSDefToFlowDef.Transform→packages.flow-estree.src.types.NullLiteralTypeAnnotationpackages.flow-api-translator.src.TSDefToFlowDef.Transform→packages.flow-estree.src.types.NumberTypeAnnotationpackages.flow-api-translator.src.TSDefToFlowDef.Transform→packages.flow-estree.src.types.ObjectTypeAnnotationpackages.flow-api-translator.src.TSDefToFlowDef.Transform→packages.flow-estree.src.types.ObjectTypeIndexer
- Direction
- packages.flow-api-translator.src.TSDefToFlowDef uses packages.flow-estree.src.types, so a change to packages.flow-estree.src.types can break packages.flow-api-translator.src.TSDefToFlowDef, while a change to packages.flow-api-translator.src.TSDefToFlowDef can't break packages.flow-estree.src.types.
- Position
- Below the diagonal: packages.flow-api-translator.src.TSDefToFlowDef uses a module listed above it, which is the healthy direction.
26→21 packages.flow-eslint.src.scope-manager.referencer.Visitor uses packages.flow-estree.src.types✕
- Connections
- 1 pair of types, where a type in packages.flow-eslint.src.scope-manager.referencer.Visitor uses a type in packages.flow-estree.src.types.
- The types involved
packages.flow-eslint.src.scope-manager.referencer.Visitor.Visitor→packages.flow-estree.src.types.ESNode
- Direction
- packages.flow-eslint.src.scope-manager.referencer.Visitor uses packages.flow-estree.src.types, so a change to packages.flow-estree.src.types can break packages.flow-eslint.src.scope-manager.referencer.Visitor, while a change to packages.flow-eslint.src.scope-manager.referencer.Visitor can't break packages.flow-estree.src.types.
- Position
- Below the diagonal: packages.flow-eslint.src.scope-manager.referencer.Visitor uses a module listed above it, which is the healthy direction.
27→20 packages.flow-eslint.src.scope-manager.variable.Variable uses packages.flow-eslint.src.scope-manager.variable.VariableBase✕
- Connections
- 1 pair of types, where a type in packages.flow-eslint.src.scope-manager.variable.Variable uses a type in packages.flow-eslint.src.scope-manager.variable.VariableBase.
- The types involved
packages.flow-eslint.src.scope-manager.variable.Variable.Variable→packages.flow-eslint.src.scope-manager.variable.VariableBase.VariableBase
- Direction
- packages.flow-eslint.src.scope-manager.variable.Variable uses packages.flow-eslint.src.scope-manager.variable.VariableBase, so a change to packages.flow-eslint.src.scope-manager.variable.VariableBase can break packages.flow-eslint.src.scope-manager.variable.Variable, while a change to packages.flow-eslint.src.scope-manager.variable.Variable can't break packages.flow-eslint.src.scope-manager.variable.VariableBase.
- Position
- Below the diagonal: packages.flow-eslint.src.scope-manager.variable.Variable uses a module listed above it, which is the healthy direction.
28→11 packages.flow-for-vscode.src.FlowClients uses lib.lib_es2015_collection✕
- Connections
- 1 pair of types, where a type in packages.flow-for-vscode.src.FlowClients uses a type in lib.lib_es2015_collection.
- The types involved
packages.flow-for-vscode.src.FlowClients.FlowClients→lib.lib_es2015_collection.Map
- Direction
- packages.flow-for-vscode.src.FlowClients uses lib.lib_es2015_collection, so a change to lib.lib_es2015_collection can break packages.flow-for-vscode.src.FlowClients, while a change to packages.flow-for-vscode.src.FlowClients can't break lib.lib_es2015_collection.
- Position
- Below the diagonal: packages.flow-for-vscode.src.FlowClients uses a module listed above it, which is the healthy direction.
28→12 packages.flow-for-vscode.src.FlowClients uses lib.lib_es2015_core✕
- Connections
- 1 pair of types, where a type in packages.flow-for-vscode.src.FlowClients uses a type in lib.lib_es2015_core.
- The types involved
packages.flow-for-vscode.src.FlowClients.FlowClients→lib.lib_es2015_core.Array
- Direction
- packages.flow-for-vscode.src.FlowClients uses lib.lib_es2015_core, so a change to lib.lib_es2015_core can break packages.flow-for-vscode.src.FlowClients, while a change to packages.flow-for-vscode.src.FlowClients can't break lib.lib_es2015_core.
- Position
- Below the diagonal: packages.flow-for-vscode.src.FlowClients uses a module listed above it, which is the healthy direction.
28→15 packages.flow-for-vscode.src.FlowClients uses lib.lib_es5✕
- Connections
- 2 pairs of types, where a type in packages.flow-for-vscode.src.FlowClients uses a type in lib.lib_es5.
- The types involved
packages.flow-for-vscode.src.FlowClients.FlowClients→lib.lib_es5.Promisepackages.flow-for-vscode.src.FlowClients.FlowClients→lib.lib_es5.PromiseLike
- Direction
- packages.flow-for-vscode.src.FlowClients uses lib.lib_es5, so a change to lib.lib_es5 can break packages.flow-for-vscode.src.FlowClients, while a change to packages.flow-for-vscode.src.FlowClients can't break lib.lib_es5.
- Position
- Below the diagonal: packages.flow-for-vscode.src.FlowClients uses a module listed above it, which is the healthy direction.
28→22 packages.flow-for-vscode.src.FlowClients uses packages.flow-for-vscode.src.FlowLanguageClient.FlowLanguageClient✕
- Connections
- 1 pair of types, where a type in packages.flow-for-vscode.src.FlowClients uses a type in packages.flow-for-vscode.src.FlowLanguageClient.FlowLanguageClient.
- The types involved
packages.flow-for-vscode.src.FlowClients.FlowClients→packages.flow-for-vscode.src.FlowLanguageClient.FlowLanguageClient.FlowLanguageClient
- Direction
- packages.flow-for-vscode.src.FlowClients uses packages.flow-for-vscode.src.FlowLanguageClient.FlowLanguageClient, so a change to packages.flow-for-vscode.src.FlowLanguageClient.FlowLanguageClient can break packages.flow-for-vscode.src.FlowClients, while a change to packages.flow-for-vscode.src.FlowClients can't break packages.flow-for-vscode.src.FlowLanguageClient.FlowLanguageClient.
- Position
- Below the diagonal: packages.flow-for-vscode.src.FlowClients uses a module listed above it, which is the healthy direction.
29→5 packages.flow-parser.oxidized-src.estree uses newtests.lsp.queries.hover_refs✕
- Connections
- 1 pair of types, where a type in packages.flow-parser.oxidized-src.estree uses a type in newtests.lsp.queries.hover_refs.
- The types involved
packages.flow-parser.oxidized-src.estree.TransformMatchSyntax→newtests.lsp.queries.hover_refs.T
- Direction
- packages.flow-parser.oxidized-src.estree uses newtests.lsp.queries.hover_refs, so a change to newtests.lsp.queries.hover_refs can break packages.flow-parser.oxidized-src.estree, while a change to packages.flow-parser.oxidized-src.estree can't break newtests.lsp.queries.hover_refs.
- Position
- Below the diagonal: packages.flow-parser.oxidized-src.estree uses a module listed above it, which is the healthy direction.
29→11 packages.flow-parser.oxidized-src.estree uses lib.lib_es2015_collection✕
- Connections
- 1 pair of types, where a type in packages.flow-parser.oxidized-src.estree uses a type in lib.lib_es2015_collection.
- The types involved
packages.flow-parser.oxidized-src.estree.TransformMatchSyntax→lib.lib_es2015_collection.Set
- Direction
- packages.flow-parser.oxidized-src.estree uses lib.lib_es2015_collection, so a change to lib.lib_es2015_collection can break packages.flow-parser.oxidized-src.estree, while a change to packages.flow-parser.oxidized-src.estree can't break lib.lib_es2015_collection.
- Position
- Below the diagonal: packages.flow-parser.oxidized-src.estree uses a module listed above it, which is the healthy direction.
29→12 packages.flow-parser.oxidized-src.estree uses lib.lib_es2015_core✕
- Connections
- 4 pairs of types, where a type in packages.flow-parser.oxidized-src.estree uses a type in lib.lib_es2015_core.
- The types involved
packages.flow-parser.oxidized-src.estree.TransformComponentSyntax→lib.lib_es2015_core.Arraypackages.flow-parser.oxidized-src.estree.TransformComponentSyntax→lib.lib_es2015_core.ReadonlyArraypackages.flow-parser.oxidized-src.estree.TransformMatchSyntax→lib.lib_es2015_core.Arraypackages.flow-parser.oxidized-src.estree.TransformMatchSyntax→lib.lib_es2015_core.ReadonlyArray
- Direction
- packages.flow-parser.oxidized-src.estree uses lib.lib_es2015_core, so a change to lib.lib_es2015_core can break packages.flow-parser.oxidized-src.estree, while a change to packages.flow-parser.oxidized-src.estree can't break lib.lib_es2015_core.
- Position
- Below the diagonal: packages.flow-parser.oxidized-src.estree uses a module listed above it, which is the healthy direction.
29→16 packages.flow-parser.oxidized-src.estree uses packages.flow-api-translator.src.utils.ts-estree-ast-types✕
- Connections
- 19 pairs of types, where a type in packages.flow-parser.oxidized-src.estree uses a type in packages.flow-api-translator.src.utils.ts-estree-ast-types.
- The types involved
packages.flow-parser.oxidized-src.estree.StripFlowTypes→packages.flow-api-translator.src.utils.ts-estree-ast-types.Programpackages.flow-parser.oxidized-src.estree.StripFlowTypesForBabel→packages.flow-api-translator.src.utils.ts-estree-ast-types.BindingNamepackages.flow-parser.oxidized-src.estree.StripFlowTypesForBabel→packages.flow-api-translator.src.utils.ts-estree-ast-types.Programpackages.flow-parser.oxidized-src.estree.StripFlowTypesForBabel→packages.flow-api-translator.src.utils.ts-estree-ast-types.VariableDeclaratorpackages.flow-parser.oxidized-src.estree.TransformComponentSyntax→packages.flow-api-translator.src.utils.ts-estree-ast-types.BindingNamepackages.flow-parser.oxidized-src.estree.TransformComponentSyntax→packages.flow-api-translator.src.utils.ts-estree-ast-types.FunctionDeclarationpackages.flow-parser.oxidized-src.estree.TransformComponentSyntax→packages.flow-api-translator.src.utils.ts-estree-ast-types.Positionpackages.flow-parser.oxidized-src.estree.TransformComponentSyntax→packages.flow-api-translator.src.utils.ts-estree-ast-types.Programpackages.flow-parser.oxidized-src.estree.TransformComponentSyntax→packages.flow-api-translator.src.utils.ts-estree-ast-types.RestElementpackages.flow-parser.oxidized-src.estree.TransformComponentSyntax→packages.flow-api-translator.src.utils.ts-estree-ast-types.VariableDeclaratorpackages.flow-parser.oxidized-src.estree.TransformEnumSyntax→packages.flow-api-translator.src.utils.ts-estree-ast-types.Programpackages.flow-parser.oxidized-src.estree.TransformMatchSyntax→packages.flow-api-translator.src.utils.ts-estree-ast-types.Expressionpackages.flow-parser.oxidized-src.estree.TransformMatchSyntax→packages.flow-api-translator.src.utils.ts-estree-ast-types.Identifierpackages.flow-parser.oxidized-src.estree.TransformMatchSyntax→packages.flow-api-translator.src.utils.ts-estree-ast-types.MemberExpressionpackages.flow-parser.oxidized-src.estree.TransformMatchSyntax→packages.flow-api-translator.src.utils.ts-estree-ast-types.Programpackages.flow-parser.oxidized-src.estree.TransformMatchSyntax→packages.flow-api-translator.src.utils.ts-estree-ast-types.Statementpackages.flow-parser.oxidized-src.estree.TransformRecordSyntax→packages.flow-api-translator.src.utils.ts-estree-ast-types.ClassDeclarationpackages.flow-parser.oxidized-src.estree.TransformRecordSyntax→packages.flow-api-translator.src.utils.ts-estree-ast-types.NewExpressionpackages.flow-parser.oxidized-src.estree.TransformRecordSyntax→packages.flow-api-translator.src.utils.ts-estree-ast-types.Program
- Direction
- packages.flow-parser.oxidized-src.estree uses packages.flow-api-translator.src.utils.ts-estree-ast-types, so a change to packages.flow-api-translator.src.utils.ts-estree-ast-types can break packages.flow-parser.oxidized-src.estree, while a change to packages.flow-parser.oxidized-src.estree can't break packages.flow-api-translator.src.utils.ts-estree-ast-types.
- Position
- Below the diagonal: packages.flow-parser.oxidized-src.estree uses a module listed above it, which is the healthy direction.
29→18 packages.flow-parser.oxidized-src.estree uses lib.react✕
- Connections
- 1 pair of types, where a type in packages.flow-parser.oxidized-src.estree uses a type in lib.react.
- The types involved
packages.flow-parser.oxidized-src.estree.TransformMatchSyntax→lib.react.Key
- Direction
- packages.flow-parser.oxidized-src.estree uses lib.react, so a change to lib.react can break packages.flow-parser.oxidized-src.estree, while a change to packages.flow-parser.oxidized-src.estree can't break lib.react.
- Position
- Below the diagonal: packages.flow-parser.oxidized-src.estree uses a module listed above it, which is the healthy direction.
29→21 packages.flow-parser.oxidized-src.estree uses packages.flow-estree.src.types✕
- Connections
- 29 pairs of types, where a type in packages.flow-parser.oxidized-src.estree uses a type in packages.flow-estree.src.types. Showing 25 of them; the rest are in namespace-graph.json in this report's bundle.
- The types involved
packages.flow-parser.oxidized-src.estree.StripFlowTypesForBabel→packages.flow-estree.src.types.AFunctionpackages.flow-parser.oxidized-src.estree.StripFlowTypesForBabel→packages.flow-estree.src.types.AnyTypeAnnotationpackages.flow-parser.oxidized-src.estree.StripFlowTypesForBabel→packages.flow-estree.src.types.DeclareEnumpackages.flow-parser.oxidized-src.estree.StripFlowTypesForBabel→packages.flow-estree.src.types.DeclareNamespacepackages.flow-parser.oxidized-src.estree.StripFlowTypesForBabel→packages.flow-estree.src.types.DeclareVariablepackages.flow-parser.oxidized-src.estree.StripFlowTypesForBabel→packages.flow-estree.src.types.ESNodepackages.flow-parser.oxidized-src.estree.StripFlowTypesForBabel→packages.flow-estree.src.types.GenericTypeAnnotationpackages.flow-parser.oxidized-src.estree.StripFlowTypesForBabel→packages.flow-estree.src.types.QualifiedTypeIdentifierpackages.flow-parser.oxidized-src.estree.StripFlowTypesForBabel→packages.flow-estree.src.types.QualifiedTypeofIdentifierpackages.flow-parser.oxidized-src.estree.TransformComponentSyntax→packages.flow-estree.src.types.ComponentDeclarationpackages.flow-parser.oxidized-src.estree.TransformComponentSyntax→packages.flow-estree.src.types.ComponentParameterpackages.flow-parser.oxidized-src.estree.TransformComponentSyntax→packages.flow-estree.src.types.DeclareComponentpackages.flow-parser.oxidized-src.estree.TransformComponentSyntax→packages.flow-estree.src.types.DeclareFunctionpackages.flow-parser.oxidized-src.estree.TransformComponentSyntax→packages.flow-estree.src.types.DeclareHookpackages.flow-parser.oxidized-src.estree.TransformComponentSyntax→packages.flow-estree.src.types.DeclareVariablepackages.flow-parser.oxidized-src.estree.TransformComponentSyntax→packages.flow-estree.src.types.ESNodepackages.flow-parser.oxidized-src.estree.TransformComponentSyntax→packages.flow-estree.src.types.HookDeclarationpackages.flow-parser.oxidized-src.estree.TransformComponentSyntax→packages.flow-estree.src.types.ObjectTypePropertySignaturepackages.flow-parser.oxidized-src.estree.TransformComponentSyntax→packages.flow-estree.src.types.ObjectTypeSpreadPropertypackages.flow-parser.oxidized-src.estree.TransformComponentSyntax→packages.flow-estree.src.types.TypeAnnotationpackages.flow-parser.oxidized-src.estree.TransformEnumSyntax→packages.flow-estree.src.types.EnumDeclarationpackages.flow-parser.oxidized-src.estree.TransformMatchSyntax→packages.flow-estree.src.types.MatchExpressionpackages.flow-parser.oxidized-src.estree.TransformMatchSyntax→packages.flow-estree.src.types.MatchMemberPatternpackages.flow-parser.oxidized-src.estree.TransformMatchSyntax→packages.flow-estree.src.types.MatchObjectPatternPropertypackages.flow-parser.oxidized-src.estree.TransformMatchSyntax→packages.flow-estree.src.types.MatchPattern
- Direction
- packages.flow-parser.oxidized-src.estree uses packages.flow-estree.src.types, so a change to packages.flow-estree.src.types can break packages.flow-parser.oxidized-src.estree, while a change to packages.flow-parser.oxidized-src.estree can't break packages.flow-estree.src.types.
- Position
- Below the diagonal: packages.flow-parser.oxidized-src.estree uses a module listed above it, which is the healthy direction.
30→5 packages.flow-transform.src.transform.comments uses newtests.lsp.queries.hover_refs✕
- Connections
- 1 pair of types, where a type in packages.flow-transform.src.transform.comments uses a type in newtests.lsp.queries.hover_refs.
- The types involved
packages.flow-transform.src.transform.comments.comments→newtests.lsp.queries.hover_refs.T
- Direction
- packages.flow-transform.src.transform.comments uses newtests.lsp.queries.hover_refs, so a change to newtests.lsp.queries.hover_refs can break packages.flow-transform.src.transform.comments, while a change to packages.flow-transform.src.transform.comments can't break newtests.lsp.queries.hover_refs.
- Position
- Below the diagonal: packages.flow-transform.src.transform.comments uses a module listed above it, which is the healthy direction.
30→12 packages.flow-transform.src.transform.comments uses lib.lib_es2015_core✕
- Connections
- 1 pair of types, where a type in packages.flow-transform.src.transform.comments uses a type in lib.lib_es2015_core.
- The types involved
packages.flow-transform.src.transform.comments.comments→lib.lib_es2015_core.ReadonlyArray
- Direction
- packages.flow-transform.src.transform.comments uses lib.lib_es2015_core, so a change to lib.lib_es2015_core can break packages.flow-transform.src.transform.comments, while a change to packages.flow-transform.src.transform.comments can't break lib.lib_es2015_core.
- Position
- Below the diagonal: packages.flow-transform.src.transform.comments uses a module listed above it, which is the healthy direction.
30→16 packages.flow-transform.src.transform.comments uses packages.flow-api-translator.src.utils.ts-estree-ast-types✕
- Connections
- 2 pairs of types, where a type in packages.flow-transform.src.transform.comments uses a type in packages.flow-api-translator.src.utils.ts-estree-ast-types.
- The types involved
packages.flow-transform.src.transform.comments.comments→packages.flow-api-translator.src.utils.ts-estree-ast-types.Commentpackages.flow-transform.src.transform.comments.comments→packages.flow-api-translator.src.utils.ts-estree-ast-types.Program
- Direction
- packages.flow-transform.src.transform.comments uses packages.flow-api-translator.src.utils.ts-estree-ast-types, so a change to packages.flow-api-translator.src.utils.ts-estree-ast-types can break packages.flow-transform.src.transform.comments, while a change to packages.flow-transform.src.transform.comments can't break packages.flow-api-translator.src.utils.ts-estree-ast-types.
- Position
- Below the diagonal: packages.flow-transform.src.transform.comments uses a module listed above it, which is the healthy direction.
30→21 packages.flow-transform.src.transform.comments uses packages.flow-estree.src.types✕
- Connections
- 1 pair of types, where a type in packages.flow-transform.src.transform.comments uses a type in packages.flow-estree.src.types.
- The types involved
packages.flow-transform.src.transform.comments.comments→packages.flow-estree.src.types.ESNode
- Direction
- packages.flow-transform.src.transform.comments uses packages.flow-estree.src.types, so a change to packages.flow-estree.src.types can break packages.flow-transform.src.transform.comments, while a change to packages.flow-transform.src.transform.comments can't break packages.flow-estree.src.types.
- Position
- Below the diagonal: packages.flow-transform.src.transform.comments uses a module listed above it, which is the healthy direction.
31→5 packages.flow-transform.src.transform.mutations uses newtests.lsp.queries.hover_refs✕
- Connections
- 1 pair of types, where a type in packages.flow-transform.src.transform.mutations uses a type in newtests.lsp.queries.hover_refs.
- The types involved
packages.flow-transform.src.transform.mutations.RemoveComment→newtests.lsp.queries.hover_refs.T
- Direction
- packages.flow-transform.src.transform.mutations uses newtests.lsp.queries.hover_refs, so a change to newtests.lsp.queries.hover_refs can break packages.flow-transform.src.transform.mutations, while a change to packages.flow-transform.src.transform.mutations can't break newtests.lsp.queries.hover_refs.
- Position
- Below the diagonal: packages.flow-transform.src.transform.mutations uses a module listed above it, which is the healthy direction.
31→11 packages.flow-transform.src.transform.mutations uses lib.lib_es2015_collection✕
- Connections
- 2 pairs of types, where a type in packages.flow-transform.src.transform.mutations uses a type in lib.lib_es2015_collection.
- The types involved
packages.flow-transform.src.transform.mutations.RemoveComment→lib.lib_es2015_collection.ReadonlySetpackages.flow-transform.src.transform.mutations.RemoveComment→lib.lib_es2015_collection.Set
- Direction
- packages.flow-transform.src.transform.mutations uses lib.lib_es2015_collection, so a change to lib.lib_es2015_collection can break packages.flow-transform.src.transform.mutations, while a change to packages.flow-transform.src.transform.mutations can't break lib.lib_es2015_collection.
- Position
- Below the diagonal: packages.flow-transform.src.transform.mutations uses a module listed above it, which is the healthy direction.
31→12 packages.flow-transform.src.transform.mutations uses lib.lib_es2015_core✕
- Connections
- 1 pair of types, where a type in packages.flow-transform.src.transform.mutations uses a type in lib.lib_es2015_core.
- The types involved
packages.flow-transform.src.transform.mutations.RemoveComment→lib.lib_es2015_core.ReadonlyArray
- Direction
- packages.flow-transform.src.transform.mutations uses lib.lib_es2015_core, so a change to lib.lib_es2015_core can break packages.flow-transform.src.transform.mutations, while a change to packages.flow-transform.src.transform.mutations can't break lib.lib_es2015_core.
- Position
- Below the diagonal: packages.flow-transform.src.transform.mutations uses a module listed above it, which is the healthy direction.
31→16 packages.flow-transform.src.transform.mutations uses packages.flow-api-translator.src.utils.ts-estree-ast-types✕
- Connections
- 1 pair of types, where a type in packages.flow-transform.src.transform.mutations uses a type in packages.flow-api-translator.src.utils.ts-estree-ast-types.
- The types involved
packages.flow-transform.src.transform.mutations.RemoveComment→packages.flow-api-translator.src.utils.ts-estree-ast-types.Program
- Direction
- packages.flow-transform.src.transform.mutations uses packages.flow-api-translator.src.utils.ts-estree-ast-types, so a change to packages.flow-api-translator.src.utils.ts-estree-ast-types can break packages.flow-transform.src.transform.mutations, while a change to packages.flow-transform.src.transform.mutations can't break packages.flow-api-translator.src.utils.ts-estree-ast-types.
- Position
- Below the diagonal: packages.flow-transform.src.transform.mutations uses a module listed above it, which is the healthy direction.
31→21 packages.flow-transform.src.transform.mutations uses packages.flow-estree.src.types✕
- Connections
- 6 pairs of types, where a type in packages.flow-transform.src.transform.mutations uses a type in packages.flow-estree.src.types.
- The types involved
packages.flow-transform.src.transform.mutations.InsertStatement→packages.flow-estree.src.types.ESNodepackages.flow-transform.src.transform.mutations.ModifyNodeInPlace→packages.flow-estree.src.types.ESNodepackages.flow-transform.src.transform.mutations.RemoveNode→packages.flow-estree.src.types.ESNodepackages.flow-transform.src.transform.mutations.RemoveStatement→packages.flow-estree.src.types.ESNodepackages.flow-transform.src.transform.mutations.ReplaceNode→packages.flow-estree.src.types.ESNodepackages.flow-transform.src.transform.mutations.ReplaceStatementWithMany→packages.flow-estree.src.types.ESNode
- Direction
- packages.flow-transform.src.transform.mutations uses packages.flow-estree.src.types, so a change to packages.flow-estree.src.types can break packages.flow-transform.src.transform.mutations, while a change to packages.flow-transform.src.transform.mutations can't break packages.flow-estree.src.types.
- Position
- Below the diagonal: packages.flow-transform.src.transform.mutations uses a module listed above it, which is the healthy direction.
32→8 packages.flow-eslint.src.scope-manager.scope.ScopeBase uses packages.flow-eslint.src.scope-manager.scope.Scope✕
- Connections
- 1 pair of types, where a type in packages.flow-eslint.src.scope-manager.scope.ScopeBase uses a type in packages.flow-eslint.src.scope-manager.scope.Scope.
- The types involved
packages.flow-eslint.src.scope-manager.scope.ScopeBase.ScopeBase→packages.flow-eslint.src.scope-manager.scope.Scope.Scope
- Direction
- packages.flow-eslint.src.scope-manager.scope.ScopeBase uses packages.flow-eslint.src.scope-manager.scope.Scope, so a change to packages.flow-eslint.src.scope-manager.scope.Scope can break packages.flow-eslint.src.scope-manager.scope.ScopeBase, while a change to packages.flow-eslint.src.scope-manager.scope.ScopeBase can't break packages.flow-eslint.src.scope-manager.scope.Scope.
- Position
- Below the diagonal: packages.flow-eslint.src.scope-manager.scope.ScopeBase uses a module listed above it, which is the healthy direction.
32→11 packages.flow-eslint.src.scope-manager.scope.ScopeBase uses lib.lib_es2015_collection✕
- Connections
- 2 pairs of types, where a type in packages.flow-eslint.src.scope-manager.scope.ScopeBase uses a type in lib.lib_es2015_collection.
- The types involved
packages.flow-eslint.src.scope-manager.scope.ScopeBase.ScopeBase→lib.lib_es2015_collection.Mappackages.flow-eslint.src.scope-manager.scope.ScopeBase.ScopeBase→lib.lib_es2015_collection.WeakMap
- Direction
- packages.flow-eslint.src.scope-manager.scope.ScopeBase uses lib.lib_es2015_collection, so a change to lib.lib_es2015_collection can break packages.flow-eslint.src.scope-manager.scope.ScopeBase, while a change to packages.flow-eslint.src.scope-manager.scope.ScopeBase can't break lib.lib_es2015_collection.
- Position
- Below the diagonal: packages.flow-eslint.src.scope-manager.scope.ScopeBase uses a module listed above it, which is the healthy direction.
32→12 packages.flow-eslint.src.scope-manager.scope.ScopeBase uses lib.lib_es2015_core✕
- Connections
- 1 pair of types, where a type in packages.flow-eslint.src.scope-manager.scope.ScopeBase uses a type in lib.lib_es2015_core.
- The types involved
packages.flow-eslint.src.scope-manager.scope.ScopeBase.ScopeBase→lib.lib_es2015_core.Array
- Direction
- packages.flow-eslint.src.scope-manager.scope.ScopeBase uses lib.lib_es2015_core, so a change to lib.lib_es2015_core can break packages.flow-eslint.src.scope-manager.scope.ScopeBase, while a change to packages.flow-eslint.src.scope-manager.scope.ScopeBase can't break lib.lib_es2015_core.
- Position
- Below the diagonal: packages.flow-eslint.src.scope-manager.scope.ScopeBase uses a module listed above it, which is the healthy direction.
32→13 packages.flow-eslint.src.scope-manager.scope.ScopeBase uses packages.flow-eslint.src.scope-manager.referencer.Reference✕
- Connections
- 1 pair of types, where a type in packages.flow-eslint.src.scope-manager.scope.ScopeBase uses a type in packages.flow-eslint.src.scope-manager.referencer.Reference.
- The types involved
packages.flow-eslint.src.scope-manager.scope.ScopeBase.ScopeBase→packages.flow-eslint.src.scope-manager.referencer.Reference.Reference
- Direction
- packages.flow-eslint.src.scope-manager.scope.ScopeBase uses packages.flow-eslint.src.scope-manager.referencer.Reference, so a change to packages.flow-eslint.src.scope-manager.referencer.Reference can break packages.flow-eslint.src.scope-manager.scope.ScopeBase, while a change to packages.flow-eslint.src.scope-manager.scope.ScopeBase can't break packages.flow-eslint.src.scope-manager.referencer.Reference.
- Position
- Below the diagonal: packages.flow-eslint.src.scope-manager.scope.ScopeBase uses a module listed above it, which is the healthy direction.
32→21 packages.flow-eslint.src.scope-manager.scope.ScopeBase uses packages.flow-estree.src.types✕
- Connections
- 1 pair of types, where a type in packages.flow-eslint.src.scope-manager.scope.ScopeBase uses a type in packages.flow-estree.src.types.
- The types involved
packages.flow-eslint.src.scope-manager.scope.ScopeBase.ScopeBase→packages.flow-estree.src.types.ESNode
- Direction
- packages.flow-eslint.src.scope-manager.scope.ScopeBase uses packages.flow-estree.src.types, so a change to packages.flow-estree.src.types can break packages.flow-eslint.src.scope-manager.scope.ScopeBase, while a change to packages.flow-eslint.src.scope-manager.scope.ScopeBase can't break packages.flow-estree.src.types.
- Position
- Below the diagonal: packages.flow-eslint.src.scope-manager.scope.ScopeBase uses a module listed above it, which is the healthy direction.
32→27 packages.flow-eslint.src.scope-manager.scope.ScopeBase uses packages.flow-eslint.src.scope-manager.variable.Variable✕
- Connections
- 1 pair of types, where a type in packages.flow-eslint.src.scope-manager.scope.ScopeBase uses a type in packages.flow-eslint.src.scope-manager.variable.Variable.
- The types involved
packages.flow-eslint.src.scope-manager.scope.ScopeBase.ScopeBase→packages.flow-eslint.src.scope-manager.variable.Variable.Variable
- Direction
- packages.flow-eslint.src.scope-manager.scope.ScopeBase uses packages.flow-eslint.src.scope-manager.variable.Variable, so a change to packages.flow-eslint.src.scope-manager.variable.Variable can break packages.flow-eslint.src.scope-manager.scope.ScopeBase, while a change to packages.flow-eslint.src.scope-manager.scope.ScopeBase can't break packages.flow-eslint.src.scope-manager.variable.Variable.
- Position
- Below the diagonal: packages.flow-eslint.src.scope-manager.scope.ScopeBase uses a module listed above it, which is the healthy direction.
33→11 packages.flow-for-vscode.src.FlowLanguageClient uses lib.lib_es2015_collection✕
- Connections
- 2 pairs of types, where a type in packages.flow-for-vscode.src.FlowLanguageClient uses a type in lib.lib_es2015_collection.
- The types involved
packages.flow-for-vscode.src.FlowLanguageClient.SemanticDecorations→lib.lib_es2015_collection.Mappackages.flow-for-vscode.src.FlowLanguageClient.createMiddleware→lib.lib_es2015_collection.Map
- Direction
- packages.flow-for-vscode.src.FlowLanguageClient uses lib.lib_es2015_collection, so a change to lib.lib_es2015_collection can break packages.flow-for-vscode.src.FlowLanguageClient, while a change to packages.flow-for-vscode.src.FlowLanguageClient can't break lib.lib_es2015_collection.
- Position
- Below the diagonal: packages.flow-for-vscode.src.FlowLanguageClient uses a module listed above it, which is the healthy direction.
33→12 packages.flow-for-vscode.src.FlowLanguageClient uses lib.lib_es2015_core✕
- Connections
- 1 pair of types, where a type in packages.flow-for-vscode.src.FlowLanguageClient uses a type in lib.lib_es2015_core.
- The types involved
packages.flow-for-vscode.src.FlowLanguageClient.SemanticDecorations→lib.lib_es2015_core.Array
- Direction
- packages.flow-for-vscode.src.FlowLanguageClient uses lib.lib_es2015_core, so a change to lib.lib_es2015_core can break packages.flow-for-vscode.src.FlowLanguageClient, while a change to packages.flow-for-vscode.src.FlowLanguageClient can't break lib.lib_es2015_core.
- Position
- Below the diagonal: packages.flow-for-vscode.src.FlowLanguageClient uses a module listed above it, which is the healthy direction.
33→15 packages.flow-for-vscode.src.FlowLanguageClient uses lib.lib_es5✕
- Connections
- 2 pairs of types, where a type in packages.flow-for-vscode.src.FlowLanguageClient uses a type in lib.lib_es5.
- The types involved
packages.flow-for-vscode.src.FlowLanguageClient.DetailedDiagnostics→lib.lib_es5.Promisepackages.flow-for-vscode.src.FlowLanguageClient.SemanticDecorations→lib.lib_es5.Promise
- Direction
- packages.flow-for-vscode.src.FlowLanguageClient uses lib.lib_es5, so a change to lib.lib_es5 can break packages.flow-for-vscode.src.FlowLanguageClient, while a change to packages.flow-for-vscode.src.FlowLanguageClient can't break lib.lib_es5.
- Position
- Below the diagonal: packages.flow-for-vscode.src.FlowLanguageClient uses a module listed above it, which is the healthy direction.
33→28 packages.flow-for-vscode.src.FlowLanguageClient uses packages.flow-for-vscode.src.FlowClients✕
- Connections
- 2 pairs of types, where a type in packages.flow-for-vscode.src.FlowLanguageClient uses a type in packages.flow-for-vscode.src.FlowClients.
- The types involved
packages.flow-for-vscode.src.FlowLanguageClient.DetailedDiagnostics→packages.flow-for-vscode.src.FlowClients.FlowClientspackages.flow-for-vscode.src.FlowLanguageClient.SemanticDecorations→packages.flow-for-vscode.src.FlowClients.FlowClients
- Direction
- packages.flow-for-vscode.src.FlowLanguageClient uses packages.flow-for-vscode.src.FlowClients, so a change to packages.flow-for-vscode.src.FlowClients can break packages.flow-for-vscode.src.FlowLanguageClient, while a change to packages.flow-for-vscode.src.FlowLanguageClient can't break packages.flow-for-vscode.src.FlowClients.
- Position
- Below the diagonal: packages.flow-for-vscode.src.FlowLanguageClient uses a module listed above it, which is the healthy direction.
34→13 packages.flow-eslint.src.scope-manager.scope.ComponentScope uses packages.flow-eslint.src.scope-manager.referencer.Reference✕
- Connections
- 1 pair of types, where a type in packages.flow-eslint.src.scope-manager.scope.ComponentScope uses a type in packages.flow-eslint.src.scope-manager.referencer.Reference.
- The types involved
packages.flow-eslint.src.scope-manager.scope.ComponentScope.ComponentScope→packages.flow-eslint.src.scope-manager.referencer.Reference.Reference
- Direction
- packages.flow-eslint.src.scope-manager.scope.ComponentScope uses packages.flow-eslint.src.scope-manager.referencer.Reference, so a change to packages.flow-eslint.src.scope-manager.referencer.Reference can break packages.flow-eslint.src.scope-manager.scope.ComponentScope, while a change to packages.flow-eslint.src.scope-manager.scope.ComponentScope can't break packages.flow-eslint.src.scope-manager.referencer.Reference.
- Position
- Below the diagonal: packages.flow-eslint.src.scope-manager.scope.ComponentScope uses a module listed above it, which is the healthy direction.
34→27 packages.flow-eslint.src.scope-manager.scope.ComponentScope uses packages.flow-eslint.src.scope-manager.variable.Variable✕
- Connections
- 1 pair of types, where a type in packages.flow-eslint.src.scope-manager.scope.ComponentScope uses a type in packages.flow-eslint.src.scope-manager.variable.Variable.
- The types involved
packages.flow-eslint.src.scope-manager.scope.ComponentScope.ComponentScope→packages.flow-eslint.src.scope-manager.variable.Variable.Variable
- Direction
- packages.flow-eslint.src.scope-manager.scope.ComponentScope uses packages.flow-eslint.src.scope-manager.variable.Variable, so a change to packages.flow-eslint.src.scope-manager.variable.Variable can break packages.flow-eslint.src.scope-manager.scope.ComponentScope, while a change to packages.flow-eslint.src.scope-manager.scope.ComponentScope can't break packages.flow-eslint.src.scope-manager.variable.Variable.
- Position
- Below the diagonal: packages.flow-eslint.src.scope-manager.scope.ComponentScope uses a module listed above it, which is the healthy direction.
34→32 packages.flow-eslint.src.scope-manager.scope.ComponentScope uses packages.flow-eslint.src.scope-manager.scope.ScopeBase✕
- Connections
- 1 pair of types, where a type in packages.flow-eslint.src.scope-manager.scope.ComponentScope uses a type in packages.flow-eslint.src.scope-manager.scope.ScopeBase.
- The types involved
packages.flow-eslint.src.scope-manager.scope.ComponentScope.ComponentScope→packages.flow-eslint.src.scope-manager.scope.ScopeBase.ScopeBase
- Direction
- packages.flow-eslint.src.scope-manager.scope.ComponentScope uses packages.flow-eslint.src.scope-manager.scope.ScopeBase, so a change to packages.flow-eslint.src.scope-manager.scope.ScopeBase can break packages.flow-eslint.src.scope-manager.scope.ComponentScope, while a change to packages.flow-eslint.src.scope-manager.scope.ComponentScope can't break packages.flow-eslint.src.scope-manager.scope.ScopeBase.
- Position
- Below the diagonal: packages.flow-eslint.src.scope-manager.scope.ComponentScope uses a module listed above it, which is the healthy direction.
34→37 packages.flow-eslint.src.scope-manager.scope.ComponentScope uses packages.flow-eslint.src.scope-manager.ScopeManager part of a loop✕
- Connections
- 1 pair of types, where a type in packages.flow-eslint.src.scope-manager.scope.ComponentScope uses a type in packages.flow-eslint.src.scope-manager.ScopeManager.
- The types involved
packages.flow-eslint.src.scope-manager.scope.ComponentScope.ComponentScope→packages.flow-eslint.src.scope-manager.ScopeManager.ScopeManager
- Direction
- packages.flow-eslint.src.scope-manager.scope.ComponentScope uses packages.flow-eslint.src.scope-manager.ScopeManager, so a change to packages.flow-eslint.src.scope-manager.ScopeManager can break packages.flow-eslint.src.scope-manager.scope.ComponentScope, while a change to packages.flow-eslint.src.scope-manager.scope.ComponentScope can't break packages.flow-eslint.src.scope-manager.ScopeManager.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
35→13 packages.flow-eslint.src.scope-manager.scope.FunctionScope uses packages.flow-eslint.src.scope-manager.referencer.Reference✕
- Connections
- 1 pair of types, where a type in packages.flow-eslint.src.scope-manager.scope.FunctionScope uses a type in packages.flow-eslint.src.scope-manager.referencer.Reference.
- The types involved
packages.flow-eslint.src.scope-manager.scope.FunctionScope.FunctionScope→packages.flow-eslint.src.scope-manager.referencer.Reference.Reference
- Direction
- packages.flow-eslint.src.scope-manager.scope.FunctionScope uses packages.flow-eslint.src.scope-manager.referencer.Reference, so a change to packages.flow-eslint.src.scope-manager.referencer.Reference can break packages.flow-eslint.src.scope-manager.scope.FunctionScope, while a change to packages.flow-eslint.src.scope-manager.scope.FunctionScope can't break packages.flow-eslint.src.scope-manager.referencer.Reference.
- Position
- Below the diagonal: packages.flow-eslint.src.scope-manager.scope.FunctionScope uses a module listed above it, which is the healthy direction.
35→27 packages.flow-eslint.src.scope-manager.scope.FunctionScope uses packages.flow-eslint.src.scope-manager.variable.Variable✕
- Connections
- 1 pair of types, where a type in packages.flow-eslint.src.scope-manager.scope.FunctionScope uses a type in packages.flow-eslint.src.scope-manager.variable.Variable.
- The types involved
packages.flow-eslint.src.scope-manager.scope.FunctionScope.FunctionScope→packages.flow-eslint.src.scope-manager.variable.Variable.Variable
- Direction
- packages.flow-eslint.src.scope-manager.scope.FunctionScope uses packages.flow-eslint.src.scope-manager.variable.Variable, so a change to packages.flow-eslint.src.scope-manager.variable.Variable can break packages.flow-eslint.src.scope-manager.scope.FunctionScope, while a change to packages.flow-eslint.src.scope-manager.scope.FunctionScope can't break packages.flow-eslint.src.scope-manager.variable.Variable.
- Position
- Below the diagonal: packages.flow-eslint.src.scope-manager.scope.FunctionScope uses a module listed above it, which is the healthy direction.
35→32 packages.flow-eslint.src.scope-manager.scope.FunctionScope uses packages.flow-eslint.src.scope-manager.scope.ScopeBase✕
- Connections
- 1 pair of types, where a type in packages.flow-eslint.src.scope-manager.scope.FunctionScope uses a type in packages.flow-eslint.src.scope-manager.scope.ScopeBase.
- The types involved
packages.flow-eslint.src.scope-manager.scope.FunctionScope.FunctionScope→packages.flow-eslint.src.scope-manager.scope.ScopeBase.ScopeBase
- Direction
- packages.flow-eslint.src.scope-manager.scope.FunctionScope uses packages.flow-eslint.src.scope-manager.scope.ScopeBase, so a change to packages.flow-eslint.src.scope-manager.scope.ScopeBase can break packages.flow-eslint.src.scope-manager.scope.FunctionScope, while a change to packages.flow-eslint.src.scope-manager.scope.FunctionScope can't break packages.flow-eslint.src.scope-manager.scope.ScopeBase.
- Position
- Below the diagonal: packages.flow-eslint.src.scope-manager.scope.FunctionScope uses a module listed above it, which is the healthy direction.
35→37 packages.flow-eslint.src.scope-manager.scope.FunctionScope uses packages.flow-eslint.src.scope-manager.ScopeManager part of a loop✕
- Connections
- 1 pair of types, where a type in packages.flow-eslint.src.scope-manager.scope.FunctionScope uses a type in packages.flow-eslint.src.scope-manager.ScopeManager.
- The types involved
packages.flow-eslint.src.scope-manager.scope.FunctionScope.FunctionScope→packages.flow-eslint.src.scope-manager.ScopeManager.ScopeManager
- Direction
- packages.flow-eslint.src.scope-manager.scope.FunctionScope uses packages.flow-eslint.src.scope-manager.ScopeManager, so a change to packages.flow-eslint.src.scope-manager.ScopeManager can break packages.flow-eslint.src.scope-manager.scope.FunctionScope, while a change to packages.flow-eslint.src.scope-manager.scope.FunctionScope can't break packages.flow-eslint.src.scope-manager.ScopeManager.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
36→13 packages.flow-eslint.src.scope-manager.scope.HookScope uses packages.flow-eslint.src.scope-manager.referencer.Reference✕
- Connections
- 1 pair of types, where a type in packages.flow-eslint.src.scope-manager.scope.HookScope uses a type in packages.flow-eslint.src.scope-manager.referencer.Reference.
- The types involved
packages.flow-eslint.src.scope-manager.scope.HookScope.HookScope→packages.flow-eslint.src.scope-manager.referencer.Reference.Reference
- Direction
- packages.flow-eslint.src.scope-manager.scope.HookScope uses packages.flow-eslint.src.scope-manager.referencer.Reference, so a change to packages.flow-eslint.src.scope-manager.referencer.Reference can break packages.flow-eslint.src.scope-manager.scope.HookScope, while a change to packages.flow-eslint.src.scope-manager.scope.HookScope can't break packages.flow-eslint.src.scope-manager.referencer.Reference.
- Position
- Below the diagonal: packages.flow-eslint.src.scope-manager.scope.HookScope uses a module listed above it, which is the healthy direction.
36→27 packages.flow-eslint.src.scope-manager.scope.HookScope uses packages.flow-eslint.src.scope-manager.variable.Variable✕
- Connections
- 1 pair of types, where a type in packages.flow-eslint.src.scope-manager.scope.HookScope uses a type in packages.flow-eslint.src.scope-manager.variable.Variable.
- The types involved
packages.flow-eslint.src.scope-manager.scope.HookScope.HookScope→packages.flow-eslint.src.scope-manager.variable.Variable.Variable
- Direction
- packages.flow-eslint.src.scope-manager.scope.HookScope uses packages.flow-eslint.src.scope-manager.variable.Variable, so a change to packages.flow-eslint.src.scope-manager.variable.Variable can break packages.flow-eslint.src.scope-manager.scope.HookScope, while a change to packages.flow-eslint.src.scope-manager.scope.HookScope can't break packages.flow-eslint.src.scope-manager.variable.Variable.
- Position
- Below the diagonal: packages.flow-eslint.src.scope-manager.scope.HookScope uses a module listed above it, which is the healthy direction.
36→32 packages.flow-eslint.src.scope-manager.scope.HookScope uses packages.flow-eslint.src.scope-manager.scope.ScopeBase✕
- Connections
- 1 pair of types, where a type in packages.flow-eslint.src.scope-manager.scope.HookScope uses a type in packages.flow-eslint.src.scope-manager.scope.ScopeBase.
- The types involved
packages.flow-eslint.src.scope-manager.scope.HookScope.HookScope→packages.flow-eslint.src.scope-manager.scope.ScopeBase.ScopeBase
- Direction
- packages.flow-eslint.src.scope-manager.scope.HookScope uses packages.flow-eslint.src.scope-manager.scope.ScopeBase, so a change to packages.flow-eslint.src.scope-manager.scope.ScopeBase can break packages.flow-eslint.src.scope-manager.scope.HookScope, while a change to packages.flow-eslint.src.scope-manager.scope.HookScope can't break packages.flow-eslint.src.scope-manager.scope.ScopeBase.
- Position
- Below the diagonal: packages.flow-eslint.src.scope-manager.scope.HookScope uses a module listed above it, which is the healthy direction.
36→37 packages.flow-eslint.src.scope-manager.scope.HookScope uses packages.flow-eslint.src.scope-manager.ScopeManager part of a loop✕
- Connections
- 1 pair of types, where a type in packages.flow-eslint.src.scope-manager.scope.HookScope uses a type in packages.flow-eslint.src.scope-manager.ScopeManager.
- The types involved
packages.flow-eslint.src.scope-manager.scope.HookScope.HookScope→packages.flow-eslint.src.scope-manager.ScopeManager.ScopeManager
- Direction
- packages.flow-eslint.src.scope-manager.scope.HookScope uses packages.flow-eslint.src.scope-manager.ScopeManager, so a change to packages.flow-eslint.src.scope-manager.ScopeManager can break packages.flow-eslint.src.scope-manager.scope.HookScope, while a change to packages.flow-eslint.src.scope-manager.scope.HookScope can't break packages.flow-eslint.src.scope-manager.ScopeManager.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
37→5 packages.flow-eslint.src.scope-manager.ScopeManager uses newtests.lsp.queries.hover_refs✕
- Connections
- 1 pair of types, where a type in packages.flow-eslint.src.scope-manager.ScopeManager uses a type in newtests.lsp.queries.hover_refs.
- The types involved
packages.flow-eslint.src.scope-manager.ScopeManager.ScopeManager→newtests.lsp.queries.hover_refs.T
- Direction
- packages.flow-eslint.src.scope-manager.ScopeManager uses newtests.lsp.queries.hover_refs, so a change to newtests.lsp.queries.hover_refs can break packages.flow-eslint.src.scope-manager.ScopeManager, while a change to packages.flow-eslint.src.scope-manager.ScopeManager can't break newtests.lsp.queries.hover_refs.
- Position
- Below the diagonal: packages.flow-eslint.src.scope-manager.ScopeManager uses a module listed above it, which is the healthy direction.
37→8 packages.flow-eslint.src.scope-manager.ScopeManager uses packages.flow-eslint.src.scope-manager.scope.Scope✕
- Connections
- 1 pair of types, where a type in packages.flow-eslint.src.scope-manager.ScopeManager uses a type in packages.flow-eslint.src.scope-manager.scope.Scope.
- The types involved
packages.flow-eslint.src.scope-manager.ScopeManager.ScopeManager→packages.flow-eslint.src.scope-manager.scope.Scope.Scope
- Direction
- packages.flow-eslint.src.scope-manager.ScopeManager uses packages.flow-eslint.src.scope-manager.scope.Scope, so a change to packages.flow-eslint.src.scope-manager.scope.Scope can break packages.flow-eslint.src.scope-manager.ScopeManager, while a change to packages.flow-eslint.src.scope-manager.ScopeManager can't break packages.flow-eslint.src.scope-manager.scope.Scope.
- Position
- Below the diagonal: packages.flow-eslint.src.scope-manager.ScopeManager uses a module listed above it, which is the healthy direction.
37→11 packages.flow-eslint.src.scope-manager.ScopeManager uses lib.lib_es2015_collection✕
- Connections
- 1 pair of types, where a type in packages.flow-eslint.src.scope-manager.ScopeManager uses a type in lib.lib_es2015_collection.
- The types involved
packages.flow-eslint.src.scope-manager.ScopeManager.ScopeManager→lib.lib_es2015_collection.WeakMap
- Direction
- packages.flow-eslint.src.scope-manager.ScopeManager uses lib.lib_es2015_collection, so a change to lib.lib_es2015_collection can break packages.flow-eslint.src.scope-manager.ScopeManager, while a change to packages.flow-eslint.src.scope-manager.ScopeManager can't break lib.lib_es2015_collection.
- Position
- Below the diagonal: packages.flow-eslint.src.scope-manager.ScopeManager uses a module listed above it, which is the healthy direction.
37→12 packages.flow-eslint.src.scope-manager.ScopeManager uses lib.lib_es2015_core✕
- Connections
- 2 pairs of types, where a type in packages.flow-eslint.src.scope-manager.ScopeManager uses a type in lib.lib_es2015_core.
- The types involved
packages.flow-eslint.src.scope-manager.ScopeManager.ScopeManager→lib.lib_es2015_core.Arraypackages.flow-eslint.src.scope-manager.ScopeManager.ScopeManager→lib.lib_es2015_core.ReadonlyArray
- Direction
- packages.flow-eslint.src.scope-manager.ScopeManager uses lib.lib_es2015_core, so a change to lib.lib_es2015_core can break packages.flow-eslint.src.scope-manager.ScopeManager, while a change to packages.flow-eslint.src.scope-manager.ScopeManager can't break lib.lib_es2015_core.
- Position
- Below the diagonal: packages.flow-eslint.src.scope-manager.ScopeManager uses a module listed above it, which is the healthy direction.
37→21 packages.flow-eslint.src.scope-manager.ScopeManager uses packages.flow-estree.src.types✕
- Connections
- 1 pair of types, where a type in packages.flow-eslint.src.scope-manager.ScopeManager uses a type in packages.flow-estree.src.types.
- The types involved
packages.flow-eslint.src.scope-manager.ScopeManager.ScopeManager→packages.flow-estree.src.types.ESNode
- Direction
- packages.flow-eslint.src.scope-manager.ScopeManager uses packages.flow-estree.src.types, so a change to packages.flow-estree.src.types can break packages.flow-eslint.src.scope-manager.ScopeManager, while a change to packages.flow-eslint.src.scope-manager.ScopeManager can't break packages.flow-estree.src.types.
- Position
- Below the diagonal: packages.flow-eslint.src.scope-manager.ScopeManager uses a module listed above it, which is the healthy direction.
37→27 packages.flow-eslint.src.scope-manager.ScopeManager uses packages.flow-eslint.src.scope-manager.variable.Variable✕
- Connections
- 1 pair of types, where a type in packages.flow-eslint.src.scope-manager.ScopeManager uses a type in packages.flow-eslint.src.scope-manager.variable.Variable.
- The types involved
packages.flow-eslint.src.scope-manager.ScopeManager.ScopeManager→packages.flow-eslint.src.scope-manager.variable.Variable.Variable
- Direction
- packages.flow-eslint.src.scope-manager.ScopeManager uses packages.flow-eslint.src.scope-manager.variable.Variable, so a change to packages.flow-eslint.src.scope-manager.variable.Variable can break packages.flow-eslint.src.scope-manager.ScopeManager, while a change to packages.flow-eslint.src.scope-manager.ScopeManager can't break packages.flow-eslint.src.scope-manager.variable.Variable.
- Position
- Below the diagonal: packages.flow-eslint.src.scope-manager.ScopeManager uses a module listed above it, which is the healthy direction.
37→34 packages.flow-eslint.src.scope-manager.ScopeManager uses packages.flow-eslint.src.scope-manager.scope.ComponentScope✕
- Connections
- 1 pair of types, where a type in packages.flow-eslint.src.scope-manager.ScopeManager uses a type in packages.flow-eslint.src.scope-manager.scope.ComponentScope.
- The types involved
packages.flow-eslint.src.scope-manager.ScopeManager.ScopeManager→packages.flow-eslint.src.scope-manager.scope.ComponentScope.ComponentScope
- Direction
- packages.flow-eslint.src.scope-manager.ScopeManager uses packages.flow-eslint.src.scope-manager.scope.ComponentScope, so a change to packages.flow-eslint.src.scope-manager.scope.ComponentScope can break packages.flow-eslint.src.scope-manager.ScopeManager, while a change to packages.flow-eslint.src.scope-manager.ScopeManager can't break packages.flow-eslint.src.scope-manager.scope.ComponentScope.
- Position
- Below the diagonal: packages.flow-eslint.src.scope-manager.ScopeManager uses a module listed above it, which is the healthy direction.
37→35 packages.flow-eslint.src.scope-manager.ScopeManager uses packages.flow-eslint.src.scope-manager.scope.FunctionScope✕
- Connections
- 1 pair of types, where a type in packages.flow-eslint.src.scope-manager.ScopeManager uses a type in packages.flow-eslint.src.scope-manager.scope.FunctionScope.
- The types involved
packages.flow-eslint.src.scope-manager.ScopeManager.ScopeManager→packages.flow-eslint.src.scope-manager.scope.FunctionScope.FunctionScope
- Direction
- packages.flow-eslint.src.scope-manager.ScopeManager uses packages.flow-eslint.src.scope-manager.scope.FunctionScope, so a change to packages.flow-eslint.src.scope-manager.scope.FunctionScope can break packages.flow-eslint.src.scope-manager.ScopeManager, while a change to packages.flow-eslint.src.scope-manager.ScopeManager can't break packages.flow-eslint.src.scope-manager.scope.FunctionScope.
- Position
- Below the diagonal: packages.flow-eslint.src.scope-manager.ScopeManager uses a module listed above it, which is the healthy direction.
37→36 packages.flow-eslint.src.scope-manager.ScopeManager uses packages.flow-eslint.src.scope-manager.scope.HookScope✕
- Connections
- 1 pair of types, where a type in packages.flow-eslint.src.scope-manager.ScopeManager uses a type in packages.flow-eslint.src.scope-manager.scope.HookScope.
- The types involved
packages.flow-eslint.src.scope-manager.ScopeManager.ScopeManager→packages.flow-eslint.src.scope-manager.scope.HookScope.HookScope
- Direction
- packages.flow-eslint.src.scope-manager.ScopeManager uses packages.flow-eslint.src.scope-manager.scope.HookScope, so a change to packages.flow-eslint.src.scope-manager.scope.HookScope can break packages.flow-eslint.src.scope-manager.ScopeManager, while a change to packages.flow-eslint.src.scope-manager.ScopeManager can't break packages.flow-eslint.src.scope-manager.scope.HookScope.
- Position
- Below the diagonal: packages.flow-eslint.src.scope-manager.ScopeManager uses a module listed above it, which is the healthy direction.
38→5 packages.flow-api-translator.src uses newtests.lsp.queries.hover_refs✕
- Connections
- 2 pairs of types, where a type in packages.flow-api-translator.src uses a type in newtests.lsp.queries.hover_refs.
- The types involved
packages.flow-api-translator.src.TSDefToFlowDef→newtests.lsp.queries.hover_refs.Tpackages.flow-api-translator.src.flowDefToTSDef→newtests.lsp.queries.hover_refs.T
- Direction
- packages.flow-api-translator.src uses newtests.lsp.queries.hover_refs, so a change to newtests.lsp.queries.hover_refs can break packages.flow-api-translator.src, while a change to packages.flow-api-translator.src can't break newtests.lsp.queries.hover_refs.
- Position
- Below the diagonal: packages.flow-api-translator.src uses a module listed above it, which is the healthy direction.
38→11 packages.flow-api-translator.src uses lib.lib_es2015_collection✕
- Connections
- 1 pair of types, where a type in packages.flow-api-translator.src uses a type in lib.lib_es2015_collection.
- The types involved
packages.flow-api-translator.src.flowToFlowDef→lib.lib_es2015_collection.Map
- Direction
- packages.flow-api-translator.src uses lib.lib_es2015_collection, so a change to lib.lib_es2015_collection can break packages.flow-api-translator.src, while a change to packages.flow-api-translator.src can't break lib.lib_es2015_collection.
- Position
- Below the diagonal: packages.flow-api-translator.src uses a module listed above it, which is the healthy direction.
38→12 packages.flow-api-translator.src uses lib.lib_es2015_core✕
- Connections
- 1 pair of types, where a type in packages.flow-api-translator.src uses a type in lib.lib_es2015_core.
- The types involved
packages.flow-api-translator.src.flowToFlowDef→lib.lib_es2015_core.ReadonlyArray
- Direction
- packages.flow-api-translator.src uses lib.lib_es2015_core, so a change to lib.lib_es2015_core can break packages.flow-api-translator.src, while a change to packages.flow-api-translator.src can't break lib.lib_es2015_core.
- Position
- Below the diagonal: packages.flow-api-translator.src uses a module listed above it, which is the healthy direction.
38→16 packages.flow-api-translator.src uses packages.flow-api-translator.src.utils.ts-estree-ast-types✕
- Connections
- 9 pairs of types, where a type in packages.flow-api-translator.src uses a type in packages.flow-api-translator.src.utils.ts-estree-ast-types.
- The types involved
packages.flow-api-translator.src.TSDefToFlowDef→packages.flow-api-translator.src.utils.ts-estree-ast-types.Programpackages.flow-api-translator.src.flowDefToTSDef→packages.flow-api-translator.src.utils.ts-estree-ast-types.EntityNamepackages.flow-api-translator.src.flowDefToTSDef→packages.flow-api-translator.src.utils.ts-estree-ast-types.Identifierpackages.flow-api-translator.src.flowDefToTSDef→packages.flow-api-translator.src.utils.ts-estree-ast-types.Programpackages.flow-api-translator.src.flowImportTo→packages.flow-api-translator.src.utils.ts-estree-ast-types.Programpackages.flow-api-translator.src.flowToFlowDef→packages.flow-api-translator.src.utils.ts-estree-ast-types.Commentpackages.flow-api-translator.src.flowToFlowDef→packages.flow-api-translator.src.utils.ts-estree-ast-types.Programpackages.flow-api-translator.src.flowToFlowDef→packages.flow-api-translator.src.utils.ts-estree-ast-types.ProgramStatementpackages.flow-api-translator.src.flowToJS→packages.flow-api-translator.src.utils.ts-estree-ast-types.Program
- Direction
- packages.flow-api-translator.src uses packages.flow-api-translator.src.utils.ts-estree-ast-types, so a change to packages.flow-api-translator.src.utils.ts-estree-ast-types can break packages.flow-api-translator.src, while a change to packages.flow-api-translator.src can't break packages.flow-api-translator.src.utils.ts-estree-ast-types.
- Position
- Below the diagonal: packages.flow-api-translator.src uses a module listed above it, which is the healthy direction.
38→21 packages.flow-api-translator.src uses packages.flow-estree.src.types✕
- Connections
- 1 pair of types, where a type in packages.flow-api-translator.src uses a type in packages.flow-estree.src.types.
- The types involved
packages.flow-api-translator.src.flowToFlowDef→packages.flow-estree.src.types.ESNode
- Direction
- packages.flow-api-translator.src uses packages.flow-estree.src.types, so a change to packages.flow-estree.src.types can break packages.flow-api-translator.src, while a change to packages.flow-api-translator.src can't break packages.flow-estree.src.types.
- Position
- Below the diagonal: packages.flow-api-translator.src uses a module listed above it, which is the healthy direction.
38→37 packages.flow-api-translator.src uses packages.flow-eslint.src.scope-manager.ScopeManager✕
- Connections
- 4 pairs of types, where a type in packages.flow-api-translator.src uses a type in packages.flow-eslint.src.scope-manager.ScopeManager.
- The types involved
packages.flow-api-translator.src.flowDefToTSDef→packages.flow-eslint.src.scope-manager.ScopeManager.ScopeManagerpackages.flow-api-translator.src.flowImportTo→packages.flow-eslint.src.scope-manager.ScopeManager.ScopeManagerpackages.flow-api-translator.src.flowToFlowDef→packages.flow-eslint.src.scope-manager.ScopeManager.ScopeManagerpackages.flow-api-translator.src.flowToJS→packages.flow-eslint.src.scope-manager.ScopeManager.ScopeManager
- Direction
- packages.flow-api-translator.src uses packages.flow-eslint.src.scope-manager.ScopeManager, so a change to packages.flow-eslint.src.scope-manager.ScopeManager can break packages.flow-api-translator.src, while a change to packages.flow-api-translator.src can't break packages.flow-eslint.src.scope-manager.ScopeManager.
- Position
- Below the diagonal: packages.flow-api-translator.src uses a module listed above it, which is the healthy direction.
39→12 packages.flow-eslint.src.scope-manager.referencer.Referencer uses lib.lib_es2015_core✕
- Connections
- 1 pair of types, where a type in packages.flow-eslint.src.scope-manager.referencer.Referencer uses a type in lib.lib_es2015_core.
- The types involved
packages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→lib.lib_es2015_core.Array
- Direction
- packages.flow-eslint.src.scope-manager.referencer.Referencer uses lib.lib_es2015_core, so a change to lib.lib_es2015_core can break packages.flow-eslint.src.scope-manager.referencer.Referencer, while a change to packages.flow-eslint.src.scope-manager.referencer.Referencer can't break lib.lib_es2015_core.
- Position
- Below the diagonal: packages.flow-eslint.src.scope-manager.referencer.Referencer uses a module listed above it, which is the healthy direction.
39→16 packages.flow-eslint.src.scope-manager.referencer.Referencer uses packages.flow-api-translator.src.utils.ts-estree-ast-types✕
- Connections
- 39 pairs of types, where a type in packages.flow-eslint.src.scope-manager.referencer.Referencer uses a type in packages.flow-api-translator.src.utils.ts-estree-ast-types. Showing 25 of them; the rest are in namespace-graph.json in this report's bundle.
- The types involved
packages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-api-translator.src.utils.ts-estree-ast-types.ArrowFunctionExpressionpackages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-api-translator.src.utils.ts-estree-ast-types.AssignmentExpressionpackages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-api-translator.src.utils.ts-estree-ast-types.BlockStatementpackages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-api-translator.src.utils.ts-estree-ast-types.BreakStatementpackages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-api-translator.src.utils.ts-estree-ast-types.CallExpressionpackages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-api-translator.src.utils.ts-estree-ast-types.CatchClausepackages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-api-translator.src.utils.ts-estree-ast-types.ClassDeclarationpackages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-api-translator.src.utils.ts-estree-ast-types.ClassExpressionpackages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-api-translator.src.utils.ts-estree-ast-types.ContinueStatementpackages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-api-translator.src.utils.ts-estree-ast-types.ExportAllDeclarationpackages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-api-translator.src.utils.ts-estree-ast-types.ExportDefaultDeclarationpackages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-api-translator.src.utils.ts-estree-ast-types.ExportNamedDeclarationpackages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-api-translator.src.utils.ts-estree-ast-types.ForInStatementpackages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-api-translator.src.utils.ts-estree-ast-types.ForOfStatementpackages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-api-translator.src.utils.ts-estree-ast-types.ForStatementpackages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-api-translator.src.utils.ts-estree-ast-types.FunctionDeclarationpackages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-api-translator.src.utils.ts-estree-ast-types.FunctionExpressionpackages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-api-translator.src.utils.ts-estree-ast-types.Identifierpackages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-api-translator.src.utils.ts-estree-ast-types.ImportAttributepackages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-api-translator.src.utils.ts-estree-ast-types.ImportDeclarationpackages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-api-translator.src.utils.ts-estree-ast-types.JSXAttributepackages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-api-translator.src.utils.ts-estree-ast-types.JSXClosingElementpackages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-api-translator.src.utils.ts-estree-ast-types.JSXFragmentpackages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-api-translator.src.utils.ts-estree-ast-types.JSXIdentifierpackages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-api-translator.src.utils.ts-estree-ast-types.JSXMemberExpression
- Direction
- packages.flow-eslint.src.scope-manager.referencer.Referencer uses packages.flow-api-translator.src.utils.ts-estree-ast-types, so a change to packages.flow-api-translator.src.utils.ts-estree-ast-types can break packages.flow-eslint.src.scope-manager.referencer.Referencer, while a change to packages.flow-eslint.src.scope-manager.referencer.Referencer can't break packages.flow-api-translator.src.utils.ts-estree-ast-types.
- Position
- Below the diagonal: packages.flow-eslint.src.scope-manager.referencer.Referencer uses a module listed above it, which is the healthy direction.
39→21 packages.flow-eslint.src.scope-manager.referencer.Referencer uses packages.flow-estree.src.types✕
- Connections
- 32 pairs of types, where a type in packages.flow-eslint.src.scope-manager.referencer.Referencer uses a type in packages.flow-estree.src.types. Showing 25 of them; the rest are in namespace-graph.json in this report's bundle.
- The types involved
packages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-estree.src.types.AsExpressionpackages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-estree.src.types.ComponentDeclarationpackages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-estree.src.types.DeclareClasspackages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-estree.src.types.DeclareComponentpackages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-estree.src.types.DeclareEnumpackages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-estree.src.types.DeclareExportAllDeclarationpackages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-estree.src.types.DeclareExportDeclarationpackages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-estree.src.types.DeclareFunctionpackages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-estree.src.types.DeclareHookpackages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-estree.src.types.DeclareInterfacepackages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-estree.src.types.DeclareModulepackages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-estree.src.types.DeclareModuleExportspackages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-estree.src.types.DeclareNamespacepackages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-estree.src.types.DeclareOpaqueTypepackages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-estree.src.types.DeclareTypeAliaspackages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-estree.src.types.DeclareVariablepackages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-estree.src.types.ESNodepackages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-estree.src.types.EnumDeclarationpackages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-estree.src.types.HookDeclarationpackages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-estree.src.types.InterfaceDeclarationpackages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-estree.src.types.MatchAsPatternpackages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-estree.src.types.MatchBindingPatternpackages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-estree.src.types.MatchExpressionCasepackages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-estree.src.types.MatchMemberPatternpackages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-estree.src.types.MatchObjectPatternProperty
- Direction
- packages.flow-eslint.src.scope-manager.referencer.Referencer uses packages.flow-estree.src.types, so a change to packages.flow-estree.src.types can break packages.flow-eslint.src.scope-manager.referencer.Referencer, while a change to packages.flow-eslint.src.scope-manager.referencer.Referencer can't break packages.flow-estree.src.types.
- Position
- Below the diagonal: packages.flow-eslint.src.scope-manager.referencer.Referencer uses a module listed above it, which is the healthy direction.
39→26 packages.flow-eslint.src.scope-manager.referencer.Referencer uses packages.flow-eslint.src.scope-manager.referencer.Visitor✕
- Connections
- 1 pair of types, where a type in packages.flow-eslint.src.scope-manager.referencer.Referencer uses a type in packages.flow-eslint.src.scope-manager.referencer.Visitor.
- The types involved
packages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-eslint.src.scope-manager.referencer.Visitor.Visitor
- Direction
- packages.flow-eslint.src.scope-manager.referencer.Referencer uses packages.flow-eslint.src.scope-manager.referencer.Visitor, so a change to packages.flow-eslint.src.scope-manager.referencer.Visitor can break packages.flow-eslint.src.scope-manager.referencer.Referencer, while a change to packages.flow-eslint.src.scope-manager.referencer.Referencer can't break packages.flow-eslint.src.scope-manager.referencer.Visitor.
- Position
- Below the diagonal: packages.flow-eslint.src.scope-manager.referencer.Referencer uses a module listed above it, which is the healthy direction.
39→37 packages.flow-eslint.src.scope-manager.referencer.Referencer uses packages.flow-eslint.src.scope-manager.ScopeManager✕
- Connections
- 1 pair of types, where a type in packages.flow-eslint.src.scope-manager.referencer.Referencer uses a type in packages.flow-eslint.src.scope-manager.ScopeManager.
- The types involved
packages.flow-eslint.src.scope-manager.referencer.Referencer.Referencer→packages.flow-eslint.src.scope-manager.ScopeManager.ScopeManager
- Direction
- packages.flow-eslint.src.scope-manager.referencer.Referencer uses packages.flow-eslint.src.scope-manager.ScopeManager, so a change to packages.flow-eslint.src.scope-manager.ScopeManager can break packages.flow-eslint.src.scope-manager.referencer.Referencer, while a change to packages.flow-eslint.src.scope-manager.referencer.Referencer can't break packages.flow-eslint.src.scope-manager.ScopeManager.
- Position
- Below the diagonal: packages.flow-eslint.src.scope-manager.referencer.Referencer uses a module listed above it, which is the healthy direction.
40→5 packages.flow-transform.src.traverse uses newtests.lsp.queries.hover_refs✕
- Connections
- 2 pairs of types, where a type in packages.flow-transform.src.traverse uses a type in newtests.lsp.queries.hover_refs.
- The types involved
packages.flow-transform.src.traverse.NodeEventGenerator→newtests.lsp.queries.hover_refs.Tpackages.flow-transform.src.traverse.traverse→newtests.lsp.queries.hover_refs.T
- Direction
- packages.flow-transform.src.traverse uses newtests.lsp.queries.hover_refs, so a change to newtests.lsp.queries.hover_refs can break packages.flow-transform.src.traverse, while a change to packages.flow-transform.src.traverse can't break newtests.lsp.queries.hover_refs.
- Position
- Below the diagonal: packages.flow-transform.src.traverse uses a module listed above it, which is the healthy direction.
40→12 packages.flow-transform.src.traverse uses lib.lib_es2015_core✕
- Connections
- 1 pair of types, where a type in packages.flow-transform.src.traverse uses a type in lib.lib_es2015_core.
- The types involved
packages.flow-transform.src.traverse.NodeEventGenerator→lib.lib_es2015_core.Array
- Direction
- packages.flow-transform.src.traverse uses lib.lib_es2015_core, so a change to lib.lib_es2015_core can break packages.flow-transform.src.traverse, while a change to packages.flow-transform.src.traverse can't break lib.lib_es2015_core.
- Position
- Below the diagonal: packages.flow-transform.src.traverse uses a module listed above it, which is the healthy direction.
40→16 packages.flow-transform.src.traverse uses packages.flow-api-translator.src.utils.ts-estree-ast-types✕
- Connections
- 1 pair of types, where a type in packages.flow-transform.src.traverse uses a type in packages.flow-api-translator.src.utils.ts-estree-ast-types.
- The types involved
packages.flow-transform.src.traverse.traverse→packages.flow-api-translator.src.utils.ts-estree-ast-types.Program
- Direction
- packages.flow-transform.src.traverse uses packages.flow-api-translator.src.utils.ts-estree-ast-types, so a change to packages.flow-api-translator.src.utils.ts-estree-ast-types can break packages.flow-transform.src.traverse, while a change to packages.flow-transform.src.traverse can't break packages.flow-api-translator.src.utils.ts-estree-ast-types.
- Position
- Below the diagonal: packages.flow-transform.src.traverse uses a module listed above it, which is the healthy direction.
40→26 packages.flow-transform.src.traverse uses packages.flow-eslint.src.scope-manager.referencer.Visitor✕
- Connections
- 1 pair of types, where a type in packages.flow-transform.src.traverse uses a type in packages.flow-eslint.src.scope-manager.referencer.Visitor.
- The types involved
packages.flow-transform.src.traverse.traverse→packages.flow-eslint.src.scope-manager.referencer.Visitor.Visitor
- Direction
- packages.flow-transform.src.traverse uses packages.flow-eslint.src.scope-manager.referencer.Visitor, so a change to packages.flow-eslint.src.scope-manager.referencer.Visitor can break packages.flow-transform.src.traverse, while a change to packages.flow-transform.src.traverse can't break packages.flow-eslint.src.scope-manager.referencer.Visitor.
- Position
- Below the diagonal: packages.flow-transform.src.traverse uses a module listed above it, which is the healthy direction.
40→37 packages.flow-transform.src.traverse uses packages.flow-eslint.src.scope-manager.ScopeManager✕
- Connections
- 1 pair of types, where a type in packages.flow-transform.src.traverse uses a type in packages.flow-eslint.src.scope-manager.ScopeManager.
- The types involved
packages.flow-transform.src.traverse.traverse→packages.flow-eslint.src.scope-manager.ScopeManager.ScopeManager
- Direction
- packages.flow-transform.src.traverse uses packages.flow-eslint.src.scope-manager.ScopeManager, so a change to packages.flow-eslint.src.scope-manager.ScopeManager can break packages.flow-transform.src.traverse, while a change to packages.flow-transform.src.traverse can't break packages.flow-eslint.src.scope-manager.ScopeManager.
- Position
- Below the diagonal: packages.flow-transform.src.traverse uses a module listed above it, which is the healthy direction.
At a glance — Code Health
At a glance — Architecture
At a glance — Maturity
At a glance — Readiness
At a glance — Security
At a glance — Performance
Security & Compliance — OWASP Top-10 mapping
| OWASP category | Findings | Severity |
|---|---|---|
| A05:2025 — Injection | 104 | High / Critical |
| A03:2025 — Software Supply Chain Failures | 77 | High / Critical |
| A07:2025 — Authentication Failures | 4 | High / Critical |
Roadmap
Immediately resolve the two leaked secrets in the specified shell scripts to eliminate critical exposure risks. Integrate automated security scanning into the CI pipeline to prevent regressions and migrate the remaining JavaScript files to TypeScript to strengthen type safety. Finally, implement structured logging for better observability and establish Architecture Decision Records to document key technical choices.
| Do this | Helps | Effort | Dimension |
|---|---|---|---|
| Resolve the 2 Leaked secret finding(s) in Secret Scanning — start with REDACTED, REDACTED. | +7.6 pts | Low | Secret Scanning |
| Resolve the 1 No ADRs found finding(s) in ADR Quality. | +2.6 pts | Low | ADR Quality |
| Add a SAST step to CI running what this repository's stack ships: cargo-audit / cargo-deny (or clippy) — or `semgrep --config=auto`, which runs on any language — so a security regression fails the build instead of landing. | +3.6 pts | Medium | Security & performance tooling |
| Migrate the remaining .js/.jsx files to TypeScript. | +3.5 pts | Medium | Type Safety |
| Interpolated log message defeats structured logging | +2.7 pts | Medium | Structured logging |
| Add tests that import the unreached modules (directly or through their public entry). | +2.3 pts | Medium | Test Coverage |
| Delete the dead files and unused exports — every line is maintenance cost and rebuild-estimate inflation with zero runtime value. | +1.7 pts | Medium | Dead Code |
| Resolve the 1 End-of-life runtime finding(s) in Platform End-of-Life — start with package.json. | +0.8 pts | Low | Platform End-of-Life |
File quality
| File | Score | Band | Worst signal |
|---|---|---|---|
| REDACTED | 0.0 | Slop | Dependency Vulnerabilities: High CVE: REDACTED |
| REDACTED | 0.4 | Slop | Dependency Vulnerabilities: High CVE: REDACTED |
| REDACTED | 0.5 | Slop | Dependency Vulnerabilities: Critical CVE: REDACTED |
| REDACTED | 0.7 | Slop | Dependency Vulnerabilities: High CVE: REDACTED |
| REDACTED | 1.3 | Slop | Static Analysis (SAST): High: REDACTED |
| REDACTED | 1.3 | Slop | Dependency Vulnerabilities: High CVE: REDACTED |
| REDACTED | 5.8 | Mixed | Static Analysis (SAST): High: REDACTED |
| REDACTED | 5.8 | Mixed | Static Analysis (SAST): Medium: REDACTED |
| REDACTED | 5.8 | Mixed | Static Analysis (SAST): Medium: REDACTED |
| REDACTED | 5.8 | Mixed | Dependency Vulnerabilities: High CVE: REDACTED |
| REDACTED | 5.8 | Mixed | Dependency Vulnerabilities: Medium advisory (unmaintained): REDACTED |
| rust_port/crates/flow_typing_flow_js/src/flow_js/any_helpers.rs | 6.0 | Mixed | Explicit Debt: TodoComment |
| REDACTED | 6.3 | Mixed | Static Analysis (SAST): Medium: REDACTED |
| rust_port/crates/flow_typing_statement/src/statement.rs | 6.4 | Mixed | Explicit Debt: TodoComment |
| rust_port/crates/flow_imports_exports/src/exports.rs | 6.4 | Mixed | Explicit Debt: TodoComment |
| rust_port/crates/flow_typing_flow_js/src/subtyping_kit.rs | 6.4 | Mixed | Explicit Debt: TodoComment |
| rust_port/crates/flow_typing_utils/src/members.rs | 6.4 | Mixed | Explicit Debt: TodoComment |
| rust_port/crates/flow_typing_flow_js/src/flow_js/dispatch.rs | 6.4 | Mixed | Explicit Debt: TodoComment |
| rust_port/crates/flow_typing_utils/src/type_sig_merge.rs | 6.4 | Mixed | Explicit Debt: TodoComment |
| rust_port/crates/flow_services_autocomplete/src/autofix_imports.rs | 6.5 | Mixed | Explicit Debt: TodoComment |
How the grades work
A definite problem that already costs you something and drags the score down: a missing authorisation check, a dependency with a known exploit, a build that does not reproduce. Failure here tends to cause failures elsewhere.
Likely wrong, but not failing yet. It degrades the codebase over a longer horizon and can cause failures elsewhere — not urgent this week, not something to carry for two years either.
Recorded, with no effect on how the codebase functions. Present so the survey is complete, not because it needs doing.
Something this survey could not settle from the outside, and which could be critical or serious. Either a control was required and no positive evidence of it exists in the repository — a backup job that nothing shows was ever restored from proves nothing about restores — or our own analysis could not run over that part of the tree. This is not a clean result. These are excluded from the score rather than awarded a pass, so the number on the cover neither rewards nor penalises them: if you act on this survey without resolving them, you carry that risk yourself. Each one is named under Limitations.
Methodology & how to trust this report
Watchdog is a deep, periodic assessment — run each sprint, monthly, or quarterly, taking the time to go wider and deeper than a quick check and surfacing in one coherent report what you'd otherwise piece together from a dozen separate tools. It scores deterministically: the same commit yields the same score, every run. 70 of 70 evaluated dimensions are computed purely by tools and static analysis (confidence 1.0); none rely on LLM judgement. Overall confidence is 0.8 — the weighted average across measured dimensions; it falls as more of the score leans on LLM-assisted judgement and rises when it's fully tool-backed.
What we checked — 70 dimensions across the health lenses
- Can you open the finding? Real findings cite a repo-relative file and line you can open at the cited line — never an absolute scratch path. Here, 720 of 738 do; the remainder are repo-wide signals — a dimension-level measurement, not a single line.
- Is there a tool behind the number? Every score below names the method that produced it — Roslyn, git, a scanner, or (for a handful of documentation/naming dimensions) an LLM labelled sampled · advisory — not a narrative.
- Does re-running give the same result? Run it again on the same commit and the score — and this report, byte for byte — is identical. A report whose numbers move between runs is describing the run, not the code.
Tools & methods
| Method | Backs | Version | Evaluator |
|---|---|---|---|
| Roslyn static analysis | Complexity, cohesion, coupling, dead code, API surface, layering | 5.3.0 | ✓ deterministic |
| Native secret scanner | Hardcoded secrets / credentials | 1.0.0 | ✓ deterministic |
| Watchdog duplication detector (in-process) | Code duplication | 1.0.0 | ✓ deterministic |
| Coverage (coverlet / dotnet-coverage) | Line & branch coverage | 10.0.400 | ✓ deterministic |
| NuGet / dotnet | Outdated, vulnerable & deprecated dependencies | 10.0.400 | ✓ deterministic |
| git / LibGit2Sharp | Churn hotspots, knowledge concentration, history | 2.43.0 · 0.31.0 | ✓ deterministic |
| gitleaks · semgrep · trivy | Secrets in history, SAST, CVEs, IaC & container, PII / GDPR | 1.86.0 · 0.69.3 | ✓ deterministic |
| LLM (sampled · advisory) | Documentation quality, ADR conformance, naming — sampled over a bounded sample; advisory, never a deterministic measurement | — | ◐ LLM · sampled · advisory |
Run transparency — what happened this run
- D1 Cyclomatic Complexity — not measured this run — Watchdog could not measure this here. That is a gap on our side — a collector, parser or image we have not built yet — and it is neither a defect in this repository nor evidence that the check would have passed. Most of this repository's production source (.rs) had no cyclomatic complexity computed for it: no function bodies were exposed for those file kinds by any language model this pass could load.
- D2 Cognitive Complexity — not measured this run — Watchdog could not measure this here. That is a gap on our side — a collector, parser or image we have not built yet — and it is neither a defect in this repository nor evidence that the check would have passed. Most of this repository's production source (.rs) had no cognitive complexity computed for it: no function bodies were exposed for those file kinds by any language model this pass could load.
- D4 Code Duplication — measured, with a gap in what it reached — Watchdog measured this, but not all of it. What it did not reach is a gap on our side — a collector, parser or image we have not built yet — so the numbers on that dimension cover less than the repository, and the part left out is not evidence that it would have passed. The 2 duplicated block group(s) on this row were found in the languages this pass could tokenize, and they do NOT cover all of this repository's production source: .rs (546,830 lines, 99% of production source) went unread, because no language model this pass could load exposed a clone-unit token stream for those file kinds. Duplication in that source is UNMEASURED — its absence from the count above is a gap in this analyzer's language coverage, not a finding that the code is free of duplication.
- D5 Coupling — not measured this run — Watchdog could not measure this here. That is a gap on our side — a collector, parser or image we have not built yet — and it is neither a defect in this repository nor evidence that the check would have passed. This check's reader does not cover the language this repository's product is written in, so it had nothing of the product to read. That is a gap in this analyzer's language reach — not a finding about this repository.
- D8 Code Coverage — not measured this run — Watchdog could not measure this here. That is a gap on our side — a collector, parser or image we have not built yet — and it is neither a defect in this repository nor evidence that the check would have passed. Coverage NOT MEASURED: this repository's production source spans .ts, .rs, and our analyzer cannot run the .rs test suite(s) — so no coverage was collected for the repository as a whole. The JavaScript/TypeScript half did build and run, and its own line coverage came back at 79.5% — but that is a figure for one half of the product, and we do not publish a partial one as if it were complete. This is OUR limitation, not a defect in the repo — coverage is excluded from the score rather than counted as a near-zero. In the meantime, produce a coverage report in a standard format (lcov — `vitest --coverage`, `jest --coverage`, `bun test --coverage --coverage-reporter=lcov`, or `nyc`, or lcov — `cargo install cargo-llvm-cov`, then `cargo llvm-cov --lcov --output-path lcov.info`) and commit it — a hosted scan measures a clone of the repository, so a report that exists only in a working tree, a CI runner's or your own, never reaches it; the artefact is commonly gitignored, so `git add -f` that one file (or un-ignore its path) and commit it alongside the code it measures and real coverage will be read. You can widen what we reach: optional: produce a coverage report in a standard format (lcov — `cargo install cargo-llvm-cov`, then `cargo llvm-cov --lcov --output-path lcov.info`) and commit it — a hosted scan measures a clone of the repository, so a report that exists only in a working tree, a CI runner's or your own, never reaches it; the artefact is commonly gitignored, so `git add -f` that one file (or un-ignore its path) and commit it alongside the code it measures — then both halves are read on the next scan.
- D10 Test Quality — measured, with a gap in what it reached — Watchdog measured this, but not all of it. What it did not reach is a gap on our side — a collector, parser or image we have not built yet — so the numbers on that dimension cover less than the repository, and the part left out is not evidence that it would have passed. The 1,132 test(s) behind this row are the ones the JavaScript/TypeScript census could read, and this repository also carries at least 57 test source file(s) (.rs) that it cannot: it reads JavaScript/TypeScript test declarations off disk, so a JUnit/pytest-style suite is invisible to it. Skipped tests, zero-assertion tests and the other quality signals on this row are UNMEASURED in that suite — their absence from the counts above is a gap in this analyzer's language coverage, not a finding that those tests are sound.
- D11 Test Reliability — not measured this run — Watchdog could not measure this here. That is a gap on our side — a collector, parser or image we have not built yet — and it is neither a defect in this repository nor evidence that the check would have passed. Test reliability NOT SCORED: this repository's production source includes .rs, and the rust executor ran against the .rs half and never executed — so reliability was not measured for the repository as a whole. The JavaScript/TypeScript (jest via `yarn install --frozen-lockfile --ignore-scripts` in packages/ (6 tests); jest via `yarn install --frozen-lockfile --ignore-scripts` in packages/babel-plugin-transform-flow-enums/ (8 tests); jest via `yarn install --frozen-lockfile --ignore-scripts` in packages/eslint-plugin-fb-flow/ (60 tests); jest via `yarn install --frozen-lockfile --ignore-scripts` in packages/flow-enums-runtime/ (29 tests); jest via `yarn install --frozen-lockfile --ignore-scripts` in packages/flow-for-vscode/ (9 tests); jest via `yarn install --frozen-lockfile --ignore-scripts` in packages/flow-upgrade/ (104 tests)): measured (0 flaky) suite(s) did re-run, and came back with 0 flaky across 1 measured tier(s) — but that is a figure for one half of the product, and we do not publish a partial one as if it were complete. This is OUR limitation, not a defect in the repo — test reliability is excluded from the score rather than counted. The half was driven by a runner we ship, so this is not a missing-runner gap.
- D14 License Compliance — measured, with a gap in what it reached — Watchdog measured this, but not all of it. What it did not reach is a gap on our side — a collector, parser or image we have not built yet — so the numbers on that dimension cover less than the repository, and the part left out is not evidence that it would have passed. This repository declares package.json, but the licence verdict published here was taken over its gem dependencies. Nothing was read about its npm dependencies' licensing in either direction, and a clean score on this card must not be read as covering them.
- D14 License Compliance — measured, with a gap in what it reached — Watchdog measured this, but not all of it. What it did not reach is a gap on our side — a collector, parser or image we have not built yet — so the numbers on that dimension cover less than the repository, and the part left out is not evidence that it would have passed. This repository declares a Cargo manifest, but the licence verdict published here was taken over its gem dependencies. Nothing was read about its Cargo dependencies' licensing in either direction, and a clean score on this card must not be read as covering them.
- D15 Churn × Complexity Hotspots — not measured this run — Watchdog could not measure this here. That is a gap on our side — a collector, parser or image we have not built yet — and it is neither a defect in this repository nor evidence that the check would have passed. A hotspot is churn × complexity. Churn was measured (382758 line(s) across the 90-day window), but no complexity could be computed for .rs, which is most of this repository's production code — so every churned file would score as complexity 0 and the hotspot list would be empty no matter how tangled the code is. Not scored — this is a gap in the analysis run, not a finding about this repository.
- D19 Documentation Quality — measured, with a gap in what it reached — Watchdog measured this, but not all of it. What it did not reach is a gap on our side — a collector, parser or image we have not built yet — so the numbers on that dimension cover less than the repository, and the part left out is not evidence that it would have passed. Each ecosystem's manifests (what makes a folder runnable or a published package) need their own proof before D19 judges its units. Until then those folders' READMEs are judged only as documents (boilerplate, structure), never counted as complete.
- D21 Naming Consistency — not measured this run — Watchdog could not measure this here. That is a gap on our side — a collector, parser or image we have not built yet — and it is neither a defect in this repository nor evidence that the check would have passed. D21's deterministic naming rules are gated on C# first (docs/plans/deterministic-engine.md, P5): each other language is switched on only after its own concept suite and A/B gate pass. Until then its declarations carry no naming verdict this run — this says nothing about whether its names are consistent.
- D22 Internal API Consistency — not measured this run — Watchdog could not measure this here. That is a gap on our side — a collector, parser or image we have not built yet — and it is neither a defect in this repository nor evidence that the check would have passed. D22's deterministic call-shape rules are gated on C# first (docs/plans/deterministic-engine.md, P5): each other language is switched on only after its own concept suite and A/B gate pass. This says nothing about whether that surface is consistent.
- D24 Comment Value — not measured this run — Watchdog could not measure this here. That is a gap on our side — a collector, parser or image we have not built yet — and it is neither a defect in this repository nor evidence that the check would have passed. This check's reader does not cover the language this repository's product is written in, so it had nothing of the product to read. That is a gap in this analyzer's language reach — not a finding about this repository.
- D26 Project Cohesion — not measured this run — Watchdog could not measure this here. That is a gap on our side — a collector, parser or image we have not built yet — and it is neither a defect in this repository nor evidence that the check would have passed. Project size and spread are measured over build units (a .NET project, a Maven or Gradle module, an npm, Deno or JSR package, a Go module, a Cargo crate, a Python, Composer, Bundler, RubyGems, Mix, rebar3, sbt, SwiftPM or pub package, an OTP application, an Xcode project or XcodeGen spec, or a checkout that declares no build at all) whose source a code model reads. This repository's production source is in a language no model reads, or in units whose build tool D26 does not recognise. That is a gap in this analyzer's language reach — not a finding that the repository's projects are cohesive.
- D27 Navigability — not measured this run — Watchdog could not measure this here. That is a gap on our side — a collector, parser or image we have not built yet — and it is neither a defect in this repository nor evidence that the check would have passed. This check's reader does not cover the language this repository's product is written in, so it had nothing of the product to read. That is a gap in this analyzer's language reach — not a finding about this repository.
- D32 Data Compliance (PII/GDPR) — not measured this run — Watchdog could not measure this here. That is a gap on our side — a collector, parser or image we have not built yet — and it is neither a defect in this repository nor evidence that the check would have passed. `evals/evals/01_error_fixing/error_002_exact_object_types/input/main.js`, `evals/evals/01_error_fixing/error_004_exact_objects_extra_props/ideal/main.js`, `evals/evals/01_error_fixing/error_005_array_variance/ideal/main.js`, `evals/evals/01_error_fixing/error_007_property_variance/ideal/main.js`, `evals/evals/01_error_fixing/error_007_property_variance/input/main.js`, … (+256 more) produced a parse error, so every rule in this engine's `gdpr.yml` was absent there. That absence is NOT a clean result: these rules detect personal data crossing a boundary into a log sink, a URL or browser storage, and a file that was never parsed cannot report any of the three. The rest of the tree analysed normally and its rows above stand; only these files are unaccounted for. You can widen what we reach: fix the syntax error (or exclude the file deliberately) and re-scan to cover it.
- AXR1 Runtime accessibility — not measured this run — Watchdog could not measure this here. That is a gap on our side — a collector, parser or image we have not built yet — and it is neither a defect in this repository nor evidence that the check would have passed. Render strategy: boot via DevServer (start). the dev server did not expose a crawlable HTTP endpoint in time — no runtime evidence.
- GD1 Unfinished & placeholder code — not measured this run — Watchdog could not measure this here. That is a gap on our side — a collector, parser or image we have not built yet — and it is neither a defect in this repository nor evidence that the check would have passed. This check reads C# syntax, F#, JavaScript/TypeScript, Dart, Ruby and Scala source only, and this repository's Python, Rust is most of its product and is not read yet, so it had nothing of this repository's product to read. That is a gap in this analyzer's language reach — not a finding that the repository is free of what this check looks for.
- IC1 Incompleteness & stubs — not measured this run — Watchdog could not measure this here. That is a gap on our side — a collector, parser or image we have not built yet — and it is neither a defect in this repository nor evidence that the check would have passed. This check reads C# syntax, JavaScript/TypeScript, Java, Dart, Ruby and Scala source only, and this repository's Python, Rust is most of its product and is not read yet, so it had nothing of this repository's product to read. That is a gap in this analyzer's language reach — not a finding that the repository is free of what this check looks for.
- M4 Documentation accuracy — measured, with a gap in what it reached — Watchdog measured this, but not all of it. What it did not reach is a gap on our side — a collector, parser or image we have not built yet — so the numbers on that dimension cover less than the repository, and the part left out is not evidence that it would have passed. M4 checks only the claim kinds adjudicated at or above 95 % precision: links and versions (PREREGISTRATION version 9). Paths, command arguments, installs, environment variables, settings, projects, packages, routes, cd targets, infrastructure products and removed modules are read but not checked, and none of them is reported or counted.
- P5 DR & Backup — not measured this run — This is a true statement about the repository that carries nothing for its owner to act on, so it is reported here rather than as a defect in their code. No backup/snapshot/replication config, RTO/RPO or restore-procedure documentation was found — and no production persistence was detected either (no data-access packages, no data-store services, no database resources), so there is nothing in this repository whose loss a DR control would recover. If this system's data lives in a platform or ops repo we can't see, that's where the DR evidence belongs.
- R10 Code Duplication — measured, with a gap in what it reached — Watchdog measured this, but not all of it. What it did not reach is a gap on our side — a collector, parser or image we have not built yet — so the numbers on that dimension cover less than the repository, and the part left out is not evidence that it would have passed. 194 further occurrence(s) are not listed individually; the score already reflects all 234.
- R4 Test Coverage — measured, with a gap in what it reached — Watchdog measured this, but not all of it. What it did not reach is a gap on our side — a collector, parser or image we have not built yet — so the numbers on that dimension cover less than the repository, and the part left out is not evidence that it would have passed. 761 further occurrence(s) are not listed individually; the score already reflects all 801.
- R7 Dead Code — measured, with a gap in what it reached — Watchdog measured this, but not all of it. What it did not reach is a gap on our side — a collector, parser or image we have not built yet — so the numbers on that dimension cover less than the repository, and the part left out is not evidence that it would have passed. 1814 further occurrence(s) are not listed individually; the score already reflects all 1854.
- Production source was not modelled — run is Degraded — No code model read .rs, so the complexity, duplication and architecture dimensions were scored over a minority of this repository rather than its product, and dimensions that abstained did so for want of a model rather than for want of findings. The grade is NOT representative of this repository; diagnostics.md records the exact cause. The Rust sidecar EXITED with code 137 after 14.5s, so the Rust code model degraded to null. This is the sidecar's own failure, not a budget of ours. Code 137 is 128+a fatal signal (SIGKILL — under a memory cap this is the cgroup OOM-killer), so it was killed rather than choosing to exit: the same Rust source may model cleanly with a larger memory cap.
Limitations & what we did not check
Watchdog assesses the repository exactly as committed, and only the repository. By design it does not reach outside the source tree: the live cloud account, the running CI/CD pipeline, the host's branch-protection and approval rules, the production configuration, or a restore actually exercised against a backup are all out of scope. That boundary is a feature, not a gap — a repo-relative, deterministic scan re-runs identically on any commit and every finding opens at a real file and line, where a live audit can neither be reproduced nor traced. The visible consequence is that controls which leave no in-repo evidence are reported as "not evidenced" and excluded from the score rather than awarded a number a static scan cannot justify.
Per-dimension blind spots
- D4 Code Duplication: Duplication is token-similarity — an in-process token-stream comparison over sliding windows, with type-aware normalization — so it finds copy-paste, not semantic duplication expressed differently. Committed machine-written code (scaffolded migrations, designer/codegen output, protobuf/OpenAPI stubs, model snapshots) is EXCLUDED — its repetition is the tool's, not the team's — so the score reflects hand-written duplication only.
- D6 Cohesion (LCOM4): LCOM4 cohesion is syntactic — it infers connectivity from which methods touch which fields/methods by name, not from real runtime behaviour or intent.
- D9 Test Distribution: The test-pyramid shape is inferred from project/folder naming and references, with a single test host bucketed per-file by its path tier and content signals — a suite that names tiers unconventionally and gives no per-file signal can still be mis-bucketed.
- D10 Test Quality: Assertion density is structural — it cannot tell a meaningful behavioural assertion from a trivial one, only that an assertion is present.
- D12 Dependency Hygiene: Dependency health reads manifests and lockfiles — a vulnerability in a vendored/copied dependency, or risk from how a dependency is actually used, is outside this view.
- D13 Secret Scanning: Secret detection is signature- and entropy-based on the current tree — a secret that does not match a known pattern, or one already rotated, will not be flagged (a clean scan is "nothing matched", not "no secrets exist").
- D14 License Compliance: License compatibility is checked against declared package metadata and a policy — mislabelled or missing license metadata, and obligations that depend on how you distribute, are not resolved here.
- D16 Bus Factor: Bus-factor is a time-decayed model of commit attribution (who has recently, repeatedly worked a file), not comprehension — pairing, review and reading-without-committing spread knowledge it can't see; bot commits and shared accounts still distort it.
- D17 Explicit Debt: Acknowledged-debt signals (TODO/FIXME, suppressions, dead code) are textual — undocumented debt that nobody marked, and debt that lives in design rather than annotations, is invisible. Committed machine-written code (scaffolded migrations, designer/codegen output, generated stubs) is excluded — it is never the team's dead code to delete.
- D19 Documentation Quality: Documentation quality publishes two things only: a runnable or packaged unit with no example, and a multi-project root README that maps none of its parts. It does not judge clarity, and its other checks (overview, licence, boilerplate, structure, empty sections, XML-doc coverage) are withheld after adjudication: their candidates are counted in the card's gaps, not shown as rows. A false statement in a document is M4's; units are .NET projects only.
- D20 ADR Quality: ADR quality is an LLM read of the decision records present — it cannot know about decisions made and never recorded, and its verdict is sampled and advisory.
- D23 Boundary Type-Coupling: Boundary leakage is detected from type references across detected contexts — leaks that flow through primitives, serialization or shared infrastructure may not surface as a typed reference.
- D28 Secrets (history): Secret-history scanning sweeps the git log for known patterns — a secret that predates the available history, or never matched a signature, is not found (clean means "nothing matched in the history we can see").
- D29 Static Analysis (SAST): SAST findings are pattern-based (semgrep) — it finds classes of bug it has rules for; logic flaws, auth/authorization gaps and issues needing runtime context are out of reach (and clean means "no rule matched").
- D30 Dependency Vulnerabilities: CVE matching depends on accurate package/version metadata and on the advisory databases — a vulnerability with no published advisory, or in code not declared as a dependency, is not seen. Coverage needs a RESOLVED graph: an unpinned requirements.txt, or a pom without a resolved build, yields partial coverage rather than a clean verdict. An ecosystem the analyzer cannot scan is reported as unmeasured, never as clean.
- D34 Knowledge Freshness: Freshness is decayed commit RECENCY, not comprehension — code read often but rarely committed reads as orphaned, and stable code that genuinely needs no changes is penalised the same as forgotten code; bot/squash commits distort it like the bus factor.
- D35 Change Coupling: Change coupling is co-change in COMMITS — files split across separate commits, or coupled only through a shared config/build step, read as uncoupled, and a sweeping commit (rename/format) is excluded so it doesn't couple everything. It shows that files change together, not WHY: a high coupling can be a healthy cohesive pair as readily as a hidden leak.
- D43 Malicious Dependencies: Only packages some vulnerability database has already NAMED as malicious are seen — a compromise published in the last hours, or never reported at all, is invisible here, and this dimension reading 10 is not evidence that a dependency is trustworthy. There is no typosquat or dependency-confusion analysis: a package nobody has reported is simply absent from the feeds. Coverage is the dependency scan's: an ecosystem that could not be scanned is disclosed as unmeasured, never as clean.
- D44 Platform End-of-Life: The support table is FROZEN, so it goes out of date by losing RECALL: a release that ended support after the table was written is missed until the table is refreshed, and this dimension reading 10 is not evidence that a platform is current. Only platforms the repository DECLARES in a place this pass reads are seen — a runtime named only in a Dockerfile (D31's subject), in a CI workflow (D29's), or in a file this pass does not parse (go.mod, a Gemfile ruby directive) is invisible here, which is why a repository declaring none of them abstains rather than scoring. Only frameworks with a PUBLISHED support policy are tracked: React, Flask and Express publish none, so their age cannot be judged and their absence from a report is not a statement that they are supported.
- AX10 Code composition: Role is inferred from namespace/folder convention, not semantics — a domain concept living in a folder named "Services" reads as application, and the split is lines-of-code, not business value. The business-logic-share score is a SOFT, FLOORED signal: it contributes to the Architecture lens but is floored at the Critical gate, so an infrastructure-heavy design (a gateway, an ETL, a driver) is legitimately low without being nuked to zero.
- M4 Documentation accuracy: Onboarding quality is an LLM read of the docs/setup present — it cannot run the onboarding or measure how long a real new joiner takes; the verdict is sampled and advisory.
- P4 Deployment & Rollback: Approval/branch-protection rules live in repository settings the scan cannot see — only their in-repo evidence (config files, workflows) is checked, so a control enforced purely in the host's settings reads as "not evidenced".
- P6 Release Hygiene: Rollback/observability controls are inferred from repo artefacts (pipelines, dashboards-as-code) — controls configured in external tooling, with no in-repo trace, cannot be credited.
Dimensions
D4 · Code Duplication
2 duplicated block group(s) detected. Measured on part of this repository only: .rs (99% of production source) was not exposed to the token comparison, so duplication there is unmeasured and is not in this count.
What to do
- Resolve the 1 Duplicated block (14–15 lines × 2) finding(s) in Code Duplication — start with compile_swebench.py. — One of this dimension's main actionable groups (1 warning-level).
- Resolve the 1 Duplicated block (10–11 lines × 2) finding(s) in Code Duplication — start with compile_swebench.py. — One of this dimension's main actionable groups (1 warning-level).
- Enforce Code Duplication in CI to reach Verified (currently Documented). — Hardens enforcement from Documented toward Verified — provenance only; does not change the score.
D6 · Cohesion (LCOM4)
1 of 73 classes have LCOM4 above 3.
What to do
- Resolve the 1 Low cohesion finding(s) in Cohesion (LCOM4) — start with Tester.js. — One of this dimension's main actionable groups (1 warning-level).
- Enforce Cohesion (LCOM4) in CI to reach Verified (currently Documented). — Hardens enforcement from Documented toward Verified — provenance only; does not change the score.
D9 · Test Distribution
3634 test methods: 3634 unit, 0 integration, 0 BDD, 0 e2e. The JavaScript/TypeScript suite contributes 1132 `it`/`test` case(s) across 196 test file(s) declaring at least one; its tier split is read from package names and paths only. The Rust suite contributes 2501 `#[test]` function(s) across 127 file(s) declaring at least one; its unit/integration split is Cargo's own — 0 of those file(s) are integration-test targets under a crate's tests/ directory, and the rest are #[test] functions compiled into the crate they test. The Python suite contributes 1 test function(s) across 1 file(s) declaring at least one — every `def test…` in a file pytest or unittest would collect, which is those frameworks' own definition of a case; a parametrize table counts once, so this is a floor. Its tier split is read from file names and paths only.
D10 · Test Quality
89 skipped (89 with a documented reason), 3 zero-assertion, no mocking-framework packages referenced (hand-written doubles or no mocking) across 1132 tests. Measured on the JavaScript/TypeScript suite only — at least 57 test source file(s) (.rs) went unread, so its test quality is unmeasured and is not in these counts.
What to do
- Resolve the 3 No assertions finding(s) in Test Quality — start with callback_writes.js (3). — One of this dimension's main actionable groups (3 warning-level).
- Resolve the 1 Test project verifies nothing finding(s) in Test Quality — start with callback_writes.js. — One of this dimension's main actionable groups (1 warning-level).
- Enforce Test Quality in CI to reach Verified (currently Documented). — Hardens enforcement from Documented toward Prevented — provenance only; does not change the score.
D12 · Dependency Hygiene
0 outdated direct gem(s), 0 pinning defect(s). 1 declaration(s) graded against rubygems.org, 1 of them against a version resolved in a committed Gemfile.lock. Whether any of these gems is DEPRECATED or YANKED is not graded — rubygems.org publishes no deprecation marker, and a yank removes a version rather than flagging it. Whether any is UNMAINTAINED is not graded either: no registry publishes a maintenance status, and release age does not stand in for one. Whether any is UNUSED is a source question, not a registry one. Known CVEs in this dependency graph are D30's question, read from the manifest there.
D13 · Secret Scanning
2 secret(s) detected.
What to do
- Resolve the 2 Leaked secret finding(s) in Secret Scanning — start with REDACTED, REDACTED. — One of this dimension's main actionable groups (2 issue-level).
- Enforce Secret Scanning in CI to reach Verified (currently Documented). — Hardens enforcement from Documented toward Prevented — provenance only; does not change the score.
D14 · License Compliance
0 of 12 shipped gem(s) use a banned license. Licences were resolved from rubygems.org over the 12 gem(s) a consumer installs — this repository's runtime declarations closed transitively over its committed Gemfile.lock. Development-group and `add_development_dependency` gems are excluded: they are not distributed with this repository. 2 of them publish no licence on rubygems.org; that is missing data, not a violation, and none of them is charged. ★ COVERAGE OF THIS VERDICT: it grades this repository's gem dependencies and nothing else. The repository also declares package.json and a Cargo manifest, and the licences of those dependency graphs were NOT read by this pass — a gap in this engine's coverage, not a statement about them. So this result says the graded closure carries no banned licence; it does NOT say this repository's licensing is clear.
D16 · Bus Factor
139 source file(s) have their living knowledge concentrated in one author (≥90% of recent, decayed contribution). The largest is rust_port/crates/flow_typing_type/src/type_.rs. Counted over 525 of the 775 production source files in this repository: the rest are under the ~2,400-byte size floor this dimension measures over.
What to do
- Resolve the 2 Off-boarding risk finding(s) in Bus Factor. — One of this dimension's main actionable groups (2 recommendation-level).
- Resolve the 1 Further sole-owners (lower concentration) finding(s) in Bus Factor. — One of this dimension's main actionable groups (1 recommendation-level).
D17 · Explicit Debt
218 deducted task-comment markers across 555471 LoC (0.0/KLoC) → score 9.9. Task comments only: this repository's language is read without a compiler, so D17's suppression, dead-code and commented-out-code arms did not run and this score counts fewer marker kinds than a .NET repository's would.
What to do
- Resolve the 218 TodoComment finding(s) in Explicit Debt — start with statement.rs (15), subtyping_kit.rs (15), exports.rs (10). — One of this dimension's main actionable groups (218 warning-level).
- Enforce Explicit Debt in CI to reach Verified (currently Documented). — Hardens enforcement from Documented toward Prevented — provenance only; does not change the score.
D19 · Documentation Quality
1 of 1 documentation facets pass in full. 116 document(s) read across 1 unit(s).
D20 · ADR Quality
No architecture decision records were found.
What to do
- Resolve the 1 No ADRs found finding(s) in ADR Quality. — One of this dimension's main actionable groups (1 recommendation-level).
D23 · Boundary Type-Coupling
4 domain type(s) cross context boundaries across 3 contexts.
What to do
- Resolve the 4 Cross-context type T (newtests → flow-dev-tools) finding(s) in Boundary Type-Coupling — start with node.js (4). — One of this dimension's main actionable groups (4 warning-level).
- Enforce Boundary Type-Coupling in CI to reach Verified (currently Documented). — Hardens enforcement from Documented toward Verified — provenance only; does not change the score.
D28 · Secrets (history)
2 finding(s): 0 critical, 2 high, 0 medium, 0 low.
What to do
- Resolve the 2 High secret finding(s) in Secrets (history) — start with REDACTED, REDACTED. — One of this dimension's main actionable groups (2 issue-level).
D29 · Static Analysis (SAST)
104 finding(s): 0 critical, 70 high, 34 medium, 0 low. 63 unpinned-GitHub-Actions row(s) are reported here but scored by D36 (supply-chain provenance), which measures that posture as `pinned_actions` — one pinning decision is charged once, not once per lens. semgrep hit a parse error in 424 file(s) — `evals/evals/01_error_fixing/error_002_exact_object_types/input/main.js` (line 30), `evals/evals/01_error_fixing/error_004_exact_objects_extra_props/ideal/main.js` (line 13), `evals/evals/01_error_fixing/error_005_array_variance/ideal/main.js` (line 13), `evals/evals/01_error_fixing/error_007_property_variance/ideal/main.js` (line 13), `evals/evals/01_error_fixing/error_007_property_variance/input/main.js` (line 13), … (+419 more) — so no absence of findings in the named regions is evidence of anything; rows reported elsewhere in those files are real. Fix the syntax error (or exclude the file deliberately) and re-scan to cover them. Separately, one or more rules could not re-parse an embedded snippet in 1 file(s) (e.g. a workflow `run:` block read as shell). Those files WERE scanned and their other rows are unaffected; only those rules' view of those snippets is missing.
What to do
- Resolve the 2 REDACTED finding(s) in Static Analysis (SAST) — start with REDACTED (2). — One of this dimension's main actionable groups (2 issue-level).
- Resolve the 2 REDACTED finding(s) in Static Analysis (SAST) — start with REDACTED, REDACTED. — One of this dimension's main actionable groups (2 issue-level).
- No action in Static Analysis (SAST) — all 63 REDACTED finding(s) are reported here at file:line but scored by D36 (supply-chain provenance), so none is charged to this dimension. — One of this dimension's main actionable groups (63 issue-level, 0 of them charged here).
D30 · Dependency Vulnerabilities
70 finding(s): 1 critical, 41 high, 23 medium, 5 low.
What to do
- Resolve the 41 High CVE finding(s) in Dependency Vulnerabilities — start with REDACTED (41). — One of this dimension's main actionable groups (41 issue-level).
- Resolve the 15 Medium CVE finding(s) in Dependency Vulnerabilities — start with REDACTED (15). — One of this dimension's main actionable groups (15 warning-level).
- Resolve the 1 Critical CVE finding(s) in Dependency Vulnerabilities — start with REDACTED. — One of this dimension's main actionable groups (1 issue-level).
D34 · Knowledge Freshness
Every significant source file has living knowledge — recently and meaningfully worked. Counted over 525 of the 775 production source files in this repository: the rest are under the ~2,400-byte size floor this dimension measures over.
D35 · Change Coupling
Strongest change-coupling: lib.rs↔any_helpers.rs 83%; lib.rs↔default_resolve.rs 78%; misc.js↔tslib_contents.rs 77%
What to do
- Resolve the 4 Change coupling finding(s) in Change Coupling — start with lib.rs, any_helpers.rs, flow_js.js. — One of this dimension's main actionable groups (4 warning-level).
- Resolve the 2 Change-coupling hub finding(s) in Change Coupling — start with default_resolve.rs, misc.js. — One of this dimension's main actionable groups (2 warning-level).
D36 · Supply-chain Provenance & Signing
0/4 supply-chain integrity signals present (provenance, signing, SBOM, pinned actions).
What to do
- Resolve the 1 REDACTED finding(s) in Supply-chain Provenance & Signing. — One of this dimension's main actionable groups (1 warning-level).
- Resolve the 1 REDACTED finding(s) in Supply-chain Provenance & Signing — start with REDACTED. — One of this dimension's main actionable groups (1 warning-level).
- Resolve the 1 REDACTED finding(s) in Supply-chain Provenance & Signing. — One of this dimension's main actionable groups (1 warning-level).
D43 · Malicious Dependencies
No dependency in any ecosystem this repository declares is published as malicious.
D44 · Platform End-of-Life
1 end-of-life runtime(s) and 0 end-of-life framework(s), read from 1 platform declaration(s) and 1 dependency declaration(s). This dimension reads what the repository says about ITSELF — a pinned target framework, a version file, a capped requires-python, a Rust toolchain pin, a framework major a constraint cannot move off. A FLOOR is deliberately never charged: `requires-python = ">=3.8"` states what the package SUPPORTS, not what it runs on, and a well-maintained library declares exactly that while running its own CI on a current release. The end-of-life facts are FROZEN and dated, so this dimension needs no network and answers identically inside a closed scan fence; as the table ages it loses recall and never precision, because a statement about support that ended in the past cannot become false. The OS layer of a container image is D31's question and the toolchain a CI workflow installs is D29's; this row is neither.
What to do
- Resolve the 1 End-of-life runtime finding(s) in Platform End-of-Life — start with package.json. — One of this dimension's main actionable groups (1 warning-level).
Frontend & cross-cutting dimensions
AX10 · Code composition
What to do
- The domain core is a small share of production code, but most of the rest matched no layer vocabulary at all — so this is not yet an anemic-domain finding. The namespace/path convention could not place that code, which makes the composition above a statement about the naming, not about the design. Name the layers (or check that the repository's conventions differ from the ones this check knows) before reading a thin domain into it.
AX3 · Project dependency cycles
AX4 · Dependency direction
AX6 · Interface segregation
AX8 · Test isolation
M1 · Documentation (README)
What to do
- Add an 'Architecture' / 'How it works' section to the root README — the high-level shape.
- Add a README to the 118 of 136 project(s) that lack one — worth up to 1.7 pts.
M2 · Architecture documentation
- No Architecture Decision Records found — no conventional ADR directory, no numbered `NNNN-title` documents in any markup this check reads, and nothing ADR-shaped by content. Design rationale recorded elsewhere (a design-notes tree, a mailing list, pull-request discussion) is not visible to this check and is not re-findable per decision, so a future maintainer cannot ask why one choice was made and get an answer.
What to do
- Record your significant design decisions. Write one short document per decision, giving its date, the situation, the decision and its consequences, and keep them together with your other design documents. A docs/adr folder with each file named by number and title is the easiest place to find them.
M3 · Folder & project structure
M4 · Documentation accuracy
- README.md links to `src/parser/README.md`, but `src/parser/README.md` does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents' own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong. — README.md:105
- packages/flow-parser/README.md names React 19, but the manifest declares `react` ^18.3.1. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents' own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong. — packages/flow-parser/README.md:22
- website/docs/react/refs.md names React 19, but the manifest declares `react` ^18.3.1. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents' own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong. — website/docs/react/refs.md:84
What to do
- Reconcile the README with reality: README.md links to `src/parser/README.md`, but `src/parser/README.md` does not exist; packages/flow-parser/README.md names React 19, but the manifest declares `react` ^18.3.1; website/docs/react/refs.md names React 19, but the manifest declares `react` ^18.3.1.
P1 · CI/CD gates
P10 · Library API & versioning
P2 · Observability
- Only 24/32 runnable modules use logging (modules with no entry point or server are excluded — they are libraries a runnable module hosts). Silent: `.`, `packages/flow-bin`, `packages/flow-dev-tools`, `packages/flow-remove-types`, `packages/flow-upgrade` and 3 more.
- `packages/flow-for-vscode/src/utils/LanguageClient/TypeCoverageFeature/TypeCoverageProvider.ts` reports through `console.*` at line 90 although other files in its module log through a logger. Console lines carry no level, fields or correlation and never reach the log pipeline. — packages/flow-for-vscode/src/utils/LanguageClient/TypeCoverageFeature/TypeCoverageProvider.ts:90
What to do
- Extend structured logging to the remaining runnable modules so everything you run is diagnosable in production.
- Route service-code `console.*` output through the module's structured logger (with named fields), so delivery outcomes and failures reach the log pipeline with a level.
- Consider OpenTelemetry tracing/metrics (opentelemetry with tracing-opentelemetry) and a health-check endpoint (a /health route on your axum/actix router) for operability.
P3 · Security & performance tooling
- No static application security testing detected. For this repository's stack, add cargo-audit / cargo-deny (or clippy) (or `semgrep --config=auto`, which runs on any language) as a CI step. What was searched, so you can tell an absence from a miss: the 21750 CI workflow file(s) in this repository, and the scanner and linter configuration checked in beside them. A scan that runs outside CI, one configured in your forge's web UI rather than in a committed file, or a tool whose name is none of those this check carries, is not seen — if that is your case the row is wrong, and saying so is more useful than adding a second scanner.
What to do
- Add a SAST step to CI running what this repository's stack ships: cargo-audit / cargo-deny (or clippy) — or `semgrep --config=auto`, which runs on any language — so a security regression fails the build instead of landing.
- Enable Dependabot/Renovate or a dependency-review gate.
- Add gitleaks/trufflehog in CI to block PRs that introduce committed secrets.
P4 · Deployment & Rollback
What to do
- Make sure a person approves each release. The release job names an environment, but its approval rules live in the code host's settings, where Watchdog can't see them. Check that a reviewer must approve each release, or publish releases as drafts first, so a bad build can be stopped before anyone downloads it.
P6 · Release Hygiene
PF3 · Async & latency hygiene
R1 · Type Safety
- 192 typed · 8878 plain JS — the untyped files are evals/evals/01_error_fixing/error_001_refinement_invalidation/ideal/main.js, evals/evals/01_error_fixing/error_001_refinement_invalidation/input/main.js, evals/evals/01_error_fixing/error_002_exact_object_types/ideal/main.js, evals/evals/01_error_fixing/error_002_exact_object_types/input/main.js, evals/evals/01_error_fixing/error_003_unknown_type_refinement/ideal/main.js, evals/evals/01_error_fixing/error_003_unknown_type_refinement/input/main.js (+8872 more). 0 production file(s) opt out entirely with @ts-nocheck · 11 @ts-ignore suppression(s).
What to do
- Migrate the remaining .js/.jsx files to TypeScript.
R10 · Code Duplication
- 19 duplicated blocks under packages/ have copies in at least two of the sibling directories flow-api-translator, flow-dev-tools, flow-estree, flow-transform, flow-typed, flow-upgrade — 12 of them are reported below, and 7 are counted here but not reported individually: those copies match on shape but no longer clear R10's bar for an individually reported row — either they kept neither their own names nor their values, or what was copied is too small to stand on its own (it reports near-exact duplication only, and only of substantial extent). What this row states is the concentration, which the detector measured over all 19 and which does not depend on how exactly each block's copies still match. That concentration is one structural fact, not 19 local ones: the siblings replicate behaviour none of them owns, which is the shape of a missing shared module — a common library every sibling imports — rather than 19 separate extractions. Check first whether the siblings are deliberately standalone deliverables (scaffold templates, demo apps that must stay copy-pasteable); where they are, the duplication is the design and the per-block rows are the ones to act on. — packages/flow-dev-tools/flow-typed/npm/glob_v7.x.x.js:4
- 16 duplicated blocks under newtests/lsp/ have copies in at least two of the sibling directories auto_close_jsx, completion, connection, documentHighlight, document_paste, edits (+8 more sibling(s) not listed) — 8 of them are reported below, and 8 are counted here but not reported individually: those copies match on shape but no longer clear R10's bar for an individually reported row — either they kept neither their own names nor their values, or what was copied is too small to stand on its own (it reports near-exact duplication only, and only of substantial extent). What this row states is the concentration, which the detector measured over all 16 and which does not depend on how exactly each block's copies still match. That concentration is one structural fact, not 16 local ones: the siblings replicate behaviour none of them owns, which is the shape of a missing shared module — a common library every sibling imports — rather than 16 separate extractions. Check first whether the siblings are deliberately standalone deliverables (scaffold templates, demo apps that must stay copy-pasteable); where they are, the duplication is the design and the per-block rows are the ones to act on. — newtests/lsp/queries/outline.js:3
- 5 duplicated blocks under evals/evals/02_unique_features/ have copies in at least two of the sibling directories component_006_rest_params, component_008_ref_param, component_025_migrate_forwardref, enum_001_string_enum_cast, enum_003_boolean_symbol, hook_003_hook_type_annotation (+1 more sibling(s) not listed) — 4 of them are reported below, and 1 is counted here but not reported individually: those copies match on shape but no longer clear R10's bar for an individually reported row — either they kept neither their own names nor their values, or what was copied is too small to stand on its own (it reports near-exact duplication only, and only of substantial extent). What this row states is the concentration, which the detector measured over all 5 and which does not depend on how exactly each block's copies still match. That concentration is one structural fact, not 5 local ones: the siblings replicate behaviour none of them owns, which is the shape of a missing shared module — a common library every sibling imports — rather than 5 separate extractions. Check first whether the siblings are deliberately standalone deliverables (scaffold templates, demo apps that must stay copy-pasteable); where they are, the duplication is the design and the per-block rows are the ones to act on. — evals/evals/02_unique_features/enum_001_string_enum_cast/ideal/main.js:32
- REDACTED:32 · packages/flow-api-translator/src/flowDefToTSDef.js:40 — the two spans are one implementation copied and then locally edited — 540 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row's finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters — or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one. — REDACTED:32
- evals/evals/04_ts_to_flow/nominal_classes_interface_bridge/ideal/main.js:18 · evals/evals/04_ts_to_flow/nominal_classes_interface_bridge/input/source.ts:4 — the two spans are one implementation copied and then locally edited — 368 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row's finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters — or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one. — evals/evals/04_ts_to_flow/nominal_classes_interface_bridge/ideal/main.js:18
- packages/flow-dev-tools/flow-typed/npm/glob_v7.x.x.js:4 · packages/flow-typed/glob.js:13 — the two spans are one implementation copied and then locally edited — 420 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row's finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters — or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one. — packages/flow-dev-tools/flow-typed/npm/glob_v7.x.x.js:4
- evals/evals/02_unique_features/hook_005_conditional_call/ideal/main.js:13 · evals/evals/02_unique_features/hook_005_conditional_call/input/main.js:13 — the two spans are one implementation copied and then locally edited — 372 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row's finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters — or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one. — evals/evals/02_unique_features/hook_005_conditional_call/ideal/main.js:13
- newtests/lsp/signatureHelp/test.js:875 · newtests/lsp/signatureHelp/test.js:921 · newtests/lsp/signatureHelp/test.js:967 · newtests/lsp/signatureHelp/test.js:1013 · +12 more site(s) not listed — all 16 copies are in the same file, and the CITED SPAN is a run of DECLARATIONS inside a construct — the members of a type, or the entries of an object or array literal — with no statement anywhere in it. Do not read this as an extract-a-helper row: nothing here executes, so there is no call site, and a call expression cannot stand where a member declaration or a literal's entry was. What repeats is a SHAPE, and which shape decides the move. Where the copies declare the same members, the repetition is a missing common ancestor: give it a base type, an interface both extend, a generic instantiated twice, or — where the copies are a literal's entries rather than a type's members — one shared constant each site spreads or refers to, so the set is written once. Where they declare DIFFERENT members and only the form is shared — a decorator and its options, an annotation, a registration table's keys — the form is prescribed by a framework or a schema rather than copied, and the only collapse available is to generate the declarations from that schema; where you do not own the generator, this is the cost of the framework and there is nothing to extract. Check which of the two it is before acting: these copies still drift apart the first time only one of them is edited, which is why the repetition is reported, but the sentence to act on is not the same in both cases. — newtests/lsp/signatureHelp/test.js:875
- packages/flow-typed/jest.js:332 · packages/flow-upgrade/flow-typed/npm/jest_v27.x.x.js:762 — the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block — it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead — the whole function, component or branch these lines sit in — and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported. — packages/flow-typed/jest.js:332
- evals/evals/01_error_fixing/error_022_implements_object_type/ideal/main.js:16 · evals/evals/01_error_fixing/error_022_implements_object_type/input/main.js:16 — the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another. — evals/evals/01_error_fixing/error_022_implements_object_type/ideal/main.js:16
- evals/evals/04_ts_to_flow/unknown_top_type_narrowing/ideal/main.js:10 · evals/evals/04_ts_to_flow/unknown_top_type_narrowing/input/source.ts:1 — the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another. — evals/evals/04_ts_to_flow/unknown_top_type_narrowing/ideal/main.js:10
- newtests/lsp/signatureHelp/test.js:1893 · newtests/lsp/signatureHelp/test.js:1962 — all 2 copies are in the same file, and the CITED SPAN is a run of DECLARATIONS inside a construct — the members of a type, or the entries of an object or array literal — with no statement anywhere in it. Do not read this as an extract-a-helper row: nothing here executes, so there is no call site, and a call expression cannot stand where a member declaration or a literal's entry was. What repeats is a SHAPE, and which shape decides the move. Where the copies declare the same members, the repetition is a missing common ancestor: give it a base type, an interface both extend, a generic instantiated twice, or — where the copies are a literal's entries rather than a type's members — one shared constant each site spreads or refers to, so the set is written once. Where they declare DIFFERENT members and only the form is shared — a decorator and its options, an annotation, a registration table's keys — the form is prescribed by a framework or a schema rather than copied, and the only collapse available is to generate the declarations from that schema; where you do not own the generator, this is the cost of the framework and there is nothing to extract. Check which of the two it is before acting: these copies still drift apart the first time only one of them is edited, which is why the repetition is reported, but the sentence to act on is not the same in both cases. — newtests/lsp/signatureHelp/test.js:1893
- newtests/lsp/signatureHelp/test.js:1592 · newtests/lsp/signatureHelp/test.js:1631 · newtests/lsp/signatureHelp/test.js:1670 · newtests/lsp/signatureHelp/test.js:1709 · +2 more site(s) not listed — all 6 copies are in the same file, and the CITED SPAN is a run of DECLARATIONS inside a construct — the members of a type, or the entries of an object or array literal — with no statement anywhere in it. Do not read this as an extract-a-helper row: nothing here executes, so there is no call site, and a call expression cannot stand where a member declaration or a literal's entry was. What repeats is a SHAPE, and which shape decides the move. Where the copies declare the same members, the repetition is a missing common ancestor: give it a base type, an interface both extend, a generic instantiated twice, or — where the copies are a literal's entries rather than a type's members — one shared constant each site spreads or refers to, so the set is written once. Where they declare DIFFERENT members and only the form is shared — a decorator and its options, an annotation, a registration table's keys — the form is prescribed by a framework or a schema rather than copied, and the only collapse available is to generate the declarations from that schema; where you do not own the generator, this is the cost of the framework and there is nothing to extract. Check which of the two it is before acting: these copies still drift apart the first time only one of them is edited, which is why the repetition is reported, but the sentence to act on is not the same in both cases. — newtests/lsp/signatureHelp/test.js:1592
- packages/flow-dev-tools/flow-typed/node.js:307 · packages/flow-dev-tools/flow-typed/node.js:364 — all 2 copies are in the same file, and what repeats is a LIST OF ENTRIES rather than behaviour — the same entries written out more than once. Extract them into one shared, exported constant and spread that constant into each site, rather than into a function the sites call: a list like this often lives in declarative metadata (a decorator's options object, a static configuration table) that a build step must be able to read statically, where a function call is not allowed. Adding an entry to one copy and not the other is the failure this prevents. — packages/flow-dev-tools/flow-typed/node.js:307
- newtests/lsp/signatureHelp/test.js:2034 · newtests/lsp/signatureHelp/test.js:2071 · newtests/lsp/signatureHelp/test.js:2109 · newtests/lsp/signatureHelp/test.js:2147 · +17 more site(s) not listed — all 21 copies are in the same file, and the CITED SPAN is a run of DECLARATIONS inside a construct — the members of a type, or the entries of an object or array literal — with no statement anywhere in it. Do not read this as an extract-a-helper row: nothing here executes, so there is no call site, and a call expression cannot stand where a member declaration or a literal's entry was. What repeats is a SHAPE, and which shape decides the move. Where the copies declare the same members, the repetition is a missing common ancestor: give it a base type, an interface both extend, a generic instantiated twice, or — where the copies are a literal's entries rather than a type's members — one shared constant each site spreads or refers to, so the set is written once. Where they declare DIFFERENT members and only the form is shared — a decorator and its options, an annotation, a registration table's keys — the form is prescribed by a framework or a schema rather than copied, and the only collapse available is to generate the declarations from that schema; where you do not own the generator, this is the cost of the framework and there is nothing to extract. Check which of the two it is before acting: these copies still drift apart the first time only one of them is edited, which is why the repetition is reported, but the sentence to act on is not the same in both cases. — newtests/lsp/signatureHelp/test.js:2034
- evals/evals/01_error_fixing/error_019_class_nominal_typing/ideal/main.js:14 · evals/evals/01_error_fixing/error_019_class_nominal_typing/input/main.js:10 — the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another. — evals/evals/01_error_fixing/error_019_class_nominal_typing/ideal/main.js:14
- packages/flow-typed/jest.js:669 · packages/flow-upgrade/flow-typed/npm/jest_v27.x.x.js:1094 — the 2 copies are spread across 2 files, and the CITED SPAN is a run of DECLARATIONS inside a construct — the members of a type, or the entries of an object or array literal — with no statement anywhere in it. Do not read this as an extract-a-helper row: nothing here executes, so there is no call site, and a call expression cannot stand where a member declaration or a literal's entry was. What repeats is a SHAPE, and which shape decides the move. Where the copies declare the same members, the repetition is a missing common ancestor: give it a base type, an interface both extend, a generic instantiated twice, or — where the copies are a literal's entries rather than a type's members — one shared constant each site spreads or refers to, so the set is written once. Where they declare DIFFERENT members and only the form is shared — a decorator and its options, an annotation, a registration table's keys — the form is prescribed by a framework or a schema rather than copied, and the only collapse available is to generate the declarations from that schema; where you do not own the generator, this is the cost of the framework and there is nothing to extract. Check which of the two it is before acting: these copies still drift apart the first time only one of them is edited, which is why the repetition is reported, but the sentence to act on is not the same in both cases. — packages/flow-typed/jest.js:669
- packages/flow-upgrade/flow-typed/npm/fs-extra_v10.x.x.js:537 · packages/flow-upgrade/flow-typed/npm/fs-extra_v10.x.x.js:667 — the two spans are one implementation copied and then locally edited — 185 tokens are still identical, in the same order in both spans, with only local edits between them. The copies have already begun to drift, which is this row's finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters — or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one. — packages/flow-upgrade/flow-typed/npm/fs-extra_v10.x.x.js:537
- evals/evals/02_unique_features/hook_007_migrate_basic/ideal/main.js:12 · evals/evals/02_unique_features/hook_007_migrate_basic/input/main.js:12 — the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another. — evals/evals/02_unique_features/hook_007_migrate_basic/ideal/main.js:12
- evals/evals/02_unique_features/match_017_unreachable_patterns/ideal/main.js:10 · evals/evals/02_unique_features/match_017_unreachable_patterns/input/main.js:10 — the two spans are one implementation copied and then locally edited — 163 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row's finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters — or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one. — evals/evals/02_unique_features/match_017_unreachable_patterns/ideal/main.js:10
- evals/evals/04_ts_to_flow/class_private_members/ideal/main.js:20 · evals/evals/04_ts_to_flow/class_private_members/input/source.ts:6 — the two spans are one implementation copied and then locally edited — 269 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row's finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters — or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one. — evals/evals/04_ts_to_flow/class_private_members/ideal/main.js:20
- newtests/lsp/signatureHelp/test.js:153 · newtests/lsp/signatureHelp/test.js:185 · newtests/lsp/signatureHelp/test.js:217 · newtests/lsp/signatureHelp/test.js:249 · +2 more site(s) not listed — all 6 copies are in the same file, and the CITED SPAN is a run of DECLARATIONS inside a construct — the members of a type, or the entries of an object or array literal — with no statement anywhere in it. Do not read this as an extract-a-helper row: nothing here executes, so there is no call site, and a call expression cannot stand where a member declaration or a literal's entry was. What repeats is a SHAPE, and which shape decides the move. Where the copies declare the same members, the repetition is a missing common ancestor: give it a base type, an interface both extend, a generic instantiated twice, or — where the copies are a literal's entries rather than a type's members — one shared constant each site spreads or refers to, so the set is written once. Where they declare DIFFERENT members and only the form is shared — a decorator and its options, an annotation, a registration table's keys — the form is prescribed by a framework or a schema rather than copied, and the only collapse available is to generate the declarations from that schema; where you do not own the generator, this is the cost of the framework and there is nothing to extract. Check which of the two it is before acting: these copies still drift apart the first time only one of them is edited, which is why the repetition is reported, but the sentence to act on is not the same in both cases. — newtests/lsp/signatureHelp/test.js:153
- newtests/lsp/signatureHelp/test.js:587 · newtests/lsp/signatureHelp/test.js:618 · newtests/lsp/signatureHelp/test.js:649 · newtests/lsp/signatureHelp/test.js:680 · +3 more site(s) not listed — all 7 copies are in the same file, and the CITED SPAN is a run of DECLARATIONS inside a construct — the members of a type, or the entries of an object or array literal — with no statement anywhere in it. Do not read this as an extract-a-helper row: nothing here executes, so there is no call site, and a call expression cannot stand where a member declaration or a literal's entry was. What repeats is a SHAPE, and which shape decides the move. Where the copies declare the same members, the repetition is a missing common ancestor: give it a base type, an interface both extend, a generic instantiated twice, or — where the copies are a literal's entries rather than a type's members — one shared constant each site spreads or refers to, so the set is written once. Where they declare DIFFERENT members and only the form is shared — a decorator and its options, an annotation, a registration table's keys — the form is prescribed by a framework or a schema rather than copied, and the only collapse available is to generate the declarations from that schema; where you do not own the generator, this is the cost of the framework and there is nothing to extract. Check which of the two it is before acting: these copies still drift apart the first time only one of them is edited, which is why the repetition is reported, but the sentence to act on is not the same in both cases. — newtests/lsp/signatureHelp/test.js:587
- newtests/lsp/signatureHelp/test.js:2829 · newtests/lsp/signatureHelp/test.js:2860 · newtests/lsp/signatureHelp/test.js:2892 · newtests/lsp/signatureHelp/test.js:2924 · +6 more site(s) not listed — all 10 copies are in the same file, and the CITED SPAN is a run of DECLARATIONS inside a construct — the members of a type, or the entries of an object or array literal — with no statement anywhere in it. Do not read this as an extract-a-helper row: nothing here executes, so there is no call site, and a call expression cannot stand where a member declaration or a literal's entry was. What repeats is a SHAPE, and which shape decides the move. Where the copies declare the same members, the repetition is a missing common ancestor: give it a base type, an interface both extend, a generic instantiated twice, or — where the copies are a literal's entries rather than a type's members — one shared constant each site spreads or refers to, so the set is written once. Where they declare DIFFERENT members and only the form is shared — a decorator and its options, an annotation, a registration table's keys — the form is prescribed by a framework or a schema rather than copied, and the only collapse available is to generate the declarations from that schema; where you do not own the generator, this is the cost of the framework and there is nothing to extract. Check which of the two it is before acting: these copies still drift apart the first time only one of them is edited, which is why the repetition is reported, but the sentence to act on is not the same in both cases. — newtests/lsp/signatureHelp/test.js:2829
- packages/flow-dev-tools/flow-typed/node.js:2782 · packages/flow-dev-tools/flow-typed/node.js:2851 — all 2 copies are in the same file, and the CITED SPAN is not a self-contained block — it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead — the whole function, component or branch these lines sit in — and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported. — packages/flow-dev-tools/flow-typed/node.js:2782
- evals/evals/04_ts_to_flow/comprehensive_dom_attributes/ideal/main.js:19 · evals/evals/04_ts_to_flow/comprehensive_dom_attributes/input/source.ts:19 — the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block — it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead — the whole function, component or branch these lines sit in — and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported. — evals/evals/04_ts_to_flow/comprehensive_dom_attributes/ideal/main.js:19
- newtests/lsp/code-action/quickfix/ts_and_legacy_syntax/test.js:472 · newtests/lsp/code-action/quickfix/ts_and_legacy_syntax/test.js:502 · newtests/lsp/code-action/quickfix/ts_and_legacy_syntax/test.js:532 · newtests/lsp/code-action/quickfix/ts_and_legacy_syntax/test.js:562 · +1 more site(s) not listed — all 5 copies are in the same file, and the CITED SPAN is a run of DECLARATIONS inside a construct — the members of a type, or the entries of an object or array literal — with no statement anywhere in it. Do not read this as an extract-a-helper row: nothing here executes, so there is no call site, and a call expression cannot stand where a member declaration or a literal's entry was. What repeats is a SHAPE, and which shape decides the move. Where the copies declare the same members, the repetition is a missing common ancestor: give it a base type, an interface both extend, a generic instantiated twice, or — where the copies are a literal's entries rather than a type's members — one shared constant each site spreads or refers to, so the set is written once. Where they declare DIFFERENT members and only the form is shared — a decorator and its options, an annotation, a registration table's keys — the form is prescribed by a framework or a schema rather than copied, and the only collapse available is to generate the declarations from that schema; where you do not own the generator, this is the cost of the framework and there is nothing to extract. Check which of the two it is before acting: these copies still drift apart the first time only one of them is edited, which is why the repetition is reported, but the sentence to act on is not the same in both cases. — newtests/lsp/code-action/quickfix/ts_and_legacy_syntax/test.js:472
- newtests/lsp/signatureHelp/test.js:2848 · newtests/lsp/signatureHelp/test.js:2880 · newtests/lsp/signatureHelp/test.js:2912 · newtests/lsp/signatureHelp/test.js:2944 · +4 more site(s) not listed — all 8 copies are in the same file, and the CITED SPAN is a run of DECLARATIONS inside a construct — the members of a type, or the entries of an object or array literal — with no statement anywhere in it. Do not read this as an extract-a-helper row: nothing here executes, so there is no call site, and a call expression cannot stand where a member declaration or a literal's entry was. What repeats is a SHAPE, and which shape decides the move. Where the copies declare the same members, the repetition is a missing common ancestor: give it a base type, an interface both extend, a generic instantiated twice, or — where the copies are a literal's entries rather than a type's members — one shared constant each site spreads or refers to, so the set is written once. Where they declare DIFFERENT members and only the form is shared — a decorator and its options, an annotation, a registration table's keys — the form is prescribed by a framework or a schema rather than copied, and the only collapse available is to generate the declarations from that schema; where you do not own the generator, this is the cost of the framework and there is nothing to extract. Check which of the two it is before acting: these copies still drift apart the first time only one of them is edited, which is why the repetition is reported, but the sentence to act on is not the same in both cases. — newtests/lsp/signatureHelp/test.js:2848
- packages/flow-transform/src/transform/comments/prettier/language-js/comments.js:150 · packages/flow-transform/src/transform/comments/prettier/language-js/comments.js:233 — all 2 copies are in the same file, and the CITED SPAN is not a self-contained block — it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead — the whole function, component or branch these lines sit in — and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported. — packages/flow-transform/src/transform/comments/prettier/language-js/comments.js:150
- evals/evals/02_unique_features/hook_004_mutation_prevention/ideal/main.js:13 · evals/evals/02_unique_features/hook_004_mutation_prevention/input/main.js:13 — the two spans are one implementation copied and then locally edited — 176 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row's finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters — or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one. — evals/evals/02_unique_features/hook_004_mutation_prevention/ideal/main.js:13
- lib/lib.es5.js:1533 · lib/lib.es5.js:1749 · lib/lib.es5.js:1965 · lib/lib.es5.js:2181 · +5 more site(s) not listed — all 9 copies are in the same file, and the CITED SPAN is inside a TYPE DECLARATION, not executable code. There is no function to extract and no call site to call one from, so do not read this as an extract-a-helper row: the collapse a type offers is a generic — name the shape once, parameterised over the part that varies, and have each copy instantiate it. First check what actually differs between the copies: where they are a MATRIX of cases (one entry per input, differing precisely in the case each one pins), the repetition IS the enumeration and collapsing it would delete cases rather than de-duplicate anything — leave those alone. Reported because the copies that are not a matrix drift apart the first time only one of them is edited. — lib/lib.es5.js:1533
- packages/flow-api-translator/src/flowDefToTSDef.js:2926 · packages/flow-api-translator/src/flowDefToTSDef.js:2973 — all 2 copies are in the same file, and the CITED SPAN is not a self-contained block — it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead — the whole function, component or branch these lines sit in — and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported. — packages/flow-api-translator/src/flowDefToTSDef.js:2926
- evals/evals/02_unique_features/match_022_instance_superclass/ideal/main.js:10 · evals/evals/02_unique_features/match_022_instance_superclass/input/main.js:10 — the 2 copies are spread across 2 files, and each CITED SPAN is a SPECIALISATION DECLARATION — a type whose `extends` clause names a base and whose body hands that base its own values through `super(…)`. The shared module this dimension usually asks you to extract already exists: it is that base, every one of these sites already reaches it, and the `super(…)` call this row matched on is where each site passes its differences in. So do not read this as an extract-a-helper row — there is no missing helper, and what is left at each site is the declaration of one distinct specialisation, which cannot be deleted without deleting the thing it declares. Read what actually differs between the spans, because two different answers follow. Where the sites differ only in the values they hand the base — a type argument, a service, an alias, a cache — the repetition is a TEMPLATE, and the only moves that collapse it are to generate these declarations from the set they enumerate or to replace the repeated construction with one factory each site calls with its own values; where that set is the point, each site pinning one distinct thing, the repetition IS the enumeration and there is nothing to remove. Where instead a span carries logic OUTSIDE the delegation that is the same at every site, that logic is the part to move, and its home is the base type rather than a new module. Reported because the copies still drift apart the first time only one of them is edited. — evals/evals/02_unique_features/match_022_instance_superclass/ideal/main.js:10
- packages/flow-dev-tools/flow-typed/node.js:2656 · packages/flow-dev-tools/flow-typed/node.js:2693 — all 2 copies are in the same file, and the CITED SPAN is a run of DECLARATIONS inside a construct — the members of a type, or the entries of an object or array literal — with no statement anywhere in it. Do not read this as an extract-a-helper row: nothing here executes, so there is no call site, and a call expression cannot stand where a member declaration or a literal's entry was. What repeats is a SHAPE, and which shape decides the move. Where the copies declare the same members, the repetition is a missing common ancestor: give it a base type, an interface both extend, a generic instantiated twice, or — where the copies are a literal's entries rather than a type's members — one shared constant each site spreads or refers to, so the set is written once. Where they declare DIFFERENT members and only the form is shared — a decorator and its options, an annotation, a registration table's keys — the form is prescribed by a framework or a schema rather than copied, and the only collapse available is to generate the declarations from that schema; where you do not own the generator, this is the cost of the framework and there is nothing to extract. Check which of the two it is before acting: these copies still drift apart the first time only one of them is edited, which is why the repetition is reported, but the sentence to act on is not the same in both cases. — packages/flow-dev-tools/flow-typed/node.js:2656
- evals/evals/01_error_fixing/error_020_ts_access_modifiers/ideal/main.js:12 · evals/evals/01_error_fixing/error_020_ts_access_modifiers/input/main.js:12 — the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another. — evals/evals/01_error_fixing/error_020_ts_access_modifiers/ideal/main.js:12
- evals/evals/01_error_fixing/error_025_object_this_reference/ideal/main.js:13 · evals/evals/01_error_fixing/error_025_object_this_reference/input/main.js:13 — the two spans are one implementation copied and then locally edited — 190 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row's finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters — or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one. — evals/evals/01_error_fixing/error_025_object_this_reference/ideal/main.js:13
- evals/evals/04_ts_to_flow/empty_bottom_type_exhaustiveness/ideal/main.js:13 · evals/evals/04_ts_to_flow/empty_bottom_type_exhaustiveness/input/source.ts:4 — the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another. — evals/evals/04_ts_to_flow/empty_bottom_type_exhaustiveness/ideal/main.js:13
- evals/evals/04_ts_to_flow/utility_type_mappings_comprehensive/ideal/main.js:22 · evals/evals/04_ts_to_flow/utility_type_mappings_comprehensive/input/source.ts:12 — the 2 copies are spread across 2 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct — and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal's entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins — a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are. — evals/evals/04_ts_to_flow/utility_type_mappings_comprehensive/ideal/main.js:22
- newtests/lsp/code-action/quickfix/match/test.js:21 · newtests/lsp/code-action/quickfix/match/test.js:48 · newtests/lsp/code-action/quickfix/match/test.js:75 · newtests/lsp/code-action/quickfix/match/test.js:102 · +17 more site(s) not listed — all 21 copies are in the same file, and the CITED SPAN is a run of DECLARATIONS inside a construct — the members of a type, or the entries of an object or array literal — with no statement anywhere in it. Do not read this as an extract-a-helper row: nothing here executes, so there is no call site, and a call expression cannot stand where a member declaration or a literal's entry was. What repeats is a SHAPE, and which shape decides the move. Where the copies declare the same members, the repetition is a missing common ancestor: give it a base type, an interface both extend, a generic instantiated twice, or — where the copies are a literal's entries rather than a type's members — one shared constant each site spreads or refers to, so the set is written once. Where they declare DIFFERENT members and only the form is shared — a decorator and its options, an annotation, a registration table's keys — the form is prescribed by a framework or a schema rather than copied, and the only collapse available is to generate the declarations from that schema; where you do not own the generator, this is the cost of the framework and there is nothing to extract. Check which of the two it is before acting: these copies still drift apart the first time only one of them is edited, which is why the repetition is reported, but the sentence to act on is not the same in both cases. — newtests/lsp/code-action/quickfix/match/test.js:21
- newtests/lsp/code-action/quickfix/ts_and_legacy_syntax/test.js:77 · newtests/lsp/code-action/quickfix/ts_and_legacy_syntax/test.js:103 · newtests/lsp/code-action/quickfix/ts_and_legacy_syntax/test.js:129 · newtests/lsp/code-action/quickfix/ts_and_legacy_syntax/test.js:155 — all 4 copies are in the same file, and the CITED SPAN is a run of DECLARATIONS inside a construct — the members of a type, or the entries of an object or array literal — with no statement anywhere in it. Do not read this as an extract-a-helper row: nothing here executes, so there is no call site, and a call expression cannot stand where a member declaration or a literal's entry was. What repeats is a SHAPE, and which shape decides the move. Where the copies declare the same members, the repetition is a missing common ancestor: give it a base type, an interface both extend, a generic instantiated twice, or — where the copies are a literal's entries rather than a type's members — one shared constant each site spreads or refers to, so the set is written once. Where they declare DIFFERENT members and only the form is shared — a decorator and its options, an annotation, a registration table's keys — the form is prescribed by a framework or a schema rather than copied, and the only collapse available is to generate the declarations from that schema; where you do not own the generator, this is the cost of the framework and there is nothing to extract. Check which of the two it is before acting: these copies still drift apart the first time only one of them is edited, which is why the repetition is reported, but the sentence to act on is not the same in both cases. — newtests/lsp/code-action/quickfix/ts_and_legacy_syntax/test.js:77
What to do
- Act on each finding's own remediation rather than one rule: the move depends on what recurs. Where the copies are executable blocks, give the shared part one home and call it from each site; where they are declarations, a listing, a specialisation already delegating to its base, or one shape repeated per entity, there is no call site and the move is a shared type, a generated set or a factory — sometimes there is nothing to extract.
R11 · Import Boundaries
- packages/flow-dev-tools/src/command/allCommands.js:14 imports packages/flow-dev-tools/src/new-test/new-testCommand.js, a module inside the test suite — test helpers carry no compatibility contract and are maintained for the suite, not as an API, so production code that depends on one is coupled to a module nobody keeps stable. Move the shared helper into a source directory both layers may depend on. — packages/flow-dev-tools/src/command/allCommands.js:14
- packages/flow-dev-tools/src/command/allCommands.js:17 imports packages/flow-dev-tools/src/test/testCommand.js, a module inside the test suite — test helpers carry no compatibility contract and are maintained for the suite, not as an API, so production code that depends on one is coupled to a module nobody keeps stable. Move the shared helper into a source directory both layers may depend on. — packages/flow-dev-tools/src/command/allCommands.js:17
- packages/flow-dev-tools/src/record/recordRunner.js:16 imports packages/flow-dev-tools/src/test/builder.js, a module inside the test suite — test helpers carry no compatibility contract and are maintained for the suite, not as an API, so production code that depends on one is coupled to a module nobody keeps stable. Move the shared helper into a source directory both layers may depend on. — packages/flow-dev-tools/src/record/recordRunner.js:16
- packages/flow-dev-tools/src/record/recordRunner.js:17 imports packages/flow-dev-tools/src/test/findTests.js, a module inside the test suite — test helpers carry no compatibility contract and are maintained for the suite, not as an API, so production code that depends on one is coupled to a module nobody keeps stable. Move the shared helper into a source directory both layers may depend on. — packages/flow-dev-tools/src/record/recordRunner.js:17
- packages/flow-dev-tools/src/record/recordRunner.js:19 imports packages/flow-dev-tools/src/test/findTests.js, a module inside the test suite — test helpers carry no compatibility contract and are maintained for the suite, not as an API, so production code that depends on one is coupled to a module nobody keeps stable. Move the shared helper into a source directory both layers may depend on. — packages/flow-dev-tools/src/record/recordRunner.js:19
- packages/flow-dev-tools/src/record/recordRunner.js:20 imports packages/flow-dev-tools/src/test/RunQueue.js, a module inside the test suite — test helpers carry no compatibility contract and are maintained for the suite, not as an API, so production code that depends on one is coupled to a module nobody keeps stable. Move the shared helper into a source directory both layers may depend on. — packages/flow-dev-tools/src/record/recordRunner.js:20
- packages/flow-for-vscode/src/FlowLanguageClient/FlowLanguageClient.ts:26 imports vscode-languageclient/lib/common/utils/uuid, reaching past a declared dependency's public entry into its build output — that path is the package's toolchain layout, not its API, and a minor version bump can relocate it with no semver signal. Import from the package's documented entry point instead. — packages/flow-for-vscode/src/FlowLanguageClient/FlowLanguageClient.ts:26
- packages/flow-for-vscode/src/utils/LanguageClient/TypeCoverageFeature/TypeCoverageFeature.ts:11 imports vscode-languageclient/lib/common/utils/uuid, reaching past a declared dependency's public entry into its build output — that path is the package's toolchain layout, not its API, and a minor version bump can relocate it with no semver signal. Import from the package's documented entry point instead. — packages/flow-for-vscode/src/utils/LanguageClient/TypeCoverageFeature/TypeCoverageFeature.ts:11
What to do
- Fix the listed violations: move the shared test helper into a source directory production code may depend on (6 rows); import through the target package's declared public entry rather than a deep path into its internals or a relative path into its directory (2 rows).
R2 · Cyclomatic Complexity
- (top-level) has cyclomatic complexity 1153 and cognitive complexity 1152; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive sits below cyclomatic here, so much of the count is breadth — arms side by side rather than stacked — and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. Measured by this repository's own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes. — tests/type_printer/types.js:5
- (anonymous) has cyclomatic complexity 259 and cognitive complexity 450; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side — extracting each decision into its own named function is the change that pays. Measured by this repository's own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes. — tests/refinements/invalidation.js:41
- handleSpecialObjectCompare has cyclomatic complexity 107 and cognitive complexity 143; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side — extracting each decision into its own named function is the change that pays. Measured by this repository's own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes. — packages/flow-parser/test/esprima_test_runner.js:56
- (top-level) has cyclomatic complexity 95 and cognitive complexity 94; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive sits below cyclomatic here, so much of the count is breadth — arms side by side rather than stacked — and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. Measured by this repository's own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes. — tests/disjoint_union_perf/jsAst.js:4
- GenericTypeAnnotation has cyclomatic complexity 81 and cognitive complexity 37; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive sits below cyclomatic here, so much of the count is breadth — arms side by side rather than stacked — and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. Measured by this repository's own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes. — packages/flow-api-translator/src/flowDefToTSDef.js:2463
- (top-level) has cyclomatic complexity 77 and cognitive complexity 76; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive sits below cyclomatic here, so much of the count is breadth — arms side by side rather than stacked — and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. Measured by this repository's own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes. — tests/enums/refinement.js:6
- (anonymous) has cyclomatic complexity 71 and cognitive complexity 105; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side — extracting each decision into its own named function is the change that pays. Measured by this repository's own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes. — tests/refinements/invalidation.js:235
- (anonymous) has cyclomatic complexity 66 and cognitive complexity 101; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side — extracting each decision into its own named function is the change that pays. Measured by this repository's own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes. — tests/refinements/invalidation.js:183
- (top-level) has cyclomatic complexity 56 and cognitive complexity 31; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive sits below cyclomatic here, so much of the count is breadth — arms side by side rather than stacked — and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. Measured by this repository's own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes. — tests/switch_case_typing/test.js:1
- (top-level) has cyclomatic complexity 48 and cognitive complexity 45; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive sits below cyclomatic here, so much of the count is breadth — arms side by side rather than stacked — and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. Measured by this repository's own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes. — tests/sketchy_null_default/test.js:7
- transform has cyclomatic complexity 45 and cognitive complexity 26; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive sits below cyclomatic here, so much of the count is breadth — arms side by side rather than stacked — and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. Measured by this repository's own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes. — packages/flow-parser/oxidized-src/estree/StripFlowTypes.js:33
- eliminateAbstractComponent has cyclomatic complexity 42 and cognitive complexity 21; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive sits below cyclomatic here, so much of the count is breadth — arms side by side rather than stacked — and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. Measured by this repository's own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes. — packages/flow-upgrade/src/codemods/eliminateAbstractComponent.js:18
- runTest has cyclomatic complexity 35 and cognitive complexity 55; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side — extracting each decision into its own named function is the change that pays. Measured by this repository's own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes. — packages/flow-parser/test/esprima_test_runner.js:457
What to do
- Break down the listed branch-heavy functions; aim P95 cyclomatic ≤ 5.
R3 · Large Files
- newtests/lsp/completion/test.js has 10474 significant lines (blank lines excluded), over the 400-line bar, and contains logic — a file this long is usually several responsibilities in one module. — newtests/lsp/completion/test.js:1
- packages/flow-dev-tools/flow-typed/node.js has 5655 significant lines (blank lines excluded), over the 400-line bar, and contains logic — a file this long is usually several responsibilities in one module. — packages/flow-dev-tools/flow-typed/node.js:1
- packages/flow-api-translator/src/flowDefToTSDef.js has 4609 significant lines (blank lines excluded), over the 400-line bar, and contains logic — a file this long is usually several responsibilities in one module. — packages/flow-api-translator/src/flowDefToTSDef.js:1
- newtests/lsp/documentSymbol/test.js has 3629 significant lines (blank lines excluded), over the 400-line bar, and contains logic — a file this long is usually several responsibilities in one module. — newtests/lsp/documentSymbol/test.js:1
- lib/lib.es5.js has 3607 significant lines (blank lines excluded), over the 400-line bar, and contains logic — a file this long is usually several responsibilities in one module. — lib/lib.es5.js:1
- newtests/lsp/signatureHelp/test.js has 3577 significant lines (blank lines excluded), over the 400-line bar, and contains logic — a file this long is usually several responsibilities in one module. — newtests/lsp/signatureHelp/test.js:1
- newtests/lsp/selectionRange/test.js has 2233 significant lines (blank lines excluded), over the 400-line bar, and contains logic — a file this long is usually several responsibilities in one module. — newtests/lsp/selectionRange/test.js:1
- packages/flow-estree/src/types.js has 2149 significant lines (blank lines excluded), over the 400-line bar, and contains logic — a file this long is usually several responsibilities in one module. — packages/flow-estree/src/types.js:1
- packages/flow-api-translator/src/flowToFlowDef.js has 2063 significant lines (blank lines excluded), over the 400-line bar, and contains logic — a file this long is usually several responsibilities in one module. — packages/flow-api-translator/src/flowToFlowDef.js:1
- REDACTED has 1995 significant lines (blank lines excluded), over the 400-line bar, and contains logic — a file this long is usually several responsibilities in one module. — REDACTED:1
- evals/flow-typed/environment/jsx.js has 1929 significant lines (blank lines excluded), over the 400-line bar, and contains logic — a file this long is usually several responsibilities in one module. — evals/flow-typed/environment/jsx.js:1
- packages/flow-upgrade/flow-typed/npm/jest_v27.x.x.js has 1196 significant lines (blank lines excluded), over the 400-line bar, and contains logic — a file this long is usually several responsibilities in one module. — packages/flow-upgrade/flow-typed/npm/jest_v27.x.x.js:1
- packages/flow-parser/oxidized-src/estree/TransformMatchSyntax.js has 972 significant lines (blank lines excluded), over the 400-line bar, and contains logic — a file this long is usually several responsibilities in one module. — packages/flow-parser/oxidized-src/estree/TransformMatchSyntax.js:1
- packages/flow-eslint/src/scope-manager/referencer/Referencer.js has 918 significant lines (blank lines excluded), over the 400-line bar, and contains logic — a file this long is usually several responsibilities in one module. — packages/flow-eslint/src/scope-manager/referencer/Referencer.js:1
- packages/flow-transform/src/transform/comments/prettier/language-js/comments.js has 903 significant lines (blank lines excluded), over the 400-line bar, and contains logic — a file this long is usually several responsibilities in one module. — packages/flow-transform/src/transform/comments/prettier/language-js/comments.js:1
- packages/flow-parser/oxidized-src/estree/TransformComponentSyntax.js has 828 significant lines (blank lines excluded), over the 400-line bar, and contains logic — a file this long is usually several responsibilities in one module. — packages/flow-parser/oxidized-src/estree/TransformComponentSyntax.js:1
- packages/flow-typed/prettier.js has 813 significant lines (blank lines excluded), over the 400-line bar, and contains logic — a file this long is usually several responsibilities in one module. — packages/flow-typed/prettier.js:1
- packages/flow-upgrade/flow-typed/npm/fs-extra_v10.x.x.js has 804 significant lines (blank lines excluded), over the 400-line bar, and contains logic — a file this long is usually several responsibilities in one module. — packages/flow-upgrade/flow-typed/npm/fs-extra_v10.x.x.js:1
- newtests/lsp/code-action/quickfix/ts_and_legacy_syntax/test.js has 797 significant lines (blank lines excluded), over the 400-line bar, and contains logic — a file this long is usually several responsibilities in one module. — newtests/lsp/code-action/quickfix/ts_and_legacy_syntax/test.js:1
- packages/flow-upgrade/flow-typed/npm/memfs_v3.4.x.js has 765 significant lines (blank lines excluded), over the 400-line bar, and contains logic — a file this long is usually several responsibilities in one module. — packages/flow-upgrade/flow-typed/npm/memfs_v3.4.x.js:1
- packages/flow-remove-types/index.js has 754 significant lines (blank lines excluded), over the 400-line bar, and contains logic — a file this long is usually several responsibilities in one module. — packages/flow-remove-types/index.js:1
- packages/flow-typed/jest.js has 751 significant lines (blank lines excluded), over the 400-line bar, and contains logic — a file this long is usually several responsibilities in one module. — packages/flow-typed/jest.js:1
- newtests/lsp/code-action/quickfix/react/test.js has 685 significant lines (blank lines excluded), over the 400-line bar, and contains logic — a file this long is usually several responsibilities in one module. — newtests/lsp/code-action/quickfix/react/test.js:1
- newtests/lsp/diagnostics/test.js has 617 significant lines (blank lines excluded), over the 400-line bar, and contains logic — a file this long is usually several responsibilities in one module. — newtests/lsp/diagnostics/test.js:1
- newtests/lsp/code-action/quickfix/match/test.js has 601 significant lines (blank lines excluded), over the 400-line bar, and contains logic — a file this long is usually several responsibilities in one module. — newtests/lsp/code-action/quickfix/match/test.js:1
- newtests/lsp/code-action/refactor/test.js has 587 significant lines (blank lines excluded), over the 400-line bar, and contains logic — a file this long is usually several responsibilities in one module. — newtests/lsp/code-action/refactor/test.js:1
- src/flow_dot_js_wasm.js has 527 significant lines (blank lines excluded), over the 400-line bar, and contains logic — a file this long is usually several responsibilities in one module. — src/flow_dot_js_wasm.js:1
- packages/flow-transform/src/transform/TransformContext.js has 521 significant lines (blank lines excluded), over the 400-line bar, and contains logic — a file this long is usually several responsibilities in one module. — packages/flow-transform/src/transform/TransformContext.js:1
- packages/flow-for-vscode/src/FlowLanguageClient/DetailedDiagnostics.ts has 461 significant lines (blank lines excluded), over the 400-line bar, and contains logic — a file this long is usually several responsibilities in one module. — packages/flow-for-vscode/src/FlowLanguageClient/DetailedDiagnostics.ts:1
- REDACTED has 451 significant lines (blank lines excluded), over the 400-line bar, and contains logic — a file this long is usually several responsibilities in one module. — REDACTED:1
- packages/flow-eslint/src/scope-manager/scope/ScopeBase.js has 436 significant lines (blank lines excluded), over the 400-line bar, and contains logic — a file this long is usually several responsibilities in one module. — packages/flow-eslint/src/scope-manager/scope/ScopeBase.js:1
- packages/flow-eslint/src/scope-manager/referencer/TypeVisitor.js has 419 significant lines (blank lines excluded), over the 400-line bar, and contains logic — a file this long is usually several responsibilities in one module. — packages/flow-eslint/src/scope-manager/referencer/TypeVisitor.js:1
- lib/lib.es2015.core.js has 412 significant lines (blank lines excluded), over the 400-line bar, and contains logic — a file this long is usually several responsibilities in one module. — lib/lib.es2015.core.js:1
What to do
- Split each oversized file along the responsibilities already in it, into smaller focused modules in the same package.
R4 · Test Coverage
- packages/flow-api-translator/__tests__/flowDefToTSDef/fixtures/export/module-exports/typeof/import/spec.js:11 imports './foo', which names no file in this repository — and no rule in its .gitignore chain could cover one, so no build writes it either. The import throws as the runner collects this file, so none of its test cases run and nothing it was written to verify is verified. Restore the missing module or delete the test. It is excluded from the reachability measured above, because a file that cannot load reaches nothing. — packages/flow-api-translator/__tests__/flowDefToTSDef/fixtures/export/module-exports/typeof/import/spec.js:11
- packages/flow-remove-types/test/test-node-module.js:4 imports './missing-type-only-module', which names no file in this repository — and no rule in its .gitignore chain could cover one, so no build writes it either (1 further unresolvable import(s) in the same file). The import throws as the runner collects this file, so none of its test cases run and nothing it was written to verify is verified. Restore the missing module or delete the test. It is excluded from the reachability measured above, because a file that cannot load reaches nothing. — packages/flow-remove-types/test/test-node-module.js:4
- src/parser/test/flow/import_unsupported_phase/contextual_default_and_named.js:1 imports './foo', which names no file in this repository — and no rule in its .gitignore chain could cover one, so no build writes it either. The import throws as the runner collects this file, so none of its test cases run and nothing it was written to verify is verified. Restore the missing module or delete the test. It is excluded from the reachability measured above, because a file that cannot load reaches nothing. — src/parser/test/flow/import_unsupported_phase/contextual_default_and_named.js:1
- src/parser/test/flow/import_unsupported_phase/contextual_default_binding.js:1 imports './foo', which names no file in this repository — and no rule in its .gitignore chain could cover one, so no build writes it either. The import throws as the runner collects this file, so none of its test cases run and nothing it was written to verify is verified. Restore the missing module or delete the test. It is excluded from the reachability measured above, because a file that cannot load reaches nothing. — src/parser/test/flow/import_unsupported_phase/contextual_default_binding.js:1
- src/parser/test/flow/import_unsupported_phase/contextual_import_equals.js:1 imports './foo', which names no file in this repository — and no rule in its .gitignore chain could cover one, so no build writes it either. The import throws as the runner collects this file, so none of its test cases run and nothing it was written to verify is verified. Restore the missing module or delete the test. It is excluded from the reachability measured above, because a file that cannot load reaches nothing. — src/parser/test/flow/import_unsupported_phase/contextual_import_equals.js:1
- src/parser/test/flow/import_unsupported_phase/default_binding.js:1 imports './foo', which names no file in this repository — and no rule in its .gitignore chain could cover one, so no build writes it either. The import throws as the runner collects this file, so none of its test cases run and nothing it was written to verify is verified. Restore the missing module or delete the test. It is excluded from the reachability measured above, because a file that cannot load reaches nothing. — src/parser/test/flow/import_unsupported_phase/default_binding.js:1
- src/parser/test/flow/import_unsupported_phase/unknown_phase.js:1 imports './foo', which names no file in this repository — and no rule in its .gitignore chain could cover one, so no build writes it either. The import throws as the runner collects this file, so none of its test cases run and nothing it was written to verify is verified. Restore the missing module or delete the test. It is excluded from the reachability measured above, because a file that cannot load reaches nothing. — src/parser/test/flow/import_unsupported_phase/unknown_phase.js:1
- src/parser/test/flow/ts_syntax/export_type_specifier.js:2 imports './export.js', which names no file in this repository — and no rule in its .gitignore chain could cover one, so no build writes it either. The import throws as the runner collects this file, so none of its test cases run and nothing it was written to verify is verified. Restore the missing module or delete the test. It is excluded from the reachability measured above, because a file that cannot load reaches nothing. — src/parser/test/flow/ts_syntax/export_type_specifier.js:2
- tests/ambient_declarations/use_components.js:5 imports './components.js', which names no file in this repository — and no rule in its .gitignore chain could cover one, so no build writes it either (2 further unresolvable import(s) in the same file). The import throws as the runner collects this file, so none of its test cases run and nothing it was written to verify is verified. Restore the missing module or delete the test. It is excluded from the reachability measured above, because a file that cannot load reaches nothing. — tests/ambient_declarations/use_components.js:5
- tests/ambient_declarations/use_functions_no_semi.js:1 imports './functions_no_semi', which names no file in this repository — and no rule in its .gitignore chain could cover one, so no build writes it either. The import throws as the runner collects this file, so none of its test cases run and nothing it was written to verify is verified. Restore the missing module or delete the test. It is excluded from the reachability measured above, because a file that cannot load reaches nothing. — tests/ambient_declarations/use_functions_no_semi.js:1
- tests/ambient_declarations/use_implicit_functions.js:17 imports './functions', which names no file in this repository — and no rule in its .gitignore chain could cover one, so no build writes it either (1 further unresolvable import(s) in the same file). The import throws as the runner collects this file, so none of its test cases run and nothing it was written to verify is verified. Restore the missing module or delete the test. It is excluded from the reachability measured above, because a file that cannot load reaches nothing. — tests/ambient_declarations/use_implicit_functions.js:17
- tests/ambient_declarations/use_optional_destructuring.js:1 imports './optional_destructuring', which names no file in this repository — and no rule in its .gitignore chain could cover one, so no build writes it either. The import throws as the runner collects this file, so none of its test cases run and nothing it was written to verify is verified. Restore the missing module or delete the test. It is excluded from the reachability measured above, because a file that cannot load reaches nothing. — tests/ambient_declarations/use_optional_destructuring.js:1
- tests/ambient_declarations/use_optional_methods.js:1 imports './optional_methods', which names no file in this repository — and no rule in its .gitignore chain could cover one, so no build writes it either. The import throws as the runner collects this file, so none of its test cases run and nothing it was written to verify is verified. Restore the missing module or delete the test. It is excluded from the reachability measured above, because a file that cannot load reaches nothing. — tests/ambient_declarations/use_optional_methods.js:1
- tests/ambient_declarations/use_variables.js:5 imports './variables.js', which names no file in this repository — and no rule in its .gitignore chain could cover one, so no build writes it either. The import throws as the runner collects this file, so none of its test cases run and nothing it was written to verify is verified. Restore the missing module or delete the test. It is excluded from the reachability measured above, because a file that cannot load reaches nothing. — tests/ambient_declarations/use_variables.js:5
- tests/annotate_exports_import_paths/file.js:4 imports './lib-flow', which names no file in this repository — and no rule in its .gitignore chain could cover one, so no build writes it either. The import throws as the runner collects this file, so none of its test cases run and nothing it was written to verify is verified. Restore the missing module or delete the test. It is excluded from the reachability measured above, because a file that cannot load reaches nothing. — tests/annotate_exports_import_paths/file.js:4
- tests/autocomplete_from_a_to_g/bar.js:3 imports './unknown', which names no file in this repository — and no rule in its .gitignore chain could cover one, so no build writes it either. The import throws as the runner collects this file, so none of its test cases run and nothing it was written to verify is verified. Restore the missing module or delete the test. It is excluded from the reachability measured above, because a file that cannot load reaches nothing. — tests/autocomplete_from_a_to_g/bar.js:3
- tests/cancelable_rechecks/sleep_dependent.js:3 imports './sleep', which names no file in this repository — and no rule in its .gitignore chain could cover one, so no build writes it either. The import throws as the runner collects this file, so none of its test cases run and nothing it was written to verify is verified. Restore the missing module or delete the test. It is excluded from the reachability measured above, because a file that cannot load reaches nothing. — tests/cancelable_rechecks/sleep_dependent.js:3
- tests/config_module_file_exts_precedence/test.js:2 imports './aaa_vs_zzz', which names no file in this repository — and no rule in its .gitignore chain could cover one, so no build writes it either (4 further unresolvable import(s) in the same file). The import throws as the runner collects this file, so none of its test cases run and nothing it was written to verify is verified. Restore the missing module or delete the test. It is excluded from the reachability measured above, because a file that cannot load reaches nothing. — tests/config_module_file_exts_precedence/test.js:2
- tests/config_module_name_rewrite_node/A.js:3 imports './1DoesntExist', which names no file in this repository — and no rule in its .gitignore chain could cover one, so no build writes it either (3 further unresolvable import(s) in the same file). The import throws as the runner collects this file, so none of its test cases run and nothing it was written to verify is verified. Restore the missing module or delete the test. It is excluded from the reachability measured above, because a file that cannot load reaches nothing. — tests/config_module_name_rewrite_node/A.js:3
- tests/config_untyped/test.js:9 imports './untyped/bogus', which names no file in this repository — and no rule in its .gitignore chain could cover one, so no build writes it either. The import throws as the runner collects this file, so none of its test cases run and nothing it was written to verify is verified. Restore the missing module or delete the test. It is excluded from the reachability measured above, because a file that cannot load reaches nothing. — tests/config_untyped/test.js:9
- tests/declaration_files_node/test_relative.js:19 imports './confusing_dir', which names no file in this repository — and no rule in its .gitignore chain could cover one, so no build writes it either (1 further unresolvable import(s) in the same file). The import throws as the runner collects this file, so none of its test cases run and nothing it was written to verify is verified. Restore the missing module or delete the test. It is excluded from the reachability measured above, because a file that cannot load reaches nothing. — tests/declaration_files_node/test_relative.js:19
- tests/declaration_files_parse_error/test.js:3 imports './no_pragma', which names no file in this repository — and no rule in its .gitignore chain could cover one, so no build writes it either (1 further unresolvable import(s) in the same file). The import throws as the runner collects this file, so none of its test cases run and nothing it was written to verify is verified. Restore the missing module or delete the test. It is excluded from the reachability measured above, because a file that cannot load reaches nothing. — tests/declaration_files_parse_error/test.js:3
- tests/dir_coverage/b.js:3 imports './folder/c', which names no file in this repository — and no rule in its .gitignore chain could cover one, so no build writes it either. The import throws as the runner collects this file, so none of its test cases run and nothing it was written to verify is verified. Restore the missing module or delete the test. It is excluded from the reachability measured above, because a file that cannot load reaches nothing. — tests/dir_coverage/b.js:3
- tests/dir_coverage/other_folder/h.js:3 imports '../folder/c', which names no file in this repository — and no rule in its .gitignore chain could cover one, so no build writes it either. The import throws as the runner collects this file, so none of its test cases run and nothing it was written to verify is verified. Restore the missing module or delete the test. It is excluded from the reachability measured above, because a file that cannot load reaches nothing. — tests/dir_coverage/other_folder/h.js:3
- tests/incremental_basic/tmp1/b.js:2 imports './a', which names no file in this repository — and no rule in its .gitignore chain could cover one, so no build writes it either. The import throws as the runner collects this file, so none of its test cases run and nothing it was written to verify is verified. Restore the missing module or delete the test. It is excluded from the reachability measured above, because a file that cannot load reaches nothing. — tests/incremental_basic/tmp1/b.js:2
- tests/incremental_basic/tmp3/b.js:2 imports './a', which names no file in this repository — and no rule in its .gitignore chain could cover one, so no build writes it either. The import throws as the runner collects this file, so none of its test cases run and nothing it was written to verify is verified. Restore the missing module or delete the test. It is excluded from the reachability measured above, because a file that cannot load reaches nothing. — tests/incremental_basic/tmp3/b.js:2
- tests/incremental_cycle/tmp1/B.js:2 imports './A', which names no file in this repository — and no rule in its .gitignore chain could cover one, so no build writes it either. The import throws as the runner collects this file, so none of its test cases run and nothing it was written to verify is verified. Restore the missing module or delete the test. It is excluded from the reachability measured above, because a file that cannot load reaches nothing. — tests/incremental_cycle/tmp1/B.js:2
- tests/incremental_cycle/tmp1/C.js:2 imports './A', which names no file in this repository — and no rule in its .gitignore chain could cover one, so no build writes it either. The import throws as the runner collects this file, so none of its test cases run and nothing it was written to verify is verified. Restore the missing module or delete the test. It is excluded from the reachability measured above, because a file that cannot load reaches nothing. — tests/incremental_cycle/tmp1/C.js:2
- tests/incremental_cycle/tmp2/B.js:2 imports './A', which names no file in this repository — and no rule in its .gitignore chain could cover one, so no build writes it either. The import throws as the runner collects this file, so none of its test cases run and nothing it was written to verify is verified. Restore the missing module or delete the test. It is excluded from the reachability measured above, because a file that cannot load reaches nothing. — tests/incremental_cycle/tmp2/B.js:2
- tests/incremental_cycle/tmp3/B.js:2 imports './A', which names no file in this repository — and no rule in its .gitignore chain could cover one, so no build writes it either. The import throws as the runner collects this file, so none of its test cases run and nothing it was written to verify is verified. Restore the missing module or delete the test. It is excluded from the reachability measured above, because a file that cannot load reaches nothing. — tests/incremental_cycle/tmp3/B.js:2
- tests/json/test.js:6 imports './b', which names no file in this repository — and no rule in its .gitignore chain could cover one, so no build writes it either. The import throws as the runner collects this file, so none of its test cases run and nothing it was written to verify is verified. Restore the missing module or delete the test. It is excluded from the reachability measured above, because a file that cannot load reaches nothing. — tests/json/test.js:6
- tests/multiplatform/android_only_use.android.js:1 imports './android_only', which names no file in this repository — and no rule in its .gitignore chain could cover one, so no build writes it either. The import throws as the runner collects this file, so none of its test cases run and nothing it was written to verify is verified. Restore the missing module or delete the test. It is excluded from the reachability measured above, because a file that cannot load reaches nothing. — tests/multiplatform/android_only_use.android.js:1
- tests/multiplatform/test_interface_import.js:10 imports './allow_no_interface', which names no file in this repository — and no rule in its .gitignore chain could cover one, so no build writes it either. The import throws as the runner collects this file, so none of its test cases run and nothing it was written to verify is verified. Restore the missing module or delete the test. It is excluded from the reachability measured above, because a file that cannot load reaches nothing. — tests/multiplatform/test_interface_import.js:10
- tests/multiplatform_incremental/import_A.js:1 imports './A', which names no file in this repository — and no rule in its .gitignore chain could cover one, so no build writes it either. The import throws as the runner collects this file, so none of its test cases run and nothing it was written to verify is verified. Restore the missing module or delete the test. It is excluded from the reachability measured above, because a file that cannot load reaches nothing. — tests/multiplatform_incremental/import_A.js:1
- tests/multiplatform_incremental/import_B.js:1 imports './B', which names no file in this repository — and no rule in its .gitignore chain could cover one, so no build writes it either. The import throws as the runner collects this file, so none of its test cases run and nothing it was written to verify is verified. Restore the missing module or delete the test. It is excluded from the reachability measured above, because a file that cannot load reaches nothing. — tests/multiplatform_incremental/import_B.js:1
- tests/multiplatform_subtyping/test_subtyping_outside_of_conformance_checks.js:5 imports './classes', which names no file in this repository — and no rule in its .gitignore chain could cover one, so no build writes it either. The import throws as the runner collects this file, so none of its test cases run and nothing it was written to verify is verified. Restore the missing module or delete the test. It is excluded from the reachability measured above, because a file that cannot load reaches nothing. — tests/multiplatform_subtyping/test_subtyping_outside_of_conformance_checks.js:5
- tests/multiplatform_web_and_native/native/use_tests.android.js:1 imports '../xplat/all_platform_forked', which names no file in this repository — and no rule in its .gitignore chain could cover one, so no build writes it either (3 further unresolvable import(s) in the same file). The import throws as the runner collects this file, so none of its test cases run and nothing it was written to verify is verified. Restore the missing module or delete the test. It is excluded from the reachability measured above, because a file that cannot load reaches nothing. — tests/multiplatform_web_and_native/native/use_tests.android.js:1
- tests/multiplatform_web_and_native/native/use_tests.ios.js:1 imports '../xplat/all_platform_forked', which names no file in this repository — and no rule in its .gitignore chain could cover one, so no build writes it either (3 further unresolvable import(s) in the same file). The import throws as the runner collects this file, so none of its test cases run and nothing it was written to verify is verified. Restore the missing module or delete the test. It is excluded from the reachability measured above, because a file that cannot load reaches nothing. — tests/multiplatform_web_and_native/native/use_tests.ios.js:1
- tests/multiplatform_web_and_native/native/use_tests.js:1 imports '../xplat/all_platform_forked', which names no file in this repository — and no rule in its .gitignore chain could cover one, so no build writes it either (3 further unresolvable import(s) in the same file). The import throws as the runner collects this file, so none of its test cases run and nothing it was written to verify is verified. Restore the missing module or delete the test. It is excluded from the reachability measured above, because a file that cannot load reaches nothing. — tests/multiplatform_web_and_native/native/use_tests.js:1
- tests/multiplatform_web_and_native/native/use_tests.native.js:1 imports '../xplat/all_platform_forked', which names no file in this repository — and no rule in its .gitignore chain could cover one, so no build writes it either (3 further unresolvable import(s) in the same file). The import throws as the runner collects this file, so none of its test cases run and nothing it was written to verify is verified. Restore the missing module or delete the test. It is excluded from the reachability measured above, because a file that cannot load reaches nothing. — tests/multiplatform_web_and_native/native/use_tests.native.js:1
What to do
- Add tests that import the unreached modules (directly or through their public entry).
R5 · Dependency Freshness
What to do
- Bump outdated dependencies to current versions to limit upgrade debt.
R6 · Tooling
- This repository declares test tooling, and the ✓ above records that declaration — but packages/flow-api-translator/__tests__/flowDefToTSDef/fixtures/export/module-exports/typeof/import/spec.js and 65 other test file(s) in this workspace cannot be loaded at all: it imports a module that names no file in this repository, so the runner throws while collecting it and none of its cases execute. The wiring is present and the suite it points at does not run as written, which is why the tooling tick must not be read as a statement that the tests pass. Fix the unloadable file(s) — each one is reported with its failing import under Test Coverage — then the declared script exercises what it claims to. — packages/flow-api-translator/__tests__/flowDefToTSDef/fixtures/export/module-exports/typeof/import/spec.js:11
R7 · Dead Code
- 515 file(s) (~14407 LoC) were excluded from dead-code analysis — declare main/module/exports or a conventional entry (src/index.*, an index.html script) so reachability can see this package. — evals
- 1 file(s) (~1 LoC) were excluded from dead-code analysis — declare main/module/exports or a conventional entry (src/index.*, an index.html script) so reachability can see this package. — tests/declaration_files_haste/external/_d3
- 1 file(s) (~17 LoC) were excluded from dead-code analysis. This package DOES declare main/module/exports — but every declared target is missing from the scanned tree, which is what a build-output entry (dist/, lib/, out/) looks like before the package is built. Point a declared target at the source entry, or build the package before scanning, so reachability can follow it. — tests/json
- Unreachable from the 1077 application, 174 tooling and 8536 test entry point(s) detected in this repo. Gate removals on `yarn run build` — an undetected custom entry would make these reachable.
- no import path from any entry point (1077 application, 174 tooling, 8536 test roots considered), and no other file in the scanned tree imports it — nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make (×36) — newtests/lsp/completion/test.js, packages/flow-dev-tools/flow-typed/node.js, newtests/lsp/documentSymbol/test.js, …
What to do
- Delete the dead files and unused exports — every line is maintenance cost and rebuild-estimate inflation with zero runtime value.
R8 · Dependency Hygiene
- Imported but not declared in any reachable package.json — installs work only by hoisting accident. — REDACTED:16
- Declared in packages/flow-dev-tools/package.json but never imported anywhere in that package or its workspace members — no static import reaches it. Usually that is dead weight and attack surface, but two shapes are indistinguishable from source and are NOT dead: an optional or native peer that another dependency loads dynamically at runtime, and a package a build, docs or test step installs and invokes separately. Confirm which of the three this is before removing it.
- Declared in packages/flow-for-vscode/package.json but never imported anywhere in that package or its workspace members — no static import reaches it. Usually that is dead weight and attack surface, but two shapes are indistinguishable from source and are NOT dead: an optional or native peer that another dependency loads dynamically at runtime, and a package a build, docs or test step installs and invokes separately. Confirm which of the three this is before removing it. (×2)
- Only test files import it (first: packages/flow-eslint/__tests__/eslint-scope/get-declared-variables-test.js:39) — move it to devDependencies. — packages/flow-eslint/package.json:26
What to do
- Remove unused dependencies, declare unlisted imports explicitly, and demote type-/test-only packages to devDependencies.
R9 · Circular Imports
- packages/flow-dev-tools/src/command/allCommands.js → packages/flow-dev-tools/src/help/helpCommand.js → packages/flow-dev-tools/src/command/allCommands.js — packages/flow-dev-tools/src/command/allCommands.js:13
- packages/flow-remove-types/loader.mjs → REDACTED → packages/flow-remove-types/loader.mjs — packages/flow-remove-types/loader.mjs:6
What to do
- Break each cycle by extracting the shared piece into a module both sides can import.
S1 · Web-Security Posture
- MD5/SHA1 is computed here, and both are collision-broken. If this digest protects anything — a signature, an integrity or tamper check, a credential, or any value an attacker can influence — that is a real weakness: use SHA-256+ (`sha2::Sha256::digest(…)`) for content integrity, or a KDF (bcrypt/Argon2/scrypt) for password storage. If it only derives a non-security identifier (a cache key, an avatar URL, an ETag), collision resistance carries no security consequence here; make that intent explicit instead — a non-cryptographic hash such as xxhash or murmurhash says it in code — since the algorithm alone cannot distinguish the two uses. Where a protocol this code does not own fixes the digest (a k-anonymity range query, a legacy signature format), the protocol decides; say so beside the call. (×4) — rust_port/crates/flow_common_socket/src/socket.rs:136, rust_port/crates/flow_common_socket/src/socket.rs:232, rust_port/crates/flow_server_files/src/server_files_js.rs:43, …
What to do
- Review each MD5/SHA1 use by what it protects: replace it with SHA-256+ (or a KDF for passwords) where the digest is security-relevant, and switch it to a non-cryptographic hash (xxhash, murmurhash) where it only derives an identifier such as a cache key. This repository constructs a collision-broken hash (MD5/SHA1) at 4 sites, not one: `rust_port/crates/flow_common_socket/src/socket.rs:136` (`Md5::digest`), `rust_port/crates/flow_common_socket/src/socket.rs:232` (`Md5::digest`), `rust_port/crates/flow_server_files/src/server_files_js.rs:43` (`Md5::digest`), `rust_port/crates/flow_server_files/src/server_files_js.rs:52` (`Md5::digest`). Each is a separate decision — fixing only the line this row cites leaves the others in place.
X1 · Async correctness
- `forEach` ignores what its callback returns, so the Promise each `async` call returns is dropped: nothing can await it, the code after this loop runs before any of the awaited work has finished (a function that `await`s around this loop still returns early), and a rejection is never handled — in Node.js an unhandled rejection terminates the process by default, and in a browser it is lost. Iterate with `for (const item of items) { await … }` when the work must run in order, or `await Promise.all(items.map(async (item) => { … }))` when it may run concurrently, so the enclosing function finishes only when the work does and its failures reach the caller. Where firing and forgetting is genuinely intended, make the callback's whole body a `try { … } catch (e) { … }` that handles the failure, so it cannot escape. — packages/flow-for-vscode/src/index.ts:106
What to do
- `async` callback passed to `forEach`
X12 · Unreachable branch
X13 · Undrained process stream
X14 · Bypassable address classification
X15 · Unvalidated length from an untrusted reader
- `len` is read from the bytes being parsed at line 1630 (`u32::from_be_bytes`), then used to size a `vec![…; n]` at line 1631 — and nowhere in its scope is `len` compared to anything, clamped, or bounded against the input that remains. Whoever wrote those bytes therefore chooses the allocation directly: it reserves the whole length before a single byte of the payload is known to exist, so a 32-bit length asks for up to 4 GiB, and an allocation the allocator refuses aborts the process with `memory allocation of … bytes failed` — an abort, not a panic, so no `catch_unwind` intercepts it and the whole process dies; a 64-bit length past `isize::MAX` panics with `capacity overflow` instead, out of a parser whose failure path was written for malformed input, not for hostile input. Bound `len` against the bytes actually remaining and a maximum the format allows before allocating. — rust_port/crates/flow_server_env/src/server_socket_rpc.rs:1631
- `len` is read from the bytes being parsed at line 131 (`u32::from_be_bytes`), then used to size a `vec![…; n]` at line 132 — and nowhere in its scope is `len` compared to anything, clamped, or bounded against the input that remains. Whoever wrote those bytes therefore chooses the allocation directly: it reserves the whole length before a single byte of the payload is known to exist, so a 32-bit length asks for up to 4 GiB, and an allocation the allocator refuses aborts the process with `memory allocation of … bytes failed` — an abort, not a panic, so no `catch_unwind` intercepts it and the whole process dies; a 64-bit length past `isize::MAX` panics with `capacity overflow` instead, out of a parser whose failure path was written for malformed input, not for hostile input. Bound `len` against the bytes actually remaining and a maximum the format allows before allocating. — rust_port/crates/flow_monitor_rpc/src/monitor_rpc.rs:132
What to do
- Each finding names the read that takes the length from the input and the site that spends it, and states that the value is never compared in between. Confirm from the two, then bound the length against the remaining stream before using it.
X16 · Unfloored truncation loop
X17 · Uncapped recursion over a caller-supplied document
X18 · Disposal-pattern correctness
X19 · Unrestored process-global state
X21 · Side-effecting pattern guard
X22 · Contradicted release guard
X23 · Unguarded diagnostic materialisation
X24 · Document value interpolated into markup unescaped
- `ReactDOM$UserVisibleString` is text this program did not author, and it is written into the text of an element through `dangerouslySetInnerHTML` with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework's escaping output, or sanitise it if it must stay markup. — evals/flow-typed/environment/jsx.js:865
What to do
- Each finding names the expression, the attribute it lands in and the line. Confirm the value's origin from the read this analyzer traced, then escape it at the sink or validate it against the shape the attribute accepts before interpolating.
X25 · Inert configuration knob
X26 · Unsynchronised callback handoff
X27 · Collection changed while being enumerated
X28 · Index access outside its own emptiness guard
X29 · Per-element action decided by a fixed element
X3 · Exception handling
- `catch` takes every exception and records none of it — the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter. — scripts/add-specific-error-code.js:74
- An empty catch block silently discards the error — failures vanish with no log and no rethrow. Log it, handle it, or don't catch it. (×3) — packages/flow-upgrade/src/runCodemods.js:36, packages/flow-for-vscode/src/FlowLanguageClient/FlowLanguageClient.ts:141, evals/run_swebench.py:433
What to do
- Swallowed exception (caught, then discarded)
X30 · Support guard that admits what it rejects
X4 · Structured logging
- `info!` at line 130 is handed a format string with `{…}` values in it, so tracing records one finished `message` field — the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Record the values as fields beside a constant message instead: `info!(order_id = %order_id, status = ?status, "order status updated")` (`%` records a value by its `Display`, `?` by its `Debug`, a bare name as itself), which a JSON subscriber, OpenTelemetry or a log store keeps as queryable keys. An error goes in as a field too: `error = %err`. — rust_port/crates/flow_utils_concurrency/src/thread_pool.rs:130
- `debug!` at line 158 is handed a format string with `{…}` values in it, so tracing records one finished `message` field — the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Record the values as fields beside a constant message instead: `debug!(order_id = %order_id, status = ?status, "order status updated")` (`%` records a value by its `Display`, `?` by its `Debug`, a bare name as itself), which a JSON subscriber, OpenTelemetry or a log store keeps as queryable keys. An error goes in as a field too: `error = %err`. — rust_port/crates/flow_utils_concurrency/src/thread_pool.rs:158
- `warn!` at line 143 is handed a format string with `{…}` values in it, so tracing records one finished `message` field — the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Record the values as fields beside a constant message instead: `warn!(order_id = %order_id, status = ?status, "order status updated")` (`%` records a value by its `Display`, `?` by its `Debug`, a bare name as itself), which a JSON subscriber, OpenTelemetry or a log store keeps as queryable keys. An error goes in as a field too: `error = %err`. — rust_port/crates/flow_dfind/src/lib.rs:143
- `warn!` at line 187 is handed a format string with `{…}` values in it, so tracing records one finished `message` field — the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Record the values as fields beside a constant message instead: `warn!(order_id = %order_id, status = ?status, "order status updated")` (`%` records a value by its `Display`, `?` by its `Debug`, a bare name as itself), which a JSON subscriber, OpenTelemetry or a log store keeps as queryable keys. An error goes in as a field too: `error = %err`. — rust_port/crates/flow_dfind/src/lib.rs:187
- `warn!` at line 282 is handed a format string with `{…}` values in it, so tracing records one finished `message` field — the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Record the values as fields beside a constant message instead: `warn!(order_id = %order_id, status = ?status, "order status updated")` (`%` records a value by its `Display`, `?` by its `Debug`, a bare name as itself), which a JSON subscriber, OpenTelemetry or a log store keeps as queryable keys. An error goes in as a field too: `error = %err`. — rust_port/crates/flow_daemon/src/daemon.rs:282
- `warn!` at line 441 is handed a format string with `{…}` values in it, so tracing records one finished `message` field — the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Record the values as fields beside a constant message instead: `warn!(order_id = %order_id, status = ?status, "order status updated")` (`%` records a value by its `Display`, `?` by its `Debug`, a bare name as itself), which a JSON subscriber, OpenTelemetry or a log store keeps as queryable keys. An error goes in as a field too: `error = %err`. — rust_port/crates/flow_daemon/src/daemon.rs:441
- `warn!` at line 449 is handed a format string with `{…}` values in it, so tracing records one finished `message` field — the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Record the values as fields beside a constant message instead: `warn!(order_id = %order_id, status = ?status, "order status updated")` (`%` records a value by its `Display`, `?` by its `Debug`, a bare name as itself), which a JSON subscriber, OpenTelemetry or a log store keeps as queryable keys. An error goes in as a field too: `error = %err`. — rust_port/crates/flow_daemon/src/daemon.rs:449
- `debug!` at line 577 is handed a format string with `{…}` values in it, so tracing records one finished `message` field — the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Record the values as fields beside a constant message instead: `debug!(order_id = %order_id, status = ?status, "order status updated")` (`%` records a value by its `Display`, `?` by its `Debug`, a bare name as itself), which a JSON subscriber, OpenTelemetry or a log store keeps as queryable keys. An error goes in as a field too: `error = %err`. — rust_port/crates/flow_daemon/src/daemon.rs:577
- `debug!` at line 580 is handed a format string with `{…}` values in it, so tracing records one finished `message` field — the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Record the values as fields beside a constant message instead: `debug!(order_id = %order_id, status = ?status, "order status updated")` (`%` records a value by its `Display`, `?` by its `Debug`, a bare name as itself), which a JSON subscriber, OpenTelemetry or a log store keeps as queryable keys. An error goes in as a field too: `error = %err`. — rust_port/crates/flow_daemon/src/daemon.rs:580
- `info!` at line 95 is handed a format string with `{…}` values in it, so tracing records one finished `message` field — the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Record the values as fields beside a constant message instead: `info!(order_id = %order_id, status = ?status, "order status updated")` (`%` records a value by its `Display`, `?` by its `Debug`, a bare name as itself), which a JSON subscriber, OpenTelemetry or a log store keeps as queryable keys. An error goes in as a field too: `error = %err`. — rust_port/crates/flow_codemods/src/utils/codemod_runner.rs:95
What to do
- Interpolated log message defeats structured logging
X5 · Nullable reference types
- ~1.3 `!` null assertions per 1k TypeScript source lines — 7 assertion(s) across the 5468 source line(s) of the 86 TypeScript file(s) read, which is the only code the operator asserts anything in (a `!` in a `.js` file is not this operator and was not counted, and one in a file whose null checking is off silences nothing). Densest: packages/flow-for-vscode/src/handlers.ts (7). Each one tells the compiler to trust the author about null, suppressing the very diagnostic `strictNullChecks` exists to produce.
What to do
- The findings name the configuration each number was taken from and, for the assertions, the files that hold them. Turn null checking on where it is off — `"strict": true` in the base tsconfig that the others extend switches `strictNullChecks` on with the rest of the family — and then resolve the assertions rather than adding to them. A `!` on a value the checker could show to be null is a promise the author cannot check from where they are standing, and each one is a `TypeError: Cannot read properties of null` waiting for the path that makes it true; where the value genuinely cannot be null, say something the checker can see instead (narrow it with a test, make the property required, drop the `?`).
Reference — by lens
| Lens | Score | Rating | Impact |
|---|---|---|---|
| Code Health | 39% | Weak — gated by R1, R7, X4 | Capped at Fair by a Critical contributor — resolve it before relying on this lens. |
| Architecture | 90% | Strong | Solid. |
| Maturity | 62% | Adequate | Acceptable, with room to improve. |
| Readiness | 38% | Weak — gated by D13, R4, P3 | Capped at Fair by a Critical contributor — resolve it before relying on this lens. |
| Security | 58% | Adequate — gated by D29, D30, D36 | Capped at Fair by a Critical contributor — resolve it before relying on this lens. |
| Performance | 100% | Exemplary | Strongest area. |
Unscored — 1 check(s) recorded observations but carry no score
- X10 Duplicated predicate — 15 observation(s) recorded · Advisory — this card reports evidence and never carries a score.
Not evidenced — 1 control(s) we could not find positive evidence for
- P5 DR & Backup — not evidenced — repo shows no backup/RTO/RPO controls; absence of evidence is not evidence of a working control
Not included — 60 check(s) not relevant to this codebase
- AC1 Text alternatives — No web markup found — accessibility is not applicable to this repository.
- AC2 Forms & labels — No web markup found — accessibility is not applicable to this repository.
- AC3 Page structure — No web markup found — accessibility is not applicable to this repository.
- AC4 Keyboard semantics — No web markup found — accessibility is not applicable to this repository.
- AC5 ARIA correctness — No web markup found — accessibility is not applicable to this repository.
- AC6 Visual & motion safety — No web markup found — accessibility is not applicable to this repository.
- AC7 A11y enforcement — No web markup found — accessibility is not applicable to this repository.
- AX1 Captive dependencies — Not applicable: this repository's JavaScript imports no dependency-injection container and defines no container of its own — nothing that both registers and resolves bindings, and nothing that names two lifetimes — so nothing holds one lifetime's instance while handing out another's; this repository's Python imports no dependency-injection container and defines no container of its own — nothing that both registers and resolves bindings, and nothing that names two lifetimes — so nothing holds one lifetime's instance while handing out another's; Rust with no dependency-injection crate has no container to hand one lifetime's instance to another — every value is owned by the code that builds it, and the borrow checker rejects a longer-lived value keeping a borrow of a shorter-lived one; this repository's TypeScript imports no dependency-injection container and defines no container of its own — nothing that both registers and resolves bindings, and nothing that names two lifetimes — so nothing holds one lifetime's instance while handing out another's.
- AX2 Stateful singletons — No container singleton was found, so there is no shared instance for concurrent requests to race on. No function in this Python code is served by a threaded web framework (a Flask, Bottle or FastAPI route, a Django or Pyramid view), so no module is shared between request threads. TypeScript/JavaScript runs each process's requests on one event loop, so no two requests write a shared object at the same instant (interleaving across an await is a different defect).
- AX5 Architecture & structure — not assessed — architecture style/structure is computed from a project graph (projects, types, module namespaces) that was not loaded for this repository, because the repository is written in a language this check does not yet model, or because its projects failed to load. This is a gap in the analyzer, not a finding about this repository
- AX7 Slice cohesion — not applicable — not a vertical-slice architecture
- AX9 CQS / query purity — no CQRS query handlers detected — query purity is not applicable to this codebase
- AXB2 Runtime readiness — Advisory — this card reports evidence and never carries a score, so there is nothing missing here.
- AXR1 Runtime accessibility — the dev server did not expose a crawlable HTTP endpoint in time — no runtime evidence This is a statement about this run, not a statement about your application: nothing here says the surface is inaccessible, only that it was never rendered.
- C1 Data Protection — No personal data detected in a persisted data model — no PII-named field (email, first_name, date_of_birth, phone, …) or stored credential in a Diesel schema, a SeaORM entity, a Diesel or sqlx row struct, or a SQL CREATE TABLE or ALTER TABLE — and no database or data-store crate (sqlx, Diesel, SeaORM, rusqlite, tokio-postgres, MongoDB, …) in the source either, so this repository keeps no data at rest for these controls to protect.
- C2 Access Controls — No access-control surface detected in the analyzed source — this repository starts no server another machine can reach (no actix-web HttpServer, axum::serve, Rocket launch, warp::serve, poem or salvo Server, tonic Server::builder, hyper or tiny_http server outside examples and tests, none bound beyond loopback). Access control is therefore N/A here — a crate is authorized by the application that serves it, not by itself. If this codebase grows request handlers, the dimension reactivates and a default-deny posture is expected then.
- C3 Audit Trail — No personal data detected in a persisted data model — no PII-named field (email, first_name, date_of_birth, phone, …) or stored credential in a Diesel schema, a SeaORM entity, a Diesel or sqlx row struct, or a SQL CREATE TABLE or ALTER TABLE — and no database or data-store crate (sqlx, Diesel, SeaORM, rusqlite, tokio-postgres, MongoDB, …) in the source either, so this repository keeps no sensitive data whose changes an audit trail would record. If it does (through a store configured outside this repository, for instance), the trail belongs to wherever that data is stored.
- C4 Data Retention — No personal data detected in a persisted data model — no PII-named field (email, first_name, date_of_birth, phone, …) or stored credential in a Diesel schema, a SeaORM entity, a Diesel or sqlx row struct, or a SQL CREATE TABLE or ALTER TABLE — and no database or data-store crate (sqlx, Diesel, SeaORM, rusqlite, tokio-postgres, MongoDB, …) in the source either, so this repository keeps no personal data whose lifetime a retention limit would bound.
- C5 Data-Subject Rights — No personal data detected in a persisted data model — no PII-named field (email, first_name, date_of_birth, phone, …) or stored credential in a Diesel schema, a SeaORM entity, a Diesel or sqlx row struct, or a SQL CREATE TABLE or ALTER TABLE — and no database or data-store crate (sqlx, Diesel, SeaORM, rusqlite, tokio-postgres, MongoDB, …) in the source either, so this repository keeps no personal data for a data subject to erase, export or consent over.
- D1 Cyclomatic Complexity — cyclomatic complexity not measured — .rs exposed no member bodies
- D11 Test Reliability — Test reliability not scored — polyglot repository, one half's runner produced no measurement
- D15 Churn × Complexity Hotspots — complexity unreadable for .rs — churn × complexity hotspots could not be measured
- D18 Solution Shape — D18 scores the shape of a .NET solution; this repository has no .NET solution or project files, so the dimension does not apply.
- D2 Cognitive Complexity — cognitive complexity not measured — .rs exposed no member bodies
- D21 Naming Consistency — Naming consistency is measured on C# only; JavaScript, Python, TypeScript not measured.
- D22 Internal API Consistency — API consistency is measured on C# only; the exposed JavaScript surface was not measured.
- D24 Comment Value — D24 reads C# and Visual Basic comments only — this repository's production source is .py, .rs, .ts, which was left unread. Not scored: this is a gap in the analyzer, not a verdict about this repository.
- D25 ADR Conformance — no ADRs to check
- D26 Project Cohesion — D26 measured no build unit over this repository's .rs source. Not scored: this is a gap in the analyzer, not a verdict about this repository.
- D27 Navigability — D27 reads resolved call sites in the languages it reads only — this repository's production source is .py, .rs, which was left unread. Not scored: this is a gap in the analyzer, not a verdict about this repository.
- D3 God Classes — Most of this repository's production source (.rs) was not read by god-class detection, so type and module size was not assessed for the languages that are the product — whatever else this pass did read is not this repository's type and module size. Not scored — this is a gap in the analyzer, not a verdict about this repository.
- D31 IaC & Container Security — No Infrastructure-as-Code or container manifests found (Dockerfile, Docker Compose, Terraform, Kubernetes/Helm, CloudFormation, ARM, Bicep, Ansible); nothing to scan.
- D32 Data Compliance (PII/GDPR) — 261 file(s) were not parsed by semgrep — the PII/GDPR ruleset never ran over them
- D37 Vulnerability-disclosure Policy — No vulnerability-disclosure policy file found (SECURITY.md/.markdown/.rst/.txt at root or under .github/.forgejo/.gitea/docs, .well-known/security.txt). A coordinated-disclosure policy may live off-repo, so this is not evidenced rather than failed.
- D39 IL Efficiency — D39 measures the IL emitted by a .NET build; this repository has no .NET solution or project files, so the dimension does not apply.
- D40 Network Egress Confinement — No Kubernetes/orchestration workloads found in the repository manifests; network egress policy is a cluster-native control that may live at the platform/firewall layer, so there is nothing to assess here.
- D41 Kernel & Syscall Confinement — No Kubernetes/orchestration workloads found in the repository manifests; seccomp/AppArmor/SELinux confinement is a workload-level control, so there is nothing to assess here.
- D42 Runtime Threat Enforcement — No Kubernetes/orchestration workloads found in the repository manifests; runtime threat-detection and admission-control policy are cluster-level controls, so there is nothing to assess here.
- D5 Coupling — D5 reads a .NET project-reference graph only — this repository's production source is .rs, which was left unread. Not scored: this is a gap in the analyzer, not a verdict about this repository.
- D7 Architectural Integrity — no checkable ADRs, and no project-reference graph for the cycle pass to read — so this dimension makes no claim about dependency cycles in either direction (where this repository's language has an import-cycle lens, cycles are reported there). Architectural integrity not assessed
- D8 Code Coverage — Coverage not measured — polyglot repository, one half has no runner
- DM1 Domain Modelling — not scored — this repository shows none of the 3 signals this lens looks for
- ED1 Event-Driven — not scored — this repository shows none of the 3 signals this lens looks for
- ED5 Idempotency — no mutating command handlers or message consumers detected — idempotency check not applicable
- ES1 Event Sourcing — not scored — this repository shows none of the 3 signals this lens looks for
- GD1 Unfinished & placeholder code — no source files were read — this check reads C#, F#, JavaScript/TypeScript, Dart, Ruby and Scala, and none was read for this repository's product. That is a limit of the analyzer, not a finding about your code.
- IC1 Incompleteness & stubs — not analysed — these correctness checks read a source model that was not loaded for this repository, because the repository is written in a language this check does not yet model, or because its projects failed to load. This is a gap in the analyzer, not a finding about this repository
- P12 CI test-gate honesty — Reported, not scored — and nothing was matched here. The coverage check applies to any stack, and the automatic-re-run check to any GitHub-Actions workflow, but the checks for excluded tests, skipped tests and sleep-based synchronisation currently recognise only some ecosystems' test-runner idioms, so on a repository built with another stack the zeros below mean 'not checked', not 'clean'.
- P7 Outbound HTTP resilience — not applicable — no HTTP server, API framework or worker entry point was found in the JavaScript/TypeScript, Python, Rust source, so there is no service whose uptime a failing dependency could take down
- P8 Schema migrations — no ORM, schema-migration tool or schema auto-create was found in this repository's dependency manifests or source, so there is no database schema for this check to judge
- P9 Domain vs controller coverage — coverage data present for 36 file(s), but no domain-layer files were identified: no covered file's path contains any of the markers this check keys on (/domain/, /aggregates/, /valueobjects/, /domainmodel/, .domain/, /entities/), which are matched case-insensitively anywhere in the path. With no domain partition there is nothing to compare the web/controller layer against — if this repository keeps its business rules under a folder named none of those, that naming is what the check cannot see, not the domain logic.
- PF1 Benchmark discipline — Not applicable: no benchmark suite was found. This check searched for `#[bench]`, criterion's `bench_function`/`bench_with_input`, `#[divan::bench]` or `#[library_benchmark]` in any `.rs` file, or criterion, divan, iai or a `[[bench]]` target in a Cargo.toml, and for a `*benchmark*` script that this repository's CI runs. Benchmarks are credited as a bonus, so their absence is neither scored nor deducted.
- PF2 Allocation hygiene — Not applicable: Rust spells out every heap allocation and makes borrowed slices (&[T], &str) its ordinary parameter types, so the allocation-aware style this card rewards elsewhere is the language's baseline rather than a rung to climb. TypeScript/JavaScript runs on a garbage-collected runtime that gives a program no allocation-control idiom to choose on a hot path — no pools, stack allocation or value types — so allocation awareness is not something this code can be rated on.
- SC1 Supply-chain hygiene — Advisory — this card reports evidence and never carries a score, so there is nothing missing here.
- X2 Cancellation propagation — no C# was loaded; this repository's Python and Rust were read, and no request in it can be cancelled by a caller — a Python request takes no token: asyncio cancels the task and trio or anyio the scope that made it, from outside the call, and requests, httpx, aiohttp and gRPC take a timeout, not a cancellation; a Rust request takes no token: a future is cancelled by dropping it, from outside the call (select!, a timeout, an aborted task), and reqwest, hyper and tonic take none
- X20 Mistyped argument guard — This check asks whether an argument guard reports an EMPTY value as a NULL one, which needs a language that throws a null-specific argument exception — .NET's ArgumentNullException, the JVM's NullPointerException, Dart's ArgumentError.notNull. This repository contains none of those languages: the ones it is written in have a single exception for a bad argument, so there is no pair of exceptions to confuse and nothing here for it to assess. Not a gap in the analyzer and not a finding about your code.
- X32 Type resolved by simple name across every loaded assembly — This check is about how a .NET program searches the assemblies loaded into its process for a type, and this repository contains no .NET source, so there is nothing here for it to assess. Not a gap in the analyzer and not a finding about your code.
- X6 Hand-rolled structured-format parsing — Advisory — this card reports evidence and never carries a score, so there is nothing missing here.
- X7 Silent fallback defaults — Advisory — this card reports evidence and never carries a score, so there is nothing missing here.
- X9 Subsumed condition operand — Advisory — this card reports evidence and never carries a score, so there is nothing missing here.
Appendix A — Findings (grouped)
Critical — 119 finding(s)
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- Import cycle (2 files) packages/flow-dev-tools/src/command/allCommands.js:13
- Import cycle (2 files) packages/flow-remove-types/loader.mjs:6
- REDACTED
- REDACTED
- Unlisted import 'source-map' REDACTED:16
Serious — 483 finding(s)
- TodoComment rust_port/crates/flow_typing_utils/src/annotation_inference.rs:132
- TodoComment rust_port/crates/flow_typing_type/src/type_.rs:11533
- TodoComment rust_port/crates/flow_typing_utils/src/annotation_inference.rs:3872
- TodoComment rust_port/crates/flow_typing_utils/src/check_polarity.rs:85
- TodoComment rust_port/crates/flow_typing_utils/src/check_polarity.rs:338
- TodoComment rust_port/crates/flow_typing_statement/src/statement.rs:14972
- TodoComment rust_port/crates/flow_lsp_server/src/document_symbol_provider.rs:640
- TodoComment rust_port/crates/flow_imports_exports/src/exports.rs:393
- TodoComment rust_port/crates/flow_env_builder_resolver/src/name_def_ordering.rs:3972
- TodoComment rust_port/crates/flow_typing_utils/src/convert_types.rs:1321
- TodoComment rust_port/crates/flow_typing_utils/src/exhaustive.rs:1289
- TodoComment rust_port/crates/flow_typing_utils/src/members.rs:105
- TodoComment rust_port/crates/flow_typing_utils/src/members.rs:135
- TodoComment rust_port/crates/flow_typing_utils/src/members.rs:145
- TodoComment rust_port/crates/flow_typing_utils/src/members.rs:531
- TodoComment rust_port/crates/flow_typing_utils/src/members.rs:590
- TodoComment rust_port/crates/flow_typing_utils/src/members.rs:909
- TodoComment rust_port/crates/flow_typing_utils/src/members.rs:1027
- TodoComment rust_port/crates/flow_typing_utils/src/members.rs:1037
- TodoComment rust_port/crates/flow_typing_flow_common/src/flow_js_utils.rs:6154
- TodoComment rust_port/crates/flow_typing_utils/src/predicate_kit.rs:1087
- TodoComment rust_port/crates/flow_typing_utils/src/predicate_kit.rs:1965
- TodoComment rust_port/crates/flow_typing_utils/src/predicate_kit.rs:2651
- TodoComment rust_port/crates/flow_typing_utils/src/type_sig_merge.rs:478
- TodoComment rust_port/crates/flow_typing_utils/src/type_sig_merge.rs:484
- This test file cannot be loaded packages/flow-api-translator/__tests__/flowDefToTSDef/fixtures/export/module-exports/typeof/import/spec.js:11
- This test file cannot be loaded packages/flow-remove-types/test/test-node-module.js:4
- This test file cannot be loaded src/parser/test/flow/import_unsupported_phase/contextual_default_and_named.js:1
- This test file cannot be loaded src/parser/test/flow/import_unsupported_phase/contextual_default_binding.js:1
- This test file cannot be loaded src/parser/test/flow/import_unsupported_phase/contextual_import_equals.js:1
- This test file cannot be loaded src/parser/test/flow/import_unsupported_phase/default_binding.js:1
- This test file cannot be loaded src/parser/test/flow/import_unsupported_phase/unknown_phase.js:1
- This test file cannot be loaded src/parser/test/flow/ts_syntax/export_type_specifier.js:2
- This test file cannot be loaded tests/ambient_declarations/use_components.js:5
- This test file cannot be loaded tests/ambient_declarations/use_functions_no_semi.js:1
- This test file cannot be loaded tests/ambient_declarations/use_implicit_functions.js:17
- This test file cannot be loaded tests/ambient_declarations/use_optional_destructuring.js:1
- This test file cannot be loaded tests/ambient_declarations/use_optional_methods.js:1
- This test file cannot be loaded tests/ambient_declarations/use_variables.js:5
- This test file cannot be loaded tests/annotate_exports_import_paths/file.js:4
- This test file cannot be loaded tests/autocomplete_from_a_to_g/bar.js:3
- This test file cannot be loaded tests/cancelable_rechecks/sleep_dependent.js:3
- This test file cannot be loaded tests/config_module_file_exts_precedence/test.js:2
- This test file cannot be loaded tests/config_module_name_rewrite_node/A.js:3
- This test file cannot be loaded tests/config_untyped/test.js:9
- This test file cannot be loaded tests/declaration_files_node/test_relative.js:19
- This test file cannot be loaded tests/declaration_files_parse_error/test.js:3
- This test file cannot be loaded tests/dir_coverage/b.js:3
- This test file cannot be loaded tests/dir_coverage/other_folder/h.js:3
- This test file cannot be loaded tests/incremental_basic/tmp1/b.js:2
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- Boundary violation [package:test-suite-dependency] packages/flow-dev-tools/src/command/allCommands.js:14
- Boundary violation [package:test-suite-dependency] packages/flow-dev-tools/src/command/allCommands.js:17
- Boundary violation [package:test-suite-dependency] packages/flow-dev-tools/src/record/recordRunner.js:16
- Boundary violation [package:test-suite-dependency] packages/flow-dev-tools/src/record/recordRunner.js:17
- Boundary violation [package:test-suite-dependency] packages/flow-dev-tools/src/record/recordRunner.js:19
- Boundary violation [package:test-suite-dependency] packages/flow-dev-tools/src/record/recordRunner.js:20
- Boundary violation [package:third-party-deep-import] packages/flow-for-vscode/src/FlowLanguageClient/FlowLanguageClient.ts:26
- Boundary violation [package:third-party-deep-import] packages/flow-for-vscode/src/utils/LanguageClient/TypeCoverageFeature/TypeCoverageFeature.ts:11
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- Cross-context type T (newtests → flow-dev-tools) packages/flow-dev-tools/flow-typed/node.js:3243
- Cross-context type T (newtests → flow-dev-tools) packages/flow-dev-tools/flow-typed/node.js:3250
- Cross-context type T (newtests → flow-dev-tools) packages/flow-dev-tools/flow-typed/node.js:3340
- Cross-context type T (newtests → flow-dev-tools) packages/flow-dev-tools/flow-typed/node.js:3344
- Change coupling: lib.rs ↔ any_helpers.rs rust_port/crates/flow_typing_debug/src/lib.rs:1
- Change coupling: any_helpers.rs ↔ implicit_instantiation.rs rust_port/crates/flow_typing_flow_js/src/flow_js/any_helpers.rs:1
- Change coupling: flow_js.js ↔ flow-services.js website/libs/flow_js.js:1
- Change coupling: ty_printer.rs ↔ query_types.rs rust_port/crates/flow_common_ty/src/ty_printer.rs:1
- Weak hash algorithm rust_port/crates/flow_common_socket/src/socket.rs:136
- Weak hash algorithm rust_port/crates/flow_common_socket/src/socket.rs:232
- Weak hash algorithm rust_port/crates/flow_server_files/src/server_files_js.rs:43
- Weak hash algorithm rust_port/crates/flow_server_files/src/server_files_js.rs:52
- No assertions: (unnamed test) tests/closure/callback_writes.js:4
- No assertions: first tests/closure/callback_writes.js:9
- No assertions: second tests/closure/callback_writes.js:17
- REDACTED
- REDACTED
- REDACTED
- Duplicated block (27 lines × 2 locations) evals/evals/01_error_fixing/error_020_ts_access_modifiers/ideal/main.js:12
- Duplicated block (27 lines × 2 locations) evals/evals/04_ts_to_flow/empty_bottom_type_exhaustiveness/ideal/main.js:13
- Duplicated block (27 lines × 2 locations) evals/evals/04_ts_to_flow/utility_type_mappings_comprehensive/ideal/main.js:22
- Swallowed exception (empty catch) packages/flow-upgrade/src/runCodemods.js:36
- Swallowed exception (empty catch) packages/flow-for-vscode/src/FlowLanguageClient/FlowLanguageClient.ts:141
- Swallowed exception (empty catch) evals/run_swebench.py:433
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- Change-coupling hub: default_resolve.rs → lib.rs, any_helpers.rs, type_util.rs rust_port/crates/flow_typing_flow_js/src/default_resolve.rs
- Change-coupling hub: misc.js → flowlib_contents.rs, tslib_contents.rs, flow-loader.js lib/misc.js
- Duplicated block (42 lines × 2 locations) evals/evals/01_error_fixing/error_022_implements_object_type/ideal/main.js:16
- Duplicated block (42 lines × 2 locations) evals/evals/04_ts_to_flow/unknown_top_type_narrowing/ideal/main.js:10
- Duplicated block (35 lines × 2 locations) evals/evals/01_error_fixing/error_019_class_nominal_typing/ideal/main.js:14
- Duplicated block (35 lines × 2 locations) packages/flow-typed/jest.js:669
- Duplicated block with local edits (32 matched lines × 2 locations) evals/evals/02_unique_features/match_017_unreachable_patterns/ideal/main.js:10
- Duplicated block with local edits (32 matched lines × 2 locations) evals/evals/04_ts_to_flow/class_private_members/ideal/main.js:20
- Duplicated block (30 lines × 2 locations) evals/evals/04_ts_to_flow/comprehensive_dom_attributes/ideal/main.js:19
- Duplicated block (30 lines × 2 locations) packages/flow-transform/src/transform/comments/prettier/language-js/comments.js:150
- Duplicated block (28 lines × 2 locations) evals/evals/02_unique_features/match_022_instance_superclass/ideal/main.js:10
- Duplicated block (28 lines × 2 locations) packages/flow-dev-tools/flow-typed/node.js:2656
- Length read from the parsed input is spent without ever being bounded rust_port/crates/flow_server_env/src/server_socket_rpc.rs:1631
- Length read from the parsed input is spent without ever being bounded rust_port/crates/flow_monitor_rpc/src/monitor_rpc.rs:132
- Test project verifies nothing: the repository root tests/closure/callback_writes.js:4
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- Duplicated block (14–15 lines × 2) evals/compile_swebench.py:440
- Duplicated block (10–11 lines × 2) evals/compile_swebench.py:464
- End-of-life runtime: Node.js 16 packages/eslint-plugin-fb-flow/package.json:29
- Low cohesion: Test (LCOM4 5) newtests/Tester.js:47
- Type Safety
- Duplication concentrated across 6 sibling directories (19 clone groups) packages/flow-dev-tools/flow-typed/npm/glob_v7.x.x.js:4
- Duplication concentrated across 14 sibling directories (16 clone groups) newtests/lsp/queries/outline.js:3
- Duplication concentrated across 7 sibling directories (5 clone groups) evals/evals/02_unique_features/enum_001_string_enum_cast/ideal/main.js:32
- Duplicated block with local edits (90 matched lines × 2 locations) REDACTED:32
- Duplicated block with local edits (56 matched lines × 2 locations) evals/evals/04_ts_to_flow/nominal_classes_interface_bridge/ideal/main.js:18
- Duplicated block with local edits (54 matched lines × 2 locations) packages/flow-dev-tools/flow-typed/npm/glob_v7.x.x.js:4
- Duplicated block with local edits (48 matched lines × 2 locations) evals/evals/02_unique_features/hook_005_conditional_call/ideal/main.js:13
- Duplicated block (46 lines × 16 locations) newtests/lsp/signatureHelp/test.js:875
- Duplicated block (43 lines × 2 locations) packages/flow-typed/jest.js:332
- Duplicated block (40 lines × 2 locations) newtests/lsp/signatureHelp/test.js:1893
- Duplicated block (39 lines × 6 locations) newtests/lsp/signatureHelp/test.js:1592
- Duplicated block (39 lines × 2 locations) packages/flow-dev-tools/flow-typed/node.js:307
- Duplicated block (37 lines × 21 locations) newtests/lsp/signatureHelp/test.js:2034
- Duplicated block with local edits (33 matched lines × 2 locations) packages/flow-upgrade/flow-typed/npm/fs-extra_v10.x.x.js:537
- Duplicated block (32 lines × 2 locations) evals/evals/02_unique_features/hook_007_migrate_basic/ideal/main.js:12
- Duplicated block (32 lines × 6 locations) newtests/lsp/signatureHelp/test.js:153
- Duplicated block (31 lines × 7 locations) newtests/lsp/signatureHelp/test.js:587
- Duplicated block (31 lines × 10 locations) newtests/lsp/signatureHelp/test.js:2829
- Duplicated block (31 lines × 2 locations) packages/flow-dev-tools/flow-typed/node.js:2782
- Duplicated block (30 lines × 5 locations) newtests/lsp/code-action/quickfix/ts_and_legacy_syntax/test.js:472
- Duplicated block (30 lines × 8 locations) newtests/lsp/signatureHelp/test.js:2848
- Duplicated block with local edits (29 matched lines × 2 locations) evals/evals/02_unique_features/hook_004_mutation_prevention/ideal/main.js:13
- Duplicated block (29 lines × 9 locations) lib/lib.es5.js:1533
- Duplicated block (29 lines × 2 locations) packages/flow-api-translator/src/flowDefToTSDef.js:2926
- Duplicated block with local edits (27 matched lines × 2 locations) evals/evals/01_error_fixing/error_025_object_this_reference/ideal/main.js:13
- Duplicated block (27 lines × 21 locations) newtests/lsp/code-action/quickfix/match/test.js:21
- Duplicated block (26 lines × 4 locations) newtests/lsp/code-action/quickfix/ts_and_legacy_syntax/test.js:77
- Complex function (top-level) (cyclomatic 1153, cognitive 1152) tests/type_printer/types.js:5
- Complex function (anonymous) (cyclomatic 259, cognitive 450) tests/refinements/invalidation.js:41
- Complex function handleSpecialObjectCompare (cyclomatic 107, cognitive 143) packages/flow-parser/test/esprima_test_runner.js:56
- Complex function (top-level) (cyclomatic 95, cognitive 94) tests/disjoint_union_perf/jsAst.js:4
- Complex function GenericTypeAnnotation (cyclomatic 81, cognitive 37) packages/flow-api-translator/src/flowDefToTSDef.js:2463
- Complex function (top-level) (cyclomatic 77, cognitive 76) tests/enums/refinement.js:6
- Complex function (anonymous) (cyclomatic 71, cognitive 105) tests/refinements/invalidation.js:235
- Complex function (anonymous) (cyclomatic 66, cognitive 101) tests/refinements/invalidation.js:183
- Complex function (top-level) (cyclomatic 56, cognitive 31) tests/switch_case_typing/test.js:1
- Complex function (top-level) (cyclomatic 48, cognitive 45) tests/sketchy_null_default/test.js:7
- Complex function transform (cyclomatic 45, cognitive 26) packages/flow-parser/oxidized-src/estree/StripFlowTypes.js:33
- Complex function eliminateAbstractComponent (cyclomatic 42, cognitive 21) packages/flow-upgrade/src/codemods/eliminateAbstractComponent.js:18
- Complex function runTest (cyclomatic 35, cognitive 55) packages/flow-parser/test/esprima_test_runner.js:457
- newtests/lsp/completion/test.js: 10474 lines of code newtests/lsp/completion/test.js:1
- packages/flow-dev-tools/flow-typed/node.js: 5655 lines of code packages/flow-dev-tools/flow-typed/node.js:1
- packages/flow-api-translator/src/flowDefToTSDef.js: 4609 lines of code packages/flow-api-translator/src/flowDefToTSDef.js:1
- newtests/lsp/documentSymbol/test.js: 3629 lines of code newtests/lsp/documentSymbol/test.js:1
- lib/lib.es5.js: 3607 lines of code lib/lib.es5.js:1
- newtests/lsp/signatureHelp/test.js: 3577 lines of code newtests/lsp/signatureHelp/test.js:1
- newtests/lsp/selectionRange/test.js: 2233 lines of code newtests/lsp/selectionRange/test.js:1
- packages/flow-estree/src/types.js: 2149 lines of code packages/flow-estree/src/types.js:1
- packages/flow-api-translator/src/flowToFlowDef.js: 2063 lines of code packages/flow-api-translator/src/flowToFlowDef.js:1
- REDACTED: 1995 lines of code REDACTED:1
- evals/flow-typed/environment/jsx.js: 1929 lines of code evals/flow-typed/environment/jsx.js:1
- packages/flow-upgrade/flow-typed/npm/jest_v27.x.x.js: 1196 lines of code packages/flow-upgrade/flow-typed/npm/jest_v27.x.x.js:1
- packages/flow-parser/oxidized-src/estree/TransformMatchSyntax.js: 972 lines of code packages/flow-parser/oxidized-src/estree/TransformMatchSyntax.js:1
- packages/flow-eslint/src/scope-manager/referencer/Referencer.js: 918 lines of code packages/flow-eslint/src/scope-manager/referencer/Referencer.js:1
- packages/flow-transform/src/transform/comments/prettier/language-js/comments.js: 903 lines of code packages/flow-transform/src/transform/comments/prettier/language-js/comments.js:1
- packages/flow-parser/oxidized-src/estree/TransformComponentSyntax.js: 828 lines of code packages/flow-parser/oxidized-src/estree/TransformComponentSyntax.js:1
- packages/flow-typed/prettier.js: 813 lines of code packages/flow-typed/prettier.js:1
- packages/flow-upgrade/flow-typed/npm/fs-extra_v10.x.x.js: 804 lines of code packages/flow-upgrade/flow-typed/npm/fs-extra_v10.x.x.js:1
- newtests/lsp/code-action/quickfix/ts_and_legacy_syntax/test.js: 797 lines of code newtests/lsp/code-action/quickfix/ts_and_legacy_syntax/test.js:1
- packages/flow-upgrade/flow-typed/npm/memfs_v3.4.x.js: 765 lines of code packages/flow-upgrade/flow-typed/npm/memfs_v3.4.x.js:1
- packages/flow-remove-types/index.js: 754 lines of code packages/flow-remove-types/index.js:1
- packages/flow-typed/jest.js: 751 lines of code packages/flow-typed/jest.js:1
- newtests/lsp/code-action/quickfix/react/test.js: 685 lines of code newtests/lsp/code-action/quickfix/react/test.js:1
- newtests/lsp/diagnostics/test.js: 617 lines of code newtests/lsp/diagnostics/test.js:1
- newtests/lsp/code-action/quickfix/match/test.js: 601 lines of code newtests/lsp/code-action/quickfix/match/test.js:1
- newtests/lsp/code-action/refactor/test.js: 587 lines of code newtests/lsp/code-action/refactor/test.js:1
- src/flow_dot_js_wasm.js: 527 lines of code src/flow_dot_js_wasm.js:1
- packages/flow-transform/src/transform/TransformContext.js: 521 lines of code packages/flow-transform/src/transform/TransformContext.js:1
- packages/flow-for-vscode/src/FlowLanguageClient/DetailedDiagnostics.ts: 461 lines of code packages/flow-for-vscode/src/FlowLanguageClient/DetailedDiagnostics.ts:1
- REDACTED: 451 lines of code REDACTED:1
- packages/flow-eslint/src/scope-manager/scope/ScopeBase.js: 436 lines of code packages/flow-eslint/src/scope-manager/scope/ScopeBase.js:1
- packages/flow-eslint/src/scope-manager/referencer/TypeVisitor.js: 419 lines of code packages/flow-eslint/src/scope-manager/referencer/TypeVisitor.js:1
- lib/lib.es2015.core.js: 412 lines of code lib/lib.es2015.core.js:1
- The declared test suite includes a file that cannot be loaded packages/flow-api-translator/__tests__/flowDefToTSDef/fixtures/export/module-exports/typeof/import/spec.js:11
- Dead file (~10479 LoC) newtests/lsp/completion/test.js
- Dead file (~6098 LoC) packages/flow-dev-tools/flow-typed/node.js
- Dead file (~3631 LoC) newtests/lsp/documentSymbol/test.js
- Dead file (~3604 LoC) newtests/lsp/signatureHelp/test.js
- Dead file (~2238 LoC) newtests/lsp/selectionRange/test.js
- Dead file (~1235 LoC) packages/flow-upgrade/flow-typed/npm/jest_v27.x.x.js
- Dead file (~881 LoC) packages/flow-typed/prettier.js
- Dead file (~871 LoC) packages/flow-upgrade/flow-typed/npm/fs-extra_v10.x.x.js
- Dead file (~799 LoC) newtests/lsp/code-action/quickfix/ts_and_legacy_syntax/test.js
- Dead file (~775 LoC) packages/flow-typed/jest.js
- Dead file (~770 LoC) packages/flow-upgrade/flow-typed/npm/memfs_v3.4.x.js
- Dead file (~687 LoC) newtests/lsp/code-action/quickfix/react/test.js
- Dead file (~624 LoC) newtests/lsp/diagnostics/test.js
- Dead file (~603 LoC) newtests/lsp/code-action/quickfix/match/test.js
- Dead file (~589 LoC) newtests/lsp/code-action/refactor/test.js
- Dead file (~398 LoC) newtests/lsp/completion/autoimports/test.js
- Dead file (~343 LoC) newtests/lsp/queries/test.js
- Dead file (~328 LoC) newtests/lsp/wait_for_recheck/test.js
- Dead file (~316 LoC) packages/flow-upgrade/flow-typed/npm/yargs_v17.x.x.js
- Dead file (~306 LoC) newtests/autofix-exports/test.js
- Dead file (~292 LoC) newtests/lsp/documentHighlight/test.js
- Dead file (~279 LoC) lib/misc.js
- Dead file (~263 LoC) newtests/lsp/linkedEditingRange/test.js
- Dead file (~241 LoC) newtests/lsp/connection/test.js
- Dead file (~235 LoC) newtests/lsp/globalReferencesAndRename/test.js
- Dead file (~232 LoC) packages/flow-upgrade/flow-typed/npm/semver_v7.x.x.js
- Dead file (~206 LoC) newtests/lsp/code-action/test.js
- Dead file (~181 LoC) packages/scripts/transform/genTransformNodeTypes.js
- Dead file (~175 LoC) packages/flow-typed/node.js
- Dead file (~174 LoC) newtests/lsp/code-action/quickfix/test.js
- Dead file (~159 LoC) packages/flow-dev-tools/flow-typed/npm/chalk_v4.x.x.js
- Dead file (~142 LoC) packages/flow-typed/babel-parser.js
- Dead file (~140 LoC) newtests/lsp/code-action/quickfix/records/test.js
- Dead file (~139 LoC) newtests/lsp/completion/haste_package_auto_imports/test.js
- Dead file (~137 LoC) newtests/package_json_changes/test.js
- Dead file (~114 LoC) newtests/lsp/code-action/refactor/readonly_conversion/test.js
- Unused dependency 'esbuild'
- Unused dependency 'builtin-modules'
- Unused dependency 'flow-bin'
- `async` callback passed to `forEach` packages/flow-for-vscode/src/index.ts:106
- Untrusted text written into markup unescaped evals/flow-typed/environment/jsx.js:865
- Swallowed exception (caught, then discarded) scripts/add-specific-error-code.js:74
Minor — 47 finding(s)
- Duplicated predicate evals/evals/01_error_fixing/error_019_class_nominal_typing/ideal/main.js:30
- Duplicated predicate evals/evals/01_error_fixing/error_019_class_nominal_typing/ideal/main.js:18
- Duplicated predicate packages/flow-parser/oxidized-src/estree/StripFlowTypes.js:129
- Duplicated predicate packages/flow-parser/oxidized-src/index.js:47
- Duplicated predicate packages/flow-bin/index.js:17
- Duplicated predicate packages/flow-bin/index.js:21
- Duplicated predicate packages/flow-api-translator/src/flowDefToTSDef.js:327
- Duplicated predicate rust_port/crates/flow_server_rechecker/src/recheck_updates.rs:70
- Duplicated predicate rust_port/crates/flow_server_rechecker/src/recheck_updates.rs:240
- Duplicated predicate rust_port/crates/flow_parser_utils/src/file_sig.rs:519
- Duplicated predicate rust_port/crates/flow_cli/src/check_contents_command.rs:97
- Duplicated predicate rust_port/crates/flow_parsing/src/parsing_service.rs:229
- Duplicated predicate rust_port/crates/flow_cli/src/foreground_check_commands.rs:345
- Duplicated predicate rust_port/crates/flow_env_builder/src/name_def.rs:2660
- Duplicated predicate rust_port/crates/flow_parser/src/expression_parser.rs:2141
- Interpolated log message defeats structured logging rust_port/crates/flow_utils_concurrency/src/thread_pool.rs:130
- Interpolated log message defeats structured logging rust_port/crates/flow_utils_concurrency/src/thread_pool.rs:158
- Interpolated log message defeats structured logging rust_port/crates/flow_dfind/src/lib.rs:143
- Interpolated log message defeats structured logging rust_port/crates/flow_dfind/src/lib.rs:187
- Interpolated log message defeats structured logging rust_port/crates/flow_daemon/src/daemon.rs:282
- Interpolated log message defeats structured logging rust_port/crates/flow_daemon/src/daemon.rs:441
- Interpolated log message defeats structured logging rust_port/crates/flow_daemon/src/daemon.rs:449
- Interpolated log message defeats structured logging rust_port/crates/flow_daemon/src/daemon.rs:577
- Interpolated log message defeats structured logging rust_port/crates/flow_daemon/src/daemon.rs:580
- Interpolated log message defeats structured logging rust_port/crates/flow_codemods/src/utils/codemod_runner.rs:95
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- README/code drift README.md:105
- README/code drift packages/flow-parser/README.md:22
- README/code drift website/docs/react/refs.md:84
- Off-boarding risk: anonymized user #1
- Off-boarding risk: anonymized user #2
- Further sole-owners (lower concentration)
- No ADRs found
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- No ADRs
- Logging is not universal
- Console output used as the logging channel packages/flow-for-vscode/src/utils/LanguageClient/TypeCoverageFeature/TypeCoverageProvider.ts:90
- No SAST
- Test-only dependency 'esrecurse' in production deps packages/flow-eslint/package.json:26
- Null assertions (`!`) reduce the strict null checking score
Minor — 89 finding(s)
- Skipped (documented): (unnamed test) tests/unreachable/jsx_unreachable.js:5
- Skipped (documented): (unnamed test) tests/union_new/issue-2232.js:19
- Skipped (documented): (unnamed test) tests/union_new/test31.js:9
- Skipped (documented): (unnamed test) tests/union_new/test31.js:13
- Skipped (documented): (unnamed test) tests/type_at_pos_react/react_abstract_component.js:3
- Skipped (documented): (unnamed test) tests/super/super.js:29
- Skipped (documented): (unnamed test) tests/spread/lit_reason.js:3
- Skipped (documented): (unnamed test) tests/spread/test4.js:2
- Skipped (documented): (unnamed test) tests/sketchy_null_strict/non-strict.js:5
- Skipped (documented): (unnamed test) tests/sketchy_null_strict/strict.js:5
- Skipped (documented): (unnamed test) tests/sealed_tvars/regression_tests.js:94
- Skipped (documented): (unnamed test) tests/refinements/loop_incorrect_invalidation_regression_test.js:4
- Skipped (documented): (unnamed test) tests/refinements/super_member.js:11
- Skipped (documented): (unnamed test) tests/refinements/super_member.js:20
- Skipped (documented): (unnamed test) tests/rec/union-spread.js:11
- Skipped (documented): (unnamed test) tests/rec/union-spread.js:13
- Skipped (documented): (unnamed test) tests/react_abstract_component/test_prop.js:3
- Skipped (documented): (unnamed test) tests/provider_havoc/empty.js:8
- Skipped (documented): (unnamed test) tests/promises/all.js:28
- Skipped (documented): (unnamed test) tests/promises/any.js:8
- Skipped (documented): (unnamed test) tests/private_class_methods/test.js:31
- Skipped (documented): (unnamed test) tests/private_class_methods/test.js:45
- Skipped (documented): (unnamed test) tests/private_class_methods/test.js:57
- Skipped (documented): (unnamed test) tests/private_class_fields/test.js:16
- Skipped (documented): (unnamed test) tests/private_class_fields/test.js:27
Appendix B — Reproduction & audit trail
| Dimension | Tool | Version | Command | Findings | Raw output |
|---|---|---|---|---|---|
| D28 · Secrets (history) | gitleaks | — | gitleaks detect --no-banner --config /opt/gitleaks-rules/watchdog-gitleaks.toml --report-format json --report-path /tmp/watchdog-gitleaks-4837daf84da646a4aea01ca798df3a0d/history.json --exit-code 0 --source . | 14 | artifacts/raw/gitleaks-history.json |
| D28 · Secrets (history) | gitleaks | — | gitleaks detect --no-git --no-banner --config /opt/gitleaks-rules/watchdog-gitleaks.toml --report-format json --report-path /tmp/watchdog-gitleaks-4837daf84da646a4aea01ca798df3a0d/tree.json --exit-code 0 --source . | 1 | artifacts/raw/gitleaks-tree.json |
| D29 · Static Analysis (SAST) | semgrep | — | semgrep --config /opt/semgrep-rules/security-audit.yml --config /opt/semgrep-rules/owasp-top-ten.yml --config /opt/semgrep-rules/watchdog-sast.yml --json --quiet --timeout 10 --timeout-threshold 3 --metrics off --exclude *.arrow --exclude *.avro --exclude *.csv --exclude *.dat --exclude *.db --exclude *.feather --exclude *.geojson --exclude *.h5 --exclude *.hdf5 --exclude *.jsonl --exclude *.log --exclude *.ndjson --exclude *.npy --exclude *.npz --exclude *.orc --exclude *.parquet --exclude *.pickle --exclude *.pkl --exclude *.psv --exclude *.sqlite --exclude *.sqlite3 --exclude *.tfrecord --exclude *.tsv --exclude *.txt --exclude packages/flow-parser/oxidized-src/generated . | 104 | artifacts/raw/semgrep.json |
| D30 · Dependency Vulnerabilities | trivy | — | trivy fs --scanners vuln --format json --quiet --severity CRITICAL,HIGH,MEDIUM,LOW --skip-dirs **/bin/** --skip-dirs **/obj/** . --skip-db-update | 70 | artifacts/raw/trivy-fs.json |
| D31 · IaC & Container Security | trivy | — | trivy: not applicable — No Infrastructure-as-Code or container manifests found (Dockerfile, Docker Compose, Terraform, Kubernetes/Helm, CloudFormation, ARM, Bicep, Ansible); nothing to scan. | 0 | — |
| D32 · Data Compliance (PII/GDPR) | semgrep | — | semgrep: not applicable — No personal data was found crossing a boundary the PII/GDPR ruleset checks — nothing written to a log or console sink, placed in a URL or query string, or persisted to browser storage. That is a clean result for the LEAK surface only: this ruleset detects personal data escaping, it does not inventory the personal data a repository holds, so it is not evidence that this repository has no personal-data surface. The personal-data map (Appendix C) and the C1-C5 compliance cards are what speak to that. semgrep could not parse 261 file(s) — `evals/evals/01_error_fixing/error_002_exact_object_types/input/main.js`, `evals/evals/01_error_fixing/error_004_exact_objects_extra_props/ideal/main.js`, `evals/evals/01_error_fixing/error_005_array_variance/ideal/main.js`, `evals/evals/01_error_fixing/error_007_property_variance/ideal/main.js`, `evals/evals/01_error_fixing/error_007_property_variance/input/main.js`, … (+256 more) — so the PII/GDPR sweep did not cover the unparsed regions of them; rows reported elsewhere in those files are real. | 0 | — |
| D37 · Vulnerability-disclosure Policy | disclosure | — | disclosure: not applicable — No vulnerability-disclosure policy file found (SECURITY.md/.markdown/.rst/.txt at root or under .github/.forgejo/.gitea/docs, .well-known/security.txt). A coordinated-disclosure policy may live off-repo, so this is not evidenced rather than failed. | 0 | — |
| D40 · Network Egress Confinement | runtime-hardening | — | runtime-hardening: not applicable — No Kubernetes/orchestration workloads found in the repository manifests; network egress policy is a cluster-native control that may live at the platform/firewall layer, so there is nothing to assess here. | 0 | — |
| D41 · Kernel & Syscall Confinement | runtime-hardening | — | runtime-hardening: not applicable — No Kubernetes/orchestration workloads found in the repository manifests; seccomp/AppArmor/SELinux confinement is a workload-level control, so there is nothing to assess here. | 0 | — |
| D42 · Runtime Threat Enforcement | runtime-hardening | — | runtime-hardening: not applicable — No Kubernetes/orchestration workloads found in the repository manifests; runtime threat-detection and admission-control policy are cluster-level controls, so there is nothing to assess here. | 0 | — |
| D43 · Malicious Dependencies | trivy | — | trivy fs --scanners vuln --format json --quiet --severity CRITICAL,HIGH,MEDIUM,LOW --skip-dirs **/bin/** --skip-dirs **/obj/** . --skip-db-update | 0 | artifacts/raw/trivy-fs.json |