next.js/test/e2e/swc-plugins-env/plugin/src/lib.rs
lib.rs44 lines1.2 KB
#![allow(clippy::not_unsafe_ptr_arg_deref)]

use swc_core::{
    common::DUMMY_SP,
    ecma::{
        ast::*,
        visit::{VisitMut, VisitMutWith, visit_mut_pass},
    },
    plugin::{
        metadata::TransformPluginMetadataContextKind, plugin_transform,
        proxies::TransformPluginProgramMetadata,
    },
};

struct EnvCheckVisitor {
    env_name: String,
}

impl VisitMut for EnvCheckVisitor {
    fn visit_mut_expr(&mut self, expr: &mut Expr) {
        expr.visit_mut_children_with(self);

        // Replace any identifier `ENV_CHECK` with a string literal of the actual env value
        if let Expr::Ident(ident) = expr {
            if ident.sym.as_str() == "ENV_CHECK" {
                *expr = Expr::Lit(Lit::Str(Str {
                    span: DUMMY_SP,
                    value: self.env_name.clone().into(),
                    raw: None,
                }));
            }
        }
    }
}

#[plugin_transform]
pub fn process_transform(program: Program, metadata: TransformPluginProgramMetadata) -> Program {
    let env_name = metadata
        .get_context(&TransformPluginMetadataContextKind::Env)
        .expect("failed to get env");

    program.apply(visit_mut_pass(&mut EnvCheckVisitor { env_name }))
}
Quest for Codev2.0.0
/
SIGN IN