-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathlib.rs
81 lines (71 loc) · 2.65 KB
/
lib.rs
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
// libs
use serde::Deserialize;
use swc_core::ecma::ast::Program;
use swc_core::ecma::visit::{visit_mut_pass, VisitMutWith};
use swc_core::plugin::{
metadata::TransformPluginMetadataContextKind,
plugin_transform,
proxies::{PluginCommentsProxy, TransformPluginProgramMetadata},
};
// structs
use graphql_tag::structs::{GraphQLTagConfig, TransformVisitor};
use unique_identifier::UniqueIdentifierVisitor;
#[derive(Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Config {
import_sources: Option<Vec<String>>,
gql_tag_identifiers: Option<Vec<String>>,
strip: Option<bool>,
}
#[plugin_transform]
pub fn process_transform(program: Program, data: TransformPluginProgramMetadata) -> Program {
let mut file_path: String = String::new();
if let Some(name) = data.get_context(&TransformPluginMetadataContextKind::Filename) {
file_path = name;
}
let mut program = program;
let mut unique_visitor = UniqueIdentifierVisitor::new();
program.visit_mut_with(&mut visit_mut_pass(&mut unique_visitor));
let unique_fn_name = if unique_visitor.count > 0 {
format!("{}{}", unique_visitor.identifier, unique_visitor.count)
} else {
unique_visitor.identifier
};
let default_config = GraphQLTagConfig {
import_sources: vec!["@apollo/client".to_string(), "graphql-tag".into()],
gql_tag_identifiers: vec!["gql".to_string()],
strip: false,
file_path: String::new(),
unique_fn_name: unique_fn_name.clone(),
unique_fn_used: false,
};
let config = match data.get_transform_plugin_config() {
Some(config_str) => {
let plugin_config = serde_json::from_str::<Config>(&config_str);
match plugin_config {
Ok(config) => GraphQLTagConfig {
import_sources: config
.import_sources
.unwrap_or(default_config.import_sources),
gql_tag_identifiers: config
.gql_tag_identifiers
.unwrap_or(default_config.gql_tag_identifiers),
strip: config.strip.unwrap_or(false),
file_path,
unique_fn_name,
unique_fn_used: false,
},
Err(_) => {
println!("Got invalid config for graphql-tag-swc-plugin, using default config instead");
default_config
}
}
}
None => default_config,
};
program.visit_mut_with(&mut visit_mut_pass(TransformVisitor::new(
config,
PluginCommentsProxy,
)));
program
}