const makeFilenameRewriter = (filenameRewriters) => (filename, line, column) => (
Object.entries(filenameRewriters)
.reduce(
(filename, [from, to]) => filename.replace(new RegExp(from), to),
`${filename}:${line}:${column}`,
)
);
export const generateBuildConfigsPage = (buildConfigs) => {
const source = [];
source.push('# Build configuration files');
source.push('');
source.push('This page documents all the build configuration files in this project.');
source.push('');
if (buildConfigs.length > 0) {
buildConfigs
.sort(({config: l}, {config: r}) => (l < r ? -1 : 1))
.forEach(({config, comment}) => {
source.push(`## \`${config}\``);
source.push('');
source.push(comment);
source.push('');
});
}
return source.join('\n');
};
export const generateConfigPage = (configs) => {
const source = [];
source.push('# Configuration');
source.push('');
source.push('This page documents all the configuration in this project.');
source.push('');
Object.entries(configs)
.sort(([l], [r]) => (l < r ? -1 : 1))
.forEach(([fleck, configs]) => {
// source.push(`## \`${fleck}\``);
source.push('```javascript');
source.push(`'${fleck}': {`);
configs.forEach(({comment, config, defaultValue}) => {
comment.split('\n').forEach((line) => {
source.push(` // ${line}`);
});
const value = defaultValue
.split('\n')
.map((line, i, array) => {
let output = '';
if (array.length - 1 === i) {
output += ' ';
}
else if (0 !== i) {
output += ' ';
}
output += line.trim();
return output;
})
.join('\n');
source.push(` ${config}: ${value}`);
});
source.push('}');
source.push('```');
});
return source.join('\n');
};
export const generateHookPage = (hooks, flecks) => {
const {filenameRewriters} = flecks.get('@flecks/dox/server');
const rewriteFilename = makeFilenameRewriter(filenameRewriters);
const source = [];
source.push('# Hooks');
source.push('');
source.push('This page documents all the hooks in this project.');
source.push('');
Object.entries(hooks)
.sort(([lhook], [rhook]) => (lhook < rhook ? -1 : 1))
.forEach(([hook, {implementations = [], invocations = [], specification}]) => {
source.push(`## \`${hook}\``);
source.push('');
const {description, example, params} = specification || {
params: [],
};
if (description) {
description.split('\n').forEach((line) => {
source.push(`> ${line}`);
});
source.push('');
}
if (params.length > 0) {
source.push('');
source.push('Parameters
');
source.push('');
params.forEach(({description, name, type}) => {
source.push(`{${type}}
${name}
`);
source.push(`${description}
`);
});
source.push('
');
source.push(' ');
source.push('');
}
if (implementations.length > 0) {
source.push('');
source.push('Implementations
');
source.push('');
implementations.forEach(({filename, loc: {start: {column, line}}}) => {
source.push(`- ${rewriteFilename(filename, line, column)}
`);
});
source.push('
');
source.push(' ');
source.push('');
}
if (invocations.length > 0) {
source.push('');
source.push('Invocations
');
source.push('');
invocations.forEach(({filename, loc: {start: {column, line}}}) => {
source.push(`- ${rewriteFilename(filename, line, column)}
`);
});
source.push('
');
source.push(' ');
source.push('');
}
if (example) {
source.push('### Example usage');
source.push('');
source.push('```javascript');
source.push('export const hooks = {');
source.push(` '${hook}': ${example}`);
source.push('};');
source.push('```');
source.push('');
}
});
return source.join('\n');
};
export const generateTodoPage = (todos, flecks) => {
const {filenameRewriters} = flecks.get('@flecks/dox/server');
const rewriteFilename = makeFilenameRewriter(filenameRewriters);
const source = [];
source.push('# TODO');
source.push('');
source.push('This page documents all the TODO items in this project.');
source.push('');
if (todos.length > 0) {
todos.forEach(({filename, loc: {start: {column, line}}, text}) => {
source.push(`- ${rewriteFilename(filename, line, column)}`);
text.split('\n').forEach((line) => {
source.push(` > ${line}`);
});
});
source.push('');
}
return source.join('\n');
};