forked from tailwindlabs/tailwindcss.com
-
Notifications
You must be signed in to change notification settings - Fork 0
/
next.config.js
112 lines (103 loc) · 3.62 KB
/
next.config.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
const path = require('path')
const querystring = require('querystring')
const { createLoader } = require('simple-functional-loader')
const frontMatter = require('front-matter')
const { withTableOfContents } = require('./remark/withTableOfContents')
const { withSyntaxHighlighting } = require('./remark/withSyntaxHighlighting')
const { withProse } = require('./remark/withProse')
const { withNextLinks } = require('./remark/withNextLinks')
const minimatch = require('minimatch')
const withCodeSamples = require('./remark/withCodeSamples')
const withBundleAnalyzer = require('@next/bundle-analyzer')({
enabled: process.env.ANALYZE === 'true',
})
const fallbackLayouts = {
'src/pages/docs/**/*': ['@/layouts/DocumentationLayout', 'DocumentationLayout'],
'src/pages/components/**/*': ['@/layouts/ComponentsLayout', 'ComponentsLayout'],
'src/pages/course/**/*': ['@/layouts/CourseLayout', 'CourseLayout'],
}
const fallbackDefaultExports = {
'src/pages/{docs,components}/**/*': ['@/layouts/ContentsLayout', 'ContentsLayout'],
'src/pages/course/**/*': ['@/layouts/VideoLayout', 'VideoLayout'],
}
module.exports = withBundleAnalyzer({
pageExtensions: ['js', 'jsx', 'mdx'],
experimental: {
modern: true,
},
webpack(config, options) {
config.module.rules.push({
test: /\.(png|jpe?g|gif|svg)$/i,
use: [
{
loader: 'file-loader',
options: {
publicPath: '/_next',
name: 'static/media/[name].[hash].[ext]',
},
},
],
})
config.module.rules.push({
test: /\.mdx$/,
use: [
options.defaultLoaders.babel,
createLoader(function (source) {
return source + `\nMDXContent.layoutProps = layoutProps\n`
}),
{
loader: '@mdx-js/loader',
options: {
remarkPlugins: [
withCodeSamples,
/*withProse,*/ withTableOfContents,
withSyntaxHighlighting,
withNextLinks,
],
},
},
createLoader(function (source) {
let { meta: fields } = querystring.parse(this.resourceQuery.substr(1))
let { attributes: meta, body } = frontMatter(source)
if (fields) {
for (let field in meta) {
if (!fields.split(',').includes(field)) {
delete meta[field]
}
}
}
let extra = []
let resourcePath = path.relative(__dirname, this.resourcePath)
if (!/^\s*export\s+(var|let|const)\s+Layout\s+=/m.test(source)) {
for (let glob in fallbackLayouts) {
if (minimatch(resourcePath, glob)) {
extra.push(
`import { ${fallbackLayouts[glob][1]} as _Layout } from '${fallbackLayouts[glob][0]}'`,
'export const Layout = _Layout'
)
break
}
}
}
if (!/^\s*export\s+default\s+/m.test(source.replace(/```(.*?)```/gs, ''))) {
for (let glob in fallbackDefaultExports) {
if (minimatch(resourcePath, glob)) {
extra.push(
`import { ${fallbackDefaultExports[glob][1]} as _Default } from '${fallbackDefaultExports[glob][0]}'`,
'export default _Default'
)
break
}
}
}
return [
...(typeof fields === 'undefined' ? extra : []),
typeof fields === 'undefined' ? body : '',
`export const meta = ${JSON.stringify(meta)}`,
].join('\n\n')
}),
],
})
return config
},
})