Skip to main content

stylex_compiler_rs/utils/
metadata.rs

1#![allow(deprecated)]
2
3use napi::{Env, Error, JsObject};
4use stylex_transform::StyleXTransform;
5use stylex_types::enums::data_structures::injectable_style::InjectableStyleBaseKind;
6use swc_core::plugin::proxies::PluginCommentsProxy;
7
8/// Extracts StyleX metadata from the transformation state
9pub(crate) fn extract_stylex_metadata(
10  env: Env,
11  stylex: &StyleXTransform<PluginCommentsProxy>,
12) -> Result<Vec<JsObject>, Error> {
13  let mut stylex_metadata = Vec::with_capacity(stylex.state.metadata.len());
14
15  for value in stylex.state.metadata.values() {
16    for meta in value {
17      let mut metadata_value = env.create_array_with_length(3)?;
18
19      metadata_value.set_element(0, env.create_string(meta.get_class_name())?)?;
20
21      let mut style_value = env.create_object()?;
22      let styles = meta.get_style();
23
24      match styles {
25        InjectableStyleBaseKind::Regular(styles) => {
26          set_metadata_ltr_and_rtl(env, &mut style_value, &styles.ltr, &styles.rtl, None, None)?;
27        },
28        InjectableStyleBaseKind::Const(styles) => {
29          set_metadata_ltr_and_rtl(
30            env,
31            &mut style_value,
32            &styles.ltr,
33            &styles.rtl,
34            Some(&styles.const_key),
35            Some(&styles.const_value),
36          )?;
37        },
38      }
39
40      metadata_value.set_element(1, style_value)?;
41      metadata_value.set_element(2, env.create_double(*meta.get_priority())?)?;
42
43      stylex_metadata.push(metadata_value);
44    }
45  }
46
47  Ok(stylex_metadata)
48}
49
50/// Sets LTR and RTL metadata properties on a JS object
51fn set_metadata_ltr_and_rtl(
52  env: Env,
53  style_value: &mut JsObject,
54  ltr: &str,
55  rtl: &Option<String>,
56  consts_key: Option<&str>,
57  consts_value: Option<&str>,
58) -> Result<(), Error> {
59  if let Some(consts_key) = consts_key {
60    style_value.set_named_property("constKey", consts_key)?;
61  }
62
63  if let Some(consts_value) = consts_value {
64    style_value.set_named_property("constVal", consts_value)?;
65  }
66
67  style_value.set_named_property("ltr", ltr)?;
68
69  let rtl_value = rtl.as_ref().map(|v| env.create_string(v)).transpose()?;
70  style_value.set_named_property("rtl", rtl_value)?;
71
72  Ok(())
73}