@mui/internal-docs-infra
Version:
MUI Infra - internal documentation creation tools.
175 lines (162 loc) • 8.1 kB
JavaScript
import _extends from "@babel/runtime/helpers/esm/extends";
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
// Define minimal NextConfig type to avoid importing from 'next'
// Define webpack options interface based on Next.js webpack function signature
/**
* Get default MDX options for docs-infra
*/
export function getDocsInfraMdxOptions() {
var _customOptions$remark, _customOptions$additi, _customOptions$rehype, _customOptions$additi2;
var customOptions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var defaultRemarkPlugins = [['remark-gfm'], ['@mui/internal-docs-infra/pipeline/transformMarkdownCode']];
var defaultRehypePlugins = [['@mui/internal-docs-infra/pipeline/transformHtmlCodePrecomputed']];
// Build final plugin arrays
var remarkPlugins = (_customOptions$remark = customOptions.remarkPlugins) != null ? _customOptions$remark : [].concat(defaultRemarkPlugins, _toConsumableArray((_customOptions$additi = customOptions.additionalRemarkPlugins) != null ? _customOptions$additi : []));
var rehypePlugins = (_customOptions$rehype = customOptions.rehypePlugins) != null ? _customOptions$rehype : [].concat(defaultRehypePlugins, _toConsumableArray((_customOptions$additi2 = customOptions.additionalRehypePlugins) != null ? _customOptions$additi2 : []));
return {
remarkPlugins: remarkPlugins,
rehypePlugins: rehypePlugins
};
}
/**
* Next.js plugin for MUI docs infrastructure.
* Configures webpack loaders, turbopack rules for docs sites.
* Use getDocsInfraMdxOptions() with createMDX for MDX integration.
*/
export function withDocsInfra() {
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var _options$additionalPa = options.additionalPageExtensions,
additionalPageExtensions = _options$additionalPa === void 0 ? [] : _options$additionalPa,
_options$enableExport = options.enableExportOutput,
enableExportOutput = _options$enableExport === void 0 ? true : _options$enableExport,
_options$demoPathPatt = options.demoPathPattern,
demoPathPattern = _options$demoPathPatt === void 0 ? './app/**/demos/*/index.ts' : _options$demoPathPatt,
_options$clientDemoPa = options.clientDemoPathPattern,
clientDemoPathPattern = _options$clientDemoPa === void 0 ? './app/**/demos/*/client.ts' : _options$clientDemoPa,
_options$additionalDe = options.additionalDemoPatterns,
additionalDemoPatterns = _options$additionalDe === void 0 ? {} : _options$additionalDe,
_options$additionalTu = options.additionalTurbopackRules,
additionalTurbopackRules = _options$additionalTu === void 0 ? {} : _options$additionalTu,
_options$deferCodePar = options.deferCodeParsing,
deferCodeParsing = _options$deferCodePar === void 0 ? 'gzip' : _options$deferCodePar;
var output = 'hastGzip';
if (deferCodeParsing === 'json') {
output = 'hastJson';
} else if (deferCodeParsing === 'none') {
output = 'hast';
}
return function () {
var _nextConfig$turbopack;
var nextConfig = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var basePageExtensions = ['js', 'jsx', 'md', 'mdx', 'ts', 'tsx'];
var pageExtensions = [].concat(basePageExtensions, _toConsumableArray(additionalPageExtensions));
// Build Turbopack rules
var turbopackRules = _defineProperty(_defineProperty({}, demoPathPattern, {
loaders: [{
loader: '@mui/internal-docs-infra/pipeline/loadPrecomputedCodeHighlighter',
options: {
output: output
}
}]
}), clientDemoPathPattern, {
loaders: ['@mui/internal-docs-infra/pipeline/loadPrecomputedCodeHighlighterClient']
});
// Add additional demo patterns to Turbopack rules
if (additionalDemoPatterns.index) {
additionalDemoPatterns.index.forEach(function (pattern) {
turbopackRules[pattern] = {
loaders: [{
loader: '@mui/internal-docs-infra/pipeline/loadPrecomputedCodeHighlighter',
options: {
output: output
}
}]
};
});
}
if (additionalDemoPatterns.client) {
additionalDemoPatterns.client.forEach(function (pattern) {
turbopackRules[pattern] = {
loaders: ['@mui/internal-docs-infra/pipeline/loadPrecomputedCodeHighlighterClient']
};
});
}
// Merge with additional turbopack rules
Object.assign(turbopackRules, additionalTurbopackRules);
var config = _extends(_extends(_extends({}, nextConfig), {}, {
pageExtensions: pageExtensions
}, enableExportOutput && {
output: 'export'
}), {}, {
turbopack: _extends(_extends({}, nextConfig.turbopack), {}, {
rules: _extends(_extends({}, (_nextConfig$turbopack = nextConfig.turbopack) == null ? void 0 : _nextConfig$turbopack.rules), turbopackRules)
}),
webpack: function webpack(webpackConfig, webpackOptions) {
// Call existing webpack function if it exists
if (nextConfig.webpack) {
webpackConfig = nextConfig.webpack(webpackConfig, webpackOptions);
}
// Ensure module and rules exist
if (!webpackConfig.module) {
webpackConfig.module = {};
}
if (!webpackConfig.module.rules) {
webpackConfig.module.rules = [];
}
var defaultLoaders = webpackOptions.defaultLoaders;
// Add loader for demo index files
webpackConfig.module.rules.push({
test: new RegExp('/demos/[^/]+/index\\.ts$'),
use: [defaultLoaders.babel, {
loader: '@mui/internal-docs-infra/pipeline/loadPrecomputedCodeHighlighter',
options: {
output: output
}
}]
});
// Client files for live demos - processes externals
webpackConfig.module.rules.push({
test: new RegExp('/demos/[^/]+/client\\.ts$'),
use: [defaultLoaders.babel, '@mui/internal-docs-infra/pipeline/loadPrecomputedCodeHighlighterClient']
});
// Add webpack rules for additional demo patterns
if (additionalDemoPatterns.index) {
additionalDemoPatterns.index.forEach(function (pattern) {
// Convert Turbopack pattern to webpack regex
var regexPattern = pattern.replace(/^\.\//, '/') // Remove leading ./
.replace(/\*\*\//g, 'DOUBLE_STAR_PLACEHOLDER') // Replace **/ with placeholder
.replace(/\*/g, '[^/]+') // Replace single * with single dir pattern
.replace(/\./g, '\\.') // Escape dots
.replace(/DOUBLE_STAR_PLACEHOLDER/g, '(?:[^/]+/)*'); // Replace placeholder with zero or more directories
webpackConfig.module.rules.push({
test: new RegExp("".concat(regexPattern, "$")),
use: [defaultLoaders.babel, {
loader: '@mui/internal-docs-infra/pipeline/loadPrecomputedCodeHighlighter',
options: {
output: output
}
}]
});
});
}
if (additionalDemoPatterns.client) {
additionalDemoPatterns.client.forEach(function (pattern) {
// Convert Turbopack pattern to webpack regex
var regexPattern = pattern.replace(/^\.\//, '/') // Remove leading ./
.replace(/\*\*\//g, 'DOUBLE_STAR_PLACEHOLDER') // Replace **/ with placeholder
.replace(/\*/g, '[^/]+') // Replace single * with single dir pattern
.replace(/\./g, '\\.') // Escape dots
.replace(/DOUBLE_STAR_PLACEHOLDER/g, '(?:[^/]+/)*'); // Replace placeholder with zero or more directories
webpackConfig.module.rules.push({
test: new RegExp("".concat(regexPattern, "$")),
use: [defaultLoaders.babel, '@mui/internal-docs-infra/pipeline/loadPrecomputedCodeHighlighterClient']
});
});
}
return webpackConfig;
}
});
return config;
};
}