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;
							 |