| "use strict"; |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| exports.statements = exports.statement = exports.smart = exports.program = exports.expression = void 0; |
| |
| var _t = require("@babel/types"); |
| |
| const { |
| assertExpressionStatement |
| } = _t; |
| |
| 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: ast => { |
| if (ast.program.body.length > 1) { |
| throw new Error("Found multiple statements but wanted one"); |
| } |
| |
| if (expression.unwrap(ast).start === 0) { |
| throw new Error("Parse result included parens."); |
| } |
| }, |
| unwrap: ({ |
| program |
| }) => { |
| const [stmt] = program.body; |
| assertExpressionStatement(stmt); |
| return stmt.expression; |
| } |
| }; |
| exports.expression = expression; |
| const program = { |
| code: str => str, |
| validate: () => {}, |
| unwrap: ast => ast.program |
| }; |
| exports.program = program; |