UNPKG

yaml-ast-parser

Version:

[![Build Status](https://travis-ci.org/mulesoft-labs/yaml-ast-parser.svg?branch=master)](https://travis-ci.org/mulesoft-labs/yaml-ast-parser)

83 lines (65 loc) 2.2 kB
'use strict'; declare function require(N:string):any var esprima=require("esprima"); // Browserified version does not have esprima // // 1. For node.js just require module as deps // 2. For browser try to require mudule via external AMD system. // If not found - try to fallback to window.esprima. If not // found too - then fail to parse. // import {Type} from '../../type'; function resolveJavascriptFunction(data) { if (null === data) { return false; } try { var source = '(' + data + ')', ast = esprima.parse(source, { range: true }), params = [], body; if ('Program' !== ast.type || 1 !== ast.body.length || 'ExpressionStatement' !== ast.body[0].type || 'FunctionExpression' !== ast.body[0]['expression'].type) { return false; } return true; } catch (err) { return false; } } function constructJavascriptFunction(data) { /*jslint evil:true*/ var source = '(' + data + ')', ast = esprima.parse(source, { range: true }), params:string[] = [], body; if ('Program' !== ast.type || 1 !== ast.body.length || 'ExpressionStatement' !== ast.body[0].type || 'FunctionExpression' !== ast.body[0]['expression'].type) { throw new Error('Failed to resolve function'); } ast.body[0]['expression'].params.forEach(function (param) { params.push(param.name); }); body = ast.body[0]['expression'].body.range; // Esprima's ranges include the first '{' and the last '}' characters on // function expressions. So cut them out. /*eslint-disable no-new-func*/ return new (<any>Function)(params, source.slice(body[0] + 1, body[1] - 1)); } function representJavascriptFunction(object /*, style*/) { return object.toString(); } function isFunction(object) { return '[object Function]' === Object.prototype.toString.call(object); } export = new Type('tag:yaml.org,2002:js/function', { kind: 'scalar', resolve: resolveJavascriptFunction, construct: constructJavascriptFunction, predicate: isFunction, represent: representJavascriptFunction });