compiler/crates/react_compiler_hir/src/environment_config.rs RUST 231 lines View on github.com → Search inside
1// Copyright (c) Meta Platforms, Inc. and affiliates.2//3// This source code is licensed under the MIT license found in the4// LICENSE file in the root directory of this source tree.56//! Environment configuration, ported from EnvironmentConfigSchema in Environment.ts.7//!8//! Contains feature flags and custom hook definitions that control compiler behavior.910use indexmap::IndexMap;11use rustc_hash::{FxBuildHasher, FxHashMap};1213use serde::{Deserialize, Serialize};1415use crate::Effect;16use crate::type_config::{TypeConfig, ValueKind};1718/// External function reference (source module + import name).19/// Corresponds to TS `ExternalFunction`.20#[derive(Debug, Clone, Serialize, Deserialize)]21#[serde(rename_all = "camelCase")]22pub struct ExternalFunctionConfig {23    pub source: String,24    pub import_specifier_name: String,25}2627/// Instrumentation configuration.28/// Corresponds to TS `InstrumentationSchema`.29#[derive(Debug, Clone, Serialize, Deserialize)]30#[serde(rename_all = "camelCase")]31pub struct InstrumentationConfig {32    #[serde(rename = "fn")]33    pub fn_: ExternalFunctionConfig,34    #[serde(default)]35    pub gating: Option<ExternalFunctionConfig>,36    #[serde(default)]37    pub global_gating: Option<String>,38}3940/// Custom hook configuration, ported from TS `HookSchema`.41#[derive(Debug, Clone, Serialize, Deserialize)]42#[serde(rename_all = "camelCase")]43pub struct HookConfig {44    pub effect_kind: Effect,45    pub value_kind: ValueKind,46    #[serde(default)]47    pub no_alias: bool,48    #[serde(default)]49    pub transitive_mixed_data: bool,50}5152#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]53pub enum ExhaustiveEffectDepsMode {54    #[serde(rename = "off")]55    Off,56    #[serde(rename = "all")]57    All,58    #[serde(rename = "missing-only")]59    MissingOnly,60    #[serde(rename = "extra-only")]61    ExtraOnly,62}6364impl Default for ExhaustiveEffectDepsMode {65    fn default() -> Self {66        Self::Off67    }68}6970fn default_true() -> bool {71    true72}7374/// Compiler environment configuration. Contains feature flags and settings.75///76/// Fields that would require passing JS functions across the JS/Rust boundary77/// are omitted with TODO comments. The Rust port uses hardcoded defaults for78/// these (e.g., `defaultModuleTypeProvider`).79#[derive(Debug, Clone, Serialize, Deserialize)]80#[serde(rename_all = "camelCase")]81pub struct EnvironmentConfig {82    /// Custom hook type definitions, keyed by hook name.83    #[serde(default)]84    pub custom_hooks: FxHashMap<String, HookConfig>,8586    /// Pre-resolved module type provider results.87    /// Map from module name to TypeConfig, computed by the JS shim.88    #[serde(default)]89    pub module_type_provider: Option<IndexMap<String, TypeConfig, FxBuildHasher>>,9091    /// Custom macro-like function names that should have their operands92    /// memoized in the same scope (similar to fbt).93    #[serde(default)]94    pub custom_macros: Option<Vec<String>>,9596    /// If true, emit code to reset the memo cache on source file changes (HMR/fast refresh).97    /// If null (None), HMR detection is conditionally enabled based on NODE_ENV/__DEV__.98    #[serde(default)]99    pub enable_reset_cache_on_source_file_changes: Option<bool>,100101    #[serde(default = "default_true")]102    pub enable_preserve_existing_memoization_guarantees: bool,103    #[serde(default = "default_true")]104    pub validate_preserve_existing_memoization_guarantees: bool,105    #[serde(default = "default_true")]106    pub validate_exhaustive_memoization_dependencies: bool,107    #[serde(default)]108    pub validate_exhaustive_effect_dependencies: ExhaustiveEffectDepsMode,109110    // TODO: flowTypeProvider — requires JS function callback.111    #[serde(default = "default_true")]112    pub enable_optional_dependencies: bool,113    #[serde(default)]114    pub enable_name_anonymous_functions: bool,115    #[serde(default = "default_true")]116    pub validate_hooks_usage: bool,117    #[serde(default = "default_true")]118    pub validate_ref_access_during_render: bool,119    #[serde(default = "default_true")]120    pub validate_no_set_state_in_render: bool,121    #[serde(default)]122    pub enable_use_keyed_state: bool,123    #[serde(default)]124    pub validate_no_set_state_in_effects: bool,125    #[serde(default)]126    pub validate_no_derived_computations_in_effects: bool,127    #[serde(default)]128    #[serde(alias = "validateNoDerivedComputationsInEffects_exp")]129    pub validate_no_derived_computations_in_effects_exp: bool,130    #[serde(default)]131    #[serde(alias = "validateNoJSXInTryStatements")]132    pub validate_no_jsx_in_try_statements: bool,133    #[serde(default)]134    pub validate_static_components: bool,135    #[serde(default)]136    pub validate_no_capitalized_calls: Option<Vec<String>>,137    #[serde(default)]138    #[serde(alias = "restrictedImports")]139    pub validate_blocklisted_imports: Option<Vec<String>>,140    #[serde(default)]141    pub validate_source_locations: bool,142    #[serde(default)]143    pub validate_no_impure_functions_in_render: bool,144    #[serde(default)]145    pub validate_no_freezing_known_mutable_functions: bool,146    #[serde(default = "default_true")]147    pub enable_assume_hooks_follow_rules_of_react: bool,148    #[serde(default = "default_true")]149    pub enable_transitively_freeze_function_expressions: bool,150151    /// Hook guard configuration. When set, wraps hook calls with dispatcher guard calls.152    #[serde(default)]153    pub enable_emit_hook_guards: Option<ExternalFunctionConfig>,154155    /// Instrumentation configuration. When set, emits calls to instrument functions.156    #[serde(default)]157    pub enable_emit_instrument_forget: Option<InstrumentationConfig>,158159    #[serde(default = "default_true")]160    pub enable_function_outlining: bool,161    #[serde(default)]162    pub enable_jsx_outlining: bool,163    #[serde(default)]164    pub assert_valid_mutable_ranges: bool,165    #[serde(default)]166    #[serde(alias = "throwUnknownException__testonly")]167    pub throw_unknown_exception_testonly: bool,168    #[serde(default)]169    pub enable_custom_type_definition_for_reanimated: bool,170    #[serde(default = "default_true")]171    pub enable_treat_ref_like_identifiers_as_refs: bool,172    #[serde(default)]173    pub enable_treat_set_identifiers_as_state_setters: bool,174    #[serde(default = "default_true")]175    pub validate_no_void_use_memo: bool,176    #[serde(default = "default_true")]177    pub enable_allow_set_state_from_refs_in_effects: bool,178    #[serde(default)]179    pub enable_verbose_no_set_state_in_effect: bool,180181    // 🌲182    #[serde(default)]183    pub enable_forest: bool,184}185186impl Default for EnvironmentConfig {187    fn default() -> Self {188        Self {189            custom_hooks: FxHashMap::default(),190            enable_reset_cache_on_source_file_changes: None,191            module_type_provider: None,192            enable_preserve_existing_memoization_guarantees: true,193            validate_preserve_existing_memoization_guarantees: true,194            validate_exhaustive_memoization_dependencies: true,195            validate_exhaustive_effect_dependencies: ExhaustiveEffectDepsMode::Off,196            enable_optional_dependencies: true,197            enable_name_anonymous_functions: false,198            validate_hooks_usage: true,199            validate_ref_access_during_render: true,200            validate_no_set_state_in_render: true,201            enable_use_keyed_state: false,202            validate_no_set_state_in_effects: false,203            validate_no_derived_computations_in_effects: false,204            validate_no_derived_computations_in_effects_exp: false,205            validate_no_jsx_in_try_statements: false,206            validate_static_components: false,207            validate_no_capitalized_calls: None,208            validate_blocklisted_imports: None,209            validate_source_locations: false,210            validate_no_impure_functions_in_render: false,211            validate_no_freezing_known_mutable_functions: false,212            enable_assume_hooks_follow_rules_of_react: true,213            enable_transitively_freeze_function_expressions: true,214            enable_emit_hook_guards: None,215            enable_emit_instrument_forget: None,216            enable_function_outlining: true,217            enable_jsx_outlining: false,218            assert_valid_mutable_ranges: false,219            throw_unknown_exception_testonly: false,220            enable_custom_type_definition_for_reanimated: false,221            enable_treat_ref_like_identifiers_as_refs: true,222            enable_treat_set_identifiers_as_state_setters: false,223            validate_no_void_use_memo: true,224            enable_allow_set_state_from_refs_in_effects: true,225            enable_verbose_no_set_state_in_effect: false,226            enable_forest: false,227            custom_macros: None,228        }229    }230}

Findings

✓ No findings reported for this file.

Get this view in your editor

Same data, no extra tab — call code_get_file + code_get_findings over MCP from Claude/Cursor/Copilot.