turbopack_ecmascript_plugins/transform/directives/
mod.rs

1use 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}