You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

46 lines
1.4 KiB

/* eslint strict: 0 */
'use strict';
const fs = require('fs');
const path = require('path');
const R = require('ramda');
const utils = require('./utils');
const isDemo = R.compose(R.test(/\/demo$/i), path.dirname);
module.exports = function buildDemosList(dirs, outputPath) {
const mds = utils.findMDFile(dirs);
const demos = R.filter(isDemo, mds);
const groupedDemos = R.groupBy((fileName) => {
const parts = fileName.split(path.sep);
const demoIndex = parts.indexOf('demo');
const relativeIndex = path.join(parts.slice(0, demoIndex).join(path.sep), 'index.md');
return relativeIndex;
}, demos);
let content =
'const React = require("react");\n' +
'const ReactDOM = require("react-dom");\n' +
'module.exports = {';
Object.keys(groupedDemos).forEach((key) => {
content += `\n '${key}': [`;
groupedDemos[key].forEach((fileName) => {
const requirePath = path.relative(path.dirname(outputPath), fileName);
content += `\n require('${requirePath}'),`;
});
content += '\n ],';
});
content += '\n};\n';
// Extract preview as a component
content +=
'Object.keys(module.exports).map((key) => module.exports[key])\n' +
' .forEach((demos) => {\n' +
' demos.forEach((demo) => {\n' +
' if (typeof demo.preview !== "function") return;\n' +
' demo.preview = demo.preview(React, ReactDOM);\n' +
' });\n' +
' });';
fs.writeFile(outputPath, content);
};