53 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			53 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| var noop = function() {};
 | |
| 
 | |
| function ensureFunction(value) {
 | |
|     return typeof value === 'function' ? value : noop;
 | |
| }
 | |
| 
 | |
| module.exports = function(node, options, context) {
 | |
|     function walk(node) {
 | |
|         enter.call(context, node);
 | |
| 
 | |
|         switch (node.type) {
 | |
|             case 'Group':
 | |
|                 node.terms.forEach(walk);
 | |
|                 break;
 | |
| 
 | |
|             case 'Multiplier':
 | |
|                 walk(node.term);
 | |
|                 break;
 | |
| 
 | |
|             case 'Type':
 | |
|             case 'Property':
 | |
|             case 'Keyword':
 | |
|             case 'AtKeyword':
 | |
|             case 'Function':
 | |
|             case 'String':
 | |
|             case 'Token':
 | |
|             case 'Comma':
 | |
|                 break;
 | |
| 
 | |
|             default:
 | |
|                 throw new Error('Unknown type: ' + node.type);
 | |
|         }
 | |
| 
 | |
|         leave.call(context, node);
 | |
|     }
 | |
| 
 | |
|     var enter = noop;
 | |
|     var leave = noop;
 | |
| 
 | |
|     if (typeof options === 'function') {
 | |
|         enter = options;
 | |
|     } else if (options) {
 | |
|         enter = ensureFunction(options.enter);
 | |
|         leave = ensureFunction(options.leave);
 | |
|     }
 | |
| 
 | |
|     if (enter === noop && leave === noop) {
 | |
|         throw new Error('Neither `enter` nor `leave` walker handler is set or both aren\'t a function');
 | |
|     }
 | |
| 
 | |
|     walk(node, context);
 | |
| };
 |