swc_plugin_proxy/metadata/
transform_plugin_metadata.rs1#[cfg(feature = "__plugin_mode")]
2use swc_common::Mark;
3#[cfg(feature = "__plugin_mode")]
4use swc_trace_macro::swc_trace;
5
6#[cfg(all(feature = "__rkyv", feature = "__plugin_mode", target_arch = "wasm32"))]
7use crate::memory_interop::read_returned_result_from_host;
8#[cfg(feature = "__plugin_mode")]
9#[cfg_attr(not(target_arch = "wasm32"), allow(unused))]
10use crate::{PluginCommentsProxy, PluginSourceMapProxy};
11
12#[cfg(feature = "__plugin_mode")]
16#[derive(Debug)]
17pub struct TransformPluginProgramMetadata {
18    pub comments: Option<PluginCommentsProxy>,
22    pub source_map: PluginSourceMapProxy,
26    pub unresolved_mark: Mark,
27}
28
29#[cfg(target_arch = "wasm32")] extern "C" {
31    fn __copy_context_key_to_host_env(bytes_ptr: u32, bytes_ptr_len: u32);
32    fn __get_transform_plugin_config(allocated_ret_ptr: u32) -> u32;
33    fn __get_transform_context(key: u32, allocated_ret_ptr: u32) -> i32;
34    fn __get_experimental_transform_context(allocated_ret_ptr: u32) -> u32;
35    fn __get_raw_experiemtal_transform_context(allocated_ret_ptr: u32) -> u32;
36}
37
38#[cfg(feature = "__plugin_mode")]
39#[swc_trace]
40impl TransformPluginProgramMetadata {
41    pub fn get_transform_plugin_config(&self) -> Option<String> {
44        #[cfg(target_arch = "wasm32")]
45        return read_returned_result_from_host(|serialized_ptr| unsafe {
46            __get_transform_plugin_config(serialized_ptr)
47        });
48
49        #[cfg(not(target_arch = "wasm32"))]
50        None
51    }
52
53    #[cfg_attr(not(target_arch = "wasm32"), allow(unused))]
55    pub fn get_context(
56        &self,
57        key: &swc_common::plugin::metadata::TransformPluginMetadataContextKind,
58    ) -> Option<String> {
59        #[cfg(target_arch = "wasm32")]
60        return read_returned_result_from_host(|serialized_ptr| unsafe {
61            __get_transform_context(*key as u32, serialized_ptr) as u32
62        });
63
64        #[cfg(not(target_arch = "wasm32"))]
65        None
66    }
67
68    #[cfg_attr(not(target_arch = "wasm32"), allow(unused))]
78    pub fn get_experimental_context(&self, key: &str) -> Option<String> {
79        #[cfg(target_arch = "wasm32")]
80        return read_returned_result_from_host(|serialized_ptr| unsafe {
81            let serialized = swc_common::plugin::serialized::PluginSerializedBytes::try_serialize(
82                &swc_common::plugin::serialized::VersionedSerializable::new(key.to_string()),
83            )
84            .expect("Should be serializable");
85            let (key_ptr, key_ptr_len) = serialized.as_ptr();
86            __copy_context_key_to_host_env(key_ptr as u32, key_ptr_len as u32);
87
88            __get_experimental_transform_context(serialized_ptr)
89        });
90
91        #[cfg(not(target_arch = "wasm32"))]
92        None
93    }
94
95    #[allow(unreachable_code)]
101    pub fn get_raw_experimental_context(&self) -> rustc_hash::FxHashMap<String, String> {
102        unimplemented!("Not supported yet");
104
105        #[cfg(target_arch = "wasm32")]
106        return read_returned_result_from_host(|serialized_ptr| unsafe {
107            __get_raw_experiemtal_transform_context(serialized_ptr)
108        })
109        .expect("Raw experimental metadata should exists, even if it's empty map");
110
111        #[cfg(not(target_arch = "wasm32"))]
112        rustc_hash::FxHashMap::default()
113    }
114}