Skip to content

Commit

Permalink
feat: add strip feature
Browse files Browse the repository at this point in the history
  • Loading branch information
rishabh3112 committed Dec 12, 2023
1 parent a43a69a commit c3b5b57
Show file tree
Hide file tree
Showing 7 changed files with 68 additions and 11 deletions.
3 changes: 3 additions & 0 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,15 @@ use graphql_tag::structs::{GraphQLTagConfig, TransformVisitor};
pub struct Config {
pub import_sources: Option<Vec<String>>,
pub gql_tag_identifiers: Option<Vec<String>>,
pub strip: Option<bool>,
}

#[plugin_transform]
pub fn process_transform(program: Program, data: TransformPluginProgramMetadata) -> Program {
let default_config = GraphQLTagConfig {
import_sources: vec!["@apollo/client".to_string(), "graphql-tag".into()],
gql_tag_identifiers: vec!["gql".to_string()],
strip: false,
};

let config = match data.get_transform_plugin_config() {
Expand All @@ -32,6 +34,7 @@ pub fn process_transform(program: Program, data: TransformPluginProgramMetadata)
gql_tag_identifiers: config
.gql_tag_identifiers
.unwrap_or(default_config.gql_tag_identifiers),
strip: config.strip.unwrap_or(false),
},
Err(_) => {
println!("Got invalid config for graphql-tag-swc-plugin, using default config instead");
Expand Down
1 change: 1 addition & 0 deletions tests/fixtures.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ fn graphql_tag_fixture(input: PathBuf) {
as_folder(TransformVisitor::new(GraphQLTagConfig {
import_sources: vec!["@apollo/client".to_string(), "graphql-tag".into()],
gql_tag_identifiers: vec!["gql".to_string()],
strip: false,
}))
},
&input,
Expand Down
4 changes: 2 additions & 2 deletions tests/fixtures/usage/returnFromFunctionExpression/output.js
Original file line number Diff line number Diff line change
Expand Up @@ -107,9 +107,9 @@ const getQuery = function() {
],
"loc": {
"start": 0,
"end": 119,
"end": 118,
"source": {
"body": "\n query testQuery($a: String!) {\n testQueryName(a: $a) @apple {\n a\n b\n c\n }\n }\n \n"
"body": "\n query testQuery($a: String!) {\n testQueryName(a: $a) @apple {\n a\n b\n c\n }\n }\n "
}
}
};
Expand Down
16 changes: 9 additions & 7 deletions transform/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,16 @@
use std::collections::HashMap;

// libs
use regex::Regex;
use swc_ecma_ast::*;
use swc_ecma_visit::{VisitMut, VisitMutWith};

// modules
pub mod parser;
pub mod structs;

// helpers
use parser::utils::strip_ignored_characters;

// structs
use structs::{GraphQLTagConfig, TransformVisitor};

Expand Down Expand Up @@ -95,7 +98,6 @@ impl VisitMut for TransformVisitor {

let template = &mut tag_tpl.tpl;
let expressions = template.exprs.clone();
let no_gql_line_regex = Regex::new(r#"(^\$\{.*\}$)"#).unwrap();

let mut data: String = "".into();
for quasi in &mut template.quasis {
Expand All @@ -104,11 +106,11 @@ impl VisitMut for TransformVisitor {

let gql_raw_string = data.to_string();

let gql_text = gql_raw_string
.lines()
.filter(|line| !no_gql_line_regex.is_match(line.trim()))
.map(|line| String::from(line) + "\n")
.collect();
let gql_text = if self.config.strip {
strip_ignored_characters(gql_raw_string)
} else {
gql_raw_string
};

let gql_swc_ast_result = parser::parse_graphql_tag(
gql_text,
Expand Down
2 changes: 1 addition & 1 deletion transform/src/parser/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ use swc_ecma_ast::*;

// modules
mod nodes;
mod utils;
pub mod utils;

// helpers
use nodes::document::create_document;
Expand Down
52 changes: 51 additions & 1 deletion transform/src/parser/utils.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use apollo_parser::ast::OperationType;
use apollo_parser::{ast::OperationType, Lexer, TokenKind};

use swc_ecma_ast::*;

pub fn get_key_value_node(key: String, value: Expr) -> PropOrSpread {
Expand All @@ -25,3 +26,52 @@ pub fn get_operation_token(operation_type: Option<OperationType>) -> String {

"query".into()
}

fn is_punctuator_token_kind(kind: TokenKind) -> bool {
match kind {
TokenKind::Bang
| TokenKind::Dollar
| TokenKind::Amp
| TokenKind::Spread
| TokenKind::Comma
| TokenKind::Colon
| TokenKind::Eq
| TokenKind::At
| TokenKind::LParen
| TokenKind::RParen
| TokenKind::LBracket
| TokenKind::RBracket
| TokenKind::LCurly
| TokenKind::RCurly
| TokenKind::Pipe
| TokenKind::Eof => true,
_ => false,
}
}

pub fn strip_ignored_characters(source: String) -> String {
let lexer = Lexer::new(source.as_str());

let mut stripped_body = String::new();
let mut was_last_added_token_non_punctuator = false;

for token in lexer.tokens() {
let kind = token.kind();
match kind {
TokenKind::Whitespace | TokenKind::Comment | TokenKind::Eof => continue,
_ if !is_punctuator_token_kind(kind) => {
if was_last_added_token_non_punctuator && kind != TokenKind::Spread {
stripped_body += " ";
}
stripped_body += token.data();
was_last_added_token_non_punctuator = true;
}
_ => {
stripped_body += token.data();
was_last_added_token_non_punctuator = false;
}
}
}

stripped_body
}
1 change: 1 addition & 0 deletions transform/src/structs/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ use swc_ecma_ast::Expr;
pub struct GraphQLTagConfig {
pub import_sources: Vec<String>,
pub gql_tag_identifiers: Vec<String>,
pub strip: bool,
}

pub struct TransformVisitor {
Expand Down

0 comments on commit c3b5b57

Please sign in to comment.