63 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			63 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | "use strict"; | ||
|  | 
 | ||
|  | Object.defineProperty(exports, "__esModule", { | ||
|  |   value: true | ||
|  | }); | ||
|  | exports.program = exports.expression = exports.statement = exports.statements = exports.smart = void 0; | ||
|  | 
 | ||
|  | function makeStatementFormatter(fn) { | ||
|  |   return { | ||
|  |     code: str => `/* @babel/template */;\n${str}`, | ||
|  |     validate: () => {}, | ||
|  |     unwrap: ast => { | ||
|  |       return fn(ast.program.body.slice(1)); | ||
|  |     } | ||
|  |   }; | ||
|  | } | ||
|  | 
 | ||
|  | const smart = makeStatementFormatter(body => { | ||
|  |   if (body.length > 1) { | ||
|  |     return body; | ||
|  |   } else { | ||
|  |     return body[0]; | ||
|  |   } | ||
|  | }); | ||
|  | exports.smart = smart; | ||
|  | const statements = makeStatementFormatter(body => body); | ||
|  | exports.statements = statements; | ||
|  | const statement = makeStatementFormatter(body => { | ||
|  |   if (body.length === 0) { | ||
|  |     throw new Error("Found nothing to return."); | ||
|  |   } | ||
|  | 
 | ||
|  |   if (body.length > 1) { | ||
|  |     throw new Error("Found multiple statements but wanted one"); | ||
|  |   } | ||
|  | 
 | ||
|  |   return body[0]; | ||
|  | }); | ||
|  | exports.statement = statement; | ||
|  | const expression = { | ||
|  |   code: str => `(\n${str}\n)`, | ||
|  |   validate: ({ | ||
|  |     program | ||
|  |   }) => { | ||
|  |     if (program.body.length > 1) { | ||
|  |       throw new Error("Found multiple statements but wanted one"); | ||
|  |     } | ||
|  | 
 | ||
|  |     const expression = program.body[0].expression; | ||
|  | 
 | ||
|  |     if (expression.start === 0) { | ||
|  |       throw new Error("Parse result included parens."); | ||
|  |     } | ||
|  |   }, | ||
|  |   unwrap: ast => ast.program.body[0].expression | ||
|  | }; | ||
|  | exports.expression = expression; | ||
|  | const program = { | ||
|  |   code: str => str, | ||
|  |   validate: () => {}, | ||
|  |   unwrap: ast => ast.program | ||
|  | }; | ||
|  | exports.program = program; |