extern crate self as macroforge_ts;
pub extern crate inventory;
pub extern crate macroforge_ts_macros;
pub extern crate macroforge_ts_quote;
pub extern crate macroforge_ts_syn;
#[cfg(feature = "node")]
pub extern crate napi;
#[cfg(feature = "node")]
pub extern crate napi_derive;
pub extern crate serde_json;
#[cfg(feature = "wasm")]
pub extern crate serde_wasm_bindgen;
#[cfg(feature = "wasm")]
pub extern crate wasm_bindgen;
pub mod debug;
pub use macroforge_ts_syn as ts_syn;
pub mod macros {
pub use macroforge_ts_macros::ts_macro_derive;
pub use macroforge_ts_quote::{ts_quote, ts_template};
}
#[cfg(feature = "node")]
#[macro_export]
macro_rules! if_node { ($($tokens:tt)*) => { $($tokens)* } }
#[cfg(not(feature = "node"))]
#[macro_export]
macro_rules! if_node {
($($tokens:tt)*) => {};
}
#[cfg(feature = "node")]
#[macro_export]
macro_rules! if_node_else {
($item:expr, $else:expr) => {
$item
};
}
#[cfg(not(feature = "node"))]
#[macro_export]
macro_rules! if_node_else {
($item:expr, $else:expr) => {
$else
};
}
#[cfg(feature = "wasm")]
#[macro_export]
macro_rules! if_wasm { ($($tokens:tt)*) => { $($tokens)* } }
#[cfg(not(feature = "wasm"))]
#[macro_export]
macro_rules! if_wasm {
($($tokens:tt)*) => {};
}
#[cfg(feature = "wasm")]
#[macro_export]
macro_rules! if_wasm_else {
($item:expr, $else:expr) => {
$item
};
}
#[cfg(not(feature = "wasm"))]
#[macro_export]
macro_rules! if_wasm_else {
($item:expr, $else:expr) => {
$else
};
}
#[cfg(feature = "swc")]
#[macro_export]
macro_rules! if_swc { ($($tokens:tt)*) => { $($tokens)* } }
#[cfg(not(feature = "swc"))]
#[macro_export]
macro_rules! if_swc {
($($tokens:tt)*) => {};
}
#[cfg(feature = "swc")]
#[macro_export]
macro_rules! ident {
($name:expr) => {
$crate::swc_core::ecma::ast::Ident::new_no_ctxt(
AsRef::<str>::as_ref(&$name).into(),
$crate::swc_core::common::DUMMY_SP,
)
};
($fmt:expr, $($args:expr),+ $(,)?) => {
$crate::swc_core::ecma::ast::Ident::new_no_ctxt(
format!($fmt, $($args),+).into(),
$crate::swc_core::common::DUMMY_SP,
)
};
}
#[cfg(all(feature = "oxc", not(feature = "swc")))]
#[macro_export]
macro_rules! ident {
($name:expr) => {
$crate::swc_ecma_ast::Ident::new(AsRef::<str>::as_ref(&$name))
};
($fmt:expr, $($args:expr),+ $(,)?) => {
$crate::swc_ecma_ast::Ident::new(format!($fmt, $($args),+))
};
}
#[cfg(feature = "swc")]
#[macro_export]
macro_rules! private_ident {
($name:expr) => {{
let mark = $crate::swc_core::common::Mark::fresh($crate::swc_core::common::Mark::root());
$crate::swc_core::ecma::ast::Ident::new(
$name.into(),
$crate::swc_core::common::DUMMY_SP,
$crate::swc_core::common::SyntaxContext::empty().apply_mark(mark),
)
}};
}
#[cfg(all(feature = "oxc", not(feature = "swc")))]
#[macro_export]
macro_rules! private_ident {
($name:expr) => {
$crate::swc_ecma_ast::Ident::new($name)
};
}
#[cfg(feature = "swc")]
pub use macroforge_ts_syn::swc_common;
#[cfg(feature = "swc")]
pub use macroforge_ts_syn::swc_core;
pub use macroforge_ts_syn::swc_ecma_ast;
pub mod host;
#[cfg(feature = "build")]
pub mod build;
pub use ts_syn::abi;
pub mod builtin;
pub mod api;
pub mod api_types;
mod expand_core;
mod manifest;
#[cfg(feature = "node")]
pub mod bindings_napi;
#[cfg(feature = "wasm")]
pub mod bindings_wasm;
#[cfg(feature = "node")]
mod plugin;
#[cfg(feature = "node")]
mod position_mapper;
pub use api_types::{
ExpandOptions, ExpandResult, GeneratedRegionResult, ImportSourceResult, JsDiagnostic,
LoadConfigResult, MacroDiagnostic, MappingSegmentResult, ProcessFileOptions, ScanOptions,
ScanResult, SourceMappingResult, SpanResult, SyntaxCheckResult, TransformResult,
};
#[cfg(feature = "node")]
pub use position_mapper::{NativeMapper, NativePositionMapper};
#[cfg(feature = "node")]
pub use plugin::NativePlugin;
#[cfg(feature = "node")]
pub use bindings_napi::{
check_syntax, clear_config_cache, derive_decorator, expand_sync, load_config,
parse_import_sources, scan_project_sync, transform_sync,
};
#[unsafe(no_mangle)]
pub unsafe extern "C" fn __macroforge_ffi_free(ptr: *mut u8, len: usize) {
if !ptr.is_null() && len > 0 {
drop(unsafe { Box::from_raw(std::ptr::slice_from_raw_parts_mut(ptr, len)) });
}
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn __macroforge_ffi_get_manifest(
out_ptr: *mut *mut u8,
out_len: *mut usize,
) -> i32 {
let manifest = get_macro_manifest();
match serde_json::to_string(&manifest) {
Ok(json) => {
let bytes = json.into_bytes().into_boxed_slice();
unsafe {
*out_len = bytes.len();
*out_ptr = Box::into_raw(bytes) as *mut u8;
}
0
}
Err(e) => {
let msg = format!("Failed to serialize manifest: {e}")
.into_bytes()
.into_boxed_slice();
unsafe {
*out_len = msg.len();
*out_ptr = Box::into_raw(msg) as *mut u8;
}
1
}
}
}
#[cfg(feature = "wasm")]
pub use bindings_wasm::{
check_syntax as wasm_check_syntax, clear_config_cache as wasm_clear_config_cache,
derive_decorator as wasm_derive_decorator, expand_sync as wasm_expand_sync,
load_config as wasm_load_config, parse_import_sources as wasm_parse_import_sources,
scan_project_sync as wasm_scan_project_sync, transform_sync as wasm_transform_sync,
};
pub use manifest::{
DecoratorManifestEntry, MacroManifest, MacroManifestEntry, debug_descriptors,
debug_get_modules, debug_lookup, get_macro_manifest, get_macro_names, is_macro_package,
};
#[cfg(test)]
mod test;