Skip to content

Commit 1d897ea

Browse files
committed
🚧 accept dependencies
1 parent 18d267c commit 1d897ea

File tree

4 files changed

+102
-18
lines changed

4 files changed

+102
-18
lines changed

README.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
## TODO
22

33
- keep babel loader
4-
- are folders cleaning up?
54
- distribute package
65

76
## ROADMAP

dist/swc-plugin-nullstack.wasm

-33.3 KB
Binary file not shown.

src/loaders/inject_accept_to_module.rs

Lines changed: 68 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
use swc_common::DUMMY_SP;
22
use swc_core::ecma::{
33
ast::*,
4+
atoms::JsWord,
45
visit::{noop_visit_mut_type, VisitMut, VisitMutWith},
56
};
67

78
#[derive(Default)]
89
pub struct InjectAcceptVisitor {
910
class_names: Vec<Ident>,
11+
import_paths: Vec<JsWord>,
1012
}
1113

12-
fn runtime_accept(class_names: &[Ident]) -> ModuleItem {
14+
fn runtime_accept(class_names: &Vec<Ident>, import_paths: &Vec<JsWord>) -> ModuleItem {
1315
ModuleItem::Stmt(Stmt::Expr(ExprStmt {
1416
span: DUMMY_SP,
1517
expr: Box::new(Expr::Call(CallExpr {
@@ -27,13 +29,66 @@ fn runtime_accept(class_names: &[Ident]) -> ModuleItem {
2729
optional: false,
2830
}),
2931
}))),
30-
args: class_names
31-
.iter()
32-
.map(|class_name| ExprOrSpread {
32+
args: vec![
33+
ExprOrSpread {
3334
spread: None,
34-
expr: Box::new(Expr::Ident(class_name.clone())),
35-
})
36-
.collect(),
35+
expr: Box::new(Expr::Ident(Ident {
36+
span: DUMMY_SP,
37+
sym: "module".into(),
38+
optional: false,
39+
})),
40+
},
41+
ExprOrSpread {
42+
spread: None,
43+
expr: Box::new(Expr::Object(ObjectLit {
44+
span: DUMMY_SP,
45+
props: vec![
46+
PropOrSpread::Prop(Box::new(Prop::KeyValue(KeyValueProp {
47+
key: PropName::Ident(Ident {
48+
span: DUMMY_SP,
49+
sym: "klasses".into(),
50+
optional: false,
51+
}),
52+
value: Box::new(Expr::Array(ArrayLit {
53+
span: DUMMY_SP,
54+
elems: class_names
55+
.iter()
56+
.map(|class_name| {
57+
Some(ExprOrSpread {
58+
spread: None,
59+
expr: Box::new(Expr::Ident(class_name.clone())),
60+
})
61+
})
62+
.collect(),
63+
})),
64+
}))),
65+
PropOrSpread::Prop(Box::new(Prop::KeyValue(KeyValueProp {
66+
key: PropName::Ident(Ident {
67+
span: DUMMY_SP,
68+
sym: "dependencies".into(),
69+
optional: false,
70+
}),
71+
value: Box::new(Expr::Array(ArrayLit {
72+
span: DUMMY_SP,
73+
elems: import_paths
74+
.iter()
75+
.map(|import_path| {
76+
Some(ExprOrSpread {
77+
spread: None,
78+
expr: Box::new(Expr::Lit(Lit::Str(Str {
79+
span: DUMMY_SP,
80+
value: import_path.clone(),
81+
raw: None,
82+
}))),
83+
})
84+
})
85+
.collect(),
86+
})),
87+
}))),
88+
],
89+
})),
90+
},
91+
],
3792
type_args: None,
3893
})),
3994
}))
@@ -43,13 +98,13 @@ impl VisitMut for InjectAcceptVisitor {
4398
noop_visit_mut_type!();
4499

45100
fn visit_mut_module(&mut self, n: &mut Module) {
46-
self.class_names.push(Ident {
47-
span: DUMMY_SP,
48-
sym: "module".into(),
49-
optional: false,
50-
});
51101
n.visit_mut_children_with(self);
52-
n.body.push(runtime_accept(&self.class_names));
102+
n.body
103+
.push(runtime_accept(&self.class_names, &self.import_paths));
104+
}
105+
106+
fn visit_mut_import_decl(&mut self, n: &mut ImportDecl) {
107+
self.import_paths.push(n.src.value.clone());
53108
}
54109

55110
fn visit_mut_class_decl(&mut self, n: &mut ClassDecl) {

src/tests/inject_accept_to_module.rs

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,44 @@ test!(
88
syntax(),
99
|_| tr(InjectAcceptVisitor::default()),
1010
inject_accept,
11-
r#"class Component {};"#,
12-
r#"class Component {}; $runtime.accept(module, Component)"#
11+
r#"
12+
class Component {};
13+
"#,
14+
r#"
15+
class Component {};
16+
$runtime.accept(module, {klasses: [Component], dependencies: []})
17+
"#
1318
);
1419

1520
test!(
1621
syntax(),
1722
|_| tr(InjectAcceptVisitor::default()),
1823
inject_multiple_accept,
19-
r#"class Component {}; class Component2 {};"#,
20-
r#"class Component {}; class Component2 {}; $runtime.accept(module, Component, Component2)"#
24+
r#"
25+
class Component {};
26+
class Component2 {};
27+
"#,
28+
r#"
29+
class Component {};
30+
class Component2 {};
31+
$runtime.accept(module, {klasses: [Component, Component2], dependencies: []})
32+
"#
33+
);
34+
35+
test!(
36+
syntax(),
37+
|_| tr(InjectAcceptVisitor::default()),
38+
inject_multiple_imports,
39+
r#"
40+
import Nullstack from 'nullstack';
41+
import Logo from 'nullstack/logo';
42+
class Component {};
43+
class Component2 {};
44+
"#,
45+
r#"
46+
import Nullstack from 'nullstack';
47+
import Logo from 'nullstack/logo';
48+
class Component {};
49+
class Component2 {};
50+
$runtime.accept(module, {klasses: [Component, Component2], dependencies: ["nullstack", "nullstack/logo"]})"#
2151
);

0 commit comments

Comments
 (0)