formatters.js 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.statements = exports.statement = exports.smart = exports.program = exports.expression = void 0;
  6. var _t = require("@babel/types");
  7. const {
  8. assertExpressionStatement
  9. } = _t;
  10. function makeStatementFormatter(fn) {
  11. return {
  12. code: str => `/* @babel/template */;\n${str}`,
  13. validate: () => {},
  14. unwrap: ast => {
  15. return fn(ast.program.body.slice(1));
  16. }
  17. };
  18. }
  19. const smart = exports.smart = makeStatementFormatter(body => {
  20. if (body.length > 1) {
  21. return body;
  22. } else {
  23. return body[0];
  24. }
  25. });
  26. const statements = exports.statements = makeStatementFormatter(body => body);
  27. const statement = exports.statement = makeStatementFormatter(body => {
  28. if (body.length === 0) {
  29. throw new Error("Found nothing to return.");
  30. }
  31. if (body.length > 1) {
  32. throw new Error("Found multiple statements but wanted one");
  33. }
  34. return body[0];
  35. });
  36. const expression = exports.expression = {
  37. code: str => `(\n${str}\n)`,
  38. validate: ast => {
  39. if (ast.program.body.length > 1) {
  40. throw new Error("Found multiple statements but wanted one");
  41. }
  42. if (expression.unwrap(ast).start === 0) {
  43. throw new Error("Parse result included parens.");
  44. }
  45. },
  46. unwrap: ({
  47. program
  48. }) => {
  49. const [stmt] = program.body;
  50. assertExpressionStatement(stmt);
  51. return stmt.expression;
  52. }
  53. };
  54. const program = exports.program = {
  55. code: str => str,
  56. validate: () => {},
  57. unwrap: ast => ast.program
  58. };
  59. //# sourceMappingURL=formatters.js.map