Skip to content

Commit 2466bcf

Browse files
committed
[refactor] support Custom Configuration files
[add] jsconfig.json for Type Checking
1 parent 6d5c2d2 commit 2466bcf

File tree

7 files changed

+98
-42
lines changed

7 files changed

+98
-42
lines changed

ReadMe.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ Unofficial [MDX][1] 3 [transformer plugin][2] for [Parcel][3] 2
55
[![NPM Dependency](https://img.shields.io/librariesio/github/EasyWebApp/Parcel-transformer-MDX.svg)][4]
66
[![CI & CD](https://github.com/EasyWebApp/Parcel-transformer-MDX/actions/workflows/main.yml/badge.svg)][5]
77

8+
[![NPM](https://nodei.co/npm/parcel-transformer-mdx.png?downloads=true&downloadRank=true&stars=true)][6]
9+
810
## Supported features
911

1012
1. [GitHub flavored Markdown (GFM)](https://github.com/remarkjs/remark-gfm)
@@ -102,3 +104,4 @@ https://github.com/parcel-bundler/parcel/pull/7922
102104
[3]: https://parceljs.org/
103105
[4]: https://libraries.io/npm/parcel-transformer-mdx
104106
[5]: https://github.com/EasyWebApp/Parcel-transformer-MDX/actions/workflows/main.yml
107+
[6]: https://nodei.co/npm/parcel-transformer-mdx/

index.js

Lines changed: 32 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,58 @@
11
import { Transformer } from '@parcel/plugin';
22
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';
93

10-
const RemarkEmbedder = remarkEmbedder['default'],
11-
OembedTransformer = oembedTransformer['default'];
4+
import MDXPreset from './source/preset';
5+
import { BabelConfigFiles, MDXConfigFiles } from './source/utility';
126

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';
229

2310
export default new Transformer({
11+
/**
12+
* @returns {Promise<import('@mdx-js/mdx').CompileOptions>}
13+
*/
2414
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+
]);
3224
/**
3325
* @type {import('types-tsconfig').TSConfigJSON['compilerOptions']}
3426
*/
3527
const { jsx, jsxImportSource, jsxFactory, jsxFragmentFactory } =
36-
config.compilerOptions || {};
28+
TSConfig?.compilerOptions || {};
3729
/**
3830
* @see {@link https://babeljs.io/docs/babel-preset-react#with-a-configuration-file-recommended}
3931
*/
40-
const [_, { runtime, importSource, pragma, pragmaFrag } = {}] =
41-
config.presets?.find(
32+
const [_, ReactPreset = {}] =
33+
BabelConfig?.presets?.find(
4234
preset =>
4335
preset instanceof Array &&
4436
preset[0] === '@babel/preset-react'
4537
) || [];
46-
const source = await asset.getCode();
38+
/**
39+
* @type {import('./source/utility').BabelReactPreset}
40+
*/
41+
const { runtime, importSource, pragma, pragmaFrag } = ReactPreset;
4742

48-
const vFile = await compile(source, {
43+
return {
4944
jsxRuntime: runtime || (jsx === 'react' ? 'classic' : 'automatic'),
5045
jsxImportSource: jsxImportSource || importSource,
5146
pragma: pragma || jsxFactory,
5247
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);
6156
asset.type = 'jsx';
6257
asset.setCode(vFile + '');
6358

jsconfig.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"compilerOptions": {
3+
"module": "Node16",
4+
"moduleResolution": "Node16"
5+
},
6+
"include": ["**/*"]
7+
}

package.json

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "parcel-transformer-mdx",
3-
"version": "0.3.4",
3+
"version": "0.4.0",
44
"license": "LGPL-3.0-or-later",
55
"author": "[email protected]",
66
"description": "Unofficial MDX 3 transformer plugin for Parcel 2",
@@ -40,7 +40,8 @@
4040
"husky": "^9.1.4",
4141
"lint-staged": "^15.2.8",
4242
"prettier": "^3.3.3",
43-
"types-tsconfig": "^2.1.1"
43+
"types-tsconfig": "^2.1.1",
44+
"typescript": "^5.5.4"
4445
},
4546
"prettier": {
4647
"singleQuote": true,
@@ -53,6 +54,6 @@
5354
},
5455
"scripts": {
5556
"prepare": "husky",
56-
"test": "lint-staged"
57+
"test": "lint-staged && tsc -p jsconfig.json --noEmit"
5758
}
5859
}

pnpm-lock.yaml

Lines changed: 10 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

source/preset.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import RemarkGFM from 'remark-gfm';
2+
import RehypePrism from '@mapbox/rehype-prism';
3+
import RemarkFrontmatter from 'remark-frontmatter';
4+
import RemarkMdxFrontmatter from 'remark-mdx-frontmatter';
5+
import remarkEmbedder from '@remark-embedder/core';
6+
import oembedTransformer from '@remark-embedder/transformer-oembed';
7+
8+
const RemarkEmbedder = remarkEmbedder['default'],
9+
OembedTransformer = oembedTransformer['default'];
10+
/**
11+
* @type {import('@mdx-js/mdx').CompileOptions}
12+
*/
13+
export default {
14+
remarkPlugins: [
15+
RemarkGFM,
16+
[RemarkEmbedder, { transformers: [OembedTransformer] }],
17+
RemarkFrontmatter,
18+
RemarkMdxFrontmatter
19+
],
20+
rehypePlugins: [RehypePrism]
21+
};

source/utility.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
export const JSConfigExtensions = ['js', 'cjs', 'mjs'];
2+
export const ConfigExtensions = ['json', ...JSConfigExtensions, 'cts'];
3+
/**
4+
* @see {@link https://babeljs.io/docs/config-files#configuration-file-types}
5+
*/
6+
export const BabelConfigFiles = [
7+
...ConfigExtensions.map(extension => `babel.config.${extension}`),
8+
...ConfigExtensions.map(extension => `.babelrc.${extension}`),
9+
'.babelrc'
10+
];
11+
export const MDXConfigFiles = JSConfigExtensions.map(
12+
extension => `mdx.config.${extension}`
13+
);
14+
15+
/**
16+
* @typedef {Object} BabelReactPreset
17+
* @property {import('@mdx-js/mdx').CompileOptions['jsxRuntime']} runtime
18+
* @property {import('@mdx-js/mdx').CompileOptions['jsxImportSource']} importSource
19+
* @property {import('@mdx-js/mdx').CompileOptions['pragma']} pragma
20+
* @property {import('@mdx-js/mdx').CompileOptions['pragmaFrag']} pragmaFrag
21+
*/

0 commit comments

Comments
 (0)