diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 000000000..3f872845d --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,2 @@ +[target.'cfg(target_arch = "wasm32")'] +rustflags = ["--cfg=swc_ast_unknown"] diff --git a/packages/swc-plugin-workflow/transform/Cargo.toml b/packages/swc-plugin-workflow/transform/Cargo.toml index 9bebfd3cc..214376e35 100644 --- a/packages/swc-plugin-workflow/transform/Cargo.toml +++ b/packages/swc-plugin-workflow/transform/Cargo.toml @@ -11,9 +11,13 @@ version = "0.1.0" [dependencies] -serde = { workspace = true } -serde_json = { workspace = true } -swc_core = { workspace = true, features = ["ecma_plugin_transform"] } +serde = { workspace = true } +serde_json = { workspace = true } +swc_core = { workspace = true, features = ["ecma_plugin_transform"] } [dev-dependencies] -testing = { workspace = true } \ No newline at end of file +testing = { workspace = true } + + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(swc_ast_unknown)'] } diff --git a/packages/swc-plugin-workflow/transform/src/lib.rs b/packages/swc-plugin-workflow/transform/src/lib.rs index b99ded59a..d0d2fe57c 100644 --- a/packages/swc-plugin-workflow/transform/src/lib.rs +++ b/packages/swc-plugin-workflow/transform/src/lib.rs @@ -190,7 +190,8 @@ pub struct StepTransform { declared_identifiers: HashSet, // Track object property step functions for hoisting in step mode // (parent_var_name, prop_name, arrow_expr, span, parent_workflow_name) - object_property_step_functions: Vec<(String, String, ArrowExpr, swc_core::common::Span, String)>, + object_property_step_functions: + Vec<(String, String, ArrowExpr, swc_core::common::Span, String)>, // Track nested step functions inside workflow functions for hoisting in step mode // (fn_name, fn_expr, span, closure_vars, was_arrow, parent_workflow_name) nested_step_functions: Vec<( @@ -332,6 +333,8 @@ impl ClosureVariableCollector { BlockStmtOrExpr::Expr(expr) => { collector.collect_from_expr(expr); } + #[cfg(swc_ast_unknown)] + _ => panic!("unknown node"), } // Return closure vars sorted for deterministic output @@ -362,6 +365,8 @@ impl ClosureVariableCollector { ObjectPatProp::Rest(rest) => { self.collect_param_names(&rest.arg); } + #[cfg(swc_ast_unknown)] + _ => panic!("unknown node"), } } } @@ -434,6 +439,8 @@ impl ClosureVariableCollector { VarDeclOrExpr::Expr(expr) => { self.collect_from_expr(expr); } + #[cfg(swc_ast_unknown)] + _ => panic!("unknown node"), } } if let Some(test) = &for_stmt.test { @@ -474,6 +481,8 @@ impl ClosureVariableCollector { ObjectPatProp::Rest(rest) => { self.collect_declared_names(&rest.arg); } + #[cfg(swc_ast_unknown)] + _ => panic!("unknown node"), } } } @@ -544,6 +553,8 @@ impl ClosureVariableCollector { PropOrSpread::Spread(spread) => { self.collect_from_expr(&spread.expr); } + #[cfg(swc_ast_unknown)] + _ => panic!("unknown node"), } } } @@ -1175,6 +1186,8 @@ impl StepTransform { self.declared_identifiers .insert(namespace.local.sym.to_string()); } + #[cfg(swc_ast_unknown)] + _ => continue, } } } @@ -1210,6 +1223,8 @@ impl StepTransform { ObjectPatProp::Rest(rest) => { self.collect_idents_from_pat(&rest.arg); } + #[cfg(swc_ast_unknown)] + _ => panic!("unknown node"), } } } @@ -1436,7 +1451,10 @@ impl StepTransform { let hoist_var_name = if let Some(ref workflow_name) = self.current_workflow_function_name { - format!("{}${}${}", workflow_name, parent_var_name, prop_key) + format!( + "{}${}${}", + workflow_name, parent_var_name, prop_key + ) } else { format!("{}${}", parent_var_name, prop_key) }; @@ -1510,13 +1528,12 @@ impl StepTransform { match self.mode { TransformMode::Step => { // In step mode, replace with reference to hoisted variable - let hoist_var_name = if let Some(ref workflow_name) = - self.current_workflow_function_name - { - format!("{}${}${}", workflow_name, parent_var_name, prop_key) - } else { - format!("{}${}", parent_var_name, prop_key) - }; + let hoist_var_name = + if let Some(ref workflow_name) = self.current_workflow_function_name { + format!("{}${}${}", workflow_name, parent_var_name, prop_key) + } else { + format!("{}${}", parent_var_name, prop_key) + }; *kv_prop.value = Expr::Ident(Ident::new( hoist_var_name.into(), DUMMY_SP, @@ -1584,6 +1601,8 @@ impl StepTransform { // For now, skip them return None; } + #[cfg(swc_ast_unknown)] + _ => panic!("unknown ast"), }; Some(PropOrSpread::Prop(Box::new(Prop::KeyValue(KeyValueProp { @@ -1606,6 +1625,8 @@ impl StepTransform { expr: Box::new(self.pat_to_expr(&rest.arg)), })) } + #[cfg(swc_ast_unknown)] + _ => panic!("unknown node"), } }) .collect(); @@ -1671,7 +1692,10 @@ impl StepTransform { }); } return true; - } else if detect_similar_strings(&value.to_string_lossy().to_string(), "use step") { + } else if detect_similar_strings( + &value.to_string_lossy().to_string(), + "use step", + ) { emit_error(WorkflowErrorKind::MisspelledDirective { span: *stmt_span, directive: value.to_string_lossy().to_string(), @@ -1714,7 +1738,10 @@ impl StepTransform { }); } return true; - } else if detect_similar_strings(&value.to_string_lossy().to_string(), "use workflow") { + } else if detect_similar_strings( + &value.to_string_lossy().to_string(), + "use workflow", + ) { emit_error(WorkflowErrorKind::MisspelledDirective { span: *stmt_span, directive: value.to_string_lossy().to_string(), @@ -1762,7 +1789,10 @@ impl StepTransform { location: DirectiveLocation::Module, }); } - } else if detect_similar_strings(&value.to_string_lossy().to_string(), "use step") { + } else if detect_similar_strings( + &value.to_string_lossy().to_string(), + "use step", + ) { emit_error(WorkflowErrorKind::MisspelledDirective { span: *span, directive: value.to_string_lossy().to_string(), @@ -1823,7 +1853,10 @@ impl StepTransform { location: DirectiveLocation::Module, }); } - } else if detect_similar_strings(&value.to_string_lossy().to_string(), "use workflow") { + } else if detect_similar_strings( + &value.to_string_lossy().to_string(), + "use workflow", + ) { emit_error(WorkflowErrorKind::MisspelledDirective { span: *span, directive: value.to_string_lossy().to_string(), @@ -2473,6 +2506,8 @@ impl StepTransform { ImportSpecifier::Named(named) => named.local.sym.to_string(), ImportSpecifier::Default(default) => default.local.sym.to_string(), ImportSpecifier::Namespace(ns) => ns.local.sym.to_string(), + #[cfg(swc_ast_unknown)] + _ => panic!("unknown node"), }; // Keep the import if it's used @@ -2572,6 +2607,8 @@ impl StepTransform { _ => false, // Keep other patterns } } + #[cfg(swc_ast_unknown)] + _ => panic!("unknown ast"), } }) } @@ -2693,14 +2730,14 @@ impl StepTransform { .unwrap_or(fn_name_str); // For auto-generated __default names (anonymous default exports), // normalize to "default" for the workflow ID - let id_name = - if (actual_name == "__default" || actual_name.starts_with("__default$")) - && fn_name_str == "default" - { - "default" - } else { - actual_name - }; + let id_name = if (actual_name == "__default" + || actual_name.starts_with("__default$")) + && fn_name_str == "default" + { + "default" + } else { + actual_name + }; let workflow_id = self.create_id(Some(id_name), DUMMY_SP, true); format!("\"{}\":{{\"workflowId\":\"{}\"}}", fn_name_str, workflow_id) }) @@ -3155,26 +3192,29 @@ impl VisitMut for StepTransform { let hoisting_info: Vec<_> = self .object_property_step_functions .iter() - .map(|(parent_var, prop_name, arrow_expr, _span, workflow_name)| { - let hoist_var_name = if !workflow_name.is_empty() { - format!("{}${}${}", workflow_name, parent_var, prop_name) - } else { - format!("{}${}", parent_var, prop_name) - }; - let wf_name = if workflow_name.is_empty() { - None - } else { - Some(workflow_name.as_str()) - }; - let step_id = - self.create_object_property_id(parent_var, prop_name, false, wf_name); - ( - hoist_var_name, - arrow_expr.clone(), - step_id, - parent_var.clone(), - ) - }) + .map( + |(parent_var, prop_name, arrow_expr, _span, workflow_name)| { + let hoist_var_name = if !workflow_name.is_empty() { + format!("{}${}${}", workflow_name, parent_var, prop_name) + } else { + format!("{}${}", parent_var, prop_name) + }; + let wf_name = if workflow_name.is_empty() { + None + } else { + Some(workflow_name.as_str()) + }; + let step_id = self.create_object_property_id( + parent_var, prop_name, false, wf_name, + ); + ( + hoist_var_name, + arrow_expr.clone(), + step_id, + parent_var.clone(), + ) + }, + ) .collect(); // Now drain and process @@ -3342,6 +3382,8 @@ impl VisitMut for StepTransform { }); } } + #[cfg(swc_ast_unknown)] + _ => panic!("unknown ast"), } } @@ -3478,6 +3520,8 @@ impl VisitMut for StepTransform { ImportSpecifier::Namespace(namespace) => { self.module_imports.insert(namespace.local.sym.to_string()); } + #[cfg(swc_ast_unknown)] + _ => panic!("unknown node"), } } } @@ -3599,6 +3643,8 @@ impl VisitMut for StepTransform { }, }); } + #[cfg(swc_ast_unknown)] + _ => panic!("unknown node"), } } ModuleItem::ModuleDecl(ModuleDecl::ExportNamed(named)) => { @@ -3641,6 +3687,8 @@ impl VisitMut for StepTransform { DefaultDecl::TsInterfaceDecl(_) => { // TypeScript interface is okay } + #[cfg(swc_ast_unknown)] + _ => panic!("unknown ast"), } } ModuleItem::ModuleDecl(ModuleDecl::ExportDefaultExpr(expr)) => { @@ -3818,8 +3866,7 @@ impl VisitMut for StepTransform { // Handle default workflow exports (all modes) // We need to: 1) find the export default position, 2) replace it with const declaration, // 3) add workflowId assignment, 4) add export default at the end - if !self.default_workflow_exports.is_empty() - { + if !self.default_workflow_exports.is_empty() { let default_workflows: Vec<_> = self.default_workflow_exports.drain(..).collect(); let default_exports: Vec<_> = self.default_exports_to_replace.drain(..).collect(); @@ -4627,22 +4674,20 @@ impl VisitMut for StepTransform { let error_expr = Expr::New(NewExpr { span: DUMMY_SP, ctxt: SyntaxContext::empty(), - callee: Box::new(Expr::Ident( - Ident::new( - "Error".into(), - DUMMY_SP, - SyntaxContext::empty(), - ), - )), + callee: Box::new(Expr::Ident(Ident::new( + "Error".into(), + DUMMY_SP, + SyntaxContext::empty(), + ))), args: Some(vec![ExprOrSpread { spread: None, - expr: Box::new(Expr::Lit( - Lit::Str(Str { + expr: Box::new(Expr::Lit(Lit::Str( + Str { span: DUMMY_SP, value: error_msg.into(), raw: None, - }), - )), + }, + ))), }]), type_args: None, }); @@ -4650,12 +4695,10 @@ impl VisitMut for StepTransform { BlockStmtOrExpr::BlockStmt(BlockStmt { span: DUMMY_SP, ctxt: SyntaxContext::empty(), - stmts: vec![Stmt::Throw( - ThrowStmt { - span: DUMMY_SP, - arg: Box::new(error_expr), - }, - )], + stmts: vec![Stmt::Throw(ThrowStmt { + span: DUMMY_SP, + arg: Box::new(error_expr), + })], }), ); @@ -5049,6 +5092,8 @@ impl VisitMut for StepTransform { )], }) } + #[cfg(swc_ast_unknown)] + _ => panic!("unknown ast"), }, is_generator: false, is_async: cloned_arrow.is_async, @@ -5577,6 +5622,8 @@ impl VisitMut for StepTransform { arg: Some(expr), })], }), + #[cfg(swc_ast_unknown)] + _ => panic!("unknown ast"), }, is_generator: false, is_async: cloned_arrow.is_async, @@ -6152,6 +6199,8 @@ impl VisitMut for StepTransform { ], }) } + #[cfg(swc_ast_unknown)] + _ => panic!("unknown ast"), }, is_generator: false, is_async: cloned_arrow.is_async,