@react-querybuilder/core 8.16.2 → 8.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/react-querybuilder_core.cjs.development.d.ts +55 -5
- package/dist/cjs/react-querybuilder_core.cjs.development.js +14 -9
- package/dist/cjs/react-querybuilder_core.cjs.development.js.map +1 -1
- package/dist/cjs/react-querybuilder_core.cjs.production.d.ts +55 -5
- package/dist/cjs/react-querybuilder_core.cjs.production.js +1 -1
- package/dist/cjs/react-querybuilder_core.cjs.production.js.map +1 -1
- package/dist/{convertQuery-Lx2HQa0m.js → convertQuery-BoMPXL7_.js} +2 -2
- package/dist/{convertQuery-Lx2HQa0m.js.map → convertQuery-BoMPXL7_.js.map} +1 -1
- package/dist/{convertQuery-BeJJH9BI.mjs → convertQuery-CQwOrjQr.mjs} +2 -2
- package/dist/{convertQuery-BeJJH9BI.mjs.map → convertQuery-CQwOrjQr.mjs.map} +1 -1
- package/dist/formatQuery.d.mts +3 -1
- package/dist/formatQuery.d.ts +3 -1
- package/dist/formatQuery.js +13 -11
- package/dist/formatQuery.js.map +1 -1
- package/dist/formatQuery.mjs +13 -11
- package/dist/formatQuery.mjs.map +1 -1
- package/dist/{import-DqzM2MBd.d.ts → import-Qs1-kgv5.d.ts} +2 -2
- package/dist/{import-BXXgiPlr.d.mts → import-ShTj5IdB.d.mts} +2 -2
- package/dist/{index-NSVgGj45.d.ts → index-DlVg-QXo.d.mts} +51 -5
- package/dist/{index-CR-tk4Ci.d.mts → index-DlVg-QXo.d.ts} +51 -5
- package/dist/{objectUtils-D96eEEzL.mjs → objectUtils-D-w8MzpZ.mjs} +1 -1
- package/dist/{objectUtils-D96eEEzL.mjs.map → objectUtils-D-w8MzpZ.mjs.map} +1 -1
- package/dist/{objectUtils-Bzug_QfX.js → objectUtils-DxVaGCdg.js} +1 -2
- package/dist/{objectUtils-Bzug_QfX.js.map → objectUtils-DxVaGCdg.js.map} +1 -1
- package/dist/parseCEL.d.mts +7 -7
- package/dist/parseCEL.d.ts +7 -7
- package/dist/parseCEL.js +6 -7
- package/dist/parseCEL.js.map +1 -1
- package/dist/parseCEL.mjs +6 -6
- package/dist/parseCEL.mjs.map +1 -1
- package/dist/parseCypher.d.mts +1 -1
- package/dist/parseCypher.d.ts +1 -1
- package/dist/parseCypher.js +0 -1
- package/dist/parseCypher.js.map +1 -1
- package/dist/parseGremlin.d.mts +1 -1
- package/dist/parseGremlin.d.ts +1 -1
- package/dist/parseJSONata.d.mts +2 -2
- package/dist/parseJSONata.d.ts +2 -2
- package/dist/parseJSONata.js +2 -3
- package/dist/parseJSONata.mjs +2 -2
- package/dist/parseJsonLogic.d.mts +2 -2
- package/dist/parseJsonLogic.d.ts +2 -2
- package/dist/parseJsonLogic.js +11 -11
- package/dist/parseJsonLogic.js.map +1 -1
- package/dist/parseJsonLogic.mjs +11 -11
- package/dist/parseJsonLogic.mjs.map +1 -1
- package/dist/parseMongoDB.d.mts +2 -2
- package/dist/parseMongoDB.d.ts +2 -2
- package/dist/parseMongoDB.js +4 -4
- package/dist/parseMongoDB.mjs +4 -4
- package/dist/parseSPARQL.d.mts +1 -1
- package/dist/parseSPARQL.d.ts +1 -1
- package/dist/parseSPARQL.js +0 -1
- package/dist/parseSPARQL.js.map +1 -1
- package/dist/parseSQL.d.mts +2 -2
- package/dist/parseSQL.d.ts +2 -2
- package/dist/parseSQL.js +3 -4
- package/dist/parseSQL.js.map +1 -1
- package/dist/parseSQL.mjs +3 -3
- package/dist/parseSpEL.d.mts +2 -2
- package/dist/parseSpEL.d.ts +2 -2
- package/dist/parseSpEL.js +3 -4
- package/dist/parseSpEL.js.map +1 -1
- package/dist/parseSpEL.mjs +3 -3
- package/dist/{prepareQueryObjects-uA10ZpZX.mjs → prepareQueryObjects-BXf5aV-A.mjs} +3 -3
- package/dist/{prepareQueryObjects-uA10ZpZX.mjs.map → prepareQueryObjects-BXf5aV-A.mjs.map} +1 -1
- package/dist/{prepareQueryObjects-BoG5Rt8z.js → prepareQueryObjects-gRQqiBPR.js} +3 -3
- package/dist/{prepareQueryObjects-BoG5Rt8z.js.map → prepareQueryObjects-gRQqiBPR.js.map} +1 -1
- package/dist/react-querybuilder_core.d.mts +55 -5
- package/dist/react-querybuilder_core.legacy-esm.d.ts +55 -5
- package/dist/react-querybuilder_core.legacy-esm.js +21 -16
- package/dist/react-querybuilder_core.legacy-esm.js.map +1 -1
- package/dist/react-querybuilder_core.mjs +14 -9
- package/dist/react-querybuilder_core.mjs.map +1 -1
- package/dist/react-querybuilder_core.production.d.mts +55 -5
- package/dist/react-querybuilder_core.production.mjs +1 -1
- package/dist/react-querybuilder_core.production.mjs.map +1 -1
- package/dist/transformQuery.d.mts +1 -1
- package/dist/transformQuery.d.ts +1 -1
- package/dist/transformQuery.js +1 -1
- package/dist/transformQuery.mjs +1 -1
- package/dist/{utils-ChLG90DP.mjs → utils-01WaTGBL.mjs} +2 -2
- package/dist/utils-01WaTGBL.mjs.map +1 -0
- package/dist/{utils-Qwkq2Q0F.js → utils-ZlKseh1X.js} +2 -3
- package/dist/utils-ZlKseh1X.js.map +1 -0
- package/package.json +6 -6
- package/dist/utils-ChLG90DP.mjs.map +0 -1
- package/dist/utils-Qwkq2Q0F.js.map +0 -1
package/dist/parseCypher.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseCypher.js","names":["Lexer","CstParser"],"sources":["../src/utils/parseCypher/parseCypher.ts"],"sourcesContent":["import { createToken, Lexer, CstParser, type CstNode, type IToken } from 'chevrotain';\nimport type {\n DefaultRuleGroupType,\n DefaultRuleGroupTypeAny,\n DefaultRuleGroupTypeIC,\n DefaultRuleType,\n} from '../../types';\n\n// ─── Lexer Tokens ────────────────────────────────────────────────────────────\n\nconst WhiteSpace = createToken({ name: 'WhiteSpace', pattern: /\\s+/, group: Lexer.SKIPPED });\n\n// Keywords (longer/multi-word first)\nconst OptionalMatch = createToken({\n name: 'OptionalMatch',\n pattern: /OPTIONAL\\s+MATCH/i,\n longer_alt: undefined,\n});\nconst StartsWith = createToken({ name: 'StartsWith', pattern: /STARTS\\s+WITH/i });\nconst EndsWith = createToken({ name: 'EndsWith', pattern: /ENDS\\s+WITH/i });\nconst IsNotNull = createToken({ name: 'IsNotNull', pattern: /IS\\s+NOT\\s+NULL/i });\nconst IsNull = createToken({ name: 'IsNull', pattern: /IS\\s+NULL/i });\nconst NotIn = createToken({ name: 'NotIn', pattern: /NOT\\s+IN/i });\nconst Match = createToken({ name: 'Match', pattern: /MATCH/i });\nconst Where = createToken({ name: 'Where', pattern: /WHERE/i });\nconst Return = createToken({ name: 'Return', pattern: /RETURN/i });\nconst And = createToken({ name: 'And', pattern: /AND/i });\nconst Or = createToken({ name: 'Or', pattern: /OR/i });\nconst Not = createToken({ name: 'Not', pattern: /NOT/i });\nconst Contains = createToken({ name: 'Contains', pattern: /CONTAINS/i });\nconst In = createToken({ name: 'In', pattern: /IN/i });\nconst NullLit = createToken({ name: 'NullLit', pattern: /null\\b/ });\nconst TrueLit = createToken({ name: 'TrueLit', pattern: /true\\b/ });\nconst FalseLit = createToken({ name: 'FalseLit', pattern: /false\\b/ });\n\n// Literals\nconst StringLiteral = createToken({ name: 'StringLiteral', pattern: /'(?:[^'\\\\]|\\\\.)*'/ });\nconst NumberLiteral = createToken({ name: 'NumberLiteral', pattern: /-?\\d+(?:\\.\\d+)?/ });\n\n// Operators\nconst LessEqual = createToken({ name: 'LessEqual', pattern: /<=/ });\nconst GreaterEqual = createToken({ name: 'GreaterEqual', pattern: />=/ });\nconst NotEqual = createToken({ name: 'NotEqual', pattern: /<>/ });\nconst Less = createToken({ name: 'Less', pattern: /</ });\nconst Greater = createToken({ name: 'Greater', pattern: />/ });\nconst Equal = createToken({ name: 'Equal', pattern: /=/ });\n\n// Punctuation\nconst LParen = createToken({ name: 'LParen', pattern: /\\(/ });\nconst RParen = createToken({ name: 'RParen', pattern: /\\)/ });\nconst LBracket = createToken({ name: 'LBracket', pattern: /\\[/ });\nconst RBracket = createToken({ name: 'RBracket', pattern: /\\]/ });\nconst Comma = createToken({ name: 'Comma', pattern: /,/ });\nconst Colon = createToken({ name: 'Colon', pattern: /:/ });\nconst Dot = createToken({ name: 'Dot', pattern: /\\./ });\n\n// Arrow parts for relationship patterns\nconst DashArrowRight = createToken({ name: 'DashArrowRight', pattern: /->/ });\nconst ArrowLeftDash = createToken({ name: 'ArrowLeftDash', pattern: /<-/ });\nconst Dash = createToken({ name: 'Dash', pattern: /-/ });\n\n// Identifier (must come after all keywords)\nconst Identifier = createToken({ name: 'Identifier', pattern: /[a-zA-Z_]\\w*/ });\n\n// Token order matters: longer patterns and keywords before shorter ones\nconst allTokens = [\n WhiteSpace,\n // Multi-word keywords (must come before single-word)\n OptionalMatch,\n StartsWith,\n EndsWith,\n IsNotNull,\n IsNull,\n NotIn,\n // Single-word keywords\n Match,\n Where,\n Return,\n And,\n Or,\n Not,\n Contains,\n In,\n NullLit,\n TrueLit,\n FalseLit,\n // Literals\n StringLiteral,\n NumberLiteral,\n // Multi-char operators\n LessEqual,\n GreaterEqual,\n NotEqual,\n DashArrowRight,\n ArrowLeftDash,\n // Single-char operators\n Less,\n Greater,\n Equal,\n // Punctuation\n LParen,\n RParen,\n LBracket,\n RBracket,\n Comma,\n Colon,\n Dot,\n Dash,\n // Identifier last\n Identifier,\n];\n\nconst cypherLexer = new Lexer(allTokens);\n\n// ─── CST Parser ──────────────────────────────────────────────────────────────\n\nclass CypherCstParser extends CstParser {\n constructor() {\n super(allTokens, { recoveryEnabled: false });\n this.performSelfAnalysis();\n }\n\n /** Top-level: sequence of MATCH/OPTIONAL MATCH clauses, optional WHERE, optional RETURN */\n public cypherQuery = this.RULE('cypherQuery', () => {\n this.MANY(() => {\n this.OR([\n { ALT: () => this.SUBRULE(this.optionalMatchClause) },\n { ALT: () => this.SUBRULE(this.matchClause) },\n ]);\n });\n this.OPTION(() => this.SUBRULE(this.whereClause));\n this.OPTION1(() => this.SUBRULE(this.returnClause));\n });\n\n /** MATCH pattern */\n public matchClause = this.RULE('matchClause', () => {\n this.CONSUME(Match);\n this.SUBRULE(this.pattern);\n });\n\n /** OPTIONAL MATCH pattern */\n public optionalMatchClause = this.RULE('optionalMatchClause', () => {\n this.CONSUME(OptionalMatch);\n this.SUBRULE(this.pattern);\n });\n\n /** A graph pattern: node or node-rel-node */\n public pattern = this.RULE('pattern', () => {\n this.SUBRULE(this.nodePattern, { LABEL: 'lhs' });\n this.OPTION(() => {\n this.SUBRULE(this.relPattern);\n this.SUBRULE1(this.nodePattern, { LABEL: 'rhs' });\n });\n });\n\n /** (alias:Label) or (alias) */\n public nodePattern = this.RULE('nodePattern', () => {\n this.CONSUME(LParen);\n this.CONSUME(Identifier, { LABEL: 'alias' });\n this.OPTION(() => {\n this.CONSUME(Colon);\n this.CONSUME1(Identifier, { LABEL: 'label' });\n });\n this.CONSUME(RParen);\n });\n\n /** -[:TYPE]-> or <-[:TYPE]- or -[:TYPE]- */\n public relPattern = this.RULE('relPattern', () => {\n this.OR([\n {\n ALT: () => {\n this.CONSUME(ArrowLeftDash, { LABEL: 'leftArrow' });\n this.CONSUME(LBracket);\n this.OPTION(() => {\n this.CONSUME(Colon);\n this.CONSUME(Identifier, { LABEL: 'relType' });\n });\n this.CONSUME(RBracket);\n this.CONSUME(Dash, { LABEL: 'rightDash' });\n },\n },\n {\n ALT: () => {\n this.CONSUME1(Dash, { LABEL: 'leftDash' });\n this.CONSUME1(LBracket);\n this.OPTION1(() => {\n this.CONSUME1(Colon);\n this.CONSUME1(Identifier, { LABEL: 'relType' });\n });\n this.CONSUME1(RBracket);\n this.CONSUME(DashArrowRight, { LABEL: 'rightArrow' });\n },\n },\n ]);\n });\n\n /** WHERE expression */\n public whereClause = this.RULE('whereClause', () => {\n this.CONSUME(Where);\n this.SUBRULE(this.orExpression);\n });\n\n /** expression OR expression */\n public orExpression = this.RULE('orExpression', () => {\n this.SUBRULE(this.andExpression, { LABEL: 'lhs' });\n this.MANY(() => {\n this.CONSUME(Or);\n this.SUBRULE1(this.andExpression, { LABEL: 'rhs' });\n });\n });\n\n /** expression AND expression */\n public andExpression = this.RULE('andExpression', () => {\n this.SUBRULE(this.notExpression, { LABEL: 'lhs' });\n this.MANY(() => {\n this.CONSUME(And);\n this.SUBRULE1(this.notExpression, { LABEL: 'rhs' });\n });\n });\n\n /** NOT expression */\n public notExpression = this.RULE('notExpression', () => {\n this.OPTION(() => this.CONSUME(Not));\n this.SUBRULE(this.atomicExpression);\n });\n\n /** Parenthesized group or single condition */\n public atomicExpression = this.RULE('atomicExpression', () => {\n this.OR([\n {\n ALT: () => {\n this.CONSUME(LParen);\n this.SUBRULE(this.orExpression);\n this.CONSUME(RParen);\n },\n },\n { ALT: () => this.SUBRULE(this.condition) },\n ]);\n });\n\n /** Single condition: field op value */\n public condition = this.RULE('condition', () => {\n this.SUBRULE(this.propertyRef, { LABEL: 'field' });\n this.OR([\n {\n ALT: () => {\n this.CONSUME(Equal);\n this.SUBRULE(this.literal, { LABEL: 'value' });\n },\n },\n {\n ALT: () => {\n this.CONSUME(NotEqual);\n this.SUBRULE1(this.literal, { LABEL: 'value' });\n },\n },\n {\n ALT: () => {\n this.CONSUME(Less);\n this.SUBRULE2(this.literal, { LABEL: 'value' });\n },\n },\n {\n ALT: () => {\n this.CONSUME(Greater);\n this.SUBRULE3(this.literal, { LABEL: 'value' });\n },\n },\n {\n ALT: () => {\n this.CONSUME(LessEqual);\n this.SUBRULE4(this.literal, { LABEL: 'value' });\n },\n },\n {\n ALT: () => {\n this.CONSUME(GreaterEqual);\n this.SUBRULE5(this.literal, { LABEL: 'value' });\n },\n },\n {\n ALT: () => {\n this.CONSUME(Contains);\n this.SUBRULE6(this.literal, { LABEL: 'value' });\n },\n },\n {\n ALT: () => {\n this.CONSUME(StartsWith);\n this.SUBRULE7(this.literal, { LABEL: 'value' });\n },\n },\n {\n ALT: () => {\n this.CONSUME(EndsWith);\n this.SUBRULE8(this.literal, { LABEL: 'value' });\n },\n },\n { ALT: () => this.CONSUME(IsNotNull) },\n { ALT: () => this.CONSUME(IsNull) },\n {\n ALT: () => {\n this.CONSUME(In);\n this.SUBRULE(this.listLiteral, { LABEL: 'list' });\n },\n },\n {\n ALT: () => {\n this.CONSUME(NotIn);\n this.SUBRULE1(this.listLiteral, { LABEL: 'list' });\n },\n },\n ]);\n });\n\n /** Dotted property reference: alias.prop or just identifier */\n public propertyRef = this.RULE('propertyRef', () => {\n this.CONSUME(Identifier, { LABEL: 'head' });\n this.MANY(() => {\n this.CONSUME(Dot);\n this.CONSUME1(Identifier, { LABEL: 'tail' });\n });\n });\n\n /** A literal value */\n public literal = this.RULE('literal', () => {\n this.OR([\n { ALT: () => this.CONSUME(StringLiteral) },\n { ALT: () => this.CONSUME(NumberLiteral) },\n { ALT: () => this.CONSUME(NullLit) },\n { ALT: () => this.CONSUME(TrueLit) },\n { ALT: () => this.CONSUME(FalseLit) },\n { ALT: () => this.CONSUME(Identifier) },\n ]);\n });\n\n /** [val, val, ...] */\n public listLiteral = this.RULE('listLiteral', () => {\n this.CONSUME(LBracket);\n this.OPTION(() => {\n this.SUBRULE(this.literal, { LABEL: 'items' });\n this.MANY(() => {\n this.CONSUME(Comma);\n this.SUBRULE1(this.literal, { LABEL: 'items' });\n });\n });\n this.CONSUME(RBracket);\n });\n\n /** RETURN clause (consumed but not transformed) */\n public returnClause = this.RULE('returnClause', () => {\n this.CONSUME(Return);\n this.MANY(() => {\n this.OR([\n { ALT: () => this.CONSUME(Identifier) },\n { ALT: () => this.CONSUME(Comma) },\n { ALT: () => this.CONSUME(Dot) },\n ]);\n });\n });\n}\n\nconst parserInstance = new CypherCstParser();\n\n// ─── CST Visitor (CST → RuleGroupType) ──────────────────────────────────────\n\n/** Resolves a literal token to a JS value. */\nconst tokenToValue = (token: IToken): unknown => {\n const img = token.image;\n switch (token.tokenType) {\n case StringLiteral:\n return img.slice(1, -1).replace(/\\\\'/g, \"'\");\n case NumberLiteral:\n return Number(img);\n case NullLit:\n return null;\n case TrueLit:\n return true;\n case FalseLit:\n return false;\n default:\n return img;\n }\n};\n\n/** Extracts a literal value from a CST 'literal' node. */\nconst extractLiteral = (literalNode: CstNode): unknown => {\n const children = literalNode.children;\n const token =\n (children.StringLiteral as IToken[])?.[0] ??\n (children.NumberLiteral as IToken[])?.[0] ??\n (children.NullLit as IToken[])?.[0] ??\n (children.TrueLit as IToken[])?.[0] ??\n (children.FalseLit as IToken[])?.[0] ??\n (children.Identifier as IToken[])?.[0];\n return token ? tokenToValue(token) : '';\n};\n\n/** Builds a dotted property reference string from a propertyRef CST node. */\nconst extractPropertyRef = (node: CstNode): string => {\n const head = (node.children.head as IToken[])[0].image;\n const tails = (node.children.tail as IToken[] | undefined) ?? [];\n if (tails.length === 0) return head;\n return head + '.' + tails.map(t => t.image).join('.');\n};\n\n/** Extracts list items from a listLiteral CST node. */\nconst extractList = (node: CstNode): unknown[] => {\n const items = (node.children.items as CstNode[] | undefined) ?? [];\n return items.map(extractLiteral);\n};\n\ntype RuleOrGroup = DefaultRuleType | DefaultRuleGroupType;\n\n/** Visits an orExpression CST node. */\nconst visitOrExpression = (node: CstNode): RuleOrGroup[] => {\n const lhsNodes = node.children.lhs as CstNode[];\n const rhsNodes = (node.children.rhs as CstNode[] | undefined) ?? [];\n\n if (rhsNodes.length === 0) {\n return visitAndExpression(lhsNodes[0]);\n }\n\n const allParts = [lhsNodes[0], ...rhsNodes];\n const subRules: RuleOrGroup[] = [];\n for (const part of allParts) {\n const partRules = visitAndExpression(part);\n if (partRules.length === 1) {\n subRules.push(partRules[0]);\n } else {\n subRules.push({ combinator: 'and', rules: partRules });\n }\n }\n return [{ combinator: 'or', rules: subRules }];\n};\n\n/** Visits an andExpression CST node. */\nconst visitAndExpression = (node: CstNode): RuleOrGroup[] => {\n const lhsNodes = node.children.lhs as CstNode[];\n const rhsNodes = (node.children.rhs as CstNode[] | undefined) ?? [];\n const all = [lhsNodes[0], ...rhsNodes];\n const rules: RuleOrGroup[] = [];\n for (const item of all) {\n rules.push(...visitNotExpression(item));\n }\n return rules;\n};\n\n/** Visits a notExpression CST node. */\nconst visitNotExpression = (node: CstNode): RuleOrGroup[] => {\n const hasNot = !!(node.children.Not as IToken[] | undefined)?.length;\n const atomicRules = visitAtomicExpression((node.children.atomicExpression as CstNode[])[0]);\n\n if (!hasNot) return atomicRules;\n\n return [{ combinator: 'and', not: true, rules: atomicRules }];\n};\n\n/** Visits an atomicExpression CST node. */\nconst visitAtomicExpression = (node: CstNode): RuleOrGroup[] => {\n if (node.children.orExpression) {\n return visitOrExpression((node.children.orExpression as CstNode[])[0]);\n }\n if (node.children.condition) {\n return [visitCondition((node.children.condition as CstNode[])[0])];\n }\n return [];\n};\n\n/** Visits a condition CST node and returns a DefaultRuleType (no meta). */\nconst visitCondition = (node: CstNode): DefaultRuleType => {\n const field = extractPropertyRef((node.children.field as CstNode[])[0]);\n\n if (node.children.IsNull) {\n return { field, operator: 'null', value: null } as DefaultRuleType;\n }\n if (node.children.IsNotNull) {\n return { field, operator: 'notNull', value: null } as DefaultRuleType;\n }\n\n if (node.children.In) {\n const list = extractList((node.children.list as CstNode[])[0]);\n return { field, operator: 'in', value: list } as DefaultRuleType;\n }\n if (node.children.NotIn) {\n const list = extractList((node.children.list as CstNode[])[0]);\n return { field, operator: 'notIn', value: list } as DefaultRuleType;\n }\n\n const valueNode = (node.children.value as CstNode[] | undefined)?.[0];\n const value = valueNode ? extractLiteral(valueNode) : null;\n\n if (node.children.Equal) return { field, operator: '=', value } as DefaultRuleType;\n if (node.children.NotEqual) return { field, operator: '!=', value } as DefaultRuleType;\n if (node.children.Less) return { field, operator: '<', value } as DefaultRuleType;\n if (node.children.Greater) return { field, operator: '>', value } as DefaultRuleType;\n if (node.children.LessEqual) return { field, operator: '<=', value } as DefaultRuleType;\n if (node.children.GreaterEqual) return { field, operator: '>=', value } as DefaultRuleType;\n if (node.children.Contains) return { field, operator: 'contains', value } as DefaultRuleType;\n if (node.children.StartsWith) return { field, operator: 'beginsWith', value } as DefaultRuleType;\n if (node.children.EndsWith) return { field, operator: 'endsWith', value } as DefaultRuleType;\n\n return { field, operator: '=', value } as DefaultRuleType;\n};\n\n// ─── Public API ──────────────────────────────────────────────────────────────\n\n/**\n * Options for {@link parseCypher}.\n */\nexport interface ParseCypherOptions {\n independentCombinators?: boolean;\n}\n\n/**\n * Parses a Cypher query string into a {@link DefaultRuleGroupType}.\n *\n * Accepts a full Cypher query, a `WHERE` clause, or a bare boolean expression.\n * MATCH and RETURN clauses are consumed but discarded — only WHERE conditions\n * are returned.\n *\n * @example\n * ```ts\n * // Full query — extracts WHERE conditions only\n * parseCypher('MATCH (a:Person) WHERE a.age > 30 RETURN a');\n *\n * // WHERE clause\n * parseCypher('WHERE a.age > 30 AND a.name CONTAINS \"Alice\"');\n *\n * // Bare expression\n * parseCypher('a.age > 30 AND a.name CONTAINS \"Alice\"');\n * ```\n */\nexport function parseCypher(cypher: string): DefaultRuleGroupType;\nexport function parseCypher(\n cypher: string,\n options: Omit<ParseCypherOptions, 'independentCombinators'> & {\n independentCombinators?: false;\n }\n): DefaultRuleGroupType;\nexport function parseCypher(\n cypher: string,\n options: Omit<ParseCypherOptions, 'independentCombinators'> & {\n independentCombinators: true;\n }\n): DefaultRuleGroupTypeIC;\nexport function parseCypher(\n cypher: string,\n _options?: ParseCypherOptions\n): DefaultRuleGroupTypeAny {\n const trimmed = cypher.trim();\n if (!trimmed) return { combinator: 'and', rules: [] };\n\n // Auto-detect input shape (like parseSQL)\n let input = trimmed;\n if (!/^\\s*match\\b/i.test(input) && !/^\\s*where\\b/i.test(input)) {\n // Bare expression — prepend WHERE so the parser can handle it\n input = `WHERE ${input}`;\n }\n\n const lexResult = cypherLexer.tokenize(input);\n if (lexResult.errors.length > 0) {\n return { combinator: 'and', rules: [] };\n }\n\n parserInstance.input = lexResult.tokens;\n const cst = parserInstance.cypherQuery();\n\n if (parserInstance.errors.length > 0) {\n return { combinator: 'and', rules: [] };\n }\n\n const rules: RuleOrGroup[] = [];\n\n // Only process WHERE clause — skip MATCH/RETURN\n const whereClauses = (cst.children.whereClause as CstNode[] | undefined) ?? [];\n if (whereClauses.length > 0) {\n const whereNode = whereClauses[0];\n const orExpr = (whereNode.children.orExpression as CstNode[])[0];\n const whereRules = visitOrExpression(orExpr);\n\n // If the top-level OR produced a single AND group without NOT, flatten it\n if (\n whereRules.length === 1 &&\n 'combinator' in whereRules[0] &&\n whereRules[0].combinator === 'and' &&\n !('not' in whereRules[0] && whereRules[0].not)\n ) {\n rules.push(...whereRules[0].rules);\n } else {\n rules.push(...whereRules);\n }\n }\n\n return { combinator: 'and', rules };\n}\n\n/**\n * Parses a GQL query string. GQL is ~95% compatible with Cypher;\n * the parser handles the same syntax.\n */\nexport function parseGQL(gql: string): DefaultRuleGroupType;\nexport function parseGQL(\n gql: string,\n options: Omit<ParseCypherOptions, 'independentCombinators'> & {\n independentCombinators?: false;\n }\n): DefaultRuleGroupType;\nexport function parseGQL(\n gql: string,\n options: Omit<ParseCypherOptions, 'independentCombinators'> & {\n independentCombinators: true;\n }\n): DefaultRuleGroupTypeIC;\nexport function parseGQL(gql: string, options?: ParseCypherOptions): DefaultRuleGroupTypeAny {\n // Call the implementation signature directly (not the overloads)\n return (parseCypher as (s: string, o?: ParseCypherOptions) => DefaultRuleGroupTypeAny)(\n gql,\n options\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"parseCypher.js","names":["Lexer","CstParser"],"sources":["../src/utils/parseCypher/parseCypher.ts"],"sourcesContent":["import { createToken, Lexer, CstParser, type CstNode, type IToken } from 'chevrotain';\nimport type {\n DefaultRuleGroupType,\n DefaultRuleGroupTypeAny,\n DefaultRuleGroupTypeIC,\n DefaultRuleType,\n} from '../../types';\n\n// ─── Lexer Tokens ────────────────────────────────────────────────────────────\n\nconst WhiteSpace = createToken({ name: 'WhiteSpace', pattern: /\\s+/, group: Lexer.SKIPPED });\n\n// Keywords (longer/multi-word first)\nconst OptionalMatch = createToken({\n name: 'OptionalMatch',\n pattern: /OPTIONAL\\s+MATCH/i,\n longer_alt: undefined,\n});\nconst StartsWith = createToken({ name: 'StartsWith', pattern: /STARTS\\s+WITH/i });\nconst EndsWith = createToken({ name: 'EndsWith', pattern: /ENDS\\s+WITH/i });\nconst IsNotNull = createToken({ name: 'IsNotNull', pattern: /IS\\s+NOT\\s+NULL/i });\nconst IsNull = createToken({ name: 'IsNull', pattern: /IS\\s+NULL/i });\nconst NotIn = createToken({ name: 'NotIn', pattern: /NOT\\s+IN/i });\nconst Match = createToken({ name: 'Match', pattern: /MATCH/i });\nconst Where = createToken({ name: 'Where', pattern: /WHERE/i });\nconst Return = createToken({ name: 'Return', pattern: /RETURN/i });\nconst And = createToken({ name: 'And', pattern: /AND/i });\nconst Or = createToken({ name: 'Or', pattern: /OR/i });\nconst Not = createToken({ name: 'Not', pattern: /NOT/i });\nconst Contains = createToken({ name: 'Contains', pattern: /CONTAINS/i });\nconst In = createToken({ name: 'In', pattern: /IN/i });\nconst NullLit = createToken({ name: 'NullLit', pattern: /null\\b/ });\nconst TrueLit = createToken({ name: 'TrueLit', pattern: /true\\b/ });\nconst FalseLit = createToken({ name: 'FalseLit', pattern: /false\\b/ });\n\n// Literals\nconst StringLiteral = createToken({ name: 'StringLiteral', pattern: /'(?:[^'\\\\]|\\\\.)*'/ });\nconst NumberLiteral = createToken({ name: 'NumberLiteral', pattern: /-?\\d+(?:\\.\\d+)?/ });\n\n// Operators\nconst LessEqual = createToken({ name: 'LessEqual', pattern: /<=/ });\nconst GreaterEqual = createToken({ name: 'GreaterEqual', pattern: />=/ });\nconst NotEqual = createToken({ name: 'NotEqual', pattern: /<>/ });\nconst Less = createToken({ name: 'Less', pattern: /</ });\nconst Greater = createToken({ name: 'Greater', pattern: />/ });\nconst Equal = createToken({ name: 'Equal', pattern: /=/ });\n\n// Punctuation\nconst LParen = createToken({ name: 'LParen', pattern: /\\(/ });\nconst RParen = createToken({ name: 'RParen', pattern: /\\)/ });\nconst LBracket = createToken({ name: 'LBracket', pattern: /\\[/ });\nconst RBracket = createToken({ name: 'RBracket', pattern: /\\]/ });\nconst Comma = createToken({ name: 'Comma', pattern: /,/ });\nconst Colon = createToken({ name: 'Colon', pattern: /:/ });\nconst Dot = createToken({ name: 'Dot', pattern: /\\./ });\n\n// Arrow parts for relationship patterns\nconst DashArrowRight = createToken({ name: 'DashArrowRight', pattern: /->/ });\nconst ArrowLeftDash = createToken({ name: 'ArrowLeftDash', pattern: /<-/ });\nconst Dash = createToken({ name: 'Dash', pattern: /-/ });\n\n// Identifier (must come after all keywords)\nconst Identifier = createToken({ name: 'Identifier', pattern: /[a-zA-Z_]\\w*/ });\n\n// Token order matters: longer patterns and keywords before shorter ones\nconst allTokens = [\n WhiteSpace,\n // Multi-word keywords (must come before single-word)\n OptionalMatch,\n StartsWith,\n EndsWith,\n IsNotNull,\n IsNull,\n NotIn,\n // Single-word keywords\n Match,\n Where,\n Return,\n And,\n Or,\n Not,\n Contains,\n In,\n NullLit,\n TrueLit,\n FalseLit,\n // Literals\n StringLiteral,\n NumberLiteral,\n // Multi-char operators\n LessEqual,\n GreaterEqual,\n NotEqual,\n DashArrowRight,\n ArrowLeftDash,\n // Single-char operators\n Less,\n Greater,\n Equal,\n // Punctuation\n LParen,\n RParen,\n LBracket,\n RBracket,\n Comma,\n Colon,\n Dot,\n Dash,\n // Identifier last\n Identifier,\n];\n\nconst cypherLexer = new Lexer(allTokens);\n\n// ─── CST Parser ──────────────────────────────────────────────────────────────\n\nclass CypherCstParser extends CstParser {\n constructor() {\n super(allTokens, { recoveryEnabled: false });\n this.performSelfAnalysis();\n }\n\n /** Top-level: sequence of MATCH/OPTIONAL MATCH clauses, optional WHERE, optional RETURN */\n public cypherQuery = this.RULE('cypherQuery', () => {\n this.MANY(() => {\n this.OR([\n { ALT: () => this.SUBRULE(this.optionalMatchClause) },\n { ALT: () => this.SUBRULE(this.matchClause) },\n ]);\n });\n this.OPTION(() => this.SUBRULE(this.whereClause));\n this.OPTION1(() => this.SUBRULE(this.returnClause));\n });\n\n /** MATCH pattern */\n public matchClause = this.RULE('matchClause', () => {\n this.CONSUME(Match);\n this.SUBRULE(this.pattern);\n });\n\n /** OPTIONAL MATCH pattern */\n public optionalMatchClause = this.RULE('optionalMatchClause', () => {\n this.CONSUME(OptionalMatch);\n this.SUBRULE(this.pattern);\n });\n\n /** A graph pattern: node or node-rel-node */\n public pattern = this.RULE('pattern', () => {\n this.SUBRULE(this.nodePattern, { LABEL: 'lhs' });\n this.OPTION(() => {\n this.SUBRULE(this.relPattern);\n this.SUBRULE1(this.nodePattern, { LABEL: 'rhs' });\n });\n });\n\n /** (alias:Label) or (alias) */\n public nodePattern = this.RULE('nodePattern', () => {\n this.CONSUME(LParen);\n this.CONSUME(Identifier, { LABEL: 'alias' });\n this.OPTION(() => {\n this.CONSUME(Colon);\n this.CONSUME1(Identifier, { LABEL: 'label' });\n });\n this.CONSUME(RParen);\n });\n\n /** -[:TYPE]-> or <-[:TYPE]- or -[:TYPE]- */\n public relPattern = this.RULE('relPattern', () => {\n this.OR([\n {\n ALT: () => {\n this.CONSUME(ArrowLeftDash, { LABEL: 'leftArrow' });\n this.CONSUME(LBracket);\n this.OPTION(() => {\n this.CONSUME(Colon);\n this.CONSUME(Identifier, { LABEL: 'relType' });\n });\n this.CONSUME(RBracket);\n this.CONSUME(Dash, { LABEL: 'rightDash' });\n },\n },\n {\n ALT: () => {\n this.CONSUME1(Dash, { LABEL: 'leftDash' });\n this.CONSUME1(LBracket);\n this.OPTION1(() => {\n this.CONSUME1(Colon);\n this.CONSUME1(Identifier, { LABEL: 'relType' });\n });\n this.CONSUME1(RBracket);\n this.CONSUME(DashArrowRight, { LABEL: 'rightArrow' });\n },\n },\n ]);\n });\n\n /** WHERE expression */\n public whereClause = this.RULE('whereClause', () => {\n this.CONSUME(Where);\n this.SUBRULE(this.orExpression);\n });\n\n /** expression OR expression */\n public orExpression = this.RULE('orExpression', () => {\n this.SUBRULE(this.andExpression, { LABEL: 'lhs' });\n this.MANY(() => {\n this.CONSUME(Or);\n this.SUBRULE1(this.andExpression, { LABEL: 'rhs' });\n });\n });\n\n /** expression AND expression */\n public andExpression = this.RULE('andExpression', () => {\n this.SUBRULE(this.notExpression, { LABEL: 'lhs' });\n this.MANY(() => {\n this.CONSUME(And);\n this.SUBRULE1(this.notExpression, { LABEL: 'rhs' });\n });\n });\n\n /** NOT expression */\n public notExpression = this.RULE('notExpression', () => {\n this.OPTION(() => this.CONSUME(Not));\n this.SUBRULE(this.atomicExpression);\n });\n\n /** Parenthesized group or single condition */\n public atomicExpression = this.RULE('atomicExpression', () => {\n this.OR([\n {\n ALT: () => {\n this.CONSUME(LParen);\n this.SUBRULE(this.orExpression);\n this.CONSUME(RParen);\n },\n },\n { ALT: () => this.SUBRULE(this.condition) },\n ]);\n });\n\n /** Single condition: field op value */\n public condition = this.RULE('condition', () => {\n this.SUBRULE(this.propertyRef, { LABEL: 'field' });\n this.OR([\n {\n ALT: () => {\n this.CONSUME(Equal);\n this.SUBRULE(this.literal, { LABEL: 'value' });\n },\n },\n {\n ALT: () => {\n this.CONSUME(NotEqual);\n this.SUBRULE1(this.literal, { LABEL: 'value' });\n },\n },\n {\n ALT: () => {\n this.CONSUME(Less);\n this.SUBRULE2(this.literal, { LABEL: 'value' });\n },\n },\n {\n ALT: () => {\n this.CONSUME(Greater);\n this.SUBRULE3(this.literal, { LABEL: 'value' });\n },\n },\n {\n ALT: () => {\n this.CONSUME(LessEqual);\n this.SUBRULE4(this.literal, { LABEL: 'value' });\n },\n },\n {\n ALT: () => {\n this.CONSUME(GreaterEqual);\n this.SUBRULE5(this.literal, { LABEL: 'value' });\n },\n },\n {\n ALT: () => {\n this.CONSUME(Contains);\n this.SUBRULE6(this.literal, { LABEL: 'value' });\n },\n },\n {\n ALT: () => {\n this.CONSUME(StartsWith);\n this.SUBRULE7(this.literal, { LABEL: 'value' });\n },\n },\n {\n ALT: () => {\n this.CONSUME(EndsWith);\n this.SUBRULE8(this.literal, { LABEL: 'value' });\n },\n },\n { ALT: () => this.CONSUME(IsNotNull) },\n { ALT: () => this.CONSUME(IsNull) },\n {\n ALT: () => {\n this.CONSUME(In);\n this.SUBRULE(this.listLiteral, { LABEL: 'list' });\n },\n },\n {\n ALT: () => {\n this.CONSUME(NotIn);\n this.SUBRULE1(this.listLiteral, { LABEL: 'list' });\n },\n },\n ]);\n });\n\n /** Dotted property reference: alias.prop or just identifier */\n public propertyRef = this.RULE('propertyRef', () => {\n this.CONSUME(Identifier, { LABEL: 'head' });\n this.MANY(() => {\n this.CONSUME(Dot);\n this.CONSUME1(Identifier, { LABEL: 'tail' });\n });\n });\n\n /** A literal value */\n public literal = this.RULE('literal', () => {\n this.OR([\n { ALT: () => this.CONSUME(StringLiteral) },\n { ALT: () => this.CONSUME(NumberLiteral) },\n { ALT: () => this.CONSUME(NullLit) },\n { ALT: () => this.CONSUME(TrueLit) },\n { ALT: () => this.CONSUME(FalseLit) },\n { ALT: () => this.CONSUME(Identifier) },\n ]);\n });\n\n /** [val, val, ...] */\n public listLiteral = this.RULE('listLiteral', () => {\n this.CONSUME(LBracket);\n this.OPTION(() => {\n this.SUBRULE(this.literal, { LABEL: 'items' });\n this.MANY(() => {\n this.CONSUME(Comma);\n this.SUBRULE1(this.literal, { LABEL: 'items' });\n });\n });\n this.CONSUME(RBracket);\n });\n\n /** RETURN clause (consumed but not transformed) */\n public returnClause = this.RULE('returnClause', () => {\n this.CONSUME(Return);\n this.MANY(() => {\n this.OR([\n { ALT: () => this.CONSUME(Identifier) },\n { ALT: () => this.CONSUME(Comma) },\n { ALT: () => this.CONSUME(Dot) },\n ]);\n });\n });\n}\n\nconst parserInstance = new CypherCstParser();\n\n// ─── CST Visitor (CST → RuleGroupType) ──────────────────────────────────────\n\n/** Resolves a literal token to a JS value. */\nconst tokenToValue = (token: IToken): unknown => {\n const img = token.image;\n switch (token.tokenType) {\n case StringLiteral:\n return img.slice(1, -1).replace(/\\\\'/g, \"'\");\n case NumberLiteral:\n return Number(img);\n case NullLit:\n return null;\n case TrueLit:\n return true;\n case FalseLit:\n return false;\n default:\n return img;\n }\n};\n\n/** Extracts a literal value from a CST 'literal' node. */\nconst extractLiteral = (literalNode: CstNode): unknown => {\n const children = literalNode.children;\n const token =\n (children.StringLiteral as IToken[])?.[0] ??\n (children.NumberLiteral as IToken[])?.[0] ??\n (children.NullLit as IToken[])?.[0] ??\n (children.TrueLit as IToken[])?.[0] ??\n (children.FalseLit as IToken[])?.[0] ??\n (children.Identifier as IToken[])?.[0];\n return token ? tokenToValue(token) : '';\n};\n\n/** Builds a dotted property reference string from a propertyRef CST node. */\nconst extractPropertyRef = (node: CstNode): string => {\n const head = (node.children.head as IToken[])[0].image;\n const tails = (node.children.tail as IToken[] | undefined) ?? [];\n if (tails.length === 0) return head;\n return head + '.' + tails.map(t => t.image).join('.');\n};\n\n/** Extracts list items from a listLiteral CST node. */\nconst extractList = (node: CstNode): unknown[] => {\n const items = (node.children.items as CstNode[] | undefined) ?? [];\n return items.map(extractLiteral);\n};\n\ntype RuleOrGroup = DefaultRuleType | DefaultRuleGroupType;\n\n/** Visits an orExpression CST node. */\nconst visitOrExpression = (node: CstNode): RuleOrGroup[] => {\n const lhsNodes = node.children.lhs as CstNode[];\n const rhsNodes = (node.children.rhs as CstNode[] | undefined) ?? [];\n\n if (rhsNodes.length === 0) {\n return visitAndExpression(lhsNodes[0]);\n }\n\n const allParts = [lhsNodes[0], ...rhsNodes];\n const subRules: RuleOrGroup[] = [];\n for (const part of allParts) {\n const partRules = visitAndExpression(part);\n if (partRules.length === 1) {\n subRules.push(partRules[0]);\n } else {\n subRules.push({ combinator: 'and', rules: partRules });\n }\n }\n return [{ combinator: 'or', rules: subRules }];\n};\n\n/** Visits an andExpression CST node. */\nconst visitAndExpression = (node: CstNode): RuleOrGroup[] => {\n const lhsNodes = node.children.lhs as CstNode[];\n const rhsNodes = (node.children.rhs as CstNode[] | undefined) ?? [];\n const all = [lhsNodes[0], ...rhsNodes];\n const rules: RuleOrGroup[] = [];\n for (const item of all) {\n rules.push(...visitNotExpression(item));\n }\n return rules;\n};\n\n/** Visits a notExpression CST node. */\nconst visitNotExpression = (node: CstNode): RuleOrGroup[] => {\n const hasNot = !!(node.children.Not as IToken[] | undefined)?.length;\n const atomicRules = visitAtomicExpression((node.children.atomicExpression as CstNode[])[0]);\n\n if (!hasNot) return atomicRules;\n\n return [{ combinator: 'and', not: true, rules: atomicRules }];\n};\n\n/** Visits an atomicExpression CST node. */\nconst visitAtomicExpression = (node: CstNode): RuleOrGroup[] => {\n if (node.children.orExpression) {\n return visitOrExpression((node.children.orExpression as CstNode[])[0]);\n }\n if (node.children.condition) {\n return [visitCondition((node.children.condition as CstNode[])[0])];\n }\n return [];\n};\n\n/** Visits a condition CST node and returns a DefaultRuleType (no meta). */\nconst visitCondition = (node: CstNode): DefaultRuleType => {\n const field = extractPropertyRef((node.children.field as CstNode[])[0]);\n\n if (node.children.IsNull) {\n return { field, operator: 'null', value: null } as DefaultRuleType;\n }\n if (node.children.IsNotNull) {\n return { field, operator: 'notNull', value: null } as DefaultRuleType;\n }\n\n if (node.children.In) {\n const list = extractList((node.children.list as CstNode[])[0]);\n return { field, operator: 'in', value: list } as DefaultRuleType;\n }\n if (node.children.NotIn) {\n const list = extractList((node.children.list as CstNode[])[0]);\n return { field, operator: 'notIn', value: list } as DefaultRuleType;\n }\n\n const valueNode = (node.children.value as CstNode[] | undefined)?.[0];\n const value = valueNode ? extractLiteral(valueNode) : null;\n\n if (node.children.Equal) return { field, operator: '=', value } as DefaultRuleType;\n if (node.children.NotEqual) return { field, operator: '!=', value } as DefaultRuleType;\n if (node.children.Less) return { field, operator: '<', value } as DefaultRuleType;\n if (node.children.Greater) return { field, operator: '>', value } as DefaultRuleType;\n if (node.children.LessEqual) return { field, operator: '<=', value } as DefaultRuleType;\n if (node.children.GreaterEqual) return { field, operator: '>=', value } as DefaultRuleType;\n if (node.children.Contains) return { field, operator: 'contains', value } as DefaultRuleType;\n if (node.children.StartsWith) return { field, operator: 'beginsWith', value } as DefaultRuleType;\n if (node.children.EndsWith) return { field, operator: 'endsWith', value } as DefaultRuleType;\n\n return { field, operator: '=', value } as DefaultRuleType;\n};\n\n// ─── Public API ──────────────────────────────────────────────────────────────\n\n/**\n * Options for {@link parseCypher}.\n */\nexport interface ParseCypherOptions {\n independentCombinators?: boolean;\n}\n\n/**\n * Parses a Cypher query string into a {@link DefaultRuleGroupType}.\n *\n * Accepts a full Cypher query, a `WHERE` clause, or a bare boolean expression.\n * MATCH and RETURN clauses are consumed but discarded — only WHERE conditions\n * are returned.\n *\n * @example\n * ```ts\n * // Full query — extracts WHERE conditions only\n * parseCypher('MATCH (a:Person) WHERE a.age > 30 RETURN a');\n *\n * // WHERE clause\n * parseCypher('WHERE a.age > 30 AND a.name CONTAINS \"Alice\"');\n *\n * // Bare expression\n * parseCypher('a.age > 30 AND a.name CONTAINS \"Alice\"');\n * ```\n */\nexport function parseCypher(cypher: string): DefaultRuleGroupType;\nexport function parseCypher(\n cypher: string,\n options: Omit<ParseCypherOptions, 'independentCombinators'> & {\n independentCombinators?: false;\n }\n): DefaultRuleGroupType;\nexport function parseCypher(\n cypher: string,\n options: Omit<ParseCypherOptions, 'independentCombinators'> & {\n independentCombinators: true;\n }\n): DefaultRuleGroupTypeIC;\nexport function parseCypher(\n cypher: string,\n _options?: ParseCypherOptions\n): DefaultRuleGroupTypeAny {\n const trimmed = cypher.trim();\n if (!trimmed) return { combinator: 'and', rules: [] };\n\n // Auto-detect input shape (like parseSQL)\n let input = trimmed;\n if (!/^\\s*match\\b/i.test(input) && !/^\\s*where\\b/i.test(input)) {\n // Bare expression — prepend WHERE so the parser can handle it\n input = `WHERE ${input}`;\n }\n\n const lexResult = cypherLexer.tokenize(input);\n if (lexResult.errors.length > 0) {\n return { combinator: 'and', rules: [] };\n }\n\n parserInstance.input = lexResult.tokens;\n const cst = parserInstance.cypherQuery();\n\n if (parserInstance.errors.length > 0) {\n return { combinator: 'and', rules: [] };\n }\n\n const rules: RuleOrGroup[] = [];\n\n // Only process WHERE clause — skip MATCH/RETURN\n const whereClauses = (cst.children.whereClause as CstNode[] | undefined) ?? [];\n if (whereClauses.length > 0) {\n const whereNode = whereClauses[0];\n const orExpr = (whereNode.children.orExpression as CstNode[])[0];\n const whereRules = visitOrExpression(orExpr);\n\n // If the top-level OR produced a single AND group without NOT, flatten it\n if (\n whereRules.length === 1 &&\n 'combinator' in whereRules[0] &&\n whereRules[0].combinator === 'and' &&\n !('not' in whereRules[0] && whereRules[0].not)\n ) {\n rules.push(...whereRules[0].rules);\n } else {\n rules.push(...whereRules);\n }\n }\n\n return { combinator: 'and', rules };\n}\n\n/**\n * Parses a GQL query string. GQL is ~95% compatible with Cypher;\n * the parser handles the same syntax.\n */\nexport function parseGQL(gql: string): DefaultRuleGroupType;\nexport function parseGQL(\n gql: string,\n options: Omit<ParseCypherOptions, 'independentCombinators'> & {\n independentCombinators?: false;\n }\n): DefaultRuleGroupType;\nexport function parseGQL(\n gql: string,\n options: Omit<ParseCypherOptions, 'independentCombinators'> & {\n independentCombinators: true;\n }\n): DefaultRuleGroupTypeIC;\nexport function parseGQL(gql: string, options?: ParseCypherOptions): DefaultRuleGroupTypeAny {\n // Call the implementation signature directly (not the overloads)\n return (parseCypher as (s: string, o?: ParseCypherOptions) => DefaultRuleGroupTypeAny)(\n gql,\n options\n );\n}\n"],"mappings":"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"}
|
package/dist/parseGremlin.d.mts
CHANGED
package/dist/parseGremlin.d.ts
CHANGED
package/dist/parseJSONata.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { E as DefaultRuleGroupType, j as Except, x as DefaultRuleGroupTypeIC } from "./index-
|
|
2
|
-
import { t as ParserCommonOptions } from "./import-
|
|
1
|
+
import { E as DefaultRuleGroupType, j as Except, x as DefaultRuleGroupTypeIC } from "./index-DlVg-QXo.mjs";
|
|
2
|
+
import { t as ParserCommonOptions } from "./import-ShTj5IdB.mjs";
|
|
3
3
|
|
|
4
4
|
//#region src/utils/parseJSONata/parseJSONata.d.ts
|
|
5
5
|
/**
|
package/dist/parseJSONata.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { E as DefaultRuleGroupType, j as Except, x as DefaultRuleGroupTypeIC } from "./index-
|
|
2
|
-
import { t as ParserCommonOptions } from "./import-
|
|
1
|
+
import { E as DefaultRuleGroupType, j as Except, x as DefaultRuleGroupTypeIC } from "./index-DlVg-QXo.js";
|
|
2
|
+
import { t as ParserCommonOptions } from "./import-Qs1-kgv5.js";
|
|
3
3
|
|
|
4
4
|
//#region src/utils/parseJSONata/parseJSONata.d.ts
|
|
5
5
|
/**
|
package/dist/parseJSONata.js
CHANGED
|
@@ -21,8 +21,8 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
21
21
|
enumerable: true
|
|
22
22
|
}) : target, mod));
|
|
23
23
|
//#endregion
|
|
24
|
-
const require_objectUtils = require("./objectUtils-
|
|
25
|
-
const require_prepareQueryObjects = require("./prepareQueryObjects-
|
|
24
|
+
const require_objectUtils = require("./objectUtils-DxVaGCdg.js");
|
|
25
|
+
const require_prepareQueryObjects = require("./prepareQueryObjects-gRQqiBPR.js");
|
|
26
26
|
let jsonata = require("jsonata");
|
|
27
27
|
jsonata = __toESM(jsonata);
|
|
28
28
|
//#region src/utils/parseJSONata/utils.ts
|
|
@@ -283,7 +283,6 @@ function parseJSONata(jsonataInput, options = {}) {
|
|
|
283
283
|
return prepare(emptyQuery);
|
|
284
284
|
}
|
|
285
285
|
//#endregion
|
|
286
|
-
exports.__toESM = __toESM;
|
|
287
286
|
exports.parseJSONata = parseJSONata;
|
|
288
287
|
|
|
289
288
|
//# sourceMappingURL=parseJSONata.js.map
|
package/dist/parseJSONata.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { r as isRuleGroup } from "./objectUtils-
|
|
2
|
-
import { n as fieldIsValidUtil, r as getFieldsArray, t as prepareRuleGroup } from "./prepareQueryObjects-
|
|
1
|
+
import { r as isRuleGroup } from "./objectUtils-D-w8MzpZ.mjs";
|
|
2
|
+
import { n as fieldIsValidUtil, r as getFieldsArray, t as prepareRuleGroup } from "./prepareQueryObjects-BXf5aV-A.mjs";
|
|
3
3
|
import jsonata from "jsonata";
|
|
4
4
|
//#region src/utils/parseJSONata/utils.ts
|
|
5
5
|
const isJSONataExprNode = (expr) => {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { E as DefaultRuleGroupType, O as RuleType, S as RuleGroupTypeAny, f as RQBJsonLogic, j as Except, x as DefaultRuleGroupTypeIC } from "./index-
|
|
2
|
-
import { t as ParserCommonOptions } from "./import-
|
|
1
|
+
import { E as DefaultRuleGroupType, O as RuleType, S as RuleGroupTypeAny, f as RQBJsonLogic, j as Except, x as DefaultRuleGroupTypeIC } from "./index-DlVg-QXo.mjs";
|
|
2
|
+
import { t as ParserCommonOptions } from "./import-ShTj5IdB.mjs";
|
|
3
3
|
|
|
4
4
|
//#region src/utils/parseJsonLogic/parseJsonLogic.d.ts
|
|
5
5
|
/**
|
package/dist/parseJsonLogic.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { E as DefaultRuleGroupType, O as RuleType, S as RuleGroupTypeAny, f as RQBJsonLogic, j as Except, x as DefaultRuleGroupTypeIC } from "./index-
|
|
2
|
-
import { t as ParserCommonOptions } from "./import-
|
|
1
|
+
import { E as DefaultRuleGroupType, O as RuleType, S as RuleGroupTypeAny, f as RQBJsonLogic, j as Except, x as DefaultRuleGroupTypeIC } from "./index-DlVg-QXo.js";
|
|
2
|
+
import { t as ParserCommonOptions } from "./import-Qs1-kgv5.js";
|
|
3
3
|
|
|
4
4
|
//#region src/utils/parseJsonLogic/parseJsonLogic.d.ts
|
|
5
5
|
/**
|
package/dist/parseJsonLogic.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_utils = require("./utils-
|
|
3
|
-
const require_objectUtils = require("./objectUtils-
|
|
4
|
-
const require_convertQuery = require("./convertQuery-
|
|
5
|
-
const require_prepareQueryObjects = require("./prepareQueryObjects-
|
|
2
|
+
const require_utils = require("./utils-ZlKseh1X.js");
|
|
3
|
+
const require_objectUtils = require("./objectUtils-DxVaGCdg.js");
|
|
4
|
+
const require_convertQuery = require("./convertQuery-BoMPXL7_.js");
|
|
5
|
+
const require_prepareQueryObjects = require("./prepareQueryObjects-gRQqiBPR.js");
|
|
6
6
|
//#region src/utils/parseJsonLogic/utils.ts
|
|
7
7
|
const isJsonLogicVar = (logic) => require_objectUtils.isPojo(logic) && "var" in logic;
|
|
8
8
|
const isRQBJsonLogicVar = (logic) => isJsonLogicVar(logic) && typeof logic.var === "string";
|
|
@@ -43,7 +43,7 @@ function parseJsonLogic(rqbJsonLogic, options = {}) {
|
|
|
43
43
|
subordinateFieldName,
|
|
44
44
|
getValueSources
|
|
45
45
|
});
|
|
46
|
-
function processLogic(logic, outermost) {
|
|
46
|
+
function processLogic(logic, outermost, inSubquery) {
|
|
47
47
|
if (outermost && !require_objectUtils.isPojo(logic)) return false;
|
|
48
48
|
const [key, keyValue] = Object.entries(logic || {})?.[0] ?? [];
|
|
49
49
|
if (jsonLogicOperations && require_objectUtils.objectKeys(jsonLogicOperations).includes(key)) {
|
|
@@ -55,14 +55,14 @@ function parseJsonLogic(rqbJsonLogic, options = {}) {
|
|
|
55
55
|
}
|
|
56
56
|
if (isJsonLogicAnd(logic)) return {
|
|
57
57
|
combinator: "and",
|
|
58
|
-
rules: logic.and.map((l) => processLogic(l)).filter(Boolean)
|
|
58
|
+
rules: logic.and.map((l) => processLogic(l, false, inSubquery)).filter(Boolean)
|
|
59
59
|
};
|
|
60
60
|
else if (isJsonLogicOr(logic)) return {
|
|
61
61
|
combinator: "or",
|
|
62
|
-
rules: logic.or.map((l) => processLogic(l)).filter(Boolean)
|
|
62
|
+
rules: logic.or.map((l) => processLogic(l, false, inSubquery)).filter(Boolean)
|
|
63
63
|
};
|
|
64
64
|
else if (isJsonLogicNegation(logic)) {
|
|
65
|
-
const rule = processLogic(logic["!"]);
|
|
65
|
+
const rule = processLogic(logic["!"], false, inSubquery);
|
|
66
66
|
if (rule) {
|
|
67
67
|
if (!require_objectUtils.isRuleGroupType(rule) && (rule.operator === "between" || rule.operator === "in" || rule.operator === "contains" || rule.operator === "beginsWith" || rule.operator === "endsWith")) {
|
|
68
68
|
const newRule = {
|
|
@@ -85,7 +85,7 @@ function parseJsonLogic(rqbJsonLogic, options = {}) {
|
|
|
85
85
|
};
|
|
86
86
|
}
|
|
87
87
|
return false;
|
|
88
|
-
} else if (isJsonLogicDoubleNegation(logic)) return processLogic(logic["!!"]) || false;
|
|
88
|
+
} else if (isJsonLogicDoubleNegation(logic)) return processLogic(logic["!!"], false, inSubquery) || false;
|
|
89
89
|
let rule = false;
|
|
90
90
|
let field = "";
|
|
91
91
|
let operator = "=";
|
|
@@ -110,7 +110,7 @@ function parseJsonLogic(rqbJsonLogic, options = {}) {
|
|
|
110
110
|
else if (isRQBJsonLogicStartsWith(logic)) operator = "beginsWith";
|
|
111
111
|
else if (isRQBJsonLogicEndsWith(logic)) operator = "endsWith";
|
|
112
112
|
else operator = key;
|
|
113
|
-
if (fieldIsValid(field, operator, valueSource === "field" ? value : void 0)) rule = {
|
|
113
|
+
if (inSubquery || fieldIsValid(field, operator, valueSource === "field" ? value : void 0)) rule = {
|
|
114
114
|
field,
|
|
115
115
|
operator,
|
|
116
116
|
value,
|
|
@@ -119,7 +119,7 @@ function parseJsonLogic(rqbJsonLogic, options = {}) {
|
|
|
119
119
|
} else if (isJsonLogicAll(logic) && isRQBJsonLogicVar(logic["all"][0]) || isJsonLogicNone(logic) && isRQBJsonLogicVar(logic["none"][0]) || isJsonLogicSome(logic) && isRQBJsonLogicVar(logic["some"][0])) {
|
|
120
120
|
const match = { mode: isJsonLogicNone(logic) ? "none" : isJsonLogicSome(logic) ? "some" : "all" };
|
|
121
121
|
const [{ var: fld }, operation] = logic[match.mode];
|
|
122
|
-
const matcher = processLogic(operation);
|
|
122
|
+
const matcher = processLogic(operation, false, true);
|
|
123
123
|
if (!matcher) return false;
|
|
124
124
|
rule = {
|
|
125
125
|
field: fld,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseJsonLogic.js","names":["isPojo","getFieldsArray","fieldIsValidUtil","isPojo","objectKeys","isRuleGroup","isRuleGroupType","defaultOperatorNegationMap","joinWith","prepareRuleGroup","convertToIC"],"sources":["../src/utils/parseJsonLogic/utils.ts","../src/utils/parseJsonLogic/parseJsonLogic.ts"],"sourcesContent":["import type {\n JsonLogicAll,\n JsonLogicAnd,\n JsonLogicDoubleNegation,\n JsonLogicEqual,\n JsonLogicGreaterThan,\n JsonLogicGreaterThanOrEqual,\n JsonLogicInArray,\n JsonLogicInString,\n JsonLogicLessThan,\n JsonLogicLessThanOrEqual,\n JsonLogicNegation,\n JsonLogicNone,\n JsonLogicNotEqual,\n JsonLogicOr,\n JsonLogicSome,\n JsonLogicStrictEqual,\n JsonLogicStrictNotEqual,\n JsonLogicVar,\n RQBJsonLogicEndsWith,\n RQBJsonLogicStartsWith,\n RQBJsonLogicVar,\n} from '../../types';\nimport { isPojo } from '../misc';\nimport type { JsonLogicBetweenExclusive, JsonLogicBetweenInclusive } from './types';\n\n// Standard JsonLogic operations\nexport const isJsonLogicVar = (\n logic: unknown\n): logic is JsonLogicVar<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && 'var' in logic;\nexport const isRQBJsonLogicVar = (logic: unknown): logic is RQBJsonLogicVar =>\n isJsonLogicVar(logic) && typeof logic.var === 'string';\nexport const isJsonLogicEqual = (logic: unknown): logic is JsonLogicEqual =>\n isPojo(logic) && '==' in logic;\nexport const isJsonLogicStrictEqual = (logic: unknown): logic is JsonLogicStrictEqual =>\n isPojo(logic) && '===' in logic;\nexport const isJsonLogicNotEqual = (logic: unknown): logic is JsonLogicNotEqual =>\n isPojo(logic) && '!=' in logic;\nexport const isJsonLogicStrictNotEqual = (logic: unknown): logic is JsonLogicStrictNotEqual =>\n isPojo(logic) && '!==' in logic;\nexport const isJsonLogicNegation = (logic: unknown): logic is JsonLogicNegation =>\n isPojo(logic) && '!' in logic;\nexport const isJsonLogicDoubleNegation = (logic: unknown): logic is JsonLogicDoubleNegation =>\n isPojo(logic) && '!!' in logic;\nexport const isJsonLogicOr = (\n logic: unknown\n): logic is JsonLogicOr<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && 'or' in logic;\nexport const isJsonLogicAnd = (\n logic: unknown\n): logic is JsonLogicAnd<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && 'and' in logic;\nexport const isJsonLogicGreaterThan = (\n logic: unknown\n): logic is JsonLogicGreaterThan<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && '>' in logic;\nexport const isJsonLogicGreaterThanOrEqual = (\n logic: unknown\n): logic is JsonLogicGreaterThanOrEqual<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && '>=' in logic;\nexport const isJsonLogicLessThan = (\n logic: unknown\n): logic is JsonLogicLessThan<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && '<' in logic && logic['<'].length === 2;\nexport const isJsonLogicLessThanOrEqual = (\n logic: unknown\n): logic is JsonLogicLessThanOrEqual<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && '<=' in logic && logic['<='].length === 2;\nexport const isJsonLogicInArray = (\n logic: unknown\n): logic is JsonLogicInArray<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && 'in' in logic && Array.isArray(logic.in[1]);\nexport const isJsonLogicInString = (\n logic: unknown\n): logic is JsonLogicInString<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && 'in' in logic && !Array.isArray(logic.in[1]);\nexport const isJsonLogicAll = (\n logic: unknown\n): logic is JsonLogicAll<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && 'all' in logic;\nexport const isJsonLogicNone = (\n logic: unknown\n): logic is JsonLogicNone<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && 'none' in logic;\nexport const isJsonLogicSome = (\n logic: unknown\n): logic is JsonLogicSome<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && 'some' in logic;\n\n// \"Between\" operations are special cases of '<' and '<='\nexport const isJsonLogicBetweenExclusive = (logic: unknown): logic is JsonLogicBetweenExclusive =>\n isPojo(logic) && '<' in logic && Array.isArray(logic['<']) && logic['<'].length === 3;\nexport const isJsonLogicBetweenInclusive = (logic: unknown): logic is JsonLogicBetweenInclusive =>\n isPojo(logic) && '<=' in logic && Array.isArray(logic['<=']) && logic['<='].length === 3;\n\n// RQB extensions\nexport const isRQBJsonLogicStartsWith = (logic: unknown): logic is RQBJsonLogicStartsWith =>\n isPojo(logic) && 'startsWith' in logic;\nexport const isRQBJsonLogicEndsWith = (logic: unknown): logic is RQBJsonLogicEndsWith =>\n isPojo(logic) && 'endsWith' in logic;\n\n// Type guards for unused JsonLogic operations\n\n// import type {\n// JsonLogicCat,\n// JsonLogicDifference,\n// JsonLogicFilter,\n// JsonLogicIf,\n// JsonLogicLog,\n// JsonLogicMap,\n// JsonLogicMax,\n// JsonLogicMerge,\n// JsonLogicMin,\n// JsonLogicMissing,\n// JsonLogicMissingSome,\n// JsonLogicProduct,\n// JsonLogicQuotient,\n// JsonLogicReduce,\n// JsonLogicRemainder,\n// JsonLogicSubstr,\n// JsonLogicSum,\n// } from '../../types';\n//\n// export const isJsonLogicMissing = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicMissing<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'missing' in logic;\n// export const isJsonLogicMissingSome = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicMissingSome<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'missing_some' in logic;\n// export const isJsonLogicIf = (logic: RQBJsonLogic): logic is JsonLogicIf =>\n// isPojo(logic) && 'if' in logic;\n// export const isJsonLogicMax = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicMax<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'max' in logic;\n// export const isJsonLogicMin = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicMin<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'min' in logic;\n// export const isJsonLogicSum = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicSum<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && '+' in logic;\n// export const isJsonLogicDifference = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicDifference<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && '-' in logic;\n// export const isJsonLogicProduct = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicProduct<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && '*' in logic;\n// export const isJsonLogicQuotient = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicQuotient<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && '/' in logic;\n// export const isJsonLogicRemainder = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicRemainder<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && '%' in logic;\n// export const isJsonLogicMap = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicMap<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'map' in logic;\n// export const isJsonLogicFilter = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicFilter<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'filter' in logic;\n// export const isJsonLogicReduce = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicReduce<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'reduce' in logic;\n// export const isJsonLogicMerge = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicMerge<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'merge' in logic;\n// export const isJsonLogicCat = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicCat<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'cat' in logic;\n// export const isJsonLogicSubstr = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicSubstr<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'substr' in logic;\n// export const isJsonLogicLog = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicLog<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'log' in logic;\n","import type { Except } from 'type-fest';\nimport { defaultOperatorNegationMap } from '../../defaults';\nimport type {\n DefaultOperatorName,\n DefaultRuleGroupType,\n DefaultRuleGroupTypeAny,\n DefaultRuleGroupTypeIC,\n DefaultRuleType,\n MatchConfig,\n RQBJsonLogic,\n RQBJsonLogicVar,\n RuleGroupTypeAny,\n RuleType,\n ValueSource,\n} from '../../types';\nimport type { ParserCommonOptions } from '../../types/import';\nimport { joinWith } from '../arrayUtils';\nimport { convertToIC } from '../convertQuery';\nimport { isRuleGroup, isRuleGroupType } from '../isRuleGroup';\nimport { isPojo } from '../misc';\nimport { objectKeys } from '../objectUtils';\nimport { fieldIsValidUtil, getFieldsArray } from '../parserUtils';\nimport { prepareRuleGroup } from '../prepareQueryObjects';\nimport {\n isJsonLogicAll,\n isJsonLogicAnd,\n isJsonLogicBetweenExclusive,\n isJsonLogicBetweenInclusive,\n isJsonLogicDoubleNegation,\n isJsonLogicEqual,\n isJsonLogicGreaterThan,\n isJsonLogicGreaterThanOrEqual,\n isJsonLogicInArray,\n isJsonLogicInString,\n isJsonLogicLessThan,\n isJsonLogicLessThanOrEqual,\n isJsonLogicNegation,\n isJsonLogicNone,\n isJsonLogicNotEqual,\n isJsonLogicOr,\n isJsonLogicSome,\n isJsonLogicStrictEqual,\n isJsonLogicStrictNotEqual,\n isRQBJsonLogicEndsWith,\n isRQBJsonLogicStartsWith,\n isRQBJsonLogicVar,\n} from './utils';\n\n/**\n * Options object for {@link parseJsonLogic}.\n */\nexport interface ParseJsonLogicOptions extends ParserCommonOptions {\n // oxlint-disable-next-line typescript/no-explicit-any\n jsonLogicOperations?: Record<string, (value: any) => RuleType | RuleGroupTypeAny | false>;\n}\n\nconst emptyRuleGroup: DefaultRuleGroupType = { combinator: 'and', rules: [] };\n\n/**\n * Converts a JsonLogic object into a query suitable for the\n * {@link index!QueryBuilder QueryBuilder} component's `query` or `defaultQuery` props\n * ({@link index!DefaultRuleGroupType DefaultRuleGroupType}).\n */\nfunction parseJsonLogic(rqbJsonLogic: string | RQBJsonLogic): DefaultRuleGroupType;\n/**\n * Converts a JsonLogic object into a query suitable for the\n * {@link index!QueryBuilder QueryBuilder} component's `query` or `defaultQuery` props\n * ({@link index!DefaultRuleGroupType DefaultRuleGroupType}).\n */\nfunction parseJsonLogic(\n rqbJsonLogic: string | RQBJsonLogic,\n options: Except<ParseJsonLogicOptions, 'independentCombinators'> & {\n independentCombinators?: false;\n }\n): DefaultRuleGroupType;\n/**\n * Converts a JsonLogic object into a query suitable for the\n * {@link index!QueryBuilder QueryBuilder} component's `query` or `defaultQuery` props\n * ({@link index!DefaultRuleGroupTypeIC DefaultRuleGroupTypeIC}).\n */\nfunction parseJsonLogic(\n rqbJsonLogic: string | RQBJsonLogic,\n options: Except<ParseJsonLogicOptions, 'independentCombinators'> & {\n independentCombinators: true;\n }\n): DefaultRuleGroupTypeIC;\nfunction parseJsonLogic(\n rqbJsonLogic: string | RQBJsonLogic,\n options: ParseJsonLogicOptions = {}\n): DefaultRuleGroupTypeAny {\n const fieldsFlat = getFieldsArray(options.fields);\n const { getValueSources, listsAsArrays, jsonLogicOperations } = options;\n\n const fieldIsValid = (\n fieldName: string,\n operator: DefaultOperatorName,\n subordinateFieldName?: string\n ) =>\n fieldIsValidUtil({\n fieldName,\n fieldsFlat,\n operator,\n subordinateFieldName,\n getValueSources,\n });\n\n // Overload 1: Always return a rule group or false for the outermost logic object\n function processLogic(logic: RQBJsonLogic, outermost: true): DefaultRuleGroupType | false;\n // Overload 2: If not the outermost object, return value could also be a rule\n function processLogic(\n logic: RQBJsonLogic,\n outermost?: false\n ): DefaultRuleGroupType | DefaultRuleType | false;\n // Implementation\n function processLogic(\n logic: RQBJsonLogic,\n outermost?: boolean\n ): DefaultRuleGroupType | DefaultRuleType | false {\n // Bail if the outermost logic is not a plain object\n if (outermost && !isPojo(logic)) {\n return false;\n }\n const [key, keyValue] = Object.entries(logic || {})?.[0] ?? [];\n\n // Custom operations process logic\n if (jsonLogicOperations && objectKeys(jsonLogicOperations).includes(key)) {\n const rule = jsonLogicOperations[key](keyValue) as DefaultRuleType;\n return rule\n ? outermost && !isRuleGroup(rule)\n ? { combinator: 'and', rules: [rule] }\n : rule\n : false;\n }\n\n // Rule groups\n if (isJsonLogicAnd(logic)) {\n return {\n combinator: 'and',\n rules: logic.and.map(l => processLogic(l)).filter(Boolean) as (\n | DefaultRuleType\n | DefaultRuleGroupType\n )[],\n };\n } else if (isJsonLogicOr(logic)) {\n return {\n combinator: 'or',\n rules: logic.or.map(l => processLogic(l)).filter(Boolean) as (\n | DefaultRuleType\n | DefaultRuleGroupType\n )[],\n };\n } else if (isJsonLogicNegation(logic)) {\n const rule = processLogic(logic['!']);\n if (rule) {\n if (\n !isRuleGroupType(rule) &&\n (rule.operator === 'between' ||\n rule.operator === 'in' ||\n rule.operator === 'contains' ||\n rule.operator === 'beginsWith' ||\n rule.operator === 'endsWith')\n ) {\n const newRule = { ...rule, operator: defaultOperatorNegationMap[rule.operator] };\n if (outermost) {\n return { combinator: 'and', rules: [newRule] };\n }\n return newRule;\n } else if (isJsonLogicBetweenExclusive(logic['!']) || isRuleGroupType(rule)) {\n return { ...rule, not: true };\n }\n return { combinator: 'and', rules: [rule], not: true };\n }\n return false;\n } else if (isJsonLogicDoubleNegation(logic)) {\n const rule = processLogic(logic['!!']);\n return rule || false;\n }\n\n // All other keys represent rules\n let rule: DefaultRuleType | false = false;\n let field = '';\n let operator: DefaultOperatorName = '=';\n // oxlint-disable-next-line typescript/no-explicit-any\n let value: any = '';\n let valueSource: ValueSource | undefined = undefined;\n\n if (\n // Basic boolean operations\n isJsonLogicEqual(logic) ||\n isJsonLogicStrictEqual(logic) ||\n isJsonLogicNotEqual(logic) ||\n isJsonLogicStrictNotEqual(logic) ||\n isJsonLogicGreaterThan(logic) ||\n isJsonLogicGreaterThanOrEqual(logic) ||\n isJsonLogicLessThan(logic) ||\n isJsonLogicLessThanOrEqual(logic) ||\n isJsonLogicInString(logic) ||\n isRQBJsonLogicStartsWith(logic) ||\n isRQBJsonLogicEndsWith(logic)\n ) {\n const [first, second] = keyValue;\n if (isRQBJsonLogicVar(first) && !isPojo(second)) {\n field = first.var;\n value = second;\n } else if (!isPojo(first) && isRQBJsonLogicVar(second)) {\n field = second.var;\n value = first;\n } else if (isRQBJsonLogicVar(first) && isRQBJsonLogicVar(second)) {\n field = first.var;\n value = second.var;\n valueSource = 'field';\n } else {\n return false;\n }\n\n // Translate operator if necessary\n if (isJsonLogicEqual(logic) || isJsonLogicStrictEqual(logic)) {\n operator = value === null ? 'null' : '=';\n } else if (isJsonLogicNotEqual(logic) || isJsonLogicStrictNotEqual(logic)) {\n operator = value === null ? 'notNull' : '!=';\n } else if (isJsonLogicInString(logic)) {\n operator = 'contains';\n } else if (isRQBJsonLogicStartsWith(logic)) {\n operator = 'beginsWith';\n } else if (isRQBJsonLogicEndsWith(logic)) {\n operator = 'endsWith';\n } else {\n operator = key as DefaultOperatorName;\n }\n\n if (fieldIsValid(field, operator, valueSource === 'field' ? value : undefined)) {\n rule = { field, operator, value, valueSource };\n }\n } else if (\n (isJsonLogicAll(logic) && isRQBJsonLogicVar(logic['all'][0])) ||\n (isJsonLogicNone(logic) && isRQBJsonLogicVar(logic['none'][0])) ||\n (isJsonLogicSome(logic) && isRQBJsonLogicVar(logic['some'][0]))\n ) {\n // The array coverage functions must have a field as their first element.\n // Otherwise we'd be comparing values to values, which is not supported.\n const match: MatchConfig = {\n mode: isJsonLogicNone(logic) ? 'none' : isJsonLogicSome(logic) ? 'some' : 'all',\n };\n\n // oxlint-disable-next-line typescript/no-explicit-any\n const [{ var: fld }, operation] = (logic as any)[match.mode];\n const matcher = processLogic(operation);\n\n // TODO: Support operations that evaluate array member properties\n if (!matcher) return false;\n\n rule = {\n field: fld,\n operator: '=',\n match,\n value: isRuleGroup(matcher) ? matcher : { combinator: 'and', rules: [matcher] },\n };\n } else if (isJsonLogicBetweenExclusive(logic) && isRQBJsonLogicVar(logic['<'][1])) {\n field = logic['<'][1].var;\n const values = [logic['<'][0], logic['<'][2]];\n // v8 ignore else\n if (\n values.every(v => isRQBJsonLogicVar(v)) ||\n values.every(el => typeof el === 'string') ||\n values.every(el => typeof el === 'number') ||\n values.every(el => typeof el === 'boolean')\n ) {\n return (\n processLogic({\n and: [{ '>': [{ var: field }, values[0]] }, { '<': [{ var: field }, values[1]] }],\n }) || /* v8 ignore start -- @preserve */ false /* v8 ignore stop -- @preserve */\n );\n }\n } else if (isJsonLogicBetweenInclusive(logic) && isRQBJsonLogicVar(logic['<='][1])) {\n field = logic['<='][1].var;\n operator = 'between';\n const values = [logic['<='][0], logic['<='][2]];\n if (logic['<='].every(v => isRQBJsonLogicVar(v))) {\n const vars = values as RQBJsonLogicVar[];\n valueSource = 'field';\n const fieldList = vars.map(el => el.var).filter(sf => fieldIsValid(field, operator, sf));\n value = listsAsArrays ? fieldList : joinWith(fieldList, ',');\n } else {\n // v8 ignore else\n if (\n values.every(el => typeof el === 'string') ||\n values.every(el => typeof el === 'number') ||\n values.every(el => typeof el === 'boolean')\n ) {\n value = listsAsArrays\n ? values\n : joinWith(\n values.map(el => `${el}`),\n ','\n );\n }\n }\n\n if (fieldIsValid(field, operator) && value.length >= 2) {\n rule = { field, operator, value, valueSource };\n }\n } else if (isJsonLogicInArray(logic) && isRQBJsonLogicVar(keyValue[0])) {\n field = keyValue[0].var;\n operator = 'in';\n if (logic.in[1].every(v => isRQBJsonLogicVar(v))) {\n valueSource = 'field';\n const fieldList = logic.in[1]\n .map(el => el.var)\n .filter(sf => fieldIsValid(field, operator, sf));\n value = listsAsArrays ? fieldList : joinWith(fieldList, ',');\n } else {\n // v8 ignore else\n if (\n logic.in[1].every(el => typeof el === 'string') ||\n logic.in[1].every(el => typeof el === 'number') ||\n logic.in[1].every(el => typeof el === 'boolean')\n ) {\n value = listsAsArrays\n ? logic.in[1]\n : joinWith(\n logic.in[1].map(el => `${el}`),\n ','\n );\n }\n }\n\n // v8 ignore else\n if (value.length > 0) {\n rule = { field, operator, value, valueSource };\n }\n }\n\n return rule ? (outermost ? { combinator: 'and', rules: [rule] } : rule) : false;\n }\n\n const prepare = options.generateIDs ? prepareRuleGroup : <T>(g: T) => g;\n\n let logicRoot = rqbJsonLogic;\n if (typeof rqbJsonLogic === 'string') {\n try {\n logicRoot = JSON.parse(rqbJsonLogic);\n } catch {\n return prepare(emptyRuleGroup);\n }\n }\n\n const result = processLogic(logicRoot, true);\n const finalQuery: DefaultRuleGroupType = result || emptyRuleGroup;\n return prepare(options.independentCombinators ? convertToIC(finalQuery) : finalQuery);\n}\n\nexport { parseJsonLogic };\n"],"mappings":";;;;;;AA2BA,MAAa,kBACX,UAEAA,oBAAAA,OAAO,KAAK,KAAK,SAAS;AAC5B,MAAa,qBAAqB,UAChC,eAAe,KAAK,KAAK,OAAO,MAAM,QAAQ;AAChD,MAAa,oBAAoB,UAC/BA,oBAAAA,OAAO,KAAK,KAAK,QAAQ;AAC3B,MAAa,0BAA0B,UACrCA,oBAAAA,OAAO,KAAK,KAAK,SAAS;AAC5B,MAAa,uBAAuB,UAClCA,oBAAAA,OAAO,KAAK,KAAK,QAAQ;AAC3B,MAAa,6BAA6B,UACxCA,oBAAAA,OAAO,KAAK,KAAK,SAAS;AAC5B,MAAa,uBAAuB,UAClCA,oBAAAA,OAAO,KAAK,KAAK,OAAO;AAC1B,MAAa,6BAA6B,UACxCA,oBAAAA,OAAO,KAAK,KAAK,QAAQ;AAC3B,MAAa,iBACX,UAEAA,oBAAAA,OAAO,KAAK,KAAK,QAAQ;AAC3B,MAAa,kBACX,UAEAA,oBAAAA,OAAO,KAAK,KAAK,SAAS;AAC5B,MAAa,0BACX,UAEAA,oBAAAA,OAAO,KAAK,KAAK,OAAO;AAC1B,MAAa,iCACX,UAEAA,oBAAAA,OAAO,KAAK,KAAK,QAAQ;AAC3B,MAAa,uBACX,UAEAA,oBAAAA,OAAO,KAAK,KAAK,OAAO,SAAS,MAAM,KAAK,WAAW;AACzD,MAAa,8BACX,UAEAA,oBAAAA,OAAO,KAAK,KAAK,QAAQ,SAAS,MAAM,MAAM,WAAW;AAC3D,MAAa,sBACX,UAEAA,oBAAAA,OAAO,KAAK,KAAK,QAAQ,SAAS,MAAM,QAAQ,MAAM,GAAG,EAAE;AAC7D,MAAa,uBACX,UAEAA,oBAAAA,OAAO,KAAK,KAAK,QAAQ,SAAS,CAAC,MAAM,QAAQ,MAAM,GAAG,EAAE;AAC9D,MAAa,kBACX,UAEAA,oBAAAA,OAAO,KAAK,KAAK,SAAS;AAC5B,MAAa,mBACX,UAEAA,oBAAAA,OAAO,KAAK,KAAK,UAAU;AAC7B,MAAa,mBACX,UAEAA,oBAAAA,OAAO,KAAK,KAAK,UAAU;AAG7B,MAAa,+BAA+B,UAC1CA,oBAAAA,OAAO,KAAK,KAAK,OAAO,SAAS,MAAM,QAAQ,MAAM,IAAI,KAAK,MAAM,KAAK,WAAW;AACtF,MAAa,+BAA+B,UAC1CA,oBAAAA,OAAO,KAAK,KAAK,QAAQ,SAAS,MAAM,QAAQ,MAAM,KAAK,KAAK,MAAM,MAAM,WAAW;AAGzF,MAAa,4BAA4B,UACvCA,oBAAAA,OAAO,KAAK,KAAK,gBAAgB;AACnC,MAAa,0BAA0B,UACrCA,oBAAAA,OAAO,KAAK,KAAK,cAAc;;;AC5CjC,MAAM,iBAAuC;CAAE,YAAY;CAAO,OAAO,CAAC;AAAE;AA8B5E,SAAS,eACP,cACA,UAAiC,CAAC,GACT;CACzB,MAAM,aAAaC,4BAAAA,eAAe,QAAQ,MAAM;CAChD,MAAM,EAAE,iBAAiB,eAAe,wBAAwB;CAEhE,MAAM,gBACJ,WACA,UACA,yBAEAC,4BAAAA,iBAAiB;EACf;EACA;EACA;EACA;EACA;CACF,CAAC;CAUH,SAAS,aACP,OACA,WACgD;EAEhD,IAAI,aAAa,CAACC,oBAAAA,OAAO,KAAK,GAC5B,OAAO;EAET,MAAM,CAAC,KAAK,YAAY,OAAO,QAAQ,SAAS,CAAC,CAAC,IAAI,MAAM,CAAC;EAG7D,IAAI,uBAAuBC,oBAAAA,WAAW,mBAAmB,EAAE,SAAS,GAAG,GAAG;GACxE,MAAM,OAAO,oBAAoB,KAAK,QAAQ;GAC9C,OAAO,OACH,aAAa,CAACC,oBAAAA,YAAY,IAAI,IAC5B;IAAE,YAAY;IAAO,OAAO,CAAC,IAAI;GAAE,IACnC,OACF;EACN;EAGA,IAAI,eAAe,KAAK,GACtB,OAAO;GACL,YAAY;GACZ,OAAO,MAAM,IAAI,KAAI,MAAK,aAAa,CAAC,CAAC,EAAE,OAAO,OAAO;EAI3D;OACK,IAAI,cAAc,KAAK,GAC5B,OAAO;GACL,YAAY;GACZ,OAAO,MAAM,GAAG,KAAI,MAAK,aAAa,CAAC,CAAC,EAAE,OAAO,OAAO;EAI1D;OACK,IAAI,oBAAoB,KAAK,GAAG;GACrC,MAAM,OAAO,aAAa,MAAM,IAAI;GACpC,IAAI,MAAM;IACR,IACE,CAACC,oBAAAA,gBAAgB,IAAI,MACpB,KAAK,aAAa,aACjB,KAAK,aAAa,QAClB,KAAK,aAAa,cAClB,KAAK,aAAa,gBAClB,KAAK,aAAa,aACpB;KACA,MAAM,UAAU;MAAE,GAAG;MAAM,UAAUC,cAAAA,2BAA2B,KAAK;KAAU;KAC/E,IAAI,WACF,OAAO;MAAE,YAAY;MAAO,OAAO,CAAC,OAAO;KAAE;KAE/C,OAAO;IACT,OAAO,IAAI,4BAA4B,MAAM,IAAI,KAAKD,oBAAAA,gBAAgB,IAAI,GACxE,OAAO;KAAE,GAAG;KAAM,KAAK;IAAK;IAE9B,OAAO;KAAE,YAAY;KAAO,OAAO,CAAC,IAAI;KAAG,KAAK;IAAK;GACvD;GACA,OAAO;EACT,OAAO,IAAI,0BAA0B,KAAK,GAExC,OADa,aAAa,MAAM,KACtB,KAAK;EAIjB,IAAI,OAAgC;EACpC,IAAI,QAAQ;EACZ,IAAI,WAAgC;EAEpC,IAAI,QAAa;EACjB,IAAI,cAAuC,KAAA;EAE3C,IAEE,iBAAiB,KAAK,KACtB,uBAAuB,KAAK,KAC5B,oBAAoB,KAAK,KACzB,0BAA0B,KAAK,KAC/B,uBAAuB,KAAK,KAC5B,8BAA8B,KAAK,KACnC,oBAAoB,KAAK,KACzB,2BAA2B,KAAK,KAChC,oBAAoB,KAAK,KACzB,yBAAyB,KAAK,KAC9B,uBAAuB,KAAK,GAC5B;GACA,MAAM,CAAC,OAAO,UAAU;GACxB,IAAI,kBAAkB,KAAK,KAAK,CAACH,oBAAAA,OAAO,MAAM,GAAG;IAC/C,QAAQ,MAAM;IACd,QAAQ;GACV,OAAO,IAAI,CAACA,oBAAAA,OAAO,KAAK,KAAK,kBAAkB,MAAM,GAAG;IACtD,QAAQ,OAAO;IACf,QAAQ;GACV,OAAO,IAAI,kBAAkB,KAAK,KAAK,kBAAkB,MAAM,GAAG;IAChE,QAAQ,MAAM;IACd,QAAQ,OAAO;IACf,cAAc;GAChB,OACE,OAAO;GAIT,IAAI,iBAAiB,KAAK,KAAK,uBAAuB,KAAK,GACzD,WAAW,UAAU,OAAO,SAAS;QAChC,IAAI,oBAAoB,KAAK,KAAK,0BAA0B,KAAK,GACtE,WAAW,UAAU,OAAO,YAAY;QACnC,IAAI,oBAAoB,KAAK,GAClC,WAAW;QACN,IAAI,yBAAyB,KAAK,GACvC,WAAW;QACN,IAAI,uBAAuB,KAAK,GACrC,WAAW;QAEX,WAAW;GAGb,IAAI,aAAa,OAAO,UAAU,gBAAgB,UAAU,QAAQ,KAAA,CAAS,GAC3E,OAAO;IAAE;IAAO;IAAU;IAAO;GAAY;EAEjD,OAAO,IACJ,eAAe,KAAK,KAAK,kBAAkB,MAAM,OAAO,EAAE,KAC1D,gBAAgB,KAAK,KAAK,kBAAkB,MAAM,QAAQ,EAAE,KAC5D,gBAAgB,KAAK,KAAK,kBAAkB,MAAM,QAAQ,EAAE,GAC7D;GAGA,MAAM,QAAqB,EACzB,MAAM,gBAAgB,KAAK,IAAI,SAAS,gBAAgB,KAAK,IAAI,SAAS,MAC5E;GAGA,MAAM,CAAC,EAAE,KAAK,OAAO,aAAc,MAAc,MAAM;GACvD,MAAM,UAAU,aAAa,SAAS;GAGtC,IAAI,CAAC,SAAS,OAAO;GAErB,OAAO;IACL,OAAO;IACP,UAAU;IACV;IACA,OAAOE,oBAAAA,YAAY,OAAO,IAAI,UAAU;KAAE,YAAY;KAAO,OAAO,CAAC,OAAO;IAAE;GAChF;EACF,OAAO,IAAI,4BAA4B,KAAK,KAAK,kBAAkB,MAAM,KAAK,EAAE,GAAG;GACjF,QAAQ,MAAM,KAAK,GAAG;GACtB,MAAM,SAAS,CAAC,MAAM,KAAK,IAAI,MAAM,KAAK,EAAE;;GAE5C,IACE,OAAO,OAAM,MAAK,kBAAkB,CAAC,CAAC,KACtC,OAAO,OAAM,OAAM,OAAO,OAAO,QAAQ,KACzC,OAAO,OAAM,OAAM,OAAO,OAAO,QAAQ,KACzC,OAAO,OAAM,OAAM,OAAO,OAAO,SAAS,GAE1C,OACE,aAAa,EACX,KAAK,CAAC,EAAE,KAAK,CAAC,EAAE,KAAK,MAAM,GAAG,OAAO,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,KAAK,MAAM,GAAG,OAAO,EAAE,EAAE,CAAC,EAClF,CAAC,KAAwC;EAG/C,OAAO,IAAI,4BAA4B,KAAK,KAAK,kBAAkB,MAAM,MAAM,EAAE,GAAG;GAClF,QAAQ,MAAM,MAAM,GAAG;GACvB,WAAW;GACX,MAAM,SAAS,CAAC,MAAM,MAAM,IAAI,MAAM,MAAM,EAAE;GAC9C,IAAI,MAAM,MAAM,OAAM,MAAK,kBAAkB,CAAC,CAAC,GAAG;IAChD,MAAM,OAAO;IACb,cAAc;IACd,MAAM,YAAY,KAAK,KAAI,OAAM,GAAG,GAAG,EAAE,QAAO,OAAM,aAAa,OAAO,UAAU,EAAE,CAAC;IACvF,QAAQ,gBAAgB,YAAYG,cAAAA,SAAS,WAAW,GAAG;GAC7D,OAEE,IACE,OAAO,OAAM,OAAM,OAAO,OAAO,QAAQ,KACzC,OAAO,OAAM,OAAM,OAAO,OAAO,QAAQ,KACzC,OAAO,OAAM,OAAM,OAAO,OAAO,SAAS,GAE1C,QAAQ,gBACJ,SACAA,cAAAA,SACE,OAAO,KAAI,OAAM,GAAG,IAAI,GACxB,GACF;GAIR,IAAI,aAAa,OAAO,QAAQ,KAAK,MAAM,UAAU,GACnD,OAAO;IAAE;IAAO;IAAU;IAAO;GAAY;EAEjD,OAAO,IAAI,mBAAmB,KAAK,KAAK,kBAAkB,SAAS,EAAE,GAAG;GACtE,QAAQ,SAAS,GAAG;GACpB,WAAW;GACX,IAAI,MAAM,GAAG,GAAG,OAAM,MAAK,kBAAkB,CAAC,CAAC,GAAG;IAChD,cAAc;IACd,MAAM,YAAY,MAAM,GAAG,GACxB,KAAI,OAAM,GAAG,GAAG,EAChB,QAAO,OAAM,aAAa,OAAO,UAAU,EAAE,CAAC;IACjD,QAAQ,gBAAgB,YAAYA,cAAAA,SAAS,WAAW,GAAG;GAC7D,OAEE,IACE,MAAM,GAAG,GAAG,OAAM,OAAM,OAAO,OAAO,QAAQ,KAC9C,MAAM,GAAG,GAAG,OAAM,OAAM,OAAO,OAAO,QAAQ,KAC9C,MAAM,GAAG,GAAG,OAAM,OAAM,OAAO,OAAO,SAAS,GAE/C,QAAQ,gBACJ,MAAM,GAAG,KACTA,cAAAA,SACE,MAAM,GAAG,GAAG,KAAI,OAAM,GAAG,IAAI,GAC7B,GACF;;GAKR,IAAI,MAAM,SAAS,GACjB,OAAO;IAAE;IAAO;IAAU;IAAO;GAAY;EAEjD;EAEA,OAAO,OAAQ,YAAY;GAAE,YAAY;GAAO,OAAO,CAAC,IAAI;EAAE,IAAI,OAAQ;CAC5E;CAEA,MAAM,UAAU,QAAQ,cAAcC,4BAAAA,oBAAuB,MAAS;CAEtE,IAAI,YAAY;CAChB,IAAI,OAAO,iBAAiB,UAC1B,IAAI;EACF,YAAY,KAAK,MAAM,YAAY;CACrC,QAAQ;EACN,OAAO,QAAQ,cAAc;CAC/B;CAIF,MAAM,aADS,aAAa,WAAW,IACO,KAAK;CACnD,OAAO,QAAQ,QAAQ,yBAAyBC,qBAAAA,YAAY,UAAU,IAAI,UAAU;AACtF"}
|
|
1
|
+
{"version":3,"file":"parseJsonLogic.js","names":["isPojo","getFieldsArray","fieldIsValidUtil","isPojo","objectKeys","isRuleGroup","isRuleGroupType","defaultOperatorNegationMap","joinWith","prepareRuleGroup","convertToIC"],"sources":["../src/utils/parseJsonLogic/utils.ts","../src/utils/parseJsonLogic/parseJsonLogic.ts"],"sourcesContent":["import type {\n JsonLogicAll,\n JsonLogicAnd,\n JsonLogicDoubleNegation,\n JsonLogicEqual,\n JsonLogicGreaterThan,\n JsonLogicGreaterThanOrEqual,\n JsonLogicInArray,\n JsonLogicInString,\n JsonLogicLessThan,\n JsonLogicLessThanOrEqual,\n JsonLogicNegation,\n JsonLogicNone,\n JsonLogicNotEqual,\n JsonLogicOr,\n JsonLogicSome,\n JsonLogicStrictEqual,\n JsonLogicStrictNotEqual,\n JsonLogicVar,\n RQBJsonLogicEndsWith,\n RQBJsonLogicStartsWith,\n RQBJsonLogicVar,\n} from '../../types';\nimport { isPojo } from '../misc';\nimport type { JsonLogicBetweenExclusive, JsonLogicBetweenInclusive } from './types';\n\n// Standard JsonLogic operations\nexport const isJsonLogicVar = (\n logic: unknown\n): logic is JsonLogicVar<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && 'var' in logic;\nexport const isRQBJsonLogicVar = (logic: unknown): logic is RQBJsonLogicVar =>\n isJsonLogicVar(logic) && typeof logic.var === 'string';\nexport const isJsonLogicEqual = (logic: unknown): logic is JsonLogicEqual =>\n isPojo(logic) && '==' in logic;\nexport const isJsonLogicStrictEqual = (logic: unknown): logic is JsonLogicStrictEqual =>\n isPojo(logic) && '===' in logic;\nexport const isJsonLogicNotEqual = (logic: unknown): logic is JsonLogicNotEqual =>\n isPojo(logic) && '!=' in logic;\nexport const isJsonLogicStrictNotEqual = (logic: unknown): logic is JsonLogicStrictNotEqual =>\n isPojo(logic) && '!==' in logic;\nexport const isJsonLogicNegation = (logic: unknown): logic is JsonLogicNegation =>\n isPojo(logic) && '!' in logic;\nexport const isJsonLogicDoubleNegation = (logic: unknown): logic is JsonLogicDoubleNegation =>\n isPojo(logic) && '!!' in logic;\nexport const isJsonLogicOr = (\n logic: unknown\n): logic is JsonLogicOr<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && 'or' in logic;\nexport const isJsonLogicAnd = (\n logic: unknown\n): logic is JsonLogicAnd<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && 'and' in logic;\nexport const isJsonLogicGreaterThan = (\n logic: unknown\n): logic is JsonLogicGreaterThan<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && '>' in logic;\nexport const isJsonLogicGreaterThanOrEqual = (\n logic: unknown\n): logic is JsonLogicGreaterThanOrEqual<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && '>=' in logic;\nexport const isJsonLogicLessThan = (\n logic: unknown\n): logic is JsonLogicLessThan<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && '<' in logic && logic['<'].length === 2;\nexport const isJsonLogicLessThanOrEqual = (\n logic: unknown\n): logic is JsonLogicLessThanOrEqual<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && '<=' in logic && logic['<='].length === 2;\nexport const isJsonLogicInArray = (\n logic: unknown\n): logic is JsonLogicInArray<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && 'in' in logic && Array.isArray(logic.in[1]);\nexport const isJsonLogicInString = (\n logic: unknown\n): logic is JsonLogicInString<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && 'in' in logic && !Array.isArray(logic.in[1]);\nexport const isJsonLogicAll = (\n logic: unknown\n): logic is JsonLogicAll<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && 'all' in logic;\nexport const isJsonLogicNone = (\n logic: unknown\n): logic is JsonLogicNone<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && 'none' in logic;\nexport const isJsonLogicSome = (\n logic: unknown\n): logic is JsonLogicSome<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && 'some' in logic;\n\n// \"Between\" operations are special cases of '<' and '<='\nexport const isJsonLogicBetweenExclusive = (logic: unknown): logic is JsonLogicBetweenExclusive =>\n isPojo(logic) && '<' in logic && Array.isArray(logic['<']) && logic['<'].length === 3;\nexport const isJsonLogicBetweenInclusive = (logic: unknown): logic is JsonLogicBetweenInclusive =>\n isPojo(logic) && '<=' in logic && Array.isArray(logic['<=']) && logic['<='].length === 3;\n\n// RQB extensions\nexport const isRQBJsonLogicStartsWith = (logic: unknown): logic is RQBJsonLogicStartsWith =>\n isPojo(logic) && 'startsWith' in logic;\nexport const isRQBJsonLogicEndsWith = (logic: unknown): logic is RQBJsonLogicEndsWith =>\n isPojo(logic) && 'endsWith' in logic;\n\n// Type guards for unused JsonLogic operations\n\n// import type {\n// JsonLogicCat,\n// JsonLogicDifference,\n// JsonLogicFilter,\n// JsonLogicIf,\n// JsonLogicLog,\n// JsonLogicMap,\n// JsonLogicMax,\n// JsonLogicMerge,\n// JsonLogicMin,\n// JsonLogicMissing,\n// JsonLogicMissingSome,\n// JsonLogicProduct,\n// JsonLogicQuotient,\n// JsonLogicReduce,\n// JsonLogicRemainder,\n// JsonLogicSubstr,\n// JsonLogicSum,\n// } from '../../types';\n//\n// export const isJsonLogicMissing = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicMissing<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'missing' in logic;\n// export const isJsonLogicMissingSome = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicMissingSome<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'missing_some' in logic;\n// export const isJsonLogicIf = (logic: RQBJsonLogic): logic is JsonLogicIf =>\n// isPojo(logic) && 'if' in logic;\n// export const isJsonLogicMax = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicMax<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'max' in logic;\n// export const isJsonLogicMin = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicMin<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'min' in logic;\n// export const isJsonLogicSum = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicSum<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && '+' in logic;\n// export const isJsonLogicDifference = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicDifference<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && '-' in logic;\n// export const isJsonLogicProduct = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicProduct<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && '*' in logic;\n// export const isJsonLogicQuotient = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicQuotient<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && '/' in logic;\n// export const isJsonLogicRemainder = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicRemainder<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && '%' in logic;\n// export const isJsonLogicMap = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicMap<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'map' in logic;\n// export const isJsonLogicFilter = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicFilter<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'filter' in logic;\n// export const isJsonLogicReduce = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicReduce<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'reduce' in logic;\n// export const isJsonLogicMerge = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicMerge<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'merge' in logic;\n// export const isJsonLogicCat = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicCat<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'cat' in logic;\n// export const isJsonLogicSubstr = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicSubstr<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'substr' in logic;\n// export const isJsonLogicLog = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicLog<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'log' in logic;\n","import type { Except } from 'type-fest';\nimport { defaultOperatorNegationMap } from '../../defaults';\nimport type {\n DefaultOperatorName,\n DefaultRuleGroupType,\n DefaultRuleGroupTypeAny,\n DefaultRuleGroupTypeIC,\n DefaultRuleType,\n MatchConfig,\n RQBJsonLogic,\n RQBJsonLogicVar,\n RuleGroupTypeAny,\n RuleType,\n ValueSource,\n} from '../../types';\nimport type { ParserCommonOptions } from '../../types/import';\nimport { joinWith } from '../arrayUtils';\nimport { convertToIC } from '../convertQuery';\nimport { isRuleGroup, isRuleGroupType } from '../isRuleGroup';\nimport { isPojo } from '../misc';\nimport { objectKeys } from '../objectUtils';\nimport { fieldIsValidUtil, getFieldsArray } from '../parserUtils';\nimport { prepareRuleGroup } from '../prepareQueryObjects';\nimport {\n isJsonLogicAll,\n isJsonLogicAnd,\n isJsonLogicBetweenExclusive,\n isJsonLogicBetweenInclusive,\n isJsonLogicDoubleNegation,\n isJsonLogicEqual,\n isJsonLogicGreaterThan,\n isJsonLogicGreaterThanOrEqual,\n isJsonLogicInArray,\n isJsonLogicInString,\n isJsonLogicLessThan,\n isJsonLogicLessThanOrEqual,\n isJsonLogicNegation,\n isJsonLogicNone,\n isJsonLogicNotEqual,\n isJsonLogicOr,\n isJsonLogicSome,\n isJsonLogicStrictEqual,\n isJsonLogicStrictNotEqual,\n isRQBJsonLogicEndsWith,\n isRQBJsonLogicStartsWith,\n isRQBJsonLogicVar,\n} from './utils';\n\n/**\n * Options object for {@link parseJsonLogic}.\n */\nexport interface ParseJsonLogicOptions extends ParserCommonOptions {\n // oxlint-disable-next-line typescript/no-explicit-any\n jsonLogicOperations?: Record<string, (value: any) => RuleType | RuleGroupTypeAny | false>;\n}\n\nconst emptyRuleGroup: DefaultRuleGroupType = { combinator: 'and', rules: [] };\n\n/**\n * Converts a JsonLogic object into a query suitable for the\n * {@link index!QueryBuilder QueryBuilder} component's `query` or `defaultQuery` props\n * ({@link index!DefaultRuleGroupType DefaultRuleGroupType}).\n */\nfunction parseJsonLogic(rqbJsonLogic: string | RQBJsonLogic): DefaultRuleGroupType;\n/**\n * Converts a JsonLogic object into a query suitable for the\n * {@link index!QueryBuilder QueryBuilder} component's `query` or `defaultQuery` props\n * ({@link index!DefaultRuleGroupType DefaultRuleGroupType}).\n */\nfunction parseJsonLogic(\n rqbJsonLogic: string | RQBJsonLogic,\n options: Except<ParseJsonLogicOptions, 'independentCombinators'> & {\n independentCombinators?: false;\n }\n): DefaultRuleGroupType;\n/**\n * Converts a JsonLogic object into a query suitable for the\n * {@link index!QueryBuilder QueryBuilder} component's `query` or `defaultQuery` props\n * ({@link index!DefaultRuleGroupTypeIC DefaultRuleGroupTypeIC}).\n */\nfunction parseJsonLogic(\n rqbJsonLogic: string | RQBJsonLogic,\n options: Except<ParseJsonLogicOptions, 'independentCombinators'> & {\n independentCombinators: true;\n }\n): DefaultRuleGroupTypeIC;\nfunction parseJsonLogic(\n rqbJsonLogic: string | RQBJsonLogic,\n options: ParseJsonLogicOptions = {}\n): DefaultRuleGroupTypeAny {\n const fieldsFlat = getFieldsArray(options.fields);\n const { getValueSources, listsAsArrays, jsonLogicOperations } = options;\n\n const fieldIsValid = (\n fieldName: string,\n operator: DefaultOperatorName,\n subordinateFieldName?: string\n ) =>\n fieldIsValidUtil({\n fieldName,\n fieldsFlat,\n operator,\n subordinateFieldName,\n getValueSources,\n });\n\n // Overload 1: Always return a rule group or false for the outermost logic object\n function processLogic(logic: RQBJsonLogic, outermost: true): DefaultRuleGroupType | false;\n // Overload 2: If not the outermost object, return value could also be a rule\n function processLogic(\n logic: RQBJsonLogic,\n outermost?: false,\n inSubquery?: boolean\n ): DefaultRuleGroupType | DefaultRuleType | false;\n // Implementation\n function processLogic(\n logic: RQBJsonLogic,\n outermost?: boolean,\n inSubquery?: boolean\n ): DefaultRuleGroupType | DefaultRuleType | false {\n // Bail if the outermost logic is not a plain object\n if (outermost && !isPojo(logic)) {\n return false;\n }\n const [key, keyValue] = Object.entries(logic || {})?.[0] ?? [];\n\n // Custom operations process logic\n if (jsonLogicOperations && objectKeys(jsonLogicOperations).includes(key)) {\n const rule = jsonLogicOperations[key](keyValue) as DefaultRuleType;\n return rule\n ? outermost && !isRuleGroup(rule)\n ? { combinator: 'and', rules: [rule] }\n : rule\n : false;\n }\n\n // Rule groups\n if (isJsonLogicAnd(logic)) {\n return {\n combinator: 'and',\n rules: logic.and.map(l => processLogic(l, false, inSubquery)).filter(Boolean) as (\n | DefaultRuleType\n | DefaultRuleGroupType\n )[],\n };\n } else if (isJsonLogicOr(logic)) {\n return {\n combinator: 'or',\n rules: logic.or.map(l => processLogic(l, false, inSubquery)).filter(Boolean) as (\n | DefaultRuleType\n | DefaultRuleGroupType\n )[],\n };\n } else if (isJsonLogicNegation(logic)) {\n const rule = processLogic(logic['!'], false, inSubquery);\n if (rule) {\n if (\n !isRuleGroupType(rule) &&\n (rule.operator === 'between' ||\n rule.operator === 'in' ||\n rule.operator === 'contains' ||\n rule.operator === 'beginsWith' ||\n rule.operator === 'endsWith')\n ) {\n const newRule = { ...rule, operator: defaultOperatorNegationMap[rule.operator] };\n if (outermost) {\n return { combinator: 'and', rules: [newRule] };\n }\n return newRule;\n } else if (isJsonLogicBetweenExclusive(logic['!']) || isRuleGroupType(rule)) {\n return { ...rule, not: true };\n }\n return { combinator: 'and', rules: [rule], not: true };\n }\n return false;\n } else if (isJsonLogicDoubleNegation(logic)) {\n const rule = processLogic(logic['!!'], false, inSubquery);\n return rule || false;\n }\n\n // All other keys represent rules\n let rule: DefaultRuleType | false = false;\n let field = '';\n let operator: DefaultOperatorName = '=';\n // oxlint-disable-next-line typescript/no-explicit-any\n let value: any = '';\n let valueSource: ValueSource | undefined = undefined;\n\n if (\n // Basic boolean operations\n isJsonLogicEqual(logic) ||\n isJsonLogicStrictEqual(logic) ||\n isJsonLogicNotEqual(logic) ||\n isJsonLogicStrictNotEqual(logic) ||\n isJsonLogicGreaterThan(logic) ||\n isJsonLogicGreaterThanOrEqual(logic) ||\n isJsonLogicLessThan(logic) ||\n isJsonLogicLessThanOrEqual(logic) ||\n isJsonLogicInString(logic) ||\n isRQBJsonLogicStartsWith(logic) ||\n isRQBJsonLogicEndsWith(logic)\n ) {\n const [first, second] = keyValue;\n if (isRQBJsonLogicVar(first) && !isPojo(second)) {\n field = first.var;\n value = second;\n } else if (!isPojo(first) && isRQBJsonLogicVar(second)) {\n field = second.var;\n value = first;\n } else if (isRQBJsonLogicVar(first) && isRQBJsonLogicVar(second)) {\n field = first.var;\n value = second.var;\n valueSource = 'field';\n } else {\n return false;\n }\n\n // Translate operator if necessary\n if (isJsonLogicEqual(logic) || isJsonLogicStrictEqual(logic)) {\n operator = value === null ? 'null' : '=';\n } else if (isJsonLogicNotEqual(logic) || isJsonLogicStrictNotEqual(logic)) {\n operator = value === null ? 'notNull' : '!=';\n } else if (isJsonLogicInString(logic)) {\n operator = 'contains';\n } else if (isRQBJsonLogicStartsWith(logic)) {\n operator = 'beginsWith';\n } else if (isRQBJsonLogicEndsWith(logic)) {\n operator = 'endsWith';\n } else {\n operator = key as DefaultOperatorName;\n }\n\n if (\n inSubquery ||\n fieldIsValid(field, operator, valueSource === 'field' ? value : undefined)\n ) {\n rule = { field, operator, value, valueSource };\n }\n } else if (\n (isJsonLogicAll(logic) && isRQBJsonLogicVar(logic['all'][0])) ||\n (isJsonLogicNone(logic) && isRQBJsonLogicVar(logic['none'][0])) ||\n (isJsonLogicSome(logic) && isRQBJsonLogicVar(logic['some'][0]))\n ) {\n // The array coverage functions must have a field as their first element.\n // Otherwise we'd be comparing values to values, which is not supported.\n const match: MatchConfig = {\n mode: isJsonLogicNone(logic) ? 'none' : isJsonLogicSome(logic) ? 'some' : 'all',\n };\n\n // oxlint-disable-next-line typescript/no-explicit-any\n const [{ var: fld }, operation] = (logic as any)[match.mode];\n const matcher = processLogic(operation, false, true);\n\n if (!matcher) return false;\n\n rule = {\n field: fld,\n operator: '=',\n match,\n value: isRuleGroup(matcher) ? matcher : { combinator: 'and', rules: [matcher] },\n };\n } else if (isJsonLogicBetweenExclusive(logic) && isRQBJsonLogicVar(logic['<'][1])) {\n field = logic['<'][1].var;\n const values = [logic['<'][0], logic['<'][2]];\n // v8 ignore else\n if (\n values.every(v => isRQBJsonLogicVar(v)) ||\n values.every(el => typeof el === 'string') ||\n values.every(el => typeof el === 'number') ||\n values.every(el => typeof el === 'boolean')\n ) {\n return (\n processLogic({\n and: [{ '>': [{ var: field }, values[0]] }, { '<': [{ var: field }, values[1]] }],\n }) || /* v8 ignore start -- @preserve */ false /* v8 ignore stop -- @preserve */\n );\n }\n } else if (isJsonLogicBetweenInclusive(logic) && isRQBJsonLogicVar(logic['<='][1])) {\n field = logic['<='][1].var;\n operator = 'between';\n const values = [logic['<='][0], logic['<='][2]];\n if (logic['<='].every(v => isRQBJsonLogicVar(v))) {\n const vars = values as RQBJsonLogicVar[];\n valueSource = 'field';\n const fieldList = vars.map(el => el.var).filter(sf => fieldIsValid(field, operator, sf));\n value = listsAsArrays ? fieldList : joinWith(fieldList, ',');\n } else {\n // v8 ignore else\n if (\n values.every(el => typeof el === 'string') ||\n values.every(el => typeof el === 'number') ||\n values.every(el => typeof el === 'boolean')\n ) {\n value = listsAsArrays\n ? values\n : joinWith(\n values.map(el => `${el}`),\n ','\n );\n }\n }\n\n if (fieldIsValid(field, operator) && value.length >= 2) {\n rule = { field, operator, value, valueSource };\n }\n } else if (isJsonLogicInArray(logic) && isRQBJsonLogicVar(keyValue[0])) {\n field = keyValue[0].var;\n operator = 'in';\n if (logic.in[1].every(v => isRQBJsonLogicVar(v))) {\n valueSource = 'field';\n const fieldList = logic.in[1]\n .map(el => el.var)\n .filter(sf => fieldIsValid(field, operator, sf));\n value = listsAsArrays ? fieldList : joinWith(fieldList, ',');\n } else {\n // v8 ignore else\n if (\n logic.in[1].every(el => typeof el === 'string') ||\n logic.in[1].every(el => typeof el === 'number') ||\n logic.in[1].every(el => typeof el === 'boolean')\n ) {\n value = listsAsArrays\n ? logic.in[1]\n : joinWith(\n logic.in[1].map(el => `${el}`),\n ','\n );\n }\n }\n\n // v8 ignore else\n if (value.length > 0) {\n rule = { field, operator, value, valueSource };\n }\n }\n\n return rule ? (outermost ? { combinator: 'and', rules: [rule] } : rule) : false;\n }\n\n const prepare = options.generateIDs ? prepareRuleGroup : <T>(g: T) => g;\n\n let logicRoot = rqbJsonLogic;\n if (typeof rqbJsonLogic === 'string') {\n try {\n logicRoot = JSON.parse(rqbJsonLogic);\n } catch {\n return prepare(emptyRuleGroup);\n }\n }\n\n const result = processLogic(logicRoot, true);\n const finalQuery: DefaultRuleGroupType = result || emptyRuleGroup;\n return prepare(options.independentCombinators ? convertToIC(finalQuery) : finalQuery);\n}\n\nexport { parseJsonLogic };\n"],"mappings":"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"}
|
package/dist/parseJsonLogic.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { E as joinWith, k as defaultOperatorNegationMap } from "./utils-
|
|
2
|
-
import { i as isRuleGroupType, n as objectKeys, o as isPojo, r as isRuleGroup } from "./objectUtils-
|
|
3
|
-
import { n as convertToIC } from "./convertQuery-
|
|
4
|
-
import { n as fieldIsValidUtil, r as getFieldsArray, t as prepareRuleGroup } from "./prepareQueryObjects-
|
|
1
|
+
import { E as joinWith, k as defaultOperatorNegationMap } from "./utils-01WaTGBL.mjs";
|
|
2
|
+
import { i as isRuleGroupType, n as objectKeys, o as isPojo, r as isRuleGroup } from "./objectUtils-D-w8MzpZ.mjs";
|
|
3
|
+
import { n as convertToIC } from "./convertQuery-CQwOrjQr.mjs";
|
|
4
|
+
import { n as fieldIsValidUtil, r as getFieldsArray, t as prepareRuleGroup } from "./prepareQueryObjects-BXf5aV-A.mjs";
|
|
5
5
|
//#region src/utils/parseJsonLogic/utils.ts
|
|
6
6
|
const isJsonLogicVar = (logic) => isPojo(logic) && "var" in logic;
|
|
7
7
|
const isRQBJsonLogicVar = (logic) => isJsonLogicVar(logic) && typeof logic.var === "string";
|
|
@@ -42,7 +42,7 @@ function parseJsonLogic(rqbJsonLogic, options = {}) {
|
|
|
42
42
|
subordinateFieldName,
|
|
43
43
|
getValueSources
|
|
44
44
|
});
|
|
45
|
-
function processLogic(logic, outermost) {
|
|
45
|
+
function processLogic(logic, outermost, inSubquery) {
|
|
46
46
|
if (outermost && !isPojo(logic)) return false;
|
|
47
47
|
const [key, keyValue] = Object.entries(logic || {})?.[0] ?? [];
|
|
48
48
|
if (jsonLogicOperations && objectKeys(jsonLogicOperations).includes(key)) {
|
|
@@ -54,14 +54,14 @@ function parseJsonLogic(rqbJsonLogic, options = {}) {
|
|
|
54
54
|
}
|
|
55
55
|
if (isJsonLogicAnd(logic)) return {
|
|
56
56
|
combinator: "and",
|
|
57
|
-
rules: logic.and.map((l) => processLogic(l)).filter(Boolean)
|
|
57
|
+
rules: logic.and.map((l) => processLogic(l, false, inSubquery)).filter(Boolean)
|
|
58
58
|
};
|
|
59
59
|
else if (isJsonLogicOr(logic)) return {
|
|
60
60
|
combinator: "or",
|
|
61
|
-
rules: logic.or.map((l) => processLogic(l)).filter(Boolean)
|
|
61
|
+
rules: logic.or.map((l) => processLogic(l, false, inSubquery)).filter(Boolean)
|
|
62
62
|
};
|
|
63
63
|
else if (isJsonLogicNegation(logic)) {
|
|
64
|
-
const rule = processLogic(logic["!"]);
|
|
64
|
+
const rule = processLogic(logic["!"], false, inSubquery);
|
|
65
65
|
if (rule) {
|
|
66
66
|
if (!isRuleGroupType(rule) && (rule.operator === "between" || rule.operator === "in" || rule.operator === "contains" || rule.operator === "beginsWith" || rule.operator === "endsWith")) {
|
|
67
67
|
const newRule = {
|
|
@@ -84,7 +84,7 @@ function parseJsonLogic(rqbJsonLogic, options = {}) {
|
|
|
84
84
|
};
|
|
85
85
|
}
|
|
86
86
|
return false;
|
|
87
|
-
} else if (isJsonLogicDoubleNegation(logic)) return processLogic(logic["!!"]) || false;
|
|
87
|
+
} else if (isJsonLogicDoubleNegation(logic)) return processLogic(logic["!!"], false, inSubquery) || false;
|
|
88
88
|
let rule = false;
|
|
89
89
|
let field = "";
|
|
90
90
|
let operator = "=";
|
|
@@ -109,7 +109,7 @@ function parseJsonLogic(rqbJsonLogic, options = {}) {
|
|
|
109
109
|
else if (isRQBJsonLogicStartsWith(logic)) operator = "beginsWith";
|
|
110
110
|
else if (isRQBJsonLogicEndsWith(logic)) operator = "endsWith";
|
|
111
111
|
else operator = key;
|
|
112
|
-
if (fieldIsValid(field, operator, valueSource === "field" ? value : void 0)) rule = {
|
|
112
|
+
if (inSubquery || fieldIsValid(field, operator, valueSource === "field" ? value : void 0)) rule = {
|
|
113
113
|
field,
|
|
114
114
|
operator,
|
|
115
115
|
value,
|
|
@@ -118,7 +118,7 @@ function parseJsonLogic(rqbJsonLogic, options = {}) {
|
|
|
118
118
|
} else if (isJsonLogicAll(logic) && isRQBJsonLogicVar(logic["all"][0]) || isJsonLogicNone(logic) && isRQBJsonLogicVar(logic["none"][0]) || isJsonLogicSome(logic) && isRQBJsonLogicVar(logic["some"][0])) {
|
|
119
119
|
const match = { mode: isJsonLogicNone(logic) ? "none" : isJsonLogicSome(logic) ? "some" : "all" };
|
|
120
120
|
const [{ var: fld }, operation] = logic[match.mode];
|
|
121
|
-
const matcher = processLogic(operation);
|
|
121
|
+
const matcher = processLogic(operation, false, true);
|
|
122
122
|
if (!matcher) return false;
|
|
123
123
|
rule = {
|
|
124
124
|
field: fld,
|