Skip to content

Commit bd3159f

Browse files
committed
.
1 parent 06639f2 commit bd3159f

File tree

3 files changed

+56
-15
lines changed

3 files changed

+56
-15
lines changed

packages/swc-plugin-workflow/transform/src/lib.rs

Lines changed: 51 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -189,8 +189,8 @@ pub struct StepTransform {
189189
// Track all declared identifiers in module scope to avoid collisions
190190
declared_identifiers: HashSet<String>,
191191
// Track object property step functions for hoisting in step mode
192-
// (parent_var_name, prop_name, arrow_expr, span)
193-
object_property_step_functions: Vec<(String, String, ArrowExpr, swc_core::common::Span)>,
192+
// (parent_var_name, prop_name, arrow_expr, span, parent_workflow_name)
193+
object_property_step_functions: Vec<(String, String, ArrowExpr, swc_core::common::Span, String)>,
194194
// Track nested step functions inside workflow functions for hoisting in step mode
195195
// (fn_name, fn_expr, span, closure_vars, was_arrow, parent_workflow_name)
196196
nested_step_functions: Vec<(
@@ -1230,8 +1230,13 @@ impl StepTransform {
12301230
parent_var_name: &str,
12311231
prop_name: &str,
12321232
is_workflow: bool,
1233+
workflow_name: Option<&str>,
12331234
) -> String {
1234-
let fn_name = format!("{}/{}", parent_var_name, prop_name);
1235+
let fn_name = if let Some(wf_name) = workflow_name {
1236+
format!("{}/{}/{}", wf_name, parent_var_name, prop_name)
1237+
} else {
1238+
format!("{}/{}", parent_var_name, prop_name)
1239+
};
12351240
let prefix = if is_workflow { "workflow" } else { "step" };
12361241
naming::format_name(prefix, &self.filename, &fn_name)
12371242
}
@@ -1283,6 +1288,9 @@ impl StepTransform {
12831288
prop_key.clone(),
12841289
arrow_expr.clone(),
12851290
arrow_expr.span,
1291+
self.current_workflow_function_name
1292+
.clone()
1293+
.unwrap_or_default(),
12861294
));
12871295

12881296
let span = arrow_expr.span;
@@ -1344,6 +1352,9 @@ impl StepTransform {
13441352
prop_key.clone(),
13451353
arrow_from_fn,
13461354
span,
1355+
self.current_workflow_function_name
1356+
.clone()
1357+
.unwrap_or_default(),
13471358
));
13481359

13491360
let _ = fn_expr; // Drop the mutable reference
@@ -1413,18 +1424,27 @@ impl StepTransform {
14131424
prop_key.clone(),
14141425
arrow_from_method,
14151426
span,
1427+
self.current_workflow_function_name
1428+
.clone()
1429+
.unwrap_or_default(),
14161430
));
14171431

