Skip to main content

stylex_transform/shared/utils/core/
dev_class_name.rs

1use std::{path::Path, rc::Rc};
2
3use indexmap::IndexMap;
4use stylex_macros::stylex_panic;
5
6use crate::shared::enums::data_structures::flat_compiled_styles_value::FlatCompiledStylesValue;
7use crate::shared::structures::state_manager::StateManager;
8use crate::shared::structures::types::{FlatCompiledStyles, StylesObjectMap};
9use stylex_constants::constants::common::COMPILED_KEY;
10use stylex_regex::regex::SANITIZE_CLASS_NAME_REGEX;
11
12pub(crate) fn inject_dev_class_names(
13  obj: &StylesObjectMap,
14  var_name: &Option<String>,
15  state: &StateManager,
16) -> StylesObjectMap {
17  let mut result: StylesObjectMap = IndexMap::new();
18
19  for (key, value) in obj.iter() {
20    let dev_class_name =
21      namespace_to_dev_class_name(key, var_name, state.get_short_filename().as_str());
22
23    let mut dev_class = IndexMap::new();
24
25    dev_class.insert(
26      dev_class_name.clone(),
27      Rc::new(FlatCompiledStylesValue::String(dev_class_name)),
28    );
29
30    dev_class.extend((**value).clone());
31
32    result.insert(key.clone(), Rc::new(dev_class));
33  }
34
35  result
36}
37
38pub(crate) fn convert_to_test_styles(
39  obj: &StylesObjectMap,
40  var_name: &Option<String>,
41  state: &StateManager,
42) -> StylesObjectMap {
43  let mut result: StylesObjectMap = IndexMap::new();
44
45  for (key, _value) in obj.iter() {
46    let dev_class_name =
47      namespace_to_dev_class_name(key, var_name, state.get_short_filename().as_str());
48
49    let mut dev_class = IndexMap::new();
50
51    dev_class.insert(
52      dev_class_name.clone(),
53      Rc::new(FlatCompiledStylesValue::String(dev_class_name)),
54    );
55
56    dev_class.insert(
57      COMPILED_KEY.to_string(),
58      Rc::new(FlatCompiledStylesValue::Bool(true)),
59    );
60
61    result.insert(key.clone(), Rc::new(dev_class));
62  }
63
64  result
65}
66
67fn namespace_to_dev_class_name(
68  namespace: &str,
69  var_name: &Option<String>,
70  filename: &str,
71) -> String {
72  // Get the basename of the file without the extension
73  let basename = Path::new(filename)
74    .file_stem()
75    .and_then(|os_str| os_str.to_str())
76    .unwrap_or_default();
77
78  // Build up the class name, and sanitize it of disallowed characters
79  let class_name = format!(
80    "{}__{}{}",
81    basename,
82    var_name
83      .as_ref()
84      .map(|var_name| format!("{}.", var_name))
85      .unwrap_or_default(),
86    namespace
87  );
88
89  SANITIZE_CLASS_NAME_REGEX
90    .replace_all(&class_name, "$1 $2")
91    .to_string()
92}
93
94fn convert_theme_to_base_styles(variable_name: &str, filename: &str) -> FlatCompiledStyles {
95  let mut overrides_obj_extended = IndexMap::new();
96
97  // Get the basename of the file without the extension
98  let basename = Path::new(filename)
99    .file_stem()
100    .and_then(|os_str| os_str.to_str())
101    .unwrap_or_default()
102    .split('.')
103    .next()
104    .unwrap_or_else(|| stylex_panic!("File path has no base name."));
105
106  // Build up the class name, and sanitize it of disallowed characters
107  let dev_class_name = format!("{}__{}", basename, variable_name);
108
109  overrides_obj_extended.insert(
110    dev_class_name.clone(),
111    Rc::new(FlatCompiledStylesValue::String(dev_class_name)),
112  );
113
114  overrides_obj_extended
115}
116
117pub(crate) fn convert_theme_to_dev_styles(
118  variable_name: &Option<String>,
119  overrides_obj: &FlatCompiledStyles,
120  filename: &str,
121) -> FlatCompiledStyles {
122  let variable_name_str = match variable_name.as_ref() {
123    Some(v) => v.as_str(),
124    None => stylex_panic!("The variable name could not be determined."),
125  };
126
127  let mut overrides_obj_extended = convert_theme_to_base_styles(variable_name_str, filename);
128
129  overrides_obj_extended.extend(overrides_obj.clone());
130
131  overrides_obj_extended
132}
133
134pub(crate) fn convert_theme_to_test_styles(
135  variable_name: &Option<String>,
136  overrides_obj: &FlatCompiledStyles,
137  filename: &str,
138) -> FlatCompiledStyles {
139  let mut overrides_obj_extended =
140    convert_theme_to_dev_styles(variable_name, overrides_obj, filename);
141
142  overrides_obj_extended.insert(
143    COMPILED_KEY.to_string(),
144    Rc::new(FlatCompiledStylesValue::Bool(true)),
145  );
146
147  overrides_obj_extended
148}