diff options
Diffstat (limited to 'share/server/60/rewrite_fun.js')
-rw-r--r-- | share/server/60/rewrite_fun.js | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/share/server/60/rewrite_fun.js b/share/server/60/rewrite_fun.js new file mode 100644 index 000000000..1b27a9d14 --- /dev/null +++ b/share/server/60/rewrite_fun.js @@ -0,0 +1,56 @@ +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy of +// the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// +// Based on the normalizeFunction which can be +// found here: +// +// https://github.com/dmunch/couch-chakra/blob/master/js/normalizeFunction.js + +function rewriteFunInt(fun) { + const ast = esprima.parse(fun); + let idx = ast.body.length - 1; + let decl = {}; + + // Search for the first FunctionDeclaration beginning from the end + do { + decl = ast.body[idx--]; + } while (idx >= 0 && decl.type !== "FunctionDeclaration"); + idx++; + + // If we have a function declaration without an Id, wrap it + // in an ExpressionStatement and change it into + // a FuntionExpression + if (decl.type == "FunctionDeclaration" && decl.id == null) { + decl.type = "FunctionExpression"; + ast.body[idx] = { + type: "ExpressionStatement", + expression: decl + }; + } + + // Generate source from the rewritten AST + return escodegen.generate(ast); +} + + +function rewriteFun(funJSON) { + const fun = JSON.parse(funJSON); + return JSON.stringify(rewriteFunInt(fun)); +} + +function rewriteFuns(funsJSON) { + let funs = JSON.parse(funsJSON); + const results = Array.from(funs, (fun) => { + return rewriteFunInt(fun); + }); + return JSON.stringify(results); +}
\ No newline at end of file |