react / wstein / node_modules / jest-cli / node_modules / node-haste / lib / parse / extractJavelinSymbols.js
80668 views/**1* Copyright 2013 Facebook, Inc.2*3* Licensed under the Apache License, Version 2.0 (the "License");4* you may not use this file except in compliance with the License.5* You may obtain a copy of the License at6*7* http://www.apache.org/licenses/LICENSE-2.08*9* Unless required by applicable law or agreed to in writing, software10* distributed under the License is distributed on an "AS IS" BASIS,11* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.12* See the License for the specific language governing permissions and13* limitations under the License.14*/15var esprima = require('esprima-fb');16var Syntax = esprima.Syntax;1718function traverse(node, visitor) {19var key, child;2021if (visitor(node) === false) {22return;23}24for (key in node) {25child = node[key];26if (typeof child === 'object' && child !== null) {27traverse(child, visitor);28}29}30}3132var javelinInstallsRe = /@javelin-installs\s+(.*)/g;33function extractJavelinSymbols(code) {34var ast = esprima.parse(code);35var defines = {};36var requires = {};37var id = null;3839var visitor = function (node) {40if (node.type === Syntax.MemberExpression && !node.computed &&41node.object.name === 'JX') {42var symbolName = 'JX.' + node.property.name;43if (!defines[symbolName]) {44requires[symbolName] = true;45}46}47};4849ast.body.forEach(function(node) {50var symbolName;51// Look for calls to JX.install() and JX.behavior()52if (node.type === Syntax.ExpressionStatement &&53node.expression.type === Syntax.CallExpression &&54node.expression.callee.type === Syntax.MemberExpression &&55!node.expression.callee.object.computed &&56node.expression.callee.object.name === 'JX') {5758var expressionArgs = node.expression['arguments'];59if (node.expression.callee.property.name === 'install') {60symbolName = 'JX.' + expressionArgs[0].value;61defines[symbolName] = true;62if (!id) {63id = symbolName;64}65} else if (node.expression.callee.property.name === 'behavior') {66symbolName = 'javelin-behavior-' + expressionArgs[0].value;67defines[symbolName] = true;68if (!id) {69id = symbolName;70}71}72}73});7475ast.body.forEach(function(node) {76traverse(node, visitor);77});7879var match;80// Next we need to look at the docblock for javelin-installs.81while (match = javelinInstallsRe.exec(code)) {82var name = 'JX.' + match[1].split('.')[1];83delete requires[name];84defines[name] = true;85}8687return {88id: id,89defines: Object.keys(defines),90requires: Object.keys(requires)91};92}9394module.exports = extractJavelinSymbols;959697