turbopack_ecmascript_plugins/transform/directives/
mod.rs1use swc_core::ecma::ast::{Lit, Program};
2
3pub mod client;
4pub mod client_disallowed;
5mod server_to_client_proxy;
6
7macro_rules! has_directive {
8 ($stmts:expr, $name:literal) => {
9 $stmts
10 .map(|item| {
11 if let Lit::Str(str) = item?.as_expr()?.expr.as_lit()? {
12 Some(str)
13 } else {
14 None
15 }
16 })
17 .take_while(Option::is_some)
18 .map(Option::unwrap)
19 .any(|s| &*s.value == $name)
20 };
21}
22
23fn is_client_module(program: &Program) -> bool {
24 match program {
25 Program::Module(m) => {
26 has_directive!(m.body.iter().map(|item| item.as_stmt()), "use client")
27 }
28 Program::Script(s) => has_directive!(s.body.iter().map(Some), "use client"),
29 }
30}