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