|
1 | 1 | import { Transformer } from '@parcel/plugin'; |
2 | 2 | import { compile } from '@mdx-js/mdx'; |
3 | | -import RemarkGFM from 'remark-gfm'; |
4 | | -import RehypePrism from '@mapbox/rehype-prism'; |
5 | | -import remarkEmbedder from '@remark-embedder/core'; |
6 | | -import oembedTransformer from '@remark-embedder/transformer-oembed'; |
7 | | -import RemarkFrontmatter from 'remark-frontmatter'; |
8 | | -import RemarkMdxFrontmatter from 'remark-mdx-frontmatter'; |
9 | 3 |
|
10 | | -const RemarkEmbedder = remarkEmbedder['default'], |
11 | | - OembedTransformer = oembedTransformer['default']; |
| 4 | +import MDXPreset from './source/preset'; |
| 5 | +import { BabelConfigFiles, MDXConfigFiles } from './source/utility'; |
12 | 6 |
|
13 | | -const ConfigExtensions = ['json', 'js', 'cjs', 'mjs', 'cts']; |
14 | | -/** |
15 | | - * @see {@link https://babeljs.io/docs/config-files#configuration-file-types} |
16 | | - */ |
17 | | -const BabelConfigFiles = [ |
18 | | - ...ConfigExtensions.map(extension => `babel.config.${extension}`), |
19 | | - ...ConfigExtensions.map(extension => `.babelrc.${extension}`), |
20 | | - '.babelrc' |
21 | | -]; |
| 7 | +export { MDXPreset }; |
| 8 | +export * from './source/utility'; |
22 | 9 |
|
23 | 10 | export default new Transformer({ |
| 11 | + /** |
| 12 | + * @returns {Promise<import('@mdx-js/mdx').CompileOptions>} |
| 13 | + */ |
24 | 14 | async loadConfig({ config }) { |
25 | | - const { contents } = await config.getConfig( |
26 | | - ['tsconfig.json', 'jsconfig.json', ...BabelConfigFiles], |
27 | | - { packageKey: 'babel' } |
28 | | - ); |
29 | | - return contents; |
30 | | - }, |
31 | | - async transform({ asset, config }) { |
| 15 | + const [ |
| 16 | + { contents: TSConfig }, |
| 17 | + { contents: BabelConfig }, |
| 18 | + { contents: MDXConfig } |
| 19 | + ] = await Promise.all([ |
| 20 | + config.getConfig(['tsconfig.json', 'jsconfig.json']), |
| 21 | + config.getConfig(BabelConfigFiles, { packageKey: 'babel' }), |
| 22 | + config.getConfig(MDXConfigFiles, { packageKey: 'mdx' }) |
| 23 | + ]); |
32 | 24 | /** |
33 | 25 | * @type {import('types-tsconfig').TSConfigJSON['compilerOptions']} |
34 | 26 | */ |
35 | 27 | const { jsx, jsxImportSource, jsxFactory, jsxFragmentFactory } = |
36 | | - config.compilerOptions || {}; |
| 28 | + TSConfig?.compilerOptions || {}; |
37 | 29 | /** |
38 | 30 | * @see {@link https://babeljs.io/docs/babel-preset-react#with-a-configuration-file-recommended} |
39 | 31 | */ |
40 | | - const [_, { runtime, importSource, pragma, pragmaFrag } = {}] = |
41 | | - config.presets?.find( |
| 32 | + const [_, ReactPreset = {}] = |
| 33 | + BabelConfig?.presets?.find( |
42 | 34 | preset => |
43 | 35 | preset instanceof Array && |
44 | 36 | preset[0] === '@babel/preset-react' |
45 | 37 | ) || []; |
46 | | - const source = await asset.getCode(); |
| 38 | + /** |
| 39 | + * @type {import('./source/utility').BabelReactPreset} |
| 40 | + */ |
| 41 | + const { runtime, importSource, pragma, pragmaFrag } = ReactPreset; |
47 | 42 |
|
48 | | - const vFile = await compile(source, { |
| 43 | + return { |
49 | 44 | jsxRuntime: runtime || (jsx === 'react' ? 'classic' : 'automatic'), |
50 | 45 | jsxImportSource: jsxImportSource || importSource, |
51 | 46 | pragma: pragma || jsxFactory, |
52 | 47 | pragmaFrag: pragmaFrag || jsxFragmentFactory, |
53 | | - remarkPlugins: [ |
54 | | - RemarkGFM, |
55 | | - [RemarkEmbedder, { transformers: [OembedTransformer] }], |
56 | | - RemarkFrontmatter, |
57 | | - RemarkMdxFrontmatter |
58 | | - ], |
59 | | - rehypePlugins: [RehypePrism] |
60 | | - }); |
| 48 | + ...MDXPreset, |
| 49 | + ...MDXConfig |
| 50 | + }; |
| 51 | + }, |
| 52 | + async transform({ asset, config }) { |
| 53 | + const source = await asset.getCode(); |
| 54 | + |
| 55 | + const vFile = await compile(source, config); |
61 | 56 | asset.type = 'jsx'; |
62 | 57 | asset.setCode(vFile + ''); |
63 | 58 |
|
|
0 commit comments