44 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			44 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| const visitChildren = require('unist-util-visit-children');
 | |
| const { root } = require('mdast-builder');
 | |
| 
 | |
| const { getFileVisitor } = require('./utils/get-file-visitor');
 | |
| const { splitOnThematicBreak } = require('./utils/split-on-thematic-break');
 | |
| const getAllBetween = require('./utils/between-headings');
 | |
| const { editableRegionMarker } = require('./add-seed');
 | |
| 
 | |
| function validateMarkers({ value }) {
 | |
|   const lines = value.split('\n');
 | |
|   if (lines.some(line => line.match(RegExp(editableRegionMarker))))
 | |
|     throw Error(
 | |
|       '--fcc-editable-region-- should only appear in the --seed-contents--\n' +
 | |
|         'section, not in --solutions--'
 | |
|     );
 | |
| }
 | |
| 
 | |
| function createPlugin() {
 | |
|   return function transformer(tree, file) {
 | |
|     const solutionArrays = splitOnThematicBreak(
 | |
|       getAllBetween(tree, `--solutions--`)
 | |
|     );
 | |
|     const solutions = [];
 | |
| 
 | |
|     solutionArrays.forEach(nodes => {
 | |
|       const solution = {};
 | |
|       const solutionTree = root(nodes);
 | |
|       const visitForContents = visitChildren(
 | |
|         getFileVisitor(solution, 'contents', validateMarkers)
 | |
|       );
 | |
| 
 | |
|       visitForContents(solutionTree);
 | |
|       solutions.push(solution);
 | |
|     });
 | |
| 
 | |
|     file.data = {
 | |
|       ...file.data,
 | |
|       solutions: solutions
 | |
|     };
 | |
|   };
 | |
| }
 | |
| 
 | |
| module.exports = createPlugin;
 |