farmfe_plugin_script 2.0.1

Script compilation plugin of farm.
use std::{path::PathBuf, sync::Arc};

use farmfe_core::{
  context::CompilationContext,
  module::{Module, ModuleId},
  plugin::{
    Plugin, PluginAnalyzeDepsHookParam, PluginAnalyzeDepsHookResultEntry,
    PluginFinalizeModuleHookParam, PluginHookContext, PluginLoadHookParam, PluginParseHookParam,
    PluginProcessModuleHookParam,
  },
  HashMap,
};

pub fn build_module_deps(
  path: PathBuf,
  base: PathBuf,
) -> (Module, Vec<PluginAnalyzeDepsHookResultEntry>) {
  let config = Default::default();
  let context = Arc::new(CompilationContext::new(config, vec![]).unwrap());
  let script_plugin = farmfe_plugin_script::FarmPluginScript::new(&context.config);
  let script_meta_features =
    farmfe_plugin_script_meta::FarmPluginScriptMetaFeatures::new(&context.config);

  let hook_context = PluginHookContext {
    caller: None,
    meta: HashMap::default(),
  };

  let load_result = script_plugin
    .load(
      &PluginLoadHookParam {
        resolved_path: &path.to_string_lossy(),
        query: vec![],
        meta: HashMap::default(),
        module_id: path.to_string_lossy().to_string(),
      },
      &context,
      &hook_context,
    )
    .unwrap()
    .unwrap();

  let mut parse_result = script_plugin
    .parse(
      &PluginParseHookParam {
        module_id: ModuleId::new(&path.to_string_lossy(), "", base.to_str().unwrap()),
        resolved_path: path.to_string_lossy().to_string(),
        query: vec![],
        module_type: load_result.module_type.clone(),
        content: Arc::new(load_result.content.clone()),
      },
      &context,
      &hook_context,
    )
    .unwrap()
    .unwrap();

  let mut module = Module::new(ModuleId::new(
    &path.to_string_lossy(),
    "",
    base.to_str().unwrap(),
  ));

  module.module_type = load_result.module_type;

  let mut process_module_param = PluginProcessModuleHookParam {
    module_id: &module.id,
    module_type: &module.module_type,
    meta: &mut parse_result,
    content: &mut Arc::new(load_result.content),
    source_map_chain: &mut vec![],
  };
  script_plugin
    .process_module(&mut process_module_param, &context)
    .unwrap();

  module.meta = Box::new(parse_result);

  let mut analyze_deps_param = PluginAnalyzeDepsHookParam {
    module: &module,
    deps: vec![],
  };

  script_plugin
    .analyze_deps(&mut analyze_deps_param, &context)
    .unwrap();

  let mut deps = analyze_deps_param.deps;

  script_plugin
    .finalize_module(
      &mut PluginFinalizeModuleHookParam {
        module: &mut module,
        deps: &mut deps,
      },
      &context,
    )
    .unwrap();
  script_meta_features
    .finalize_module(
      &mut PluginFinalizeModuleHookParam {
        module: &mut module,
        deps: &mut deps,
      },
      &context,
    )
    .unwrap();

  (module, deps)
}

pub fn build_module(path: PathBuf, base: PathBuf) -> Module {
  build_module_deps(path, base).0
}