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.
45 lines
1.4 KiB
45 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);
|
|
};
|
|
|