14181432
// Now handle the transformation based on mode
14191433
match self.mode {
14201434
TransformMode::Step => {
14211435
// In step mode, replace method with key-value property referencing the hoisted variable
1422-
let hoist_var_name =
1423-
format!("{}${}", parent_var_name, prop_key);
1436+
let hoist_var_name = if let Some(ref workflow_name) =
1437+
self.current_workflow_function_name
1438+
{
1439+
format!("{}${}${}", workflow_name, parent_var_name, prop_key)
1440+
} else {
1441+
format!("{}${}", parent_var_name, prop_key)
1442+
};
14241443
let step_id = self.create_object_property_id(
14251444
parent_var_name,
14261445
&prop_key,
14271446
false,
1447+
self.current_workflow_function_name.as_deref(),
14281448
);
14291449
// Replace the method with a key-value property referencing the hoisted function
14301450
*boxed_prop = Box::new(Prop::KeyValue(KeyValueProp {
@@ -1447,6 +1467,7 @@ impl StepTransform {
14471467
parent_var_name,
14481468
&prop_key,
14491469
false,
1470+
self.current_workflow_function_name.as_deref(),
14501471
);
14511472
*boxed_prop = Box::new(Prop::KeyValue(KeyValueProp {
14521473
key: method_prop.key.clone(),
@@ -1479,12 +1500,23 @@ impl StepTransform {
14791500
prop_key: &str,
14801501
_span: swc_core::common::Span,
14811502
) {
1482-
let step_id = self.create_object_property_id(parent_var_name, prop_key, false);
1503+
let step_id = self.create_object_property_id(
1504+
parent_var_name,
1505+
prop_key,
1506+
false,
1507+
self.current_workflow_function_name.as_deref(),
1508+
);
14831509

14841510
match self.mode {
14851511
TransformMode::Step => {
14861512
// In step mode, replace with reference to hoisted variable
1487-
let hoist_var_name = format!("{}${}", parent_var_name, prop_key);
1513+
let hoist_var_name = if let Some(ref workflow_name) =
1514+
self.current_workflow_function_name
1515+
{
1516+
format!("{}${}${}", workflow_name, parent_var_name, prop_key)
1517+
} else {
1518+
format!("{}${}", parent_var_name, prop_key)
1519+
};
14881520
*kv_prop.value = Expr::Ident(Ident::new(
14891521
hoist_var_name.into(),
14901522
DUMMY_SP,
@@ -3100,10 +3132,19 @@ impl VisitMut for StepTransform {
31003132
let hoisting_info: Vec<_> = self
31013133
.object_property_step_functions
31023134
.iter()
3103-
.map(|(parent_var, prop_name, arrow_expr, _span)| {
3104-
let hoist_var_name = format!("{}${}", parent_var, prop_name);
3135+
.map(|(parent_var, prop_name, arrow_expr, _span, workflow_name)| {
3136+
let hoist_var_name = if !workflow_name.is_empty() {
3137+
format!("{}${}${}", workflow_name, parent_var, prop_name)
3138+
} else {
3139+
format!("{}${}", parent_var, prop_name)
3140+
};
3141+
let wf_name = if workflow_name.is_empty() {
3142+
None
3143+
} else {
3144+
Some(workflow_name.as_str())
3145+
};
31053146
let step_id =
3106-
self.create_object_property_id(parent_var, prop_name, false);
3147+
self.create_object_property_id(parent_var, prop_name, false, wf_name);
31073148
(
31083149
hoist_var_name,
31093150
arrow_expr.clone(),
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
import { registerStepFunction } from "workflow/internal/private";
2-
/**__internal_workflows{"workflows":{"input.js":{"example":{"workflowId":"workflow//input.js//example"}}},"steps":{"input.js":{"arrowStep":{"stepId":"step//input.js//arrowStep"},"helpers/objectStep":{"stepId":"step//input.js//helpers/objectStep"},"letArrowStep":{"stepId":"step//input.js//letArrowStep"},"step":{"stepId":"step//input.js//step"},"varArrowStep":{"stepId":"step//input.js//varArrowStep"}}}}*/;
2+
/**__internal_workflows{"workflows":{"input.js":{"example":{"workflowId":"workflow//input.js//example"}}},"steps":{"input.js":{"arrowStep":{"stepId":"step//input.js//arrowStep"},"helpers/objectStep":{"stepId":"step//input.js//example/helpers/objectStep"},"letArrowStep":{"stepId":"step//input.js//letArrowStep"},"step":{"stepId":"step//input.js//step"},"varArrowStep":{"stepId":"step//input.js//varArrowStep"}}}}*/;
33
// Function declaration step
44
async function example$step(a, b) {
55
return a + b;
66
}
77
var example$arrowStep = async (x, y)=>x * y;
88
var example$letArrowStep = async (x, y)=>x - y;
99
var example$varArrowStep = async (x, y)=>x / y;
10-
var helpers$objectStep = async (x, y)=>{
10+
var example$helpers$objectStep = async (x, y)=>{
1111
return x + y + 10;
1212
};
1313
export async function example(a, b) {
@@ -18,4 +18,4 @@ registerStepFunction("step//input.js//example/step", example$step);
1818
registerStepFunction("step//input.js//example/arrowStep", example$arrowStep);
1919
registerStepFunction("step//input.js//example/letArrowStep", example$letArrowStep);
2020
registerStepFunction("step//input.js//example/varArrowStep", example$varArrowStep);
21-
registerStepFunction("step//input.js//helpers/objectStep", helpers$objectStep);
21+
registerStepFunction("step//input.js//example/helpers/objectStep", example$helpers$objectStep);

packages/swc-plugin-workflow/transform/tests/fixture/nested-step-in-workflow/output-workflow.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/**__internal_workflows{"workflows":{"input.js":{"example":{"workflowId":"workflow//input.js//example"}}},"steps":{"input.js":{"arrowStep":{"stepId":"step//input.js//arrowStep"},"helpers/objectStep":{"stepId":"step//input.js//helpers/objectStep"},"letArrowStep":{"stepId":"step//input.js//letArrowStep"},"step":{"stepId":"step//input.js//step"},"varArrowStep":{"stepId":"step//input.js//varArrowStep"}}}}*/;
1+
/**__internal_workflows{"workflows":{"input.js":{"example":{"workflowId":"workflow//input.js//example"}}},"steps":{"input.js":{"arrowStep":{"stepId":"step//input.js//arrowStep"},"helpers/objectStep":{"stepId":"step//input.js//example/helpers/objectStep"},"letArrowStep":{"stepId":"step//input.js//letArrowStep"},"step":{"stepId":"step//input.js//step"},"varArrowStep":{"stepId":"step//input.js//varArrowStep"}}}}*/;
22
export async function example(a, b) {
33
var step = globalThis[Symbol.for("WORKFLOW_USE_STEP")]("step//input.js//example/step");
44
// Arrow function with const
@@ -9,7 +9,7 @@ export async function example(a, b) {
99
var varArrowStep = globalThis[Symbol.for("WORKFLOW_USE_STEP")]("step//input.js//example/varArrowStep");
1010
// Object with step method
1111
const helpers = {
12-
objectStep: globalThis[Symbol.for("WORKFLOW_USE_STEP")]("step//input.js//helpers/objectStep")
12+
objectStep: globalThis[Symbol.for("WORKFLOW_USE_STEP")]("step//input.js//example/helpers/objectStep")
1313
};
1414
const val = await step(a, b);
1515
const val2 = await arrowStep(a, b);

0 commit comments

Comments
 (0)