'use strict'; const path = require("path"); function fixDependencyPaths(dependencies) { /* When generating a parser on runtime, the parser source will be evaluated * from within the PEG.js source code, which means that relative dependency * paths will not work. This function patches all relative paths, by * resolving them to absolute paths relative from this file. */ return Object.keys(dependencies).reduce((obj, key) => { obj[key] = path.join(__dirname, dependencies[key]); return obj; }, {}); } module.exports = function(body, options = {}) { let expressionParser, parserOptions; if (options.tracer != null) { const pegjs = require("pegjs"); const fs = require("fs"); const path = require("path"); let grammar = fs.readFileSync(path.join(__dirname, "../src/expression.pegjs"), {encoding: "utf8"}); let pegOptions = require("../pegjs-options.js"); if (pegOptions.dependencies != null) { pegOptions.dependencies = fixDependencyPaths(pegOptions.dependencies); } expressionParser = pegjs.generate(grammar, Object.assign({ trace: true, format: "commonjs" }, pegOptions)); parserOptions = { tracer: options.tracer }; } else { expressionParser = require("./expression"); parserOptions = {}; } return expressionParser.parse(body, parserOptions); }