1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
use super::super::util; use ast::Expr; use hashbrown::HashMap; use inflector::Inflector; use serde::{Deserialize, Serialize}; use std::sync::Arc; use swc_atoms::JsWord; use swc_common::{ errors::{ColorConfig, Handler}, FileName, SourceMap, }; use swc_ecma_parser::{Parser, Session, SourceFileInput, Syntax}; #[derive(Debug, Default, Clone, Serialize, Deserialize)] #[serde(deny_unknown_fields, rename_all = "camelCase")] pub struct Config { #[serde(default)] pub globals: HashMap<String, String>, #[serde(flatten, default)] pub config: util::Config, } impl Config { pub(super) fn build(self, cm: Arc<SourceMap>) -> BuiltConfig { let handler = Handler::with_tty_emitter(ColorConfig::Always, false, true, Some(cm.clone())); let session = Session { handler: &handler }; BuiltConfig { config: self.config, globals: self .globals .into_iter() .map(|(k, v)| { let parse = |s| { let fm = cm .new_source_file(FileName::Custom(format!("<umd-config-{}.js>", s)), s); Parser::new( session, Syntax::default(), SourceFileInput::from(&*fm), None, ) .parse_expr() .map_err(|mut e| { e.emit(); () }) .unwrap() }; (k, parse(v)) }) .collect(), } } } #[derive(Clone)] pub(super) struct BuiltConfig { pub globals: HashMap<String, Box<Expr>>, pub config: util::Config, } impl BuiltConfig { pub fn global_name(&self, src: &JsWord) -> JsWord { if !src.contains("/") { return src.to_camel_case().into(); } return src.split("/").last().unwrap().to_camel_case().into(); } pub fn determine_export_name(&self, filename: FileName) -> Expr { match filename { FileName::Real(ref path) => { let s = match path.file_stem() { Some(stem) => self.global_name(&stem.to_string_lossy().into()), None => self.global_name(&path.display().to_string().into()), }; Expr::Ident(quote_ident!(s)) } _ => unimplemented!("determine_export_name({:?})", filename), } } }