UNPKG

@jitterbit/soql-parser-js

Version:
866 lines (865 loc) 34.8 kB
"use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.isQueryValid = exports.parseQuery = void 0; var utils_1 = require("../utils"); var parser_1 = require("./parser"); var parser = new parser_1.SoqlParser(); var BaseSoqlVisitor = parser.getBaseCstVisitorConstructor(); var BOOLEANS = ['TRUE', 'FALSE']; var DATE_LITERALS = [ 'YESTERDAY', 'TODAY', 'TOMORROW', 'LAST_WEEK', 'THIS_WEEK', 'NEXT_WEEK', 'LAST_MONTH', 'THIS_MONTH', 'NEXT_MONTH', 'LAST_90_DAYS', 'NEXT_90_DAYS', 'THIS_QUARTER', 'LAST_QUARTER', 'NEXT_QUARTER', 'THIS_YEAR', 'LAST_YEAR', 'NEXT_YEAR', 'THIS_FISCAL_QUARTER', 'LAST_FISCAL_QUARTER', 'NEXT_FISCAL_QUARTER', 'THIS_FISCAL_YEAR', 'LAST_FISCAL_YEAR', 'NEXT_FISCAL_YEAR', ]; var DATE_N_LITERALS = [ 'NEXT_N_DAYS', 'LAST_N_DAYS', 'N_DAYS_AGO', 'NEXT_N_WEEKS', 'LAST_N_WEEKS', 'N_WEEKS_AGO', 'NEXT_N_MONTHS', 'LAST_N_MONTHS', 'N_MONTHS_AGO', 'NEXT_N_QUARTERS', 'LAST_N_QUARTERS', 'N_QUARTERS_AGO', 'NEXT_N_YEARS', 'LAST_N_YEARS', 'N_YEARS_AGO', 'NEXT_N_FISCAL_QUARTERS', 'LAST_N_FISCAL_QUARTERS', 'N_FISCAL_QUARTERS_AGO', 'NEXT_N_FISCAL_YEARS', 'LAST_N_FISCAL_YEARS', 'N_FISCAL_YEARS_AGO', ]; var SOQLVisitor = (function (_super) { __extends(SOQLVisitor, _super); function SOQLVisitor() { var _this = _super.call(this) || this; _this.helpers = { $_getFieldFunction: function (ctx, isAggregateFn, includeType) { if (isAggregateFn === void 0) { isAggregateFn = false; } if (includeType === void 0) { includeType = true; } var args = ctx.functionExpression ? ctx.functionExpression.map(function (node) { return _this.visit(node, { includeType: includeType }); }).flat() : []; var output = {}; if (includeType) { output.type = 'FieldFunctionExpression'; } output.functionName = ctx.fn[0].tokenType.name; output.parameters = args; if (includeType && isAggregateFn) { output.isAggregateFn = isAggregateFn; } output.rawValue = "".concat(ctx.fn[0].image, "(").concat(args.map(function (arg) { return (typeof arg === 'string' ? arg : arg.rawValue); }).join(', '), ")"); return output; }, $_getLiteralTypeFromTokenType: function (tokenTypeName) { if (tokenTypeName === 'REAL_NUMBER') { return 'DECIMAL'; } else if (tokenTypeName === 'CURRENCY_PREFIXED_DECIMAL') { return 'DECIMAL_WITH_CURRENCY_PREFIX'; } else if (tokenTypeName === 'CURRENCY_PREFIXED_INTEGER') { return 'INTEGER_WITH_CURRENCY_PREFIX'; } else if (tokenTypeName === 'SIGNED_DECIMAL') { return 'DECIMAL'; } else if (tokenTypeName === 'UNSIGNED_DECIMAL') { return 'DECIMAL'; } else if (tokenTypeName === 'UNSIGNED_INTEGER') { return 'INTEGER'; } else if (tokenTypeName === 'SIGNED_INTEGER') { return 'INTEGER'; } else if (tokenTypeName === 'DATETIME') { return 'DATETIME'; } else if (tokenTypeName === 'DATE') { return 'DATE'; } else if (tokenTypeName === 'NULL') { return 'NULL'; } else if (tokenTypeName === 'StringIdentifier') { return 'STRING'; } else if (tokenTypeName === 'Identifier') { return 'STRING'; } else if (BOOLEANS.includes(tokenTypeName)) { return 'BOOLEAN'; } else if (DATE_LITERALS.includes(tokenTypeName)) { return 'DATE_LITERAL'; } else if (DATE_N_LITERALS.includes(tokenTypeName)) { return 'DATE_N_LITERAL'; } else { return 'STRING'; } }, $_parseSelect: function (ctx, options) { var isSubquery = (options || { isSubquery: false }).isSubquery; var output = {}; if (ctx.selectClause) { output.fields = this.visit(ctx.selectClause); } if (ctx.fromClause) { if ((0, utils_1.isSubqueryFromFlag)(output, isSubquery)) { var _a = this.visit(ctx.fromClause), sObject = _a.sObject, alias = _a.alias, sObjectPrefix = _a.sObjectPrefix; output.relationshipName = sObject; if (alias) { output.sObjectAlias = alias; } if (sObjectPrefix) { output.sObjectPrefix = sObjectPrefix; } } else { var _b = this.visit(ctx.fromClause), sObject = _b.sObject, alias = _b.alias; output.sObject = sObject; if (alias) { output.sObjectAlias = alias; } } } if (Array.isArray(output.fields)) { if (!!output.sObjectAlias) { output.fields.forEach(function (field) { if (field.relationships && field.relationships[0] === output.sObjectAlias) { field.relationships = field.relationships.slice(1); field.objectPrefix = output.sObjectAlias; } if (field.relationships && field.relationships.length === 0) { delete field.relationships; field.type = 'Field'; } }); } } output = __assign(__assign({}, output), this.visit(ctx.clauseStatements)); return output; }, }; _this.validateVisitor(); return _this; } SOQLVisitor.prototype.selectStatement = function (ctx, options) { return this.helpers.$_parseSelect.bind(this)(ctx, options); }; SOQLVisitor.prototype.selectStatementPartial = function (ctx, options) { return this.helpers.$_parseSelect.bind(this)(ctx, options); }; SOQLVisitor.prototype.clauseStatements = function (ctx) { var _this = this; var query = {}; if (ctx.usingScopeClause && !ctx.usingScopeClause[0].recoveredNode) { query.usingScope = this.visit(ctx.usingScopeClause); } if (ctx.whereClause && !ctx.whereClause[0].recoveredNode) { query.where = this.visit(ctx.whereClause); } if (ctx.withClause) { ctx.withClause .filter(function (item) { return !item.recoveredNode; }) .forEach(function (item) { var _a = _this.visit(item), withSecurityEnforced = _a.withSecurityEnforced, withAccessLevel = _a.withAccessLevel, withDataCategory = _a.withDataCategory; if (withSecurityEnforced) { query.withSecurityEnforced = withSecurityEnforced; } if (withAccessLevel) { query.withAccessLevel = withAccessLevel; } if (withDataCategory) { query.withDataCategory = withDataCategory; } }); } if (ctx.groupByClause && !ctx.groupByClause[0].recoveredNode) { query.groupBy = this.visit(ctx.groupByClause); } if (ctx.havingClause && !ctx.havingClause[0].recoveredNode) { query.having = this.visit(ctx.havingClause); } if (ctx.orderByClause && !ctx.orderByClause[0].recoveredNode) { query.orderBy = this.visit(ctx.orderByClause); } if (ctx.limitClause && !ctx.limitClause[0].recoveredNode) { query.limit = Number(this.visit(ctx.limitClause)); } if (ctx.offsetClause && !ctx.offsetClause[0].recoveredNode) { query.offset = Number(this.visit(ctx.offsetClause)); } if (ctx.forViewOrReference && !ctx.forViewOrReference[0].recoveredNode) { query.for = this.visit(ctx.forViewOrReference); } if (ctx.updateTrackingViewstat && !ctx.updateTrackingViewstat[0].recoveredNode) { query.update = this.visit(ctx.updateTrackingViewstat); } return query; }; SOQLVisitor.prototype.selectClause = function (ctx) { var _this = this; if (ctx.field) { return ctx.field.map(function (item) { if ((0, utils_1.isToken)(item)) { var field = item.image; var output = void 0; if (!field.includes('.')) { output = { type: 'Field', field: field, }; } else { var splitFields = field.split('.'); output = { type: 'FieldRelationship', field: splitFields[splitFields.length - 1], relationships: splitFields.slice(0, splitFields.length - 1), rawValue: field, }; } return output; } else { return _this.visit(item); } }); } return []; }; SOQLVisitor.prototype.selectClauseFunctionIdentifier = function (ctx) { var output = __assign({}, this.visit(ctx.fn)); if (ctx.alias) { output.alias = ctx.alias[0].image; } return output; }; SOQLVisitor.prototype.selectClauseSubqueryIdentifier = function (ctx) { return { type: 'FieldSubquery', subquery: this.visit(ctx.selectStatement, { isSubquery: true }), }; }; SOQLVisitor.prototype.selectClauseTypeOf = function (ctx) { var _this = this; var conditions = ctx.selectClauseTypeOfThen.map(function (item) { return _this.visit(item); }); if (ctx.selectClauseTypeOfElse) { conditions.push(this.visit(ctx.selectClauseTypeOfElse)); } return { type: 'FieldTypeof', field: ctx.typeOfField[0].image, conditions: conditions, }; }; SOQLVisitor.prototype.selectClauseIdentifier = function (ctx) { var item = ctx.field[0]; var alias = !!ctx.alias ? ctx.alias[0].image : undefined; var field = item.image; var output; if (!field.includes('.')) { output = { type: 'Field', field: field, }; } else { var splitFields = field.split('.'); output = { type: 'FieldRelationship', field: splitFields[splitFields.length - 1], relationships: splitFields.slice(0, splitFields.length - 1), rawValue: field, }; } if (alias) { output.alias = alias; } return output; }; SOQLVisitor.prototype.selectClauseTypeOfThen = function (ctx) { return { type: 'WHEN', objectType: ctx.typeOfField[0].image, fieldList: ctx.field.map(function (item) { return item.image; }), }; }; SOQLVisitor.prototype.selectClauseTypeOfElse = function (ctx) { return { type: 'ELSE', fieldList: ctx.field.map(function (item) { return item.image; }), }; }; SOQLVisitor.prototype.fromClause = function (ctx) { var sObject = ctx.Identifier[0].image; var output; if (sObject.includes('.')) { var sObjectPrefix = sObject.split('.'); output = { sObjectPrefix: sObjectPrefix.slice(0, sObjectPrefix.length - 1), sObject: sObjectPrefix[sObjectPrefix.length - 1], }; } else { output = { sObject: sObject, }; } if (ctx.alias && ctx.alias[0]) { output.alias = ctx.alias[0].image; } return output; }; SOQLVisitor.prototype.usingScopeClause = function (ctx) { return ctx.UsingScopeEnumeration[0].image; }; SOQLVisitor.prototype.whereClauseSubqueryIdentifier = function (ctx) { return this.visit(ctx.selectStatement, { isSubquery: false }); }; SOQLVisitor.prototype.whereClause = function (ctx) { var _this = this; var where = ctx.conditionExpression.reduce(function (expressions, currExpression) { var tempExpression; if (!expressions.expressionTree) { tempExpression = _this.visit(currExpression); expressions.expressionTree = tempExpression; } else { tempExpression = _this.visit(currExpression, { prevExpression: expressions.prevExpression }); expressions.prevExpression.right = tempExpression; } var currentRightExpression = tempExpression.right; var nextRightExpression = tempExpression.right; while ((0, utils_1.isWhereClauseWithRightCondition)(nextRightExpression)) { currentRightExpression = nextRightExpression; nextRightExpression = nextRightExpression.right; } expressions.prevExpression = nextRightExpression || tempExpression; return expressions; }, { prevExpression: undefined, expressionTree: undefined }); return where.expressionTree; }; SOQLVisitor.prototype.conditionExpression = function (ctx, options) { var _this = this; options = options || {}; if (options.prevExpression && ctx.logicalOperator) { options.prevExpression.operator = ctx.logicalOperator[0].tokenType.name; } var baseExpression = {}; var currExpression = baseExpression; if (Array.isArray(ctx.expressionNegation)) { if (ctx.expressionNegation.length === 1) { baseExpression = this.visit(ctx.expressionNegation); currExpression = baseExpression.right; } else { baseExpression = this.visit(ctx.expressionNegation[0]); var currNestedExpression_1 = baseExpression; ctx.expressionNegation.slice(1).forEach(function (item) { currNestedExpression_1.right = _this.visit(item); currExpression = currNestedExpression_1.right.right; }); } } currExpression.left = this.visit(ctx.expression); return baseExpression; }; SOQLVisitor.prototype.withClause = function (ctx) { if (ctx.withSecurityEnforced) { return { withSecurityEnforced: true, }; } if (ctx.withAccessLevel) { return { withAccessLevel: ctx.withAccessLevel[0].image, }; } return { withDataCategory: { conditions: this.visit(ctx.withDataCategory), }, }; }; SOQLVisitor.prototype.withDataCategory = function (ctx) { var _this = this; return ctx.withDataCategoryArr.map(function (item) { return _this.visit(item); }); }; SOQLVisitor.prototype.withDataCategoryArr = function (ctx) { return { groupName: ctx.dataCategoryGroupName[0].image, selector: ctx.filteringSelector[0].image, parameters: ctx.dataCategoryName.map(function (item) { return item.image; }), }; }; SOQLVisitor.prototype.groupByClause = function (ctx) { var _this = this; return ctx.groupBy.map(function (groupBy) { return ((0, utils_1.isToken)(groupBy) ? { field: groupBy.image } : { fn: _this.visit(groupBy, { includeType: false }) }); }); }; SOQLVisitor.prototype.havingClause = function (ctx) { var _this = this; var having = ctx.conditionExpression.reduce(function (expressions, currExpression) { if (!expressions.expressionTree) { expressions.expressionTree = _this.visit(currExpression); expressions.prevExpression = expressions.expressionTree; } else { expressions.prevExpression.right = _this.visit(currExpression, { prevExpression: expressions.prevExpression, }); expressions.prevExpression = expressions.prevExpression.right; } return expressions; }, { prevExpression: undefined, expressionTree: undefined }); return having.expressionTree; }; SOQLVisitor.prototype.orderByClause = function (ctx) { var _this = this; return ctx.orderByExpressionOrFn.map(function (item) { return _this.visit(item); }); }; SOQLVisitor.prototype.orderByExpression = function (ctx) { var orderByClause = { field: ctx.Identifier[0].image, }; if (ctx.order && ctx.order[0]) { orderByClause.order = ctx.order[0].tokenType.name; } if (ctx.nulls && ctx.nulls[0]) { orderByClause.nulls = ctx.nulls[0].tokenType.name; } return orderByClause; }; SOQLVisitor.prototype.orderByGroupingFunctionExpression = function (ctx) { var orderByClause = { fn: this.helpers.$_getFieldFunction(ctx, false, false), }; if (ctx.order && ctx.order[0]) { orderByClause.order = ctx.order[0].tokenType.name; } if (ctx.nulls && ctx.nulls[0]) { orderByClause.nulls = ctx.nulls[0].tokenType.name; } return orderByClause; }; SOQLVisitor.prototype.orderBySpecialFunctionExpression = function (ctx) { var orderByClause = {}; if (ctx.aggregateFunction) { orderByClause.fn = this.visit(ctx.aggregateFunction, { includeType: false }); } else if (ctx.dateFunction) { orderByClause.fn = this.visit(ctx.dateFunction, { includeType: false }); } else if (ctx.locationFunction) { orderByClause.fn = this.visit(ctx.locationFunction, { includeType: false }); } if (ctx.order && ctx.order[0]) { orderByClause.order = ctx.order[0].tokenType.name; } if (ctx.nulls && ctx.nulls[0]) { orderByClause.nulls = ctx.nulls[0].tokenType.name; } return orderByClause; }; SOQLVisitor.prototype.limitClause = function (ctx) { return ctx.value[0].image; }; SOQLVisitor.prototype.offsetClause = function (ctx) { return ctx.value[0].image; }; SOQLVisitor.prototype.dateFunction = function (ctx, options) { if (options === void 0) { options = { includeType: true }; } return this.helpers.$_getFieldFunction(ctx, true, options.includeType); }; SOQLVisitor.prototype.aggregateFunction = function (ctx, options) { if (options === void 0) { options = { includeType: true }; } return this.helpers.$_getFieldFunction(ctx, true, options.includeType); }; SOQLVisitor.prototype.fieldsFunction = function (ctx, options) { if (options === void 0) { options = { includeType: true }; } var output = {}; if (options.includeType) { output.type = 'FieldFunctionExpression'; } output = __assign(__assign({}, output), { functionName: 'FIELDS', parameters: [ctx.params[0].image], }); output.rawValue = "FIELDS(".concat(output.parameters[0], ")"); return output; }; SOQLVisitor.prototype.otherFunction = function (ctx, options) { if (options === void 0) { options = { includeType: true }; } return this.helpers.$_getFieldFunction(ctx, false, options.includeType); }; SOQLVisitor.prototype.cubeFunction = function (ctx) { return this.helpers.$_getFieldFunction(ctx, false, false); }; SOQLVisitor.prototype.rollupFunction = function (ctx) { return this.helpers.$_getFieldFunction(ctx, false, false); }; SOQLVisitor.prototype.locationFunction = function (ctx, options) { if (options === void 0) { options = { includeType: true }; } var output = {}; if (options.includeType) { output.type = 'FieldFunctionExpression'; } output = __assign(__assign({}, output), { functionName: 'DISTANCE', parameters: [ ctx.location1[0].image, (0, utils_1.isToken)(ctx.location2) ? ctx.location2[0].image : this.visit(ctx.location2, options), ctx.unit[0].image, ], }); if (options.includeType) { output.isAggregateFn = true; } output.rawValue = "DISTANCE(".concat(output.parameters[0], ", ").concat((0, utils_1.isString)(output.parameters[1]) ? output.parameters[1] : output.parameters[1].rawValue, ", ").concat(output.parameters[2], ")"); return output; }; SOQLVisitor.prototype.geolocationFunction = function (ctx, options) { if (options === void 0) { options = { includeType: true }; } var output = {}; if (options.includeType) { output.type = 'FieldFunctionExpression'; } output = __assign(__assign({}, output), { functionName: 'GEOLOCATION', parameters: [ctx.latitude[0].image, ctx.longitude[0].image], rawValue: "GEOLOCATION(".concat(ctx.latitude[0].image, ", ").concat(ctx.longitude[0].image, ")"), }); return output; }; SOQLVisitor.prototype.functionExpression = function (ctx, options) { var _this = this; if (options === void 0) { options = { includeType: true }; } if (ctx.params) { return ctx.params.map(function (item) { if (item.image) { return item.image; } return _this.visit(item, options); }); } return []; }; SOQLVisitor.prototype.expression = function (ctx) { var _a = this.visit(ctx.operator, { returnLiteralType: true }), value = _a.value, literalType = _a.literalType, dateLiteralVariable = _a.dateLiteralVariable, operator = _a.operator; var output = {}; if ((0, utils_1.isToken)(ctx.lhs)) { output.field = ctx.lhs[0].image; } else { output.fn = this.visit(ctx.lhs, { includeType: false }); } output.operator = operator; output.literalType = literalType; if (literalType === 'SUBQUERY') { output.valueQuery = value; } else { output.value = value; } if (dateLiteralVariable) { output.dateLiteralVariable = dateLiteralVariable; } if (ctx.L_PAREN) { output.openParen = ctx.L_PAREN.length; } if (ctx.R_PAREN) { output.closeParen = ctx.R_PAREN.length; } return output; }; SOQLVisitor.prototype.expressionPartWithNegation = function (ctx) { var output = { left: ctx.L_PAREN ? { openParen: ctx.L_PAREN.length } : null, operator: 'NOT', right: { left: {}, }, }; return output; }; SOQLVisitor.prototype.expressionWithRelationalOperator = function (ctx) { if (ctx.relationalOperator) { return __assign({ operator: this.visit(ctx.relationalOperator) }, this.visit(ctx.rhs, { returnLiteralType: true })); } return __assign({ operator: this.visit(ctx.setOperator) }, this.visit(ctx.rhs, { returnLiteralType: true })); }; SOQLVisitor.prototype.expressionWithSetOperator = function (ctx) { if (ctx.relationalOperator) { return __assign({ operator: this.visit(ctx.relationalOperator) }, this.visit(ctx.rhs, { returnLiteralType: true })); } return __assign({ operator: this.visit(ctx.setOperator) }, this.visit(ctx.rhs, { returnLiteralType: true })); }; SOQLVisitor.prototype.atomicExpression = function (ctx, options) { var _this = this; options = options || {}; var value; var literalType; var dateLiteralVariable; if (ctx.apexBindVariableExpression) { value = this.visit(ctx.apexBindVariableExpression); literalType = 'APEX_BIND_VARIABLE'; } else if (ctx.jitterbitVariableExpression) { var data = ctx.jitterbitVariableExpression[0]; value = { text: data.image, variable: data.payload.variable, defaultValue: data.payload.defaultValue, }; literalType = 'JITTERBIT_VARIABLE'; } else if (ctx.NumberIdentifier) { value = ctx.NumberIdentifier[0].image; literalType = this.helpers.$_getLiteralTypeFromTokenType(ctx.NumberIdentifier[0].tokenType.name); } else if (ctx.UnsignedInteger) { value = ctx.UnsignedInteger[0].image; literalType = 'INTEGER'; } else if (ctx.SignedInteger) { value = ctx.SignedInteger[0].image; literalType = 'INTEGER'; } else if (ctx.RealNumber) { value = ctx.RealNumber[0].image; literalType = 'DECIMAL'; } else if (ctx.DateIdentifier) { value = ctx.DateIdentifier[0].image; literalType = this.helpers.$_getLiteralTypeFromTokenType(ctx.DateIdentifier[0].tokenType.name); } else if (ctx.CurrencyPrefixedInteger) { value = ctx.CurrencyPrefixedInteger[0].image; literalType = 'INTEGER_WITH_CURRENCY_PREFIX'; } else if (ctx.CurrencyPrefixedDecimal) { value = ctx.CurrencyPrefixedDecimal[0].image; literalType = 'DECIMAL_WITH_CURRENCY_PREFIX'; } else if (ctx.DateTime) { value = ctx.DateTime[0].image; literalType = 'DATETIME'; } else if (ctx.date) { value = ctx.DateToken[0].image; literalType = 'DATE'; } else if (ctx.NULL) { value = 'NULL'; literalType = 'NULL'; } else if (ctx.StringIdentifier) { value = ctx.StringIdentifier[0].image; literalType = 'STRING'; } else if (ctx.Identifier) { value = ctx.Identifier[0].image; literalType = 'STRING'; } else if (ctx.booleanValue) { value = this.visit(ctx.booleanValue); literalType = 'BOOLEAN'; } else if (ctx.DateLiteral) { value = ctx.DateLiteral[0].image; literalType = 'DATE_LITERAL'; } else if (ctx.dateNLiteral) { var valueAndVariable = this.visit(ctx.dateNLiteral); value = valueAndVariable.value; dateLiteralVariable = valueAndVariable.variable; literalType = 'DATE_N_LITERAL'; } else if (ctx.arrayExpression) { var arrayValues = this.visit(ctx.arrayExpression); value = arrayValues.map(function (item) { return item.value; }); var dateLiteralTemp = arrayValues.map(function (item) { return item.variable || null; }); var hasDateLiterals = dateLiteralTemp.some(function (item) { return item !== null; }); if (new Set(arrayValues.map(function (item) { return item.type; })).size === 1) { literalType = this.helpers.$_getLiteralTypeFromTokenType(arrayValues[0].type); } else { literalType = arrayValues.map(function (item) { return _this.helpers.$_getLiteralTypeFromTokenType(item.type); }); } if (hasDateLiterals) { dateLiteralVariable = dateLiteralTemp; } literalType = literalType || 'STRING'; } else if (ctx.whereClauseSubqueryIdentifier) { value = this.visit(ctx.whereClauseSubqueryIdentifier); literalType = 'SUBQUERY'; } if (options.returnLiteralType) { return { value: value, literalType: literalType, dateLiteralVariable: dateLiteralVariable, }; } else { return value; } }; SOQLVisitor.prototype.apexBindVariableExpression = function (ctx) { var _this = this; return ctx.apex.map(function (item) { return _this.visit(item); }).join('.'); }; SOQLVisitor.prototype.apexBindVariableIdentifier = function (ctx) { var output = ctx.Identifier[0].image; if (ctx.apexBindVariableFunctionArrayAccessor) { output += this.visit(ctx.apexBindVariableFunctionArrayAccessor[0]); } return output; }; SOQLVisitor.prototype.apexBindVariableNewInstantiation = function (ctx) { var output = "new ".concat(ctx.function[0].image); if (ctx.apexBindVariableGeneric) { output += this.visit(ctx.apexBindVariableGeneric[0]); } output += this.visit(ctx.apexBindVariableFunctionParams[0]); if (ctx.apexBindVariableFunctionArrayAccessor) { output += this.visit(ctx.apexBindVariableFunctionArrayAccessor[0]); } return output; }; SOQLVisitor.prototype.apexBindVariableFunctionCall = function (ctx) { var output = "".concat(ctx.function[0].image).concat(this.visit(ctx.apexBindVariableFunctionParams[0])); if (ctx.apexBindVariableFunctionArrayAccessor) { output += this.visit(ctx.apexBindVariableFunctionArrayAccessor[0]); } return output; }; SOQLVisitor.prototype.apexBindVariableGeneric = function (ctx) { return "<".concat(ctx.parameter.map(function (item) { return item.image; }).join(', '), ">"); }; SOQLVisitor.prototype.apexBindVariableFunctionParams = function (ctx) { var params = Array.isArray(ctx.parameter) ? ctx.parameter : []; return "(".concat(params.map(function (item) { return item.image; }).join(', '), ")"); }; SOQLVisitor.prototype.apexBindVariableFunctionArrayAccessor = function (ctx) { return "[".concat(ctx.value[0].image, "]"); }; SOQLVisitor.prototype.arrayExpression = function (ctx) { var _this = this; return ctx.value.map(function (item) { if ((0, utils_1.isToken)(item)) { return { type: item.tokenType.name, value: item.image, }; } return _this.visit(item, { includeType: true }); }); }; SOQLVisitor.prototype.relationalOperator = function (ctx) { return ctx.operator[0].image; }; SOQLVisitor.prototype.setOperator = function (ctx) { if (Array.isArray(ctx.operator)) { return ctx.operator[0].tokenType.name.replace('_', ' '); } if (Array.isArray(ctx.notIn)) { return this.visit(ctx.notIn); } }; SOQLVisitor.prototype.notInOperator = function (ctx) { return 'NOT IN'; }; SOQLVisitor.prototype.booleanValue = function (ctx) { return ctx.boolean[0].tokenType.name; }; SOQLVisitor.prototype.dateNLiteral = function (ctx, options) { var output = { value: "".concat(ctx.dateNLiteral[0].image, ":").concat(ctx.variable[0].image), variable: Number(ctx.variable[0].image), }; if (options && options.includeType) { output.type = ctx.dateNLiteral[0].tokenType.name; } return output; }; SOQLVisitor.prototype.forViewOrReference = function (ctx) { return ctx.value[0].tokenType.name; }; SOQLVisitor.prototype.updateTrackingViewstat = function (ctx) { return ctx.value[0].tokenType.name; }; return SOQLVisitor; }(BaseSoqlVisitor)); var visitor = new SOQLVisitor(); function parseQuery(soql, options) { var cst = (0, parser_1.parse)(soql, options).cst; var query = visitor.visit(cst); return query; } exports.parseQuery = parseQuery; function isQueryValid(soql, options) { try { var parseErrors = (0, parser_1.parse)(soql, options).parseErrors; return parseErrors.length === 0 ? true : false; } catch (ex) { return false; } } exports.isQueryValid = isQueryValid;