From 3277f3272d169447957c11bc1f11724a614aa788 Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Tue, 15 Sep 2015 06:27:44 +0100 Subject: [PATCH] add babel-template package --- packages/babel-template/package.json | 16 ++++++ packages/babel-template/src/index.js | 78 ++++++++++++++++++++++++++++ 2 files changed, 94 insertions(+) create mode 100644 packages/babel-template/package.json create mode 100644 packages/babel-template/src/index.js diff --git a/packages/babel-template/package.json b/packages/babel-template/package.json new file mode 100644 index 0000000000..49803acbe8 --- /dev/null +++ b/packages/babel-template/package.json @@ -0,0 +1,16 @@ +{ + "name": "babel-template", + "version": "5.8.22", + "description": "", + "author": "Sebastian McKenzie ", + "homepage": "https://babeljs.io/", + "license": "MIT", + "repository": "babel/babel", + "main": "lib/index.js", + "dependencies": { + "babylon": "^5.8.20", + "babel-traverse": "^5.8.22", + "babel-types": "^5.8.22", + "lodash": "^3.10.1" + } +} diff --git a/packages/babel-template/src/index.js b/packages/babel-template/src/index.js new file mode 100644 index 0000000000..99f3c83c79 --- /dev/null +++ b/packages/babel-template/src/index.js @@ -0,0 +1,78 @@ +import cloneDeep from "lodash/lang/cloneDeep"; +import isEmpty from "lodash/lang/isEmpty"; +import has from "lodash/object/has"; +import traverse from "babel-traverse"; +import * as babylon from "babylon"; +import * as t from "babel-types"; + +export default function (code) { + var stack = new Error().stack.split("\n").slice(1).join("\n"); + + var getAst = function () { + try { + var ast = babylon.parse(code, { + allowReturnOutsideFunction: true + }).program; + + ast = traverse.removeProperties(ast); + } catch (err) { + err.stack = `${err.stack}from\n${stack}`; + } + + getAst = function () { + return ast; + }; + + return ast; + }; + + return function (nodes, keepExpression) { + return useTemplate(getAst(), nodes, keepExpression); + }; +} + +function useTemplate(ast, nodes?: Array, keepExpression?: boolean) { + if (nodes === true) { + keepExpression = true; + nodes = null; + } + + ast = cloneDeep(ast); + + if (!isEmpty(nodes)) { + traverse(ast, templateVisitor, null, nodes); + } + + if (ast.body.length > 1) { + return ast.body; + } + + var node = ast.body[0]; + if (!keepExpression && t.isExpressionStatement(node)) { + return node.expression; + } else { + return node; + } +} + +var templateVisitor = { + // 360 + noScope: true, + + enter(path, nodes) { + var { node } = path; + + if (t.isExpressionStatement(node)) { + node = node.expression; + } + + if (t.isIdentifier(node) && has(nodes, node.name)) { + path.skip(); + path.replaceInline(nodes[node.name]); + } + }, + + exit({ node }) { + traverse.clearNode(node); + } +};