aboutsummaryrefslogtreecommitdiffstats
path: root/tests/test_utils/mdx.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_utils/mdx.rs')
-rw-r--r--tests/test_utils/mdx.rs221
1 files changed, 0 insertions, 221 deletions
diff --git a/tests/test_utils/mdx.rs b/tests/test_utils/mdx.rs
deleted file mode 100644
index 4481b78..0000000
--- a/tests/test_utils/mdx.rs
+++ /dev/null
@@ -1,221 +0,0 @@
-use crate::test_utils::{
- hast_util_to_swc::hast_util_to_swc,
- mdast_util_to_hast::mdast_util_to_hast,
- mdx_plugin_recma_document::{mdx_plugin_recma_document, Options as DocumentOptions},
- mdx_plugin_recma_jsx_rewrite::{mdx_plugin_recma_jsx_rewrite, Options as RewriteOptions},
- swc::{parse_esm, parse_expression, serialize},
-};
-use markdown::{to_mdast, Constructs, Location, ParseOptions};
-
-pub use super::mdx_plugin_recma_document::JsxRuntime;
-
-use swc_common::comments::{Comments, SingleThreadedComments};
-// use swc_ecma_transforms_react::{jsx, Options as JsxBuildOptions};
-// use swc_ecma_visit::VisitMutWith;
-
-// To do: use `Format`.
-/// Format the file is in (default: `Format::Detect`).
-#[allow(dead_code)]
-#[derive(Clone, Debug, Default, Eq, PartialEq)]
-pub enum Format {
- /// Use `Format::Markdown` for files with an extension in `md_extensions`
- /// and `Format::Mdx` otherwise.
- #[default]
- Detect,
- /// Treat file as MDX.
- Mdx,
- /// Treat file as plain vanilla markdown.
- Markdown,
-}
-
-// To do: use `OutputFormat`.
-/// Output format to generate (default: `OutputFormat::Program`).
-#[allow(dead_code)]
-#[derive(Clone, Debug, Default, Eq, PartialEq)]
-pub enum OutputFormat {
- /// The `Program` format will use import statements to import the JSX
- /// runtime (and optionally provider) and use an export statement to yield
- /// the `MDXContent` component.
- #[default]
- Program,
- /// The `FunctionBody` format will get the JSX runtime (and optionally
- /// provider) from `arguments[0]`, rewrite export statements, and use a
- /// return statement to yield what was exported.
- /// Normally, this output format will throw on `import` (and
- /// `export … from`) statements, but you can support them by setting
- /// `options.useDynamicImport`.
- FunctionBody,
-}
-
-/// Configuration (optional).
-#[derive(Clone, Debug, Default)]
-pub struct Options {
- // /// List of markdown extensions, with dot.
- // ///
- // /// Default: `vec![".md".into(), ".markdown".into(), ".mdown".into(), ".mkdn".into(), ".mkd".into(), ".mdwn".into(), ".mkdown".into(), ".ron".into()]`.
- // pub md_extensions: Option<Vec<String>>,
- // /// List of MDX extensions, with dot.
- // ///
- // /// Default: `vec![".mdx".into()]`.
- // pub mdx_extensions: Option<Vec<String>>,
- // /// Format the file is in (default: `Format::Detect`).
- // pub format: Format,
- // /// To do: support `output_format: FunctionBody
- // /// Output format to generate (default: `OutputFormat::Program`).
- // ///
- // /// In most cases `OutputFormat::Program` should be used, as it results in a
- // /// whole program.
- // /// `OutputFormat::FunctionBody` can be used to compile to code that can be
- // /// `eval`ed.
- // /// In some cases, you might want to do that, such as when compiling on the
- // /// server and running on the client.
- // pub output_format: OutputFormat,
- // /// Whether to compile to dynamic import expressions (default:
- // /// `false`).
- // ///
- // /// This option applies when `options.output_format` is
- // /// `OutputFormat::FunctionBody`.
- // ///
- // /// This project can turn import statements (`import x from 'y'`) into
- // /// dynamic imports (`const {x} = await import('y')`).
- // /// This is useful because import statements only work at the top level of
- // /// JavaScript modules, whereas `import()` is available inside function
- // /// bodies.
- // ///
- // /// When you turn `use_dynamic_import` on, you should probably set
- // /// `options.base_url` too.
- // pub use_dynamic_import: bool,
- // /// Resolve `import`s (and `export … from`, `import.meta.url`) from this
- // /// URL (default: `None`, example: `Some("https://example.com/".into())`).
- // ///
- // /// Relative specifiers are non-absolute URLs that start with `/`, `./`, or
- // /// `../`.
- // /// For example: `/index.js`, `./folder/file.js`, or `../main.js`.
- // ///
- // /// This option is useful when code will run in a different place.
- // /// One example is when `.mdx` files are in path *a* but compiled to path
- // /// *b* and imports should run relative the path *b*.
- // /// Another example is when evaluating code, whether in Node or a browser.
- // pub base_url: Option<String>,
- /// Whether to add extra information to error messages in generated code
- /// (default: `false`).
- pub development: bool,
-
- // To do: some alternative to generate source maps.
- // SourceMapGenerator
- /// Place to import a provider from (default: `None`, example:
- /// `Some("@mdx-js/react").into()`).
- ///
- /// Useful for runtimes that support context (React, Preact).
- /// The provider must export a `useMDXComponents`, which is called to
- /// access an object of components.
- pub provider_import_source: Option<String>,
-
- /// Whether to keep JSX (default: `false`).
- ///
- /// The default is to compile JSX away so that the resulting file is
- /// immediately runnable.
- pub jsx: bool,
-
- /// JSX runtime to use (default: `Some(JsxRuntime::Automatic)`).
- ///
- /// The classic runtime compiles to calls such as `h('p')`, the automatic
- /// runtime compiles to
- /// `import _jsx from '$importSource/jsx-runtime'\n_jsx('p')`.
- pub jsx_runtime: Option<JsxRuntime>,
-
- /// Place to import automatic JSX runtimes from (`Option<String>`, default:
- /// `Some("react".into())`).
- ///
- /// When in the automatic runtime, this is used to define an import for
- /// `_Fragment`, `_jsx`, and `_jsxs`.
- pub jsx_import_source: Option<String>,
-
- /// Pragma for JSX (default: `Some("React.createElement".into())`).
- ///
- /// When in the classic runtime, this is used as an identifier for function
- /// calls: `<x />` to `React.createElement('x')`.
- ///
- /// You should most probably define `pragma_frag` and `pragma_import_source`
- /// too when changing this.
- pub pragma: Option<String>,
-
- /// Pragma for JSX fragments (default: `Some("React.Fragment".into())`).
- ///
- /// When in the classic runtime, this is used as an identifier for
- /// fragments: `<>` to `React.createElement(React.Fragment)`.
- ///
- /// You should most probably define `pragma` and `pragma_import_source`
- /// too when changing this.
- pub pragma_frag: Option<String>,
-
- /// Where to import the identifier of `pragma` from (default:
- /// `Some("react".into())`).
- ///
- /// When in the classic runtime, this is used to import the `pragma`
- /// function.
- /// To illustrate with an example: when `pragma` is `"a.b"` and
- /// `pragma_import_source` is `"c"`, the following will be generated:
- /// `import a from 'c'`.
- pub pragma_import_source: Option<String>,
-}
-
-#[allow(dead_code)]
-pub fn mdx(value: &str, filepath: Option<String>, options: &Options) -> Result<String, String> {
- let parse_options = ParseOptions {
- constructs: Constructs::mdx(),
- mdx_esm_parse: Some(Box::new(parse_esm)),
- mdx_expression_parse: Some(Box::new(parse_expression)),
- ..ParseOptions::default()
- };
- let document_options = DocumentOptions {
- pragma: options.pragma.clone(),
- pragma_frag: options.pragma_frag.clone(),
- pragma_import_source: options.pragma_import_source.clone(),
- jsx_import_source: options.jsx_import_source.clone(),
- jsx_runtime: options.jsx_runtime,
- };
- let rewrite_options = RewriteOptions {
- development: options.development,
- provider_import_source: options.provider_import_source.clone(),
- };
-
- let location = Location::new(value.as_bytes());
- let mdast = to_mdast(value, &parse_options)?;
- let hast = mdast_util_to_hast(&mdast);
- let mut program = hast_util_to_swc(&hast, filepath, Some(&location))?;
- mdx_plugin_recma_document(&mut program, &document_options, Some(&location))?;
- mdx_plugin_recma_jsx_rewrite(&mut program, &rewrite_options, Some(&location));
-
- // Add our comments.
- let comments = SingleThreadedComments::default();
-
- for c in program.comments {
- comments.add_leading(c.span.lo, c);
- }
-
- println!("comments for swc: {:?}", comments);
-
- if !options.jsx {
- // let cm = Lrc::new(SourceMap::new(FilePathMapping::empty()));
- // let build_options = JsxBuildOptions {
- // next: Some(true),
- // throw_if_namespace: Some(false),
- // development: Some(options.development),
- // use_spread: Some(true),
- // refresh: None,
- // runtime: None,
- // import_source: None,
- // pragma: None,
- // pragma_frag: None,
- // use_builtins: None,
- // };
- // let mark = Mark::fresh(Mark::default());
- // program
- // .module
- // .visit_mut_with(&mut jsx(cm, Some(comments), build_options, mark));
- }
-
- // To do: include comments.
- Ok(serialize(&program.module))
-}