@blitznocode/blitz-orm 0.12.1 → 0.12.3

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/default.config.ts","../src/adapters/typeDB/schema/define.ts","../src/adapters/surrealDB/helpers.ts","../src/adapters/surrealDB/parsing/values.ts","../src/adapters/surrealDB/parsing/parseFlexVal.ts","../src/adapters/surrealDB/schema/define.ts","../src/define/index.ts","../src/helpers.ts","../src/types/symbols/index.ts","../src/adapters/index.ts","../src/adapters/surrealDB/enrichSchema/helpers.ts","../src/index.ts","../src/stateMachine/mutation/bql/shared/getOppositePlayers.ts","../src/stateMachine/mutation/bql/enrichSteps/replaces.ts","../src/stateMachine/mutation/bql/shared/validateOp.ts","../src/stateMachine/mutation/bql/shared/getOp.ts","../src/stateMachine/mutation/bql/enrichSteps/rootMeta.ts","../src/stateMachine/mutation/bql/enrichSteps/splitIds.ts","../src/stateMachine/mutation/bql/shared/doActions.ts","../src/stateMachine/mutation/bql/enrichSteps/enrichChildren.ts","../src/stateMachine/mutation/bql/shared/get$bzId.ts","../src/stateMachine/mutation/bql/enrichSteps/computeFields.ts","../src/engine/helpers.ts","../src/engine/compute.ts","../src/stateMachine/mutation/bql/shared/getTriggeredActions.ts","../src/stateMachine/mutation/bql/enrichSteps/preHookValidations.ts","../src/stateMachine/mutation/bql/enrichSteps/preHookTransformations.ts","../src/stateMachine/mutation/bql/enrichSteps/unlinkAll.ts","../src/stateMachine/mutation/bql/guards/dependenciesGuard.ts","../src/stateMachine/query/bql/enrich.ts","../src/stateMachine/mutation/bql/enrichSteps/preValidate.ts","../src/stateMachine/mutation/bql/enrich.ts","../src/stateMachine/mutation/bql/parse.ts","../tests/helpers/matchers.ts","../src/stateMachine/robot3/index.ts","../src/stateMachine/query/bql/clean.ts","../src/stateMachine/query/postHook.ts","../src/stateMachine/query/surql/build.ts","../src/adapters/surrealDB/filters/filters.ts","../src/version.ts","../src/logger.ts","../src/stateMachine/query/surql/run.ts","../src/stateMachine/query/surql/parse.ts","../src/stateMachine/query/surql/buildRefs.ts","../src/stateMachine/query/surql/machine.ts","../src/stateMachine/query/tql/build.ts","../src/stateMachine/query/tql/filters.ts","../src/stateMachine/query/tql/parse.ts","../src/adapters/typeDB/helpers.ts","../src/stateMachine/query/tql/run.ts","../src/stateMachine/query/tql/machine.ts","../src/stateMachine/query/queryMachine.ts","../src/stateMachine/mutation/bql/preQuery.ts","../src/stateMachine/mutation/bql/stringify.ts","../src/stateMachine/mutation/bql/enrichSteps/preHookDependencies.ts","../src/adapters/typeDB/parseFlexVal.ts","../src/stateMachine/mutation/tql/build.ts","../src/stateMachine/mutation/tql/parse.ts","../src/stateMachine/mutation/tql/run.ts","../src/stateMachine/mutation/tql/machine.ts","../src/stateMachine/mutation/surql/build.ts","../src/stateMachine/mutation/surql/run.ts","../src/stateMachine/mutation/surql/parse.ts","../src/stateMachine/mutation/surql/machine.ts","../src/stateMachine/mutation/bql/flatter.ts","../src/stateMachine/mutation/mutationMachine.ts","../src/adapters/surrealDB/client.ts"],"names":["defaultConfig","removeDuplicateObjects","arr","uniqueObjects","uniqueMap","obj","dbPath","contentType","key","convertTQLSchema","connectorId","schema","output","usedAttributes","eName","entityName","entity","dataFields","linkFields","name","field","usedLinkFields","linkField","relation","plays","inherited","rName","relationName","roles","roleName","attributes","attribute","defineTQLSchema","config","dbHandles","typeDBString","session","client","dbName","schemaTransaction","SessionType","TransactionType","sanitizeTableNameSurrealDb","tableName","specialChars","sanitizeNameSurrealDB","value","char","parseFlexValSurrealDB","v","isDate","surrealDBtypeMap","parseValueSurrealDB","ct","dayjs","parsedVal","isArray","INDENTATION","indent","n","indentPar","str","level","line","convertBQLToSurQL","header","entities","convertSchemaItems","relations","utilityFunctions","addUtilityFunctions","items","item","convertSchemaItem","baseDefinition","convertDataFields","convertLinkFields","convertRoles","parentName","fieldType","mapContentTypeToSurQL","dbValue","relationLinkField","lf","targetPath","type","pathToRelation","relationPath","baseField","supportField","role","fieldDefinition","roleEvent","generateRoleEvent","eventName","targetRelationLinkField","targetRelationPath","firstTargetRoleLinkField","firstTargetRolePath","usedLinkField","generateSet","fields","action","path","cardinality","impactedLinkFields","allFields","removalsSet","additionsSet","cardOneEvents","cardManyEvents","validations","defineSURQLSchema","bormDefine","typeDBEntriesFixed","entry","surrealDBEntriesFixed","Schema","QueryPath","StepPrint","EdgeType","EdgeSchema","Path","DBNode","IsTransformed","Parent","FieldSchema","SharedMetadata","SuqlMetadata","adapterContext","getSurrealLinkFieldQueryPath","originalRelation","withExtensionsSchema","linkMode","targetRelationSubTypes","targetRelationThings","targetRole","targetRoleSubTypes","oppositeRoleThings","pathToTunneledRole","getDbPath","thing","shared","oFind","fn","k","oFilter","entries","error","result","tryit","enrichSchema","allLinkedFields","produce","draft","traverse","meta","val","df","mapEntries","refFieldKey","refField","roleKey","extendedSchema","allExtends","ext","deepExtendedThing","deepSchema","deepDf","extendedRelationSchema","extendedRelationSchemaWithOrigin","extendedThingSchema","extendedRefFields","thingTypes","thingPath","withThing","x","thingType","thingDB","linkFieldRelation","getSchemaByThing","queryPath","enrichedRefField","playedBy","$things","playerThingsWithSubTypes","playerThing","subTypes","getQueryPath","playedBySet","thingId","draftSchema","$thing","getCurrentSchema","node","getFieldType","currentSchema","dataFieldSchema","dataField","linkFieldSchema","roleFieldSchema","getIdFieldKey","idField","getThingType","rootNode","getFieldSchema","foundLinkField","foundDataField","foundRoleField","foundRefField","getCardinality","getCurrentFields","availableDataFields","availableLinkFields","availableRefFields","listify","availableRoleFields","availableFields","allowedFields","usedFields","localFilterFields","nestedFilterFields","unidentifiedFields","localFilters","_v","nestedFilters","capitalizeFirstLetter","string","getParentNode","blocks","parent","pathParts","parentPath","getNodeByPath","getSymbols","oldBlock","symbols","symbolKey","isBQLBlock","block","isObject","deepCurrent","current","plainObject","isDraft","assertDefined","msg","depth","_indent","i","genId","customAlphabet","getOppositePlayers","fieldSchema","oppositePlayer","replaceToObj","subNodes","child","oppositePlayers","player","$op","$thingType","base","tempIds","nonTempIds","tempId","nanoid","replaceToObjRef","sn","validateOp","parentNode","nodeSchema","usedDataFields","validateChildren","subNode","getOp","getOpAndValidate","setRootMeta","withMetadataRootArray","rootOp","doAction","stepName","isSet","splitMultipleIds","transformedChildren","$id","get$bzId","enrichChildren","newNodes","$bzId","refSchema","relationSchema","relFieldSchema","STRIP_COMMENTS","STRIP_KEYWORDS","getParamNames","func","fnBodyStr","paramsBlock","param","p","computeField","currentThing","mandatoryDependencies","missingArgs","arg","computeFields","currentNode","computedFields","virtualFields","filledFields","attKey","virtualFilledFields","fieldPath","currentFieldDef","currentLinkedDef","currentRoleDef","currentDef","defaultValue","getTriggeredActions","hooks","currentEvent","hook","preHookValidations","requiredFields","enumFields","fnValidatedFields","enumOptions","clone","userContext","dbNode","validationResult","preHookTransformations","triggeredActions","workingNode","newProps","unlinkAll","uuidv4","dependenciesGuard","mut","o","enrichBQLQuery","rawBqlQuery","batches","context","enrichFilter","checkFilterByUnique","newFields","processed","processField","getAllFields","f","isId","roleFields","refFields","$filter","fieldFilter","isIdField","isUniqueDataField","isSingle$id","filterOperators","eqValue","createDataField","props","fieldStr","$justId","isVirtual","createLinkField","target","oppositeLinkFieldsPlayedBy","idNotIncluded","idFields","createRefField","createRoleField","roleField","wasArray","resultArray","filter","acc","valueAsArray","fieldSchemaTyped","childrenThing","preValidate","paths","cleanPath","cleanStep","dataFieldStep","enrichBQLMutation","rootBlock","has$Fields","toIgnore","lastPath","secondToLastPath","isFilter","relField","rootField","subNodeSchema","uf","usedLinkFieldsSchemas","lf1","lf2","j","deepRemoveMetaData","removeMeta","s","parseBQLMutation","listNodes","nodes","edges","getIdValue","idDataField","defaultIdField","idValue","toNodes","toEdges","edge","currentThingSchema","dataFieldPaths","roleFieldPaths","linkFieldPaths","getChildOp","usedRoleFields","dataObj","shake","pick","edgeSchema","ownRelation","linkTempId","parentId","getLinkObjOp","edgeType1","rolesObjFiltered","rolesObjOnlyIds","objWithMetaDataOnly","getEdgeOp","currentRoles","rolesObjOnlyIdsGrouped","currentRoleCardinality","vNested","edgeType2","totalUnlinks","operations","operationsArray","childOp","operation","op","edgeType3","parsedThings","parsedEdges","mergedThings","existingIndex","t","mergedEdges","curr","existingEdge","r","newRelation","existingVal","currVal","allThings","orphanTempIds","d","valueEnumerable","valueEnumerableWritable","truthy","empty","identity","a","callBoth","par","self","args","callForward","b","create","stack","fns","def","caller","fnType","reduceType","reduce","guardType","guard","Type","makeTransition","from","to","guards","reducers","transitionType","immediateType","transition","immediate","enterImmediate","machine","service","event","transitionTo","transitionsToMap","transitions","m","stateType","state","immediates","desc","invokeFnType","machine2","rn","invokeMachineType","data","interpret","invoke","createMachine","states","contextFn","fromEvent","candidates","original","newMachine","send","currentStateName","onChange","initialContext","cleanQueryRes","bqlRes","withPostHooks","queryPostHooks","cleanOutput","symbol","postHooks","enrichedBqlQuery","originalNode","queriedFields","excludedFields","virtualFieldPath","computedValue","excludedField","surqlOperators","parseFilter","surrealDBKey","buildSuqlFilter","parts","logicalOperator","nestedFilter","keyWithoutPrefix","valueKeys","operator","nextValue","surrealOperator","buildSorter","sort","build","queries","query","buildQuery","$fields","$offset","$limit","$sort","lines","fieldLines","buildFieldsQuery","allTypesNormed","$ids","allCombinations","id","parsed","parentQuery","buildFieldQuery","buildAttributeQuery","buildLinkQuery","buildRoleQuery","queryLevel","built","fieldLevel","VERSION","LOG_LEVEL","log","l","logDebug","run","batchedQuery","parse","res","parseRes","parseObj","newObj","parseFieldResult","parseValue","parsedContent","flatNestedField","nf","content","asArray","buildRefs","META","createMetaFields","DATA_FIELDS","createDataFields","EDGE_FIELDS","createEdgeFields","REF_FIELDS","createRefFields","FIELDS","FROM","createRootFromClause","WHERE","SORT","LIMIT","OFFSET","formatId","joinTypes","ids","edgeFields","ef","LINK_FIELDS","rf","errorTransition","ctx","surrealDbQueryMachine","c","awaitQueryMachine","resolve","reject","runSurrealDbQueryMachine","enrichedBql","buildFilter","$nonMappedFilter","$var","mapFilterKeys","$not","rest","matches","isPositiveFilter","notMatches","processPositiveFilter","positiveMatches","isNegated","normalizedKey","subMatches","subFilter","joinedSubMatches","fieldMatches","handleDataFieldFilter","linkMatches","handleLinkFieldFilter","roleMatches","handleRelationRoleFilter","opValue","normalizedOp","match","serializeValue","inAlt","joinAlt","ninMatch","alt","opposite","oppositeIdField","oppVar","playerIdField","playerVar","filterId","filterVar","thingSchema","mapper","newFilter","mapPositiveFilterKeys","filterValue","newKey","separator","buildTQLQuery","$path","$WithIdFilter","sorter","randomId","processDataFields","processLinkFields","processRoleFields","postStrParts","asMetaDataParts","multiVals","postStr","$metaData","multiVal","dotPath","nextDepth","$as","$idNotIncluded","$filterByUnique","$roleVar","withId","withIdFilter","$playedBy","$linkVar","normalizeSorter","sortMatch","attrVar","order","parseTQLQuery","rawBqlRequest","rawTqlRes","rawBql","realParse","schemaValue","parseFields","parsedDataFields","parseDataFields","parsedLinkFields","parseLinkFields","parsedRoleFields","parseRoleFields","keys","dataFieldsKey","multiValKeys","multiValKey","multiValKeyWithout$multiVal","realValue","metaDataKey","dataFieldsThing","$key","parseArrayMetadata","mainDataFields","$asKey","fieldValue","_","roleFieldsRes","$roleFields","$cardinality","as","justId","filterByUnique","parseMetaData","resDataFields","linkFieldsRes","$linkFields","asRegex","justIdRegex","idNotIncludedRegex","filterByUniqueRegex","asMatch","justIdMatch","idNotIncludedMatch","filterByUniqueMatch","converted","jsonString","p1","p2","e","getSessionOrOpenNewOne","singleHandlerV0","runTQLQuery","tqlRequest","options","TypeDBOptions","transaction","err","resArray","parallel","queryString","updateBqlRes","updateTqlReq","updateTqlRes","typeDbQueryMachine","runTypeDbQueryMachine","bql","handles","updateBqlReq","queryMachine","adapters","q","raw","adapter","adapterList","proms","results","orderedResults","index","runQueryMachine","preQueryPathSeparator","grandChildOfCreateSymbol","mutationPreQuery","operatorKeys","getFieldKeys","noDataFields","ops","preQueryReq","processBlock","root","filteredBlock","toRemoveFromRoot","toRemove","extractValueFromFilter","opBlock","newField","preQueryRes","getObjectPath","$objectPath","objectPathToKey","hardId","convertManyPaths","input","prefix","itemsWithBrackets","suffix","cache","newObjPath","cacheKey","cacheArray","fillObjectPaths","bqlWithObjectPaths","fillIds","newBlocks","cacheFound","newBlock","subBlocks","newSubBlocks","bqlFilledIds","newFilled","splitBql","processBlocks","getOperationsWithMultiples","opBlocks","operationWithMultiples","operationWithoutMultiples","otherOps","hasMultiple","ob","getAllKeyCombinations","dataFieldObj","allKeys","combinableKeys","generateCombinations","currentObj","fullObj","newObjInclude","crossReferencedOperations","multipleBlock","combinationsToKeep","combinationBlock","foundKeys","childKey","subBlock","newOps","parentKey","idsOfParent","cKey","originalOp","processReplaces","newOpBlocks","replaceIds","createIds","replaceBlock","cacheIds","unlinkIds","linkIds","processedReplaces","processArrayIdsFound","arrayOfIds","cacheOfIds","isOccupied","filledPaths","stringify","tObject","tree","tField","oppositeThing","preHookDependencies","mutations","transformationPreQueryReq","mutationToQuery","transformationPreQueryRes","setDbNode","FORBIDDEN_ROOT_QUERY_PROP","FORBIDDEN_SUB_QUERY_PROP","fieldMap","getFieldMap","subNodeMap","getNodeMap","subMut","setDbNodeSingle","dataFieldMap","linkFieldMap","roleFieldMap","_mut","getDbNode","newMut","subThing","newNode","isObj","getIdFromDbValue","getDbNodeFromDbValue","map","parseFlexValTypeDB","buildTQLMutation","things","nodeToTypeQL","bzId","defaultDBConnector","thingDbPath","currentDataField","dbField","attributesVar","matchAttributes","idValueTQL","idAttributes","allAttributes","getDeletionMatchInNodes","getInsertionMatchInNodes","edgeToTypeQL","relationDbPath","roleDbPaths","fromRoleFields","roleDbPath","fromRoleFieldsTql","edgeType","relationTql","relationTqlWithoutRoles","getInsertionsInEdges","getInsertionMatchInEdges","getDeletionMatchInEdges","getDeletionsInEdges","toTypeQL","mode","typeQL","preDeletionBatch","insertionMatch","deletionMatch","insertion","deletion","z","y","nodeOperations","arrayNodeOperations","edgeOperations","arrayEdgeOperations","allOperations","parseTQLMutation","tqlRes","reqThings","reqEdges","expected","exp","dbIdd","matchedThings","runTQLMutation","tqlMutation","mutateTransaction","tqlDeletion","tqlInsertion","insertionsStream","insertionsRes","updateTQLMutation","updateTQLRes","typeDbMutationMachine","awaitMutationMachine","runTypeDbMutationMachine","bqRaw","buildSURQLMutation","flat","buildThings","$tempId","sanitizedThings","restString","metaString","dataFieldStrings","VAR","COND","table","TARGET","parentRef","SET","OUTPUT","DELETE_OUTPUT","buildEdges","asArrayOfVars","arrayString","nodesString","roleFieldsString","buildArcs","roleA","roleB","thingsA","thingsB","isMany1","isMany2","buildReferences","usedRefFields","refFieldSchema","refFieldsString","runSURQLMutation","batchedMutation","filteredErrorRes","parseSURQLMutation","nulledAtts","withMetaAndId","updateSURQLMutation","updateSURQLRes","surrealDbMutationMachine","runSurrealDbMutationMachine","bqlRaw","bqlFlat","flattenBQLMutation","parentObj","operationMap","edgeMeta","isSymbol","opTypes","filteredEdges","ulf","arc","urf","children","childMeta","filteredChildren","orderedEdges","final","updateThingsEdges","updateBQLFlat","updateBQLRes","enrich","preQuery","preQueryDependencies","parseBQL","flattenBQL","requiresPreQuery","dbConnectors","provider","requiresPreHookDependencies","awaitMachine","runMutationMachine","mutation","SimpleSurrealClient","params","cb","db","Surreal","enableMapSet","BormClient","dbc","clientErr","TypeDB","message","sessionErr","credential","TypeDBCredential","enrichedSchema","#enforceConnection","queryConfig","qConfig","isBatched","errorRes","mutationConfig","mConfig","src_default"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { BormConfig } from './types';\n\nexport const defaultConfig: Partial<BormConfig> = {\n\tquery: {\n\t\tnoMetadata: false,\n\t\tsimplifiedLinks: true,\n\t\tdebugger: false,\n\t\treturnNulls: false,\n\t},\n\n\tmutation: {\n\t\tnoMetadata: false,\n\t\tpreQuery: true,\n\t\tignoreNonexistingThings: false,\n\t},\n};\n","import { SessionType, TransactionType } from 'typedb-driver';\nimport type { BormConfig, DBHandles, EnrichedBormSchema } from '../../../types';\n\ntype Attribute = {\n\tdbPath: string;\n\tcontentType: string;\n};\n\nconst removeDuplicateObjects = (arr: Attribute[]) => {\n\tconst uniqueObjects: Attribute[] = [];\n\n\tconst uniqueMap = new Map();\n\n\tarr.forEach((obj) => {\n\t\tconst { dbPath, contentType } = obj;\n\t\tconst key = `${dbPath}-${contentType}`;\n\n\t\tif (!uniqueMap.has(key)) {\n\t\t\tuniqueMap.set(key, true);\n\t\t\tuniqueObjects.push(obj);\n\t\t}\n\t});\n\n\treturn uniqueObjects;\n};\n\nexport const convertTQLSchema = (connectorId = 'default', schema: EnrichedBormSchema) => {\n\tlet output = '';\n\tconst usedAttributes: Attribute[] = [];\n\n\toutput += '\\n';\n\n\t// CONVERTING ENTITIES\n\n\tObject.keys(schema.entities)\n\t\t.filter((eName) => schema.entities[eName].defaultDBConnector.id === connectorId)\n\t\t.forEach((entityName) => {\n\t\t\tconst entity = schema.entities[entityName];\n\t\t\tconst { dataFields, linkFields, name } = entity;\n\t\t\t// Checks to see if parent already contains these fields\n\n\t\t\toutput += `${name} sub ${'extends' in entity ? entity.extends : 'entity'},\\n`;\n\n\t\t\t// Adding data fields\n\t\t\tif (dataFields && dataFields.length > 0) {\n\t\t\t\tdataFields.forEach((field: any) => {\n\t\t\t\t\tif (field.contentType === 'REF') {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t} //ignore ref types\n\t\t\t\t\tif (field.inherited) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (field.isIdField) {\n\t\t\t\t\t\toutput += `\\towns ${field.dbPath} @key,\\n`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\toutput += `\\towns ${field.dbPath},\\n`;\n\t\t\t\t\t}\n\t\t\t\t\tusedAttributes.push({ dbPath: field.dbPath, contentType: field.contentType });\n\t\t\t\t});\n\t\t\t}\n\t\t\t// Adding link fields\n\t\t\tif (linkFields && linkFields.length > 0) {\n\t\t\t\tconst usedLinkFields: string[] = [];\n\t\t\t\tlinkFields.forEach((linkField) => {\n\t\t\t\t\tconst { relation, plays, inherited } = linkField;\n\t\t\t\t\tif (inherited) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\t//check if the role in the relation is inherited\n\t\t\t\t\tconst isInheritedRole = schema.relations[relation].roles[plays].inherited;\n\t\t\t\t\tif (!isInheritedRole && !usedLinkFields.includes(`${relation}:${plays}`)) {\n\t\t\t\t\t\toutput += `\\tplays ${relation}:${plays},\\n`;\n\t\t\t\t\t\tusedLinkFields.push(`${relation}:${plays}`);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\toutput = output.replace(/,\\s*$/, ';\\n');\n\t\t\toutput += '\\n';\n\t\t});\n\n\t// CONVERTING RELATIONS\n\tObject.keys(schema.relations)\n\t\t.filter((rName) => schema.relations[rName].defaultDBConnector.id === connectorId)\n\t\t.forEach((relationName) => {\n\t\t\tconst relation = schema.relations[relationName];\n\t\t\t// TODO: fix name ts error\n\t\t\tconst { dataFields, roles, name, linkFields } = relation;\n\t\t\t// Checks to see if parent already contains these fields\n\n\t\t\toutput += `${name} sub ${'extends' in relation ? relation.extends : 'relation'},\\n`;\n\t\t\t// Removes ids from data fields, so their attributes aren't repeated\n\n\t\t\t// Adding data fields\n\t\t\tif (dataFields && dataFields.length > 0) {\n\t\t\t\tdataFields.forEach((field: any) => {\n\t\t\t\t\tif (!field.inherited) {\n\t\t\t\t\t\tif (field.isIdField) {\n\t\t\t\t\t\t\toutput += `\\towns ${field.dbPath} @key,\\n`;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\toutput += `\\towns ${field.dbPath},\\n`;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tusedAttributes.push({ dbPath: field.dbPath, contentType: field.contentType });\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\t// Adding role fields\n\t\t\tif (roles) {\n\t\t\t\tObject.keys(roles).forEach((roleName) => {\n\t\t\t\t\tif (!roles[roleName].inherited) {\n\t\t\t\t\t\toutput += `\\trelates ${roleName},\\n`;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\t// Adding link fields\n\t\t\tif (linkFields && linkFields.length > 0) {\n\t\t\t\tconst usedLinkFields: string[] = [];\n\t\t\t\tlinkFields.forEach((linkField) => {\n\t\t\t\t\tconst { plays, relation } = linkField;\n\t\t\t\t\tconst isInheritedRole = schema.relations[relation].roles[plays].inherited;\n\t\t\t\t\tif (!isInheritedRole && !linkField.inherited && !usedLinkFields.includes(`${relation}:${plays}`)) {\n\t\t\t\t\t\toutput += `\\tplays ${linkField.relation}:${plays},\\n`;\n\t\t\t\t\t\tusedLinkFields.push(`${relation}:${plays}`);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\toutput = output.replace(/,\\s*$/, ';\\n');\n\t\t\toutput += '\\n';\n\t\t});\n\n\t// DEFINING ATTRIBUTES\n\n\tlet attributes = 'define\\n\\n';\n\tconst newUsedAttributes = removeDuplicateObjects(usedAttributes);\n\n\tnewUsedAttributes.forEach((attribute: Attribute) => {\n\t\t// All conditions for BORM to TQL attribute types\n\t\tif (attribute.contentType === 'TEXT' || attribute.contentType === 'ID' || attribute.contentType === 'JSON') {\n\t\t\tattributes += `${attribute.dbPath} sub attribute, value string;\\n`;\n\t\t} else if (attribute.contentType === 'EMAIL') {\n\t\t\tattributes += `${attribute.dbPath} sub attribute, value string,\\n`;\n\t\t\tattributes +=\n\t\t\t\t\"\\tregex '^(?=.{1,64}@)[A-Za-z0-9_-]+(\\\\\\\\.[A-Za-z0-9_-]+)*@[^-][A-Za-z0-9-]+(\\\\\\\\.[A-Za-z0-9-]+)*(\\\\\\\\.[A-Za-z]{2,})$';\\n\";\n\t\t} else if (attribute.contentType === 'DATE') {\n\t\t\tattributes += `${attribute.dbPath} sub attribute, value datetime;\\n`;\n\t\t} else if (attribute.contentType === 'BOOLEAN') {\n\t\t\tattributes += `${attribute.dbPath} sub attribute, value boolean;\\n`;\n\t\t} else if (attribute.contentType === 'NUMBER') {\n\t\t\tattributes += `${attribute.dbPath} sub attribute, value long;\\n`;\n\t\t} else if (attribute.contentType === 'FLEX') {\n\t\t\tattributes += `${attribute.dbPath} sub flexAttribute;\\n`;\n\t\t} else if (attribute.contentType === 'REF') {\n\t\t\treturn; //not compatible with typeDB\n\t\t} else {\n\t\t\tthrow new Error(\n\t\t\t\t`Conversion of borm schema to TypeDB schema for data type \"${attribute.contentType}\" is not implemented`,\n\t\t\t);\n\t\t}\n\t});\n\n\tconst utils = `#Tools, reserved for every schema using borm\n\nstringAttribute sub attribute, value string;\nlongAttribute sub attribute, value long;\ndoubleAttribute sub attribute, value double;\nbooleanAttribute sub attribute, value boolean;\ndatetimeAttribute sub attribute, value datetime;\nflexAttribute sub attribute, abstract, value string,\n\towns stringAttribute,\n\towns longAttribute,\n\towns doubleAttribute,\n\towns booleanAttribute,\n\towns datetimeAttribute;\n`;\n\n\treturn `${attributes}\\n\\n${output}\\n${utils}`;\n};\n\nexport const defineTQLSchema = async (\n\tconnectorId: string,\n\tconfig: BormConfig,\n\tschema: EnrichedBormSchema,\n\tdbHandles: DBHandles,\n) => {\n\tif (!dbHandles.typeDB) {\n\t\tthrow new Error('No TypeDB handles found');\n\t}\n\tconst typeDBString = convertTQLSchema(connectorId, schema);\n\tconst session = dbHandles.typeDB.get(connectorId)?.session;\n\tconst client = dbHandles.typeDB.get(connectorId)?.client;\n\tif (!session) {\n\t\tconsole.log('Session Status: ', 'NO SESSION');\n\t\treturn;\n\t}\n\n\tif (!client) {\n\t\tthrow new Error('No TypeDB client found');\n\t}\n\n\tawait session.close();\n\tconst [{ dbName }] = config.dbConnectors;\n\tconst db = await client.databases.get(dbName);\n\tawait db.delete();\n\tawait client.databases.create(dbName);\n\n\tconst schemaSession = await client.session(config.dbConnectors[0].dbName, SessionType.SCHEMA);\n\t//const dataSession = await client.session(config.dbConnectors[0].dbName, SessionType.DATA);\n\n\t// 3. Defining new schema\n\n\tconst schemaTransaction = await schemaSession.transaction(TransactionType.WRITE);\n\n\tawait schemaTransaction.query.define(typeDBString);\n\tawait schemaTransaction.commit();\n\tawait schemaTransaction.close();\n\n\t/*const getSchemaTransaction = await dataSession.transaction(TransactionType.READ);\n\tconst getSchemaQuery = 'match $a sub thing; get $a;';\n\tconst getSchemaStream = await getSchemaTransaction.query.fetch(getSchemaQuery);\n\tconst schemaThings = await getSchemaStream.collect();\n\tconsole.log('schemaThings', schemaThings);\n\t*/\n\treturn typeDBString;\n\t//await getSchemaTransaction.close();\n};\n","export const sanitizeTableNameSurrealDb = (tableName: string) => {\n\treturn tableName.replace(/`/g, '');\n};\n\nconst specialChars = [\n\t' ',\n\t'-',\n\t'+',\n\t'*',\n\t'/',\n\t'=',\n\t'!',\n\t'@',\n\t'#',\n\t'$',\n\t'%',\n\t'^',\n\t'&',\n\t'(',\n\t')',\n\t'[',\n\t']',\n\t'{',\n\t'}',\n\t'|',\n\t'\\\\',\n\t';',\n\t':',\n\t\"'\",\n\t'\"',\n\t',',\n\t'<',\n\t'>',\n\t'.',\n\t'?',\n\t'~',\n\t'`',\n];\n\nexport const sanitizeNameSurrealDB = (value: string) => {\n\t//if tableName includes any of the chars of this array, then wrap it in backticks\n\n\tif (specialChars.some((char) => value.includes(char))) {\n\t\treturn `⟨${value}⟩`;\n\t}\n\treturn value;\n};\n","import { isDate, isArray } from 'radash';\nimport { parseFlexValSurrealDB } from './parseFlexVal';\nimport dayjs from 'dayjs';\n\nexport const surrealDBtypeMap: Record<string, string> = {\n\tTEXT: 'string',\n\tRICH_TEXT: 'string',\n\tLANGUAGE_TEXT: 'string',\n\tPASSWORD: 'string',\n\tURL: 'string',\n\tPHONE: 'string',\n\tID: 'string',\n\tEMAIL: 'string',\n\tNUMBER: 'number',\n\tNUMBER_DECIMAL: 'decimal',\n\tBOOLEAN: 'bool',\n\tDATE: 'datetime',\n\tJSON: 'object',\n\tFLEX: 'bool|bytes|datetime|duration|geometry|number|object|string',\n};\n\nexport const parseValueSurrealDB = (value: unknown, ct?: string): any => {\n\tif (value === null) {\n\t\treturn 'NONE';\n\t}\n\tif (ct) {\n\t\tswitch (ct) {\n\t\t\tcase 'TEXT':\n\t\t\tcase 'RICH_TEXT':\n\t\t\tcase 'LANGUAGE_TEXT':\n\t\t\tcase 'PASSWORD':\n\t\t\tcase 'URL':\n\t\t\tcase 'PHONE':\n\t\t\tcase 'ID':\n\t\t\tcase 'EMAIL':\n\t\t\t\tif (typeof value !== 'string') {\n\t\t\t\t\tthrow new Error(`Invalid value for TEXT type: ${value}`);\n\t\t\t\t}\n\t\t\t\treturn JSON.stringify(value);\n\t\t\tcase 'NUMBER':\n\t\t\tcase 'NUMBER_DECIMAL':\n\t\t\tcase 'BOOLEAN':\n\t\t\tcase 'JSON':\n\t\t\t\treturn value;\n\t\t\tcase 'DATE':\n\t\t\t\tif (typeof value === 'string' && dayjs(value, 'YYYY-MM-DDTHH:mm:ssZ', true).isValid()) {\n\t\t\t\t\treturn `<datetime>\"${value}\"`;\n\t\t\t\t}\n\t\t\t\tif (isDate(value)) {\n\t\t\t\t\treturn `d\"${value.toISOString()}\"`;\n\t\t\t\t}\n\t\t\t\treturn `$<datetime>\"${value}\"`; //let surrealDB try to do the conversion\n\t\t\tcase 'FLEX': {\n\t\t\t\t//dates are potentially defined as strings in flex-values\n\t\t\t\tif (typeof value === 'string' && dayjs(value, 'YYYY-MM-DDTHH:mm:ssZ', true).isValid()) {\n\t\t\t\t\treturn `<datetime>\"${value}\"`;\n\t\t\t\t}\n\t\t\t\t// array elements go throw the parsing\n\t\t\t\tconst parsedVal = isArray(value) ? value.map((v) => parseFlexValSurrealDB(v)) : parseFlexValSurrealDB(value);\n\t\t\t\treturn `${isArray(parsedVal) ? parsedVal.map((v) => v) : parsedVal}`;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`Unsupported data field type ${ct}.`);\n\t\t}\n\t}\n\tthrow new Error(`Failed parsing value ${value} with content type ${ct}`);\n};\n","import { isDate } from 'radash';\n\nexport const parseFlexValSurrealDB = (v: unknown) => {\n\tif (isDate(v)) {\n\t\treturn `d\"${v.toISOString()}\"`;\n\t}\n\tif (typeof v === 'string') {\n\t\treturn `'${v}'`;\n\t}\n\tif (['number', 'boolean'].includes(typeof v)) {\n\t\treturn v;\n\t}\n\tthrow new Error(`Unsupported type ${typeof v}`);\n};\n","import type {\n\tEnrichedBormEntity,\n\tEnrichedBormRelation,\n\tEnrichedBormSchema,\n\tEnrichedDataField,\n\tEnrichedLinkField,\n\tEnrichedRoleField,\n\tValidations,\n} from '../../../types';\nimport { sanitizeNameSurrealDB } from '../helpers';\nimport { parseValueSurrealDB, surrealDBtypeMap } from '../parsing/values';\n\nconst INDENTATION = '\\t' as const;\nconst indent = (n: number): string => INDENTATION.repeat(n);\n\nconst indentPar = (str: string, level: number): string =>\n\tstr\n\t\t.split('\\n')\n\t\t.map((line) => (line.trim() ? `${indent(level)}${line}` : line))\n\t\t.join('\\n');\n\ntype SchemaItem = EnrichedBormEntity | EnrichedBormRelation;\n\nconst convertBQLToSurQL = (schema: EnrichedBormSchema): string => {\n\tconst header = `USE NS test;\nUSE DB test;\n\nBEGIN TRANSACTION;\n`;\n\n\tconst entities = `-- ENTITIES\\n${convertSchemaItems(schema.entities)}`;\n\tconst relations = `\\n-- RELATIONS\\n${convertSchemaItems(schema.relations)}`;\n\tconst utilityFunctions = addUtilityFunctions();\n\n\treturn `${header}${entities}${relations}${utilityFunctions}COMMIT TRANSACTION;`;\n};\n\nconst convertSchemaItems = (items: Record<string, SchemaItem>): string =>\n\tObject.entries(items)\n\t\t.map(([name, item]) => convertSchemaItem(sanitizeNameSurrealDB(name), item, 1))\n\t\t.join('\\n\\n');\n\nconst convertSchemaItem = (name: string, item: SchemaItem, level: number): string => {\n\tconst baseDefinition = `${indent(level)}DEFINE TABLE ${name} SCHEMAFULL PERMISSIONS FULL;${'extends' in item && item.extends ? ` //EXTENDS ${item.extends};` : ''}`;\n\tconst dataFields = indentPar(`-- DATA FIELDS\\n${convertDataFields(item.dataFields ?? [], name, level)}`, level + 1);\n\tconst linkFields = indentPar(`\\n-- LINK FIELDS\\n${convertLinkFields(item.linkFields ?? [], name, level)}`, level + 1);\n\tconst roles = 'roles' in item ? indentPar(`\\n-- ROLES\\n${convertRoles(item.roles, name, level)}`, level + 1) : '';\n\n\treturn `${baseDefinition}\\n${dataFields}${linkFields}${roles}`;\n};\n\nconst convertDataFields = (dataFields: EnrichedDataField[], parentName: string, level: number): string =>\n\tdataFields\n\t\t.map((field) => {\n\t\t\tif (field.path === 'id') {\n\t\t\t\treturn ''; //skip id fields for now, we will migrate it to a different name later like _id\n\t\t\t}\n\t\t\tconst fieldType = mapContentTypeToSurQL(field.contentType, field.validations);\n\t\t\tconst baseDefinition = `${indent(level)}DEFINE FIELD ${field.path} ON TABLE ${parentName}${['FLEX', 'JSON'].includes(field.contentType) ? ' FLEXIBLE' : ''}`; //TTODO: Better type json\n\n\t\t\tif (field.isVirtual) {\n\t\t\t\tconst dbValue = field.dbValue?.surrealDB;\n\t\t\t\tif (!dbValue) {\n\t\t\t\t\treturn ''; //it means is computed in BORM instead\n\t\t\t\t}\n\t\t\t\treturn `${baseDefinition} VALUE ${dbValue};`;\n\t\t\t}\n\t\t\treturn `${baseDefinition} TYPE ${fieldType};`;\n\t\t})\n\t\t.filter(Boolean)\n\t\t.join('\\n');\n\nconst convertLinkFields = (linkFields: EnrichedLinkField[], parentName: string, level: number): string =>\n\tlinkFields\n\t\t.map((linkField) => {\n\t\t\tconst fieldType =\n\t\t\t\t//linkField.cardinality === 'MANY' ? `array<record<${linkField.relation}>>` : `record<${linkField.relation}>`; //todo: uncomment once surrealDB has smart transactions\n\t\t\t\tlinkField.cardinality === 'MANY'\n\t\t\t\t\t? `option<array<record<${linkField.$things.map(sanitizeNameSurrealDB).join('|')}>>>`\n\t\t\t\t\t: `option<record<${linkField.$things.map(sanitizeNameSurrealDB).join('|')}>>`;\n\n\t\t\tconst baseDefinition = `${indent(level)}DEFINE FIELD ${sanitizeNameSurrealDB(linkField.path)} ON TABLE ${parentName}`;\n\n\t\t\tif (linkField.isVirtual) {\n\t\t\t\tconst dbValue = linkField.dbValue?.surrealDB;\n\t\t\t\tif (!dbValue) {\n\t\t\t\t\treturn ''; //it means is computed in BORM instead\n\t\t\t\t}\n\n\t\t\t\treturn `${baseDefinition} VALUE ${dbValue};`;\n\t\t\t}\n\n\t\t\tif (linkField.target === 'role') {\n\t\t\t\tconst relationLinkField = linkFields.find(\n\t\t\t\t\t(lf) => lf.target === 'relation' && lf.relation === linkField.relation,\n\t\t\t\t);\n\t\t\t\tconst targetRole = linkField.oppositeLinkFieldsPlayedBy?.[0];\n\t\t\t\tconst targetPath = targetRole.plays;\n\n\t\t\t\tif (!targetPath || linkField.oppositeLinkFieldsPlayedBy?.length !== 1) {\n\t\t\t\t\tthrow new Error(`Invalid link field: ${linkField.path}`);\n\t\t\t\t}\n\n\t\t\t\tconst type =\n\t\t\t\t\tlinkField.cardinality === 'ONE'\n\t\t\t\t\t\t? `record<${sanitizeNameSurrealDB(linkField.relation)}>`\n\t\t\t\t\t\t: `array<record<${sanitizeNameSurrealDB(linkField.relation)}>>`;\n\n\t\t\t\tconst pathToRelation = sanitizeNameSurrealDB(linkField.pathToRelation || '');\n\t\t\t\tconst relationPath = `${pathToRelation}.${targetPath}`;\n\n\t\t\t\tconst baseField =\n\t\t\t\t\tlinkField.cardinality === 'ONE'\n\t\t\t\t\t\t? `${baseDefinition} VALUE <future> {RETURN SELECT VALUE ${relationPath} FROM ONLY $this};`\n\t\t\t\t\t\t: `${baseDefinition} VALUE <future> {array::distinct(SELECT VALUE array::flatten(${relationPath} || []) FROM ONLY $this)};`;\n\t\t\t\tconst supportField = relationLinkField?.path\n\t\t\t\t\t? ''\n\t\t\t\t\t: `${indent(level + 1)}DEFINE FIELD ${pathToRelation} ON TABLE ${parentName} TYPE option<${type}>;`;\n\n\t\t\t\treturn [baseField, supportField].join('\\n');\n\t\t\t}\n\t\t\tif (linkField.target === 'relation') {\n\t\t\t\tconst fieldDefinition = `${indent(level)}DEFINE FIELD ${sanitizeNameSurrealDB(linkField.path)} ON TABLE ${parentName} TYPE ${fieldType};`;\n\t\t\t\treturn `${fieldDefinition}`;\n\t\t\t}\n\t\t\tthrow new Error(`Invalid link field: ${JSON.stringify(linkField)}`);\n\t\t})\n\t\t.join('\\n');\n\nconst convertRoles = (roles: Record<string, EnrichedRoleField>, parentName: string, level: number): string =>\n\tObject.entries(roles)\n\t\t.map(([roleName, role]) => {\n\t\t\tconst fieldType =\n\t\t\t\trole.cardinality === 'MANY'\n\t\t\t\t\t? `array<record<${role.$things.map(sanitizeNameSurrealDB).join('|')}>>`\n\t\t\t\t\t: `record<${role.$things.map(sanitizeNameSurrealDB).join('|')}>`;\n\t\t\tconst fieldDefinition = `${indent(level)}DEFINE FIELD ${roleName} ON TABLE ${parentName} TYPE option<${fieldType}>;`; //Todo: remove option when surrealDB transactions are smarter.\n\t\t\tconst roleEvent = generateRoleEvent(roleName, parentName, role, level);\n\t\t\treturn `${fieldDefinition}\\n${roleEvent}`;\n\t\t})\n\t\t.join('\\n');\n\nconst generateRoleEvent = (roleName: string, parentName: string, role: EnrichedRoleField, level: number): string => {\n\tconst eventName = `update_${roleName}`;\n\n\tconst targetRelationLinkField = role.playedBy?.find((lf) => lf.target === 'relation');\n\tconst targetRelationPath = targetRelationLinkField?.pathToRelation;\n\tconst firstTargetRoleLinkField = role.playedBy?.find((lf) => lf.target === 'role');\n\tconst firstTargetRolePath = firstTargetRoleLinkField?.pathToRelation;\n\n\tconst usedLinkField = targetRelationLinkField ?? firstTargetRoleLinkField;\n\n\tif (!usedLinkField) {\n\t\tthrow new Error(`Invalid link field: ${JSON.stringify(role)}`);\n\t}\n\n\tconst pathToRelation = sanitizeNameSurrealDB((targetRelationPath ?? firstTargetRolePath) as string);\n\n\tconst generateSet = (fields: { path: string; cardinality: 'ONE' | 'MANY' }[], action: 'remove' | 'add'): string => {\n\t\treturn fields\n\t\t\t.map(({ path, cardinality }) => {\n\t\t\t\tconst operator =\n\t\t\t\t\taction === 'remove' ? (cardinality === 'ONE' ? '=' : '-=') : cardinality === 'ONE' ? '=' : '+=';\n\t\t\t\tconst value = action === 'remove' ? (cardinality === 'ONE' ? 'NONE' : '$before.id') : '$after.id';\n\t\t\t\treturn `${path} ${operator} ${value}`;\n\t\t\t})\n\t\t\t.join(', ');\n\t};\n\n\tconst impactedLinkFields =\n\t\trole.impactedLinkFields?.map((lf) => ({\n\t\t\tpath: lf.path,\n\t\t\tcardinality: lf.cardinality,\n\t\t})) || [];\n\n\tconst directField = { path: pathToRelation, cardinality: usedLinkField.cardinality };\n\tconst allFields = [directField, ...impactedLinkFields];\n\n\tconst removalsSet = generateSet(allFields, 'remove');\n\tconst additionsSet = generateSet(allFields, 'add');\n\n\tconst cardOneEvents = `\n\tIF ($before.${roleName}) THEN {UPDATE $before.${roleName} SET ${removalsSet}} END;\n\tIF ($after.${roleName}) THEN {UPDATE $after.${roleName} SET ${additionsSet}} END;`;\n\n\tconst cardManyEvents = `\n\tLET $edges = fn::get_mutated_edges($before.${roleName}, $after.${roleName});\n\tFOR $unlink IN $edges.deletions {UPDATE $unlink SET ${removalsSet};};\n\tFOR $link IN $edges.additions {${\n\t\tusedLinkField.cardinality === 'ONE'\n\t\t\t? `\n\t\tIF ($link.${pathToRelation}) THEN {UPDATE $link.${pathToRelation} SET ${roleName} ${role.cardinality === 'ONE' ? '= NONE' : '-= $link.id'}} END;` //! This should probably be an independnt event on card one field, that it replaces old one by new one, instead of doing it from here\n\t\t\t: ''\n\t}\n\t\tUPDATE $link SET ${additionsSet};\n\t};`;\n\n\treturn indentPar(\n\t\t`DEFINE EVENT ${eventName} ON TABLE ${parentName} WHEN $before.${roleName} != $after.${roleName} THEN {${role.cardinality === 'ONE' ? cardOneEvents : cardManyEvents}\n};`,\n\t\tlevel + 1,\n\t);\n};\n\nconst mapContentTypeToSurQL = (contentType: string, validations?: Validations): string => {\n\tconst type = validations?.enum\n\t\t? `${validations.enum.map((value: unknown) => parseValueSurrealDB(value, contentType)).join('|')}`\n\t\t: surrealDBtypeMap[contentType];\n\tif (!type) {\n\t\tthrow new Error(`Unknown content type: ${contentType}`);\n\t}\n\n\tif (validations?.required) {\n\t\treturn `${type}`;\n\t}\n\treturn `option<${type}>`;\n};\n\nconst addUtilityFunctions = (): string => `\n-- BORM TOOLS\n\tDEFINE FUNCTION fn::get_mutated_edges(\n\t\t$before_relation: option<array|record>,\n\t\t$after_relation: option<array|record>,\n\t) {\n\t\tLET $notEmptyCurrent = $before_relation ?? [];\n\t\tLET $current = array::flatten([$notEmptyCurrent]);\n\t\tLET $notEmptyResult = $after_relation ?? [];\n\t\tLET $result = array::flatten([$notEmptyResult]);\n\t\tLET $links = array::complement($result, $current);\n\t\tLET $unlinks = array::complement($current, $result);\n\t\t\n\t\tRETURN {\n\t\t\tadditions: $links,\n\t\t\tdeletions: $unlinks\n\t\t};\n\t};\n\n\tDEFINE FUNCTION fn::as_array($var: option<array<record>|record>) { \n\t\tRETURN (type::is::array($var) AND $var) OR [$var]\n\t};\n`;\n\nexport const defineSURQLSchema = (schema: EnrichedBormSchema): string => convertBQLToSurQL(schema);\n","import type { BormConfig, DBHandles, EnrichedBormSchema } from '../types';\nimport { defineTQLSchema } from '../adapters/typeDB/schema/define';\nimport { defineSURQLSchema } from '../adapters/surrealDB/schema/define';\n\nexport const bormDefine = async (config: BormConfig, schema: EnrichedBormSchema, dbHandles: DBHandles) => {\n\tconst schemas = async () => {\n\t\tconst typeDBEntries = await Promise.all(\n\t\t\t[...(dbHandles.typeDB || [])].map(async ([key]) => [key, await defineTQLSchema(key, config, schema, dbHandles)]),\n\t\t);\n\n\t\tconst typeDBEntriesFixed = typeDBEntries.map((entry) => [entry[0], entry[1]] as const);\n\n\t\tconst surrealDBEntries = await Promise.all(\n\t\t\t[...(dbHandles.surrealDB || [])].map(async ([key]) => [key, defineSURQLSchema(schema)]),\n\t\t);\n\n\t\tconst surrealDBEntriesFixed = surrealDBEntries.map((entry) => [entry[0], entry[1]] as const);\n\t\treturn {\n\t\t\ttypeDB: Object.fromEntries(typeDBEntriesFixed),\n\t\t\tsurrealDB: Object.fromEntries(surrealDBEntriesFixed),\n\t\t};\n\t};\n\treturn await schemas();\n\n\t// TYPE DB TRANSACTIONS\n\n\t// 4. Closing sessions\n};\n","/* eslint-disable no-param-reassign */\nimport type { Draft } from 'immer';\nimport { produce, isDraft, current } from 'immer';\nimport type { TraversalCallbackContext, TraversalMeta } from 'object-traversal';\nimport { getNodeByPath, traverse } from 'object-traversal';\nimport { isArray, isObject, listify, mapEntries, tryit } from 'radash';\nimport { SharedMetadata, SuqlMetadata } from './types/symbols';\nimport { customAlphabet } from 'nanoid';\n\n// todo: split helpers between common helpers, typeDBhelpers, dgraphelpers...\nimport type {\n\tBormSchema,\n\tBormRelation,\n\tBQLMutationBlock,\n\tEnrichedBormEntity,\n\tEnrichedBormRelation,\n\tEnrichedBormSchema,\n\tLinkedFieldWithThing,\n\tRawBQLQuery,\n\tDataField,\n\tBormEntity,\n\tFilledBQLMutationBlock,\n\tDBHandles,\n\tDBHandleKey,\n\tThingType,\n\tPositiveFilter,\n\tEnrichedDataField,\n\tEnrichedLinkField,\n\tEnrichedRoleField,\n\tLinkField,\n\tRefField,\n\tEnrichedRefField,\n} from './types';\nimport type { AdapterContext } from './adapters';\nimport { adapterContext } from './adapters';\nimport { getSurrealLinkFieldQueryPath } from './adapters/surrealDB/enrichSchema/helpers';\n\nconst getDbPath = (thing: string, attribute: string, shared?: boolean) =>\n\tshared ? attribute : `${thing}·${attribute}`;\n\nexport const getPath = (dbPath: string) => {\n\tconst parts = dbPath.split('·');\n\treturn parts[parts.length - 1];\n};\n\nexport const oFind = <RemovedKeys extends string, T extends Record<string | number | symbol, any>>(\n\tobj: T,\n\tfn: (k: string | number | symbol, v: any) => boolean,\n): Omit<T, RemovedKeys>[Exclude<keyof T, RemovedKeys>] =>\n\tObject.values(Object.fromEntries(Object.entries(obj).filter(([k, v]) => fn(k, v))))[0];\n\nexport const oFilter = <K extends string | number | symbol, T extends Record<K, any>>(\n\tobj: T,\n\tfn: (k: K, v: any) => boolean,\n): Partial<T> => {\n\tconst entries = Reflect.ownKeys(obj).map((key) => [key, obj[key as keyof T]]);\n\treturn Object.fromEntries(\n\t\tentries.filter(([k, v]) => {\n\t\t\tconst [error, result] = tryit(() => fn(k as K, v))();\n\t\t\treturn error ? false : result;\n\t\t}),\n\t) as Partial<T>;\n};\nexport const enrichSchema = (schema: BormSchema, dbHandles: DBHandles): EnrichedBormSchema => {\n\tconst allLinkedFields: LinkedFieldWithThing[] = [];\n\t// #region 1)\n\n\tconst withExtensionsSchema = produce(schema, (draft) =>\n\t\ttraverse(\n\t\t\tdraft,\n\t\t\t({ key, value, meta }: TraversalCallbackContext) => {\n\t\t\t\tif (meta.depth !== 2) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst val = value as BormEntity | BormRelation;\n\n\t\t\t\tif (key) {\n\t\t\t\t\t//* DATA_FIELDS: Adding default values and metadata to every dataField\n\t\t\t\t\tval.dataFields = val.dataFields?.map((df: DataField | EnrichedDataField) => ({\n\t\t\t\t\t\t...df,\n\t\t\t\t\t\t...(val.idFields?.includes(df.path) ? { isIdField: true } : { isIdField: false }),\n\t\t\t\t\t\tcardinality: df.cardinality || 'ONE',\n\t\t\t\t\t\t//todo: Make this user defined and remove the prefix by default\n\t\t\t\t\t\tdbPath: 'dbPath' in df ? df.dbPath : getDbPath(key, df.path, df.shared), //if it was already defined in a parent, we keep it\n\t\t\t\t\t\t[SharedMetadata]: {\n\t\t\t\t\t\t\tfieldType: 'dataField',\n\t\t\t\t\t\t},\n\t\t\t\t\t})) as EnrichedDataField[];\n\n\t\t\t\t\t//* REFERENCE_FIELDS: Adding default values and metadata to every refField\n\t\t\t\t\tval.refFields = mapEntries(val.refFields || {}, (refFieldKey, refField) => {\n\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\trefFieldKey,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t...refField,\n\t\t\t\t\t\t\t\tcardinality: refField.cardinality || 'ONE',\n\t\t\t\t\t\t\t\tpath: refFieldKey,\n\t\t\t\t\t\t\t\t[SharedMetadata]: {\n\t\t\t\t\t\t\t\t\tfieldType: 'refField',\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t];\n\t\t\t\t\t});\n\n\t\t\t\t\t//* LINK_FIELDS: Adding default values and metadata to every linkField\n\t\t\t\t\tval.linkFields = val.linkFields?.map((lf: LinkField | EnrichedLinkField) => ({\n\t\t\t\t\t\t...lf,\n\t\t\t\t\t\t[SharedMetadata]: {\n\t\t\t\t\t\t\tfieldType: 'linkField',\n\t\t\t\t\t\t},\n\t\t\t\t\t}));\n\n\t\t\t\t\t//* ROLE_FIELDS: Adding default values and metadata to every roleField\n\t\t\t\t\tif ('roles' in val) {\n\t\t\t\t\t\tval.roles = mapEntries(val.roles || {}, (roleKey, role) => {\n\t\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\t\troleKey,\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t...role,\n\t\t\t\t\t\t\t\t\tcardinality: role.cardinality || 'ONE',\n\t\t\t\t\t\t\t\t\t[SharedMetadata]: {\n\t\t\t\t\t\t\t\t\t\tfieldType: 'roleField',\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t];\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (value.extends) {\n\t\t\t\t\tif (!value.defaultDBConnector.as) {\n\t\t\t\t\t\t//todo: Check if we can add the \"as\" as default. When the path of the parent === name of the parent then it's fine. As would be used for those cases where they are not equal (same as path, which is needed only if different names)\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`[Schema] ${key} is extending a thing but missing the \"as\" property in its defaultDBConnector. Path:${meta.nodePath}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\t/// IMPORT THE EXTENDED SCHEMA\n\t\t\t\t\tconst extendedSchema = (draft.entities[value.extends] || draft.relations[value.extends]) as\n\t\t\t\t\t\t| EnrichedBormRelation\n\t\t\t\t\t\t| EnrichedBormEntity;\n\n\t\t\t\t\t/// find out all the thingTypes this thingType is extending\n\t\t\t\t\tconst allExtends = [value.extends, ...(extendedSchema.allExtends || [])];\n\t\t\t\t\tvalue.allExtends = allExtends;\n\t\t\t\t\tvalue as BormEntity | BormRelation;\n\n\t\t\t\t\tallExtends.forEach((ext) => {\n\t\t\t\t\t\tif (draft.entities[ext]) {\n\t\t\t\t\t\t\t//@ts-expect-error : it's normal is just a draft\n\t\t\t\t\t\t\tdraft.entities[ext].subTypes = [key, ...(draft.entities[ext].subTypes || [])];\n\t\t\t\t\t\t} else if (draft.relations[ext]) {\n\t\t\t\t\t\t\t//@ts-expect-error : it's normal is just a draft\n\t\t\t\t\t\t\tdraft.relations[ext].subTypes = [key, ...(draft.relations[ext].subTypes || [])];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthrow new Error(`[Schema] ${key} is extending a thing that does not exist in the schema: ${ext}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tvalue.idFields = extendedSchema.idFields\n\t\t\t\t\t\t? Array.from(new Set((value.idFields || []).concat(extendedSchema.idFields)))\n\t\t\t\t\t\t: value.idFields;\n\n\t\t\t\t\tvalue.dataFields = extendedSchema.dataFields\n\t\t\t\t\t\t? (value.dataFields || []).concat(\n\t\t\t\t\t\t\t\textendedSchema.dataFields.map((df: DataField) => {\n\t\t\t\t\t\t\t\t\t// * Adding dbPath of extended dataFields\n\t\t\t\t\t\t\t\t\tlet deepExtendedThing = value.extends;\n\t\t\t\t\t\t\t\t\tlet deepSchema = schema.entities[deepExtendedThing] || schema.relations[deepExtendedThing];\n\t\t\t\t\t\t\t\t\twhile (!deepSchema.dataFields?.find((deepDf: DataField) => deepDf.path === df.path)) {\n\t\t\t\t\t\t\t\t\t\tdeepExtendedThing = 'extends' in deepSchema ? deepSchema.extends : undefined;\n\t\t\t\t\t\t\t\t\t\tdeepSchema = schema.entities[deepExtendedThing] || schema.relations[deepExtendedThing];\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t\t...df,\n\t\t\t\t\t\t\t\t\t\tinherited: true,\n\t\t\t\t\t\t\t\t\t\tdbPath: 'dbPath' in df ? df.dbPath : getDbPath(deepExtendedThing, df.path, df.shared), //i\n\t\t\t\t\t\t\t\t\t\t[SharedMetadata]: {\n\t\t\t\t\t\t\t\t\t\t\t//@ts-expect-error - Is normal because we are extending it here\n\t\t\t\t\t\t\t\t\t\t\t...df[SharedMetadata],\n\t\t\t\t\t\t\t\t\t\t\t//@ts-expect-error - Is normal because we are extending it here\n\t\t\t\t\t\t\t\t\t\t\tinheritanceOrigin: df[SharedMetadata]?.inheritanceOrigin || value.extends,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: value.dataFields;\n\n\t\t\t\t\t//Only for roles in th extended schema\n\t\t\t\t\tif ('roles' in extendedSchema) {\n\t\t\t\t\t\tconst val = value as BormRelation;\n\t\t\t\t\t\tconst extendedRelationSchema = extendedSchema as BormRelation;\n\t\t\t\t\t\tif (extendedRelationSchema.roles) {\n\t\t\t\t\t\t\tconst extendedRelationSchemaWithOrigin = mapEntries(extendedRelationSchema.roles, (roleKey, role) => {\n\t\t\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\t\t\troleKey,\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t...role,\n\t\t\t\t\t\t\t\t\t\tinherited: true,\n\t\t\t\t\t\t\t\t\t\t[SharedMetadata]: {\n\t\t\t\t\t\t\t\t\t\t\t//@ts-expect-error - Is normal because we are extending it here\n\t\t\t\t\t\t\t\t\t\t\t...role[SharedMetadata],\n\t\t\t\t\t\t\t\t\t\t\t//@ts-expect-error - Is normal because we are extending it here\n\t\t\t\t\t\t\t\t\t\t\tinheritanceOrigin: role[SharedMetadata]?.inheritanceOrigin || value.extends,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t];\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tval.roles = {\n\t\t\t\t\t\t\t\t...(val.roles || {}),\n\t\t\t\t\t\t\t\t...extendedRelationSchemaWithOrigin,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif ('refFields' in extendedSchema) {\n\t\t\t\t\t\tconst val = value as BormRelation | BormEntity;\n\t\t\t\t\t\tconst extendedThingSchema = extendedSchema as BormRelation | BormEntity;\n\t\t\t\t\t\tif (extendedThingSchema.refFields) {\n\t\t\t\t\t\t\tconst extendedRefFields = mapEntries(extendedThingSchema.refFields, (refFieldKey, refField) => {\n\t\t\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\t\t\trefFieldKey,\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t...refField,\n\t\t\t\t\t\t\t\t\t\tinherited: true,\n\t\t\t\t\t\t\t\t\t\t[SharedMetadata]: {\n\t\t\t\t\t\t\t\t\t\t\t//@ts-expect-error - Is normal because we are extending it here\n\t\t\t\t\t\t\t\t\t\t\t...refField[SharedMetadata],\n\t\t\t\t\t\t\t\t\t\t\t//@ts-expect-error - Is normal because we are extending it here\n\t\t\t\t\t\t\t\t\t\t\tinheritanceOrigin: refField[SharedMetadata]?.inheritanceOrigin || value.extends,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t];\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tval.refFields = {\n\t\t\t\t\t\t\t\t...(val.refFields || {}),\n\t\t\t\t\t\t\t\t...extendedRefFields,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tvalue.linkFields = extendedSchema.linkFields\n\t\t\t\t\t\t? (value.linkFields || []).concat(\n\t\t\t\t\t\t\t\textendedSchema.linkFields.map((lf) => ({\n\t\t\t\t\t\t\t\t\t...lf,\n\t\t\t\t\t\t\t\t\tinherited: true,\n\t\t\t\t\t\t\t\t\t[SharedMetadata]: {\n\t\t\t\t\t\t\t\t\t\t...lf[SharedMetadata],\n\t\t\t\t\t\t\t\t\t\tinheritanceOrigin: lf[SharedMetadata]?.inheritanceOrigin || value.extends,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: value.linkFields;\n\n\t\t\t\t\t//todo: Do some checks, and potentially simplify the hooks structure\n\t\t\t\t\tif (extendedSchema?.hooks?.pre) {\n\t\t\t\t\t\tvalue.hooks = value.hooks || {};\n\t\t\t\t\t\tvalue.hooks.pre = value.hooks.pre || [];\n\t\t\t\t\t\tvalue.hooks.pre = [...(extendedSchema?.hooks?.pre || []), ...(value?.hooks?.pre || [])];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\t{ traversalType: 'breadth-first' },\n\t\t),\n\t);\n\t// #endregion\n\n\t// * Gather linkFields\n\ttraverse(schema, ({ key, value, meta }: TraversalCallbackContext) => {\n\t\tif (key === 'linkFields') {\n\t\t\tconst getThingTypes = () => {\n\t\t\t\tif (!meta.nodePath) {\n\t\t\t\t\tthrow new Error('No path');\n\t\t\t\t}\n\t\t\t\tconst [thingPath, thing] = meta.nodePath.split('.');\n\t\t\t\tconst thingType = thingPath === 'entities' ? 'entity' : thingPath === 'relations' ? 'relation' : '';\n\t\t\t\treturn {\n\t\t\t\t\tthing,\n\t\t\t\t\tthingType,\n\t\t\t\t};\n\t\t\t};\n\t\t\tconst thingTypes = getThingTypes();\n\t\t\tconst withThing = !Array.isArray(value)\n\t\t\t\t? [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t...value,\n\t\t\t\t\t\t\t...thingTypes,\n\t\t\t\t\t\t},\n\t\t\t\t\t]\n\t\t\t\t: value.map((x) => ({\n\t\t\t\t\t\t...x,\n\t\t\t\t\t\t...thingTypes,\n\t\t\t\t\t}));\n\n\t\t\tallLinkedFields.push(...withThing);\n\t\t}\n\t});\n\n\t// * Enrich the schema\n\tconst enrichedSchema = produce(withExtensionsSchema, (draft: Partial<EnrichedBormSchema>) =>\n\t\ttraverse(draft, ({ value, key, meta }: TraversalCallbackContext) => {\n\t\t\t// id things\n\t\t\tif (meta.depth === 2 && value.idFields && !value.id) {\n\t\t\t\t// depth 2 are entities and relations\n\t\t\t\t// eslint-disable-next-line prefer-destructuring\n\t\t\t\tvalue.name = key;\n\t\t\t\tconst thingType = () => {\n\t\t\t\t\tif (meta.nodePath?.split('.')[0] === 'entities') {\n\t\t\t\t\t\treturn 'entity';\n\t\t\t\t\t}\n\t\t\t\t\tif (meta.nodePath?.split('.')[0] === 'relations') {\n\t\t\t\t\t\treturn 'relation';\n\t\t\t\t\t}\n\t\t\t\t\tthrow new Error('Unsupported node attributes');\n\t\t\t\t};\n\t\t\t\tvalue.thingType = thingType();\n\t\t\t\t/// We identify the database assigned to this thing\n\t\t\t\t//@ts-expect-error - TODO\n\t\t\t\tconst thingDB: DBHandleKey = Object.keys(dbHandles).find((key) =>\n\t\t\t\t\t// @ts-expect-error - TODO\n\t\t\t\t\tdbHandles[key]?.get(value.defaultDBConnector.id),\n\t\t\t\t);\n\t\t\t\tvalue.db = thingDB as DBHandleKey; //todo\n\t\t\t\tvalue.dbContext = adapterContext[thingDB] as AdapterContext; //todo\n\n\t\t\t\tvalue.dbProviderConfig =\n\t\t\t\t\tthingDB === 'surrealDB' ? dbHandles[thingDB]?.get(value.defaultDBConnector.id)?.providerConfig : undefined;\n\n\t\t\t\t// init the arrays\n\t\t\t\tvalue.computedFields = [];\n\t\t\t\tvalue.virtualFields = [];\n\t\t\t\tvalue.requiredFields = [];\n\t\t\t\tvalue.enumFields = [];\n\t\t\t\tvalue.fnValidatedFields = [];\n\n\t\t\t\t//todo: Maybe move all this to the pre-step and enrich all the linkFields there and same with the roles so then we can usse allLinkFields and allRoles as enriched ones.\n\t\t\t\tif ('linkFields' in value && value.linkFields) {\n\t\t\t\t\tconst val = value as EnrichedBormRelation;\n\n\t\t\t\t\tval.linkFields?.forEach((linkField) => {\n\t\t\t\t\t\t///Check if the path is already in use\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tval.dataFields?.find((df) => df.path === linkField.path) ||\n\t\t\t\t\t\t\tObject.keys(val.roles || {}).includes(linkField.path)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`[Schema] The path ${linkField.path} is already in use by a dataField or linkField in ${val.name}. Path:${meta.nodePath}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst linkFieldRelation = withExtensionsSchema.relations[linkField.relation] as EnrichedBormRelation;\n\n\t\t\t\t\t\tif (!linkField.isVirtual) {\n\t\t\t\t\t\t\t//its ok for virtual linkFields to don't have a relation\n\t\t\t\t\t\t\tif (!linkFieldRelation) {\n\t\t\t\t\t\t\t\tthrow new Error(`The relation ${linkField.relation} does not exist in the schema`);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (linkFieldRelation.roles?.[linkField.plays] === undefined) {\n\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t`The role ${linkField.plays} is not defined in the relation ${linkField.relation} (linkField: ${linkField.path})`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t//#region SHARED METADATA\n\n\t\t\t\t\t\tif (linkField.target === 'relation') {\n\t\t\t\t\t\t\tif (linkField.isVirtual) {\n\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t`[Schema] Virtual linkFields can't target a relation. Thing: \"${val.name}\" LinkField: \"${linkField.path}. Path:${meta.nodePath}.\"`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tlinkField.$things = [linkField.relation, ...(linkFieldRelation.subTypes || [])];\n\t\t\t\t\t\t\tlinkField.oppositeLinkFieldsPlayedBy = [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tplays: linkField.path,\n\t\t\t\t\t\t\t\t\tthing: linkField.relation,\n\t\t\t\t\t\t\t\t\tthingType: 'relation',\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (linkField.target === 'role') {\n\t\t\t\t\t\t\t///target role\n\t\t\t\t\t\t\tlinkField.oppositeLinkFieldsPlayedBy = allLinkedFields.filter(\n\t\t\t\t\t\t\t\t(x) => x.relation === linkField.relation && x.plays !== linkField.plays && x.target === 'role',\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tif (linkField.oppositeLinkFieldsPlayedBy.length === 0) {\n\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t`[Schema] LinkFields require to have at least one opposite linkField playing an opposite role. Thing: \"${val.name}\" LinkField: \"${linkField.path}. Path:${meta.nodePath}.\"`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// This is duplicated here and in playedBy on purpose\n\t\t\t\t\t\t\tlinkField.pathToRelation =\n\t\t\t\t\t\t\t\tval.linkFields?.find((lf) => lf.target === 'relation' && lf.relation === linkField.relation)?.path ??\n\t\t\t\t\t\t\t\tlinkField.relation.toLocaleLowerCase();\n\n\t\t\t\t\t\t\tlinkField.$things = [\n\t\t\t\t\t\t\t\t...new Set(\n\t\t\t\t\t\t\t\t\tlinkField.oppositeLinkFieldsPlayedBy.flatMap((x) => [\n\t\t\t\t\t\t\t\t\t\tx.thing,\n\t\t\t\t\t\t\t\t\t\t...(getSchemaByThing(withExtensionsSchema, x.thing)?.subTypes || []),\n\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t];\n\n\t\t\t\t\t\t\t// #region FILTERING OPPOSITE LINKFIELDS\n\t\t\t\t\t\t\t// const { targetRoles, filter } = linkField;\n\t\t\t\t\t\t\t// Example targetRoles: ['color', 'users']\n\t\t\t\t\t\t\t//Can be combined with filter, for instance to automatically filter by $thing\n\n\t\t\t\t\t\t\t//If after the filters, we still have 2, then the schema is wrong\n\t\t\t\t\t\t\tif (linkField.oppositeLinkFieldsPlayedBy.length > 1) {\n\t\t\t\t\t\t\t\t//temp: lets just warn and add an error only if actually used\n\t\t\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t\t\t`[Schema] LinkField ${linkField.path} in ${val.name} has multiple candidates ${linkField.oppositeLinkFieldsPlayedBy.map((lf) => lf.thing).join(',')} and this is not yet supported. Please target a single one using targetRoles with a single role`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// #endregion\n\t\t\t\t\t\t}\n\t\t\t\t\t\t//#endregion\n\n\t\t\t\t\t\t//#region SUREALDB METADATA\n\n\t\t\t\t\t\tif (value.db === 'surrealDB') {\n\t\t\t\t\t\t\tconst originalRelation =\n\t\t\t\t\t\t\t\tlinkFieldRelation?.roles?.[linkField.plays][SharedMetadata]?.inheritanceOrigin ?? linkField.relation;\n\n\t\t\t\t\t\t\tconst queryPath = getSurrealLinkFieldQueryPath({\n\t\t\t\t\t\t\t\tlinkField,\n\t\t\t\t\t\t\t\toriginalRelation,\n\t\t\t\t\t\t\t\twithExtensionsSchema,\n\t\t\t\t\t\t\t\tlinkMode: value.dbProviderConfig.linkMode,\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tlinkField[SuqlMetadata] = {\n\t\t\t\t\t\t\t\tqueryPath,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// We take the original relation as its the one that holds the name of the relation in surrealDB\n\n\t\t\t\t\t\t//#endregion\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif ('refFields' in value && value.refFields) {\n\t\t\t\t\tvalue.refFields = mapEntries(value.refFields, (refFieldKey: string, refField: RefField) => {\n\t\t\t\t\t\tconst enrichedRefField = {\n\t\t\t\t\t\t\t...refField,\n\t\t\t\t\t\t\tdbPath: refField.dbPath || refFieldKey,\n\t\t\t\t\t\t};\n\t\t\t\t\t\treturn [refFieldKey, enrichedRefField];\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// adding all the linkFields to roles\n\t\t\t\tif ('roles' in value) {\n\t\t\t\t\tconst val = value as EnrichedBormRelation;\n\n\t\t\t\t\tObject.entries(val.roles).forEach(([roleKey, role]) => {\n\t\t\t\t\t\t//Check if the key is used by linkFields or roleFields already\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tval.dataFields?.find((df) => df.path === roleKey) ||\n\t\t\t\t\t\t\tval.linkFields?.find((lf) => lf.path === roleKey)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`[Schema] The path ${roleKey} is already in use by a dataField or linkField in ${val.name}. Path:${meta.nodePath}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst playedBy = allLinkedFields.filter((x) => x.relation === key && x.plays === roleKey) || [];\n\t\t\t\t\t\t// Duplicating path to relation here and in normal linkfields as it is used in both places\n\t\t\t\t\t\trole.playedBy = playedBy.map((lf) => ({\n\t\t\t\t\t\t\t...lf,\n\t\t\t\t\t\t\tpathToRelation:\n\t\t\t\t\t\t\t\tlf.target === 'relation'\n\t\t\t\t\t\t\t\t\t? lf.path\n\t\t\t\t\t\t\t\t\t: (val.linkFields?.find(\n\t\t\t\t\t\t\t\t\t\t\t(lf) => lf.target === 'relation' && lf.relation === key && lf.plays === roleKey,\n\t\t\t\t\t\t\t\t\t\t)?.path ?? lf.relation.toLocaleLowerCase()),\n\t\t\t\t\t\t}));\n\n\t\t\t\t\t\tconst impactedLinkFields = allLinkedFields.filter(\n\t\t\t\t\t\t\t(x) => x.target === 'relation' && x.plays === roleKey && val.allExtends?.includes(x.relation),\n\t\t\t\t\t\t);\n\t\t\t\t\t\trole.impactedLinkFields = impactedLinkFields;\n\n\t\t\t\t\t\trole.path = roleKey;\n\t\t\t\t\t\tconst $things = [\n\t\t\t\t\t\t\t...new Set(\n\t\t\t\t\t\t\t\tplayedBy\n\t\t\t\t\t\t\t\t\t.flatMap((x) => {\n\t\t\t\t\t\t\t\t\t\tconst playerSchema = getSchemaByThing(withExtensionsSchema, x.thing);\n\t\t\t\t\t\t\t\t\t\treturn [...(playerSchema.subTypes || []), x.thing];\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t.flat()\n\t\t\t\t\t\t\t\t\t.filter(Boolean),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t];\n\n\t\t\t\t\t\trole.$things = $things;\n\n\t\t\t\t\t\tconst originalRelation = role[SharedMetadata]?.inheritanceOrigin || value.name;\n\n\t\t\t\t\t\t/*if ($things.length > 1) {\n\t\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t\t`Not supported yet: Role ${roleKey} in ${'name' in value ? value.name : JSON.stringify(value)} is played by multiple things: ${$things.join(', ')}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}*/\n\t\t\t\t\t\t//get all subTyped for each potential player\n\t\t\t\t\t\tconst playerThingsWithSubTypes = $things.flatMap((playerThing) => {\n\t\t\t\t\t\t\tconst playerSchema = getSchemaByThing(schema, playerThing);\n\t\t\t\t\t\t\tconst subTypes = playerSchema?.subTypes || [];\n\t\t\t\t\t\t\treturn [playerThing, ...subTypes];\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tconst getQueryPath = () => {\n\t\t\t\t\t\t\tif (value.dbProviderConfig.linkMode === 'edges') {\n\t\t\t\t\t\t\t\treturn `->\\`${originalRelation}_${roleKey}\\`->(\\`${playerThingsWithSubTypes.join('`,`')}\\`)`;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (value.dbProviderConfig.linkMode === 'refs') {\n\t\t\t\t\t\t\t\tif (role.cardinality === 'MANY') {\n\t\t\t\t\t\t\t\t\treturn `$parent.[\\`${roleKey}\\`]`;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (role.cardinality === 'ONE') {\n\t\t\t\t\t\t\t\t\treturn `$parent.\\`${roleKey}\\``;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthrow new Error('Unsupported linkMode');\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tif (value.db === 'surrealDB') {\n\t\t\t\t\t\t\tconst queryPath = getQueryPath();\n\n\t\t\t\t\t\t\trole[SuqlMetadata] = {\n\t\t\t\t\t\t\t\tqueryPath,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// role fields\n\t\t\tif (value && typeof value === 'object' && 'playedBy' in value) {\n\t\t\t\t// if (value.playedBy.length > 1) {\n\t\t\t\tconst playedBySet = [...new Set(value.playedBy.map((x: LinkedFieldWithThing) => x.thing))];\n\t\t\t\tif (playedBySet.length > 1) {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t`[Schema] roleFields can be only played by one thing. Role: ${key}, path:${meta.nodePath}, played by: ${playedBySet.join(', ')}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (value.playedBy.length === 0) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`[Schema] roleFields should be played at least by one thing. Role: ${key}, path:${meta.nodePath}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//if default or computed, add to computed fields list\n\t\t\tif (meta.depth === 4) {\n\t\t\t\tconst [type, thingId] = meta.nodePath?.split('.') || [];\n\t\t\t\t//todo change \"type\" to \"thingType\"\n\t\t\t\t// @ts-expect-error - TODO\n\t\t\t\tconst draftSchema = draft[type][thingId] as EnrichedBormEntity;\n\n\t\t\t\tif (!isArray(value) && typeof value === 'object') {\n\t\t\t\t\t//skip meta.depth 4 when its arrays or undefined or not an object\n\t\t\t\t\tif (value.validations) {\n\t\t\t\t\t\tif (value.validations.required) {\n\t\t\t\t\t\t\tdraftSchema.requiredFields.push(value.path);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (value.validations.enum) {\n\t\t\t\t\t\t\tdraftSchema.enumFields.push(value.path);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (value.validations.fn) {\n\t\t\t\t\t\t\tdraftSchema.fnValidatedFields.push(value.path);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (value.default) {\n\t\t\t\t\t\tif (value.isVirtual) {\n\t\t\t\t\t\t\t// default and virtual means computed\n\t\t\t\t\t\t\tdraftSchema.virtualFields.push(value.path);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t//default but not virtual means pre-computed (default value), borm side\n\t\t\t\t\t\t\tdraftSchema.computedFields.push(value.path);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (value.isVirtual) {\n\t\t\t\t\t\t\t//not default but isVirtual means, computed in the DB side, not borm side\n\t\t\t\t\t\t\tdraftSchema.virtualFields.push(value.path);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//if it requires validations, add to the fields that required validations\n\t\t}),\n\t) as EnrichedBormSchema;\n\n\t//console.log('schema and enrichedSchema', JSON.stringify(schema), JSON.stringify(enrichedSchema));\n\treturn enrichedSchema;\n};\n\nexport const getSchemaByThing = (\n\tschema: BormSchema | EnrichedBormSchema,\n\t$thing: string,\n): EnrichedBormEntity | EnrichedBormRelation => {\n\tif ($thing in schema.entities) {\n\t\treturn schema.entities[$thing] as EnrichedBormEntity;\n\t}\n\tif ($thing in schema.relations) {\n\t\treturn schema.relations[$thing] as EnrichedBormRelation;\n\t}\n\tthrow new Error(`${$thing} is not defined in the schema`);\n};\n\nexport const getCurrentSchema = (\n\tschema: BormSchema | EnrichedBormSchema,\n\tnode: Partial<BQLMutationBlock>,\n): EnrichedBormEntity | EnrichedBormRelation => {\n\tif (!node) {\n\t\tthrow new Error('[Internal] No node for getCurrentSchema');\n\t}\n\tif (node.$thing) {\n\t\tif (node.$thingType === 'entity') {\n\t\t\tif (!(node.$thing in schema.entities)) {\n\t\t\t\tthrow new Error(`Missing entity '${node.$thing}' in the schema`);\n\t\t\t}\n\t\t\treturn schema.entities[node.$thing] as EnrichedBormEntity;\n\t\t}\n\t\tif (node.$thingType === 'relation') {\n\t\t\tif (!(node.$thing in schema.relations)) {\n\t\t\t\tthrow new Error(`Missing relation '${node.$thing}' in the schema`);\n\t\t\t}\n\t\t\treturn schema.relations[node.$thing] as EnrichedBormRelation;\n\t\t}\n\t\t// TODO: This should be validated during the initialization\n\t\tif (node.$thing in schema.entities && node.$thing in schema.relations) {\n\t\t\tthrow new Error(`Ambiguous $thing ${node.$thing}`);\n\t\t}\n\t\tif (node.$thing in schema.entities) {\n\t\t\treturn schema.entities[node.$thing] as EnrichedBormEntity;\n\t\t}\n\t\tif (node.$thing in schema.relations) {\n\t\t\treturn schema.relations[node.$thing] as EnrichedBormRelation;\n\t\t}\n\t\tthrow new Error(`Wrong schema or query for ${JSON.stringify(node, null, 2)}`);\n\t}\n\n\t//! Todo: delete when this works with the new $thing and $thingType fields\n\tif (node.$entity) {\n\t\tif (!(node.$entity in schema.entities)) {\n\t\t\tthrow new Error(`Missing entity '${node.$entity}' in the schema`);\n\t\t}\n\t\treturn schema.entities[node.$entity] as EnrichedBormEntity;\n\t}\n\tif (node.$relation) {\n\t\tif (!(node.$relation in schema.relations)) {\n\t\t\tthrow new Error(`Missing relation '${node.$relation}' in the schema`);\n\t\t}\n\t\treturn schema.relations[node.$relation] as EnrichedBormRelation;\n\t}\n\tthrow new Error(`Wrong schema or query for ${JSON.stringify(node, null, 2)}`);\n};\n\nexport const getFieldType = (\n\tcurrentSchema: EnrichedBormRelation | EnrichedBormEntity,\n\tkey: string,\n): ['idField' | 'dataField' | 'linkField' | 'roleField', EnrichedDataField | EnrichedLinkField | EnrichedRoleField] => {\n\tconst dataFieldSchema = currentSchema.dataFields?.find((dataField: any) => dataField.path === key);\n\n\tif (currentSchema.idFields?.includes(key)) {\n\t\tif (!dataFieldSchema) {\n\t\t\tthrow new Error(`Field ${key} is an idField but not a dataField in schema`);\n\t\t}\n\t\treturn ['idField', dataFieldSchema];\n\t}\n\tif (dataFieldSchema) {\n\t\treturn ['dataField', dataFieldSchema];\n\t}\n\tconst linkFieldSchema = currentSchema.linkFields?.find((linkField: any) => linkField.path === key);\n\tif (linkFieldSchema) {\n\t\treturn ['linkField', linkFieldSchema];\n\t}\n\tconst roleFieldSchema = 'roles' in currentSchema ? currentSchema.roles[key] : undefined;\n\tif (roleFieldSchema) {\n\t\treturn ['roleField', roleFieldSchema];\n\t}\n\tthrow new Error(`Field ${key} not found in schema, Defined in $filter`);\n};\nexport const getIdFieldKey = (schema: EnrichedBormSchema, node: Partial<BQLMutationBlock>) => {\n\tconst currentSchema = getCurrentSchema(schema, node);\n\tif (currentSchema?.idFields?.length && currentSchema?.idFields?.length > 1) {\n\t\tthrow new Error(`Multiple ids not yet enabled / composite ids: ${currentSchema?.idFields}`);\n\t}\n\n\tconst [idField] = currentSchema.idFields; //todo composed ids\n\treturn idField;\n};\n\nexport const getThingType = (rootNode: BQLMutationBlock, schema: EnrichedBormSchema): ThingType => {\n\tconst thing = rootNode.$thing || rootNode.$entity || rootNode.$relation;\n\tif (!thing) {\n\t\tthrow new Error('[Internal] No thing found');\n\t}\n\tif (rootNode.$entity) {\n\t\treturn 'entity';\n\t} else if (rootNode.$relation) {\n\t\treturn 'relation';\n\t} else if (schema.entities[thing]) {\n\t\treturn 'entity';\n\t} else if (schema.relations[thing]) {\n\t\treturn 'relation';\n\t}\n\tthrow new Error('No thing found');\n};\n\nexport const getFieldSchema = (\n\tschema: EnrichedBormSchema,\n\tnode: Partial<BQLMutationBlock>,\n\tfield: string,\n): EnrichedDataField | EnrichedLinkField | EnrichedRoleField | EnrichedRefField => {\n\tconst currentSchema = getCurrentSchema(schema, node);\n\tconst foundLinkField = currentSchema.linkFields?.find((lf) => lf.path === field);\n\tif (foundLinkField) {\n\t\treturn foundLinkField as EnrichedLinkField;\n\t}\n\tconst foundDataField = currentSchema.dataFields?.find((lf) => lf.path === field);\n\tif (foundDataField) {\n\t\treturn foundDataField as EnrichedDataField;\n\t}\n\tconst foundRoleField = 'roles' in currentSchema ? currentSchema.roles?.[field] : undefined;\n\tif (foundRoleField) {\n\t\treturn foundRoleField as EnrichedRoleField;\n\t}\n\tconst foundRefField = 'refFields' in currentSchema ? currentSchema.refFields?.[field] : undefined;\n\tif (foundRefField) {\n\t\treturn foundRefField as EnrichedRefField;\n\t}\n\tthrow new Error(`Field ${field} not found in schema`);\n};\n\nexport const getCardinality = (\n\tschema: EnrichedBormSchema,\n\tnode: Partial<BQLMutationBlock>,\n\tfield: string,\n): 'ONE' | 'MANY' | 'INTERVAL' | undefined => {\n\tconst currentFieldSchema = getFieldSchema(schema, node, field);\n\treturn currentFieldSchema?.cardinality;\n};\n\ntype ReturnTypeWithoutNode = {\n\tfields: string[];\n\tdataFields: string[];\n\troleFields: string[];\n\tlinkFields: string[];\n\trefFields: string[];\n};\n\ntype ReturnTypeWithNode = ReturnTypeWithoutNode & {\n\tusedFields: string[];\n\tusedRoleFields: string[];\n\tusedLinkFields: string[];\n\tusedDataFields: string[];\n\tusedRefFields: string[];\n\tunidentifiedFields: string[];\n};\n\n// todo: do something so this enriches the query so no need to call it multiple times\nexport const getCurrentFields = <T extends (BQLMutationBlock | RawBQLQuery) | undefined>(\n\tcurrentSchema: EnrichedBormEntity | EnrichedBormRelation,\n\tnode?: T,\n): T extends undefined ? ReturnTypeWithoutNode : ReturnTypeWithNode => {\n\tconst availableDataFields = currentSchema.dataFields?.map((x) => x.path) || [];\n\tconst availableLinkFields = currentSchema.linkFields?.map((x) => x.path) || [];\n\tconst availableRefFields = 'refFields' in currentSchema ? listify(currentSchema.refFields, (k: string) => k) : [];\n\tconst availableRoleFields = 'roles' in currentSchema ? listify(currentSchema.roles, (k: string) => k) : [];\n\tconst availableFields = [\n\t\t...(availableDataFields || []),\n\t\t...(availableLinkFields || []),\n\t\t...(availableRoleFields || []),\n\t\t...(availableRefFields || []),\n\t];\n\n\t// spot non existing fields\n\tconst reservedRootFields = [\n\t\t'$entity',\n\t\t'$op',\n\t\t'$id',\n\t\t'$tempId',\n\t\t'$bzId',\n\t\t'$relation',\n\t\t'$parentKey', //todo: this is not a valid one, to delete and migrate to symbol!\n\t\t'$filter',\n\t\t'$fields',\n\t\t'$excludedFields',\n\t\t'$thing',\n\t\t'$thingType',\n\t];\n\n\tconst allowedFields = [...reservedRootFields, ...availableFields];\n\n\tif (!node) {\n\t\treturn {\n\t\t\tfields: availableFields,\n\t\t\tdataFields: availableDataFields,\n\t\t\troleFields: availableRoleFields,\n\t\t\tlinkFields: availableLinkFields,\n\t\t} as ReturnTypeWithNode;\n\t}\n\tconst usedFields = node.$fields\n\t\t? //queries\n\t\t\t(node.$fields.map((x: string | { $path: string }) => {\n\t\t\t\tif (typeof x === 'string') {\n\t\t\t\t\tif (x.startsWith('$') || x.startsWith('%')) {\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t}\n\t\t\t\t\tif (!availableFields.includes(x)) {\n\t\t\t\t\t\tthrow new Error(`Field ${x} not found in the schema`);\n\t\t\t\t\t}\n\t\t\t\t\treturn x;\n\t\t\t\t}\n\t\t\t\tif ('$path' in x && typeof x.$path === 'string') {\n\t\t\t\t\treturn x.$path;\n\t\t\t\t}\n\t\t\t\tthrow new Error('[Wrong format] Wrongly structured query');\n\t\t\t}) as string[])\n\t\t: //mutations\n\t\t\t(listify<any, string, any>(node, (k: string) => {\n\t\t\t\tif (k.startsWith('$') || k.startsWith('%')) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t\tif (!availableFields.includes(k)) {\n\t\t\t\t\tthrow new Error(`[Schema] Field ${k} not found in the schema`);\n\t\t\t\t}\n\t\t\t\treturn k;\n\t\t\t}).filter((x) => x !== undefined) as string[]);\n\n\tconst localFilterFields = !node.$filter\n\t\t? []\n\t\t: listify(node.$filter as PositiveFilter, (k: string) =>\n\t\t\t\tk.toString().startsWith('$') ? undefined : k.toString(),\n\t\t\t).filter((x) => x && availableDataFields?.includes(x));\n\tconst nestedFilterFields = !node.$filter\n\t\t? []\n\t\t: listify(node.$filter as PositiveFilter, (k: string) =>\n\t\t\t\tk.toString().startsWith('$') ? undefined : k.toString(),\n\t\t\t).filter((x) => x && [...(availableRoleFields || []), ...(availableLinkFields || [])]?.includes(x));\n\n\tconst unidentifiedFields = [...usedFields, ...localFilterFields]\n\t\t.filter((x) => !x?.startsWith('%'))\n\t\t// @ts-expect-error - TODO description\n\t\t.filter((x) => !allowedFields.includes(x))\n\t\t.filter((x) => x) as string[]; // todo 🤔\n\tconst localFilters = !node.$filter ? {} : oFilter(node.$filter, (k: string, _v) => localFilterFields.includes(k));\n\tconst nestedFilters = !node.$filter ? {} : oFilter(node.$filter, (k: string, _v) => nestedFilterFields.includes(k));\n\n\treturn {\n\t\tfields: availableFields,\n\t\tdataFields: availableDataFields,\n\t\troleFields: availableRoleFields,\n\t\tlinkFields: availableLinkFields,\n\t\trefFields: availableRefFields,\n\t\tusedFields,\n\t\tusedLinkFields: availableLinkFields.filter((x) => usedFields.includes(x)),\n\t\tusedRoleFields: availableRoleFields.filter((x) => usedFields.includes(x)),\n\t\tusedDataFields: availableDataFields.filter((x) => usedFields.includes(x)),\n\t\tusedRefFields: availableRefFields.filter((x) => usedFields.includes(x)),\n\t\tunidentifiedFields,\n\t\t...(localFilterFields.length ? { localFilters } : {}),\n\t\t...(nestedFilterFields.length ? { nestedFilters } : {}),\n\t} as ReturnTypeWithNode;\n};\n\n/*\nexport const arrayAt = <T>(arr: T[] | undefined, index: number): T | undefined => {\n\tif (arr === undefined || !Array.isArray(arr) || index < -arr.length || index >= arr.length) {\n\t\treturn undefined;\n\t}\n\treturn arr[index < 0 ? arr.length + index : index];\n};*/\n\nexport const notNull = <TValue>(value: TValue | null): value is TValue => {\n\treturn value !== null;\n};\n\nexport const extractChildEntities = (entities: EnrichedBormSchema['entities'], parentEntity: string) => {\n\treturn Object.values(entities).reduce((acc: string[], value) => {\n\t\tif (value.extends === parentEntity) {\n\t\t\tacc.push(value.name);\n\t\t}\n\t\treturn acc;\n\t}, []);\n};\n\nexport const capitalizeFirstLetter = (string: string) => {\n\tif (typeof string !== 'string') {\n\t\tthrow new Error('capitalizeFirstLetter: string is not a string');\n\t}\n\treturn string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();\n};\n\nexport const getParentNode = (blocks: Record<any, any>, parent: any, meta: TraversalMeta) => {\n\tconst currentPath = meta.nodePath || '';\n\tconst pathParts = currentPath.split('.');\n\tconst parentPath = isArray(parent)\n\t\t? pathParts.slice(0, -2).join('.') // Remove last two parts for an array parent\n\t\t: pathParts.slice(0, -1).join('.'); // Remove only the last part for a non-array parent\n\treturn parent ? getNodeByPath(blocks, parentPath) : {}; //undefined parent for root\n};\n\nexport const getSymbols = (oldBlock: Partial<FilledBQLMutationBlock>): Record<symbol, any> => {\n\treturn Reflect.ownKeys(oldBlock)\n\t\t.filter((key): key is symbol => typeof key === 'symbol')\n\t\t.reduce(\n\t\t\t(symbols, symbolKey) => {\n\t\t\t\t//@ts-expect-error - TODO\n\t\t\t\t// eslint-disable-next-line no-param-reassign\n\t\t\t\tsymbols[symbolKey] = oldBlock[symbolKey];\n\t\t\t\treturn symbols;\n\t\t\t},\n\t\t\t{} as Record<symbol, any>,\n\t\t);\n};\n\nexport const normalPropsCount = (obj: Record<string, any>) => {\n\treturn Object.keys(obj).filter((key) => !key.startsWith('$')).length;\n};\n\nexport const isBQLBlock = (block: unknown): block is FilledBQLMutationBlock => {\n\treturn isObject(block) && ('$entity' in block || '$relation' in block || '$thing' in block);\n};\n\ntype Drafted<T> = T | Draft<T>;\n\n// Recursively define the type to handle nested structures\ntype DeepCurrent<T> =\n\tT extends Array<infer U> ? Array<DeepCurrent<U>> : T extends object ? { [K in keyof T]: DeepCurrent<T[K]> } : T;\n\nexport const deepCurrent = <T>(obj: Drafted<T>): any => {\n\tif (Array.isArray(obj)) {\n\t\t// Explicitly cast the return type for arrays\n\t\treturn obj.map((item) => current(item)) as DeepCurrent<T>;\n\t} else if (obj && typeof obj === 'object') {\n\t\t// Handle non-null objects\n\t\tconst plainObject = isDraft(obj) ? current(obj) : obj;\n\t\tconst result: any = {};\n\t\tObject.entries(plainObject).forEach(([key, value]) => {\n\t\t\t// Use the key to dynamically assign the converted value\n\t\t\tresult[key] = isDraft(value) ? current(value) : value;\n\t\t});\n\t\t// Explicitly cast the return type for objects\n\t\treturn result as DeepCurrent<T>;\n\t} else {\n\t\t// Return the value directly for non-objects and non-arrays\n\t\treturn obj as DeepCurrent<T>;\n\t}\n};\n\nexport const assertDefined = <T>(value?: T, msg?: string): T => {\n\tif (value === undefined) {\n\t\tif (msg) {\n\t\t\tthrow new Error(msg);\n\t\t}\n\t\tthrow new Error('Value is undefined');\n\t}\n\treturn value;\n};\n\nexport const indent = (line: string, depth: number) => {\n\tlet _indent = '';\n\tfor (let i = 0; i < depth; i++) {\n\t\t_indent += ' ';\n\t}\n\treturn `${_indent}${line}`;\n};\n\nexport const genId = (n?: number) => {\n\tconst idLength = n ?? 21;\n\tconst alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz';\n\tconst nanoid = customAlphabet(alphabet, idLength);\n\treturn nanoid();\n};\n","//! TO-DO Rule: Everything that can be changed or defined by the user should use $ prefix, but the rest is metadata and should be packed in symbols, depending on their origin. extension inside the schema and schema or query inside the query. Probably no more categories are necessary\nexport const Schema = Symbol.for('schema');\n\nexport const QueryPath = Symbol.for('queryPath');\n\nexport const StepPrint = Symbol.for('stepPrint');\n\nexport const EdgeType = Symbol.for('edgeType');\nexport const EdgeSchema = Symbol.for('edgeSchema');\nexport const Path = Symbol.for('path');\n\nexport const DBNode = Symbol.for('dbNode');\nexport const IsTransformed = Symbol.for('isTransformed');\n\n//flatBQL\nexport const Parent = Symbol.for('parent');\n\n/// Fields\nexport const FieldSchema = Symbol.for('fieldSchema');\n\n/// Shared schema metadata\nexport const SharedMetadata = Symbol.for('sharedMetadata');\n\n/// SurrealDB schema metadata\nexport const SuqlMetadata = Symbol.for('suqlMetadata');\n\n//TODO: restructure everything on top of this to be packed in the 3 symbols hereunder.\n//* SCHEMA STORED\n// For metadata that extends the schema\nexport const Extension = Symbol.for('extension');\n\n//* QUERY STORED\n//export const QueryContext = Symbol.for('queryContext'); //todo: queryContext and schemaContext as the only two symbols with a particular structure\n//export const SchemaContext = Symbol.for('schemaContext');\n","import type { DBHandleKey } from '../types';\n\nexport type AdapterContext = {\n\tmutation: {\n\t\tsplitArray$Ids: boolean;\n\t\trequiresParseBQL: boolean;\n\t};\n};\n\nexport const adapterContext: Record<DBHandleKey, AdapterContext> = {\n\ttypeDB: {\n\t\tmutation: {\n\t\t\tsplitArray$Ids: true,\n\t\t\trequiresParseBQL: true,\n\t\t},\n\t},\n\tsurrealDB: {\n\t\tmutation: {\n\t\t\tsplitArray$Ids: false, //probably not needed\n\t\t\trequiresParseBQL: false, //probably not needed\n\t\t},\n\t},\n} as const;\n","import type { EnrichedLinkField, EnrichedBormRelation, BormSchema } from '../../../types';\n\nexport const getSurrealLinkFieldQueryPath = ({\n\tlinkField,\n\toriginalRelation,\n\twithExtensionsSchema,\n\tlinkMode,\n}: {\n\tlinkField: EnrichedLinkField;\n\toriginalRelation: string;\n\twithExtensionsSchema: BormSchema;\n\tlinkMode: 'refs' | 'edges';\n}) => {\n\t// For virtuals, it is managed by the database schema\n\tif (linkField.isVirtual) {\n\t\treturn `$this.${linkField.path}.id`;\n\t}\n\n\t// And the subtypes of the current relation, as only the currentSubtypes are included in the path\n\tconst targetRelationSubTypes =\n\t\t(withExtensionsSchema.relations[linkField.relation] as EnrichedBormRelation).subTypes || [];\n\tconst targetRelationThings = [linkField.relation, ...targetRelationSubTypes];\n\n\tconst pathToRelation = `<-⟨${originalRelation}_${linkField.plays}⟩<-(⟨${targetRelationThings.join('⟩,⟨')}⟩)`;\n\n\tif (linkField.target === 'relation') {\n\t\tif (linkMode === 'edges') {\n\t\t\treturn pathToRelation; //Not original relation in the second, but all the potential targets\n\t\t}\n\t\tif (linkMode === 'refs') {\n\t\t\tif (linkField.cardinality === 'MANY') {\n\t\t\t\treturn `$parent.[\\`${linkField.path}\\`]`;\n\t\t\t}\n\t\t\treturn `$parent.\\`${linkField.path}\\``;\n\t\t}\n\t\tthrow new Error('Unsupported linkMode');\n\t} else if (linkField.target === 'role') {\n\t\tconst [targetRole] = linkField.oppositeLinkFieldsPlayedBy; //todo: This should consider more option in the future\n\t\tconst targetRoleSubTypes =\n\t\t\t//@ts-expect-error it is not fully extended but it does have subtypes\n\t\t\twithExtensionsSchema.entities[targetRole.thing]?.subTypes ||\n\t\t\t//@ts-expect-error it is not fully extended but it does have subtypes\n\t\t\twithExtensionsSchema.relations[targetRole.thing]?.subTypes ||\n\t\t\t[];\n\n\t\tconst oppositeRoleThings = [targetRole.thing, ...targetRoleSubTypes];\n\n\t\tconst pathToTunneledRole = `->⟨${originalRelation}_${targetRole.plays}⟩->(⟨${oppositeRoleThings.join('⟩,⟨')}⟩)`;\n\n\t\tif (linkMode === 'edges') {\n\t\t\treturn `${pathToRelation}${pathToTunneledRole}`;\n\t\t}\n\t\tif (linkMode === 'refs') {\n\t\t\tif (linkField.cardinality === 'MANY') {\n\t\t\t\treturn `$parent.[\\`${targetRole.plays}\\`]`;\n\t\t\t}\n\t\t\treturn `$parent.\\`${targetRole.plays}\\``;\n\t\t}\n\n\t\treturn `${pathToRelation}${pathToTunneledRole}`;\n\t} else {\n\t\tthrow new Error('Unsupported linkField target');\n\t}\n};\n","import { tryit } from 'radash';\nimport { TypeDB, SessionType, TypeDBCredential } from 'typedb-driver';\n\nimport { defaultConfig } from './default.config';\nimport { bormDefine } from './define';\nimport { enrichSchema } from './helpers';\nimport type {\n\tAllDbHandles,\n\tBQLMutation,\n\tBQLResponse,\n\tBQLResponseMulti,\n\tBormConfig,\n\tBormSchema,\n\tDBHandles,\n\tEnrichedBormSchema,\n\tMutationConfig,\n\tQueryConfig,\n\tRawBQLQuery,\n} from './types';\nimport { enableMapSet } from 'immer';\nimport { runMutationMachine } from './stateMachine/mutation/mutationMachine';\nimport { runQueryMachine } from './stateMachine/query/queryMachine';\nimport { SimpleSurrealClient } from './adapters/surrealDB/client';\n\nexport * from './types';\n\ntype BormProps = {\n\tschema: BormSchema;\n\tconfig: BormConfig;\n};\n\n/// Global config\n// immer\nenableMapSet();\n\nclass BormClient {\n\tprivate schema: BormSchema;\n\n\tprivate config: BormConfig;\n\n\tprivate dbHandles?: DBHandles;\n\n\tconstructor({ schema, config }: BormProps) {\n\t\tthis.schema = schema;\n\t\tthis.config = config;\n\t}\n\tgetDbHandles = () => this.dbHandles;\n\n\tinit = async () => {\n\t\tconst dbHandles: AllDbHandles = { typeDB: new Map(), surrealDB: new Map() };\n\t\tawait Promise.all(\n\t\t\tthis.config.dbConnectors.map(async (dbc) => {\n\t\t\t\tif (dbc.provider === 'surrealDB') {\n\t\t\t\t\tconst client = new SimpleSurrealClient({\n\t\t\t\t\t\turl: dbc.url,\n\t\t\t\t\t\tusername: dbc.username,\n\t\t\t\t\t\tpassword: dbc.password,\n\t\t\t\t\t\tnamespace: dbc.namespace,\n\t\t\t\t\t\tdatabase: dbc.dbName,\n\t\t\t\t\t});\n\t\t\t\t\t// const pool = new SurrealPool({\n\t\t\t\t\t// \turl: dbc.url,\n\t\t\t\t\t// \tusername: dbc.username,\n\t\t\t\t\t// \tpassword: dbc.password,\n\t\t\t\t\t// \tnamespace: dbc.namespace,\n\t\t\t\t\t// \tdatabase: dbc.dbName,\n\t\t\t\t\t// \ttotalConnections: 8,\n\t\t\t\t\t// });\n\t\t\t\t\tdbHandles.surrealDB.set(dbc.id, { client, providerConfig: dbc.providerConfig });\n\t\t\t\t}\n\t\t\t\tif (dbc.provider === 'typeDB' && dbc.dbName) {\n\t\t\t\t\t// const client = await TypeDB.coreClient(dbc.url);\n\t\t\t\t\t// const clientErr = undefined;\n\t\t\t\t\tconst [clientErr, client] = await tryit(TypeDB.coreDriver)(dbc.url);\n\t\t\t\t\tif (clientErr) {\n\t\t\t\t\t\tconst message = `[BORM:${dbc.provider}:${dbc.dbName}:core] ${\n\t\t\t\t\t\t\t// clientErr.messageTemplate?._messageBody() ?? \"Can't create TypeDB Client\"\n\t\t\t\t\t\t\tclientErr.message ?? \"Can't create TypeDB Client\"\n\t\t\t\t\t\t}`;\n\t\t\t\t\t\tthrow new Error(message);\n\t\t\t\t\t}\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst session = await client.session(dbc.dbName, SessionType.DATA);\n\t\t\t\t\t\tdbHandles.typeDB.set(dbc.id, { client, session });\n\t\t\t\t\t} catch (sessionErr: any) {\n\t\t\t\t\t\tconst message = `[BORM:${dbc.provider}:${dbc.dbName}:session] ${\n\t\t\t\t\t\t\t// eslint-disable-next-line no-underscore-dangle\n\t\t\t\t\t\t\t(sessionErr.messageTemplate?._messageBody() || sessionErr.message) ?? \"Can't create TypeDB Session\"\n\t\t\t\t\t\t}`;\n\t\t\t\t\t\tthrow new Error(message);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (dbc.provider === 'typeDBCluster' && dbc.dbName) {\n\t\t\t\t\tconst credential = new TypeDBCredential(dbc.username, dbc.password, dbc.tlsRootCAPath);\n\t\t\t\t\tconst [clientErr, client] = await tryit(TypeDB.cloudDriver)(dbc.addresses, credential);\n\n\t\t\t\t\tif (clientErr) {\n\t\t\t\t\t\tconst message = `[BORM:${dbc.provider}:${dbc.dbName}:core] ${\n\t\t\t\t\t\t\t// clientErr.messageTemplate?._messageBody() ?? \"Can't create TypeDB Client\"\n\t\t\t\t\t\t\tclientErr.message ?? \"Can't create TypeDB Cluster Client\"\n\t\t\t\t\t\t}`;\n\t\t\t\t\t\tthrow new Error(message);\n\t\t\t\t\t}\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst session = await client.session(dbc.dbName, SessionType.DATA);\n\t\t\t\t\t\tdbHandles.typeDB.set(dbc.id, { client, session });\n\t\t\t\t\t} catch (sessionErr: any) {\n\t\t\t\t\t\tconst message = `[BORM:${dbc.provider}:${dbc.dbName}:session] ${\n\t\t\t\t\t\t\t// eslint-disable-next-line no-underscore-dangle\n\t\t\t\t\t\t\t(sessionErr.messageTemplate?._messageBody() || sessionErr.message) ?? \"Can't create TypeDB Session\"\n\t\t\t\t\t\t}`;\n\t\t\t\t\t\tthrow new Error(message);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}),\n\t\t);\n\t\tconst enrichedSchema = enrichSchema(this.schema, dbHandles);\n\n\t\tthis.schema = enrichedSchema as EnrichedBormSchema;\n\t\tthis.dbHandles = dbHandles;\n\t};\n\n\t#enforceConnection = async () => {\n\t\tif (!this.dbHandles) {\n\t\t\tawait this.init();\n\t\t\tif (!this.dbHandles) {\n\t\t\t\tthrow new Error(\"Can't init BormClient\");\n\t\t\t}\n\t\t}\n\t};\n\n\tintrospect = async () => {\n\t\tawait this.#enforceConnection();\n\t\treturn this.schema;\n\t};\n\n\tdefine = async () => {\n\t\tawait this.#enforceConnection();\n\t\tif (!this.dbHandles) {\n\t\t\tthrow new Error('dbHandles undefined');\n\t\t}\n\t\tconst schemas = await bormDefine(this.config, this.schema as EnrichedBormSchema, this.dbHandles);\n\t\treturn schemas;\n\t};\n\n\t/// no types yet, but we can do \"as ...\" after getting the type fro the schema\n\t// query = async (query: RawBQLQuery | RawBQLQuery[], queryConfig?: QueryConfig) => {\n\t// \tconst handles = this.dbHandles;\n\t// \tif (!handles) {\n\t// \t\tthrow new Error('dbHandles undefined');\n\t// \t}\n\n\t// \tawait this.#enforceConnection();\n\n\t// \tconst qConfig = {\n\t// \t\t...this.config,\n\t// \t\tquery: { ...defaultConfig.query, ...this.config.query, ...queryConfig },\n\t// \t};\n\n\t// \t// @ts-expect-error type of Query is incorrect\n\t// \treturn queryPipeline(query, qConfig, this.schema, handles);\n\t// };\n\n\tquery = async (query: RawBQLQuery | RawBQLQuery[], queryConfig?: QueryConfig) => {\n\t\tawait this.#enforceConnection();\n\n\t\tconst qConfig = {\n\t\t\t...this.config,\n\t\t\tquery: {\n\t\t\t\t...defaultConfig.query,\n\t\t\t\t...this.config.query,\n\t\t\t\t...queryConfig,\n\t\t\t},\n\t\t};\n\t\tconst isBatched = Array.isArray(query);\n\t\tconst queries = isBatched ? query : [query];\n\n\t\tconst [errorRes, res] = await tryit(runQueryMachine)(\n\t\t\tqueries,\n\t\t\tthis.schema as EnrichedBormSchema,\n\t\t\tqConfig,\n\t\t\tthis.dbHandles as DBHandles,\n\t\t);\n\t\tif (errorRes) {\n\t\t\t//@ts-expect-error - errorRes has error. Also no idea where the error: comes from\n\t\t\tconst error = new Error(errorRes.error);\n\t\t\t//@ts-expect-error - errorRes has error. Also no idea where the error: comes from\n\t\t\terror.stack = errorRes.error.stack;\n\t\t\tthrow error;\n\t\t}\n\n\t\tconst result = res.bql.res as BQLResponse[];\n\n\t\treturn isBatched ? result : result[0];\n\t};\n\n\tmutate = async (mutation: BQLMutation, mutationConfig?: MutationConfig) => {\n\t\tawait this.#enforceConnection();\n\t\tconst mConfig = {\n\t\t\t...this.config,\n\t\t\tmutation: {\n\t\t\t\t...defaultConfig.mutation,\n\t\t\t\t...this.config.mutation,\n\t\t\t\t...mutationConfig,\n\t\t\t},\n\t\t};\n\n\t\tconst [errorRes, res] = await tryit(runMutationMachine)(\n\t\t\tmutation,\n\t\t\tthis.schema as EnrichedBormSchema,\n\t\t\tmConfig,\n\t\t\tthis.dbHandles as DBHandles,\n\t\t);\n\t\tif (errorRes) {\n\t\t\t//console.error(errorRes.error.stack.split('\\n').slice(0, 4).join('\\n'));\n\t\t\t//@ts-expect-error - errorRes has error. Also no idea where the error: comes from\n\t\t\tconst error = new Error(errorRes.error.message);\n\t\t\t//@ts-expect-error - errorRes has error. Also no idea where the error: comes from\n\t\t\terror.stack = errorRes.error.stack;\n\t\t\tthrow error;\n\t\t}\n\n\t\tconst result = res.bql.res;\n\n\t\treturn result as BQLResponseMulti;\n\t};\n\n\tclose = async () => {\n\t\tif (!this.dbHandles) {\n\t\t\treturn;\n\t\t}\n\t\t//todo: probably migrate dbHandles to be an array, where each handle has .type=\"typeDB\" for instance\n\t\tthis.dbHandles.typeDB?.forEach(async ({ client, session }) => {\n\t\t\tif (session.isOpen()) {\n\t\t\t\tawait session.close();\n\t\t\t}\n\t\t\tawait client.close();\n\t\t});\n\t\t// TODO: Close SurrealDB clients.\n\t\t// Currently there's no `close()` method in the client.\n\t\t// See https://github.com/surrealdb/surrealdb.node/issues/36\n\t};\n}\n\nexport default BormClient;\n","import type { EnrichedLinkField, EnrichedRoleField } from '../../../../types';\nimport { SharedMetadata } from '../../../../types/symbols';\n\nexport const getOppositePlayers = (field: string, fieldSchema: EnrichedLinkField | EnrichedRoleField) => {\n\tif (fieldSchema[SharedMetadata].fieldType === 'linkField') {\n\t\tconst linkFieldSchema = fieldSchema as EnrichedLinkField;\n\t\tconst oppositePlayer = linkFieldSchema.oppositeLinkFieldsPlayedBy;\n\t\tif (oppositePlayer?.length !== 1) {\n\t\t\tthrow new Error(`[Internal] Field ${field} should have a single player`);\n\t\t} else if (!oppositePlayer?.length) {\n\t\t\tthrow new Error(`[Internal] Field ${field} should have a player`);\n\t\t}\n\t\treturn oppositePlayer;\n\t} else if (fieldSchema[SharedMetadata].fieldType === 'roleField') {\n\t\tconst roleFieldSchema = fieldSchema as EnrichedRoleField;\n\t\tif ([...new Set(roleFieldSchema.playedBy?.map((x) => x.thing))]?.length !== 1) {\n\t\t\tthrow new Error(`[Internal] Field ${field} should have a single player`);\n\t\t} else if (!roleFieldSchema.playedBy?.length) {\n\t\t\tthrow new Error(`[Internal] Field ${field} should have a player`);\n\t\t}\n\t\treturn roleFieldSchema.playedBy;\n\t} else {\n\t\tthrow new Error(`[Internal] Field ${field} is not a linkField or roleField`);\n\t}\n};\n","/* eslint-disable no-param-reassign */\nimport { isArray, isObject } from 'radash';\nimport type { BQLMutationBlock, EnrichedLinkField, EnrichedRefField, EnrichedRoleField } from '../../../../types';\nimport { getOppositePlayers } from '../shared/getOppositePlayers';\nimport { nanoid } from 'nanoid';\n\nexport const replaceToObj = (\n\tnode: BQLMutationBlock,\n\tfield: string,\n\tfieldSchema: EnrichedLinkField | EnrichedRoleField,\n) => {\n\tconst subNodes = isArray(node[field]) ? node[field] : [node[field]];\n\n\t/// Only objects, is fine\n\tif (subNodes.every((child: unknown) => typeof child === 'object')) {\n\t\treturn;\n\t\t///all strings, then we proceed to replace\n\t} else if (subNodes.every((child: unknown) => typeof child === 'string')) {\n\t\tconst oppositePlayers = getOppositePlayers(field, fieldSchema);\n\t\tconst [player] = oppositePlayers;\n\n\t\t//if parent === create, then is a link\n\t\tconst $op = node.$op === 'create' ? 'link' : 'replace';\n\t\tconst $thing = player.thing;\n\t\tconst $thingType = player.thingType;\n\n\t\t//todo _: tempId included in the array, or as a single one of them\n\n\t\tconst base = {\n\t\t\t$op,\n\t\t\t$thing,\n\t\t\t$thingType,\n\t\t};\n\n\t\tconst tempIds = subNodes.filter((child: string) => child.startsWith('_:'));\n\t\tconst nonTempIds = subNodes.filter((child: string) => !child.startsWith('_:'));\n\n\t\tif (tempIds.length && !nonTempIds.length) {\n\t\t\t//only $tempIds\n\t\t\tnode[field] = tempIds.map((tempId: string) => ({\n\t\t\t\t...base,\n\t\t\t\t$tempId: tempId,\n\t\t\t\t$bzId: tempId,\n\t\t\t}));\n\t\t} else if (tempIds.length && nonTempIds.length) {\n\t\t\t//both\n\t\t\tnode[field] = [\n\t\t\t\t...tempIds.map((tempId: string) => ({\n\t\t\t\t\t...base,\n\t\t\t\t\t$tempId: tempId,\n\t\t\t\t\t$bzId: tempId,\n\t\t\t\t})),\n\t\t\t\t{\n\t\t\t\t\t...base,\n\t\t\t\t\t$id: nonTempIds,\n\t\t\t\t\t$bzId: `S_${nanoid()}`,\n\t\t\t\t},\n\t\t\t];\n\t\t} else {\n\t\t\t//only $ids\n\t\t\tnode[field] = {\n\t\t\t\t...base,\n\t\t\t\t$id: node[field],\n\t\t\t\t$bzId: `S_${nanoid()}`,\n\t\t\t};\n\t\t}\n\t} else {\n\t\tthrow new Error(\n\t\t\t`[Mutation Error] Replace can only be used with a single id or an array of ids. (Field: ${field} Nodes: ${JSON.stringify(subNodes)} Parent: ${JSON.stringify(node, null, 2)})`,\n\t\t);\n\t}\n};\n\n//todo: This is not doing any replaces, just checking the format, should be cleaned to do it\nexport const replaceToObjRef = (node: BQLMutationBlock, field: string, fieldSchema: EnrichedRefField) => {\n\tconst subNodes = isArray(node[field]) ? node[field] : [node[field]];\n\tif (fieldSchema.contentType === 'REF') {\n\t\tif (subNodes.some((sn) => !isObject(sn))) {\n\t\t\tthrow new Error(\n\t\t\t\t\"[Wrong format] Field of contentType REF can't use strings as references\", //future: unless they are prefixed\n\t\t\t);\n\t\t}\n\t\treturn;\n\t}\n\n\tif (fieldSchema.contentType === 'FLEX') {\n\t\treturn;\n\t}\n\tthrow new Error(`[Internal] Field ${field} is not a refField`);\n};\n","import { getCurrentSchema, getCurrentFields } from '../../../../helpers';\nimport type { BQLMutationBlock, EnrichedBormSchema, BormOperation } from '../../../../types';\nimport { isArray } from 'radash';\n\nexport const validateOp = (parentNode: BQLMutationBlock, node: BQLMutationBlock, schema: EnrichedBormSchema) => {\n\tif (node.$op) {\n\t\t// $op validations /// Order: most specific to least specific\n\t\tif (node.$op === 'create' && node.$id) {\n\t\t\tthrow new Error(\"[Wrong format] Can't write to computed field $id. Try writing to the id field directly.\");\n\t\t}\n\t\tif (['unlink', 'delete', 'update'].includes(node.$op) && parentNode.$op === 'create') {\n\t\t\tthrow new Error(`[Wrong format] Cannot ${node.$op} under a create`);\n\t\t}\n\n\t\tconst nodeSchema = getCurrentSchema(schema, node);\n\t\tconst { usedDataFields } = getCurrentFields(nodeSchema, node);\n\n\t\tif (node.$op === 'delete' && usedDataFields.length > 0) {\n\t\t\t//linkFields can be updated, for instance nested deletions\n\t\t\tthrow new Error('[Wrong format] Cannot update on deletion');\n\t\t}\n\t\tif (['unlink', 'link'].includes(node.$op) && usedDataFields.length > 0) {\n\t\t\t//linkFields can be updated, for instance nested unlinks\n\t\t\tthrow new Error(\"[Unsupported] Can't update fields on Link / Unlink\");\n\t\t}\n\t\treturn node.$op as BormOperation;\n\t}\n};\n\nexport const validateChildren = (parentNode: BQLMutationBlock, node: BQLMutationBlock, schema: EnrichedBormSchema) => {\n\tconst subNodes = isArray(node) ? node : [node];\n\tsubNodes.forEach((subNode) => {\n\t\tvalidateOp(parentNode, subNode, schema);\n\t});\n};\n","import { getCurrentSchema, getCurrentFields } from '../../../../helpers';\nimport type { BQLMutationBlock, EnrichedBormSchema, BormOperation } from '../../../../types';\nimport { validateOp } from './validateOp';\n\nexport const getOp = (node: BQLMutationBlock): BormOperation => {\n\tconst usedFields = Object.keys(node).filter((key) => !(key.startsWith('$') || key.startsWith('%')));\n\n\tif (node.$op) {\n\t\treturn node.$op as BormOperation;\n\t} else {\n\t\tif (node.$id || node.$filter) {\n\t\t\tif (usedFields.length > 0) {\n\t\t\t\treturn 'update';\n\t\t\t} else {\n\t\t\t\treturn 'link';\n\t\t\t}\n\t\t} else if (node.$tempId) {\n\t\t\tif (usedFields.length > 0) {\n\t\t\t\treturn 'create'; //only difference is $id + stuff means update, while $tempIds are usually for creation and recovering it later from the res\n\t\t\t} else {\n\t\t\t\treturn 'link';\n\t\t\t}\n\t\t} else {\n\t\t\treturn 'create';\n\t\t}\n\t}\n};\n\nexport const getOpAndValidate = (\n\tparentNode: BQLMutationBlock,\n\tnode: BQLMutationBlock,\n\tschema: EnrichedBormSchema,\n): BormOperation => {\n\tconst nodeSchema = getCurrentSchema(schema, node);\n\tconst { usedFields } = getCurrentFields(nodeSchema, node);\n\n\tif (node.$op) {\n\t\tvalidateOp(parentNode, node, schema);\n\t\treturn node.$op as BormOperation;\n\t} else {\n\t\tif (node.$id || node.$filter) {\n\t\t\tif (usedFields.length > 0) {\n\t\t\t\tvalidateOp(parentNode, { ...node, $op: 'update' }, schema);\n\t\t\t\treturn 'update';\n\t\t\t} else {\n\t\t\t\tvalidateOp(parentNode, { ...node, $op: 'link' }, schema);\n\t\t\t\treturn 'link';\n\t\t\t}\n\t\t} else if (node.$tempId) {\n\t\t\tif (usedFields.length > 0) {\n\t\t\t\tvalidateOp(parentNode, { ...node, $op: 'create' }, schema);\n\t\t\t\treturn 'create'; //only difference is $id + stuff means update, while $tempIds are usually for creation and recovering it later from the res\n\t\t\t} else {\n\t\t\t\tvalidateOp(parentNode, { ...node, $op: 'create' }, schema);\n\t\t\t\treturn 'link';\n\t\t\t}\n\t\t} else {\n\t\t\tvalidateOp(parentNode, { ...node, $op: 'create' }, schema);\n\t\t\treturn 'create';\n\t\t}\n\t}\n};\n","import { isArray } from 'radash';\nimport type { BQLMutationBlock, EnrichedBormSchema } from '../../../../types';\nimport { getOpAndValidate } from '../shared/getOp';\nimport { genId, getThingType } from '../../../../helpers';\n\nexport const setRootMeta = (node: { $root: BQLMutationBlock | BQLMutationBlock[] }, schema: EnrichedBormSchema) => {\n\tconst rootArray = isArray(node.$root) ? node.$root : [node.$root];\n\n\tconst withMetadataRootArray = rootArray.map((rootNode) => {\n\t\tconst rootOp = getOpAndValidate(rootNode, rootNode, schema);\n\n\t\tconst withMetadata = {\n\t\t\t...(rootNode.$thing ? {} : { $thing: rootNode.$entity || rootNode.$relation }),\n\t\t\t...(rootNode.$thingType ? {} : { $thingType: getThingType(rootNode, schema) }),\n\t\t\t...(rootNode.$op ? {} : { $op: rootOp }),\n\t\t\t...(rootNode.$bzId ? {} : { $bzId: `R_${genId()}` }),\n\t\t};\n\t\t// eslint-disable-next-line no-param-reassign\n\t\treturn { ...withMetadata, ...rootNode };\n\t});\n\t// eslint-disable-next-line no-param-reassign\n\tnode.$root = isArray(node.$root) ? withMetadataRootArray : withMetadataRootArray[0];\n};\n","import { isArray, isObject } from 'radash';\nimport { deepCurrent, getCurrentSchema, getSymbols } from '../../../../helpers';\nimport type { BQLMutationBlock, EnrichedBQLMutationBlock, EnrichedBormSchema } from '../../../../types';\nimport { doAction } from '../shared/doActions';\n\nexport const splitMultipleIds = (node: BQLMutationBlock, field: string, schema: EnrichedBormSchema) => {\n\tif (doAction('split_ids', node)) {\n\t\t//insert here\n\t\tconst transformedChildren = (isArray(node[field]) ? node[field] : [node[field]]).flatMap(\n\t\t\t(child: EnrichedBQLMutationBlock) => {\n\t\t\t\tif (isObject(child) && '$id' in child && isArray(child['$id'])) {\n\t\t\t\t\tconst subNode = child as EnrichedBQLMutationBlock & { $id: string[] };\n\t\t\t\t\t/*const childSchema =*/ getCurrentSchema(schema, subNode);\n\t\t\t\t\t/// Depending on the DB this operation is required or not\n\t\t\t\t\tif (!subNode.$bzId) {\n\t\t\t\t\t\tthrow new Error('[Internal Error] No bzId found');\n\t\t\t\t\t}\n\t\t\t\t\t// eslint-disable-next-line no-constant-condition\n\t\t\t\t\tif (/*childSchema.dbContext.mutation?.splitArray$Ids*/ true) {\n\t\t\t\t\t\treturn subNode.$id.map(($id: string, i: number) => ({\n\t\t\t\t\t\t\t...deepCurrent(subNode), //structured clone generates a weird bug with traverse, so not using it\n\t\t\t\t\t\t\t$id: $id,\n\t\t\t\t\t\t\t$bzId: `${subNode.$bzId}_${i}`,\n\t\t\t\t\t\t\t...getSymbols(subNode),\n\t\t\t\t\t\t}));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn child;\n\t\t\t},\n\t\t);\n\t\t// if we splitted something, then reassign\n\t\tif (transformedChildren.length > 0 && isArray(node[field]) ? node[field] : [node[field]].length) {\n\t\t\t// eslint-disable-next-line no-param-reassign\n\t\t\tnode[field] = transformedChildren;\n\t\t}\n\t}\n};\n","import { isSet } from 'util/types';\nimport { StepPrint } from '../../../../types/symbols';\n\nexport const doAction = (stepName: string, block: Record<string | symbol | number, any>) => {\n\tconst current = block[StepPrint];\n\tif (!isSet(current)) {\n\t\tReflect.set(block, StepPrint, new Set(['clean']));\n\t\treturn true;\n\t} else if (!current.has('clean')) {\n\t\treturn false;\n\t} else {\n\t\tReflect.set(block, StepPrint, current.add('clean'));\n\t\treturn true;\n\t}\n};\n","/* eslint-disable no-param-reassign */\nimport { isArray, isObject } from 'radash';\nimport type {\n\tBQLMutationBlock,\n\tEnrichedBormSchema,\n\tEnrichedBQLMutationBlock,\n\tEnrichedLinkField,\n\tEnrichedRefField,\n\tEnrichedRoleField,\n} from '../../../../types';\nimport { EdgeSchema, SharedMetadata } from '../../../../types/symbols';\nimport { getOp } from '../shared/getOp';\nimport { getOppositePlayers } from '../shared/getOppositePlayers';\nimport { get$bzId } from '../shared/get$bzId';\n\nexport const enrichChildren = (\n\tnode: BQLMutationBlock,\n\tfield: string,\n\tfieldSchema: EnrichedLinkField | EnrichedRoleField | EnrichedRefField,\n\tschema: EnrichedBormSchema,\n) => {\n\tconst newNodes = (isArray(node[field]) ? node[field] : [node[field]]).flatMap((subNode: EnrichedBQLMutationBlock) => {\n\t\tif (!fieldSchema) {\n\t\t\tthrow new Error(`[Internal] No fieldSchema found in ${JSON.stringify(fieldSchema)}`);\n\t\t}\n\n\t\tconst $op = getOp(subNode);\n\t\tconst $bzId = get$bzId(subNode);\n\n\t\tif (fieldSchema[SharedMetadata].fieldType === 'refField') {\n\t\t\tconst refSchema = fieldSchema as EnrichedRefField;\n\n\t\t\tif (!isObject(subNode)) {\n\t\t\t\tif (refSchema.contentType === 'FLEX') {\n\t\t\t\t\treturn subNode;\n\t\t\t\t}\n\t\t\t\tthrow new Error(`[Wrong format] The refField ${field} must receive an object`);\n\t\t\t}\n\n\t\t\tif (!subNode.$thing) {\n\t\t\t\tthrow new Error('[Wrong format] The field $thing is required in refFields');\n\t\t\t}\n\t\t\treturn { ...subNode, $op, $bzId };\n\t\t}\n\n\t\tconst relationSchema = fieldSchema as EnrichedRoleField | EnrichedLinkField;\n\n\t\tif (relationSchema.$things.length === 0) {\n\t\t\t//todo: maybe add all the potential $things to a ref field?\n\t\t\tthrow new Error(`[Internal error] The field ${field} can't be played by any thing.`);\n\t\t}\n\n\t\tconst relFieldSchema = fieldSchema as EnrichedRoleField | EnrichedLinkField;\n\n\t\tif (relFieldSchema.$things.length === 1) {\n\t\t\tconst oppositePlayers = getOppositePlayers(field, relationSchema);\n\t\t\tconst [player] = oppositePlayers;\n\n\t\t\tif (subNode.$thing && subNode.$thing !== player.thing) {\n\t\t\t\tthrow new Error(`[Wrong format] The field ${field} can only be played by ${player.thing}.`);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...subNode,\n\t\t\t\t[EdgeSchema]: relFieldSchema,\n\t\t\t\t$thing: player.thing,\n\t\t\t\t$thingType: player.thing in schema.entities ? 'entity' : 'relation',\n\t\t\t\t$op,\n\t\t\t\t$bzId,\n\t\t\t};\n\t\t}\n\t\tif (relFieldSchema.$things.length > 1) {\n\t\t\tif (subNode.$thing) {\n\t\t\t\treturn [\n\t\t\t\t\t{\n\t\t\t\t\t\t...subNode,\n\t\t\t\t\t\t[EdgeSchema]: relFieldSchema,\n\t\t\t\t\t\t$thing: subNode.$thing,\n\t\t\t\t\t\t$thingType: subNode.$thing in schema.entities ? 'entity' : 'relation',\n\t\t\t\t\t\t$op,\n\t\t\t\t\t\t$bzId,\n\t\t\t\t\t},\n\t\t\t\t];\n\t\t\t}\n\t\t\tif (!subNode.$thing) {\n\t\t\t\tif (subNode.$tempId) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t'[Unsupported] Objects with $tempId and multiple potential players require to explicitly indicate the $thing type.',\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif ($op === 'create') {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`[Wrong format] The field ${field} can be played by multiple things, please specify one on creation.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn relFieldSchema.$things.map((thing) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...subNode,\n\t\t\t\t\t\t[EdgeSchema]: relFieldSchema,\n\t\t\t\t\t\t$thing: thing,\n\t\t\t\t\t\t$thingType: thing in schema.entities ? 'entity' : 'relation',\n\t\t\t\t\t\t$op,\n\t\t\t\t\t\t$bzId: get$bzId(subNode, thing),\n\t\t\t\t\t\t//[QueryContext]: { ...subNode[QueryContext], $multiThing: true }, //multiThing is used so the arcs of this manual split are merged in a single arc\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\t//#endregion nested nodes\n\t});\n\n\tif (isArray(node[field])) {\n\t\tnode[field] = newNodes;\n\t} else {\n\t\tif (newNodes.length > 1) {\n\t\t\t//we might have added deduplicated things\n\t\t\tnode[field] = newNodes;\n\t\t} else {\n\t\t\t// eslint-disable-next-line prefer-destructuring\n\t\t\tnode[field] = newNodes[0];\n\t\t}\n\t}\n\n\tnode[field] = isArray(node[field]) ? newNodes : newNodes[0];\n};\n","import { isArray } from 'radash';\nimport { genId } from '../../../../helpers';\nimport type { BQLMutationBlock } from '../../../../types';\n\nexport const get$bzId = (node: BQLMutationBlock, thing?: string) => {\n\tif (node.$bzId) {\n\t\treturn node.$bzId;\n\t}\n\tif (node.$tempId) {\n\t\treturn node.$tempId;\n\t}\n\t// particular case, where we have a single $id, which is unique per $things so no need to generate multiple bzIds we can unify\n\tif (node.$id && !isArray(node.$id)) {\n\t\treturn thing ? `SN_ONE_${thing}_${node.$id}` : `SN_ONE_${node.$id}`; //also we add prefix SN_ONE as we know is cardinality ONE\n\t}\n\tif (node.$id && isArray(node.$id)) {\n\t\treturn thing ? `SN_MANY_${thing}_${genId()}` : `SN_MANY_${genId()}`; //also we add prefix SN_MANY as we know is cardinality MANY\n\t}\n\n\treturn `SM_${genId()}`;\n};\n","/* eslint-disable no-param-reassign */\nimport { isArray, listify } from 'radash';\nimport type {\n\tBQLMutationBlock,\n\tEnrichedBormSchema,\n\tEnrichedBQLMutationBlock,\n\tEnrichedDataField,\n} from '../../../../types';\nimport { getCurrentFields, getCurrentSchema, oFind } from '../../../../helpers';\nimport { computeField } from '../../../../engine/compute';\n\nexport const computeFields = (node: BQLMutationBlock, field: string, schema: EnrichedBormSchema) => {\n\tconst currentNode = node[field] as EnrichedBQLMutationBlock;\n\tif (!currentNode) {\n\t\treturn;\n\t}\n\t(isArray(currentNode) ? currentNode : [currentNode]).forEach((subNode: EnrichedBQLMutationBlock) => {\n\t\tif (subNode.$op !== 'create') {\n\t\t\treturn;\n\t\t}\n\t\tconst currentSchema = getCurrentSchema(schema, subNode);\n\t\tconst { unidentifiedFields } = getCurrentFields(currentSchema, subNode);\n\t\tconst { computedFields, virtualFields } = currentSchema;\n\n\t\t//@ts-expect-error - TODO\n\t\tconst filledFields = listify(subNode, (attKey, v) => (v !== undefined ? attKey : undefined)) as string[];\n\t\t/// if at least one of the filled fields is virtual, then throw error\n\t\tconst virtualFilledFields = filledFields.filter((x) => virtualFields?.includes(x));\n\t\tif (virtualFilledFields.length > 0) {\n\t\t\tthrow new Error(`Virtual fields can't be sent to DB: \"${virtualFilledFields.join(',')}\"`);\n\t\t}\n\t\tconst missingComputedFields = computedFields.filter((x) => !filledFields.includes(x));\n\n\t\t// fill computed values\n\t\tmissingComputedFields.forEach((fieldPath) => {\n\t\t\tconst currentFieldDef = currentSchema.dataFields?.find((x) => x.path === fieldPath);\n\t\t\tconst currentLinkDef = currentSchema.linkFields?.find((x) => x.path === fieldPath);\n\t\t\t// todo: multiple playedBy\n\t\t\tconst currentLinkedDef = currentLinkDef?.oppositeLinkFieldsPlayedBy[0];\n\n\t\t\tconst currentRoleDef =\n\t\t\t\t'roles' in currentSchema ? oFind(currentSchema.roles, (k, _v) => k === fieldPath) : undefined;\n\t\t\tconst currentDef = currentFieldDef || currentLinkedDef || currentRoleDef;\n\t\t\tif (!currentDef) {\n\t\t\t\tthrow new Error(`no field Def for ${fieldPath}`);\n\t\t\t}\n\n\t\t\t// We generate the other default fields if they are not defined. We ignore the id field which was created before for $id\n\t\t\tif (!subNode[fieldPath]) {\n\t\t\t\tconst defaultValue = computeField({\n\t\t\t\t\tcurrentThing: subNode,\n\t\t\t\t\tfieldSchema: currentDef as EnrichedDataField, //id is always a datafield.\n\t\t\t\t\tmandatoryDependencies: true, //can't send to db without every dependency being there\n\t\t\t\t});\n\n\t\t\t\tsubNode[fieldPath] = defaultValue;\n\t\t\t}\n\t\t});\n\n\t\tif (unidentifiedFields.length > 0) {\n\t\t\tthrow new Error(`Unknown fields: [${unidentifiedFields.join(',')}] in ${JSON.stringify(subNode)}`);\n\t\t}\n\t});\n\treturn node;\n};\n","import * as acorn from 'acorn';\n\nconst STRIP_COMMENTS = /((\\/\\/.*$)|(\\/\\*[\\s\\S]*?\\*\\/))/gm;\nconst STRIP_KEYWORDS = /(\\s*async\\s*|\\s*function\\s*|\\s*\\(\\s*|\\s*\\)\\s*=>|\\s*\\)\\s*\\{)/;\n\nexport const getParamNames = (func: (...args: any[]) => any): string[] => {\n\tconst fnStr: string = func.toString().replace(STRIP_COMMENTS, '').trim();\n\t// Remove function keywords and split at the first => or { to isolate parameters\n\tconst fnBodyStr: string = fnStr.split('=>')[0].split('{')[0].replace(STRIP_KEYWORDS, '').trim();\n\tconst paramsBlock = fnBodyStr.substring(fnBodyStr.indexOf('(') + 1, fnBodyStr.lastIndexOf(')')).trim();\n\n\tif (!paramsBlock) {\n\t\treturn [];\n\t}\n\n\t// Match including destructured parameters with special characters\n\tconst paramsMatch = paramsBlock.match(/(\\{[^}]*\\}|[^,]+)/g) || [];\n\n\treturn paramsMatch\n\t\t.flatMap((param) => {\n\t\t\t// Remove leading/trailing braces and split based on comma outside of quotes\n\t\t\tif (param.includes('{') && param.includes('}')) {\n\t\t\t\tconst destructuredParams = param.replace(/^\\{|\\}$/g, '').match(/(?:[^,\"']+|\"[^\"]*\"|'[^']*')+/g) || [];\n\t\t\t\treturn destructuredParams.map((p) =>\n\t\t\t\t\tp\n\t\t\t\t\t\t.split(':')[0]\n\t\t\t\t\t\t.trim()\n\t\t\t\t\t\t.replace(/['\"[\\]]/g, ''),\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn param.trim();\n\t\t})\n\t\t.filter(Boolean);\n};\n\nexport const getDependencies = (fn: (...args: any[]) => void) => {\n\tconst code = fn.toString();\n\tconst ast = acorn.parse(code, { ecmaVersion: 2020 });\n\tlet current: string[] = [];\n\tlet parent: string[] = [];\n\tlet context: string[] = [];\n\tconst statement = ast.body.find((i) => i.type === 'ExpressionStatement') as acorn.ExpressionStatement | undefined;\n\tif (statement) {\n\t\tconst fn = statement.expression;\n\t\tif (fn.type === 'ArrowFunctionExpression' || fn.type === 'FunctionExpression') {\n\t\t\tconst [cur, par, ctx] = fn.params;\n\t\t\tcurrent = getKeys(cur);\n\t\t\tparent = getKeys(par);\n\t\t\tcontext = getKeys(ctx);\n\t\t}\n\t}\n\treturn { current, parent, context };\n};\n\nconst getKeys = (pat?: acorn.Pattern): string[] => {\n\tconst keys: string[] = [];\n\tif (pat?.type === 'ObjectPattern') {\n\t\tpat?.properties?.forEach((p) => {\n\t\t\tif (p.type === 'Property') {\n\t\t\t\tif (p.key.type === 'Identifier') {\n\t\t\t\t\tkeys.push(p.key.name);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\treturn keys;\n};\n","import type { BQLMutationBlock, EnrichedDataField } from '../types';\nimport { getParamNames } from './helpers';\n\nexport const computeField = ({\n\tcurrentThing,\n\tfieldSchema,\n\tmandatoryDependencies = false,\n}: {\n\tcurrentThing: BQLMutationBlock;\n\tfieldSchema?: EnrichedDataField;\n\tmandatoryDependencies?: boolean;\n}) => {\n\tif (!fieldSchema || !fieldSchema.default || !('fn' in fieldSchema.default || 'value' in fieldSchema.default)) {\n\t\tthrow new Error(\n\t\t\t`[Internal] Virtual field: No field schema found, or wrongly configured. Field: ${JSON.stringify(fieldSchema, null, 3)}`,\n\t\t);\n\t}\n\n\t//check if all the args are in the entity, if not, throw a missing error with all the not present ones\n\n\tif (fieldSchema.default.type === 'value') {\n\t\treturn fieldSchema.default.value;\n\t}\n\n\tif (mandatoryDependencies) {\n\t\tconst { fn } = fieldSchema.default;\n\n\t\tconst args = getParamNames(fn);\n\t\tconst missingArgs = args.filter((arg) => !(arg in currentThing));\n\n\t\tif (missingArgs.length) {\n\t\t\tthrow new Error(`Virtual field: Missing arguments ${missingArgs.join(', ')}`);\n\t\t}\n\t}\n\tif (!fieldSchema.default.fn) {\n\t\tthrow new Error('[Schema] No fn in default field schema');\n\t}\n\tif ('default' in fieldSchema) {\n\t\t//@ts-expect-error can't find the issue, all subtypes have a value type, and a fn type\n\t\tif (fieldSchema.default.type === 'value') {\n\t\t\t//@ts-expect-error can't find the issue, all subtypes have a value type, and a fn type\n\t\t\treturn fieldSchema.default.value;\n\t\t}\n\t\tif (fieldSchema.default.type === 'fn') {\n\t\t\treturn fieldSchema.default.fn(currentThing);\n\t\t}\n\n\t\tthrow new Error('[Schema] No default field definition');\n\t}\n};\n\nexport const computeNode = () => {};\n","import { getCurrentSchema, capitalizeFirstLetter } from '../../../../helpers';\nimport type { FilledBQLMutationBlock, EnrichedBormSchema, Hooks, BormTrigger, Action } from '../../../../types';\n\nexport const getTriggeredActions = (node: FilledBQLMutationBlock, schema: EnrichedBormSchema) => {\n\tconst hooks = getCurrentSchema(schema, node).hooks as Hooks;\n\tif (hooks?.pre) {\n\t\tconst currentEvent = `on${capitalizeFirstLetter(node.$op)}` as BormTrigger;\n\t\tconst currentHooks = hooks.pre.filter((hook) => !hook.triggers || hook.triggers[currentEvent]?.()); //No triggers triggers everything\n\t\tconst actions = currentHooks.flatMap((hook) => hook.actions);\n\t\treturn actions;\n\t}\n\treturn [] as Action[];\n};\n","/* eslint-disable no-param-reassign */\nimport { clone, isArray, isObject } from 'radash';\nimport type { BormConfig, EnrichedBQLMutationBlock, EnrichedBormSchema } from '../../../../types';\nimport { deepCurrent, getCurrentSchema } from '../../../../helpers';\nimport { getTriggeredActions } from '../shared/getTriggeredActions';\nimport { DBNode } from '../../../../types/symbols';\n\nexport const preHookValidations = (\n\tnode: EnrichedBQLMutationBlock,\n\tfield: string,\n\tschema: EnrichedBormSchema,\n\tconfig: BormConfig,\n) => {\n\tconst subNodes = isArray(node[field]) ? node[field] : [node[field]];\n\tsubNodes.forEach((subNode: EnrichedBQLMutationBlock) => {\n\t\tif ('$thing' in subNode) {\n\t\t\tif (subNode.$fields) {\n\t\t\t\t///change machine context so we are sun we run preQueryDeps before coming back to here\n\t\t\t\treturn subNode;\n\t\t\t}\n\n\t\t\tconst { requiredFields, enumFields, fnValidatedFields, dataFields } = getCurrentSchema(schema, subNode);\n\n\t\t\t/// Required fields\n\t\t\tif ('$op' in subNode && subNode.$op === 'create') {\n\t\t\t\trequiredFields.forEach((field) => {\n\t\t\t\t\tif (!(field in subNode)) {\n\t\t\t\t\t\tthrow new Error(`[Validations] Required field \"${field}\" is missing.`);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\t/// Enums\n\t\t\tif (('$op' in subNode && subNode.$op === 'update') || subNode.$op === 'create') {\n\t\t\t\tenumFields.forEach((field) => {\n\t\t\t\t\tif (field in subNode) {\n\t\t\t\t\t\tconst enumOptions = dataFields?.find((df) => df.path === field)?.validations?.enum;\n\t\t\t\t\t\tif (!enumOptions) {\n\t\t\t\t\t\t\tthrow new Error(`[Validations] Enum field \"${field}\" is missing enum options.`);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (isArray(subNode[field])) {\n\t\t\t\t\t\t\tsubNode[field].some((val: any) => {\n\t\t\t\t\t\t\t\tif (!enumOptions.includes(val)) {\n\t\t\t\t\t\t\t\t\tthrow new Error(`[Validations] Option \"${val}\" is not a valid option for field \"${field}\".`);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else if (enumOptions && !enumOptions.includes(subNode[field])) {\n\t\t\t\t\t\t\tthrow new Error(`[Validations] Option \"${subNode[field]}\" is not a valid option for field \"${field}\".`);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\t/// fn\n\t\t\tif (('$op' in subNode && subNode.$op === 'update') || subNode.$op === 'create') {\n\t\t\t\tfnValidatedFields.forEach((field: string) => {\n\t\t\t\t\tif (field in subNode) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst fn = dataFields?.find((df) => df.path === field)?.validations?.fn;\n\t\t\t\t\t\t\tif (!fn) {\n\t\t\t\t\t\t\t\tthrow new Error('Missing validation function.');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// @ts-expect-error - TODO\n\t\t\t\t\t\t\tif (!fn(subNode[field])) {\n\t\t\t\t\t\t\t\tthrow new Error('Failed validation function.');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch (error: any) {\n\t\t\t\t\t\t\tthrow new Error(`[Validations:attribute:${field}] ${error.message}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t/// Node validations\n\t\t\tif (isObject(subNode) && '$thing' in subNode) {\n\t\t\t\tconst currentThing = subNode.$thing;\n\t\t\t\tconst value = subNode as EnrichedBQLMutationBlock;\n\n\t\t\t\tconst parentNode = clone(deepCurrent(node));\n\t\t\t\tconst currentNode = clone(deepCurrent(value));\n\t\t\t\tconst userContext = (config.mutation?.context || {}) as Record<string, any>;\n\t\t\t\tconst dbNode = clone(deepCurrent<EnrichedBQLMutationBlock | Record<string, never>>(subNode[DBNode] || {})) as\n\t\t\t\t\t| EnrichedBQLMutationBlock\n\t\t\t\t\t| Record<string, never>;\n\n\t\t\t\tconst triggeredActions = getTriggeredActions(value, schema);\n\t\t\t\ttriggeredActions.forEach((action) => {\n\t\t\t\t\tif (action.type === 'validate') {\n\t\t\t\t\t\tif (action.severity !== 'error') {\n\t\t\t\t\t\t\treturn; // in borm we only use the errors\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t//! Todo: Sandbox the function in nodeCompute() instead of the existing fieldCompute()\n\t\t\t\t\t\t\tconst validationResult = action.fn(currentNode, parentNode, userContext, dbNode);\n\n\t\t\t\t\t\t\tif (validationResult === false) {\n\t\t\t\t\t\t\t\tthrow new Error(`${action.message}.`);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (validationResult !== true) {\n\t\t\t\t\t\t\t\tthrow new Error(\"Validation function's output is not a boolean value.\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch (error: any) {\n\t\t\t\t\t\t\tthrow new Error(`[Validations:thing:${currentThing}] ${error.message}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t});\n};\n","/* eslint-disable no-param-reassign */\nimport { clone, isArray } from 'radash';\nimport type { BormConfig, EnrichedBormSchema, EnrichedBQLMutationBlock, TransFormAction } from '../../../../types';\nimport { deepCurrent, getSymbols, isBQLBlock } from '../../../../helpers';\nimport { getTriggeredActions } from '../shared/getTriggeredActions';\nimport { DBNode, IsTransformed } from '../../../../types/symbols';\n\nexport const preHookTransformations = (\n\tnode: EnrichedBQLMutationBlock,\n\tfield: string,\n\tschema: EnrichedBormSchema,\n\tconfig: BormConfig,\n) => {\n\tconst nodes = isArray(node[field]) ? node[field] : [node[field]];\n\n\tnodes.forEach((subNode: EnrichedBQLMutationBlock) => {\n\t\tif (!isBQLBlock(subNode)) {\n\t\t\treturn;\n\t\t}\n\n\t\t// @ts-expect-error todo\n\t\tif (subNode.$fields || subNode[IsTransformed]) {\n\t\t\t///todo: change machine context so we are sun we run preQueryDeps before coming back to here\n\t\t\treturn;\n\t\t}\n\n\t\tconst triggeredActions = getTriggeredActions(subNode, schema).filter(\n\t\t\t(action) => action.type === 'transform',\n\t\t) as TransFormAction[];\n\n\t\tconst parentNode = clone(deepCurrent(node)) as EnrichedBQLMutationBlock;\n\t\tlet workingNode = clone(deepCurrent(subNode)) as EnrichedBQLMutationBlock;\n\t\tconst userContext = (config.mutation?.context || {}) as Record<string, any>;\n\t\tconst dbNode = clone(\n\t\t\tdeepCurrent<EnrichedBQLMutationBlock | Record<string, never>>(subNode[DBNode] || subNode.$dbNode),\n\t\t) as EnrichedBQLMutationBlock | Record<string, never>;\n\n\t\ttriggeredActions.forEach((action) => {\n\t\t\tconst newProps = action.fn(workingNode, parentNode, userContext, dbNode || {});\n\t\t\tif (Object.keys(newProps).length === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Update working node to be used by next action\n\t\t\tworkingNode = { ...workingNode, ...newProps, ...getSymbols(subNode), [IsTransformed]: true };\n\n\t\t\t// Update the draft state in Immer\n\t\t\tObject.assign(subNode, workingNode);\n\t\t});\n\t});\n};\n","/* eslint-disable no-param-reassign */\nimport type { BQLMutationBlock, EnrichedLinkField, EnrichedRoleField } from '../../../../types';\nimport { EdgeSchema } from '../../../../types/symbols';\nimport { v4 as uuidv4 } from 'uuid';\nimport { getOppositePlayers } from '../shared/getOppositePlayers';\n\nexport const unlinkAll = (\n\tnode: BQLMutationBlock,\n\tfield: string,\n\tfieldSchema: EnrichedLinkField | EnrichedRoleField,\n) => {\n\tconst oppositePlayers = getOppositePlayers(field, fieldSchema);\n\tconst [player] = oppositePlayers;\n\n\tnode[field] = {\n\t\t$thing: player.thing,\n\t\t$thingType: player.thingType,\n\t\t$op: 'unlink',\n\t\t$bzId: `U_${uuidv4()}`,\n\t\t[EdgeSchema]: fieldSchema,\n\t};\n};\n","import type { EnrichedBQLMutationBlock } from '../../../../types';\n\nexport const dependenciesGuard = (mut: EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[]) => {\n\tif (Array.isArray(mut)) {\n\t\tfor (const o of mut) {\n\t\t\tif (dependenciesGuard(o)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\tif (mut.$fields) {\n\t\treturn true;\n\t}\n\n\tfor (const key in mut) {\n\t\tif (key.startsWith('$')) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst value = mut[key];\n\t\tif (value && typeof value === 'object' && dependenciesGuard(mut[key])) {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n};\n","/* eslint-disable no-param-reassign */\nimport { produce } from 'immer';\nimport type {\n\tBQLMutationBlock,\n\tEnrichedBormEntity,\n\tEnrichedBormRelation,\n\tRawBQLQuery,\n\tEnrichedBQLQuery,\n\tEnrichedBormSchema,\n\tEnrichedAttributeQuery,\n\tEnrichedLinkQuery,\n\tEnrichedRoleQuery,\n\tEnrichedDataField,\n\tEnrichedLinkField,\n\tEnrichedRoleField,\n\tFilter,\n\tEnrichedRefQuery,\n\tEnrichedRefField,\n} from '../../../types';\nimport { traverse } from 'object-traversal';\nimport { getCurrentSchema, getFieldType } from '../../../helpers';\nimport { isArray, isObject } from 'radash';\nimport { FieldSchema, QueryPath } from '../../../types/symbols';\n\nexport const enrichBQLQuery = (rawBqlQuery: RawBQLQuery[], schema: EnrichedBormSchema): EnrichedBQLQuery[] => {\n\tfor (const item of rawBqlQuery) {\n\t\tif (!('$entity' in item) && !('$relation' in item) && (!('$thing' in item) || !('$thingType' in item))) {\n\t\t\tthrow new Error('No entity specified in query');\n\t\t}\n\t}\n\n\tconst batches = Array.isArray(rawBqlQuery) ? rawBqlQuery : [rawBqlQuery];\n\n\t// TODO: The raw query and the enriched query have different type.\n\t// Instead of mutating the existing object (copy + mutate)\n\t// replace `produce` and `traverse` with a function that returns a new object.\n\t// This way we don't need to force the enriched query (RawBQLQuery that has been mutated)\n\t// to have type EnrichedBQLQuery, thus we get better type check.\n\tconst enriched = produce(batches, (draft: any) =>\n\t\ttraverse(draft, (context) => {\n\t\t\tconst { value: val, meta } = context;\n\t\t\tconst value: BQLMutationBlock = val;\n\n\t\t\tif (isObject(value)) {\n\t\t\t\t// Places to be skipped\n\t\t\t\tif (meta.nodePath?.includes('.$filter') || meta.nodePath?.includes('.$playedBy')) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// 0. Everytime we have some object we append its path\n\t\t\t\t//console.log('value!', value, 'path', meta.nodePath);\n\t\t\t\tvalue[QueryPath as any] = meta.nodePath;\n\n\t\t\t\t// 1. Moving $id into filter based on schema's idFields\n\t\t\t\tif (value.$id) {\n\t\t\t\t\tconst node = value.$entity || value.$relation ? value : { [`$${value.$thingType}`]: value.$thing };\n\t\t\t\t\tconst currentSchema = getCurrentSchema(schema, node);\n\t\t\t\t\tif (!currentSchema?.name) {\n\t\t\t\t\t\tthrow new Error(`Schema not found for ${value.$thing}`);\n\t\t\t\t\t}\n\t\t\t\t\tvalue.$path = currentSchema.name;\n\t\t\t\t\tif (!Array.isArray(value.$id)) {\n\t\t\t\t\t\tvalue.$filterByUnique = true;\n\t\t\t\t\t}\n\t\t\t\t\tif (currentSchema?.idFields?.length !== 1) {\n\t\t\t\t\t\tthrow new Error('Multiple ids not yet enabled / composite ids');\n\t\t\t\t\t}\n\t\t\t\t} else if ('$entity' in value || '$relation' in value || '$thing' in value) {\n\t\t\t\t\tconst currentSchema = getCurrentSchema(schema, value);\n\t\t\t\t\tif (!currentSchema?.name) {\n\t\t\t\t\t\tthrow new Error(`Schema not found for ${value.$thing}`);\n\t\t\t\t\t}\n\t\t\t\t\tvalue.$path = currentSchema.name;\n\t\t\t\t}\n\t\t\t\t// 2. Converting $entity or $relation into $thingType and $thing\n\t\t\t\tif (value.$entity) {\n\t\t\t\t\tvalue.$thing = value.$entity;\n\t\t\t\t\tvalue.$thingType = 'entity';\n\t\t\t\t\tdelete value.$entity;\n\t\t\t\t} else if (value.$relation) {\n\t\t\t\t\tvalue.$thing = value.$relation;\n\t\t\t\t\tvalue.$thingType = 'relation';\n\t\t\t\t\tdelete value.$relation;\n\t\t\t\t}\n\n\t\t\t\tif (isObject(value) && '$thing' in value && value.$thing) {\n\t\t\t\t\tconst node = value.$entity || value.$relation ? value : { [`$${value.$thingType}`]: value.$thing };\n\n\t\t\t\t\tconst currentSchema = getCurrentSchema(schema, node);\n\t\t\t\t\tif (value.$filter) {\n\t\t\t\t\t\tif (Object.keys(value.$filter).length === 0) {\n\t\t\t\t\t\t\tvalue.$filter = undefined;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvalue.$filter = enrichFilter(value.$filter, value.$thing, schema);\n\t\t\t\t\t\t\tvalue.$filterByUnique = checkFilterByUnique(value.$filter, currentSchema);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// if no fields, then it's all fields\n\t\t\t\t\tif (value.$fields) {\n\t\t\t\t\t\tconst idFieldIncluded = value.$fields.some((field: any) =>\n\t\t\t\t\t\t\tcurrentSchema?.idFields?.includes(field?.$path || field),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (!idFieldIncluded) {\n\t\t\t\t\t\t\tvalue.$fields = [\n\t\t\t\t\t\t\t\t...value.$fields,\n\t\t\t\t\t\t\t\t...(Array.isArray(currentSchema.idFields) ? currentSchema.idFields : []),\n\t\t\t\t\t\t\t];\n\t\t\t\t\t\t\tvalue.$idNotIncluded = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst newFields = value.$fields\n\t\t\t\t\t\t\t?.flatMap((field: any) => {\n\t\t\t\t\t\t\t\tconst processed = processField(field, currentSchema, schema);\n\t\t\t\t\t\t\t\tif (Array.isArray(processed)) {\n\t\t\t\t\t\t\t\t\treturn processed;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\treturn [processed];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.filter(Boolean);\n\t\t\t\t\t\tvalue.$fields = newFields;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst allFields = getAllFields(currentSchema);\n\t\t\t\t\t\tconst newFields = allFields\n\t\t\t\t\t\t\t?.flatMap((field: any) => {\n\t\t\t\t\t\t\t\tconst processed = processField(field, currentSchema, schema);\n\t\t\t\t\t\t\t\treturn Array.isArray(processed) ? processed : [processed];\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.filter(Boolean);\n\t\t\t\t\t\tvalue.$fields = newFields;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (value.$excludedFields) {\n\t\t\t\t\t\tvalue.$fields = value.$fields.filter((f: { $path: string }) => {\n\t\t\t\t\t\t\tif (isId(currentSchema, f)) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn !value.$excludedFields.includes(f.$path);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}),\n\t);\n\t//console.log('enriched', JSON.stringify(enriched));\n\n\treturn enriched as EnrichedBQLQuery[];\n};\n\nconst getAllFields = (currentSchema: EnrichedBormEntity | EnrichedBormRelation) => {\n\tconst dataFields = currentSchema.dataFields?.map((field: any) => field.path) || [];\n\tconst linkFields = currentSchema.linkFields?.map((field: any) => field.path) || [];\n\tconst roleFields = Object.keys((currentSchema as EnrichedBormRelation).roles || {}) || [];\n\tconst refFields = Object.keys(currentSchema.refFields || {}) || [];\n\tconst allFields = [...dataFields, ...linkFields, ...roleFields, ...refFields];\n\treturn allFields;\n};\n\nconst checkFilterByUnique = ($filter: any, currentSchema: EnrichedBormEntity | EnrichedBormRelation) => {\n\tconst fields = Object.keys($filter || {});\n\treturn fields.some((field) => {\n\t\tconst fieldFilter = $filter[field];\n\t\tif (fieldFilter !== null && typeof fieldFilter !== 'undefined') {\n\t\t\tconst isIdField = currentSchema.idFields?.includes(field);\n\t\t\tconst isUniqueDataField = currentSchema.dataFields?.some(\n\t\t\t\t(f) => (f.dbPath === field || f.path === field) && f?.validations?.unique,\n\t\t\t);\n\t\t\tconst isSingle$id = field === '$id' && !Array.isArray(fieldFilter);\n\n\t\t\tconst isUniqueField = isIdField || isUniqueDataField || isSingle$id;\n\n\t\t\tif (isUniqueField) {\n\t\t\t\t// Now check if the filter on the field is an equality filter\n\t\t\t\tif (typeof fieldFilter !== 'object' || fieldFilter === null || Array.isArray(fieldFilter)) {\n\t\t\t\t\t// fieldFilter is a scalar value, so consider equality\n\t\t\t\t\tif (!Array.isArray(fieldFilter)) {\n\t\t\t\t\t\t// Scalar value, equality filter\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Array of values, IN filter; not unique\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// fieldFilter is an object, check for $eq operator\n\t\t\t\t\tconst filterOperators = Object.keys(fieldFilter);\n\t\t\t\t\tif (filterOperators.length === 1 && filterOperators[0] === '$eq') {\n\t\t\t\t\t\t// Equality operator\n\t\t\t\t\t\tconst eqValue = fieldFilter['$eq'];\n\t\t\t\t\t\tif (typeof eqValue !== 'object' || eqValue === null || !Array.isArray(eqValue)) {\n\t\t\t\t\t\t\t// Scalar value\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// Not an equality filter on unique field\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t});\n};\n\nconst isId = (currentSchema: EnrichedBormEntity | EnrichedBormRelation, field: any) =>\n\ttypeof field === 'string' ? currentSchema.idFields?.includes(field) : currentSchema.idFields?.includes(field.$path);\n\nconst createDataField = (props: {\n\tfield: any;\n\tfieldStr: string;\n\t$justId: boolean;\n\tdbPath: string;\n\tisVirtual?: boolean;\n\tfieldSchema: EnrichedDataField;\n}): EnrichedAttributeQuery => {\n\tconst { field, fieldStr, $justId, dbPath, isVirtual, fieldSchema } = props;\n\t// todo: get all dependencies of the virtual field in the query and then remove from the output\n\treturn {\n\t\t$path: fieldStr,\n\t\t$dbPath: dbPath,\n\t\t$thingType: 'attribute',\n\t\t$as: field.$as || fieldStr,\n\t\t$var: fieldStr,\n\t\t$fieldType: 'data',\n\t\t$justId,\n\t\t$id: field.$id,\n\t\t$isVirtual: isVirtual,\n\t\t[FieldSchema]: fieldSchema,\n\t};\n};\n\nconst createLinkField = (props: {\n\tfield: any;\n\tfieldStr: string;\n\tlinkField: any;\n\t$justId: boolean;\n\tdbPath: string;\n\tschema: EnrichedBormSchema;\n\tfieldSchema: EnrichedLinkField;\n}): EnrichedLinkQuery => {\n\tconst { field, fieldStr, linkField, $justId, dbPath, schema, fieldSchema } = props;\n\tconst { target, oppositeLinkFieldsPlayedBy } = linkField;\n\treturn oppositeLinkFieldsPlayedBy.map((playedBy: any) => {\n\t\tconst $thingType = target === 'role' ? playedBy.thingType : 'relation';\n\t\tconst $thing = target === 'role' ? playedBy.thing : linkField.relation;\n\t\tconst node = { [`$${$thingType}`]: $thing };\n\t\tconst currentSchema = getCurrentSchema(schema, node);\n\t\tconst idNotIncluded = field?.$fields?.filter((f: any) => isId(currentSchema, f)).length === 0;\n\n\t\tlet fields = [];\n\t\tif (typeof field !== 'string') {\n\t\t\tif (field.$fields) {\n\t\t\t\tif (idNotIncluded) {\n\t\t\t\t\tconst idFields = currentSchema.idFields || [];\n\t\t\t\t\tfields = [...field.$fields, ...idFields];\n\t\t\t\t} else {\n\t\t\t\t\tfields = field.$fields;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfields = getAllFields(currentSchema);\n\t\t\t}\n\t\t} else {\n\t\t\tfields = ['id'];\n\t\t}\n\n\t\tif (field.$excludedFields) {\n\t\t\tfields = fields.filter((f: { $path: string }) => {\n\t\t\t\tif (isId(currentSchema, f)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn !field.$excludedFields.includes(f.$path);\n\t\t\t});\n\t\t}\n\n\t\tconst $filter =\n\t\t\tfield.$id || field.$filter //skip if no $id and not $filter. In the future $thing can filter too\n\t\t\t\t? { ...(field.$id ? { $id: field.$id } : {}), ...field.$filter }\n\t\t\t\t: undefined;\n\n\t\treturn {\n\t\t\t$thingType,\n\t\t\t$plays: linkField.plays,\n\t\t\t$playedBy: {\n\t\t\t\t...playedBy,\n\t\t\t\toppositeLinkFieldsPlayedBy: undefined, // Remove this to break the loop\n\t\t\t},\n\t\t\t$path: playedBy.path,\n\t\t\t$dbPath: dbPath,\n\t\t\t$as: field.$as || fieldStr,\n\t\t\t$var: fieldStr,\n\t\t\t$thing,\n\t\t\t$fields: fields,\n\t\t\t$excludedFields: field.$excludedFields,\n\t\t\t$fieldType: 'link',\n\t\t\t$target: target,\n\t\t\t$intermediary: playedBy.relation,\n\t\t\t$justId,\n\t\t\t$id: field.$id,\n\t\t\t$filter,\n\t\t\t$idNotIncluded: idNotIncluded,\n\t\t\t$filterByUnique: checkFilterByUnique(field.$filter, currentSchema),\n\t\t\t$sort: field.$sort,\n\t\t\t$offset: field.$offset,\n\t\t\t$limit: field.$limit,\n\t\t\t[FieldSchema]: fieldSchema,\n\t\t};\n\t});\n};\n\nconst createRefField = (props: {\n\tfield: any;\n\tfieldStr: string;\n\t$justId: boolean;\n\tdbPath: string;\n\tisVirtual?: boolean;\n\tfieldSchema: EnrichedRefField;\n}): EnrichedRefQuery => {\n\tconst { field, fieldStr, $justId, dbPath, fieldSchema } = props;\n\tif ('$filter' in props) {\n\t\tthrow new Error('Filter not supported in ref fields');\n\t}\n\treturn {\n\t\t$path: fieldStr,\n\t\t$dbPath: dbPath,\n\t\t$contentType: fieldSchema.contentType,\n\t\t$as: field.$as || fieldStr,\n\t\t$var: fieldStr,\n\t\t$fieldType: 'ref',\n\t\t$justId,\n\t\t$fields: field.$fields,\n\t\t$id: field.$id,\n\t\t[FieldSchema]: fieldSchema,\n\t};\n};\n\nconst createRoleField = (props: {\n\tfield: any;\n\tfieldStr: string;\n\troleField: any;\n\t$justId: boolean;\n\tdbPath: string;\n\tschema: EnrichedBormSchema;\n\tfieldSchema: EnrichedRoleField;\n}): EnrichedRoleQuery => {\n\tconst { field, fieldStr, roleField, $justId, dbPath, schema, fieldSchema } = props;\n\n\treturn roleField.playedBy.map((playedBy: any) => {\n\t\tconst { thing, thingType, relation } = playedBy;\n\t\tconst node = { [`$${thingType}`]: thing };\n\t\tconst currentSchema = getCurrentSchema(schema, node);\n\t\tconst idNotIncluded =\n\t\t\tfield?.$fields?.filter(\n\t\t\t\t(field: any) => currentSchema?.idFields?.includes(field) || currentSchema?.idFields?.includes(field.$path),\n\t\t\t).length === 0;\n\n\t\tlet fields = [];\n\t\tif (typeof field !== 'string') {\n\t\t\tif (field.$fields) {\n\t\t\t\tif (idNotIncluded) {\n\t\t\t\t\tconst idFields = currentSchema.idFields || [];\n\t\t\t\t\tfields = [...field.$fields, ...idFields];\n\t\t\t\t} else {\n\t\t\t\t\tfields = field.$fields;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfields = getAllFields(currentSchema);\n\t\t\t}\n\t\t} else {\n\t\t\tfields = ['id'];\n\t\t}\n\n\t\tif (field.$excludedFields) {\n\t\t\tfields = fields.filter((f: { $path: string }) => {\n\t\t\t\tif (isId(currentSchema, f)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn !field.$excludedFields.includes(f.$path);\n\t\t\t});\n\t\t}\n\n\t\tconst $filter =\n\t\t\tfield.$id || field.$filter //skip if no $id and not $filter. In the future $thing can filter too\n\t\t\t\t? { ...(field.$id ? { $id: field.$id } : {}), ...field.$filter }\n\t\t\t\t: undefined;\n\n\t\treturn {\n\t\t\t$thingType: thingType,\n\t\t\t$path: fieldStr,\n\t\t\t$dbPath: dbPath,\n\t\t\t$as: field.$as || fieldStr,\n\t\t\t$var: fieldStr,\n\t\t\t$thing: thing,\n\t\t\t$fields: fields,\n\t\t\t$excludedFields: field.$excludedFields,\n\t\t\t$fieldType: 'role',\n\t\t\t$intermediary: relation,\n\t\t\t$justId,\n\t\t\t$id: field.$id,\n\t\t\t$filter,\n\t\t\t//$filter: field.$filter,\n\t\t\t$idNotIncluded: idNotIncluded,\n\t\t\t$filterByUnique: checkFilterByUnique(field.$filter, currentSchema),\n\t\t\t$playedBy: { ...playedBy, oppositeLinkFieldsPlayedBy: undefined },\n\t\t\t$sort: field.$sort,\n\t\t\t$offset: field.$offset,\n\t\t\t$limit: field.$limit,\n\t\t\t[FieldSchema]: fieldSchema,\n\t\t};\n\t});\n};\n\nconst processField = (\n\tfield: any,\n\tcurrentSchema: EnrichedBormEntity | EnrichedBormRelation,\n\tschema: EnrichedBormSchema,\n) => {\n\tconst fieldStr = typeof field === 'string' ? field : field.$path;\n\tconst $justId = typeof field === 'string';\n\tconst dataField = currentSchema.dataFields?.find((dataField: any) => dataField.path === fieldStr);\n\tconst linkField = currentSchema.linkFields?.find((linkField: any) => linkField.path === fieldStr);\n\tconst roleField = (currentSchema as EnrichedBormRelation).roles?.[fieldStr];\n\tconst refField = currentSchema.refFields?.[fieldStr];\n\n\tif (dataField) {\n\t\tconst isVirtual = !!dataField.isVirtual && !!dataField.default; //if there is no default value, then is fully virtual, the computing is managed in the DB\n\t\treturn createDataField({\n\t\t\tfield,\n\t\t\tfieldStr,\n\t\t\t$justId,\n\t\t\tdbPath: dataField.dbPath,\n\t\t\tisVirtual,\n\t\t\tfieldSchema: dataField,\n\t\t}); //ignore computed ones\n\t} else if (linkField) {\n\t\treturn createLinkField({\n\t\t\tfield,\n\t\t\tfieldStr,\n\t\t\tlinkField,\n\t\t\t$justId,\n\t\t\tdbPath: linkField.path,\n\t\t\tschema,\n\t\t\tfieldSchema: linkField,\n\t\t});\n\t} else if (roleField) {\n\t\treturn createRoleField({\n\t\t\tfield,\n\t\t\tfieldStr,\n\t\t\troleField,\n\t\t\t$justId,\n\t\t\tdbPath: fieldStr,\n\t\t\tschema,\n\t\t\tfieldSchema: roleField,\n\t\t});\n\t} else if (refField) {\n\t\treturn createRefField({\n\t\t\tfield,\n\t\t\tfieldStr,\n\t\t\t$justId,\n\t\t\tdbPath: fieldStr,\n\t\t\tisVirtual: false,\n\t\t\tfieldSchema: refField,\n\t\t});\n\t}\n\treturn null;\n};\n\n// Recursive enrich filter that checks all the tree of filters. Sometimes is dataFields, which is easier, but sometimes is linkFields or roleFields so we need to keep drilling\nexport const enrichFilter = ($filter: Filter | Filter[], $thing: string, schema: EnrichedBormSchema) => {\n\tif ($filter === null || $filter === undefined) {\n\t\treturn $filter;\n\t}\n\tconst wasArray = isArray($filter);\n\n\tconst filterArray = wasArray ? $filter : [$filter];\n\n\tconst resultArray = filterArray.map((filter: any) => {\n\t\tconst keys = Object.keys(filter);\n\n\t\tconst enrichedFilter = keys.reduce((acc: any, key: string) => {\n\t\t\tconst value = filter[key];\n\n\t\t\tconst valueAsArray = isArray(value) ? value : [value];\n\n\t\t\tif (key.startsWith('$')) {\n\t\t\t\tif (['$id', '$thing'].includes(key)) {\n\t\t\t\t\tacc[key] = value;\n\t\t\t\t} else if (['$not', '$or', '$and'].includes(key)) {\n\t\t\t\t\t// We don't want to enrich the special keys; we enrich nested things instead\n\t\t\t\t\tacc[key] = enrichFilter(value, $thing, schema);\n\t\t\t\t} else if (['$eq', '$in', '$exists'].includes(key)) {\n\t\t\t\t\tacc[key] = value;\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(`[Internal] Unknown filter operator ${key}`);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Must be a field\n\t\t\t\tconst currentSchema = $thing in schema.entities ? schema.entities[$thing] : schema.relations[$thing];\n\t\t\t\tconst [fieldType, fieldSchema] = getFieldType(currentSchema, key);\n\n\t\t\t\tif (fieldType === 'idField') {\n\t\t\t\t\tacc[key] = value;\n\t\t\t\t} else if (fieldType === 'dataField') {\n\t\t\t\t\tif (isObject(value) || (isArray(value) && value.some(isObject))) {\n\t\t\t\t\t\tacc[key] = isArray(value)\n\t\t\t\t\t\t\t? { $or: enrichFilter(value, $thing, schema) }\n\t\t\t\t\t\t\t: enrichFilter(value, $thing, schema);\n\t\t\t\t\t} else if (isArray(value)) {\n\t\t\t\t\t\tacc[key] = { $in: value };\n\t\t\t\t\t} else {\n\t\t\t\t\t\tacc[key] = { $eq: value };\n\t\t\t\t\t}\n\t\t\t\t} else if (fieldType === 'linkField' || fieldType === 'roleField') {\n\t\t\t\t\tconst fieldSchemaTyped = fieldSchema as EnrichedLinkField | EnrichedRoleField;\n\t\t\t\t\tconst [childrenThing] = fieldSchemaTyped.$things; // TODO: Manage polymorphism\n\t\t\t\t\tif (valueAsArray.every((v: any) => typeof v === 'string')) {\n\t\t\t\t\t\tacc[key] = { $id: valueAsArray, $thing: childrenThing }; // Avoid the traverse to check this\n\t\t\t\t\t} else if (valueAsArray.every((v: any) => isObject(v))) {\n\t\t\t\t\t\tacc[key] = isArray(value)\n\t\t\t\t\t\t\t? { $or: enrichFilter(value, childrenThing, schema) }\n\t\t\t\t\t\t\t: enrichFilter(value, childrenThing, schema);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(`Field ${key} not found in schema of ${$thing}`);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn acc;\n\t\t}, {});\n\t\treturn enrichedFilter;\n\t});\n\n\tif (!wasArray) {\n\t\treturn resultArray[0];\n\t} else if (resultArray.length === 1) {\n\t\treturn resultArray[0];\n\t} else {\n\t\treturn { $or: resultArray };\n\t}\n};\n","/* eslint-disable no-param-reassign */\nimport { isArray } from 'radash';\nimport type { BQLMutationBlock, EnrichedLinkField, EnrichedRoleField } from '../../../../types';\n\nexport const preValidate = (\n\tnode: BQLMutationBlock,\n\tfield: string,\n\tfieldSchema: EnrichedLinkField | EnrichedRoleField,\n\tpaths: string[],\n) => {\n\tconst subNodes = isArray(node[field]) ? node[field] : [node[field]];\n\n\tconst cleanPath = paths.slice(1).join('.');\n\tsubNodes.forEach((subNode: BQLMutationBlock) => {\n\t\tif (!subNode) {\n\t\t\treturn;\n\t\t}\n\t\t/// For cardinality ONE, we need to specify the $op of the children\n\t\tif (\n\t\t\tfieldSchema?.cardinality === 'ONE' &&\n\t\t\t!subNode.$op &&\n\t\t\t!subNode.$id &&\n\t\t\t!subNode.$filter &&\n\t\t\t!subNode.$tempId &&\n\t\t\tnode.$op !== 'create'\n\t\t) {\n\t\t\tthrow new Error(`Please specify if it is a create or an update. Path: ${cleanPath}.${field}`);\n\t\t}\n\t\tif (subNode.$tempId) {\n\t\t\tif (\n\t\t\t\t!(\n\t\t\t\t\tsubNode.$op === undefined ||\n\t\t\t\t\tsubNode.$op === 'link' ||\n\t\t\t\t\tsubNode.$op === 'create' ||\n\t\t\t\t\tsubNode.$op === 'update' ||\n\t\t\t\t\tsubNode.$op === 'replace'\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Invalid op ${subNode.$op} for tempId. TempIds can be created, or linked when created in another part of the same mutation.`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t});\n};\n","/* eslint-disable no-param-reassign */\nimport { current, isDraft, produce } from 'immer';\nimport type { TraversalCallbackContext } from 'object-traversal';\nimport { traverse } from 'object-traversal';\nimport { isArray, isObject } from 'radash';\nimport { getCurrentFields, getCurrentSchema, getFieldSchema } from '../../../helpers';\nimport type { BQLMutationBlock, BormConfig, EnrichedBQLMutationBlock, EnrichedBormSchema } from '../../../types';\nimport { replaceToObj, replaceToObjRef } from './enrichSteps/replaces';\nimport { setRootMeta } from './enrichSteps/rootMeta';\nimport { splitMultipleIds } from './enrichSteps/splitIds';\nimport { enrichChildren } from './enrichSteps/enrichChildren';\nimport { computeFields } from './enrichSteps/computeFields';\nimport { preHookValidations } from './enrichSteps/preHookValidations';\nimport { preHookTransformations } from './enrichSteps/preHookTransformations';\nimport { doAction } from './shared/doActions';\nimport { unlinkAll } from './enrichSteps/unlinkAll';\nimport { dependenciesGuard } from './guards/dependenciesGuard';\nimport { enrichFilter } from '../../query/bql/enrich';\nimport { preValidate } from './enrichSteps/preValidate';\nimport { validateChildren } from './shared/validateOp';\nimport { SharedMetadata } from '../../../types/symbols';\n\nconst cleanStep = (node: BQLMutationBlock, field: string) => {\n\tif (node[field] === undefined) {\n\t\tdelete node[field];\n\t}\n\n\tif (field === '$tempId') {\n\t\tif (doAction('set_tempId', node)) {\n\t\t\tif (node.$tempId?.startsWith('_:')) {\n\t\t\t\tconst tempId = node.$tempId.substring(2);\n\t\t\t\tnode.$tempId = tempId;\n\t\t\t\tnode.$bzId = tempId;\n\t\t\t} else {\n\t\t\t\tthrow new Error('[Wrong format] TempIds must start with \"_:\"');\n\t\t\t}\n\t\t} else {\n\t\t\tthrow new Error('[Internal] TempId already modified');\n\t\t}\n\t}\n\n\tif (field === '$filter') {\n\t\tif (node.$filter && Object.keys(node.$filter).length === 0) {\n\t\t\tnode.$filter = undefined;\n\t\t}\n\t}\n};\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst dataFieldStep = (node: BQLMutationBlock, field: string) => {};\n\nexport const enrichBQLMutation = (\n\tblocks: BQLMutationBlock | BQLMutationBlock[] | EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[],\n\tschema: EnrichedBormSchema,\n\tconfig: BormConfig,\n): EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[] => {\n\tconst rootBlock = { $rootWrap: { $root: blocks } };\n\t// @ts-expect-error todo\n\tconst has$Fields = dependenciesGuard(Array.isArray(blocks) ? blocks : [blocks]);\n\n\tconst result = produce(rootBlock, (draft) =>\n\t\ttraverse(draft, ({ value, parent, key, meta }: TraversalCallbackContext) => {\n\t\t\tif (!parent || !key) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (isObject(value)) {\n\t\t\t\tconst paths = meta.nodePath?.split('.') || [];\n\t\t\t\tif (paths.some((p) => p.startsWith('%'))) {\n\t\t\t\t\t//we don't go inside %vars even if they are objects\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif ('$root' in value) {\n\t\t\t\t\t// This is hte $root object, we will split the real root if needed in this iteration\n\t\t\t\t} else if (!('$thing' in value || '$entity' in value || '$relation' in value)) {\n\t\t\t\t\tconst toIgnore = ['$fields', '$dbNode', '$filter'];\n\t\t\t\t\tconst lastPath = paths[paths.length - 1];\n\t\t\t\t\tconst secondToLastPath = paths[paths.length - 2];\n\t\t\t\t\tif (key === '$root') {\n\t\t\t\t\t\tthrow new Error('Root things must specify $entity or $relation');\n\t\t\t\t\t} else if (\n\t\t\t\t\t\t!toIgnore.includes(lastPath) &&\n\t\t\t\t\t\t!toIgnore.includes(secondToLastPath) &&\n\t\t\t\t\t\t!lastPath.startsWith('%') &&\n\t\t\t\t\t\t!secondToLastPath.startsWith('%')\n\t\t\t\t\t) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`[Internal] This object has not been initiated with a $thing: ${JSON.stringify(isDraft(value) ? current(value) : value)}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst node = value as EnrichedBQLMutationBlock;\n\t\t\t\tconst isFilter = paths.includes('$filter');\n\n\t\t\t\tif ('$filter' in node && node.$filter) {\n\t\t\t\t\tnode.$filter = enrichFilter(node.$filter, node.$thing, schema);\n\t\t\t\t}\n\n\t\t\t\tObject.keys(node).forEach((field) => {\n\t\t\t\t\t///1. Clean step\n\t\t\t\t\tcleanStep(node, field);\n\t\t\t\t\tif (field !== '$root' && isFilter) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (field !== '$root' && (field.startsWith('$') || field.startsWith('%'))) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst fieldSchema =\n\t\t\t\t\t\tfield !== '$root'\n\t\t\t\t\t\t\t? getFieldSchema(schema, node, field)\n\t\t\t\t\t\t\t: ({ [SharedMetadata]: { fieldType: 'rootField' } } as any);\n\t\t\t\t\tif (!fieldSchema) {\n\t\t\t\t\t\tthrow new Error(`[Internal] Field ${field} not found in schema`);\n\t\t\t\t\t}\n\n\t\t\t\t\t//console.log('field1', field, fieldSchema);\n\n\t\t\t\t\tconst { fieldType } = fieldSchema[SharedMetadata];\n\t\t\t\t\tconst relField = ['linkField', 'roleField'].includes(fieldType);\n\t\t\t\t\tconst refField = fieldType === 'refField';\n\t\t\t\t\tconst rootField = fieldType === 'rootField';\n\n\t\t\t\t\t//console.log('field2', field, fieldType);\n\t\t\t\t\t///2.DATAFIELD STEP\n\t\t\t\t\tif (fieldType === 'dataField') {\n\t\t\t\t\t\treturn dataFieldStep(node, field);\n\t\t\t\t\t}\n\n\t\t\t\t\t///3.NESTED OBJECTS: RoleFields and linkFields\n\n\t\t\t\t\t// 3.1 splitIds\n\n\t\t\t\t\t///3.2$thing => linkField or roleField or references\n\n\t\t\t\t\t///In the next steps we have (isArray(node[field]) ? node[field] : [node[field]]) multiple times, because it might mutate, can't replace by a var\n\n\t\t\t\t\t/// 3.2.1 replaces\n\t\t\t\t\tif (relField || refField) {\n\t\t\t\t\t\tif (node[field] === null) {\n\t\t\t\t\t\t\trelField ? unlinkAll(node, field, fieldSchema) : undefined;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t//todo: replaceObj in refFields, as we are just doing some validation\n\t\t\t\t\t\t\trelField ? replaceToObj(node, field, fieldSchema) : replaceToObjRef(node, field, fieldSchema);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t//3.2.2 root $thing\n\t\t\t\t\tif (rootField) {\n\t\t\t\t\t\tif (!('$root' in node)) {\n\t\t\t\t\t\t\tthrow new Error(`[Internal] Field ${field} is a rootField but the object is not a root`);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst rootNode = node as unknown as { $root: BQLMutationBlock | BQLMutationBlock[] };\n\t\t\t\t\t\tsetRootMeta(rootNode, schema);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (relField || refField) {\n\t\t\t\t\t\t// 3.2.3 BQL pre-validations => All validations should happen on subNode, if else, leaves are skipped\n\t\t\t\t\t\tpreValidate(node, field, fieldSchema, paths);\n\t\t\t\t\t}\n\t\t\t\t\t/// 3.2.4 children enrichment\n\t\t\t\t\t//redefining childrenArray as it might have changed\n\n\t\t\t\t\tif (relField || refField) {\n\t\t\t\t\t\tenrichChildren(node, field, fieldSchema, schema);\n\n\t\t\t\t\t\t//validateChildren\n\t\t\t\t\t\tvalidateChildren(node, node[field], schema);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (relField || rootField) {\n\t\t\t\t\t\t//3.2.5 splitIds()\n\t\t\t\t\t\t//this simplifies typeDB mutations\n\t\t\t\t\t\tsplitMultipleIds(node, field, schema);\n\n\t\t\t\t\t\t/// 3.2.6 Field computes on nested created nodes. It only runs in CREATE operations.\n\t\t\t\t\t\tcomputeFields(node, field, schema);\n\n\t\t\t\t\t\t// 3.2.7\n\t\t\t\t\t\t//#region BQL validations\n\t\t\t\t\t\t//Ideally, in updates we could not demand the $thing, but then we need to check that the field belongs to all the potential $things\n\t\t\t\t\t\tconst toValidate = isArray(node[field]) ? node[field] : [node[field]];\n\n\t\t\t\t\t\ttoValidate.forEach((subNode: BQLMutationBlock) => {\n\t\t\t\t\t\t\tconst subNodeSchema = getCurrentSchema(schema, subNode);\n\t\t\t\t\t\t\tconst { unidentifiedFields, usedLinkFields, usedFields, fields } = getCurrentFields(\n\t\t\t\t\t\t\t\tsubNodeSchema,\n\t\t\t\t\t\t\t\tsubNode,\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t//Check that every used field is in the fields array\n\t\t\t\t\t\t\tusedFields.forEach((uf) => {\n\t\t\t\t\t\t\t\tif (!fields.includes(uf)) {\n\t\t\t\t\t\t\t\t\tthrow new Error(`[Schema] Field ${uf} not found in the schema`);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tif (unidentifiedFields.length > 0) {\n\t\t\t\t\t\t\t\tthrow new Error(`Unknown fields: [${unidentifiedFields.join(',')}] in ${JSON.stringify(value)}`);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t//Can't use a link field with target === 'role' and another with target === 'relation' in the same mutation.\n\t\t\t\t\t\t\tif (usedLinkFields.length > 1) {\n\t\t\t\t\t\t\t\tconst usedLinkFieldsSchemas = subNodeSchema.linkFields?.filter((lf) =>\n\t\t\t\t\t\t\t\t\tusedLinkFields.includes(lf.path),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t/// Check if at least two of the usedLinkFields schemas, share same relation and have different targets\n\t\t\t\t\t\t\t\tusedLinkFieldsSchemas?.some((lf1, i) => {\n\t\t\t\t\t\t\t\t\treturn usedLinkFieldsSchemas.some((lf2, j) => {\n\t\t\t\t\t\t\t\t\t\tif (i !== j && lf1.target !== lf2.target && lf1.relation === lf2.relation) {\n\t\t\t\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t\t\t\t\"[Wrong format]: Can't use a link field with target === 'role' and another with target === 'relation' in the same mutation.\",\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (!has$Fields) {\n\t\t\t\t\t\t\t//if it has $field, it has dependencies so its still not ready for transformation\n\t\t\t\t\t\t\t//#endregion BQL validations\n\n\t\t\t\t\t\t\t// 3.3.8\n\t\t\t\t\t\t\t//#region pre-hook transformations\n\t\t\t\t\t\t\tpreHookTransformations(node, field, schema, config);\n\t\t\t\t\t\t\t//#endregion pre-hook transformations\n\n\t\t\t\t\t\t\t// 3.2.9\n\t\t\t\t\t\t\t//#region pre-hook validations\n\t\t\t\t\t\t\tpreHookValidations(node, field, schema, config);\n\t\t\t\t\t\t\t//#endregion pre-hook validations\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}),\n\t);\n\n\tif (isArray(result.$rootWrap.$root)) {\n\t\treturn result.$rootWrap.$root as EnrichedBQLMutationBlock[];\n\t} else {\n\t\treturn result.$rootWrap.$root as EnrichedBQLMutationBlock;\n\t}\n};\n","import type { TraversalCallbackContext } from 'object-traversal';\nimport { traverse } from 'object-traversal';\nimport { isArray, isObject, mapEntries, pick, shake } from 'radash';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { oFilter, getCurrentFields, getCurrentSchema, getParentNode } from '../../../helpers';\nimport type {\n\tBQLMutationBlock,\n\tBormOperation,\n\tEnrichedBQLMutationBlock,\n\tEnrichedBormRelation,\n\tEnrichedBormSchema,\n\tEnrichedLinkField,\n} from '../../../types';\nimport { computeField } from '../../../engine/compute';\nimport { deepRemoveMetaData } from '../../../../tests/helpers/matchers';\nimport { EdgeSchema, EdgeType, SharedMetadata } from '../../../types/symbols';\n\nexport const parseBQLMutation = async (\n\tblocks: EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[],\n\tschema: EnrichedBormSchema,\n) => {\n\tconst listNodes = (blocks: EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[]) => {\n\t\t// todo: make immutable\n\n\t\tconst nodes: BQLMutationBlock[] = [];\n\t\tconst edges: BQLMutationBlock[] = [];\n\n\t\t/*\n function getIdsByPath(path: string) {\n const ids = nodes.filter((node) => node[Symbol.for('path') as any] === path).map((node) => node.id);\n return ids.length === 1 ? ids[0] : ids;\n } */\n\n\t\tconst getIdValue = (node: EnrichedBQLMutationBlock) => {\n\t\t\tif (node.$id) {\n\t\t\t\treturn node.$id;\n\t\t\t}\n\n\t\t\tconst currentSchema = getCurrentSchema(schema, node);\n\t\t\tconst { idFields } = currentSchema;\n\n\t\t\tif (!idFields) {\n\t\t\t\tthrow new Error(`no idFields: ${JSON.stringify(node)}`);\n\t\t\t}\n\t\t\t// todo: composite ids\n\t\t\tconst [idField] = idFields;\n\t\t\tif (!idField) {\n\t\t\t\tthrow new Error(`no idField: ${JSON.stringify(node)}`);\n\t\t\t}\n\t\t\t/// This is adding idfields for intermediary relations. In the future maybe it would be better to add the intermediary relations in the enrich step?\n\t\t\tconst idDataField = currentSchema.dataFields?.find((x) => x.path === idField);\n\n\t\t\tconst defaultIdField = computeField({\n\t\t\t\tcurrentThing: node,\n\t\t\t\tfieldSchema: idDataField, //id is always a datafield.\n\t\t\t\tmandatoryDependencies: true, //can't send to db without every dependency being there\n\t\t\t});\n\n\t\t\tconst idValue = node[idField] || node.$id || defaultIdField;\n\n\t\t\tif (!idValue) {\n\t\t\t\tthrow new Error(`no idValue: ${JSON.stringify(node)}`);\n\t\t\t}\n\t\t\treturn idValue;\n\t\t};\n\n\t\tconst toNodes = (node: EnrichedBQLMutationBlock) => {\n\t\t\tif (node.$op === 'create') {\n\t\t\t\tconst idValue = getIdValue(node);\n\n\t\t\t\tif (nodes.find((x) => x.$id === idValue && x.$op === 'create')) {\n\t\t\t\t\tthrow new Error(`Duplicate id ${idValue} for node ${JSON.stringify(node)}`);\n\t\t\t\t}\n\n\t\t\t\tnodes.push({ ...node, $id: idValue });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (node.$tempId && node.$op === 'match') {\n\t\t\t\t/// we don't add to the node list, those that are being matched as they don't need to be matched in db and if they have a $tempId then it means... they are being created in the same query!\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tnodes.push(node);\n\t\t};\n\n\t\tconst toEdges = (edge: EnrichedBQLMutationBlock) => {\n\t\t\tif (edge.$op === 'create') {\n\t\t\t\tconst idValue = getIdValue(edge);\n\n\t\t\t\tif (nodes.find((x) => x.$id === idValue && x.$op === 'create')) {\n\t\t\t\t\tthrow new Error(`Duplicate id ${idValue} for edge ${JSON.stringify(edge)}`);\n\t\t\t\t}\n\t\t\t\tedges.push({ ...edge, $id: idValue });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tedges.push(edge);\n\t\t};\n\n\t\tconst listOp = ({ value: val, parent, meta }: TraversalCallbackContext) => {\n\t\t\tif (!isObject(val)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst value = val as EnrichedBQLMutationBlock;\n\n\t\t\tif (meta.nodePath?.includes('.$filter')) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t/// no idea why this is needed lol, but sometimes is indeed undefined 🤷‍♀️\n\t\t\tif (value.$thing) {\n\t\t\t\tif (!value.$op) {\n\t\t\t\t\tthrow new Error(`Operation should be defined at this step ${JSON.stringify(value)}`);\n\t\t\t\t}\n\n\t\t\t\tif (!value.$bzId) {\n\t\t\t\t\tthrow new Error(`[internal error] BzId not found ${JSON.stringify(value)}`);\n\t\t\t\t}\n\t\t\t\t/// this is used to group the right delete/unlink operations with the involved things\n\n\t\t\t\tconst currentThingSchema = getCurrentSchema(schema, value);\n\t\t\t\tconst {\n\t\t\t\t\tdataFields: dataFieldPaths,\n\t\t\t\t\troleFields: roleFieldPaths,\n\t\t\t\t\tlinkFields: linkFieldPaths,\n\t\t\t\t\tusedFields,\n\t\t\t\t} = getCurrentFields(currentThingSchema, value);\n\n\t\t\t\tconst getChildOp = () => {\n\t\t\t\t\tif (value.$op === 'create' || value.$op === 'delete') {\n\t\t\t\t\t\treturn value.$op;\n\t\t\t\t\t}\n\t\t\t\t\t// if its un update because linkfields or rolefields updated, but no attributes, then it a match\n\t\t\t\t\tif (value.$op === 'update') {\n\t\t\t\t\t\tconst usedDataFields = usedFields.filter((x: string) => dataFieldPaths?.includes(x));\n\t\t\t\t\t\tconst usedRoleFields = usedFields.filter((x: string) => roleFieldPaths?.includes(x));\n\t\t\t\t\t\tconst usedLinkFields = usedFields.filter((x: string) => linkFieldPaths?.includes(x));\n\t\t\t\t\t\tif (usedDataFields.length > 0) {\n\t\t\t\t\t\t\treturn 'update';\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (usedRoleFields.length > 0 || usedLinkFields.length > 0) {\n\t\t\t\t\t\t\treturn 'match';\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthrow new Error(`No fields on an $op:\"update\" for node ${JSON.stringify(value)}`);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn 'match';\n\t\t\t\t};\n\n\t\t\t\tconst dataObj = {\n\t\t\t\t\t...(value.$id && { $id: value.$id }),\n\t\t\t\t\t...(value.$tempId && { $tempId: value.$tempId }),\n\t\t\t\t\t...(value.$filter && { $filter: value.$filter }),\n\t\t\t\t\t...{ $thing: value.$thing },\n\t\t\t\t\t...(value.$thingType && { $thingType: value.$thingType }),\n\t\t\t\t\t...shake(pick(value, dataFieldPaths || [''])),\n\t\t\t\t\t$op: getChildOp() as BormOperation,\n\t\t\t\t\t$bzId: value.$bzId,\n\t\t\t\t};\n\n\t\t\t\t/// split nodes with multiple ids // why? //no longer doing that\n\t\t\t\ttoNodes(dataObj);\n\n\t\t\t\t// CASE 1: HAVE A PARENT THROUGH LINKFIELDS\n\t\t\t\tconst edgeSchema = value[EdgeSchema] as EnrichedLinkField;\n\n\t\t\t\tif (edgeSchema?.[SharedMetadata].fieldType === 'linkField') {\n\t\t\t\t\tif (value.$op === 'link' || value.$op === 'unlink') {\n\t\t\t\t\t\tif (value.$id || value.$filter) {\n\t\t\t\t\t\t\tif (value.$tempId) {\n\t\t\t\t\t\t\t\tthrow new Error(\"can't specify a existing and a new element at once. Use an id/filter or a tempId\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tnodes.push({ ...value, $op: 'match' });\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// we add a \"linkable\" version of it so we can query it in the insertion\n\t\t\t\t\t}\n\n\t\t\t\t\t// this linkObj comes from nesting, which means it has no properties and no ID\n\t\t\t\t\t// relations explicitely created are not impacted by this, and they get the $id from it's actual current value\n\n\t\t\t\t\tconst ownRelation = edgeSchema.$things.includes(value.$thing); //might be a subclass of the relation\n\n\t\t\t\t\tconst linkTempId = ownRelation ? value.$bzId : `LT_${uuidv4()}`;\n\n\t\t\t\t\tconst parentNode = getParentNode(blocks, parent, meta);\n\n\t\t\t\t\tconst parentId = parentNode.$bzId;\n\n\t\t\t\t\tif (!parentId) {\n\t\t\t\t\t\tthrow new Error('No parent id found');\n\t\t\t\t\t}\n\n\t\t\t\t\tconst getLinkObjOp = () => {\n\t\t\t\t\t\tif (value.$op === 'delete') {\n\t\t\t\t\t\t\tif (ownRelation) {\n\t\t\t\t\t\t\t\treturn 'match';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn 'delete';\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (value.$op === 'unlink') {\n\t\t\t\t\t\t\tif (ownRelation) {\n\t\t\t\t\t\t\t\treturn 'unlink';\n\t\t\t\t\t\t\t} // delete already present in the nodes array\n\t\t\t\t\t\t\treturn 'delete';\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (value.$op === 'link' || value.$op === 'create') {\n\t\t\t\t\t\t\tif (ownRelation) {\n\t\t\t\t\t\t\t\treturn 'link';\n\t\t\t\t\t\t\t} // create already present in the nodes array\n\t\t\t\t\t\t\treturn 'create';\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// todo: probably check replaces\n\t\t\t\t\t\tif (value.$op === 'replace') {\n\t\t\t\t\t\t\t// Currently pre-queries do not cross reference data nested below a create operation\n\t\t\t\t\t\t\t//throw new Error('Unsupported: Nested replaces not implemented yet');\n\t\t\t\t\t\t\t/// So this does not work in typedb without replaces, so basically if you're using typeDB this should not be reached. In other DBs its ok\n\t\t\t\t\t\t\t//throw new Error('Unsupported: Nested replaces not implemented yet');\n\t\t\t\t\t\t\treturn 'replace';\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn 'match';\n\t\t\t\t\t};\n\t\t\t\t\t//validate that field is an actual role from the relation\n\t\t\t\t\tconst relationSchema = getCurrentSchema(schema, {\n\t\t\t\t\t\t$thing: edgeSchema.relation,\n\t\t\t\t\t\t$thingType: 'relation',\n\t\t\t\t\t}) as EnrichedBormRelation;\n\t\t\t\t\tconst roles = Object.keys(relationSchema.roles);\n\t\t\t\t\tif (!roles.includes(edgeSchema.plays)) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`[Wrong format] Field ${edgeSchema.plays} is not a role of relation ${edgeSchema.relation}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst edgeType1 = {\n\t\t\t\t\t\t$bzId: linkTempId,\n\t\t\t\t\t\t$thing: ownRelation ? value.$thing : edgeSchema.relation, //if it is its own relation, it might be a relation that extends it\n\t\t\t\t\t\t$thingType: 'relation' as const,\n\t\t\t\t\t\t...(value.$tempId ? { $tempId: value.$tempId } : {}),\n\t\t\t\t\t\t$op: getLinkObjOp(),\n\n\t\t\t\t\t\t// roles\n\t\t\t\t\t\t...(!ownRelation ? { [edgeSchema.path]: value.$bzId } : {}),\n\t\t\t\t\t\t[edgeSchema.plays]: parentId,\n\n\t\t\t\t\t\t//Metadata\n\t\t\t\t\t\t[EdgeSchema]: edgeSchema,\n\t\t\t\t\t\t[EdgeType]: 'linkField',\n\t\t\t\t\t};\n\n\t\t\t\t\t// const testVal = {};\n\n\t\t\t\t\t// todo: stuff 😂\n\t\t\t\t\t//@ts-expect-error - TODO\n\t\t\t\t\ttoEdges(edgeType1);\n\n\t\t\t\t\t/// when it has a parent through a linkField, we need to add an additional node (its dependency), as well as a match\n\t\t\t\t\t/// no need for links, as links will have all the related things in the \"link\" object. While unlinks required dependencies as match and deletions as unlink (or dependencies would be also added)\n\t\t\t\t\t/// this is only for relations that are not $self, as other relations will be deleted and don't need a match\n\t\t\t\t\tif ((value.$op === 'unlink' || getLinkObjOp() === 'unlink') && ownRelation) {\n\t\t\t\t\t\ttoEdges({\n\t\t\t\t\t\t\t$thing: edgeSchema.relation,\n\t\t\t\t\t\t\t$thingType: 'relation' as const,\n\t\t\t\t\t\t\t$bzId: linkTempId,\n\t\t\t\t\t\t\t$op: 'match',\n\t\t\t\t\t\t\t[edgeSchema.plays]: parentId,\n\t\t\t\t\t\t\t[EdgeSchema]: edgeSchema,\n\t\t\t\t\t\t\t[EdgeType]: 'linkField',\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// CASE 2: IS RELATION AND HAS THINGS IN THEIR ROLES\n\t\t\t\tif (value.$thingType === 'relation') {\n\t\t\t\t\tconst rolesObjFiltered = oFilter(value, (k: string, _v) => roleFieldPaths.includes(k));\n\n\t\t\t\t\t/// we don't manage cardinality MANY for now, its managed differently if we are on a create/delete op or nested link/unlink op\n\t\t\t\t\t// todo: this is super weird, remove\n\t\t\t\t\t//@ts-expect-error - TODO\n\t\t\t\t\tconst rolesObjOnlyIds = mapEntries(rolesObjFiltered, (k: string, v) => {\n\t\t\t\t\t\tif (isArray(v)) {\n\t\t\t\t\t\t\treturn [k, v];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (isObject(v)) {\n\t\t\t\t\t\t\t// @ts-expect-error - TODO description\n\t\t\t\t\t\t\treturn [k, v.$bzId];\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn [k, v];\n\t\t\t\t\t});\n\n\t\t\t\t\tconst objWithMetaDataOnly = oFilter(val, (k, _v) => {\n\t\t\t\t\t\t// @ts-expect-error - TODO description\n\t\t\t\t\t\treturn k.startsWith('$') || k.startsWith('Symbol');\n\t\t\t\t\t});\n\n\t\t\t\t\tif (Object.keys(rolesObjFiltered).filter((x) => !x.startsWith('$')).length > 0) {\n\t\t\t\t\t\t// 2.1 EDGE TYPE 2\n\t\t\t\t\t\tif (value.$op === 'create' || value.$op === 'delete') {\n\t\t\t\t\t\t\t/// if the relation is being created, then all objects in the roles are actually add\n\t\t\t\t\t\t\tconst getEdgeOp = (): BormOperation => {\n\t\t\t\t\t\t\t\tif (value.$op === 'create') {\n\t\t\t\t\t\t\t\t\treturn 'link';\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (value.$op === 'delete') {\n\t\t\t\t\t\t\t\t\treturn 'match';\n\t\t\t\t\t\t\t\t} /// if i'm not wrong, no need to unlink becasue is the director relation and will disappear 🤔\n\t\t\t\t\t\t\t\tthrow new Error('Unsupported parent of edge op');\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\tconst currentRoles = (getCurrentSchema(schema, value) as EnrichedBormRelation).roles;\n\t\t\t\t\t\t\t/// group ids when cardinality MANY\n\t\t\t\t\t\t\tconst rolesObjOnlyIdsGrouped = mapEntries(rolesObjOnlyIds, (k: string, v) => {\n\t\t\t\t\t\t\t\tconst currentRoleCardinality = currentRoles[k]?.cardinality;\n\t\t\t\t\t\t\t\tif (!currentRoleCardinality) {\n\t\t\t\t\t\t\t\t\tthrow new Error(`Role ${k} not found in schema`);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (Array.isArray(v)) {\n\t\t\t\t\t\t\t\t\tif (currentRoleCardinality === 'ONE') {\n\t\t\t\t\t\t\t\t\t\t//console.log('v!', v);\n\t\t\t\t\t\t\t\t\t\tif (v.length > 1) {\n\t\t\t\t\t\t\t\t\t\t\treturn [k, v.map((vNested: any) => vNested.$bzId || vNested)]; //Even if is Card ONE, we might actually try to link to N things, as long as the result is a single one, it is ok. The DB should throw an error if it is not the case\n\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\treturn [k, v[0].$bzId || v[0]];\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t/// Replace the array of objects with an array of ids\n\t\t\t\t\t\t\t\t\treturn [k, v.map((vNested: any) => vNested.$bzId || vNested)];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t//@ts-expect-error - TODO\n\t\t\t\t\t\t\t\treturn [k, v.$bzId || v];\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t// todo: validations\n\t\t\t\t\t\t\t/// 1) each ONE role has only ONE element // 2) no delete ops // 3) no arrayOps, because it's empty (or maybe yes and just consider it an add?) ...\n\t\t\t\t\t\t\tconst edgeType2 = {\n\t\t\t\t\t\t\t\t...objWithMetaDataOnly,\n\t\t\t\t\t\t\t\t$thing: value.$thing,\n\t\t\t\t\t\t\t\t$thingType: 'relation' as const,\n\t\t\t\t\t\t\t\t$op: getEdgeOp(),\n\t\t\t\t\t\t\t\t...rolesObjOnlyIdsGrouped, // override role fields by ids or tempIDs\n\t\t\t\t\t\t\t\t$bzId: value.$bzId,\n\t\t\t\t\t\t\t\t[EdgeType]: 'roleField' as const,\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\ttoEdges(edgeType2);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// #endregion\n\t\t\t\t\t\t// 2.2 EDGE TYPE 3\n\t\t\t\t\t\tif (value.$op === 'match' || (value.$op === 'update' && Object.keys(rolesObjFiltered).length > 0)) {\n\t\t\t\t\t\t\tlet totalUnlinks = 0;\n\n\t\t\t\t\t\t\tObject.entries(rolesObjFiltered).forEach(([role, operations]) => {\n\t\t\t\t\t\t\t\tconst operationsArray = isArray(operations) ? operations : [operations];\n\n\t\t\t\t\t\t\t\tconst getOp = (childOp: BormOperation): BormOperation => {\n\t\t\t\t\t\t\t\t\tif (childOp === 'create' || childOp === 'replace') {\n\t\t\t\t\t\t\t\t\t\t// if the children is being created, the edge is a link\n\t\t\t\t\t\t\t\t\t\treturn 'link';\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn childOp;\n\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t\toperationsArray.forEach((operation) => {\n\t\t\t\t\t\t\t\t\tif (!operation) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tconst op = getOp(operation.$op);\n\t\t\t\t\t\t\t\t\t/// validations\n\t\t\t\t\t\t\t\t\tif (op === 'replace') {\n\t\t\t\t\t\t\t\t\t\tthrow new Error('Not supported yet: replace on roleFields');\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (op === 'unlink' && totalUnlinks > 0) {\n\t\t\t\t\t\t\t\t\t\ttotalUnlinks += 1; // ugly temp solution while multiple roles can't be replaced\n\t\t\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t\t\t'Not supported yet: Cannot unlink more than one role at a time, please split into two mutations',\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t/// Edges can only be link or unlink. When its match for deletion or creation we need to know which one of those, so its either unlink or link!\n\t\t\t\t\t\t\t\t\tconst edgeType3 = {\n\t\t\t\t\t\t\t\t\t\t...objWithMetaDataOnly,\n\t\t\t\t\t\t\t\t\t\t$thing: value.$thing,\n\t\t\t\t\t\t\t\t\t\t$thingType: 'relation' as const,\n\t\t\t\t\t\t\t\t\t\t$op: op === 'delete' ? 'unlink' : op,\n\t\t\t\t\t\t\t\t\t\t[role]: operation.$bzId,\n\t\t\t\t\t\t\t\t\t\t$bzId: value.$bzId,\n\t\t\t\t\t\t\t\t\t\t[EdgeType]: 'roleField' as const,\n\t\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t\t\ttoEdges(edgeType3);\n\t\t\t\t\t\t\t\t\t/// when unlinking stuff, it must be merged with other potential roles.\n\t\t\t\t\t\t\t\t\t/// so we need to add it as both as match and 'unlink' so it gets merged with other unlinks\n\t\t\t\t\t\t\t\t\t// todo maybe a way to transform unlinks already in its own matches later? maybe split match-unlink and match-link\n\t\t\t\t\t\t\t\t\tif (op === 'unlink') {\n\t\t\t\t\t\t\t\t\t\t// toEdges({ ...edgeType3, $op: 'match' }); ///apparently no longer needed\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// throw new Error('Unsupported direct relation operation');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\ttraverse(blocks, listOp);\n\n\t\treturn [nodes, edges];\n\t};\n\n\tconst [parsedThings, parsedEdges] = listNodes(blocks);\n\t//console.log('parsedStuff', parsedThings, parsedEdges);\n\n\t//console.log('parsedThings', parsedThings);\n\t/// some cases where we extract things, they must be ignored.\n\t/// One of this cases is the situation where we have a thing that is linked somwhere and created, or updated.\n\t/// If it is only linked, we indeed need it with a \"match\" op, but if it is already there is no need to init it\n\tconst mergedThings = parsedThings.reduce((acc, thing) => {\n\t\t// Skip if the current item doesn't have a $tempId\n\t\tif (!thing.$bzId) {\n\t\t\treturn [...acc, thing];\n\t\t}\n\n\t\t// Check if this $tempId already exists in the accumulator\n\t\tconst existingIndex = acc.findIndex((t) => t.$bzId === thing.$bzId);\n\n\t\tif (existingIndex === -1) {\n\t\t\t// If it doesn't exist, add it to the accumulator\n\t\t\treturn [...acc, thing];\n\t\t}\n\t\t// If it exists, let's check the $op\n\t\tif (acc[existingIndex].$op === 'create' && thing.$op === 'match') {\n\t\t\t// If existing is 'create' and current is 'match', ignore current\n\t\t\treturn acc;\n\t\t}\n\t\tif (acc[existingIndex].$op === 'match' && (thing.$op === 'create' || thing.$op === 'match')) {\n\t\t\t// If existing is 'match' and current is 'create' or 'match', replace existing with current\n\t\t\treturn [...acc.slice(0, existingIndex), thing, ...acc.slice(existingIndex + 1)];\n\t\t}\n\t\t//if both are update, we simply merge them\n\t\tif (acc[existingIndex].$op === 'update' && thing.$op === 'update') {\n\t\t\treturn [...acc.slice(0, existingIndex), { ...acc[existingIndex], ...thing }, ...acc.slice(existingIndex + 1)];\n\t\t}\n\t\t//if one is update and the other is merge, same, we merge them and keep it as update.\n\t\tif (\n\t\t\t(acc[existingIndex].$op === 'update' && thing.$op === 'match') ||\n\t\t\t(acc[existingIndex].$op === 'match' && thing.$op === 'update')\n\t\t) {\n\t\t\treturn [\n\t\t\t\t...acc.slice(0, existingIndex),\n\t\t\t\t{ ...acc[existingIndex], ...thing, $op: 'update' },\n\t\t\t\t...acc.slice(existingIndex + 1),\n\t\t\t];\n\t\t}\n\t\t//if both are deletions, is fine as long as they have the same $filter\n\t\tif (acc[existingIndex].$op === 'delete' && thing.$op === 'delete') {\n\t\t\tif (JSON.stringify(acc[existingIndex].$filter) === JSON.stringify(thing.$filter)) {\n\t\t\t\treturn acc;\n\t\t\t} else {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`[Wrong format] Can't delete the same thing with different filters. Existing: ${acc[existingIndex].$filter}. Current: ${thing.$filter}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\t// For all other cases, throw an error\n\t\tthrow new Error(\n\t\t\t`[Wrong format] Wrong operation combination for $tempId/$id \"${thing.$tempId || thing.$id}\". Existing: ${acc[existingIndex].$op}. Current: ${thing.$op}`,\n\t\t);\n\t}, [] as BQLMutationBlock[]);\n\n\t/// merge attributes of relations that share the same $id\n\t/// WHY => because sometimes we get the relation because of having a parent, and other times because it is specified in the relation's properties\n\tconst mergedEdges = parsedEdges.reduce((acc, curr) => {\n\t\tconst existingEdge = acc.find(\n\t\t\t(r) =>\n\t\t\t\t((r.$id && r.$id === curr.$id) || (r.$bzId && r.$bzId === curr.$bzId)) &&\n\t\t\t\tr.$thing === curr.$thing &&\n\t\t\t\tr.$op === curr.$op,\n\t\t);\n\n\t\tif (existingEdge) {\n\t\t\tconst newRelation = { ...existingEdge };\n\n\t\t\tObject.keys(curr).forEach((key) => {\n\t\t\t\tif (typeof key === 'symbol' || key.startsWith('$')) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst existingVal = existingEdge[key];\n\t\t\t\tconst currVal = curr[key];\n\n\t\t\t\t//both values are arrays\n\t\t\t\tif (Array.isArray(existingVal) && Array.isArray(currVal)) {\n\t\t\t\t\tnewRelation[key] = Array.from(new Set([...existingVal, ...currVal]));\n\t\t\t\t}\n\t\t\t\t///the curent one is not but hte new one it is\n\t\t\t\telse if (!Array.isArray(existingVal) && Array.isArray(currVal)) {\n\t\t\t\t\tif (existingVal !== undefined) {\n\t\t\t\t\t\t// Avoid merging with undefined values.\n\t\t\t\t\t\tnewRelation[key] = Array.from(new Set([existingVal, ...currVal]));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnewRelation[key] = currVal;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t///the current one is but the new one it is not\n\t\t\t\telse if (Array.isArray(existingVal) && !Array.isArray(currVal)) {\n\t\t\t\t\tif (currVal !== undefined) {\n\t\t\t\t\t\t// Avoid merging with undefined values.\n\t\t\t\t\t\tnewRelation[key] = Array.from(new Set([...existingVal, currVal]));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t//both exist and are not arrays\n\t\t\t\telse if (existingVal !== null && currVal !== null && existingVal !== undefined && currVal !== undefined) {\n\t\t\t\t\tnewRelation[key] = Array.from(new Set([existingVal, currVal]));\n\t\t\t\t} else if (existingVal === undefined || existingVal === null) {\n\t\t\t\t\tnewRelation[key] = currVal;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tconst newAcc = acc.filter(\n\t\t\t\t(r) =>\n\t\t\t\t\t!(\n\t\t\t\t\t\t((r.$id && r.$id === curr.$id) || (r.$bzId && r.$bzId === curr.$bzId)) &&\n\t\t\t\t\t\tr.$thing === curr.$thing &&\n\t\t\t\t\t\tr.$op === curr.$op\n\t\t\t\t\t),\n\t\t\t);\n\n\t\t\treturn [...newAcc, newRelation];\n\t\t}\n\n\t\treturn [...acc, curr];\n\t}, [] as BQLMutationBlock[]);\n\n\t//console.log('parsedThings', parsedThings);\n\t//console.log('parsedEdges', parsedEdges);\n\t//console.log('mergedEdges', mergedEdges);\n\t/// VALIDATIONS\n\n\t// VALIDATION: Check that every thing in the list that is an edge, has at least one player\n\n\tmergedThings.forEach((thing) => {\n\t\tif (thing.$thingType === 'relation' || 'relation' in thing) {\n\t\t\t//if it is a relation, we need at lease one edge defined for it\n\t\t\tif (\n\t\t\t\tmergedEdges.filter((edge) => edge.$bzId === thing.$bzId || (edge.$tempId && edge.$tempId === thing.$tempId))\n\t\t\t\t\t.length === 0\n\t\t\t) {\n\t\t\t\tif (thing.$op === 'delete' || thing.$op === 'match' || thing.$op === 'update') {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`[Wrong format] Can't create a relation without any player. Node: ${JSON.stringify(deepRemoveMetaData(thing))}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t});\n\n\t///Validate that each tempId has at least one creation op:\n\tconst allThings = [...mergedThings, ...mergedEdges];\n\tconst tempIds = new Set(allThings.filter((x) => x.$tempId).map((x) => x.$tempId));\n\tconst orphanTempIds = Array.from(tempIds).filter(\n\t\t(tempId) => !allThings.some((x) => x.$tempId === tempId && x.$op === 'create'),\n\t);\n\n\tif (orphanTempIds.length > 0) {\n\t\tthrow new Error(\n\t\t\t`Can't link a $tempId that has not been created in the current mutation: ${orphanTempIds.join(', ')}`,\n\t\t);\n\t}\n\n\treturn {\n\t\tmergedThings,\n\t\tmergedEdges,\n\t};\n};\n","/* eslint-disable no-param-reassign */\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport { produce } from 'immer';\nimport type { TraversalCallbackContext } from 'object-traversal';\nimport { traverse } from 'object-traversal';\nimport { expect } from 'vitest';\n\nexport const deepSort = <T>(obj: T, key: string = '$id'): T => {\n\tif (typeof obj !== 'object' || obj === null) {\n\t\treturn obj;\n\t}\n\n\tconst sorter = (a: unknown, b: unknown) => {\n\t\tif (Array.isArray(a) || Array.isArray(b) || typeof a !== typeof b) {\n\t\t\t// Don't sort an array of arrays or an array with different types.\n\t\t\treturn 0;\n\t\t}\n\t\tlet aCmp;\n\t\tlet bCmp;\n\t\tif (typeof a === 'object' && a !== null) {\n\t\t\taCmp = (a as Record<string, any>)[key];\n\t\t} else {\n\t\t\taCmp = a;\n\t\t}\n\t\tif (typeof b === 'object' && b !== null) {\n\t\t\tbCmp = (b as Record<string, any>)[key];\n\t\t} else {\n\t\t\tbCmp = b;\n\t\t}\n\t\tif (aCmp < bCmp) {\n\t\t\treturn -1;\n\t\t}\n\t\tif (aCmp > bCmp) {\n\t\t\treturn 1;\n\t\t}\n\t\treturn 0;\n\t};\n\n\tif (Array.isArray(obj)) {\n\t\tconst newObj = obj.map((i) => deepSort(i, key));\n\t\treturn newObj.sort(sorter) as T;\n\t}\n\n\tif (typeof obj === 'object' && obj !== null) {\n\t\treturn Object.fromEntries(Object.entries(obj).map(([k, v]) => [k, deepSort(v, key)])) as T;\n\t}\n\n\treturn obj;\n};\n\nexport const deepRemoveMetaData = (obj: object) => {\n\tconst removeMeta = ({ value }: TraversalCallbackContext) => {\n\t\tif (value && typeof value === 'object' && '$id' in value) {\n\t\t\tconst metas = Object.keys(value).filter((k) => k.startsWith('$'));\n\t\t\tmetas.forEach((k) => delete value[k]);\n\t\t\tconst symbols = Object.keys(value).filter((s) => typeof s === 'symbol');\n\t\t\tsymbols.forEach((s) => delete value[s]);\n\t\t}\n\t\treturn value;\n\t};\n\treturn produce(obj, (draft) => traverse(draft, removeMeta));\n};\n\nconst checkRecursive = <T>(obj: T): T => {\n\tif (Array.isArray(obj)) {\n\t\treturn expect.arrayContaining(obj.map(checkRecursive)) as unknown as T;\n\t}\n\tif (typeof obj === 'object' && obj !== null) {\n\t\tconst newObj: { [key: string]: any } = {};\n\t\tObject.entries(obj).forEach(([key, value]) => {\n\t\t\tnewObj[key] = checkRecursive(value);\n\t\t});\n\t\treturn newObj as T;\n\t}\n\treturn obj;\n};\n\nexport const expectArraysInObjectToContainSameElements = <T extends any[]>(received: T, expected: T): void => {\n\tif (Array.isArray(received)) {\n\t\texpect(received.length).toEqual(expected.length);\n\t\texpect(received).toEqual(expect.arrayContaining(expected.map(checkRecursive)));\n\t} else if (typeof received === 'object' && received !== null) {\n\t\tObject.entries(received).forEach(([key, value]) => {\n\t\t\t// @ts-expect-error - TODO description\n\t\t\texpectArraysInObjectToContainSameElements(value, expected[key as keyof typeof expected]);\n\t\t});\n\t} else {\n\t\tif (typeof expected === 'string' && (expected as string).startsWith('$')) {\n\t\t\treturn;\n\t\t}\n\t\texpect(received).toEqual(expected);\n\t}\n};\n\nexport const expectResLikeTemplate = () => {};\n\n/* //TODO probably using permutations\nexport const expectResLikeTemplate = (\n res: Record<string, any>,\n template: Record<string, any>,\n tempIds: Record<string, any> = {}\n): Record<string, any> => {\n const findMatchesForTemplatesWithVars = (\n resItems: any[],\n currentTemplatesWithVars: any[],\n currentTempIds: Record<string, any>\n ): boolean => {\n if (currentTemplatesWithVars.length === 0) {\n return true;\n }\n\n const template = currentTemplatesWithVars[0];\n\n for (let i = 0; i < resItems.length; i += 1) {\n const resItem = resItems[i];\n const originalTempIds = { ...currentTempIds };\n if (typeof template === 'string' && !(template in currentTempIds)) {\n currentTempIds[template] = resItem;\n }\n if (expectResLikeTemplate(resItem, template, currentTempIds)) {\n const remainingResItems = [...resItems];\n remainingResItems.splice(i, 1);\n const remainingTemplatesWithVars = [...currentTemplatesWithVars];\n remainingTemplatesWithVars.shift();\n if (findMatchesForTemplatesWithVars(remainingResItems, remainingTemplatesWithVars, currentTempIds)) {\n return true;\n }\n }\n currentTempIds = originalTempIds;\n }\n return false;\n };\n\n const isMatch = Object.keys(template).every((key) => {\n if (Array.isArray(template[key])) {\n const templatesWithVars: any[] = [];\n const templatesWithoutVars: any[] = [];\n template[key].forEach((item: any) => {\n if (\n (typeof item === 'string' && item.startsWith('$')) ||\n (typeof item === 'object' &&\n Object.values(item).some((val: any) => typeof val === 'string' && val.startsWith('$')))\n ) {\n templatesWithVars.push(item);\n } else {\n templatesWithoutVars.push(item);\n }\n });\n\n templatesWithoutVars.every((item: any) => {\n const matchIndex = res[key].findIndex((resItem: any) => {\n return expectResLikeTemplate(resItem, item, { ...tempIds });\n });\n if (matchIndex !== -1) {\n res[key].splice(matchIndex, 1);\n return true;\n }\n return false;\n });\n\n return findMatchesForTemplatesWithVars(res[key], templatesWithVars, tempIds);\n }\n if (typeof template[key] === 'object' && template[key] !== null && !(template[key] instanceof Date)) {\n return expectResLikeTemplate(res[key], template[key], tempIds);\n }\n if (typeof template[key] === 'string' && template[key].startsWith('$')) {\n if (!(template[key] in tempIds)) {\n tempIds[template[key]] = res[key];\n }\n return res[key] === tempIds[template[key]];\n }\n return res[key] === template[key];\n });\n\n if (!isMatch) {\n throw new Error('No matching item found for template');\n }\n\n return tempIds;\n};\n*/\n","/* eslint-disable import/export */\n/* eslint-disable @typescript-eslint/ban-types */\n/* eslint-disable prefer-destructuring */\n/* eslint-disable no-param-reassign */\n/* eslint-disable @typescript-eslint/no-use-before-define */\n/* eslint-disable func-style */\n/* eslint-disable no-prototype-builtins */\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\n\n/**\n * TS Helpers\n */\ntype NestedKeys<T> = T extends object\n\t? {\n\t\t\t[P in keyof T]-?: P extends string ? keyof T[P] : never;\n\t\t}[keyof T]\n\t: never;\n\ntype AllStateKeys<T> = NestedKeys<T> | keyof T;\n\n/**\n * The debugging object contains an _onEnter method, wich can be set to invoke\n * this function on every transition.\n */\nexport const d: {\n\t_onEnter?: OnEnterFunction<Machine>;\n} = {};\n\n/**\n * The `createMachine` function creates a state machine. It takes an object of *states* with the key being the state name.\n * The value is usually *state* but might also be *invoke*.\n *\n * @param initial - Creates a machine that has *initial* as it's initial state.\n * @param states - An object of states, where each key is a state name, and the values are one of *state* or *invoke*.\n * @param context - A function that returns an object of extended state values. The function can receive an `event` argument.\n */\nexport function createMachine<S = {}, C = {}>(\n\tinitial: keyof S,\n\tstates: { [K in keyof S]: MachineState },\n\tcontext?: ContextFunction<C>,\n): Machine<typeof states, C, AllStateKeys<S>>;\n/**\n * The `createMachine` function creates a state machine. It takes an object of *states* with the key being the state name.\n * The value is usually *state* but might also be *invoke*.\n *\n * @param states - An object of states, where each key is a state name, and the values are one of *state* or *invoke*.\n * @param context - A function that returns an object of extended state values. The function can receive an `event` argument.\n */\nexport function createMachine<S = {}, C = {}>(\n\tstates: { [K in keyof S]: MachineState },\n\tcontext?: ContextFunction<C>,\n): Machine<typeof states, C, AllStateKeys<S>>;\n\n/**\n * The `state` function returns a state object. A state can take transitions and immediates as arguments.\n *\n * @param args - Any argument needs to be of type Transition or Immediate.\n */\nexport function state(...args: (Transition | Immediate)[]): MachineState;\n\n/**\n * A `transition` function is used to move from one state to another.\n *\n * @param event - This will give the name of the event that triggers this transition.\n * @param state - The name of the destination state.\n * @param args - Any extra argument will be evaluated to check if they are one of Reducer, Guard or Action.\n */\nexport function transition<C, E>(\n\tevent: string,\n\tstate: string,\n\t...args: (Reducer<C, E> | Guard<C, E> | Action<C, E>)[]\n): Transition;\n\n/**\n * An `immediate` function is a type of transition that occurs immediately; it doesn't wait for an event to proceed.\n * This is a state that immediately proceeds to the next.\n *\n * @param state - The name of the destination state.\n * @param args - Any extra argument will be evaluated to check if they are a Reducer or a Guard.\n */\nexport function immediate<C, E>(state: string, ...args: (Reducer<C, E> | Guard<C, E> | Action<C, E>)[]): Transition;\n\n/**\n * A `guard` is a method that determines if a transition can proceed.\n * Returning true allows the transition to occur, returning false prevents it from doing so and leaves the state in its current place.\n *\n * @param guardFunction A Function that can receive *context* and *event* and will return true or false.\n */\nexport function guard<C, E>(guardFunction?: GuardFunction<C, E>): Guard<C, E>;\n\n/**\n * A `reduce` takes a reducer function for changing the context of the machine. A common use case is to set values coming from form fields.\n *\n * @param reduceFunction A Function that can receive *context* and *event* and will return the context.\n */\nexport function reduce<C, E>(reduceFunction?: ReduceFunction<C, E>): Reducer<C, E>;\n\n/**\n * An `action` function takes a function that will be run during a transition. The primary purpose of using action is to perform side-effects.\n *\n * @param actionFunction A Function that can receive *context* and *event*. Returned values are discarded.\n */\nexport function action<C, E>(actionFunction?: ActionFunction<C, E>): Action<C, E>;\n\n/**\n * The `interpret` function takes a machine and creates a service that can send events into the machine, changing its states.\n * A service does not mutate a machine, but rather creates derived machines with the current state set.\n *\n * @param machine The state `machine`, created with *createMachine* to create a new service for.\n * @param onChange A callback that is called when the machine completes a transition. Even if the transition results in returning to the same state, the `onChange` callback is still called.\n * @param event The `event` can be any object. It is passed to the context function\n */\nexport function interpret<M extends Machine, E>(\n\tmachine: M,\n\tonChange?: InterpretOnChangeFunction<typeof machine>,\n\tinitialContext?: M['context'],\n\tevent?: { [K in keyof E]: any },\n): Service<typeof machine>;\n\n/**\n * The `invoke` is a special type of state that immediately invokes a Promise-returning or Machine-returning function, or another machine.\n *\n * @param fn - Promise-returning function\n * @param args - Any argument needs to be of type Transition or Immediate.\n */\nexport function invoke<C, T, E extends {} = any>(\n\tfn: (ctx: C, e?: E) => Promise<T>,\n\t...args: (Transition | Immediate)[]\n): MachineState;\n\n/**\n * The `invoke` is a special type of state that immediately invokes a Promise-returning or Machine-returning function, or another machine.\n *\n * @param fn - Machine-returning function\n * @param args - Any argument needs to be of type Transition or Immediate.\n */\nexport function invoke<C, E extends {} = any, M extends Machine>(\n\tfn: (ctx: C, e?: E) => M,\n\t...args: (Transition | Immediate)[]\n): MachineState;\n\n/**\n * The `invoke` is a special type of state that immediately invokes a Promise-returning or Machine-returning function, or another machine.\n *\n * @param machine - Machine\n * @param args - Any argument needs to be of type Transition or Immediate.\n */\nexport function invoke<M extends Machine>(machine: M, ...args: (Transition | Immediate)[]): MachineState;\n\n/* General Types */\n\nexport type ContextFunction<T> = (initialContext: T) => T;\n\nexport type GuardFunction<C, E> = (context: C, event: E) => boolean;\n\nexport type ActionFunction<C, E> = (context: C, event: E) => unknown;\n\nexport type ReduceFunction<C, E> = (context: C, event: E) => C;\n\nexport type InterpretOnChangeFunction<T extends Machine> = (service: Service<T>) => void;\n\nexport type SendEvent = string | { type: string; [key: string]: any };\nexport type SendFunction<T = SendEvent> = (event: T) => void;\n\n/**\n * This function is invoked before entering a new state and is bound to the debug\n * object. It is usable to inspect or log changes.\n *\n * @param machine - Machine\n * @param to - name of the target state\n * @param state - current state\n * @param prevState - previous state\n * @param event - event provoking the state change\n */\nexport type OnEnterFunction<M extends Machine> = <C = M['state']>(\n\tmachine: M,\n\tto: string,\n\tstate: C,\n\tprevState: C,\n\tevent?: SendEvent,\n) => void;\n\nexport type Machine<S = {}, C = {}, K = string> = {\n\tcontext: C;\n\tcurrent: K;\n\tstates: S;\n\tstate: {\n\t\tname: K;\n\t\tvalue: MachineState;\n\t};\n};\n\nexport type Action<C, E> = {\n\tfn: ActionFunction<C, E>;\n};\n\nexport type Reducer<C, E> = {\n\tfn: ReduceFunction<C, E>;\n};\n\nexport type Guard<C, E> = {\n\tfn: GuardFunction<C, E>;\n};\n\nexport interface MachineState {\n\tfinal: boolean;\n\ttransitions: Map<string, Transition[]>;\n\timmediates?: Map<string, Immediate[]>;\n\tenter?: any;\n}\n\nexport interface Transition {\n\tfrom: string | null;\n\tto: string;\n\tguards: any[];\n\treducers: any[];\n}\n\nexport interface Service<M extends Machine> {\n\tchild?: Service<M>;\n\tmachine: M;\n\tcontext: M['context'];\n\tonChange: InterpretOnChangeFunction<M>;\n\tsend: SendFunction;\n}\n\nexport type Immediate = Transition;\n\nfunction valueEnumerable(value) {\n\treturn { enumerable: true, value };\n}\n\nfunction valueEnumerableWritable(value) {\n\treturn { enumerable: true, writable: true, value };\n}\n\nconst truthy = () => true;\nconst empty = () => ({});\nconst identity = (a) => a;\nconst callBoth = (par, fn, self, args) => par.apply(self, args) && fn.apply(self, args);\nconst callForward = (par, fn, self, [a, b]) => fn.call(self, par.call(self, a, b), b);\nconst create = (a, b) => Object.freeze(Object.create(a, b));\n\nfunction stack(fns, def, caller) {\n\treturn fns.reduce((par, fn) => {\n\t\treturn function (...args) {\n\t\t\treturn caller(par, fn, this, args);\n\t\t};\n\t}, def);\n}\n\nfunction fnType(fn) {\n\treturn create(this, { fn: valueEnumerable(fn) });\n}\n\nconst reduceType = {};\nexport const reduce = fnType.bind(reduceType);\nexport const action = (fn) => reduce((ctx, ev) => !!~fn(ctx, ev) && ctx);\n\nconst guardType = {};\nexport const guard = fnType.bind(guardType);\n\nfunction filter(Type, arr) {\n\treturn arr.filter((value) => Type.isPrototypeOf(value));\n}\n\nfunction makeTransition(from, to, ...args) {\n\tconst guards = stack(\n\t\tfilter(guardType, args).map((t) => t.fn),\n\t\ttruthy,\n\t\tcallBoth,\n\t);\n\tconst reducers = stack(\n\t\tfilter(reduceType, args).map((t) => t.fn),\n\t\tidentity,\n\t\tcallForward,\n\t);\n\treturn create(this, {\n\t\tfrom: valueEnumerable(from),\n\t\tto: valueEnumerable(to),\n\t\tguards: valueEnumerable(guards),\n\t\treducers: valueEnumerable(reducers),\n\t});\n}\n\nconst transitionType = {};\nconst immediateType = {};\nexport const transition = makeTransition.bind(transitionType);\nexport const immediate = makeTransition.bind(immediateType, null);\n\nfunction enterImmediate(machine, service, event) {\n\treturn transitionTo(service, machine, event, this.immediates) || machine;\n}\n\nfunction transitionsToMap(transitions) {\n\tconst m = new Map();\n\tfor (const t of transitions) {\n\t\tif (!m.has(t.from)) {\n\t\t\tm.set(t.from, []);\n\t\t}\n\t\tm.get(t.from).push(t);\n\t}\n\treturn m;\n}\n\nconst stateType = { enter: identity };\nexport function state(...args) {\n\tconst transitions = filter(transitionType, args);\n\tconst immediates = filter(immediateType, args);\n\tconst desc = {\n\t\tfinal: valueEnumerable(args.length === 0),\n\t\ttransitions: valueEnumerable(transitionsToMap(transitions)),\n\t};\n\tif (immediates.length) {\n\t\tdesc.immediates = valueEnumerable(immediates);\n\t\tdesc.enter = valueEnumerable(enterImmediate);\n\t}\n\treturn create(stateType, desc);\n}\n\nconst invokeFnType = {\n\tenter(machine2, service, event) {\n\t\tconst rn = this.fn.call(service, service.context, event);\n\t\tif (machine.isPrototypeOf(rn)) {\n\t\t\treturn create(invokeMachineType, {\n\t\t\t\tmachine: valueEnumerable(rn),\n\t\t\t\ttransitions: valueEnumerable(this.transitions),\n\t\t\t}).enter(machine2, service, event);\n\t\t}\n\t\trn.then((data) => service.send({ type: 'done', data })).catch((error) => service.send({ type: 'error', error }));\n\t\treturn machine2;\n\t},\n};\nconst invokeMachineType = {\n\tenter(machine, service, event) {\n\t\tservice.child = interpret(\n\t\t\tthis.machine,\n\t\t\t(s) => {\n\t\t\t\tservice.onChange(s);\n\t\t\t\tif (service.child == s && s.machine.state.value.final) {\n\t\t\t\t\tdelete service.child;\n\t\t\t\t\tservice.send({ type: 'done', data: s.context });\n\t\t\t\t}\n\t\t\t},\n\t\t\tservice.context,\n\t\t\tevent,\n\t\t);\n\t\tif (service.child.machine.state.value.final) {\n\t\t\tconst data = service.child.context;\n\t\t\tdelete service.child;\n\t\t\treturn transitionTo(service, machine, { type: 'done', data }, this.transitions.get('done'));\n\t\t}\n\t\treturn machine;\n\t},\n};\nexport function invoke(fn, ...transitions) {\n\tconst t = valueEnumerable(transitionsToMap(transitions));\n\treturn machine.isPrototypeOf(fn)\n\t\t? create(invokeMachineType, {\n\t\t\t\tmachine: valueEnumerable(fn),\n\t\t\t\ttransitions: t,\n\t\t\t})\n\t\t: create(invokeFnType, {\n\t\t\t\tfn: valueEnumerable(fn),\n\t\t\t\ttransitions: t,\n\t\t\t});\n}\n\nconst machine = {\n\tget state() {\n\t\treturn {\n\t\t\tname: this.current,\n\t\t\tvalue: this.states[this.current],\n\t\t};\n\t},\n};\n\nexport function createMachine(current, states, contextFn = empty) {\n\tif (typeof current !== 'string') {\n\t\tcontextFn = states || empty;\n\t\tstates = current;\n\t\tcurrent = Object.keys(states)[0];\n\t}\n\tif (d._create) {\n\t\td._create(current, states);\n\t}\n\treturn create(machine, {\n\t\tcontext: valueEnumerable(contextFn),\n\t\tcurrent: valueEnumerable(current),\n\t\tstates: valueEnumerable(states),\n\t});\n}\n\nfunction transitionTo(service, machine, fromEvent, candidates) {\n\tconst { context } = service;\n\tfor (const { to, guards, reducers } of candidates) {\n\t\tif (guards(context, fromEvent)) {\n\t\t\tservice.context = reducers.call(service, context, fromEvent);\n\n\t\t\tconst original = machine.original || machine;\n\t\t\tconst newMachine = create(original, {\n\t\t\t\tcurrent: valueEnumerable(to),\n\t\t\t\toriginal: { value: original },\n\t\t\t});\n\n\t\t\tif (d._onEnter) {\n\t\t\t\td._onEnter(machine, to, service.context, context, fromEvent);\n\t\t\t}\n\t\t\tconst state = newMachine.state.value;\n\t\t\tservice.machine = newMachine;\n\t\t\tservice.onChange(service);\n\t\t\treturn state.enter(newMachine, service, fromEvent);\n\t\t}\n\t}\n}\n\nfunction send(service, event) {\n\tconst eventName = event.type || event;\n\tconst { machine } = service;\n\tconst { value: state, name: currentStateName } = machine.state;\n\n\tif (state.transitions.has(eventName)) {\n\t\treturn transitionTo(service, machine, event, state.transitions.get(eventName)) || machine;\n\t} else {\n\t\tif (d._send) {\n\t\t\td._send(eventName, currentStateName);\n\t\t}\n\t}\n\treturn machine;\n}\n\nconst service = {\n\tsend(event) {\n\t\tsend(this, event);\n\t},\n};\n\nexport function interpret(machine, onChange, initialContext, event) {\n\tconst s = Object.create(service, {\n\t\tmachine: valueEnumerableWritable(machine),\n\t\tcontext: valueEnumerableWritable(machine.context(initialContext, event)),\n\t\tonChange: valueEnumerable(onChange),\n\t});\n\ts.send = s.send.bind(s);\n\ts.machine = s.machine.state.value.enter(s.machine, s, event);\n\treturn s;\n}\n","import { isObject, isArray } from 'radash';\nimport type { BQLResponse, BormConfig, QueryConfig } from '../../../types';\nimport { produce } from 'immer';\nimport type { TraversalCallbackContext } from 'object-traversal';\nimport { traverse } from 'object-traversal';\n\nexport const cleanQueryRes = (config: BormConfig, bqlRes: BQLResponse) => {\n\tif (!bqlRes) {\n\t\treturn;\n\t}\n\tconst withPostHooks = queryPostHooks(bqlRes);\n\tconst cleanedMetadata = cleanOutput(withPostHooks, config.query);\n\treturn cleanedMetadata;\n};\n\nconst queryPostHooks = (blocks: any) => {\n\treturn produce(blocks, (draft: any) =>\n\t\ttraverse(draft, ({ value: val }: TraversalCallbackContext) => {\n\t\t\tif (isObject(val)) {\n\t\t\t\t// eslint-disable-next-line no-param-reassign\n\t\t\t}\n\t\t}),\n\t);\n};\n\nconst cleanOutput = (blocks: any, config?: QueryConfig) => {\n\treturn produce(blocks, (draft: any) =>\n\t\ttraverse(draft, ({ value: val }: TraversalCallbackContext) => {\n\t\t\tif (isObject(val)) {\n\t\t\t\tconst value = val as any;\n\n\t\t\t\t// UNDEFINED FIELDS\n\t\t\t\tObject.keys(value).forEach((k: string) => {\n\t\t\t\t\tif (value[k] === undefined || value[k] === null || (isArray(value[k]) && value[k].length === 0)) {\n\t\t\t\t\t\tif (config?.returnNulls) {\n\t\t\t\t\t\t\tvalue[k] = null;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdelete value[k];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (value[k] === undefined) {\n\t\t\t\t\t\tdelete value[k];\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// INTERNAL SYMBOLS\n\t\t\t\tObject.getOwnPropertySymbols(value).forEach((symbol) => {\n\t\t\t\t\tdelete value[symbol];\n\t\t\t\t});\n\n\t\t\t\t/// USER FACING METADATA\n\t\t\t\tif (config?.noMetadata === true) {\n\t\t\t\t\t// eslint-disable-next-line no-param-reassign\n\t\t\t\t\tObject.keys(value).forEach((k: string) => {\n\t\t\t\t\t\tif (k.startsWith('$')) {\n\t\t\t\t\t\t\tdelete value[k];\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}),\n\t);\n};\n","import { isObject } from 'radash';\nimport { produce } from 'immer';\nimport type { TraversalCallbackContext } from 'object-traversal';\nimport { getNodeByPath, traverse } from 'object-traversal';\nimport type { BQLResponseMulti, EnrichedBormSchema, EnrichedBQLQuery } from '../../types';\nimport { getCurrentSchema } from '../../helpers';\nimport { computeField } from '../../engine/compute';\nimport { QueryPath } from '../../types/symbols';\n\nexport const postHooks = async (\n\tschema: EnrichedBormSchema,\n\tenrichedBqlQuery: EnrichedBQLQuery[],\n\tbqlRes: BQLResponseMulti,\n) => {\n\tif (!bqlRes) {\n\t\treturn;\n\t}\n\n\tconst queryPostHooks = (blocks: any) => {\n\t\t//console.log('queryPostHooks', blocks[0]);\n\t\treturn produce(blocks, (draft: any) =>\n\t\t\ttraverse(draft, ({ value: val }: TraversalCallbackContext) => {\n\t\t\t\tif (isObject(val)) {\n\t\t\t\t\tconst value = val as Record<string, any>;\n\n\t\t\t\t\tif (!value.$thing) {\n\t\t\t\t\t\t// JSON object.\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (value.$thing) {\n\t\t\t\t\t\tconst currentSchema = getCurrentSchema(schema, value);\n\t\t\t\t\t\tconst { virtualFields } = currentSchema;\n\n\t\t\t\t\t\tconst queryPath = value[QueryPath as any];\n\t\t\t\t\t\tif (!queryPath) {\n\t\t\t\t\t\t\tthrow new Error(`[Internal] QueryPath is missing. Value: ${JSON.stringify(value)}`);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst originalNode = getNodeByPath(enrichedBqlQuery, queryPath);\n\t\t\t\t\t\tif (originalNode.$fieldType === 'ref') {\n\t\t\t\t\t\t\treturn; // Not supported with refFields\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst queriedFields = originalNode.$fields.map((f: any) => f.$path);\n\t\t\t\t\t\tconst excludedFields = originalNode.$excludedFields;\n\n\t\t\t\t\t\t/// ADD VIRTUAL FIELDS\n\t\t\t\t\t\tvirtualFields.forEach((virtualFieldPath) => {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\texcludedFields?.includes(virtualFieldPath) ||\n\t\t\t\t\t\t\t\t(queriedFields.length > 0 && !queriedFields.includes(virtualFieldPath))\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst field = currentSchema.dataFields?.find((f) => f.path === virtualFieldPath);\n\n\t\t\t\t\t\t\tif (!field?.default) {\n\t\t\t\t\t\t\t\t///then is a virtual field and should be computed from the DB already\n\t\t\t\t\t\t\t\tif (value[virtualFieldPath] === undefined) {\n\t\t\t\t\t\t\t\t\tthrow new Error(`[Internal] Virtual field: No db value found for virtual field: ${virtualFieldPath}`);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconst computedValue = computeField({\n\t\t\t\t\t\t\t\t\tcurrentThing: value,\n\t\t\t\t\t\t\t\t\tfieldSchema: field,\n\t\t\t\t\t\t\t\t\tmandatoryDependencies: true,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tvalue[virtualFieldPath] = computedValue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t//EXCLUDE FIELDS\n\t\t\t\t\t\tif (excludedFields) {\n\t\t\t\t\t\t\t//this should only happen for id fields, as we query them always. Might remove also dependencies in the future\n\t\t\t\t\t\t\t//todo: move this as a last step of the machine, as a cleaner. Note: we are skipping it now for reference fields but we should not\n\t\t\t\t\t\t\texcludedFields.forEach((excludedField: string) => {\n\t\t\t\t\t\t\t\tif (typeof excludedField !== 'string') {\n\t\t\t\t\t\t\t\t\tthrow new Error('[Internal] ExcludedField is not a string');\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tdelete value[excludedField];\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}),\n\t\t);\n\t};\n\n\tconst postHooksBqlRes = queryPostHooks(bqlRes);\n\treturn postHooksBqlRes;\n};\n","import type {\n\tEnrichedAttributeQuery,\n\tEnrichedBQLQuery,\n\tEnrichedBormSchema,\n\tEnrichedFieldQuery,\n\tEnrichedLinkQuery,\n\tEnrichedRoleQuery,\n} from '../../../types';\nimport { indent } from '../../../helpers';\nimport { FieldSchema, QueryPath, SuqlMetadata } from '../../../types/symbols';\nimport { isArray } from 'radash';\nimport { sanitizeNameSurrealDB } from '../../../adapters/surrealDB/helpers';\nimport { parseFilter, buildSuqlFilter, buildSorter } from '../../../adapters/surrealDB/filters/filters';\n\nexport const build = (props: { queries: EnrichedBQLQuery[]; schema: EnrichedBormSchema }) => {\n\tconst { queries, schema } = props;\n\t//console.log('queries!', queries);\n\treturn queries.map((query) => buildQuery({ query, schema }));\n};\n\nconst buildQuery = (props: { query: EnrichedBQLQuery; schema: EnrichedBormSchema }): string | null => {\n\tconst { query, schema } = props;\n\tconst { $thing, $fields, $filter, $offset, $limit, $sort } = query;\n\n\tif ($fields.length === 0) {\n\t\treturn null;\n\t}\n\n\tconst lines: string[] = [];\n\n\tlines.push('SELECT');\n\n\tconst fieldLines = buildFieldsQuery({ parentQuery: query, queries: $fields, level: 1, schema });\n\tif (fieldLines) {\n\t\tlines.push(fieldLines);\n\t}\n\n\tconst currentSchema = schema.entities[$thing] || schema.relations[$thing];\n\tif (!currentSchema) {\n\t\tthrow new Error(`Schema for ${$thing} not found`);\n\t}\n\tconst allTypes = currentSchema.subTypes ? [$thing, ...currentSchema.subTypes] : [$thing];\n\tconst allTypesNormed = allTypes.map((t) => sanitizeNameSurrealDB(t));\n\n\tif (query.$id) {\n\t\tif (typeof query.$id === 'string') {\n\t\t\tlines.push(`FROM ${allTypesNormed.map((t) => `${t}:⟨${query.$id}⟩`).join(',')}`);\n\t\t} else if (isArray(query.$id)) {\n\t\t\tconst $ids = query.$id;\n\t\t\tconst allCombinations = allTypesNormed.flatMap((t) => $ids?.map((id) => `${t}:⟨${id}⟩`));\n\t\t\tlines.push(`FROM ${allCombinations.join(',')}`);\n\t\t\t//throw new Error('Multiple ids not supported');\n\t\t} else {\n\t\t\tthrow new Error('Invalid $id');\n\t\t}\n\t} else {\n\t\tlines.push(`FROM ${allTypesNormed.join(',')}`);\n\t}\n\n\tif ($filter) {\n\t\tconst parsed = parseFilter($filter, $thing, schema);\n\t\tconst filter = buildSuqlFilter(parsed);\n\t\tlines.push(`WHERE ${filter}`);\n\t}\n\n\tif ($sort) {\n\t\tlines.push(buildSorter($sort));\n\t}\n\n\tif (typeof $limit === 'number') {\n\t\tlines.push(`LIMIT ${$limit}`);\n\t}\n\n\tif (typeof $offset === 'number') {\n\t\tlines.push(`START ${$offset}`);\n\t}\n\n\treturn lines.join('\\n');\n};\n\nconst buildFieldsQuery = (props: {\n\tqueries: EnrichedFieldQuery[];\n\tschema: EnrichedBormSchema;\n\tlevel: number;\n\tparentQuery: EnrichedBQLQuery | EnrichedRoleQuery | EnrichedLinkQuery;\n}) => {\n\tconst { queries, schema, level, parentQuery } = props;\n\tconst lines: string[] = [];\n\n\tconst queryPath = parentQuery[QueryPath];\n\t//Metadata\n\tlines.push(indent(`\"${queryPath}\" as \\`$$queryPath\\``, level));\n\tlines.push(indent('record::id(id) as `$id`', level));\n\tlines.push(indent('record::tb(id) as `$thing`', level));\n\n\tqueries.forEach((i) => {\n\t\tconst line = buildFieldQuery({ query: i, level, schema });\n\t\tif (line) {\n\t\t\tlines.push(line);\n\t\t}\n\t});\n\tif (lines.length === 0) {\n\t\treturn null;\n\t}\n\treturn lines.join(',\\n');\n};\n\nconst buildFieldQuery = (props: {\n\tquery: EnrichedFieldQuery;\n\tschema: EnrichedBormSchema;\n\tlevel: number;\n}): string | null => {\n\tconst { query, schema, level } = props;\n\t//console.log('query!', query);\n\n\tif (query.$fieldType === 'data') {\n\t\treturn buildAttributeQuery({ query, level });\n\t}\n\tif (query.$fieldType === 'ref') {\n\t\tthrow new Error('Ref fields are not supported in this context');\n\t\t//return buildLinkQuery({ query, level, schema });\n\t}\n\tif (query.$fieldType === 'link') {\n\t\treturn buildLinkQuery({ query, level, schema });\n\t}\n\tif (query.$fieldType === 'role') {\n\t\treturn buildRoleQuery({ query, level, schema });\n\t}\n\treturn null;\n};\n\nconst buildAttributeQuery = (props: { query: EnrichedAttributeQuery; level: number }): string | null => {\n\tconst { query, level } = props;\n\tif (query.$isVirtual) {\n\t\treturn null;\n\t}\n\t// TODO: Get the field id from the schema.\n\tif (query.$path === 'id') {\n\t\treturn indent(`record::id(${query.$path}) AS ${query.$as}`, level);\n\t}\n\tif (query.$path === query.$as) {\n\t\treturn indent(`\\`${query.$path}\\``, level);\n\t}\n\treturn indent(`\\`${query.$path}\\` AS \\`${query.$as}\\``, level);\n};\n\nconst buildLinkQuery = (props: {\n\tquery: EnrichedLinkQuery;\n\tschema: EnrichedBormSchema;\n\tlevel: number;\n}): string | null => {\n\tconst { query, schema, level } = props;\n\tconst { $fields, $filter, $offset, $limit, $sort } = query;\n\n\tif ($fields.length === 0) {\n\t\treturn null;\n\t}\n\n\tconst lines: string[] = [];\n\n\tlines.push(indent('(', level));\n\n\tconst queryLevel = level + 1;\n\tlines.push(indent('SELECT', queryLevel));\n\n\tconst fieldLines = buildFieldsQuery({ parentQuery: query, queries: $fields, level: queryLevel + 1, schema });\n\tif (fieldLines) {\n\t\tlines.push(fieldLines);\n\t}\n\n\t/// FROM\n\tconst from = query[FieldSchema][SuqlMetadata].queryPath;\n\tlines.push(indent(`FROM ${from}`, queryLevel));\n\n\t/// FILTER WHERE\n\tif ($filter) {\n\t\tconst parsed = parseFilter($filter, query.$thing, schema);\n\t\tconst built = buildSuqlFilter(parsed);\n\t\tlines.push(`WHERE ${built}`);\n\t}\n\n\t/// SORT AND PAGINATION\n\tif ($sort) {\n\t\tlines.push(indent(buildSorter($sort), queryLevel));\n\t}\n\n\tif (typeof $limit === 'number') {\n\t\tlines.push(indent(`LIMIT ${$limit}`, queryLevel));\n\t}\n\n\tif (typeof $offset === 'number') {\n\t\tlines.push(indent(`START ${$offset}`, queryLevel));\n\t}\n\n\tlines.push(indent(`) AS \\`${query.$as}\\``, level));\n\n\treturn lines.join('\\n');\n};\n\nconst buildRoleQuery = (props: {\n\tquery: EnrichedRoleQuery;\n\tschema: EnrichedBormSchema;\n\tlevel: number;\n}): string | null => {\n\tconst { query, schema, level } = props;\n\n\tif (query.$fields.length === 0) {\n\t\treturn null;\n\t}\n\n\tconst lines: string[] = [];\n\n\tlines.push(indent('(', level));\n\n\tconst queryLevel = level + 1;\n\tlines.push(indent('SELECT', queryLevel));\n\n\tconst fieldLevel = queryLevel + 1;\n\tconst fieldLines = buildFieldsQuery({ parentQuery: query, queries: query.$fields, level: fieldLevel, schema });\n\tif (fieldLines) {\n\t\tlines.push(fieldLines);\n\t}\n\n\tconst from = query[FieldSchema][SuqlMetadata].queryPath;\n\tlines.push(indent(`FROM ${from}`, queryLevel));\n\n\tif (query.$filter) {\n\t\tconst parsed = parseFilter(query.$filter, query.$playedBy.thing, schema);\n\t\tconst built = buildSuqlFilter(parsed);\n\t\tlines.push(`WHERE ${built}`);\n\t}\n\n\tlines.push(indent(`) AS \\`${query.$as}\\``, level));\n\n\treturn lines.join('\\n');\n};\n","import { isArray, isObject, shake } from 'radash';\nimport { getFieldType } from '../../../helpers';\nimport type { Filter, EnrichedBormSchema, EnrichedLinkField, EnrichedRoleField } from '../../../types';\nimport { SuqlMetadata } from '../../../types/symbols';\n\nconst surqlOperators = {\n\t$eq: '$=',\n\t$not: '$!',\n\t$or: '$OR',\n\t$and: '$AND',\n\t$in: '$IN',\n\t$id: 'record::id(id)',\n\t$exists: '$exists',\n};\n\nexport const parseFilter = (filter: Filter, currentThing: string, schema: EnrichedBormSchema): Filter => {\n\tif (filter === null || filter === undefined) {\n\t\treturn filter;\n\t}\n\n\tconst wasArray = isArray(filter);\n\n\tconst arrayFilter = wasArray ? filter : [filter];\n\n\tconst resultArray = arrayFilter.map((f) => {\n\t\tconst keys = Object.keys(f);\n\n\t\tconst result = keys.reduce((acc, key) => {\n\t\t\tconst value = f[key];\n\n\t\t\tif (key.startsWith('$')) {\n\t\t\t\t//LOGICAL OPERATORS\n\t\t\t\tif (['$or', '$and', '$not'].includes(key)) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...acc,\n\t\t\t\t\t\t[key]: undefined,\n\t\t\t\t\t\t[surqlOperators[key as keyof typeof surqlOperators]]: parseFilter(value, currentThing, schema),\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// FILTER OPERATORS\n\t\t\t\tif (key === '$id') {\n\t\t\t\t\treturn { ...acc, $id: undefined, [surqlOperators[key]]: { $IN: isArray(value) ? value : [value] } };\n\t\t\t\t}\n\t\t\t\tif (key === '$thing') {\n\t\t\t\t\treturn acc; //do nothing for now, but in the future we will need to filter by tables as well, maybe record::tb(id) ...\n\t\t\t\t}\n\n\t\t\t\t//AUXILIARY OPERATORS\n\t\t\t\tif (key === '$exists') {\n\t\t\t\t\treturn { ...acc, $exists: undefined, [surqlOperators[key]]: value };\n\t\t\t\t}\n\n\t\t\t\t//VALUE OPERATORS\n\t\t\t\tif (key === '$eq') {\n\t\t\t\t\treturn { ...acc, $eq: undefined, [surqlOperators[key]]: value };\n\t\t\t\t}\n\t\t\t\tif (key === '$in') {\n\t\t\t\t\treturn { ...acc, $in: undefined, [surqlOperators[key]]: value };\n\t\t\t\t}\n\n\t\t\t\tthrow new Error(`Unknown filter operator ${key}`);\n\t\t\t\t//return { ...acc, [key]: parseFilter(value, currentThing, schema) };\n\t\t\t}\n\n\t\t\tconst currentSchema =\n\t\t\t\tcurrentThing in schema.entities ? schema.entities[currentThing] : schema.relations[currentThing];\n\n\t\t\tconst [fieldType, fieldSchema] = getFieldType(currentSchema, key);\n\n\t\t\tif (fieldType === 'idField') {\n\t\t\t\tif (currentSchema.idFields.length > 1) {\n\t\t\t\t\tthrow new Error('Multiple id fields not supported');\n\t\t\t\t} //todo: When composed id, this changes:\n\n\t\t\t\treturn { ...acc, 'record::id(id)': { $IN: isArray(value) ? value : [value] } };\n\t\t\t}\n\n\t\t\tif (fieldType === 'dataField') {\n\t\t\t\treturn { ...acc, [key]: parseFilter(value, currentThing, schema) }; //Probably good place to add ONLY and other stuff depending on the fieldSchema\n\t\t\t}\n\n\t\t\tif (fieldType === 'linkField' || fieldType === 'roleField') {\n\t\t\t\tconst fieldSchemaTyped = fieldSchema as EnrichedLinkField | EnrichedRoleField;\n\n\t\t\t\tconst surrealDBKey = fieldSchemaTyped[SuqlMetadata].queryPath;\n\n\t\t\t\treturn { ...acc, [surrealDBKey]: parseFilter(value, currentThing, schema) };\n\n\t\t\t\t/*if (fieldSchemaTyped.$things.length !== 1) {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t`Not supported yet: Role ${key} in ${JSON.stringify(value)} is played by multiple things: ${fieldSchemaTyped.$things.join(', ')}`,\n\t\t\t\t\t);\n\n\t\t\t\t\treturn { ...acc, [surrealDBKey]: parseFilter(value, currentThing, schema) };\n\t\t\t\t}\n\t\t\t\t//todo: we need to be able to filter by fields that only belong to subtypes\n\t\t\t\tconst [childrenThing] = fieldSchemaTyped.$things; //todo: multiple players, then it must be efined\n\n\t\t\t\treturn { ...acc, [surrealDBKey]: parseFilter(value, childrenThing, schema) };*/\n\t\t\t}\n\n\t\t\tthrow new Error(`Field ${key} not found in schema, Defined in $filter`);\n\t\t}, {});\n\n\t\treturn shake(result);\n\t});\n\n\treturn wasArray ? resultArray : resultArray[0];\n};\n\nexport const buildSuqlFilter = (filter: object): string => {\n\tif (filter === null || filter === undefined) {\n\t\treturn '';\n\t}\n\n\tconst entries = Object.entries(filter);\n\tconst parts: string[] = [];\n\n\tentries.forEach(([key, value]) => {\n\t\t// Handle logical operators\n\t\tif (['$OR', '$AND', '$!'].includes(key)) {\n\t\t\tconst logicalOperator = key.replace('$', '');\n\n\t\t\tconst nestedFilters = Array.isArray(value) ? value.map((v) => buildSuqlFilter(v)) : [buildSuqlFilter(value)];\n\n\t\t\tif (logicalOperator === '!') {\n\t\t\t\t// Correctly handle the negation\n\t\t\t\tparts.push(`!(${nestedFilters.join(' AND ')})`);\n\t\t\t} else {\n\t\t\t\tparts.push(`(${nestedFilters.join(` ${logicalOperator} `)})`);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Handle field-specific filters\n\t\tif (isObject(value)) {\n\t\t\tif (key.includes('<-') || key.includes('->')) {\n\t\t\t\tconst nestedFilter = buildSuqlFilter(value);\n\t\t\t\tparts.push(`${key}[WHERE ${nestedFilter}]`);\n\t\t\t} else if (key.startsWith('$parent.[')) {\n\t\t\t\t// Handle references with cardinality MANY\n\t\t\t\tconst nestedFilter = buildSuqlFilter(value);\n\t\t\t\tconst keyWithoutPrefix = key.replace('$parent.', '').replace(/^\\[(.*)\\]$/, '$1');\n\t\t\t\tparts.push(`fn::as_array(${keyWithoutPrefix})[WHERE id && ${nestedFilter}]`);\n\t\t\t} else if (key.startsWith('$parent')) {\n\t\t\t\t// Handle references with cardinality ONE\n\t\t\t\tconst nestedFilter = buildSuqlFilter(value);\n\t\t\t\tconst keyWithoutPrefix = key.replace('$parent.', '');\n\t\t\t\tparts.push(`fn::as_array(${keyWithoutPrefix})[WHERE id && ${nestedFilter}]`);\n\t\t\t} else if (key.startsWith('$')) {\n\t\t\t\tthrow new Error(`Invalid key ${key}`);\n\t\t\t} else {\n\t\t\t\t// Handle field operators\n\t\t\t\tconst valueKeys = Object.keys(value);\n\t\t\t\tif (valueKeys.length === 1 && valueKeys[0].startsWith('$')) {\n\t\t\t\t\tconst [operator] = valueKeys;\n\t\t\t\t\t//@ts-expect-error - Todo\n\t\t\t\t\tconst nextValue: unknown = value[operator];\n\n\t\t\t\t\tif (operator === '$exists') {\n\t\t\t\t\t\t// Handle $exists operator\n\t\t\t\t\t\tif (nextValue === true) {\n\t\t\t\t\t\t\tparts.push(`${key} IS NOT NONE`);\n\t\t\t\t\t\t} else if (nextValue === false) {\n\t\t\t\t\t\t\tparts.push(`${key} IS NONE`);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthrow new Error(`Invalid value for $exists: ${nextValue}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Handle other operators\n\t\t\t\t\t\tconst surrealOperator = operator.replace('$', '');\n\t\t\t\t\t\tif (Array.isArray(nextValue)) {\n\t\t\t\t\t\t\tparts.push(\n\t\t\t\t\t\t\t\t`${key} ${surrealOperator} [${nextValue.map((v) => (v === null ? 'NONE' : `'${v}'`)).join(', ')}]`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else if (isObject(nextValue)) {\n\t\t\t\t\t\t\tconst nestedFilter = buildSuqlFilter(nextValue);\n\t\t\t\t\t\t\tparts.push(`${key} ${surrealOperator} ${nestedFilter}`);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tparts.push(`${key} ${surrealOperator} ${nextValue === null ? 'NONE' : `'${nextValue}'`}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(`Invalid key ${key}`);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// Handle simple field equality\n\t\t\tif (Array.isArray(value)) {\n\t\t\t\tconst operator = key.startsWith('$') ? key.replace('$', '') : 'IN'; //maybe could do const operator = 'IN';\n\t\t\t\tparts.push(`${key} ${operator} [${value.map((v) => (v === null ? 'NONE' : `'${v}'`)).join(', ')}]`);\n\t\t\t} else {\n\t\t\t\tconst operator = key.startsWith('$') ? key.replace('$', '') : '='; //maybe could do const operator = '=';\n\t\t\t\tparts.push(`${key} ${operator} ${value === null ? 'NONE' : `'${value}'`}`);\n\t\t\t}\n\t\t}\n\t});\n\n\treturn parts.join(' AND ');\n};\n\nexport const buildSorter = (sort: ({ field: string; desc?: boolean } | string)[]) => {\n\tconst sorters = sort.map((i) => {\n\t\tif (typeof i === 'string') {\n\t\t\treturn i;\n\t\t}\n\n\t\tconst { field, desc } = i;\n\n\t\treturn `${field}${desc ? ' DESC' : ' ASC'}`;\n\t});\n\n\treturn `ORDER BY ${sorters.join(', ')}`;\n};\n","// eslint-disable-next-line turbo/no-undeclared-env-vars\nexport const VERSION = process.env.npm_package_version;\n","const LOG_LEVEL = new Set(\n\t// eslint-disable-next-line turbo/no-undeclared-env-vars\n\t(process.env.LOG_LEVEL || '')\n\t\t.split(',')\n\t\t.map((i) => i.trim())\n\t\t.filter((i) => !!i),\n);\n\ntype LogLevel = 'debug' | 'info' | 'warning' | 'error';\n\nexport const log = (level: LogLevel | LogLevel[], ...args: unknown[]) => {\n\tconst shouldLog = Array.isArray(level) ? level.some((l) => LOG_LEVEL.has(l)) : LOG_LEVEL.has(level);\n\tif (shouldLog) {\n\t\tconsole.log(...args);\n\t}\n};\n\nexport const logDebug = (...args: unknown[]) => log('debug', ...args);\n\nexport const logInfo = (...args: unknown[]) => log('info', ...args);\n\nexport const logWarning = (...args: unknown[]) => log('warning', ...args);\n\nexport const logError = (...args: unknown[]) => log('error', ...args);\n","import type { SimpleSurrealClient } from '../../../adapters/surrealDB/client';\nimport { VERSION } from '../../../version';\nimport { logDebug } from '../../../logger';\nimport type { BormConfig } from '../../../types';\n\nexport const run = async (props: {\n\tclient: SimpleSurrealClient;\n\tqueries: string[];\n\tconfig: BormConfig;\n}): Promise<any[][]> => {\n\tconst { client, queries, config } = props;\n\tconst batchedQuery = `\n\tBEGIN TRANSACTION;\n\t${queries.join(';')};\n\tCOMMIT TRANSACTION;\n\t`;\n\n\tif (config.query?.debugger) {\n\t\tlogDebug(`batchedQuery[${VERSION}]`, JSON.stringify({ batchedQuery }));\n\t}\n\t//console.log('batchedQuery!', batchedQuery);\n\n\treturn await client.query(batchedQuery);\n};\n","import { isArray, isDate, mapEntries } from 'radash';\nimport type {\n\tBormConfig,\n\tContentType,\n\tEnrichedBormSchema,\n\tEnrichedBQLQuery,\n\tEnrichedFieldQuery,\n\tEnrichedLinkQuery,\n\tEnrichedRoleQuery,\n} from '../../../types';\nimport { FieldSchema, QueryPath } from '../../../types/symbols';\nimport { sanitizeTableNameSurrealDb } from '../../../adapters/surrealDB/helpers';\nimport { getSchemaByThing } from '../../../helpers';\n\nexport const parse = (props: {\n\tres: Record<string, any>[][];\n\tqueries: EnrichedBQLQuery[];\n\tschema: EnrichedBormSchema;\n\tconfig: BormConfig;\n}) => {\n\tconst { res, queries, schema } = props;\n\t//console.log('res!', JSON.stringify(res, null, 2));\n\tconst result = res.map((r, i) => parseRes(queries[i], r, schema));\n\t//console.log('result', result);\n\treturn result;\n};\n\nconst parseRes = (\n\tquery: EnrichedBQLQuery | EnrichedLinkQuery | EnrichedRoleQuery,\n\tres: Record<string, any>[],\n\tschema: EnrichedBormSchema,\n) => {\n\tif (isArray(res)) {\n\t\tif (res.length === 0) {\n\t\t\treturn null;\n\t\t}\n\t\tif (query.$filterByUnique) {\n\t\t\tif (res.length > 1) {\n\t\t\t\tthrow new Error('Multiple results found for unique query');\n\t\t\t} else {\n\t\t\t\treturn parseObj(query, res[0], schema);\n\t\t\t}\n\t\t}\n\t\tif (res.length >= 1) {\n\t\t\treturn res.map((r) => parseObj(query, r, schema));\n\t\t}\n\t} else {\n\t\tthrow new Error('res is unexpectedly not an array');\n\t}\n};\n\nconst parseObj = (\n\tquery: EnrichedBQLQuery | EnrichedLinkQuery | EnrichedRoleQuery,\n\tobj: Record<string, any>,\n\tschema: EnrichedBormSchema,\n) => {\n\t// eslint-disable-next-line prefer-destructuring\n\tconst $thing = obj['$thing'] || obj.tb;\n\tconst $thingType = $thing in schema.entities ? 'entity' : $thing in schema.relations ? 'relation' : 'error';\n\tif ($thingType === 'error') {\n\t\tthrow new Error(`[Internal] The $thing ${$thing} is not defined in the schema.`);\n\t}\n\n\tconst newObj: Record<string, any> = {\n\t\t//init with symbols\n\t\t[QueryPath]: obj['$$queryPath'],\n\t\t$id: obj['$id'],\n\t\t$thing: sanitizeTableNameSurrealDb($thing),\n\t\t$thingType, //This is actually not true always, will need to be fetched from the $thing\n\t};\n\n\t// For normal fields, we parse each field classically\n\tquery.$fields.forEach((f) => {\n\t\tconst key = f.$as;\n\t\tconst value = obj[key];\n\t\t// TODO: Look up what the id field is in the schema.\n\t\tif (f.$path === 'id' && query.$idNotIncluded) {\n\t\t\treturn;\n\t\t}\n\t\tnewObj[key] = parseFieldResult(f, value, schema);\n\t});\n\n\treturn newObj;\n};\n\nconst parseFieldResult = (query: EnrichedFieldQuery, value: any, schema: EnrichedBormSchema) => {\n\tif (value === undefined || value === null || (isArray(value) && value.length === 0)) {\n\t\treturn null;\n\t}\n\n\tif (query.$fieldType === 'data') {\n\t\tconst { contentType /*,cardinality*/ } = query[FieldSchema];\n\n\t\treturn parseValue(value, contentType) ?? null;\n\t}\n\tif (query.$fieldType === 'ref') {\n\t\tconst asArray = isArray(value) ? value : [value];\n\t\tconst parsedContent = asArray.map((v) => {\n\t\t\tif (v.$thing) {\n\t\t\t\tconst currentSchema = getSchemaByThing(schema, v.$thing);\n\t\t\t\tconst [idField] = currentSchema.idFields;\n\t\t\t\t//console.log('currentSchema!', currentSchema);\n\t\t\t\tif (query.$justId) {\n\t\t\t\t\treturn v.$id;\n\t\t\t\t}\n\t\t\t\t//todo: We will fix this once surrealDB enables some sort of SELECT ( SELECT * FROM $parent.*). Meanwhile we can only query one nested level\n\t\t\t\tconst flatNestedField = (nf: unknown) => {\n\t\t\t\t\tif (nf && typeof nf === 'object' && 'id' in nf && 'tb' in nf) {\n\t\t\t\t\t\treturn nf.id;\n\t\t\t\t\t}\n\t\t\t\t\t//todo: This is a value, and we might need to parse it correctly. We know the schema and the key, so we can do it.\n\t\t\t\t\treturn nf;\n\t\t\t\t};\n\t\t\t\tconst temporallyFlatNestedIds = mapEntries(v, (key, content) => {\n\t\t\t\t\tif (isArray(content)) {\n\t\t\t\t\t\treturn [key, content.map((i) => flatNestedField(i))];\n\t\t\t\t\t}\n\t\t\t\t\treturn [key, flatNestedField(content)];\n\t\t\t\t});\n\n\t\t\t\treturn {\n\t\t\t\t\t...temporallyFlatNestedIds,\n\t\t\t\t\t[QueryPath]: v['$$queryPath'],\n\t\t\t\t\t[idField]: v['$id'], //todo: this is a hack. But we should add this always!\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (v.$value) {\n\t\t\t\treturn parseValue(v.$value, 'FLEX');\n\t\t\t}\n\t\t\treturn v; //in cardinality many the query returns the values already. Todo: To optimize this we can remove the $value when cardinality MANY or find a smarter solution\n\t\t});\n\t\tconst { cardinality } = query[FieldSchema];\n\t\tif (cardinality === 'ONE') {\n\t\t\t//not filterByUnique because we can't filter inside a refField\n\t\t\treturn parsedContent[0];\n\t\t} else {\n\t\t\treturn parsedContent;\n\t\t}\n\t}\n\n\tif (query.$justId) {\n\t\tif (query.$filterByUnique || query[FieldSchema].cardinality === 'ONE') {\n\t\t\t// TODO: Look up what the id field is in the schema.\n\t\t\t//return isArray(value) ? value[0]?.id : value?.id; //RefFields receive direct\n\t\t\treturn value[0]?.$id ?? null;\n\t\t}\n\t\treturn value?.map((i: Record<string, any>) => i.$id) ?? [];\n\t} else {\n\t\tif (query.$filterByUnique || query[FieldSchema].cardinality === 'ONE') {\n\t\t\treturn parseObj(query, value[0], schema);\n\t\t}\n\t\treturn parseRes(query, value, schema);\n\t}\n};\n\nconst parseValue = (value: unknown, contentType: ContentType) => {\n\tconst asArray = isArray(value) ? value : [value];\n\tif (contentType === 'DATE') {\n\t\tconst res = asArray.map((v) => new Date(v).toISOString());\n\t\treturn isArray(value) ? res : res[0];\n\t}\n\tif (contentType === 'FLEX') {\n\t\tconst res = asArray.map((v) => {\n\t\t\tif (isDate(v)) {\n\t\t\t\treturn new Date(v).toISOString(); //Todo: in the future probably just return the date object instead, but we need to fix it in typedb.\n\t\t\t}\n\t\t\treturn v;\n\t\t});\n\t\treturn isArray(value) ? res : res[0];\n\t}\n\treturn value;\n};\n","import type {\n\tEnrichedAttributeQuery,\n\tEnrichedBQLQuery,\n\tEnrichedBormEntity,\n\tEnrichedBormRelation,\n\tEnrichedBormSchema,\n\tEnrichedFieldQuery,\n\tEnrichedLinkQuery,\n\tEnrichedRefQuery,\n\tEnrichedRoleQuery,\n} from '../../../types';\nimport { FieldSchema, QueryPath } from '../../../types/symbols';\nimport { sanitizeNameSurrealDB } from '../../../adapters/surrealDB/helpers';\nimport { buildSuqlFilter, parseFilter, buildSorter } from '../../../adapters/surrealDB/filters/filters';\nimport { isObject } from 'radash';\n\n//todo: Change name to build and remove the edge mode\nexport const buildRefs = (props: { queries: EnrichedBQLQuery[]; schema: EnrichedBormSchema }) => {\n\tconst { queries, schema } = props;\n\t//console.log('queries!', queries);\n\treturn queries.map((query) => buildQuery({ query, schema }));\n};\n\nconst buildQuery = (props: { query: EnrichedBQLQuery; schema: EnrichedBormSchema }): string | null => {\n\tconst { query, schema } = props;\n\tconst { $thing, $fields, $filter, $offset, $limit, $sort } = query;\n\n\tif ($fields.length === 0) {\n\t\treturn null;\n\t}\n\n\tconst currentSchema = schema.entities[$thing] || schema.relations[$thing];\n\tif (!currentSchema) {\n\t\tthrow new Error(`Schema for ${$thing} not found`);\n\t}\n\n\tconst queryPath = query[QueryPath];\n\n\tconst META = createMetaFields(queryPath);\n\tconst DATA_FIELDS = createDataFields($fields.filter((f) => f.$fieldType === 'data'));\n\tconst EDGE_FIELDS = createEdgeFields(\n\t\t$fields.filter((f) => f.$fieldType === 'link' || f.$fieldType === 'role') as (\n\t\t\t| EnrichedLinkQuery\n\t\t\t| EnrichedRoleQuery\n\t\t)[],\n\t\tschema,\n\t);\n\tconst REF_FIELDS = createRefFields($fields.filter((f) => f.$fieldType === 'ref') as EnrichedRefQuery[]);\n\tconst FIELDS = [...META, ...DATA_FIELDS, ...EDGE_FIELDS, ...REF_FIELDS].join(',\\n');\n\tconst FROM = createRootFromClause(query, currentSchema);\n\tconst WHERE = $filter ? `WHERE id AND (${buildSuqlFilter(parseFilter($filter, $thing, schema))})` : 'WHERE id';\n\n\tconst SORT = $sort ? buildSorter($sort) : '';\n\tconst LIMIT = typeof $limit === 'number' ? `LIMIT ${$limit}` : '';\n\tconst OFFSET = typeof $offset === 'number' ? `START ${$offset}` : '';\n\n\treturn `SELECT ${FIELDS} ${FROM} ${WHERE} ${SORT} ${LIMIT} ${OFFSET}`;\n};\n\nconst createRootFromClause = (query: EnrichedBQLQuery, currentSchema: EnrichedBormEntity | EnrichedBormRelation) => {\n\tconst allTypes = currentSchema.subTypes ? [query.$thing, ...currentSchema.subTypes] : [query.$thing];\n\tconst allTypesNormed = allTypes.map((t) => sanitizeNameSurrealDB(t));\n\n\tconst formatId = (type: string, id: string) => `${type}:\\`${id}\\``;\n\tconst joinTypes = (ids: string[]) => allTypesNormed.flatMap((type) => ids.map((id) => formatId(type, id))).join(',');\n\n\tif (!query.$id) {\n\t\treturn `FROM ${allTypesNormed.join(',')}`;\n\t}\n\n\tif (typeof query.$id === 'string') {\n\t\treturn `FROM ${joinTypes([query.$id])}`;\n\t}\n\n\tif (Array.isArray(query.$id)) {\n\t\treturn `FROM ${joinTypes(query.$id)}`;\n\t}\n\n\tthrow new Error('Invalid $id');\n};\n\nconst createMetaFields = (queryPath: string) => {\n\treturn [\n\t\t`\"${queryPath}\" as \\`$$queryPath\\``,\n\t\t'id && record::id(id) || null as `$id`', //the id is on case we try to extend flex stuff\n\t\t'id && record::tb(id) || null as `$thing`',\n\t];\n};\n\nconst createDataFields = (dataFields: EnrichedAttributeQuery[] | EnrichedFieldQuery[]) => {\n\treturn dataFields.map((df) => {\n\t\tif (df.$path === 'id') {\n\t\t\treturn `record::id(${df.$path}) AS ${df.$as}`;\n\t\t}\n\t\tif (df.$path === df.$as) {\n\t\t\treturn `\\`${df.$path}\\``;\n\t\t}\n\t\treturn `\\`${df.$path}\\` AS \\`${df.$as}\\``;\n\t});\n};\n\nconst createEdgeFields = (\n\tedgeFields: (EnrichedLinkQuery | EnrichedRoleQuery)[],\n\tschema: EnrichedBormSchema,\n): string[] => {\n\treturn edgeFields\n\t\t.map((ef) => {\n\t\t\t//logger('ef', ef);\n\t\t\tif (!ef[QueryPath]) {\n\t\t\t\tthrow new Error(`[Internal] QueryPath is missing. Value: ${JSON.stringify(ef)}`);\n\t\t\t}\n\t\t\tconst META = createMetaFields(ef[QueryPath]);\n\t\t\tconst DATA_FIELDS = createDataFields(ef.$fields.filter((f) => f.$fieldType === 'data'));\n\t\t\tconst LINK_FIELDS = createEdgeFields(\n\t\t\t\tef.$fields.filter((f) => f.$fieldType === 'link' || f.$fieldType === 'role') as (\n\t\t\t\t\t| EnrichedLinkQuery\n\t\t\t\t\t| EnrichedRoleQuery\n\t\t\t\t)[],\n\t\t\t\tschema,\n\t\t\t);\n\t\t\tconst REF_FIELDS = createRefFields(ef.$fields.filter((f) => f.$fieldType === 'ref'));\n\t\t\tconst FIELDS = [...META, ...DATA_FIELDS, ...LINK_FIELDS, ...REF_FIELDS].filter(Boolean).join(',\\n');\n\t\t\tconst FROM = `FROM $parent.\\`${ef[FieldSchema].path}\\`[*]`;\n\t\t\tconst WHERE =\n\t\t\t\tef.$filter && Object.keys(ef.$filter).length > 0\n\t\t\t\t\t? `WHERE id AND(${buildSuqlFilter(parseFilter(ef.$filter, ef.$thing, schema))})`\n\t\t\t\t\t: 'WHERE id';\n\t\t\tconst SORT = ef.$sort ? buildSorter(ef.$sort) : '';\n\t\t\tconst LIMIT = typeof ef.$limit === 'number' ? `LIMIT ${ef.$limit}` : '';\n\t\t\tconst OFFSET = typeof ef.$offset === 'number' ? `START ${ef.$offset}` : '';\n\t\t\treturn `( SELECT ${FIELDS} ${FROM} ${WHERE} ${SORT} ${LIMIT} ${OFFSET} ) AS \\`${ef.$as}\\``;\n\t\t})\n\t\t.filter((f) => f);\n};\nconst createRefFields = (refFields: EnrichedRefQuery[]) => {\n\treturn refFields.map((rf) => {\n\t\tif (!rf[QueryPath]) {\n\t\t\tthrow new Error(`[Internal] QueryPath is missing. Value: ${JSON.stringify(rf)}`);\n\t\t}\n\t\tconst META = createMetaFields(rf[QueryPath]);\n\t\tif (rf.$fields?.some((f) => isObject(f))) {\n\t\t\tthrow new Error(\"[Unsupported]: Can't query nested ref fields yet\");\n\t\t}\n\t\tconst FLEX_REF = 'id && null || $this as `$value`';\n\t\tconst FIELDS = [...META, FLEX_REF, ...(rf.$justId ? '' : rf.$fields?.map((f) => `⟨${f}⟩`) || ['*'])].join(',\\n'); //if no fields, get everything\n\t\tconst FROM = `FROM $parent.\\`${rf[FieldSchema].dbPath}\\``; //removing the [*]\n\t\t//const WHERE = 'WHERE true'; //can't filter inside ref Fields\n\t\t// In ref fields we don't have the ref of the fields so we go blind\n\t\treturn `( SELECT ${FIELDS} ${FROM}) AS \\`${rf.$as}\\``;\n\t});\n};\n","import type { BormConfig, EnrichedBQLQuery, EnrichedBormSchema } from '../../../types';\nimport { createMachine, interpret, invoke, reduce, state, transition } from '../../robot3';\nimport { build } from './build';\nimport { run } from './run';\nimport { assertDefined } from '../../../helpers';\nimport { parse } from './parse';\nimport type { SurrealDBProviderObject } from '../../../types/config/surrealdb';\nimport { buildRefs } from './buildRefs';\nimport type { SimpleSurrealClient } from '../../../adapters/surrealDB/client';\n\nexport type SurrealDbMachineContext = {\n\tbql: {\n\t\tqueries: EnrichedBQLQuery[];\n\t\tres?: any[];\n\t};\n\tsurql: {\n\t\tqueries?: string[];\n\t\tres?: any[];\n\t};\n\tschema: EnrichedBormSchema;\n\tconfig: BormConfig;\n\tclient: SimpleSurrealClient;\n\terror?: string | null;\n};\n\nconst errorTransition = transition(\n\t'error',\n\t'error',\n\treduce((ctx: SurrealDbMachineContext, event: any): SurrealDbMachineContext => {\n\t\treturn {\n\t\t\t...ctx,\n\t\t\terror: event.error,\n\t\t};\n\t}),\n);\n\nconst surrealDbQueryMachine = createMachine(\n\t'build',\n\t{\n\t\tbuild: invoke(\n\t\t\tasync (ctx: SurrealDbMachineContext) => {\n\t\t\t\t// todo: This works only if there is a single surrealDB connector\n\t\t\t\tconst { linkMode } = (\n\t\t\t\t\tctx.config.dbConnectors.find((c) => c.provider === 'surrealDB') as SurrealDBProviderObject\n\t\t\t\t).providerConfig;\n\t\t\t\tif (linkMode === 'edges') {\n\t\t\t\t\treturn build({ queries: ctx.bql.queries, schema: ctx.schema });\n\t\t\t\t}\n\t\t\t\tif (linkMode === 'refs') {\n\t\t\t\t\treturn buildRefs({ queries: ctx.bql.queries, schema: ctx.schema });\n\t\t\t\t}\n\t\t\t},\n\t\t\ttransition(\n\t\t\t\t'done',\n\t\t\t\t'run',\n\t\t\t\treduce(\n\t\t\t\t\t(ctx: SurrealDbMachineContext, event: any): SurrealDbMachineContext => ({\n\t\t\t\t\t\t...ctx,\n\t\t\t\t\t\tsurql: {\n\t\t\t\t\t\t\t...ctx.surql,\n\t\t\t\t\t\t\tqueries: event.data,\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t),\n\t\t\terrorTransition,\n\t\t),\n\t\trun: invoke(\n\t\t\tasync (ctx: SurrealDbMachineContext) => {\n\t\t\t\treturn run({ client: ctx.client, queries: assertDefined(ctx.surql.queries), config: ctx.config });\n\t\t\t},\n\t\t\ttransition(\n\t\t\t\t'done',\n\t\t\t\t'parse',\n\t\t\t\treduce(\n\t\t\t\t\t(ctx: SurrealDbMachineContext, event: any): SurrealDbMachineContext => ({\n\t\t\t\t\t\t...ctx,\n\t\t\t\t\t\tsurql: {\n\t\t\t\t\t\t\t...ctx.surql,\n\t\t\t\t\t\t\tres: event.data,\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t),\n\t\t\terrorTransition,\n\t\t),\n\t\tparse: invoke(\n\t\t\tasync (ctx: SurrealDbMachineContext) => {\n\t\t\t\treturn parse({\n\t\t\t\t\tres: assertDefined(ctx.surql.res),\n\t\t\t\t\tqueries: ctx.bql.queries,\n\t\t\t\t\tschema: ctx.schema,\n\t\t\t\t\tconfig: ctx.config,\n\t\t\t\t});\n\t\t\t},\n\t\t\ttransition(\n\t\t\t\t'done',\n\t\t\t\t'success',\n\t\t\t\treduce(\n\t\t\t\t\t(ctx: SurrealDbMachineContext, event: any): SurrealDbMachineContext => ({\n\t\t\t\t\t\t...ctx,\n\t\t\t\t\t\tbql: {\n\t\t\t\t\t\t\t...ctx.bql,\n\t\t\t\t\t\t\tres: event.data,\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t),\n\t\t\terrorTransition,\n\t\t),\n\t\tsuccess: state(),\n\t\terror: state(),\n\t},\n\t(ctx: SurrealDbMachineContext) => ctx,\n);\n\nconst awaitQueryMachine = async (context: SurrealDbMachineContext) => {\n\treturn new Promise<any[]>((resolve, reject) => {\n\t\tinterpret(\n\t\t\tsurrealDbQueryMachine,\n\t\t\t(service) => {\n\t\t\t\tif (service.machine.state.name === 'success') {\n\t\t\t\t\t//@ts-expect-error = todo\n\t\t\t\t\tresolve(service.context.bql.res);\n\t\t\t\t}\n\t\t\t\tif (service.machine.state.name === 'error') {\n\t\t\t\t\treject(service.context.error);\n\t\t\t\t}\n\t\t\t},\n\t\t\tcontext,\n\t\t);\n\t});\n};\n\nexport const runSurrealDbQueryMachine = async (\n\tenrichedBql: EnrichedBQLQuery[],\n\tschema: EnrichedBormSchema,\n\tconfig: BormConfig,\n\tclient: SimpleSurrealClient,\n) => {\n\treturn awaitQueryMachine({\n\t\tbql: {\n\t\t\tqueries: enrichedBql,\n\t\t},\n\t\tsurql: {},\n\t\tschema: schema,\n\t\tconfig: config,\n\t\tclient,\n\t\terror: null,\n\t});\n};\n","import { getIdFieldKey, getSchemaByThing, indent } from '../../../helpers';\nimport type {\n\tEnrichedAttributeQuery,\n\tEnrichedBormSchema,\n\tEnrichedBQLQuery,\n\tEnrichedLinkQuery,\n\tEnrichedRoleQuery,\n} from '../../../types';\nimport { FieldSchema, QueryPath } from '../../../types/symbols';\nimport { v4 as uuidv4 } from 'uuid';\nimport { buildFilter } from './filters';\n\nconst separator = '___';\n\nexport const buildTQLQuery = async (props: { queries: EnrichedBQLQuery[]; schema: EnrichedBormSchema }) => {\n\tconst { queries: batches, schema } = props;\n\treturn batches.map((query) => buildQuery({ query, schema }));\n};\n\nconst buildQuery = (props: { query: EnrichedBQLQuery; schema: EnrichedBormSchema }) => {\n\tconst { query, schema } = props;\n\tconst { $path, $thing, $filter, $fields, $sort, $offset, $limit, $id } = query;\n\n\tif (!$path) {\n\t\tthrow new Error('Path is not defined');\n\t}\n\n\tconst lines: string[] = [];\n\tconst queryPath = query[QueryPath];\n\tlines.push('match');\n\tlines.push(`$${$path} isa ${$thing};`);\n\n\tif ($filter || $id) {\n\t\tconst idField = getIdFieldKey(schema, query);\n\t\tconst $WithIdFilter = { ...$filter, ...($id ? { [idField]: $id } : {}) };\n\t\tconst filter = buildFilter({ $filter: $WithIdFilter, $var: $path, $thing, schema, depth: 0 });\n\t\tlines.push(`\\n${filter}`);\n\t}\n\n\tconst sorter = buildSorter({ schema, $thing, $var: $path, $sort, depth: 0 });\n\n\tif (sorter) {\n\t\tlines.push(sorter.match);\n\t}\n\n\tconst randomId = `M_${uuidv4()}`;\n\n\tlines.push(`?queryPath${randomId} = \"${queryPath}\";`);\n\tlines.push('fetch');\n\tlines.push(`?queryPath${randomId} as \"queryPath\";`);\n\n\tif ($fields) {\n\t\tconst dataFields = $fields.filter((f) => f.$fieldType === 'data') as EnrichedAttributeQuery[];\n\t\tif (dataFields && dataFields.length > 0) {\n\t\t\tlines.push(...processDataFields(dataFields, $path, 0));\n\t\t}\n\n\t\tconst linkFields = $fields.filter((f) => f.$fieldType === 'link') as EnrichedLinkQuery[];\n\t\tif (linkFields && linkFields.length > 0) {\n\t\t\tlines.push(...processLinkFields(linkFields, $path, $path, 0, schema));\n\t\t}\n\n\t\tconst roleFields = $fields.filter((f) => f.$fieldType === 'role') as EnrichedRoleQuery[];\n\t\tif (roleFields && roleFields.length > 0) {\n\t\t\tlines.push(...processRoleFields(roleFields, $path, $path, 0, schema));\n\t\t}\n\t}\n\n\tif (sorter) {\n\t\tlines.push(sorter.sort);\n\t}\n\n\tif (typeof $offset === 'number') {\n\t\tlines.push(`\\noffset ${$offset};`);\n\t}\n\n\tif (typeof $limit === 'number') {\n\t\tlines.push(`\\nlimit ${$limit};`);\n\t}\n\n\treturn lines.join('\\n');\n};\n\nconst processDataFields = (dataFields: EnrichedAttributeQuery[], $path: string, depth: number) => {\n\tconst postStrParts: string[] = [];\n\tconst asMetaDataParts: string[] = [];\n\tconst multiVals: { path: string }[] = [];\n\n\tfor (let i = 0; i < dataFields.length; i++) {\n\t\tif (!dataFields[i].$isVirtual) {\n\t\t\tpostStrParts.push(dataFields[i].$dbPath);\n\t\t}\n\t\tif (dataFields[i][FieldSchema].contentType === 'FLEX') {\n\t\t\tmultiVals.push({ path: dataFields[i][FieldSchema].dbPath });\n\t\t}\n\t\tasMetaDataParts.push(`{${dataFields[i].$dbPath}:${dataFields[i].$as}}`);\n\t}\n\n\tconst postStr = postStrParts.join(', ');\n\tconst $asMetaData = asMetaDataParts.join(',');\n\tconst $metaData = `$metadata:{as:[${$asMetaData}]}`;\n\tconst lines = [indent(`$${$path} as \"${$path}.${$metaData}.$dataFields\": ${postStr};`, depth)];\n\n\tif (multiVals.length > 0) {\n\t\tmultiVals.forEach((multiVal) => {\n\t\t\tlines.push(\n\t\t\t\tindent(\n\t\t\t\t\t`\"${multiVal.path}.$multiVal\": {match $${$path} has ${multiVal.path} $${multiVal.path}; fetch $${multiVal.path}: attribute;};`,\n\t\t\t\t\tdepth,\n\t\t\t\t),\n\t\t\t);\n\t\t});\n\t}\n\treturn lines;\n};\n\nconst processRoleFields = (\n\troleFields: EnrichedRoleQuery[],\n\t$path: string,\n\tdotPath: string,\n\tdepth: number,\n\tschema: EnrichedBormSchema,\n) => {\n\tconst nextDepth = depth + 1;\n\tconst lines: string[] = [];\n\n\tfor (const roleField of roleFields) {\n\t\tconst { $fields, $as, $justId, $idNotIncluded, $filterByUnique, $thing, $sort, $offset, $limit } = roleField;\n\t\tconst queryPath = roleField[QueryPath];\n\n\t\tconst $metaData = `$metadata:{as:${$as},justId:${\n\t\t\t$justId ? 'T' : 'F'\n\t\t},idNotIncluded:${$idNotIncluded},filterByUnique:${$filterByUnique}}`;\n\t\tlines.push(indent(`\"${dotPath}.${$metaData}.${roleField.$var}\": {`, depth));\n\t\tlines.push(indent('match', nextDepth));\n\t\tconst $roleVar = `${$path}${separator}${roleField.$var}`;\n\t\tlines.push(indent(`$${$roleVar} isa ${roleField.$thing};`, nextDepth));\n\t\tlines.push(\n\t\t\tindent(\n\t\t\t\t// TODO: The parent node already declare $path\n\t\t\t\t`$${$path} (${roleField.$var}: $${$path}${separator}${roleField.$var}) isa ${roleField.$intermediary};`,\n\t\t\t\tnextDepth,\n\t\t\t),\n\t\t);\n\n\t\tif (roleField.$filter || roleField.$id) {\n\t\t\tconst idField = getIdFieldKey(schema, roleField);\n\t\t\tconst withId = roleField.$id ? { [idField]: roleField.$id } : {};\n\t\t\tconst withIdFilter = { ...roleField.$filter, ...withId };\n\n\t\t\tlines.push(\n\t\t\t\tbuildFilter({\n\t\t\t\t\t$filter: withIdFilter,\n\t\t\t\t\t$var: $roleVar,\n\t\t\t\t\t$thing: roleField.$thing,\n\t\t\t\t\tschema,\n\t\t\t\t\tdepth: nextDepth,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tconst sorter = buildSorter({ schema, $thing, $var: $roleVar, $sort, depth: nextDepth });\n\n\t\tif (sorter) {\n\t\t\tlines.push(sorter.match);\n\t\t}\n\n\t\tif ($fields) {\n\t\t\tconst randomId = `M_${uuidv4()}`;\n\t\t\tlines.push(indent(`\\n?queryPath${randomId} = \"${queryPath}\";`, nextDepth)); ///rawPaths => to inject metadata in the response, in this case only the path\n\t\t\tlines.push(indent('fetch', nextDepth));\n\t\t\tlines.push(indent(`?queryPath${randomId} as \"queryPath\";`, nextDepth)); ///rawPaths => to recover metadata in the response\n\n\t\t\tconst dataFields = $fields?.filter((f) => f.$fieldType === 'data') as EnrichedAttributeQuery[];\n\t\t\tif (dataFields && dataFields.length > 0) {\n\t\t\t\tlines.push(...processDataFields(dataFields, $roleVar, nextDepth));\n\t\t\t}\n\n\t\t\tconst linkFields = $fields?.filter((f) => f.$fieldType === 'link') as EnrichedLinkQuery[];\n\t\t\tif (linkFields && linkFields.length > 0) {\n\t\t\t\tlines.push(...processLinkFields(linkFields, $roleVar, `${$path}.${roleField.$var}`, nextDepth, schema));\n\t\t\t}\n\t\t\tconst roleFields = $fields?.filter((f) => f.$fieldType === 'role') as EnrichedRoleQuery[];\n\t\t\tif (roleFields && roleFields.length > 0) {\n\t\t\t\tlines.push(...processRoleFields(roleFields, $roleVar, `${$path}.${roleField.$var}`, nextDepth, schema));\n\t\t\t}\n\t\t}\n\n\t\tif (sorter) {\n\t\t\tlines.push(sorter.sort);\n\t\t}\n\n\t\tif (typeof $offset === 'number') {\n\t\t\tlines.push(indent(`offset ${$offset};`, nextDepth));\n\t\t}\n\n\t\tif (typeof $limit === 'number') {\n\t\t\tlines.push(indent(`limit ${$limit};`, nextDepth));\n\t\t}\n\n\t\tlines.push(indent('};', depth));\n\t}\n\n\treturn lines;\n};\n\nconst processLinkFields = (\n\tlinkFields: EnrichedLinkQuery[],\n\t$path: string,\n\tdotPath: string,\n\tdepth: number,\n\tschema: EnrichedBormSchema,\n) => {\n\tconst nextDepth = depth + 1;\n\tconst lines: string[] = [];\n\n\tfor (const linkField of linkFields) {\n\t\tconst { $fields, $as, $justId, $idNotIncluded, $filterByUnique, $playedBy, $thing, $sort, $offset, $limit } =\n\t\t\tlinkField;\n\t\tconst queryPath = linkField[QueryPath];\n\t\tconst $metaData = `$metadata:{as:${$as},justId:${\n\t\t\t$justId ? 'T' : 'F'\n\t\t},idNotIncluded:${$idNotIncluded},filterByUnique:${$filterByUnique}}`;\n\t\tlines.push(indent(`\"${dotPath}.${$metaData}.${linkField.$var}\": {`, depth));\n\t\tlines.push(indent('match', nextDepth));\n\t\tconst $linkVar = `${$path}${separator}${linkField.$var}`;\n\t\tlines.push(indent(`$${$linkVar} isa ${linkField.$thing};`, nextDepth));\n\n\t\tif (linkField.$filter || linkField.$id) {\n\t\t\tconst idField = getIdFieldKey(schema, linkField);\n\t\t\tconst withId = linkField.$id ? { [idField]: linkField.$id } : {};\n\t\t\tconst withIdFilter = { ...linkField.$filter, ...withId };\n\t\t\tlines.push(\n\t\t\t\tbuildFilter({\n\t\t\t\t\t$filter: withIdFilter,\n\t\t\t\t\t$var: $linkVar,\n\t\t\t\t\t$thing: linkField.$thing,\n\t\t\t\t\tschema,\n\t\t\t\t\tdepth: nextDepth,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tconst sorter = buildSorter({ schema, $thing, $var: $linkVar, $sort, depth: nextDepth });\n\n\t\tif (sorter) {\n\t\t\tlines.push(sorter.match);\n\t\t}\n\n\t\tif (linkField.$target === 'role') {\n\t\t\t// a. intermediary\n\t\t\tlines.push(\n\t\t\t\tindent(\n\t\t\t\t\t`$${$path}_intermediary (${linkField.$plays}: $${$path}, ${$playedBy.plays}: $${$linkVar}) isa ${linkField.$intermediary};`,\n\t\t\t\t\tnextDepth,\n\t\t\t\t),\n\t\t\t);\n\t\t} else {\n\t\t\t// b. no intermediary\n\t\t\tlines.push(\n\t\t\t\tindent(\n\t\t\t\t\t// TODO: There can't be multiple \"isa\" for the same variable\n\t\t\t\t\t// TODO: There can't be multiple relation constraints for the same variable. The filter may contain multiple relation constraints.\n\t\t\t\t\t`$${$linkVar} (${linkField.$plays}: $${$path});`,\n\t\t\t\t\tnextDepth,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tif ($fields) {\n\t\t\tconst randomId = `M_${uuidv4()}`;\n\t\t\tlines.push(indent(`?queryPath${randomId} = \"${queryPath}\";`, nextDepth)); ///queryPath => to inject metadata in the response, in this case only the path\n\t\t\tlines.push(indent('fetch', nextDepth));\n\t\t\tlines.push(indent(`?queryPath${randomId} as \"queryPath\";`, nextDepth)); ///queryPath => to recover metadata in the response\n\n\t\t\tconst dataFields = $fields?.filter((f) => f.$fieldType === 'data') as EnrichedAttributeQuery[];\n\t\t\tif (dataFields && dataFields.length > 0) {\n\t\t\t\tlines.push(...processDataFields(dataFields, $linkVar, nextDepth));\n\t\t\t}\n\n\t\t\tconst linkFields = $fields?.filter((f) => f.$fieldType === 'link') as EnrichedLinkQuery[];\n\t\t\tif (linkFields && linkFields.length > 0) {\n\t\t\t\tlines.push(...processLinkFields(linkFields, $linkVar, `${$path}.${linkField.$var}`, nextDepth, schema));\n\t\t\t}\n\n\t\t\tconst roleFields = $fields?.filter((f) => f.$fieldType === 'role') as EnrichedRoleQuery[];\n\t\t\tif (roleFields && roleFields.length > 0) {\n\t\t\t\tlines.push(...processRoleFields(roleFields, $linkVar, `${$path}.${linkField.$var}`, nextDepth, schema));\n\t\t\t}\n\t\t}\n\n\t\tif (sorter) {\n\t\t\tlines.push(sorter.sort);\n\t\t}\n\n\t\tif (typeof $offset === 'number') {\n\t\t\tlines.push(indent(`offset ${$offset};`, nextDepth));\n\t\t}\n\n\t\tif (typeof $limit === 'number') {\n\t\t\tlines.push(indent(`limit ${$limit};`, nextDepth));\n\t\t}\n\n\t\tlines.push(indent('};', depth));\n\t}\n\n\treturn lines;\n};\n\nconst normalizeSorter = (sort: { field: string; desc?: boolean } | string) => {\n\tif (typeof sort === 'string') {\n\t\treturn {\n\t\t\tfield: sort,\n\t\t\tdesc: false,\n\t\t};\n\t}\n\treturn { ...sort, desc: sort.desc ?? false };\n};\n\nconst buildSorter = (props: {\n\t$var: string;\n\t$thing: string;\n\tschema: EnrichedBormSchema;\n\t$sort?: ({ field: string; desc?: boolean } | string)[];\n\tdepth: number;\n}) => {\n\tconst { $var, $thing, schema, $sort, depth } = props;\n\n\tconst thing = getSchemaByThing(schema, $thing);\n\tconst sortMatch: string[] = [];\n\tconst sorter: string[] = [];\n\n\t$sort?.forEach((sort) => {\n\t\tconst s = normalizeSorter(sort);\n\t\tconst df = thing.dataFields?.find((df) => df.path === s.field);\n\t\tif (!df) {\n\t\t\tthrow new Error(`\"${$thing}\" does not have data field \"${s.field}\"`);\n\t\t}\n\t\tconst attrVar = `${s.field}_${uuidv4()}`;\n\t\tsortMatch.push(indent('{', depth));\n\t\tsortMatch.push(indent(`$${$var} has ${df.dbPath} $${attrVar}_1;`, depth + 1));\n\t\tsortMatch.push(indent('not {', depth + 1));\n\t\tsortMatch.push(indent(`$${$var} has ${df.dbPath} $${attrVar}_2;`, depth + 2));\n\t\tsortMatch.push(indent(`$${attrVar}_2 < $${attrVar}_1;`, depth + 2));\n\t\tsortMatch.push(indent('};', depth + 1));\n\t\tsortMatch.push(indent(`?${attrVar}_ = $${attrVar}_1;`, depth + 1));\n\t\tsortMatch.push(indent('} or {', depth));\n\t\tsortMatch.push(indent(`not { $${$var} has ${df.dbPath} $${attrVar}_1; };`, depth + 1));\n\t\t// TODO: This is a workaround to put things with undefined attribute at the end.\n\t\t// \"~\" is the last non-control char (DEC 126) in ASCII.\n\t\tsortMatch.push(indent(`?${attrVar}_ = \"~\";`, depth + 1));\n\t\tsortMatch.push(indent('};', depth));\n\t\tsortMatch.push(indent(`?${attrVar} = ?${attrVar}_;`, depth));\n\t\tconst order = s.desc ? 'desc' : 'asc';\n\t\tsorter.push(`?${attrVar} ${order}`);\n\t});\n\n\tif (sortMatch.length === 0) {\n\t\treturn;\n\t}\n\n\treturn {\n\t\tmatch: sortMatch.join(''),\n\t\tsort: indent(`sort ${sorter.join(', ')};`, depth),\n\t};\n};\n","import { isObject, isArray } from 'radash';\nimport { getSchemaByThing, indent } from '../../../helpers';\nimport { v4 as uuidv4 } from 'uuid';\nimport type {\n\tFilter,\n\tEnrichedBormSchema,\n\tEnrichedBormEntity,\n\tEnrichedBormRelation,\n\tPositiveFilter,\n} from '../../../types';\n\nexport const buildFilter = (props: {\n\t$filter: Filter;\n\t$var: string;\n\t$thing: string;\n\tschema: EnrichedBormSchema;\n\tdepth: number;\n}): string => {\n\tconst { $filter: $nonMappedFilter, $var, $thing, schema, depth } = props;\n\tconst $filter = mapFilterKeys($nonMappedFilter, getSchemaByThing(schema, $thing));\n\n\tconst { $not, ...rest } = $filter;\n\n\tconst matches: string[] = [];\n\n\t// Handle $not filters\n\tif (isPositiveFilter($not)) {\n\t\tconst notMatches = processPositiveFilter($not, $var, $thing, schema, depth, true);\n\t\tmatches.push(...notMatches);\n\t} else if ($not !== undefined) {\n\t\tthrow new Error('$not must be a PositiveFilter object');\n\t}\n\n\t// Handle positive filters\n\tconst positiveMatches = processPositiveFilter(rest, $var, $thing, schema, depth, false);\n\tmatches.push(...positiveMatches);\n\n\treturn matches.join('\\n');\n};\n\nconst processPositiveFilter = (\n\tfilter: PositiveFilter,\n\t$var: string,\n\t$thing: string,\n\tschema: EnrichedBormSchema,\n\tdepth: number,\n\tisNegated: boolean,\n): string[] => {\n\tconst thing = getSchemaByThing(schema, $thing);\n\tconst matches: string[] = [];\n\n\tfor (const [key, value] of Object.entries(filter)) {\n\t\tif (key.startsWith('$')) {\n\t\t\t// Handle logical operators ($and, $or)\n\t\t\tconst normalizedKey = key.toLowerCase() as '$and' | '$or';\n\t\t\tif (normalizedKey === '$and' || normalizedKey === '$or') {\n\t\t\t\tconst subFilters = isArray(value) ? value : [value];\n\t\t\t\tconst subMatches = subFilters.map((subFilter) => {\n\t\t\t\t\tif (isPositiveFilter(subFilter)) {\n\t\t\t\t\t\tconst subFilterMatches = processPositiveFilter(subFilter, $var, $thing, schema, depth + 1, isNegated);\n\t\t\t\t\t\treturn subFilterMatches.join('\\n');\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow new Error(`Invalid subfilter in ${normalizedKey}: ${JSON.stringify(subFilter)}`);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tconst joinedSubMatches = subMatches.join(normalizedKey === '$and' ? '\\n' : ' } or { ');\n\t\t\t\tif (normalizedKey === '$or' && subMatches.length > 1) {\n\t\t\t\t\tmatches.push(indent(`{ ${joinedSubMatches} };`, depth));\n\t\t\t\t} else {\n\t\t\t\t\tmatches.push(indent(joinedSubMatches, depth));\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t// Skip other special keys\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Handle data fields\n\t\tconst df = thing.dataFields?.find((df) => df.dbPath === key || df.path === key);\n\t\tif (df) {\n\t\t\tconst fieldMatches = handleDataFieldFilter(key, value, $var, depth, isNegated);\n\t\t\tmatches.push(...fieldMatches);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Handle link fields\n\t\tconst lf = thing.linkFields?.find((lf) => lf.path === key);\n\t\tif (lf) {\n\t\t\tconst linkMatches = handleLinkFieldFilter(lf, value, $var, schema, depth, isNegated);\n\t\t\tmatches.push(...linkMatches);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Handle roles in relations\n\t\tif (thing.thingType === 'relation') {\n\t\t\tconst role = thing.roles[key];\n\t\t\tif (role) {\n\t\t\t\tconst roleMatches = handleRelationRoleFilter(role, value, $var, $thing, schema, depth, isNegated);\n\t\t\t\tmatches.push(...roleMatches);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\tthrow new Error(`\"${$thing}\" does not have property \"${key}\"`);\n\t}\n\n\treturn matches;\n};\n\nconst handleDataFieldFilter = (key: string, value: any, $var: string, depth: number, isNegated: boolean): string[] => {\n\tconst matches: string[] = [];\n\n\tif (isObject(value) && !isArray(value)) {\n\t\t// Handle operator-based filters (e.g., { $eq: value })\n\t\tfor (const [op, opValue] of Object.entries(value)) {\n\t\t\tconst normalizedOp = op.toLowerCase() as '$eq' | '$ne' | '$in' | '$nin' | '$exists';\n\t\t\tlet match = '';\n\t\t\tswitch (normalizedOp) {\n\t\t\t\tcase '$eq':\n\t\t\t\t\tmatch = `$${$var} has ${key} ${serializeValue(opValue)};`;\n\t\t\t\t\tbreak;\n\t\t\t\tcase '$ne':\n\t\t\t\t\tmatch = `not { $${$var} has ${key} ${serializeValue(opValue)}; };`;\n\t\t\t\t\tbreak;\n\t\t\t\tcase '$in': {\n\t\t\t\t\tif (!isArray(opValue)) {\n\t\t\t\t\t\tthrow new Error('Value for $in operator must be an array');\n\t\t\t\t\t}\n\t\t\t\t\tconst inAlt = opValue.map((v) => `$${$var} has ${key} ${serializeValue(v)};`);\n\t\t\t\t\tmatch = joinAlt(inAlt);\n\t\t\t\t\tif (isNegated) {\n\t\t\t\t\t\tmatch = `not { ${match} };`;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase '$nin':\n\t\t\t\t\tif (!isArray(opValue)) {\n\t\t\t\t\t\tthrow new Error('Value for $nin operator must be an array');\n\t\t\t\t\t}\n\t\t\t\t\tfor (const v of opValue) {\n\t\t\t\t\t\tconst ninMatch = `not { $${$var} has ${key} ${serializeValue(v)}; };`;\n\t\t\t\t\t\tmatches.push(indent(ninMatch, depth));\n\t\t\t\t\t}\n\t\t\t\t\tcontinue; // Skip the rest of the loop for '$nin'\n\t\t\t\tcase '$exists':\n\t\t\t\t\tif (opValue === true) {\n\t\t\t\t\t\tmatch = `$${$var} has ${key} $${key}_${uuidv4()};`;\n\t\t\t\t\t} else if (opValue === false) {\n\t\t\t\t\t\tmatch = `not { $${$var} has ${key} $${key}_${uuidv4()}; };`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow new Error(`Invalid value for $exists: ${opValue}`);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(`Unsupported operator \"${op}\" for data field \"${key}\"`);\n\t\t\t}\n\t\t\tif (isNegated) {\n\t\t\t\tmatch = `not { ${match} };`;\n\t\t\t}\n\t\t\tmatches.push(indent(match, depth));\n\t\t}\n\t} else if (isArray(value)) {\n\t\t// Treat array value as an $in operator\n\t\tconst alt = value.map((v) => `$${$var} has ${key} ${serializeValue(v)};`);\n\t\tlet match = joinAlt(alt);\n\t\tif (match) {\n\t\t\tif (isNegated) {\n\t\t\t\tmatch = `not { ${match} };`;\n\t\t\t}\n\t\t\tmatches.push(indent(match, depth));\n\t\t}\n\t} else {\n\t\t// Scalar value\n\t\tlet match = `$${$var} has ${key} ${serializeValue(value)};`;\n\t\tif (isNegated) {\n\t\t\tmatch = `not { ${match} };`;\n\t\t}\n\t\tmatches.push(indent(match, depth));\n\t}\n\n\treturn matches;\n};\n\nconst handleLinkFieldFilter = (\n\tlf: any, // Adjust type as needed\n\tvalue: any,\n\t$var: string,\n\tschema: EnrichedBormSchema,\n\tdepth: number,\n\tisNegated: boolean,\n): string[] => {\n\tconst matches: string[] = [];\n\tconst [opposite] = lf.oppositeLinkFieldsPlayedBy;\n\tconst oppositeThing = getSchemaByThing(schema, opposite.thing);\n\tconst oppositeIdField = oppositeThing.idFields?.[0];\n\tif (!oppositeIdField) {\n\t\tthrow new Error(`\"${opposite.thing}\" does not have an id field`);\n\t}\n\n\tconst oppVar = `${opposite.thing}_${uuidv4()}`;\n\n\tlet match = '';\n\n\tif (lf.target === 'relation') {\n\t\t// Handle link field targeting a relation\n\t\tif (value === null) {\n\t\t\tmatch = isNegated\n\t\t\t\t? `(${lf.plays}: $${$var}) isa ${lf.relation};`\n\t\t\t\t: `not { (${lf.plays}: $${$var}) isa ${lf.relation}; };`;\n\t\t} else if (isArray(value)) {\n\t\t\tconst alt = value.map(\n\t\t\t\t(v) => `(${lf.plays}: $${$var}) isa ${lf.relation}, has ${oppositeIdField} ${serializeValue(v)};`,\n\t\t\t);\n\t\t\tmatch = joinAlt(alt);\n\t\t\tif (isNegated) {\n\t\t\t\tmatch = `not { ${match} };`;\n\t\t\t}\n\t\t} else {\n\t\t\tmatch = `(${lf.plays}: $${$var}) isa ${lf.relation}, has ${oppositeIdField} ${serializeValue(value)};`;\n\t\t\tif (isNegated) {\n\t\t\t\tmatch = `not { ${match} };`;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Handle link field without intermediary relation\n\t\tif (value === null) {\n\t\t\tmatch = isNegated\n\t\t\t\t? `$${oppVar} isa ${opposite.thing}; (${lf.plays}: $${$var}, ${opposite.plays}: $${oppVar}) isa ${lf.relation};`\n\t\t\t\t: `not { $${oppVar} isa ${opposite.thing}; (${lf.plays}: $${$var}, ${opposite.plays}: $${oppVar}) isa ${lf.relation}; };`;\n\t\t} else if (isArray(value)) {\n\t\t\tconst alt = value.map(\n\t\t\t\t(v) =>\n\t\t\t\t\t`$${oppVar} isa ${opposite.thing}, has ${oppositeIdField} ${serializeValue(\n\t\t\t\t\t\tv,\n\t\t\t\t\t)}; (${lf.plays}: $${$var}, ${opposite.plays}: $${oppVar}) isa ${lf.relation};`,\n\t\t\t);\n\t\t\tmatch = joinAlt(alt);\n\t\t\tif (isNegated) {\n\t\t\t\tmatch = `not { ${match} };`;\n\t\t\t}\n\t\t} else {\n\t\t\tmatch = `$${oppVar} isa ${opposite.thing}, has ${oppositeIdField} ${serializeValue(\n\t\t\t\tvalue,\n\t\t\t)}; (${lf.plays}: $${$var}, ${opposite.plays}: $${oppVar}) isa ${lf.relation};`;\n\t\t\tif (isNegated) {\n\t\t\t\tmatch = `not { ${match} };`;\n\t\t\t}\n\t\t}\n\t}\n\n\tmatches.push(indent(match, depth));\n\treturn matches;\n};\n\nconst handleRelationRoleFilter = (\n\trole: any, // Adjust type as needed\n\tvalue: any,\n\t$var: string,\n\t$thing: string,\n\tschema: EnrichedBormSchema,\n\tdepth: number,\n\tisNegated: boolean,\n): string[] => {\n\tconst matches: string[] = [];\n\tconst [player] = role.playedBy || [];\n\tconst playerThing = getSchemaByThing(schema, player.thing);\n\tconst playerIdField = playerThing.idFields?.[0];\n\tif (!playerIdField) {\n\t\tthrow new Error(`\"${player.thing}\" does not have an id field`);\n\t}\n\tconst playerVar = `${player.thing}_${uuidv4()}`;\n\tconst filterId = uuidv4();\n\tconst filterVar = `${$var}_${filterId}`;\n\n\tmatches.push(indent(`$${filterVar} isa ${$thing};`, depth));\n\n\tlet match = '';\n\n\tif (value === null) {\n\t\tmatch = `$${filterVar} (${player.plays}: ${playerVar});`;\n\t\tif (isNegated) {\n\t\t\tmatches.push(indent(match, depth));\n\t\t} else {\n\t\t\tmatches.push(indent(`not { ${match} };`, depth));\n\t\t}\n\t} else if (isArray(value)) {\n\t\tconst alt = value.map(\n\t\t\t(v) =>\n\t\t\t\t`$${playerVar} isa ${player.thing}, has ${playerIdField} ${serializeValue(\n\t\t\t\t\tv,\n\t\t\t\t)}; $${filterVar} (${player.plays}: $${playerVar});`,\n\t\t);\n\t\tmatch = joinAlt(alt);\n\t\tif (isNegated) {\n\t\t\tmatches.push(indent(`not { ${match} };`, depth));\n\t\t} else {\n\t\t\tmatches.push(indent(match, depth));\n\t\t}\n\t} else {\n\t\tmatch = `$${playerVar} isa ${player.thing}, has ${playerIdField} ${serializeValue(\n\t\t\tvalue,\n\t\t)}; $${filterVar} (${player.plays}: $${playerVar});`;\n\t\tif (isNegated) {\n\t\t\tmatches.push(indent(`not { ${match} };`, depth));\n\t\t} else {\n\t\t\tmatches.push(indent(match, depth));\n\t\t}\n\t}\n\n\tmatches.push(indent(`$${$var} is $${filterVar};`, depth));\n\n\treturn matches;\n};\n\nconst joinAlt = (alt: string[]): string => {\n\tif (alt.length > 1) {\n\t\treturn `{ ${alt.join(' } or { ')} };`;\n\t} else if (alt.length === 1) {\n\t\treturn alt[0];\n\t} else {\n\t\tthrow new Error('No alternatives provided to joinAlt');\n\t}\n};\n\nconst serializeValue = (value: string | number | boolean | Date | object): string => {\n\tif (typeof value === 'string') {\n\t\treturn `'${value}'`;\n\t}\n\tif (typeof value === 'number' || typeof value === 'boolean') {\n\t\treturn `${value}`;\n\t}\n\tif (value instanceof Date) {\n\t\treturn `'${value.toISOString().replace('Z', '')}'`;\n\t}\n\tif (isObject(value)) {\n\t\tif ('$id' in value) {\n\t\t\tconst idValue = (value as any).$id;\n\t\t\tif (isArray(idValue)) {\n\t\t\t\treturn `like \"^(${idValue.join('|')})$\"`;\n\t\t\t}\n\t\t\treturn serializeValue(idValue);\n\t\t}\n\t\tthrow new Error('Cannot serialize complex object values in filter');\n\t}\n\tthrow new Error(`Unsupported value type: ${typeof value}`);\n};\n\nconst mapFilterKeys = (filter: Filter, thingSchema: EnrichedBormEntity | EnrichedBormRelation): Filter => {\n\tconst mapper: Record<string, string> = {};\n\n\tthingSchema.dataFields?.forEach((df) => {\n\t\tif (df.path !== df.dbPath) {\n\t\t\tmapper[df.path] = df.dbPath;\n\t\t}\n\t});\n\n\tif (Object.keys(mapper).length === 0) {\n\t\treturn filter;\n\t}\n\n\tconst { $not, ...f } = filter;\n\tconst newFilter: Filter = mapPositiveFilterKeys(f, mapper);\n\n\tif ($not && isPositiveFilter($not)) {\n\t\tnewFilter.$not = mapPositiveFilterKeys($not, mapper);\n\t}\n\n\treturn newFilter;\n};\n\nconst mapPositiveFilterKeys = (filter: PositiveFilter, mapper: Record<string, string>): PositiveFilter => {\n\tconst newFilter: PositiveFilter = {};\n\tObject.entries(filter).forEach(([key, filterValue]) => {\n\t\tconst newKey = mapper[key] || key;\n\t\tnewFilter[newKey] = filterValue;\n\t});\n\treturn newFilter;\n};\n\nconst isPositiveFilter = (filter: any): filter is PositiveFilter => {\n\treturn typeof filter === 'object' && filter !== null && !Array.isArray(filter);\n};\n","import { isArray } from 'radash';\nimport { assertDefined, getCurrentSchema } from '../../../helpers';\nimport type {\n\tBormConfig,\n\tEnrichedBormEntity,\n\tEnrichedBormRelation,\n\tEnrichedBormSchema,\n\tEnrichedBQLQuery,\n\tRawBQLQuery,\n} from '../../../types';\nimport { QueryPath } from '../../../types/symbols';\n\ntype TypeDbResponse = Record<string, any>; //TODO\n\nexport const parseTQLQuery = async (props: {\n\trawBqlRequest: RawBQLQuery[];\n\tenrichedBqlQuery: EnrichedBQLQuery[];\n\tschema: EnrichedBormSchema;\n\tconfig: BormConfig;\n\trawTqlRes: Record<string, any>[][];\n}): Promise<TypeDbResponse[]> => {\n\tconst { enrichedBqlQuery, rawBqlRequest, schema, config, rawTqlRes } = props;\n\n\tif (!enrichedBqlQuery) {\n\t\tthrow new Error('BQL request not enriched');\n\t} else if (!rawTqlRes) {\n\t\tthrow new Error('TQL query not executed');\n\t}\n\n\treturn rawTqlRes.map((res, i) => {\n\t\tconst rawBql = rawBqlRequest[i];\n\t\tconst query = enrichedBqlQuery[i];\n\t\tconst parsed = realParse(res, rawBql, query, schema, config);\n\t\treturn parsed;\n\t});\n};\n\nconst realParse = (\n\tres: any[],\n\trawBqlRequest: RawBQLQuery,\n\tenrichedBqlQuery: EnrichedBQLQuery,\n\tschema: EnrichedBormSchema,\n\tconfig: BormConfig,\n) => {\n\tif (res.length === 0) {\n\t\t// This is a little inconsistent. In the prop if the result is empty\n\t\t// we return null or undefined based on the config, but the test\n\t\t// expect the top level result to always return null.\n\t\t// always return\n\t\t// return config.query?.returnNulls ? null : undefined;\n\t\treturn null;\n\t}\n\tif (enrichedBqlQuery.$filterByUnique) {\n\t\treturn parseObj(res[0], rawBqlRequest, schema, config);\n\t}\n\treturn res.map((item) => parseObj(item, rawBqlRequest, schema, config));\n};\n\nconst parseObj = (res: any, rawBqlRequest: RawBQLQuery, schema: EnrichedBormSchema, config: BormConfig) => {\n\tconst { dataFields, currentSchema, linkFields, roleFields, schemaValue } = parseFields(res, schema);\n\n\tconst parsedDataFields = parseDataFields(dataFields, currentSchema, config);\n\tconst parsedLinkFields = parseLinkFields(linkFields, schema, config);\n\tconst parsedRoleFields = parseRoleFields(roleFields, schema, config);\n\tconst idNotIncluded = rawBqlRequest?.$fields?.every(\n\t\t(field) => !currentSchema?.idFields?.includes(typeof field === 'string' ? field : field.$path),\n\t);\n\n\tconst finalObj = {\n\t\t...parsedLinkFields,\n\t\t...parsedRoleFields,\n\t\t...schemaValue,\n\t\t...(!config.query?.noMetadata && rawBqlRequest.$id\n\t\t\t? // TODO: This line is wrong: the id field may not be \"id\"; $id may be an array of string;\n\t\t\t\t{ $id: Array.isArray(rawBqlRequest.$id) ? parsedDataFields['id'] : rawBqlRequest.$id }\n\t\t\t: {}),\n\t\t...(idNotIncluded\n\t\t\t? Object.fromEntries(Object.entries(parsedDataFields).filter(([key]) => !currentSchema?.idFields?.includes(key)))\n\t\t\t: parsedDataFields),\n\t};\n\n\treturn finalObj;\n};\n\nconst parseFields = (obj: any, schema: EnrichedBormSchema) => {\n\tconst keys = Object.keys(obj);\n\t// Find and process $dataFields\n\tconst dataFieldsKey = keys.find((key) => key.endsWith('.$dataFields'));\n\tconst multiValKeys = keys.filter((key) => key.endsWith('.$multiVal'));\n\tif (!dataFieldsKey) {\n\t\tthrow new Error('No dataFields');\n\t}\n\n\t//if there are multiValKeys, we replace it in the Object\n\tif (multiValKeys?.length > 0) {\n\t\tmultiValKeys.forEach((multiValKey) => {\n\t\t\tconst multiValKeyWithout$multiVal = multiValKey.replace(/\\.\\$multiVal$/, '');\n\t\t\tconst realValue = obj[multiValKey][0][multiValKeyWithout$multiVal].attribute; //there is an easier way for sure\n\t\t\t// eslint-disable-next-line no-param-reassign\n\t\t\tobj[dataFieldsKey][multiValKeyWithout$multiVal] = realValue;\n\t\t});\n\t}\n\tconst dataFields = obj[dataFieldsKey];\n\n\tconst metaDataKey = dataFieldsKey.split('.')[dataFieldsKey.split('.').length - 2];\n\tdataFields.$metaData = metaDataKey;\n\n\tif (dataFields.length === 0) {\n\t\tthrow new Error('No dataFields');\n\t}\n\n\tconst dataFieldsThing = dataFields.type;\n\tconst schemaValue = {\n\t\t$thing: dataFieldsThing.label,\n\t\t$thingType: dataFieldsThing.root,\n\t\t[QueryPath]: obj['queryPath'].value,\n\t};\n\tconst node = { [`$${schemaValue.$thingType}`]: schemaValue.$thing };\n\tconst currentSchema = getCurrentSchema(schema, node);\n\n\t// Process linkFields and roleFields\n\tconst linkFields = keys\n\t\t.filter((key) => {\n\t\t\tconst $key = assertDefined(key.split('.').pop());\n\t\t\treturn !key.endsWith('.$dataFields') && currentSchema.linkFields?.some((o) => o.path === $key);\n\t\t})\n\t\t.map((key) => {\n\t\t\tconst $key = assertDefined(key.split('.').pop());\n\t\t\tconst linkField = assertDefined(currentSchema.linkFields?.find((o) => o.path === $key));\n\t\t\treturn {\n\t\t\t\t$linkFields: obj[key],\n\t\t\t\t$key,\n\t\t\t\t$metaData: key.split('.')[key.split('.').length - 2],\n\t\t\t\t$cardinality: linkField.cardinality,\n\t\t\t};\n\t\t});\n\n\tconst roleFields = keys\n\t\t.filter((key) => {\n\t\t\tconst role = key.split('.').pop();\n\t\t\treturn (\n\t\t\t\trole && !key.endsWith('.$dataFields') && currentSchema.thingType === 'relation' && currentSchema.roles?.[role]\n\t\t\t);\n\t\t})\n\t\t.map((key) => {\n\t\t\tconst role = assertDefined(key.split('.').pop());\n\t\t\treturn {\n\t\t\t\t$roleFields: obj[key],\n\t\t\t\t$key: role,\n\t\t\t\t$metaData: key.split('.')[key.split('.').length - 2],\n\t\t\t\t$cardinality: (currentSchema as EnrichedBormRelation).roles[role].cardinality,\n\t\t\t};\n\t\t});\n\n\treturn { dataFields, schemaValue, currentSchema, linkFields, roleFields };\n};\n\nconst parseDataFields = (\n\tdataFields: any,\n\tcurrentSchema: EnrichedBormEntity | EnrichedBormRelation,\n\tconfig: BormConfig,\n) => {\n\tconst { $metaData } = dataFields;\n\tconst { as: $as } = parseArrayMetadata($metaData);\n\n\t// Process the main data fields\n\tconst mainDataFields = Object.entries(dataFields as Record<string, any>)\n\t\t.filter(([key]) => key !== 'type' && !key.startsWith('$'))\n\t\t.map(([key, value]) => {\n\t\t\tconst field = currentSchema.dataFields?.find((f) => f.path === key || f.dbPath === key);\n\t\t\tconst isIdField = key === 'id';\n\t\t\tconst $asKey = Array.isArray($as) ? $as.find((o) => o[key])?.[key] : key;\n\n\t\t\tlet fieldValue;\n\t\t\tif (field?.cardinality === 'ONE') {\n\t\t\t\tfieldValue = value[0] ? value[0].value : config.query?.returnNulls ? null : undefined;\n\t\t\t\tif (field.contentType === 'DATE' || (field.contentType === 'FLEX' && value[0].type.value_type === 'datetime')) {\n\t\t\t\t\t/// date fields need to be converted to ISO format including the timezone\n\t\t\t\t\tfieldValue = fieldValue ? `${fieldValue}Z` : fieldValue;\n\t\t\t\t} else if (field.contentType === 'JSON') {\n\t\t\t\t\tfieldValue = fieldValue && JSON.parse(fieldValue);\n\t\t\t\t}\n\t\t\t\tif (isIdField) {\n\t\t\t\t\treturn [\n\t\t\t\t\t\t[$asKey, fieldValue],\n\t\t\t\t\t\t['$id', fieldValue],\n\t\t\t\t\t].filter(([_, v]) => v !== undefined);\n\t\t\t\t}\n\t\t\t} else if (field?.cardinality === 'MANY') {\n\t\t\t\tif (!isArray(value)) {\n\t\t\t\t\tthrow new Error('Typedb fetch has changed its format');\n\t\t\t\t}\n\t\t\t\tif (value.length === 0) {\n\t\t\t\t\treturn config.query?.returnNulls ? [[$asKey, null]] : []; //return nothing unles the returnNulls flag is set\n\t\t\t\t}\n\t\t\t\tif (field.contentType === 'DATE') {\n\t\t\t\t\tfieldValue = value.map((o) => {\n\t\t\t\t\t\treturn `${o.value}Z`;\n\t\t\t\t\t});\n\t\t\t\t} else if (field.contentType === 'FLEX') {\n\t\t\t\t\tfieldValue = value.map((o) => {\n\t\t\t\t\t\tif (o.type.value_type === 'datetime') {\n\t\t\t\t\t\t\treturn `${o.value}Z`;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn o.value;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t} else if (field.contentType === 'JSON') {\n\t\t\t\t\tfieldValue = value.map((o) => {\n\t\t\t\t\t\treturn o.value && JSON.parse(o.value);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tfieldValue = value.map((o) => {\n\t\t\t\t\t\treturn o.value;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn [[$asKey, fieldValue]].filter(([_, v]) => v !== undefined);\n\t\t})\n\t\t.flat();\n\n\treturn Object.fromEntries([...mainDataFields]);\n};\n\nconst parseRoleFields = (\n\troleFields: { $roleFields: any[]; $key: string; $metaData: string; $cardinality: 'MANY' | 'ONE' }[],\n\tschema: EnrichedBormSchema,\n\tconfig: BormConfig,\n) => {\n\tconst roleFieldsRes: Record<string, any> = {};\n\n\troleFields.forEach((roleField) => {\n\t\tconst { $roleFields, $metaData, $cardinality } = roleField;\n\t\tconst { as, justId, idNotIncluded, filterByUnique } = parseMetaData($metaData);\n\n\t\tif (as === null) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst items = $roleFields.map((item) => {\n\t\t\tconst { dataFields, currentSchema, linkFields, roleFields, schemaValue } = parseFields(item, schema);\n\t\t\tconst parsedDataFields = parseDataFields(dataFields, currentSchema, config);\n\n\t\t\tif (justId === 'T') {\n\t\t\t\treturn parsedDataFields.id;\n\t\t\t} else {\n\t\t\t\tconst parsedLinkFields = parseLinkFields(linkFields, schema, config);\n\t\t\t\tconst parsedRoleFields = parseRoleFields(roleFields, schema, config);\n\t\t\t\tconst resDataFields = { ...parsedDataFields };\n\t\t\t\tif (idNotIncluded === 'true') {\n\t\t\t\t\tcurrentSchema?.idFields?.forEach((field) => delete resDataFields[field]);\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\t...resDataFields,\n\t\t\t\t\t...parsedLinkFields,\n\t\t\t\t\t...parsedRoleFields,\n\t\t\t\t\t...schemaValue,\n\t\t\t\t};\n\t\t\t}\n\t\t});\n\n\t\tif (items.length > 0) {\n\t\t\troleFieldsRes[as] = $cardinality === 'MANY' && filterByUnique === 'false' ? items : items[0];\n\t\t} else if (config.query?.returnNulls) {\n\t\t\troleFieldsRes[as] = null;\n\t\t}\n\t});\n\n\treturn roleFieldsRes;\n};\n\nconst parseLinkFields = (\n\tlinkFields: { $linkFields: any[]; $key: string; $metaData: string; $cardinality: 'MANY' | 'ONE' }[],\n\tschema: EnrichedBormSchema,\n\tconfig: BormConfig,\n) => {\n\tconst linkFieldsRes: Record<string, any> = {};\n\n\tlinkFields.forEach((linkField) => {\n\t\tconst { $linkFields, $metaData, $cardinality } = linkField;\n\t\tconst { as, justId, idNotIncluded, filterByUnique } = parseMetaData($metaData);\n\n\t\tif (as === null) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst items = $linkFields.map((item) => {\n\t\t\tconst { dataFields, currentSchema, linkFields, roleFields, schemaValue } = parseFields(item, schema);\n\t\t\tconst parsedDataFields = parseDataFields(dataFields, currentSchema, config);\n\n\t\t\tif (justId === 'T') {\n\t\t\t\treturn parsedDataFields.id;\n\t\t\t} else {\n\t\t\t\tconst parsedLinkFields = parseLinkFields(linkFields, schema, config);\n\t\t\t\tconst parsedRoleFields = parseRoleFields(roleFields, schema, config);\n\t\t\t\tconst resDataFields = { ...parsedDataFields };\n\n\t\t\t\tif (idNotIncluded === 'true') {\n\t\t\t\t\tcurrentSchema.idFields?.forEach((field) => delete resDataFields[field]);\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\t...resDataFields,\n\t\t\t\t\t...parsedLinkFields,\n\t\t\t\t\t...parsedRoleFields,\n\t\t\t\t\t...schemaValue,\n\t\t\t\t};\n\t\t\t}\n\t\t});\n\n\t\t// eslint-disable-next-line no-param-reassign\n\t\tlinkFieldsRes[as] =\n\t\t\titems.length > 0\n\t\t\t\t? $cardinality === 'MANY' && filterByUnique === 'false'\n\t\t\t\t\t? items\n\t\t\t\t\t: items[0]\n\t\t\t\t: config.query?.returnNulls\n\t\t\t\t\t? null\n\t\t\t\t\t: undefined;\n\t});\n\n\treturn linkFieldsRes;\n};\n\n//todo: add this metadata as a typedb \"?\" var instead\nconst parseMetaData = (str: string) => {\n\tconst asRegex = /as:([a-zA-Z0-9_\\-·]+)/;\n\tconst justIdRegex = /justId:([a-zA-Z0-9_\\-·]+)/;\n\tconst idNotIncludedRegex = /idNotIncluded:([a-zA-Z0-9_\\-·]+)/;\n\tconst filterByUniqueRegex = /filterByUnique:([a-zA-Z0-9_\\-·]+)/;\n\n\tconst asMatch = str.match(asRegex);\n\tconst justIdMatch = str.match(justIdRegex);\n\tconst idNotIncludedMatch = str.match(idNotIncludedRegex);\n\tconst filterByUniqueMatch = str.match(filterByUniqueRegex);\n\n\treturn {\n\t\tas: asMatch ? asMatch[1] : null,\n\t\tjustId: justIdMatch ? justIdMatch[1] : null,\n\t\tidNotIncluded: idNotIncludedMatch ? idNotIncludedMatch[1] : null,\n\t\tfilterByUnique: filterByUniqueMatch ? filterByUniqueMatch[1] : null,\n\t};\n};\n\nconst parseArrayMetadata = (str: string) => {\n\ttry {\n\t\tconst convertToJson = (str: string) => {\n\t\t\t// Remove $metadata: from the string\n\t\t\tlet jsonString = str.replace('$metadata:', '');\n\n\t\t\t// Enclose keys in quotes\n\t\t\tjsonString = jsonString.replace(/([a-zA-Z0-9_\\-·]+)(?=:)/g, '\"$1\"');\n\n\t\t\t// Enclose values in quotes, handling nested object values separately\n\t\t\tjsonString = jsonString.replace(/:(\\s*)([a-zA-Z0-9_\\-·]+)/g, (match, p1, p2) => {\n\t\t\t\t// Check if the value is part of an object\n\t\t\t\tif (/^{.*}$/.test(p2)) {\n\t\t\t\t\treturn `:${p2}`;\n\t\t\t\t} else {\n\t\t\t\t\treturn `:${p1}\"${p2}\"`;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Convert array elements (non-object) to strings\n\t\t\tjsonString = jsonString.replace(/\\[([^\\]]+)\\]/g, (match, p1) => {\n\t\t\t\treturn `[${p1\n\t\t\t\t\t.split(',')\n\t\t\t\t\t.map((s: string) => {\n\t\t\t\t\t\t// Check if element is an object-like structure\n\t\t\t\t\t\tif (s.trim().startsWith('{') && s.trim().endsWith('}')) {\n\t\t\t\t\t\t\treturn s.trim();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn `\"${s.trim()}\"`;\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t.join(',')}]`;\n\t\t\t});\n\n\t\t\treturn jsonString;\n\t\t};\n\t\tconst converted = convertToJson(str);\n\n\t\tconst parsed = JSON.parse(converted);\n\t\treturn parsed;\n\t} catch (e) {\n\t\tconsole.error(e);\n\t\treturn { as: [] };\n\t}\n};\n","import { SessionType } from 'typedb-driver';\nimport type { BormConfig, DBHandles } from '../../types';\n\nexport const getSessionOrOpenNewOne = async (dbHandles: DBHandles, config: BormConfig) => {\n\tconst singleHandlerV0 = config.dbConnectors[0].id;\n\tlet session = dbHandles.typeDB?.get(singleHandlerV0)?.session;\n\tconst client = dbHandles.typeDB?.get(singleHandlerV0)?.client;\n\n\tif (!session || !session.isOpen()) {\n\t\tif (!client) {\n\t\t\tthrow new Error('Client not found');\n\t\t}\n\t\tsession = await client.session(config.dbConnectors[0].dbName, SessionType.DATA);\n\t\tdbHandles.typeDB?.set(singleHandlerV0, { client, session });\n\t}\n\n\treturn { client, session };\n};\n","import type { AggregateError } from 'radash';\nimport { parallel, tryit } from 'radash';\nimport { TransactionType, TypeDBOptions } from 'typedb-driver';\nimport { getSessionOrOpenNewOne } from '../../../adapters/typeDB/helpers';\nimport type { BormConfig, DBHandles } from '../../../types';\n\nexport const runTQLQuery = async (props: {\n\ttqlRequest: string[];\n\tdbHandles: DBHandles;\n\tconfig: BormConfig;\n}): Promise<any> => {\n\tconst { tqlRequest, dbHandles, config } = props;\n\t//TODO condition this only to have infer if there are virtual fields (without default fn)\n\tconst options = new TypeDBOptions();\n\toptions.infer = true;\n\n\tconst { session } = await getSessionOrOpenNewOne(dbHandles, config);\n\tconst transaction = await session.transaction(TransactionType.READ, options);\n\n\t//console.log('query', JSON.stringify(tqlRequest, null, 2));\n\tconst [err, resArray] = await tryit(parallel)(tqlRequest.length, tqlRequest, async (queryString) => {\n\t\tconst tqlStream = transaction.query.fetch(queryString as string);\n\t\tconst tqlRes = await tqlStream.collect();\n\t\treturn tqlRes;\n\t});\n\n\tif (err) {\n\t\tawait transaction.rollback();\n\t\tconst error = err as AggregateError;\n\t\tthrow new Error(`Error running TQL query: ${error.errors}`);\n\t}\n\tawait transaction.close();\n\n\t// todo: type the rawTqlRes\n\treturn resArray;\n};\n","import { assertDefined } from '../../../helpers';\nimport type { BormConfig, DBHandles, EnrichedBormSchema, EnrichedBQLQuery, RawBQLQuery } from '../../../types';\nimport { createMachine, interpret, invoke, reduce, state, transition } from '../../robot3';\nimport { buildTQLQuery } from './build';\nimport { parseTQLQuery } from './parse';\nimport { runTQLQuery } from './run';\n\nexport type TypeDbMachineContext = {\n\tbql: {\n\t\traw: RawBQLQuery[];\n\t\tqueries: EnrichedBQLQuery[];\n\t\tres?: any[];\n\t};\n\ttql: {\n\t\tqueries?: string[];\n\t\tres?: any[];\n\t};\n\tschema: EnrichedBormSchema;\n\tconfig: BormConfig;\n\thandles: DBHandles;\n\terror?: string | null;\n};\n\nconst updateBqlRes = (ctx: TypeDbMachineContext, event: any): TypeDbMachineContext => {\n\tif (!event.data) {\n\t\treturn ctx;\n\t}\n\treturn {\n\t\t...ctx,\n\t\tbql: { ...ctx.bql, res: event.data },\n\t};\n};\n\nconst updateTqlReq = (ctx: TypeDbMachineContext, event: any): TypeDbMachineContext => {\n\tif (!event.data) {\n\t\treturn ctx;\n\t}\n\treturn {\n\t\t...ctx,\n\t\ttql: { ...ctx.tql, queries: event.data },\n\t};\n};\n\nconst updateTqlRes = (ctx: TypeDbMachineContext, event: any): TypeDbMachineContext => {\n\tif (!event.data) {\n\t\treturn ctx;\n\t}\n\treturn {\n\t\t...ctx,\n\t\ttql: { ...ctx.tql, res: event.data },\n\t};\n};\n\nconst errorTransition = transition(\n\t'error',\n\t'error',\n\treduce((ctx: TypeDbMachineContext, event: any): TypeDbMachineContext => {\n\t\treturn {\n\t\t\t...ctx,\n\t\t\terror: event.error,\n\t\t};\n\t}),\n);\n\nexport const typeDbQueryMachine = createMachine(\n\t'build',\n\t{\n\t\tbuild: invoke(\n\t\t\tasync (ctx: TypeDbMachineContext) => buildTQLQuery({ queries: ctx.bql.queries, schema: ctx.schema }),\n\t\t\ttransition('done', 'run', reduce(updateTqlReq)),\n\t\t\terrorTransition,\n\t\t),\n\t\trun: invoke(\n\t\t\tasync (ctx: TypeDbMachineContext) => {\n\t\t\t\treturn runTQLQuery({\n\t\t\t\t\tdbHandles: ctx.handles,\n\t\t\t\t\ttqlRequest: assertDefined(ctx.tql.queries),\n\t\t\t\t\tconfig: ctx.config,\n\t\t\t\t});\n\t\t\t},\n\t\t\ttransition('done', 'parse', reduce(updateTqlRes)),\n\t\t\terrorTransition,\n\t\t),\n\t\tparse: invoke(\n\t\t\tasync (ctx: TypeDbMachineContext) =>\n\t\t\t\tparseTQLQuery({\n\t\t\t\t\trawBqlRequest: ctx.bql.raw,\n\t\t\t\t\tenrichedBqlQuery: ctx.bql.queries,\n\t\t\t\t\tschema: ctx.schema,\n\t\t\t\t\tconfig: ctx.config,\n\t\t\t\t\trawTqlRes: assertDefined(ctx.tql.res),\n\t\t\t\t}),\n\t\t\ttransition('done', 'success', reduce(updateBqlRes)),\n\t\t\terrorTransition,\n\t\t),\n\t\tsuccess: state(),\n\t\terror: state(),\n\t},\n\t(ctx: TypeDbMachineContext) => ctx,\n);\n\nconst awaitQueryMachine = async (context: TypeDbMachineContext) => {\n\treturn new Promise<any[]>((resolve, reject) => {\n\t\tinterpret(\n\t\t\ttypeDbQueryMachine,\n\t\t\t(service) => {\n\t\t\t\tif (service.machine.state.name === 'success') {\n\t\t\t\t\t//@ts-expect-error = todo\n\t\t\t\t\tresolve(service.context.bql.res);\n\t\t\t\t}\n\t\t\t\tif (service.machine.state.name === 'error') {\n\t\t\t\t\treject(service.context.error);\n\t\t\t\t}\n\t\t\t},\n\t\t\tcontext,\n\t\t);\n\t});\n};\n\nexport const runTypeDbQueryMachine = async (\n\tbql: RawBQLQuery[],\n\tenrichedBql: EnrichedBQLQuery[],\n\tschema: EnrichedBormSchema,\n\tconfig: BormConfig,\n\thandles: DBHandles,\n) => {\n\treturn awaitQueryMachine({\n\t\tbql: {\n\t\t\traw: bql,\n\t\t\tqueries: enrichedBql,\n\t\t},\n\t\ttql: {},\n\t\tschema: schema,\n\t\tconfig: config,\n\t\thandles: handles,\n\t\terror: null,\n\t});\n};\n","import type { TypeDBDriver } from 'typedb-driver';\nimport { assertDefined, getSchemaByThing } from '../../helpers';\nimport type { BormConfig, DBHandles, EnrichedBormSchema, EnrichedBQLQuery, RawBQLQuery } from '../../types';\nimport { createMachine, interpret, invoke, reduce, state, transition } from '../robot3';\nimport { cleanQueryRes } from './bql/clean';\nimport { enrichBQLQuery } from './bql/enrich';\nimport { postHooks } from './postHook';\nimport { runSurrealDbQueryMachine } from './surql/machine';\nimport { runTypeDbQueryMachine } from './tql/machine';\nimport type { SimpleSurrealClient } from '../../adapters/surrealDB/client';\nimport { VERSION } from '../../version';\nimport { logDebug } from '../../logger';\n\ntype MachineContext = {\n\tbql: {\n\t\traw: RawBQLQuery[];\n\t\tqueries?: EnrichedBQLQuery[];\n\t\tres?: any[]; // TODO\n\t};\n\tschema: EnrichedBormSchema;\n\tconfig: BormConfig;\n\thandles: DBHandles;\n\terror: string | null;\n};\n\nconst updateBqlReq = (ctx: MachineContext, event: any) => {\n\tif (!event.data) {\n\t\treturn ctx;\n\t}\n\treturn {\n\t\t...ctx,\n\t\tbql: { ...ctx.bql, queries: event.data },\n\t};\n};\n\nconst updateBqlRes = (ctx: MachineContext, event: any) => {\n\tif (!event.data) {\n\t\treturn ctx;\n\t}\n\treturn {\n\t\t...ctx,\n\t\tbql: { ...ctx.bql, res: event.data },\n\t};\n};\n\nconst errorTransition = transition(\n\t'error',\n\t'error',\n\treduce((ctx: MachineContext, event: any) => {\n\t\treturn {\n\t\t\t...ctx,\n\t\t\terror: event.error,\n\t\t};\n\t}),\n);\n\ntype TypeDBAdapter = {\n\tdb: 'typeDB';\n\tclient: TypeDBDriver;\n\trawBql: RawBQLQuery[];\n\tbqlQueries: EnrichedBQLQuery[];\n\tindices: number[];\n};\n\ntype SurrealDBAdapter = {\n\tdb: 'surrealDB';\n\tclient: SimpleSurrealClient;\n\trawBql: RawBQLQuery[];\n\tbqlQueries: EnrichedBQLQuery[];\n\tindices: number[];\n};\n\ntype Adapter = TypeDBAdapter | SurrealDBAdapter;\n\nexport const queryMachine = createMachine(\n\t'enrich',\n\t{\n\t\tenrich: invoke(\n\t\t\tasync (ctx: MachineContext) => {\n\t\t\t\tlogDebug(`originalBQLQuery[${VERSION}]`, JSON.stringify(ctx.bql.raw));\n\t\t\t\treturn enrichBQLQuery(ctx.bql.raw, ctx.schema);\n\t\t\t},\n\t\t\ttransition('done', 'adapter', reduce(updateBqlReq)),\n\t\t\terrorTransition,\n\t\t),\n\t\tadapter: invoke(\n\t\t\tasync (ctx: MachineContext) => {\n\t\t\t\tconst adapters: Record<string, Adapter> = {};\n\n\t\t\t\tctx.bql.queries?.forEach((q, i) => {\n\t\t\t\t\tconst raw = ctx.bql.raw[i];\n\t\t\t\t\tconst thing = getSchemaByThing(ctx.schema, q.$thing);\n\t\t\t\t\tconst { id } = thing.defaultDBConnector;\n\n\t\t\t\t\tif (thing.db === 'typeDB') {\n\t\t\t\t\t\tif (!adapters[id]) {\n\t\t\t\t\t\t\tconst client = ctx.handles.typeDB?.get(id)?.client;\n\t\t\t\t\t\t\tif (!client) {\n\t\t\t\t\t\t\t\tthrow new Error(`TypeDB client with id \"${thing.defaultDBConnector.id}\" does not exist`);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tadapters[id] = {\n\t\t\t\t\t\t\t\tdb: 'typeDB',\n\t\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\trawBql: [],\n\t\t\t\t\t\t\t\tbqlQueries: [],\n\t\t\t\t\t\t\t\tindices: [],\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (thing.db === 'surrealDB') {\n\t\t\t\t\t\tif (!adapters[id]) {\n\t\t\t\t\t\t\tconst client = ctx.handles.surrealDB?.get(id)?.client;\n\t\t\t\t\t\t\tif (!client) {\n\t\t\t\t\t\t\t\tthrow new Error(`SurrealDB client with id \"${thing.defaultDBConnector.id}\" does not exist`);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tadapters[id] = {\n\t\t\t\t\t\t\t\tdb: 'surrealDB',\n\t\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\trawBql: [],\n\t\t\t\t\t\t\t\tbqlQueries: [],\n\t\t\t\t\t\t\t\tindices: [],\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow new Error(`Unsupported DB \"${thing.db}\"`);\n\t\t\t\t\t}\n\t\t\t\t\tconst adapter = adapters[id];\n\t\t\t\t\tadapter.rawBql.push(raw);\n\t\t\t\t\tadapter.bqlQueries.push(q);\n\t\t\t\t\tadapter.indices.push(i);\n\t\t\t\t});\n\t\t\t\tconst adapterList = Object.values(adapters);\n\t\t\t\tconst proms = adapterList.map((a) => {\n\t\t\t\t\tif (a.db === 'typeDB') {\n\t\t\t\t\t\t// TODO: Replace DBHandles with TypeDBAdapter\n\t\t\t\t\t\treturn runTypeDbQueryMachine(a.rawBql, a.bqlQueries, ctx.schema, ctx.config, ctx.handles);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (a.db === 'surrealDB') {\n\t\t\t\t\t\treturn runSurrealDbQueryMachine(a.bqlQueries, ctx.schema, ctx.config, a.client);\n\t\t\t\t\t}\n\n\t\t\t\t\tthrow new Error(`Unsupported DB \"${JSON.stringify(a, null, 2)}\"`);\n\t\t\t\t});\n\t\t\t\tconst results = await Promise.all(proms);\n\t\t\t\tconst orderedResults = adapterList.flatMap((a, i) => {\n\t\t\t\t\tconst result = results[i];\n\t\t\t\t\treturn a.indices.map((index, j) => ({ index, result: result[j] }));\n\t\t\t\t});\n\t\t\t\torderedResults.sort((a, b) => (a.index < b.index ? -1 : a.index > b.index ? 1 : 0));\n\t\t\t\tconst result = orderedResults.map(({ result }) => result);\n\t\t\t\treturn result;\n\t\t\t},\n\t\t\ttransition('done', 'postHooks', reduce(updateBqlRes)),\n\t\t\terrorTransition,\n\t\t),\n\t\tpostHooks: invoke(\n\t\t\tasync (ctx: MachineContext) => postHooks(ctx.schema, assertDefined(ctx.bql.queries), assertDefined(ctx.bql.res)),\n\t\t\ttransition('done', 'clean', reduce(updateBqlRes)),\n\t\t\terrorTransition,\n\t\t),\n\t\tclean: invoke(\n\t\t\tasync (ctx: MachineContext) => cleanQueryRes(ctx.config, assertDefined(ctx.bql.res)),\n\t\t\ttransition('done', 'success', reduce(updateBqlRes)),\n\t\t\terrorTransition,\n\t\t),\n\t\tsuccess: state(),\n\t\terror: state(),\n\t},\n\t(ctx: MachineContext) => ctx,\n);\n\nexport const awaitQueryMachine = async (context: MachineContext) => {\n\treturn new Promise<MachineContext>((resolve, reject) => {\n\t\tinterpret(\n\t\t\tqueryMachine,\n\t\t\t(service) => {\n\t\t\t\tif (service.machine.state.name === 'success') {\n\t\t\t\t\tresolve(service.context);\n\t\t\t\t}\n\t\t\t\tif (service.machine.state.name === 'error') {\n\t\t\t\t\treject(service.context);\n\t\t\t\t}\n\t\t\t},\n\t\t\tcontext,\n\t\t);\n\t});\n};\n\nexport const runQueryMachine = async (\n\tbql: RawBQLQuery[],\n\tschema: EnrichedBormSchema,\n\tconfig: BormConfig,\n\thandles: DBHandles,\n) => {\n\treturn awaitQueryMachine({\n\t\tbql: {\n\t\t\traw: bql,\n\t\t},\n\t\tschema: schema,\n\t\tconfig: config,\n\t\thandles: handles,\n\t\terror: null,\n\t});\n};\n","/* eslint-disable no-param-reassign */\nimport { produce } from 'immer';\nimport { traverse } from 'object-traversal';\nimport { isArray, isObject } from 'radash';\nimport type {\n\tBQLResponse,\n\tBormConfig,\n\tDBHandles,\n\tEnrichedBQLMutationBlock,\n\tEnrichedBormSchema,\n\tFilledBQLMutationBlock,\n} from '../../../types';\nimport { getCardinality, getCurrentSchema, getSymbols } from '../../../helpers';\nimport { v4 as uuidv4 } from 'uuid';\nimport { runQueryMachine } from '../../query/queryMachine';\n\nexport const preQueryPathSeparator = '___';\ntype ObjectPath = { beforePath: string; ids: string | string[]; key: string };\n\nconst grandChildOfCreateSymbol = Symbol.for('grandChildOfCreate');\n\nexport const mutationPreQuery = async (\n\tblocks: EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[],\n\tschema: EnrichedBormSchema,\n\tconfig: BormConfig,\n\tdbHandles: DBHandles,\n) => {\n\tconst operatorKeys = ['$eq', '$ne', '$in', '$nin', '$gt', '$gte', '$lt', '$lte', '$exists'];\n\n\tconst getFieldKeys = (block: FilledBQLMutationBlock | Partial<FilledBQLMutationBlock>, noDataFields?: boolean) => {\n\t\treturn Object.keys(block).filter((key) => {\n\t\t\tif (!key.startsWith('$') && !operatorKeys.includes(key) && block[key] !== undefined) {\n\t\t\t\tif (noDataFields) {\n\t\t\t\t\tconst currentSchema = getCurrentSchema(schema, block);\n\t\t\t\t\tif (currentSchema.dataFields?.find((field) => field.path === key)) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t};\n\n\t/// 1. Check if pre-query should be run\n\n\tif (!blocks) {\n\t\tthrow new Error('[BQLE-M-PQ-1] No blocks found');\n\t}\n\n\tif (config.mutation?.preQuery === false) {\n\t\treturn;\n\t}\n\n\tconst ops: string[] = [];\n\n\ttraverse(blocks, ({ parent, key, value }) => {\n\t\tif (parent && key && !key.includes('$') && !operatorKeys.includes(key) && isObject(parent)) {\n\t\t\tconst values = Array.isArray(parent[key]) ? parent[key] : [parent[key]];\n\t\t\tvalues.forEach((val) => {\n\t\t\t\tif (isObject(val)) {\n\t\t\t\t\tif (parent.$op !== 'create') {\n\t\t\t\t\t\t// @ts-expect-error todo\n\t\t\t\t\t\tif (!ops.includes(val.$op)) {\n\t\t\t\t\t\t\t// @ts-expect-error todo\n\t\t\t\t\t\t\tops.push(val.$op);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// @ts-expect-error todo\n\t\t\t\t\t\tif (val.$op === 'delete' || val.$op === 'unlink') {\n\t\t\t\t\t\t\t// @ts-expect-error todo\n\t\t\t\t\t\t\tthrow new Error(`Cannot ${val.$op} under a create`);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t} else if (!parent && isObject(value)) {\n\t\t\t// @ts-expect-error todo\n\t\t\tif (!ops.includes(value.$op)) {\n\t\t\t\t// @ts-expect-error todo\n\t\t\t\tops.push(value.$op);\n\t\t\t}\n\t\t}\n\t});\n\n\tif (\n\t\t!ops.includes('delete') &&\n\t\t!ops.includes('unlink') &&\n\t\t!ops.includes('replace') &&\n\t\t!ops.includes('update') &&\n\t\t!ops.includes('link')\n\t) {\n\t\treturn;\n\t}\n\t/// 2. Convert mutation into query for all children nodes\n\n\tconst convertMutationToQuery = (blocks: FilledBQLMutationBlock[]) => {\n\t\tconst processBlock = (block: FilledBQLMutationBlock, root?: boolean) => {\n\t\t\tlet $fields: any[] = [];\n\t\t\tconst filteredBlock = {};\n\t\t\tconst toRemoveFromRoot = ['$op', '$bzId', '$parentKey'];\n\t\t\tconst toRemove = ['$relation', '$entity', '$id', ...toRemoveFromRoot];\n\t\t\tfor (const k in block) {\n\t\t\t\tif (toRemoveFromRoot.includes(k)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (toRemove.includes(k) && !root) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (!k.includes('$') && (isObject(block[k]) || Array.isArray(block[k]))) {\n\t\t\t\t\tconst v = extractValueFromFilter(block[k]) as FilledBQLMutationBlock;\n\n\t\t\t\t\tif (Array.isArray(v) && v.length > 0) {\n\t\t\t\t\t\tv.forEach((opBlock) => {\n\t\t\t\t\t\t\tconst newField = {\n\t\t\t\t\t\t\t\t$path: k,\n\t\t\t\t\t\t\t\t...processBlock(opBlock),\n\t\t\t\t\t\t\t\t...(opBlock.$filter && { $as: opBlock.$bzId }),\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t// todo: make sure it keeps the one with the most keys\n\t\t\t\t\t\t\tif (!$fields.find((o) => o.$path === newField.$path && !o.$filter)) {\n\t\t\t\t\t\t\t\t$fields = [...$fields, newField];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst newField = {\n\t\t\t\t\t\t\t$path: k,\n\t\t\t\t\t\t\t...processBlock(v),\n\t\t\t\t\t\t\t...(!v.$filter && { $as: v.$bzId }),\n\t\t\t\t\t\t};\n\t\t\t\t\t\t$fields = [...$fields, newField];\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// @ts-expect-error todo\n\t\t\t\t\tfilteredBlock[k] = block[k];\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...filteredBlock,\n\t\t\t\t$fields,\n\t\t\t};\n\t\t};\n\t\treturn blocks.map((block) => processBlock(block, true));\n\t};\n\n\tconst preQueryReq = convertMutationToQuery(Array.isArray(blocks) ? blocks : [blocks]);\n\t//console.log('preQueryReq', JSON.stringify(preQueryReq, null, 2));\n\n\t/// 3. Perform query\n\tconst res = await runQueryMachine(\n\t\t// @ts-expect-error todo\n\t\tpreQueryReq,\n\t\tschema,\n\t\t{ ...config, query: { ...config.query, returnNulls: true } },\n\t\tdbHandles,\n\t);\n\tconst preQueryRes = res.bql.res as BQLResponse[];\n\n\tconst getObjectPath = (parent: any, key: string) => {\n\t\tconst idField: string | string[] = parent.$id || parent.id || parent.$bzId;\n\t\tif (parent.$objectPath) {\n\t\t\tconst { $objectPath } = parent;\n\n\t\t\tconst root = $objectPath?.beforePath || 'root';\n\t\t\tconst ids = Array.isArray($objectPath.ids) ? `[${$objectPath.ids}]` : $objectPath.ids;\n\t\t\tconst final = `${root}.${ids}___${$objectPath.key}`;\n\n\t\t\tconst new$objectPath = {\n\t\t\t\tbeforePath: final,\n\t\t\t\tids: idField,\n\t\t\t\tkey,\n\t\t\t};\n\t\t\treturn new$objectPath;\n\t\t} else {\n\t\t\treturn {\n\t\t\t\tbeforePath: 'root',\n\t\t\t\tids: idField,\n\t\t\t\tkey,\n\t\t\t};\n\t\t}\n\n\t\t// return `${parent.$objectPath || 'root'}${idField ? `.${idField}` : ''}${preQueryPathSeparator}${key}`;\n\t};\n\n\tconst objectPathToKey = ($objectPath: ObjectPath, hardId?: string) => {\n\t\tconst root = $objectPath?.beforePath || 'root';\n\t\tif (typeof root !== 'string') {\n\t\t\tthrow new Error('[PQ]objectPathToKey: root is not a string');\n\t\t}\n\t\tconst ids = hardId ? hardId : Array.isArray($objectPath?.ids) ? `[${$objectPath?.ids}]` : $objectPath?.ids;\n\n\t\tconst final = `${root}.${ids}___${$objectPath?.key}`;\n\n\t\treturn final;\n\t};\n\n\tconst convertManyPaths = (input: string) => {\n\t\t// Check if the string contains square brackets\n\t\tif (input.includes('[') && input.includes(']')) {\n\t\t\t// Extract the part before the brackets, the items within the brackets, and the part after the brackets\n\t\t\tconst [prefix, itemsWithBrackets, suffix] = input.split(/[[\\]]/);\n\t\t\tconst items = itemsWithBrackets.split(',');\n\n\t\t\t// Combine each item with the prefix and suffix and return the array\n\t\t\treturn items.map((item) => `${prefix}${item}${suffix}`);\n\t\t} else {\n\t\t\t// If no brackets are present, return an array with the original string\n\t\t\treturn [input];\n\t\t}\n\t};\n\n\t// 4. Create cache of paths\n\ttype Cache<K extends string> = {\n\t\t[key in K]: {\n\t\t\t$objectPath: ObjectPath;\n\t\t\t$ids: string[];\n\t\t} | null;\n\t};\n\tconst cache: Cache<string> = {};\n\tconst cachePaths = (\n\t\tblocks: FilledBQLMutationBlock | FilledBQLMutationBlock[],\n\t): FilledBQLMutationBlock | FilledBQLMutationBlock[] => {\n\t\treturn produce(blocks, (draft) =>\n\t\t\ttraverse(draft, ({ key, parent }) => {\n\t\t\t\tif (parent && key && parent.$id && !key.includes('$')) {\n\t\t\t\t\tconst newObjPath = getObjectPath(parent, key);\n\t\t\t\t\tconst cacheKey = objectPathToKey(newObjPath);\n\t\t\t\t\tif (Array.isArray(parent[key])) {\n\t\t\t\t\t\t// @ts-expect-error todo\n\t\t\t\t\t\tconst cacheArray = [];\n\t\t\t\t\t\tparent[key].forEach((val) => {\n\t\t\t\t\t\t\tif (isObject(val)) {\n\t\t\t\t\t\t\t\t// @ts-expect-error todo\n\t\t\t\t\t\t\t\t// eslint-disable-next-line no-param-reassign\n\t\t\t\t\t\t\t\tval.$objectPath = newObjPath;\n\t\t\t\t\t\t\t\t// @ts-expect-error todo\n\t\t\t\t\t\t\t\tcacheArray.push(val.$id.toString());\n\t\t\t\t\t\t\t} else if (val) {\n\t\t\t\t\t\t\t\tcacheArray.push(val.toString());\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t\t// @ts-expect-error todo\n\t\t\t\t\t\tcache[cacheKey] = { $objectPath: newObjPath, $ids: cacheArray };\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst val = parent[key];\n\t\t\t\t\t\tif (isObject(val)) {\n\t\t\t\t\t\t\t// @ts-expect-error todo\n\t\t\t\t\t\t\tcache[cacheKey] = { $objectPath: newObjPath, $ids: [val.$id.toString()] };\n\n\t\t\t\t\t\t\t// @ts-expect-error todo\n\t\t\t\t\t\t\t// eslint-disable-next-line no-param-reassign\n\t\t\t\t\t\t\tval.$objectPath = newObjPath;\n\t\t\t\t\t\t} else if (val) {\n\t\t\t\t\t\t\tcache[cacheKey] = { $objectPath: newObjPath, $ids: [val.toString()] };\n\t\t\t\t\t\t} else if (val === null) {\n\t\t\t\t\t\t\tcache[cacheKey] = null; //we clarify a null entry, which means it was queried, but found empty (to be pruned)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}),\n\t\t);\n\t};\n\t//@ts-expect-error - todo\n\tcachePaths(preQueryRes || {});\n\n\t/// 5. Fill all nodes with their correct object paths\n\n\tconst fillObjectPaths = (\n\t\tblocks: FilledBQLMutationBlock | FilledBQLMutationBlock[],\n\t): FilledBQLMutationBlock | FilledBQLMutationBlock[] => {\n\t\treturn produce(blocks, (draft) =>\n\t\t\ttraverse(draft, ({ key, value, parent }) => {\n\t\t\t\tif (\n\t\t\t\t\tparent &&\n\t\t\t\t\tkey &&\n\t\t\t\t\t!key.includes('$') &&\n\t\t\t\t\t(Array.isArray(value) || isObject(value)) &&\n\t\t\t\t\t!Array.isArray(parent)\n\t\t\t\t) {\n\t\t\t\t\tif (Array.isArray(parent[key])) {\n\t\t\t\t\t\tparent[key].forEach(\n\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\to: string | { $objectPath: ObjectPath; $parentIsCreate: boolean; [grandChildOfCreateSymbol]: boolean },\n\t\t\t\t\t\t\t) => {\n\t\t\t\t\t\t\t\tif (typeof o !== 'string') {\n\t\t\t\t\t\t\t\t\t// eslint-disable-next-line no-param-reassign\n\t\t\t\t\t\t\t\t\to.$objectPath = getObjectPath(parent, key);\n\t\t\t\t\t\t\t\t\t// eslint-disable-next-line no-param-reassign\n\t\t\t\t\t\t\t\t\to.$parentIsCreate = parent.$op === 'create';\n\t\t\t\t\t\t\t\t\t// eslint-disable-next-line no-param-reassign\n\t\t\t\t\t\t\t\t\to[grandChildOfCreateSymbol] =\n\t\t\t\t\t\t\t\t\t\tparent.$parentIsCreate || parent[Symbol.for('grandChildOfCreate') as any];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if (isObject(parent[key])) {\n\t\t\t\t\t\t//@ts-expect-error - todo\n\t\t\t\t\t\tparent[key].$parentIsCreate = parent.$op === 'create';\n\t\t\t\t\t\t//@ts-expect-error - todo\n\t\t\t\t\t\tparent[key][Symbol.for('grandChildOfCreate')] =\n\t\t\t\t\t\t\tparent.$parentIsCreate || parent[Symbol.for('grandChildOfCreate') as any];\n\t\t\t\t\t\t//@ts-expect-error - todo\n\t\t\t\t\t\tparent[key].$objectPath = getObjectPath(parent, key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}),\n\t\t);\n\t};\n\n\tconst bqlWithObjectPaths = fillObjectPaths(blocks);\n\n\t/// 6. For every node that doesn't have a $id, give it the correct ones based on the pre-query\n\n\tconst fillIds = (blocks: FilledBQLMutationBlock[]) => {\n\t\tconst newBlocks: FilledBQLMutationBlock[] = [];\n\t\tblocks.forEach((block) => {\n\t\t\t// todo: if block has a filter, do a filter search in the cache\n\t\t\tif (!block.$id && !block.id && !block.$tempId) {\n\t\t\t\tif (block.$filter) {\n\t\t\t\t\tconst cacheKey = objectPathToKey({ ...block.$objectPath, key: block.$bzId });\n\t\t\t\t\tconst cacheFound = cache[cacheKey];\n\n\t\t\t\t\tif (cacheFound) {\n\t\t\t\t\t\tconst ids = Array.isArray(cacheFound.$ids) ? cacheFound.$ids : [cacheFound.$ids];\n\t\t\t\t\t\tids.forEach((id) => {\n\t\t\t\t\t\t\tconst newBlock = { ...block, $id: id, $bzId: `T4_${uuidv4()}`, $filterBzId: block.$bzId };\n\t\t\t\t\t\t\tnewBlocks.push(newBlock);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst cacheKey = objectPathToKey(block.$objectPath);\n\t\t\t\t\tconst cacheFound = cache[cacheKey];\n\n\t\t\t\t\tif (cacheFound) {\n\t\t\t\t\t\tcacheFound?.$ids?.forEach((id) => {\n\t\t\t\t\t\t\tconst newBlock = { ...block, $id: id, $bzId: `T4_${uuidv4()}` };\n\t\t\t\t\t\t\tnewBlocks.push(newBlock);\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnewBlocks.push(block);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tnewBlocks.push(block);\n\t\t\t}\n\t\t});\n\n\t\tconst finalBlocks = newBlocks.map((block) => {\n\t\t\tconst newBlock = { ...block };\n\t\t\tgetFieldKeys(newBlock, true).forEach((key) => {\n\t\t\t\tconst subBlocks = Array.isArray(newBlock[key]) ? newBlock[key] : [newBlock[key]];\n\t\t\t\tconst newSubBlocks = fillIds(subBlocks);\n\t\t\t\tnewBlock[key] = newSubBlocks;\n\t\t\t});\n\t\t\treturn newBlock;\n\t\t});\n\t\treturn finalBlocks;\n\t};\n\n\tconst bqlFilledIds = fillIds(Array.isArray(bqlWithObjectPaths) ? bqlWithObjectPaths : [bqlWithObjectPaths]);\n\tconst newFilled = fillObjectPaths(bqlFilledIds);\n\n\t/// 7. For every node that is a multiple (many $ids or $filter), find all combinations that are based on the pre-query\n\n\tconst splitBzIds = (blocks: FilledBQLMutationBlock[]) => {\n\t\tconst processBlocks = (blocks: FilledBQLMutationBlock[]) => {\n\t\t\t// a. Filter operations with multiples and operations without multiples\n\t\t\tconst getOperationsWithMultiples = (opBlocks: FilledBQLMutationBlock[]) => {\n\t\t\t\tconst operationWithMultiples: FilledBQLMutationBlock[] = [];\n\t\t\t\tconst operationWithoutMultiples: FilledBQLMutationBlock[] = [];\n\t\t\t\tconst otherOps: FilledBQLMutationBlock[] = [];\n\n\t\t\t\topBlocks.forEach((opBlock) => {\n\t\t\t\t\tconst keys = getFieldKeys(opBlock, true);\n\n\t\t\t\t\t//keys length > 0 means its not a leaf node\n\t\t\t\t\tif (keys.length > 0) {\n\t\t\t\t\t\tlet hasMultiple = false;\n\t\t\t\t\t\tkeys.forEach((key) => {\n\t\t\t\t\t\t\tconst opBlocks: FilledBQLMutationBlock[] = Array.isArray(opBlock[key]) ? opBlock[key] : [opBlock[key]];\n\n\t\t\t\t\t\t\t// todo: check for $filters\n\t\t\t\t\t\t\tconst blockMultiples: FilledBQLMutationBlock[] = opBlocks.filter(\n\t\t\t\t\t\t\t\t(ob) => !ob.$id && !ob.id && typeof opBlock === 'object',\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (blockMultiples.length) {\n\t\t\t\t\t\t\t\thasMultiple = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif (hasMultiple) {\n\t\t\t\t\t\t\toperationWithMultiples.push(opBlock);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\toperationWithoutMultiples.push(opBlock);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t/// LEAF NODE, no keys so it probably being deleted , unlinked, or linked\n\t\t\t\t\t\tif (opBlock.$id) {\n\t\t\t\t\t\t\t//no need to split if it already has an $id, or an array of ids, we can keep its bzId\n\t\t\t\t\t\t\totherOps.push({ ...opBlock, $bzId: opBlock.$tempId || opBlock.$bzId });\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t//PQ1 is the case where its a multi but does not need to be pruned, so we are not adding the $ids\n\t\t\t\t\t\t\totherOps.push({ ...opBlock, $bzId: opBlock.$tempId || `PQ1_${uuidv4()}` });\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\treturn { operationWithMultiples, operationWithoutMultiples, otherOps };\n\t\t\t};\n\t\t\tconst { operationWithMultiples, operationWithoutMultiples, otherOps } = getOperationsWithMultiples(blocks);\n\t\t\t// b. For multiples get all possible combinations\n\t\t\tconst getAllKeyCombinations = (obj: FilledBQLMutationBlock) => {\n\t\t\t\tconst getDataFields = () => {\n\t\t\t\t\tconst dataFieldObj: any = {};\n\t\t\t\t\tfor (const key in obj) {\n\t\t\t\t\t\tconst currentSchema = getCurrentSchema(schema, obj);\n\t\t\t\t\t\tif (!key.startsWith('$') && currentSchema.dataFields?.find((df) => df.path === key)) {\n\t\t\t\t\t\t\tdataFieldObj[key] = obj[key];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn dataFieldObj;\n\t\t\t\t};\n\t\t\t\tconst dataFieldObj = getDataFields();\n\n\t\t\t\t// Get all keys, but only use non-$ keys for generating combinations\n\t\t\t\tconst allKeys = Object.keys(obj);\n\t\t\t\tconst combinableKeys = getFieldKeys(obj, true);\n\t\t\t\tconst allCombinations: Partial<FilledBQLMutationBlock>[] = [];\n\t\t\t\tconst generateCombinations = (index: number, currentObj: Partial<FilledBQLMutationBlock>) => {\n\t\t\t\t\tif (index === combinableKeys.length) {\n\t\t\t\t\t\t// Construct the full object with the current id\n\t\t\t\t\t\tconst fullObj = { ...currentObj };\n\t\t\t\t\t\tallKeys.forEach((key) => {\n\t\t\t\t\t\t\tif (key.startsWith('$')) {\n\t\t\t\t\t\t\t\tfullObj[key] = obj[key];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t\tallCombinations.push({ ...fullObj, ...dataFieldObj });\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Include the current key\n\t\t\t\t\tconst newObjInclude = {\n\t\t\t\t\t\t...currentObj,\n\t\t\t\t\t\t[combinableKeys[index]]: obj[combinableKeys[index]],\n\t\t\t\t\t\t...getSymbols(currentObj),\n\t\t\t\t\t\t...dataFieldObj,\n\t\t\t\t\t};\n\t\t\t\t\tgenerateCombinations(index + 1, newObjInclude);\n\t\t\t\t\t// Exclude the current key and move to the next\n\t\t\t\t\tgenerateCombinations(index + 1, currentObj);\n\t\t\t\t};\n\t\t\t\tgenerateCombinations(0, { ...getSymbols(obj) });\n\t\t\t\treturn allCombinations;\n\t\t\t};\n\n\t\t\t/// For all multiples we will do know all the combinations, to see if they will fail or not\n\t\t\tconst crossReferencedOperations: Partial<FilledBQLMutationBlock>[] = [];\n\t\t\toperationWithMultiples.forEach((multipleBlock) => {\n\t\t\t\tconst allCombinations: Partial<FilledBQLMutationBlock>[] = getAllKeyCombinations(multipleBlock);\n\t\t\t\tconst combinationsToKeep: Partial<FilledBQLMutationBlock>[] = [];\n\t\t\t\t// c. Check cache and prune combinations that don't have any ids in the cache\n\t\t\t\tallCombinations.forEach((combinationBlock) => {\n\t\t\t\t\tconst keys = getFieldKeys(combinationBlock, true);\n\n\t\t\t\t\t//if its creation, we can just push it, as there will be no false match in DB\n\t\t\t\t\tif (combinationBlock.$op === 'create') {\n\t\t\t\t\t\tcombinationsToKeep.push(combinationBlock);\n\t\t\t\t\t} else if (combinationBlock.$id) {\n\t\t\t\t\t\t// check result for if there exists one with the kinds of keys\n\t\t\t\t\t\tconst cacheKey = objectPathToKey(combinationBlock.$objectPath);\n\t\t\t\t\t\tconst foundKeys: { key: string; ids: string[] }[] = [];\n\t\t\t\t\t\tkeys.forEach((key) => {\n\t\t\t\t\t\t\tconst childKey = `${cacheKey.includes('undefined') ? 'root' : cacheKey}.${combinationBlock.$id}${preQueryPathSeparator}${key}`;\n\t\t\t\t\t\t\tconst cacheFound = cache[childKey];\n\t\t\t\t\t\t\tconst hasRemove =\n\t\t\t\t\t\t\t\tcombinationBlock[key].filter(\n\t\t\t\t\t\t\t\t\t(subBlock: FilledBQLMutationBlock) =>\n\t\t\t\t\t\t\t\t\t\tsubBlock.$op === 'unlink' || subBlock.$op === 'delete' || subBlock.$op === 'update',\n\t\t\t\t\t\t\t\t).length > 0;\n\t\t\t\t\t\t\tif (hasRemove) {\n\t\t\t\t\t\t\t\tif (cacheFound?.$ids) {\n\t\t\t\t\t\t\t\t\tfoundKeys.push({ key, ids: cacheFound.$ids });\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tfoundKeys.push({ key, ids: [''] });\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (foundKeys.length === keys.length && !combinationsToKeep.find((c) => c.$id === combinationBlock.$id)) {\n\t\t\t\t\t\t\tcombinationsToKeep.push(combinationBlock);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// only prune the child batched operation\n\t\t\t\t\t\t\tconst newBlock = { ...combinationBlock, $bzId: combinationBlock.$tempId || `T4_${uuidv4()}` };\n\t\t\t\t\t\t\tkeys.forEach((key) => {\n\t\t\t\t\t\t\t\t// keeping ops that aren't batched (non-multiples)\n\t\t\t\t\t\t\t\tconst newOps = combinationBlock[key].filter((op: FilledBQLMutationBlock) => op.$id);\n\t\t\t\t\t\t\t\tif (newOps.length > 0) {\n\t\t\t\t\t\t\t\t\t// @ts-expect-error todo\n\t\t\t\t\t\t\t\t\tnewBlock[key] = newOps;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t// @ts-expect-error todo\n\t\t\t\t\t\t\t\t\tnewBlock[key] = undefined;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tconst newBlockKeys = getFieldKeys(newBlock, true);\n\t\t\t\t\t\t\tif (newBlockKeys.length > 0) {\n\t\t\t\t\t\t\t\tcombinationsToKeep.push(newBlock);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// When the block is not from the root level\n\t\t\t\t\telse if (combinationBlock.$objectPath) {\n\t\t\t\t\t\tconst parentKey = objectPathToKey(combinationBlock.$objectPath);\n\n\t\t\t\t\t\t// d. get all ids of the parent block\n\t\t\t\t\t\tconst idsOfParent = cache[parentKey]?.$ids || [];\n\t\t\t\t\t\tidsOfParent.forEach((id) => {\n\t\t\t\t\t\t\tconst foundKeys: { key: string; ids: string[] }[] = [];\n\t\t\t\t\t\t\tkeys.forEach((key) => {\n\t\t\t\t\t\t\t\tconst cacheKey = `${parentKey}.${id}${preQueryPathSeparator}${key}`;\n\t\t\t\t\t\t\t\tconst cacheFound = cache[cacheKey];\n\t\t\t\t\t\t\t\tif (cacheFound) {\n\t\t\t\t\t\t\t\t\tfoundKeys.push({ key, ids: cacheFound.$ids });\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t// If this is the combination with no keys, create an opBlock per remaining $id\n\t\t\t\t\t\t\tif (keys.length === 0) {\n\t\t\t\t\t\t\t\tconst remainingIds = idsOfParent.filter((id) => !combinationsToKeep.find((c) => c.$id === id));\n\t\t\t\t\t\t\t\tremainingIds.forEach((id) => {\n\t\t\t\t\t\t\t\t\tcombinationsToKeep.push({\n\t\t\t\t\t\t\t\t\t\t...combinationBlock,\n\t\t\t\t\t\t\t\t\t\t$id: id,\n\t\t\t\t\t\t\t\t\t\t$bzId: combinationBlock.$tempId || `PQT2_${uuidv4()}`,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t} else if (foundKeys.length === keys.length && !combinationsToKeep.find((c) => c.$id === id)) {\n\t\t\t\t\t\t\t\tkeys.forEach((k) => {\n\t\t\t\t\t\t\t\t\tconst cKey = `${objectPathToKey(combinationBlock.$objectPath)}.${id}${preQueryPathSeparator}${k}`;\n\t\t\t\t\t\t\t\t\tconst $ids = cache[cKey]?.$ids || [];\n\t\t\t\t\t\t\t\t\t/// making sure other ops are included as well, replace the old batched op with these new ops\n\t\t\t\t\t\t\t\t\tconst originalOp = combinationBlock[k].find((b: FilledBQLMutationBlock) => !b.$id);\n\t\t\t\t\t\t\t\t\tconst newBlocks = [\n\t\t\t\t\t\t\t\t\t\t...$ids.map((id) => {\n\t\t\t\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t\t\t\t...originalOp,\n\t\t\t\t\t\t\t\t\t\t\t\t$id: id,\n\t\t\t\t\t\t\t\t\t\t\t\t$objectPath: {\n\t\t\t\t\t\t\t\t\t\t\t\t\tbeforePath: combinationBlock.$objectPath.beforePath,\n\t\t\t\t\t\t\t\t\t\t\t\t\tids: id,\n\t\t\t\t\t\t\t\t\t\t\t\t\tkey: k,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t...combinationBlock[k].filter((b: FilledBQLMutationBlock) => b.$id),\n\t\t\t\t\t\t\t\t\t];\n\t\t\t\t\t\t\t\t\tif (newBlocks.length > 0) {\n\t\t\t\t\t\t\t\t\t\tcombinationBlock[k] = newBlocks;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tcombinationsToKeep.push({\n\t\t\t\t\t\t\t\t\t...combinationBlock,\n\t\t\t\t\t\t\t\t\t$id: id,\n\t\t\t\t\t\t\t\t\t$bzId: combinationBlock.$tempId || `PQ3_${uuidv4()}`,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcombinationsToKeep.push(combinationBlock);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tcombinationsToKeep.forEach((c) => {\n\t\t\t\t\tcrossReferencedOperations.push(c);\n\t\t\t\t});\n\t\t\t});\n\t\t\t//console.log('crossReferencedOperations', crossReferencedOperations);\n\n\t\t\t// filter out odd leftover cases\n\t\t\tconst allOperations = [...crossReferencedOperations, ...operationWithoutMultiples, ...otherOps];\n\t\t\tconst filteredOperations = allOperations.filter((b) => {\n\t\t\t\tconst hasKeys = getFieldKeys(b).length > 0;\n\t\t\t\tif (hasKeys) {\n\t\t\t\t\treturn true;\n\t\t\t\t} else {\n\t\t\t\t\tif (b.$op === 'update') {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// e. Recursion\n\t\t\tconst finalBlocks = filteredOperations.map((block) => {\n\t\t\t\tconst newBlock = { ...block };\n\t\t\t\tgetFieldKeys(newBlock, true).forEach((key) => {\n\t\t\t\t\tconst subBlocks = Array.isArray(newBlock[key]) ? newBlock[key] : [newBlock[key]];\n\t\t\t\t\tconst newSubBlocks = processBlocks(subBlocks);\n\t\t\t\t\tnewBlock[key] = newSubBlocks;\n\t\t\t\t});\n\t\t\t\treturn newBlock;\n\t\t\t});\n\n\t\t\treturn finalBlocks;\n\t\t};\n\t\treturn processBlocks(blocks);\n\t};\n\n\tconst splitBql = splitBzIds(Array.isArray(newFilled) ? newFilled : [newFilled]);\n\t//console.log('_____3splitBql', JSON.stringify(splitBql, null, 2));\n\n\t/// 8. For each replace, make sure you prune existing ids from pre-query that want to be kept, and add deletes for all other ids\n\n\tconst processReplaces = (blocks: FilledBQLMutationBlock[]) => {\n\t\treturn blocks.map((block) => {\n\t\t\tconst fields = getFieldKeys(block, true);\n\t\t\tconst newBlock = { ...block };\n\n\t\t\tfields.forEach((field) => {\n\t\t\t\tconst opBlocks: FilledBQLMutationBlock[] = Array.isArray(block[field]) ? block[field] : [block[field]];\n\t\t\t\tconst newOpBlocks: FilledBQLMutationBlock[] = [];\n\t\t\t\tlet replaceIds: string[] = [];\n\t\t\t\tlet createIds: string[] = [];\n\n\t\t\t\t// todo: Step 1, get all replaces and their ids as replaceIds, just push blocks that aren't replaces\n\t\t\t\t// @ts-expect-error todo\n\t\t\t\tlet replaceBlock: FilledBQLMutationBlock = {};\n\t\t\t\tconst cardinality = getCardinality(schema, block, field);\n\n\t\t\t\topBlocks\n\t\t\t\t\t.filter((opBlock) => opBlock)\n\t\t\t\t\t.forEach((opBlock) => {\n\t\t\t\t\t\t// todo: if it is create and this field is cardinality one\n\t\t\t\t\t\tif (opBlock.$op === 'replace' && opBlock.$id) {\n\t\t\t\t\t\t\t// eslint-disable-next-line prefer-destructuring\n\t\t\t\t\t\t\treplaceBlock = opBlock;\n\t\t\t\t\t\t\tif (Array.isArray(opBlock.$id)) {\n\t\t\t\t\t\t\t\treplaceIds = [...replaceIds, ...opBlock.$id];\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\treplaceIds.push(opBlock.$id);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (opBlock.$op === 'create' && cardinality === 'ONE' && opBlock.id) {\n\t\t\t\t\t\t\treplaceBlock = opBlock;\n\t\t\t\t\t\t\tif (Array.isArray(opBlock.id)) {\n\t\t\t\t\t\t\t\tcreateIds = [...replaceIds, ...opBlock.id];\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcreateIds.push(opBlock.id);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tnewOpBlocks.push(opBlock);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\tconst cacheKey = objectPathToKey(replaceBlock.$objectPath);\n\t\t\t\tconst cacheKeys = convertManyPaths(cacheKey);\n\t\t\t\tconst foundKeys = cacheKeys.map((cacheKey) => {\n\t\t\t\t\treturn cache[cacheKey];\n\t\t\t\t});\n\n\t\t\t\t// todo: Step 2, get cacheIds for this\n\t\t\t\tlet cacheIds: string[] = [];\n\t\t\t\tfoundKeys\n\t\t\t\t\t.filter((k) => k !== null && k !== undefined)\n\t\t\t\t\t.forEach((key) => {\n\t\t\t\t\t\tcacheIds = [...cacheIds, ...(key?.$ids || [])];\n\t\t\t\t\t});\n\n\t\t\t\t// todo: Step 3, unlinkIds contain all cacheIds that aren't found in replaceIds\n\t\t\t\t// todo: Step 4, linkIds are all replaceIds that aren't found in the cacheIds\n\t\t\t\tconst unlinkIds = cacheIds.filter((id) => !replaceIds.includes(id));\n\t\t\t\tconst linkIds = replaceIds.filter((id) => !cacheIds.includes(id));\n\t\t\t\tconst symbols = getSymbols(replaceBlock);\n\t\t\t\tif (unlinkIds.length > 0) {\n\t\t\t\t\tnewOpBlocks.push({\n\t\t\t\t\t\t...replaceBlock,\n\t\t\t\t\t\t$op: 'unlink',\n\t\t\t\t\t\t$id: unlinkIds,\n\t\t\t\t\t\t$bzId: replaceBlock.$tempId || `T4_${uuidv4()}`,\n\t\t\t\t\t\tid: undefined,\n\t\t\t\t\t\t...symbols,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (linkIds.length > 0) {\n\t\t\t\t\tlinkIds.forEach((id) => {\n\t\t\t\t\t\tnewOpBlocks.push({\n\t\t\t\t\t\t\t...replaceBlock,\n\t\t\t\t\t\t\t$op: 'link',\n\t\t\t\t\t\t\t$id: id,\n\t\t\t\t\t\t\t$bzId: replaceBlock.$tempId || `T5_${uuidv4()}`,\n\t\t\t\t\t\t\t...symbols,\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (createIds.length > 0) {\n\t\t\t\t\tcreateIds.forEach((id) => {\n\t\t\t\t\t\tnewOpBlocks.push({\n\t\t\t\t\t\t\t...replaceBlock,\n\t\t\t\t\t\t\t$op: 'create',\n\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t$bzId: replaceBlock.$tempId || `T6_${uuidv4()}`,\n\t\t\t\t\t\t\t...symbols,\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tnewBlock[field] = processReplaces(newOpBlocks);\n\t\t\t});\n\t\t\treturn newBlock;\n\t\t});\n\t};\n\n\t// @ts-expect-error todo\n\tconst processedReplaces = fillObjectPaths(processReplaces(fillObjectPaths(splitBql)));\n\n\t/// 9. Throw any error case\n\n\tconst throwErrors = (\n\t\tblocks: FilledBQLMutationBlock | FilledBQLMutationBlock[],\n\t): FilledBQLMutationBlock | FilledBQLMutationBlock[] => {\n\t\treturn produce(blocks, (draft) =>\n\t\t\ttraverse(draft, (context) => {\n\t\t\t\tconst { key, value, parent, meta } = context;\n\n\t\t\t\t// a. only work for role fields that are arrays or objects\n\t\t\t\tif (\n\t\t\t\t\tkey &&\n\t\t\t\t\tparent &&\n\t\t\t\t\t!key?.includes('$') &&\n\t\t\t\t\tkey !== '$filter' &&\n\t\t\t\t\t!meta.nodePath?.includes('.$filter.') && //ignore children of $filter\n\t\t\t\t\t(Array.isArray(value) || isObject(value)) &&\n\t\t\t\t\t!Array.isArray(parent)\n\t\t\t\t) {\n\t\t\t\t\tconst values: FilledBQLMutationBlock[] = Array.isArray(value) ? value : [value];\n\n\t\t\t\t\tvalues.forEach((thing) => {\n\t\t\t\t\t\t// todo: If user op is trying to link something that already has it's role filled by something else\n\n\t\t\t\t\t\tconst $objectPath = thing.$filter ? { ...thing.$objectPath, key: thing.$filterBzId } : thing.$objectPath;\n\t\t\t\t\t\tconst cacheKey = objectPathToKey($objectPath);\n\t\t\t\t\t\tconst cacheFound = cache[cacheKey];\n\n\t\t\t\t\t\tconst processArrayIdsFound = (arrayOfIds: string[], cacheOfIds: string[]) => {\n\t\t\t\t\t\t\treturn arrayOfIds.every((id) => cacheOfIds.includes(id));\n\t\t\t\t\t\t};\n\t\t\t\t\t\t// todo: if filter, use bzId\n\t\t\t\t\t\tconst isOccupied = thing.$id\n\t\t\t\t\t\t\t? Array.isArray(thing.$id)\n\t\t\t\t\t\t\t\t? processArrayIdsFound(thing.$id, cacheFound && cacheFound.$ids ? cacheFound.$ids : [])\n\t\t\t\t\t\t\t\t: cacheFound?.$ids?.includes(thing.$id)\n\t\t\t\t\t\t\t: cacheFound;\n\t\t\t\t\t\tconst cardinality = getCardinality(schema, parent, thing.$objectPath.key);\n\n\t\t\t\t\t\tif (thing.$op === 'link' && isOccupied && cardinality === 'ONE') {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`[BQLE-Q-M-2] Cannot link on:\"${objectPathToKey(thing.$objectPath)}\" because it is already occupied.`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (thing.$op) {\n\t\t\t\t\t\t\tswitch (thing.$op) {\n\t\t\t\t\t\t\t\tcase 'delete':\n\t\t\t\t\t\t\t\t\tif (!isOccupied) {\n\t\t\t\t\t\t\t\t\t\tif (!config.mutation?.ignoreNonexistingThings) {\n\t\t\t\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t\t\t\t`[BQLE-Q-M-2] Cannot delete $id:\"${thing.$id}\" because it is not linked to $id:\"${parent.$id}\"`,\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t// todo: prune\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase 'update':\n\t\t\t\t\t\t\t\t\tif (!isOccupied) {\n\t\t\t\t\t\t\t\t\t\tif (!config.mutation?.ignoreNonexistingThings) {\n\t\t\t\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t\t\t\t`[BQLE-Q-M-2] Cannot update $id:\"${thing.$id}\" because it is not linked to $id:\"${parent.$id}\"`,\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase 'unlink':\n\t\t\t\t\t\t\t\t\tif (!isOccupied) {\n\t\t\t\t\t\t\t\t\t\tif (!config.mutation?.ignoreNonexistingThings) {\n\t\t\t\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t\t\t\t`[BQLE-Q-M-2] Cannot unlink $id:\"${thing.$id}\" because it is not linked to $id:\"${parent.$id}\"`,\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase 'link':\n\t\t\t\t\t\t\t\t\tif (isOccupied) {\n\t\t\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t\t\t`[BQLE-Q-M-2] Cannot link $id:\"${thing.$id}\" because it is already linked to $id:\"${parent.$id}\"`,\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}),\n\t\t);\n\t};\n\n\tthrowErrors(processedReplaces);\n\n\t/// 10. Refill paths that are needed for the rest of the pipeline\n\n\tconst fillPaths = (\n\t\tblocks: FilledBQLMutationBlock | FilledBQLMutationBlock[],\n\t): FilledBQLMutationBlock | FilledBQLMutationBlock[] => {\n\t\treturn produce(blocks, (draft) =>\n\t\t\ttraverse(draft, (context) => {\n\t\t\t\tconst { value, meta } = context;\n\t\t\t\tif (isObject(value)) {\n\t\t\t\t\t// @ts-expect-error todo\n\t\t\t\t\tvalue[Symbol.for('path') as any] = meta.nodePath;\n\t\t\t\t\t// @ts-expect-error todo\n\t\t\t\t\tdelete value.$objectPath;\n\t\t\t\t\t// @ts-expect-error todo\n\t\t\t\t\tdelete value.$parentIsCreate;\n\t\t\t\t}\n\t\t\t}),\n\t\t);\n\t};\n\n\t/// 11. Sort tree\n\n\tconst filledPaths = fillPaths(processedReplaces);\n\tconst filledPathsArray = Array.isArray(filledPaths) ? filledPaths : [filledPaths];\n\tconst copy = [...filledPathsArray];\n\tconst sortedArray = copy.sort((a: FilledBQLMutationBlock, b: FilledBQLMutationBlock) => {\n\t\tif (a.$op === 'create' && b.$op !== 'create') {\n\t\t\treturn -1; // Move 'a' to an index lower than 'b' (to the top of the array)\n\t\t} else if (a.$op !== 'create' && b.$op === 'create') {\n\t\t\treturn 1; // Move 'b' to an index lower than 'a'\n\t\t}\n\t\treturn 0; // Keep the original order if both have the same $op value or don't involve 'create'\n\t});\n\n\treturn sortedArray;\n};\n\nconst extractValueFromFilter = (filterValue: any): any => {\n\tif (isObject(filterValue) && !isArray(filterValue)) {\n\t\tif ('$eq' in filterValue) {\n\t\t\treturn filterValue['$eq'];\n\t\t}\n\t\t// Handle other operators if needed\n\t}\n\treturn filterValue;\n};\n","import { getSchemaByThing } from '../../../helpers';\nimport type {\n\tBQLMutationBlock,\n\tEnrichedBQLMutationBlock,\n\tEnrichedBormEntity,\n\tEnrichedBormRelation,\n\tEnrichedBormSchema,\n} from '../../../types';\nimport { produce } from 'immer';\n\n/**\n * Convert JSON attributes into strings.\n */\nexport const stringify = (\n\tblocks: BQLMutationBlock | BQLMutationBlock[],\n\tschema: EnrichedBormSchema,\n): EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[] => {\n\tconst result = produce(blocks, (draft) => tObject(schema, draft));\n\treturn result as EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[];\n};\n\n/**\n * Specify $thing if the role (target: relation) or the opposite role (target: role)\n * is played by one thing, otherwise $thing, $relation, or $entity must be defined\n * in the mutation object.\n */\nconst tObject = (\n\tschema: EnrichedBormSchema,\n\ttree: Record<string, any> | string | (Record<string, any> | string)[],\n\t$thing?: string,\n) => {\n\tif (typeof tree === 'string') {\n\t\t// It's an id.\n\t\treturn;\n\t}\n\tif (Array.isArray(tree)) {\n\t\ttree.forEach((i) => tObject(schema, i, $thing));\n\t\treturn;\n\t}\n\tconst thing = getSchemaByThing(schema, $thing || tree.$entity || tree.$relation || tree.$thing);\n\tObject.entries(tree).forEach(([k]) => {\n\t\tif (k.startsWith('$') || k.startsWith('%')) {\n\t\t\treturn;\n\t\t}\n\t\ttField(schema, tree, k, thing);\n\t});\n};\n\nconst tField = (\n\tschema: EnrichedBormSchema,\n\ttree: Record<string, any>,\n\tkey: string,\n\tthing: EnrichedBormEntity | EnrichedBormRelation,\n) => {\n\tconst value = tree[key];\n\tif (!value) {\n\t\t// Not a JSON or a thing.\n\t\treturn;\n\t}\n\tconst dataField = thing.dataFields?.find((f) => f.path === key);\n\tif (dataField) {\n\t\tif (dataField.contentType === 'JSON') {\n\t\t\tif (value !== null && value !== undefined) {\n\t\t\t\t// eslint-disable-next-line no-param-reassign\n\t\t\t\ttree[key] = JSON.stringify(value);\n\t\t\t}\n\t\t}\n\t\treturn;\n\t}\n\tconst linkField = thing.linkFields?.find((f) => f.path === key);\n\tif (linkField) {\n\t\tconst $thing = linkField.oppositeLinkFieldsPlayedBy[0]?.thing;\n\t\ttObject(schema, value, $thing);\n\t\treturn;\n\t}\n\tif (thing.thingType === 'relation') {\n\t\tconst role = thing.roles[key];\n\t\t// Assume a role can be played by only one thing.\n\t\tif (!role) {\n\t\t\tthrow new Error(`[Schema] Role ${key} in ${thing.name} is not defined`);\n\t\t}\n\t\tconst [oppositeThing] = role.playedBy || [];\n\t\tif (!oppositeThing) {\n\t\t\tthrow new Error(`Role ${role.path} in ${thing} is not played by anything`);\n\t\t}\n\t\ttObject(schema, value, oppositeThing.thing);\n\t}\n};\n","import { isObject } from 'radash';\nimport type {\n\tBQLResponse,\n\tBormConfig,\n\tDBHandles,\n\tEnrichedBQLMutationBlock,\n\tEnrichedBormEntity,\n\tEnrichedBormRelation,\n\tEnrichedBormSchema,\n\tEnrichedDataField,\n\tEnrichedLinkField,\n\tEnrichedRoleField,\n\tFilledBQLMutationBlock,\n} from '../../../../types';\nimport { DBNode } from '../../../../types/symbols';\nimport { runQueryMachine } from '../../../query/queryMachine';\nimport { getSchemaByThing } from '../../../../helpers';\n\nexport const preHookDependencies = async (\n\tblocks: EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[],\n\tschema: EnrichedBormSchema,\n\tconfig: BormConfig,\n\tdbHandles: DBHandles,\n) => {\n\tconst mutations = Array.isArray(blocks) ? blocks : [blocks];\n\tconst transformationPreQueryReq = mutations.map((m) => mutationToQuery(m, true));\n\tconst res = await runQueryMachine(\n\t\t// @ts-expect-error todo\n\t\ttransformationPreQueryReq,\n\t\tschema,\n\t\tconfig,\n\t\tdbHandles,\n\t);\n\tconst transformationPreQueryRes = res.bql.res as BQLResponse[];\n\treturn mutations.map((mut, i) => {\n\t\tconst thing = getSchemaByThing(schema, mut.$thing);\n\t\treturn setDbNode({\n\t\t\tmut: mut as Mutation,\n\t\t\tnode: transformationPreQueryRes[i] as DbValue,\n\t\t\tschema,\n\t\t\tthing,\n\t\t});\n\t});\n};\n\nconst FORBIDDEN_ROOT_QUERY_PROP = new Set(['$op', '$bzId', '$parentKey']);\nconst FORBIDDEN_SUB_QUERY_PROP = new Set(['$relation', '$entity', '$id', ...FORBIDDEN_ROOT_QUERY_PROP]);\n\ntype FieldQuery = string | { $path: string; $fields?: FieldQuery[] };\n\nconst mutationToQuery = (block: FilledBQLMutationBlock, root: boolean) => {\n\tconst $fields: Record<string, FieldQuery> = {};\n\tblock.$fields?.forEach((f: any) => {\n\t\tif (typeof f === 'string') {\n\t\t\t$fields[f] = f;\n\t\t} else {\n\t\t\t$fields[f.$path] = f;\n\t\t}\n\t});\n\tconst filteredBlock: { $fields?: FieldQuery[]; [k: `$${string}`]: any } = {};\n\n\tfor (const k in block) {\n\t\tif (FORBIDDEN_ROOT_QUERY_PROP.has(k)) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (FORBIDDEN_SUB_QUERY_PROP.has(k) && !root) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst v = block[k];\n\t\tif (k.startsWith('$')) {\n\t\t\tfilteredBlock[k as `$${string}`] = v;\n\t\t} else if (Array.isArray(v)) {\n\t\t\t// NOTE: If a link/role field mutation is an array, we only look at the first mutation block.\n\t\t\t// Each mutation block may have totally different structures.\n\t\t\tif (v[0] && typeof v[0] === 'object') {\n\t\t\t\t$fields[k] = {\n\t\t\t\t\t$path: k,\n\t\t\t\t\t...mutationToQuery(v[0], false),\n\t\t\t\t};\n\t\t\t}\n\t\t} else if (isObject(v)) {\n\t\t\t$fields[k] = {\n\t\t\t\t$path: k,\n\t\t\t\t...mutationToQuery(v as any, false),\n\t\t\t};\n\t\t}\n\t}\n\n\tfilteredBlock.$fields = Object.values($fields);\n\n\treturn filteredBlock;\n};\n\ntype Mutation = {\n\t$id: string;\n\t$fields?: FieldQuery[];\n} & {\n\t[k: string]: string | number | null | Mutation | Mutation[];\n};\n\ntype MutationWithDBNode = {\n\t$id: string;\n\t[DBNode]?: DbNode;\n\t[k: string]: string | number | null | MutationWithDBNode | MutationWithDBNode[];\n};\n\nconst setDbNode = (props: {\n\tmut: Mutation | Mutation[];\n\tnode: DbValue | DbValue[];\n\tschema: EnrichedBormSchema;\n\tthing: EnrichedBormEntity | EnrichedBormRelation;\n}) => {\n\tconst { mut, node, schema, thing } = props;\n\tconst fieldMap = getFieldMap(thing);\n\tconst subNodeMap = getNodeMap(node);\n\tif (Array.isArray(mut)) {\n\t\treturn mut.map((subMut) => {\n\t\t\tconst subNode = subNodeMap[subMut.$id];\n\t\t\tif (!subNode) {\n\t\t\t\treturn subMut;\n\t\t\t}\n\t\t\treturn setDbNodeSingle({\n\t\t\t\tmut: subMut,\n\t\t\t\tnode: subNode,\n\t\t\t\tschema,\n\t\t\t\tthing,\n\t\t\t\t...fieldMap,\n\t\t\t});\n\t\t});\n\t}\n\tconst subNode = subNodeMap[mut.$id];\n\treturn setDbNodeSingle({\n\t\tmut,\n\t\tnode: subNode,\n\t\tschema,\n\t\tthing,\n\t\t...fieldMap,\n\t});\n};\n\nconst setDbNodeSingle = (props: {\n\tmut: Mutation;\n\tnode?: DbNode;\n\tschema: EnrichedBormSchema;\n\tthing: EnrichedBormEntity | EnrichedBormRelation;\n\tdataFieldMap: Record<string, EnrichedDataField>;\n\tlinkFieldMap: Record<string, EnrichedLinkField>;\n\troleFieldMap: Record<string, EnrichedRoleField>;\n}) => {\n\tconst { mut, node, schema, thing, dataFieldMap, linkFieldMap, roleFieldMap } = props;\n\tconst { $fields: _, ..._mut } = mut;\n\tif (!node) {\n\t\treturn _mut;\n\t}\n\tconst dbNode = getDbNode({\n\t\t$fields: mut.$fields,\n\t\tnode,\n\t\tschema,\n\t\tthing,\n\t\tdataFieldMap,\n\t\tlinkFieldMap,\n\t\troleFieldMap,\n\t});\n\tconst newMut: MutationWithDBNode = { ..._mut, [DBNode]: dbNode };\n\n\t// Update sub-mutation that has pre-queried db node.\n\tfor (const key in mut) {\n\t\tif (key.startsWith('$')) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst value = mut[key];\n\t\tconst df = dataFieldMap[key];\n\t\tif (df || !value || typeof value !== 'object') {\n\t\t\tnewMut[key] = value;\n\t\t\tcontinue;\n\t\t}\n\t\tconst $thing = linkFieldMap[key]?.oppositeLinkFieldsPlayedBy?.[0]?.thing || roleFieldMap[key]?.playedBy?.[0]?.thing;\n\t\tif (!$thing) {\n\t\t\tthrow new Error(`\"${thing.name}\" does not have field \"${key}\"`);\n\t\t}\n\t\tconst subThing = getSchemaByThing(schema, $thing);\n\t\tnewMut[key] = setDbNode({\n\t\t\tmut: value,\n\t\t\tschema,\n\t\t\tnode: node[key],\n\t\t\tthing: subThing,\n\t\t});\n\t}\n\n\treturn newMut;\n};\n\ntype DbValue = string | number | boolean | null | DbNode;\n\ntype DbNode = {\n\t$id: string;\n\t[k: string]: DbValue | DbValue[];\n};\n\n/**\n * Extract the response of field queries from a superset query response.\n */\nconst getDbNode = (props: {\n\t$fields?: FieldQuery[];\n\tnode: DbNode;\n\tschema: EnrichedBormSchema;\n\tthing: EnrichedBormEntity | EnrichedBormRelation;\n\tdataFieldMap: Record<string, EnrichedDataField>;\n\tlinkFieldMap: Record<string, EnrichedLinkField>;\n\troleFieldMap: Record<string, EnrichedRoleField>;\n}) => {\n\tconst { $fields, node, schema, thing, dataFieldMap, linkFieldMap, roleFieldMap } = props;\n\tconst fields = $fields ? $fields : getAllFields(thing);\n\tconst newNode: DbNode = { $id: node.$id };\n\n\tfields.forEach((f) => {\n\t\tconst isObj = typeof f !== 'string';\n\t\tconst key = isObj ? f.$path : f;\n\t\tconst value = node[key];\n\t\tconst df = dataFieldMap[key];\n\t\tif (df) {\n\t\t\tnewNode[key] = value;\n\t\t\treturn;\n\t\t}\n\t\tconst $thing = linkFieldMap[key]?.oppositeLinkFieldsPlayedBy?.[0]?.thing || roleFieldMap[key]?.playedBy?.[0]?.thing;\n\t\tif (!$thing) {\n\t\t\tthrow new Error(`\"${thing.name}\" does not have field \"${key}\"`);\n\t\t}\n\t\tif (!isObj) {\n\t\t\tif (value) {\n\t\t\t\tnewNode[key] = Array.isArray(value) ? value.map(getIdFromDbValue) : getIdFromDbValue(value);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tconst subThing = getSchemaByThing(schema, $thing);\n\t\tconst fieldMap = getFieldMap(subThing);\n\t\tnewNode[key] = Array.isArray(value)\n\t\t\t? value.map((v) => getDbNodeFromDbValue({ ...fieldMap, $fields: f.$fields, value: v, schema, thing: subThing }))\n\t\t\t: getDbNodeFromDbValue({ ...fieldMap, $fields: f.$fields, value, schema, thing: subThing });\n\t});\n\n\treturn newNode;\n};\n\n/**\n * Get data field, link field, and role paths of a thing.\n */\nconst getAllFields = (thing: EnrichedBormEntity | EnrichedBormRelation): string[] => {\n\tconst fields: string[] = [];\n\tthing.dataFields?.forEach((f) => {\n\t\tfields.push(f.path);\n\t});\n\tthing.linkFields?.forEach((f) => {\n\t\tfields.push(f.path);\n\t});\n\tif (thing.thingType === 'relation') {\n\t\tfields.push(...Object.keys(thing.roles));\n\t}\n\treturn fields;\n};\n\n/**\n * Throw an error if it's not an id(s) and doesn't contain prop $id.\n */\nconst getIdFromDbValue = (value: DbValue) => {\n\tif (typeof value === 'string') {\n\t\treturn value;\n\t}\n\tif (!value || typeof value !== 'object') {\n\t\tthrow new Error(`\"${JSON.stringify(value)}\" is neither an id nor an object with prop \"$id\"`);\n\t}\n\tif (typeof value.$id !== 'string') {\n\t\tthrow new Error(`\"${JSON.stringify(value)}\" is does not have prop \"$id\"`);\n\t}\n\treturn value.$id;\n};\n\n/**\n * Throw an error if it's not a db node.\n */\nconst getDbNodeFromDbValue = (props: {\n\t$fields?: FieldQuery[];\n\tvalue: DbValue;\n\tschema: EnrichedBormSchema;\n\tthing: EnrichedBormEntity | EnrichedBormRelation;\n\tdataFieldMap: Record<string, EnrichedDataField>;\n\tlinkFieldMap: Record<string, EnrichedLinkField>;\n\troleFieldMap: Record<string, EnrichedRoleField>;\n}) => {\n\tconst { value } = props;\n\tif (!value || typeof value !== 'object' || !value.$id) {\n\t\tthrow new Error(`\"${JSON.stringify(props)}\" is neither an id nor an object with prop \"$id\"`);\n\t}\n\treturn getDbNode({ ...props, node: value });\n};\n\nconst getFieldMap = (thing: EnrichedBormEntity | EnrichedBormRelation) => {\n\tconst dataFieldMap = Object.fromEntries(thing.dataFields?.map((f) => [f.path, f]) || []);\n\tconst linkFieldMap = Object.fromEntries(thing.linkFields?.map((f) => [f.path, f]) || []);\n\tconst roleFieldMap = thing.thingType === 'relation' ? thing.roles || {} : {};\n\treturn { dataFieldMap, linkFieldMap, roleFieldMap };\n};\n\n/**\n * Non-DbNode(s) are ignored.\n */\nconst getNodeMap = (value: DbValue | DbValue[]) => {\n\tif (!Array.isArray(value)) {\n\t\tif (value && typeof value === 'object' && value.$id) {\n\t\t\treturn { [value.$id]: value };\n\t\t}\n\t\treturn {};\n\t}\n\n\tconst map: Record<string, DbNode> = {};\n\n\tvalue.forEach((v) => {\n\t\tif (!v || typeof v !== 'object' || !v.$id) {\n\t\t\treturn;\n\t\t}\n\t\tmap[v.$id] = v;\n\t});\n\n\treturn map;\n};\n","import { isDate } from 'radash';\n\nexport const parseFlexValTypeDB = (v: unknown) => {\n\tif (isDate(v)) {\n\t\treturn { type: 'datetime', value: v.toISOString().replace('Z', '') };\n\t}\n\tif (typeof v === 'string') {\n\t\treturn { type: 'string', value: `\"${v}\"` };\n\t}\n\tif (typeof v === 'number') {\n\t\tif (v % 1 !== 0) {\n\t\t\treturn { type: 'double', value: v };\n\t\t}\n\t\treturn { type: 'long', value: v };\n\t}\n\tif (typeof v === 'boolean') {\n\t\treturn { type: 'boolean', value: v };\n\t}\n\tthrow new Error(`Unsupported type ${typeof v}`);\n};\n","import { isArray, listify, mapEntries, shake } from 'radash';\n\nimport { genId, getCurrentSchema, isBQLBlock } from '../../../helpers';\nimport type { EnrichedBormSchema, EnrichedBQLMutationBlock } from '../../../types';\nimport { EdgeType } from '../../../types/symbols';\nimport { parseFlexValTypeDB } from '../../../adapters/typeDB/parseFlexVal';\n\nexport const buildTQLMutation = async (things: any[], edges: any[], schema: EnrichedBormSchema) => {\n\tif ((!things && !edges) || (!things.length && !edges.length)) {\n\t\tthrow new Error('TQL request error, no things');\n\t}\n\n\tif (!schema) {\n\t\tthrow new Error('No schema provided');\n\t}\n\n\t// todo: Split attributes and edges\n\tconst nodeToTypeQL = (\n\t\tnode: EnrichedBQLMutationBlock,\n\t): {\n\t\tpreDeletionBatch?: any[];\n\t\tdeletionMatch?: string;\n\t\tinsertionMatch?: string;\n\t\tdeletion?: string;\n\t\tinsertion?: string;\n\t\top: string;\n\t} => {\n\t\tconst op = node.$op as string;\n\t\tconst bzId = `$${node.$bzId}`;\n\t\tconst currentSchema = getCurrentSchema(schema, node);\n\t\tconst { idFields, defaultDBConnector } = currentSchema;\n\n\t\tconst thingDbPath = defaultDBConnector?.path || node.$thing;\n\n\t\tconst idValue = node.$id;\n\n\t\t// todo: composite ids\n\t\tconst idField = idFields?.[0];\n\n\t\t//@ts-expect-error - TODO\n\t\tconst attributes = listify(node, (k, v) => {\n\t\t\t// @ts-expect-error - TODO description\n\t\t\tif (k.startsWith('$') || k.startsWith('%') || k === idField || v === undefined || v === null) {\n\t\t\t\treturn '';\n\t\t\t}\n\t\t\t// if (k.startsWith('$') || !v) return '';\n\t\t\tconst currentDataField = currentSchema.dataFields?.find((x) => x.path === k);\n\t\t\tconst fieldDbPath = currentDataField?.path;\n\n\t\t\tif (!fieldDbPath) {\n\t\t\t\t// throw new Error('noFieldDbPath');\n\t\t\t\treturn '';\n\t\t\t}\n\t\t\tconst dbField = currentDataField.dbPath;\n\n\t\t\tif (['TEXT', 'ID', 'EMAIL', 'JSON'].includes(currentDataField.contentType)) {\n\t\t\t\treturn `has ${dbField} '${v}'`;\n\t\t\t}\n\t\t\tif (['NUMBER', 'BOOLEAN'].includes(currentDataField.contentType)) {\n\t\t\t\treturn `has ${dbField} ${v}`;\n\t\t\t}\n\t\t\tif (currentDataField.contentType === 'DATE') {\n\t\t\t\tif (Number.isNaN(v.valueOf())) {\n\t\t\t\t\tthrow new Error('Invalid format, Nan Date');\n\t\t\t\t}\n\t\t\t\tif (v instanceof Date) {\n\t\t\t\t\treturn `has ${dbField} ${v.toISOString().replace('Z', '')}`;\n\t\t\t\t}\n\t\t\t\treturn `has ${dbField} ${new Date(v).toISOString().replace('Z', '')}`;\n\t\t\t}\n\t\t\tif (currentDataField.contentType === 'FLEX') {\n\t\t\t\t//ex: $color isa Color, has id 'testi', has Color·freeForAll $tempId; $tempId \"number\" isa Color·freeForAll, has longVal 7;\n\t\t\t\tconst tempId = `bza${genId()}`;\n\n\t\t\t\tconst parsedVal = isArray(v) ? v.map((v) => parseFlexValTypeDB(v)) : parseFlexValTypeDB(v);\n\t\t\t\tif (Array.isArray(parsedVal)) {\n\t\t\t\t\tthrow new Error('Array in FLEX fields not supported yet');\n\t\t\t\t}\n\t\t\t\treturn `has ${dbField} $${tempId}; $${tempId} '${tempId}' isa ${dbField}, has ${parsedVal.type}Attribute ${parsedVal.value}`;\n\t\t\t}\n\t\t\tthrow new Error(`Unsupported contentType ${currentDataField.contentType}`);\n\t\t}).filter((x) => x);\n\n\t\tconst attributesVar = `${bzId}-atts`;\n\n\t\t//@ts-expect-error - TODO\n\t\tconst matchAttributes = listify(node, (k) => {\n\t\t\t// @ts-expect-error - TODO description\n\t\t\tif (k.startsWith('$') || k.startsWith('%') || k === idField) {\n\t\t\t\treturn '';\n\t\t\t}\n\t\t\t// if (k.startsWith('$') || !v) return '';\n\t\t\tconst currentDataField = currentSchema.dataFields?.find((x) => x.path === k);\n\t\t\tconst fieldDbPath = currentDataField?.path;\n\n\t\t\tif (!fieldDbPath) {\n\t\t\t\t// throw new Error('noFieldDbPath');\n\t\t\t\treturn '';\n\t\t\t}\n\t\t\tconst dbField = currentDataField.dbPath;\n\n\t\t\treturn `{${attributesVar} isa ${dbField};}`;\n\t\t}).filter((x) => x);\n\n\t\tconst idValueTQL = isArray(idValue) ? `like '${idValue.join('|')}'` : `'${idValue}'`;\n\t\tconst idAttributes = idValue // it must have id values, and they must be realDBIds\n\t\t\t? // if it is a relation, add only the id fields in the lines where we add the roles also so it does not get defined twice\n\t\t\t\t[`has ${idField} ${idValueTQL}`]\n\t\t\t: [];\n\n\t\tconst allAttributes = [...idAttributes, ...attributes].filter((x) => x).join(',');\n\n\t\tconst getDeletionMatchInNodes = () => {\n\t\t\t// if (node.$tempId) return ''; /// commented because we need tempIds to work when replacing a unlink/link all operation\n\t\t\t// todo: ensure parents belong to grandparents. [https://github.com/Blitzapps/blitz/issues/9]\n\t\t\tif (op === 'delete' || op === 'unlink' || op === 'match') {\n\t\t\t\treturn `${bzId} isa ${[thingDbPath, ...idAttributes].filter((x) => x).join(',')};`;\n\t\t\t}\n\t\t\tif (op === 'update') {\n\t\t\t\tif (!matchAttributes.length) {\n\t\t\t\t\tthrow new Error('update without attributes');\n\t\t\t\t}\n\t\t\t\treturn `${bzId} isa ${[thingDbPath, ...idAttributes].filter((x) => x).join(',')}, has ${attributesVar};\n ${matchAttributes.join(' or ')};`;\n\t\t\t}\n\t\t\treturn '';\n\t\t};\n\n\t\tconst getInsertionMatchInNodes = () => {\n\t\t\t// todo: ensure parents belong to grandparents. [https://github.com/Blitzapps/blitz/issues/9]\n\t\t\t// if (node.$tempId) return ''; /// same as getDeletionMatch\n\t\t\tif (op === 'update' || op === 'link' || op === 'match') {\n\t\t\t\treturn `${bzId} isa ${[thingDbPath, ...idAttributes].filter((x) => x).join(',')};`;\n\t\t\t}\n\t\t\treturn '';\n\t\t};\n\n\t\tif (isBQLBlock(node)) {\n\t\t\treturn {\n\t\t\t\top,\n\t\t\t\tdeletionMatch: getDeletionMatchInNodes(),\n\t\t\t\tinsertionMatch: getInsertionMatchInNodes(),\n\t\t\t\tinsertion:\n\t\t\t\t\top === 'create'\n\t\t\t\t\t\t? `${bzId} isa ${[thingDbPath, allAttributes].filter((x) => x).join(',')};`\n\t\t\t\t\t\t: op === 'update' && attributes.length\n\t\t\t\t\t\t\t? `${bzId} ${attributes.join(',')};`\n\t\t\t\t\t\t\t: '',\n\t\t\t\tdeletion:\n\t\t\t\t\top === 'delete'\n\t\t\t\t\t\t? `${bzId} isa ${thingDbPath};`\n\t\t\t\t\t\t: op === 'update' && matchAttributes.length\n\t\t\t\t\t\t\t? `${bzId} has ${attributesVar};`\n\t\t\t\t\t\t\t: '',\n\t\t\t};\n\t\t}\n\n\t\tthrow new Error('in attributes');\n\t};\n\n\tconst edgeToTypeQL = (\n\t\tnode: EnrichedBQLMutationBlock,\n\t): {\n\t\tpreDeletionBatch?: any[];\n\t\tdeletionMatch?: string;\n\t\tinsertionMatch?: string;\n\t\tdeletion?: string;\n\t\tinsertion?: string;\n\t\top: string;\n\t} => {\n\t\tconst op = node.$op as string;\n\t\tconst currentSchema = getCurrentSchema(schema, node);\n\t\tconst bzId = `$${node.$bzId}`;\n\t\tconst idValue = node.$id;\n\n\t\tconst relationDbPath = currentSchema.defaultDBConnector?.path || node.$thing;\n\n\t\tconst roleFields = 'roles' in currentSchema ? listify(currentSchema.roles, (k) => k) : [];\n\n\t\tconst roleDbPaths =\n\t\t\t'roles' in currentSchema\n\t\t\t\t? mapEntries(currentSchema.roles, (k, v) => [k, v.dbConnector?.path || k])\n\t\t\t\t: ({} as { [k: string]: string });\n\n\t\t// roles can be specified in three ways, either they are a roleField in the node, they are the children of something, or they have a default/computed link\n\t\t// 1) roleFields\n\n\t\t//@ts-expect-error - TODO\n\t\tconst fromRoleFields = listify(node, (k: string, v) => {\n\t\t\tif (!roleFields.includes(k)) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tif (!('roles' in currentSchema)) {\n\t\t\t\tthrow new Error('This should have roles! ');\n\t\t\t}\n\t\t\tconst roleDbPath = roleDbPaths[k];\n\t\t\tif (Array.isArray(v)) {\n\t\t\t\treturn v.map((x) => ({ path: roleDbPath, id: x }));\n\t\t\t}\n\t\t\treturn { path: roleDbPath, id: v };\n\t\t})\n\t\t\t.filter((x) => x)\n\t\t\t.flat();\n\n\t\t/// if one of the roles's id is undefined it means it applies to every object of that thingType so we need to create an id for it\n\t\tconst fromRoleFieldsTql = fromRoleFields.map((x) => {\n\t\t\t//@ts-expect-error - TODO\n\t\t\tif (!x?.path) {\n\t\t\t\tthrow new Error('Object without path');\n\t\t\t}\n\t\t\t//@ts-expect-error - TODO\n\t\t\treturn `${x.path}: $${x.id}`;\n\t\t});\n\n\t\tconst roles = fromRoleFields.length > 0 ? `( ${fromRoleFieldsTql.join(' , ')} )` : '';\n\t\tconst edgeType = node[EdgeType];\n\n\t\tif (!edgeType) {\n\t\t\tthrow new Error('[internal error] Symbol edgeType not defined');\n\t\t}\n\n\t\tconst relationTql = !roles\n\t\t\t? ''\n\t\t\t: `${bzId} ${roles} ${\n\t\t\t\t\tedgeType === 'linkField' || op === 'delete' || op === 'unlink' ? `isa ${relationDbPath}` : ''\n\t\t\t\t}`;\n\n\t\tconst relationTqlWithoutRoles = `${bzId} ${\n\t\t\tedgeType === 'linkField' || op === 'delete' ? `isa ${relationDbPath}` : ''\n\t\t}`;\n\n\t\tconst getInsertionsInEdges = () => {\n\t\t\tif (!relationTql) {\n\t\t\t\treturn '';\n\t\t\t}\n\t\t\tif (op === 'link') {\n\t\t\t\treturn `${relationTql};`;\n\t\t\t}\n\t\t\tif (op === 'create') {\n\t\t\t\treturn `${relationTql}, has id '${idValue}';`;\n\t\t\t}\n\t\t\treturn '';\n\t\t};\n\n\t\tconst getInsertionMatchInEdges = () => {\n\t\t\tif (!relationTql) {\n\t\t\t\treturn '';\n\t\t\t}\n\t\t\t// if (op === 'link') return `${relationTql};`;\n\t\t\t// if (op === 'create') return `${relationTqlWithoutRoles};`;\n\t\t\tif (op === 'match') {\n\t\t\t\treturn `${relationTql};`;\n\t\t\t}\n\t\t\treturn '';\n\t\t};\n\n\t\tconst getDeletionMatchInEdges = () => {\n\t\t\tif (!relationTql) {\n\t\t\t\treturn '';\n\t\t\t}\n\t\t\t/// edge delete: we are removing an automatic relation\n\t\t\tif (op === 'delete') {\n\t\t\t\treturn `${relationTql};`;\n\t\t\t}\n\t\t\t/// edge unlink means: We are editing a real relation's roles\n\t\t\tif (op === 'unlink') {\n\t\t\t\t/* return `${bzId} ($roles-${node.$bzId}: $players-${node.$bzId}) isa ${relationDbPath}; ${fromRoleFields\n .map((role) => `{$roles-${node.$bzId} type ${relationDbPath}:${role?.path};}`)\n .join(` or `)};`; */\n\t\t\t\t/// unlinking more than one role is not supported yet\n\t\t\t\t/// this got commented as the match brings what is needed but will probably need a refacto\n\t\t\t\t/// this is coded as generating a match block in [parseBQLmutation.ts], toEdges(edgeType1)\n\t\t\t\t// return `${bzId} ${roles} isa ${relationDbPath};`;\n\t\t\t\t//return `${relationTql};`; //!this fixes rep-del1 but breaks other tests, ideally should be added\n\t\t\t}\n\t\t\tif (op === 'match') {\n\t\t\t\treturn `${relationTql};`;\n\t\t\t}\n\t\t\treturn '';\n\t\t};\n\n\t\tconst getDeletionsInEdges = () => {\n\t\t\tif (!relationTql) {\n\t\t\t\treturn '';\n\t\t\t}\n\t\t\t// todo: same as insertions, better manage the ids here\n\t\t\tif (op === 'delete') {\n\t\t\t\treturn `${relationTqlWithoutRoles};`;\n\t\t\t}\n\t\t\tif (op === 'unlink') {\n\t\t\t\treturn `${bzId} ${roles};`;\n\t\t\t}\n\t\t\t// if (op === 'unlink') return `${bzId} ($roles-${node.$bzId}: $players-${node.$bzId});`;\n\t\t\treturn '';\n\t\t};\n\n\t\t/* const getPreDeletionBatch = () => {\n if (op === 'unlink') {\n return fromRoleFields\n .filter((y) => y)\n .map((x) => {\n return {\n match: `${bzId} (${x?.path}: $${x?.id}) isa ${relationDbPath};`,\n deletion: `${bzId} (${x?.path}: $${x?.id}) ${\n node[Symbol.for('edgeType') as any] === 'linkField' ? `isa ${relationDbPath}` : ''\n }`,\n };\n });\n }\n return [];\n }; */\n\n\t\treturn {\n\t\t\t// preDeletionBatch: getPreDeletionBatch(),\n\t\t\tdeletionMatch: getDeletionMatchInEdges(),\n\t\t\tinsertionMatch: getInsertionMatchInEdges(),\n\t\t\tdeletion: getDeletionsInEdges(),\n\t\t\tinsertion: getInsertionsInEdges(),\n\t\t\top: '',\n\t\t};\n\t};\n\n\tconst toTypeQL = (\n\t\tnodes: EnrichedBQLMutationBlock[] | EnrichedBQLMutationBlock,\n\t\tmode?: 'nodes' | 'edges',\n\t):\n\t\t| {\n\t\t\t\tpreDeletionBatch?: any[];\n\t\t\t\tinsertionMatch?: string;\n\t\t\t\tdeletionMatch?: string;\n\t\t\t\tinsertion?: string;\n\t\t\t\tdeletion?: string;\n\t\t }[]\n\t\t| {\n\t\t\t\tpreDeletionBatch?: any[];\n\t\t\t\tinsertionMatch?: string;\n\t\t\t\tdeletionMatch?: string;\n\t\t\t\tinsertion?: string;\n\t\t\t\tdeletion?: string;\n\t\t } => {\n\t\tconst typeQL = mode === 'edges' ? edgeToTypeQL : nodeToTypeQL;\n\n\t\tif (Array.isArray(nodes)) {\n\t\t\treturn nodes\n\t\t\t\t.map((x) => {\n\t\t\t\t\tconst { preDeletionBatch, insertionMatch, deletionMatch, insertion, deletion } = typeQL(x);\n\t\t\t\t\treturn shake({ preDeletionBatch, insertionMatch, deletionMatch, insertion, deletion }, (z) => !z); /// ! WARNING: falsy values are removed (0, \"\", etc)\n\t\t\t\t})\n\t\t\t\t.filter((y) => y);\n\t\t}\n\t\tconst { preDeletionBatch, insertionMatch, deletionMatch, insertion, deletion } = typeQL(nodes);\n\n\t\treturn shake({ preDeletionBatch, insertionMatch, deletionMatch, insertion, deletion }, (z) => !z); /// ! WARNING: falsy values are removed (0, \"\", etc)\n\t};\n\n\tconst nodeOperations = toTypeQL(things);\n\tconst arrayNodeOperations = Array.isArray(nodeOperations) ? nodeOperations : [nodeOperations];\n\tconst edgeOperations = toTypeQL(edges, 'edges');\n\tconst arrayEdgeOperations = Array.isArray(edgeOperations) ? edgeOperations : [edgeOperations];\n\tconst allOperations = [...arrayNodeOperations, ...arrayEdgeOperations];\n\n\t// todo: split BQL mutation in N DBstreams per DB\n\t// todo: then pack them per DB,\n\n\tconst tqlMutation = shake(\n\t\t{\n\t\t\t// preDeletionBatch: allOperations.flatMap((x) => x.preDeletionBatch).filter((y) => y !== undefined),\n\t\t\tinsertionMatches: allOperations\n\t\t\t\t.map((x) => x.insertionMatch)\n\t\t\t\t.join(' ')\n\t\t\t\t.trim(),\n\t\t\tdeletionMatches: allOperations\n\t\t\t\t.map((x) => x.deletionMatch)\n\t\t\t\t.join(' ')\n\t\t\t\t.trim(),\n\t\t\tinsertions: allOperations\n\t\t\t\t.map((x) => x.insertion)\n\t\t\t\t.join(' ')\n\t\t\t\t.trim(),\n\t\t\tdeletions: allOperations\n\t\t\t\t.map((x) => x.deletion)\n\t\t\t\t.join(' ')\n\t\t\t\t.trim(),\n\t\t\t// ...(typeQLRelations?.length && { relations: typeQLRelations }),\n\t\t},\n\t\t(x) => !x,\n\t);\n\n\treturn tqlMutation;\n};\n","/* eslint-disable no-param-reassign */\nimport { getSchemaByThing } from '../../../helpers';\nimport type { BQLMutationBlock, BormConfig, EnrichedBormSchema } from '../../../types';\nimport { clone } from 'radash';\n\nexport type TqlRes = any;\n\nexport const parseTQLMutation = async (\n\ttqlRes: TqlRes,\n\treqThings: any[],\n\treqEdges: any[],\n\tschema: EnrichedBormSchema,\n\tconfig: BormConfig,\n) => {\n\t// todo: check if something weird happened\n\tconst expected = [...reqThings, ...reqEdges];\n\n\tconst parsed = expected\n\t\t.map((exp) => {\n\t\t\t//! reads all the insertions and gets the first match. This means each id must be unique\n\t\t\t// @ts-expect-error - TODO description\n\t\t\tconst currentNode = tqlRes.insertions?.find((y) => y.get(`${exp.$bzId}`))?.get(`${exp.$bzId}`);\n\t\t\tconst $thing = exp.$thing || exp.$relation || exp.$entity;\n\t\t\tconst thing = $thing ? getSchemaByThing(schema, $thing) : undefined;\n\n\t\t\tif (exp.$op === 'create' || exp.$op === 'update' || exp.$op === 'link') {\n\t\t\t\t/// Creation and links should show an $error. Update on the other hand might not get here as typeDB does not return deleted thibgs.\n\t\t\t\tif (!(exp.$op === 'update') && !currentNode && exp.$id) {\n\t\t\t\t\treturn { $id: exp.$id, $error: \"Does not exist or it's not linked to the parent\" }; //todo: Return with $error not found?\n\t\t\t\t}\n\n\t\t\t\tconst dbIdd = currentNode?.asThing().iid;\n\t\t\t\tconst props = Object.entries(exp)\n\t\t\t\t\t.filter(([k, _]) => !k.startsWith('$')) // Skip keys starting with '$'\n\t\t\t\t\t.reduce(\n\t\t\t\t\t\t(acc, [k, v]) => {\n\t\t\t\t\t\t\t///Relations come with the $bzId in the roles instead of the $ids, lets replace them:\n\t\t\t\t\t\t\tconst dataField = thing?.dataFields?.find((f) => f.path === k);\n\t\t\t\t\t\t\tif (dataField?.contentType === 'JSON') {\n\t\t\t\t\t\t\t\tacc[k] = JSON.parse(v as any);\n\t\t\t\t\t\t\t\treturn acc;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (exp.$thingType === 'relation') {\n\t\t\t\t\t\t\t\tconst matchedThings = expected.filter((x) => x.$id && x.$bzId === v);\n\t\t\t\t\t\t\t\t/*if (matchedThings.length > 1) { //todo: maybe we still need to throw this error and fix it in the root side?\n\t\t\t\t\t\t\t\t\tthrow new Error(`Multiple things with the same bzId ${v}`);\n\t\t\t\t\t\t\t\t} else*/ if (matchedThings.length === 1) {\n\t\t\t\t\t\t\t\t\tacc[k] = matchedThings[0].$id;\n\t\t\t\t\t\t\t\t\treturn acc;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tacc[k] = v;\n\t\t\t\t\t\t\t\treturn acc;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tacc[k] = v;\n\t\t\t\t\t\t\treturn acc;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{} as Record<string, any>,\n\t\t\t\t\t);\n\n\t\t\t\tif (config.mutation?.noMetadata) {\n\t\t\t\t\treturn props;\n\t\t\t\t}\n\n\t\t\t\t/// We revert the cleaning of the tempId\n\t\t\t\tconst tempId = exp.$tempId && !exp.$tempId.startsWith('_:') ? { $tempId: `_:${exp.$tempId}` } : {};\n\t\t\t\t// TODO: exp.path is undefined\n\t\t\t\treturn { $dbId: dbIdd, ...exp, ...props, ...{ [exp.path]: exp.$id, ...tempId } } as BQLMutationBlock;\n\t\t\t}\n\t\t\tif (exp.$op === 'delete' || exp.$op === 'unlink') {\n\t\t\t\t// todo when typeDB confirms deletions, check them here\n\t\t\t\treturn exp as BQLMutationBlock;\n\t\t\t}\n\t\t\tif (exp.$op === 'match') {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tthrow new Error(`Unsupported op ${exp.$op}`);\n\t\t})\n\t\t.filter((z) => z);\n\n\treturn clone(parsed);\n};\n","import { TransactionType } from 'typedb-driver';\nimport { getSessionOrOpenNewOne } from '../../../adapters/typeDB/helpers';\nimport type { BormConfig, DBHandles } from '../../../types';\n\nexport type TqlMutation = {\n\tdeletions: string;\n\tdeletionMatches: string;\n\tinsertions: string;\n\tinsertionMatches: string;\n};\n\nexport const runTQLMutation = async (tqlMutation: TqlMutation, dbHandles: DBHandles, config: BormConfig) => {\n\tif (!tqlMutation) {\n\t\tthrow new Error('TQL request not built');\n\t}\n\tif (!((tqlMutation.deletions && tqlMutation.deletionMatches) || tqlMutation.insertions)) {\n\t\tthrow new Error('TQL request error, no things');\n\t}\n\n\tconst { session } = await getSessionOrOpenNewOne(dbHandles, config);\n\tconst mutateTransaction = await session.transaction(TransactionType.WRITE);\n\n\t// deletes and pre-update deletes\n\tconst tqlDeletion =\n\t\ttqlMutation.deletionMatches &&\n\t\ttqlMutation.deletions &&\n\t\t`match ${tqlMutation.deletionMatches} delete ${tqlMutation.deletions}`;\n\n\t// insertions and updates\n\tconst tqlInsertion =\n\t\ttqlMutation.insertions &&\n\t\t`${tqlMutation.insertionMatches ? `match ${tqlMutation.insertionMatches}` : ''} insert ${tqlMutation.insertions}`;\n\n\ttry {\n\t\t// does not receive a result\n\t\tif (tqlDeletion) {\n\t\t\tawait mutateTransaction.query.delete(tqlDeletion);\n\t\t}\n\n\t\tconst insertionsStream = tqlInsertion && mutateTransaction.query.insert(tqlInsertion);\n\t\tconst insertionsRes = insertionsStream ? await insertionsStream.collect() : undefined;\n\n\t\tawait mutateTransaction.commit();\n\t\treturn { insertions: insertionsRes };\n\t} catch (e: any) {\n\t\tthrow new Error(`Transaction failed: ${e.message}`);\n\t} finally {\n\t\tawait mutateTransaction.close();\n\t}\n};\n","import type {\n\tBormConfig,\n\tBQLMutationBlock,\n\tDBHandles,\n\tEnrichedBormSchema,\n\tEnrichedBQLMutationBlock,\n} from '../../../types';\nimport { createMachine, interpret, invoke, reduce, state, transition } from '../../robot3';\nimport type { bqlMutationContext } from '../mutationMachine';\nimport { buildTQLMutation } from './build';\nimport type { TqlRes } from './parse';\nimport { parseTQLMutation } from './parse';\nimport type { TqlMutation } from './run';\nimport { runTQLMutation } from './run';\n\ntype TypeDbMachineContext = {\n\tbql: bqlMutationContext;\n\ttql: {\n\t\tmutation?: TqlMutation;\n\t\tres?: TqlRes;\n\t};\n\tschema: EnrichedBormSchema;\n\tconfig: BormConfig;\n\thandles: DBHandles;\n\terror?: string | null;\n};\n\nconst updateBqlRes = (ctx: TypeDbMachineContext, event: any) => {\n\treturn {\n\t\t...ctx,\n\t\tbql: { ...ctx.bql, res: event.data },\n\t};\n};\n\nconst updateTQLMutation = (ctx: TypeDbMachineContext, event: any) => {\n\treturn {\n\t\t...ctx,\n\t\ttql: {\n\t\t\t...ctx.tql,\n\t\t\tmutation: event.data,\n\t\t},\n\t};\n};\n\nconst updateTQLRes = (ctx: TypeDbMachineContext, event: any) => {\n\treturn {\n\t\t...ctx,\n\t\ttql: {\n\t\t\t...ctx.tql,\n\t\t\tres: event.data,\n\t\t},\n\t};\n};\n\nconst errorTransition = transition(\n\t'error',\n\t'error',\n\treduce((ctx: TypeDbMachineContext, event: any): TypeDbMachineContext => {\n\t\treturn {\n\t\t\t...ctx,\n\t\t\terror: event.error,\n\t\t};\n\t}),\n);\n\nexport const typeDbMutationMachine = createMachine(\n\t'buildMutation',\n\t{\n\t\tbuildMutation: invoke(\n\t\t\tasync (ctx: TypeDbMachineContext) => buildTQLMutation(ctx.bql.things, ctx.bql.edges, ctx.schema),\n\t\t\ttransition('done', 'runMutation', reduce(updateTQLMutation)),\n\t\t\terrorTransition,\n\t\t),\n\t\trunMutation: invoke(\n\t\t\tasync (ctx: TypeDbMachineContext) => runTQLMutation(ctx.tql.mutation as TqlMutation, ctx.handles, ctx.config),\n\t\t\ttransition('done', 'parseMutation', reduce(updateTQLRes)),\n\t\t\terrorTransition,\n\t\t),\n\t\tparseMutation: invoke(\n\t\t\tasync (ctx: TypeDbMachineContext) =>\n\t\t\t\tparseTQLMutation(ctx.tql.res, ctx.bql.things, ctx.bql.edges, ctx.schema, ctx.config),\n\t\t\ttransition('done', 'success', reduce(updateBqlRes)),\n\t\t\terrorTransition,\n\t\t),\n\t\tsuccess: state(),\n\t\terror: state(),\n\t},\n\t(ctx: TypeDbMachineContext) => ctx,\n);\n\nconst awaitMutationMachine = async (context: TypeDbMachineContext) => {\n\treturn new Promise<any[]>((resolve, reject) => {\n\t\tinterpret(\n\t\t\ttypeDbMutationMachine,\n\t\t\t(service) => {\n\t\t\t\tif (service.machine.state.name === 'success') {\n\t\t\t\t\tresolve(service.context.bql.res);\n\t\t\t\t}\n\t\t\t\tif (service.machine.state.name === 'error') {\n\t\t\t\t\treject(service.context.error);\n\t\t\t\t}\n\t\t\t},\n\t\t\tcontext,\n\t\t);\n\t});\n};\n\nexport const runTypeDbMutationMachine = async (\n\tbqRaw: BQLMutationBlock | BQLMutationBlock[],\n\tenrichedBql: EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[],\n\tthings: unknown[],\n\tedges: unknown[],\n\tschema: EnrichedBormSchema,\n\tconfig: BormConfig,\n\thandles: DBHandles,\n) => {\n\treturn awaitMutationMachine({\n\t\tbql: {\n\t\t\traw: bqRaw,\n\t\t\tenriched: enrichedBql,\n\t\t\tthings: things, //to unify at some point with the flat notation\n\t\t\tedges: edges,\n\t\t\tflat: {\n\t\t\t\t//this is the new version, used for surrealDB\n\t\t\t\tthings: [],\n\t\t\t\tedges: [],\n\t\t\t\tarcs: [],\n\t\t\t\treferences: [],\n\t\t\t},\n\t\t\tres: [],\n\t\t},\n\t\ttql: {},\n\t\tschema: schema,\n\t\tconfig: config,\n\t\thandles: handles,\n\t\terror: null,\n\t});\n};\n","import { isArray } from 'radash';\nimport { sanitizeNameSurrealDB } from '../../../adapters/surrealDB/helpers';\nimport { getCurrentFields, getSchemaByThing, oFilter } from '../../../helpers';\nimport type { EnrichedBQLMutationBlock, EnrichedBormRelation, EnrichedBormSchema } from '../../../types';\nimport { Parent } from '../../../types/symbols';\nimport { buildSuqlFilter, parseFilter } from '../../../adapters/surrealDB/filters/filters';\nimport type { FlatBqlMutation } from '../bql/flatter';\nimport { parseValueSurrealDB } from '../../../adapters/surrealDB/parsing/values';\n\nexport const buildSURQLMutation = async (flat: FlatBqlMutation, schema: EnrichedBormSchema) => {\n\tconst buildThings = (block: EnrichedBQLMutationBlock) => {\n\t\t//console.log('currentThing:', block);\n\t\tconst { $filter, $thing, $bzId, $op, $id, $tempId } = block;\n\n\t\tconst currentSchema = getSchemaByThing(schema, $thing);\n\t\tconst { usedDataFields } = getCurrentFields(currentSchema, block);\n\t\tconst { idFields } = currentSchema;\n\t\tconst idValue = $id || block[idFields[0]];\n\n\t\tconst sanitizedThings = (isArray($thing) ? $thing : [$thing]).map(sanitizeNameSurrealDB);\n\n\t\tconst meta = oFilter(block, (k: string) => k.startsWith('$'));\n\t\tconst rest = oFilter(block, (k: string) => !k.startsWith('$'));\n\t\tconst restString = JSON.stringify(rest);\n\t\tconst metaString = Object.entries(meta)\n\t\t\t.map(([key, value]) => (key == '$tempId' ? `'$tempId': '_:${value}'` : `'${key}': '${value}'`)) //todo: At some point migrate tempIds so they only use _: when not explicit.\n\t\t\t.join(',');\n\n\t\tconst parent = block[Parent as any]; //todo\n\n\t\tconst dataFieldStrings = usedDataFields\n\t\t\t.filter((df) => !idFields.includes(df))\n\t\t\t.map((df) => {\n\t\t\t\tconst dataFieldSchema = currentSchema.dataFields?.find((f) => f.path === df || f.dbPath === df);\n\t\t\t\tif (!dataFieldSchema) {\n\t\t\t\t\tthrow new Error(`Data field schema not found for ${df}`);\n\t\t\t\t}\n\t\t\t\tconst value = block[df];\n\t\t\t\tif (value === null) {\n\t\t\t\t\treturn `${df} = NONE`;\n\t\t\t\t}\n\t\t\t\treturn `${df} = ${parseValueSurrealDB(value, dataFieldSchema.contentType)}`;\n\t\t\t})\n\t\t\t.filter(Boolean);\n\n\t\tconst VAR = `$⟨${$tempId || $bzId}⟩`;\n\n\t\tconst COND = (() => {\n\t\t\tif (parent?.bzId) {\n\t\t\t\treturn `array::flatten($⟨${parent.bzId}⟩.⟨${parent.edgeField}⟩ || []).filter(|$v| $v != NONE).len`;\n\t\t\t}\n\t\t\tif (idValue) {\n\t\t\t\tif (isArray(idValue)) {\n\t\t\t\t\treturn sanitizedThings.flatMap((table: string) => idValue.map((id: string) => `${table}:⟨${id}⟩`)).join(', ');\n\t\t\t\t}\n\t\t\t\treturn sanitizedThings.map((table: string) => `${table}:⟨${idValue}⟩`).join(', ');\n\t\t\t}\n\t\t\treturn true; // no parent, no id value, then we can run the update or deletion safely\n\t\t})();\n\n\t\tconst TARGET = (() => {\n\t\t\t//Non root\n\t\t\tif (parent?.bzId) {\n\t\t\t\tconst parentRef = `array::flatten($⟨${parent.bzId}⟩.⟨${parent.edgeField}⟩ || []).filter(|$v| $v != NONE)`; //needed to fix an issue where deletions fail when finding none. If we want to thow an error on undefined this might be a good place\n\n\t\t\t\tif (idValue) {\n\t\t\t\t\tif (isArray(idValue)) {\n\t\t\t\t\t\treturn `${parentRef}[? $this.id() IN [${idValue.map((id) => `'${id}'`).join(', ')}] ]`;\n\t\t\t\t\t}\n\t\t\t\t\treturn `${parentRef}[? $this.id() IN ['${idValue}'] ]`;\n\t\t\t\t}\n\t\t\t\treturn parentRef;\n\t\t\t} else {\n\t\t\t\tif (idValue) {\n\t\t\t\t\tif (isArray(idValue)) {\n\t\t\t\t\t\treturn sanitizedThings\n\t\t\t\t\t\t\t.flatMap((table: string) => idValue.map((id: string) => `${table}:⟨${id}⟩`))\n\t\t\t\t\t\t\t.join(', ');\n\t\t\t\t\t}\n\t\t\t\t\treturn sanitizedThings.map((table: string) => `${table}:⟨${idValue}⟩`).join(', ');\n\t\t\t\t}\n\t\t\t\treturn sanitizedThings.join(', ');\n\t\t\t}\n\t\t})();\n\t\tconst WHERE = $filter ? `WHERE ${buildSuqlFilter(parseFilter($filter, $thing, schema))}` : '';\n\t\tconst SET = dataFieldStrings.length > 0 ? `SET ${dataFieldStrings.join(', ')}` : '';\n\n\t\tconst OUTPUT = `VALUE (CREATE ONLY Delta SET input = ${restString}, meta = {${metaString}, \"$sid\": $parent.id, \"$id\": record::id($parent.id)}, after = $after, before = $before RETURN VALUE $parent.id )`;\n\t\tconst DELETE_OUTPUT = 'BEFORE';\n\n\t\tif (['link', 'unlink', 'replace'].includes($op)) {\n\t\t\tthrow new Error(\"Edge ops don't belong to things\");\n\t\t}\n\t\tif (block.$op === 'match') {\n\t\t\tif ($tempId) {\n\t\t\t\treturn ''; //tempIds are already stored on their creation\n\t\t\t}\n\t\t\treturn `LET ${VAR} = (SELECT VALUE id FROM ${TARGET} ${WHERE});`;\n\t\t}\n\t\tif (block.$op === 'create') {\n\t\t\tif (isArray(idValue)) {\n\t\t\t\tthrow new Error('Cannot create multiple things at once');\n\t\t\t}\n\t\t\tconst tableName = sanitizeNameSurrealDB($thing);\n\t\t\treturn `LET ${VAR} = (CREATE ONLY ${tableName}:⟨${idValue}⟩ ${SET} RETURN ${OUTPUT});`;\n\t\t}\n\t\tif (block.$op === 'update') {\n\t\t\treturn `LET ${VAR} = IF (${COND}) THEN (UPDATE ${TARGET} ${SET} ${WHERE} RETURN ${OUTPUT}) END;`;\n\t\t}\n\t\tif (block.$op === 'delete') {\n\t\t\treturn `LET ${VAR} = IF (${COND}) THEN (DELETE ${TARGET} ${WHERE} RETURN ${DELETE_OUTPUT}) END;`;\n\t\t}\n\n\t\tthrow new Error(`Unsupported operation ${block.$op}`);\n\t};\n\n\tconst buildEdges = (block: EnrichedBQLMutationBlock) => {\n\t\t//console.log('currentEdge:', block);\n\t\tconst { $thing, $bzId, $op, $tempId } = block;\n\t\tconst currentSchema = getSchemaByThing(schema, $thing);\n\t\tconst { usedRoleFields } = getCurrentFields(currentSchema, block);\n\n\t\tconst VAR = `$⟨${$tempId || $bzId}⟩`;\n\n\t\tconst roleFields =\n\t\t\t'roles' in currentSchema\n\t\t\t\t? usedRoleFields.flatMap((rf) => {\n\t\t\t\t\t\tconst roleFieldSchema = currentSchema.roles[rf];\n\t\t\t\t\t\tif (!roleFieldSchema) {\n\t\t\t\t\t\t\tthrow new Error(`Role field schema not found for ${rf}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst { cardinality } = roleFieldSchema;\n\t\t\t\t\t\tconst asArrayOfVars = isArray(block[rf])\n\t\t\t\t\t\t\t? block[rf].map((node: string) => `$⟨${node}⟩`)\n\t\t\t\t\t\t\t: [`$⟨${block[rf]}⟩`];\n\n\t\t\t\t\t\tif (cardinality === 'ONE') {\n\t\t\t\t\t\t\tif (asArrayOfVars.length > 1) {\n\t\t\t\t\t\t\t\t//This is ok as long as only one is a match, but we can link to several in card ONE. This is practical if we don't know the $thing for instance, we can try multiple ones\n\t\t\t\t\t\t\t\tconst arrayString = `array::filter(array::flatten([${asArrayOfVars}]), |$v| !!$v)`;\n\t\t\t\t\t\t\t\tswitch ($op) {\n\t\t\t\t\t\t\t\t\tcase 'link':\n\t\t\t\t\t\t\t\t\tcase 'replace':\n\t\t\t\t\t\t\t\t\t\treturn `${rf} = ((array::len(${arrayString})==1) && ${arrayString}[0]) || ${arrayString}`; //todo: throw a custom error instead\n\t\t\t\t\t\t\t\t\tcase 'unlink':\n\t\t\t\t\t\t\t\t\t\treturn `${rf} = NONE`; //todo this is not necessarily correct if $id or $filter! Should be none only if the node has been found\n\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\tthrow new Error(`Unsupported operation ${$op} for ONE cardinality`);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tswitch ($op) {\n\t\t\t\t\t\t\t\tcase 'link':\n\t\t\t\t\t\t\t\tcase 'replace':\n\t\t\t\t\t\t\t\t\treturn `${rf} = ((type::is::array(${asArrayOfVars[0]}) && array::len(${asArrayOfVars[0]})==1) && ${asArrayOfVars[0]}[0]) || ${asArrayOfVars[0]}`;\n\t\t\t\t\t\t\t\tcase 'unlink':\n\t\t\t\t\t\t\t\t\treturn `${rf} = NONE`; //todo this is not necessarily correct if $id or $filter! Should be none only if the node has been found\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\tthrow new Error(`Unsupported operation ${$op} for ONE cardinality`);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (cardinality === 'MANY') {\n\t\t\t\t\t\t\tconst nodesString = `array::flatten([${asArrayOfVars}])`;\n\t\t\t\t\t\t\tswitch ($op) {\n\t\t\t\t\t\t\t\tcase 'link':\n\t\t\t\t\t\t\t\t\treturn `${rf} += ${nodesString}`;\n\t\t\t\t\t\t\t\tcase 'unlink':\n\t\t\t\t\t\t\t\t\treturn `${rf} -= ${nodesString}`;\n\t\t\t\t\t\t\t\tcase 'replace':\n\t\t\t\t\t\t\t\t\treturn `${rf} = ${nodesString}`;\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\tthrow new Error(`Unsupported operation ${$op} for MANY cardinality`);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthrow new Error(`Unsupported cardinality ${cardinality}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t: [];\n\n\t\tconst roleFieldsString = roleFields.length > 0 ? `${roleFields.join(', ')}` : '';\n\t\tconst SET = roleFieldsString ? `SET ${roleFieldsString}` : '';\n\n\t\treturn `IF ${VAR} THEN (UPDATE ${VAR} ${SET} RETURN VALUE id) END; ${VAR};`; //todo: confirm if the WHERE is actually needed here?\n\t};\n\n\tconst buildArcs = (block: EnrichedBQLMutationBlock) => {\n\t\tconst { $thing, $op } = block;\n\t\tconst currentSchema = getSchemaByThing(schema, $thing) as EnrichedBormRelation;\n\t\tconst tableName = sanitizeNameSurrealDB($thing);\n\n\t\tconst { usedRoleFields } = getCurrentFields(currentSchema, block);\n\n\t\tif (!['create', 'delete'].includes($op)) {\n\t\t\tthrow new Error('Arcs can only be created or deleted');\n\t\t}\n\n\t\tconst [roleA, roleB] = usedRoleFields;\n\t\tconst thingsA = (isArray(block[roleA]) ? block[roleA] : [block[roleA]]) as string[];\n\t\tconst thingsB = (isArray(block[roleB]) ? block[roleB] : [block[roleB]]) as string[];\n\n\t\tif ($op === 'create') {\n\t\t\tif (usedRoleFields.length !== 2) {\n\t\t\t\tthrow new Error('Not supported: Arcs must have exactly 2 roles');\n\t\t\t}\n\t\t\tconst rest = oFilter(block, (k: string) => !k.startsWith('$'));\n\t\t\tconst restString = JSON.stringify(rest);\n\n\t\t\tconst OUTPUT = `(CREATE ONLY Delta SET input = ${restString}, meta = {\"$sid\": $parent.id, \"$id\": record::id($parent.id)}, after = $after, before = $before RETURN VALUE $parent.id )`;\n\n\t\t\tconst roleOneSchema = currentSchema.roles[roleA];\n\t\t\tconst isMany1 = roleOneSchema.cardinality === 'MANY';\n\n\t\t\tconst roleTwoSchema = currentSchema.roles[roleB];\n\t\t\tconst isMany2 = roleTwoSchema.cardinality === 'MANY';\n\n\t\t\t/*const thingsAString = thingsA.map((thingA) => `$⟨${thingA}⟩`).join(', ');\n\t\t\tconst thingsAArrayString = `array::flatten([${thingsAString}])`;\n\t\t\tconst thingsBString = thingsB.map((thingB) => `$⟨${thingB}⟩`).join(', ');\n\t\t\tconst thingsBArrayString = `array::flatten([${thingsBString}])`;\n*/\n\t\t\t/*\n\t\t\t//this is the third version, where we only create one arc per arc defined in the flatter function. Todo: Check cardinality and throw error if it is not correct instead of the || to trigger it internally\n\t\t\tconst arc = `CREATE ONLY ${tableName} SET\n\t\t\t\t\t${roleA} = ${isMany1 ? thingsAArrayString : `array::len(${thingsAArrayString}) == 1 && array::first(${thingsAArrayString}) || ${thingsAArrayString}`},\n\t\t\t\t\t${roleB} = ${isMany2 ? thingsBArrayString : `array::len(${thingsBArrayString}) == 1 && array::first(${thingsBArrayString}) || ${thingsBArrayString}`}\n\t\t\t`;\n\n\t\t\treturn arc; \n\t\t\t*/\n\n\t\t\t///before it was multiple arcs, running a loop over thingsA and thingsB in addition to the surrealDB loop inside the surql\n\t\t\tconst arcs = [\n\t\t\t\t///This ignored cardinality and created N*M arcs. I keep it here as it could be an option in the mutation config in the future.\n\n\t\t\t\t//\n\t\t\t\t//\n\t\t\t\t`\n\t\t\t\t${!isMany1 ? `IF array::len(array::filter(array::flatten([$⟨${thingsA}⟩]), |$v| !!$v))>1 { THROW \"[Validation] Cardinality constraint: ${roleA} is cardinality one and can link a single thing.\" + <string>$⟨${thingsA}⟩; };` : ''}\n\t\t\t\t${!isMany2 ? `IF array::len(array::filter(array::flatten([$⟨${thingsB}⟩]), |$v| !!$v))>1 { THROW \"[Validation] Cardinality constraint: ${roleB} is cardinality one and can link a single thing.\" + <string>$⟨${thingsB}⟩; };` : ''}\n\t\t\t\tFOR $node1 IN array::flatten([$⟨${thingsA}⟩]) { \n\t\t\t\t\t\t\tIF $node1 {\n\t\t\t\t\t\t\t\tFOR $node2 IN array::flatten([$⟨${thingsB}⟩]) { \n\t\t\t\t\t\t\t\t\tIF $node2 {\n\t\t\t\t\t\t\t\t\t\tCREATE ONLY ${tableName} SET \n\t\t\t\t\t\t\t\t\t\t\t${roleA} = ${isMany1 ? 'array::flatten([$node1])' : '$node1'}, \n\t\t\t\t\t\t\t\t\t\t\t${roleB} = ${isMany2 ? 'array::flatten([$node2])' : '$node2'} \n\t\t\t\t\t\t\t\t\t\tRETURN ${OUTPUT}; \n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}`,\n\t\t\t];\n\n\t\t\t///This is the throw error version that checks the cardinality, if it is ugly but it works, it ain't ugly\n\t\t\t//\t`CREATE ONLY ${tableName} SET ${roleA} = ${isMany1 ? `fn::as_array($⟨${thingA}⟩)` : `array::len(fn::as_array($⟨${thingA}⟩)) == 1 && array::first(fn::as_array($⟨${thingA}⟩)) || $⟨${thingA}⟩`}, ${roleB} = ${isMany2 ? `fn::as_array($⟨${thingB}⟩)` : `array::len(fn::as_array($⟨${thingB}⟩)) == 1 && array::first(fn::as_array($⟨${thingB}⟩)) || $⟨${thingB}⟩`} RETURN ${OUTPUT};`,\n\n\t\t\t//console.log('arcs', arcs);\n\t\t\treturn arcs;\n\t\t}\n\n\t\tif ($op === 'delete') {\n\t\t\treturn `DELETE FROM ${tableName} WHERE fn::as_array(${roleA}) CONTAINSANY $⟨${thingsA}⟩ AND fn::as_array(${roleB}) CONTAINSANY $⟨${thingsB}⟩ RETURN BEFORE`;\n\t\t}\n\t};\n\n\tconst buildReferences = (block: EnrichedBQLMutationBlock) => {\n\t\tconst { $thing, $bzId, $op, $tempId } = block;\n\t\tconst currentSchema = getSchemaByThing(schema, $thing);\n\t\tconst { usedRefFields } = getCurrentFields(currentSchema, block);\n\n\t\tconst VAR = `$⟨${$tempId || $bzId}⟩`;\n\n\t\tconst refFields = usedRefFields.flatMap((rf) => {\n\t\t\tconst refFieldSchema = currentSchema.refFields[rf];\n\t\t\tif (!refFieldSchema) {\n\t\t\t\tthrow new Error(`ReferenceField schema not found for ${rf}`);\n\t\t\t}\n\t\t\tconst { cardinality, contentType } = refFieldSchema;\n\t\t\tif (contentType === 'REF') {\n\t\t\t\tconst asArrayOfVars = isArray(block[rf]) ? block[rf] : [`${block[rf]}`];\n\n\t\t\t\tif (cardinality === 'ONE') {\n\t\t\t\t\tif (asArrayOfVars.length > 1) {\n\t\t\t\t\t\t//This is ok as long as only one is a match, but we can link to several in card ONE. This is practical if we don't know the $thing for instance, we can try multiple ones\n\t\t\t\t\t\tconst arrayString = `array::filter(array::flatten([${asArrayOfVars}]), |$v| !!$v)`;\n\t\t\t\t\t\tswitch ($op) {\n\t\t\t\t\t\t\tcase 'link':\n\t\t\t\t\t\t\tcase 'replace':\n\t\t\t\t\t\t\t\treturn `${rf} = ((array::len(${arrayString})==1) && ${arrayString}[0]) || ${arrayString}`; //todo: throw a custom error instead\n\t\t\t\t\t\t\tcase 'unlink':\n\t\t\t\t\t\t\t\treturn `${rf} = NONE`; //todo this is not necessarily correct if $id or $filter! Should be none only if the node has been found\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tthrow new Error(`Unsupported operation ${$op} for ONE cardinality`);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tswitch ($op) {\n\t\t\t\t\t\tcase 'link':\n\t\t\t\t\t\tcase 'replace':\n\t\t\t\t\t\t\treturn `${rf} = ((type::is::array(${asArrayOfVars[0]}) && array::len(${asArrayOfVars[0]})==1) && ${asArrayOfVars[0]}[0]) || ${asArrayOfVars[0]}`;\n\t\t\t\t\t\tcase 'unlink':\n\t\t\t\t\t\t\treturn `${rf} = NONE`; //todo this is not necessarily correct if $id or $filter! Should be none only if the node has been found\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tthrow new Error(`Unsupported operation ${$op} for ONE cardinality`);\n\t\t\t\t\t}\n\t\t\t\t} else if (cardinality === 'MANY') {\n\t\t\t\t\tconst nodesString = `array::flatten([${asArrayOfVars}])`;\n\t\t\t\t\tswitch ($op) {\n\t\t\t\t\t\tcase 'link':\n\t\t\t\t\t\t\treturn `${rf} += ${nodesString}`;\n\t\t\t\t\t\tcase 'unlink':\n\t\t\t\t\t\t\treturn `${rf} -= ${nodesString}`;\n\t\t\t\t\t\tcase 'replace':\n\t\t\t\t\t\t\treturn `${rf} = ${nodesString}`;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tthrow new Error(`Unsupported operation ${$op} for MANY cardinality`);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(`Unsupported cardinality ${cardinality}`);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (contentType === 'FLEX') {\n\t\t\t\t//todo: card one check len 1\n\t\t\t\t//todo: add/remove etc\n\t\t\t\treturn `${rf} = ${cardinality === 'ONE' ? `array::flatten([${block[rf]}])[0]` : `array::flatten([${block[rf]}])`}`;\n\t\t\t}\n\t\t});\n\t\tconst refFieldsString = refFields.length > 0 ? `${refFields.join(', ')}` : '';\n\t\tconst SET = refFieldsString ? `SET ${refFieldsString}` : '';\n\n\t\treturn `IF ${VAR} THEN (UPDATE ${VAR} ${SET} RETURN VALUE id) END; ${VAR};`;\n\t};\n\n\tconst result = [\n\t\t...flat.things.map(buildThings),\n\t\t...flat.edges.map(buildEdges),\n\t\t...flat.arcs.flatMap(buildArcs),\n\t\t...flat.references.map(buildReferences),\n\t];\n\t//console.log('builtMutation', result);\n\treturn result;\n};\n","import type { SimpleSurrealClient } from '../../../adapters/surrealDB/client';\nimport { VERSION } from '../../../version';\nimport { logDebug } from '../../../logger';\n\nexport const runSURQLMutation = async (client: SimpleSurrealClient, mutations: string[]): Promise<any[]> => {\n\tconst batchedMutation = `\n\tBEGIN TRANSACTION;\n\t${mutations.join(';')};\n\tLET $DELTAS = SELECT * FROM Delta;\n\tDELETE Delta;\n\tRETURN $DELTAS;\n\n\tLET $LOGS = SELECT * FROM LOG;\n\tRETURN $LOGS;\n\tCOMMIT TRANSACTION; \n\t`;\n\n\tlogDebug(`>>> batchedMutation[${VERSION}]`, JSON.stringify({ batchedMutation }));\n\t//console.log('mutations', mutations);\n\t//console.log('batchedMutation', batchedMutation);\n\ttry {\n\t\tconst result = await client.query(batchedMutation);\n\t\treturn result.filter(Boolean);\n\t} catch (error) {\n\t\tconst errorRes = await client.query_raw(batchedMutation);\n\t\t//console.log('errorRes!', JSON.stringify(errorRes, null, 2));\n\t\tconst filteredErrorRes = errorRes.filter(\n\t\t\t(r) =>\n\t\t\t\tr.result !== 'The query was not executed due to a failed transaction' &&\n\t\t\t\tr.result !== 'There was an error when starting a new datastore transaction' &&\n\t\t\t\tr.status === 'ERR',\n\t\t);\n\t\tif (filteredErrorRes.length > 0) {\n\t\t\tthrow new Error(`Error running SURQL mutation: ${JSON.stringify(filteredErrorRes)}`);\n\t\t}\n\t\tthrow error;\n\t}\n};\n","import { isArray, isObject, mapEntries } from 'radash';\nimport type { BormConfig, EnrichedBormSchema } from '../../../types';\nimport { oFilter } from '../../../helpers';\n\nexport type EnrichedSURQLMutationRes = {\n\tmeta: Record<string, any>;\n\tinput?: Record<string, any>;\n\tafter?: Record<string, any>;\n};\n\nexport const parseSURQLMutation = (props: {\n\tres: EnrichedSURQLMutationRes[][];\n\tschema: EnrichedBormSchema;\n\tconfig: BormConfig;\n}) => {\n\tconst { res, config } = props;\n\t//console.log('res!', JSON.stringify(res, null, 2));\n\n\tconst result = res\n\t\t.flat() //Todo: try to get it flat instead of [][]\n\t\t.filter(Boolean)\n\t\t.flatMap((b: object) => {\n\t\t\tif (isArray(b)) {\n\t\t\t\treturn b.map((r) => {\n\t\t\t\t\tif (!isObject(r) || !('meta' in r)) {\n\t\t\t\t\t\tthrow new Error(`Internal error: Invalid response from DB: ${JSON.stringify(r)}`);\n\t\t\t\t\t}\n\t\t\t\t\treturn parseRes(r as EnrichedSURQLMutationRes, config);\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (!isObject(b) || !('meta' in b)) {\n\t\t\t\tthrow new Error(`Internal error: Invalid response from DB: ${JSON.stringify(b)}`);\n\t\t\t}\n\t\t\treturn parseRes(b as EnrichedSURQLMutationRes, config);\n\t\t});\n\treturn result;\n};\n\nconst parseRes = (block: EnrichedSURQLMutationRes, config: BormConfig) => {\n\tconst thing = mapEntries(block.after || {}, (key, value) => [\n\t\tkey,\n\t\tkey === 'id' ? value.id : isArray(value) && value.length === 0 ? undefined : value,\n\t]);\n\n\tconst nulledAtts = oFilter(block.input || {}, (k: string, v: any) => v === null);\n\tconst withMetaAndId = { ...thing, ...block.meta, ...nulledAtts };\n\n\tif (!config.mutation?.noMetadata) {\n\t\treturn withMetaAndId;\n\t} else {\n\t\treturn oFilter(withMetaAndId, (k: string) => !k.startsWith('$'));\n\t}\n};\n","import type {\n\tBormConfig,\n\tBQLMutationBlock,\n\tDBHandles,\n\tEnrichedBormSchema,\n\tEnrichedBQLMutationBlock,\n} from '../../../types';\nimport { createMachine, interpret, invoke, reduce, state, transition } from '../../robot3';\nimport type { bqlMutationContext } from '../mutationMachine';\nimport { buildSURQLMutation } from './build';\nimport { runSURQLMutation } from './run';\nimport type { EnrichedSURQLMutationRes } from './parse';\nimport { parseSURQLMutation } from './parse';\nimport { isArray } from 'radash';\nimport type { FlatBqlMutation } from '../bql/flatter';\nimport type { SimpleSurrealClient } from '../../../adapters/surrealDB/client';\nimport { VERSION } from '../../../version';\nimport { logDebug } from '../../../logger';\n\ntype SurrealDbMachineContext = {\n\tbql: bqlMutationContext;\n\tsurql: {\n\t\tmutations: string[];\n\t\tres: EnrichedSURQLMutationRes[][]; //todo maybe a flat versi\n\t};\n\tschema: EnrichedBormSchema;\n\tconfig: BormConfig;\n\thandles: DBHandles;\n\terror?: string | null;\n};\n\nconst updateBqlRes = (ctx: SurrealDbMachineContext, event: any) => {\n\treturn {\n\t\t...ctx,\n\t\tbql: { ...ctx.bql, res: event.data },\n\t};\n};\n\nconst updateSURQLMutation = (ctx: SurrealDbMachineContext, event: any) => {\n\tif (!event.data || !isArray(event.data) || event.data.some((d: any) => typeof d !== 'string')) {\n\t\tthrow new Error('Invalid event data');\n\t}\n\treturn {\n\t\t...ctx,\n\t\tsurql: {\n\t\t\t...ctx.surql,\n\t\t\tmutations: event.data as string[],\n\t\t},\n\t};\n};\n\nconst updateSURQLRes = (ctx: SurrealDbMachineContext, event: any) => {\n\tif (!event.data || !isArray(event.data)) {\n\t\tthrow new Error('Invalid event data');\n\t}\n\treturn {\n\t\t...ctx,\n\t\tsurql: {\n\t\t\t...ctx.surql,\n\t\t\tres: event.data as EnrichedSURQLMutationRes[][],\n\t\t},\n\t};\n};\n\nconst errorTransition = transition(\n\t'error',\n\t'error',\n\treduce((ctx: SurrealDbMachineContext, event: any): SurrealDbMachineContext => {\n\t\treturn {\n\t\t\t...ctx,\n\t\t\terror: event.error,\n\t\t};\n\t}),\n);\n\nconst surrealDbMutationMachine = createMachine(\n\t'buildMutation',\n\t{\n\t\tbuildMutation: invoke(\n\t\t\tasync (ctx: SurrealDbMachineContext) => {\n\t\t\t\tlogDebug(`>>> surqlMachine/buildMutation[${VERSION}]`, JSON.stringify(ctx.bql.flat));\n\t\t\t\treturn buildSURQLMutation(ctx.bql.flat, ctx.schema);\n\t\t\t},\n\t\t\ttransition('done', 'runMutation', reduce(updateSURQLMutation)),\n\t\t\terrorTransition,\n\t\t),\n\t\trunMutation: invoke(\n\t\t\tasync (ctx: SurrealDbMachineContext) => {\n\t\t\t\tlogDebug(`>>> surqlMachine/runMutation[${VERSION}]`, JSON.stringify(ctx.surql.mutations));\n\t\t\t\treturn runSURQLMutation(\n\t\t\t\t\tctx.handles.surrealDB?.get(ctx.handles.surrealDB?.keys().next().value as string)\n\t\t\t\t\t\t?.client as SimpleSurrealClient,\n\t\t\t\t\tctx.surql.mutations,\n\t\t\t\t);\n\t\t\t},\n\t\t\ttransition('done', 'parseMutation', reduce(updateSURQLRes)),\n\t\t\terrorTransition,\n\t\t),\n\t\tparseMutation: invoke(\n\t\t\tasync (ctx: SurrealDbMachineContext) => {\n\t\t\t\tlogDebug(`>>> surqlMachine/parseMutation[${VERSION}]`, JSON.stringify(ctx.surql.res));\n\t\t\t\treturn parseSURQLMutation({ res: ctx.surql.res, config: ctx.config, schema: ctx.schema });\n\t\t\t},\n\t\t\ttransition('done', 'success', reduce(updateBqlRes)),\n\t\t\terrorTransition,\n\t\t),\n\t\tsuccess: state(),\n\t\terror: state(),\n\t},\n\t(ctx: SurrealDbMachineContext) => ctx,\n);\n\nconst awaitMutationMachine = async (context: SurrealDbMachineContext) => {\n\treturn new Promise<any[]>((resolve, reject) => {\n\t\tinterpret(\n\t\t\tsurrealDbMutationMachine,\n\t\t\t(service) => {\n\t\t\t\tif (service.machine.state.name === 'success') {\n\t\t\t\t\tresolve(service.context.bql.res);\n\t\t\t\t}\n\t\t\t\tif (service.machine.state.name === 'error') {\n\t\t\t\t\treject(service.context.error);\n\t\t\t\t}\n\t\t\t},\n\t\t\tcontext,\n\t\t);\n\t});\n};\n\nexport const runSurrealDbMutationMachine = async (\n\tbqlRaw: BQLMutationBlock | BQLMutationBlock[],\n\tenrichedBql: EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[],\n\tbqlFlat: FlatBqlMutation,\n\tschema: EnrichedBormSchema,\n\tconfig: BormConfig,\n\thandles: DBHandles,\n) => {\n\treturn awaitMutationMachine({\n\t\tbql: {\n\t\t\traw: bqlRaw,\n\t\t\tenriched: enrichedBql,\n\t\t\tflat: bqlFlat,\n\t\t\tthings: [],\n\t\t\tedges: [],\n\t\t\tres: [],\n\t\t},\n\t\tsurql: {\n\t\t\tmutations: [],\n\t\t\tres: [],\n\t\t},\n\t\tschema: schema,\n\t\tconfig: config,\n\t\thandles: handles,\n\t\terror: null,\n\t});\n};\n","import type { BormOperation, EnrichedBormSchema, EnrichedBQLMutationBlock, EnrichedLinkField } from '../../../types';\nimport { getCurrentFields, oFilter } from '../../../helpers';\nimport { isArray, isSymbol } from 'radash';\nimport { Parent } from '../../../types/symbols';\nimport { parseValueSurrealDB } from '../../../adapters/surrealDB/parsing/values';\n\nexport type FlatBqlMutation = {\n\tthings: EnrichedBQLMutationBlock[];\n\tedges: EnrichedBQLMutationBlock[];\n\tarcs: EnrichedBQLMutationBlock[];\n\treferences: EnrichedBQLMutationBlock[];\n};\n\nexport const flattenBQLMutation = (\n\ttree: EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[],\n\tschema: EnrichedBormSchema,\n): FlatBqlMutation => {\n\t//console.log('>>> flattenBQLMutation', JSON.stringify({ tree, schema }));\n\tconst result: FlatBqlMutation = {\n\t\tthings: [],\n\t\tedges: [],\n\t\tarcs: [],\n\t\treferences: [],\n\t};\n\n\tconst traverse = (\n\t\tblock: EnrichedBQLMutationBlock,\n\t\tparent?: { bzId: string; edgeField: string; tempId?: string },\n\t): void => {\n\t\tif (!block?.$thing) {\n\t\t\t//console.log('block without $thing', block);\n\t\t\t//this for instance happens in flexValues inside refFields\n\t\t\treturn;\n\t\t}\n\t\tconst { $op, $bzId, $tempId } = block;\n\n\t\tconst currentSchema = schema.relations[block.$thing] || schema.entities[block.$thing];\n\t\tif (!currentSchema) {\n\t\t\tthrow new Error(`[Internal] No schema found for ${block.$thing}`);\n\t\t}\n\n\t\tconst parentObj = parent?.bzId ? parent : { bzId: '', edgeField: 'root' };\n\n\t\t//const { idFields } = currentSchema;\n\t\tconst { usedDataFields, usedLinkFields, usedRoleFields, usedRefFields } = getCurrentFields(currentSchema, block);\n\n\t\t//const isOne = $op === 'create' || !isArray($id);\n\n\t\t//1. THINGS\n\t\tif (['create', 'update', 'delete', 'link', 'unlink', 'match', 'replace'].includes($op)) {\n\t\t\tconst thing = {\n\t\t\t\t...oFilter(block, (k: string) => ![...usedRoleFields, ...usedLinkFields, ...usedRefFields].includes(k)),\n\t\t\t\t...($op === 'link' || $op === 'unlink' || $op === 'replace' || ($op === 'update' && usedDataFields.length === 0)\n\t\t\t\t\t? { $op: 'match' }\n\t\t\t\t\t: {}),\n\t\t\t\t...($op === 'link' || $op === 'replace' ? {} : { [Parent]: parentObj }), //links and replaces don't read from the parent but the entire table,\n\t\t\t} as EnrichedBQLMutationBlock;\n\n\t\t\tresult.things.push(thing);\n\t\t}\n\n\t\t//2. EDGES\n\t\t// 2.1 Case one direct EDGES\n\n\t\t// left side is what happens in the edge, right side is the op in the children that creates that edge op\n\t\tconst operationMap = {\n\t\t\tlink: ['link', 'create'],\n\t\t\tunlink: ['unlink', 'delete'],\n\t\t\treplace: ['replace'],\n\t\t};\n\n\t\tif (usedRoleFields) {\n\t\t\tconst edgeMeta = oFilter(\n\t\t\t\tblock,\n\t\t\t\t(k: string | symbol) => isSymbol(k) || k.startsWith('$'),\n\t\t\t) as EnrichedBQLMutationBlock;\n\n\t\t\tusedRoleFields.forEach((role) => {\n\t\t\t\t//1 traverse them as well\n\t\t\t\tisArray(block[role])\n\t\t\t\t\t? block[role].forEach((child: EnrichedBQLMutationBlock) =>\n\t\t\t\t\t\t\ttraverse(child, { bzId: $bzId, edgeField: role, tempId: $tempId }),\n\t\t\t\t\t\t)\n\t\t\t\t\t: traverse(block[role], { bzId: $bzId, edgeField: role, tempId: $tempId });\n\n\t\t\t\t//2 fill the arrays\n\t\t\t\tconst edges = (isArray(block[role]) ? block[role] : [block[role]]).filter(\n\t\t\t\t\tBoolean,\n\t\t\t\t) as EnrichedBQLMutationBlock[]; //pre-queries add some undefineds\n\n\t\t\t\tObject.entries(operationMap).forEach(([operation, opTypes]) => {\n\t\t\t\t\tconst filteredEdges = edges.filter((edge) => opTypes.includes(edge.$op)).map((edge) => edge.$bzId);\n\n\t\t\t\t\tif (filteredEdges.length > 0) {\n\t\t\t\t\t\tresult.edges.push({\n\t\t\t\t\t\t\t...edgeMeta,\n\t\t\t\t\t\t\t[role]: filteredEdges,\n\t\t\t\t\t\t\t$op: operation as BormOperation,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t\tif (usedLinkFields) {\n\t\t\tusedLinkFields.forEach((ulf) => {\n\t\t\t\t//1 traverse them\n\t\t\t\tisArray(block[ulf])\n\t\t\t\t\t? block[ulf].forEach((child: EnrichedBQLMutationBlock) =>\n\t\t\t\t\t\t\ttraverse(child, { bzId: $bzId, edgeField: ulf, tempId: $tempId }),\n\t\t\t\t\t\t)\n\t\t\t\t\t: traverse(block[ulf], { bzId: $bzId, edgeField: ulf, tempId: $tempId });\n\n\t\t\t\t//2 fill the arrays\n\t\t\t\tconst edgeSchema = currentSchema.linkFields?.find((lf) => lf.path === ulf) as EnrichedLinkField;\n\t\t\t\tconst edges = (isArray(block[ulf]) ? block[ulf] : [block[ulf]]) as EnrichedBQLMutationBlock[];\n\t\t\t\t//console.log('edges:', edges);\n\n\t\t\t\t//case 2.2 indirect edges\n\t\t\t\tif (edgeSchema.target === 'relation') {\n\t\t\t\t\tObject.entries(operationMap).forEach(([operation, opTypes]) => {\n\t\t\t\t\t\tconst filteredEdges = edges.filter((edge) => opTypes.includes(edge.$op));\n\n\t\t\t\t\t\tfilteredEdges.forEach((edge) => {\n\t\t\t\t\t\t\tconst edgeMeta = oFilter(\n\t\t\t\t\t\t\t\tedge,\n\t\t\t\t\t\t\t\t(k: string | symbol) => isSymbol(k) || k.startsWith('$'),\n\t\t\t\t\t\t\t) as EnrichedBQLMutationBlock;\n\n\t\t\t\t\t\t\tresult.edges.push({\n\t\t\t\t\t\t\t\t...edgeMeta,\n\t\t\t\t\t\t\t\t[edgeSchema.plays]: $bzId,\n\t\t\t\t\t\t\t\t$op: operation as BormOperation,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\t// 3. INFERRED EDGES\n\t\t\t\tif (edgeSchema.target === 'role') {\n\t\t\t\t\tconst arcOperationMap = {\n\t\t\t\t\t\tcreate: ['link', 'create'],\n\t\t\t\t\t\tdelete: ['unlink', 'delete'],\n\t\t\t\t\t\treplace: ['replace'],\n\t\t\t\t\t};\n\n\t\t\t\t\tObject.entries(arcOperationMap).forEach(([operation, opTypes]) => {\n\t\t\t\t\t\tconst filteredEdges = edges.filter((edge) => opTypes.includes(edge.$op));\n\n\t\t\t\t\t\tif (filteredEdges.length === 0) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfilteredEdges.forEach((edge) => {\n\t\t\t\t\t\t\tconst arc = {\n\t\t\t\t\t\t\t\t//technically is a multi-arc\n\t\t\t\t\t\t\t\t$thing: edgeSchema.relation,\n\t\t\t\t\t\t\t\t$thingType: 'relation' as const,\n\t\t\t\t\t\t\t\t$bzId: `arc_${edge.$bzId}`,\n\t\t\t\t\t\t\t\t[edgeSchema.plays]: $bzId,\n\t\t\t\t\t\t\t\t[edgeSchema.oppositeLinkFieldsPlayedBy[0].plays]: edge.$bzId,\n\t\t\t\t\t\t\t\t$op: operation as BormOperation,\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\tresult.arcs.push(arc);\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\tif (usedRefFields) {\n\t\t\tusedRefFields.forEach((urf) => {\n\t\t\t\t//const { contentType } = currentSchema.refFields[urf];\n\t\t\t\t//1 traverse them to push the nested items\n\t\t\t\tisArray(block[urf])\n\t\t\t\t\t? block[urf].forEach((child: EnrichedBQLMutationBlock) =>\n\t\t\t\t\t\t\ttraverse(child, { bzId: $bzId, edgeField: urf, tempId: $tempId }),\n\t\t\t\t\t\t)\n\t\t\t\t\t: traverse(block[urf], { bzId: $bzId, edgeField: urf, tempId: $tempId });\n\n\t\t\t\t//2 fill the arrays. We need this with refFields as well because in surrealdb we need to apply link operations at the end in case the order is incorrect\n\t\t\t\tconst children = (isArray(block[urf]) ? block[urf] : [block[urf]]).filter(\n\t\t\t\t\t(x) => x !== null && x !== undefined,\n\t\t\t\t) as EnrichedBQLMutationBlock[];\n\n\t\t\t\tconst childMeta = oFilter(\n\t\t\t\t\tblock,\n\t\t\t\t\t(k: string | symbol) => isSymbol(k) || k.startsWith('$'),\n\t\t\t\t) as EnrichedBQLMutationBlock;\n\n\t\t\t\tconst filteredChildren = children.map((child) =>\n\t\t\t\t\tchild.$op ? `$⟨${child.$bzId}⟩` : parseValueSurrealDB(child, 'FLEX'),\n\t\t\t\t);\n\n\t\t\t\tif (filteredChildren.length > 0) {\n\t\t\t\t\tresult.references.push({\n\t\t\t\t\t\t...childMeta,\n\t\t\t\t\t\t[urf]: filteredChildren,\n\t\t\t\t\t\t$op: 'replace' as BormOperation, //Probably add / replace/ remove byt lets do only replaces for now\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t};\n\n\tconst treeItems = Array.isArray(tree) ? tree : [tree];\n\ttreeItems.forEach((item) => traverse(item));\n\n\t//order by $Op, first unlink, then link\n\tconst orderedEdges = [...result.edges].sort((a, b) => {\n\t\tconst order = ['unlink', 'link'];\n\t\treturn order.indexOf(a.$op) - order.indexOf(b.$op);\n\t});\n\n\t//console.log('tree:', JSON.stringify(tree, null, 2));\n\t//console.log('flat:', JSON.stringify(result, null, 2));\n\n\treturn {\n\t\t...result,\n\t\tedges: orderedEdges,\n\t};\n};\n","import type {\n\tBQLMutation,\n\tBQLMutationBlock,\n\tBormConfig,\n\tDBHandles,\n\tEnrichedBQLMutationBlock,\n\tEnrichedBormSchema,\n} from '../../types';\nimport { enrichBQLMutation } from './bql/enrich';\nimport { parseBQLMutation } from './bql/parse';\nimport { mutationPreQuery } from './bql/preQuery';\n\nimport { createMachine, transition, reduce, guard, interpret, state, invoke } from '../robot3';\nimport { stringify } from './bql/stringify';\nimport { preHookDependencies } from './bql/enrichSteps/preHookDependencies';\nimport { dependenciesGuard } from './bql/guards/dependenciesGuard';\nimport { runTypeDbMutationMachine } from './tql/machine';\nimport { runSurrealDbMutationMachine } from './surql/machine';\nimport type { FlatBqlMutation } from './bql/flatter';\nimport { flattenBQLMutation } from './bql/flatter';\nimport { VERSION } from '../../version';\nimport { logDebug } from '../../logger';\n\nconst final = state;\n\nexport type bqlMutationContext = {\n\traw: BQLMutationBlock | BQLMutationBlock[];\n\tenriched: EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[];\n\tflat: FlatBqlMutation;\n\tthings: any[];\n\tedges: any[];\n\tres: any[];\n};\n\ntype MachineContext = {\n\tbql: bqlMutationContext;\n\tschema: EnrichedBormSchema;\n\tconfig: BormConfig;\n\thandles: DBHandles;\n\tdepthLevel: number;\n\terror: string | null;\n};\n\n// Reducer\n// ============================================================================\n\nconst updateBqlReq = (ctx: MachineContext, event: any) => {\n\tif (!event.data) {\n\t\t///when preQueries return nothing, that should not affect the ctx\n\t\treturn ctx;\n\t}\n\treturn {\n\t\t...ctx,\n\t\tbql: { ...ctx.bql, enriched: event.data },\n\t};\n};\n\nconst updateThingsEdges = (ctx: MachineContext, event: any) => {\n\treturn {\n\t\t...ctx,\n\t\tbql: {\n\t\t\t...ctx.bql,\n\t\t\tthings: event.data.mergedThings,\n\t\t\tedges: event.data.mergedEdges,\n\t\t},\n\t};\n};\n\nconst updateBQLFlat = (ctx: MachineContext, event: any) => {\n\treturn {\n\t\t...ctx,\n\t\tbql: {\n\t\t\t...ctx.bql,\n\t\t\tflat: event.data || 'test',\n\t\t},\n\t};\n};\n\nconst updateBQLRes = (ctx: MachineContext, event: any) => {\n\treturn {\n\t\t...ctx,\n\t\tbql: {\n\t\t\t...ctx.bql,\n\t\t\tres: event.data,\n\t\t},\n\t};\n};\n\n// Actors\n// ============================================================================\n\nconst enrich = async (ctx: MachineContext) => {\n\tlogDebug(\n\t\t`>>> mutationMachine/enrich[${VERSION}]`,\n\t\tJSON.stringify(Object.keys(ctx.bql.enriched).length ? ctx.bql.enriched : ctx.bql.raw),\n\t);\n\tconst enriched = Object.keys(ctx.bql.enriched).length\n\t\t? enrichBQLMutation(ctx.bql.enriched, ctx.schema, ctx.config)\n\t\t: enrichBQLMutation(ctx.bql.raw, ctx.schema, ctx.config);\n\treturn enriched;\n};\n\nconst preQuery = async (ctx: MachineContext) => {\n\tlogDebug(`>>> mutationMachine/preQuery[${VERSION}]`, JSON.stringify(ctx.bql.enriched));\n\treturn mutationPreQuery(ctx.bql.enriched, ctx.schema, ctx.config, ctx.handles);\n};\n\nconst preQueryDependencies = async (ctx: MachineContext) => {\n\tlogDebug(`>>> mutationMachine/preQueryDependencies[${VERSION}]`, JSON.stringify(ctx.bql.enriched));\n\treturn preHookDependencies(ctx.bql.enriched, ctx.schema, ctx.config, ctx.handles);\n};\n\nconst parseBQL = async (ctx: MachineContext) => {\n\tlogDebug(`>>> mutationMachine/parseBQL[${VERSION}]`, JSON.stringify(ctx.bql.enriched));\n\treturn parseBQLMutation(ctx.bql.enriched, ctx.schema);\n};\n\nconst flattenBQL = async (ctx: MachineContext) => {\n\tlogDebug(`>>> mutationMachine/flattenBQL[${VERSION}]`, JSON.stringify(ctx.bql.enriched));\n\treturn flattenBQLMutation(ctx.bql.enriched, ctx.schema);\n};\n\n// Guards\n// ============================================================================\nconst requiresPreQuery = (ctx: MachineContext) => {\n\tconst { dbConnectors } = ctx.config;\n\tif (dbConnectors.length !== 1) {\n\t\tthrow new Error('Multiple providers not supported yet in mutations');\n\t}\n\tconst [{ provider }] = dbConnectors;\n\n\tif (provider === 'typeDB') {\n\t\treturn true;\n\t}\n\tif (provider === 'surrealDB') {\n\t\treturn false;\n\t}\n\tthrow new Error(`Unsupported provider ${provider}.`);\n};\n\nconst requiresPreHookDependencies = (ctx: MachineContext) => {\n\treturn dependenciesGuard(ctx.bql.enriched);\n};\n\n// Transitions\n// ============================================================================\n\nconst errorTransition = transition(\n\t'error',\n\t'error',\n\treduce((ctx: MachineContext, event: any) => {\n\t\treturn {\n\t\t\t...ctx,\n\t\t\terror: event.error,\n\t\t};\n\t}),\n);\n\nexport const machine = createMachine(\n\t'stringify',\n\t{\n\t\tstringify: invoke(\n\t\t\tasync (ctx: MachineContext) => {\n\t\t\t\tlogDebug(`>>> mutationMachine/stringify[${VERSION}]`, JSON.stringify(ctx.bql.raw));\n\t\t\t\treturn stringify(ctx.bql.raw, ctx.schema);\n\t\t\t},\n\t\t\ttransition('done', 'enrich', reduce(updateBqlReq)),\n\t\t\terrorTransition,\n\t\t),\n\t\tenrich: invoke(\n\t\t\tenrich,\n\t\t\ttransition('done', 'preQuery', guard(requiresPreQuery), reduce(updateBqlReq)),\n\t\t\ttransition('done', 'parseBQL', reduce(updateBqlReq)),\n\t\t\terrorTransition,\n\t\t),\n\t\tpreQuery: invoke(\n\t\t\tpreQuery,\n\t\t\ttransition('done', 'preHookDependencies', guard(requiresPreHookDependencies), reduce(updateBqlReq)),\n\t\t\ttransition('done', 'parseBQL', reduce(updateBqlReq)),\n\t\t\terrorTransition,\n\t\t),\n\t\tpreHookDependencies: invoke(\n\t\t\tpreQueryDependencies,\n\t\t\ttransition('done', 'enrich', reduce(updateBqlReq)),\n\t\t\terrorTransition,\n\t\t),\n\t\tparseBQL: invoke(parseBQL, transition('done', 'flattenBQL', reduce(updateThingsEdges)), errorTransition),\n\t\tflattenBQL: invoke(flattenBQL, transition('done', 'adapter', reduce(updateBQLFlat)), errorTransition),\n\t\tadapter: invoke(\n\t\t\tasync (ctx: MachineContext) => {\n\t\t\t\tlogDebug(\n\t\t\t\t\t`>>> mutationMachine/adapter[${VERSION}]`,\n\t\t\t\t\tJSON.stringify({ enriched: ctx.bql.enriched, flat: ctx.bql.flat }),\n\t\t\t\t);\n\t\t\t\t//todo: do this properly with multiple providers\n\t\t\t\tconst { dbConnectors } = ctx.config;\n\t\t\t\tif (dbConnectors.length !== 1) {\n\t\t\t\t\tthrow new Error('Multiple providers not supported yet in mutations');\n\t\t\t\t}\n\t\t\t\tconst [{ provider }] = dbConnectors;\n\n\t\t\t\tif (provider === 'typeDB') {\n\t\t\t\t\treturn runTypeDbMutationMachine(\n\t\t\t\t\t\tctx.bql.raw,\n\t\t\t\t\t\tctx.bql.enriched,\n\t\t\t\t\t\tctx.bql.things,\n\t\t\t\t\t\tctx.bql.edges,\n\t\t\t\t\t\tctx.schema,\n\t\t\t\t\t\tctx.config,\n\t\t\t\t\t\tctx.handles,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (provider === 'surrealDB') {\n\t\t\t\t\t//console.log('things!', ctx.bql.flat.things);\n\t\t\t\t\t//console.log('edges!', ctx.bql.flat.edges);\n\t\t\t\t\treturn runSurrealDbMutationMachine(\n\t\t\t\t\t\tctx.bql.raw,\n\t\t\t\t\t\tctx.bql.enriched,\n\t\t\t\t\t\tctx.bql.flat,\n\t\t\t\t\t\tctx.schema,\n\t\t\t\t\t\tctx.config,\n\t\t\t\t\t\tctx.handles,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthrow new Error(`Unsupported provider ${provider}.`);\n\t\t\t},\n\t\t\ttransition('done', 'success', reduce(updateBQLRes)),\n\t\t\terrorTransition,\n\t\t),\n\t\tsuccess: final(),\n\t\terror: final(),\n\t},\n\t(ctx: MachineContext) => ctx,\n);\n\nexport const awaitMachine = async (context: MachineContext) => {\n\treturn new Promise<MachineContext>((resolve, reject) => {\n\t\tinterpret(\n\t\t\tmachine,\n\t\t\t(service) => {\n\t\t\t\tif (service.machine.state.name === 'success') {\n\t\t\t\t\tresolve(service.context);\n\t\t\t\t}\n\t\t\t\tif (service.machine.state.name === 'error') {\n\t\t\t\t\treject(service.context);\n\t\t\t\t}\n\t\t\t},\n\t\t\tcontext,\n\t\t);\n\t});\n};\n\nexport const runMutationMachine = async (\n\tmutation: BQLMutation,\n\tschema: EnrichedBormSchema,\n\tconfig: BormConfig,\n\thandles: DBHandles,\n) => {\n\treturn awaitMachine({\n\t\tbql: {\n\t\t\traw: mutation,\n\t\t\tenriched: {} as EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[],\n\t\t\tthings: [],\n\t\t\tedges: [],\n\t\t\tflat: {\n\t\t\t\tthings: [],\n\t\t\t\tedges: [],\n\t\t\t\tarcs: [],\n\t\t\t\treferences: [],\n\t\t\t},\n\t\t\tres: [],\n\t\t},\n\t\tschema: schema as EnrichedBormSchema,\n\t\tconfig: config,\n\t\thandles: handles,\n\t\tdepthLevel: 0,\n\t\terror: null,\n\t});\n};\n","import type { QueryParameters, QueryResult } from 'surrealdb';\nimport Surreal, { ConnectionStatus } from 'surrealdb';\n\nconst QUEUE_TIMEOUT = 5000; // The max duration a query is queued before \"Timeout\" error is thrown.\nconst QUERY_TIMEOUT = 180000; // The max duration a query is run before \"Timeout\" error is thrown.\nconst RECONNECT_INTERVAL = 2000; // Check the connection every `RECONNECT_INTERVAL` and reconnect it if it's not connected.\nconst INITIAL_RECONNECT_INTERVAL = 1000; // If it's failed to reconnect wait with exponential backoff with this initial interval and then try to reconnect again.\nconst MAX_RECONNECT_RETRY_INTERVAL = 60000; // If the reconnection failed wait with exponential backoff with this max interval and then try to reconnect again.\n\nclass SurrealClient {\n\tprivate db: Surreal;\n\tprivate url: string;\n\tprivate username: string;\n\tprivate password: string;\n\tprivate namespace: string;\n\tprivate database: string;\n\tprivate isConnecting: boolean;\n\tprivate reconnectInterval: ReturnType<typeof setInterval> | null;\n\n\tconstructor(params: { url: string; username: string; password: string; namespace: string; database: string }) {\n\t\tthis.db = new Surreal();\n\t\tthis.url = params.url;\n\t\tthis.username = params.username;\n\t\tthis.password = params.password;\n\t\tthis.namespace = params.namespace;\n\t\tthis.database = params.database;\n\t\tthis.isConnecting = false;\n\t\tthis.reconnectInterval = null;\n\t}\n\n\tprivate async _connect() {\n\t\tif (\n\t\t\tthis.isConnecting ||\n\t\t\tthis.db.status === ConnectionStatus.Connecting ||\n\t\t\tthis.db.status === ConnectionStatus.Connected\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tthis.isConnecting = true;\n\t\tthis.db = new Surreal();\n\t\tlet retryTimeout = Math.max(INITIAL_RECONNECT_INTERVAL, 1);\n\t\t// eslint-disable-next-line no-constant-condition\n\t\twhile (true) {\n\t\t\tlet failed = false;\n\t\t\ttry {\n\t\t\t\tawait this.db.connect(this.url, {\n\t\t\t\t\tnamespace: this.namespace,\n\t\t\t\t\tdatabase: this.database,\n\t\t\t\t\tauth: {\n\t\t\t\t\t\tusername: this.username,\n\t\t\t\t\t\tpassword: this.password,\n\t\t\t\t\t},\n\t\t\t\t\tversionCheck: false,\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t} catch (e) {\n\t\t\t\tfailed = true;\n\t\t\t\tawait this.close();\n\t\t\t\tif (this.isClosed) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (failed) {\n\t\t\t\tawait sleep((1 + Math.random() * 0.1) * retryTimeout);\n\t\t\t\tretryTimeout = Math.min(2 * retryTimeout, MAX_RECONNECT_RETRY_INTERVAL);\n\t\t\t\tawait this._connect();\n\t\t\t}\n\t\t}\n\t\tthis.isConnecting = false;\n\t}\n\n\tasync connect() {\n\t\tif (this.isClosed) {\n\t\t\tthis.reconnectInterval = setInterval(() => this._connect(), RECONNECT_INTERVAL);\n\t\t}\n\t\treturn this._connect();\n\t}\n\n\tasync close() {\n\t\tif (this.reconnectInterval !== null) {\n\t\t\tclearInterval(this.reconnectInterval);\n\t\t\tthis.reconnectInterval = null;\n\t\t\ttry {\n\t\t\t\tawait this.db.close();\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error('Trying to close an already closed connection:', e);\n\t\t\t}\n\t\t}\n\t}\n\n\tget isClosed() {\n\t\treturn this.reconnectInterval === null;\n\t}\n\n\tprivate async run<T>(cb: (db: Surreal) => Promise<T>): Promise<T> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\tthis.close();\n\t\t\t\tthis.connect();\n\t\t\t\treject(new Error('Timeout'));\n\t\t\t}, QUERY_TIMEOUT);\n\t\t\tthis.connect()\n\t\t\t\t.then(() => {\n\t\t\t\t\tcb(this.db)\n\t\t\t\t\t\t.then(resolve)\n\t\t\t\t\t\t.catch(reject)\n\t\t\t\t\t\t.finally(() => {\n\t\t\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t\t.catch(reject);\n\t\t});\n\t}\n\n\tasync query<T = unknown>(...args: QueryParameters): Promise<T[]> {\n\t\treturn this.run((db) => {\n\t\t\treturn db.query(...args);\n\t\t});\n\t}\n\n\tasync query_raw<T = unknown>(...args: QueryParameters): Promise<QueryResult<T>[]> {\n\t\treturn this.run((db) => {\n\t\t\treturn db.query_raw(...args);\n\t\t});\n\t}\n}\n\nconst sleep = async (timeout: number) => {\n\treturn new Promise((resolve) => {\n\t\tsetTimeout(resolve, timeout);\n\t});\n};\n\ninterface QueueItem {\n\tcb: (err?: any, client?: SurrealClient) => void;\n\ttimeout: () => boolean;\n}\n\nexport class SurrealPool {\n\tprivate queue: QueueItem[]; // TODO: Make this more sophisticated\n\tprivate connections: SurrealClient[]; // TODO: Make this more sophisticated\n\n\tconstructor(params: {\n\t\turl: string;\n\t\tusername: string;\n\t\tpassword: string;\n\t\tnamespace: string;\n\t\tdatabase: string;\n\t\ttotalConnections: number;\n\t}) {\n\t\tconst { totalConnections, ...clientParams } = params;\n\t\tthis.queue = [];\n\t\tthis.connections = new Array(totalConnections).fill(0).map(() => {\n\t\t\tconst client = new SurrealClient(clientParams);\n\t\t\tclient.connect();\n\t\t\treturn client;\n\t\t});\n\t}\n\n\tprivate async dequeue() {\n\t\tif (this.queue.length === 0 || this.connections.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tconst q = this.queue[0] as QueueItem;\n\t\tthis.queue = this.queue.slice(1);\n\t\tif (q.timeout()) {\n\t\t\tq.cb(new Error('Timeout'), undefined);\n\t\t\tthis.dequeue();\n\t\t\treturn;\n\t\t}\n\n\t\tconst con = this.connections.pop() as SurrealClient;\n\n\t\ttry {\n\t\t\tq.cb(undefined, con);\n\t\t} catch (err) {\n\t\t\tq.cb(err, undefined);\n\t\t} finally {\n\t\t\tthis.connections.push(con);\n\t\t\tthis.dequeue();\n\t\t}\n\t}\n\n\tprivate async run<T>(cb: (err?: any, client?: SurrealClient) => Promise<T>): Promise<T> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet isTimeout = false;\n\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\tisTimeout = true;\n\t\t\t\treject(new Error('Timeout'));\n\t\t\t}, QUEUE_TIMEOUT);\n\t\t\tthis.queue.push({\n\t\t\t\tcb: (err, client) => {\n\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\tcb(err, client)\n\t\t\t\t\t\t.then((res) => resolve(res))\n\t\t\t\t\t\t.catch((e) => reject(e));\n\t\t\t\t},\n\t\t\t\ttimeout: () => isTimeout,\n\t\t\t});\n\t\t\tthis.dequeue();\n\t\t});\n\t}\n\n\tasync query<T = unknown>(...args: QueryParameters): Promise<T[]> {\n\t\treturn this.run((err, client) => {\n\t\t\tif (client) {\n\t\t\t\treturn client.query<T>(...args);\n\t\t\t}\n\t\t\tthrow err;\n\t\t});\n\t}\n\n\tasync query_raw<T = unknown>(...args: QueryParameters): Promise<QueryResult<T>[]> {\n\t\treturn this.run((err, client) => {\n\t\t\tif (client) {\n\t\t\t\treturn client.query_raw<T>(...args);\n\t\t\t}\n\t\t\tthrow err;\n\t\t});\n\t}\n}\n\nexport class SimpleSurrealClient {\n\tprivate url: string;\n\tprivate username: string;\n\tprivate password: string;\n\tprivate namespace: string;\n\tprivate database: string;\n\n\tconstructor(params: { url: string; username: string; password: string; namespace: string; database: string }) {\n\t\tthis.url = params.url;\n\t\tthis.username = params.username;\n\t\tthis.password = params.password;\n\t\tthis.namespace = params.namespace;\n\t\tthis.database = params.database;\n\t}\n\n\tprivate async run<T>(cb: (db: Surreal) => Promise<T>): Promise<T> {\n\t\tconst db = new Surreal();\n\t\ttry {\n\t\t\tawait db.connect(this.url, {\n\t\t\t\tnamespace: this.namespace,\n\t\t\t\tdatabase: this.database,\n\t\t\t\tauth: {\n\t\t\t\t\tusername: this.username,\n\t\t\t\t\tpassword: this.password,\n\t\t\t\t},\n\t\t\t\tversionCheck: false,\n\t\t\t});\n\t\t\treturn await cb(db);\n\t\t} finally {\n\t\t\tawait db.close();\n\t\t}\n\t}\n\n\tasync query<T = unknown>(...args: QueryParameters): Promise<T[]> {\n\t\treturn this.run<T[]>((db) => db.query(...args));\n\t}\n\n\tasync query_raw<T = unknown>(...args: QueryParameters): Promise<QueryResult<T>[]> {\n\t\treturn this.run<QueryResult<T>[]>((db) => db.query_raw(...args));\n\t}\n}\n"]}
1
+ {"version":3,"sources":["../src/default.config.ts","../src/adapters/typeDB/schema/define.ts","../src/adapters/surrealDB/helpers.ts","../src/adapters/surrealDB/parsing/values.ts","../src/adapters/surrealDB/parsing/parseFlexVal.ts","../src/adapters/surrealDB/schema/define.ts","../src/define/index.ts","../src/helpers.ts","../src/types/symbols/index.ts","../src/adapters/index.ts","../src/adapters/surrealDB/enrichSchema/helpers.ts","../src/stateMachine/mutation/bql/shared/getOppositePlayers.ts","../src/stateMachine/mutation/bql/enrichSteps/replaces.ts","../src/stateMachine/mutation/bql/shared/validateOp.ts","../src/stateMachine/mutation/bql/shared/getOp.ts","../src/stateMachine/mutation/bql/enrichSteps/rootMeta.ts","../src/stateMachine/mutation/bql/shared/doActions.ts","../src/stateMachine/mutation/bql/enrichSteps/splitIds.ts","../src/stateMachine/mutation/bql/shared/get$bzId.ts","../src/stateMachine/mutation/bql/enrichSteps/enrichChildren.ts","../src/engine/helpers.ts","../src/engine/compute.ts","../src/stateMachine/mutation/bql/enrichSteps/computeFields.ts","../src/stateMachine/mutation/bql/shared/getTriggeredActions.ts","../src/stateMachine/mutation/bql/enrichSteps/preHookValidations.ts","../src/stateMachine/mutation/bql/enrichSteps/preHookTransformations.ts","../src/stateMachine/mutation/bql/enrichSteps/unlinkAll.ts","../src/stateMachine/mutation/bql/guards/dependenciesGuard.ts","../src/stateMachine/query/bql/enrich.ts","../src/stateMachine/mutation/bql/enrichSteps/preValidate.ts","../src/stateMachine/mutation/bql/enrich.ts","../tests/helpers/matchers.ts","../src/stateMachine/mutation/bql/parse.ts","../src/stateMachine/mutation/bql/preQuery.ts","../src/stateMachine/robot3/index.ts","../src/stateMachine/query/bql/clean.ts","../src/stateMachine/query/postHook.ts","../src/adapters/surrealDB/filters/filters.ts","../src/stateMachine/query/surql/build.ts","../src/version.ts","../src/logger.ts","../src/stateMachine/query/surql/run.ts","../src/stateMachine/query/surql/parse.ts","../src/stateMachine/query/surql/buildRefs.ts","../src/stateMachine/query/surql/machine.ts","../src/stateMachine/query/tql/build.ts","../src/stateMachine/query/tql/filters.ts","../src/stateMachine/query/tql/parse.ts","../src/adapters/typeDB/helpers.ts","../src/stateMachine/query/tql/run.ts","../src/stateMachine/query/tql/machine.ts","../src/stateMachine/query/queryMachine.ts","../src/stateMachine/mutation/bql/stringify.ts","../src/stateMachine/mutation/bql/enrichSteps/preHookDependencies.ts","../src/adapters/typeDB/parseFlexVal.ts","../src/stateMachine/mutation/tql/build.ts","../src/stateMachine/mutation/tql/parse.ts","../src/stateMachine/mutation/tql/run.ts","../src/stateMachine/mutation/tql/machine.ts","../src/stateMachine/mutation/surql/build.ts","../src/stateMachine/mutation/surql/run.ts","../src/stateMachine/mutation/surql/parse.ts","../src/stateMachine/mutation/surql/machine.ts","../src/stateMachine/mutation/bql/flatter.ts","../src/stateMachine/mutation/mutationMachine.ts","../src/adapters/surrealDB/client.ts","../src/index.ts"],"names":["defaultConfig","removeDuplicateObjects","arr","uniqueObjects","uniqueMap","obj","dbPath","contentType","key","convertTQLSchema","connectorId","schema","output","usedAttributes","eName","entityName","entity","dataFields","linkFields","name","field","usedLinkFields","linkField","relation","plays","inherited","rName","relationName","roles","roleName","attributes","attribute","defineTQLSchema","config","dbHandles","typeDBString","session","client","dbName","schemaTransaction","SessionType","TransactionType","sanitizeTableNameSurrealDb","tableName","specialChars","sanitizeNameSurrealDB","value","char","parseFlexValSurrealDB","v","isDate","surrealDBtypeMap","parseValueSurrealDB","ct","dayjs","parsedVal","isArray","INDENTATION","indent","n","indentPar","str","level","line","convertBQLToSurQL","header","entities","convertSchemaItems","relations","utilityFunctions","addUtilityFunctions","items","item","convertSchemaItem","baseDefinition","convertDataFields","convertLinkFields","convertRoles","parentName","fieldType","mapContentTypeToSurQL","dbValue","relationLinkField","lf","targetPath","type","pathToRelation","relationPath","baseField","supportField","role","fieldDefinition","roleEvent","generateRoleEvent","eventName","targetRelationLinkField","targetRelationPath","firstTargetRoleLinkField","firstTargetRolePath","usedLinkField","generateSet","fields","action","path","cardinality","impactedLinkFields","allFields","removalsSet","additionsSet","cardOneEvents","cardManyEvents","validations","defineSURQLSchema","bormDefine","typeDBEntriesFixed","entry","surrealDBEntriesFixed","Schema","QueryPath","StepPrint","EdgeType","EdgeSchema","Path","DBNode","IsTransformed","Parent","FieldSchema","SharedMetadata","SuqlMetadata","adapterContext","getSurrealLinkFieldQueryPath","originalRelation","withExtensionsSchema","linkMode","targetRelationSubTypes","targetRelationThings","targetRole","targetRoleSubTypes","oppositeRoleThings","pathToTunneledRole","getDbPath","thing","shared","oFind","fn","k","oFilter","entries","error","result","tryit","enrichSchema","allLinkedFields","produce","draft","traverse","meta","val","df","mapEntries","refFieldKey","refField","roleKey","extendedSchema","allExtends","ext","deepExtendedThing","deepSchema","deepDf","extendedRelationSchema","extendedRelationSchemaWithOrigin","extendedThingSchema","extendedRefFields","thingTypes","thingPath","withThing","x","thingType","thingDB","linkFieldRelation","getSchemaByThing","queryPath","enrichedRefField","playedBy","$things","playerThingsWithSubTypes","playerThing","subTypes","getQueryPath","playedBySet","thingId","draftSchema","$thing","getCurrentSchema","node","getFieldType","currentSchema","dataFieldSchema","dataField","linkFieldSchema","roleFieldSchema","getIdFieldKey","idField","getThingType","rootNode","getFieldSchema","foundLinkField","foundDataField","foundRoleField","foundRefField","getCardinality","getCurrentFields","availableDataFields","availableLinkFields","availableRefFields","listify","availableRoleFields","availableFields","allowedFields","usedFields","localFilterFields","nestedFilterFields","unidentifiedFields","localFilters","_v","nestedFilters","capitalizeFirstLetter","string","getParentNode","blocks","parent","pathParts","parentPath","getNodeByPath","getSymbols","oldBlock","symbols","symbolKey","isBQLBlock","block","isObject","deepCurrent","current","plainObject","isDraft","assertDefined","msg","depth","_indent","i","genId","customAlphabet","getOppositePlayers","fieldSchema","oppositePlayer","replaceToObj","subNodes","child","oppositePlayers","player","$op","$thingType","base","tempIds","nonTempIds","tempId","replaceToObjRef","sn","validateOp","parentNode","nodeSchema","usedDataFields","validateChildren","subNode","getOp","getOpAndValidate","setRootMeta","withMetadataRootArray","rootOp","doAction","stepName","isSet","splitMultipleIds","transformedChildren","$id","get$bzId","enrichChildren","newNodes","$bzId","refSchema","relationSchema","relFieldSchema","STRIP_COMMENTS","STRIP_KEYWORDS","getParamNames","func","fnBodyStr","paramsBlock","param","p","computeField","currentThing","mandatoryDependencies","missingArgs","arg","computeFields","currentNode","computedFields","virtualFields","filledFields","attKey","virtualFilledFields","fieldPath","currentFieldDef","currentLinkedDef","currentRoleDef","currentDef","defaultValue","getTriggeredActions","hooks","currentEvent","hook","preHookValidations","requiredFields","enumFields","fnValidatedFields","enumOptions","clone","userContext","dbNode","validationResult","preHookTransformations","triggeredActions","workingNode","newProps","unlinkAll","uuidv4","dependenciesGuard","mut","o","enrichBQLQuery","rawBqlQuery","batches","context","enrichFilter","checkFilterByUnique","newFields","processed","processField","getAllFields","f","isId","roleFields","refFields","$filter","fieldFilter","isIdField","isUniqueDataField","isSingle$id","filterOperators","eqValue","createDataField","props","fieldStr","$justId","isVirtual","createLinkField","target","oppositeLinkFieldsPlayedBy","idNotIncluded","idFields","createRefField","createRoleField","roleField","wasArray","resultArray","filter","acc","valueAsArray","fieldSchemaTyped","childrenThing","preValidate","paths","cleanPath","cleanStep","dataFieldStep","enrichBQLMutation","rootBlock","has$Fields","toIgnore","lastPath","secondToLastPath","isFilter","relField","rootField","subNodeSchema","uf","usedLinkFieldsSchemas","lf1","lf2","j","deepRemoveMetaData","removeMeta","s","parseBQLMutation","listNodes","nodes","edges","getIdValue","idDataField","defaultIdField","idValue","toNodes","toEdges","edge","currentThingSchema","dataFieldPaths","roleFieldPaths","linkFieldPaths","refFieldPaths","getChildOp","usedRoleFields","usedRefFields","dataObj","shake","pick","edgeSchema","ownRelation","linkTempId","parentId","getLinkObjOp","edgeType1","rolesObjFiltered","rolesObjOnlyIds","objWithMetaDataOnly","getEdgeOp","currentRoles","rolesObjOnlyIdsGrouped","currentRoleCardinality","vNested","edgeType2","totalUnlinks","operations","operationsArray","childOp","operation","op","edgeType3","parsedThings","parsedEdges","mergedThings","existingIndex","t","mergedEdges","curr","existingEdge","r","newRelation","existingVal","currVal","allThings","orphanTempIds","d","valueEnumerable","valueEnumerableWritable","truthy","empty","identity","a","callBoth","par","self","args","callForward","b","create","stack","fns","def","caller","fnType","reduceType","reduce","guardType","guard","Type","makeTransition","from","to","guards","reducers","transitionType","immediateType","transition","enterImmediate","machine","service","event","transitionTo","transitionsToMap","transitions","m","stateType","state","immediates","desc","invokeFnType","machine2","rn","invokeMachineType","data","interpret","invoke","createMachine","states","contextFn","fromEvent","candidates","original","newMachine","send","currentStateName","onChange","initialContext","cleanQueryRes","bqlRes","withPostHooks","queryPostHooks","cleanOutput","symbol","postHooks","enrichedBqlQuery","originalNode","queriedFields","excludedFields","virtualFieldPath","computedValue","excludedField","surqlOperators","parseFilter","surrealDBKey","buildSuqlFilter","parts","logicalOperator","nestedFilter","keyWithoutPrefix","valueKeys","operator","nextValue","surrealOperator","buildSorter","sort","build","queries","query","buildQuery","$fields","$offset","$limit","$sort","lines","fieldLines","buildFieldsQuery","allTypesNormed","$ids","allCombinations","id","parsed","parentQuery","buildFieldQuery","buildAttributeQuery","buildLinkQuery","buildRoleQuery","queryLevel","built","fieldLevel","VERSION","LOG_LEVEL","log","l","logDebug","run","batchedQuery","parse","res","parseRes","parseObj","newObj","parseFieldResult","parseValue","parsedContent","flatNestedField","nf","content","asArray","buildRefs","META","createMetaFields","DATA_FIELDS","createDataFields","EDGE_FIELDS","createEdgeFields","REF_FIELDS","createRefFields","FIELDS","FROM","createRootFromClause","WHERE","SORT","LIMIT","OFFSET","formatId","joinTypes","ids","edgeFields","ef","LINK_FIELDS","rf","errorTransition","ctx","surrealDbQueryMachine","c","awaitQueryMachine","resolve","reject","runSurrealDbQueryMachine","enrichedBql","buildFilter","$nonMappedFilter","$var","mapFilterKeys","$not","rest","matches","isPositiveFilter","notMatches","processPositiveFilter","positiveMatches","isNegated","normalizedKey","subMatches","subFilter","joinedSubMatches","fieldMatches","handleDataFieldFilter","linkMatches","handleLinkFieldFilter","roleMatches","handleRelationRoleFilter","opValue","normalizedOp","match","serializeValue","inAlt","joinAlt","ninMatch","alt","opposite","oppositeIdField","oppVar","playerIdField","playerVar","filterId","filterVar","thingSchema","mapper","newFilter","mapPositiveFilterKeys","filterValue","newKey","separator","buildTQLQuery","$path","$WithIdFilter","sorter","randomId","processDataFields","processLinkFields","processRoleFields","postStrParts","asMetaDataParts","multiVals","postStr","$metaData","multiVal","dotPath","nextDepth","$as","$idNotIncluded","$filterByUnique","$roleVar","withId","withIdFilter","$playedBy","$linkVar","normalizeSorter","sortMatch","attrVar","order","parseTQLQuery","rawBqlRequest","rawTqlRes","rawBql","realParse","schemaValue","parseFields","parsedDataFields","parseDataFields","parsedLinkFields","parseLinkFields","parsedRoleFields","parseRoleFields","keys","dataFieldsKey","multiValKeys","multiValKey","multiValKeyWithout$multiVal","realValue","metaDataKey","dataFieldsThing","$key","parseArrayMetadata","mainDataFields","$asKey","fieldValue","_","roleFieldsRes","$roleFields","$cardinality","as","justId","filterByUnique","parseMetaData","resDataFields","linkFieldsRes","$linkFields","asRegex","justIdRegex","idNotIncludedRegex","filterByUniqueRegex","asMatch","justIdMatch","idNotIncludedMatch","filterByUniqueMatch","converted","jsonString","p1","p2","e","getSessionOrOpenNewOne","singleHandlerV0","runTQLQuery","tqlRequest","options","TypeDBOptions","transaction","err","resArray","parallel","queryString","updateBqlRes","updateTqlReq","updateTqlRes","typeDbQueryMachine","runTypeDbQueryMachine","bql","handles","updateBqlReq","queryMachine","adapters","q","raw","adapter","adapterList","proms","results","orderedResults","index","runQueryMachine","preQueryPathSeparator","grandChildOfCreateSymbol","mutationPreQuery","operatorKeys","getFieldKeys","noDataFields","ops","preQueryReq","processBlock","root","filteredBlock","toRemoveFromRoot","toRemove","extractValueFromFilter","opBlock","newField","preQueryRes","getObjectPath","$objectPath","objectPathToKey","hardId","convertManyPaths","input","prefix","itemsWithBrackets","suffix","cache","newObjPath","cacheKey","cacheArray","fillObjectPaths","bqlWithObjectPaths","fillIds","newBlocks","cacheFound","newBlock","subBlocks","newSubBlocks","bqlFilledIds","newFilled","splitBql","processBlocks","getOperationsWithMultiples","opBlocks","operationWithMultiples","operationWithoutMultiples","otherOps","hasMultiple","ob","getAllKeyCombinations","dataFieldObj","allKeys","combinableKeys","generateCombinations","currentObj","fullObj","newObjInclude","crossReferencedOperations","multipleBlock","combinationsToKeep","combinationBlock","foundKeys","childKey","subBlock","newOps","parentKey","idsOfParent","cKey","originalOp","processReplaces","newOpBlocks","replaceIds","createIds","replaceBlock","cacheIds","unlinkIds","linkIds","processedReplaces","processArrayIdsFound","arrayOfIds","cacheOfIds","isOccupied","filledPaths","stringify","tObject","tree","tField","oppositeThing","preHookDependencies","mutations","transformationPreQueryReq","mutationToQuery","transformationPreQueryRes","setDbNode","FORBIDDEN_ROOT_QUERY_PROP","FORBIDDEN_SUB_QUERY_PROP","fieldMap","getFieldMap","subNodeMap","getNodeMap","subMut","setDbNodeSingle","dataFieldMap","linkFieldMap","roleFieldMap","_mut","getDbNode","newMut","subThing","newNode","isObj","getIdFromDbValue","getDbNodeFromDbValue","map","parseFlexValTypeDB","buildTQLMutation","things","nodeToTypeQL","bzId","defaultDBConnector","thingDbPath","currentDataField","dbField","attributesVar","matchAttributes","idValueTQL","idAttributes","allAttributes","getDeletionMatchInNodes","getInsertionMatchInNodes","edgeToTypeQL","relationDbPath","roleDbPaths","fromRoleFields","roleDbPath","fromRoleFieldsTql","edgeType","relationTql","relationTqlWithoutRoles","getInsertionsInEdges","getInsertionMatchInEdges","getDeletionMatchInEdges","getDeletionsInEdges","toTypeQL","mode","typeQL","preDeletionBatch","insertionMatch","deletionMatch","insertion","deletion","z","y","nodeOperations","arrayNodeOperations","edgeOperations","arrayEdgeOperations","allOperations","parseTQLMutation","tqlRes","reqThings","reqEdges","expected","exp","dbIdd","matchedThings","runTQLMutation","tqlMutation","mutateTransaction","tqlDeletion","tqlInsertion","insertionsStream","insertionsRes","updateTQLMutation","updateTQLRes","typeDbMutationMachine","awaitMutationMachine","runTypeDbMutationMachine","bqRaw","buildSURQLMutation","flat","buildThings","$tempId","sanitizedThings","restString","metaString","dataFieldStrings","VAR","COND","table","TARGET","parentRef","SET","OUTPUT","DELETE_OUTPUT","buildEdges","asArrayOfVars","arrayString","nodesString","roleFieldsString","buildArcs","roleA","roleB","thingsA","thingsB","isMany1","isMany2","buildReferences","refFieldSchema","refFieldsString","runSURQLMutation","batchedMutation","filteredErrorRes","parseSURQLMutation","nulledAtts","withMetaAndId","updateSURQLMutation","updateSURQLRes","surrealDbMutationMachine","runSurrealDbMutationMachine","bqlRaw","bqlFlat","flattenBQLMutation","parentObj","operationMap","edgeMeta","isSymbol","opTypes","filteredEdges","ulf","arc","urf","children","childMeta","filteredChildren","orderedEdges","final","updateThingsEdges","updateBQLFlat","updateBQLRes","enrich","preQuery","preQueryDependencies","parseBQL","flattenBQL","requiresPreQuery","dbConnectors","provider","requiresPreHookDependencies","awaitMachine","runMutationMachine","mutation","SimpleSurrealClient","params","cb","db","Surreal","enableMapSet","BormClient","dbc","clientErr","TypeDB","message","sessionErr","credential","TypeDBCredential","enrichedSchema","#enforceConnection","queryConfig","qConfig","isBatched","errorRes","mutationConfig","mConfig","src_default"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { BormConfig } from './types';\n\nexport const defaultConfig: Partial<BormConfig> = {\n\tquery: {\n\t\tnoMetadata: false,\n\t\tsimplifiedLinks: true,\n\t\tdebugger: false,\n\t\treturnNulls: false,\n\t},\n\n\tmutation: {\n\t\tnoMetadata: false,\n\t\tpreQuery: true,\n\t\tignoreNonexistingThings: false,\n\t},\n};\n","import { SessionType, TransactionType } from 'typedb-driver';\nimport type { BormConfig, DBHandles, EnrichedBormSchema } from '../../../types';\n\ntype Attribute = {\n\tdbPath: string;\n\tcontentType: string;\n};\n\nconst removeDuplicateObjects = (arr: Attribute[]) => {\n\tconst uniqueObjects: Attribute[] = [];\n\n\tconst uniqueMap = new Map();\n\n\tarr.forEach((obj) => {\n\t\tconst { dbPath, contentType } = obj;\n\t\tconst key = `${dbPath}-${contentType}`;\n\n\t\tif (!uniqueMap.has(key)) {\n\t\t\tuniqueMap.set(key, true);\n\t\t\tuniqueObjects.push(obj);\n\t\t}\n\t});\n\n\treturn uniqueObjects;\n};\n\nexport const convertTQLSchema = (connectorId = 'default', schema: EnrichedBormSchema) => {\n\tlet output = '';\n\tconst usedAttributes: Attribute[] = [];\n\n\toutput += '\\n';\n\n\t// CONVERTING ENTITIES\n\n\tObject.keys(schema.entities)\n\t\t.filter((eName) => schema.entities[eName].defaultDBConnector.id === connectorId)\n\t\t.forEach((entityName) => {\n\t\t\tconst entity = schema.entities[entityName];\n\t\t\tconst { dataFields, linkFields, name } = entity;\n\t\t\t// Checks to see if parent already contains these fields\n\n\t\t\toutput += `${name} sub ${'extends' in entity ? entity.extends : 'entity'},\\n`;\n\n\t\t\t// Adding data fields\n\t\t\tif (dataFields && dataFields.length > 0) {\n\t\t\t\tdataFields.forEach((field: any) => {\n\t\t\t\t\tif (field.contentType === 'REF') {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t} //ignore ref types\n\t\t\t\t\tif (field.inherited) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (field.isIdField) {\n\t\t\t\t\t\toutput += `\\towns ${field.dbPath} @key,\\n`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\toutput += `\\towns ${field.dbPath},\\n`;\n\t\t\t\t\t}\n\t\t\t\t\tusedAttributes.push({ dbPath: field.dbPath, contentType: field.contentType });\n\t\t\t\t});\n\t\t\t}\n\t\t\t// Adding link fields\n\t\t\tif (linkFields && linkFields.length > 0) {\n\t\t\t\tconst usedLinkFields: string[] = [];\n\t\t\t\tlinkFields.forEach((linkField) => {\n\t\t\t\t\tconst { relation, plays, inherited } = linkField;\n\t\t\t\t\tif (inherited) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\t//check if the role in the relation is inherited\n\t\t\t\t\tconst isInheritedRole = schema.relations[relation].roles[plays].inherited;\n\t\t\t\t\tif (!isInheritedRole && !usedLinkFields.includes(`${relation}:${plays}`)) {\n\t\t\t\t\t\toutput += `\\tplays ${relation}:${plays},\\n`;\n\t\t\t\t\t\tusedLinkFields.push(`${relation}:${plays}`);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\toutput = output.replace(/,\\s*$/, ';\\n');\n\t\t\toutput += '\\n';\n\t\t});\n\n\t// CONVERTING RELATIONS\n\tObject.keys(schema.relations)\n\t\t.filter((rName) => schema.relations[rName].defaultDBConnector.id === connectorId)\n\t\t.forEach((relationName) => {\n\t\t\tconst relation = schema.relations[relationName];\n\t\t\t// TODO: fix name ts error\n\t\t\tconst { dataFields, roles, name, linkFields } = relation;\n\t\t\t// Checks to see if parent already contains these fields\n\n\t\t\toutput += `${name} sub ${'extends' in relation ? relation.extends : 'relation'},\\n`;\n\t\t\t// Removes ids from data fields, so their attributes aren't repeated\n\n\t\t\t// Adding data fields\n\t\t\tif (dataFields && dataFields.length > 0) {\n\t\t\t\tdataFields.forEach((field: any) => {\n\t\t\t\t\tif (!field.inherited) {\n\t\t\t\t\t\tif (field.isIdField) {\n\t\t\t\t\t\t\toutput += `\\towns ${field.dbPath} @key,\\n`;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\toutput += `\\towns ${field.dbPath},\\n`;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tusedAttributes.push({ dbPath: field.dbPath, contentType: field.contentType });\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\t// Adding role fields\n\t\t\tif (roles) {\n\t\t\t\tObject.keys(roles).forEach((roleName) => {\n\t\t\t\t\tif (!roles[roleName].inherited) {\n\t\t\t\t\t\toutput += `\\trelates ${roleName},\\n`;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\t// Adding link fields\n\t\t\tif (linkFields && linkFields.length > 0) {\n\t\t\t\tconst usedLinkFields: string[] = [];\n\t\t\t\tlinkFields.forEach((linkField) => {\n\t\t\t\t\tconst { plays, relation } = linkField;\n\t\t\t\t\tconst isInheritedRole = schema.relations[relation].roles[plays].inherited;\n\t\t\t\t\tif (!isInheritedRole && !linkField.inherited && !usedLinkFields.includes(`${relation}:${plays}`)) {\n\t\t\t\t\t\toutput += `\\tplays ${linkField.relation}:${plays},\\n`;\n\t\t\t\t\t\tusedLinkFields.push(`${relation}:${plays}`);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\toutput = output.replace(/,\\s*$/, ';\\n');\n\t\t\toutput += '\\n';\n\t\t});\n\n\t// DEFINING ATTRIBUTES\n\n\tlet attributes = 'define\\n\\n';\n\tconst newUsedAttributes = removeDuplicateObjects(usedAttributes);\n\n\tnewUsedAttributes.forEach((attribute: Attribute) => {\n\t\t// All conditions for BORM to TQL attribute types\n\t\tif (attribute.contentType === 'TEXT' || attribute.contentType === 'ID' || attribute.contentType === 'JSON') {\n\t\t\tattributes += `${attribute.dbPath} sub attribute, value string;\\n`;\n\t\t} else if (attribute.contentType === 'EMAIL') {\n\t\t\tattributes += `${attribute.dbPath} sub attribute, value string,\\n`;\n\t\t\tattributes +=\n\t\t\t\t\"\\tregex '^(?=.{1,64}@)[A-Za-z0-9_-]+(\\\\\\\\.[A-Za-z0-9_-]+)*@[^-][A-Za-z0-9-]+(\\\\\\\\.[A-Za-z0-9-]+)*(\\\\\\\\.[A-Za-z]{2,})$';\\n\";\n\t\t} else if (attribute.contentType === 'DATE') {\n\t\t\tattributes += `${attribute.dbPath} sub attribute, value datetime;\\n`;\n\t\t} else if (attribute.contentType === 'BOOLEAN') {\n\t\t\tattributes += `${attribute.dbPath} sub attribute, value boolean;\\n`;\n\t\t} else if (attribute.contentType === 'NUMBER') {\n\t\t\tattributes += `${attribute.dbPath} sub attribute, value long;\\n`;\n\t\t} else if (attribute.contentType === 'FLEX') {\n\t\t\tattributes += `${attribute.dbPath} sub flexAttribute;\\n`;\n\t\t} else if (attribute.contentType === 'REF') {\n\t\t\treturn; //not compatible with typeDB\n\t\t} else {\n\t\t\tthrow new Error(\n\t\t\t\t`Conversion of borm schema to TypeDB schema for data type \"${attribute.contentType}\" is not implemented`,\n\t\t\t);\n\t\t}\n\t});\n\n\tconst utils = `#Tools, reserved for every schema using borm\n\nstringAttribute sub attribute, value string;\nlongAttribute sub attribute, value long;\ndoubleAttribute sub attribute, value double;\nbooleanAttribute sub attribute, value boolean;\ndatetimeAttribute sub attribute, value datetime;\nflexAttribute sub attribute, abstract, value string,\n\towns stringAttribute,\n\towns longAttribute,\n\towns doubleAttribute,\n\towns booleanAttribute,\n\towns datetimeAttribute;\n`;\n\n\treturn `${attributes}\\n\\n${output}\\n${utils}`;\n};\n\nexport const defineTQLSchema = async (\n\tconnectorId: string,\n\tconfig: BormConfig,\n\tschema: EnrichedBormSchema,\n\tdbHandles: DBHandles,\n) => {\n\tif (!dbHandles.typeDB) {\n\t\tthrow new Error('No TypeDB handles found');\n\t}\n\tconst typeDBString = convertTQLSchema(connectorId, schema);\n\tconst session = dbHandles.typeDB.get(connectorId)?.session;\n\tconst client = dbHandles.typeDB.get(connectorId)?.client;\n\tif (!session) {\n\t\tconsole.log('Session Status: ', 'NO SESSION');\n\t\treturn;\n\t}\n\n\tif (!client) {\n\t\tthrow new Error('No TypeDB client found');\n\t}\n\n\tawait session.close();\n\tconst [{ dbName }] = config.dbConnectors;\n\tconst db = await client.databases.get(dbName);\n\tawait db.delete();\n\tawait client.databases.create(dbName);\n\n\tconst schemaSession = await client.session(config.dbConnectors[0].dbName, SessionType.SCHEMA);\n\t//const dataSession = await client.session(config.dbConnectors[0].dbName, SessionType.DATA);\n\n\t// 3. Defining new schema\n\n\tconst schemaTransaction = await schemaSession.transaction(TransactionType.WRITE);\n\n\tawait schemaTransaction.query.define(typeDBString);\n\tawait schemaTransaction.commit();\n\tawait schemaTransaction.close();\n\n\t/*const getSchemaTransaction = await dataSession.transaction(TransactionType.READ);\n\tconst getSchemaQuery = 'match $a sub thing; get $a;';\n\tconst getSchemaStream = await getSchemaTransaction.query.fetch(getSchemaQuery);\n\tconst schemaThings = await getSchemaStream.collect();\n\tconsole.log('schemaThings', schemaThings);\n\t*/\n\treturn typeDBString;\n\t//await getSchemaTransaction.close();\n};\n","export const sanitizeTableNameSurrealDb = (tableName: string) => {\n\treturn tableName.replace(/`/g, '');\n};\n\nconst specialChars = [\n\t' ',\n\t'-',\n\t'+',\n\t'*',\n\t'/',\n\t'=',\n\t'!',\n\t'@',\n\t'#',\n\t'$',\n\t'%',\n\t'^',\n\t'&',\n\t'(',\n\t')',\n\t'[',\n\t']',\n\t'{',\n\t'}',\n\t'|',\n\t'\\\\',\n\t';',\n\t':',\n\t\"'\",\n\t'\"',\n\t',',\n\t'<',\n\t'>',\n\t'.',\n\t'?',\n\t'~',\n\t'`',\n];\n\nexport const sanitizeNameSurrealDB = (value: string) => {\n\t//if tableName includes any of the chars of this array, then wrap it in backticks\n\n\tif (specialChars.some((char) => value.includes(char))) {\n\t\treturn `⟨${value}⟩`;\n\t}\n\treturn value;\n};\n","import { isDate, isArray } from 'radash';\nimport { parseFlexValSurrealDB } from './parseFlexVal';\nimport dayjs from 'dayjs';\n\nexport const surrealDBtypeMap: Record<string, string> = {\n\tTEXT: 'string',\n\tRICH_TEXT: 'string',\n\tLANGUAGE_TEXT: 'string',\n\tPASSWORD: 'string',\n\tURL: 'string',\n\tPHONE: 'string',\n\tID: 'string',\n\tEMAIL: 'string',\n\tNUMBER: 'number',\n\tNUMBER_DECIMAL: 'decimal',\n\tBOOLEAN: 'bool',\n\tDATE: 'datetime',\n\tJSON: 'object',\n\tFLEX: 'bool|bytes|datetime|duration|geometry|number|object|string',\n};\n\nexport const parseValueSurrealDB = (value: unknown, ct?: string): any => {\n\tif (value === null) {\n\t\treturn 'NONE';\n\t}\n\tif (ct) {\n\t\tswitch (ct) {\n\t\t\tcase 'TEXT':\n\t\t\tcase 'RICH_TEXT':\n\t\t\tcase 'LANGUAGE_TEXT':\n\t\t\tcase 'PASSWORD':\n\t\t\tcase 'URL':\n\t\t\tcase 'PHONE':\n\t\t\tcase 'ID':\n\t\t\tcase 'EMAIL':\n\t\t\t\tif (typeof value !== 'string') {\n\t\t\t\t\tthrow new Error(`Invalid value for TEXT type: ${value}`);\n\t\t\t\t}\n\t\t\t\treturn JSON.stringify(value);\n\t\t\tcase 'NUMBER':\n\t\t\tcase 'NUMBER_DECIMAL':\n\t\t\tcase 'BOOLEAN':\n\t\t\tcase 'JSON':\n\t\t\t\treturn value;\n\t\t\tcase 'DATE':\n\t\t\t\tif (typeof value === 'string' && dayjs(value, 'YYYY-MM-DDTHH:mm:ssZ', true).isValid()) {\n\t\t\t\t\treturn `<datetime>\"${value}\"`;\n\t\t\t\t}\n\t\t\t\tif (isDate(value)) {\n\t\t\t\t\treturn `d\"${value.toISOString()}\"`;\n\t\t\t\t}\n\t\t\t\treturn `$<datetime>\"${value}\"`; //let surrealDB try to do the conversion\n\t\t\tcase 'FLEX': {\n\t\t\t\t//dates are potentially defined as strings in flex-values\n\t\t\t\tif (typeof value === 'string' && dayjs(value, 'YYYY-MM-DDTHH:mm:ssZ', true).isValid()) {\n\t\t\t\t\treturn `<datetime>\"${value}\"`;\n\t\t\t\t}\n\t\t\t\t// array elements go throw the parsing\n\t\t\t\tconst parsedVal = isArray(value) ? value.map((v) => parseFlexValSurrealDB(v)) : parseFlexValSurrealDB(value);\n\t\t\t\treturn `${isArray(parsedVal) ? parsedVal.map((v) => v) : parsedVal}`;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`Unsupported data field type ${ct}.`);\n\t\t}\n\t}\n\tthrow new Error(`Failed parsing value ${value} with content type ${ct}`);\n};\n","import { isDate } from 'radash';\n\nexport const parseFlexValSurrealDB = (v: unknown) => {\n\tif (isDate(v)) {\n\t\treturn `d\"${v.toISOString()}\"`;\n\t}\n\tif (typeof v === 'string') {\n\t\treturn `'${v}'`;\n\t}\n\tif (['number', 'boolean'].includes(typeof v)) {\n\t\treturn v;\n\t}\n\tthrow new Error(`Unsupported type ${typeof v}`);\n};\n","import type {\n\tEnrichedBormEntity,\n\tEnrichedBormRelation,\n\tEnrichedBormSchema,\n\tEnrichedDataField,\n\tEnrichedLinkField,\n\tEnrichedRoleField,\n\tValidations,\n} from '../../../types';\nimport { sanitizeNameSurrealDB } from '../helpers';\nimport { parseValueSurrealDB, surrealDBtypeMap } from '../parsing/values';\n\nconst INDENTATION = '\\t' as const;\nconst indent = (n: number): string => INDENTATION.repeat(n);\n\nconst indentPar = (str: string, level: number): string =>\n\tstr\n\t\t.split('\\n')\n\t\t.map((line) => (line.trim() ? `${indent(level)}${line}` : line))\n\t\t.join('\\n');\n\ntype SchemaItem = EnrichedBormEntity | EnrichedBormRelation;\n\nconst convertBQLToSurQL = (schema: EnrichedBormSchema): string => {\n\tconst header = `USE NS test;\nUSE DB test;\n\nBEGIN TRANSACTION;\n`;\n\n\tconst entities = `-- ENTITIES\\n${convertSchemaItems(schema.entities)}`;\n\tconst relations = `\\n-- RELATIONS\\n${convertSchemaItems(schema.relations)}`;\n\tconst utilityFunctions = addUtilityFunctions();\n\n\treturn `${header}${entities}${relations}${utilityFunctions}COMMIT TRANSACTION;`;\n};\n\nconst convertSchemaItems = (items: Record<string, SchemaItem>): string =>\n\tObject.entries(items)\n\t\t.map(([name, item]) => convertSchemaItem(sanitizeNameSurrealDB(name), item, 1))\n\t\t.join('\\n\\n');\n\nconst convertSchemaItem = (name: string, item: SchemaItem, level: number): string => {\n\tconst baseDefinition = `${indent(level)}DEFINE TABLE ${name} SCHEMAFULL PERMISSIONS FULL;${'extends' in item && item.extends ? ` //EXTENDS ${item.extends};` : ''}`;\n\tconst dataFields = indentPar(`-- DATA FIELDS\\n${convertDataFields(item.dataFields ?? [], name, level)}`, level + 1);\n\tconst linkFields = indentPar(`\\n-- LINK FIELDS\\n${convertLinkFields(item.linkFields ?? [], name, level)}`, level + 1);\n\tconst roles = 'roles' in item ? indentPar(`\\n-- ROLES\\n${convertRoles(item.roles, name, level)}`, level + 1) : '';\n\n\treturn `${baseDefinition}\\n${dataFields}${linkFields}${roles}`;\n};\n\nconst convertDataFields = (dataFields: EnrichedDataField[], parentName: string, level: number): string =>\n\tdataFields\n\t\t.map((field) => {\n\t\t\tif (field.path === 'id') {\n\t\t\t\treturn ''; //skip id fields for now, we will migrate it to a different name later like _id\n\t\t\t}\n\t\t\tconst fieldType = mapContentTypeToSurQL(field.contentType, field.validations);\n\t\t\tconst baseDefinition = `${indent(level)}DEFINE FIELD ${field.path} ON TABLE ${parentName}${['FLEX', 'JSON'].includes(field.contentType) ? ' FLEXIBLE' : ''}`; //TTODO: Better type json\n\n\t\t\tif (field.isVirtual) {\n\t\t\t\tconst dbValue = field.dbValue?.surrealDB;\n\t\t\t\tif (!dbValue) {\n\t\t\t\t\treturn ''; //it means is computed in BORM instead\n\t\t\t\t}\n\t\t\t\treturn `${baseDefinition} VALUE ${dbValue};`;\n\t\t\t}\n\t\t\treturn `${baseDefinition} TYPE ${fieldType};`;\n\t\t})\n\t\t.filter(Boolean)\n\t\t.join('\\n');\n\nconst convertLinkFields = (linkFields: EnrichedLinkField[], parentName: string, level: number): string =>\n\tlinkFields\n\t\t.map((linkField) => {\n\t\t\tconst fieldType =\n\t\t\t\t//linkField.cardinality === 'MANY' ? `array<record<${linkField.relation}>>` : `record<${linkField.relation}>`; //todo: uncomment once surrealDB has smart transactions\n\t\t\t\tlinkField.cardinality === 'MANY'\n\t\t\t\t\t? `option<array<record<${linkField.$things.map(sanitizeNameSurrealDB).join('|')}>>>`\n\t\t\t\t\t: `option<record<${linkField.$things.map(sanitizeNameSurrealDB).join('|')}>>`;\n\n\t\t\tconst baseDefinition = `${indent(level)}DEFINE FIELD ${sanitizeNameSurrealDB(linkField.path)} ON TABLE ${parentName}`;\n\n\t\t\tif (linkField.isVirtual) {\n\t\t\t\tconst dbValue = linkField.dbValue?.surrealDB;\n\t\t\t\tif (!dbValue) {\n\t\t\t\t\treturn ''; //it means is computed in BORM instead\n\t\t\t\t}\n\n\t\t\t\treturn `${baseDefinition} VALUE ${dbValue};`;\n\t\t\t}\n\n\t\t\tif (linkField.target === 'role') {\n\t\t\t\tconst relationLinkField = linkFields.find(\n\t\t\t\t\t(lf) => lf.target === 'relation' && lf.relation === linkField.relation,\n\t\t\t\t);\n\t\t\t\tconst targetRole = linkField.oppositeLinkFieldsPlayedBy?.[0];\n\t\t\t\tconst targetPath = targetRole.plays;\n\n\t\t\t\tif (!targetPath || linkField.oppositeLinkFieldsPlayedBy?.length !== 1) {\n\t\t\t\t\tthrow new Error(`Invalid link field: ${linkField.path}`);\n\t\t\t\t}\n\n\t\t\t\tconst type =\n\t\t\t\t\tlinkField.cardinality === 'ONE'\n\t\t\t\t\t\t? `record<${sanitizeNameSurrealDB(linkField.relation)}>`\n\t\t\t\t\t\t: `array<record<${sanitizeNameSurrealDB(linkField.relation)}>>`;\n\n\t\t\t\tconst pathToRelation = sanitizeNameSurrealDB(linkField.pathToRelation || '');\n\t\t\t\tconst relationPath = `${pathToRelation}.${targetPath}`;\n\n\t\t\t\tconst baseField =\n\t\t\t\t\tlinkField.cardinality === 'ONE'\n\t\t\t\t\t\t? `${baseDefinition} VALUE <future> {RETURN SELECT VALUE ${relationPath} FROM ONLY $this};`\n\t\t\t\t\t\t: `${baseDefinition} VALUE <future> {array::distinct(SELECT VALUE array::flatten(${relationPath} || []) FROM ONLY $this)};`;\n\t\t\t\tconst supportField = relationLinkField?.path\n\t\t\t\t\t? ''\n\t\t\t\t\t: `${indent(level + 1)}DEFINE FIELD ${pathToRelation} ON TABLE ${parentName} TYPE option<${type}>;`;\n\n\t\t\t\treturn [baseField, supportField].join('\\n');\n\t\t\t}\n\t\t\tif (linkField.target === 'relation') {\n\t\t\t\tconst fieldDefinition = `${indent(level)}DEFINE FIELD ${sanitizeNameSurrealDB(linkField.path)} ON TABLE ${parentName} TYPE ${fieldType};`;\n\t\t\t\treturn `${fieldDefinition}`;\n\t\t\t}\n\t\t\tthrow new Error(`Invalid link field: ${JSON.stringify(linkField)}`);\n\t\t})\n\t\t.join('\\n');\n\nconst convertRoles = (roles: Record<string, EnrichedRoleField>, parentName: string, level: number): string =>\n\tObject.entries(roles)\n\t\t.map(([roleName, role]) => {\n\t\t\tconst fieldType =\n\t\t\t\trole.cardinality === 'MANY'\n\t\t\t\t\t? `array<record<${role.$things.map(sanitizeNameSurrealDB).join('|')}>>`\n\t\t\t\t\t: `record<${role.$things.map(sanitizeNameSurrealDB).join('|')}>`;\n\t\t\tconst fieldDefinition = `${indent(level)}DEFINE FIELD ${roleName} ON TABLE ${parentName} TYPE option<${fieldType}>;`; //Todo: remove option when surrealDB transactions are smarter.\n\t\t\tconst roleEvent = generateRoleEvent(roleName, parentName, role, level);\n\t\t\treturn `${fieldDefinition}\\n${roleEvent}`;\n\t\t})\n\t\t.join('\\n');\n\nconst generateRoleEvent = (roleName: string, parentName: string, role: EnrichedRoleField, level: number): string => {\n\tconst eventName = `update_${roleName}`;\n\n\tconst targetRelationLinkField = role.playedBy?.find((lf) => lf.target === 'relation');\n\tconst targetRelationPath = targetRelationLinkField?.pathToRelation;\n\tconst firstTargetRoleLinkField = role.playedBy?.find((lf) => lf.target === 'role');\n\tconst firstTargetRolePath = firstTargetRoleLinkField?.pathToRelation;\n\n\tconst usedLinkField = targetRelationLinkField ?? firstTargetRoleLinkField;\n\n\tif (!usedLinkField) {\n\t\tthrow new Error(`Invalid link field: ${JSON.stringify(role)}`);\n\t}\n\n\tconst pathToRelation = sanitizeNameSurrealDB((targetRelationPath ?? firstTargetRolePath) as string);\n\n\tconst generateSet = (fields: { path: string; cardinality: 'ONE' | 'MANY' }[], action: 'remove' | 'add'): string => {\n\t\treturn fields\n\t\t\t.map(({ path, cardinality }) => {\n\t\t\t\tconst operator =\n\t\t\t\t\taction === 'remove' ? (cardinality === 'ONE' ? '=' : '-=') : cardinality === 'ONE' ? '=' : '+=';\n\t\t\t\tconst value = action === 'remove' ? (cardinality === 'ONE' ? 'NONE' : '$before.id') : '$after.id';\n\t\t\t\treturn `${path} ${operator} ${value}`;\n\t\t\t})\n\t\t\t.join(', ');\n\t};\n\n\tconst impactedLinkFields =\n\t\trole.impactedLinkFields?.map((lf) => ({\n\t\t\tpath: lf.path,\n\t\t\tcardinality: lf.cardinality,\n\t\t})) || [];\n\n\tconst directField = { path: pathToRelation, cardinality: usedLinkField.cardinality };\n\tconst allFields = [directField, ...impactedLinkFields];\n\n\tconst removalsSet = generateSet(allFields, 'remove');\n\tconst additionsSet = generateSet(allFields, 'add');\n\n\tconst cardOneEvents = `\n\tIF ($before.${roleName}) THEN {UPDATE $before.${roleName} SET ${removalsSet}} END;\n\tIF ($after.${roleName}) THEN {UPDATE $after.${roleName} SET ${additionsSet}} END;`;\n\n\tconst cardManyEvents = `\n\tLET $edges = fn::get_mutated_edges($before.${roleName}, $after.${roleName});\n\tFOR $unlink IN $edges.deletions {UPDATE $unlink SET ${removalsSet};};\n\tFOR $link IN $edges.additions {${\n\t\tusedLinkField.cardinality === 'ONE'\n\t\t\t? `\n\t\tIF ($link.${pathToRelation}) THEN {UPDATE $link.${pathToRelation} SET ${roleName} ${role.cardinality === 'ONE' ? '= NONE' : '-= $link.id'}} END;` //! This should probably be an independnt event on card one field, that it replaces old one by new one, instead of doing it from here\n\t\t\t: ''\n\t}\n\t\tUPDATE $link SET ${additionsSet};\n\t};`;\n\n\treturn indentPar(\n\t\t`DEFINE EVENT ${eventName} ON TABLE ${parentName} WHEN $before.${roleName} != $after.${roleName} THEN {${role.cardinality === 'ONE' ? cardOneEvents : cardManyEvents}\n};`,\n\t\tlevel + 1,\n\t);\n};\n\nconst mapContentTypeToSurQL = (contentType: string, validations?: Validations): string => {\n\tconst type = validations?.enum\n\t\t? `${validations.enum.map((value: unknown) => parseValueSurrealDB(value, contentType)).join('|')}`\n\t\t: surrealDBtypeMap[contentType];\n\tif (!type) {\n\t\tthrow new Error(`Unknown content type: ${contentType}`);\n\t}\n\n\tif (validations?.required) {\n\t\treturn `${type}`;\n\t}\n\treturn `option<${type}>`;\n};\n\nconst addUtilityFunctions = (): string => `\n-- BORM TOOLS\n\tDEFINE FUNCTION fn::get_mutated_edges(\n\t\t$before_relation: option<array|record>,\n\t\t$after_relation: option<array|record>,\n\t) {\n\t\tLET $notEmptyCurrent = $before_relation ?? [];\n\t\tLET $current = array::flatten([$notEmptyCurrent]);\n\t\tLET $notEmptyResult = $after_relation ?? [];\n\t\tLET $result = array::flatten([$notEmptyResult]);\n\t\tLET $links = array::complement($result, $current);\n\t\tLET $unlinks = array::complement($current, $result);\n\t\t\n\t\tRETURN {\n\t\t\tadditions: $links,\n\t\t\tdeletions: $unlinks\n\t\t};\n\t};\n\n\tDEFINE FUNCTION fn::as_array($var: option<array<record>|record>) { \n\t\tRETURN (type::is::array($var) AND $var) OR [$var]\n\t};\n`;\n\nexport const defineSURQLSchema = (schema: EnrichedBormSchema): string => convertBQLToSurQL(schema);\n","import type { BormConfig, DBHandles, EnrichedBormSchema } from '../types';\nimport { defineTQLSchema } from '../adapters/typeDB/schema/define';\nimport { defineSURQLSchema } from '../adapters/surrealDB/schema/define';\n\nexport const bormDefine = async (config: BormConfig, schema: EnrichedBormSchema, dbHandles: DBHandles) => {\n\tconst schemas = async () => {\n\t\tconst typeDBEntries = await Promise.all(\n\t\t\t[...(dbHandles.typeDB || [])].map(async ([key]) => [key, await defineTQLSchema(key, config, schema, dbHandles)]),\n\t\t);\n\n\t\tconst typeDBEntriesFixed = typeDBEntries.map((entry) => [entry[0], entry[1]] as const);\n\n\t\tconst surrealDBEntries = await Promise.all(\n\t\t\t[...(dbHandles.surrealDB || [])].map(async ([key]) => [key, defineSURQLSchema(schema)]),\n\t\t);\n\n\t\tconst surrealDBEntriesFixed = surrealDBEntries.map((entry) => [entry[0], entry[1]] as const);\n\t\treturn {\n\t\t\ttypeDB: Object.fromEntries(typeDBEntriesFixed),\n\t\t\tsurrealDB: Object.fromEntries(surrealDBEntriesFixed),\n\t\t};\n\t};\n\treturn await schemas();\n\n\t// TYPE DB TRANSACTIONS\n\n\t// 4. Closing sessions\n};\n","/* eslint-disable no-param-reassign */\nimport type { Draft } from 'immer';\nimport { produce, isDraft, current } from 'immer';\nimport type { TraversalCallbackContext, TraversalMeta } from 'object-traversal';\nimport { getNodeByPath, traverse } from 'object-traversal';\nimport { isArray, isObject, listify, mapEntries, tryit } from 'radash';\nimport { SharedMetadata, SuqlMetadata } from './types/symbols';\nimport { customAlphabet } from 'nanoid';\n\n// todo: split helpers between common helpers, typeDBhelpers, dgraphelpers...\nimport type {\n\tBormSchema,\n\tBormRelation,\n\tBQLMutationBlock,\n\tEnrichedBormEntity,\n\tEnrichedBormRelation,\n\tEnrichedBormSchema,\n\tLinkedFieldWithThing,\n\tRawBQLQuery,\n\tDataField,\n\tBormEntity,\n\tFilledBQLMutationBlock,\n\tDBHandles,\n\tDBHandleKey,\n\tThingType,\n\tPositiveFilter,\n\tEnrichedDataField,\n\tEnrichedLinkField,\n\tEnrichedRoleField,\n\tLinkField,\n\tRefField,\n\tEnrichedRefField,\n} from './types';\nimport type { AdapterContext } from './adapters';\nimport { adapterContext } from './adapters';\nimport { getSurrealLinkFieldQueryPath } from './adapters/surrealDB/enrichSchema/helpers';\n\nconst getDbPath = (thing: string, attribute: string, shared?: boolean) =>\n\tshared ? attribute : `${thing}·${attribute}`;\n\nexport const getPath = (dbPath: string) => {\n\tconst parts = dbPath.split('·');\n\treturn parts[parts.length - 1];\n};\n\nexport const oFind = <RemovedKeys extends string, T extends Record<string | number | symbol, any>>(\n\tobj: T,\n\tfn: (k: string | number | symbol, v: any) => boolean,\n): Omit<T, RemovedKeys>[Exclude<keyof T, RemovedKeys>] =>\n\tObject.values(Object.fromEntries(Object.entries(obj).filter(([k, v]) => fn(k, v))))[0];\n\nexport const oFilter = <K extends string | number | symbol, T extends Record<K, any>>(\n\tobj: T,\n\tfn: (k: K, v: any) => boolean,\n): Partial<T> => {\n\tconst entries = Reflect.ownKeys(obj).map((key) => [key, obj[key as keyof T]]);\n\treturn Object.fromEntries(\n\t\tentries.filter(([k, v]) => {\n\t\t\tconst [error, result] = tryit(() => fn(k as K, v))();\n\t\t\treturn error ? false : result;\n\t\t}),\n\t) as Partial<T>;\n};\nexport const enrichSchema = (schema: BormSchema, dbHandles: DBHandles): EnrichedBormSchema => {\n\tconst allLinkedFields: LinkedFieldWithThing[] = [];\n\t// #region 1)\n\n\tconst withExtensionsSchema = produce(schema, (draft) =>\n\t\ttraverse(\n\t\t\tdraft,\n\t\t\t({ key, value, meta }: TraversalCallbackContext) => {\n\t\t\t\tif (meta.depth !== 2) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst val = value as BormEntity | BormRelation;\n\n\t\t\t\tif (key) {\n\t\t\t\t\t//* DATA_FIELDS: Adding default values and metadata to every dataField\n\t\t\t\t\tval.dataFields = val.dataFields?.map((df: DataField | EnrichedDataField) => ({\n\t\t\t\t\t\t...df,\n\t\t\t\t\t\t...(val.idFields?.includes(df.path) ? { isIdField: true } : { isIdField: false }),\n\t\t\t\t\t\tcardinality: df.cardinality || 'ONE',\n\t\t\t\t\t\t//todo: Make this user defined and remove the prefix by default\n\t\t\t\t\t\tdbPath: 'dbPath' in df ? df.dbPath : getDbPath(key, df.path, df.shared), //if it was already defined in a parent, we keep it\n\t\t\t\t\t\t[SharedMetadata]: {\n\t\t\t\t\t\t\tfieldType: 'dataField',\n\t\t\t\t\t\t},\n\t\t\t\t\t})) as EnrichedDataField[];\n\n\t\t\t\t\t//* REFERENCE_FIELDS: Adding default values and metadata to every refField\n\t\t\t\t\tval.refFields = mapEntries(val.refFields || {}, (refFieldKey, refField) => {\n\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\trefFieldKey,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t...refField,\n\t\t\t\t\t\t\t\tcardinality: refField.cardinality || 'ONE',\n\t\t\t\t\t\t\t\tpath: refFieldKey,\n\t\t\t\t\t\t\t\t[SharedMetadata]: {\n\t\t\t\t\t\t\t\t\tfieldType: 'refField',\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t];\n\t\t\t\t\t});\n\n\t\t\t\t\t//* LINK_FIELDS: Adding default values and metadata to every linkField\n\t\t\t\t\tval.linkFields = val.linkFields?.map((lf: LinkField | EnrichedLinkField) => ({\n\t\t\t\t\t\t...lf,\n\t\t\t\t\t\t[SharedMetadata]: {\n\t\t\t\t\t\t\tfieldType: 'linkField',\n\t\t\t\t\t\t},\n\t\t\t\t\t}));\n\n\t\t\t\t\t//* ROLE_FIELDS: Adding default values and metadata to every roleField\n\t\t\t\t\tif ('roles' in val) {\n\t\t\t\t\t\tval.roles = mapEntries(val.roles || {}, (roleKey, role) => {\n\t\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\t\troleKey,\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t...role,\n\t\t\t\t\t\t\t\t\tcardinality: role.cardinality || 'ONE',\n\t\t\t\t\t\t\t\t\t[SharedMetadata]: {\n\t\t\t\t\t\t\t\t\t\tfieldType: 'roleField',\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t];\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (value.extends) {\n\t\t\t\t\tif (!value.defaultDBConnector.as) {\n\t\t\t\t\t\t//todo: Check if we can add the \"as\" as default. When the path of the parent === name of the parent then it's fine. As would be used for those cases where they are not equal (same as path, which is needed only if different names)\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`[Schema] ${key} is extending a thing but missing the \"as\" property in its defaultDBConnector. Path:${meta.nodePath}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\t/// IMPORT THE EXTENDED SCHEMA\n\t\t\t\t\tconst extendedSchema = (draft.entities[value.extends] || draft.relations[value.extends]) as\n\t\t\t\t\t\t| EnrichedBormRelation\n\t\t\t\t\t\t| EnrichedBormEntity;\n\n\t\t\t\t\t/// find out all the thingTypes this thingType is extending\n\t\t\t\t\tconst allExtends = [value.extends, ...(extendedSchema.allExtends || [])];\n\t\t\t\t\tvalue.allExtends = allExtends;\n\t\t\t\t\tvalue as BormEntity | BormRelation;\n\n\t\t\t\t\tallExtends.forEach((ext) => {\n\t\t\t\t\t\tif (draft.entities[ext]) {\n\t\t\t\t\t\t\t//@ts-expect-error : it's normal is just a draft\n\t\t\t\t\t\t\tdraft.entities[ext].subTypes = [key, ...(draft.entities[ext].subTypes || [])];\n\t\t\t\t\t\t} else if (draft.relations[ext]) {\n\t\t\t\t\t\t\t//@ts-expect-error : it's normal is just a draft\n\t\t\t\t\t\t\tdraft.relations[ext].subTypes = [key, ...(draft.relations[ext].subTypes || [])];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthrow new Error(`[Schema] ${key} is extending a thing that does not exist in the schema: ${ext}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tvalue.idFields = extendedSchema.idFields\n\t\t\t\t\t\t? Array.from(new Set((value.idFields || []).concat(extendedSchema.idFields)))\n\t\t\t\t\t\t: value.idFields;\n\n\t\t\t\t\tvalue.dataFields = extendedSchema.dataFields\n\t\t\t\t\t\t? (value.dataFields || []).concat(\n\t\t\t\t\t\t\t\textendedSchema.dataFields.map((df: DataField) => {\n\t\t\t\t\t\t\t\t\t// * Adding dbPath of extended dataFields\n\t\t\t\t\t\t\t\t\tlet deepExtendedThing = value.extends;\n\t\t\t\t\t\t\t\t\tlet deepSchema = schema.entities[deepExtendedThing] || schema.relations[deepExtendedThing];\n\t\t\t\t\t\t\t\t\twhile (!deepSchema.dataFields?.find((deepDf: DataField) => deepDf.path === df.path)) {\n\t\t\t\t\t\t\t\t\t\tdeepExtendedThing = 'extends' in deepSchema ? deepSchema.extends : undefined;\n\t\t\t\t\t\t\t\t\t\tdeepSchema = schema.entities[deepExtendedThing] || schema.relations[deepExtendedThing];\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t\t...df,\n\t\t\t\t\t\t\t\t\t\tinherited: true,\n\t\t\t\t\t\t\t\t\t\tdbPath: 'dbPath' in df ? df.dbPath : getDbPath(deepExtendedThing, df.path, df.shared), //i\n\t\t\t\t\t\t\t\t\t\t[SharedMetadata]: {\n\t\t\t\t\t\t\t\t\t\t\t//@ts-expect-error - Is normal because we are extending it here\n\t\t\t\t\t\t\t\t\t\t\t...df[SharedMetadata],\n\t\t\t\t\t\t\t\t\t\t\t//@ts-expect-error - Is normal because we are extending it here\n\t\t\t\t\t\t\t\t\t\t\tinheritanceOrigin: df[SharedMetadata]?.inheritanceOrigin || value.extends,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: value.dataFields;\n\n\t\t\t\t\t//Only for roles in th extended schema\n\t\t\t\t\tif ('roles' in extendedSchema) {\n\t\t\t\t\t\tconst val = value as BormRelation;\n\t\t\t\t\t\tconst extendedRelationSchema = extendedSchema as BormRelation;\n\t\t\t\t\t\tif (extendedRelationSchema.roles) {\n\t\t\t\t\t\t\tconst extendedRelationSchemaWithOrigin = mapEntries(extendedRelationSchema.roles, (roleKey, role) => {\n\t\t\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\t\t\troleKey,\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t...role,\n\t\t\t\t\t\t\t\t\t\tinherited: true,\n\t\t\t\t\t\t\t\t\t\t[SharedMetadata]: {\n\t\t\t\t\t\t\t\t\t\t\t//@ts-expect-error - Is normal because we are extending it here\n\t\t\t\t\t\t\t\t\t\t\t...role[SharedMetadata],\n\t\t\t\t\t\t\t\t\t\t\t//@ts-expect-error - Is normal because we are extending it here\n\t\t\t\t\t\t\t\t\t\t\tinheritanceOrigin: role[SharedMetadata]?.inheritanceOrigin || value.extends,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t];\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tval.roles = {\n\t\t\t\t\t\t\t\t...(val.roles || {}),\n\t\t\t\t\t\t\t\t...extendedRelationSchemaWithOrigin,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif ('refFields' in extendedSchema) {\n\t\t\t\t\t\tconst val = value as BormRelation | BormEntity;\n\t\t\t\t\t\tconst extendedThingSchema = extendedSchema as BormRelation | BormEntity;\n\t\t\t\t\t\tif (extendedThingSchema.refFields) {\n\t\t\t\t\t\t\tconst extendedRefFields = mapEntries(extendedThingSchema.refFields, (refFieldKey, refField) => {\n\t\t\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\t\t\trefFieldKey,\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t...refField,\n\t\t\t\t\t\t\t\t\t\tinherited: true,\n\t\t\t\t\t\t\t\t\t\t[SharedMetadata]: {\n\t\t\t\t\t\t\t\t\t\t\t//@ts-expect-error - Is normal because we are extending it here\n\t\t\t\t\t\t\t\t\t\t\t...refField[SharedMetadata],\n\t\t\t\t\t\t\t\t\t\t\t//@ts-expect-error - Is normal because we are extending it here\n\t\t\t\t\t\t\t\t\t\t\tinheritanceOrigin: refField[SharedMetadata]?.inheritanceOrigin || value.extends,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t];\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tval.refFields = {\n\t\t\t\t\t\t\t\t...(val.refFields || {}),\n\t\t\t\t\t\t\t\t...extendedRefFields,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tvalue.linkFields = extendedSchema.linkFields\n\t\t\t\t\t\t? (value.linkFields || []).concat(\n\t\t\t\t\t\t\t\textendedSchema.linkFields.map((lf) => ({\n\t\t\t\t\t\t\t\t\t...lf,\n\t\t\t\t\t\t\t\t\tinherited: true,\n\t\t\t\t\t\t\t\t\t[SharedMetadata]: {\n\t\t\t\t\t\t\t\t\t\t...lf[SharedMetadata],\n\t\t\t\t\t\t\t\t\t\tinheritanceOrigin: lf[SharedMetadata]?.inheritanceOrigin || value.extends,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: value.linkFields;\n\n\t\t\t\t\t//todo: Do some checks, and potentially simplify the hooks structure\n\t\t\t\t\tif (extendedSchema?.hooks?.pre) {\n\t\t\t\t\t\tvalue.hooks = value.hooks || {};\n\t\t\t\t\t\tvalue.hooks.pre = value.hooks.pre || [];\n\t\t\t\t\t\tvalue.hooks.pre = [...(extendedSchema?.hooks?.pre || []), ...(value?.hooks?.pre || [])];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\t{ traversalType: 'breadth-first' },\n\t\t),\n\t);\n\t// #endregion\n\n\t// * Gather linkFields\n\ttraverse(schema, ({ key, value, meta }: TraversalCallbackContext) => {\n\t\tif (key === 'linkFields') {\n\t\t\tconst getThingTypes = () => {\n\t\t\t\tif (!meta.nodePath) {\n\t\t\t\t\tthrow new Error('No path');\n\t\t\t\t}\n\t\t\t\tconst [thingPath, thing] = meta.nodePath.split('.');\n\t\t\t\tconst thingType = thingPath === 'entities' ? 'entity' : thingPath === 'relations' ? 'relation' : '';\n\t\t\t\treturn {\n\t\t\t\t\tthing,\n\t\t\t\t\tthingType,\n\t\t\t\t};\n\t\t\t};\n\t\t\tconst thingTypes = getThingTypes();\n\t\t\tconst withThing = !Array.isArray(value)\n\t\t\t\t? [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t...value,\n\t\t\t\t\t\t\t...thingTypes,\n\t\t\t\t\t\t},\n\t\t\t\t\t]\n\t\t\t\t: value.map((x) => ({\n\t\t\t\t\t\t...x,\n\t\t\t\t\t\t...thingTypes,\n\t\t\t\t\t}));\n\n\t\t\tallLinkedFields.push(...withThing);\n\t\t}\n\t});\n\n\t// * Enrich the schema\n\tconst enrichedSchema = produce(withExtensionsSchema, (draft: Partial<EnrichedBormSchema>) =>\n\t\ttraverse(draft, ({ value, key, meta }: TraversalCallbackContext) => {\n\t\t\t// id things\n\t\t\tif (meta.depth === 2 && value.idFields && !value.id) {\n\t\t\t\t// depth 2 are entities and relations\n\t\t\t\t// eslint-disable-next-line prefer-destructuring\n\t\t\t\tvalue.name = key;\n\t\t\t\tconst thingType = () => {\n\t\t\t\t\tif (meta.nodePath?.split('.')[0] === 'entities') {\n\t\t\t\t\t\treturn 'entity';\n\t\t\t\t\t}\n\t\t\t\t\tif (meta.nodePath?.split('.')[0] === 'relations') {\n\t\t\t\t\t\treturn 'relation';\n\t\t\t\t\t}\n\t\t\t\t\tthrow new Error('Unsupported node attributes');\n\t\t\t\t};\n\t\t\t\tvalue.thingType = thingType();\n\t\t\t\t/// We identify the database assigned to this thing\n\t\t\t\t//@ts-expect-error - TODO\n\t\t\t\tconst thingDB: DBHandleKey = Object.keys(dbHandles).find((key) =>\n\t\t\t\t\t// @ts-expect-error - TODO\n\t\t\t\t\tdbHandles[key]?.get(value.defaultDBConnector.id),\n\t\t\t\t);\n\t\t\t\tvalue.db = thingDB as DBHandleKey; //todo\n\t\t\t\tvalue.dbContext = adapterContext[thingDB] as AdapterContext; //todo\n\n\t\t\t\tvalue.dbProviderConfig =\n\t\t\t\t\tthingDB === 'surrealDB' ? dbHandles[thingDB]?.get(value.defaultDBConnector.id)?.providerConfig : undefined;\n\n\t\t\t\t// init the arrays\n\t\t\t\tvalue.computedFields = [];\n\t\t\t\tvalue.virtualFields = [];\n\t\t\t\tvalue.requiredFields = [];\n\t\t\t\tvalue.enumFields = [];\n\t\t\t\tvalue.fnValidatedFields = [];\n\n\t\t\t\t//todo: Maybe move all this to the pre-step and enrich all the linkFields there and same with the roles so then we can usse allLinkFields and allRoles as enriched ones.\n\t\t\t\tif ('linkFields' in value && value.linkFields) {\n\t\t\t\t\tconst val = value as EnrichedBormRelation;\n\n\t\t\t\t\tval.linkFields?.forEach((linkField) => {\n\t\t\t\t\t\t///Check if the path is already in use\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tval.dataFields?.find((df) => df.path === linkField.path) ||\n\t\t\t\t\t\t\tObject.keys(val.roles || {}).includes(linkField.path)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`[Schema] The path ${linkField.path} is already in use by a dataField or linkField in ${val.name}. Path:${meta.nodePath}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst linkFieldRelation = withExtensionsSchema.relations[linkField.relation] as EnrichedBormRelation;\n\n\t\t\t\t\t\tif (!linkField.isVirtual) {\n\t\t\t\t\t\t\t//its ok for virtual linkFields to don't have a relation\n\t\t\t\t\t\t\tif (!linkFieldRelation) {\n\t\t\t\t\t\t\t\tthrow new Error(`The relation ${linkField.relation} does not exist in the schema`);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (linkFieldRelation.roles?.[linkField.plays] === undefined) {\n\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t`The role ${linkField.plays} is not defined in the relation ${linkField.relation} (linkField: ${linkField.path})`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t//#region SHARED METADATA\n\n\t\t\t\t\t\tif (linkField.target === 'relation') {\n\t\t\t\t\t\t\tif (linkField.isVirtual) {\n\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t`[Schema] Virtual linkFields can't target a relation. Thing: \"${val.name}\" LinkField: \"${linkField.path}. Path:${meta.nodePath}.\"`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tlinkField.$things = [linkField.relation, ...(linkFieldRelation.subTypes || [])];\n\t\t\t\t\t\t\tlinkField.oppositeLinkFieldsPlayedBy = [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tplays: linkField.path,\n\t\t\t\t\t\t\t\t\tthing: linkField.relation,\n\t\t\t\t\t\t\t\t\tthingType: 'relation',\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (linkField.target === 'role') {\n\t\t\t\t\t\t\t///target role\n\t\t\t\t\t\t\tlinkField.oppositeLinkFieldsPlayedBy = allLinkedFields.filter(\n\t\t\t\t\t\t\t\t(x) => x.relation === linkField.relation && x.plays !== linkField.plays && x.target === 'role',\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tif (linkField.oppositeLinkFieldsPlayedBy.length === 0) {\n\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t`[Schema] LinkFields require to have at least one opposite linkField playing an opposite role. Thing: \"${val.name}\" LinkField: \"${linkField.path}. Path:${meta.nodePath}.\"`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// This is duplicated here and in playedBy on purpose\n\t\t\t\t\t\t\tlinkField.pathToRelation =\n\t\t\t\t\t\t\t\tval.linkFields?.find((lf) => lf.target === 'relation' && lf.relation === linkField.relation)?.path ??\n\t\t\t\t\t\t\t\tlinkField.relation.toLocaleLowerCase();\n\n\t\t\t\t\t\t\tlinkField.$things = [\n\t\t\t\t\t\t\t\t...new Set(\n\t\t\t\t\t\t\t\t\tlinkField.oppositeLinkFieldsPlayedBy.flatMap((x) => [\n\t\t\t\t\t\t\t\t\t\tx.thing,\n\t\t\t\t\t\t\t\t\t\t...(getSchemaByThing(withExtensionsSchema, x.thing)?.subTypes || []),\n\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t];\n\n\t\t\t\t\t\t\t// #region FILTERING OPPOSITE LINKFIELDS\n\t\t\t\t\t\t\t// const { targetRoles, filter } = linkField;\n\t\t\t\t\t\t\t// Example targetRoles: ['color', 'users']\n\t\t\t\t\t\t\t//Can be combined with filter, for instance to automatically filter by $thing\n\n\t\t\t\t\t\t\t//If after the filters, we still have 2, then the schema is wrong\n\t\t\t\t\t\t\tif (linkField.oppositeLinkFieldsPlayedBy.length > 1) {\n\t\t\t\t\t\t\t\t//temp: lets just warn and add an error only if actually used\n\t\t\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t\t\t`[Schema] LinkField ${linkField.path} in ${val.name} has multiple candidates ${linkField.oppositeLinkFieldsPlayedBy.map((lf) => lf.thing).join(',')} and this is not yet supported. Please target a single one using targetRoles with a single role`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// #endregion\n\t\t\t\t\t\t}\n\t\t\t\t\t\t//#endregion\n\n\t\t\t\t\t\t//#region SUREALDB METADATA\n\n\t\t\t\t\t\tif (value.db === 'surrealDB') {\n\t\t\t\t\t\t\tconst originalRelation =\n\t\t\t\t\t\t\t\tlinkFieldRelation?.roles?.[linkField.plays][SharedMetadata]?.inheritanceOrigin ?? linkField.relation;\n\n\t\t\t\t\t\t\tconst queryPath = getSurrealLinkFieldQueryPath({\n\t\t\t\t\t\t\t\tlinkField,\n\t\t\t\t\t\t\t\toriginalRelation,\n\t\t\t\t\t\t\t\twithExtensionsSchema,\n\t\t\t\t\t\t\t\tlinkMode: value.dbProviderConfig.linkMode,\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tlinkField[SuqlMetadata] = {\n\t\t\t\t\t\t\t\tqueryPath,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// We take the original relation as its the one that holds the name of the relation in surrealDB\n\n\t\t\t\t\t\t//#endregion\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif ('refFields' in value && value.refFields) {\n\t\t\t\t\tvalue.refFields = mapEntries(value.refFields, (refFieldKey: string, refField: RefField) => {\n\t\t\t\t\t\tconst enrichedRefField = {\n\t\t\t\t\t\t\t...refField,\n\t\t\t\t\t\t\tdbPath: refField.dbPath || refFieldKey,\n\t\t\t\t\t\t};\n\t\t\t\t\t\treturn [refFieldKey, enrichedRefField];\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// adding all the linkFields to roles\n\t\t\t\tif ('roles' in value) {\n\t\t\t\t\tconst val = value as EnrichedBormRelation;\n\n\t\t\t\t\tObject.entries(val.roles).forEach(([roleKey, role]) => {\n\t\t\t\t\t\t//Check if the key is used by linkFields or roleFields already\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tval.dataFields?.find((df) => df.path === roleKey) ||\n\t\t\t\t\t\t\tval.linkFields?.find((lf) => lf.path === roleKey)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`[Schema] The path ${roleKey} is already in use by a dataField or linkField in ${val.name}. Path:${meta.nodePath}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst playedBy = allLinkedFields.filter((x) => x.relation === key && x.plays === roleKey) || [];\n\t\t\t\t\t\t// Duplicating path to relation here and in normal linkfields as it is used in both places\n\t\t\t\t\t\trole.playedBy = playedBy.map((lf) => ({\n\t\t\t\t\t\t\t...lf,\n\t\t\t\t\t\t\tpathToRelation:\n\t\t\t\t\t\t\t\tlf.target === 'relation'\n\t\t\t\t\t\t\t\t\t? lf.path\n\t\t\t\t\t\t\t\t\t: (val.linkFields?.find(\n\t\t\t\t\t\t\t\t\t\t\t(lf) => lf.target === 'relation' && lf.relation === key && lf.plays === roleKey,\n\t\t\t\t\t\t\t\t\t\t)?.path ?? lf.relation.toLocaleLowerCase()),\n\t\t\t\t\t\t}));\n\n\t\t\t\t\t\tconst impactedLinkFields = allLinkedFields.filter(\n\t\t\t\t\t\t\t(x) => x.target === 'relation' && x.plays === roleKey && val.allExtends?.includes(x.relation),\n\t\t\t\t\t\t);\n\t\t\t\t\t\trole.impactedLinkFields = impactedLinkFields;\n\n\t\t\t\t\t\trole.path = roleKey;\n\t\t\t\t\t\tconst $things = [\n\t\t\t\t\t\t\t...new Set(\n\t\t\t\t\t\t\t\tplayedBy\n\t\t\t\t\t\t\t\t\t.flatMap((x) => {\n\t\t\t\t\t\t\t\t\t\tconst playerSchema = getSchemaByThing(withExtensionsSchema, x.thing);\n\t\t\t\t\t\t\t\t\t\treturn [...(playerSchema.subTypes || []), x.thing];\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t.flat()\n\t\t\t\t\t\t\t\t\t.filter(Boolean),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t];\n\n\t\t\t\t\t\trole.$things = $things;\n\n\t\t\t\t\t\tconst originalRelation = role[SharedMetadata]?.inheritanceOrigin || value.name;\n\n\t\t\t\t\t\t/*if ($things.length > 1) {\n\t\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t\t`Not supported yet: Role ${roleKey} in ${'name' in value ? value.name : JSON.stringify(value)} is played by multiple things: ${$things.join(', ')}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}*/\n\t\t\t\t\t\t//get all subTyped for each potential player\n\t\t\t\t\t\tconst playerThingsWithSubTypes = $things.flatMap((playerThing) => {\n\t\t\t\t\t\t\tconst playerSchema = getSchemaByThing(schema, playerThing);\n\t\t\t\t\t\t\tconst subTypes = playerSchema?.subTypes || [];\n\t\t\t\t\t\t\treturn [playerThing, ...subTypes];\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tconst getQueryPath = () => {\n\t\t\t\t\t\t\tif (value.dbProviderConfig.linkMode === 'edges') {\n\t\t\t\t\t\t\t\treturn `->\\`${originalRelation}_${roleKey}\\`->(\\`${playerThingsWithSubTypes.join('`,`')}\\`)`;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (value.dbProviderConfig.linkMode === 'refs') {\n\t\t\t\t\t\t\t\tif (role.cardinality === 'MANY') {\n\t\t\t\t\t\t\t\t\treturn `$parent.[\\`${roleKey}\\`]`;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (role.cardinality === 'ONE') {\n\t\t\t\t\t\t\t\t\treturn `$parent.\\`${roleKey}\\``;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthrow new Error('Unsupported linkMode');\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tif (value.db === 'surrealDB') {\n\t\t\t\t\t\t\tconst queryPath = getQueryPath();\n\n\t\t\t\t\t\t\trole[SuqlMetadata] = {\n\t\t\t\t\t\t\t\tqueryPath,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// role fields\n\t\t\tif (value && typeof value === 'object' && 'playedBy' in value) {\n\t\t\t\t// if (value.playedBy.length > 1) {\n\t\t\t\tconst playedBySet = [...new Set(value.playedBy.map((x: LinkedFieldWithThing) => x.thing))];\n\t\t\t\tif (playedBySet.length > 1) {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t`[Schema] roleFields can be only played by one thing. Role: ${key}, path:${meta.nodePath}, played by: ${playedBySet.join(', ')}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (value.playedBy.length === 0) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`[Schema] roleFields should be played at least by one thing. Role: ${key}, path:${meta.nodePath}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//if default or computed, add to computed fields list\n\t\t\tif (meta.depth === 4) {\n\t\t\t\tconst [type, thingId] = meta.nodePath?.split('.') || [];\n\t\t\t\t//todo change \"type\" to \"thingType\"\n\t\t\t\t// @ts-expect-error - TODO\n\t\t\t\tconst draftSchema = draft[type][thingId] as EnrichedBormEntity;\n\n\t\t\t\tif (!isArray(value) && typeof value === 'object') {\n\t\t\t\t\t//skip meta.depth 4 when its arrays or undefined or not an object\n\t\t\t\t\tif (value.validations) {\n\t\t\t\t\t\tif (value.validations.required) {\n\t\t\t\t\t\t\tdraftSchema.requiredFields.push(value.path);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (value.validations.enum) {\n\t\t\t\t\t\t\tdraftSchema.enumFields.push(value.path);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (value.validations.fn) {\n\t\t\t\t\t\t\tdraftSchema.fnValidatedFields.push(value.path);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (value.default) {\n\t\t\t\t\t\tif (value.isVirtual) {\n\t\t\t\t\t\t\t// default and virtual means computed\n\t\t\t\t\t\t\tdraftSchema.virtualFields.push(value.path);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t//default but not virtual means pre-computed (default value), borm side\n\t\t\t\t\t\t\tdraftSchema.computedFields.push(value.path);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (value.isVirtual) {\n\t\t\t\t\t\t\t//not default but isVirtual means, computed in the DB side, not borm side\n\t\t\t\t\t\t\tdraftSchema.virtualFields.push(value.path);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//if it requires validations, add to the fields that required validations\n\t\t}),\n\t) as EnrichedBormSchema;\n\n\t//console.log('schema and enrichedSchema', JSON.stringify(schema), JSON.stringify(enrichedSchema));\n\treturn enrichedSchema;\n};\n\nexport const getSchemaByThing = (\n\tschema: BormSchema | EnrichedBormSchema,\n\t$thing: string,\n): EnrichedBormEntity | EnrichedBormRelation => {\n\tif ($thing in schema.entities) {\n\t\treturn schema.entities[$thing] as EnrichedBormEntity;\n\t}\n\tif ($thing in schema.relations) {\n\t\treturn schema.relations[$thing] as EnrichedBormRelation;\n\t}\n\tthrow new Error(`${$thing} is not defined in the schema`);\n};\n\nexport const getCurrentSchema = (\n\tschema: BormSchema | EnrichedBormSchema,\n\tnode: Partial<BQLMutationBlock>,\n): EnrichedBormEntity | EnrichedBormRelation => {\n\tif (!node) {\n\t\tthrow new Error('[Internal] No node for getCurrentSchema');\n\t}\n\tif (node.$thing) {\n\t\tif (node.$thingType === 'entity') {\n\t\t\tif (!(node.$thing in schema.entities)) {\n\t\t\t\tthrow new Error(`Missing entity '${node.$thing}' in the schema`);\n\t\t\t}\n\t\t\treturn schema.entities[node.$thing] as EnrichedBormEntity;\n\t\t}\n\t\tif (node.$thingType === 'relation') {\n\t\t\tif (!(node.$thing in schema.relations)) {\n\t\t\t\tthrow new Error(`Missing relation '${node.$thing}' in the schema`);\n\t\t\t}\n\t\t\treturn schema.relations[node.$thing] as EnrichedBormRelation;\n\t\t}\n\t\t// TODO: This should be validated during the initialization\n\t\tif (node.$thing in schema.entities && node.$thing in schema.relations) {\n\t\t\tthrow new Error(`Ambiguous $thing ${node.$thing}`);\n\t\t}\n\t\tif (node.$thing in schema.entities) {\n\t\t\treturn schema.entities[node.$thing] as EnrichedBormEntity;\n\t\t}\n\t\tif (node.$thing in schema.relations) {\n\t\t\treturn schema.relations[node.$thing] as EnrichedBormRelation;\n\t\t}\n\t\tthrow new Error(`Wrong schema or query for ${JSON.stringify(node, null, 2)}`);\n\t}\n\n\t//! Todo: delete when this works with the new $thing and $thingType fields\n\tif (node.$entity) {\n\t\tif (!(node.$entity in schema.entities)) {\n\t\t\tthrow new Error(`Missing entity '${node.$entity}' in the schema`);\n\t\t}\n\t\treturn schema.entities[node.$entity] as EnrichedBormEntity;\n\t}\n\tif (node.$relation) {\n\t\tif (!(node.$relation in schema.relations)) {\n\t\t\tthrow new Error(`Missing relation '${node.$relation}' in the schema`);\n\t\t}\n\t\treturn schema.relations[node.$relation] as EnrichedBormRelation;\n\t}\n\tthrow new Error(`Wrong schema or query for ${JSON.stringify(node, null, 2)}`);\n};\n\nexport const getFieldType = (\n\tcurrentSchema: EnrichedBormRelation | EnrichedBormEntity,\n\tkey: string,\n): ['idField' | 'dataField' | 'linkField' | 'roleField', EnrichedDataField | EnrichedLinkField | EnrichedRoleField] => {\n\tconst dataFieldSchema = currentSchema.dataFields?.find((dataField: any) => dataField.path === key);\n\n\tif (currentSchema.idFields?.includes(key)) {\n\t\tif (!dataFieldSchema) {\n\t\t\tthrow new Error(`Field ${key} is an idField but not a dataField in schema`);\n\t\t}\n\t\treturn ['idField', dataFieldSchema];\n\t}\n\tif (dataFieldSchema) {\n\t\treturn ['dataField', dataFieldSchema];\n\t}\n\tconst linkFieldSchema = currentSchema.linkFields?.find((linkField: any) => linkField.path === key);\n\tif (linkFieldSchema) {\n\t\treturn ['linkField', linkFieldSchema];\n\t}\n\tconst roleFieldSchema = 'roles' in currentSchema ? currentSchema.roles[key] : undefined;\n\tif (roleFieldSchema) {\n\t\treturn ['roleField', roleFieldSchema];\n\t}\n\tthrow new Error(`Field ${key} not found in schema, Defined in $filter`);\n};\nexport const getIdFieldKey = (schema: EnrichedBormSchema, node: Partial<BQLMutationBlock>) => {\n\tconst currentSchema = getCurrentSchema(schema, node);\n\tif (currentSchema?.idFields?.length && currentSchema?.idFields?.length > 1) {\n\t\tthrow new Error(`Multiple ids not yet enabled / composite ids: ${currentSchema?.idFields}`);\n\t}\n\n\tconst [idField] = currentSchema.idFields; //todo composed ids\n\treturn idField;\n};\n\nexport const getThingType = (rootNode: BQLMutationBlock, schema: EnrichedBormSchema): ThingType => {\n\tconst thing = rootNode.$thing || rootNode.$entity || rootNode.$relation;\n\tif (!thing) {\n\t\tthrow new Error('[Internal] No thing found');\n\t}\n\tif (rootNode.$entity) {\n\t\treturn 'entity';\n\t} else if (rootNode.$relation) {\n\t\treturn 'relation';\n\t} else if (schema.entities[thing]) {\n\t\treturn 'entity';\n\t} else if (schema.relations[thing]) {\n\t\treturn 'relation';\n\t}\n\tthrow new Error('No thing found');\n};\n\nexport const getFieldSchema = (\n\tschema: EnrichedBormSchema,\n\tnode: Partial<BQLMutationBlock>,\n\tfield: string,\n): EnrichedDataField | EnrichedLinkField | EnrichedRoleField | EnrichedRefField => {\n\tconst currentSchema = getCurrentSchema(schema, node);\n\tconst foundLinkField = currentSchema.linkFields?.find((lf) => lf.path === field);\n\tif (foundLinkField) {\n\t\treturn foundLinkField as EnrichedLinkField;\n\t}\n\tconst foundDataField = currentSchema.dataFields?.find((lf) => lf.path === field);\n\tif (foundDataField) {\n\t\treturn foundDataField as EnrichedDataField;\n\t}\n\tconst foundRoleField = 'roles' in currentSchema ? currentSchema.roles?.[field] : undefined;\n\tif (foundRoleField) {\n\t\treturn foundRoleField as EnrichedRoleField;\n\t}\n\tconst foundRefField = 'refFields' in currentSchema ? currentSchema.refFields?.[field] : undefined;\n\tif (foundRefField) {\n\t\treturn foundRefField as EnrichedRefField;\n\t}\n\tthrow new Error(`Field ${field} not found in schema`);\n};\n\nexport const getCardinality = (\n\tschema: EnrichedBormSchema,\n\tnode: Partial<BQLMutationBlock>,\n\tfield: string,\n): 'ONE' | 'MANY' | 'INTERVAL' | undefined => {\n\tconst currentFieldSchema = getFieldSchema(schema, node, field);\n\treturn currentFieldSchema?.cardinality;\n};\n\ntype ReturnTypeWithoutNode = {\n\tfields: string[];\n\tdataFields: string[];\n\troleFields: string[];\n\tlinkFields: string[];\n\trefFields: string[];\n};\n\ntype ReturnTypeWithNode = ReturnTypeWithoutNode & {\n\tusedFields: string[];\n\tusedRoleFields: string[];\n\tusedLinkFields: string[];\n\tusedDataFields: string[];\n\tusedRefFields: string[];\n\tunidentifiedFields: string[];\n};\n\n// todo: do something so this enriches the query so no need to call it multiple times\nexport const getCurrentFields = <T extends (BQLMutationBlock | RawBQLQuery) | undefined>(\n\tcurrentSchema: EnrichedBormEntity | EnrichedBormRelation,\n\tnode?: T,\n): T extends undefined ? ReturnTypeWithoutNode : ReturnTypeWithNode => {\n\tconst availableDataFields = currentSchema.dataFields?.map((x) => x.path) || [];\n\tconst availableLinkFields = currentSchema.linkFields?.map((x) => x.path) || [];\n\tconst availableRefFields = 'refFields' in currentSchema ? listify(currentSchema.refFields, (k: string) => k) : [];\n\tconst availableRoleFields = 'roles' in currentSchema ? listify(currentSchema.roles, (k: string) => k) : [];\n\tconst availableFields = [\n\t\t...(availableDataFields || []),\n\t\t...(availableLinkFields || []),\n\t\t...(availableRoleFields || []),\n\t\t...(availableRefFields || []),\n\t];\n\n\t// spot non existing fields\n\tconst reservedRootFields = [\n\t\t'$entity',\n\t\t'$op',\n\t\t'$id',\n\t\t'$tempId',\n\t\t'$bzId',\n\t\t'$relation',\n\t\t'$parentKey', //todo: this is not a valid one, to delete and migrate to symbol!\n\t\t'$filter',\n\t\t'$fields',\n\t\t'$excludedFields',\n\t\t'$thing',\n\t\t'$thingType',\n\t];\n\n\tconst allowedFields = [...reservedRootFields, ...availableFields];\n\n\tif (!node) {\n\t\treturn {\n\t\t\tfields: availableFields,\n\t\t\tdataFields: availableDataFields,\n\t\t\troleFields: availableRoleFields,\n\t\t\tlinkFields: availableLinkFields,\n\t\t} as ReturnTypeWithNode;\n\t}\n\tconst usedFields = node.$fields\n\t\t? //queries\n\t\t\t(node.$fields.map((x: string | { $path: string }) => {\n\t\t\t\tif (typeof x === 'string') {\n\t\t\t\t\tif (x.startsWith('$') || x.startsWith('%')) {\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t}\n\t\t\t\t\tif (!availableFields.includes(x)) {\n\t\t\t\t\t\tthrow new Error(`Field ${x} not found in the schema`);\n\t\t\t\t\t}\n\t\t\t\t\treturn x;\n\t\t\t\t}\n\t\t\t\tif ('$path' in x && typeof x.$path === 'string') {\n\t\t\t\t\treturn x.$path;\n\t\t\t\t}\n\t\t\t\tthrow new Error('[Wrong format] Wrongly structured query');\n\t\t\t}) as string[])\n\t\t: //mutations\n\t\t\t(listify<any, string, any>(node, (k: string) => {\n\t\t\t\tif (k.startsWith('$') || k.startsWith('%')) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t\tif (!availableFields.includes(k)) {\n\t\t\t\t\tthrow new Error(`[Schema] Field ${k} not found in the schema`);\n\t\t\t\t}\n\t\t\t\treturn k;\n\t\t\t}).filter((x) => x !== undefined) as string[]);\n\n\tconst localFilterFields = !node.$filter\n\t\t? []\n\t\t: listify(node.$filter as PositiveFilter, (k: string) =>\n\t\t\t\tk.toString().startsWith('$') ? undefined : k.toString(),\n\t\t\t).filter((x) => x && availableDataFields?.includes(x));\n\tconst nestedFilterFields = !node.$filter\n\t\t? []\n\t\t: listify(node.$filter as PositiveFilter, (k: string) =>\n\t\t\t\tk.toString().startsWith('$') ? undefined : k.toString(),\n\t\t\t).filter((x) => x && [...(availableRoleFields || []), ...(availableLinkFields || [])]?.includes(x));\n\n\tconst unidentifiedFields = [...usedFields, ...localFilterFields]\n\t\t.filter((x) => !x?.startsWith('%'))\n\t\t// @ts-expect-error - TODO description\n\t\t.filter((x) => !allowedFields.includes(x))\n\t\t.filter((x) => x) as string[]; // todo 🤔\n\tconst localFilters = !node.$filter ? {} : oFilter(node.$filter, (k: string, _v) => localFilterFields.includes(k));\n\tconst nestedFilters = !node.$filter ? {} : oFilter(node.$filter, (k: string, _v) => nestedFilterFields.includes(k));\n\n\treturn {\n\t\tfields: availableFields,\n\t\tdataFields: availableDataFields,\n\t\troleFields: availableRoleFields,\n\t\tlinkFields: availableLinkFields,\n\t\trefFields: availableRefFields,\n\t\tusedFields,\n\t\tusedLinkFields: availableLinkFields.filter((x) => usedFields.includes(x)),\n\t\tusedRoleFields: availableRoleFields.filter((x) => usedFields.includes(x)),\n\t\tusedDataFields: availableDataFields.filter((x) => usedFields.includes(x)),\n\t\tusedRefFields: availableRefFields.filter((x) => usedFields.includes(x)),\n\t\tunidentifiedFields,\n\t\t...(localFilterFields.length ? { localFilters } : {}),\n\t\t...(nestedFilterFields.length ? { nestedFilters } : {}),\n\t} as ReturnTypeWithNode;\n};\n\n/*\nexport const arrayAt = <T>(arr: T[] | undefined, index: number): T | undefined => {\n\tif (arr === undefined || !Array.isArray(arr) || index < -arr.length || index >= arr.length) {\n\t\treturn undefined;\n\t}\n\treturn arr[index < 0 ? arr.length + index : index];\n};*/\n\nexport const notNull = <TValue>(value: TValue | null): value is TValue => {\n\treturn value !== null;\n};\n\nexport const extractChildEntities = (entities: EnrichedBormSchema['entities'], parentEntity: string) => {\n\treturn Object.values(entities).reduce((acc: string[], value) => {\n\t\tif (value.extends === parentEntity) {\n\t\t\tacc.push(value.name);\n\t\t}\n\t\treturn acc;\n\t}, []);\n};\n\nexport const capitalizeFirstLetter = (string: string) => {\n\tif (typeof string !== 'string') {\n\t\tthrow new Error('capitalizeFirstLetter: string is not a string');\n\t}\n\treturn string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();\n};\n\nexport const getParentNode = (blocks: Record<any, any>, parent: any, meta: TraversalMeta) => {\n\tconst currentPath = meta.nodePath || '';\n\tconst pathParts = currentPath.split('.');\n\tconst parentPath = isArray(parent)\n\t\t? pathParts.slice(0, -2).join('.') // Remove last two parts for an array parent\n\t\t: pathParts.slice(0, -1).join('.'); // Remove only the last part for a non-array parent\n\treturn parent ? getNodeByPath(blocks, parentPath) : {}; //undefined parent for root\n};\n\nexport const getSymbols = (oldBlock: Partial<FilledBQLMutationBlock>): Record<symbol, any> => {\n\treturn Reflect.ownKeys(oldBlock)\n\t\t.filter((key): key is symbol => typeof key === 'symbol')\n\t\t.reduce(\n\t\t\t(symbols, symbolKey) => {\n\t\t\t\t//@ts-expect-error - TODO\n\t\t\t\t// eslint-disable-next-line no-param-reassign\n\t\t\t\tsymbols[symbolKey] = oldBlock[symbolKey];\n\t\t\t\treturn symbols;\n\t\t\t},\n\t\t\t{} as Record<symbol, any>,\n\t\t);\n};\n\nexport const normalPropsCount = (obj: Record<string, any>) => {\n\treturn Object.keys(obj).filter((key) => !key.startsWith('$')).length;\n};\n\nexport const isBQLBlock = (block: unknown): block is FilledBQLMutationBlock => {\n\treturn isObject(block) && ('$entity' in block || '$relation' in block || '$thing' in block);\n};\n\ntype Drafted<T> = T | Draft<T>;\n\n// Recursively define the type to handle nested structures\ntype DeepCurrent<T> =\n\tT extends Array<infer U> ? Array<DeepCurrent<U>> : T extends object ? { [K in keyof T]: DeepCurrent<T[K]> } : T;\n\nexport const deepCurrent = <T>(obj: Drafted<T>): any => {\n\tif (Array.isArray(obj)) {\n\t\t// Explicitly cast the return type for arrays\n\t\treturn obj.map((item) => current(item)) as DeepCurrent<T>;\n\t} else if (obj && typeof obj === 'object') {\n\t\t// Handle non-null objects\n\t\tconst plainObject = isDraft(obj) ? current(obj) : obj;\n\t\tconst result: any = {};\n\t\tObject.entries(plainObject).forEach(([key, value]) => {\n\t\t\t// Use the key to dynamically assign the converted value\n\t\t\tresult[key] = isDraft(value) ? current(value) : value;\n\t\t});\n\t\t// Explicitly cast the return type for objects\n\t\treturn result as DeepCurrent<T>;\n\t} else {\n\t\t// Return the value directly for non-objects and non-arrays\n\t\treturn obj as DeepCurrent<T>;\n\t}\n};\n\nexport const assertDefined = <T>(value?: T, msg?: string): T => {\n\tif (value === undefined) {\n\t\tif (msg) {\n\t\t\tthrow new Error(msg);\n\t\t}\n\t\tthrow new Error('Value is undefined');\n\t}\n\treturn value;\n};\n\nexport const indent = (line: string, depth: number) => {\n\tlet _indent = '';\n\tfor (let i = 0; i < depth; i++) {\n\t\t_indent += ' ';\n\t}\n\treturn `${_indent}${line}`;\n};\n\nexport const genId = (n?: number) => {\n\tconst idLength = n ?? 21;\n\tconst alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz';\n\tconst nanoid = customAlphabet(alphabet, idLength);\n\treturn nanoid();\n};\n","//! TO-DO Rule: Everything that can be changed or defined by the user should use $ prefix, but the rest is metadata and should be packed in symbols, depending on their origin. extension inside the schema and schema or query inside the query. Probably no more categories are necessary\nexport const Schema = Symbol.for('schema');\n\nexport const QueryPath = Symbol.for('queryPath');\n\nexport const StepPrint = Symbol.for('stepPrint');\n\nexport const EdgeType = Symbol.for('edgeType');\nexport const EdgeSchema = Symbol.for('edgeSchema');\nexport const Path = Symbol.for('path');\n\nexport const DBNode = Symbol.for('dbNode');\nexport const IsTransformed = Symbol.for('isTransformed');\n\n//flatBQL\nexport const Parent = Symbol.for('parent');\n\n/// Fields\nexport const FieldSchema = Symbol.for('fieldSchema');\n\n/// Shared schema metadata\nexport const SharedMetadata = Symbol.for('sharedMetadata');\n\n/// SurrealDB schema metadata\nexport const SuqlMetadata = Symbol.for('suqlMetadata');\n\n//TODO: restructure everything on top of this to be packed in the 3 symbols hereunder.\n//* SCHEMA STORED\n// For metadata that extends the schema\nexport const Extension = Symbol.for('extension');\n\n//* QUERY STORED\n//export const QueryContext = Symbol.for('queryContext'); //todo: queryContext and schemaContext as the only two symbols with a particular structure\n//export const SchemaContext = Symbol.for('schemaContext');\n","import type { DBHandleKey } from '../types';\n\nexport type AdapterContext = {\n\tmutation: {\n\t\tsplitArray$Ids: boolean;\n\t\trequiresParseBQL: boolean;\n\t};\n};\n\nexport const adapterContext: Record<DBHandleKey, AdapterContext> = {\n\ttypeDB: {\n\t\tmutation: {\n\t\t\tsplitArray$Ids: true,\n\t\t\trequiresParseBQL: true,\n\t\t},\n\t},\n\tsurrealDB: {\n\t\tmutation: {\n\t\t\tsplitArray$Ids: false, //probably not needed\n\t\t\trequiresParseBQL: false, //probably not needed\n\t\t},\n\t},\n} as const;\n","import type { EnrichedLinkField, EnrichedBormRelation, BormSchema } from '../../../types';\n\nexport const getSurrealLinkFieldQueryPath = ({\n\tlinkField,\n\toriginalRelation,\n\twithExtensionsSchema,\n\tlinkMode,\n}: {\n\tlinkField: EnrichedLinkField;\n\toriginalRelation: string;\n\twithExtensionsSchema: BormSchema;\n\tlinkMode: 'refs' | 'edges';\n}) => {\n\t// For virtuals, it is managed by the database schema\n\tif (linkField.isVirtual) {\n\t\treturn `$this.${linkField.path}.id`;\n\t}\n\n\t// And the subtypes of the current relation, as only the currentSubtypes are included in the path\n\tconst targetRelationSubTypes =\n\t\t(withExtensionsSchema.relations[linkField.relation] as EnrichedBormRelation).subTypes || [];\n\tconst targetRelationThings = [linkField.relation, ...targetRelationSubTypes];\n\n\tconst pathToRelation = `<-⟨${originalRelation}_${linkField.plays}⟩<-(⟨${targetRelationThings.join('⟩,⟨')}⟩)`;\n\n\tif (linkField.target === 'relation') {\n\t\tif (linkMode === 'edges') {\n\t\t\treturn pathToRelation; //Not original relation in the second, but all the potential targets\n\t\t}\n\t\tif (linkMode === 'refs') {\n\t\t\tif (linkField.cardinality === 'MANY') {\n\t\t\t\treturn `$parent.[\\`${linkField.path}\\`]`;\n\t\t\t}\n\t\t\treturn `$parent.\\`${linkField.path}\\``;\n\t\t}\n\t\tthrow new Error('Unsupported linkMode');\n\t} else if (linkField.target === 'role') {\n\t\tconst [targetRole] = linkField.oppositeLinkFieldsPlayedBy; //todo: This should consider more option in the future\n\t\tconst targetRoleSubTypes =\n\t\t\t//@ts-expect-error it is not fully extended but it does have subtypes\n\t\t\twithExtensionsSchema.entities[targetRole.thing]?.subTypes ||\n\t\t\t//@ts-expect-error it is not fully extended but it does have subtypes\n\t\t\twithExtensionsSchema.relations[targetRole.thing]?.subTypes ||\n\t\t\t[];\n\n\t\tconst oppositeRoleThings = [targetRole.thing, ...targetRoleSubTypes];\n\n\t\tconst pathToTunneledRole = `->⟨${originalRelation}_${targetRole.plays}⟩->(⟨${oppositeRoleThings.join('⟩,⟨')}⟩)`;\n\n\t\tif (linkMode === 'edges') {\n\t\t\treturn `${pathToRelation}${pathToTunneledRole}`;\n\t\t}\n\t\tif (linkMode === 'refs') {\n\t\t\tif (linkField.cardinality === 'MANY') {\n\t\t\t\treturn `$parent.[\\`${targetRole.plays}\\`]`;\n\t\t\t}\n\t\t\treturn `$parent.\\`${targetRole.plays}\\``;\n\t\t}\n\n\t\treturn `${pathToRelation}${pathToTunneledRole}`;\n\t} else {\n\t\tthrow new Error('Unsupported linkField target');\n\t}\n};\n","import type { EnrichedLinkField, EnrichedRoleField } from '../../../../types';\nimport { SharedMetadata } from '../../../../types/symbols';\n\nexport const getOppositePlayers = (field: string, fieldSchema: EnrichedLinkField | EnrichedRoleField) => {\n\tif (fieldSchema[SharedMetadata].fieldType === 'linkField') {\n\t\tconst linkFieldSchema = fieldSchema as EnrichedLinkField;\n\t\tconst oppositePlayer = linkFieldSchema.oppositeLinkFieldsPlayedBy;\n\t\tif (oppositePlayer?.length !== 1) {\n\t\t\tthrow new Error(`[Internal] Field ${field} should have a single player`);\n\t\t} else if (!oppositePlayer?.length) {\n\t\t\tthrow new Error(`[Internal] Field ${field} should have a player`);\n\t\t}\n\t\treturn oppositePlayer;\n\t} else if (fieldSchema[SharedMetadata].fieldType === 'roleField') {\n\t\tconst roleFieldSchema = fieldSchema as EnrichedRoleField;\n\t\tif ([...new Set(roleFieldSchema.playedBy?.map((x) => x.thing))]?.length !== 1) {\n\t\t\tthrow new Error(`[Internal] Field ${field} should have a single player`);\n\t\t} else if (!roleFieldSchema.playedBy?.length) {\n\t\t\tthrow new Error(`[Internal] Field ${field} should have a player`);\n\t\t}\n\t\treturn roleFieldSchema.playedBy;\n\t} else {\n\t\tthrow new Error(`[Internal] Field ${field} is not a linkField or roleField`);\n\t}\n};\n","/* eslint-disable no-param-reassign */\nimport { isArray, isObject } from 'radash';\nimport type { BQLMutationBlock, EnrichedLinkField, EnrichedRefField, EnrichedRoleField } from '../../../../types';\nimport { getOppositePlayers } from '../shared/getOppositePlayers';\nimport { genId } from '../../../../helpers';\n\nexport const replaceToObj = (\n\tnode: BQLMutationBlock,\n\tfield: string,\n\tfieldSchema: EnrichedLinkField | EnrichedRoleField,\n) => {\n\tconst subNodes = isArray(node[field]) ? node[field] : [node[field]];\n\n\t/// Only objects, is fine\n\tif (subNodes.every((child: unknown) => typeof child === 'object')) {\n\t\treturn;\n\t\t///all strings, then we proceed to replace\n\t} else if (subNodes.every((child: unknown) => typeof child === 'string')) {\n\t\tconst oppositePlayers = getOppositePlayers(field, fieldSchema);\n\t\tconst [player] = oppositePlayers;\n\n\t\t//if parent === create, then is a link\n\t\tconst $op = node.$op === 'create' ? 'link' : 'replace';\n\t\tconst $thing = player.thing;\n\t\tconst $thingType = player.thingType;\n\n\t\t//todo _: tempId included in the array, or as a single one of them\n\n\t\tconst base = {\n\t\t\t$op,\n\t\t\t$thing,\n\t\t\t$thingType,\n\t\t};\n\n\t\tconst tempIds = subNodes.filter((child: string) => child.startsWith('_:'));\n\t\tconst nonTempIds = subNodes.filter((child: string) => !child.startsWith('_:'));\n\n\t\tif (tempIds.length && !nonTempIds.length) {\n\t\t\t//only $tempIds\n\t\t\tnode[field] = tempIds.map((tempId: string) => ({\n\t\t\t\t...base,\n\t\t\t\t$tempId: tempId,\n\t\t\t\t$bzId: tempId,\n\t\t\t}));\n\t\t} else if (tempIds.length && nonTempIds.length) {\n\t\t\t//both\n\t\t\tnode[field] = [\n\t\t\t\t...tempIds.map((tempId: string) => ({\n\t\t\t\t\t...base,\n\t\t\t\t\t$tempId: tempId,\n\t\t\t\t\t$bzId: tempId,\n\t\t\t\t})),\n\t\t\t\t{\n\t\t\t\t\t...base,\n\t\t\t\t\t$id: nonTempIds,\n\t\t\t\t\t$bzId: `S_${genId()}`,\n\t\t\t\t},\n\t\t\t];\n\t\t} else {\n\t\t\t//only $ids\n\t\t\tnode[field] = {\n\t\t\t\t...base,\n\t\t\t\t$id: node[field],\n\t\t\t\t$bzId: `S_${genId()}`,\n\t\t\t};\n\t\t}\n\t} else {\n\t\tthrow new Error(\n\t\t\t`[Mutation Error] Replace can only be used with a single id or an array of ids. (Field: ${field} Nodes: ${JSON.stringify(subNodes)} Parent: ${JSON.stringify(node, null, 2)})`,\n\t\t);\n\t}\n};\n\n//todo: This is not doing any replaces, just checking the format, should be cleaned to do it\nexport const replaceToObjRef = (node: BQLMutationBlock, field: string, fieldSchema: EnrichedRefField) => {\n\tconst subNodes = isArray(node[field]) ? node[field] : [node[field]];\n\tif (fieldSchema.contentType === 'REF') {\n\t\tif (subNodes.some((sn) => !isObject(sn))) {\n\t\t\tthrow new Error(\n\t\t\t\t\"[Wrong format] Field of contentType REF can't use strings as references\", //future: unless they are prefixed\n\t\t\t);\n\t\t}\n\t\treturn;\n\t}\n\n\tif (fieldSchema.contentType === 'FLEX') {\n\t\treturn;\n\t}\n\tthrow new Error(`[Internal] Field ${field} is not a refField`);\n};\n","import { getCurrentSchema, getCurrentFields } from '../../../../helpers';\nimport type { BQLMutationBlock, EnrichedBormSchema, BormOperation } from '../../../../types';\nimport { isArray } from 'radash';\n\nexport const validateOp = (parentNode: BQLMutationBlock, node: BQLMutationBlock, schema: EnrichedBormSchema) => {\n\tif (node.$op) {\n\t\t// $op validations /// Order: most specific to least specific\n\t\tif (node.$op === 'create' && node.$id) {\n\t\t\tthrow new Error(\"[Wrong format] Can't write to computed field $id. Try writing to the id field directly.\");\n\t\t}\n\t\tif (['unlink', 'delete', 'update'].includes(node.$op) && parentNode.$op === 'create') {\n\t\t\tthrow new Error(`[Wrong format] Cannot ${node.$op} under a create`);\n\t\t}\n\n\t\tconst nodeSchema = getCurrentSchema(schema, node);\n\t\tconst { usedDataFields } = getCurrentFields(nodeSchema, node);\n\n\t\tif (node.$op === 'delete' && usedDataFields.length > 0) {\n\t\t\t//linkFields can be updated, for instance nested deletions\n\t\t\tthrow new Error('[Wrong format] Cannot update on deletion');\n\t\t}\n\t\tif (['unlink', 'link'].includes(node.$op) && usedDataFields.length > 0) {\n\t\t\t//linkFields can be updated, for instance nested unlinks\n\t\t\tthrow new Error(\"[Unsupported] Can't update fields on Link / Unlink\");\n\t\t}\n\t\treturn node.$op as BormOperation;\n\t}\n};\n\nexport const validateChildren = (parentNode: BQLMutationBlock, node: BQLMutationBlock, schema: EnrichedBormSchema) => {\n\tconst subNodes = isArray(node) ? node : [node];\n\tsubNodes.forEach((subNode) => {\n\t\tvalidateOp(parentNode, subNode, schema);\n\t});\n};\n","import { getCurrentSchema, getCurrentFields } from '../../../../helpers';\nimport type { BQLMutationBlock, EnrichedBormSchema, BormOperation } from '../../../../types';\nimport { validateOp } from './validateOp';\n\nexport const getOp = (node: BQLMutationBlock): BormOperation => {\n\tconst usedFields = Object.keys(node).filter((key) => !(key.startsWith('$') || key.startsWith('%')));\n\n\tif (node.$op) {\n\t\treturn node.$op as BormOperation;\n\t} else {\n\t\tif (node.$id || node.$filter) {\n\t\t\tif (usedFields.length > 0) {\n\t\t\t\treturn 'update';\n\t\t\t} else {\n\t\t\t\treturn 'link';\n\t\t\t}\n\t\t} else if (node.$tempId) {\n\t\t\tif (usedFields.length > 0) {\n\t\t\t\treturn 'create'; //only difference is $id + stuff means update, while $tempIds are usually for creation and recovering it later from the res\n\t\t\t} else {\n\t\t\t\treturn 'link';\n\t\t\t}\n\t\t} else {\n\t\t\treturn 'create';\n\t\t}\n\t}\n};\n\nexport const getOpAndValidate = (\n\tparentNode: BQLMutationBlock,\n\tnode: BQLMutationBlock,\n\tschema: EnrichedBormSchema,\n): BormOperation => {\n\tconst nodeSchema = getCurrentSchema(schema, node);\n\tconst { usedFields } = getCurrentFields(nodeSchema, node);\n\n\tif (node.$op) {\n\t\tvalidateOp(parentNode, node, schema);\n\t\treturn node.$op as BormOperation;\n\t} else {\n\t\tif (node.$id || node.$filter) {\n\t\t\tif (usedFields.length > 0) {\n\t\t\t\tvalidateOp(parentNode, { ...node, $op: 'update' }, schema);\n\t\t\t\treturn 'update';\n\t\t\t} else {\n\t\t\t\tvalidateOp(parentNode, { ...node, $op: 'link' }, schema);\n\t\t\t\treturn 'link';\n\t\t\t}\n\t\t} else if (node.$tempId) {\n\t\t\tif (usedFields.length > 0) {\n\t\t\t\tvalidateOp(parentNode, { ...node, $op: 'create' }, schema);\n\t\t\t\treturn 'create'; //only difference is $id + stuff means update, while $tempIds are usually for creation and recovering it later from the res\n\t\t\t} else {\n\t\t\t\tvalidateOp(parentNode, { ...node, $op: 'create' }, schema);\n\t\t\t\treturn 'link';\n\t\t\t}\n\t\t} else {\n\t\t\tvalidateOp(parentNode, { ...node, $op: 'create' }, schema);\n\t\t\treturn 'create';\n\t\t}\n\t}\n};\n","import { isArray } from 'radash';\nimport type { BQLMutationBlock, EnrichedBormSchema } from '../../../../types';\nimport { getOpAndValidate } from '../shared/getOp';\nimport { genId, getThingType } from '../../../../helpers';\n\nexport const setRootMeta = (node: { $root: BQLMutationBlock | BQLMutationBlock[] }, schema: EnrichedBormSchema) => {\n\tconst rootArray = isArray(node.$root) ? node.$root : [node.$root];\n\n\tconst withMetadataRootArray = rootArray.map((rootNode) => {\n\t\tconst rootOp = getOpAndValidate(rootNode, rootNode, schema);\n\n\t\tconst withMetadata = {\n\t\t\t...(rootNode.$thing ? {} : { $thing: rootNode.$entity || rootNode.$relation }),\n\t\t\t...(rootNode.$thingType ? {} : { $thingType: getThingType(rootNode, schema) }),\n\t\t\t...(rootNode.$op ? {} : { $op: rootOp }),\n\t\t\t...(rootNode.$bzId ? {} : { $bzId: `R_${genId()}` }),\n\t\t};\n\t\t// eslint-disable-next-line no-param-reassign\n\t\treturn { ...withMetadata, ...rootNode };\n\t});\n\t// eslint-disable-next-line no-param-reassign\n\tnode.$root = isArray(node.$root) ? withMetadataRootArray : withMetadataRootArray[0];\n};\n","import { isSet } from 'util/types';\nimport { StepPrint } from '../../../../types/symbols';\n\nexport const doAction = (stepName: string, block: Record<string | symbol | number, any>) => {\n\tconst current = block[StepPrint];\n\tif (!isSet(current)) {\n\t\tReflect.set(block, StepPrint, new Set(['clean']));\n\t\treturn true;\n\t} else if (!current.has('clean')) {\n\t\treturn false;\n\t} else {\n\t\tReflect.set(block, StepPrint, current.add('clean'));\n\t\treturn true;\n\t}\n};\n","import { isArray, isObject } from 'radash';\nimport { deepCurrent, getCurrentSchema, getSymbols } from '../../../../helpers';\nimport type { BQLMutationBlock, EnrichedBQLMutationBlock, EnrichedBormSchema } from '../../../../types';\nimport { doAction } from '../shared/doActions';\n\nexport const splitMultipleIds = (node: BQLMutationBlock, field: string, schema: EnrichedBormSchema) => {\n\tif (doAction('split_ids', node)) {\n\t\t//insert here\n\t\tconst transformedChildren = (isArray(node[field]) ? node[field] : [node[field]]).flatMap(\n\t\t\t(child: EnrichedBQLMutationBlock) => {\n\t\t\t\tif (isObject(child) && '$id' in child && isArray(child['$id'])) {\n\t\t\t\t\tconst subNode = child as EnrichedBQLMutationBlock & { $id: string[] };\n\t\t\t\t\t/*const childSchema =*/ getCurrentSchema(schema, subNode);\n\t\t\t\t\t/// Depending on the DB this operation is required or not\n\t\t\t\t\tif (!subNode.$bzId) {\n\t\t\t\t\t\tthrow new Error('[Internal Error] No bzId found');\n\t\t\t\t\t}\n\t\t\t\t\t// eslint-disable-next-line no-constant-condition\n\t\t\t\t\tif (/*childSchema.dbContext.mutation?.splitArray$Ids*/ true) {\n\t\t\t\t\t\treturn subNode.$id.map(($id: string, i: number) => ({\n\t\t\t\t\t\t\t...deepCurrent(subNode), //structured clone generates a weird bug with traverse, so not using it\n\t\t\t\t\t\t\t$id: $id,\n\t\t\t\t\t\t\t$bzId: `${subNode.$bzId}_${i}`,\n\t\t\t\t\t\t\t...getSymbols(subNode),\n\t\t\t\t\t\t}));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn child;\n\t\t\t},\n\t\t);\n\t\t// if we splitted something, then reassign\n\t\tif (transformedChildren.length > 0 && isArray(node[field]) ? node[field] : [node[field]].length) {\n\t\t\t// eslint-disable-next-line no-param-reassign\n\t\t\tnode[field] = transformedChildren;\n\t\t}\n\t}\n};\n","import { isArray } from 'radash';\nimport { genId } from '../../../../helpers';\nimport type { BQLMutationBlock } from '../../../../types';\n\nexport const get$bzId = (node: BQLMutationBlock, thing?: string) => {\n\tif (node.$bzId) {\n\t\treturn node.$bzId;\n\t}\n\tif (node.$tempId) {\n\t\treturn node.$tempId;\n\t}\n\t// particular case, where we have a single $id, which is unique per $things so no need to generate multiple bzIds we can unify\n\tif (node.$id && !isArray(node.$id)) {\n\t\treturn thing ? `SN_ONE_${thing}_${node.$id}` : `SN_ONE_${node.$id}`; //also we add prefix SN_ONE as we know is cardinality ONE\n\t}\n\tif (node.$id && isArray(node.$id)) {\n\t\treturn thing ? `SN_MANY_${thing}_${genId()}` : `SN_MANY_${genId()}`; //also we add prefix SN_MANY as we know is cardinality MANY\n\t}\n\n\treturn `SM_${genId()}`;\n};\n","/* eslint-disable no-param-reassign */\nimport { isArray, isObject } from 'radash';\nimport type {\n\tBQLMutationBlock,\n\tEnrichedBormSchema,\n\tEnrichedBQLMutationBlock,\n\tEnrichedLinkField,\n\tEnrichedRefField,\n\tEnrichedRoleField,\n} from '../../../../types';\nimport { EdgeSchema, SharedMetadata } from '../../../../types/symbols';\nimport { getOp } from '../shared/getOp';\nimport { getOppositePlayers } from '../shared/getOppositePlayers';\nimport { get$bzId } from '../shared/get$bzId';\n\nexport const enrichChildren = (\n\tnode: BQLMutationBlock,\n\tfield: string,\n\tfieldSchema: EnrichedLinkField | EnrichedRoleField | EnrichedRefField,\n\tschema: EnrichedBormSchema,\n) => {\n\tconst newNodes = (isArray(node[field]) ? node[field] : [node[field]]).flatMap((subNode: EnrichedBQLMutationBlock) => {\n\t\tif (!fieldSchema) {\n\t\t\tthrow new Error(`[Internal] No fieldSchema found in ${JSON.stringify(fieldSchema)}`);\n\t\t}\n\n\t\tconst $op = getOp(subNode);\n\t\tconst $bzId = get$bzId(subNode);\n\n\t\tif (fieldSchema[SharedMetadata].fieldType === 'refField') {\n\t\t\tconst refSchema = fieldSchema as EnrichedRefField;\n\n\t\t\tif (!isObject(subNode)) {\n\t\t\t\tif (refSchema.contentType === 'FLEX') {\n\t\t\t\t\treturn subNode;\n\t\t\t\t}\n\t\t\t\tthrow new Error(`[Wrong format] The refField ${field} must receive an object`);\n\t\t\t}\n\n\t\t\tif (!subNode.$thing) {\n\t\t\t\tthrow new Error('[Wrong format] The field $thing is required in refFields');\n\t\t\t}\n\t\t\treturn { ...subNode, $op, $bzId };\n\t\t}\n\n\t\tconst relationSchema = fieldSchema as EnrichedRoleField | EnrichedLinkField;\n\n\t\tif (relationSchema.$things.length === 0) {\n\t\t\t//todo: maybe add all the potential $things to a ref field?\n\t\t\tthrow new Error(`[Internal error] The field ${field} can't be played by any thing.`);\n\t\t}\n\n\t\tconst relFieldSchema = fieldSchema as EnrichedRoleField | EnrichedLinkField;\n\n\t\tif (relFieldSchema.$things.length === 1) {\n\t\t\tconst oppositePlayers = getOppositePlayers(field, relationSchema);\n\t\t\tconst [player] = oppositePlayers;\n\n\t\t\tif (subNode.$thing && subNode.$thing !== player.thing) {\n\t\t\t\tthrow new Error(`[Wrong format] The field ${field} can only be played by ${player.thing}.`);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...subNode,\n\t\t\t\t[EdgeSchema]: relFieldSchema,\n\t\t\t\t$thing: player.thing,\n\t\t\t\t$thingType: player.thing in schema.entities ? 'entity' : 'relation',\n\t\t\t\t$op,\n\t\t\t\t$bzId,\n\t\t\t};\n\t\t}\n\t\tif (relFieldSchema.$things.length > 1) {\n\t\t\tif (subNode.$thing) {\n\t\t\t\treturn [\n\t\t\t\t\t{\n\t\t\t\t\t\t...subNode,\n\t\t\t\t\t\t[EdgeSchema]: relFieldSchema,\n\t\t\t\t\t\t$thing: subNode.$thing,\n\t\t\t\t\t\t$thingType: subNode.$thing in schema.entities ? 'entity' : 'relation',\n\t\t\t\t\t\t$op,\n\t\t\t\t\t\t$bzId,\n\t\t\t\t\t},\n\t\t\t\t];\n\t\t\t}\n\t\t\tif (!subNode.$thing) {\n\t\t\t\tif (subNode.$tempId) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t'[Unsupported] Objects with $tempId and multiple potential players require to explicitly indicate the $thing type.',\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif ($op === 'create') {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`[Wrong format] The field ${field} can be played by multiple things, please specify one on creation.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn relFieldSchema.$things.map((thing) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...subNode,\n\t\t\t\t\t\t[EdgeSchema]: relFieldSchema,\n\t\t\t\t\t\t$thing: thing,\n\t\t\t\t\t\t$thingType: thing in schema.entities ? 'entity' : 'relation',\n\t\t\t\t\t\t$op,\n\t\t\t\t\t\t$bzId: get$bzId(subNode, thing),\n\t\t\t\t\t\t//[QueryContext]: { ...subNode[QueryContext], $multiThing: true }, //multiThing is used so the arcs of this manual split are merged in a single arc\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\t//#endregion nested nodes\n\t});\n\n\tif (isArray(node[field])) {\n\t\tnode[field] = newNodes;\n\t} else {\n\t\tif (newNodes.length > 1) {\n\t\t\t//we might have added deduplicated things\n\t\t\tnode[field] = newNodes;\n\t\t} else {\n\t\t\t// eslint-disable-next-line prefer-destructuring\n\t\t\tnode[field] = newNodes[0];\n\t\t}\n\t}\n\n\tnode[field] = isArray(node[field]) ? newNodes : newNodes[0];\n};\n","import * as acorn from 'acorn';\n\nconst STRIP_COMMENTS = /((\\/\\/.*$)|(\\/\\*[\\s\\S]*?\\*\\/))/gm;\nconst STRIP_KEYWORDS = /(\\s*async\\s*|\\s*function\\s*|\\s*\\(\\s*|\\s*\\)\\s*=>|\\s*\\)\\s*\\{)/;\n\nexport const getParamNames = (func: (...args: any[]) => any): string[] => {\n\tconst fnStr: string = func.toString().replace(STRIP_COMMENTS, '').trim();\n\t// Remove function keywords and split at the first => or { to isolate parameters\n\tconst fnBodyStr: string = fnStr.split('=>')[0].split('{')[0].replace(STRIP_KEYWORDS, '').trim();\n\tconst paramsBlock = fnBodyStr.substring(fnBodyStr.indexOf('(') + 1, fnBodyStr.lastIndexOf(')')).trim();\n\n\tif (!paramsBlock) {\n\t\treturn [];\n\t}\n\n\t// Match including destructured parameters with special characters\n\tconst paramsMatch = paramsBlock.match(/(\\{[^}]*\\}|[^,]+)/g) || [];\n\n\treturn paramsMatch\n\t\t.flatMap((param) => {\n\t\t\t// Remove leading/trailing braces and split based on comma outside of quotes\n\t\t\tif (param.includes('{') && param.includes('}')) {\n\t\t\t\tconst destructuredParams = param.replace(/^\\{|\\}$/g, '').match(/(?:[^,\"']+|\"[^\"]*\"|'[^']*')+/g) || [];\n\t\t\t\treturn destructuredParams.map((p) =>\n\t\t\t\t\tp\n\t\t\t\t\t\t.split(':')[0]\n\t\t\t\t\t\t.trim()\n\t\t\t\t\t\t.replace(/['\"[\\]]/g, ''),\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn param.trim();\n\t\t})\n\t\t.filter(Boolean);\n};\n\nexport const getDependencies = (fn: (...args: any[]) => void) => {\n\tconst code = fn.toString();\n\tconst ast = acorn.parse(code, { ecmaVersion: 2020 });\n\tlet current: string[] = [];\n\tlet parent: string[] = [];\n\tlet context: string[] = [];\n\tconst statement = ast.body.find((i) => i.type === 'ExpressionStatement') as acorn.ExpressionStatement | undefined;\n\tif (statement) {\n\t\tconst fn = statement.expression;\n\t\tif (fn.type === 'ArrowFunctionExpression' || fn.type === 'FunctionExpression') {\n\t\t\tconst [cur, par, ctx] = fn.params;\n\t\t\tcurrent = getKeys(cur);\n\t\t\tparent = getKeys(par);\n\t\t\tcontext = getKeys(ctx);\n\t\t}\n\t}\n\treturn { current, parent, context };\n};\n\nconst getKeys = (pat?: acorn.Pattern): string[] => {\n\tconst keys: string[] = [];\n\tif (pat?.type === 'ObjectPattern') {\n\t\tpat?.properties?.forEach((p) => {\n\t\t\tif (p.type === 'Property') {\n\t\t\t\tif (p.key.type === 'Identifier') {\n\t\t\t\t\tkeys.push(p.key.name);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\treturn keys;\n};\n","import type { BQLMutationBlock, EnrichedDataField } from '../types';\nimport { getParamNames } from './helpers';\n\nexport const computeField = ({\n\tcurrentThing,\n\tfieldSchema,\n\tmandatoryDependencies = false,\n}: {\n\tcurrentThing: BQLMutationBlock;\n\tfieldSchema?: EnrichedDataField;\n\tmandatoryDependencies?: boolean;\n}) => {\n\tif (!fieldSchema || !fieldSchema.default || !('fn' in fieldSchema.default || 'value' in fieldSchema.default)) {\n\t\tthrow new Error(\n\t\t\t`[Internal] Virtual field: No field schema found, or wrongly configured. Field: ${JSON.stringify(fieldSchema, null, 3)}`,\n\t\t);\n\t}\n\n\t//check if all the args are in the entity, if not, throw a missing error with all the not present ones\n\n\tif (fieldSchema.default.type === 'value') {\n\t\treturn fieldSchema.default.value;\n\t}\n\n\tif (mandatoryDependencies) {\n\t\tconst { fn } = fieldSchema.default;\n\n\t\tconst args = getParamNames(fn);\n\t\tconst missingArgs = args.filter((arg) => !(arg in currentThing));\n\n\t\tif (missingArgs.length) {\n\t\t\tthrow new Error(`Virtual field: Missing arguments ${missingArgs.join(', ')}`);\n\t\t}\n\t}\n\tif (!fieldSchema.default.fn) {\n\t\tthrow new Error('[Schema] No fn in default field schema');\n\t}\n\tif ('default' in fieldSchema) {\n\t\t//@ts-expect-error can't find the issue, all subtypes have a value type, and a fn type\n\t\tif (fieldSchema.default.type === 'value') {\n\t\t\t//@ts-expect-error can't find the issue, all subtypes have a value type, and a fn type\n\t\t\treturn fieldSchema.default.value;\n\t\t}\n\t\tif (fieldSchema.default.type === 'fn') {\n\t\t\treturn fieldSchema.default.fn(currentThing);\n\t\t}\n\n\t\tthrow new Error('[Schema] No default field definition');\n\t}\n};\n\nexport const computeNode = () => {};\n","/* eslint-disable no-param-reassign */\nimport { isArray, listify } from 'radash';\nimport type {\n\tBQLMutationBlock,\n\tEnrichedBormSchema,\n\tEnrichedBQLMutationBlock,\n\tEnrichedDataField,\n} from '../../../../types';\nimport { getCurrentFields, getCurrentSchema, oFind } from '../../../../helpers';\nimport { computeField } from '../../../../engine/compute';\n\nexport const computeFields = (node: BQLMutationBlock, field: string, schema: EnrichedBormSchema) => {\n\tconst currentNode = node[field] as EnrichedBQLMutationBlock;\n\tif (!currentNode) {\n\t\treturn;\n\t}\n\t(isArray(currentNode) ? currentNode : [currentNode]).forEach((subNode: EnrichedBQLMutationBlock) => {\n\t\tif (subNode.$op !== 'create') {\n\t\t\treturn;\n\t\t}\n\t\tconst currentSchema = getCurrentSchema(schema, subNode);\n\t\tconst { unidentifiedFields } = getCurrentFields(currentSchema, subNode);\n\t\tconst { computedFields, virtualFields } = currentSchema;\n\n\t\t//@ts-expect-error - TODO\n\t\tconst filledFields = listify(subNode, (attKey, v) => (v !== undefined ? attKey : undefined)) as string[];\n\t\t/// if at least one of the filled fields is virtual, then throw error\n\t\tconst virtualFilledFields = filledFields.filter((x) => virtualFields?.includes(x));\n\t\tif (virtualFilledFields.length > 0) {\n\t\t\tthrow new Error(`Virtual fields can't be sent to DB: \"${virtualFilledFields.join(',')}\"`);\n\t\t}\n\t\tconst missingComputedFields = computedFields.filter((x) => !filledFields.includes(x));\n\n\t\t// fill computed values\n\t\tmissingComputedFields.forEach((fieldPath) => {\n\t\t\tconst currentFieldDef = currentSchema.dataFields?.find((x) => x.path === fieldPath);\n\t\t\tconst currentLinkDef = currentSchema.linkFields?.find((x) => x.path === fieldPath);\n\t\t\t// todo: multiple playedBy\n\t\t\tconst currentLinkedDef = currentLinkDef?.oppositeLinkFieldsPlayedBy[0];\n\n\t\t\tconst currentRoleDef =\n\t\t\t\t'roles' in currentSchema ? oFind(currentSchema.roles, (k, _v) => k === fieldPath) : undefined;\n\t\t\tconst currentDef = currentFieldDef || currentLinkedDef || currentRoleDef;\n\t\t\tif (!currentDef) {\n\t\t\t\tthrow new Error(`no field Def for ${fieldPath}`);\n\t\t\t}\n\n\t\t\t// We generate the other default fields if they are not defined. We ignore the id field which was created before for $id\n\t\t\tif (!subNode[fieldPath]) {\n\t\t\t\tconst defaultValue = computeField({\n\t\t\t\t\tcurrentThing: subNode,\n\t\t\t\t\tfieldSchema: currentDef as EnrichedDataField, //id is always a datafield.\n\t\t\t\t\tmandatoryDependencies: true, //can't send to db without every dependency being there\n\t\t\t\t});\n\n\t\t\t\tsubNode[fieldPath] = defaultValue;\n\t\t\t}\n\t\t});\n\n\t\tif (unidentifiedFields.length > 0) {\n\t\t\tthrow new Error(`Unknown fields: [${unidentifiedFields.join(',')}] in ${JSON.stringify(subNode)}`);\n\t\t}\n\t});\n\treturn node;\n};\n","import { getCurrentSchema, capitalizeFirstLetter } from '../../../../helpers';\nimport type { FilledBQLMutationBlock, EnrichedBormSchema, Hooks, BormTrigger, Action } from '../../../../types';\n\nexport const getTriggeredActions = (node: FilledBQLMutationBlock, schema: EnrichedBormSchema) => {\n\tconst hooks = getCurrentSchema(schema, node).hooks as Hooks;\n\tif (hooks?.pre) {\n\t\tconst currentEvent = `on${capitalizeFirstLetter(node.$op)}` as BormTrigger;\n\t\tconst currentHooks = hooks.pre.filter((hook) => !hook.triggers || hook.triggers[currentEvent]?.()); //No triggers triggers everything\n\t\tconst actions = currentHooks.flatMap((hook) => hook.actions);\n\t\treturn actions;\n\t}\n\treturn [] as Action[];\n};\n","/* eslint-disable no-param-reassign */\nimport { clone, isArray, isObject } from 'radash';\nimport type { BormConfig, EnrichedBQLMutationBlock, EnrichedBormSchema } from '../../../../types';\nimport { deepCurrent, getCurrentSchema } from '../../../../helpers';\nimport { getTriggeredActions } from '../shared/getTriggeredActions';\nimport { DBNode } from '../../../../types/symbols';\n\nexport const preHookValidations = (\n\tnode: EnrichedBQLMutationBlock,\n\tfield: string,\n\tschema: EnrichedBormSchema,\n\tconfig: BormConfig,\n) => {\n\tconst subNodes = isArray(node[field]) ? node[field] : [node[field]];\n\tsubNodes.forEach((subNode: EnrichedBQLMutationBlock) => {\n\t\tif ('$thing' in subNode) {\n\t\t\tif (subNode.$fields) {\n\t\t\t\t///change machine context so we are sun we run preQueryDeps before coming back to here\n\t\t\t\treturn subNode;\n\t\t\t}\n\n\t\t\tconst { requiredFields, enumFields, fnValidatedFields, dataFields } = getCurrentSchema(schema, subNode);\n\n\t\t\t/// Required fields\n\t\t\tif ('$op' in subNode && subNode.$op === 'create') {\n\t\t\t\trequiredFields.forEach((field) => {\n\t\t\t\t\tif (!(field in subNode)) {\n\t\t\t\t\t\tthrow new Error(`[Validations] Required field \"${field}\" is missing.`);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\t/// Enums\n\t\t\tif (('$op' in subNode && subNode.$op === 'update') || subNode.$op === 'create') {\n\t\t\t\tenumFields.forEach((field) => {\n\t\t\t\t\tif (field in subNode) {\n\t\t\t\t\t\tconst enumOptions = dataFields?.find((df) => df.path === field)?.validations?.enum;\n\t\t\t\t\t\tif (!enumOptions) {\n\t\t\t\t\t\t\tthrow new Error(`[Validations] Enum field \"${field}\" is missing enum options.`);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (isArray(subNode[field])) {\n\t\t\t\t\t\t\tsubNode[field].some((val: any) => {\n\t\t\t\t\t\t\t\tif (!enumOptions.includes(val)) {\n\t\t\t\t\t\t\t\t\tthrow new Error(`[Validations] Option \"${val}\" is not a valid option for field \"${field}\".`);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else if (enumOptions && !enumOptions.includes(subNode[field])) {\n\t\t\t\t\t\t\tthrow new Error(`[Validations] Option \"${subNode[field]}\" is not a valid option for field \"${field}\".`);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\t/// fn\n\t\t\tif (('$op' in subNode && subNode.$op === 'update') || subNode.$op === 'create') {\n\t\t\t\tfnValidatedFields.forEach((field: string) => {\n\t\t\t\t\tif (field in subNode) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst fn = dataFields?.find((df) => df.path === field)?.validations?.fn;\n\t\t\t\t\t\t\tif (!fn) {\n\t\t\t\t\t\t\t\tthrow new Error('Missing validation function.');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// @ts-expect-error - TODO\n\t\t\t\t\t\t\tif (!fn(subNode[field])) {\n\t\t\t\t\t\t\t\tthrow new Error('Failed validation function.');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch (error: any) {\n\t\t\t\t\t\t\tthrow new Error(`[Validations:attribute:${field}] ${error.message}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t/// Node validations\n\t\t\tif (isObject(subNode) && '$thing' in subNode) {\n\t\t\t\tconst currentThing = subNode.$thing;\n\t\t\t\tconst value = subNode as EnrichedBQLMutationBlock;\n\n\t\t\t\tconst parentNode = clone(deepCurrent(node));\n\t\t\t\tconst currentNode = clone(deepCurrent(value));\n\t\t\t\tconst userContext = (config.mutation?.context || {}) as Record<string, any>;\n\t\t\t\tconst dbNode = clone(deepCurrent<EnrichedBQLMutationBlock | Record<string, never>>(subNode[DBNode] || {})) as\n\t\t\t\t\t| EnrichedBQLMutationBlock\n\t\t\t\t\t| Record<string, never>;\n\n\t\t\t\tconst triggeredActions = getTriggeredActions(value, schema);\n\t\t\t\ttriggeredActions.forEach((action) => {\n\t\t\t\t\tif (action.type === 'validate') {\n\t\t\t\t\t\tif (action.severity !== 'error') {\n\t\t\t\t\t\t\treturn; // in borm we only use the errors\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t//! Todo: Sandbox the function in nodeCompute() instead of the existing fieldCompute()\n\t\t\t\t\t\t\tconst validationResult = action.fn(currentNode, parentNode, userContext, dbNode);\n\n\t\t\t\t\t\t\tif (validationResult === false) {\n\t\t\t\t\t\t\t\tthrow new Error(`${action.message}.`);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (validationResult !== true) {\n\t\t\t\t\t\t\t\tthrow new Error(\"Validation function's output is not a boolean value.\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch (error: any) {\n\t\t\t\t\t\t\tthrow new Error(`[Validations:thing:${currentThing}] ${error.message}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t});\n};\n","/* eslint-disable no-param-reassign */\nimport { clone, isArray } from 'radash';\nimport type { BormConfig, EnrichedBormSchema, EnrichedBQLMutationBlock, TransFormAction } from '../../../../types';\nimport { deepCurrent, getSymbols, isBQLBlock } from '../../../../helpers';\nimport { getTriggeredActions } from '../shared/getTriggeredActions';\nimport { DBNode, IsTransformed } from '../../../../types/symbols';\n\nexport const preHookTransformations = (\n\tnode: EnrichedBQLMutationBlock,\n\tfield: string,\n\tschema: EnrichedBormSchema,\n\tconfig: BormConfig,\n) => {\n\tconst nodes = isArray(node[field]) ? node[field] : [node[field]];\n\n\tnodes.forEach((subNode: EnrichedBQLMutationBlock) => {\n\t\tif (!isBQLBlock(subNode)) {\n\t\t\treturn;\n\t\t}\n\n\t\t// @ts-expect-error todo\n\t\tif (subNode.$fields || subNode[IsTransformed]) {\n\t\t\t///todo: change machine context so we are sun we run preQueryDeps before coming back to here\n\t\t\treturn;\n\t\t}\n\n\t\tconst triggeredActions = getTriggeredActions(subNode, schema).filter(\n\t\t\t(action) => action.type === 'transform',\n\t\t) as TransFormAction[];\n\n\t\tconst parentNode = clone(deepCurrent(node)) as EnrichedBQLMutationBlock;\n\t\tlet workingNode = clone(deepCurrent(subNode)) as EnrichedBQLMutationBlock;\n\t\tconst userContext = (config.mutation?.context || {}) as Record<string, any>;\n\t\tconst dbNode = clone(\n\t\t\tdeepCurrent<EnrichedBQLMutationBlock | Record<string, never>>(subNode[DBNode] || subNode.$dbNode),\n\t\t) as EnrichedBQLMutationBlock | Record<string, never>;\n\n\t\ttriggeredActions.forEach((action) => {\n\t\t\tconst newProps = action.fn(workingNode, parentNode, userContext, dbNode || {});\n\t\t\tif (Object.keys(newProps).length === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Update working node to be used by next action\n\t\t\tworkingNode = { ...workingNode, ...newProps, ...getSymbols(subNode), [IsTransformed]: true };\n\n\t\t\t// Update the draft state in Immer\n\t\t\tObject.assign(subNode, workingNode);\n\t\t});\n\t});\n};\n","/* eslint-disable no-param-reassign */\nimport type { BQLMutationBlock, EnrichedLinkField, EnrichedRoleField } from '../../../../types';\nimport { EdgeSchema } from '../../../../types/symbols';\nimport { v4 as uuidv4 } from 'uuid';\nimport { getOppositePlayers } from '../shared/getOppositePlayers';\n\nexport const unlinkAll = (\n\tnode: BQLMutationBlock,\n\tfield: string,\n\tfieldSchema: EnrichedLinkField | EnrichedRoleField,\n) => {\n\tconst oppositePlayers = getOppositePlayers(field, fieldSchema);\n\tconst [player] = oppositePlayers;\n\n\tnode[field] = {\n\t\t$thing: player.thing,\n\t\t$thingType: player.thingType,\n\t\t$op: 'unlink',\n\t\t$bzId: `U_${uuidv4()}`,\n\t\t[EdgeSchema]: fieldSchema,\n\t};\n};\n","import type { EnrichedBQLMutationBlock } from '../../../../types';\n\nexport const dependenciesGuard = (mut: EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[]) => {\n\tif (Array.isArray(mut)) {\n\t\tfor (const o of mut) {\n\t\t\tif (dependenciesGuard(o)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\tif (mut.$fields) {\n\t\treturn true;\n\t}\n\n\tfor (const key in mut) {\n\t\tif (key.startsWith('$')) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst value = mut[key];\n\t\tif (value && typeof value === 'object' && dependenciesGuard(mut[key])) {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n};\n","/* eslint-disable no-param-reassign */\nimport { produce } from 'immer';\nimport type {\n\tBQLMutationBlock,\n\tEnrichedBormEntity,\n\tEnrichedBormRelation,\n\tRawBQLQuery,\n\tEnrichedBQLQuery,\n\tEnrichedBormSchema,\n\tEnrichedAttributeQuery,\n\tEnrichedLinkQuery,\n\tEnrichedRoleQuery,\n\tEnrichedDataField,\n\tEnrichedLinkField,\n\tEnrichedRoleField,\n\tFilter,\n\tEnrichedRefQuery,\n\tEnrichedRefField,\n} from '../../../types';\nimport { traverse } from 'object-traversal';\nimport { getCurrentSchema, getFieldType } from '../../../helpers';\nimport { isArray, isObject } from 'radash';\nimport { FieldSchema, QueryPath } from '../../../types/symbols';\n\nexport const enrichBQLQuery = (rawBqlQuery: RawBQLQuery[], schema: EnrichedBormSchema): EnrichedBQLQuery[] => {\n\tfor (const item of rawBqlQuery) {\n\t\tif (!('$entity' in item) && !('$relation' in item) && (!('$thing' in item) || !('$thingType' in item))) {\n\t\t\tthrow new Error('No entity specified in query');\n\t\t}\n\t}\n\n\tconst batches = Array.isArray(rawBqlQuery) ? rawBqlQuery : [rawBqlQuery];\n\n\t// TODO: The raw query and the enriched query have different type.\n\t// Instead of mutating the existing object (copy + mutate)\n\t// replace `produce` and `traverse` with a function that returns a new object.\n\t// This way we don't need to force the enriched query (RawBQLQuery that has been mutated)\n\t// to have type EnrichedBQLQuery, thus we get better type check.\n\tconst enriched = produce(batches, (draft: any) =>\n\t\ttraverse(draft, (context) => {\n\t\t\tconst { value: val, meta } = context;\n\t\t\tconst value: BQLMutationBlock = val;\n\n\t\t\tif (isObject(value)) {\n\t\t\t\t// Places to be skipped\n\t\t\t\tif (meta.nodePath?.includes('.$filter') || meta.nodePath?.includes('.$playedBy')) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// 0. Everytime we have some object we append its path\n\t\t\t\t//console.log('value!', value, 'path', meta.nodePath);\n\t\t\t\tvalue[QueryPath as any] = meta.nodePath;\n\n\t\t\t\t// 1. Moving $id into filter based on schema's idFields\n\t\t\t\tif (value.$id) {\n\t\t\t\t\tconst node = value.$entity || value.$relation ? value : { [`$${value.$thingType}`]: value.$thing };\n\t\t\t\t\tconst currentSchema = getCurrentSchema(schema, node);\n\t\t\t\t\tif (!currentSchema?.name) {\n\t\t\t\t\t\tthrow new Error(`Schema not found for ${value.$thing}`);\n\t\t\t\t\t}\n\t\t\t\t\tvalue.$path = currentSchema.name;\n\t\t\t\t\tif (!Array.isArray(value.$id)) {\n\t\t\t\t\t\tvalue.$filterByUnique = true;\n\t\t\t\t\t}\n\t\t\t\t\tif (currentSchema?.idFields?.length !== 1) {\n\t\t\t\t\t\tthrow new Error('Multiple ids not yet enabled / composite ids');\n\t\t\t\t\t}\n\t\t\t\t} else if ('$entity' in value || '$relation' in value || '$thing' in value) {\n\t\t\t\t\tconst currentSchema = getCurrentSchema(schema, value);\n\t\t\t\t\tif (!currentSchema?.name) {\n\t\t\t\t\t\tthrow new Error(`Schema not found for ${value.$thing}`);\n\t\t\t\t\t}\n\t\t\t\t\tvalue.$path = currentSchema.name;\n\t\t\t\t}\n\t\t\t\t// 2. Converting $entity or $relation into $thingType and $thing\n\t\t\t\tif (value.$entity) {\n\t\t\t\t\tvalue.$thing = value.$entity;\n\t\t\t\t\tvalue.$thingType = 'entity';\n\t\t\t\t\tdelete value.$entity;\n\t\t\t\t} else if (value.$relation) {\n\t\t\t\t\tvalue.$thing = value.$relation;\n\t\t\t\t\tvalue.$thingType = 'relation';\n\t\t\t\t\tdelete value.$relation;\n\t\t\t\t}\n\n\t\t\t\tif (isObject(value) && '$thing' in value && value.$thing) {\n\t\t\t\t\tconst node = value.$entity || value.$relation ? value : { [`$${value.$thingType}`]: value.$thing };\n\n\t\t\t\t\tconst currentSchema = getCurrentSchema(schema, node);\n\t\t\t\t\tif (value.$filter) {\n\t\t\t\t\t\tif (Object.keys(value.$filter).length === 0) {\n\t\t\t\t\t\t\tvalue.$filter = undefined;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvalue.$filter = enrichFilter(value.$filter, value.$thing, schema);\n\t\t\t\t\t\t\tvalue.$filterByUnique = checkFilterByUnique(value.$filter, currentSchema);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// if no fields, then it's all fields\n\t\t\t\t\tif (value.$fields) {\n\t\t\t\t\t\tconst idFieldIncluded = value.$fields.some((field: any) =>\n\t\t\t\t\t\t\tcurrentSchema?.idFields?.includes(field?.$path || field),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (!idFieldIncluded) {\n\t\t\t\t\t\t\tvalue.$fields = [\n\t\t\t\t\t\t\t\t...value.$fields,\n\t\t\t\t\t\t\t\t...(Array.isArray(currentSchema.idFields) ? currentSchema.idFields : []),\n\t\t\t\t\t\t\t];\n\t\t\t\t\t\t\tvalue.$idNotIncluded = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst newFields = value.$fields\n\t\t\t\t\t\t\t?.flatMap((field: any) => {\n\t\t\t\t\t\t\t\tconst processed = processField(field, currentSchema, schema);\n\t\t\t\t\t\t\t\tif (Array.isArray(processed)) {\n\t\t\t\t\t\t\t\t\treturn processed;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\treturn [processed];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.filter(Boolean);\n\t\t\t\t\t\tvalue.$fields = newFields;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst allFields = getAllFields(currentSchema);\n\t\t\t\t\t\tconst newFields = allFields\n\t\t\t\t\t\t\t?.flatMap((field: any) => {\n\t\t\t\t\t\t\t\tconst processed = processField(field, currentSchema, schema);\n\t\t\t\t\t\t\t\treturn Array.isArray(processed) ? processed : [processed];\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.filter(Boolean);\n\t\t\t\t\t\tvalue.$fields = newFields;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (value.$excludedFields) {\n\t\t\t\t\t\tvalue.$fields = value.$fields.filter((f: { $path: string }) => {\n\t\t\t\t\t\t\tif (isId(currentSchema, f)) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn !value.$excludedFields.includes(f.$path);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}),\n\t);\n\t//console.log('enriched', JSON.stringify(enriched));\n\n\treturn enriched as EnrichedBQLQuery[];\n};\n\nconst getAllFields = (currentSchema: EnrichedBormEntity | EnrichedBormRelation) => {\n\tconst dataFields = currentSchema.dataFields?.map((field: any) => field.path) || [];\n\tconst linkFields = currentSchema.linkFields?.map((field: any) => field.path) || [];\n\tconst roleFields = Object.keys((currentSchema as EnrichedBormRelation).roles || {}) || [];\n\tconst refFields = Object.keys(currentSchema.refFields || {}) || [];\n\tconst allFields = [...dataFields, ...linkFields, ...roleFields, ...refFields];\n\treturn allFields;\n};\n\nconst checkFilterByUnique = ($filter: any, currentSchema: EnrichedBormEntity | EnrichedBormRelation) => {\n\tconst fields = Object.keys($filter || {});\n\treturn fields.some((field) => {\n\t\tconst fieldFilter = $filter[field];\n\t\tif (fieldFilter !== null && typeof fieldFilter !== 'undefined') {\n\t\t\tconst isIdField = currentSchema.idFields?.includes(field);\n\t\t\tconst isUniqueDataField = currentSchema.dataFields?.some(\n\t\t\t\t(f) => (f.dbPath === field || f.path === field) && f?.validations?.unique,\n\t\t\t);\n\t\t\tconst isSingle$id = field === '$id' && !Array.isArray(fieldFilter);\n\n\t\t\tconst isUniqueField = isIdField || isUniqueDataField || isSingle$id;\n\n\t\t\tif (isUniqueField) {\n\t\t\t\t// Now check if the filter on the field is an equality filter\n\t\t\t\tif (typeof fieldFilter !== 'object' || fieldFilter === null || Array.isArray(fieldFilter)) {\n\t\t\t\t\t// fieldFilter is a scalar value, so consider equality\n\t\t\t\t\tif (!Array.isArray(fieldFilter)) {\n\t\t\t\t\t\t// Scalar value, equality filter\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Array of values, IN filter; not unique\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// fieldFilter is an object, check for $eq operator\n\t\t\t\t\tconst filterOperators = Object.keys(fieldFilter);\n\t\t\t\t\tif (filterOperators.length === 1 && filterOperators[0] === '$eq') {\n\t\t\t\t\t\t// Equality operator\n\t\t\t\t\t\tconst eqValue = fieldFilter['$eq'];\n\t\t\t\t\t\tif (typeof eqValue !== 'object' || eqValue === null || !Array.isArray(eqValue)) {\n\t\t\t\t\t\t\t// Scalar value\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// Not an equality filter on unique field\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t});\n};\n\nconst isId = (currentSchema: EnrichedBormEntity | EnrichedBormRelation, field: any) =>\n\ttypeof field === 'string' ? currentSchema.idFields?.includes(field) : currentSchema.idFields?.includes(field.$path);\n\nconst createDataField = (props: {\n\tfield: any;\n\tfieldStr: string;\n\t$justId: boolean;\n\tdbPath: string;\n\tisVirtual?: boolean;\n\tfieldSchema: EnrichedDataField;\n}): EnrichedAttributeQuery => {\n\tconst { field, fieldStr, $justId, dbPath, isVirtual, fieldSchema } = props;\n\t// todo: get all dependencies of the virtual field in the query and then remove from the output\n\treturn {\n\t\t$path: fieldStr,\n\t\t$dbPath: dbPath,\n\t\t$thingType: 'attribute',\n\t\t$as: field.$as || fieldStr,\n\t\t$var: fieldStr,\n\t\t$fieldType: 'data',\n\t\t$justId,\n\t\t$id: field.$id,\n\t\t$isVirtual: isVirtual,\n\t\t[FieldSchema]: fieldSchema,\n\t};\n};\n\nconst createLinkField = (props: {\n\tfield: any;\n\tfieldStr: string;\n\tlinkField: any;\n\t$justId: boolean;\n\tdbPath: string;\n\tschema: EnrichedBormSchema;\n\tfieldSchema: EnrichedLinkField;\n}): EnrichedLinkQuery => {\n\tconst { field, fieldStr, linkField, $justId, dbPath, schema, fieldSchema } = props;\n\tconst { target, oppositeLinkFieldsPlayedBy } = linkField;\n\treturn oppositeLinkFieldsPlayedBy.map((playedBy: any) => {\n\t\tconst $thingType = target === 'role' ? playedBy.thingType : 'relation';\n\t\tconst $thing = target === 'role' ? playedBy.thing : linkField.relation;\n\t\tconst node = { [`$${$thingType}`]: $thing };\n\t\tconst currentSchema = getCurrentSchema(schema, node);\n\t\tconst idNotIncluded = field?.$fields?.filter((f: any) => isId(currentSchema, f)).length === 0;\n\n\t\tlet fields = [];\n\t\tif (typeof field !== 'string') {\n\t\t\tif (field.$fields) {\n\t\t\t\tif (idNotIncluded) {\n\t\t\t\t\tconst idFields = currentSchema.idFields || [];\n\t\t\t\t\tfields = [...field.$fields, ...idFields];\n\t\t\t\t} else {\n\t\t\t\t\tfields = field.$fields;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfields = getAllFields(currentSchema);\n\t\t\t}\n\t\t} else {\n\t\t\tfields = ['id'];\n\t\t}\n\n\t\tif (field.$excludedFields) {\n\t\t\tfields = fields.filter((f: { $path: string }) => {\n\t\t\t\tif (isId(currentSchema, f)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn !field.$excludedFields.includes(f.$path);\n\t\t\t});\n\t\t}\n\n\t\tconst $filter =\n\t\t\tfield.$id || field.$filter //skip if no $id and not $filter. In the future $thing can filter too\n\t\t\t\t? { ...(field.$id ? { $id: field.$id } : {}), ...field.$filter }\n\t\t\t\t: undefined;\n\n\t\treturn {\n\t\t\t$thingType,\n\t\t\t$plays: linkField.plays,\n\t\t\t$playedBy: {\n\t\t\t\t...playedBy,\n\t\t\t\toppositeLinkFieldsPlayedBy: undefined, // Remove this to break the loop\n\t\t\t},\n\t\t\t$path: playedBy.path,\n\t\t\t$dbPath: dbPath,\n\t\t\t$as: field.$as || fieldStr,\n\t\t\t$var: fieldStr,\n\t\t\t$thing,\n\t\t\t$fields: fields,\n\t\t\t$excludedFields: field.$excludedFields,\n\t\t\t$fieldType: 'link',\n\t\t\t$target: target,\n\t\t\t$intermediary: playedBy.relation,\n\t\t\t$justId,\n\t\t\t$id: field.$id,\n\t\t\t$filter,\n\t\t\t$idNotIncluded: idNotIncluded,\n\t\t\t$filterByUnique: checkFilterByUnique(field.$filter, currentSchema),\n\t\t\t$sort: field.$sort,\n\t\t\t$offset: field.$offset,\n\t\t\t$limit: field.$limit,\n\t\t\t[FieldSchema]: fieldSchema,\n\t\t};\n\t});\n};\n\nconst createRefField = (props: {\n\tfield: any;\n\tfieldStr: string;\n\t$justId: boolean;\n\tdbPath: string;\n\tisVirtual?: boolean;\n\tfieldSchema: EnrichedRefField;\n}): EnrichedRefQuery => {\n\tconst { field, fieldStr, $justId, dbPath, fieldSchema } = props;\n\tif ('$filter' in props) {\n\t\tthrow new Error('Filter not supported in ref fields');\n\t}\n\treturn {\n\t\t$path: fieldStr,\n\t\t$dbPath: dbPath,\n\t\t$contentType: fieldSchema.contentType,\n\t\t$as: field.$as || fieldStr,\n\t\t$var: fieldStr,\n\t\t$fieldType: 'ref',\n\t\t$justId,\n\t\t$fields: field.$fields,\n\t\t$id: field.$id,\n\t\t[FieldSchema]: fieldSchema,\n\t};\n};\n\nconst createRoleField = (props: {\n\tfield: any;\n\tfieldStr: string;\n\troleField: any;\n\t$justId: boolean;\n\tdbPath: string;\n\tschema: EnrichedBormSchema;\n\tfieldSchema: EnrichedRoleField;\n}): EnrichedRoleQuery => {\n\tconst { field, fieldStr, roleField, $justId, dbPath, schema, fieldSchema } = props;\n\n\treturn roleField.playedBy.map((playedBy: any) => {\n\t\tconst { thing, thingType, relation } = playedBy;\n\t\tconst node = { [`$${thingType}`]: thing };\n\t\tconst currentSchema = getCurrentSchema(schema, node);\n\t\tconst idNotIncluded =\n\t\t\tfield?.$fields?.filter(\n\t\t\t\t(field: any) => currentSchema?.idFields?.includes(field) || currentSchema?.idFields?.includes(field.$path),\n\t\t\t).length === 0;\n\n\t\tlet fields = [];\n\t\tif (typeof field !== 'string') {\n\t\t\tif (field.$fields) {\n\t\t\t\tif (idNotIncluded) {\n\t\t\t\t\tconst idFields = currentSchema.idFields || [];\n\t\t\t\t\tfields = [...field.$fields, ...idFields];\n\t\t\t\t} else {\n\t\t\t\t\tfields = field.$fields;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfields = getAllFields(currentSchema);\n\t\t\t}\n\t\t} else {\n\t\t\tfields = ['id'];\n\t\t}\n\n\t\tif (field.$excludedFields) {\n\t\t\tfields = fields.filter((f: { $path: string }) => {\n\t\t\t\tif (isId(currentSchema, f)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn !field.$excludedFields.includes(f.$path);\n\t\t\t});\n\t\t}\n\n\t\tconst $filter =\n\t\t\tfield.$id || field.$filter //skip if no $id and not $filter. In the future $thing can filter too\n\t\t\t\t? { ...(field.$id ? { $id: field.$id } : {}), ...field.$filter }\n\t\t\t\t: undefined;\n\n\t\treturn {\n\t\t\t$thingType: thingType,\n\t\t\t$path: fieldStr,\n\t\t\t$dbPath: dbPath,\n\t\t\t$as: field.$as || fieldStr,\n\t\t\t$var: fieldStr,\n\t\t\t$thing: thing,\n\t\t\t$fields: fields,\n\t\t\t$excludedFields: field.$excludedFields,\n\t\t\t$fieldType: 'role',\n\t\t\t$intermediary: relation,\n\t\t\t$justId,\n\t\t\t$id: field.$id,\n\t\t\t$filter,\n\t\t\t//$filter: field.$filter,\n\t\t\t$idNotIncluded: idNotIncluded,\n\t\t\t$filterByUnique: checkFilterByUnique(field.$filter, currentSchema),\n\t\t\t$playedBy: { ...playedBy, oppositeLinkFieldsPlayedBy: undefined },\n\t\t\t$sort: field.$sort,\n\t\t\t$offset: field.$offset,\n\t\t\t$limit: field.$limit,\n\t\t\t[FieldSchema]: fieldSchema,\n\t\t};\n\t});\n};\n\nconst processField = (\n\tfield: any,\n\tcurrentSchema: EnrichedBormEntity | EnrichedBormRelation,\n\tschema: EnrichedBormSchema,\n) => {\n\tconst fieldStr = typeof field === 'string' ? field : field.$path;\n\tconst $justId = typeof field === 'string';\n\tconst dataField = currentSchema.dataFields?.find((dataField: any) => dataField.path === fieldStr);\n\tconst linkField = currentSchema.linkFields?.find((linkField: any) => linkField.path === fieldStr);\n\tconst roleField = (currentSchema as EnrichedBormRelation).roles?.[fieldStr];\n\tconst refField = currentSchema.refFields?.[fieldStr];\n\n\tif (dataField) {\n\t\tconst isVirtual = !!dataField.isVirtual && !!dataField.default; //if there is no default value, then is fully virtual, the computing is managed in the DB\n\t\treturn createDataField({\n\t\t\tfield,\n\t\t\tfieldStr,\n\t\t\t$justId,\n\t\t\tdbPath: dataField.dbPath,\n\t\t\tisVirtual,\n\t\t\tfieldSchema: dataField,\n\t\t}); //ignore computed ones\n\t} else if (linkField) {\n\t\treturn createLinkField({\n\t\t\tfield,\n\t\t\tfieldStr,\n\t\t\tlinkField,\n\t\t\t$justId,\n\t\t\tdbPath: linkField.path,\n\t\t\tschema,\n\t\t\tfieldSchema: linkField,\n\t\t});\n\t} else if (roleField) {\n\t\treturn createRoleField({\n\t\t\tfield,\n\t\t\tfieldStr,\n\t\t\troleField,\n\t\t\t$justId,\n\t\t\tdbPath: fieldStr,\n\t\t\tschema,\n\t\t\tfieldSchema: roleField,\n\t\t});\n\t} else if (refField) {\n\t\treturn createRefField({\n\t\t\tfield,\n\t\t\tfieldStr,\n\t\t\t$justId,\n\t\t\tdbPath: fieldStr,\n\t\t\tisVirtual: false,\n\t\t\tfieldSchema: refField,\n\t\t});\n\t}\n\treturn null;\n};\n\n// Recursive enrich filter that checks all the tree of filters. Sometimes is dataFields, which is easier, but sometimes is linkFields or roleFields so we need to keep drilling\nexport const enrichFilter = ($filter: Filter | Filter[], $thing: string, schema: EnrichedBormSchema) => {\n\tif ($filter === null || $filter === undefined) {\n\t\treturn $filter;\n\t}\n\tconst wasArray = isArray($filter);\n\n\tconst filterArray = wasArray ? $filter : [$filter];\n\n\tconst resultArray = filterArray.map((filter: any) => {\n\t\tconst keys = Object.keys(filter);\n\n\t\tconst enrichedFilter = keys.reduce((acc: any, key: string) => {\n\t\t\tconst value = filter[key];\n\n\t\t\tconst valueAsArray = isArray(value) ? value : [value];\n\n\t\t\tif (key.startsWith('$')) {\n\t\t\t\tif (['$id', '$thing'].includes(key)) {\n\t\t\t\t\tacc[key] = value;\n\t\t\t\t} else if (['$not', '$or', '$and'].includes(key)) {\n\t\t\t\t\t// We don't want to enrich the special keys; we enrich nested things instead\n\t\t\t\t\tacc[key] = enrichFilter(value, $thing, schema);\n\t\t\t\t} else if (['$eq', '$in', '$exists'].includes(key)) {\n\t\t\t\t\tacc[key] = value;\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(`[Internal] Unknown filter operator ${key}`);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Must be a field\n\t\t\t\tconst currentSchema = $thing in schema.entities ? schema.entities[$thing] : schema.relations[$thing];\n\t\t\t\tconst [fieldType, fieldSchema] = getFieldType(currentSchema, key);\n\n\t\t\t\tif (fieldType === 'idField') {\n\t\t\t\t\tacc[key] = value;\n\t\t\t\t} else if (fieldType === 'dataField') {\n\t\t\t\t\tif (isObject(value) || (isArray(value) && value.some(isObject))) {\n\t\t\t\t\t\tacc[key] = isArray(value)\n\t\t\t\t\t\t\t? { $or: enrichFilter(value, $thing, schema) }\n\t\t\t\t\t\t\t: enrichFilter(value, $thing, schema);\n\t\t\t\t\t} else if (isArray(value)) {\n\t\t\t\t\t\tacc[key] = { $in: value };\n\t\t\t\t\t} else {\n\t\t\t\t\t\tacc[key] = { $eq: value };\n\t\t\t\t\t}\n\t\t\t\t} else if (fieldType === 'linkField' || fieldType === 'roleField') {\n\t\t\t\t\tconst fieldSchemaTyped = fieldSchema as EnrichedLinkField | EnrichedRoleField;\n\t\t\t\t\tconst [childrenThing] = fieldSchemaTyped.$things; // TODO: Manage polymorphism\n\t\t\t\t\tif (valueAsArray.every((v: any) => typeof v === 'string')) {\n\t\t\t\t\t\tacc[key] = { $id: valueAsArray, $thing: childrenThing }; // Avoid the traverse to check this\n\t\t\t\t\t} else if (valueAsArray.every((v: any) => isObject(v))) {\n\t\t\t\t\t\tacc[key] = isArray(value)\n\t\t\t\t\t\t\t? { $or: enrichFilter(value, childrenThing, schema) }\n\t\t\t\t\t\t\t: enrichFilter(value, childrenThing, schema);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(`Field ${key} not found in schema of ${$thing}`);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn acc;\n\t\t}, {});\n\t\treturn enrichedFilter;\n\t});\n\n\tif (!wasArray) {\n\t\treturn resultArray[0];\n\t} else if (resultArray.length === 1) {\n\t\treturn resultArray[0];\n\t} else {\n\t\treturn { $or: resultArray };\n\t}\n};\n","/* eslint-disable no-param-reassign */\nimport { isArray } from 'radash';\nimport type { BQLMutationBlock, EnrichedLinkField, EnrichedRoleField } from '../../../../types';\n\nexport const preValidate = (\n\tnode: BQLMutationBlock,\n\tfield: string,\n\tfieldSchema: EnrichedLinkField | EnrichedRoleField,\n\tpaths: string[],\n) => {\n\tconst subNodes = isArray(node[field]) ? node[field] : [node[field]];\n\n\tconst cleanPath = paths.slice(1).join('.');\n\tsubNodes.forEach((subNode: BQLMutationBlock) => {\n\t\tif (!subNode) {\n\t\t\treturn;\n\t\t}\n\t\t/// For cardinality ONE, we need to specify the $op of the children\n\t\tif (\n\t\t\tfieldSchema?.cardinality === 'ONE' &&\n\t\t\t!subNode.$op &&\n\t\t\t!subNode.$id &&\n\t\t\t!subNode.$filter &&\n\t\t\t!subNode.$tempId &&\n\t\t\tnode.$op !== 'create'\n\t\t) {\n\t\t\tthrow new Error(`Please specify if it is a create or an update. Path: ${cleanPath}.${field}`);\n\t\t}\n\t\tif (subNode.$tempId) {\n\t\t\tif (\n\t\t\t\t!(\n\t\t\t\t\tsubNode.$op === undefined ||\n\t\t\t\t\tsubNode.$op === 'link' ||\n\t\t\t\t\tsubNode.$op === 'create' ||\n\t\t\t\t\tsubNode.$op === 'update' ||\n\t\t\t\t\tsubNode.$op === 'replace'\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Invalid op ${subNode.$op} for tempId. TempIds can be created, or linked when created in another part of the same mutation.`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t});\n};\n","/* eslint-disable no-param-reassign */\nimport { current, isDraft, produce } from 'immer';\nimport type { TraversalCallbackContext } from 'object-traversal';\nimport { traverse } from 'object-traversal';\nimport { isArray, isObject } from 'radash';\nimport { getCurrentFields, getCurrentSchema, getFieldSchema } from '../../../helpers';\nimport type { BQLMutationBlock, BormConfig, EnrichedBQLMutationBlock, EnrichedBormSchema } from '../../../types';\nimport { replaceToObj, replaceToObjRef } from './enrichSteps/replaces';\nimport { setRootMeta } from './enrichSteps/rootMeta';\nimport { splitMultipleIds } from './enrichSteps/splitIds';\nimport { enrichChildren } from './enrichSteps/enrichChildren';\nimport { computeFields } from './enrichSteps/computeFields';\nimport { preHookValidations } from './enrichSteps/preHookValidations';\nimport { preHookTransformations } from './enrichSteps/preHookTransformations';\nimport { doAction } from './shared/doActions';\nimport { unlinkAll } from './enrichSteps/unlinkAll';\nimport { dependenciesGuard } from './guards/dependenciesGuard';\nimport { enrichFilter } from '../../query/bql/enrich';\nimport { preValidate } from './enrichSteps/preValidate';\nimport { validateChildren } from './shared/validateOp';\nimport { SharedMetadata } from '../../../types/symbols';\n\nconst cleanStep = (node: BQLMutationBlock, field: string) => {\n\tif (node[field] === undefined) {\n\t\tdelete node[field];\n\t}\n\n\tif (field === '$tempId') {\n\t\tif (doAction('set_tempId', node)) {\n\t\t\tif (node.$tempId?.startsWith('_:')) {\n\t\t\t\tconst tempId = node.$tempId.substring(2);\n\t\t\t\tnode.$tempId = tempId;\n\t\t\t\tnode.$bzId = tempId;\n\t\t\t} else {\n\t\t\t\tthrow new Error('[Wrong format] TempIds must start with \"_:\"');\n\t\t\t}\n\t\t} else {\n\t\t\tthrow new Error('[Internal] TempId already modified');\n\t\t}\n\t}\n\n\tif (field === '$filter') {\n\t\tif (node.$filter && Object.keys(node.$filter).length === 0) {\n\t\t\tnode.$filter = undefined;\n\t\t}\n\t}\n};\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst dataFieldStep = (node: BQLMutationBlock, field: string) => {};\n\nexport const enrichBQLMutation = (\n\tblocks: BQLMutationBlock | BQLMutationBlock[] | EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[],\n\tschema: EnrichedBormSchema,\n\tconfig: BormConfig,\n): EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[] => {\n\tconst rootBlock = { $rootWrap: { $root: blocks } };\n\t// @ts-expect-error todo\n\tconst has$Fields = dependenciesGuard(Array.isArray(blocks) ? blocks : [blocks]);\n\n\tconst result = produce(rootBlock, (draft) =>\n\t\ttraverse(draft, ({ value, parent, key, meta }: TraversalCallbackContext) => {\n\t\t\tif (!parent || !key) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (isObject(value)) {\n\t\t\t\tconst paths = meta.nodePath?.split('.') || [];\n\t\t\t\tif (paths.some((p) => p.startsWith('%'))) {\n\t\t\t\t\t//we don't go inside %vars even if they are objects\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif ('$root' in value) {\n\t\t\t\t\t// This is hte $root object, we will split the real root if needed in this iteration\n\t\t\t\t} else if (!('$thing' in value || '$entity' in value || '$relation' in value)) {\n\t\t\t\t\tconst toIgnore = ['$fields', '$dbNode', '$filter'];\n\t\t\t\t\tconst lastPath = paths[paths.length - 1];\n\t\t\t\t\tconst secondToLastPath = paths[paths.length - 2];\n\t\t\t\t\tif (key === '$root') {\n\t\t\t\t\t\tthrow new Error('Root things must specify $entity or $relation');\n\t\t\t\t\t} else if (\n\t\t\t\t\t\t!toIgnore.includes(lastPath) &&\n\t\t\t\t\t\t!toIgnore.includes(secondToLastPath) &&\n\t\t\t\t\t\t!lastPath.startsWith('%') &&\n\t\t\t\t\t\t!secondToLastPath.startsWith('%')\n\t\t\t\t\t) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`[Internal] This object has not been initiated with a $thing: ${JSON.stringify(isDraft(value) ? current(value) : value)}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst node = value as EnrichedBQLMutationBlock;\n\t\t\t\tconst isFilter = paths.includes('$filter');\n\n\t\t\t\tif ('$filter' in node && node.$filter) {\n\t\t\t\t\tnode.$filter = enrichFilter(node.$filter, node.$thing, schema);\n\t\t\t\t}\n\n\t\t\t\tObject.keys(node).forEach((field) => {\n\t\t\t\t\t///1. Clean step\n\t\t\t\t\tcleanStep(node, field);\n\t\t\t\t\tif (field !== '$root' && isFilter) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (field !== '$root' && (field.startsWith('$') || field.startsWith('%'))) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst fieldSchema =\n\t\t\t\t\t\tfield !== '$root'\n\t\t\t\t\t\t\t? getFieldSchema(schema, node, field)\n\t\t\t\t\t\t\t: ({ [SharedMetadata]: { fieldType: 'rootField' } } as any);\n\t\t\t\t\tif (!fieldSchema) {\n\t\t\t\t\t\tthrow new Error(`[Internal] Field ${field} not found in schema`);\n\t\t\t\t\t}\n\n\t\t\t\t\t//console.log('field1', field, fieldSchema);\n\n\t\t\t\t\tconst { fieldType } = fieldSchema[SharedMetadata];\n\t\t\t\t\tconst relField = ['linkField', 'roleField'].includes(fieldType);\n\t\t\t\t\tconst refField = fieldType === 'refField';\n\t\t\t\t\tconst rootField = fieldType === 'rootField';\n\n\t\t\t\t\t//console.log('field2', field, fieldType);\n\t\t\t\t\t///2.DATAFIELD STEP\n\t\t\t\t\tif (fieldType === 'dataField') {\n\t\t\t\t\t\treturn dataFieldStep(node, field);\n\t\t\t\t\t}\n\n\t\t\t\t\t///3.NESTED OBJECTS: RoleFields and linkFields\n\n\t\t\t\t\t// 3.1 splitIds\n\n\t\t\t\t\t///3.2$thing => linkField or roleField or references\n\n\t\t\t\t\t///In the next steps we have (isArray(node[field]) ? node[field] : [node[field]]) multiple times, because it might mutate, can't replace by a var\n\n\t\t\t\t\t/// 3.2.1 replaces\n\t\t\t\t\tif (relField || refField) {\n\t\t\t\t\t\tif (node[field] === null) {\n\t\t\t\t\t\t\trelField ? unlinkAll(node, field, fieldSchema) : undefined;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t//todo: replaceObj in refFields, as we are just doing some validation\n\t\t\t\t\t\t\trelField ? replaceToObj(node, field, fieldSchema) : replaceToObjRef(node, field, fieldSchema);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t//3.2.2 root $thing\n\t\t\t\t\tif (rootField) {\n\t\t\t\t\t\tif (!('$root' in node)) {\n\t\t\t\t\t\t\tthrow new Error(`[Internal] Field ${field} is a rootField but the object is not a root`);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst rootNode = node as unknown as { $root: BQLMutationBlock | BQLMutationBlock[] };\n\t\t\t\t\t\tsetRootMeta(rootNode, schema);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (relField || refField) {\n\t\t\t\t\t\t// 3.2.3 BQL pre-validations => All validations should happen on subNode, if else, leaves are skipped\n\t\t\t\t\t\tpreValidate(node, field, fieldSchema, paths);\n\t\t\t\t\t}\n\t\t\t\t\t/// 3.2.4 children enrichment\n\t\t\t\t\t//redefining childrenArray as it might have changed\n\n\t\t\t\t\tif (relField || refField) {\n\t\t\t\t\t\tenrichChildren(node, field, fieldSchema, schema);\n\n\t\t\t\t\t\t//validateChildren\n\t\t\t\t\t\tvalidateChildren(node, node[field], schema);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (relField || rootField) {\n\t\t\t\t\t\t//3.2.5 splitIds()\n\t\t\t\t\t\t//this simplifies typeDB mutations\n\t\t\t\t\t\tsplitMultipleIds(node, field, schema);\n\n\t\t\t\t\t\t/// 3.2.6 Field computes on nested created nodes. It only runs in CREATE operations.\n\t\t\t\t\t\tcomputeFields(node, field, schema);\n\n\t\t\t\t\t\t// 3.2.7\n\t\t\t\t\t\t//#region BQL validations\n\t\t\t\t\t\t//Ideally, in updates we could not demand the $thing, but then we need to check that the field belongs to all the potential $things\n\t\t\t\t\t\tconst toValidate = isArray(node[field]) ? node[field] : [node[field]];\n\n\t\t\t\t\t\ttoValidate.forEach((subNode: BQLMutationBlock) => {\n\t\t\t\t\t\t\tconst subNodeSchema = getCurrentSchema(schema, subNode);\n\t\t\t\t\t\t\tconst { unidentifiedFields, usedLinkFields, usedFields, fields } = getCurrentFields(\n\t\t\t\t\t\t\t\tsubNodeSchema,\n\t\t\t\t\t\t\t\tsubNode,\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t//Check that every used field is in the fields array\n\t\t\t\t\t\t\tusedFields.forEach((uf) => {\n\t\t\t\t\t\t\t\tif (!fields.includes(uf)) {\n\t\t\t\t\t\t\t\t\tthrow new Error(`[Schema] Field ${uf} not found in the schema`);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tif (unidentifiedFields.length > 0) {\n\t\t\t\t\t\t\t\tthrow new Error(`Unknown fields: [${unidentifiedFields.join(',')}] in ${JSON.stringify(value)}`);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t//Can't use a link field with target === 'role' and another with target === 'relation' in the same mutation.\n\t\t\t\t\t\t\tif (usedLinkFields.length > 1) {\n\t\t\t\t\t\t\t\tconst usedLinkFieldsSchemas = subNodeSchema.linkFields?.filter((lf) =>\n\t\t\t\t\t\t\t\t\tusedLinkFields.includes(lf.path),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t/// Check if at least two of the usedLinkFields schemas, share same relation and have different targets\n\t\t\t\t\t\t\t\tusedLinkFieldsSchemas?.some((lf1, i) => {\n\t\t\t\t\t\t\t\t\treturn usedLinkFieldsSchemas.some((lf2, j) => {\n\t\t\t\t\t\t\t\t\t\tif (i !== j && lf1.target !== lf2.target && lf1.relation === lf2.relation) {\n\t\t\t\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t\t\t\t\"[Wrong format]: Can't use a link field with target === 'role' and another with target === 'relation' in the same mutation.\",\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (!has$Fields) {\n\t\t\t\t\t\t\t//if it has $field, it has dependencies so its still not ready for transformation\n\t\t\t\t\t\t\t//#endregion BQL validations\n\n\t\t\t\t\t\t\t// 3.3.8\n\t\t\t\t\t\t\t//#region pre-hook transformations\n\t\t\t\t\t\t\tpreHookTransformations(node, field, schema, config);\n\t\t\t\t\t\t\t//#endregion pre-hook transformations\n\n\t\t\t\t\t\t\t// 3.2.9\n\t\t\t\t\t\t\t//#region pre-hook validations\n\t\t\t\t\t\t\tpreHookValidations(node, field, schema, config);\n\t\t\t\t\t\t\t//#endregion pre-hook validations\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}),\n\t);\n\n\tif (isArray(result.$rootWrap.$root)) {\n\t\treturn result.$rootWrap.$root as EnrichedBQLMutationBlock[];\n\t} else {\n\t\treturn result.$rootWrap.$root as EnrichedBQLMutationBlock;\n\t}\n};\n","/* eslint-disable no-param-reassign */\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport { produce } from 'immer';\nimport type { TraversalCallbackContext } from 'object-traversal';\nimport { traverse } from 'object-traversal';\nimport { expect } from 'vitest';\n\nexport const deepSort = <T>(obj: T, key: string = '$id'): T => {\n\tif (typeof obj !== 'object' || obj === null) {\n\t\treturn obj;\n\t}\n\n\tconst sorter = (a: unknown, b: unknown) => {\n\t\tif (Array.isArray(a) || Array.isArray(b) || typeof a !== typeof b) {\n\t\t\t// Don't sort an array of arrays or an array with different types.\n\t\t\treturn 0;\n\t\t}\n\t\tlet aCmp;\n\t\tlet bCmp;\n\t\tif (typeof a === 'object' && a !== null) {\n\t\t\taCmp = (a as Record<string, any>)[key];\n\t\t} else {\n\t\t\taCmp = a;\n\t\t}\n\t\tif (typeof b === 'object' && b !== null) {\n\t\t\tbCmp = (b as Record<string, any>)[key];\n\t\t} else {\n\t\t\tbCmp = b;\n\t\t}\n\t\tif (aCmp < bCmp) {\n\t\t\treturn -1;\n\t\t}\n\t\tif (aCmp > bCmp) {\n\t\t\treturn 1;\n\t\t}\n\t\treturn 0;\n\t};\n\n\tif (Array.isArray(obj)) {\n\t\tconst newObj = obj.map((i) => deepSort(i, key));\n\t\treturn newObj.sort(sorter) as T;\n\t}\n\n\tif (typeof obj === 'object' && obj !== null) {\n\t\treturn Object.fromEntries(Object.entries(obj).map(([k, v]) => [k, deepSort(v, key)])) as T;\n\t}\n\n\treturn obj;\n};\n\nexport const deepRemoveMetaData = (obj: object) => {\n\tconst removeMeta = ({ value }: TraversalCallbackContext) => {\n\t\tif (value && typeof value === 'object' && '$id' in value) {\n\t\t\tconst metas = Object.keys(value).filter((k) => k.startsWith('$'));\n\t\t\tmetas.forEach((k) => delete value[k]);\n\t\t\tconst symbols = Object.keys(value).filter((s) => typeof s === 'symbol');\n\t\t\tsymbols.forEach((s) => delete value[s]);\n\t\t}\n\t\treturn value;\n\t};\n\treturn produce(obj, (draft) => traverse(draft, removeMeta));\n};\n\nconst checkRecursive = <T>(obj: T): T => {\n\tif (Array.isArray(obj)) {\n\t\treturn expect.arrayContaining(obj.map(checkRecursive)) as unknown as T;\n\t}\n\tif (typeof obj === 'object' && obj !== null) {\n\t\tconst newObj: { [key: string]: any } = {};\n\t\tObject.entries(obj).forEach(([key, value]) => {\n\t\t\tnewObj[key] = checkRecursive(value);\n\t\t});\n\t\treturn newObj as T;\n\t}\n\treturn obj;\n};\n\nexport const expectArraysInObjectToContainSameElements = <T extends any[]>(received: T, expected: T): void => {\n\tif (Array.isArray(received)) {\n\t\texpect(received.length).toEqual(expected.length);\n\t\texpect(received).toEqual(expect.arrayContaining(expected.map(checkRecursive)));\n\t} else if (typeof received === 'object' && received !== null) {\n\t\tObject.entries(received).forEach(([key, value]) => {\n\t\t\t// @ts-expect-error - TODO description\n\t\t\texpectArraysInObjectToContainSameElements(value, expected[key as keyof typeof expected]);\n\t\t});\n\t} else {\n\t\tif (typeof expected === 'string' && (expected as string).startsWith('$')) {\n\t\t\treturn;\n\t\t}\n\t\texpect(received).toEqual(expected);\n\t}\n};\n\nexport const expectResLikeTemplate = () => {};\n\n/* //TODO probably using permutations\nexport const expectResLikeTemplate = (\n res: Record<string, any>,\n template: Record<string, any>,\n tempIds: Record<string, any> = {}\n): Record<string, any> => {\n const findMatchesForTemplatesWithVars = (\n resItems: any[],\n currentTemplatesWithVars: any[],\n currentTempIds: Record<string, any>\n ): boolean => {\n if (currentTemplatesWithVars.length === 0) {\n return true;\n }\n\n const template = currentTemplatesWithVars[0];\n\n for (let i = 0; i < resItems.length; i += 1) {\n const resItem = resItems[i];\n const originalTempIds = { ...currentTempIds };\n if (typeof template === 'string' && !(template in currentTempIds)) {\n currentTempIds[template] = resItem;\n }\n if (expectResLikeTemplate(resItem, template, currentTempIds)) {\n const remainingResItems = [...resItems];\n remainingResItems.splice(i, 1);\n const remainingTemplatesWithVars = [...currentTemplatesWithVars];\n remainingTemplatesWithVars.shift();\n if (findMatchesForTemplatesWithVars(remainingResItems, remainingTemplatesWithVars, currentTempIds)) {\n return true;\n }\n }\n currentTempIds = originalTempIds;\n }\n return false;\n };\n\n const isMatch = Object.keys(template).every((key) => {\n if (Array.isArray(template[key])) {\n const templatesWithVars: any[] = [];\n const templatesWithoutVars: any[] = [];\n template[key].forEach((item: any) => {\n if (\n (typeof item === 'string' && item.startsWith('$')) ||\n (typeof item === 'object' &&\n Object.values(item).some((val: any) => typeof val === 'string' && val.startsWith('$')))\n ) {\n templatesWithVars.push(item);\n } else {\n templatesWithoutVars.push(item);\n }\n });\n\n templatesWithoutVars.every((item: any) => {\n const matchIndex = res[key].findIndex((resItem: any) => {\n return expectResLikeTemplate(resItem, item, { ...tempIds });\n });\n if (matchIndex !== -1) {\n res[key].splice(matchIndex, 1);\n return true;\n }\n return false;\n });\n\n return findMatchesForTemplatesWithVars(res[key], templatesWithVars, tempIds);\n }\n if (typeof template[key] === 'object' && template[key] !== null && !(template[key] instanceof Date)) {\n return expectResLikeTemplate(res[key], template[key], tempIds);\n }\n if (typeof template[key] === 'string' && template[key].startsWith('$')) {\n if (!(template[key] in tempIds)) {\n tempIds[template[key]] = res[key];\n }\n return res[key] === tempIds[template[key]];\n }\n return res[key] === template[key];\n });\n\n if (!isMatch) {\n throw new Error('No matching item found for template');\n }\n\n return tempIds;\n};\n*/\n","import type { TraversalCallbackContext } from 'object-traversal';\nimport { traverse } from 'object-traversal';\nimport { isArray, isObject, mapEntries, pick, shake } from 'radash';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { oFilter, getCurrentFields, getCurrentSchema, getParentNode } from '../../../helpers';\nimport type {\n\tBQLMutationBlock,\n\tBormOperation,\n\tEnrichedBQLMutationBlock,\n\tEnrichedBormRelation,\n\tEnrichedBormSchema,\n\tEnrichedLinkField,\n} from '../../../types';\nimport { computeField } from '../../../engine/compute';\nimport { deepRemoveMetaData } from '../../../../tests/helpers/matchers';\nimport { EdgeSchema, EdgeType, SharedMetadata } from '../../../types/symbols';\n\nexport const parseBQLMutation = async (\n\tblocks: EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[],\n\tschema: EnrichedBormSchema,\n) => {\n\tconst listNodes = (blocks: EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[]) => {\n\t\t// todo: make immutable\n\n\t\tconst nodes: BQLMutationBlock[] = [];\n\t\tconst edges: BQLMutationBlock[] = [];\n\n\t\t/*\n function getIdsByPath(path: string) {\n const ids = nodes.filter((node) => node[Symbol.for('path') as any] === path).map((node) => node.id);\n return ids.length === 1 ? ids[0] : ids;\n } */\n\n\t\tconst getIdValue = (node: EnrichedBQLMutationBlock) => {\n\t\t\tif (node.$id) {\n\t\t\t\treturn node.$id;\n\t\t\t}\n\n\t\t\tconst currentSchema = getCurrentSchema(schema, node);\n\t\t\tconst { idFields } = currentSchema;\n\n\t\t\tif (!idFields) {\n\t\t\t\tthrow new Error(`no idFields: ${JSON.stringify(node)}`);\n\t\t\t}\n\t\t\t// todo: composite ids\n\t\t\tconst [idField] = idFields;\n\t\t\tif (!idField) {\n\t\t\t\tthrow new Error(`no idField: ${JSON.stringify(node)}`);\n\t\t\t}\n\t\t\t/// This is adding idfields for intermediary relations. In the future maybe it would be better to add the intermediary relations in the enrich step?\n\t\t\tconst idDataField = currentSchema.dataFields?.find((x) => x.path === idField);\n\n\t\t\tconst defaultIdField = computeField({\n\t\t\t\tcurrentThing: node,\n\t\t\t\tfieldSchema: idDataField, //id is always a datafield.\n\t\t\t\tmandatoryDependencies: true, //can't send to db without every dependency being there\n\t\t\t});\n\n\t\t\tconst idValue = node[idField] || node.$id || defaultIdField;\n\n\t\t\tif (!idValue) {\n\t\t\t\tthrow new Error(`no idValue: ${JSON.stringify(node)}`);\n\t\t\t}\n\t\t\treturn idValue;\n\t\t};\n\n\t\tconst toNodes = (node: EnrichedBQLMutationBlock) => {\n\t\t\tif (node.$op === 'create') {\n\t\t\t\tconst idValue = getIdValue(node);\n\n\t\t\t\tif (nodes.find((x) => x.$id === idValue && x.$op === 'create')) {\n\t\t\t\t\tthrow new Error(`Duplicate id ${idValue} for node ${JSON.stringify(node)}`);\n\t\t\t\t}\n\n\t\t\t\tnodes.push({ ...node, $id: idValue });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (node.$tempId && node.$op === 'match') {\n\t\t\t\t/// we don't add to the node list, those that are being matched as they don't need to be matched in db and if they have a $tempId then it means... they are being created in the same query!\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tnodes.push(node);\n\t\t};\n\n\t\tconst toEdges = (edge: EnrichedBQLMutationBlock) => {\n\t\t\tif (edge.$op === 'create') {\n\t\t\t\tconst idValue = getIdValue(edge);\n\n\t\t\t\tif (nodes.find((x) => x.$id === idValue && x.$op === 'create')) {\n\t\t\t\t\tthrow new Error(`Duplicate id ${idValue} for edge ${JSON.stringify(edge)}`);\n\t\t\t\t}\n\t\t\t\tedges.push({ ...edge, $id: idValue });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tedges.push(edge);\n\t\t};\n\n\t\tconst listOp = ({ value: val, parent, meta }: TraversalCallbackContext) => {\n\t\t\tif (!isObject(val)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst value = val as EnrichedBQLMutationBlock;\n\n\t\t\tif (meta.nodePath?.includes('.$filter')) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t/// no idea why this is needed lol, but sometimes is indeed undefined 🤷‍♀️\n\t\t\tif (value.$thing) {\n\t\t\t\tif (!value.$op) {\n\t\t\t\t\tthrow new Error(`Operation should be defined at this step ${JSON.stringify(value)}`);\n\t\t\t\t}\n\n\t\t\t\tif (!value.$bzId) {\n\t\t\t\t\tthrow new Error(`[internal error] BzId not found ${JSON.stringify(value)}`);\n\t\t\t\t}\n\t\t\t\t/// this is used to group the right delete/unlink operations with the involved things\n\n\t\t\t\tconst currentThingSchema = getCurrentSchema(schema, value);\n\t\t\t\tconst {\n\t\t\t\t\tdataFields: dataFieldPaths,\n\t\t\t\t\troleFields: roleFieldPaths,\n\t\t\t\t\tlinkFields: linkFieldPaths,\n\t\t\t\t\trefFields: refFieldPaths,\n\t\t\t\t\tusedFields,\n\t\t\t\t} = getCurrentFields(currentThingSchema, value);\n\n\t\t\t\tconst getChildOp = () => {\n\t\t\t\t\tif (value.$op === 'create' || value.$op === 'delete') {\n\t\t\t\t\t\treturn value.$op;\n\t\t\t\t\t}\n\t\t\t\t\t// if its un update because linkfields or rolefields updated, but no attributes, then it a match\n\t\t\t\t\tif (value.$op === 'update') {\n\t\t\t\t\t\tconst usedDataFields = usedFields.filter((x: string) => dataFieldPaths?.includes(x));\n\t\t\t\t\t\tconst usedRoleFields = usedFields.filter((x: string) => roleFieldPaths?.includes(x));\n\t\t\t\t\t\tconst usedLinkFields = usedFields.filter((x: string) => linkFieldPaths?.includes(x));\n\t\t\t\t\t\tconst usedRefFields = usedFields.filter((x: string) => refFieldPaths?.includes(x));\n\t\t\t\t\t\tif (usedDataFields.length > 0) {\n\t\t\t\t\t\t\treturn 'update';\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (usedRoleFields.length > 0 || usedLinkFields.length > 0 || usedRefFields.length > 0) {\n\t\t\t\t\t\t\treturn 'match';\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthrow new Error(`No fields on an $op:\"update\" for node ${JSON.stringify(value)}`);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn 'match';\n\t\t\t\t};\n\n\t\t\t\tconst dataObj = {\n\t\t\t\t\t...(value.$id && { $id: value.$id }),\n\t\t\t\t\t...(value.$tempId && { $tempId: value.$tempId }),\n\t\t\t\t\t...(value.$filter && { $filter: value.$filter }),\n\t\t\t\t\t...{ $thing: value.$thing },\n\t\t\t\t\t...(value.$thingType && { $thingType: value.$thingType }),\n\t\t\t\t\t...shake(pick(value, dataFieldPaths || [''])),\n\t\t\t\t\t$op: getChildOp() as BormOperation,\n\t\t\t\t\t$bzId: value.$bzId,\n\t\t\t\t};\n\n\t\t\t\t/// split nodes with multiple ids // why? //no longer doing that\n\t\t\t\ttoNodes(dataObj);\n\n\t\t\t\t// CASE 1: HAVE A PARENT THROUGH LINKFIELDS\n\t\t\t\tconst edgeSchema = value[EdgeSchema] as EnrichedLinkField;\n\n\t\t\t\tif (edgeSchema?.[SharedMetadata].fieldType === 'linkField') {\n\t\t\t\t\tif (value.$op === 'link' || value.$op === 'unlink') {\n\t\t\t\t\t\tif (value.$id || value.$filter) {\n\t\t\t\t\t\t\tif (value.$tempId) {\n\t\t\t\t\t\t\t\tthrow new Error(\"can't specify a existing and a new element at once. Use an id/filter or a tempId\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tnodes.push({ ...value, $op: 'match' });\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// we add a \"linkable\" version of it so we can query it in the insertion\n\t\t\t\t\t}\n\n\t\t\t\t\t// this linkObj comes from nesting, which means it has no properties and no ID\n\t\t\t\t\t// relations explicitely created are not impacted by this, and they get the $id from it's actual current value\n\n\t\t\t\t\tconst ownRelation = edgeSchema.$things.includes(value.$thing); //might be a subclass of the relation\n\n\t\t\t\t\tconst linkTempId = ownRelation ? value.$bzId : `LT_${uuidv4()}`;\n\n\t\t\t\t\tconst parentNode = getParentNode(blocks, parent, meta);\n\n\t\t\t\t\tconst parentId = parentNode.$bzId;\n\n\t\t\t\t\tif (!parentId) {\n\t\t\t\t\t\tthrow new Error('No parent id found');\n\t\t\t\t\t}\n\n\t\t\t\t\tconst getLinkObjOp = () => {\n\t\t\t\t\t\tif (value.$op === 'delete') {\n\t\t\t\t\t\t\tif (ownRelation) {\n\t\t\t\t\t\t\t\treturn 'match';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn 'delete';\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (value.$op === 'unlink') {\n\t\t\t\t\t\t\tif (ownRelation) {\n\t\t\t\t\t\t\t\treturn 'unlink';\n\t\t\t\t\t\t\t} // delete already present in the nodes array\n\t\t\t\t\t\t\treturn 'delete';\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (value.$op === 'link' || value.$op === 'create') {\n\t\t\t\t\t\t\tif (ownRelation) {\n\t\t\t\t\t\t\t\treturn 'link';\n\t\t\t\t\t\t\t} // create already present in the nodes array\n\t\t\t\t\t\t\treturn 'create';\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// todo: probably check replaces\n\t\t\t\t\t\tif (value.$op === 'replace') {\n\t\t\t\t\t\t\t// Currently pre-queries do not cross reference data nested below a create operation\n\t\t\t\t\t\t\t//throw new Error('Unsupported: Nested replaces not implemented yet');\n\t\t\t\t\t\t\t/// So this does not work in typedb without replaces, so basically if you're using typeDB this should not be reached. In other DBs its ok\n\t\t\t\t\t\t\t//throw new Error('Unsupported: Nested replaces not implemented yet');\n\t\t\t\t\t\t\treturn 'replace';\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn 'match';\n\t\t\t\t\t};\n\t\t\t\t\t//validate that field is an actual role from the relation\n\t\t\t\t\tconst relationSchema = getCurrentSchema(schema, {\n\t\t\t\t\t\t$thing: edgeSchema.relation,\n\t\t\t\t\t\t$thingType: 'relation',\n\t\t\t\t\t}) as EnrichedBormRelation;\n\t\t\t\t\tconst roles = Object.keys(relationSchema.roles);\n\t\t\t\t\tif (!roles.includes(edgeSchema.plays)) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`[Wrong format] Field ${edgeSchema.plays} is not a role of relation ${edgeSchema.relation}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst edgeType1 = {\n\t\t\t\t\t\t$bzId: linkTempId,\n\t\t\t\t\t\t$thing: ownRelation ? value.$thing : edgeSchema.relation, //if it is its own relation, it might be a relation that extends it\n\t\t\t\t\t\t$thingType: 'relation' as const,\n\t\t\t\t\t\t...(value.$tempId ? { $tempId: value.$tempId } : {}),\n\t\t\t\t\t\t$op: getLinkObjOp(),\n\n\t\t\t\t\t\t// roles\n\t\t\t\t\t\t...(!ownRelation ? { [edgeSchema.path]: value.$bzId } : {}),\n\t\t\t\t\t\t[edgeSchema.plays]: parentId,\n\n\t\t\t\t\t\t//Metadata\n\t\t\t\t\t\t[EdgeSchema]: edgeSchema,\n\t\t\t\t\t\t[EdgeType]: 'linkField',\n\t\t\t\t\t};\n\n\t\t\t\t\t// const testVal = {};\n\n\t\t\t\t\t// todo: stuff 😂\n\t\t\t\t\t//@ts-expect-error - TODO\n\t\t\t\t\ttoEdges(edgeType1);\n\n\t\t\t\t\t/// when it has a parent through a linkField, we need to add an additional node (its dependency), as well as a match\n\t\t\t\t\t/// no need for links, as links will have all the related things in the \"link\" object. While unlinks required dependencies as match and deletions as unlink (or dependencies would be also added)\n\t\t\t\t\t/// this is only for relations that are not $self, as other relations will be deleted and don't need a match\n\t\t\t\t\tif ((value.$op === 'unlink' || getLinkObjOp() === 'unlink') && ownRelation) {\n\t\t\t\t\t\ttoEdges({\n\t\t\t\t\t\t\t$thing: edgeSchema.relation,\n\t\t\t\t\t\t\t$thingType: 'relation' as const,\n\t\t\t\t\t\t\t$bzId: linkTempId,\n\t\t\t\t\t\t\t$op: 'match',\n\t\t\t\t\t\t\t[edgeSchema.plays]: parentId,\n\t\t\t\t\t\t\t[EdgeSchema]: edgeSchema,\n\t\t\t\t\t\t\t[EdgeType]: 'linkField',\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// CASE 2: IS RELATION AND HAS THINGS IN THEIR ROLES\n\t\t\t\tif (value.$thingType === 'relation') {\n\t\t\t\t\tconst rolesObjFiltered = oFilter(value, (k: string, _v) => roleFieldPaths.includes(k));\n\n\t\t\t\t\t/// we don't manage cardinality MANY for now, its managed differently if we are on a create/delete op or nested link/unlink op\n\t\t\t\t\t// todo: this is super weird, remove\n\t\t\t\t\t//@ts-expect-error - TODO\n\t\t\t\t\tconst rolesObjOnlyIds = mapEntries(rolesObjFiltered, (k: string, v) => {\n\t\t\t\t\t\tif (isArray(v)) {\n\t\t\t\t\t\t\treturn [k, v];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (isObject(v)) {\n\t\t\t\t\t\t\t// @ts-expect-error - TODO description\n\t\t\t\t\t\t\treturn [k, v.$bzId];\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn [k, v];\n\t\t\t\t\t});\n\n\t\t\t\t\tconst objWithMetaDataOnly = oFilter(val, (k, _v) => {\n\t\t\t\t\t\t// @ts-expect-error - TODO description\n\t\t\t\t\t\treturn k.startsWith('$') || k.startsWith('Symbol');\n\t\t\t\t\t});\n\n\t\t\t\t\tif (Object.keys(rolesObjFiltered).filter((x) => !x.startsWith('$')).length > 0) {\n\t\t\t\t\t\t// 2.1 EDGE TYPE 2\n\t\t\t\t\t\tif (value.$op === 'create' || value.$op === 'delete') {\n\t\t\t\t\t\t\t/// if the relation is being created, then all objects in the roles are actually add\n\t\t\t\t\t\t\tconst getEdgeOp = (): BormOperation => {\n\t\t\t\t\t\t\t\tif (value.$op === 'create') {\n\t\t\t\t\t\t\t\t\treturn 'link';\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (value.$op === 'delete') {\n\t\t\t\t\t\t\t\t\treturn 'match';\n\t\t\t\t\t\t\t\t} /// if i'm not wrong, no need to unlink becasue is the director relation and will disappear 🤔\n\t\t\t\t\t\t\t\tthrow new Error('Unsupported parent of edge op');\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\tconst currentRoles = (getCurrentSchema(schema, value) as EnrichedBormRelation).roles;\n\t\t\t\t\t\t\t/// group ids when cardinality MANY\n\t\t\t\t\t\t\tconst rolesObjOnlyIdsGrouped = mapEntries(rolesObjOnlyIds, (k: string, v) => {\n\t\t\t\t\t\t\t\tconst currentRoleCardinality = currentRoles[k]?.cardinality;\n\t\t\t\t\t\t\t\tif (!currentRoleCardinality) {\n\t\t\t\t\t\t\t\t\tthrow new Error(`Role ${k} not found in schema`);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (Array.isArray(v)) {\n\t\t\t\t\t\t\t\t\tif (currentRoleCardinality === 'ONE') {\n\t\t\t\t\t\t\t\t\t\t//console.log('v!', v);\n\t\t\t\t\t\t\t\t\t\tif (v.length > 1) {\n\t\t\t\t\t\t\t\t\t\t\treturn [k, v.map((vNested: any) => vNested.$bzId || vNested)]; //Even if is Card ONE, we might actually try to link to N things, as long as the result is a single one, it is ok. The DB should throw an error if it is not the case\n\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\treturn [k, v[0].$bzId || v[0]];\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t/// Replace the array of objects with an array of ids\n\t\t\t\t\t\t\t\t\treturn [k, v.map((vNested: any) => vNested.$bzId || vNested)];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t//@ts-expect-error - TODO\n\t\t\t\t\t\t\t\treturn [k, v.$bzId || v];\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t// todo: validations\n\t\t\t\t\t\t\t/// 1) each ONE role has only ONE element // 2) no delete ops // 3) no arrayOps, because it's empty (or maybe yes and just consider it an add?) ...\n\t\t\t\t\t\t\tconst edgeType2 = {\n\t\t\t\t\t\t\t\t...objWithMetaDataOnly,\n\t\t\t\t\t\t\t\t$thing: value.$thing,\n\t\t\t\t\t\t\t\t$thingType: 'relation' as const,\n\t\t\t\t\t\t\t\t$op: getEdgeOp(),\n\t\t\t\t\t\t\t\t...rolesObjOnlyIdsGrouped, // override role fields by ids or tempIDs\n\t\t\t\t\t\t\t\t$bzId: value.$bzId,\n\t\t\t\t\t\t\t\t[EdgeType]: 'roleField' as const,\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\ttoEdges(edgeType2);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// #endregion\n\t\t\t\t\t\t// 2.2 EDGE TYPE 3\n\t\t\t\t\t\tif (value.$op === 'match' || (value.$op === 'update' && Object.keys(rolesObjFiltered).length > 0)) {\n\t\t\t\t\t\t\tlet totalUnlinks = 0;\n\n\t\t\t\t\t\t\tObject.entries(rolesObjFiltered).forEach(([role, operations]) => {\n\t\t\t\t\t\t\t\tconst operationsArray = isArray(operations) ? operations : [operations];\n\n\t\t\t\t\t\t\t\tconst getOp = (childOp: BormOperation): BormOperation => {\n\t\t\t\t\t\t\t\t\tif (childOp === 'create' || childOp === 'replace') {\n\t\t\t\t\t\t\t\t\t\t// if the children is being created, the edge is a link\n\t\t\t\t\t\t\t\t\t\treturn 'link';\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn childOp;\n\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t\toperationsArray.forEach((operation) => {\n\t\t\t\t\t\t\t\t\tif (!operation) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tconst op = getOp(operation.$op);\n\t\t\t\t\t\t\t\t\t/// validations\n\t\t\t\t\t\t\t\t\tif (op === 'replace') {\n\t\t\t\t\t\t\t\t\t\tthrow new Error('Not supported yet: replace on roleFields');\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (op === 'unlink' && totalUnlinks > 0) {\n\t\t\t\t\t\t\t\t\t\ttotalUnlinks += 1; // ugly temp solution while multiple roles can't be replaced\n\t\t\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t\t\t'Not supported yet: Cannot unlink more than one role at a time, please split into two mutations',\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t/// Edges can only be link or unlink. When its match for deletion or creation we need to know which one of those, so its either unlink or link!\n\t\t\t\t\t\t\t\t\tconst edgeType3 = {\n\t\t\t\t\t\t\t\t\t\t...objWithMetaDataOnly,\n\t\t\t\t\t\t\t\t\t\t$thing: value.$thing,\n\t\t\t\t\t\t\t\t\t\t$thingType: 'relation' as const,\n\t\t\t\t\t\t\t\t\t\t$op: op === 'delete' ? 'unlink' : op,\n\t\t\t\t\t\t\t\t\t\t[role]: operation.$bzId,\n\t\t\t\t\t\t\t\t\t\t$bzId: value.$bzId,\n\t\t\t\t\t\t\t\t\t\t[EdgeType]: 'roleField' as const,\n\t\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t\t\ttoEdges(edgeType3);\n\t\t\t\t\t\t\t\t\t/// when unlinking stuff, it must be merged with other potential roles.\n\t\t\t\t\t\t\t\t\t/// so we need to add it as both as match and 'unlink' so it gets merged with other unlinks\n\t\t\t\t\t\t\t\t\t// todo maybe a way to transform unlinks already in its own matches later? maybe split match-unlink and match-link\n\t\t\t\t\t\t\t\t\tif (op === 'unlink') {\n\t\t\t\t\t\t\t\t\t\t// toEdges({ ...edgeType3, $op: 'match' }); ///apparently no longer needed\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// throw new Error('Unsupported direct relation operation');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\ttraverse(blocks, listOp);\n\n\t\treturn [nodes, edges];\n\t};\n\n\tconst [parsedThings, parsedEdges] = listNodes(blocks);\n\t//console.log('parsedStuff', parsedThings, parsedEdges);\n\n\t//console.log('parsedThings', parsedThings);\n\t/// some cases where we extract things, they must be ignored.\n\t/// One of this cases is the situation where we have a thing that is linked somwhere and created, or updated.\n\t/// If it is only linked, we indeed need it with a \"match\" op, but if it is already there is no need to init it\n\tconst mergedThings = parsedThings.reduce((acc, thing) => {\n\t\t// Skip if the current item doesn't have a $tempId\n\t\tif (!thing.$bzId) {\n\t\t\treturn [...acc, thing];\n\t\t}\n\n\t\t// Check if this $tempId already exists in the accumulator\n\t\tconst existingIndex = acc.findIndex((t) => t.$bzId === thing.$bzId);\n\n\t\tif (existingIndex === -1) {\n\t\t\t// If it doesn't exist, add it to the accumulator\n\t\t\treturn [...acc, thing];\n\t\t}\n\t\t// If it exists, let's check the $op\n\t\tif (acc[existingIndex].$op === 'create' && thing.$op === 'match') {\n\t\t\t// If existing is 'create' and current is 'match', ignore current\n\t\t\treturn acc;\n\t\t}\n\t\tif (acc[existingIndex].$op === 'match' && (thing.$op === 'create' || thing.$op === 'match')) {\n\t\t\t// If existing is 'match' and current is 'create' or 'match', replace existing with current\n\t\t\treturn [...acc.slice(0, existingIndex), thing, ...acc.slice(existingIndex + 1)];\n\t\t}\n\t\t//if both are update, we simply merge them\n\t\tif (acc[existingIndex].$op === 'update' && thing.$op === 'update') {\n\t\t\treturn [...acc.slice(0, existingIndex), { ...acc[existingIndex], ...thing }, ...acc.slice(existingIndex + 1)];\n\t\t}\n\t\t//if one is update and the other is merge, same, we merge them and keep it as update.\n\t\tif (\n\t\t\t(acc[existingIndex].$op === 'update' && thing.$op === 'match') ||\n\t\t\t(acc[existingIndex].$op === 'match' && thing.$op === 'update')\n\t\t) {\n\t\t\treturn [\n\t\t\t\t...acc.slice(0, existingIndex),\n\t\t\t\t{ ...acc[existingIndex], ...thing, $op: 'update' },\n\t\t\t\t...acc.slice(existingIndex + 1),\n\t\t\t];\n\t\t}\n\t\t//if both are deletions, is fine as long as they have the same $filter\n\t\tif (acc[existingIndex].$op === 'delete' && thing.$op === 'delete') {\n\t\t\tif (JSON.stringify(acc[existingIndex].$filter) === JSON.stringify(thing.$filter)) {\n\t\t\t\treturn acc;\n\t\t\t} else {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`[Wrong format] Can't delete the same thing with different filters. Existing: ${acc[existingIndex].$filter}. Current: ${thing.$filter}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\t// For all other cases, throw an error\n\t\tthrow new Error(\n\t\t\t`[Wrong format] Wrong operation combination for $tempId/$id \"${thing.$tempId || thing.$id}\". Existing: ${acc[existingIndex].$op}. Current: ${thing.$op}`,\n\t\t);\n\t}, [] as BQLMutationBlock[]);\n\n\t/// merge attributes of relations that share the same $id\n\t/// WHY => because sometimes we get the relation because of having a parent, and other times because it is specified in the relation's properties\n\tconst mergedEdges = parsedEdges.reduce((acc, curr) => {\n\t\tconst existingEdge = acc.find(\n\t\t\t(r) =>\n\t\t\t\t((r.$id && r.$id === curr.$id) || (r.$bzId && r.$bzId === curr.$bzId)) &&\n\t\t\t\tr.$thing === curr.$thing &&\n\t\t\t\tr.$op === curr.$op,\n\t\t);\n\n\t\tif (existingEdge) {\n\t\t\tconst newRelation = { ...existingEdge };\n\n\t\t\tObject.keys(curr).forEach((key) => {\n\t\t\t\tif (typeof key === 'symbol' || key.startsWith('$')) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst existingVal = existingEdge[key];\n\t\t\t\tconst currVal = curr[key];\n\n\t\t\t\t//both values are arrays\n\t\t\t\tif (Array.isArray(existingVal) && Array.isArray(currVal)) {\n\t\t\t\t\tnewRelation[key] = Array.from(new Set([...existingVal, ...currVal]));\n\t\t\t\t}\n\t\t\t\t///the curent one is not but hte new one it is\n\t\t\t\telse if (!Array.isArray(existingVal) && Array.isArray(currVal)) {\n\t\t\t\t\tif (existingVal !== undefined) {\n\t\t\t\t\t\t// Avoid merging with undefined values.\n\t\t\t\t\t\tnewRelation[key] = Array.from(new Set([existingVal, ...currVal]));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnewRelation[key] = currVal;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t///the current one is but the new one it is not\n\t\t\t\telse if (Array.isArray(existingVal) && !Array.isArray(currVal)) {\n\t\t\t\t\tif (currVal !== undefined) {\n\t\t\t\t\t\t// Avoid merging with undefined values.\n\t\t\t\t\t\tnewRelation[key] = Array.from(new Set([...existingVal, currVal]));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t//both exist and are not arrays\n\t\t\t\telse if (existingVal !== null && currVal !== null && existingVal !== undefined && currVal !== undefined) {\n\t\t\t\t\tnewRelation[key] = Array.from(new Set([existingVal, currVal]));\n\t\t\t\t} else if (existingVal === undefined || existingVal === null) {\n\t\t\t\t\tnewRelation[key] = currVal;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tconst newAcc = acc.filter(\n\t\t\t\t(r) =>\n\t\t\t\t\t!(\n\t\t\t\t\t\t((r.$id && r.$id === curr.$id) || (r.$bzId && r.$bzId === curr.$bzId)) &&\n\t\t\t\t\t\tr.$thing === curr.$thing &&\n\t\t\t\t\t\tr.$op === curr.$op\n\t\t\t\t\t),\n\t\t\t);\n\n\t\t\treturn [...newAcc, newRelation];\n\t\t}\n\n\t\treturn [...acc, curr];\n\t}, [] as BQLMutationBlock[]);\n\n\t//console.log('parsedThings', parsedThings);\n\t//console.log('parsedEdges', parsedEdges);\n\t//console.log('mergedEdges', mergedEdges);\n\t/// VALIDATIONS\n\n\t// VALIDATION: Check that every thing in the list that is an edge, has at least one player\n\n\tmergedThings.forEach((thing) => {\n\t\tif (thing.$thingType === 'relation' || 'relation' in thing) {\n\t\t\t//if it is a relation, we need at lease one edge defined for it\n\t\t\tif (\n\t\t\t\tmergedEdges.filter((edge) => edge.$bzId === thing.$bzId || (edge.$tempId && edge.$tempId === thing.$tempId))\n\t\t\t\t\t.length === 0\n\t\t\t) {\n\t\t\t\tif (thing.$op === 'delete' || thing.$op === 'match' || thing.$op === 'update') {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`[Wrong format] Can't create a relation without any player. Node: ${JSON.stringify(deepRemoveMetaData(thing))}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t});\n\n\t///Validate that each tempId has at least one creation op:\n\tconst allThings = [...mergedThings, ...mergedEdges];\n\tconst tempIds = new Set(allThings.filter((x) => x.$tempId).map((x) => x.$tempId));\n\tconst orphanTempIds = Array.from(tempIds).filter(\n\t\t(tempId) => !allThings.some((x) => x.$tempId === tempId && x.$op === 'create'),\n\t);\n\n\tif (orphanTempIds.length > 0) {\n\t\tthrow new Error(\n\t\t\t`Can't link a $tempId that has not been created in the current mutation: ${orphanTempIds.join(', ')}`,\n\t\t);\n\t}\n\n\treturn {\n\t\tmergedThings,\n\t\tmergedEdges,\n\t};\n};\n","/* eslint-disable no-param-reassign */\nimport { produce } from 'immer';\nimport { traverse } from 'object-traversal';\nimport { isArray, isObject } from 'radash';\nimport type {\n\tBQLResponse,\n\tBormConfig,\n\tDBHandles,\n\tEnrichedBQLMutationBlock,\n\tEnrichedBormSchema,\n\tFilledBQLMutationBlock,\n} from '../../../types';\nimport { getCardinality, getCurrentSchema, getSymbols } from '../../../helpers';\nimport { v4 as uuidv4 } from 'uuid';\nimport { runQueryMachine } from '../../query/queryMachine';\n\nexport const preQueryPathSeparator = '___';\ntype ObjectPath = { beforePath: string; ids: string | string[]; key: string };\n\nconst grandChildOfCreateSymbol = Symbol.for('grandChildOfCreate');\n\nexport const mutationPreQuery = async (\n\tblocks: EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[],\n\tschema: EnrichedBormSchema,\n\tconfig: BormConfig,\n\tdbHandles: DBHandles,\n) => {\n\tconst operatorKeys = ['$eq', '$ne', '$in', '$nin', '$gt', '$gte', '$lt', '$lte', '$exists'];\n\n\tconst getFieldKeys = (block: FilledBQLMutationBlock | Partial<FilledBQLMutationBlock>, noDataFields?: boolean) => {\n\t\treturn Object.keys(block).filter((key) => {\n\t\t\tif (!key.startsWith('$') && !operatorKeys.includes(key) && block[key] !== undefined) {\n\t\t\t\tif (noDataFields) {\n\t\t\t\t\tconst currentSchema = getCurrentSchema(schema, block);\n\t\t\t\t\tif (currentSchema.dataFields?.find((field) => field.path === key)) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t};\n\n\t/// 1. Check if pre-query should be run\n\n\tif (!blocks) {\n\t\tthrow new Error('[BQLE-M-PQ-1] No blocks found');\n\t}\n\n\tif (config.mutation?.preQuery === false) {\n\t\treturn;\n\t}\n\n\tconst ops: string[] = [];\n\n\ttraverse(blocks, ({ parent, key, value }) => {\n\t\tif (parent && key && !key.includes('$') && !operatorKeys.includes(key) && isObject(parent)) {\n\t\t\tconst values = Array.isArray(parent[key]) ? parent[key] : [parent[key]];\n\t\t\tvalues.forEach((val) => {\n\t\t\t\tif (isObject(val)) {\n\t\t\t\t\tif (parent.$op !== 'create') {\n\t\t\t\t\t\t// @ts-expect-error todo\n\t\t\t\t\t\tif (!ops.includes(val.$op)) {\n\t\t\t\t\t\t\t// @ts-expect-error todo\n\t\t\t\t\t\t\tops.push(val.$op);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// @ts-expect-error todo\n\t\t\t\t\t\tif (val.$op === 'delete' || val.$op === 'unlink') {\n\t\t\t\t\t\t\t// @ts-expect-error todo\n\t\t\t\t\t\t\tthrow new Error(`Cannot ${val.$op} under a create`);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t} else if (!parent && isObject(value)) {\n\t\t\t// @ts-expect-error todo\n\t\t\tif (!ops.includes(value.$op)) {\n\t\t\t\t// @ts-expect-error todo\n\t\t\t\tops.push(value.$op);\n\t\t\t}\n\t\t}\n\t});\n\n\tif (\n\t\t!ops.includes('delete') &&\n\t\t!ops.includes('unlink') &&\n\t\t!ops.includes('replace') &&\n\t\t!ops.includes('update') &&\n\t\t!ops.includes('link')\n\t) {\n\t\treturn;\n\t}\n\t/// 2. Convert mutation into query for all children nodes\n\n\tconst convertMutationToQuery = (blocks: FilledBQLMutationBlock[]) => {\n\t\tconst processBlock = (block: FilledBQLMutationBlock, root?: boolean) => {\n\t\t\tlet $fields: any[] = [];\n\t\t\tconst filteredBlock = {};\n\t\t\tconst toRemoveFromRoot = ['$op', '$bzId', '$parentKey'];\n\t\t\tconst toRemove = ['$relation', '$entity', '$id', ...toRemoveFromRoot];\n\t\t\tfor (const k in block) {\n\t\t\t\tif (toRemoveFromRoot.includes(k)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (toRemove.includes(k) && !root) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (!k.includes('$') && (isObject(block[k]) || Array.isArray(block[k]))) {\n\t\t\t\t\tconst v = extractValueFromFilter(block[k]) as FilledBQLMutationBlock;\n\n\t\t\t\t\tif (Array.isArray(v) && v.length > 0) {\n\t\t\t\t\t\tv.forEach((opBlock) => {\n\t\t\t\t\t\t\tconst newField = {\n\t\t\t\t\t\t\t\t$path: k,\n\t\t\t\t\t\t\t\t...processBlock(opBlock),\n\t\t\t\t\t\t\t\t...(opBlock.$filter && { $as: opBlock.$bzId }),\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t// todo: make sure it keeps the one with the most keys\n\t\t\t\t\t\t\tif (!$fields.find((o) => o.$path === newField.$path && !o.$filter)) {\n\t\t\t\t\t\t\t\t$fields = [...$fields, newField];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst newField = {\n\t\t\t\t\t\t\t$path: k,\n\t\t\t\t\t\t\t...processBlock(v),\n\t\t\t\t\t\t\t...(!v.$filter && { $as: v.$bzId }),\n\t\t\t\t\t\t};\n\t\t\t\t\t\t$fields = [...$fields, newField];\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// @ts-expect-error todo\n\t\t\t\t\tfilteredBlock[k] = block[k];\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...filteredBlock,\n\t\t\t\t$fields,\n\t\t\t};\n\t\t};\n\t\treturn blocks.map((block) => processBlock(block, true));\n\t};\n\n\tconst preQueryReq = convertMutationToQuery(Array.isArray(blocks) ? blocks : [blocks]);\n\t//console.log('preQueryReq', JSON.stringify(preQueryReq, null, 2));\n\n\t/// 3. Perform query\n\tconst res = await runQueryMachine(\n\t\t// @ts-expect-error todo\n\t\tpreQueryReq,\n\t\tschema,\n\t\t{ ...config, query: { ...config.query, returnNulls: true } },\n\t\tdbHandles,\n\t);\n\tconst preQueryRes = res.bql.res as BQLResponse[];\n\n\tconst getObjectPath = (parent: any, key: string) => {\n\t\tconst idField: string | string[] = parent.$id || parent.id || parent.$bzId;\n\t\tif (parent.$objectPath) {\n\t\t\tconst { $objectPath } = parent;\n\n\t\t\tconst root = $objectPath?.beforePath || 'root';\n\t\t\tconst ids = Array.isArray($objectPath.ids) ? `[${$objectPath.ids}]` : $objectPath.ids;\n\t\t\tconst final = `${root}.${ids}___${$objectPath.key}`;\n\n\t\t\tconst new$objectPath = {\n\t\t\t\tbeforePath: final,\n\t\t\t\tids: idField,\n\t\t\t\tkey,\n\t\t\t};\n\t\t\treturn new$objectPath;\n\t\t} else {\n\t\t\treturn {\n\t\t\t\tbeforePath: 'root',\n\t\t\t\tids: idField,\n\t\t\t\tkey,\n\t\t\t};\n\t\t}\n\n\t\t// return `${parent.$objectPath || 'root'}${idField ? `.${idField}` : ''}${preQueryPathSeparator}${key}`;\n\t};\n\n\tconst objectPathToKey = ($objectPath: ObjectPath, hardId?: string) => {\n\t\tconst root = $objectPath?.beforePath || 'root';\n\t\tif (typeof root !== 'string') {\n\t\t\tthrow new Error('[PQ]objectPathToKey: root is not a string');\n\t\t}\n\t\tconst ids = hardId ? hardId : Array.isArray($objectPath?.ids) ? `[${$objectPath?.ids}]` : $objectPath?.ids;\n\n\t\tconst final = `${root}.${ids}___${$objectPath?.key}`;\n\n\t\treturn final;\n\t};\n\n\tconst convertManyPaths = (input: string) => {\n\t\t// Check if the string contains square brackets\n\t\tif (input.includes('[') && input.includes(']')) {\n\t\t\t// Extract the part before the brackets, the items within the brackets, and the part after the brackets\n\t\t\tconst [prefix, itemsWithBrackets, suffix] = input.split(/[[\\]]/);\n\t\t\tconst items = itemsWithBrackets.split(',');\n\n\t\t\t// Combine each item with the prefix and suffix and return the array\n\t\t\treturn items.map((item) => `${prefix}${item}${suffix}`);\n\t\t} else {\n\t\t\t// If no brackets are present, return an array with the original string\n\t\t\treturn [input];\n\t\t}\n\t};\n\n\t// 4. Create cache of paths\n\ttype Cache<K extends string> = {\n\t\t[key in K]: {\n\t\t\t$objectPath: ObjectPath;\n\t\t\t$ids: string[];\n\t\t} | null;\n\t};\n\tconst cache: Cache<string> = {};\n\tconst cachePaths = (\n\t\tblocks: FilledBQLMutationBlock | FilledBQLMutationBlock[],\n\t): FilledBQLMutationBlock | FilledBQLMutationBlock[] => {\n\t\treturn produce(blocks, (draft) =>\n\t\t\ttraverse(draft, ({ key, parent }) => {\n\t\t\t\tif (parent && key && parent.$id && !key.includes('$')) {\n\t\t\t\t\tconst newObjPath = getObjectPath(parent, key);\n\t\t\t\t\tconst cacheKey = objectPathToKey(newObjPath);\n\t\t\t\t\tif (Array.isArray(parent[key])) {\n\t\t\t\t\t\t// @ts-expect-error todo\n\t\t\t\t\t\tconst cacheArray = [];\n\t\t\t\t\t\tparent[key].forEach((val) => {\n\t\t\t\t\t\t\tif (isObject(val)) {\n\t\t\t\t\t\t\t\t// @ts-expect-error todo\n\t\t\t\t\t\t\t\t// eslint-disable-next-line no-param-reassign\n\t\t\t\t\t\t\t\tval.$objectPath = newObjPath;\n\t\t\t\t\t\t\t\t// @ts-expect-error todo\n\t\t\t\t\t\t\t\tcacheArray.push(val.$id.toString());\n\t\t\t\t\t\t\t} else if (val) {\n\t\t\t\t\t\t\t\tcacheArray.push(val.toString());\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t\t// @ts-expect-error todo\n\t\t\t\t\t\tcache[cacheKey] = { $objectPath: newObjPath, $ids: cacheArray };\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst val = parent[key];\n\t\t\t\t\t\tif (isObject(val)) {\n\t\t\t\t\t\t\t// @ts-expect-error todo\n\t\t\t\t\t\t\tcache[cacheKey] = { $objectPath: newObjPath, $ids: [val.$id.toString()] };\n\n\t\t\t\t\t\t\t// @ts-expect-error todo\n\t\t\t\t\t\t\t// eslint-disable-next-line no-param-reassign\n\t\t\t\t\t\t\tval.$objectPath = newObjPath;\n\t\t\t\t\t\t} else if (val) {\n\t\t\t\t\t\t\tcache[cacheKey] = { $objectPath: newObjPath, $ids: [val.toString()] };\n\t\t\t\t\t\t} else if (val === null) {\n\t\t\t\t\t\t\tcache[cacheKey] = null; //we clarify a null entry, which means it was queried, but found empty (to be pruned)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}),\n\t\t);\n\t};\n\t//@ts-expect-error - todo\n\tcachePaths(preQueryRes || {});\n\n\t/// 5. Fill all nodes with their correct object paths\n\n\tconst fillObjectPaths = (\n\t\tblocks: FilledBQLMutationBlock | FilledBQLMutationBlock[],\n\t): FilledBQLMutationBlock | FilledBQLMutationBlock[] => {\n\t\treturn produce(blocks, (draft) =>\n\t\t\ttraverse(draft, ({ key, value, parent }) => {\n\t\t\t\tif (\n\t\t\t\t\tparent &&\n\t\t\t\t\tkey &&\n\t\t\t\t\t!key.includes('$') &&\n\t\t\t\t\t(Array.isArray(value) || isObject(value)) &&\n\t\t\t\t\t!Array.isArray(parent)\n\t\t\t\t) {\n\t\t\t\t\tif (Array.isArray(parent[key])) {\n\t\t\t\t\t\tparent[key].forEach(\n\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\to: string | { $objectPath: ObjectPath; $parentIsCreate: boolean; [grandChildOfCreateSymbol]: boolean },\n\t\t\t\t\t\t\t) => {\n\t\t\t\t\t\t\t\tif (typeof o !== 'string') {\n\t\t\t\t\t\t\t\t\t// eslint-disable-next-line no-param-reassign\n\t\t\t\t\t\t\t\t\to.$objectPath = getObjectPath(parent, key);\n\t\t\t\t\t\t\t\t\t// eslint-disable-next-line no-param-reassign\n\t\t\t\t\t\t\t\t\to.$parentIsCreate = parent.$op === 'create';\n\t\t\t\t\t\t\t\t\t// eslint-disable-next-line no-param-reassign\n\t\t\t\t\t\t\t\t\to[grandChildOfCreateSymbol] =\n\t\t\t\t\t\t\t\t\t\tparent.$parentIsCreate || parent[Symbol.for('grandChildOfCreate') as any];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if (isObject(parent[key])) {\n\t\t\t\t\t\t//@ts-expect-error - todo\n\t\t\t\t\t\tparent[key].$parentIsCreate = parent.$op === 'create';\n\t\t\t\t\t\t//@ts-expect-error - todo\n\t\t\t\t\t\tparent[key][Symbol.for('grandChildOfCreate')] =\n\t\t\t\t\t\t\tparent.$parentIsCreate || parent[Symbol.for('grandChildOfCreate') as any];\n\t\t\t\t\t\t//@ts-expect-error - todo\n\t\t\t\t\t\tparent[key].$objectPath = getObjectPath(parent, key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}),\n\t\t);\n\t};\n\n\tconst bqlWithObjectPaths = fillObjectPaths(blocks);\n\n\t/// 6. For every node that doesn't have a $id, give it the correct ones based on the pre-query\n\n\tconst fillIds = (blocks: FilledBQLMutationBlock[]) => {\n\t\tconst newBlocks: FilledBQLMutationBlock[] = [];\n\t\tblocks.forEach((block) => {\n\t\t\t// todo: if block has a filter, do a filter search in the cache\n\t\t\tif (!block.$id && !block.id && !block.$tempId) {\n\t\t\t\tif (block.$filter) {\n\t\t\t\t\tconst cacheKey = objectPathToKey({ ...block.$objectPath, key: block.$bzId });\n\t\t\t\t\tconst cacheFound = cache[cacheKey];\n\n\t\t\t\t\tif (cacheFound) {\n\t\t\t\t\t\tconst ids = Array.isArray(cacheFound.$ids) ? cacheFound.$ids : [cacheFound.$ids];\n\t\t\t\t\t\tids.forEach((id) => {\n\t\t\t\t\t\t\tconst newBlock = { ...block, $id: id, $bzId: `T4_${uuidv4()}`, $filterBzId: block.$bzId };\n\t\t\t\t\t\t\tnewBlocks.push(newBlock);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst cacheKey = objectPathToKey(block.$objectPath);\n\t\t\t\t\tconst cacheFound = cache[cacheKey];\n\n\t\t\t\t\tif (cacheFound) {\n\t\t\t\t\t\tcacheFound?.$ids?.forEach((id) => {\n\t\t\t\t\t\t\tconst newBlock = { ...block, $id: id, $bzId: `T4_${uuidv4()}` };\n\t\t\t\t\t\t\tnewBlocks.push(newBlock);\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnewBlocks.push(block);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tnewBlocks.push(block);\n\t\t\t}\n\t\t});\n\n\t\tconst finalBlocks = newBlocks.map((block) => {\n\t\t\tconst newBlock = { ...block };\n\t\t\tgetFieldKeys(newBlock, true).forEach((key) => {\n\t\t\t\tconst subBlocks = Array.isArray(newBlock[key]) ? newBlock[key] : [newBlock[key]];\n\t\t\t\tconst newSubBlocks = fillIds(subBlocks);\n\t\t\t\tnewBlock[key] = newSubBlocks;\n\t\t\t});\n\t\t\treturn newBlock;\n\t\t});\n\t\treturn finalBlocks;\n\t};\n\n\tconst bqlFilledIds = fillIds(Array.isArray(bqlWithObjectPaths) ? bqlWithObjectPaths : [bqlWithObjectPaths]);\n\tconst newFilled = fillObjectPaths(bqlFilledIds);\n\n\t/// 7. For every node that is a multiple (many $ids or $filter), find all combinations that are based on the pre-query\n\n\tconst splitBzIds = (blocks: FilledBQLMutationBlock[]) => {\n\t\tconst processBlocks = (blocks: FilledBQLMutationBlock[]) => {\n\t\t\t// a. Filter operations with multiples and operations without multiples\n\t\t\tconst getOperationsWithMultiples = (opBlocks: FilledBQLMutationBlock[]) => {\n\t\t\t\tconst operationWithMultiples: FilledBQLMutationBlock[] = [];\n\t\t\t\tconst operationWithoutMultiples: FilledBQLMutationBlock[] = [];\n\t\t\t\tconst otherOps: FilledBQLMutationBlock[] = [];\n\n\t\t\t\topBlocks.forEach((opBlock) => {\n\t\t\t\t\tconst keys = getFieldKeys(opBlock, true);\n\n\t\t\t\t\t//keys length > 0 means its not a leaf node\n\t\t\t\t\tif (keys.length > 0) {\n\t\t\t\t\t\tlet hasMultiple = false;\n\t\t\t\t\t\tkeys.forEach((key) => {\n\t\t\t\t\t\t\tconst opBlocks: FilledBQLMutationBlock[] = Array.isArray(opBlock[key]) ? opBlock[key] : [opBlock[key]];\n\n\t\t\t\t\t\t\t// todo: check for $filters\n\t\t\t\t\t\t\tconst blockMultiples: FilledBQLMutationBlock[] = opBlocks.filter(\n\t\t\t\t\t\t\t\t(ob) => !ob.$id && !ob.id && typeof opBlock === 'object',\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (blockMultiples.length) {\n\t\t\t\t\t\t\t\thasMultiple = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif (hasMultiple) {\n\t\t\t\t\t\t\toperationWithMultiples.push(opBlock);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\toperationWithoutMultiples.push(opBlock);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t/// LEAF NODE, no keys so it probably being deleted , unlinked, or linked\n\t\t\t\t\t\tif (opBlock.$id) {\n\t\t\t\t\t\t\t//no need to split if it already has an $id, or an array of ids, we can keep its bzId\n\t\t\t\t\t\t\totherOps.push({ ...opBlock, $bzId: opBlock.$tempId || opBlock.$bzId });\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t//PQ1 is the case where its a multi but does not need to be pruned, so we are not adding the $ids\n\t\t\t\t\t\t\totherOps.push({ ...opBlock, $bzId: opBlock.$tempId || `PQ1_${uuidv4()}` });\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\treturn { operationWithMultiples, operationWithoutMultiples, otherOps };\n\t\t\t};\n\t\t\tconst { operationWithMultiples, operationWithoutMultiples, otherOps } = getOperationsWithMultiples(blocks);\n\t\t\t// b. For multiples get all possible combinations\n\t\t\tconst getAllKeyCombinations = (obj: FilledBQLMutationBlock) => {\n\t\t\t\tconst getDataFields = () => {\n\t\t\t\t\tconst dataFieldObj: any = {};\n\t\t\t\t\tfor (const key in obj) {\n\t\t\t\t\t\tconst currentSchema = getCurrentSchema(schema, obj);\n\t\t\t\t\t\tif (!key.startsWith('$') && currentSchema.dataFields?.find((df) => df.path === key)) {\n\t\t\t\t\t\t\tdataFieldObj[key] = obj[key];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn dataFieldObj;\n\t\t\t\t};\n\t\t\t\tconst dataFieldObj = getDataFields();\n\n\t\t\t\t// Get all keys, but only use non-$ keys for generating combinations\n\t\t\t\tconst allKeys = Object.keys(obj);\n\t\t\t\tconst combinableKeys = getFieldKeys(obj, true);\n\t\t\t\tconst allCombinations: Partial<FilledBQLMutationBlock>[] = [];\n\t\t\t\tconst generateCombinations = (index: number, currentObj: Partial<FilledBQLMutationBlock>) => {\n\t\t\t\t\tif (index === combinableKeys.length) {\n\t\t\t\t\t\t// Construct the full object with the current id\n\t\t\t\t\t\tconst fullObj = { ...currentObj };\n\t\t\t\t\t\tallKeys.forEach((key) => {\n\t\t\t\t\t\t\tif (key.startsWith('$')) {\n\t\t\t\t\t\t\t\tfullObj[key] = obj[key];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t\tallCombinations.push({ ...fullObj, ...dataFieldObj });\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Include the current key\n\t\t\t\t\tconst newObjInclude = {\n\t\t\t\t\t\t...currentObj,\n\t\t\t\t\t\t[combinableKeys[index]]: obj[combinableKeys[index]],\n\t\t\t\t\t\t...getSymbols(currentObj),\n\t\t\t\t\t\t...dataFieldObj,\n\t\t\t\t\t};\n\t\t\t\t\tgenerateCombinations(index + 1, newObjInclude);\n\t\t\t\t\t// Exclude the current key and move to the next\n\t\t\t\t\tgenerateCombinations(index + 1, currentObj);\n\t\t\t\t};\n\t\t\t\tgenerateCombinations(0, { ...getSymbols(obj) });\n\t\t\t\treturn allCombinations;\n\t\t\t};\n\n\t\t\t/// For all multiples we will do know all the combinations, to see if they will fail or not\n\t\t\tconst crossReferencedOperations: Partial<FilledBQLMutationBlock>[] = [];\n\t\t\toperationWithMultiples.forEach((multipleBlock) => {\n\t\t\t\tconst allCombinations: Partial<FilledBQLMutationBlock>[] = getAllKeyCombinations(multipleBlock);\n\t\t\t\tconst combinationsToKeep: Partial<FilledBQLMutationBlock>[] = [];\n\t\t\t\t// c. Check cache and prune combinations that don't have any ids in the cache\n\t\t\t\tallCombinations.forEach((combinationBlock) => {\n\t\t\t\t\tconst keys = getFieldKeys(combinationBlock, true);\n\n\t\t\t\t\t//if its creation, we can just push it, as there will be no false match in DB\n\t\t\t\t\tif (combinationBlock.$op === 'create') {\n\t\t\t\t\t\tcombinationsToKeep.push(combinationBlock);\n\t\t\t\t\t} else if (combinationBlock.$id) {\n\t\t\t\t\t\t// check result for if there exists one with the kinds of keys\n\t\t\t\t\t\tconst cacheKey = objectPathToKey(combinationBlock.$objectPath);\n\t\t\t\t\t\tconst foundKeys: { key: string; ids: string[] }[] = [];\n\t\t\t\t\t\tkeys.forEach((key) => {\n\t\t\t\t\t\t\tconst childKey = `${cacheKey.includes('undefined') ? 'root' : cacheKey}.${combinationBlock.$id}${preQueryPathSeparator}${key}`;\n\t\t\t\t\t\t\tconst cacheFound = cache[childKey];\n\t\t\t\t\t\t\tconst hasRemove =\n\t\t\t\t\t\t\t\tcombinationBlock[key].filter(\n\t\t\t\t\t\t\t\t\t(subBlock: FilledBQLMutationBlock) =>\n\t\t\t\t\t\t\t\t\t\tsubBlock.$op === 'unlink' || subBlock.$op === 'delete' || subBlock.$op === 'update',\n\t\t\t\t\t\t\t\t).length > 0;\n\t\t\t\t\t\t\tif (hasRemove) {\n\t\t\t\t\t\t\t\tif (cacheFound?.$ids) {\n\t\t\t\t\t\t\t\t\tfoundKeys.push({ key, ids: cacheFound.$ids });\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tfoundKeys.push({ key, ids: [''] });\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (foundKeys.length === keys.length && !combinationsToKeep.find((c) => c.$id === combinationBlock.$id)) {\n\t\t\t\t\t\t\tcombinationsToKeep.push(combinationBlock);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// only prune the child batched operation\n\t\t\t\t\t\t\tconst newBlock = { ...combinationBlock, $bzId: combinationBlock.$tempId || `T4_${uuidv4()}` };\n\t\t\t\t\t\t\tkeys.forEach((key) => {\n\t\t\t\t\t\t\t\t// keeping ops that aren't batched (non-multiples)\n\t\t\t\t\t\t\t\tconst newOps = combinationBlock[key].filter((op: FilledBQLMutationBlock) => op.$id);\n\t\t\t\t\t\t\t\tif (newOps.length > 0) {\n\t\t\t\t\t\t\t\t\t// @ts-expect-error todo\n\t\t\t\t\t\t\t\t\tnewBlock[key] = newOps;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t// @ts-expect-error todo\n\t\t\t\t\t\t\t\t\tnewBlock[key] = undefined;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tconst newBlockKeys = getFieldKeys(newBlock, true);\n\t\t\t\t\t\t\tif (newBlockKeys.length > 0) {\n\t\t\t\t\t\t\t\tcombinationsToKeep.push(newBlock);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// When the block is not from the root level\n\t\t\t\t\telse if (combinationBlock.$objectPath) {\n\t\t\t\t\t\tconst parentKey = objectPathToKey(combinationBlock.$objectPath);\n\n\t\t\t\t\t\t// d. get all ids of the parent block\n\t\t\t\t\t\tconst idsOfParent = cache[parentKey]?.$ids || [];\n\t\t\t\t\t\tidsOfParent.forEach((id) => {\n\t\t\t\t\t\t\tconst foundKeys: { key: string; ids: string[] }[] = [];\n\t\t\t\t\t\t\tkeys.forEach((key) => {\n\t\t\t\t\t\t\t\tconst cacheKey = `${parentKey}.${id}${preQueryPathSeparator}${key}`;\n\t\t\t\t\t\t\t\tconst cacheFound = cache[cacheKey];\n\t\t\t\t\t\t\t\tif (cacheFound) {\n\t\t\t\t\t\t\t\t\tfoundKeys.push({ key, ids: cacheFound.$ids });\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t// If this is the combination with no keys, create an opBlock per remaining $id\n\t\t\t\t\t\t\tif (keys.length === 0) {\n\t\t\t\t\t\t\t\tconst remainingIds = idsOfParent.filter((id) => !combinationsToKeep.find((c) => c.$id === id));\n\t\t\t\t\t\t\t\tremainingIds.forEach((id) => {\n\t\t\t\t\t\t\t\t\tcombinationsToKeep.push({\n\t\t\t\t\t\t\t\t\t\t...combinationBlock,\n\t\t\t\t\t\t\t\t\t\t$id: id,\n\t\t\t\t\t\t\t\t\t\t$bzId: combinationBlock.$tempId || `PQT2_${uuidv4()}`,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t} else if (foundKeys.length === keys.length && !combinationsToKeep.find((c) => c.$id === id)) {\n\t\t\t\t\t\t\t\tkeys.forEach((k) => {\n\t\t\t\t\t\t\t\t\tconst cKey = `${objectPathToKey(combinationBlock.$objectPath)}.${id}${preQueryPathSeparator}${k}`;\n\t\t\t\t\t\t\t\t\tconst $ids = cache[cKey]?.$ids || [];\n\t\t\t\t\t\t\t\t\t/// making sure other ops are included as well, replace the old batched op with these new ops\n\t\t\t\t\t\t\t\t\tconst originalOp = combinationBlock[k].find((b: FilledBQLMutationBlock) => !b.$id);\n\t\t\t\t\t\t\t\t\tconst newBlocks = [\n\t\t\t\t\t\t\t\t\t\t...$ids.map((id) => {\n\t\t\t\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t\t\t\t...originalOp,\n\t\t\t\t\t\t\t\t\t\t\t\t$id: id,\n\t\t\t\t\t\t\t\t\t\t\t\t$objectPath: {\n\t\t\t\t\t\t\t\t\t\t\t\t\tbeforePath: combinationBlock.$objectPath.beforePath,\n\t\t\t\t\t\t\t\t\t\t\t\t\tids: id,\n\t\t\t\t\t\t\t\t\t\t\t\t\tkey: k,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t...combinationBlock[k].filter((b: FilledBQLMutationBlock) => b.$id),\n\t\t\t\t\t\t\t\t\t];\n\t\t\t\t\t\t\t\t\tif (newBlocks.length > 0) {\n\t\t\t\t\t\t\t\t\t\tcombinationBlock[k] = newBlocks;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tcombinationsToKeep.push({\n\t\t\t\t\t\t\t\t\t...combinationBlock,\n\t\t\t\t\t\t\t\t\t$id: id,\n\t\t\t\t\t\t\t\t\t$bzId: combinationBlock.$tempId || `PQ3_${uuidv4()}`,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcombinationsToKeep.push(combinationBlock);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tcombinationsToKeep.forEach((c) => {\n\t\t\t\t\tcrossReferencedOperations.push(c);\n\t\t\t\t});\n\t\t\t});\n\t\t\t//console.log('crossReferencedOperations', crossReferencedOperations);\n\n\t\t\t// filter out odd leftover cases\n\t\t\tconst allOperations = [...crossReferencedOperations, ...operationWithoutMultiples, ...otherOps];\n\t\t\tconst filteredOperations = allOperations.filter((b) => {\n\t\t\t\tconst hasKeys = getFieldKeys(b).length > 0;\n\t\t\t\tif (hasKeys) {\n\t\t\t\t\treturn true;\n\t\t\t\t} else {\n\t\t\t\t\tif (b.$op === 'update') {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// e. Recursion\n\t\t\tconst finalBlocks = filteredOperations.map((block) => {\n\t\t\t\tconst newBlock = { ...block };\n\t\t\t\tgetFieldKeys(newBlock, true).forEach((key) => {\n\t\t\t\t\tconst subBlocks = Array.isArray(newBlock[key]) ? newBlock[key] : [newBlock[key]];\n\t\t\t\t\tconst newSubBlocks = processBlocks(subBlocks);\n\t\t\t\t\tnewBlock[key] = newSubBlocks;\n\t\t\t\t});\n\t\t\t\treturn newBlock;\n\t\t\t});\n\n\t\t\treturn finalBlocks;\n\t\t};\n\t\treturn processBlocks(blocks);\n\t};\n\n\tconst splitBql = splitBzIds(Array.isArray(newFilled) ? newFilled : [newFilled]);\n\t//console.log('_____3splitBql', JSON.stringify(splitBql, null, 2));\n\n\t/// 8. For each replace, make sure you prune existing ids from pre-query that want to be kept, and add deletes for all other ids\n\n\tconst processReplaces = (blocks: FilledBQLMutationBlock[]) => {\n\t\treturn blocks.map((block) => {\n\t\t\tconst fields = getFieldKeys(block, true);\n\t\t\tconst newBlock = { ...block };\n\n\t\t\tfields.forEach((field) => {\n\t\t\t\tconst opBlocks: FilledBQLMutationBlock[] = Array.isArray(block[field]) ? block[field] : [block[field]];\n\t\t\t\tconst newOpBlocks: FilledBQLMutationBlock[] = [];\n\t\t\t\tlet replaceIds: string[] = [];\n\t\t\t\tlet createIds: string[] = [];\n\n\t\t\t\t// todo: Step 1, get all replaces and their ids as replaceIds, just push blocks that aren't replaces\n\t\t\t\t// @ts-expect-error todo\n\t\t\t\tlet replaceBlock: FilledBQLMutationBlock = {};\n\t\t\t\tconst cardinality = getCardinality(schema, block, field);\n\n\t\t\t\topBlocks\n\t\t\t\t\t.filter((opBlock) => opBlock)\n\t\t\t\t\t.forEach((opBlock) => {\n\t\t\t\t\t\t// todo: if it is create and this field is cardinality one\n\t\t\t\t\t\tif (opBlock.$op === 'replace' && opBlock.$id) {\n\t\t\t\t\t\t\t// eslint-disable-next-line prefer-destructuring\n\t\t\t\t\t\t\treplaceBlock = opBlock;\n\t\t\t\t\t\t\tif (Array.isArray(opBlock.$id)) {\n\t\t\t\t\t\t\t\treplaceIds = [...replaceIds, ...opBlock.$id];\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\treplaceIds.push(opBlock.$id);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (opBlock.$op === 'create' && cardinality === 'ONE' && opBlock.id) {\n\t\t\t\t\t\t\treplaceBlock = opBlock;\n\t\t\t\t\t\t\tif (Array.isArray(opBlock.id)) {\n\t\t\t\t\t\t\t\tcreateIds = [...replaceIds, ...opBlock.id];\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcreateIds.push(opBlock.id);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tnewOpBlocks.push(opBlock);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\tconst cacheKey = objectPathToKey(replaceBlock.$objectPath);\n\t\t\t\tconst cacheKeys = convertManyPaths(cacheKey);\n\t\t\t\tconst foundKeys = cacheKeys.map((cacheKey) => {\n\t\t\t\t\treturn cache[cacheKey];\n\t\t\t\t});\n\n\t\t\t\t// todo: Step 2, get cacheIds for this\n\t\t\t\tlet cacheIds: string[] = [];\n\t\t\t\tfoundKeys\n\t\t\t\t\t.filter((k) => k !== null && k !== undefined)\n\t\t\t\t\t.forEach((key) => {\n\t\t\t\t\t\tcacheIds = [...cacheIds, ...(key?.$ids || [])];\n\t\t\t\t\t});\n\n\t\t\t\t// todo: Step 3, unlinkIds contain all cacheIds that aren't found in replaceIds\n\t\t\t\t// todo: Step 4, linkIds are all replaceIds that aren't found in the cacheIds\n\t\t\t\tconst unlinkIds = cacheIds.filter((id) => !replaceIds.includes(id));\n\t\t\t\tconst linkIds = replaceIds.filter((id) => !cacheIds.includes(id));\n\t\t\t\tconst symbols = getSymbols(replaceBlock);\n\t\t\t\tif (unlinkIds.length > 0) {\n\t\t\t\t\tnewOpBlocks.push({\n\t\t\t\t\t\t...replaceBlock,\n\t\t\t\t\t\t$op: 'unlink',\n\t\t\t\t\t\t$id: unlinkIds,\n\t\t\t\t\t\t$bzId: replaceBlock.$tempId || `T4_${uuidv4()}`,\n\t\t\t\t\t\tid: undefined,\n\t\t\t\t\t\t...symbols,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (linkIds.length > 0) {\n\t\t\t\t\tlinkIds.forEach((id) => {\n\t\t\t\t\t\tnewOpBlocks.push({\n\t\t\t\t\t\t\t...replaceBlock,\n\t\t\t\t\t\t\t$op: 'link',\n\t\t\t\t\t\t\t$id: id,\n\t\t\t\t\t\t\t$bzId: replaceBlock.$tempId || `T5_${uuidv4()}`,\n\t\t\t\t\t\t\t...symbols,\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (createIds.length > 0) {\n\t\t\t\t\tcreateIds.forEach((id) => {\n\t\t\t\t\t\tnewOpBlocks.push({\n\t\t\t\t\t\t\t...replaceBlock,\n\t\t\t\t\t\t\t$op: 'create',\n\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t$bzId: replaceBlock.$tempId || `T6_${uuidv4()}`,\n\t\t\t\t\t\t\t...symbols,\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tnewBlock[field] = processReplaces(newOpBlocks);\n\t\t\t});\n\t\t\treturn newBlock;\n\t\t});\n\t};\n\n\t// @ts-expect-error todo\n\tconst processedReplaces = fillObjectPaths(processReplaces(fillObjectPaths(splitBql)));\n\n\t/// 9. Throw any error case\n\n\tconst throwErrors = (\n\t\tblocks: FilledBQLMutationBlock | FilledBQLMutationBlock[],\n\t): FilledBQLMutationBlock | FilledBQLMutationBlock[] => {\n\t\treturn produce(blocks, (draft) =>\n\t\t\ttraverse(draft, (context) => {\n\t\t\t\tconst { key, value, parent, meta } = context;\n\n\t\t\t\t// a. only work for role fields that are arrays or objects\n\t\t\t\tif (\n\t\t\t\t\tkey &&\n\t\t\t\t\tparent &&\n\t\t\t\t\t!key?.includes('$') &&\n\t\t\t\t\tkey !== '$filter' &&\n\t\t\t\t\t!meta.nodePath?.includes('.$filter.') && //ignore children of $filter\n\t\t\t\t\t(Array.isArray(value) || isObject(value)) &&\n\t\t\t\t\t!Array.isArray(parent)\n\t\t\t\t) {\n\t\t\t\t\tconst values: FilledBQLMutationBlock[] = Array.isArray(value) ? value : [value];\n\n\t\t\t\t\tvalues.forEach((thing) => {\n\t\t\t\t\t\t// todo: If user op is trying to link something that already has it's role filled by something else\n\n\t\t\t\t\t\tconst $objectPath = thing.$filter ? { ...thing.$objectPath, key: thing.$filterBzId } : thing.$objectPath;\n\t\t\t\t\t\tconst cacheKey = objectPathToKey($objectPath);\n\t\t\t\t\t\tconst cacheFound = cache[cacheKey];\n\n\t\t\t\t\t\tconst processArrayIdsFound = (arrayOfIds: string[], cacheOfIds: string[]) => {\n\t\t\t\t\t\t\treturn arrayOfIds.every((id) => cacheOfIds.includes(id));\n\t\t\t\t\t\t};\n\t\t\t\t\t\t// todo: if filter, use bzId\n\t\t\t\t\t\tconst isOccupied = thing.$id\n\t\t\t\t\t\t\t? Array.isArray(thing.$id)\n\t\t\t\t\t\t\t\t? processArrayIdsFound(thing.$id, cacheFound && cacheFound.$ids ? cacheFound.$ids : [])\n\t\t\t\t\t\t\t\t: cacheFound?.$ids?.includes(thing.$id)\n\t\t\t\t\t\t\t: cacheFound;\n\t\t\t\t\t\tconst cardinality = getCardinality(schema, parent, thing.$objectPath.key);\n\n\t\t\t\t\t\tif (thing.$op === 'link' && isOccupied && cardinality === 'ONE') {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`[BQLE-Q-M-2] Cannot link on:\"${objectPathToKey(thing.$objectPath)}\" because it is already occupied.`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (thing.$op) {\n\t\t\t\t\t\t\tswitch (thing.$op) {\n\t\t\t\t\t\t\t\tcase 'delete':\n\t\t\t\t\t\t\t\t\tif (!isOccupied) {\n\t\t\t\t\t\t\t\t\t\tif (!config.mutation?.ignoreNonexistingThings) {\n\t\t\t\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t\t\t\t`[BQLE-Q-M-2] Cannot delete $id:\"${thing.$id}\" because it is not linked to $id:\"${parent.$id}\"`,\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t// todo: prune\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase 'update':\n\t\t\t\t\t\t\t\t\tif (!isOccupied) {\n\t\t\t\t\t\t\t\t\t\tif (!config.mutation?.ignoreNonexistingThings) {\n\t\t\t\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t\t\t\t`[BQLE-Q-M-2] Cannot update $id:\"${thing.$id}\" because it is not linked to $id:\"${parent.$id}\"`,\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase 'unlink':\n\t\t\t\t\t\t\t\t\tif (!isOccupied) {\n\t\t\t\t\t\t\t\t\t\tif (!config.mutation?.ignoreNonexistingThings) {\n\t\t\t\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t\t\t\t`[BQLE-Q-M-2] Cannot unlink $id:\"${thing.$id}\" because it is not linked to $id:\"${parent.$id}\"`,\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase 'link':\n\t\t\t\t\t\t\t\t\tif (isOccupied) {\n\t\t\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t\t\t`[BQLE-Q-M-2] Cannot link $id:\"${thing.$id}\" because it is already linked to $id:\"${parent.$id}\"`,\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}),\n\t\t);\n\t};\n\n\tthrowErrors(processedReplaces);\n\n\t/// 10. Refill paths that are needed for the rest of the pipeline\n\n\tconst fillPaths = (\n\t\tblocks: FilledBQLMutationBlock | FilledBQLMutationBlock[],\n\t): FilledBQLMutationBlock | FilledBQLMutationBlock[] => {\n\t\treturn produce(blocks, (draft) =>\n\t\t\ttraverse(draft, (context) => {\n\t\t\t\tconst { value, meta } = context;\n\t\t\t\tif (isObject(value)) {\n\t\t\t\t\t// @ts-expect-error todo\n\t\t\t\t\tvalue[Symbol.for('path') as any] = meta.nodePath;\n\t\t\t\t\t// @ts-expect-error todo\n\t\t\t\t\tdelete value.$objectPath;\n\t\t\t\t\t// @ts-expect-error todo\n\t\t\t\t\tdelete value.$parentIsCreate;\n\t\t\t\t}\n\t\t\t}),\n\t\t);\n\t};\n\n\t/// 11. Sort tree\n\n\tconst filledPaths = fillPaths(processedReplaces);\n\tconst filledPathsArray = Array.isArray(filledPaths) ? filledPaths : [filledPaths];\n\tconst copy = [...filledPathsArray];\n\tconst sortedArray = copy.sort((a: FilledBQLMutationBlock, b: FilledBQLMutationBlock) => {\n\t\tif (a.$op === 'create' && b.$op !== 'create') {\n\t\t\treturn -1; // Move 'a' to an index lower than 'b' (to the top of the array)\n\t\t} else if (a.$op !== 'create' && b.$op === 'create') {\n\t\t\treturn 1; // Move 'b' to an index lower than 'a'\n\t\t}\n\t\treturn 0; // Keep the original order if both have the same $op value or don't involve 'create'\n\t});\n\n\treturn sortedArray;\n};\n\nconst extractValueFromFilter = (filterValue: any): any => {\n\tif (isObject(filterValue) && !isArray(filterValue)) {\n\t\tif ('$eq' in filterValue) {\n\t\t\treturn filterValue['$eq'];\n\t\t}\n\t\t// Handle other operators if needed\n\t}\n\treturn filterValue;\n};\n","/* eslint-disable import/export */\n/* eslint-disable @typescript-eslint/ban-types */\n/* eslint-disable prefer-destructuring */\n/* eslint-disable no-param-reassign */\n/* eslint-disable @typescript-eslint/no-use-before-define */\n/* eslint-disable func-style */\n/* eslint-disable no-prototype-builtins */\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\n\n/**\n * TS Helpers\n */\ntype NestedKeys<T> = T extends object\n\t? {\n\t\t\t[P in keyof T]-?: P extends string ? keyof T[P] : never;\n\t\t}[keyof T]\n\t: never;\n\ntype AllStateKeys<T> = NestedKeys<T> | keyof T;\n\n/**\n * The debugging object contains an _onEnter method, wich can be set to invoke\n * this function on every transition.\n */\nexport const d: {\n\t_onEnter?: OnEnterFunction<Machine>;\n} = {};\n\n/**\n * The `createMachine` function creates a state machine. It takes an object of *states* with the key being the state name.\n * The value is usually *state* but might also be *invoke*.\n *\n * @param initial - Creates a machine that has *initial* as it's initial state.\n * @param states - An object of states, where each key is a state name, and the values are one of *state* or *invoke*.\n * @param context - A function that returns an object of extended state values. The function can receive an `event` argument.\n */\nexport function createMachine<S = {}, C = {}>(\n\tinitial: keyof S,\n\tstates: { [K in keyof S]: MachineState },\n\tcontext?: ContextFunction<C>,\n): Machine<typeof states, C, AllStateKeys<S>>;\n/**\n * The `createMachine` function creates a state machine. It takes an object of *states* with the key being the state name.\n * The value is usually *state* but might also be *invoke*.\n *\n * @param states - An object of states, where each key is a state name, and the values are one of *state* or *invoke*.\n * @param context - A function that returns an object of extended state values. The function can receive an `event` argument.\n */\nexport function createMachine<S = {}, C = {}>(\n\tstates: { [K in keyof S]: MachineState },\n\tcontext?: ContextFunction<C>,\n): Machine<typeof states, C, AllStateKeys<S>>;\n\n/**\n * The `state` function returns a state object. A state can take transitions and immediates as arguments.\n *\n * @param args - Any argument needs to be of type Transition or Immediate.\n */\nexport function state(...args: (Transition | Immediate)[]): MachineState;\n\n/**\n * A `transition` function is used to move from one state to another.\n *\n * @param event - This will give the name of the event that triggers this transition.\n * @param state - The name of the destination state.\n * @param args - Any extra argument will be evaluated to check if they are one of Reducer, Guard or Action.\n */\nexport function transition<C, E>(\n\tevent: string,\n\tstate: string,\n\t...args: (Reducer<C, E> | Guard<C, E> | Action<C, E>)[]\n): Transition;\n\n/**\n * An `immediate` function is a type of transition that occurs immediately; it doesn't wait for an event to proceed.\n * This is a state that immediately proceeds to the next.\n *\n * @param state - The name of the destination state.\n * @param args - Any extra argument will be evaluated to check if they are a Reducer or a Guard.\n */\nexport function immediate<C, E>(state: string, ...args: (Reducer<C, E> | Guard<C, E> | Action<C, E>)[]): Transition;\n\n/**\n * A `guard` is a method that determines if a transition can proceed.\n * Returning true allows the transition to occur, returning false prevents it from doing so and leaves the state in its current place.\n *\n * @param guardFunction A Function that can receive *context* and *event* and will return true or false.\n */\nexport function guard<C, E>(guardFunction?: GuardFunction<C, E>): Guard<C, E>;\n\n/**\n * A `reduce` takes a reducer function for changing the context of the machine. A common use case is to set values coming from form fields.\n *\n * @param reduceFunction A Function that can receive *context* and *event* and will return the context.\n */\nexport function reduce<C, E>(reduceFunction?: ReduceFunction<C, E>): Reducer<C, E>;\n\n/**\n * An `action` function takes a function that will be run during a transition. The primary purpose of using action is to perform side-effects.\n *\n * @param actionFunction A Function that can receive *context* and *event*. Returned values are discarded.\n */\nexport function action<C, E>(actionFunction?: ActionFunction<C, E>): Action<C, E>;\n\n/**\n * The `interpret` function takes a machine and creates a service that can send events into the machine, changing its states.\n * A service does not mutate a machine, but rather creates derived machines with the current state set.\n *\n * @param machine The state `machine`, created with *createMachine* to create a new service for.\n * @param onChange A callback that is called when the machine completes a transition. Even if the transition results in returning to the same state, the `onChange` callback is still called.\n * @param event The `event` can be any object. It is passed to the context function\n */\nexport function interpret<M extends Machine, E>(\n\tmachine: M,\n\tonChange?: InterpretOnChangeFunction<typeof machine>,\n\tinitialContext?: M['context'],\n\tevent?: { [K in keyof E]: any },\n): Service<typeof machine>;\n\n/**\n * The `invoke` is a special type of state that immediately invokes a Promise-returning or Machine-returning function, or another machine.\n *\n * @param fn - Promise-returning function\n * @param args - Any argument needs to be of type Transition or Immediate.\n */\nexport function invoke<C, T, E extends {} = any>(\n\tfn: (ctx: C, e?: E) => Promise<T>,\n\t...args: (Transition | Immediate)[]\n): MachineState;\n\n/**\n * The `invoke` is a special type of state that immediately invokes a Promise-returning or Machine-returning function, or another machine.\n *\n * @param fn - Machine-returning function\n * @param args - Any argument needs to be of type Transition or Immediate.\n */\nexport function invoke<C, E extends {} = any, M extends Machine>(\n\tfn: (ctx: C, e?: E) => M,\n\t...args: (Transition | Immediate)[]\n): MachineState;\n\n/**\n * The `invoke` is a special type of state that immediately invokes a Promise-returning or Machine-returning function, or another machine.\n *\n * @param machine - Machine\n * @param args - Any argument needs to be of type Transition or Immediate.\n */\nexport function invoke<M extends Machine>(machine: M, ...args: (Transition | Immediate)[]): MachineState;\n\n/* General Types */\n\nexport type ContextFunction<T> = (initialContext: T) => T;\n\nexport type GuardFunction<C, E> = (context: C, event: E) => boolean;\n\nexport type ActionFunction<C, E> = (context: C, event: E) => unknown;\n\nexport type ReduceFunction<C, E> = (context: C, event: E) => C;\n\nexport type InterpretOnChangeFunction<T extends Machine> = (service: Service<T>) => void;\n\nexport type SendEvent = string | { type: string; [key: string]: any };\nexport type SendFunction<T = SendEvent> = (event: T) => void;\n\n/**\n * This function is invoked before entering a new state and is bound to the debug\n * object. It is usable to inspect or log changes.\n *\n * @param machine - Machine\n * @param to - name of the target state\n * @param state - current state\n * @param prevState - previous state\n * @param event - event provoking the state change\n */\nexport type OnEnterFunction<M extends Machine> = <C = M['state']>(\n\tmachine: M,\n\tto: string,\n\tstate: C,\n\tprevState: C,\n\tevent?: SendEvent,\n) => void;\n\nexport type Machine<S = {}, C = {}, K = string> = {\n\tcontext: C;\n\tcurrent: K;\n\tstates: S;\n\tstate: {\n\t\tname: K;\n\t\tvalue: MachineState;\n\t};\n};\n\nexport type Action<C, E> = {\n\tfn: ActionFunction<C, E>;\n};\n\nexport type Reducer<C, E> = {\n\tfn: ReduceFunction<C, E>;\n};\n\nexport type Guard<C, E> = {\n\tfn: GuardFunction<C, E>;\n};\n\nexport interface MachineState {\n\tfinal: boolean;\n\ttransitions: Map<string, Transition[]>;\n\timmediates?: Map<string, Immediate[]>;\n\tenter?: any;\n}\n\nexport interface Transition {\n\tfrom: string | null;\n\tto: string;\n\tguards: any[];\n\treducers: any[];\n}\n\nexport interface Service<M extends Machine> {\n\tchild?: Service<M>;\n\tmachine: M;\n\tcontext: M['context'];\n\tonChange: InterpretOnChangeFunction<M>;\n\tsend: SendFunction;\n}\n\nexport type Immediate = Transition;\n\nfunction valueEnumerable(value) {\n\treturn { enumerable: true, value };\n}\n\nfunction valueEnumerableWritable(value) {\n\treturn { enumerable: true, writable: true, value };\n}\n\nconst truthy = () => true;\nconst empty = () => ({});\nconst identity = (a) => a;\nconst callBoth = (par, fn, self, args) => par.apply(self, args) && fn.apply(self, args);\nconst callForward = (par, fn, self, [a, b]) => fn.call(self, par.call(self, a, b), b);\nconst create = (a, b) => Object.freeze(Object.create(a, b));\n\nfunction stack(fns, def, caller) {\n\treturn fns.reduce((par, fn) => {\n\t\treturn function (...args) {\n\t\t\treturn caller(par, fn, this, args);\n\t\t};\n\t}, def);\n}\n\nfunction fnType(fn) {\n\treturn create(this, { fn: valueEnumerable(fn) });\n}\n\nconst reduceType = {};\nexport const reduce = fnType.bind(reduceType);\nexport const action = (fn) => reduce((ctx, ev) => !!~fn(ctx, ev) && ctx);\n\nconst guardType = {};\nexport const guard = fnType.bind(guardType);\n\nfunction filter(Type, arr) {\n\treturn arr.filter((value) => Type.isPrototypeOf(value));\n}\n\nfunction makeTransition(from, to, ...args) {\n\tconst guards = stack(\n\t\tfilter(guardType, args).map((t) => t.fn),\n\t\ttruthy,\n\t\tcallBoth,\n\t);\n\tconst reducers = stack(\n\t\tfilter(reduceType, args).map((t) => t.fn),\n\t\tidentity,\n\t\tcallForward,\n\t);\n\treturn create(this, {\n\t\tfrom: valueEnumerable(from),\n\t\tto: valueEnumerable(to),\n\t\tguards: valueEnumerable(guards),\n\t\treducers: valueEnumerable(reducers),\n\t});\n}\n\nconst transitionType = {};\nconst immediateType = {};\nexport const transition = makeTransition.bind(transitionType);\nexport const immediate = makeTransition.bind(immediateType, null);\n\nfunction enterImmediate(machine, service, event) {\n\treturn transitionTo(service, machine, event, this.immediates) || machine;\n}\n\nfunction transitionsToMap(transitions) {\n\tconst m = new Map();\n\tfor (const t of transitions) {\n\t\tif (!m.has(t.from)) {\n\t\t\tm.set(t.from, []);\n\t\t}\n\t\tm.get(t.from).push(t);\n\t}\n\treturn m;\n}\n\nconst stateType = { enter: identity };\nexport function state(...args) {\n\tconst transitions = filter(transitionType, args);\n\tconst immediates = filter(immediateType, args);\n\tconst desc = {\n\t\tfinal: valueEnumerable(args.length === 0),\n\t\ttransitions: valueEnumerable(transitionsToMap(transitions)),\n\t};\n\tif (immediates.length) {\n\t\tdesc.immediates = valueEnumerable(immediates);\n\t\tdesc.enter = valueEnumerable(enterImmediate);\n\t}\n\treturn create(stateType, desc);\n}\n\nconst invokeFnType = {\n\tenter(machine2, service, event) {\n\t\tconst rn = this.fn.call(service, service.context, event);\n\t\tif (machine.isPrototypeOf(rn)) {\n\t\t\treturn create(invokeMachineType, {\n\t\t\t\tmachine: valueEnumerable(rn),\n\t\t\t\ttransitions: valueEnumerable(this.transitions),\n\t\t\t}).enter(machine2, service, event);\n\t\t}\n\t\trn.then((data) => service.send({ type: 'done', data })).catch((error) => service.send({ type: 'error', error }));\n\t\treturn machine2;\n\t},\n};\nconst invokeMachineType = {\n\tenter(machine, service, event) {\n\t\tservice.child = interpret(\n\t\t\tthis.machine,\n\t\t\t(s) => {\n\t\t\t\tservice.onChange(s);\n\t\t\t\tif (service.child == s && s.machine.state.value.final) {\n\t\t\t\t\tdelete service.child;\n\t\t\t\t\tservice.send({ type: 'done', data: s.context });\n\t\t\t\t}\n\t\t\t},\n\t\t\tservice.context,\n\t\t\tevent,\n\t\t);\n\t\tif (service.child.machine.state.value.final) {\n\t\t\tconst data = service.child.context;\n\t\t\tdelete service.child;\n\t\t\treturn transitionTo(service, machine, { type: 'done', data }, this.transitions.get('done'));\n\t\t}\n\t\treturn machine;\n\t},\n};\nexport function invoke(fn, ...transitions) {\n\tconst t = valueEnumerable(transitionsToMap(transitions));\n\treturn machine.isPrototypeOf(fn)\n\t\t? create(invokeMachineType, {\n\t\t\t\tmachine: valueEnumerable(fn),\n\t\t\t\ttransitions: t,\n\t\t\t})\n\t\t: create(invokeFnType, {\n\t\t\t\tfn: valueEnumerable(fn),\n\t\t\t\ttransitions: t,\n\t\t\t});\n}\n\nconst machine = {\n\tget state() {\n\t\treturn {\n\t\t\tname: this.current,\n\t\t\tvalue: this.states[this.current],\n\t\t};\n\t},\n};\n\nexport function createMachine(current, states, contextFn = empty) {\n\tif (typeof current !== 'string') {\n\t\tcontextFn = states || empty;\n\t\tstates = current;\n\t\tcurrent = Object.keys(states)[0];\n\t}\n\tif (d._create) {\n\t\td._create(current, states);\n\t}\n\treturn create(machine, {\n\t\tcontext: valueEnumerable(contextFn),\n\t\tcurrent: valueEnumerable(current),\n\t\tstates: valueEnumerable(states),\n\t});\n}\n\nfunction transitionTo(service, machine, fromEvent, candidates) {\n\tconst { context } = service;\n\tfor (const { to, guards, reducers } of candidates) {\n\t\tif (guards(context, fromEvent)) {\n\t\t\tservice.context = reducers.call(service, context, fromEvent);\n\n\t\t\tconst original = machine.original || machine;\n\t\t\tconst newMachine = create(original, {\n\t\t\t\tcurrent: valueEnumerable(to),\n\t\t\t\toriginal: { value: original },\n\t\t\t});\n\n\t\t\tif (d._onEnter) {\n\t\t\t\td._onEnter(machine, to, service.context, context, fromEvent);\n\t\t\t}\n\t\t\tconst state = newMachine.state.value;\n\t\t\tservice.machine = newMachine;\n\t\t\tservice.onChange(service);\n\t\t\treturn state.enter(newMachine, service, fromEvent);\n\t\t}\n\t}\n}\n\nfunction send(service, event) {\n\tconst eventName = event.type || event;\n\tconst { machine } = service;\n\tconst { value: state, name: currentStateName } = machine.state;\n\n\tif (state.transitions.has(eventName)) {\n\t\treturn transitionTo(service, machine, event, state.transitions.get(eventName)) || machine;\n\t} else {\n\t\tif (d._send) {\n\t\t\td._send(eventName, currentStateName);\n\t\t}\n\t}\n\treturn machine;\n}\n\nconst service = {\n\tsend(event) {\n\t\tsend(this, event);\n\t},\n};\n\nexport function interpret(machine, onChange, initialContext, event) {\n\tconst s = Object.create(service, {\n\t\tmachine: valueEnumerableWritable(machine),\n\t\tcontext: valueEnumerableWritable(machine.context(initialContext, event)),\n\t\tonChange: valueEnumerable(onChange),\n\t});\n\ts.send = s.send.bind(s);\n\ts.machine = s.machine.state.value.enter(s.machine, s, event);\n\treturn s;\n}\n","import { isObject, isArray } from 'radash';\nimport type { BQLResponse, BormConfig, QueryConfig } from '../../../types';\nimport { produce } from 'immer';\nimport type { TraversalCallbackContext } from 'object-traversal';\nimport { traverse } from 'object-traversal';\n\nexport const cleanQueryRes = (config: BormConfig, bqlRes: BQLResponse) => {\n\tif (!bqlRes) {\n\t\treturn;\n\t}\n\tconst withPostHooks = queryPostHooks(bqlRes);\n\tconst cleanedMetadata = cleanOutput(withPostHooks, config.query);\n\treturn cleanedMetadata;\n};\n\nconst queryPostHooks = (blocks: any) => {\n\treturn produce(blocks, (draft: any) =>\n\t\ttraverse(draft, ({ value: val }: TraversalCallbackContext) => {\n\t\t\tif (isObject(val)) {\n\t\t\t\t// eslint-disable-next-line no-param-reassign\n\t\t\t}\n\t\t}),\n\t);\n};\n\nconst cleanOutput = (blocks: any, config?: QueryConfig) => {\n\treturn produce(blocks, (draft: any) =>\n\t\ttraverse(draft, ({ value: val }: TraversalCallbackContext) => {\n\t\t\tif (isObject(val)) {\n\t\t\t\tconst value = val as any;\n\n\t\t\t\t// UNDEFINED FIELDS\n\t\t\t\tObject.keys(value).forEach((k: string) => {\n\t\t\t\t\tif (value[k] === undefined || value[k] === null || (isArray(value[k]) && value[k].length === 0)) {\n\t\t\t\t\t\tif (config?.returnNulls) {\n\t\t\t\t\t\t\tvalue[k] = null;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdelete value[k];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (value[k] === undefined) {\n\t\t\t\t\t\tdelete value[k];\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// INTERNAL SYMBOLS\n\t\t\t\tObject.getOwnPropertySymbols(value).forEach((symbol) => {\n\t\t\t\t\tdelete value[symbol];\n\t\t\t\t});\n\n\t\t\t\t/// USER FACING METADATA\n\t\t\t\tif (config?.noMetadata === true) {\n\t\t\t\t\t// eslint-disable-next-line no-param-reassign\n\t\t\t\t\tObject.keys(value).forEach((k: string) => {\n\t\t\t\t\t\tif (k.startsWith('$')) {\n\t\t\t\t\t\t\tdelete value[k];\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}),\n\t);\n};\n","import { isObject } from 'radash';\nimport { produce } from 'immer';\nimport type { TraversalCallbackContext } from 'object-traversal';\nimport { getNodeByPath, traverse } from 'object-traversal';\nimport type { BQLResponseMulti, EnrichedBormSchema, EnrichedBQLQuery } from '../../types';\nimport { getCurrentSchema } from '../../helpers';\nimport { computeField } from '../../engine/compute';\nimport { QueryPath } from '../../types/symbols';\n\nexport const postHooks = async (\n\tschema: EnrichedBormSchema,\n\tenrichedBqlQuery: EnrichedBQLQuery[],\n\tbqlRes: BQLResponseMulti,\n) => {\n\tif (!bqlRes) {\n\t\treturn;\n\t}\n\n\tconst queryPostHooks = (blocks: any) => {\n\t\t//console.log('queryPostHooks', blocks[0]);\n\t\treturn produce(blocks, (draft: any) =>\n\t\t\ttraverse(draft, ({ value: val }: TraversalCallbackContext) => {\n\t\t\t\tif (isObject(val)) {\n\t\t\t\t\tconst value = val as Record<string, any>;\n\n\t\t\t\t\tif (!value.$thing) {\n\t\t\t\t\t\t// JSON object.\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (value.$thing) {\n\t\t\t\t\t\tconst currentSchema = getCurrentSchema(schema, value);\n\t\t\t\t\t\tconst { virtualFields } = currentSchema;\n\n\t\t\t\t\t\tconst queryPath = value[QueryPath as any];\n\t\t\t\t\t\tif (!queryPath) {\n\t\t\t\t\t\t\tthrow new Error(`[Internal] QueryPath is missing. Value: ${JSON.stringify(value)}`);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst originalNode = getNodeByPath(enrichedBqlQuery, queryPath);\n\t\t\t\t\t\tif (originalNode.$fieldType === 'ref') {\n\t\t\t\t\t\t\treturn; // Not supported with refFields\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst queriedFields = originalNode.$fields.map((f: any) => f.$path);\n\t\t\t\t\t\tconst excludedFields = originalNode.$excludedFields;\n\n\t\t\t\t\t\t/// ADD VIRTUAL FIELDS\n\t\t\t\t\t\tvirtualFields.forEach((virtualFieldPath) => {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\texcludedFields?.includes(virtualFieldPath) ||\n\t\t\t\t\t\t\t\t(queriedFields.length > 0 && !queriedFields.includes(virtualFieldPath))\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst field = currentSchema.dataFields?.find((f) => f.path === virtualFieldPath);\n\n\t\t\t\t\t\t\tif (!field?.default) {\n\t\t\t\t\t\t\t\t///then is a virtual field and should be computed from the DB already\n\t\t\t\t\t\t\t\tif (value[virtualFieldPath] === undefined) {\n\t\t\t\t\t\t\t\t\tthrow new Error(`[Internal] Virtual field: No db value found for virtual field: ${virtualFieldPath}`);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconst computedValue = computeField({\n\t\t\t\t\t\t\t\t\tcurrentThing: value,\n\t\t\t\t\t\t\t\t\tfieldSchema: field,\n\t\t\t\t\t\t\t\t\tmandatoryDependencies: true,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tvalue[virtualFieldPath] = computedValue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t//EXCLUDE FIELDS\n\t\t\t\t\t\tif (excludedFields) {\n\t\t\t\t\t\t\t//this should only happen for id fields, as we query them always. Might remove also dependencies in the future\n\t\t\t\t\t\t\t//todo: move this as a last step of the machine, as a cleaner. Note: we are skipping it now for reference fields but we should not\n\t\t\t\t\t\t\texcludedFields.forEach((excludedField: string) => {\n\t\t\t\t\t\t\t\tif (typeof excludedField !== 'string') {\n\t\t\t\t\t\t\t\t\tthrow new Error('[Internal] ExcludedField is not a string');\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tdelete value[excludedField];\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}),\n\t\t);\n\t};\n\n\tconst postHooksBqlRes = queryPostHooks(bqlRes);\n\treturn postHooksBqlRes;\n};\n","import { isArray, isObject, shake } from 'radash';\nimport { getFieldType } from '../../../helpers';\nimport type { Filter, EnrichedBormSchema, EnrichedLinkField, EnrichedRoleField } from '../../../types';\nimport { SuqlMetadata } from '../../../types/symbols';\n\nconst surqlOperators = {\n\t$eq: '$=',\n\t$not: '$!',\n\t$or: '$OR',\n\t$and: '$AND',\n\t$in: '$IN',\n\t$id: 'record::id(id)',\n\t$exists: '$exists',\n};\n\nexport const parseFilter = (filter: Filter, currentThing: string, schema: EnrichedBormSchema): Filter => {\n\tif (filter === null || filter === undefined) {\n\t\treturn filter;\n\t}\n\n\tconst wasArray = isArray(filter);\n\n\tconst arrayFilter = wasArray ? filter : [filter];\n\n\tconst resultArray = arrayFilter.map((f) => {\n\t\tconst keys = Object.keys(f);\n\n\t\tconst result = keys.reduce((acc, key) => {\n\t\t\tconst value = f[key];\n\n\t\t\tif (key.startsWith('$')) {\n\t\t\t\t//LOGICAL OPERATORS\n\t\t\t\tif (['$or', '$and', '$not'].includes(key)) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...acc,\n\t\t\t\t\t\t[key]: undefined,\n\t\t\t\t\t\t[surqlOperators[key as keyof typeof surqlOperators]]: parseFilter(value, currentThing, schema),\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// FILTER OPERATORS\n\t\t\t\tif (key === '$id') {\n\t\t\t\t\treturn { ...acc, $id: undefined, [surqlOperators[key]]: { $IN: isArray(value) ? value : [value] } };\n\t\t\t\t}\n\t\t\t\tif (key === '$thing') {\n\t\t\t\t\treturn acc; //do nothing for now, but in the future we will need to filter by tables as well, maybe record::tb(id) ...\n\t\t\t\t}\n\n\t\t\t\t//AUXILIARY OPERATORS\n\t\t\t\tif (key === '$exists') {\n\t\t\t\t\treturn { ...acc, $exists: undefined, [surqlOperators[key]]: value };\n\t\t\t\t}\n\n\t\t\t\t//VALUE OPERATORS\n\t\t\t\tif (key === '$eq') {\n\t\t\t\t\treturn { ...acc, $eq: undefined, [surqlOperators[key]]: value };\n\t\t\t\t}\n\t\t\t\tif (key === '$in') {\n\t\t\t\t\treturn { ...acc, $in: undefined, [surqlOperators[key]]: value };\n\t\t\t\t}\n\n\t\t\t\tthrow new Error(`Unknown filter operator ${key}`);\n\t\t\t\t//return { ...acc, [key]: parseFilter(value, currentThing, schema) };\n\t\t\t}\n\n\t\t\tconst currentSchema =\n\t\t\t\tcurrentThing in schema.entities ? schema.entities[currentThing] : schema.relations[currentThing];\n\n\t\t\tconst [fieldType, fieldSchema] = getFieldType(currentSchema, key);\n\n\t\t\tif (fieldType === 'idField') {\n\t\t\t\tif (currentSchema.idFields.length > 1) {\n\t\t\t\t\tthrow new Error('Multiple id fields not supported');\n\t\t\t\t} //todo: When composed id, this changes:\n\n\t\t\t\treturn { ...acc, 'record::id(id)': { $IN: isArray(value) ? value : [value] } };\n\t\t\t}\n\n\t\t\tif (fieldType === 'dataField') {\n\t\t\t\treturn { ...acc, [key]: parseFilter(value, currentThing, schema) }; //Probably good place to add ONLY and other stuff depending on the fieldSchema\n\t\t\t}\n\n\t\t\tif (fieldType === 'linkField' || fieldType === 'roleField') {\n\t\t\t\tconst fieldSchemaTyped = fieldSchema as EnrichedLinkField | EnrichedRoleField;\n\n\t\t\t\tconst surrealDBKey = fieldSchemaTyped[SuqlMetadata].queryPath;\n\n\t\t\t\treturn { ...acc, [surrealDBKey]: parseFilter(value, currentThing, schema) };\n\n\t\t\t\t/*if (fieldSchemaTyped.$things.length !== 1) {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t`Not supported yet: Role ${key} in ${JSON.stringify(value)} is played by multiple things: ${fieldSchemaTyped.$things.join(', ')}`,\n\t\t\t\t\t);\n\n\t\t\t\t\treturn { ...acc, [surrealDBKey]: parseFilter(value, currentThing, schema) };\n\t\t\t\t}\n\t\t\t\t//todo: we need to be able to filter by fields that only belong to subtypes\n\t\t\t\tconst [childrenThing] = fieldSchemaTyped.$things; //todo: multiple players, then it must be efined\n\n\t\t\t\treturn { ...acc, [surrealDBKey]: parseFilter(value, childrenThing, schema) };*/\n\t\t\t}\n\n\t\t\tthrow new Error(`Field ${key} not found in schema, Defined in $filter`);\n\t\t}, {});\n\n\t\treturn shake(result);\n\t});\n\n\treturn wasArray ? resultArray : resultArray[0];\n};\n\nexport const buildSuqlFilter = (filter: object): string => {\n\tif (filter === null || filter === undefined) {\n\t\treturn '';\n\t}\n\n\tconst entries = Object.entries(filter);\n\tconst parts: string[] = [];\n\n\tentries.forEach(([key, value]) => {\n\t\t// Handle logical operators\n\t\tif (['$OR', '$AND', '$!'].includes(key)) {\n\t\t\tconst logicalOperator = key.replace('$', '');\n\n\t\t\tconst nestedFilters = Array.isArray(value) ? value.map((v) => buildSuqlFilter(v)) : [buildSuqlFilter(value)];\n\n\t\t\tif (logicalOperator === '!') {\n\t\t\t\t// Correctly handle the negation\n\t\t\t\tparts.push(`!(${nestedFilters.join(' AND ')})`);\n\t\t\t} else {\n\t\t\t\tparts.push(`(${nestedFilters.join(` ${logicalOperator} `)})`);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Handle field-specific filters\n\t\tif (isObject(value)) {\n\t\t\tif (key.includes('<-') || key.includes('->')) {\n\t\t\t\tconst nestedFilter = buildSuqlFilter(value);\n\t\t\t\tparts.push(`${key}[WHERE ${nestedFilter}]`);\n\t\t\t} else if (key.startsWith('$parent.[')) {\n\t\t\t\t// Handle references with cardinality MANY\n\t\t\t\tconst nestedFilter = buildSuqlFilter(value);\n\t\t\t\tconst keyWithoutPrefix = key.replace('$parent.', '').replace(/^\\[(.*)\\]$/, '$1');\n\t\t\t\tparts.push(`fn::as_array(${keyWithoutPrefix})[WHERE id && ${nestedFilter}]`);\n\t\t\t} else if (key.startsWith('$parent')) {\n\t\t\t\t// Handle references with cardinality ONE\n\t\t\t\tconst nestedFilter = buildSuqlFilter(value);\n\t\t\t\tconst keyWithoutPrefix = key.replace('$parent.', '');\n\t\t\t\tparts.push(`fn::as_array(${keyWithoutPrefix})[WHERE id && ${nestedFilter}]`);\n\t\t\t} else if (key.startsWith('$')) {\n\t\t\t\tthrow new Error(`Invalid key ${key}`);\n\t\t\t} else {\n\t\t\t\t// Handle field operators\n\t\t\t\tconst valueKeys = Object.keys(value);\n\t\t\t\tif (valueKeys.length === 1 && valueKeys[0].startsWith('$')) {\n\t\t\t\t\tconst [operator] = valueKeys;\n\t\t\t\t\t//@ts-expect-error - Todo\n\t\t\t\t\tconst nextValue: unknown = value[operator];\n\n\t\t\t\t\tif (operator === '$exists') {\n\t\t\t\t\t\t// Handle $exists operator\n\t\t\t\t\t\tif (nextValue === true) {\n\t\t\t\t\t\t\tparts.push(`${key} IS NOT NONE`);\n\t\t\t\t\t\t} else if (nextValue === false) {\n\t\t\t\t\t\t\tparts.push(`${key} IS NONE`);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthrow new Error(`Invalid value for $exists: ${nextValue}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Handle other operators\n\t\t\t\t\t\tconst surrealOperator = operator.replace('$', '');\n\t\t\t\t\t\tif (Array.isArray(nextValue)) {\n\t\t\t\t\t\t\tparts.push(\n\t\t\t\t\t\t\t\t`${key} ${surrealOperator} [${nextValue.map((v) => (v === null ? 'NONE' : `'${v}'`)).join(', ')}]`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else if (isObject(nextValue)) {\n\t\t\t\t\t\t\tconst nestedFilter = buildSuqlFilter(nextValue);\n\t\t\t\t\t\t\tparts.push(`${key} ${surrealOperator} ${nestedFilter}`);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tparts.push(`${key} ${surrealOperator} ${nextValue === null ? 'NONE' : `'${nextValue}'`}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(`Invalid key ${key}`);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// Handle simple field equality\n\t\t\tif (Array.isArray(value)) {\n\t\t\t\tconst operator = key.startsWith('$') ? key.replace('$', '') : 'IN'; //maybe could do const operator = 'IN';\n\t\t\t\tparts.push(`${key} ${operator} [${value.map((v) => (v === null ? 'NONE' : `'${v}'`)).join(', ')}]`);\n\t\t\t} else {\n\t\t\t\tconst operator = key.startsWith('$') ? key.replace('$', '') : '='; //maybe could do const operator = '=';\n\t\t\t\tparts.push(`${key} ${operator} ${value === null ? 'NONE' : `'${value}'`}`);\n\t\t\t}\n\t\t}\n\t});\n\n\treturn parts.join(' AND ');\n};\n\nexport const buildSorter = (sort: ({ field: string; desc?: boolean } | string)[]) => {\n\tconst sorters = sort.map((i) => {\n\t\tif (typeof i === 'string') {\n\t\t\treturn i;\n\t\t}\n\n\t\tconst { field, desc } = i;\n\n\t\treturn `${field}${desc ? ' DESC' : ' ASC'}`;\n\t});\n\n\treturn `ORDER BY ${sorters.join(', ')}`;\n};\n","import type {\n\tEnrichedAttributeQuery,\n\tEnrichedBQLQuery,\n\tEnrichedBormSchema,\n\tEnrichedFieldQuery,\n\tEnrichedLinkQuery,\n\tEnrichedRoleQuery,\n} from '../../../types';\nimport { indent } from '../../../helpers';\nimport { FieldSchema, QueryPath, SuqlMetadata } from '../../../types/symbols';\nimport { isArray } from 'radash';\nimport { sanitizeNameSurrealDB } from '../../../adapters/surrealDB/helpers';\nimport { parseFilter, buildSuqlFilter, buildSorter } from '../../../adapters/surrealDB/filters/filters';\n\nexport const build = (props: { queries: EnrichedBQLQuery[]; schema: EnrichedBormSchema }) => {\n\tconst { queries, schema } = props;\n\t//console.log('queries!', queries);\n\treturn queries.map((query) => buildQuery({ query, schema }));\n};\n\nconst buildQuery = (props: { query: EnrichedBQLQuery; schema: EnrichedBormSchema }): string | null => {\n\tconst { query, schema } = props;\n\tconst { $thing, $fields, $filter, $offset, $limit, $sort } = query;\n\n\tif ($fields.length === 0) {\n\t\treturn null;\n\t}\n\n\tconst lines: string[] = [];\n\n\tlines.push('SELECT');\n\n\tconst fieldLines = buildFieldsQuery({ parentQuery: query, queries: $fields, level: 1, schema });\n\tif (fieldLines) {\n\t\tlines.push(fieldLines);\n\t}\n\n\tconst currentSchema = schema.entities[$thing] || schema.relations[$thing];\n\tif (!currentSchema) {\n\t\tthrow new Error(`Schema for ${$thing} not found`);\n\t}\n\tconst allTypes = currentSchema.subTypes ? [$thing, ...currentSchema.subTypes] : [$thing];\n\tconst allTypesNormed = allTypes.map((t) => sanitizeNameSurrealDB(t));\n\n\tif (query.$id) {\n\t\tif (typeof query.$id === 'string') {\n\t\t\tlines.push(`FROM ${allTypesNormed.map((t) => `${t}:⟨${query.$id}⟩`).join(',')}`);\n\t\t} else if (isArray(query.$id)) {\n\t\t\tconst $ids = query.$id;\n\t\t\tconst allCombinations = allTypesNormed.flatMap((t) => $ids?.map((id) => `${t}:⟨${id}⟩`));\n\t\t\tlines.push(`FROM ${allCombinations.join(',')}`);\n\t\t\t//throw new Error('Multiple ids not supported');\n\t\t} else {\n\t\t\tthrow new Error('Invalid $id');\n\t\t}\n\t} else {\n\t\tlines.push(`FROM ${allTypesNormed.join(',')}`);\n\t}\n\n\tif ($filter) {\n\t\tconst parsed = parseFilter($filter, $thing, schema);\n\t\tconst filter = buildSuqlFilter(parsed);\n\t\tlines.push(`WHERE ${filter}`);\n\t}\n\n\tif ($sort) {\n\t\tlines.push(buildSorter($sort));\n\t}\n\n\tif (typeof $limit === 'number') {\n\t\tlines.push(`LIMIT ${$limit}`);\n\t}\n\n\tif (typeof $offset === 'number') {\n\t\tlines.push(`START ${$offset}`);\n\t}\n\n\treturn lines.join('\\n');\n};\n\nconst buildFieldsQuery = (props: {\n\tqueries: EnrichedFieldQuery[];\n\tschema: EnrichedBormSchema;\n\tlevel: number;\n\tparentQuery: EnrichedBQLQuery | EnrichedRoleQuery | EnrichedLinkQuery;\n}) => {\n\tconst { queries, schema, level, parentQuery } = props;\n\tconst lines: string[] = [];\n\n\tconst queryPath = parentQuery[QueryPath];\n\t//Metadata\n\tlines.push(indent(`\"${queryPath}\" as \\`$$queryPath\\``, level));\n\tlines.push(indent('record::id(id) as `$id`', level));\n\tlines.push(indent('record::tb(id) as `$thing`', level));\n\n\tqueries.forEach((i) => {\n\t\tconst line = buildFieldQuery({ query: i, level, schema });\n\t\tif (line) {\n\t\t\tlines.push(line);\n\t\t}\n\t});\n\tif (lines.length === 0) {\n\t\treturn null;\n\t}\n\treturn lines.join(',\\n');\n};\n\nconst buildFieldQuery = (props: {\n\tquery: EnrichedFieldQuery;\n\tschema: EnrichedBormSchema;\n\tlevel: number;\n}): string | null => {\n\tconst { query, schema, level } = props;\n\t//console.log('query!', query);\n\n\tif (query.$fieldType === 'data') {\n\t\treturn buildAttributeQuery({ query, level });\n\t}\n\tif (query.$fieldType === 'ref') {\n\t\tthrow new Error('Ref fields are not supported in this context');\n\t\t//return buildLinkQuery({ query, level, schema });\n\t}\n\tif (query.$fieldType === 'link') {\n\t\treturn buildLinkQuery({ query, level, schema });\n\t}\n\tif (query.$fieldType === 'role') {\n\t\treturn buildRoleQuery({ query, level, schema });\n\t}\n\treturn null;\n};\n\nconst buildAttributeQuery = (props: { query: EnrichedAttributeQuery; level: number }): string | null => {\n\tconst { query, level } = props;\n\tif (query.$isVirtual) {\n\t\treturn null;\n\t}\n\t// TODO: Get the field id from the schema.\n\tif (query.$path === 'id') {\n\t\treturn indent(`record::id(${query.$path}) AS ${query.$as}`, level);\n\t}\n\tif (query.$path === query.$as) {\n\t\treturn indent(`\\`${query.$path}\\``, level);\n\t}\n\treturn indent(`\\`${query.$path}\\` AS \\`${query.$as}\\``, level);\n};\n\nconst buildLinkQuery = (props: {\n\tquery: EnrichedLinkQuery;\n\tschema: EnrichedBormSchema;\n\tlevel: number;\n}): string | null => {\n\tconst { query, schema, level } = props;\n\tconst { $fields, $filter, $offset, $limit, $sort } = query;\n\n\tif ($fields.length === 0) {\n\t\treturn null;\n\t}\n\n\tconst lines: string[] = [];\n\n\tlines.push(indent('(', level));\n\n\tconst queryLevel = level + 1;\n\tlines.push(indent('SELECT', queryLevel));\n\n\tconst fieldLines = buildFieldsQuery({ parentQuery: query, queries: $fields, level: queryLevel + 1, schema });\n\tif (fieldLines) {\n\t\tlines.push(fieldLines);\n\t}\n\n\t/// FROM\n\tconst from = query[FieldSchema][SuqlMetadata].queryPath;\n\tlines.push(indent(`FROM ${from}`, queryLevel));\n\n\t/// FILTER WHERE\n\tif ($filter) {\n\t\tconst parsed = parseFilter($filter, query.$thing, schema);\n\t\tconst built = buildSuqlFilter(parsed);\n\t\tlines.push(`WHERE ${built}`);\n\t}\n\n\t/// SORT AND PAGINATION\n\tif ($sort) {\n\t\tlines.push(indent(buildSorter($sort), queryLevel));\n\t}\n\n\tif (typeof $limit === 'number') {\n\t\tlines.push(indent(`LIMIT ${$limit}`, queryLevel));\n\t}\n\n\tif (typeof $offset === 'number') {\n\t\tlines.push(indent(`START ${$offset}`, queryLevel));\n\t}\n\n\tlines.push(indent(`) AS \\`${query.$as}\\``, level));\n\n\treturn lines.join('\\n');\n};\n\nconst buildRoleQuery = (props: {\n\tquery: EnrichedRoleQuery;\n\tschema: EnrichedBormSchema;\n\tlevel: number;\n}): string | null => {\n\tconst { query, schema, level } = props;\n\n\tif (query.$fields.length === 0) {\n\t\treturn null;\n\t}\n\n\tconst lines: string[] = [];\n\n\tlines.push(indent('(', level));\n\n\tconst queryLevel = level + 1;\n\tlines.push(indent('SELECT', queryLevel));\n\n\tconst fieldLevel = queryLevel + 1;\n\tconst fieldLines = buildFieldsQuery({ parentQuery: query, queries: query.$fields, level: fieldLevel, schema });\n\tif (fieldLines) {\n\t\tlines.push(fieldLines);\n\t}\n\n\tconst from = query[FieldSchema][SuqlMetadata].queryPath;\n\tlines.push(indent(`FROM ${from}`, queryLevel));\n\n\tif (query.$filter) {\n\t\tconst parsed = parseFilter(query.$filter, query.$playedBy.thing, schema);\n\t\tconst built = buildSuqlFilter(parsed);\n\t\tlines.push(`WHERE ${built}`);\n\t}\n\n\tlines.push(indent(`) AS \\`${query.$as}\\``, level));\n\n\treturn lines.join('\\n');\n};\n","// eslint-disable-next-line turbo/no-undeclared-env-vars\nexport const VERSION = process.env.npm_package_version;\n","const LOG_LEVEL = new Set(\n\t// eslint-disable-next-line turbo/no-undeclared-env-vars\n\t(process.env.LOG_LEVEL || '')\n\t\t.split(',')\n\t\t.map((i) => i.trim())\n\t\t.filter((i) => !!i),\n);\n\ntype LogLevel = 'debug' | 'info' | 'warning' | 'error';\n\nexport const log = (level: LogLevel | LogLevel[], ...args: unknown[]) => {\n\tconst shouldLog = Array.isArray(level) ? level.some((l) => LOG_LEVEL.has(l)) : LOG_LEVEL.has(level);\n\tif (shouldLog) {\n\t\tconsole.log(...args);\n\t}\n};\n\nexport const logDebug = (...args: unknown[]) => log('debug', ...args);\n\nexport const logInfo = (...args: unknown[]) => log('info', ...args);\n\nexport const logWarning = (...args: unknown[]) => log('warning', ...args);\n\nexport const logError = (...args: unknown[]) => log('error', ...args);\n","import type { SimpleSurrealClient } from '../../../adapters/surrealDB/client';\nimport { VERSION } from '../../../version';\nimport { logDebug } from '../../../logger';\nimport type { BormConfig } from '../../../types';\n\nexport const run = async (props: {\n\tclient: SimpleSurrealClient;\n\tqueries: string[];\n\tconfig: BormConfig;\n}): Promise<any[][]> => {\n\tconst { client, queries, config } = props;\n\tconst batchedQuery = `\n\tBEGIN TRANSACTION;\n\t${queries.join(';')};\n\tCOMMIT TRANSACTION;\n\t`;\n\n\tif (config.query?.debugger) {\n\t\tlogDebug(`batchedQuery[${VERSION}]`, JSON.stringify({ batchedQuery }));\n\t}\n\t//console.log('batchedQuery!', batchedQuery);\n\n\treturn await client.query(batchedQuery);\n};\n","import { isArray, isDate, mapEntries } from 'radash';\nimport type {\n\tBormConfig,\n\tContentType,\n\tEnrichedBormSchema,\n\tEnrichedBQLQuery,\n\tEnrichedFieldQuery,\n\tEnrichedLinkQuery,\n\tEnrichedRoleQuery,\n} from '../../../types';\nimport { FieldSchema, QueryPath } from '../../../types/symbols';\nimport { sanitizeTableNameSurrealDb } from '../../../adapters/surrealDB/helpers';\nimport { getSchemaByThing } from '../../../helpers';\n\nexport const parse = (props: {\n\tres: Record<string, any>[][];\n\tqueries: EnrichedBQLQuery[];\n\tschema: EnrichedBormSchema;\n\tconfig: BormConfig;\n}) => {\n\tconst { res, queries, schema } = props;\n\t//console.log('res!', JSON.stringify(res, null, 2));\n\tconst result = res.map((r, i) => parseRes(queries[i], r, schema));\n\t//console.log('result', result);\n\treturn result;\n};\n\nconst parseRes = (\n\tquery: EnrichedBQLQuery | EnrichedLinkQuery | EnrichedRoleQuery,\n\tres: Record<string, any>[],\n\tschema: EnrichedBormSchema,\n) => {\n\tif (isArray(res)) {\n\t\tif (res.length === 0) {\n\t\t\treturn null;\n\t\t}\n\t\tif (query.$filterByUnique) {\n\t\t\tif (res.length > 1) {\n\t\t\t\tthrow new Error('Multiple results found for unique query');\n\t\t\t} else {\n\t\t\t\treturn parseObj(query, res[0], schema);\n\t\t\t}\n\t\t}\n\t\tif (res.length >= 1) {\n\t\t\treturn res.map((r) => parseObj(query, r, schema));\n\t\t}\n\t} else {\n\t\tthrow new Error('res is unexpectedly not an array');\n\t}\n};\n\nconst parseObj = (\n\tquery: EnrichedBQLQuery | EnrichedLinkQuery | EnrichedRoleQuery,\n\tobj: Record<string, any>,\n\tschema: EnrichedBormSchema,\n) => {\n\t// eslint-disable-next-line prefer-destructuring\n\tconst $thing = obj['$thing'] || obj.tb;\n\tconst $thingType = $thing in schema.entities ? 'entity' : $thing in schema.relations ? 'relation' : 'error';\n\tif ($thingType === 'error') {\n\t\tthrow new Error(`[Internal] The $thing ${$thing} is not defined in the schema.`);\n\t}\n\n\tconst newObj: Record<string, any> = {\n\t\t//init with symbols\n\t\t[QueryPath]: obj['$$queryPath'],\n\t\t$id: obj['$id'],\n\t\t$thing: sanitizeTableNameSurrealDb($thing),\n\t\t$thingType, //This is actually not true always, will need to be fetched from the $thing\n\t};\n\n\t// For normal fields, we parse each field classically\n\tquery.$fields.forEach((f) => {\n\t\tconst key = f.$as;\n\t\tconst value = obj[key];\n\t\t// TODO: Look up what the id field is in the schema.\n\t\tif (f.$path === 'id' && query.$idNotIncluded) {\n\t\t\treturn;\n\t\t}\n\t\tnewObj[key] = parseFieldResult(f, value, schema);\n\t});\n\n\treturn newObj;\n};\n\nconst parseFieldResult = (query: EnrichedFieldQuery, value: any, schema: EnrichedBormSchema) => {\n\tif (value === undefined || value === null || (isArray(value) && value.length === 0)) {\n\t\treturn null;\n\t}\n\n\tif (query.$fieldType === 'data') {\n\t\tconst { contentType /*,cardinality*/ } = query[FieldSchema];\n\n\t\treturn parseValue(value, contentType) ?? null;\n\t}\n\tif (query.$fieldType === 'ref') {\n\t\tconst asArray = isArray(value) ? value : [value];\n\t\tconst parsedContent = asArray.map((v) => {\n\t\t\tif (v.$thing) {\n\t\t\t\tconst currentSchema = getSchemaByThing(schema, v.$thing);\n\t\t\t\tconst [idField] = currentSchema.idFields;\n\t\t\t\t//console.log('currentSchema!', currentSchema);\n\t\t\t\tif (query.$justId) {\n\t\t\t\t\treturn v.$id;\n\t\t\t\t}\n\t\t\t\t//todo: We will fix this once surrealDB enables some sort of SELECT ( SELECT * FROM $parent.*). Meanwhile we can only query one nested level\n\t\t\t\tconst flatNestedField = (nf: unknown) => {\n\t\t\t\t\tif (nf && typeof nf === 'object' && 'id' in nf && 'tb' in nf) {\n\t\t\t\t\t\treturn nf.id;\n\t\t\t\t\t}\n\t\t\t\t\t//todo: This is a value, and we might need to parse it correctly. We know the schema and the key, so we can do it.\n\t\t\t\t\treturn nf;\n\t\t\t\t};\n\t\t\t\tconst temporallyFlatNestedIds = mapEntries(v, (key, content) => {\n\t\t\t\t\tif (isArray(content)) {\n\t\t\t\t\t\treturn [key, content.map((i) => flatNestedField(i))];\n\t\t\t\t\t}\n\t\t\t\t\treturn [key, flatNestedField(content)];\n\t\t\t\t});\n\n\t\t\t\treturn {\n\t\t\t\t\t...temporallyFlatNestedIds,\n\t\t\t\t\t[QueryPath]: v['$$queryPath'],\n\t\t\t\t\t[idField]: v['$id'], //todo: this is a hack. But we should add this always!\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (v.$value) {\n\t\t\t\treturn parseValue(v.$value, 'FLEX');\n\t\t\t}\n\t\t\treturn v; //in cardinality many the query returns the values already. Todo: To optimize this we can remove the $value when cardinality MANY or find a smarter solution\n\t\t});\n\t\tconst { cardinality } = query[FieldSchema];\n\t\tif (cardinality === 'ONE') {\n\t\t\t//not filterByUnique because we can't filter inside a refField\n\t\t\treturn parsedContent[0];\n\t\t} else {\n\t\t\treturn parsedContent;\n\t\t}\n\t}\n\n\tif (query.$justId) {\n\t\tif (query.$filterByUnique || query[FieldSchema].cardinality === 'ONE') {\n\t\t\t// TODO: Look up what the id field is in the schema.\n\t\t\t//return isArray(value) ? value[0]?.id : value?.id; //RefFields receive direct\n\t\t\treturn value[0]?.$id ?? null;\n\t\t}\n\t\treturn value?.map((i: Record<string, any>) => i.$id) ?? [];\n\t} else {\n\t\tif (query.$filterByUnique || query[FieldSchema].cardinality === 'ONE') {\n\t\t\treturn parseObj(query, value[0], schema);\n\t\t}\n\t\treturn parseRes(query, value, schema);\n\t}\n};\n\nconst parseValue = (value: unknown, contentType: ContentType) => {\n\tconst asArray = isArray(value) ? value : [value];\n\tif (contentType === 'DATE') {\n\t\tconst res = asArray.map((v) => new Date(v).toISOString());\n\t\treturn isArray(value) ? res : res[0];\n\t}\n\tif (contentType === 'FLEX') {\n\t\tconst res = asArray.map((v) => {\n\t\t\tif (isDate(v)) {\n\t\t\t\treturn new Date(v).toISOString(); //Todo: in the future probably just return the date object instead, but we need to fix it in typedb.\n\t\t\t}\n\t\t\treturn v;\n\t\t});\n\t\treturn isArray(value) ? res : res[0];\n\t}\n\treturn value;\n};\n","import type {\n\tEnrichedAttributeQuery,\n\tEnrichedBQLQuery,\n\tEnrichedBormEntity,\n\tEnrichedBormRelation,\n\tEnrichedBormSchema,\n\tEnrichedFieldQuery,\n\tEnrichedLinkQuery,\n\tEnrichedRefQuery,\n\tEnrichedRoleQuery,\n} from '../../../types';\nimport { FieldSchema, QueryPath } from '../../../types/symbols';\nimport { sanitizeNameSurrealDB } from '../../../adapters/surrealDB/helpers';\nimport { buildSuqlFilter, parseFilter, buildSorter } from '../../../adapters/surrealDB/filters/filters';\nimport { isObject } from 'radash';\n\n//todo: Change name to build and remove the edge mode\nexport const buildRefs = (props: { queries: EnrichedBQLQuery[]; schema: EnrichedBormSchema }) => {\n\tconst { queries, schema } = props;\n\t//console.log('queries!', queries);\n\treturn queries.map((query) => buildQuery({ query, schema }));\n};\n\nconst buildQuery = (props: { query: EnrichedBQLQuery; schema: EnrichedBormSchema }): string | null => {\n\tconst { query, schema } = props;\n\tconst { $thing, $fields, $filter, $offset, $limit, $sort } = query;\n\n\tif ($fields.length === 0) {\n\t\treturn null;\n\t}\n\n\tconst currentSchema = schema.entities[$thing] || schema.relations[$thing];\n\tif (!currentSchema) {\n\t\tthrow new Error(`Schema for ${$thing} not found`);\n\t}\n\n\tconst queryPath = query[QueryPath];\n\n\tconst META = createMetaFields(queryPath);\n\tconst DATA_FIELDS = createDataFields($fields.filter((f) => f.$fieldType === 'data'));\n\tconst EDGE_FIELDS = createEdgeFields(\n\t\t$fields.filter((f) => f.$fieldType === 'link' || f.$fieldType === 'role') as (\n\t\t\t| EnrichedLinkQuery\n\t\t\t| EnrichedRoleQuery\n\t\t)[],\n\t\tschema,\n\t);\n\tconst REF_FIELDS = createRefFields($fields.filter((f) => f.$fieldType === 'ref') as EnrichedRefQuery[]);\n\tconst FIELDS = [...META, ...DATA_FIELDS, ...EDGE_FIELDS, ...REF_FIELDS].join(',\\n');\n\tconst FROM = createRootFromClause(query, currentSchema);\n\tconst WHERE = $filter ? `WHERE id AND (${buildSuqlFilter(parseFilter($filter, $thing, schema))})` : 'WHERE id';\n\n\tconst SORT = $sort ? buildSorter($sort) : '';\n\tconst LIMIT = typeof $limit === 'number' ? `LIMIT ${$limit}` : '';\n\tconst OFFSET = typeof $offset === 'number' ? `START ${$offset}` : '';\n\n\treturn `SELECT ${FIELDS} ${FROM} ${WHERE} ${SORT} ${LIMIT} ${OFFSET}`;\n};\n\nconst createRootFromClause = (query: EnrichedBQLQuery, currentSchema: EnrichedBormEntity | EnrichedBormRelation) => {\n\tconst allTypes = currentSchema.subTypes ? [query.$thing, ...currentSchema.subTypes] : [query.$thing];\n\tconst allTypesNormed = allTypes.map((t) => sanitizeNameSurrealDB(t));\n\n\tconst formatId = (type: string, id: string) => `${type}:\\`${id}\\``;\n\tconst joinTypes = (ids: string[]) => allTypesNormed.flatMap((type) => ids.map((id) => formatId(type, id))).join(',');\n\n\tif (!query.$id) {\n\t\treturn `FROM ${allTypesNormed.join(',')}`;\n\t}\n\n\tif (typeof query.$id === 'string') {\n\t\treturn `FROM ${joinTypes([query.$id])}`;\n\t}\n\n\tif (Array.isArray(query.$id)) {\n\t\treturn `FROM ${joinTypes(query.$id)}`;\n\t}\n\n\tthrow new Error('Invalid $id');\n};\n\nconst createMetaFields = (queryPath: string) => {\n\treturn [\n\t\t`\"${queryPath}\" as \\`$$queryPath\\``,\n\t\t'id && record::id(id) || null as `$id`', //the id is on case we try to extend flex stuff\n\t\t'id && record::tb(id) || null as `$thing`',\n\t];\n};\n\nconst createDataFields = (dataFields: EnrichedAttributeQuery[] | EnrichedFieldQuery[]) => {\n\treturn dataFields.map((df) => {\n\t\tif (df.$path === 'id') {\n\t\t\treturn `record::id(${df.$path}) AS ${df.$as}`;\n\t\t}\n\t\tif (df.$path === df.$as) {\n\t\t\treturn `\\`${df.$path}\\``;\n\t\t}\n\t\treturn `\\`${df.$path}\\` AS \\`${df.$as}\\``;\n\t});\n};\n\nconst createEdgeFields = (\n\tedgeFields: (EnrichedLinkQuery | EnrichedRoleQuery)[],\n\tschema: EnrichedBormSchema,\n): string[] => {\n\treturn edgeFields\n\t\t.map((ef) => {\n\t\t\t//logger('ef', ef);\n\t\t\tif (!ef[QueryPath]) {\n\t\t\t\tthrow new Error(`[Internal] QueryPath is missing. Value: ${JSON.stringify(ef)}`);\n\t\t\t}\n\t\t\tconst META = createMetaFields(ef[QueryPath]);\n\t\t\tconst DATA_FIELDS = createDataFields(ef.$fields.filter((f) => f.$fieldType === 'data'));\n\t\t\tconst LINK_FIELDS = createEdgeFields(\n\t\t\t\tef.$fields.filter((f) => f.$fieldType === 'link' || f.$fieldType === 'role') as (\n\t\t\t\t\t| EnrichedLinkQuery\n\t\t\t\t\t| EnrichedRoleQuery\n\t\t\t\t)[],\n\t\t\t\tschema,\n\t\t\t);\n\t\t\tconst REF_FIELDS = createRefFields(ef.$fields.filter((f) => f.$fieldType === 'ref'));\n\t\t\tconst FIELDS = [...META, ...DATA_FIELDS, ...LINK_FIELDS, ...REF_FIELDS].filter(Boolean).join(',\\n');\n\t\t\tconst FROM = `FROM $parent.\\`${ef[FieldSchema].path}\\`[*]`;\n\t\t\tconst WHERE =\n\t\t\t\tef.$filter && Object.keys(ef.$filter).length > 0\n\t\t\t\t\t? `WHERE id AND(${buildSuqlFilter(parseFilter(ef.$filter, ef.$thing, schema))})`\n\t\t\t\t\t: 'WHERE id';\n\t\t\tconst SORT = ef.$sort ? buildSorter(ef.$sort) : '';\n\t\t\tconst LIMIT = typeof ef.$limit === 'number' ? `LIMIT ${ef.$limit}` : '';\n\t\t\tconst OFFSET = typeof ef.$offset === 'number' ? `START ${ef.$offset}` : '';\n\t\t\treturn `( SELECT ${FIELDS} ${FROM} ${WHERE} ${SORT} ${LIMIT} ${OFFSET} ) AS \\`${ef.$as}\\``;\n\t\t})\n\t\t.filter((f) => f);\n};\nconst createRefFields = (refFields: EnrichedRefQuery[]) => {\n\treturn refFields.map((rf) => {\n\t\tif (!rf[QueryPath]) {\n\t\t\tthrow new Error(`[Internal] QueryPath is missing. Value: ${JSON.stringify(rf)}`);\n\t\t}\n\t\tconst META = createMetaFields(rf[QueryPath]);\n\t\tif (rf.$fields?.some((f) => isObject(f))) {\n\t\t\tthrow new Error(\"[Unsupported]: Can't query nested ref fields yet\");\n\t\t}\n\t\tconst FLEX_REF = 'id && null || $this as `$value`';\n\t\tconst FIELDS = [...META, FLEX_REF, ...(rf.$justId ? '' : rf.$fields?.map((f) => `⟨${f}⟩`) || ['*'])].join(',\\n'); //if no fields, get everything\n\t\tconst FROM = `FROM $parent.\\`${rf[FieldSchema].dbPath}\\``; //removing the [*]\n\t\t//const WHERE = 'WHERE true'; //can't filter inside ref Fields\n\t\t// In ref fields we don't have the ref of the fields so we go blind\n\t\treturn `( SELECT ${FIELDS} ${FROM}) AS \\`${rf.$as}\\``;\n\t});\n};\n","import type { BormConfig, EnrichedBQLQuery, EnrichedBormSchema } from '../../../types';\nimport { createMachine, interpret, invoke, reduce, state, transition } from '../../robot3';\nimport { build } from './build';\nimport { run } from './run';\nimport { assertDefined } from '../../../helpers';\nimport { parse } from './parse';\nimport type { SurrealDBProviderObject } from '../../../types/config/surrealdb';\nimport { buildRefs } from './buildRefs';\nimport type { SimpleSurrealClient } from '../../../adapters/surrealDB/client';\n\nexport type SurrealDbMachineContext = {\n\tbql: {\n\t\tqueries: EnrichedBQLQuery[];\n\t\tres?: any[];\n\t};\n\tsurql: {\n\t\tqueries?: string[];\n\t\tres?: any[];\n\t};\n\tschema: EnrichedBormSchema;\n\tconfig: BormConfig;\n\tclient: SimpleSurrealClient;\n\terror?: string | null;\n};\n\nconst errorTransition = transition(\n\t'error',\n\t'error',\n\treduce((ctx: SurrealDbMachineContext, event: any): SurrealDbMachineContext => {\n\t\treturn {\n\t\t\t...ctx,\n\t\t\terror: event.error,\n\t\t};\n\t}),\n);\n\nconst surrealDbQueryMachine = createMachine(\n\t'build',\n\t{\n\t\tbuild: invoke(\n\t\t\tasync (ctx: SurrealDbMachineContext) => {\n\t\t\t\t// todo: This works only if there is a single surrealDB connector\n\t\t\t\tconst { linkMode } = (\n\t\t\t\t\tctx.config.dbConnectors.find((c) => c.provider === 'surrealDB') as SurrealDBProviderObject\n\t\t\t\t).providerConfig;\n\t\t\t\tif (linkMode === 'edges') {\n\t\t\t\t\treturn build({ queries: ctx.bql.queries, schema: ctx.schema });\n\t\t\t\t}\n\t\t\t\tif (linkMode === 'refs') {\n\t\t\t\t\treturn buildRefs({ queries: ctx.bql.queries, schema: ctx.schema });\n\t\t\t\t}\n\t\t\t},\n\t\t\ttransition(\n\t\t\t\t'done',\n\t\t\t\t'run',\n\t\t\t\treduce(\n\t\t\t\t\t(ctx: SurrealDbMachineContext, event: any): SurrealDbMachineContext => ({\n\t\t\t\t\t\t...ctx,\n\t\t\t\t\t\tsurql: {\n\t\t\t\t\t\t\t...ctx.surql,\n\t\t\t\t\t\t\tqueries: event.data,\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t),\n\t\t\terrorTransition,\n\t\t),\n\t\trun: invoke(\n\t\t\tasync (ctx: SurrealDbMachineContext) => {\n\t\t\t\treturn run({ client: ctx.client, queries: assertDefined(ctx.surql.queries), config: ctx.config });\n\t\t\t},\n\t\t\ttransition(\n\t\t\t\t'done',\n\t\t\t\t'parse',\n\t\t\t\treduce(\n\t\t\t\t\t(ctx: SurrealDbMachineContext, event: any): SurrealDbMachineContext => ({\n\t\t\t\t\t\t...ctx,\n\t\t\t\t\t\tsurql: {\n\t\t\t\t\t\t\t...ctx.surql,\n\t\t\t\t\t\t\tres: event.data,\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t),\n\t\t\terrorTransition,\n\t\t),\n\t\tparse: invoke(\n\t\t\tasync (ctx: SurrealDbMachineContext) => {\n\t\t\t\treturn parse({\n\t\t\t\t\tres: assertDefined(ctx.surql.res),\n\t\t\t\t\tqueries: ctx.bql.queries,\n\t\t\t\t\tschema: ctx.schema,\n\t\t\t\t\tconfig: ctx.config,\n\t\t\t\t});\n\t\t\t},\n\t\t\ttransition(\n\t\t\t\t'done',\n\t\t\t\t'success',\n\t\t\t\treduce(\n\t\t\t\t\t(ctx: SurrealDbMachineContext, event: any): SurrealDbMachineContext => ({\n\t\t\t\t\t\t...ctx,\n\t\t\t\t\t\tbql: {\n\t\t\t\t\t\t\t...ctx.bql,\n\t\t\t\t\t\t\tres: event.data,\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t),\n\t\t\terrorTransition,\n\t\t),\n\t\tsuccess: state(),\n\t\terror: state(),\n\t},\n\t(ctx: SurrealDbMachineContext) => ctx,\n);\n\nconst awaitQueryMachine = async (context: SurrealDbMachineContext) => {\n\treturn new Promise<any[]>((resolve, reject) => {\n\t\tinterpret(\n\t\t\tsurrealDbQueryMachine,\n\t\t\t(service) => {\n\t\t\t\tif (service.machine.state.name === 'success') {\n\t\t\t\t\t//@ts-expect-error = todo\n\t\t\t\t\tresolve(service.context.bql.res);\n\t\t\t\t}\n\t\t\t\tif (service.machine.state.name === 'error') {\n\t\t\t\t\treject(service.context.error);\n\t\t\t\t}\n\t\t\t},\n\t\t\tcontext,\n\t\t);\n\t});\n};\n\nexport const runSurrealDbQueryMachine = async (\n\tenrichedBql: EnrichedBQLQuery[],\n\tschema: EnrichedBormSchema,\n\tconfig: BormConfig,\n\tclient: SimpleSurrealClient,\n) => {\n\treturn awaitQueryMachine({\n\t\tbql: {\n\t\t\tqueries: enrichedBql,\n\t\t},\n\t\tsurql: {},\n\t\tschema: schema,\n\t\tconfig: config,\n\t\tclient,\n\t\terror: null,\n\t});\n};\n","import { getIdFieldKey, getSchemaByThing, indent } from '../../../helpers';\nimport type {\n\tEnrichedAttributeQuery,\n\tEnrichedBormSchema,\n\tEnrichedBQLQuery,\n\tEnrichedLinkQuery,\n\tEnrichedRoleQuery,\n} from '../../../types';\nimport { FieldSchema, QueryPath } from '../../../types/symbols';\nimport { v4 as uuidv4 } from 'uuid';\nimport { buildFilter } from './filters';\n\nconst separator = '___';\n\nexport const buildTQLQuery = async (props: { queries: EnrichedBQLQuery[]; schema: EnrichedBormSchema }) => {\n\tconst { queries: batches, schema } = props;\n\treturn batches.map((query) => buildQuery({ query, schema }));\n};\n\nconst buildQuery = (props: { query: EnrichedBQLQuery; schema: EnrichedBormSchema }) => {\n\tconst { query, schema } = props;\n\tconst { $path, $thing, $filter, $fields, $sort, $offset, $limit, $id } = query;\n\n\tif (!$path) {\n\t\tthrow new Error('Path is not defined');\n\t}\n\n\tconst lines: string[] = [];\n\tconst queryPath = query[QueryPath];\n\tlines.push('match');\n\tlines.push(`$${$path} isa ${$thing};`);\n\n\tif ($filter || $id) {\n\t\tconst idField = getIdFieldKey(schema, query);\n\t\tconst $WithIdFilter = { ...$filter, ...($id ? { [idField]: $id } : {}) };\n\t\tconst filter = buildFilter({ $filter: $WithIdFilter, $var: $path, $thing, schema, depth: 0 });\n\t\tlines.push(`\\n${filter}`);\n\t}\n\n\tconst sorter = buildSorter({ schema, $thing, $var: $path, $sort, depth: 0 });\n\n\tif (sorter) {\n\t\tlines.push(sorter.match);\n\t}\n\n\tconst randomId = `M_${uuidv4()}`;\n\n\tlines.push(`?queryPath${randomId} = \"${queryPath}\";`);\n\tlines.push('fetch');\n\tlines.push(`?queryPath${randomId} as \"queryPath\";`);\n\n\tif ($fields) {\n\t\tconst dataFields = $fields.filter((f) => f.$fieldType === 'data') as EnrichedAttributeQuery[];\n\t\tif (dataFields && dataFields.length > 0) {\n\t\t\tlines.push(...processDataFields(dataFields, $path, 0));\n\t\t}\n\n\t\tconst linkFields = $fields.filter((f) => f.$fieldType === 'link') as EnrichedLinkQuery[];\n\t\tif (linkFields && linkFields.length > 0) {\n\t\t\tlines.push(...processLinkFields(linkFields, $path, $path, 0, schema));\n\t\t}\n\n\t\tconst roleFields = $fields.filter((f) => f.$fieldType === 'role') as EnrichedRoleQuery[];\n\t\tif (roleFields && roleFields.length > 0) {\n\t\t\tlines.push(...processRoleFields(roleFields, $path, $path, 0, schema));\n\t\t}\n\t}\n\n\tif (sorter) {\n\t\tlines.push(sorter.sort);\n\t}\n\n\tif (typeof $offset === 'number') {\n\t\tlines.push(`\\noffset ${$offset};`);\n\t}\n\n\tif (typeof $limit === 'number') {\n\t\tlines.push(`\\nlimit ${$limit};`);\n\t}\n\n\treturn lines.join('\\n');\n};\n\nconst processDataFields = (dataFields: EnrichedAttributeQuery[], $path: string, depth: number) => {\n\tconst postStrParts: string[] = [];\n\tconst asMetaDataParts: string[] = [];\n\tconst multiVals: { path: string }[] = [];\n\n\tfor (let i = 0; i < dataFields.length; i++) {\n\t\tif (!dataFields[i].$isVirtual) {\n\t\t\tpostStrParts.push(dataFields[i].$dbPath);\n\t\t}\n\t\tif (dataFields[i][FieldSchema].contentType === 'FLEX') {\n\t\t\tmultiVals.push({ path: dataFields[i][FieldSchema].dbPath });\n\t\t}\n\t\tasMetaDataParts.push(`{${dataFields[i].$dbPath}:${dataFields[i].$as}}`);\n\t}\n\n\tconst postStr = postStrParts.join(', ');\n\tconst $asMetaData = asMetaDataParts.join(',');\n\tconst $metaData = `$metadata:{as:[${$asMetaData}]}`;\n\tconst lines = [indent(`$${$path} as \"${$path}.${$metaData}.$dataFields\": ${postStr};`, depth)];\n\n\tif (multiVals.length > 0) {\n\t\tmultiVals.forEach((multiVal) => {\n\t\t\tlines.push(\n\t\t\t\tindent(\n\t\t\t\t\t`\"${multiVal.path}.$multiVal\": {match $${$path} has ${multiVal.path} $${multiVal.path}; fetch $${multiVal.path}: attribute;};`,\n\t\t\t\t\tdepth,\n\t\t\t\t),\n\t\t\t);\n\t\t});\n\t}\n\treturn lines;\n};\n\nconst processRoleFields = (\n\troleFields: EnrichedRoleQuery[],\n\t$path: string,\n\tdotPath: string,\n\tdepth: number,\n\tschema: EnrichedBormSchema,\n) => {\n\tconst nextDepth = depth + 1;\n\tconst lines: string[] = [];\n\n\tfor (const roleField of roleFields) {\n\t\tconst { $fields, $as, $justId, $idNotIncluded, $filterByUnique, $thing, $sort, $offset, $limit } = roleField;\n\t\tconst queryPath = roleField[QueryPath];\n\n\t\tconst $metaData = `$metadata:{as:${$as},justId:${\n\t\t\t$justId ? 'T' : 'F'\n\t\t},idNotIncluded:${$idNotIncluded},filterByUnique:${$filterByUnique}}`;\n\t\tlines.push(indent(`\"${dotPath}.${$metaData}.${roleField.$var}\": {`, depth));\n\t\tlines.push(indent('match', nextDepth));\n\t\tconst $roleVar = `${$path}${separator}${roleField.$var}`;\n\t\tlines.push(indent(`$${$roleVar} isa ${roleField.$thing};`, nextDepth));\n\t\tlines.push(\n\t\t\tindent(\n\t\t\t\t// TODO: The parent node already declare $path\n\t\t\t\t`$${$path} (${roleField.$var}: $${$path}${separator}${roleField.$var}) isa ${roleField.$intermediary};`,\n\t\t\t\tnextDepth,\n\t\t\t),\n\t\t);\n\n\t\tif (roleField.$filter || roleField.$id) {\n\t\t\tconst idField = getIdFieldKey(schema, roleField);\n\t\t\tconst withId = roleField.$id ? { [idField]: roleField.$id } : {};\n\t\t\tconst withIdFilter = { ...roleField.$filter, ...withId };\n\n\t\t\tlines.push(\n\t\t\t\tbuildFilter({\n\t\t\t\t\t$filter: withIdFilter,\n\t\t\t\t\t$var: $roleVar,\n\t\t\t\t\t$thing: roleField.$thing,\n\t\t\t\t\tschema,\n\t\t\t\t\tdepth: nextDepth,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tconst sorter = buildSorter({ schema, $thing, $var: $roleVar, $sort, depth: nextDepth });\n\n\t\tif (sorter) {\n\t\t\tlines.push(sorter.match);\n\t\t}\n\n\t\tif ($fields) {\n\t\t\tconst randomId = `M_${uuidv4()}`;\n\t\t\tlines.push(indent(`\\n?queryPath${randomId} = \"${queryPath}\";`, nextDepth)); ///rawPaths => to inject metadata in the response, in this case only the path\n\t\t\tlines.push(indent('fetch', nextDepth));\n\t\t\tlines.push(indent(`?queryPath${randomId} as \"queryPath\";`, nextDepth)); ///rawPaths => to recover metadata in the response\n\n\t\t\tconst dataFields = $fields?.filter((f) => f.$fieldType === 'data') as EnrichedAttributeQuery[];\n\t\t\tif (dataFields && dataFields.length > 0) {\n\t\t\t\tlines.push(...processDataFields(dataFields, $roleVar, nextDepth));\n\t\t\t}\n\n\t\t\tconst linkFields = $fields?.filter((f) => f.$fieldType === 'link') as EnrichedLinkQuery[];\n\t\t\tif (linkFields && linkFields.length > 0) {\n\t\t\t\tlines.push(...processLinkFields(linkFields, $roleVar, `${$path}.${roleField.$var}`, nextDepth, schema));\n\t\t\t}\n\t\t\tconst roleFields = $fields?.filter((f) => f.$fieldType === 'role') as EnrichedRoleQuery[];\n\t\t\tif (roleFields && roleFields.length > 0) {\n\t\t\t\tlines.push(...processRoleFields(roleFields, $roleVar, `${$path}.${roleField.$var}`, nextDepth, schema));\n\t\t\t}\n\t\t}\n\n\t\tif (sorter) {\n\t\t\tlines.push(sorter.sort);\n\t\t}\n\n\t\tif (typeof $offset === 'number') {\n\t\t\tlines.push(indent(`offset ${$offset};`, nextDepth));\n\t\t}\n\n\t\tif (typeof $limit === 'number') {\n\t\t\tlines.push(indent(`limit ${$limit};`, nextDepth));\n\t\t}\n\n\t\tlines.push(indent('};', depth));\n\t}\n\n\treturn lines;\n};\n\nconst processLinkFields = (\n\tlinkFields: EnrichedLinkQuery[],\n\t$path: string,\n\tdotPath: string,\n\tdepth: number,\n\tschema: EnrichedBormSchema,\n) => {\n\tconst nextDepth = depth + 1;\n\tconst lines: string[] = [];\n\n\tfor (const linkField of linkFields) {\n\t\tconst { $fields, $as, $justId, $idNotIncluded, $filterByUnique, $playedBy, $thing, $sort, $offset, $limit } =\n\t\t\tlinkField;\n\t\tconst queryPath = linkField[QueryPath];\n\t\tconst $metaData = `$metadata:{as:${$as},justId:${\n\t\t\t$justId ? 'T' : 'F'\n\t\t},idNotIncluded:${$idNotIncluded},filterByUnique:${$filterByUnique}}`;\n\t\tlines.push(indent(`\"${dotPath}.${$metaData}.${linkField.$var}\": {`, depth));\n\t\tlines.push(indent('match', nextDepth));\n\t\tconst $linkVar = `${$path}${separator}${linkField.$var}`;\n\t\tlines.push(indent(`$${$linkVar} isa ${linkField.$thing};`, nextDepth));\n\n\t\tif (linkField.$filter || linkField.$id) {\n\t\t\tconst idField = getIdFieldKey(schema, linkField);\n\t\t\tconst withId = linkField.$id ? { [idField]: linkField.$id } : {};\n\t\t\tconst withIdFilter = { ...linkField.$filter, ...withId };\n\t\t\tlines.push(\n\t\t\t\tbuildFilter({\n\t\t\t\t\t$filter: withIdFilter,\n\t\t\t\t\t$var: $linkVar,\n\t\t\t\t\t$thing: linkField.$thing,\n\t\t\t\t\tschema,\n\t\t\t\t\tdepth: nextDepth,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tconst sorter = buildSorter({ schema, $thing, $var: $linkVar, $sort, depth: nextDepth });\n\n\t\tif (sorter) {\n\t\t\tlines.push(sorter.match);\n\t\t}\n\n\t\tif (linkField.$target === 'role') {\n\t\t\t// a. intermediary\n\t\t\tlines.push(\n\t\t\t\tindent(\n\t\t\t\t\t`$${$path}_intermediary (${linkField.$plays}: $${$path}, ${$playedBy.plays}: $${$linkVar}) isa ${linkField.$intermediary};`,\n\t\t\t\t\tnextDepth,\n\t\t\t\t),\n\t\t\t);\n\t\t} else {\n\t\t\t// b. no intermediary\n\t\t\tlines.push(\n\t\t\t\tindent(\n\t\t\t\t\t// TODO: There can't be multiple \"isa\" for the same variable\n\t\t\t\t\t// TODO: There can't be multiple relation constraints for the same variable. The filter may contain multiple relation constraints.\n\t\t\t\t\t`$${$linkVar} (${linkField.$plays}: $${$path});`,\n\t\t\t\t\tnextDepth,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tif ($fields) {\n\t\t\tconst randomId = `M_${uuidv4()}`;\n\t\t\tlines.push(indent(`?queryPath${randomId} = \"${queryPath}\";`, nextDepth)); ///queryPath => to inject metadata in the response, in this case only the path\n\t\t\tlines.push(indent('fetch', nextDepth));\n\t\t\tlines.push(indent(`?queryPath${randomId} as \"queryPath\";`, nextDepth)); ///queryPath => to recover metadata in the response\n\n\t\t\tconst dataFields = $fields?.filter((f) => f.$fieldType === 'data') as EnrichedAttributeQuery[];\n\t\t\tif (dataFields && dataFields.length > 0) {\n\t\t\t\tlines.push(...processDataFields(dataFields, $linkVar, nextDepth));\n\t\t\t}\n\n\t\t\tconst linkFields = $fields?.filter((f) => f.$fieldType === 'link') as EnrichedLinkQuery[];\n\t\t\tif (linkFields && linkFields.length > 0) {\n\t\t\t\tlines.push(...processLinkFields(linkFields, $linkVar, `${$path}.${linkField.$var}`, nextDepth, schema));\n\t\t\t}\n\n\t\t\tconst roleFields = $fields?.filter((f) => f.$fieldType === 'role') as EnrichedRoleQuery[];\n\t\t\tif (roleFields && roleFields.length > 0) {\n\t\t\t\tlines.push(...processRoleFields(roleFields, $linkVar, `${$path}.${linkField.$var}`, nextDepth, schema));\n\t\t\t}\n\t\t}\n\n\t\tif (sorter) {\n\t\t\tlines.push(sorter.sort);\n\t\t}\n\n\t\tif (typeof $offset === 'number') {\n\t\t\tlines.push(indent(`offset ${$offset};`, nextDepth));\n\t\t}\n\n\t\tif (typeof $limit === 'number') {\n\t\t\tlines.push(indent(`limit ${$limit};`, nextDepth));\n\t\t}\n\n\t\tlines.push(indent('};', depth));\n\t}\n\n\treturn lines;\n};\n\nconst normalizeSorter = (sort: { field: string; desc?: boolean } | string) => {\n\tif (typeof sort === 'string') {\n\t\treturn {\n\t\t\tfield: sort,\n\t\t\tdesc: false,\n\t\t};\n\t}\n\treturn { ...sort, desc: sort.desc ?? false };\n};\n\nconst buildSorter = (props: {\n\t$var: string;\n\t$thing: string;\n\tschema: EnrichedBormSchema;\n\t$sort?: ({ field: string; desc?: boolean } | string)[];\n\tdepth: number;\n}) => {\n\tconst { $var, $thing, schema, $sort, depth } = props;\n\n\tconst thing = getSchemaByThing(schema, $thing);\n\tconst sortMatch: string[] = [];\n\tconst sorter: string[] = [];\n\n\t$sort?.forEach((sort) => {\n\t\tconst s = normalizeSorter(sort);\n\t\tconst df = thing.dataFields?.find((df) => df.path === s.field);\n\t\tif (!df) {\n\t\t\tthrow new Error(`\"${$thing}\" does not have data field \"${s.field}\"`);\n\t\t}\n\t\tconst attrVar = `${s.field}_${uuidv4()}`;\n\t\tsortMatch.push(indent('{', depth));\n\t\tsortMatch.push(indent(`$${$var} has ${df.dbPath} $${attrVar}_1;`, depth + 1));\n\t\tsortMatch.push(indent('not {', depth + 1));\n\t\tsortMatch.push(indent(`$${$var} has ${df.dbPath} $${attrVar}_2;`, depth + 2));\n\t\tsortMatch.push(indent(`$${attrVar}_2 < $${attrVar}_1;`, depth + 2));\n\t\tsortMatch.push(indent('};', depth + 1));\n\t\tsortMatch.push(indent(`?${attrVar}_ = $${attrVar}_1;`, depth + 1));\n\t\tsortMatch.push(indent('} or {', depth));\n\t\tsortMatch.push(indent(`not { $${$var} has ${df.dbPath} $${attrVar}_1; };`, depth + 1));\n\t\t// TODO: This is a workaround to put things with undefined attribute at the end.\n\t\t// \"~\" is the last non-control char (DEC 126) in ASCII.\n\t\tsortMatch.push(indent(`?${attrVar}_ = \"~\";`, depth + 1));\n\t\tsortMatch.push(indent('};', depth));\n\t\tsortMatch.push(indent(`?${attrVar} = ?${attrVar}_;`, depth));\n\t\tconst order = s.desc ? 'desc' : 'asc';\n\t\tsorter.push(`?${attrVar} ${order}`);\n\t});\n\n\tif (sortMatch.length === 0) {\n\t\treturn;\n\t}\n\n\treturn {\n\t\tmatch: sortMatch.join(''),\n\t\tsort: indent(`sort ${sorter.join(', ')};`, depth),\n\t};\n};\n","import { isObject, isArray } from 'radash';\nimport { getSchemaByThing, indent } from '../../../helpers';\nimport { v4 as uuidv4 } from 'uuid';\nimport type {\n\tFilter,\n\tEnrichedBormSchema,\n\tEnrichedBormEntity,\n\tEnrichedBormRelation,\n\tPositiveFilter,\n} from '../../../types';\n\nexport const buildFilter = (props: {\n\t$filter: Filter;\n\t$var: string;\n\t$thing: string;\n\tschema: EnrichedBormSchema;\n\tdepth: number;\n}): string => {\n\tconst { $filter: $nonMappedFilter, $var, $thing, schema, depth } = props;\n\tconst $filter = mapFilterKeys($nonMappedFilter, getSchemaByThing(schema, $thing));\n\n\tconst { $not, ...rest } = $filter;\n\n\tconst matches: string[] = [];\n\n\t// Handle $not filters\n\tif (isPositiveFilter($not)) {\n\t\tconst notMatches = processPositiveFilter($not, $var, $thing, schema, depth, true);\n\t\tmatches.push(...notMatches);\n\t} else if ($not !== undefined) {\n\t\tthrow new Error('$not must be a PositiveFilter object');\n\t}\n\n\t// Handle positive filters\n\tconst positiveMatches = processPositiveFilter(rest, $var, $thing, schema, depth, false);\n\tmatches.push(...positiveMatches);\n\n\treturn matches.join('\\n');\n};\n\nconst processPositiveFilter = (\n\tfilter: PositiveFilter,\n\t$var: string,\n\t$thing: string,\n\tschema: EnrichedBormSchema,\n\tdepth: number,\n\tisNegated: boolean,\n): string[] => {\n\tconst thing = getSchemaByThing(schema, $thing);\n\tconst matches: string[] = [];\n\n\tfor (const [key, value] of Object.entries(filter)) {\n\t\tif (key.startsWith('$')) {\n\t\t\t// Handle logical operators ($and, $or)\n\t\t\tconst normalizedKey = key.toLowerCase() as '$and' | '$or';\n\t\t\tif (normalizedKey === '$and' || normalizedKey === '$or') {\n\t\t\t\tconst subFilters = isArray(value) ? value : [value];\n\t\t\t\tconst subMatches = subFilters.map((subFilter) => {\n\t\t\t\t\tif (isPositiveFilter(subFilter)) {\n\t\t\t\t\t\tconst subFilterMatches = processPositiveFilter(subFilter, $var, $thing, schema, depth + 1, isNegated);\n\t\t\t\t\t\treturn subFilterMatches.join('\\n');\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow new Error(`Invalid subfilter in ${normalizedKey}: ${JSON.stringify(subFilter)}`);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tconst joinedSubMatches = subMatches.join(normalizedKey === '$and' ? '\\n' : ' } or { ');\n\t\t\t\tif (normalizedKey === '$or' && subMatches.length > 1) {\n\t\t\t\t\tmatches.push(indent(`{ ${joinedSubMatches} };`, depth));\n\t\t\t\t} else {\n\t\t\t\t\tmatches.push(indent(joinedSubMatches, depth));\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t// Skip other special keys\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Handle data fields\n\t\tconst df = thing.dataFields?.find((df) => df.dbPath === key || df.path === key);\n\t\tif (df) {\n\t\t\tconst fieldMatches = handleDataFieldFilter(key, value, $var, depth, isNegated);\n\t\t\tmatches.push(...fieldMatches);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Handle link fields\n\t\tconst lf = thing.linkFields?.find((lf) => lf.path === key);\n\t\tif (lf) {\n\t\t\tconst linkMatches = handleLinkFieldFilter(lf, value, $var, schema, depth, isNegated);\n\t\t\tmatches.push(...linkMatches);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Handle roles in relations\n\t\tif (thing.thingType === 'relation') {\n\t\t\tconst role = thing.roles[key];\n\t\t\tif (role) {\n\t\t\t\tconst roleMatches = handleRelationRoleFilter(role, value, $var, $thing, schema, depth, isNegated);\n\t\t\t\tmatches.push(...roleMatches);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\tthrow new Error(`\"${$thing}\" does not have property \"${key}\"`);\n\t}\n\n\treturn matches;\n};\n\nconst handleDataFieldFilter = (key: string, value: any, $var: string, depth: number, isNegated: boolean): string[] => {\n\tconst matches: string[] = [];\n\n\tif (isObject(value) && !isArray(value)) {\n\t\t// Handle operator-based filters (e.g., { $eq: value })\n\t\tfor (const [op, opValue] of Object.entries(value)) {\n\t\t\tconst normalizedOp = op.toLowerCase() as '$eq' | '$ne' | '$in' | '$nin' | '$exists';\n\t\t\tlet match = '';\n\t\t\tswitch (normalizedOp) {\n\t\t\t\tcase '$eq':\n\t\t\t\t\tmatch = `$${$var} has ${key} ${serializeValue(opValue)};`;\n\t\t\t\t\tbreak;\n\t\t\t\tcase '$ne':\n\t\t\t\t\tmatch = `not { $${$var} has ${key} ${serializeValue(opValue)}; };`;\n\t\t\t\t\tbreak;\n\t\t\t\tcase '$in': {\n\t\t\t\t\tif (!isArray(opValue)) {\n\t\t\t\t\t\tthrow new Error('Value for $in operator must be an array');\n\t\t\t\t\t}\n\t\t\t\t\tconst inAlt = opValue.map((v) => `$${$var} has ${key} ${serializeValue(v)};`);\n\t\t\t\t\tmatch = joinAlt(inAlt);\n\t\t\t\t\tif (isNegated) {\n\t\t\t\t\t\tmatch = `not { ${match} };`;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase '$nin':\n\t\t\t\t\tif (!isArray(opValue)) {\n\t\t\t\t\t\tthrow new Error('Value for $nin operator must be an array');\n\t\t\t\t\t}\n\t\t\t\t\tfor (const v of opValue) {\n\t\t\t\t\t\tconst ninMatch = `not { $${$var} has ${key} ${serializeValue(v)}; };`;\n\t\t\t\t\t\tmatches.push(indent(ninMatch, depth));\n\t\t\t\t\t}\n\t\t\t\t\tcontinue; // Skip the rest of the loop for '$nin'\n\t\t\t\tcase '$exists':\n\t\t\t\t\tif (opValue === true) {\n\t\t\t\t\t\tmatch = `$${$var} has ${key} $${key}_${uuidv4()};`;\n\t\t\t\t\t} else if (opValue === false) {\n\t\t\t\t\t\tmatch = `not { $${$var} has ${key} $${key}_${uuidv4()}; };`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow new Error(`Invalid value for $exists: ${opValue}`);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(`Unsupported operator \"${op}\" for data field \"${key}\"`);\n\t\t\t}\n\t\t\tif (isNegated) {\n\t\t\t\tmatch = `not { ${match} };`;\n\t\t\t}\n\t\t\tmatches.push(indent(match, depth));\n\t\t}\n\t} else if (isArray(value)) {\n\t\t// Treat array value as an $in operator\n\t\tconst alt = value.map((v) => `$${$var} has ${key} ${serializeValue(v)};`);\n\t\tlet match = joinAlt(alt);\n\t\tif (match) {\n\t\t\tif (isNegated) {\n\t\t\t\tmatch = `not { ${match} };`;\n\t\t\t}\n\t\t\tmatches.push(indent(match, depth));\n\t\t}\n\t} else {\n\t\t// Scalar value\n\t\tlet match = `$${$var} has ${key} ${serializeValue(value)};`;\n\t\tif (isNegated) {\n\t\t\tmatch = `not { ${match} };`;\n\t\t}\n\t\tmatches.push(indent(match, depth));\n\t}\n\n\treturn matches;\n};\n\nconst handleLinkFieldFilter = (\n\tlf: any, // Adjust type as needed\n\tvalue: any,\n\t$var: string,\n\tschema: EnrichedBormSchema,\n\tdepth: number,\n\tisNegated: boolean,\n): string[] => {\n\tconst matches: string[] = [];\n\tconst [opposite] = lf.oppositeLinkFieldsPlayedBy;\n\tconst oppositeThing = getSchemaByThing(schema, opposite.thing);\n\tconst oppositeIdField = oppositeThing.idFields?.[0];\n\tif (!oppositeIdField) {\n\t\tthrow new Error(`\"${opposite.thing}\" does not have an id field`);\n\t}\n\n\tconst oppVar = `${opposite.thing}_${uuidv4()}`;\n\n\tlet match = '';\n\n\tif (lf.target === 'relation') {\n\t\t// Handle link field targeting a relation\n\t\tif (value === null) {\n\t\t\tmatch = isNegated\n\t\t\t\t? `(${lf.plays}: $${$var}) isa ${lf.relation};`\n\t\t\t\t: `not { (${lf.plays}: $${$var}) isa ${lf.relation}; };`;\n\t\t} else if (isArray(value)) {\n\t\t\tconst alt = value.map(\n\t\t\t\t(v) => `(${lf.plays}: $${$var}) isa ${lf.relation}, has ${oppositeIdField} ${serializeValue(v)};`,\n\t\t\t);\n\t\t\tmatch = joinAlt(alt);\n\t\t\tif (isNegated) {\n\t\t\t\tmatch = `not { ${match} };`;\n\t\t\t}\n\t\t} else {\n\t\t\tmatch = `(${lf.plays}: $${$var}) isa ${lf.relation}, has ${oppositeIdField} ${serializeValue(value)};`;\n\t\t\tif (isNegated) {\n\t\t\t\tmatch = `not { ${match} };`;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Handle link field without intermediary relation\n\t\tif (value === null) {\n\t\t\tmatch = isNegated\n\t\t\t\t? `$${oppVar} isa ${opposite.thing}; (${lf.plays}: $${$var}, ${opposite.plays}: $${oppVar}) isa ${lf.relation};`\n\t\t\t\t: `not { $${oppVar} isa ${opposite.thing}; (${lf.plays}: $${$var}, ${opposite.plays}: $${oppVar}) isa ${lf.relation}; };`;\n\t\t} else if (isArray(value)) {\n\t\t\tconst alt = value.map(\n\t\t\t\t(v) =>\n\t\t\t\t\t`$${oppVar} isa ${opposite.thing}, has ${oppositeIdField} ${serializeValue(\n\t\t\t\t\t\tv,\n\t\t\t\t\t)}; (${lf.plays}: $${$var}, ${opposite.plays}: $${oppVar}) isa ${lf.relation};`,\n\t\t\t);\n\t\t\tmatch = joinAlt(alt);\n\t\t\tif (isNegated) {\n\t\t\t\tmatch = `not { ${match} };`;\n\t\t\t}\n\t\t} else {\n\t\t\tmatch = `$${oppVar} isa ${opposite.thing}, has ${oppositeIdField} ${serializeValue(\n\t\t\t\tvalue,\n\t\t\t)}; (${lf.plays}: $${$var}, ${opposite.plays}: $${oppVar}) isa ${lf.relation};`;\n\t\t\tif (isNegated) {\n\t\t\t\tmatch = `not { ${match} };`;\n\t\t\t}\n\t\t}\n\t}\n\n\tmatches.push(indent(match, depth));\n\treturn matches;\n};\n\nconst handleRelationRoleFilter = (\n\trole: any, // Adjust type as needed\n\tvalue: any,\n\t$var: string,\n\t$thing: string,\n\tschema: EnrichedBormSchema,\n\tdepth: number,\n\tisNegated: boolean,\n): string[] => {\n\tconst matches: string[] = [];\n\tconst [player] = role.playedBy || [];\n\tconst playerThing = getSchemaByThing(schema, player.thing);\n\tconst playerIdField = playerThing.idFields?.[0];\n\tif (!playerIdField) {\n\t\tthrow new Error(`\"${player.thing}\" does not have an id field`);\n\t}\n\tconst playerVar = `${player.thing}_${uuidv4()}`;\n\tconst filterId = uuidv4();\n\tconst filterVar = `${$var}_${filterId}`;\n\n\tmatches.push(indent(`$${filterVar} isa ${$thing};`, depth));\n\n\tlet match = '';\n\n\tif (value === null) {\n\t\tmatch = `$${filterVar} (${player.plays}: ${playerVar});`;\n\t\tif (isNegated) {\n\t\t\tmatches.push(indent(match, depth));\n\t\t} else {\n\t\t\tmatches.push(indent(`not { ${match} };`, depth));\n\t\t}\n\t} else if (isArray(value)) {\n\t\tconst alt = value.map(\n\t\t\t(v) =>\n\t\t\t\t`$${playerVar} isa ${player.thing}, has ${playerIdField} ${serializeValue(\n\t\t\t\t\tv,\n\t\t\t\t)}; $${filterVar} (${player.plays}: $${playerVar});`,\n\t\t);\n\t\tmatch = joinAlt(alt);\n\t\tif (isNegated) {\n\t\t\tmatches.push(indent(`not { ${match} };`, depth));\n\t\t} else {\n\t\t\tmatches.push(indent(match, depth));\n\t\t}\n\t} else {\n\t\tmatch = `$${playerVar} isa ${player.thing}, has ${playerIdField} ${serializeValue(\n\t\t\tvalue,\n\t\t)}; $${filterVar} (${player.plays}: $${playerVar});`;\n\t\tif (isNegated) {\n\t\t\tmatches.push(indent(`not { ${match} };`, depth));\n\t\t} else {\n\t\t\tmatches.push(indent(match, depth));\n\t\t}\n\t}\n\n\tmatches.push(indent(`$${$var} is $${filterVar};`, depth));\n\n\treturn matches;\n};\n\nconst joinAlt = (alt: string[]): string => {\n\tif (alt.length > 1) {\n\t\treturn `{ ${alt.join(' } or { ')} };`;\n\t} else if (alt.length === 1) {\n\t\treturn alt[0];\n\t} else {\n\t\tthrow new Error('No alternatives provided to joinAlt');\n\t}\n};\n\nconst serializeValue = (value: string | number | boolean | Date | object): string => {\n\tif (typeof value === 'string') {\n\t\treturn `'${value}'`;\n\t}\n\tif (typeof value === 'number' || typeof value === 'boolean') {\n\t\treturn `${value}`;\n\t}\n\tif (value instanceof Date) {\n\t\treturn `'${value.toISOString().replace('Z', '')}'`;\n\t}\n\tif (isObject(value)) {\n\t\tif ('$id' in value) {\n\t\t\tconst idValue = (value as any).$id;\n\t\t\tif (isArray(idValue)) {\n\t\t\t\treturn `like \"^(${idValue.join('|')})$\"`;\n\t\t\t}\n\t\t\treturn serializeValue(idValue);\n\t\t}\n\t\tthrow new Error('Cannot serialize complex object values in filter');\n\t}\n\tthrow new Error(`Unsupported value type: ${typeof value}`);\n};\n\nconst mapFilterKeys = (filter: Filter, thingSchema: EnrichedBormEntity | EnrichedBormRelation): Filter => {\n\tconst mapper: Record<string, string> = {};\n\n\tthingSchema.dataFields?.forEach((df) => {\n\t\tif (df.path !== df.dbPath) {\n\t\t\tmapper[df.path] = df.dbPath;\n\t\t}\n\t});\n\n\tif (Object.keys(mapper).length === 0) {\n\t\treturn filter;\n\t}\n\n\tconst { $not, ...f } = filter;\n\tconst newFilter: Filter = mapPositiveFilterKeys(f, mapper);\n\n\tif ($not && isPositiveFilter($not)) {\n\t\tnewFilter.$not = mapPositiveFilterKeys($not, mapper);\n\t}\n\n\treturn newFilter;\n};\n\nconst mapPositiveFilterKeys = (filter: PositiveFilter, mapper: Record<string, string>): PositiveFilter => {\n\tconst newFilter: PositiveFilter = {};\n\tObject.entries(filter).forEach(([key, filterValue]) => {\n\t\tconst newKey = mapper[key] || key;\n\t\tnewFilter[newKey] = filterValue;\n\t});\n\treturn newFilter;\n};\n\nconst isPositiveFilter = (filter: any): filter is PositiveFilter => {\n\treturn typeof filter === 'object' && filter !== null && !Array.isArray(filter);\n};\n","import { isArray } from 'radash';\nimport { assertDefined, getCurrentSchema } from '../../../helpers';\nimport type {\n\tBormConfig,\n\tEnrichedBormEntity,\n\tEnrichedBormRelation,\n\tEnrichedBormSchema,\n\tEnrichedBQLQuery,\n\tRawBQLQuery,\n} from '../../../types';\nimport { QueryPath } from '../../../types/symbols';\n\ntype TypeDbResponse = Record<string, any>; //TODO\n\nexport const parseTQLQuery = async (props: {\n\trawBqlRequest: RawBQLQuery[];\n\tenrichedBqlQuery: EnrichedBQLQuery[];\n\tschema: EnrichedBormSchema;\n\tconfig: BormConfig;\n\trawTqlRes: Record<string, any>[][];\n}): Promise<TypeDbResponse[]> => {\n\tconst { enrichedBqlQuery, rawBqlRequest, schema, config, rawTqlRes } = props;\n\n\tif (!enrichedBqlQuery) {\n\t\tthrow new Error('BQL request not enriched');\n\t} else if (!rawTqlRes) {\n\t\tthrow new Error('TQL query not executed');\n\t}\n\n\treturn rawTqlRes.map((res, i) => {\n\t\tconst rawBql = rawBqlRequest[i];\n\t\tconst query = enrichedBqlQuery[i];\n\t\tconst parsed = realParse(res, rawBql, query, schema, config);\n\t\treturn parsed;\n\t});\n};\n\nconst realParse = (\n\tres: any[],\n\trawBqlRequest: RawBQLQuery,\n\tenrichedBqlQuery: EnrichedBQLQuery,\n\tschema: EnrichedBormSchema,\n\tconfig: BormConfig,\n) => {\n\tif (res.length === 0) {\n\t\t// This is a little inconsistent. In the prop if the result is empty\n\t\t// we return null or undefined based on the config, but the test\n\t\t// expect the top level result to always return null.\n\t\t// always return\n\t\t// return config.query?.returnNulls ? null : undefined;\n\t\treturn null;\n\t}\n\tif (enrichedBqlQuery.$filterByUnique) {\n\t\treturn parseObj(res[0], rawBqlRequest, schema, config);\n\t}\n\treturn res.map((item) => parseObj(item, rawBqlRequest, schema, config));\n};\n\nconst parseObj = (res: any, rawBqlRequest: RawBQLQuery, schema: EnrichedBormSchema, config: BormConfig) => {\n\tconst { dataFields, currentSchema, linkFields, roleFields, schemaValue } = parseFields(res, schema);\n\n\tconst parsedDataFields = parseDataFields(dataFields, currentSchema, config);\n\tconst parsedLinkFields = parseLinkFields(linkFields, schema, config);\n\tconst parsedRoleFields = parseRoleFields(roleFields, schema, config);\n\tconst idNotIncluded = rawBqlRequest?.$fields?.every(\n\t\t(field) => !currentSchema?.idFields?.includes(typeof field === 'string' ? field : field.$path),\n\t);\n\n\tconst finalObj = {\n\t\t...parsedLinkFields,\n\t\t...parsedRoleFields,\n\t\t...schemaValue,\n\t\t...(!config.query?.noMetadata && rawBqlRequest.$id\n\t\t\t? // TODO: This line is wrong: the id field may not be \"id\"; $id may be an array of string;\n\t\t\t\t{ $id: Array.isArray(rawBqlRequest.$id) ? parsedDataFields['id'] : rawBqlRequest.$id }\n\t\t\t: {}),\n\t\t...(idNotIncluded\n\t\t\t? Object.fromEntries(Object.entries(parsedDataFields).filter(([key]) => !currentSchema?.idFields?.includes(key)))\n\t\t\t: parsedDataFields),\n\t};\n\n\treturn finalObj;\n};\n\nconst parseFields = (obj: any, schema: EnrichedBormSchema) => {\n\tconst keys = Object.keys(obj);\n\t// Find and process $dataFields\n\tconst dataFieldsKey = keys.find((key) => key.endsWith('.$dataFields'));\n\tconst multiValKeys = keys.filter((key) => key.endsWith('.$multiVal'));\n\tif (!dataFieldsKey) {\n\t\tthrow new Error('No dataFields');\n\t}\n\n\t//if there are multiValKeys, we replace it in the Object\n\tif (multiValKeys?.length > 0) {\n\t\tmultiValKeys.forEach((multiValKey) => {\n\t\t\tconst multiValKeyWithout$multiVal = multiValKey.replace(/\\.\\$multiVal$/, '');\n\t\t\tconst realValue = obj[multiValKey][0][multiValKeyWithout$multiVal].attribute; //there is an easier way for sure\n\t\t\t// eslint-disable-next-line no-param-reassign\n\t\t\tobj[dataFieldsKey][multiValKeyWithout$multiVal] = realValue;\n\t\t});\n\t}\n\tconst dataFields = obj[dataFieldsKey];\n\n\tconst metaDataKey = dataFieldsKey.split('.')[dataFieldsKey.split('.').length - 2];\n\tdataFields.$metaData = metaDataKey;\n\n\tif (dataFields.length === 0) {\n\t\tthrow new Error('No dataFields');\n\t}\n\n\tconst dataFieldsThing = dataFields.type;\n\tconst schemaValue = {\n\t\t$thing: dataFieldsThing.label,\n\t\t$thingType: dataFieldsThing.root,\n\t\t[QueryPath]: obj['queryPath'].value,\n\t};\n\tconst node = { [`$${schemaValue.$thingType}`]: schemaValue.$thing };\n\tconst currentSchema = getCurrentSchema(schema, node);\n\n\t// Process linkFields and roleFields\n\tconst linkFields = keys\n\t\t.filter((key) => {\n\t\t\tconst $key = assertDefined(key.split('.').pop());\n\t\t\treturn !key.endsWith('.$dataFields') && currentSchema.linkFields?.some((o) => o.path === $key);\n\t\t})\n\t\t.map((key) => {\n\t\t\tconst $key = assertDefined(key.split('.').pop());\n\t\t\tconst linkField = assertDefined(currentSchema.linkFields?.find((o) => o.path === $key));\n\t\t\treturn {\n\t\t\t\t$linkFields: obj[key],\n\t\t\t\t$key,\n\t\t\t\t$metaData: key.split('.')[key.split('.').length - 2],\n\t\t\t\t$cardinality: linkField.cardinality,\n\t\t\t};\n\t\t});\n\n\tconst roleFields = keys\n\t\t.filter((key) => {\n\t\t\tconst role = key.split('.').pop();\n\t\t\treturn (\n\t\t\t\trole && !key.endsWith('.$dataFields') && currentSchema.thingType === 'relation' && currentSchema.roles?.[role]\n\t\t\t);\n\t\t})\n\t\t.map((key) => {\n\t\t\tconst role = assertDefined(key.split('.').pop());\n\t\t\treturn {\n\t\t\t\t$roleFields: obj[key],\n\t\t\t\t$key: role,\n\t\t\t\t$metaData: key.split('.')[key.split('.').length - 2],\n\t\t\t\t$cardinality: (currentSchema as EnrichedBormRelation).roles[role].cardinality,\n\t\t\t};\n\t\t});\n\n\treturn { dataFields, schemaValue, currentSchema, linkFields, roleFields };\n};\n\nconst parseDataFields = (\n\tdataFields: any,\n\tcurrentSchema: EnrichedBormEntity | EnrichedBormRelation,\n\tconfig: BormConfig,\n) => {\n\tconst { $metaData } = dataFields;\n\tconst { as: $as } = parseArrayMetadata($metaData);\n\n\t// Process the main data fields\n\tconst mainDataFields = Object.entries(dataFields as Record<string, any>)\n\t\t.filter(([key]) => key !== 'type' && !key.startsWith('$'))\n\t\t.map(([key, value]) => {\n\t\t\tconst field = currentSchema.dataFields?.find((f) => f.path === key || f.dbPath === key);\n\t\t\tconst isIdField = key === 'id';\n\t\t\tconst $asKey = Array.isArray($as) ? $as.find((o) => o[key])?.[key] : key;\n\n\t\t\tlet fieldValue;\n\t\t\tif (field?.cardinality === 'ONE') {\n\t\t\t\tfieldValue = value[0] ? value[0].value : config.query?.returnNulls ? null : undefined;\n\t\t\t\tif (field.contentType === 'DATE' || (field.contentType === 'FLEX' && value[0].type.value_type === 'datetime')) {\n\t\t\t\t\t/// date fields need to be converted to ISO format including the timezone\n\t\t\t\t\tfieldValue = fieldValue ? `${fieldValue}Z` : fieldValue;\n\t\t\t\t} else if (field.contentType === 'JSON') {\n\t\t\t\t\tfieldValue = fieldValue && JSON.parse(fieldValue);\n\t\t\t\t}\n\t\t\t\tif (isIdField) {\n\t\t\t\t\treturn [\n\t\t\t\t\t\t[$asKey, fieldValue],\n\t\t\t\t\t\t['$id', fieldValue],\n\t\t\t\t\t].filter(([_, v]) => v !== undefined);\n\t\t\t\t}\n\t\t\t} else if (field?.cardinality === 'MANY') {\n\t\t\t\tif (!isArray(value)) {\n\t\t\t\t\tthrow new Error('Typedb fetch has changed its format');\n\t\t\t\t}\n\t\t\t\tif (value.length === 0) {\n\t\t\t\t\treturn config.query?.returnNulls ? [[$asKey, null]] : []; //return nothing unles the returnNulls flag is set\n\t\t\t\t}\n\t\t\t\tif (field.contentType === 'DATE') {\n\t\t\t\t\tfieldValue = value.map((o) => {\n\t\t\t\t\t\treturn `${o.value}Z`;\n\t\t\t\t\t});\n\t\t\t\t} else if (field.contentType === 'FLEX') {\n\t\t\t\t\tfieldValue = value.map((o) => {\n\t\t\t\t\t\tif (o.type.value_type === 'datetime') {\n\t\t\t\t\t\t\treturn `${o.value}Z`;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn o.value;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t} else if (field.contentType === 'JSON') {\n\t\t\t\t\tfieldValue = value.map((o) => {\n\t\t\t\t\t\treturn o.value && JSON.parse(o.value);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tfieldValue = value.map((o) => {\n\t\t\t\t\t\treturn o.value;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn [[$asKey, fieldValue]].filter(([_, v]) => v !== undefined);\n\t\t})\n\t\t.flat();\n\n\treturn Object.fromEntries([...mainDataFields]);\n};\n\nconst parseRoleFields = (\n\troleFields: { $roleFields: any[]; $key: string; $metaData: string; $cardinality: 'MANY' | 'ONE' }[],\n\tschema: EnrichedBormSchema,\n\tconfig: BormConfig,\n) => {\n\tconst roleFieldsRes: Record<string, any> = {};\n\n\troleFields.forEach((roleField) => {\n\t\tconst { $roleFields, $metaData, $cardinality } = roleField;\n\t\tconst { as, justId, idNotIncluded, filterByUnique } = parseMetaData($metaData);\n\n\t\tif (as === null) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst items = $roleFields.map((item) => {\n\t\t\tconst { dataFields, currentSchema, linkFields, roleFields, schemaValue } = parseFields(item, schema);\n\t\t\tconst parsedDataFields = parseDataFields(dataFields, currentSchema, config);\n\n\t\t\tif (justId === 'T') {\n\t\t\t\treturn parsedDataFields.id;\n\t\t\t} else {\n\t\t\t\tconst parsedLinkFields = parseLinkFields(linkFields, schema, config);\n\t\t\t\tconst parsedRoleFields = parseRoleFields(roleFields, schema, config);\n\t\t\t\tconst resDataFields = { ...parsedDataFields };\n\t\t\t\tif (idNotIncluded === 'true') {\n\t\t\t\t\tcurrentSchema?.idFields?.forEach((field) => delete resDataFields[field]);\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\t...resDataFields,\n\t\t\t\t\t...parsedLinkFields,\n\t\t\t\t\t...parsedRoleFields,\n\t\t\t\t\t...schemaValue,\n\t\t\t\t};\n\t\t\t}\n\t\t});\n\n\t\tif (items.length > 0) {\n\t\t\troleFieldsRes[as] = $cardinality === 'MANY' && filterByUnique === 'false' ? items : items[0];\n\t\t} else if (config.query?.returnNulls) {\n\t\t\troleFieldsRes[as] = null;\n\t\t}\n\t});\n\n\treturn roleFieldsRes;\n};\n\nconst parseLinkFields = (\n\tlinkFields: { $linkFields: any[]; $key: string; $metaData: string; $cardinality: 'MANY' | 'ONE' }[],\n\tschema: EnrichedBormSchema,\n\tconfig: BormConfig,\n) => {\n\tconst linkFieldsRes: Record<string, any> = {};\n\n\tlinkFields.forEach((linkField) => {\n\t\tconst { $linkFields, $metaData, $cardinality } = linkField;\n\t\tconst { as, justId, idNotIncluded, filterByUnique } = parseMetaData($metaData);\n\n\t\tif (as === null) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst items = $linkFields.map((item) => {\n\t\t\tconst { dataFields, currentSchema, linkFields, roleFields, schemaValue } = parseFields(item, schema);\n\t\t\tconst parsedDataFields = parseDataFields(dataFields, currentSchema, config);\n\n\t\t\tif (justId === 'T') {\n\t\t\t\treturn parsedDataFields.id;\n\t\t\t} else {\n\t\t\t\tconst parsedLinkFields = parseLinkFields(linkFields, schema, config);\n\t\t\t\tconst parsedRoleFields = parseRoleFields(roleFields, schema, config);\n\t\t\t\tconst resDataFields = { ...parsedDataFields };\n\n\t\t\t\tif (idNotIncluded === 'true') {\n\t\t\t\t\tcurrentSchema.idFields?.forEach((field) => delete resDataFields[field]);\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\t...resDataFields,\n\t\t\t\t\t...parsedLinkFields,\n\t\t\t\t\t...parsedRoleFields,\n\t\t\t\t\t...schemaValue,\n\t\t\t\t};\n\t\t\t}\n\t\t});\n\n\t\t// eslint-disable-next-line no-param-reassign\n\t\tlinkFieldsRes[as] =\n\t\t\titems.length > 0\n\t\t\t\t? $cardinality === 'MANY' && filterByUnique === 'false'\n\t\t\t\t\t? items\n\t\t\t\t\t: items[0]\n\t\t\t\t: config.query?.returnNulls\n\t\t\t\t\t? null\n\t\t\t\t\t: undefined;\n\t});\n\n\treturn linkFieldsRes;\n};\n\n//todo: add this metadata as a typedb \"?\" var instead\nconst parseMetaData = (str: string) => {\n\tconst asRegex = /as:([a-zA-Z0-9_\\-·]+)/;\n\tconst justIdRegex = /justId:([a-zA-Z0-9_\\-·]+)/;\n\tconst idNotIncludedRegex = /idNotIncluded:([a-zA-Z0-9_\\-·]+)/;\n\tconst filterByUniqueRegex = /filterByUnique:([a-zA-Z0-9_\\-·]+)/;\n\n\tconst asMatch = str.match(asRegex);\n\tconst justIdMatch = str.match(justIdRegex);\n\tconst idNotIncludedMatch = str.match(idNotIncludedRegex);\n\tconst filterByUniqueMatch = str.match(filterByUniqueRegex);\n\n\treturn {\n\t\tas: asMatch ? asMatch[1] : null,\n\t\tjustId: justIdMatch ? justIdMatch[1] : null,\n\t\tidNotIncluded: idNotIncludedMatch ? idNotIncludedMatch[1] : null,\n\t\tfilterByUnique: filterByUniqueMatch ? filterByUniqueMatch[1] : null,\n\t};\n};\n\nconst parseArrayMetadata = (str: string) => {\n\ttry {\n\t\tconst convertToJson = (str: string) => {\n\t\t\t// Remove $metadata: from the string\n\t\t\tlet jsonString = str.replace('$metadata:', '');\n\n\t\t\t// Enclose keys in quotes\n\t\t\tjsonString = jsonString.replace(/([a-zA-Z0-9_\\-·]+)(?=:)/g, '\"$1\"');\n\n\t\t\t// Enclose values in quotes, handling nested object values separately\n\t\t\tjsonString = jsonString.replace(/:(\\s*)([a-zA-Z0-9_\\-·]+)/g, (match, p1, p2) => {\n\t\t\t\t// Check if the value is part of an object\n\t\t\t\tif (/^{.*}$/.test(p2)) {\n\t\t\t\t\treturn `:${p2}`;\n\t\t\t\t} else {\n\t\t\t\t\treturn `:${p1}\"${p2}\"`;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Convert array elements (non-object) to strings\n\t\t\tjsonString = jsonString.replace(/\\[([^\\]]+)\\]/g, (match, p1) => {\n\t\t\t\treturn `[${p1\n\t\t\t\t\t.split(',')\n\t\t\t\t\t.map((s: string) => {\n\t\t\t\t\t\t// Check if element is an object-like structure\n\t\t\t\t\t\tif (s.trim().startsWith('{') && s.trim().endsWith('}')) {\n\t\t\t\t\t\t\treturn s.trim();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn `\"${s.trim()}\"`;\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t.join(',')}]`;\n\t\t\t});\n\n\t\t\treturn jsonString;\n\t\t};\n\t\tconst converted = convertToJson(str);\n\n\t\tconst parsed = JSON.parse(converted);\n\t\treturn parsed;\n\t} catch (e) {\n\t\tconsole.error(e);\n\t\treturn { as: [] };\n\t}\n};\n","import { SessionType } from 'typedb-driver';\nimport type { BormConfig, DBHandles } from '../../types';\n\nexport const getSessionOrOpenNewOne = async (dbHandles: DBHandles, config: BormConfig) => {\n\tconst singleHandlerV0 = config.dbConnectors[0].id;\n\tlet session = dbHandles.typeDB?.get(singleHandlerV0)?.session;\n\tconst client = dbHandles.typeDB?.get(singleHandlerV0)?.client;\n\n\tif (!session || !session.isOpen()) {\n\t\tif (!client) {\n\t\t\tthrow new Error('Client not found');\n\t\t}\n\t\tsession = await client.session(config.dbConnectors[0].dbName, SessionType.DATA);\n\t\tdbHandles.typeDB?.set(singleHandlerV0, { client, session });\n\t}\n\n\treturn { client, session };\n};\n","import type { AggregateError } from 'radash';\nimport { parallel, tryit } from 'radash';\nimport { TransactionType, TypeDBOptions } from 'typedb-driver';\nimport { getSessionOrOpenNewOne } from '../../../adapters/typeDB/helpers';\nimport type { BormConfig, DBHandles } from '../../../types';\n\nexport const runTQLQuery = async (props: {\n\ttqlRequest: string[];\n\tdbHandles: DBHandles;\n\tconfig: BormConfig;\n}): Promise<any> => {\n\tconst { tqlRequest, dbHandles, config } = props;\n\t//TODO condition this only to have infer if there are virtual fields (without default fn)\n\tconst options = new TypeDBOptions();\n\toptions.infer = true;\n\n\tconst { session } = await getSessionOrOpenNewOne(dbHandles, config);\n\tconst transaction = await session.transaction(TransactionType.READ, options);\n\n\t//console.log('query', JSON.stringify(tqlRequest, null, 2));\n\tconst [err, resArray] = await tryit(parallel)(tqlRequest.length, tqlRequest, async (queryString) => {\n\t\tconst tqlStream = transaction.query.fetch(queryString as string);\n\t\tconst tqlRes = await tqlStream.collect();\n\t\treturn tqlRes;\n\t});\n\n\tif (err) {\n\t\tawait transaction.rollback();\n\t\tconst error = err as AggregateError;\n\t\tthrow new Error(`Error running TQL query: ${error.errors}`);\n\t}\n\tawait transaction.close();\n\n\t// todo: type the rawTqlRes\n\treturn resArray;\n};\n","import { assertDefined } from '../../../helpers';\nimport type { BormConfig, DBHandles, EnrichedBormSchema, EnrichedBQLQuery, RawBQLQuery } from '../../../types';\nimport { createMachine, interpret, invoke, reduce, state, transition } from '../../robot3';\nimport { buildTQLQuery } from './build';\nimport { parseTQLQuery } from './parse';\nimport { runTQLQuery } from './run';\n\nexport type TypeDbMachineContext = {\n\tbql: {\n\t\traw: RawBQLQuery[];\n\t\tqueries: EnrichedBQLQuery[];\n\t\tres?: any[];\n\t};\n\ttql: {\n\t\tqueries?: string[];\n\t\tres?: any[];\n\t};\n\tschema: EnrichedBormSchema;\n\tconfig: BormConfig;\n\thandles: DBHandles;\n\terror?: string | null;\n};\n\nconst updateBqlRes = (ctx: TypeDbMachineContext, event: any): TypeDbMachineContext => {\n\tif (!event.data) {\n\t\treturn ctx;\n\t}\n\treturn {\n\t\t...ctx,\n\t\tbql: { ...ctx.bql, res: event.data },\n\t};\n};\n\nconst updateTqlReq = (ctx: TypeDbMachineContext, event: any): TypeDbMachineContext => {\n\tif (!event.data) {\n\t\treturn ctx;\n\t}\n\treturn {\n\t\t...ctx,\n\t\ttql: { ...ctx.tql, queries: event.data },\n\t};\n};\n\nconst updateTqlRes = (ctx: TypeDbMachineContext, event: any): TypeDbMachineContext => {\n\tif (!event.data) {\n\t\treturn ctx;\n\t}\n\treturn {\n\t\t...ctx,\n\t\ttql: { ...ctx.tql, res: event.data },\n\t};\n};\n\nconst errorTransition = transition(\n\t'error',\n\t'error',\n\treduce((ctx: TypeDbMachineContext, event: any): TypeDbMachineContext => {\n\t\treturn {\n\t\t\t...ctx,\n\t\t\terror: event.error,\n\t\t};\n\t}),\n);\n\nexport const typeDbQueryMachine = createMachine(\n\t'build',\n\t{\n\t\tbuild: invoke(\n\t\t\tasync (ctx: TypeDbMachineContext) => buildTQLQuery({ queries: ctx.bql.queries, schema: ctx.schema }),\n\t\t\ttransition('done', 'run', reduce(updateTqlReq)),\n\t\t\terrorTransition,\n\t\t),\n\t\trun: invoke(\n\t\t\tasync (ctx: TypeDbMachineContext) => {\n\t\t\t\treturn runTQLQuery({\n\t\t\t\t\tdbHandles: ctx.handles,\n\t\t\t\t\ttqlRequest: assertDefined(ctx.tql.queries),\n\t\t\t\t\tconfig: ctx.config,\n\t\t\t\t});\n\t\t\t},\n\t\t\ttransition('done', 'parse', reduce(updateTqlRes)),\n\t\t\terrorTransition,\n\t\t),\n\t\tparse: invoke(\n\t\t\tasync (ctx: TypeDbMachineContext) =>\n\t\t\t\tparseTQLQuery({\n\t\t\t\t\trawBqlRequest: ctx.bql.raw,\n\t\t\t\t\tenrichedBqlQuery: ctx.bql.queries,\n\t\t\t\t\tschema: ctx.schema,\n\t\t\t\t\tconfig: ctx.config,\n\t\t\t\t\trawTqlRes: assertDefined(ctx.tql.res),\n\t\t\t\t}),\n\t\t\ttransition('done', 'success', reduce(updateBqlRes)),\n\t\t\terrorTransition,\n\t\t),\n\t\tsuccess: state(),\n\t\terror: state(),\n\t},\n\t(ctx: TypeDbMachineContext) => ctx,\n);\n\nconst awaitQueryMachine = async (context: TypeDbMachineContext) => {\n\treturn new Promise<any[]>((resolve, reject) => {\n\t\tinterpret(\n\t\t\ttypeDbQueryMachine,\n\t\t\t(service) => {\n\t\t\t\tif (service.machine.state.name === 'success') {\n\t\t\t\t\t//@ts-expect-error = todo\n\t\t\t\t\tresolve(service.context.bql.res);\n\t\t\t\t}\n\t\t\t\tif (service.machine.state.name === 'error') {\n\t\t\t\t\treject(service.context.error);\n\t\t\t\t}\n\t\t\t},\n\t\t\tcontext,\n\t\t);\n\t});\n};\n\nexport const runTypeDbQueryMachine = async (\n\tbql: RawBQLQuery[],\n\tenrichedBql: EnrichedBQLQuery[],\n\tschema: EnrichedBormSchema,\n\tconfig: BormConfig,\n\thandles: DBHandles,\n) => {\n\treturn awaitQueryMachine({\n\t\tbql: {\n\t\t\traw: bql,\n\t\t\tqueries: enrichedBql,\n\t\t},\n\t\ttql: {},\n\t\tschema: schema,\n\t\tconfig: config,\n\t\thandles: handles,\n\t\terror: null,\n\t});\n};\n","import type { TypeDBDriver } from 'typedb-driver';\nimport { assertDefined, getSchemaByThing } from '../../helpers';\nimport type { BormConfig, DBHandles, EnrichedBormSchema, EnrichedBQLQuery, RawBQLQuery } from '../../types';\nimport { createMachine, interpret, invoke, reduce, state, transition } from '../robot3';\nimport { cleanQueryRes } from './bql/clean';\nimport { enrichBQLQuery } from './bql/enrich';\nimport { postHooks } from './postHook';\nimport { runSurrealDbQueryMachine } from './surql/machine';\nimport { runTypeDbQueryMachine } from './tql/machine';\nimport type { SimpleSurrealClient } from '../../adapters/surrealDB/client';\nimport { VERSION } from '../../version';\nimport { logDebug } from '../../logger';\n\ntype MachineContext = {\n\tbql: {\n\t\traw: RawBQLQuery[];\n\t\tqueries?: EnrichedBQLQuery[];\n\t\tres?: any[]; // TODO\n\t};\n\tschema: EnrichedBormSchema;\n\tconfig: BormConfig;\n\thandles: DBHandles;\n\terror: string | null;\n};\n\nconst updateBqlReq = (ctx: MachineContext, event: any) => {\n\tif (!event.data) {\n\t\treturn ctx;\n\t}\n\treturn {\n\t\t...ctx,\n\t\tbql: { ...ctx.bql, queries: event.data },\n\t};\n};\n\nconst updateBqlRes = (ctx: MachineContext, event: any) => {\n\tif (!event.data) {\n\t\treturn ctx;\n\t}\n\treturn {\n\t\t...ctx,\n\t\tbql: { ...ctx.bql, res: event.data },\n\t};\n};\n\nconst errorTransition = transition(\n\t'error',\n\t'error',\n\treduce((ctx: MachineContext, event: any) => {\n\t\treturn {\n\t\t\t...ctx,\n\t\t\terror: event.error,\n\t\t};\n\t}),\n);\n\ntype TypeDBAdapter = {\n\tdb: 'typeDB';\n\tclient: TypeDBDriver;\n\trawBql: RawBQLQuery[];\n\tbqlQueries: EnrichedBQLQuery[];\n\tindices: number[];\n};\n\ntype SurrealDBAdapter = {\n\tdb: 'surrealDB';\n\tclient: SimpleSurrealClient;\n\trawBql: RawBQLQuery[];\n\tbqlQueries: EnrichedBQLQuery[];\n\tindices: number[];\n};\n\ntype Adapter = TypeDBAdapter | SurrealDBAdapter;\n\nexport const queryMachine = createMachine(\n\t'enrich',\n\t{\n\t\tenrich: invoke(\n\t\t\tasync (ctx: MachineContext) => {\n\t\t\t\tlogDebug(`originalBQLQuery[${VERSION}]`, JSON.stringify(ctx.bql.raw));\n\t\t\t\treturn enrichBQLQuery(ctx.bql.raw, ctx.schema);\n\t\t\t},\n\t\t\ttransition('done', 'adapter', reduce(updateBqlReq)),\n\t\t\terrorTransition,\n\t\t),\n\t\tadapter: invoke(\n\t\t\tasync (ctx: MachineContext) => {\n\t\t\t\tconst adapters: Record<string, Adapter> = {};\n\n\t\t\t\tctx.bql.queries?.forEach((q, i) => {\n\t\t\t\t\tconst raw = ctx.bql.raw[i];\n\t\t\t\t\tconst thing = getSchemaByThing(ctx.schema, q.$thing);\n\t\t\t\t\tconst { id } = thing.defaultDBConnector;\n\n\t\t\t\t\tif (thing.db === 'typeDB') {\n\t\t\t\t\t\tif (!adapters[id]) {\n\t\t\t\t\t\t\tconst client = ctx.handles.typeDB?.get(id)?.client;\n\t\t\t\t\t\t\tif (!client) {\n\t\t\t\t\t\t\t\tthrow new Error(`TypeDB client with id \"${thing.defaultDBConnector.id}\" does not exist`);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tadapters[id] = {\n\t\t\t\t\t\t\t\tdb: 'typeDB',\n\t\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\trawBql: [],\n\t\t\t\t\t\t\t\tbqlQueries: [],\n\t\t\t\t\t\t\t\tindices: [],\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (thing.db === 'surrealDB') {\n\t\t\t\t\t\tif (!adapters[id]) {\n\t\t\t\t\t\t\tconst client = ctx.handles.surrealDB?.get(id)?.client;\n\t\t\t\t\t\t\tif (!client) {\n\t\t\t\t\t\t\t\tthrow new Error(`SurrealDB client with id \"${thing.defaultDBConnector.id}\" does not exist`);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tadapters[id] = {\n\t\t\t\t\t\t\t\tdb: 'surrealDB',\n\t\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\trawBql: [],\n\t\t\t\t\t\t\t\tbqlQueries: [],\n\t\t\t\t\t\t\t\tindices: [],\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow new Error(`Unsupported DB \"${thing.db}\"`);\n\t\t\t\t\t}\n\t\t\t\t\tconst adapter = adapters[id];\n\t\t\t\t\tadapter.rawBql.push(raw);\n\t\t\t\t\tadapter.bqlQueries.push(q);\n\t\t\t\t\tadapter.indices.push(i);\n\t\t\t\t});\n\t\t\t\tconst adapterList = Object.values(adapters);\n\t\t\t\tconst proms = adapterList.map((a) => {\n\t\t\t\t\tif (a.db === 'typeDB') {\n\t\t\t\t\t\t// TODO: Replace DBHandles with TypeDBAdapter\n\t\t\t\t\t\treturn runTypeDbQueryMachine(a.rawBql, a.bqlQueries, ctx.schema, ctx.config, ctx.handles);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (a.db === 'surrealDB') {\n\t\t\t\t\t\treturn runSurrealDbQueryMachine(a.bqlQueries, ctx.schema, ctx.config, a.client);\n\t\t\t\t\t}\n\n\t\t\t\t\tthrow new Error(`Unsupported DB \"${JSON.stringify(a, null, 2)}\"`);\n\t\t\t\t});\n\t\t\t\tconst results = await Promise.all(proms);\n\t\t\t\tconst orderedResults = adapterList.flatMap((a, i) => {\n\t\t\t\t\tconst result = results[i];\n\t\t\t\t\treturn a.indices.map((index, j) => ({ index, result: result[j] }));\n\t\t\t\t});\n\t\t\t\torderedResults.sort((a, b) => (a.index < b.index ? -1 : a.index > b.index ? 1 : 0));\n\t\t\t\tconst result = orderedResults.map(({ result }) => result);\n\t\t\t\treturn result;\n\t\t\t},\n\t\t\ttransition('done', 'postHooks', reduce(updateBqlRes)),\n\t\t\terrorTransition,\n\t\t),\n\t\tpostHooks: invoke(\n\t\t\tasync (ctx: MachineContext) => postHooks(ctx.schema, assertDefined(ctx.bql.queries), assertDefined(ctx.bql.res)),\n\t\t\ttransition('done', 'clean', reduce(updateBqlRes)),\n\t\t\terrorTransition,\n\t\t),\n\t\tclean: invoke(\n\t\t\tasync (ctx: MachineContext) => cleanQueryRes(ctx.config, assertDefined(ctx.bql.res)),\n\t\t\ttransition('done', 'success', reduce(updateBqlRes)),\n\t\t\terrorTransition,\n\t\t),\n\t\tsuccess: state(),\n\t\terror: state(),\n\t},\n\t(ctx: MachineContext) => ctx,\n);\n\nexport const awaitQueryMachine = async (context: MachineContext) => {\n\treturn new Promise<MachineContext>((resolve, reject) => {\n\t\tinterpret(\n\t\t\tqueryMachine,\n\t\t\t(service) => {\n\t\t\t\tif (service.machine.state.name === 'success') {\n\t\t\t\t\tresolve(service.context);\n\t\t\t\t}\n\t\t\t\tif (service.machine.state.name === 'error') {\n\t\t\t\t\treject(service.context);\n\t\t\t\t}\n\t\t\t},\n\t\t\tcontext,\n\t\t);\n\t});\n};\n\nexport const runQueryMachine = async (\n\tbql: RawBQLQuery[],\n\tschema: EnrichedBormSchema,\n\tconfig: BormConfig,\n\thandles: DBHandles,\n) => {\n\treturn awaitQueryMachine({\n\t\tbql: {\n\t\t\traw: bql,\n\t\t},\n\t\tschema: schema,\n\t\tconfig: config,\n\t\thandles: handles,\n\t\terror: null,\n\t});\n};\n","import { getSchemaByThing } from '../../../helpers';\nimport type {\n\tBQLMutationBlock,\n\tEnrichedBQLMutationBlock,\n\tEnrichedBormEntity,\n\tEnrichedBormRelation,\n\tEnrichedBormSchema,\n} from '../../../types';\nimport { produce } from 'immer';\n\n/**\n * Convert JSON attributes into strings.\n */\nexport const stringify = (\n\tblocks: BQLMutationBlock | BQLMutationBlock[],\n\tschema: EnrichedBormSchema,\n): EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[] => {\n\tconst result = produce(blocks, (draft) => tObject(schema, draft));\n\treturn result as EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[];\n};\n\n/**\n * Specify $thing if the role (target: relation) or the opposite role (target: role)\n * is played by one thing, otherwise $thing, $relation, or $entity must be defined\n * in the mutation object.\n */\nconst tObject = (\n\tschema: EnrichedBormSchema,\n\ttree: Record<string, any> | string | (Record<string, any> | string)[],\n\t$thing?: string,\n) => {\n\tif (typeof tree === 'string') {\n\t\t// It's an id.\n\t\treturn;\n\t}\n\tif (Array.isArray(tree)) {\n\t\ttree.forEach((i) => tObject(schema, i, $thing));\n\t\treturn;\n\t}\n\tconst thing = getSchemaByThing(schema, $thing || tree.$entity || tree.$relation || tree.$thing);\n\tObject.entries(tree).forEach(([k]) => {\n\t\tif (k.startsWith('$') || k.startsWith('%')) {\n\t\t\treturn;\n\t\t}\n\t\ttField(schema, tree, k, thing);\n\t});\n};\n\nconst tField = (\n\tschema: EnrichedBormSchema,\n\ttree: Record<string, any>,\n\tkey: string,\n\tthing: EnrichedBormEntity | EnrichedBormRelation,\n) => {\n\tconst value = tree[key];\n\tif (!value) {\n\t\t// Not a JSON or a thing.\n\t\treturn;\n\t}\n\tconst dataField = thing.dataFields?.find((f) => f.path === key);\n\tif (dataField) {\n\t\tif (dataField.contentType === 'JSON') {\n\t\t\tif (value !== null && value !== undefined) {\n\t\t\t\t// eslint-disable-next-line no-param-reassign\n\t\t\t\ttree[key] = JSON.stringify(value);\n\t\t\t}\n\t\t}\n\t\treturn;\n\t}\n\tconst linkField = thing.linkFields?.find((f) => f.path === key);\n\tif (linkField) {\n\t\tconst $thing = linkField.oppositeLinkFieldsPlayedBy[0]?.thing;\n\t\ttObject(schema, value, $thing);\n\t\treturn;\n\t}\n\n\tconst refField = thing.refFields[key];\n\tif (refField) {\n\t\t//We can't know its thing beforehand\n\t\treturn;\n\t}\n\n\tif (thing.thingType === 'relation') {\n\t\tconst role = thing.roles[key];\n\t\t// Assume a role can be played by only one thing.\n\t\tif (!role) {\n\t\t\tthrow new Error(`[Schema] Role ${key} in ${thing.name} is not defined`);\n\t\t}\n\t\tconst [oppositeThing] = role.playedBy || [];\n\t\tif (!oppositeThing) {\n\t\t\tthrow new Error(`Role ${role.path} in ${thing} is not played by anything`);\n\t\t}\n\t\ttObject(schema, value, oppositeThing.thing);\n\t}\n};\n","import { isObject } from 'radash';\nimport type {\n\tBQLResponse,\n\tBormConfig,\n\tDBHandles,\n\tEnrichedBQLMutationBlock,\n\tEnrichedBormEntity,\n\tEnrichedBormRelation,\n\tEnrichedBormSchema,\n\tEnrichedDataField,\n\tEnrichedLinkField,\n\tEnrichedRoleField,\n\tFilledBQLMutationBlock,\n} from '../../../../types';\nimport { DBNode } from '../../../../types/symbols';\nimport { runQueryMachine } from '../../../query/queryMachine';\nimport { getSchemaByThing } from '../../../../helpers';\n\nexport const preHookDependencies = async (\n\tblocks: EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[],\n\tschema: EnrichedBormSchema,\n\tconfig: BormConfig,\n\tdbHandles: DBHandles,\n) => {\n\tconst mutations = Array.isArray(blocks) ? blocks : [blocks];\n\tconst transformationPreQueryReq = mutations.map((m) => mutationToQuery(m, true));\n\tconst res = await runQueryMachine(\n\t\t// @ts-expect-error todo\n\t\ttransformationPreQueryReq,\n\t\tschema,\n\t\tconfig,\n\t\tdbHandles,\n\t);\n\tconst transformationPreQueryRes = res.bql.res as BQLResponse[];\n\treturn mutations.map((mut, i) => {\n\t\tconst thing = getSchemaByThing(schema, mut.$thing);\n\t\treturn setDbNode({\n\t\t\tmut: mut as Mutation,\n\t\t\tnode: transformationPreQueryRes[i] as DbValue,\n\t\t\tschema,\n\t\t\tthing,\n\t\t});\n\t});\n};\n\nconst FORBIDDEN_ROOT_QUERY_PROP = new Set(['$op', '$bzId', '$parentKey']);\nconst FORBIDDEN_SUB_QUERY_PROP = new Set(['$relation', '$entity', '$id', ...FORBIDDEN_ROOT_QUERY_PROP]);\n\ntype FieldQuery = string | { $path: string; $fields?: FieldQuery[] };\n\nconst mutationToQuery = (block: FilledBQLMutationBlock, root: boolean) => {\n\tconst $fields: Record<string, FieldQuery> = {};\n\tblock.$fields?.forEach((f: any) => {\n\t\tif (typeof f === 'string') {\n\t\t\t$fields[f] = f;\n\t\t} else {\n\t\t\t$fields[f.$path] = f;\n\t\t}\n\t});\n\tconst filteredBlock: { $fields?: FieldQuery[]; [k: `$${string}`]: any } = {};\n\n\tfor (const k in block) {\n\t\tif (FORBIDDEN_ROOT_QUERY_PROP.has(k)) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (FORBIDDEN_SUB_QUERY_PROP.has(k) && !root) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst v = block[k];\n\t\tif (k.startsWith('$')) {\n\t\t\tfilteredBlock[k as `$${string}`] = v;\n\t\t} else if (Array.isArray(v)) {\n\t\t\t// NOTE: If a link/role field mutation is an array, we only look at the first mutation block.\n\t\t\t// Each mutation block may have totally different structures.\n\t\t\tif (v[0] && typeof v[0] === 'object') {\n\t\t\t\t$fields[k] = {\n\t\t\t\t\t$path: k,\n\t\t\t\t\t...mutationToQuery(v[0], false),\n\t\t\t\t};\n\t\t\t}\n\t\t} else if (isObject(v)) {\n\t\t\t$fields[k] = {\n\t\t\t\t$path: k,\n\t\t\t\t...mutationToQuery(v as any, false),\n\t\t\t};\n\t\t}\n\t}\n\n\tfilteredBlock.$fields = Object.values($fields);\n\n\treturn filteredBlock;\n};\n\ntype Mutation = {\n\t$id: string;\n\t$fields?: FieldQuery[];\n} & {\n\t[k: string]: string | number | null | Mutation | Mutation[];\n};\n\ntype MutationWithDBNode = {\n\t$id: string;\n\t[DBNode]?: DbNode;\n\t[k: string]: string | number | null | MutationWithDBNode | MutationWithDBNode[];\n};\n\nconst setDbNode = (props: {\n\tmut: Mutation | Mutation[];\n\tnode: DbValue | DbValue[];\n\tschema: EnrichedBormSchema;\n\tthing: EnrichedBormEntity | EnrichedBormRelation;\n}) => {\n\tconst { mut, node, schema, thing } = props;\n\tconst fieldMap = getFieldMap(thing);\n\tconst subNodeMap = getNodeMap(node);\n\tif (Array.isArray(mut)) {\n\t\treturn mut.map((subMut) => {\n\t\t\tconst subNode = subNodeMap[subMut.$id];\n\t\t\tif (!subNode) {\n\t\t\t\treturn subMut;\n\t\t\t}\n\t\t\treturn setDbNodeSingle({\n\t\t\t\tmut: subMut,\n\t\t\t\tnode: subNode,\n\t\t\t\tschema,\n\t\t\t\tthing,\n\t\t\t\t...fieldMap,\n\t\t\t});\n\t\t});\n\t}\n\tconst subNode = subNodeMap[mut.$id];\n\treturn setDbNodeSingle({\n\t\tmut,\n\t\tnode: subNode,\n\t\tschema,\n\t\tthing,\n\t\t...fieldMap,\n\t});\n};\n\nconst setDbNodeSingle = (props: {\n\tmut: Mutation;\n\tnode?: DbNode;\n\tschema: EnrichedBormSchema;\n\tthing: EnrichedBormEntity | EnrichedBormRelation;\n\tdataFieldMap: Record<string, EnrichedDataField>;\n\tlinkFieldMap: Record<string, EnrichedLinkField>;\n\troleFieldMap: Record<string, EnrichedRoleField>;\n}) => {\n\tconst { mut, node, schema, thing, dataFieldMap, linkFieldMap, roleFieldMap } = props;\n\tconst { $fields: _, ..._mut } = mut;\n\tif (!node) {\n\t\treturn _mut;\n\t}\n\tconst dbNode = getDbNode({\n\t\t$fields: mut.$fields,\n\t\tnode,\n\t\tschema,\n\t\tthing,\n\t\tdataFieldMap,\n\t\tlinkFieldMap,\n\t\troleFieldMap,\n\t});\n\tconst newMut: MutationWithDBNode = { ..._mut, [DBNode]: dbNode };\n\n\t// Update sub-mutation that has pre-queried db node.\n\tfor (const key in mut) {\n\t\tif (key.startsWith('$')) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst value = mut[key];\n\t\tconst df = dataFieldMap[key];\n\t\tif (df || !value || typeof value !== 'object') {\n\t\t\tnewMut[key] = value;\n\t\t\tcontinue;\n\t\t}\n\t\tconst $thing = linkFieldMap[key]?.oppositeLinkFieldsPlayedBy?.[0]?.thing || roleFieldMap[key]?.playedBy?.[0]?.thing;\n\t\tif (!$thing) {\n\t\t\tthrow new Error(`\"${thing.name}\" does not have field \"${key}\"`);\n\t\t}\n\t\tconst subThing = getSchemaByThing(schema, $thing);\n\t\tnewMut[key] = setDbNode({\n\t\t\tmut: value,\n\t\t\tschema,\n\t\t\tnode: node[key],\n\t\t\tthing: subThing,\n\t\t});\n\t}\n\n\treturn newMut;\n};\n\ntype DbValue = string | number | boolean | null | DbNode;\n\ntype DbNode = {\n\t$id: string;\n\t[k: string]: DbValue | DbValue[];\n};\n\n/**\n * Extract the response of field queries from a superset query response.\n */\nconst getDbNode = (props: {\n\t$fields?: FieldQuery[];\n\tnode: DbNode;\n\tschema: EnrichedBormSchema;\n\tthing: EnrichedBormEntity | EnrichedBormRelation;\n\tdataFieldMap: Record<string, EnrichedDataField>;\n\tlinkFieldMap: Record<string, EnrichedLinkField>;\n\troleFieldMap: Record<string, EnrichedRoleField>;\n}) => {\n\tconst { $fields, node, schema, thing, dataFieldMap, linkFieldMap, roleFieldMap } = props;\n\tconst fields = $fields ? $fields : getAllFields(thing);\n\tconst newNode: DbNode = { $id: node.$id };\n\n\tfields.forEach((f) => {\n\t\tconst isObj = typeof f !== 'string';\n\t\tconst key = isObj ? f.$path : f;\n\t\tconst value = node[key];\n\t\tconst df = dataFieldMap[key];\n\t\tif (df) {\n\t\t\tnewNode[key] = value;\n\t\t\treturn;\n\t\t}\n\t\tconst $thing = linkFieldMap[key]?.oppositeLinkFieldsPlayedBy?.[0]?.thing || roleFieldMap[key]?.playedBy?.[0]?.thing;\n\t\tif (!$thing) {\n\t\t\tthrow new Error(`\"${thing.name}\" does not have field \"${key}\"`);\n\t\t}\n\t\tif (!isObj) {\n\t\t\tif (value) {\n\t\t\t\tnewNode[key] = Array.isArray(value) ? value.map(getIdFromDbValue) : getIdFromDbValue(value);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tconst subThing = getSchemaByThing(schema, $thing);\n\t\tconst fieldMap = getFieldMap(subThing);\n\t\tnewNode[key] = Array.isArray(value)\n\t\t\t? value.map((v) => getDbNodeFromDbValue({ ...fieldMap, $fields: f.$fields, value: v, schema, thing: subThing }))\n\t\t\t: getDbNodeFromDbValue({ ...fieldMap, $fields: f.$fields, value, schema, thing: subThing });\n\t});\n\n\treturn newNode;\n};\n\n/**\n * Get data field, link field, and role paths of a thing.\n */\nconst getAllFields = (thing: EnrichedBormEntity | EnrichedBormRelation): string[] => {\n\tconst fields: string[] = [];\n\tthing.dataFields?.forEach((f) => {\n\t\tfields.push(f.path);\n\t});\n\tthing.linkFields?.forEach((f) => {\n\t\tfields.push(f.path);\n\t});\n\tif (thing.thingType === 'relation') {\n\t\tfields.push(...Object.keys(thing.roles));\n\t}\n\treturn fields;\n};\n\n/**\n * Throw an error if it's not an id(s) and doesn't contain prop $id.\n */\nconst getIdFromDbValue = (value: DbValue) => {\n\tif (typeof value === 'string') {\n\t\treturn value;\n\t}\n\tif (!value || typeof value !== 'object') {\n\t\tthrow new Error(`\"${JSON.stringify(value)}\" is neither an id nor an object with prop \"$id\"`);\n\t}\n\tif (typeof value.$id !== 'string') {\n\t\tthrow new Error(`\"${JSON.stringify(value)}\" is does not have prop \"$id\"`);\n\t}\n\treturn value.$id;\n};\n\n/**\n * Throw an error if it's not a db node.\n */\nconst getDbNodeFromDbValue = (props: {\n\t$fields?: FieldQuery[];\n\tvalue: DbValue;\n\tschema: EnrichedBormSchema;\n\tthing: EnrichedBormEntity | EnrichedBormRelation;\n\tdataFieldMap: Record<string, EnrichedDataField>;\n\tlinkFieldMap: Record<string, EnrichedLinkField>;\n\troleFieldMap: Record<string, EnrichedRoleField>;\n}) => {\n\tconst { value } = props;\n\tif (!value || typeof value !== 'object' || !value.$id) {\n\t\tthrow new Error(`\"${JSON.stringify(props)}\" is neither an id nor an object with prop \"$id\"`);\n\t}\n\treturn getDbNode({ ...props, node: value });\n};\n\nconst getFieldMap = (thing: EnrichedBormEntity | EnrichedBormRelation) => {\n\tconst dataFieldMap = Object.fromEntries(thing.dataFields?.map((f) => [f.path, f]) || []);\n\tconst linkFieldMap = Object.fromEntries(thing.linkFields?.map((f) => [f.path, f]) || []);\n\tconst roleFieldMap = thing.thingType === 'relation' ? thing.roles || {} : {};\n\treturn { dataFieldMap, linkFieldMap, roleFieldMap };\n};\n\n/**\n * Non-DbNode(s) are ignored.\n */\nconst getNodeMap = (value: DbValue | DbValue[]) => {\n\tif (!Array.isArray(value)) {\n\t\tif (value && typeof value === 'object' && value.$id) {\n\t\t\treturn { [value.$id]: value };\n\t\t}\n\t\treturn {};\n\t}\n\n\tconst map: Record<string, DbNode> = {};\n\n\tvalue.forEach((v) => {\n\t\tif (!v || typeof v !== 'object' || !v.$id) {\n\t\t\treturn;\n\t\t}\n\t\tmap[v.$id] = v;\n\t});\n\n\treturn map;\n};\n","import { isDate } from 'radash';\n\nexport const parseFlexValTypeDB = (v: unknown) => {\n\tif (isDate(v)) {\n\t\treturn { type: 'datetime', value: v.toISOString().replace('Z', '') };\n\t}\n\tif (typeof v === 'string') {\n\t\treturn { type: 'string', value: `\"${v}\"` };\n\t}\n\tif (typeof v === 'number') {\n\t\tif (v % 1 !== 0) {\n\t\t\treturn { type: 'double', value: v };\n\t\t}\n\t\treturn { type: 'long', value: v };\n\t}\n\tif (typeof v === 'boolean') {\n\t\treturn { type: 'boolean', value: v };\n\t}\n\tthrow new Error(`Unsupported type ${typeof v}`);\n};\n","import { isArray, listify, mapEntries, shake } from 'radash';\n\nimport { genId, getCurrentSchema, isBQLBlock } from '../../../helpers';\nimport type { EnrichedBormSchema, EnrichedBQLMutationBlock } from '../../../types';\nimport { EdgeType } from '../../../types/symbols';\nimport { parseFlexValTypeDB } from '../../../adapters/typeDB/parseFlexVal';\n\nexport const buildTQLMutation = async (things: any[], edges: any[], schema: EnrichedBormSchema) => {\n\tif ((!things && !edges) || (!things.length && !edges.length)) {\n\t\tthrow new Error('TQL request error, no things');\n\t}\n\n\tif (!schema) {\n\t\tthrow new Error('No schema provided');\n\t}\n\n\t// todo: Split attributes and edges\n\tconst nodeToTypeQL = (\n\t\tnode: EnrichedBQLMutationBlock,\n\t): {\n\t\tpreDeletionBatch?: any[];\n\t\tdeletionMatch?: string;\n\t\tinsertionMatch?: string;\n\t\tdeletion?: string;\n\t\tinsertion?: string;\n\t\top: string;\n\t} => {\n\t\tconst op = node.$op as string;\n\t\tconst bzId = `$${node.$bzId}`;\n\t\tconst currentSchema = getCurrentSchema(schema, node);\n\t\tconst { idFields, defaultDBConnector } = currentSchema;\n\n\t\tconst thingDbPath = defaultDBConnector?.path || node.$thing;\n\n\t\tconst idValue = node.$id;\n\n\t\t// todo: composite ids\n\t\tconst idField = idFields?.[0];\n\n\t\t//@ts-expect-error - TODO\n\t\tconst attributes = listify(node, (k, v) => {\n\t\t\t// @ts-expect-error - TODO description\n\t\t\tif (k.startsWith('$') || k.startsWith('%') || k === idField || v === undefined || v === null) {\n\t\t\t\treturn '';\n\t\t\t}\n\t\t\t// if (k.startsWith('$') || !v) return '';\n\t\t\tconst currentDataField = currentSchema.dataFields?.find((x) => x.path === k);\n\t\t\tconst fieldDbPath = currentDataField?.path;\n\n\t\t\tif (!fieldDbPath) {\n\t\t\t\t// throw new Error('noFieldDbPath');\n\t\t\t\treturn '';\n\t\t\t}\n\t\t\tconst dbField = currentDataField.dbPath;\n\n\t\t\tif (['TEXT', 'ID', 'EMAIL', 'JSON'].includes(currentDataField.contentType)) {\n\t\t\t\treturn `has ${dbField} '${v}'`;\n\t\t\t}\n\t\t\tif (['NUMBER', 'BOOLEAN'].includes(currentDataField.contentType)) {\n\t\t\t\treturn `has ${dbField} ${v}`;\n\t\t\t}\n\t\t\tif (currentDataField.contentType === 'DATE') {\n\t\t\t\tif (Number.isNaN(v.valueOf())) {\n\t\t\t\t\tthrow new Error('Invalid format, Nan Date');\n\t\t\t\t}\n\t\t\t\tif (v instanceof Date) {\n\t\t\t\t\treturn `has ${dbField} ${v.toISOString().replace('Z', '')}`;\n\t\t\t\t}\n\t\t\t\treturn `has ${dbField} ${new Date(v).toISOString().replace('Z', '')}`;\n\t\t\t}\n\t\t\tif (currentDataField.contentType === 'FLEX') {\n\t\t\t\t//ex: $color isa Color, has id 'testi', has Color·freeForAll $tempId; $tempId \"number\" isa Color·freeForAll, has longVal 7;\n\t\t\t\tconst tempId = `bza${genId()}`;\n\n\t\t\t\tconst parsedVal = isArray(v) ? v.map((v) => parseFlexValTypeDB(v)) : parseFlexValTypeDB(v);\n\t\t\t\tif (Array.isArray(parsedVal)) {\n\t\t\t\t\tthrow new Error('Array in FLEX fields not supported yet');\n\t\t\t\t}\n\t\t\t\treturn `has ${dbField} $${tempId}; $${tempId} '${tempId}' isa ${dbField}, has ${parsedVal.type}Attribute ${parsedVal.value}`;\n\t\t\t}\n\t\t\tthrow new Error(`Unsupported contentType ${currentDataField.contentType}`);\n\t\t}).filter((x) => x);\n\n\t\tconst attributesVar = `${bzId}-atts`;\n\n\t\t//@ts-expect-error - TODO\n\t\tconst matchAttributes = listify(node, (k) => {\n\t\t\t// @ts-expect-error - TODO description\n\t\t\tif (k.startsWith('$') || k.startsWith('%') || k === idField) {\n\t\t\t\treturn '';\n\t\t\t}\n\t\t\t// if (k.startsWith('$') || !v) return '';\n\t\t\tconst currentDataField = currentSchema.dataFields?.find((x) => x.path === k);\n\t\t\tconst fieldDbPath = currentDataField?.path;\n\n\t\t\tif (!fieldDbPath) {\n\t\t\t\t// throw new Error('noFieldDbPath');\n\t\t\t\treturn '';\n\t\t\t}\n\t\t\tconst dbField = currentDataField.dbPath;\n\n\t\t\treturn `{${attributesVar} isa ${dbField};}`;\n\t\t}).filter((x) => x);\n\n\t\tconst idValueTQL = isArray(idValue) ? `like '${idValue.join('|')}'` : `'${idValue}'`;\n\t\tconst idAttributes = idValue // it must have id values, and they must be realDBIds\n\t\t\t? // if it is a relation, add only the id fields in the lines where we add the roles also so it does not get defined twice\n\t\t\t\t[`has ${idField} ${idValueTQL}`]\n\t\t\t: [];\n\n\t\tconst allAttributes = [...idAttributes, ...attributes].filter((x) => x).join(',');\n\n\t\tconst getDeletionMatchInNodes = () => {\n\t\t\t// if (node.$tempId) return ''; /// commented because we need tempIds to work when replacing a unlink/link all operation\n\t\t\t// todo: ensure parents belong to grandparents. [https://github.com/Blitzapps/blitz/issues/9]\n\t\t\tif (op === 'delete' || op === 'unlink' || op === 'match') {\n\t\t\t\treturn `${bzId} isa ${[thingDbPath, ...idAttributes].filter((x) => x).join(',')};`;\n\t\t\t}\n\t\t\tif (op === 'update') {\n\t\t\t\tif (!matchAttributes.length) {\n\t\t\t\t\tthrow new Error('update without attributes');\n\t\t\t\t}\n\t\t\t\treturn `${bzId} isa ${[thingDbPath, ...idAttributes].filter((x) => x).join(',')}, has ${attributesVar};\n ${matchAttributes.join(' or ')};`;\n\t\t\t}\n\t\t\treturn '';\n\t\t};\n\n\t\tconst getInsertionMatchInNodes = () => {\n\t\t\t// todo: ensure parents belong to grandparents. [https://github.com/Blitzapps/blitz/issues/9]\n\t\t\t// if (node.$tempId) return ''; /// same as getDeletionMatch\n\t\t\tif (op === 'update' || op === 'link' || op === 'match') {\n\t\t\t\treturn `${bzId} isa ${[thingDbPath, ...idAttributes].filter((x) => x).join(',')};`;\n\t\t\t}\n\t\t\treturn '';\n\t\t};\n\n\t\tif (isBQLBlock(node)) {\n\t\t\treturn {\n\t\t\t\top,\n\t\t\t\tdeletionMatch: getDeletionMatchInNodes(),\n\t\t\t\tinsertionMatch: getInsertionMatchInNodes(),\n\t\t\t\tinsertion:\n\t\t\t\t\top === 'create'\n\t\t\t\t\t\t? `${bzId} isa ${[thingDbPath, allAttributes].filter((x) => x).join(',')};`\n\t\t\t\t\t\t: op === 'update' && attributes.length\n\t\t\t\t\t\t\t? `${bzId} ${attributes.join(',')};`\n\t\t\t\t\t\t\t: '',\n\t\t\t\tdeletion:\n\t\t\t\t\top === 'delete'\n\t\t\t\t\t\t? `${bzId} isa ${thingDbPath};`\n\t\t\t\t\t\t: op === 'update' && matchAttributes.length\n\t\t\t\t\t\t\t? `${bzId} has ${attributesVar};`\n\t\t\t\t\t\t\t: '',\n\t\t\t};\n\t\t}\n\n\t\tthrow new Error('in attributes');\n\t};\n\n\tconst edgeToTypeQL = (\n\t\tnode: EnrichedBQLMutationBlock,\n\t): {\n\t\tpreDeletionBatch?: any[];\n\t\tdeletionMatch?: string;\n\t\tinsertionMatch?: string;\n\t\tdeletion?: string;\n\t\tinsertion?: string;\n\t\top: string;\n\t} => {\n\t\tconst op = node.$op as string;\n\t\tconst currentSchema = getCurrentSchema(schema, node);\n\t\tconst bzId = `$${node.$bzId}`;\n\t\tconst idValue = node.$id;\n\n\t\tconst relationDbPath = currentSchema.defaultDBConnector?.path || node.$thing;\n\n\t\tconst roleFields = 'roles' in currentSchema ? listify(currentSchema.roles, (k) => k) : [];\n\n\t\tconst roleDbPaths =\n\t\t\t'roles' in currentSchema\n\t\t\t\t? mapEntries(currentSchema.roles, (k, v) => [k, v.dbConnector?.path || k])\n\t\t\t\t: ({} as { [k: string]: string });\n\n\t\t// roles can be specified in three ways, either they are a roleField in the node, they are the children of something, or they have a default/computed link\n\t\t// 1) roleFields\n\n\t\t//@ts-expect-error - TODO\n\t\tconst fromRoleFields = listify(node, (k: string, v) => {\n\t\t\tif (!roleFields.includes(k)) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tif (!('roles' in currentSchema)) {\n\t\t\t\tthrow new Error('This should have roles! ');\n\t\t\t}\n\t\t\tconst roleDbPath = roleDbPaths[k];\n\t\t\tif (Array.isArray(v)) {\n\t\t\t\treturn v.map((x) => ({ path: roleDbPath, id: x }));\n\t\t\t}\n\t\t\treturn { path: roleDbPath, id: v };\n\t\t})\n\t\t\t.filter((x) => x)\n\t\t\t.flat();\n\n\t\t/// if one of the roles's id is undefined it means it applies to every object of that thingType so we need to create an id for it\n\t\tconst fromRoleFieldsTql = fromRoleFields.map((x) => {\n\t\t\t//@ts-expect-error - TODO\n\t\t\tif (!x?.path) {\n\t\t\t\tthrow new Error('Object without path');\n\t\t\t}\n\t\t\t//@ts-expect-error - TODO\n\t\t\treturn `${x.path}: $${x.id}`;\n\t\t});\n\n\t\tconst roles = fromRoleFields.length > 0 ? `( ${fromRoleFieldsTql.join(' , ')} )` : '';\n\t\tconst edgeType = node[EdgeType];\n\n\t\tif (!edgeType) {\n\t\t\tthrow new Error('[internal error] Symbol edgeType not defined');\n\t\t}\n\n\t\tconst relationTql = !roles\n\t\t\t? ''\n\t\t\t: `${bzId} ${roles} ${\n\t\t\t\t\tedgeType === 'linkField' || op === 'delete' || op === 'unlink' ? `isa ${relationDbPath}` : ''\n\t\t\t\t}`;\n\n\t\tconst relationTqlWithoutRoles = `${bzId} ${\n\t\t\tedgeType === 'linkField' || op === 'delete' ? `isa ${relationDbPath}` : ''\n\t\t}`;\n\n\t\tconst getInsertionsInEdges = () => {\n\t\t\tif (!relationTql) {\n\t\t\t\treturn '';\n\t\t\t}\n\t\t\tif (op === 'link') {\n\t\t\t\treturn `${relationTql};`;\n\t\t\t}\n\t\t\tif (op === 'create') {\n\t\t\t\treturn `${relationTql}, has id '${idValue}';`;\n\t\t\t}\n\t\t\treturn '';\n\t\t};\n\n\t\tconst getInsertionMatchInEdges = () => {\n\t\t\tif (!relationTql) {\n\t\t\t\treturn '';\n\t\t\t}\n\t\t\t// if (op === 'link') return `${relationTql};`;\n\t\t\t// if (op === 'create') return `${relationTqlWithoutRoles};`;\n\t\t\tif (op === 'match') {\n\t\t\t\treturn `${relationTql};`;\n\t\t\t}\n\t\t\treturn '';\n\t\t};\n\n\t\tconst getDeletionMatchInEdges = () => {\n\t\t\tif (!relationTql) {\n\t\t\t\treturn '';\n\t\t\t}\n\t\t\t/// edge delete: we are removing an automatic relation\n\t\t\tif (op === 'delete') {\n\t\t\t\treturn `${relationTql};`;\n\t\t\t}\n\t\t\t/// edge unlink means: We are editing a real relation's roles\n\t\t\tif (op === 'unlink') {\n\t\t\t\t/* return `${bzId} ($roles-${node.$bzId}: $players-${node.$bzId}) isa ${relationDbPath}; ${fromRoleFields\n .map((role) => `{$roles-${node.$bzId} type ${relationDbPath}:${role?.path};}`)\n .join(` or `)};`; */\n\t\t\t\t/// unlinking more than one role is not supported yet\n\t\t\t\t/// this got commented as the match brings what is needed but will probably need a refacto\n\t\t\t\t/// this is coded as generating a match block in [parseBQLmutation.ts], toEdges(edgeType1)\n\t\t\t\t// return `${bzId} ${roles} isa ${relationDbPath};`;\n\t\t\t\t//return `${relationTql};`; //!this fixes rep-del1 but breaks other tests, ideally should be added\n\t\t\t}\n\t\t\tif (op === 'match') {\n\t\t\t\treturn `${relationTql};`;\n\t\t\t}\n\t\t\treturn '';\n\t\t};\n\n\t\tconst getDeletionsInEdges = () => {\n\t\t\tif (!relationTql) {\n\t\t\t\treturn '';\n\t\t\t}\n\t\t\t// todo: same as insertions, better manage the ids here\n\t\t\tif (op === 'delete') {\n\t\t\t\treturn `${relationTqlWithoutRoles};`;\n\t\t\t}\n\t\t\tif (op === 'unlink') {\n\t\t\t\treturn `${bzId} ${roles};`;\n\t\t\t}\n\t\t\t// if (op === 'unlink') return `${bzId} ($roles-${node.$bzId}: $players-${node.$bzId});`;\n\t\t\treturn '';\n\t\t};\n\n\t\t/* const getPreDeletionBatch = () => {\n if (op === 'unlink') {\n return fromRoleFields\n .filter((y) => y)\n .map((x) => {\n return {\n match: `${bzId} (${x?.path}: $${x?.id}) isa ${relationDbPath};`,\n deletion: `${bzId} (${x?.path}: $${x?.id}) ${\n node[Symbol.for('edgeType') as any] === 'linkField' ? `isa ${relationDbPath}` : ''\n }`,\n };\n });\n }\n return [];\n }; */\n\n\t\treturn {\n\t\t\t// preDeletionBatch: getPreDeletionBatch(),\n\t\t\tdeletionMatch: getDeletionMatchInEdges(),\n\t\t\tinsertionMatch: getInsertionMatchInEdges(),\n\t\t\tdeletion: getDeletionsInEdges(),\n\t\t\tinsertion: getInsertionsInEdges(),\n\t\t\top: '',\n\t\t};\n\t};\n\n\tconst toTypeQL = (\n\t\tnodes: EnrichedBQLMutationBlock[] | EnrichedBQLMutationBlock,\n\t\tmode?: 'nodes' | 'edges',\n\t):\n\t\t| {\n\t\t\t\tpreDeletionBatch?: any[];\n\t\t\t\tinsertionMatch?: string;\n\t\t\t\tdeletionMatch?: string;\n\t\t\t\tinsertion?: string;\n\t\t\t\tdeletion?: string;\n\t\t }[]\n\t\t| {\n\t\t\t\tpreDeletionBatch?: any[];\n\t\t\t\tinsertionMatch?: string;\n\t\t\t\tdeletionMatch?: string;\n\t\t\t\tinsertion?: string;\n\t\t\t\tdeletion?: string;\n\t\t } => {\n\t\tconst typeQL = mode === 'edges' ? edgeToTypeQL : nodeToTypeQL;\n\n\t\tif (Array.isArray(nodes)) {\n\t\t\treturn nodes\n\t\t\t\t.map((x) => {\n\t\t\t\t\tconst { preDeletionBatch, insertionMatch, deletionMatch, insertion, deletion } = typeQL(x);\n\t\t\t\t\treturn shake({ preDeletionBatch, insertionMatch, deletionMatch, insertion, deletion }, (z) => !z); /// ! WARNING: falsy values are removed (0, \"\", etc)\n\t\t\t\t})\n\t\t\t\t.filter((y) => y);\n\t\t}\n\t\tconst { preDeletionBatch, insertionMatch, deletionMatch, insertion, deletion } = typeQL(nodes);\n\n\t\treturn shake({ preDeletionBatch, insertionMatch, deletionMatch, insertion, deletion }, (z) => !z); /// ! WARNING: falsy values are removed (0, \"\", etc)\n\t};\n\n\tconst nodeOperations = toTypeQL(things);\n\tconst arrayNodeOperations = Array.isArray(nodeOperations) ? nodeOperations : [nodeOperations];\n\tconst edgeOperations = toTypeQL(edges, 'edges');\n\tconst arrayEdgeOperations = Array.isArray(edgeOperations) ? edgeOperations : [edgeOperations];\n\tconst allOperations = [...arrayNodeOperations, ...arrayEdgeOperations];\n\n\t// todo: split BQL mutation in N DBstreams per DB\n\t// todo: then pack them per DB,\n\n\tconst tqlMutation = shake(\n\t\t{\n\t\t\t// preDeletionBatch: allOperations.flatMap((x) => x.preDeletionBatch).filter((y) => y !== undefined),\n\t\t\tinsertionMatches: allOperations\n\t\t\t\t.map((x) => x.insertionMatch)\n\t\t\t\t.join(' ')\n\t\t\t\t.trim(),\n\t\t\tdeletionMatches: allOperations\n\t\t\t\t.map((x) => x.deletionMatch)\n\t\t\t\t.join(' ')\n\t\t\t\t.trim(),\n\t\t\tinsertions: allOperations\n\t\t\t\t.map((x) => x.insertion)\n\t\t\t\t.join(' ')\n\t\t\t\t.trim(),\n\t\t\tdeletions: allOperations\n\t\t\t\t.map((x) => x.deletion)\n\t\t\t\t.join(' ')\n\t\t\t\t.trim(),\n\t\t\t// ...(typeQLRelations?.length && { relations: typeQLRelations }),\n\t\t},\n\t\t(x) => !x,\n\t);\n\n\treturn tqlMutation;\n};\n","/* eslint-disable no-param-reassign */\nimport { getSchemaByThing } from '../../../helpers';\nimport type { BQLMutationBlock, BormConfig, EnrichedBormSchema } from '../../../types';\nimport { clone } from 'radash';\n\nexport type TqlRes = any;\n\nexport const parseTQLMutation = async (\n\ttqlRes: TqlRes,\n\treqThings: any[],\n\treqEdges: any[],\n\tschema: EnrichedBormSchema,\n\tconfig: BormConfig,\n) => {\n\t// todo: check if something weird happened\n\tconst expected = [...reqThings, ...reqEdges];\n\n\tconst parsed = expected\n\t\t.map((exp) => {\n\t\t\t//! reads all the insertions and gets the first match. This means each id must be unique\n\t\t\t// @ts-expect-error - TODO description\n\t\t\tconst currentNode = tqlRes.insertions?.find((y) => y.get(`${exp.$bzId}`))?.get(`${exp.$bzId}`);\n\t\t\tconst $thing = exp.$thing || exp.$relation || exp.$entity;\n\t\t\tconst thing = $thing ? getSchemaByThing(schema, $thing) : undefined;\n\n\t\t\tif (exp.$op === 'create' || exp.$op === 'update' || exp.$op === 'link') {\n\t\t\t\t/// Creation and links should show an $error. Update on the other hand might not get here as typeDB does not return deleted thibgs.\n\t\t\t\tif (!(exp.$op === 'update') && !currentNode && exp.$id) {\n\t\t\t\t\treturn { $id: exp.$id, $error: \"Does not exist or it's not linked to the parent\" }; //todo: Return with $error not found?\n\t\t\t\t}\n\n\t\t\t\tconst dbIdd = currentNode?.asThing().iid;\n\t\t\t\tconst props = Object.entries(exp)\n\t\t\t\t\t.filter(([k, _]) => !k.startsWith('$')) // Skip keys starting with '$'\n\t\t\t\t\t.reduce(\n\t\t\t\t\t\t(acc, [k, v]) => {\n\t\t\t\t\t\t\t///Relations come with the $bzId in the roles instead of the $ids, lets replace them:\n\t\t\t\t\t\t\tconst dataField = thing?.dataFields?.find((f) => f.path === k);\n\t\t\t\t\t\t\tif (dataField?.contentType === 'JSON') {\n\t\t\t\t\t\t\t\tacc[k] = JSON.parse(v as any);\n\t\t\t\t\t\t\t\treturn acc;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (exp.$thingType === 'relation') {\n\t\t\t\t\t\t\t\tconst matchedThings = expected.filter((x) => x.$id && x.$bzId === v);\n\t\t\t\t\t\t\t\t/*if (matchedThings.length > 1) { //todo: maybe we still need to throw this error and fix it in the root side?\n\t\t\t\t\t\t\t\t\tthrow new Error(`Multiple things with the same bzId ${v}`);\n\t\t\t\t\t\t\t\t} else*/ if (matchedThings.length === 1) {\n\t\t\t\t\t\t\t\t\tacc[k] = matchedThings[0].$id;\n\t\t\t\t\t\t\t\t\treturn acc;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tacc[k] = v;\n\t\t\t\t\t\t\t\treturn acc;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tacc[k] = v;\n\t\t\t\t\t\t\treturn acc;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{} as Record<string, any>,\n\t\t\t\t\t);\n\n\t\t\t\tif (config.mutation?.noMetadata) {\n\t\t\t\t\treturn props;\n\t\t\t\t}\n\n\t\t\t\t/// We revert the cleaning of the tempId\n\t\t\t\tconst tempId = exp.$tempId && !exp.$tempId.startsWith('_:') ? { $tempId: `_:${exp.$tempId}` } : {};\n\t\t\t\t// TODO: exp.path is undefined\n\t\t\t\treturn { $dbId: dbIdd, ...exp, ...props, ...{ [exp.path]: exp.$id, ...tempId } } as BQLMutationBlock;\n\t\t\t}\n\t\t\tif (exp.$op === 'delete' || exp.$op === 'unlink') {\n\t\t\t\t// todo when typeDB confirms deletions, check them here\n\t\t\t\treturn exp as BQLMutationBlock;\n\t\t\t}\n\t\t\tif (exp.$op === 'match') {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tthrow new Error(`Unsupported op ${exp.$op}`);\n\t\t})\n\t\t.filter((z) => z);\n\n\treturn clone(parsed);\n};\n","import { TransactionType } from 'typedb-driver';\nimport { getSessionOrOpenNewOne } from '../../../adapters/typeDB/helpers';\nimport type { BormConfig, DBHandles } from '../../../types';\n\nexport type TqlMutation = {\n\tdeletions: string;\n\tdeletionMatches: string;\n\tinsertions: string;\n\tinsertionMatches: string;\n};\n\nexport const runTQLMutation = async (tqlMutation: TqlMutation, dbHandles: DBHandles, config: BormConfig) => {\n\tif (!tqlMutation) {\n\t\tthrow new Error('TQL request not built');\n\t}\n\tif (!((tqlMutation.deletions && tqlMutation.deletionMatches) || tqlMutation.insertions)) {\n\t\tthrow new Error('TQL request error, no things');\n\t}\n\n\tconst { session } = await getSessionOrOpenNewOne(dbHandles, config);\n\tconst mutateTransaction = await session.transaction(TransactionType.WRITE);\n\n\t// deletes and pre-update deletes\n\tconst tqlDeletion =\n\t\ttqlMutation.deletionMatches &&\n\t\ttqlMutation.deletions &&\n\t\t`match ${tqlMutation.deletionMatches} delete ${tqlMutation.deletions}`;\n\n\t// insertions and updates\n\tconst tqlInsertion =\n\t\ttqlMutation.insertions &&\n\t\t`${tqlMutation.insertionMatches ? `match ${tqlMutation.insertionMatches}` : ''} insert ${tqlMutation.insertions}`;\n\n\ttry {\n\t\t// does not receive a result\n\t\tif (tqlDeletion) {\n\t\t\tawait mutateTransaction.query.delete(tqlDeletion);\n\t\t}\n\n\t\tconst insertionsStream = tqlInsertion && mutateTransaction.query.insert(tqlInsertion);\n\t\tconst insertionsRes = insertionsStream ? await insertionsStream.collect() : undefined;\n\n\t\tawait mutateTransaction.commit();\n\t\treturn { insertions: insertionsRes };\n\t} catch (e: any) {\n\t\tthrow new Error(`Transaction failed: ${e.message}`);\n\t} finally {\n\t\tawait mutateTransaction.close();\n\t}\n};\n","import type {\n\tBormConfig,\n\tBQLMutationBlock,\n\tDBHandles,\n\tEnrichedBormSchema,\n\tEnrichedBQLMutationBlock,\n} from '../../../types';\nimport { createMachine, interpret, invoke, reduce, state, transition } from '../../robot3';\nimport type { bqlMutationContext } from '../mutationMachine';\nimport { buildTQLMutation } from './build';\nimport type { TqlRes } from './parse';\nimport { parseTQLMutation } from './parse';\nimport type { TqlMutation } from './run';\nimport { runTQLMutation } from './run';\n\ntype TypeDbMachineContext = {\n\tbql: bqlMutationContext;\n\ttql: {\n\t\tmutation?: TqlMutation;\n\t\tres?: TqlRes;\n\t};\n\tschema: EnrichedBormSchema;\n\tconfig: BormConfig;\n\thandles: DBHandles;\n\terror?: string | null;\n};\n\nconst updateBqlRes = (ctx: TypeDbMachineContext, event: any) => {\n\treturn {\n\t\t...ctx,\n\t\tbql: { ...ctx.bql, res: event.data },\n\t};\n};\n\nconst updateTQLMutation = (ctx: TypeDbMachineContext, event: any) => {\n\treturn {\n\t\t...ctx,\n\t\ttql: {\n\t\t\t...ctx.tql,\n\t\t\tmutation: event.data,\n\t\t},\n\t};\n};\n\nconst updateTQLRes = (ctx: TypeDbMachineContext, event: any) => {\n\treturn {\n\t\t...ctx,\n\t\ttql: {\n\t\t\t...ctx.tql,\n\t\t\tres: event.data,\n\t\t},\n\t};\n};\n\nconst errorTransition = transition(\n\t'error',\n\t'error',\n\treduce((ctx: TypeDbMachineContext, event: any): TypeDbMachineContext => {\n\t\treturn {\n\t\t\t...ctx,\n\t\t\terror: event.error,\n\t\t};\n\t}),\n);\n\nexport const typeDbMutationMachine = createMachine(\n\t'buildMutation',\n\t{\n\t\tbuildMutation: invoke(\n\t\t\tasync (ctx: TypeDbMachineContext) => buildTQLMutation(ctx.bql.things, ctx.bql.edges, ctx.schema),\n\t\t\ttransition('done', 'runMutation', reduce(updateTQLMutation)),\n\t\t\terrorTransition,\n\t\t),\n\t\trunMutation: invoke(\n\t\t\tasync (ctx: TypeDbMachineContext) => runTQLMutation(ctx.tql.mutation as TqlMutation, ctx.handles, ctx.config),\n\t\t\ttransition('done', 'parseMutation', reduce(updateTQLRes)),\n\t\t\terrorTransition,\n\t\t),\n\t\tparseMutation: invoke(\n\t\t\tasync (ctx: TypeDbMachineContext) =>\n\t\t\t\tparseTQLMutation(ctx.tql.res, ctx.bql.things, ctx.bql.edges, ctx.schema, ctx.config),\n\t\t\ttransition('done', 'success', reduce(updateBqlRes)),\n\t\t\terrorTransition,\n\t\t),\n\t\tsuccess: state(),\n\t\terror: state(),\n\t},\n\t(ctx: TypeDbMachineContext) => ctx,\n);\n\nconst awaitMutationMachine = async (context: TypeDbMachineContext) => {\n\treturn new Promise<any[]>((resolve, reject) => {\n\t\tinterpret(\n\t\t\ttypeDbMutationMachine,\n\t\t\t(service) => {\n\t\t\t\tif (service.machine.state.name === 'success') {\n\t\t\t\t\tresolve(service.context.bql.res);\n\t\t\t\t}\n\t\t\t\tif (service.machine.state.name === 'error') {\n\t\t\t\t\treject(service.context.error);\n\t\t\t\t}\n\t\t\t},\n\t\t\tcontext,\n\t\t);\n\t});\n};\n\nexport const runTypeDbMutationMachine = async (\n\tbqRaw: BQLMutationBlock | BQLMutationBlock[],\n\tenrichedBql: EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[],\n\tthings: unknown[],\n\tedges: unknown[],\n\tschema: EnrichedBormSchema,\n\tconfig: BormConfig,\n\thandles: DBHandles,\n) => {\n\treturn awaitMutationMachine({\n\t\tbql: {\n\t\t\traw: bqRaw,\n\t\t\tenriched: enrichedBql,\n\t\t\tthings: things, //to unify at some point with the flat notation\n\t\t\tedges: edges,\n\t\t\tflat: {\n\t\t\t\t//this is the new version, used for surrealDB\n\t\t\t\tthings: [],\n\t\t\t\tedges: [],\n\t\t\t\tarcs: [],\n\t\t\t\treferences: [],\n\t\t\t},\n\t\t\tres: [],\n\t\t},\n\t\ttql: {},\n\t\tschema: schema,\n\t\tconfig: config,\n\t\thandles: handles,\n\t\terror: null,\n\t});\n};\n","import { isArray } from 'radash';\nimport { sanitizeNameSurrealDB } from '../../../adapters/surrealDB/helpers';\nimport { getCurrentFields, getSchemaByThing, oFilter } from '../../../helpers';\nimport type { EnrichedBQLMutationBlock, EnrichedBormRelation, EnrichedBormSchema } from '../../../types';\nimport { Parent } from '../../../types/symbols';\nimport { buildSuqlFilter, parseFilter } from '../../../adapters/surrealDB/filters/filters';\nimport type { FlatBqlMutation } from '../bql/flatter';\nimport { parseValueSurrealDB } from '../../../adapters/surrealDB/parsing/values';\n\nexport const buildSURQLMutation = async (flat: FlatBqlMutation, schema: EnrichedBormSchema) => {\n\tconst buildThings = (block: EnrichedBQLMutationBlock) => {\n\t\t//console.log('currentThing:', block);\n\t\tconst { $filter, $thing, $bzId, $op, $id, $tempId } = block;\n\n\t\tconst currentSchema = getSchemaByThing(schema, $thing);\n\t\tconst { usedDataFields } = getCurrentFields(currentSchema, block);\n\t\tconst { idFields } = currentSchema;\n\t\tconst idValue = $id || block[idFields[0]];\n\n\t\tconst sanitizedThings = (isArray($thing) ? $thing : [$thing]).map(sanitizeNameSurrealDB);\n\n\t\tconst meta = oFilter(block, (k: string) => k.startsWith('$'));\n\t\tconst rest = oFilter(block, (k: string) => !k.startsWith('$'));\n\t\tconst restString = JSON.stringify(rest);\n\t\tconst metaString = Object.entries(meta)\n\t\t\t.map(([key, value]) => (key == '$tempId' ? `'$tempId': '_:${value}'` : `'${key}': '${value}'`)) //todo: At some point migrate tempIds so they only use _: when not explicit.\n\t\t\t.join(',');\n\n\t\tconst parent = block[Parent as any]; //todo\n\n\t\tconst dataFieldStrings = usedDataFields\n\t\t\t.filter((df) => !idFields.includes(df))\n\t\t\t.map((df) => {\n\t\t\t\tconst dataFieldSchema = currentSchema.dataFields?.find((f) => f.path === df || f.dbPath === df);\n\t\t\t\tif (!dataFieldSchema) {\n\t\t\t\t\tthrow new Error(`Data field schema not found for ${df}`);\n\t\t\t\t}\n\t\t\t\tconst value = block[df];\n\t\t\t\tif (value === null) {\n\t\t\t\t\treturn `${df} = NONE`;\n\t\t\t\t}\n\t\t\t\treturn `${df} = ${parseValueSurrealDB(value, dataFieldSchema.contentType)}`;\n\t\t\t})\n\t\t\t.filter(Boolean);\n\n\t\tconst VAR = `$⟨${$tempId || $bzId}⟩`;\n\n\t\tconst COND = (() => {\n\t\t\tif (parent?.bzId) {\n\t\t\t\treturn `array::flatten($⟨${parent.bzId}⟩.⟨${parent.edgeField}⟩ || []).filter(|$v| $v != NONE).len`;\n\t\t\t}\n\t\t\tif (idValue) {\n\t\t\t\tif (isArray(idValue)) {\n\t\t\t\t\treturn sanitizedThings.flatMap((table: string) => idValue.map((id: string) => `${table}:⟨${id}⟩`)).join(', ');\n\t\t\t\t}\n\t\t\t\treturn sanitizedThings.map((table: string) => `${table}:⟨${idValue}⟩`).join(', ');\n\t\t\t}\n\t\t\treturn true; // no parent, no id value, then we can run the update or deletion safely\n\t\t})();\n\n\t\tconst TARGET = (() => {\n\t\t\t//Non root\n\t\t\tif (parent?.bzId) {\n\t\t\t\tconst parentRef = `array::flatten($⟨${parent.bzId}⟩.⟨${parent.edgeField}⟩ || []).filter(|$v| $v != NONE)`; //needed to fix an issue where deletions fail when finding none. If we want to thow an error on undefined this might be a good place\n\n\t\t\t\tif (idValue) {\n\t\t\t\t\tif (isArray(idValue)) {\n\t\t\t\t\t\treturn `${parentRef}[? $this.id() IN [${idValue.map((id) => `'${id}'`).join(', ')}] ]`;\n\t\t\t\t\t}\n\t\t\t\t\treturn `${parentRef}[? $this.id() IN ['${idValue}'] ]`;\n\t\t\t\t}\n\t\t\t\treturn parentRef;\n\t\t\t} else {\n\t\t\t\tif (idValue) {\n\t\t\t\t\tif (isArray(idValue)) {\n\t\t\t\t\t\treturn sanitizedThings\n\t\t\t\t\t\t\t.flatMap((table: string) => idValue.map((id: string) => `${table}:⟨${id}⟩`))\n\t\t\t\t\t\t\t.join(', ');\n\t\t\t\t\t}\n\t\t\t\t\treturn sanitizedThings.map((table: string) => `${table}:⟨${idValue}⟩`).join(', ');\n\t\t\t\t}\n\t\t\t\treturn sanitizedThings.join(', ');\n\t\t\t}\n\t\t})();\n\t\tconst WHERE = $filter ? `WHERE ${buildSuqlFilter(parseFilter($filter, $thing, schema))}` : '';\n\t\tconst SET = dataFieldStrings.length > 0 ? `SET ${dataFieldStrings.join(', ')}` : '';\n\n\t\tconst OUTPUT = `VALUE (CREATE ONLY Delta SET input = ${restString}, meta = {${metaString}, \"$sid\": $parent.id, \"$id\": record::id($parent.id)}, after = $after, before = $before RETURN VALUE $parent.id )`;\n\t\tconst DELETE_OUTPUT = 'BEFORE';\n\n\t\tif (['link', 'unlink', 'replace'].includes($op)) {\n\t\t\tthrow new Error(\"Edge ops don't belong to things\");\n\t\t}\n\t\tif (block.$op === 'match') {\n\t\t\tif ($tempId) {\n\t\t\t\treturn ''; //tempIds are already stored on their creation\n\t\t\t}\n\t\t\treturn `LET ${VAR} = (SELECT VALUE id FROM ${TARGET} ${WHERE});`;\n\t\t}\n\t\tif (block.$op === 'create') {\n\t\t\tif (isArray(idValue)) {\n\t\t\t\tthrow new Error('Cannot create multiple things at once');\n\t\t\t}\n\t\t\tconst tableName = sanitizeNameSurrealDB($thing);\n\t\t\treturn `LET ${VAR} = (CREATE ONLY ${tableName}:⟨${idValue}⟩ ${SET} RETURN ${OUTPUT});`;\n\t\t}\n\t\tif (block.$op === 'update') {\n\t\t\treturn `LET ${VAR} = IF (${COND}) THEN (UPDATE ${TARGET} ${SET} ${WHERE} RETURN ${OUTPUT}) END;`;\n\t\t}\n\t\tif (block.$op === 'delete') {\n\t\t\treturn `LET ${VAR} = IF (${COND}) THEN (DELETE ${TARGET} ${WHERE} RETURN ${DELETE_OUTPUT}) END;`;\n\t\t}\n\n\t\tthrow new Error(`Unsupported operation ${block.$op}`);\n\t};\n\n\tconst buildEdges = (block: EnrichedBQLMutationBlock) => {\n\t\t//console.log('currentEdge:', block);\n\t\tconst { $thing, $bzId, $op, $tempId } = block;\n\t\tconst currentSchema = getSchemaByThing(schema, $thing);\n\t\tconst { usedRoleFields } = getCurrentFields(currentSchema, block);\n\n\t\tconst VAR = `$⟨${$tempId || $bzId}⟩`;\n\n\t\tconst roleFields =\n\t\t\t'roles' in currentSchema\n\t\t\t\t? usedRoleFields.flatMap((rf) => {\n\t\t\t\t\t\tconst roleFieldSchema = currentSchema.roles[rf];\n\t\t\t\t\t\tif (!roleFieldSchema) {\n\t\t\t\t\t\t\tthrow new Error(`Role field schema not found for ${rf}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst { cardinality } = roleFieldSchema;\n\t\t\t\t\t\tconst asArrayOfVars = isArray(block[rf])\n\t\t\t\t\t\t\t? block[rf].map((node: string) => `$⟨${node}⟩`)\n\t\t\t\t\t\t\t: [`$⟨${block[rf]}⟩`];\n\n\t\t\t\t\t\tif (cardinality === 'ONE') {\n\t\t\t\t\t\t\tif (asArrayOfVars.length > 1) {\n\t\t\t\t\t\t\t\t//This is ok as long as only one is a match, but we can link to several in card ONE. This is practical if we don't know the $thing for instance, we can try multiple ones\n\t\t\t\t\t\t\t\tconst arrayString = `array::filter(array::flatten([${asArrayOfVars}]), |$v| !!$v)`;\n\t\t\t\t\t\t\t\tswitch ($op) {\n\t\t\t\t\t\t\t\t\tcase 'link':\n\t\t\t\t\t\t\t\t\tcase 'replace':\n\t\t\t\t\t\t\t\t\t\treturn `${rf} = ((array::len(${arrayString})==1) && ${arrayString}[0]) || ${arrayString}`; //todo: throw a custom error instead\n\t\t\t\t\t\t\t\t\tcase 'unlink':\n\t\t\t\t\t\t\t\t\t\treturn `${rf} = NONE`; //todo this is not necessarily correct if $id or $filter! Should be none only if the node has been found\n\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\tthrow new Error(`Unsupported operation ${$op} for ONE cardinality`);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tswitch ($op) {\n\t\t\t\t\t\t\t\tcase 'link':\n\t\t\t\t\t\t\t\tcase 'replace':\n\t\t\t\t\t\t\t\t\treturn `${rf} = ((type::is::array(${asArrayOfVars[0]}) && array::len(${asArrayOfVars[0]})==1) && ${asArrayOfVars[0]}[0]) || ${asArrayOfVars[0]}`;\n\t\t\t\t\t\t\t\tcase 'unlink':\n\t\t\t\t\t\t\t\t\treturn `${rf} = NONE`; //todo this is not necessarily correct if $id or $filter! Should be none only if the node has been found\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\tthrow new Error(`Unsupported operation ${$op} for ONE cardinality`);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (cardinality === 'MANY') {\n\t\t\t\t\t\t\tconst nodesString = `array::flatten([${asArrayOfVars}])`;\n\t\t\t\t\t\t\tswitch ($op) {\n\t\t\t\t\t\t\t\tcase 'link':\n\t\t\t\t\t\t\t\t\treturn `${rf} += ${nodesString}`;\n\t\t\t\t\t\t\t\tcase 'unlink':\n\t\t\t\t\t\t\t\t\treturn `${rf} -= ${nodesString}`;\n\t\t\t\t\t\t\t\tcase 'replace':\n\t\t\t\t\t\t\t\t\treturn `${rf} = ${nodesString}`;\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\tthrow new Error(`Unsupported operation ${$op} for MANY cardinality`);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthrow new Error(`Unsupported cardinality ${cardinality}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t: [];\n\n\t\tconst roleFieldsString = roleFields.length > 0 ? `${roleFields.join(', ')}` : '';\n\t\tconst SET = roleFieldsString ? `SET ${roleFieldsString}` : '';\n\n\t\treturn `IF ${VAR} THEN (UPDATE ${VAR} ${SET} RETURN VALUE id) END; ${VAR};`; //todo: confirm if the WHERE is actually needed here?\n\t};\n\n\tconst buildArcs = (block: EnrichedBQLMutationBlock) => {\n\t\tconst { $thing, $op } = block;\n\t\tconst currentSchema = getSchemaByThing(schema, $thing) as EnrichedBormRelation;\n\t\tconst tableName = sanitizeNameSurrealDB($thing);\n\n\t\tconst { usedRoleFields } = getCurrentFields(currentSchema, block);\n\n\t\tif (!['create', 'delete'].includes($op)) {\n\t\t\tthrow new Error('Arcs can only be created or deleted');\n\t\t}\n\n\t\tconst [roleA, roleB] = usedRoleFields;\n\t\tconst thingsA = (isArray(block[roleA]) ? block[roleA] : [block[roleA]]) as string[];\n\t\tconst thingsB = (isArray(block[roleB]) ? block[roleB] : [block[roleB]]) as string[];\n\n\t\tif ($op === 'create') {\n\t\t\tif (usedRoleFields.length !== 2) {\n\t\t\t\tthrow new Error('Not supported: Arcs must have exactly 2 roles');\n\t\t\t}\n\t\t\tconst rest = oFilter(block, (k: string) => !k.startsWith('$'));\n\t\t\tconst restString = JSON.stringify(rest);\n\n\t\t\tconst OUTPUT = `(CREATE ONLY Delta SET input = ${restString}, meta = {\"$sid\": $parent.id, \"$id\": record::id($parent.id)}, after = $after, before = $before RETURN VALUE $parent.id )`;\n\n\t\t\tconst roleOneSchema = currentSchema.roles[roleA];\n\t\t\tconst isMany1 = roleOneSchema.cardinality === 'MANY';\n\n\t\t\tconst roleTwoSchema = currentSchema.roles[roleB];\n\t\t\tconst isMany2 = roleTwoSchema.cardinality === 'MANY';\n\n\t\t\t/*const thingsAString = thingsA.map((thingA) => `$⟨${thingA}⟩`).join(', ');\n\t\t\tconst thingsAArrayString = `array::flatten([${thingsAString}])`;\n\t\t\tconst thingsBString = thingsB.map((thingB) => `$⟨${thingB}⟩`).join(', ');\n\t\t\tconst thingsBArrayString = `array::flatten([${thingsBString}])`;\n*/\n\t\t\t/*\n\t\t\t//this is the third version, where we only create one arc per arc defined in the flatter function. Todo: Check cardinality and throw error if it is not correct instead of the || to trigger it internally\n\t\t\tconst arc = `CREATE ONLY ${tableName} SET\n\t\t\t\t\t${roleA} = ${isMany1 ? thingsAArrayString : `array::len(${thingsAArrayString}) == 1 && array::first(${thingsAArrayString}) || ${thingsAArrayString}`},\n\t\t\t\t\t${roleB} = ${isMany2 ? thingsBArrayString : `array::len(${thingsBArrayString}) == 1 && array::first(${thingsBArrayString}) || ${thingsBArrayString}`}\n\t\t\t`;\n\n\t\t\treturn arc; \n\t\t\t*/\n\n\t\t\t///before it was multiple arcs, running a loop over thingsA and thingsB in addition to the surrealDB loop inside the surql\n\t\t\tconst arcs = [\n\t\t\t\t///This ignored cardinality and created N*M arcs. I keep it here as it could be an option in the mutation config in the future.\n\n\t\t\t\t//\n\t\t\t\t//\n\t\t\t\t`\n\t\t\t\t${!isMany1 ? `IF array::len(array::filter(array::flatten([$⟨${thingsA}⟩]), |$v| !!$v))>1 { THROW \"[Validation] Cardinality constraint: ${roleA} is cardinality one and can link a single thing.\" + <string>$⟨${thingsA}⟩; };` : ''}\n\t\t\t\t${!isMany2 ? `IF array::len(array::filter(array::flatten([$⟨${thingsB}⟩]), |$v| !!$v))>1 { THROW \"[Validation] Cardinality constraint: ${roleB} is cardinality one and can link a single thing.\" + <string>$⟨${thingsB}⟩; };` : ''}\n\t\t\t\tFOR $node1 IN array::flatten([$⟨${thingsA}⟩]) { \n\t\t\t\t\t\t\tIF $node1 {\n\t\t\t\t\t\t\t\tFOR $node2 IN array::flatten([$⟨${thingsB}⟩]) { \n\t\t\t\t\t\t\t\t\tIF $node2 {\n\t\t\t\t\t\t\t\t\t\tCREATE ONLY ${tableName} SET \n\t\t\t\t\t\t\t\t\t\t\t${roleA} = ${isMany1 ? 'array::flatten([$node1])' : '$node1'}, \n\t\t\t\t\t\t\t\t\t\t\t${roleB} = ${isMany2 ? 'array::flatten([$node2])' : '$node2'} \n\t\t\t\t\t\t\t\t\t\tRETURN ${OUTPUT}; \n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}`,\n\t\t\t];\n\n\t\t\t///This is the throw error version that checks the cardinality, if it is ugly but it works, it ain't ugly\n\t\t\t//\t`CREATE ONLY ${tableName} SET ${roleA} = ${isMany1 ? `fn::as_array($⟨${thingA}⟩)` : `array::len(fn::as_array($⟨${thingA}⟩)) == 1 && array::first(fn::as_array($⟨${thingA}⟩)) || $⟨${thingA}⟩`}, ${roleB} = ${isMany2 ? `fn::as_array($⟨${thingB}⟩)` : `array::len(fn::as_array($⟨${thingB}⟩)) == 1 && array::first(fn::as_array($⟨${thingB}⟩)) || $⟨${thingB}⟩`} RETURN ${OUTPUT};`,\n\n\t\t\t//console.log('arcs', arcs);\n\t\t\treturn arcs;\n\t\t}\n\n\t\tif ($op === 'delete') {\n\t\t\treturn `DELETE FROM ${tableName} WHERE fn::as_array(${roleA}) CONTAINSANY $⟨${thingsA}⟩ AND fn::as_array(${roleB}) CONTAINSANY $⟨${thingsB}⟩ RETURN BEFORE`;\n\t\t}\n\t};\n\n\tconst buildReferences = (block: EnrichedBQLMutationBlock) => {\n\t\tconst { $thing, $bzId, $op, $tempId } = block;\n\t\tconst currentSchema = getSchemaByThing(schema, $thing);\n\t\tconst { usedRefFields } = getCurrentFields(currentSchema, block);\n\n\t\tconst VAR = `$⟨${$tempId || $bzId}⟩`;\n\n\t\tconst refFields = usedRefFields.flatMap((rf) => {\n\t\t\tconst refFieldSchema = currentSchema.refFields[rf];\n\t\t\tif (!refFieldSchema) {\n\t\t\t\tthrow new Error(`ReferenceField schema not found for ${rf}`);\n\t\t\t}\n\t\t\tconst { cardinality, contentType } = refFieldSchema;\n\t\t\tif (contentType === 'REF') {\n\t\t\t\tconst asArrayOfVars = isArray(block[rf]) ? block[rf] : [`${block[rf]}`];\n\n\t\t\t\tif (cardinality === 'ONE') {\n\t\t\t\t\tif (asArrayOfVars.length > 1) {\n\t\t\t\t\t\t//This is ok as long as only one is a match, but we can link to several in card ONE. This is practical if we don't know the $thing for instance, we can try multiple ones\n\t\t\t\t\t\tconst arrayString = `array::filter(array::flatten([${asArrayOfVars}]), |$v| !!$v)`;\n\t\t\t\t\t\tswitch ($op) {\n\t\t\t\t\t\t\tcase 'link':\n\t\t\t\t\t\t\tcase 'replace':\n\t\t\t\t\t\t\t\treturn `${rf} = ((array::len(${arrayString})==1) && ${arrayString}[0]) || ${arrayString}`; //todo: throw a custom error instead\n\t\t\t\t\t\t\tcase 'unlink':\n\t\t\t\t\t\t\t\treturn `${rf} = NONE`; //todo this is not necessarily correct if $id or $filter! Should be none only if the node has been found\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tthrow new Error(`Unsupported operation ${$op} for ONE cardinality`);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tswitch ($op) {\n\t\t\t\t\t\tcase 'link':\n\t\t\t\t\t\tcase 'replace':\n\t\t\t\t\t\t\treturn `${rf} = ((type::is::array(${asArrayOfVars[0]}) && array::len(${asArrayOfVars[0]})==1) && ${asArrayOfVars[0]}[0]) || ${asArrayOfVars[0]}`;\n\t\t\t\t\t\tcase 'unlink':\n\t\t\t\t\t\t\treturn `${rf} = NONE`; //todo this is not necessarily correct if $id or $filter! Should be none only if the node has been found\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tthrow new Error(`Unsupported operation ${$op} for ONE cardinality`);\n\t\t\t\t\t}\n\t\t\t\t} else if (cardinality === 'MANY') {\n\t\t\t\t\tconst nodesString = `array::flatten([${asArrayOfVars}])`;\n\t\t\t\t\tswitch ($op) {\n\t\t\t\t\t\tcase 'link':\n\t\t\t\t\t\t\treturn `${rf} += ${nodesString}`;\n\t\t\t\t\t\tcase 'unlink':\n\t\t\t\t\t\t\treturn `${rf} -= ${nodesString}`;\n\t\t\t\t\t\tcase 'replace':\n\t\t\t\t\t\t\treturn `${rf} = ${nodesString}`;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tthrow new Error(`Unsupported operation ${$op} for MANY cardinality`);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(`Unsupported cardinality ${cardinality}`);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (contentType === 'FLEX') {\n\t\t\t\t//todo: card one check len 1\n\t\t\t\t//todo: add/remove etc\n\t\t\t\treturn `${rf} = ${cardinality === 'ONE' ? `array::flatten([${block[rf]}])[0]` : `array::flatten([${block[rf]}])`}`;\n\t\t\t}\n\t\t});\n\t\tconst refFieldsString = refFields.length > 0 ? `${refFields.join(', ')}` : '';\n\t\tconst SET = refFieldsString ? `SET ${refFieldsString}` : '';\n\n\t\treturn `IF ${VAR} THEN (UPDATE ${VAR} ${SET} RETURN VALUE id) END; ${VAR};`;\n\t};\n\n\tconst result = [\n\t\t...flat.things.map(buildThings),\n\t\t...flat.edges.map(buildEdges),\n\t\t...flat.arcs.flatMap(buildArcs),\n\t\t...flat.references.map(buildReferences),\n\t];\n\t//console.log('builtMutation', result);\n\treturn result;\n};\n","import type { SimpleSurrealClient } from '../../../adapters/surrealDB/client';\nimport { VERSION } from '../../../version';\nimport { logDebug } from '../../../logger';\n\nexport const runSURQLMutation = async (client: SimpleSurrealClient, mutations: string[]): Promise<any[]> => {\n\tconst batchedMutation = `\n\tBEGIN TRANSACTION;\n\t${mutations.join(';')};\n\tLET $DELTAS = SELECT * FROM Delta;\n\tDELETE Delta;\n\tRETURN $DELTAS;\n\n\tLET $LOGS = SELECT * FROM LOG;\n\tRETURN $LOGS;\n\tCOMMIT TRANSACTION; \n\t`;\n\n\tlogDebug(`>>> batchedMutation[${VERSION}]`, JSON.stringify({ batchedMutation }));\n\t//console.log('mutations', mutations);\n\t//console.log('batchedMutation', batchedMutation);\n\ttry {\n\t\tconst result = await client.query(batchedMutation);\n\t\treturn result.filter(Boolean);\n\t} catch (error) {\n\t\tconst errorRes = await client.query_raw(batchedMutation);\n\t\t//console.log('errorRes!', JSON.stringify(errorRes, null, 2));\n\t\tconst filteredErrorRes = errorRes.filter(\n\t\t\t(r) =>\n\t\t\t\tr.result !== 'The query was not executed due to a failed transaction' &&\n\t\t\t\tr.result !== 'There was an error when starting a new datastore transaction' &&\n\t\t\t\tr.status === 'ERR',\n\t\t);\n\t\tif (filteredErrorRes.length > 0) {\n\t\t\tthrow new Error(`Error running SURQL mutation: ${JSON.stringify(filteredErrorRes)}`);\n\t\t}\n\t\tthrow error;\n\t}\n};\n","import { isArray, isObject, mapEntries } from 'radash';\nimport type { BormConfig, EnrichedBormSchema } from '../../../types';\nimport { oFilter } from '../../../helpers';\n\nexport type EnrichedSURQLMutationRes = {\n\tmeta: Record<string, any>;\n\tinput?: Record<string, any>;\n\tafter?: Record<string, any>;\n};\n\nexport const parseSURQLMutation = (props: {\n\tres: EnrichedSURQLMutationRes[][];\n\tschema: EnrichedBormSchema;\n\tconfig: BormConfig;\n}) => {\n\tconst { res, config } = props;\n\t//console.log('res!', JSON.stringify(res, null, 2));\n\n\tconst result = res\n\t\t.flat() //Todo: try to get it flat instead of [][]\n\t\t.filter(Boolean)\n\t\t.flatMap((b: object) => {\n\t\t\tif (isArray(b)) {\n\t\t\t\treturn b.map((r) => {\n\t\t\t\t\tif (!isObject(r) || !('meta' in r)) {\n\t\t\t\t\t\tthrow new Error(`Internal error: Invalid response from DB: ${JSON.stringify(r)}`);\n\t\t\t\t\t}\n\t\t\t\t\treturn parseRes(r as EnrichedSURQLMutationRes, config);\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (!isObject(b) || !('meta' in b)) {\n\t\t\t\tthrow new Error(`Internal error: Invalid response from DB: ${JSON.stringify(b)}`);\n\t\t\t}\n\t\t\treturn parseRes(b as EnrichedSURQLMutationRes, config);\n\t\t});\n\treturn result;\n};\n\nconst parseRes = (block: EnrichedSURQLMutationRes, config: BormConfig) => {\n\tconst thing = mapEntries(block.after || {}, (key, value) => [\n\t\tkey,\n\t\tkey === 'id' ? value.id : isArray(value) && value.length === 0 ? undefined : value,\n\t]);\n\n\tconst nulledAtts = oFilter(block.input || {}, (k: string, v: any) => v === null);\n\tconst withMetaAndId = { ...thing, ...block.meta, ...nulledAtts };\n\n\tif (!config.mutation?.noMetadata) {\n\t\treturn withMetaAndId;\n\t} else {\n\t\treturn oFilter(withMetaAndId, (k: string) => !k.startsWith('$'));\n\t}\n};\n","import type {\n\tBormConfig,\n\tBQLMutationBlock,\n\tDBHandles,\n\tEnrichedBormSchema,\n\tEnrichedBQLMutationBlock,\n} from '../../../types';\nimport { createMachine, interpret, invoke, reduce, state, transition } from '../../robot3';\nimport type { bqlMutationContext } from '../mutationMachine';\nimport { buildSURQLMutation } from './build';\nimport { runSURQLMutation } from './run';\nimport type { EnrichedSURQLMutationRes } from './parse';\nimport { parseSURQLMutation } from './parse';\nimport { isArray } from 'radash';\nimport type { FlatBqlMutation } from '../bql/flatter';\nimport type { SimpleSurrealClient } from '../../../adapters/surrealDB/client';\nimport { VERSION } from '../../../version';\nimport { logDebug } from '../../../logger';\n\ntype SurrealDbMachineContext = {\n\tbql: bqlMutationContext;\n\tsurql: {\n\t\tmutations: string[];\n\t\tres: EnrichedSURQLMutationRes[][]; //todo maybe a flat versi\n\t};\n\tschema: EnrichedBormSchema;\n\tconfig: BormConfig;\n\thandles: DBHandles;\n\terror?: string | null;\n};\n\nconst updateBqlRes = (ctx: SurrealDbMachineContext, event: any) => {\n\treturn {\n\t\t...ctx,\n\t\tbql: { ...ctx.bql, res: event.data },\n\t};\n};\n\nconst updateSURQLMutation = (ctx: SurrealDbMachineContext, event: any) => {\n\tif (!event.data || !isArray(event.data) || event.data.some((d: any) => typeof d !== 'string')) {\n\t\tthrow new Error('Invalid event data');\n\t}\n\treturn {\n\t\t...ctx,\n\t\tsurql: {\n\t\t\t...ctx.surql,\n\t\t\tmutations: event.data as string[],\n\t\t},\n\t};\n};\n\nconst updateSURQLRes = (ctx: SurrealDbMachineContext, event: any) => {\n\tif (!event.data || !isArray(event.data)) {\n\t\tthrow new Error('Invalid event data');\n\t}\n\treturn {\n\t\t...ctx,\n\t\tsurql: {\n\t\t\t...ctx.surql,\n\t\t\tres: event.data as EnrichedSURQLMutationRes[][],\n\t\t},\n\t};\n};\n\nconst errorTransition = transition(\n\t'error',\n\t'error',\n\treduce((ctx: SurrealDbMachineContext, event: any): SurrealDbMachineContext => {\n\t\treturn {\n\t\t\t...ctx,\n\t\t\terror: event.error,\n\t\t};\n\t}),\n);\n\nconst surrealDbMutationMachine = createMachine(\n\t'buildMutation',\n\t{\n\t\tbuildMutation: invoke(\n\t\t\tasync (ctx: SurrealDbMachineContext) => {\n\t\t\t\tlogDebug(`>>> surqlMachine/buildMutation[${VERSION}]`, JSON.stringify(ctx.bql.flat));\n\t\t\t\treturn buildSURQLMutation(ctx.bql.flat, ctx.schema);\n\t\t\t},\n\t\t\ttransition('done', 'runMutation', reduce(updateSURQLMutation)),\n\t\t\terrorTransition,\n\t\t),\n\t\trunMutation: invoke(\n\t\t\tasync (ctx: SurrealDbMachineContext) => {\n\t\t\t\tlogDebug(`>>> surqlMachine/runMutation[${VERSION}]`, JSON.stringify(ctx.surql.mutations));\n\t\t\t\treturn runSURQLMutation(\n\t\t\t\t\tctx.handles.surrealDB?.get(ctx.handles.surrealDB?.keys().next().value as string)\n\t\t\t\t\t\t?.client as SimpleSurrealClient,\n\t\t\t\t\tctx.surql.mutations,\n\t\t\t\t);\n\t\t\t},\n\t\t\ttransition('done', 'parseMutation', reduce(updateSURQLRes)),\n\t\t\terrorTransition,\n\t\t),\n\t\tparseMutation: invoke(\n\t\t\tasync (ctx: SurrealDbMachineContext) => {\n\t\t\t\tlogDebug(`>>> surqlMachine/parseMutation[${VERSION}]`, JSON.stringify(ctx.surql.res));\n\t\t\t\treturn parseSURQLMutation({ res: ctx.surql.res, config: ctx.config, schema: ctx.schema });\n\t\t\t},\n\t\t\ttransition('done', 'success', reduce(updateBqlRes)),\n\t\t\terrorTransition,\n\t\t),\n\t\tsuccess: state(),\n\t\terror: state(),\n\t},\n\t(ctx: SurrealDbMachineContext) => ctx,\n);\n\nconst awaitMutationMachine = async (context: SurrealDbMachineContext) => {\n\treturn new Promise<any[]>((resolve, reject) => {\n\t\tinterpret(\n\t\t\tsurrealDbMutationMachine,\n\t\t\t(service) => {\n\t\t\t\tif (service.machine.state.name === 'success') {\n\t\t\t\t\tresolve(service.context.bql.res);\n\t\t\t\t}\n\t\t\t\tif (service.machine.state.name === 'error') {\n\t\t\t\t\treject(service.context.error);\n\t\t\t\t}\n\t\t\t},\n\t\t\tcontext,\n\t\t);\n\t});\n};\n\nexport const runSurrealDbMutationMachine = async (\n\tbqlRaw: BQLMutationBlock | BQLMutationBlock[],\n\tenrichedBql: EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[],\n\tbqlFlat: FlatBqlMutation,\n\tschema: EnrichedBormSchema,\n\tconfig: BormConfig,\n\thandles: DBHandles,\n) => {\n\treturn awaitMutationMachine({\n\t\tbql: {\n\t\t\traw: bqlRaw,\n\t\t\tenriched: enrichedBql,\n\t\t\tflat: bqlFlat,\n\t\t\tthings: [],\n\t\t\tedges: [],\n\t\t\tres: [],\n\t\t},\n\t\tsurql: {\n\t\t\tmutations: [],\n\t\t\tres: [],\n\t\t},\n\t\tschema: schema,\n\t\tconfig: config,\n\t\thandles: handles,\n\t\terror: null,\n\t});\n};\n","import type { BormOperation, EnrichedBormSchema, EnrichedBQLMutationBlock, EnrichedLinkField } from '../../../types';\nimport { getCurrentFields, oFilter } from '../../../helpers';\nimport { isArray, isSymbol } from 'radash';\nimport { Parent } from '../../../types/symbols';\nimport { parseValueSurrealDB } from '../../../adapters/surrealDB/parsing/values';\n\nexport type FlatBqlMutation = {\n\tthings: EnrichedBQLMutationBlock[];\n\tedges: EnrichedBQLMutationBlock[];\n\tarcs: EnrichedBQLMutationBlock[];\n\treferences: EnrichedBQLMutationBlock[];\n};\n\nexport const flattenBQLMutation = (\n\ttree: EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[],\n\tschema: EnrichedBormSchema,\n): FlatBqlMutation => {\n\t//console.log('>>> flattenBQLMutation', JSON.stringify({ tree, schema }));\n\tconst result: FlatBqlMutation = {\n\t\tthings: [],\n\t\tedges: [],\n\t\tarcs: [],\n\t\treferences: [],\n\t};\n\n\tconst traverse = (\n\t\tblock: EnrichedBQLMutationBlock,\n\t\tparent?: { bzId: string; edgeField: string; tempId?: string },\n\t): void => {\n\t\tif (!block?.$thing) {\n\t\t\t//console.log('block without $thing', block);\n\t\t\t//this for instance happens in flexValues inside refFields\n\t\t\treturn;\n\t\t}\n\t\tconst { $op, $bzId, $tempId } = block;\n\n\t\tconst currentSchema = schema.relations[block.$thing] || schema.entities[block.$thing];\n\t\tif (!currentSchema) {\n\t\t\tthrow new Error(`[Internal] No schema found for ${block.$thing}`);\n\t\t}\n\n\t\tconst parentObj = parent?.bzId ? parent : { bzId: '', edgeField: 'root' };\n\n\t\t//const { idFields } = currentSchema;\n\t\tconst { usedDataFields, usedLinkFields, usedRoleFields, usedRefFields } = getCurrentFields(currentSchema, block);\n\n\t\t//const isOne = $op === 'create' || !isArray($id);\n\n\t\t//1. THINGS\n\t\tif (['create', 'update', 'delete', 'link', 'unlink', 'match', 'replace'].includes($op)) {\n\t\t\tconst thing = {\n\t\t\t\t...oFilter(block, (k: string) => ![...usedRoleFields, ...usedLinkFields, ...usedRefFields].includes(k)),\n\t\t\t\t...($op === 'link' || $op === 'unlink' || $op === 'replace' || ($op === 'update' && usedDataFields.length === 0)\n\t\t\t\t\t? { $op: 'match' }\n\t\t\t\t\t: {}),\n\t\t\t\t...($op === 'link' || $op === 'replace' ? {} : { [Parent]: parentObj }), //links and replaces don't read from the parent but the entire table,\n\t\t\t} as EnrichedBQLMutationBlock;\n\n\t\t\tresult.things.push(thing);\n\t\t}\n\n\t\t//2. EDGES\n\t\t// 2.1 Case one direct EDGES\n\n\t\t// left side is what happens in the edge, right side is the op in the children that creates that edge op\n\t\tconst operationMap = {\n\t\t\tlink: ['link', 'create'],\n\t\t\tunlink: ['unlink', 'delete'],\n\t\t\treplace: ['replace'],\n\t\t};\n\n\t\tif (usedRoleFields) {\n\t\t\tconst edgeMeta = oFilter(\n\t\t\t\tblock,\n\t\t\t\t(k: string | symbol) => isSymbol(k) || k.startsWith('$'),\n\t\t\t) as EnrichedBQLMutationBlock;\n\n\t\t\tusedRoleFields.forEach((role) => {\n\t\t\t\t//1 traverse them as well\n\t\t\t\tisArray(block[role])\n\t\t\t\t\t? block[role].forEach((child: EnrichedBQLMutationBlock) =>\n\t\t\t\t\t\t\ttraverse(child, { bzId: $bzId, edgeField: role, tempId: $tempId }),\n\t\t\t\t\t\t)\n\t\t\t\t\t: traverse(block[role], { bzId: $bzId, edgeField: role, tempId: $tempId });\n\n\t\t\t\t//2 fill the arrays\n\t\t\t\tconst edges = (isArray(block[role]) ? block[role] : [block[role]]).filter(\n\t\t\t\t\tBoolean,\n\t\t\t\t) as EnrichedBQLMutationBlock[]; //pre-queries add some undefineds\n\n\t\t\t\tObject.entries(operationMap).forEach(([operation, opTypes]) => {\n\t\t\t\t\tconst filteredEdges = edges.filter((edge) => opTypes.includes(edge.$op)).map((edge) => edge.$bzId);\n\n\t\t\t\t\tif (filteredEdges.length > 0) {\n\t\t\t\t\t\tresult.edges.push({\n\t\t\t\t\t\t\t...edgeMeta,\n\t\t\t\t\t\t\t[role]: filteredEdges,\n\t\t\t\t\t\t\t$op: operation as BormOperation,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t\tif (usedLinkFields) {\n\t\t\tusedLinkFields.forEach((ulf) => {\n\t\t\t\t//1 traverse them\n\t\t\t\tisArray(block[ulf])\n\t\t\t\t\t? block[ulf].forEach((child: EnrichedBQLMutationBlock) =>\n\t\t\t\t\t\t\ttraverse(child, { bzId: $bzId, edgeField: ulf, tempId: $tempId }),\n\t\t\t\t\t\t)\n\t\t\t\t\t: traverse(block[ulf], { bzId: $bzId, edgeField: ulf, tempId: $tempId });\n\n\t\t\t\t//2 fill the arrays\n\t\t\t\tconst edgeSchema = currentSchema.linkFields?.find((lf) => lf.path === ulf) as EnrichedLinkField;\n\t\t\t\tconst edges = (isArray(block[ulf]) ? block[ulf] : [block[ulf]]) as EnrichedBQLMutationBlock[];\n\t\t\t\t//console.log('edges:', edges);\n\n\t\t\t\t//case 2.2 indirect edges\n\t\t\t\tif (edgeSchema.target === 'relation') {\n\t\t\t\t\tObject.entries(operationMap).forEach(([operation, opTypes]) => {\n\t\t\t\t\t\tconst filteredEdges = edges.filter((edge) => opTypes.includes(edge.$op));\n\n\t\t\t\t\t\tfilteredEdges.forEach((edge) => {\n\t\t\t\t\t\t\tconst edgeMeta = oFilter(\n\t\t\t\t\t\t\t\tedge,\n\t\t\t\t\t\t\t\t(k: string | symbol) => isSymbol(k) || k.startsWith('$'),\n\t\t\t\t\t\t\t) as EnrichedBQLMutationBlock;\n\n\t\t\t\t\t\t\tresult.edges.push({\n\t\t\t\t\t\t\t\t...edgeMeta,\n\t\t\t\t\t\t\t\t[edgeSchema.plays]: $bzId,\n\t\t\t\t\t\t\t\t$op: operation as BormOperation,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\t// 3. INFERRED EDGES\n\t\t\t\tif (edgeSchema.target === 'role') {\n\t\t\t\t\tconst arcOperationMap = {\n\t\t\t\t\t\tcreate: ['link', 'create'],\n\t\t\t\t\t\tdelete: ['unlink', 'delete'],\n\t\t\t\t\t\treplace: ['replace'],\n\t\t\t\t\t};\n\n\t\t\t\t\tObject.entries(arcOperationMap).forEach(([operation, opTypes]) => {\n\t\t\t\t\t\tconst filteredEdges = edges.filter((edge) => opTypes.includes(edge.$op));\n\n\t\t\t\t\t\tif (filteredEdges.length === 0) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfilteredEdges.forEach((edge) => {\n\t\t\t\t\t\t\tconst arc = {\n\t\t\t\t\t\t\t\t//technically is a multi-arc\n\t\t\t\t\t\t\t\t$thing: edgeSchema.relation,\n\t\t\t\t\t\t\t\t$thingType: 'relation' as const,\n\t\t\t\t\t\t\t\t$bzId: `arc_${edge.$bzId}`,\n\t\t\t\t\t\t\t\t[edgeSchema.plays]: $bzId,\n\t\t\t\t\t\t\t\t[edgeSchema.oppositeLinkFieldsPlayedBy[0].plays]: edge.$bzId,\n\t\t\t\t\t\t\t\t$op: operation as BormOperation,\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\tresult.arcs.push(arc);\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\tif (usedRefFields) {\n\t\t\tusedRefFields.forEach((urf) => {\n\t\t\t\t//const { contentType } = currentSchema.refFields[urf];\n\t\t\t\t//1 traverse them to push the nested items\n\t\t\t\tisArray(block[urf])\n\t\t\t\t\t? block[urf].forEach((child: EnrichedBQLMutationBlock) =>\n\t\t\t\t\t\t\ttraverse(child, { bzId: $bzId, edgeField: urf, tempId: $tempId }),\n\t\t\t\t\t\t)\n\t\t\t\t\t: traverse(block[urf], { bzId: $bzId, edgeField: urf, tempId: $tempId });\n\n\t\t\t\t//2 fill the arrays. We need this with refFields as well because in surrealdb we need to apply link operations at the end in case the order is incorrect\n\t\t\t\tconst children = (isArray(block[urf]) ? block[urf] : [block[urf]]).filter(\n\t\t\t\t\t(x) => x !== null && x !== undefined,\n\t\t\t\t) as EnrichedBQLMutationBlock[];\n\n\t\t\t\tconst childMeta = oFilter(\n\t\t\t\t\tblock,\n\t\t\t\t\t(k: string | symbol) => isSymbol(k) || k.startsWith('$'),\n\t\t\t\t) as EnrichedBQLMutationBlock;\n\n\t\t\t\tconst filteredChildren = children.map((child) =>\n\t\t\t\t\tchild.$op ? `$⟨${child.$bzId}⟩` : parseValueSurrealDB(child, 'FLEX'),\n\t\t\t\t);\n\n\t\t\t\tif (filteredChildren.length > 0) {\n\t\t\t\t\tresult.references.push({\n\t\t\t\t\t\t...childMeta,\n\t\t\t\t\t\t[urf]: filteredChildren,\n\t\t\t\t\t\t$op: 'replace' as BormOperation, //Probably add / replace/ remove byt lets do only replaces for now\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t};\n\n\tconst treeItems = Array.isArray(tree) ? tree : [tree];\n\ttreeItems.forEach((item) => traverse(item));\n\n\t//order by $Op, first unlink, then link\n\tconst orderedEdges = [...result.edges].sort((a, b) => {\n\t\tconst order = ['unlink', 'link'];\n\t\treturn order.indexOf(a.$op) - order.indexOf(b.$op);\n\t});\n\n\t//console.log('tree:', JSON.stringify(tree, null, 2));\n\t//console.log('flat:', JSON.stringify(result, null, 2));\n\n\treturn {\n\t\t...result,\n\t\tedges: orderedEdges,\n\t};\n};\n","import type {\n\tBQLMutation,\n\tBQLMutationBlock,\n\tBormConfig,\n\tDBHandles,\n\tEnrichedBQLMutationBlock,\n\tEnrichedBormSchema,\n} from '../../types';\nimport { enrichBQLMutation } from './bql/enrich';\nimport { parseBQLMutation } from './bql/parse';\nimport { mutationPreQuery } from './bql/preQuery';\n\nimport { createMachine, transition, reduce, guard, interpret, state, invoke } from '../robot3';\nimport { stringify } from './bql/stringify';\nimport { preHookDependencies } from './bql/enrichSteps/preHookDependencies';\nimport { dependenciesGuard } from './bql/guards/dependenciesGuard';\nimport { runTypeDbMutationMachine } from './tql/machine';\nimport { runSurrealDbMutationMachine } from './surql/machine';\nimport type { FlatBqlMutation } from './bql/flatter';\nimport { flattenBQLMutation } from './bql/flatter';\nimport { VERSION } from '../../version';\nimport { logDebug } from '../../logger';\n\nconst final = state;\n\nexport type bqlMutationContext = {\n\traw: BQLMutationBlock | BQLMutationBlock[];\n\tenriched: EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[];\n\tflat: FlatBqlMutation;\n\tthings: any[];\n\tedges: any[];\n\tres: any[];\n};\n\ntype MachineContext = {\n\tbql: bqlMutationContext;\n\tschema: EnrichedBormSchema;\n\tconfig: BormConfig;\n\thandles: DBHandles;\n\tdepthLevel: number;\n\terror: string | null;\n};\n\n// Reducer\n// ============================================================================\n\nconst updateBqlReq = (ctx: MachineContext, event: any) => {\n\tif (!event.data) {\n\t\t///when preQueries return nothing, that should not affect the ctx\n\t\treturn ctx;\n\t}\n\treturn {\n\t\t...ctx,\n\t\tbql: { ...ctx.bql, enriched: event.data },\n\t};\n};\n\nconst updateThingsEdges = (ctx: MachineContext, event: any) => {\n\treturn {\n\t\t...ctx,\n\t\tbql: {\n\t\t\t...ctx.bql,\n\t\t\tthings: event.data.mergedThings,\n\t\t\tedges: event.data.mergedEdges,\n\t\t},\n\t};\n};\n\nconst updateBQLFlat = (ctx: MachineContext, event: any) => {\n\treturn {\n\t\t...ctx,\n\t\tbql: {\n\t\t\t...ctx.bql,\n\t\t\tflat: event.data || 'test',\n\t\t},\n\t};\n};\n\nconst updateBQLRes = (ctx: MachineContext, event: any) => {\n\treturn {\n\t\t...ctx,\n\t\tbql: {\n\t\t\t...ctx.bql,\n\t\t\tres: event.data,\n\t\t},\n\t};\n};\n\n// Actors\n// ============================================================================\n\nconst enrich = async (ctx: MachineContext) => {\n\tlogDebug(\n\t\t`>>> mutationMachine/enrich[${VERSION}]`,\n\t\tJSON.stringify(Object.keys(ctx.bql.enriched).length ? ctx.bql.enriched : ctx.bql.raw),\n\t);\n\tconst enriched = Object.keys(ctx.bql.enriched).length\n\t\t? enrichBQLMutation(ctx.bql.enriched, ctx.schema, ctx.config)\n\t\t: enrichBQLMutation(ctx.bql.raw, ctx.schema, ctx.config);\n\treturn enriched;\n};\n\nconst preQuery = async (ctx: MachineContext) => {\n\tlogDebug(`>>> mutationMachine/preQuery[${VERSION}]`, JSON.stringify(ctx.bql.enriched));\n\treturn mutationPreQuery(ctx.bql.enriched, ctx.schema, ctx.config, ctx.handles);\n};\n\nconst preQueryDependencies = async (ctx: MachineContext) => {\n\tlogDebug(`>>> mutationMachine/preQueryDependencies[${VERSION}]`, JSON.stringify(ctx.bql.enriched));\n\treturn preHookDependencies(ctx.bql.enriched, ctx.schema, ctx.config, ctx.handles);\n};\n\nconst parseBQL = async (ctx: MachineContext) => {\n\tlogDebug(`>>> mutationMachine/parseBQL[${VERSION}]`, JSON.stringify(ctx.bql.enriched));\n\treturn parseBQLMutation(ctx.bql.enriched, ctx.schema);\n};\n\nconst flattenBQL = async (ctx: MachineContext) => {\n\tlogDebug(`>>> mutationMachine/flattenBQL[${VERSION}]`, JSON.stringify(ctx.bql.enriched));\n\treturn flattenBQLMutation(ctx.bql.enriched, ctx.schema);\n};\n\n// Guards\n// ============================================================================\nconst requiresPreQuery = (ctx: MachineContext) => {\n\tconst { dbConnectors } = ctx.config;\n\tif (dbConnectors.length !== 1) {\n\t\tthrow new Error('Multiple providers not supported yet in mutations');\n\t}\n\tconst [{ provider }] = dbConnectors;\n\n\tif (provider === 'typeDB') {\n\t\treturn true;\n\t}\n\tif (provider === 'surrealDB') {\n\t\treturn false;\n\t}\n\tthrow new Error(`Unsupported provider ${provider}.`);\n};\n\nconst requiresPreHookDependencies = (ctx: MachineContext) => {\n\treturn dependenciesGuard(ctx.bql.enriched);\n};\n\n// Transitions\n// ============================================================================\n\nconst errorTransition = transition(\n\t'error',\n\t'error',\n\treduce((ctx: MachineContext, event: any) => {\n\t\treturn {\n\t\t\t...ctx,\n\t\t\terror: event.error,\n\t\t};\n\t}),\n);\n\nexport const machine = createMachine(\n\t'stringify',\n\t{\n\t\tstringify: invoke(\n\t\t\tasync (ctx: MachineContext) => {\n\t\t\t\tlogDebug(`>>> mutationMachine/stringify[${VERSION}]`, JSON.stringify(ctx.bql.raw));\n\t\t\t\treturn stringify(ctx.bql.raw, ctx.schema);\n\t\t\t},\n\t\t\ttransition('done', 'enrich', reduce(updateBqlReq)),\n\t\t\terrorTransition,\n\t\t),\n\t\tenrich: invoke(\n\t\t\tenrich,\n\t\t\ttransition('done', 'preQuery', guard(requiresPreQuery), reduce(updateBqlReq)),\n\t\t\ttransition('done', 'parseBQL', reduce(updateBqlReq)),\n\t\t\terrorTransition,\n\t\t),\n\t\tpreQuery: invoke(\n\t\t\tpreQuery,\n\t\t\ttransition('done', 'preHookDependencies', guard(requiresPreHookDependencies), reduce(updateBqlReq)),\n\t\t\ttransition('done', 'parseBQL', reduce(updateBqlReq)),\n\t\t\terrorTransition,\n\t\t),\n\t\tpreHookDependencies: invoke(\n\t\t\tpreQueryDependencies,\n\t\t\ttransition('done', 'enrich', reduce(updateBqlReq)),\n\t\t\terrorTransition,\n\t\t),\n\t\tparseBQL: invoke(parseBQL, transition('done', 'flattenBQL', reduce(updateThingsEdges)), errorTransition),\n\t\tflattenBQL: invoke(flattenBQL, transition('done', 'adapter', reduce(updateBQLFlat)), errorTransition),\n\t\tadapter: invoke(\n\t\t\tasync (ctx: MachineContext) => {\n\t\t\t\tlogDebug(\n\t\t\t\t\t`>>> mutationMachine/adapter[${VERSION}]`,\n\t\t\t\t\tJSON.stringify({ enriched: ctx.bql.enriched, flat: ctx.bql.flat }),\n\t\t\t\t);\n\t\t\t\t//todo: do this properly with multiple providers\n\t\t\t\tconst { dbConnectors } = ctx.config;\n\t\t\t\tif (dbConnectors.length !== 1) {\n\t\t\t\t\tthrow new Error('Multiple providers not supported yet in mutations');\n\t\t\t\t}\n\t\t\t\tconst [{ provider }] = dbConnectors;\n\n\t\t\t\tif (provider === 'typeDB') {\n\t\t\t\t\treturn runTypeDbMutationMachine(\n\t\t\t\t\t\tctx.bql.raw,\n\t\t\t\t\t\tctx.bql.enriched,\n\t\t\t\t\t\tctx.bql.things,\n\t\t\t\t\t\tctx.bql.edges,\n\t\t\t\t\t\tctx.schema,\n\t\t\t\t\t\tctx.config,\n\t\t\t\t\t\tctx.handles,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (provider === 'surrealDB') {\n\t\t\t\t\t//console.log('things!', ctx.bql.flat.things);\n\t\t\t\t\t//console.log('edges!', ctx.bql.flat.edges);\n\t\t\t\t\treturn runSurrealDbMutationMachine(\n\t\t\t\t\t\tctx.bql.raw,\n\t\t\t\t\t\tctx.bql.enriched,\n\t\t\t\t\t\tctx.bql.flat,\n\t\t\t\t\t\tctx.schema,\n\t\t\t\t\t\tctx.config,\n\t\t\t\t\t\tctx.handles,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthrow new Error(`Unsupported provider ${provider}.`);\n\t\t\t},\n\t\t\ttransition('done', 'success', reduce(updateBQLRes)),\n\t\t\terrorTransition,\n\t\t),\n\t\tsuccess: final(),\n\t\terror: final(),\n\t},\n\t(ctx: MachineContext) => ctx,\n);\n\nexport const awaitMachine = async (context: MachineContext) => {\n\treturn new Promise<MachineContext>((resolve, reject) => {\n\t\tinterpret(\n\t\t\tmachine,\n\t\t\t(service) => {\n\t\t\t\tif (service.machine.state.name === 'success') {\n\t\t\t\t\tresolve(service.context);\n\t\t\t\t}\n\t\t\t\tif (service.machine.state.name === 'error') {\n\t\t\t\t\treject(service.context);\n\t\t\t\t}\n\t\t\t},\n\t\t\tcontext,\n\t\t);\n\t});\n};\n\nexport const runMutationMachine = async (\n\tmutation: BQLMutation,\n\tschema: EnrichedBormSchema,\n\tconfig: BormConfig,\n\thandles: DBHandles,\n) => {\n\treturn awaitMachine({\n\t\tbql: {\n\t\t\traw: mutation,\n\t\t\tenriched: {} as EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[],\n\t\t\tthings: [],\n\t\t\tedges: [],\n\t\t\tflat: {\n\t\t\t\tthings: [],\n\t\t\t\tedges: [],\n\t\t\t\tarcs: [],\n\t\t\t\treferences: [],\n\t\t\t},\n\t\t\tres: [],\n\t\t},\n\t\tschema: schema as EnrichedBormSchema,\n\t\tconfig: config,\n\t\thandles: handles,\n\t\tdepthLevel: 0,\n\t\terror: null,\n\t});\n};\n","import type { QueryParameters, QueryResult } from 'surrealdb';\nimport Surreal, { ConnectionStatus } from 'surrealdb';\n\nconst QUEUE_TIMEOUT = 5000; // The max duration a query is queued before \"Timeout\" error is thrown.\nconst QUERY_TIMEOUT = 180000; // The max duration a query is run before \"Timeout\" error is thrown.\nconst RECONNECT_INTERVAL = 2000; // Check the connection every `RECONNECT_INTERVAL` and reconnect it if it's not connected.\nconst INITIAL_RECONNECT_INTERVAL = 1000; // If it's failed to reconnect wait with exponential backoff with this initial interval and then try to reconnect again.\nconst MAX_RECONNECT_RETRY_INTERVAL = 60000; // If the reconnection failed wait with exponential backoff with this max interval and then try to reconnect again.\n\nclass SurrealClient {\n\tprivate db: Surreal;\n\tprivate url: string;\n\tprivate username: string;\n\tprivate password: string;\n\tprivate namespace: string;\n\tprivate database: string;\n\tprivate isConnecting: boolean;\n\tprivate reconnectInterval: ReturnType<typeof setInterval> | null;\n\n\tconstructor(params: { url: string; username: string; password: string; namespace: string; database: string }) {\n\t\tthis.db = new Surreal();\n\t\tthis.url = params.url;\n\t\tthis.username = params.username;\n\t\tthis.password = params.password;\n\t\tthis.namespace = params.namespace;\n\t\tthis.database = params.database;\n\t\tthis.isConnecting = false;\n\t\tthis.reconnectInterval = null;\n\t}\n\n\tprivate async _connect() {\n\t\tif (\n\t\t\tthis.isConnecting ||\n\t\t\tthis.db.status === ConnectionStatus.Connecting ||\n\t\t\tthis.db.status === ConnectionStatus.Connected\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tthis.isConnecting = true;\n\t\tthis.db = new Surreal();\n\t\tlet retryTimeout = Math.max(INITIAL_RECONNECT_INTERVAL, 1);\n\t\t// eslint-disable-next-line no-constant-condition\n\t\twhile (true) {\n\t\t\tlet failed = false;\n\t\t\ttry {\n\t\t\t\tawait this.db.connect(this.url, {\n\t\t\t\t\tnamespace: this.namespace,\n\t\t\t\t\tdatabase: this.database,\n\t\t\t\t\tauth: {\n\t\t\t\t\t\tusername: this.username,\n\t\t\t\t\t\tpassword: this.password,\n\t\t\t\t\t},\n\t\t\t\t\tversionCheck: false,\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t} catch (e) {\n\t\t\t\tfailed = true;\n\t\t\t\tawait this.close();\n\t\t\t\tif (this.isClosed) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (failed) {\n\t\t\t\tawait sleep((1 + Math.random() * 0.1) * retryTimeout);\n\t\t\t\tretryTimeout = Math.min(2 * retryTimeout, MAX_RECONNECT_RETRY_INTERVAL);\n\t\t\t\tawait this._connect();\n\t\t\t}\n\t\t}\n\t\tthis.isConnecting = false;\n\t}\n\n\tasync connect() {\n\t\tif (this.isClosed) {\n\t\t\tthis.reconnectInterval = setInterval(() => this._connect(), RECONNECT_INTERVAL);\n\t\t}\n\t\treturn this._connect();\n\t}\n\n\tasync close() {\n\t\tif (this.reconnectInterval !== null) {\n\t\t\tclearInterval(this.reconnectInterval);\n\t\t\tthis.reconnectInterval = null;\n\t\t\ttry {\n\t\t\t\tawait this.db.close();\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error('Trying to close an already closed connection:', e);\n\t\t\t}\n\t\t}\n\t}\n\n\tget isClosed() {\n\t\treturn this.reconnectInterval === null;\n\t}\n\n\tprivate async run<T>(cb: (db: Surreal) => Promise<T>): Promise<T> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\tthis.close();\n\t\t\t\tthis.connect();\n\t\t\t\treject(new Error('Timeout'));\n\t\t\t}, QUERY_TIMEOUT);\n\t\t\tthis.connect()\n\t\t\t\t.then(() => {\n\t\t\t\t\tcb(this.db)\n\t\t\t\t\t\t.then(resolve)\n\t\t\t\t\t\t.catch(reject)\n\t\t\t\t\t\t.finally(() => {\n\t\t\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t\t.catch(reject);\n\t\t});\n\t}\n\n\tasync query<T = unknown>(...args: QueryParameters): Promise<T[]> {\n\t\treturn this.run((db) => {\n\t\t\treturn db.query(...args);\n\t\t});\n\t}\n\n\tasync query_raw<T = unknown>(...args: QueryParameters): Promise<QueryResult<T>[]> {\n\t\treturn this.run((db) => {\n\t\t\treturn db.query_raw(...args);\n\t\t});\n\t}\n}\n\nconst sleep = async (timeout: number) => {\n\treturn new Promise((resolve) => {\n\t\tsetTimeout(resolve, timeout);\n\t});\n};\n\ninterface QueueItem {\n\tcb: (err?: any, client?: SurrealClient) => void;\n\ttimeout: () => boolean;\n}\n\nexport class SurrealPool {\n\tprivate queue: QueueItem[]; // TODO: Make this more sophisticated\n\tprivate connections: SurrealClient[]; // TODO: Make this more sophisticated\n\n\tconstructor(params: {\n\t\turl: string;\n\t\tusername: string;\n\t\tpassword: string;\n\t\tnamespace: string;\n\t\tdatabase: string;\n\t\ttotalConnections: number;\n\t}) {\n\t\tconst { totalConnections, ...clientParams } = params;\n\t\tthis.queue = [];\n\t\tthis.connections = new Array(totalConnections).fill(0).map(() => {\n\t\t\tconst client = new SurrealClient(clientParams);\n\t\t\tclient.connect();\n\t\t\treturn client;\n\t\t});\n\t}\n\n\tprivate async dequeue() {\n\t\tif (this.queue.length === 0 || this.connections.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tconst q = this.queue[0] as QueueItem;\n\t\tthis.queue = this.queue.slice(1);\n\t\tif (q.timeout()) {\n\t\t\tq.cb(new Error('Timeout'), undefined);\n\t\t\tthis.dequeue();\n\t\t\treturn;\n\t\t}\n\n\t\tconst con = this.connections.pop() as SurrealClient;\n\n\t\ttry {\n\t\t\tq.cb(undefined, con);\n\t\t} catch (err) {\n\t\t\tq.cb(err, undefined);\n\t\t} finally {\n\t\t\tthis.connections.push(con);\n\t\t\tthis.dequeue();\n\t\t}\n\t}\n\n\tprivate async run<T>(cb: (err?: any, client?: SurrealClient) => Promise<T>): Promise<T> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet isTimeout = false;\n\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\tisTimeout = true;\n\t\t\t\treject(new Error('Timeout'));\n\t\t\t}, QUEUE_TIMEOUT);\n\t\t\tthis.queue.push({\n\t\t\t\tcb: (err, client) => {\n\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\tcb(err, client)\n\t\t\t\t\t\t.then((res) => resolve(res))\n\t\t\t\t\t\t.catch((e) => reject(e));\n\t\t\t\t},\n\t\t\t\ttimeout: () => isTimeout,\n\t\t\t});\n\t\t\tthis.dequeue();\n\t\t});\n\t}\n\n\tasync query<T = unknown>(...args: QueryParameters): Promise<T[]> {\n\t\treturn this.run((err, client) => {\n\t\t\tif (client) {\n\t\t\t\treturn client.query<T>(...args);\n\t\t\t}\n\t\t\tthrow err;\n\t\t});\n\t}\n\n\tasync query_raw<T = unknown>(...args: QueryParameters): Promise<QueryResult<T>[]> {\n\t\treturn this.run((err, client) => {\n\t\t\tif (client) {\n\t\t\t\treturn client.query_raw<T>(...args);\n\t\t\t}\n\t\t\tthrow err;\n\t\t});\n\t}\n}\n\nexport class SimpleSurrealClient {\n\tprivate url: string;\n\tprivate username: string;\n\tprivate password: string;\n\tprivate namespace: string;\n\tprivate database: string;\n\n\tconstructor(params: { url: string; username: string; password: string; namespace: string; database: string }) {\n\t\tthis.url = params.url;\n\t\tthis.username = params.username;\n\t\tthis.password = params.password;\n\t\tthis.namespace = params.namespace;\n\t\tthis.database = params.database;\n\t}\n\n\tprivate async run<T>(cb: (db: Surreal) => Promise<T>): Promise<T> {\n\t\tconst db = new Surreal();\n\t\ttry {\n\t\t\tawait db.connect(this.url, {\n\t\t\t\tnamespace: this.namespace,\n\t\t\t\tdatabase: this.database,\n\t\t\t\tauth: {\n\t\t\t\t\tusername: this.username,\n\t\t\t\t\tpassword: this.password,\n\t\t\t\t},\n\t\t\t\tversionCheck: false,\n\t\t\t});\n\t\t\treturn await cb(db);\n\t\t} finally {\n\t\t\tawait db.close();\n\t\t}\n\t}\n\n\tasync query<T = unknown>(...args: QueryParameters): Promise<T[]> {\n\t\treturn this.run<T[]>((db) => db.query(...args));\n\t}\n\n\tasync query_raw<T = unknown>(...args: QueryParameters): Promise<QueryResult<T>[]> {\n\t\treturn this.run<QueryResult<T>[]>((db) => db.query_raw(...args));\n\t}\n}\n","import { tryit } from 'radash';\nimport { TypeDB, SessionType, TypeDBCredential } from 'typedb-driver';\n\nimport { defaultConfig } from './default.config';\nimport { bormDefine } from './define';\nimport { enrichSchema } from './helpers';\nimport type {\n\tAllDbHandles,\n\tBQLMutation,\n\tBQLResponse,\n\tBQLResponseMulti,\n\tBormConfig,\n\tBormSchema,\n\tDBHandles,\n\tEnrichedBormSchema,\n\tMutationConfig,\n\tQueryConfig,\n\tRawBQLQuery,\n} from './types';\nimport { enableMapSet } from 'immer';\nimport { runMutationMachine } from './stateMachine/mutation/mutationMachine';\nimport { runQueryMachine } from './stateMachine/query/queryMachine';\nimport { SimpleSurrealClient } from './adapters/surrealDB/client';\n\nexport * from './types';\n\ntype BormProps = {\n\tschema: BormSchema;\n\tconfig: BormConfig;\n};\n\n/// Global config\n// immer\nenableMapSet();\n\nclass BormClient {\n\tprivate schema: BormSchema;\n\n\tprivate config: BormConfig;\n\n\tprivate dbHandles?: DBHandles;\n\n\tconstructor({ schema, config }: BormProps) {\n\t\tthis.schema = schema;\n\t\tthis.config = config;\n\t}\n\tgetDbHandles = () => this.dbHandles;\n\n\tinit = async () => {\n\t\tconst dbHandles: AllDbHandles = { typeDB: new Map(), surrealDB: new Map() };\n\t\tawait Promise.all(\n\t\t\tthis.config.dbConnectors.map(async (dbc) => {\n\t\t\t\tif (dbc.provider === 'surrealDB') {\n\t\t\t\t\tconst client = new SimpleSurrealClient({\n\t\t\t\t\t\turl: dbc.url,\n\t\t\t\t\t\tusername: dbc.username,\n\t\t\t\t\t\tpassword: dbc.password,\n\t\t\t\t\t\tnamespace: dbc.namespace,\n\t\t\t\t\t\tdatabase: dbc.dbName,\n\t\t\t\t\t});\n\t\t\t\t\t// const pool = new SurrealPool({\n\t\t\t\t\t// \turl: dbc.url,\n\t\t\t\t\t// \tusername: dbc.username,\n\t\t\t\t\t// \tpassword: dbc.password,\n\t\t\t\t\t// \tnamespace: dbc.namespace,\n\t\t\t\t\t// \tdatabase: dbc.dbName,\n\t\t\t\t\t// \ttotalConnections: 8,\n\t\t\t\t\t// });\n\t\t\t\t\tdbHandles.surrealDB.set(dbc.id, { client, providerConfig: dbc.providerConfig });\n\t\t\t\t}\n\t\t\t\tif (dbc.provider === 'typeDB' && dbc.dbName) {\n\t\t\t\t\t// const client = await TypeDB.coreClient(dbc.url);\n\t\t\t\t\t// const clientErr = undefined;\n\t\t\t\t\tconst [clientErr, client] = await tryit(TypeDB.coreDriver)(dbc.url);\n\t\t\t\t\tif (clientErr) {\n\t\t\t\t\t\tconst message = `[BORM:${dbc.provider}:${dbc.dbName}:core] ${\n\t\t\t\t\t\t\t// clientErr.messageTemplate?._messageBody() ?? \"Can't create TypeDB Client\"\n\t\t\t\t\t\t\tclientErr.message ?? \"Can't create TypeDB Client\"\n\t\t\t\t\t\t}`;\n\t\t\t\t\t\tthrow new Error(message);\n\t\t\t\t\t}\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst session = await client.session(dbc.dbName, SessionType.DATA);\n\t\t\t\t\t\tdbHandles.typeDB.set(dbc.id, { client, session });\n\t\t\t\t\t} catch (sessionErr: any) {\n\t\t\t\t\t\tconst message = `[BORM:${dbc.provider}:${dbc.dbName}:session] ${\n\t\t\t\t\t\t\t// eslint-disable-next-line no-underscore-dangle\n\t\t\t\t\t\t\t(sessionErr.messageTemplate?._messageBody() || sessionErr.message) ?? \"Can't create TypeDB Session\"\n\t\t\t\t\t\t}`;\n\t\t\t\t\t\tthrow new Error(message);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (dbc.provider === 'typeDBCluster' && dbc.dbName) {\n\t\t\t\t\tconst credential = new TypeDBCredential(dbc.username, dbc.password, dbc.tlsRootCAPath);\n\t\t\t\t\tconst [clientErr, client] = await tryit(TypeDB.cloudDriver)(dbc.addresses, credential);\n\n\t\t\t\t\tif (clientErr) {\n\t\t\t\t\t\tconst message = `[BORM:${dbc.provider}:${dbc.dbName}:core] ${\n\t\t\t\t\t\t\t// clientErr.messageTemplate?._messageBody() ?? \"Can't create TypeDB Client\"\n\t\t\t\t\t\t\tclientErr.message ?? \"Can't create TypeDB Cluster Client\"\n\t\t\t\t\t\t}`;\n\t\t\t\t\t\tthrow new Error(message);\n\t\t\t\t\t}\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst session = await client.session(dbc.dbName, SessionType.DATA);\n\t\t\t\t\t\tdbHandles.typeDB.set(dbc.id, { client, session });\n\t\t\t\t\t} catch (sessionErr: any) {\n\t\t\t\t\t\tconst message = `[BORM:${dbc.provider}:${dbc.dbName}:session] ${\n\t\t\t\t\t\t\t// eslint-disable-next-line no-underscore-dangle\n\t\t\t\t\t\t\t(sessionErr.messageTemplate?._messageBody() || sessionErr.message) ?? \"Can't create TypeDB Session\"\n\t\t\t\t\t\t}`;\n\t\t\t\t\t\tthrow new Error(message);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}),\n\t\t);\n\t\tconst enrichedSchema = enrichSchema(this.schema, dbHandles);\n\n\t\tthis.schema = enrichedSchema as EnrichedBormSchema;\n\t\tthis.dbHandles = dbHandles;\n\t};\n\n\t#enforceConnection = async () => {\n\t\tif (!this.dbHandles) {\n\t\t\tawait this.init();\n\t\t\tif (!this.dbHandles) {\n\t\t\t\tthrow new Error(\"Can't init BormClient\");\n\t\t\t}\n\t\t}\n\t};\n\n\tintrospect = async () => {\n\t\tawait this.#enforceConnection();\n\t\treturn this.schema;\n\t};\n\n\tdefine = async () => {\n\t\tawait this.#enforceConnection();\n\t\tif (!this.dbHandles) {\n\t\t\tthrow new Error('dbHandles undefined');\n\t\t}\n\t\tconst schemas = await bormDefine(this.config, this.schema as EnrichedBormSchema, this.dbHandles);\n\t\treturn schemas;\n\t};\n\n\t/// no types yet, but we can do \"as ...\" after getting the type fro the schema\n\t// query = async (query: RawBQLQuery | RawBQLQuery[], queryConfig?: QueryConfig) => {\n\t// \tconst handles = this.dbHandles;\n\t// \tif (!handles) {\n\t// \t\tthrow new Error('dbHandles undefined');\n\t// \t}\n\n\t// \tawait this.#enforceConnection();\n\n\t// \tconst qConfig = {\n\t// \t\t...this.config,\n\t// \t\tquery: { ...defaultConfig.query, ...this.config.query, ...queryConfig },\n\t// \t};\n\n\t// \t// @ts-expect-error type of Query is incorrect\n\t// \treturn queryPipeline(query, qConfig, this.schema, handles);\n\t// };\n\n\tquery = async (query: RawBQLQuery | RawBQLQuery[], queryConfig?: QueryConfig) => {\n\t\tawait this.#enforceConnection();\n\n\t\tconst qConfig = {\n\t\t\t...this.config,\n\t\t\tquery: {\n\t\t\t\t...defaultConfig.query,\n\t\t\t\t...this.config.query,\n\t\t\t\t...queryConfig,\n\t\t\t},\n\t\t};\n\t\tconst isBatched = Array.isArray(query);\n\t\tconst queries = isBatched ? query : [query];\n\n\t\tconst [errorRes, res] = await tryit(runQueryMachine)(\n\t\t\tqueries,\n\t\t\tthis.schema as EnrichedBormSchema,\n\t\t\tqConfig,\n\t\t\tthis.dbHandles as DBHandles,\n\t\t);\n\t\tif (errorRes) {\n\t\t\t//@ts-expect-error - errorRes has error. Also no idea where the error: comes from\n\t\t\tconst error = new Error(errorRes.error);\n\t\t\t//@ts-expect-error - errorRes has error. Also no idea where the error: comes from\n\t\t\terror.stack = errorRes.error.stack;\n\t\t\tthrow error;\n\t\t}\n\n\t\tconst result = res.bql.res as BQLResponse[];\n\n\t\treturn isBatched ? result : result[0];\n\t};\n\n\tmutate = async (mutation: BQLMutation, mutationConfig?: MutationConfig) => {\n\t\tawait this.#enforceConnection();\n\t\tconst mConfig = {\n\t\t\t...this.config,\n\t\t\tmutation: {\n\t\t\t\t...defaultConfig.mutation,\n\t\t\t\t...this.config.mutation,\n\t\t\t\t...mutationConfig,\n\t\t\t},\n\t\t};\n\n\t\tconst [errorRes, res] = await tryit(runMutationMachine)(\n\t\t\tmutation,\n\t\t\tthis.schema as EnrichedBormSchema,\n\t\t\tmConfig,\n\t\t\tthis.dbHandles as DBHandles,\n\t\t);\n\t\tif (errorRes) {\n\t\t\t//console.error(errorRes.error.stack.split('\\n').slice(0, 4).join('\\n'));\n\t\t\t//@ts-expect-error - errorRes has error. Also no idea where the error: comes from\n\t\t\tconst error = new Error(errorRes.error.message);\n\t\t\t//@ts-expect-error - errorRes has error. Also no idea where the error: comes from\n\t\t\terror.stack = errorRes.error.stack;\n\t\t\tthrow error;\n\t\t}\n\n\t\tconst result = res.bql.res;\n\n\t\treturn result as BQLResponseMulti;\n\t};\n\n\tclose = async () => {\n\t\tif (!this.dbHandles) {\n\t\t\treturn;\n\t\t}\n\t\t//todo: probably migrate dbHandles to be an array, where each handle has .type=\"typeDB\" for instance\n\t\tthis.dbHandles.typeDB?.forEach(async ({ client, session }) => {\n\t\t\tif (session.isOpen()) {\n\t\t\t\tawait session.close();\n\t\t\t}\n\t\t\tawait client.close();\n\t\t});\n\t\t// TODO: Close SurrealDB clients.\n\t\t// Currently there's no `close()` method in the client.\n\t\t// See https://github.com/surrealdb/surrealdb.node/issues/36\n\t};\n}\n\nexport default BormClient;\n"]}