Skip to content

Commit 9f076c2

Browse files
committed
Split out more functions
1 parent bb4f131 commit 9f076c2

File tree

2 files changed

+48
-32
lines changed

2 files changed

+48
-32
lines changed

src/lib.rs

Lines changed: 41 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,12 @@ mod swc_utils;
2424

2525
use crate::{
2626
hast_util_to_swc::hast_util_to_swc as to_swc,
27-
mdx_plugin_recma_document::{mdx_plugin_recma_document, Options as DocumentOptions},
28-
mdx_plugin_recma_jsx_rewrite::{mdx_plugin_recma_jsx_rewrite, Options as RewriteOptions},
27+
mdx_plugin_recma_document::{
28+
mdx_plugin_recma_document as wrap_document, Options as DocumentOptions,
29+
},
30+
mdx_plugin_recma_jsx_rewrite::{
31+
mdx_plugin_recma_jsx_rewrite as jsx_rewrite, Options as RewriteOptions,
32+
},
2933
swc::{parse_esm, parse_expression, serialize},
3034
swc_util_build_jsx::{swc_util_build_jsx, Options as BuildOptions},
3135
};
@@ -34,7 +38,7 @@ use markdown::{
3438
message::{self, Message},
3539
to_mdast, Constructs, Location, ParseOptions,
3640
};
37-
use swc_core::alloc::collections::FxHashSet;
41+
use swc_core::{alloc::collections::FxHashSet, common::Span};
3842

3943
pub use crate::configuration::{MdxConstructs, MdxParseOptions, Options};
4044
pub use crate::mdast_util_to_hast::mdast_util_to_hast;
@@ -60,7 +64,11 @@ pub use crate::mdx_plugin_recma_document::JsxRuntime;
6064
pub fn compile(value: &str, options: &Options) -> Result<String, message::Message> {
6165
let mdast = mdast_util_from_mdx(value, options)?;
6266
let hast = mdast_util_to_hast(&mdast);
63-
let mut program = hast_util_to_swc(&hast, value, options)?;
67+
let location = Location::new(value.as_bytes());
68+
let mut explicit_jsxs = FxHashSet::default();
69+
let mut program = hast_util_to_swc(&hast, options, Some(&location), &mut explicit_jsxs)?;
70+
mdx_plugin_recma_document(&mut program, &options, Some(&location))?;
71+
mdx_plugin_recma_jsx_rewrite(&mut program, &options, Some(&location), &explicit_jsxs)?;
6472
Ok(serialize(&mut program.module, Some(&program.comments)))
6573
}
6674

