jsoniq
Version:
JSONiq implementation for JavaScript
101 lines (99 loc) • 17.2 kB
JavaScript
;
/// <reference path="../typings/tsd.d.ts" />
var Marker_1 = require("./compiler/Marker");
var Translator_1 = require("./compiler/Translator");
var Position_1 = require("./compiler/parsers/Position");
var RootStaticContext_1 = require("./compiler/RootStaticContext");
var JSONiqParser = require("./compiler/parsers/JSONiqParser");
var XQueryParser = require("./compiler/parsers/XQueryParser");
var JSONParseTreeHandler_1 = require("./compiler/parsers/JSONParseTreeHandler");
var Runtime = require("./runtime/Runtime");
var SourceMap = require("source-map");
require("source-map-support").install();
exports.Runtime = Runtime;
class JSONiq {
constructor(source) {
this.fileName = "";
this.markers = [];
this.source = source;
this.rootSctx = new RootStaticContext_1.default(new Position_1.default(0, 0, 0, 0, this.fileName));
}
setFileName(fileName) {
this.fileName = fileName;
return this;
}
parse() {
var isJSONiq = ((this.fileName.substring(this.fileName.length - ".jq".length).indexOf(".jq") !== -1) &&
this.source.indexOf("xquery version") !== 0) || this.source.indexOf("jsoniq version") === 0;
var h = new JSONParseTreeHandler_1.default(this.source, this.fileName);
var parser = isJSONiq ? new JSONiqParser.Parser(this.source, h) : new XQueryParser.Parser(this.source, h);
try {
parser.parse_XQuery();
}
catch (e) {
if (e instanceof JSONiqParser.ParseException) {
h.closeParseTree();
var message;
if (parser instanceof JSONiqParser.Parser) {
message = parser.getErrorMessage(e);
}
else if (parser instanceof XQueryParser.Parser) {
message = parser.getErrorMessage(e);
}
var pos = Position_1.default.convertPosition(this.source, e.getBegin(), e.getEnd(), this.fileName);
if (pos.getStartColumn() === pos.getEndColumn() && pos.getStartLine() === pos.getEndLine()) {
pos.setEndColumn(pos.getEndColumn() + 1);
}
this.markers.push(new Marker_1.default(pos, "error", "error", message));
}
else {
throw e;
}
}
return h.getParseTree();
}
compile() {
var ast = this.parse();
//TODO: check for syntax errors and don't compile
//console.log(ast.toXML());
var translator = new Translator_1.default(this.rootSctx, ast);
var it = translator.compile();
this.markers = this.markers.concat(translator.getMarkers());
return it;
}
static serialize(it) {
var node = new SourceMap.SourceNode(1, 1, it.getPosition().getFileName(), null, "MainQuery");
node.add("'use strict';\n");
node.add("require('source-map-support').install();\n");
node.add("var r = require('jsoniq').Runtime;\n");
node.add("var it = ");
node.add(it.serialize());
node.add(";\n");
node.add("for(var item of it) {\n");
node.add(" console.log(item);\n");
node.add("}\n");
var source = node.toStringWithSourceMap();
source.code += "\n//# sourceMappingURL=data:application/json," + source.map;
return source.code;
}
static serializeDebug(it) {
var node = new SourceMap.SourceNode(1, 1, it.getPosition().getFileName(), null, "MainQuery");
node.add("'use strict';\n");
node.add("require('source-map-support').install();\n");
node.add("var r = require('./dist/lib/runtime/Runtime');\n");
node.add("var it = ");
node.add(it.serialize());
node.add(";\n");
node.add("for(var item of it) {\n");
node.add(" console.log(JSON.stringify(item));\n");
node.add("}\n");
var source = node.toStringWithSourceMap();
source.code += "\n//# sourceMappingURL=data:application/json," + source.map;
return source.code;
}
getMarkers() {
return this.markers;
}
}
exports.default = JSONiq;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9KU09OaXEudHMiXSwibmFtZXMiOlsiSlNPTmlxIiwiSlNPTmlxLmNvbnN0cnVjdG9yIiwiSlNPTmlxLnNldEZpbGVOYW1lIiwiSlNPTmlxLnBhcnNlIiwiSlNPTmlxLmNvbXBpbGUiLCJKU09OaXEuc2VyaWFsaXplIiwiSlNPTmlxLnNlcmlhbGl6ZURlYnVnIiwiSlNPTmlxLmdldE1hcmtlcnMiXSwibWFwcGluZ3MiOiI7QUFBQSw0Q0FBNEM7QUFDNUMsdUJBQW1CLG1CQUFtQixDQUFDLENBQUE7QUFDdkMsMkJBQXVCLHVCQUF1QixDQUFDLENBQUE7QUFDL0MseUJBQXFCLDZCQUE2QixDQUFDLENBQUE7QUFDbkQsa0NBQThCLDhCQUE4QixDQUFDLENBQUE7QUFFN0QsSUFBWSxZQUFZLFdBQU0saUNBQWlDLENBQUMsQ0FBQTtBQUNoRSxJQUFZLFlBQVksV0FBTSxpQ0FBaUMsQ0FBQyxDQUFBO0FBQ2hFLHFDQUFpQyx5Q0FBeUMsQ0FBQyxDQUFBO0FBQzNFLElBQVksT0FBTyxXQUFNLG1CQUFtQixDQUFDLENBQUE7QUFFN0MsSUFBWSxTQUFTLFdBQU0sWUFBWSxDQUFDLENBQUE7QUFJeEMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7QUFFeEMsT0FBTyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7QUFFMUI7SUFPSUEsWUFBWUEsTUFBY0E7UUFIbEJDLGFBQVFBLEdBQVdBLEVBQUVBLENBQUNBO1FBQ3RCQSxZQUFPQSxHQUFhQSxFQUFFQSxDQUFDQTtRQUczQkEsSUFBSUEsQ0FBQ0EsTUFBTUEsR0FBR0EsTUFBTUEsQ0FBQ0E7UUFDckJBLElBQUlBLENBQUNBLFFBQVFBLEdBQUdBLElBQUlBLDJCQUFpQkEsQ0FBQ0EsSUFBSUEsa0JBQVFBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLENBQUNBLENBQUNBO0lBQ25GQSxDQUFD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QTtRQUN0QkEsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsQ0FBQ0E7UUFDekJBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBO1FBQ2hCQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQSx5QkFBeUJBLENBQUNBLENBQUNBO1FBQ3BDQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQSx5Q0FBeUNBLENBQUNBLENBQUNBO1FBQ3BEQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQSxLQUFLQSxDQUFDQSxDQUFDQTtRQUNoQkEsSUFBSUEsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EscUJBQXFCQSxFQUFFQSxDQUFDQTtRQUMxQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsSUFBS0EsK0NBQStDQSxHQUFHQSxNQUFNQSxDQUFDQSxHQUFHQSxDQUFDQTtRQUM3RUEsTUFBTUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0E7SUFDdkJBLENBQUNBO0lBRUROLFVBQVVBO1FBQ05PLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBO0lBQ3hCQSxDQUFDQTtBQUNMUCxDQUFDQTt5QkFBQSIsImZpbGUiOiJsaWIvSlNPTmlxLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL3R5cGluZ3MvdHNkLmQudHNcIiAvPlxuaW1wb3J0IE1hcmtlciBmcm9tIFwiLi9jb21waWxlci9NYXJrZXJcIjtcbmltcG9ydCBUcmFuc2xhdG9yIGZyb20gXCIuL2NvbXBpbGVyL1RyYW5zbGF0b3JcIjtcbmltcG9ydCBQb3NpdGlvbiBmcm9tIFwiLi9jb21waWxlci9wYXJzZXJzL1Bvc2l0aW9uXCI7XG5pbXBvcnQgUm9vdFN0YXRpY0NvbnRleHQgZnJvbSBcIi4vY29tcGlsZXIvUm9vdFN0YXRpY0NvbnRleHRcIjtcbmltcG9ydCBBU1ROb2RlIGZyb20gXCIuL2NvbXBpbGVyL3BhcnNlcnMvQVNUTm9kZVwiO1xuaW1wb3J0ICogYXMgSlNPTmlxUGFyc2VyIGZyb20gXCIuL2NvbXBpbGVyL3BhcnNlcnMvSlNPTmlxUGFyc2VyXCI7XG5pbXBvcnQgKiBhcyBYUXVlcnlQYXJzZXIgZnJvbSBcIi4vY29tcGlsZXIvcGFyc2Vycy9YUXVlcnlQYXJzZXJcIjtcbmltcG9ydCBKU09OUGFyc2VUcmVlSGFuZGxlciBmcm9tIFwiLi9jb21waWxlci9wYXJzZXJzL0pTT05QYXJzZVRyZWVIYW5kbGVyXCI7XG5pbXBvcnQgKiBhcyBSdW50aW1lIGZyb20gXCIuL3J1bnRpbWUvUnVudGltZVwiO1xuXG5pbXBvcnQgKiBhcyBTb3VyY2VNYXAgZnJvbSBcInNvdXJjZS1tYXBcIjtcblxuaW1wb3J0IEl0ZXJhdG9yIGZyb20gXCIuL3J1bnRpbWUvaXRlcmF0b3JzL0l0ZXJhdG9yXCI7XG5cbnJlcXVpcmUoXCJzb3VyY2UtbWFwLXN1cHBvcnRcIikuaW5zdGFsbCgpO1xuXG5leHBvcnRzLlJ1bnRpbWUgPSBSdW50aW1lO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBKU09OaXEge1xuXG4gICAgcHJpdmF0ZSByb290U2N0eDogUm9vdFN0YXRpY0NvbnRleHQ7XG4gICAgcHJpdmF0ZSBzb3VyY2U6IHN0cmluZztcbiAgICBwcml2YXRlIGZpbGVOYW1lOiBzdHJpbmcgPSBcIlwiO1xuICAgIHByaXZhdGUgbWFya2VyczogTWFya2VyW10gPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKHNvdXJjZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgICB0aGlzLnJvb3RTY3R4ID0gbmV3IFJvb3RTdGF0aWNDb250ZXh0KG5ldyBQb3NpdGlvbigwLCAwLCAwLCAwLCB0aGlzLmZpbGVOYW1lKSk7XG4gICAgfVxuXG4gICAgc2V0RmlsZU5hbWUoZmlsZU5hbWU6IHN0cmluZyk6IEpTT05pcSB7XG4gICAgICAgIHRoaXMuZmlsZU5hbWUgPSBmaWxlTmFtZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcGFyc2UoKTogQVNUTm9kZSB7XG4gICAgICAgIHZhciBpc0pTT05pcSA9IChcbiAgICAgICAgICAgICh0aGlzLmZpbGVOYW1lLnN1YnN0cmluZyh0aGlzLmZpbGVOYW1lLmxlbmd0aCAtIFwiLmpxXCIubGVuZ3RoKS5pbmRleE9mKFwiLmpxXCIpICE9PSAtMSkgJiZcbiAgICAgICAgICAgIHRoaXMuc291cmNlLmluZGV4T2YoXCJ4cXVlcnkgdmVyc2lvblwiKSAhPT0gMFxuICAgICAgICAgICAgKSB8fCB0aGlzLnNvdXJjZS5pbmRleE9mKFwianNvbmlxIHZlcnNpb25cIikgPT09IDA7XG4gICAgICAgIHZhciBoID0gbmV3IEpTT05QYXJzZVRyZWVIYW5kbGVyKHRoaXMuc291cmNlLCB0aGlzLmZpbGVOYW1lKTtcbiAgICAgICAgdmFyIHBhcnNlciA9IGlzSlNPTmlxID8gbmV3IEpTT05pcVBhcnNlci5QYXJzZXIodGhpcy5zb3VyY2UsIGgpIDogbmV3IFhRdWVyeVBhcnNlci5QYXJzZXIodGhpcy5zb3VyY2UsIGgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcGFyc2VyLnBhcnNlX1hRdWVyeSgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEpTT05pcVBhcnNlci5QYXJzZUV4Y2VwdGlvbikge1xuICAgICAgICAgICAgICAgIGguY2xvc2VQYXJzZVRyZWUoKTtcbiAgICAgICAgICAgICAgICB2YXIgbWVzc2FnZTogc3RyaW5nO1xuICAgICAgICAgICAgICAgIGlmKHBhcnNlciBpbnN0YW5jZW9mIEpTT05pcVBhcnNlci5QYXJzZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9ICg8SlNPTmlxUGFyc2VyLlBhcnNlcj5wYXJzZXIpLmdldEVycm9yTWVzc2FnZShlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYocGFyc2VyIGluc3RhbmNlb2YgWFF1ZXJ5UGFyc2VyLlBhcnNlcikge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gKDxYUXVlcnlQYXJzZXIuUGFyc2VyPnBhcnNlcikuZ2V0RXJyb3JNZXNzYWdlKGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgcG9zID0gUG9zaXRpb24uY29udmVydFBvc2l0aW9uKHRoaXMuc291cmNlLCBlLmdldEJlZ2luKCksIGUuZ2V0RW5kKCksIHRoaXMuZmlsZU5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChwb3MuZ2V0U3RhcnRDb2x1bW4oKSA9PT0gcG9zLmdldEVuZENvbHVtbigpICYmIHBvcy5nZXRTdGFydExpbmUoKSA9PT0gcG9zLmdldEVuZExpbmUoKSkge1xuICAgICAgICAgICAgICAgICAgICBwb3Muc2V0RW5kQ29sdW1uKHBvcy5nZXRFbmRDb2x1bW4oKSArIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLm1hcmtlcnMucHVzaChuZXcgTWFya2VyKHBvcywgXCJlcnJvclwiLCBcImVycm9yXCIsIG1lc3NhZ2UpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaC5nZXRQYXJzZVRyZWUoKTtcbiAgICB9XG5cbiAgICBjb21waWxlKCk6IEl0ZXJhdG9yIHtcbiAgICAgICAgdmFyIGFzdCA9IHRoaXMucGFyc2UoKTtcbiAgICAgICAgLy9UT0RPOiBjaGVjayBmb3Igc3ludGF4IGVycm9ycyBhbmQgZG9uJ3QgY29tcGlsZVxuICAgICAgICAvL2NvbnNvbGUubG9nKGFzdC50b1hNTCgpKTtcbiAgICAgICAgdmFyIHRyYW5zbGF0b3IgPSBuZXcgVHJhbnNsYXRvcih0aGlzLnJvb3RTY3R4LCBhc3QpO1xuICAgICAgICB2YXIgaXQgPSB0cmFuc2xhdG9yLmNvbXBpbGUoKTtcbiAgICAgICAgdGhpcy5tYXJrZXJzID0gdGhpcy5tYXJrZXJzLmNvbmNhdCh0cmFuc2xhdG9yLmdldE1hcmtlcnMoKSk7XG4gICAgICAgIHJldHVybiBpdDtcbiAgICB9XG5cbiAgICBzdGF0aWMgc2VyaWFsaXplKGl0OiBJdGVyYXRvcik6IHN0cmluZyB7XG4gICAgICAgIHZhciBub2RlID0gbmV3IFNvdXJjZU1hcC5Tb3VyY2VOb2RlKDEsIDEsIGl0LmdldFBvc2l0aW9uKCkuZ2V0RmlsZU5hbWUoKSwgbnVsbCwgXCJNYWluUXVlcnlcIik7XG4gICAgICAgIG5vZGUuYWRkKFwiJ3VzZSBzdHJpY3QnO1xcblwiKTtcbiAgICAgICAgbm9kZS5hZGQoXCJyZXF1aXJlKCdzb3VyY2UtbWFwLXN1cHBvcnQnKS5pbnN0YWxsKCk7XFxuXCIpO1xuICAgICAgICBub2RlLmFkZChcInZhciByID0gcmVxdWlyZSgnanNvbmlxJykuUnVudGltZTtcXG5cIik7XG4gICAgICAgIG5vZGUuYWRkKFwidmFyIGl0ID0gXCIpO1xuICAgICAgICBub2RlLmFkZChpdC5zZXJpYWxpemUoKSk7XG4gICAgICAgIG5vZGUuYWRkKFwiO1xcblwiKTtcbiAgICAgICAgbm9kZS5hZGQoXCJmb3IodmFyIGl0ZW0gb2YgaXQpIHtcXG5cIik7XG4gICAgICAgIG5vZGUuYWRkKFwiICAgY29uc29sZS5sb2coaXRlbSk7XFxuXCIpO1xuICAgICAgICBub2RlLmFkZChcIn1cXG5cIik7XG4gICAgICAgIHZhciBzb3VyY2UgPSBub2RlLnRvU3RyaW5nV2l0aFNvdXJjZU1hcCgpO1xuICAgICAgICBzb3VyY2UuY29kZSArPSAgXCJcXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb24sXCIgKyBzb3VyY2UubWFwO1xuICAgICAgICByZXR1cm4gc291cmNlLmNvZGU7XG4gICAgfVxuXG4gICAgc3RhdGljIHNlcmlhbGl6ZURlYnVnKGl0OiBJdGVyYXRvcik6IHN0cmluZyB7XG4gICAgICAgIHZhciBub2RlID0gbmV3IFNvdXJjZU1hcC5Tb3VyY2VOb2RlKDEsIDEsIGl0LmdldFBvc2l0aW9uKCkuZ2V0RmlsZU5hbWUoKSwgbnVsbCwgXCJNYWluUXVlcnlcIik7XG4gICAgICAgIG5vZGUuYWRkKFwiJ3VzZSBzdHJpY3QnO1xcblwiKTtcbiAgICAgICAgbm9kZS5hZGQoXCJyZXF1aXJlKCdzb3VyY2UtbWFwLXN1cHBvcnQnKS5pbnN0YWxsKCk7XFxuXCIpO1xuICAgICAgICBub2RlLmFkZChcInZhciByID0gcmVxdWlyZSgnLi9kaXN0L2xpYi9ydW50aW1lL1J1bnRpbWUnKTtcXG5cIik7XG4gICAgICAgIG5vZGUuYWRkKFwidmFyIGl0ID0gXCIpO1xuICAgICAgICBub2RlLmFkZChpdC5zZXJpYWxpemUoKSk7XG4gICAgICAgIG5vZGUuYWRkKFwiO1xcblwiKTtcbiAgICAgICAgbm9kZS5hZGQoXCJmb3IodmFyIGl0ZW0gb2YgaXQpIHtcXG5cIik7XG4gICAgICAgIG5vZGUuYWRkKFwiICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoaXRlbSkpO1xcblwiKTtcbiAgICAgICAgbm9kZS5hZGQoXCJ9XFxuXCIpO1xuICAgICAgICB2YXIgc291cmNlID0gbm9kZS50b1N0cmluZ1dpdGhTb3VyY2VNYXAoKTtcbiAgICAgICAgc291cmNlLmNvZGUgKz0gIFwiXFxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uLFwiICsgc291cmNlLm1hcDtcbiAgICAgICAgcmV0dXJuIHNvdXJjZS5jb2RlO1xuICAgIH1cblxuICAgIGdldE1hcmtlcnMoKTogTWFya2VyW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXJrZXJzO1xuICAgIH1cbn1cbiJdLCJzb3VyY2VSb290IjoiL3NvdXJjZS8ifQ==