@@ -137,43 +145,51 @@ pub fn mdast_util_from_mdx(
137145
/// Compile hast into SWC’s ES AST.
138146
pub fn hast_util_to_swc(
139147
hast: &hast::Node,
140-
value: &str,
141148
options: &Options,
149+
location: Option<&Location>,
150+
explicit_jsxs: &mut FxHashSet<Span>,
142151
) -> Result<Program, markdown::message::Message> {
152+
to_swc(&hast, options.filepath.clone(), location, explicit_jsxs)
153+
}
154+
155+
/// Wrap the SWC ES AST nodes coming from hast into a whole document.
156+
pub fn mdx_plugin_recma_document(
157+
program: &mut Program,
158+
options: &Options,
159+
location: Option<&Location>,
160+
) -> Result<(), markdown::message::Message> {
143161
let document_options = DocumentOptions {
144162
pragma: options.pragma.clone(),
145163
pragma_frag: options.pragma_frag.clone(),
146164
pragma_import_source: options.pragma_import_source.clone(),
147165
jsx_import_source: options.jsx_import_source.clone(),
148166
jsx_runtime: options.jsx_runtime,
149167
};
168+
wrap_document(program, &document_options, location)
169+
}
170+
171+
/// Rewrite JSX in an MDX file so that components can be passed in and provided.
172+
/// Also compiles JSX to function calls unless `options.jsx` is true.
173+
pub fn mdx_plugin_recma_jsx_rewrite(
174+
program: &mut Program,
175+
options: &Options,
176+
location: Option<&Location>,
177+
explicit_jsxs: &FxHashSet<Span>,
178+
) -> Result<(), markdown::message::Message> {
150179
let rewrite_options = RewriteOptions {
151180
development: options.development,
152181
provider_import_source: options.provider_import_source.clone(),
153182
};
154-
let build_options = BuildOptions {
155-
development: options.development,
156-
};
157183

158-
let mut explicit_jsxs = FxHashSet::default();
159-
let location = Location::new(value.as_bytes());
160-
let mut program = to_swc(
161-
&hast,
162-
options.filepath.clone(),
163-
Some(&location),
164-
&mut explicit_jsxs,
165-
)?;
166-
mdx_plugin_recma_document(&mut program, &document_options, Some(&location))?;
167-
mdx_plugin_recma_jsx_rewrite(
168-
&mut program,
169-
&rewrite_options,
170-
Some(&location),
171-
explicit_jsxs,
172-
);
184+
jsx_rewrite(program, &rewrite_options, location, explicit_jsxs);
173185

174186
if !options.jsx {
175-
swc_util_build_jsx(&mut program, &build_options, Some(&location))?;
187+
let build_options = BuildOptions {
188+
development: options.development,
189+
};
190+
191+
swc_util_build_jsx(program, &build_options, location)?;
176192
}
177193

178-
Ok(program)
194+
Ok(())
179195
}

src/mdx_plugin_recma_jsx_rewrite.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ pub fn mdx_plugin_recma_jsx_rewrite(
4343
program: &mut Program,
4444
options: &Options,
4545
location: Option<&Location>,
46-
explicit_jsxs: FxHashSet<Span>,
46+
explicit_jsxs: &FxHashSet<Span>,
4747
) {
4848
let mut state = State {
4949
scopes: vec![],
@@ -137,7 +137,7 @@ struct Scope {
137137
}
138138

139139
/// Context.
140-
#[derive(Debug, Default, Clone)]
140+
#[derive(Debug, Clone)]
141141
struct State<'a> {
142142
/// Location info.
143143
location: Option<&'a Location>,
@@ -157,7 +157,7 @@ struct State<'a> {
157157
/// helper function to throw when they are missing.
158158
create_error_helper: bool,
159159

160-
explicit_jsxs: FxHashSet<Span>,
160+
explicit_jsxs: &'a FxHashSet<Span>,
161161
}
162162

163163
impl State<'_> {
@@ -1044,7 +1044,7 @@ mod tests {
10441044

10451045
let mut program = hast_util_to_swc(&hast, filepath, Some(&location), &mut explicit_jsxs)?;
10461046
mdx_plugin_recma_document(&mut program, &DocumentOptions::default(), Some(&location))?;
1047-
mdx_plugin_recma_jsx_rewrite(&mut program, options, Some(&location), explicit_jsxs);
1047+
mdx_plugin_recma_jsx_rewrite(&mut program, options, Some(&location), &explicit_jsxs);
10481048
Ok(serialize(&mut program.module, Some(&program.comments)))
10491049
}
10501050

@@ -1867,7 +1867,7 @@ function _missingMdxReference(id, component, place) {
18671867
}))))],
18681868
},
18691869
};
1870-
mdx_plugin_recma_jsx_rewrite(&mut program, &Options::default(), None, explicit_jsxs);
1870+
mdx_plugin_recma_jsx_rewrite(&mut program, &Options::default(), None, &explicit_jsxs);
18711871
assert_eq!(
18721872
serialize(&mut program.module, None),
18731873
"let a = <b/>;\n",
@@ -1899,7 +1899,7 @@ function _missingMdxReference(id, component, place) {
18991899
}))))],
19001900
},
19011901
};
1902-
mdx_plugin_recma_jsx_rewrite(&mut program, &Options::default(), None, explicit_jsxs);
1902+
mdx_plugin_recma_jsx_rewrite(&mut program, &Options::default(), None, &explicit_jsxs);
19031903
assert_eq!(
19041904
serialize(&mut program.module, None),
19051905
"let <invalid>;\n",
@@ -1931,7 +1931,7 @@ function _missingMdxReference(id, component, place) {
19311931
}))))],
19321932
},
19331933
};
1934-
mdx_plugin_recma_jsx_rewrite(&mut program, &Options::default(), None, explicit_jsxs);
1934+
mdx_plugin_recma_jsx_rewrite(&mut program, &Options::default(), None, &explicit_jsxs);
19351935
assert_eq!(
19361936
serialize(&mut program.module, None),
19371937
"let a;\n",

0 commit comments

Comments
 (0)