@blitznocode/blitz-orm 0.10.22 → 0.10.23

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/index.ts","../src/default.config.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/enrich.ts","../src/stateMachine/mutation/bql/enrichSteps/replaces.ts","../src/stateMachine/mutation/bql/shared/getOppositePlayers.ts","../src/stateMachine/mutation/bql/enrichSteps/rootMeta.ts","../src/stateMachine/mutation/bql/shared/validateOp.ts","../src/stateMachine/mutation/bql/shared/getOp.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/enrichSteps/computeFields.ts","../src/engine/helpers.ts","../src/engine/compute.ts","../src/stateMachine/mutation/bql/enrichSteps/preHookValidations.ts","../src/stateMachine/mutation/bql/shared/getTriggeredActions.ts","../src/stateMachine/mutation/bql/enrichSteps/preHookTransformations.ts","../src/stateMachine/mutation/bql/enrichSteps/unlinkAll.ts","../src/stateMachine/mutation/bql/guards/dependenciesGuard.ts","../src/stateMachine/mutation/tql/run.ts","../src/adapters/typeDB/helpers.ts","../src/stateMachine/mutation/tql/parse.ts","../src/stateMachine/mutation/bql/parse.ts","../tests/helpers/matchers.ts","../src/stateMachine/mutation/tql/build.ts","../src/adapters/typeDB/parseFlexVal.ts","../src/stateMachine/mutation/bql/preQuery.ts","../src/stateMachine/query/queryMachine.ts","../src/stateMachine/query/bql/clean.ts","../src/stateMachine/query/bql/enrich.ts","../src/stateMachine/query/postHook.ts","../src/stateMachine/query/surql/machine.ts","../src/stateMachine/query/surql/build.ts","../src/adapters/surrealDB/helpers.ts","../src/stateMachine/query/surql/run.ts","../src/stateMachine/query/surql/parse.ts","../src/stateMachine/query/tql/machine.ts","../src/stateMachine/query/tql/build.ts","../src/stateMachine/query/tql/parse.ts","../src/stateMachine/query/tql/run.ts","../src/stateMachine/mutation/mutationMachine.ts","../src/stateMachine/mutation/bql/stringify.ts","../src/stateMachine/mutation/bql/enrichSteps/preHookDependencies.ts"],"names":["tryit","TypeDB","SessionType","TypeDBCredential","Surreal","defaultConfig","TransactionType","removeDuplicateObjects","arr","uniqueObjects","uniqueMap","obj","dbPath","contentType","key","bormDefine","config","schema","dbHandles","typeDBString","output","usedAttributes","entityName","entity","idFields","dataFields","linkFields","name","commonDataFields","commonLinkFields","commonIdFields","parentEntity","dataField","linkField","idField","idsAsData","setIds","idFieldsString","field","usedLinkFields","relation","plays","relationName","roles","commonRoleFields","parentRelation","roleField","roleName","attributes","attribute","singleHandlerV0","session","client","dbName","schemaSession","schemaTransaction","getSchemaTransaction","conceptMap","thing","_label","_name","produce","isDraft","current","getNodeByPath","traverse","isArray","isObject","listify","mapEntries","Schema","QueryPath","StepPrint","EdgeType","EdgeSchema","DBNode","IsTransformed","FieldSchema","SharedMetadata","SuqlMetadata","adapterContext","getSurrealLinkFieldQueryPath","originalRelation","withExtensionsSchema","targetRelationSubTypes","targetRelationThings","pathToRelation","targetRole","targetRoleSubTypes","oppositeRoleThings","pathToTunneledRole","getDbPath","shared","oFind","fn","k","v","oFilter","enrichSchema","allLinkedFields","draft","value","meta","df","extendedSchema","allExtends","ext","deepExtendedThing","deepSchema","deepDf","val","extendedRelationSchema","extendedRelationSchemaWithOrigin","roleKey","role","lf","thingTypes","thingPath","withThing","x","thingType","thingDB","playedBy","$things","playerThingsWithSubTypes","playerThing","subTypes","getSchemaByThing","queryPath","linkFieldRelation","allOppositeLinkFields","playedBySet","type","thingId","draftSchema","$thing","getCurrentSchema","node","getFieldType","currentSchema","dataFieldSchema","linkFieldSchema","roleFieldSchema","getIdFieldKey","getThingType","rootNode","getFieldSchema","foundLinkField","foundDataField","foundRoleField","getCardinality","getCurrentFields","availableDataFields","availableLinkFields","availableRoleFields","availableFields","allowedFields","usedFields","localFilterFields","nestedFilterFields","unidentifiedFields","localFilters","_v","nestedFilters","capitalizeFirstLetter","string","getParentNode","blocks","parent","pathParts","parentPath","getSymbols","oldBlock","symbols","symbolKey","isBQLBlock","block","deepCurrent","item","plainObject","result","assertDefined","msg","indent","line","depth","_indent","enableMapSet","getOppositePlayers","fieldSchema","oppositePlayer","uuidv4","replaceToObj","subNodes","child","oppositePlayers","player","$op","$thingType","validateOp","parentNode","nodeSchema","usedDataFields","getOp","setRootMeta","withMetadataRootArray","rootOp","isSet","doAction","stepName","splitMultipleIds","transformedChildren","subNode","$id","i","enrichChildren","newNodes","$bzId","acorn","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","clone","getTriggeredActions","hooks","currentEvent","hook","preHookValidations","requiredFields","enumFields","fnValidatedFields","enumOptions","error","userContext","dbNode","action","validationResult","preHookTransformations","triggeredActions","newProps","unlinkAll","dependenciesGuard","mut","o","cleanStep","tempId","dataFieldStep","enrichBQLMutation","rootBlock","hasFields","paths","toIgnore","lastPath","secondToLastPath","isFilter","preValidate","cleanPath","subNodeSchema","fields","uf","usedLinkFieldsSchemas","lf1","lf2","j","getSessionOrOpenNewOne","runTQLMutation","tqlMutation","mutateTransaction","tqlDeletion","tqlInsertion","insertionsStream","insertionsRes","e","parseTQLMutation","tqlRes","reqThings","reqEdges","expected","parsed","exp","y","dbIdd","props","_","acc","f","matchedThings","z","pick","shake","deepRemoveMetaData","removeMeta","s","parseBQLMutation","listNodes","nodes","edges","getIdValue","idDataField","defaultIdField","idValue","toNodes","toEdges","edge","currentThingSchema","dataFieldPaths","roleFieldPaths","linkFieldPaths","getChildOp","usedRoleFields","dataObj","edgeSchema","ownRelation","linkTempId","parentId","getLinkObjOp","relationSchema","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","tempIds","orphanTempIds","isDate","parseFlexVal","nanoid","buildTQLMutation","things","nodeToTypeQL","bzId","defaultDBConnector","thingDbPath","currentDataField","dbField","parsedVal","attributesVar","matchAttributes","idValueTQL","idAttributes","allAttributes","getDeletionMatchInNodes","getInsertionMatchInNodes","edgeToTypeQL","relationDbPath","roleFields","roleDbPaths","fromRoleFields","roleDbPath","fromRoleFieldsTql","edgeType","relationTql","relationTqlWithoutRoles","getInsertionsInEdges","getInsertionMatchInEdges","getDeletionMatchInEdges","getDeletionsInEdges","toTypeQL","mode","typeQL","preDeletionBatch","insertionMatch","deletionMatch","insertion","deletion","nodeOperations","arrayNodeOperations","edgeOperations","arrayEdgeOperations","allOperations","createMachine","interpret","invoke","reduce","state","transition","cleanQueryRes","bqlRes","withPostHooks","queryPostHooks","cleanOutput","symbol","enrichBQLQuery","rawBqlQuery","batches","context","checkFilterByUnique","enrichFilter","newFields","processed","processField","getAllFields","isId","$filter","isIdField","isUniqueDataField","isSingle$id","createDataField","fieldStr","$justId","isVirtual","createLinkField","target","oppositeLinkFieldsPlayedBy","idNotIncluded","createRoleField","wasArray","resultArray","filter","valueAsArray","fieldType","fieldSchemaTyped","childrenThing","postHooks","enrichedBqlQuery","originalNode","queriedFields","excludedFields","virtualFieldPath","computedValue","excludedField","sanitizeTableNameSurrealDb","tableName","specialChars","prepareTableNameSurrealDB","char","build","queries","query","buildQuery","$fields","$offset","$limit","$sort","lines","fieldLines","buildFieldsQuery","allTypesNormed","$ids","allCombinations","id","parseFilter","buildSuqlFilter","buildSorter","level","parentQuery","buildFieldQuery","buildAttributeQuery","buildLinkQuery","buildRoleQuery","queryLevel","from","built","fieldLevel","surrealDBKey","entries","parts","logicalOperator","nestedFilter","operator","nextValue","sort","desc","run","batchedQuery","parse","res","parseRes","parseObj","newObj","parseFieldResult","errorTransition","ctx","event","surrealDbQueryMachine","awaitQueryMachine","resolve","reject","service","runSurrealDbQueryMachine","enrichedBql","separator","buildTQLQuery","$path","$WithIdFilter","buildFilter","sorter","randomId","processDataFields","processLinkFields","processRoleFields","postStrParts","asMetaDataParts","multiVals","postStr","$metaData","multiVal","dotPath","nextDepth","$as","$idNotIncluded","$filterByUnique","$roleVar","withId","withIdFilter","$playedBy","$linkVar","mapFilterKeys","thingSchema","mapper","$not","newFilter","mapPositiveFilterKeys","filterValue","newKey","$nonMappedFilter","$var","rest","matches","serializeValue","opposite","oppositeIdField","oppVar","playerIdField","playerVar","filterId","filterVar","alt","match","joinAlt","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","items","resDataFields","linkFieldsRes","$linkFields","str","asRegex","justIdRegex","idNotIncludedRegex","filterByUniqueRegex","asMatch","justIdMatch","idNotIncludedMatch","filterByUniqueMatch","converted","jsonString","p1","p2","parallel","TypeDBOptions","runTQLQuery","tqlRequest","options","transaction","err","resArray","queryString","updateBqlRes","updateTqlReq","updateTqlRes","typeDbQueryMachine","runTypeDbQueryMachine","bql","handles","updateBqlReq","queryMachine","adapters","q","raw","adapter","adapterList","proms","a","results","orderedResults","index","b","runQueryMachine","preQueryPathSeparator","grandChildOfCreateSymbol","mutationPreQuery","getFieldKeys","noDataFields","ops","preQueryReq","processBlock","root","filteredBlock","toRemoveFromRoot","toRemove","opBlock","newField","preQueryRes","getObjectPath","$objectPath","ids","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","_opBlock","getAllKeyCombinations","dataFieldObj","allKeys","combinableKeys","generateCombinations","currentObj","fullObj","newObjInclude","crossReferencedOperations","multipleBlock","combinationsToKeep","combinationBlock","foundKeys","childKey","subBlock","c","newOps","parentKey","idsOfParent","cKey","originalOp","processReplaces","newOpBlocks","replaceIds","createIds","replaceBlock","cardinality","cacheIds","unlinkIds","linkIds","processedReplaces","processArrayIdsFound","arrayOfIds","cacheOfIds","isOccupied","filledPaths","guard","stringify","tObject","tree","tField","oppositeThing","preHookDependencies","mutations","transformationPreQueryReq","m","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","final","updateThingsEdges","updateTQLMutation","updateTQLRes","enrich","preQuery","preQueryDependencies","parseBQL","buildMutation","runMutation","parseMutation","requiresPreQuery","requiresPreHookDependencies","machine","awaitMachine","runMutationMachine","mutation","BormClient","dbc","db","clientErr","message","sessionErr","credential","enrichedSchema","#enforceConnection","queryConfig","qConfig","isBatched","errorRes","mutationConfig","mConfig","src_default"],"mappings":"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","sourcesContent":["import { tryit } from 'radash';\nimport { TypeDB, SessionType, TypeDBCredential } from 'typedb-driver';\nimport { Surreal } from 'surrealdb.js';\n\nimport { defaultConfig } from './default.config';\nimport { bormDefine } from './define';\nimport { enrichSchema } from './helpers';\nimport type {\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';\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 = { 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 db = new Surreal();\n\n\t\t\t\t\tawait db.connect(dbc.url, {\n\t\t\t\t\t\tnamespace: dbc.namespace,\n\t\t\t\t\t\tdatabase: dbc.dbName,\n\t\t\t\t\t\tauth: {\n\t\t\t\t\t\t\tnamespace: dbc.namespace,\n\t\t\t\t\t\t\tdatabase: dbc.dbName,\n\t\t\t\t\t\t\tusername: dbc.username,\n\t\t\t\t\t\t\tpassword: dbc.password,\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\n\t\t\t\t\tdbHandles.surrealDB.set(dbc.id, { client: db });\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\treturn bormDefine(this.config, this.schema, this.dbHandles);\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 { 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';\n\nimport type { BormConfig, BormSchema, LinkField } 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 bormDefine = async (config: BormConfig, schema: BormSchema, dbHandles: any) => {\n\tconst convertSchema = () => {\n\t\tlet output = '';\n\t\tconst usedAttributes: Attribute[] = [];\n\n\t\toutput += '\\n';\n\n\t\t// CONVERTING ENTITIES\n\n\t\tObject.keys(schema.entities).forEach((entityName) => {\n\t\t\tconst entity = schema.entities[entityName];\n\t\t\t// @ts-expect-error - TODO description\n\t\t\tconst { idFields, dataFields, linkFields, name } = entity;\n\t\t\t// Checks to see if parent already contains these fields\n\t\t\tconst commonDataFields: string[] = [];\n\t\t\tconst commonLinkFields: string[] = [];\n\t\t\tconst commonIdFields: string[] = [];\n\n\t\t\t// If extended by parent, get rid of parent's declared attributes\n\t\t\tif ('extends' in entity) {\n\t\t\t\tconst parentEntity = schema.entities[entity.extends];\n\t\t\t\tif (parentEntity.dataFields) {\n\t\t\t\t\tparentEntity.dataFields.forEach((dataField: any) => {\n\t\t\t\t\t\tcommonDataFields.push(dataField.dbPath);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (parentEntity.linkFields) {\n\t\t\t\t\tparentEntity.linkFields.forEach((linkField: LinkField) => {\n\t\t\t\t\t\tcommonLinkFields.push(linkField.path);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (parentEntity.idFields) {\n\t\t\t\t\tparentEntity.idFields.forEach((idField: any) => {\n\t\t\t\t\t\tcommonIdFields.push(idField);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\toutput += `${name} sub ${'extends' in entity ? entity.extends : 'entity'},\\n`;\n\t\t\t// Removes ids from data fields, so their attributes aren't repeated\n\t\t\tconst idsAsData: string[] = [];\n\t\t\t// Adding id fields\n\t\t\tif (idFields && idFields.length > 0) {\n\t\t\t\tconst setIds = new Set(idFields);\n\t\t\t\tconst newIdFields = Array.from(setIds);\n\t\t\t\tconst idFieldsString = newIdFields.map((field: string) => `${field}`).join(', ');\n\t\t\t\tif (!commonIdFields.includes(idFieldsString)) {\n\t\t\t\t\toutput += ` owns ${idFieldsString} @key,\\n`;\n\t\t\t\t\tidsAsData.push(idFieldsString);\n\t\t\t\t}\n\t\t\t}\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 (!commonDataFields.includes(field.dbPath) && !idsAsData.includes(field.dbPath)) {\n\t\t\t\t\t\toutput += ` owns ${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 } = linkField;\n\t\t\t\t\tif (!commonLinkFields.includes(linkField.path) && !usedLinkFields.includes(`${relation}:${plays}`)) {\n\t\t\t\t\t\toutput += ` plays ${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\t// CONVERTING RELATIONS\n\t\tObject.keys(schema.relations).forEach((relationName) => {\n\t\t\tconst relation = schema.relations[relationName];\n\t\t\t// TODO: fix name ts error\n\t\t\t// @ts-expect-error - TODO description\n\t\t\tconst { idFields, dataFields, roles, name, linkFields } = relation;\n\t\t\t// Checks to see if parent already contains these fields\n\t\t\tconst commonDataFields: string[] = [];\n\t\t\tconst commonLinkFields: string[] = [];\n\t\t\tconst commonRoleFields: string[] = [];\n\t\t\tconst commonIdFields: string[] = [];\n\n\t\t\t// If extended by parent, get rid of parent's declared attributes\n\t\t\tif ('extends' in relation) {\n\t\t\t\tconst parentRelation = schema.relations[relation.extends];\n\t\t\t\tif (parentRelation.dataFields) {\n\t\t\t\t\tparentRelation.dataFields.forEach((dataField: any) => {\n\t\t\t\t\t\tcommonDataFields.push(dataField.dbPath);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (parentRelation.linkFields) {\n\t\t\t\t\tparentRelation.linkFields.forEach((linkField: any) => {\n\t\t\t\t\t\tcommonLinkFields.push(linkField.dbPath);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (parentRelation.roles) {\n\t\t\t\t\tconst roleFields = Object.values(parentRelation.roles);\n\t\t\t\t\troleFields.forEach((roleField: any) => {\n\t\t\t\t\t\tcommonRoleFields.push(roleField.name);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (parentRelation.idFields) {\n\t\t\t\t\tparentRelation.idFields.forEach((idField: any) => {\n\t\t\t\t\t\tcommonIdFields.push(idField);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\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\t\t\tconst idsAsData: string[] = [];\n\t\t\t// Adding id fields\n\t\t\tif (idFields && idFields.length > 0) {\n\t\t\t\tconst setIds = new Set(idFields);\n\t\t\t\tconst newIdFields = Array.from(setIds);\n\t\t\t\tconst idFieldsString = newIdFields.map((field: string) => `${field}`).join(', ');\n\t\t\t\tif (!commonIdFields.includes(idFieldsString)) {\n\t\t\t\t\toutput += ` owns ${idFieldsString} @key,\\n`;\n\t\t\t\t\tidsAsData.push(idFieldsString);\n\t\t\t\t}\n\t\t\t}\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 (!commonDataFields.includes(field.dbPath) && !idsAsData.includes(field.dbPath)) {\n\t\t\t\t\t\toutput += ` owns ${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 role fields\n\t\t\tif (roles) {\n\t\t\t\tObject.keys(roles).forEach((roleName) => {\n\t\t\t\t\tif (!commonRoleFields.includes(roleName)) {\n\t\t\t\t\t\toutput += ` relates ${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 } = linkField;\n\t\t\t\t\tif (!commonLinkFields.includes(linkField.path) && !usedLinkFields.includes(`${relation}:${plays}`)) {\n\t\t\t\t\t\toutput += ` plays ${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\t// DEFINING ATTRIBUTES\n\n\t\tlet attributes = 'define\\n\\n';\n\t\tconst newUsedAttributes = removeDuplicateObjects(usedAttributes);\n\n\t\tnewUsedAttributes.forEach((attribute: Attribute) => {\n\t\t\tattributes += `${attribute.dbPath} sub attribute,\\n`;\n\t\t\t// All conditions for BORM to TQL attribute types\n\t\t\tif (attribute.contentType === 'TEXT' || attribute.contentType === 'ID' || attribute.contentType === 'JSON') {\n\t\t\t\tattributes += ' value string;\\n';\n\t\t\t} else if (attribute.contentType === 'EMAIL') {\n\t\t\t\tattributes += ' value string,\\n';\n\t\t\t\tattributes +=\n\t\t\t\t\t\" regex '^(?=.{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\t} else if (attribute.contentType === 'DATE') {\n\t\t\t\tattributes += ' value datetime;\\n';\n\t\t\t} else if (attribute.contentType === 'BOOLEAN') {\n\t\t\t\tattributes += ' value boolean;\\n';\n\t\t\t} else if (attribute.contentType === 'NUMBER') {\n\t\t\t\tattributes += ' value long;\\n';\n\t\t\t} else {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Conversion of borm schema to TypeDB schema for data type \"${attribute.contentType}\" is not implemented`,\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\n\t\treturn `${attributes}\\n\\n${output}`;\n\t};\n\n\t// TYPE DB TRANSACTIONS\n\n\tconst typeDBString = convertSchema();\n\tconst singleHandlerV0 = config.dbConnectors[0].id;\n\tconst session = dbHandles.typeDB.get(singleHandlerV0)?.session;\n\tconst client = dbHandles.typeDB.get(singleHandlerV0)?.client;\n\tif (!session) {\n\t\tconsole.log('Session Status: ', 'NO SESSION');\n\t\treturn;\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\n\t// 3. Defining new schema\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\tconst getSchemaTransaction = await schemaSession.transaction(TransactionType.READ);\n\tconst getSchemaQuery = 'match $a sub thing;';\n\tconst getSchemaStream = await getSchemaTransaction.query.match(getSchemaQuery);\n\tconst schemaThings = await getSchemaStream.collect();\n\tschemaThings.forEach(async (conceptMap: any) => {\n\t\t// * Match the group as the main entity\n\t\tconst thing = conceptMap.get('a');\n\t\tconst { _label } = thing;\n\t\tconst { _name } = _label;\n\t});\n\tawait getSchemaTransaction.close();\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 } from 'radash';\nimport { SharedMetadata, SuqlMetadata } from './types/symbols';\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} 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> => Object.fromEntries(Object.entries(obj).filter(([k, v]) => fn(k as K, v))) 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\tif (key) {\n\t\t\t\t\t// * Adding dbPath of local dataFields\n\t\t\t\t\tvalue.dataFields = value.dataFields?.map((df: DataField) => ({\n\t\t\t\t\t\t...df,\n\t\t\t\t\t\tcardinality: df.cardinality || 'ONE',\n\t\t\t\t\t\tdbPath: getDbPath(key, df.path, df.shared),\n\t\t\t\t\t}));\n\t\t\t\t}\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\tdbPath: getDbPath(deepExtendedThing, df.path, df.shared),\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\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\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\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\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\t[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) => ({ ...x, ...thingTypes }));\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\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// 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// eslint-disable-next-line no-param-reassign\n\t\t\t\t\t\trole.fieldType = 'roleField';\n\t\t\t\t\t\tconst playedBy = allLinkedFields.filter((x) => x.relation === key && x.plays === roleKey) || [];\n\t\t\t\t\t\trole.playedBy = playedBy;\n\t\t\t\t\t\trole.name = roleKey;\n\t\t\t\t\t\tconst $things = [...new Set(playedBy.map((x) => x.thing))];\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\tif ($things.length > 1) {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`Not supported yet: Role ${roleKey} in ${value.name} 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 queryPath = `->\\`${originalRelation}_${roleKey}\\`->(\\`${playerThingsWithSubTypes.join('`,`')}\\`)`;\n\n\t\t\t\t\t\trole[SuqlMetadata] = {\n\t\t\t\t\t\t\tqueryPath,\n\t\t\t\t\t\t};\n\t\t\t\t\t});\n\t\t\t\t}\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\tlinkField.fieldType = 'linkField';\n\t\t\t\t\t\tconst linkFieldRelation = withExtensionsSchema.relations[linkField.relation];\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];\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\tconst allOppositeLinkFields =\n\t\t\t\t\t\t\t\tallLinkedFields.filter((x) => x.relation === linkField.relation && x.plays !== linkField.plays) || [];\n\n\t\t\t\t\t\t\t// by default, all oppositeLinkFields\n\t\t\t\t\t\t\tlinkField.oppositeLinkFieldsPlayedBy = allOppositeLinkFields;\n\n\t\t\t\t\t\t\t// We remove the target relation ones\n\t\t\t\t\t\t\tlinkField.oppositeLinkFieldsPlayedBy = linkField.oppositeLinkFieldsPlayedBy.filter(\n\t\t\t\t\t\t\t\t(x) => 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\tlinkField.$things = linkField.oppositeLinkFieldsPlayedBy.map((x) => x.thing);\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\tthrow new Error(\n\t\t\t\t\t\t\t\t\t`Not supported: 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\t// We take the original relation as its the one that holds the name of the relation in surrealDB\n\t\t\t\t\t\tconst originalRelation =\n\t\t\t\t\t\t\t// @ts-expect-error - This is fine, extensions schema is a middle state\n\t\t\t\t\t\t\tlinkFieldRelation?.roles?.[linkField.plays][SharedMetadata]?.inheritanceOrigin ?? linkField.relation;\n\t\t\t\t\t\tconst queryPath = getSurrealLinkFieldQueryPath({ linkField, originalRelation, withExtensionsSchema });\n\n\t\t\t\t\t\tlinkField[SuqlMetadata] = {\n\t\t\t\t\t\t\tqueryPath,\n\t\t\t\t\t\t};\n\t\t\t\t\t\t//#endregion\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 (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\tthrow new Error(\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\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): ['dataField' | 'linkField' | 'roleField', EnrichedDataField | EnrichedLinkField | EnrichedRoleField] => {\n\tconst dataFieldSchema = currentSchema.dataFields?.find((dataField: any) => dataField.path === key);\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 => {\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\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};\n\ntype ReturnTypeWithNode = ReturnTypeWithoutNode & {\n\tusedFields: string[];\n\tusedRoleFields: string[];\n\tusedLinkFields: string[];\n\tusedDataFields: 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 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];\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!\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\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\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","export 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');\n\nexport const DBNode = Symbol.for('dbNode');\nexport const IsTransformed = Symbol.for('isTransformed');\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","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}: {\n\tlinkField: EnrichedLinkField;\n\toriginalRelation: string;\n\twithExtensionsSchema: BormSchema;\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\treturn pathToRelation; //Not original relation in the second, but all the potential targets\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\treturn `${pathToRelation}${pathToTunneledRole}`;\n\t} else {\n\t\tthrow new Error('Unsupported linkField target');\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 } 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';\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\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 hasFields = dependenciesGuard(Array.isArray(blocks) ? blocks : [blocks]);\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\t\t\tif (isObject(value)) {\n\t\t\t\tconst paths = meta.nodePath?.split('.') || [];\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 (!toIgnore.includes(lastPath) && !toIgnore.includes(secondToLastPath)) {\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\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\t\t\t\t\tconst fieldSchema =\n\t\t\t\t\t\tfield !== '$root' ? getFieldSchema(schema, node, field) : ({ 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///2.DATAFIELD STEP\n\t\t\t\t\tif ('contentType' in fieldSchema) {\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\n\t\t\t\t\tif (['rootField', 'linkField', 'roleField'].includes(fieldSchema.fieldType)) {\n\t\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\t/// 3.2.1 replaces\n\t\t\t\t\t\tif (['linkField', 'roleField'].includes(fieldSchema.fieldType)) {\n\t\t\t\t\t\t\tif (node[field] === null) {\n\t\t\t\t\t\t\t\tunlinkAll(node, field, fieldSchema);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\treplaceToObj(node, field, fieldSchema);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t//3.2.2 root $thing\n\t\t\t\t\t\tif (fieldSchema.fieldType === 'rootField') {\n\t\t\t\t\t\t\tif (!('$root' in node)) {\n\t\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\t}\n\t\t\t\t\t\t\tconst rootNode = node as unknown as { $root: BQLMutationBlock | BQLMutationBlock[] };\n\t\t\t\t\t\t\tsetRootMeta(rootNode, schema);\n\t\t\t\t\t\t}\n\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\tconst preValidate = isArray(node[field]) ? node[field] : [node[field]];\n\n\t\t\t\t\t\tconst cleanPath = paths.slice(1).join('.');\n\t\t\t\t\t\tpreValidate.forEach((subNode: BQLMutationBlock) => {\n\t\t\t\t\t\t\tif (!subNode) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t/// For cardinality ONE, we need to specify the $op of the children\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tfieldSchema?.cardinality === 'ONE' &&\n\t\t\t\t\t\t\t\t!subNode.$op &&\n\t\t\t\t\t\t\t\t!subNode.$id &&\n\t\t\t\t\t\t\t\t!subNode.$filter &&\n\t\t\t\t\t\t\t\t!subNode.$tempId &&\n\t\t\t\t\t\t\t\tnode.$op !== 'create'\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tthrow new Error(`Please specify if it is a create or an update. Path: ${cleanPath}.${field}`);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (subNode.$tempId) {\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t!(\n\t\t\t\t\t\t\t\t\t\tsubNode.$op === undefined ||\n\t\t\t\t\t\t\t\t\t\tsubNode.$op === 'link' ||\n\t\t\t\t\t\t\t\t\t\tsubNode.$op === 'create' ||\n\t\t\t\t\t\t\t\t\t\tsubNode.$op === 'update'\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\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t\t`Invalid op ${subNode.$op} for tempId. TempIds can be created, or when created in another part of the same mutation. In the future maybe we can use them to catch stuff in the DB as well and group them under the same tempId.`,\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/// 3.2.4 children enrichment\n\t\t\t\t\t\t//redefining childrenArray as it might have changed\n\t\t\t\t\t\tif (['linkField', 'roleField'].includes(fieldSchema.fieldType)) {\n\t\t\t\t\t\t\tenrichChildren(node, field, fieldSchema, schema);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t//3.2.5 splitIds()\n\t\t\t\t\t\tsplitMultipleIds(node, field, schema);\n\n\t\t\t\t\t\t/// 3.2.6 Field computes\n\t\t\t\t\t\tif (['rootField', 'linkField', 'roleField'].includes(fieldSchema.fieldType)) {\n\t\t\t\t\t\t\tcomputeFields(node, field, schema);\n\t\t\t\t\t\t}\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\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 (!hasFields) {\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 { isArray } from 'radash';\nimport type { BQLMutationBlock, EnrichedLinkField, EnrichedRoleField } from '../../../../types';\nimport { getOppositePlayers } from '../shared/getOppositePlayers';\nimport { v4 as uuidv4 } from 'uuid';\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\t\tif (subNodes.some((child: unknown) => (child as string).startsWith('_:'))) {\n\t\t\tthrow new Error('[Not supported] At least one child of a replace is a tempId');\n\t\t}\n\n\t\t// eslint-disable-next-line no-param-reassign\n\t\tnode[field] = {\n\t\t\t$id: node[field],\n\t\t\t$op,\n\t\t\t$thing,\n\t\t\t$thingType,\n\t\t\t$bzId: `S_${uuidv4()}`,\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","import type { EnrichedLinkField, EnrichedRoleField } from '../../../../types';\n\nexport const getOppositePlayers = (field: string, fieldSchema: EnrichedLinkField | EnrichedRoleField) => {\n\tif (fieldSchema.fieldType === 'linkField') {\n\t\tconst oppositePlayer = fieldSchema.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.fieldType === 'roleField') {\n\t\tif ([...new Set(fieldSchema.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 (!fieldSchema.playedBy?.length) {\n\t\t\tthrow new Error(`[Internal] Field ${field} should have a player`);\n\t\t}\n\t\treturn fieldSchema.playedBy;\n\t} else {\n\t\tthrow new Error(`[Internal] Field ${field} is not a linkField or roleField`);\n\t}\n};\n","import { isArray } from 'radash';\nimport type { BQLMutationBlock, EnrichedBormSchema } from '../../../../types';\nimport { getOp } from '../shared/getOp';\nimport { v4 as uuidv4 } from 'uuid';\nimport { 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 = getOp(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_${uuidv4()}` }),\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 { getCurrentSchema, getCurrentFields } from '../../../../helpers';\nimport type { BQLMutationBlock, EnrichedBormSchema, BormOperation } from '../../../../types';\n\nexport const validateOp = (parentNode: BQLMutationBlock, node: BQLMutationBlock, schema: EnrichedBormSchema) => {\n\tconst nodeSchema = getCurrentSchema(schema, node);\n\tconst { usedDataFields } = getCurrentFields(nodeSchema, node);\n\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\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","import { getCurrentSchema, getCurrentFields } from '../../../../helpers';\nimport type { BQLMutationBlock, EnrichedBormSchema, BormOperation } from '../../../../types';\nimport { validateOp } from './validateOp';\n\nexport const getOp = (\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, 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 > 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 } from 'radash';\nimport type {\n\tBQLMutationBlock,\n\tEnrichedBormSchema,\n\tEnrichedBQLMutationBlock,\n\tEnrichedLinkField,\n\tEnrichedRoleField,\n} from '../../../../types';\nimport { EdgeSchema } from '../../../../types/symbols';\nimport { getOp } from '../shared/getOp';\nimport { v4 as uuidv4 } from 'uuid';\nimport { getOppositePlayers } from '../shared/getOppositePlayers';\n\nexport const enrichChildren = (\n\tnode: BQLMutationBlock,\n\tfield: string,\n\tfieldSchema: EnrichedLinkField | EnrichedRoleField,\n\tschema: EnrichedBormSchema,\n) => {\n\tconst newNodes = (isArray(node[field]) ? node[field] : [node[field]]).map((subNode: EnrichedBQLMutationBlock) => {\n\t\t///symbols\n\t\t//#region nested nodes\n\t\tconst oppositePlayers = getOppositePlayers(field, fieldSchema);\n\t\tconst [player] = oppositePlayers;\n\n\t\tconst $op = getOp(node, { ...subNode, $thing: player.thing, $thingType: player.thingType }, schema);\n\t\tconst $bzId = subNode.$bzId ? subNode.$bzId : subNode.$tempId ? subNode.$tempId : `N_${uuidv4()}`;\n\n\t\tif (!fieldSchema) {\n\t\t\tthrow new Error(`[Internal] No fieldSchema found in ${JSON.stringify(fieldSchema)}`);\n\t\t}\n\t\treturn {\n\t\t\t...subNode,\n\t\t\t[EdgeSchema]: fieldSchema,\n\t\t\t$thing: player.thing,\n\t\t\t$thingType: player.thingType,\n\t\t\t$op,\n\t\t\t$bzId,\n\t\t};\n\n\t\t//#endregion nested nodes\n\t});\n\n\tnode[field] = isArray(node[field]) ? newNodes : newNodes[0];\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\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.$op === 'create' && !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};\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\tconst computedValue = 'default' in fieldSchema ? fieldSchema.default?.fn(currentThing) : undefined;\n\treturn computedValue;\n};\n\nexport const computeNode = () => {};\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\t// @ts-expect-error - TODO\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\t//@ts-expect-error - TODO\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","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 } 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 newNodes = (isArray(node[field]) ? node[field] : [node[field]]).map((subNode: EnrichedBQLMutationBlock) => {\n\t\t// Step 1: Default node attributes\n\n\t\t// Step 2: Transform nodes\n\t\tif (isBQLBlock(subNode)) {\n\t\t\t// @ts-expect-error todo\n\t\t\tif (subNode.$fields || subNode[IsTransformed]) {\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 triggeredActions = getTriggeredActions(subNode, schema).filter(\n\t\t\t\t(action) => action.type === 'transform',\n\t\t\t) as TransFormAction[];\n\n\t\t\tconst parentNode = clone(deepCurrent(node)) as EnrichedBQLMutationBlock;\n\t\t\tconst currentNode = clone(deepCurrent(subNode)) as EnrichedBQLMutationBlock;\n\t\t\tconst userContext = (config.mutation?.context || {}) as Record<string, any>;\n\t\t\tconst dbNode = clone(\n\t\t\t\tdeepCurrent<EnrichedBQLMutationBlock | Record<string, never>>(subNode[DBNode] || subNode.$dbNode),\n\t\t\t) as EnrichedBQLMutationBlock | Record<string, never>;\n\n\t\t\ttriggeredActions.forEach((action) => {\n\t\t\t\t//! Todo: Sandbox the function in computeFunction()\n\t\t\t\tconst newProps = action.fn(currentNode, parentNode, userContext, dbNode || {});\n\t\t\t\tif (Object.keys(newProps).length === 0) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// eslint-disable-next-line no-param-reassign\n\t\t\t\tsubNode = { ...currentNode, ...newProps, ...getSymbols(subNode), [IsTransformed]: true };\n\t\t\t});\n\n\t\t\treturn subNode;\n\t\t}\n\t\t//#endregion nested nodes\n\t});\n\n\tnode[field] = isArray(node[field]) ? newNodes : newNodes[0];\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","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 { 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","/* 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 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 } 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\t\t\t\tif (edges.find((x) => x.$bzId === node.$bzId)) {\n\t\t\t\t\tthrow new Error(`Duplicate $bzId ${node.$bzId} for node ${JSON.stringify(node)}`);\n\t\t\t\t}\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)) {\n\t\t\t\t\t// throw new Error(`Duplicate id ${idValue} for edge ${JSON.stringify(edge)}`);\n\t\t\t\t}\n\t\t\t\tif (edges.find((x) => x.$bzId === edge.$bzId)) {\n\t\t\t\t\tthrow new Error(`Duplicate %bzId ${edge.$bzIdd} 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\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');\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?.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.relation === value.$thing;\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\tthrow new Error('Unsupported: Nested replaces not implemented yet');\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: edgeSchema.relation,\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\tif (v.length > 1) {\n\t\t\t\t\t\t\t\t\t\t\tthrow new Error(`[Error] Role ${k} is not a MANY relation`);\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\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// 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/// VALIDATIONS\n\n\t// VALIDATION: Check that every thing in the list that is an edge, has at least one player\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\nconst getCommonKey = (obj1: Record<string, any>, obj2: Record<string, any>): string | undefined => {\n\tconst keys1 = Object.keys(obj1);\n\tconst keys2 = Object.keys(obj2);\n\tconst commonKeys = keys1.filter((key) => keys2.includes(key));\n\n\tconst commonKeysWithStringOrNumber = commonKeys\n\t\t.find((key) => typeof obj1[key] === 'string' || typeof obj1[key] === 'number')\n\t\t?.toString();\n\tif (commonKeysWithStringOrNumber) {\n\t\treturn commonKeysWithStringOrNumber;\n\t}\n\t// todo: skip and filter by children keys?\n\tif (commonKeys) {\n\t\tthrow new Error('Todo. Meanwhile get id of everything so you can sort by id(or other prop)');\n\t}\n\treturn undefined;\n};\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 { isArray, listify, mapEntries, shake } from 'radash';\n\nimport { getCurrentSchema, isBQLBlock } from '../../../helpers';\nimport type { EnrichedBormSchema, EnrichedBQLMutationBlock } from '../../../types';\nimport { EdgeType } from '../../../types/symbols';\nimport { parseFlexVal } from '../../../adapters/typeDB/parseFlexVal';\nimport { nanoid } from 'nanoid';\n\nexport const buildTQLMutation = async (things: any, edges: any, schema: EnrichedBormSchema) => {\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${nanoid()}`;\n\n\t\t\t\tconst parsedVal = isArray(v) ? v.map((v) => parseFlexVal(v)) : parseFlexVal(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","import { isDate } from 'radash';\n\nexport const parseFlexVal = (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","/* eslint-disable no-param-reassign */\nimport { produce } from 'immer';\nimport { traverse } from 'object-traversal';\nimport { 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 getFieldKeys = (block: FilledBQLMutationBlock | Partial<FilledBQLMutationBlock>, noDataFields?: boolean) => {\n\t\treturn Object.keys(block).filter((key) => {\n\t\t\tif (!key.startsWith('$') && 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('$') && isObject(parent)) {\n\t\t\tconst values = Array.isArray(parent[key]) ? parent[key] : [parent[key]];\n\t\t\t// @ts-expect-error todo\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 = block[k];\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\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\tconfig,\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\tconst ids = hardId ? hardId : Array.isArray($objectPath?.ids) ? `[${$objectPath?.ids}]` : $objectPath?.ids;\n\n\t\tconst final = `${root}.${ids}___${$objectPath?.key}`;\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};\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, (context) => {\n\t\t\t\tconst { key, parent } = context;\n\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\t// @ts-expect-error todo\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}\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, (context) => {\n\t\t\t\tconst { key, value, parent } = context;\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\tparent[key].$parentIsCreate = parent.$op === 'create';\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\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\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(_opBlock) => !_opBlock.$id && !_opBlock.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\totherOps.push({ ...opBlock, $bzId: opBlock.$tempId || `T_${uuidv4()}` });\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\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\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) {\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\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\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 || `T_${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];\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: { beforePath: combinationBlock.$objectPath, ids: id, key: k },\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\tcombinationBlock[k] = newBlocks;\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 || `T_${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\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\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 } = 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\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 : [])\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","import type { Surreal } from 'surrealdb.js';\nimport 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';\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: Surreal;\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) => enrichBQLQuery(ctx.bql.raw, ctx.schema),\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\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\t\t\t\t\treturn runSurrealDbQueryMachine(a.bqlQueries, ctx.schema, ctx.config, a.client);\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 { 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","/* 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} 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// 1. Moving $id into filter based on schema's idFields\n\t\t\t\tif (value.$id) {\n\t\t\t\t\t//Skip the filter branch\n\t\t\t\t\tif (meta.nodePath?.includes('.$filter')) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\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\t\t\t\t\tvalue[QueryPath as any] = meta.nodePath;\n\t\t\t\t\tconst currentSchema = getCurrentSchema(schema, node);\n\t\t\t\t\tif (value.$filter) {\n\t\t\t\t\t\tvalue.$filterByUnique = checkFilterByUnique(value.$filter, currentSchema);\n\t\t\t\t\t\tvalue.$filter = enrichFilter(value.$filter, value.$thing, schema);\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\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 allFields = [...dataFields, ...linkFields, ...roleFields];\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\tif (!Array.isArray($filter[field])) {\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($filter[field]);\n\n\t\t\treturn isIdField || isUniqueDataField || isSingle$id;\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 } : {}), ...enrichFilter(field.$filter, $thing, schema) }\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: playedBy,\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 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 } : {}), ...enrichFilter(field.$filter, thing, schema) }\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,\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\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}\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\nconst 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 {\n\t\t\t\t\t// we don't want to enrich the special keys, for instance $or: ... stays as it is but we enrich nested things:\n\t\t\t\t\tacc[key] = enrichFilter(value, $thing, schema); //$thing does not change as we are just jumping throws reserved words like $or, $eq etc\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 === 'dataField') {\n\t\t\t\t\tacc[key] = value;\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\treturn acc;\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","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\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');\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\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\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 { Surreal } from 'surrealdb.js';\nimport 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';\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: Surreal;\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) => build({ queries: ctx.bql.queries, schema: ctx.schema }),\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) });\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: Surreal,\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 type {\n\tEnrichedAttributeQuery,\n\tEnrichedBQLQuery,\n\tEnrichedBormSchema,\n\tEnrichedFieldQuery,\n\tEnrichedLinkField,\n\tEnrichedLinkQuery,\n\tEnrichedRoleField,\n\tEnrichedRoleQuery,\n\tFilter,\n} from '../../../types';\nimport { getFieldType, indent } from '../../../helpers';\nimport { FieldSchema, QueryPath, SuqlMetadata } from '../../../types/symbols';\nimport { isArray, isObject, shake } from 'radash';\nimport { prepareTableNameSurrealDB } from '../../../adapters/surrealDB/helpers';\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) => prepareTableNameSurrealDB(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('meta::id(id) as `$id`', level));\n\tlines.push(indent('meta::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\n\tif (query.$fieldType === 'data') {\n\t\treturn buildAttributeQuery({ query, level });\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(`meta::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\nconst parseFilter = (filter: Filter, currentThing: string, schema: EnrichedBormSchema): Filter => {\n\tif (filter === null || filter === undefined) {\n\t\treturn filter;\n\t}\n\tconst wasArray = isArray(filter);\n\tconst arrayFilter = wasArray ? filter : [filter];\n\n\tconst resultArray = arrayFilter.map((f) => {\n\t\tconst keys = Object.keys(f);\n\t\tconst result = keys.reduce((acc, key) => {\n\t\t\tconst value = f[key];\n\t\t\tif (key.startsWith('$')) {\n\t\t\t\tif (key === '$not') {\n\t\t\t\t\treturn { ...acc, $not: undefined, ['$!']: parseFilter(value, currentThing, schema) };\n\t\t\t\t}\n\t\t\t\tif (key === '$or') {\n\t\t\t\t\treturn { ...acc, $or: undefined, $OR: parseFilter(value, currentThing, schema) };\n\t\t\t\t}\n\t\t\t\tif (key === '$and') {\n\t\t\t\t\treturn { ...acc, $and: undefined, $AND: parseFilter(value, currentThing, schema) };\n\t\t\t\t}\n\t\t\t\tif (key === '$eq') {\n\t\t\t\t\treturn { ...acc, '$nor': undefined, '$=': parseFilter(value, currentThing, schema) };\n\t\t\t\t}\n\t\t\t\tif (key === '$id') {\n\t\t\t\t\treturn { ...acc, '$id': undefined, 'meta::id(id)': { $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 meta::tb(id) ...\n\t\t\t\t}\n\t\t\t\treturn { ...acc, [key]: parseFilter(value, currentThing, schema) };\n\t\t\t}\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\t\t\tif (fieldType === 'dataField') {\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\t\t\t\tif (key === currentSchema.idFields[0]) {\n\t\t\t\t\treturn { ...acc, 'meta::id(id)': { $IN: isArray(value) ? value : [value] } };\n\t\t\t\t}\n\t\t\t\treturn { ...acc, [key]: value }; //Probably good place to add ONLY and other stuff depending on the fieldSchema\n\t\t\t}\n\t\t\tif (fieldType === 'linkField' || fieldType === 'roleField') {\n\t\t\t\tconst fieldSchemaTyped = fieldSchema as EnrichedLinkField | EnrichedRoleField;\n\t\t\t\tconst [childrenThing] = fieldSchemaTyped.$things;\n\t\t\t\tconst surrealDBKey = fieldSchemaTyped[SuqlMetadata].queryPath;\n\n\t\t\t\treturn { ...acc, [surrealDBKey]: parseFilter(value, childrenThing, schema) };\n\t\t\t}\n\t\t\tthrow new Error(`Field ${key} not found in schema, Defined in $filter`);\n\t\t}, {});\n\t\treturn shake(result);\n\t});\n\treturn wasArray ? resultArray : resultArray[0];\n};\n\nconst buildSuqlFilter = (filter: object) => {\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//TODO: probably better to do it by key first, instead of filtering by the type of value, but it works so to refacto once needed.\n\t\tif (['$OR', '$AND', '$!'].includes(key)) {\n\t\t\tconst logicalOperator = key.replace('$', '');\n\t\t\tconst nestedFilters = Array.isArray(value) ? value.map((v) => buildSuqlFilter(v)) : [buildSuqlFilter(value)];\n\t\t\tif (logicalOperator === '!') {\n\t\t\t\tparts.push(`!(${nestedFilters.join(` ${logicalOperator} `)})`);\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\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('$')) {\n\t\t\t\tthrow new Error(`Invalid key ${key}`);\n\t\t\t} else {\n\t\t\t\tif (Object.keys.length === 1 && Object.keys(value)[0].startsWith('$')) {\n\t\t\t\t\t// This is the case where the filter has an operator manually defined\n\t\t\t\t\tconst [operator] = Object.keys(value);\n\t\t\t\t\t//@ts-expect-error its ok, single key\n\t\t\t\t\tconst nextValue = value[operator];\n\t\t\t\t\tif (isArray(nextValue)) {\n\t\t\t\t\t\tparts.push(`${key} ${operator.replace('$', '')} [${nextValue.map((v) => `'${v}'`).join(', ')}]`);\n\t\t\t\t\t} else if (isObject(nextValue)) {\n\t\t\t\t\t\tconst nestedFilter = buildSuqlFilter(nextValue);\n\t\t\t\t\t\tparts.push(`${key} ${operator.replace('$', '')} ${nestedFilter}`);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tparts.push(`${key} ${operator.replace('$', '')} '${nextValue}'`);\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\tif (Array.isArray(value)) {\n\t\t\t\tconst operator = key.startsWith('$') ? key.replace('$', '') : 'IN';\n\t\t\t\tparts.push(`${key} ${operator} [${value.map((v) => `'${v}'`).join(', ')}]`);\n\t\t\t} else {\n\t\t\t\tconst operator = key.startsWith('$') ? key.replace('$', '') : '=';\n\t\t\t\tparts.push(`${key} ${operator} '${value}'`);\n\t\t\t}\n\t\t}\n\t});\n\n\treturn parts.join(' AND ');\n};\n\nconst 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\t\tconst { field, desc } = i;\n\t\treturn `${field}${desc ? ' DESC' : ' ASC'}`;\n\t});\n\treturn `ORDER BY ${sorters.join(', ')}`;\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 prepareTableNameSurrealDB = (tableName: string) => {\n\t//if tableName includes any of the chars of this array, then wrap it in backticks\n\n\tif (specialChars.some((char) => tableName.includes(char))) {\n\t\treturn `⟨\\`${tableName}\\`⟩`;\n\t}\n\treturn tableName;\n};\n","import type { Surreal } from 'surrealdb.js';\n\nexport const run = async (props: { client: Surreal; queries: string[] }): Promise<any[][]> => {\n\tconst { client, queries } = props;\n\tconst batchedQuery = `\n\tBEGIN TRANSACTION;\n\t${queries.join(';')};\n\tCOMMIT TRANSACTION;\n\t`;\n\treturn await client.query(batchedQuery);\n};\n","import { isArray } from 'radash';\nimport type {\n\tBormConfig,\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';\n\nexport const parse = (props: {\n\tres: Record<string, any>[][];\n\tqueries: EnrichedBQLQuery[];\n\tschema: EnrichedBormSchema;\n\tconfig: BormConfig;\n}) => {\n\tconst { res, queries } = props;\n\t//console.log('res!', res);\n\tconst result = res.map((r, i) => parseRes(queries[i], r));\n\t//console.log('result', result);\n\treturn result;\n};\n\nconst parseRes = (query: EnrichedBQLQuery | EnrichedLinkQuery | EnrichedRoleQuery, res: Record<string, any>[]) => {\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]);\n\t\t\t}\n\t\t}\n\t\tif (res.length >= 1) {\n\t\t\treturn res.map((r) => parseObj(query, r));\n\t\t}\n\t} else {\n\t\tthrow new Error('res is unexpectedly not an array');\n\t}\n};\n\nconst parseObj = (query: EnrichedBQLQuery | EnrichedLinkQuery | EnrichedRoleQuery, obj: Record<string, any>) => {\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(obj['$thing']),\n\t\t$thingType: query.$thingType, //This is actually not true always, will need to be fetched from the $thing\n\t};\n\n\tquery.$fields.forEach((f) => {\n\t\t//console.log('FIELD', f.$dbPath, 'object', obj);\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);\n\t});\n\treturn newObj;\n};\n\nconst parseFieldResult = (query: EnrichedFieldQuery, value: any) => {\n\tif (value === undefined || value === null || (isArray(value) && value.length === 0)) {\n\t\treturn null;\n\t}\n\tif (query.$fieldType === 'data') {\n\t\tif (query[FieldSchema].cardinality === 'ONE') {\n\t\t\tisArray(value) ? value[0] : value;\n\t\t}\n\t\treturn value ?? null;\n\t}\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\treturn value[0]?.id ?? null;\n\t\t}\n\t\t// TODO: Look up what the id field is in the schema.\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]);\n\t\t}\n\t\treturn parseRes(query, value);\n\t}\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 { isArray, isObject } from 'radash';\nimport { getIdFieldKey, getSchemaByThing, indent } from '../../../helpers';\nimport type {\n\tEnrichedAttributeQuery,\n\tEnrichedBormEntity,\n\tEnrichedBormRelation,\n\tEnrichedBormSchema,\n\tEnrichedBQLQuery,\n\tEnrichedLinkQuery,\n\tEnrichedRoleQuery,\n} from '../../../types';\nimport type { Filter, PositiveFilter } from '../../../types/requests/queries';\nimport { FieldSchema, QueryPath } from '../../../types/symbols';\nimport { v4 as uuidv4 } from 'uuid';\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 mapFilterKeys = (filter: Filter, thingSchema: EnrichedBormEntity | EnrichedBormRelation) => {\n\t//? This does not work recursively?\n\tconst mapper: Record<string, string> = {};\n\n\tthingSchema.dataFields?.forEach((df) => {\n\t\tif (df.path !== df.dbPath) {\n\t\t\t//todo dbPath into TQLMetadata instead of a global dbPath. To be done during enrichment\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) {\n\t\tnewFilter.$not = mapPositiveFilterKeys($not as PositiveFilter, mapper);\n\t}\n\n\treturn newFilter;\n};\n\nconst mapPositiveFilterKeys = (filter: PositiveFilter, mapper: Record<string, string>) => {\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 buildFilter = (props: {\n\t$filter: Filter;\n\t$var: string;\n\t$thing: string;\n\tschema: EnrichedBormSchema;\n\tdepth: number;\n}) => {\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 thing = getSchemaByThing(schema, $thing);\n\tconst matches: string[] = [];\n\n\tObject.entries($not || {}).forEach(([key, value]) => {\n\t\tif (key.startsWith('$')) {\n\t\t\treturn; //todo: buildFilter should look similar to the surrealDB one, where we actually check the $or, $and, $not, $id, $thing etc. Aso we can split it in two step, parse to get all the keys etc, and build that only changes the format\n\t\t}\n\t\tconst df = thing.dataFields?.find((df) => df.dbPath === key);\n\t\tif (df) {\n\t\t\tif (value === null) {\n\t\t\t\tmatches.push(indent(`$${$var} has ${key} $${key}_${uuidv4()};`, depth));\n\t\t\t} else if (Array.isArray(value)) {\n\t\t\t\tvalue.forEach((v) => {\n\t\t\t\t\tmatches.push(indent(`not { $${$var} has ${key} ${serializeValue(v)}; };`, depth));\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tmatches.push(indent(`not { $${$var} has ${key} ${serializeValue(value)}; };`, depth));\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tconst lf = thing.linkFields?.find((lf) => lf.path === key);\n\t\tif (lf) {\n\t\t\tconst [opposite] = lf.oppositeLinkFieldsPlayedBy;\n\t\t\tconst oppositeThing = getSchemaByThing(schema, opposite.thing);\n\t\t\tconst oppositeIdField = oppositeThing.idFields?.[0];\n\t\t\tif (!oppositeIdField) {\n\t\t\t\tthrow new Error(`\"${opposite.thing}\" does not have an id field`);\n\t\t\t}\n\t\t\tif (lf.target === 'relation') {\n\t\t\t\tif (value === null) {\n\t\t\t\t\tmatches.push(indent(`(${lf.plays}: $${$var}) isa ${lf.relation};`, depth));\n\t\t\t\t} else if (Array.isArray(value)) {\n\t\t\t\t\tvalue.forEach((v) => {\n\t\t\t\t\t\tmatches.push(\n\t\t\t\t\t\t\tindent(\n\t\t\t\t\t\t\t\t`not { (${lf.plays}: $${$var}) isa ${lf.relation}, has ${oppositeIdField} ${serializeValue(v)}; };`,\n\t\t\t\t\t\t\t\tdepth,\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} else {\n\t\t\t\t\tmatches.push(\n\t\t\t\t\t\tindent(\n\t\t\t\t\t\t\t`not { (${lf.plays}: $${$var}) isa ${lf.relation}, has ${oppositeIdField} ${serializeValue(value)}; };`,\n\t\t\t\t\t\t\tdepth,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst oppVar = `${opposite.thing}_${uuidv4()}`;\n\t\t\t\tif (value === null) {\n\t\t\t\t\tmatches.push(\n\t\t\t\t\t\tindent(\n\t\t\t\t\t\t\t`$${oppVar} isa ${opposite.thing}; (${lf.plays}: $${$var}, ${opposite.plays}: $${oppVar}) isa ${lf.relation};`,\n\t\t\t\t\t\t\tdepth,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t} else if (Array.isArray(value)) {\n\t\t\t\t\tvalue.forEach((v) => {\n\t\t\t\t\t\tmatches.push(\n\t\t\t\t\t\t\tindent(\n\t\t\t\t\t\t\t\t`not { $${oppVar} isa ${opposite.thing}, has ${oppositeIdField} ${serializeValue(v)}; (${lf.plays}: $${$var}, ${opposite.plays}: $${oppVar}) isa ${lf.relation}; };`,\n\t\t\t\t\t\t\t\tdepth,\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} else {\n\t\t\t\t\tmatches.push(\n\t\t\t\t\t\tindent(\n\t\t\t\t\t\t\t`not { $${oppVar} isa ${opposite.thing}, has ${oppositeIdField} ${serializeValue(value)}; (${lf.plays}: $${$var}, ${opposite.plays}: $${oppVar}) isa ${lf.relation}; };`,\n\t\t\t\t\t\t\tdepth,\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\treturn;\n\t\t}\n\n\t\tif (thing.thingType === 'relation') {\n\t\t\tconst role = thing.roles[key];\n\t\t\tif (role) {\n\t\t\t\tconst [player] = role.playedBy || [];\n\t\t\t\tconst playerThing = getSchemaByThing(schema, player.thing);\n\t\t\t\tconst playerIdField = playerThing.idFields?.[0];\n\t\t\t\tif (!playerIdField) {\n\t\t\t\t\tthrow new Error(`\"${player.thing}\" does not have an id field`);\n\t\t\t\t}\n\t\t\t\tconst playerVar = `${player.thing}_${uuidv4()}`;\n\t\t\t\tconst filterId = uuidv4();\n\t\t\t\tconst filterVar = `${$var}_${filterId}`;\n\t\t\t\tif (value === null) {\n\t\t\t\t\tmatches.push(indent(`$${filterVar} isa ${$thing};`, depth));\n\t\t\t\t\tmatches.push(indent(`$${filterVar} (${player.plays}: ${playerVar});`, depth));\n\t\t\t\t\tmatches.push(indent(`$${$var} is $${filterVar};`, depth));\n\t\t\t\t} else if (Array.isArray(value)) {\n\t\t\t\t\tvalue.forEach((v) => {\n\t\t\t\t\t\tmatches.push(indent(`$${filterVar} isa ${$thing};`, depth));\n\t\t\t\t\t\tmatches.push(\n\t\t\t\t\t\t\tindent(\n\t\t\t\t\t\t\t\t`not { $${playerVar} isa ${player.thing}, has ${playerIdField} ${serializeValue(v)}; $${filterVar} (${player.plays}: $${playerVar}); };`,\n\t\t\t\t\t\t\t\tdepth,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tmatches.push(indent(`$${$var} is $${filterVar};`, depth));\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tmatches.push(indent(`$${filterVar} isa ${$thing};`, depth));\n\t\t\t\t\tmatches.push(\n\t\t\t\t\t\tindent(\n\t\t\t\t\t\t\t`not { $${playerVar} isa ${player.thing}, has ${playerIdField} ${serializeValue(value)}; $${filterVar} (${player.plays}: $${playerVar}); };`,\n\t\t\t\t\t\t\tdepth,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\tmatches.push(indent(`$${$var} is $${filterVar};`, depth));\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t});\n\n\tObject.entries(rest).forEach(([key, value]) => {\n\t\tif (key.startsWith('$')) {\n\t\t\treturn; //todo: buildFilter should look similar to the surrealDB one, where we actually check the $or, $and, $not, $id, $thing etc\n\t\t}\n\t\tconst df = thing.dataFields?.find((df) => df.dbPath === key);\n\t\tif (df) {\n\t\t\tif (value === null) {\n\t\t\t\tmatches.push(indent(`not { $${$var} has ${key} $${key}_${uuidv4()}; };`, depth));\n\t\t\t} else if (Array.isArray(value)) {\n\t\t\t\tconst alt = value.map((v) => `$${$var} has ${key} ${serializeValue(v)};`);\n\t\t\t\tconst match = joinAlt(alt);\n\t\t\t\tif (match) {\n\t\t\t\t\tmatches.push(indent(match, depth));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tmatches.push(indent(`$${$var} has ${key} ${serializeValue(value)};`, depth));\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tconst lf = thing.linkFields?.find((lf) => lf.path === key);\n\t\tif (lf) {\n\t\t\tconst [opposite] = lf.oppositeLinkFieldsPlayedBy;\n\t\t\tconst oppositeThing = getSchemaByThing(schema, opposite.thing);\n\t\t\tconst oppositeIdField = oppositeThing.idFields?.[0];\n\t\t\tif (!oppositeIdField) {\n\t\t\t\tthrow new Error(`\"${opposite.thing}\" does not have an id field`);\n\t\t\t}\n\t\t\tif (lf.target === 'relation') {\n\t\t\t\tif (value === null) {\n\t\t\t\t\tmatches.push(indent(`not { (${lf.plays}: $${$var}) isa ${lf.relation}; };`, depth));\n\t\t\t\t} else if (Array.isArray(value)) {\n\t\t\t\t\tconst alt = value.map(\n\t\t\t\t\t\t(v) => `(${lf.plays}: $${$var}) isa ${lf.relation}, has ${oppositeIdField} ${serializeValue(v)};`,\n\t\t\t\t\t);\n\t\t\t\t\tconst match = joinAlt(alt);\n\t\t\t\t\tif (match) {\n\t\t\t\t\t\tmatches.push(indent(match, depth));\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tmatches.push(\n\t\t\t\t\t\tindent(\n\t\t\t\t\t\t\t`(${lf.plays}: $${$var}) isa ${lf.relation}, has ${oppositeIdField} ${serializeValue(value)};`,\n\t\t\t\t\t\t\tdepth,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst oppVar = `${opposite.thing}_${uuidv4()}`;\n\t\t\t\tif (value === null) {\n\t\t\t\t\tmatches.push(\n\t\t\t\t\t\tindent(\n\t\t\t\t\t\t\t`not { $${oppVar} isa ${opposite.thing}; (${lf.plays}: $${$var}, ${opposite.plays}: $${oppVar}) isa ${lf.relation}; };`,\n\t\t\t\t\t\t\tdepth,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t} else if (Array.isArray(value)) {\n\t\t\t\t\tconst alt = value.map(\n\t\t\t\t\t\t(v) =>\n\t\t\t\t\t\t\t`$${oppVar} isa ${opposite.thing}, has ${oppositeIdField} ${serializeValue(v)}; (${lf.plays}: $${$var}, ${opposite.plays}: $${oppVar}) isa ${lf.relation};`,\n\t\t\t\t\t);\n\t\t\t\t\tconst match = joinAlt(alt);\n\t\t\t\t\tif (match) {\n\t\t\t\t\t\tmatches.push(indent(match, depth));\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tmatches.push(\n\t\t\t\t\t\tindent(\n\t\t\t\t\t\t\t`$${oppVar} isa ${opposite.thing}, has ${oppositeIdField} ${serializeValue(value)}; (${lf.plays}: $${$var}, ${opposite.plays}: $${oppVar}) isa ${lf.relation};`,\n\t\t\t\t\t\t\tdepth,\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\treturn;\n\t\t}\n\n\t\tif (thing.thingType === 'relation') {\n\t\t\tconst role = thing.roles[key];\n\t\t\tif (role) {\n\t\t\t\tconst [player] = role.playedBy || [];\n\t\t\t\tconst playerThing = getSchemaByThing(schema, player.thing);\n\t\t\t\tconst playerIdField = playerThing.idFields?.[0];\n\t\t\t\tif (!playerIdField) {\n\t\t\t\t\tthrow new Error(`\"${player.thing}\" does not have an id field`);\n\t\t\t\t}\n\t\t\t\tconst playerVar = `${player.thing}_${uuidv4()}`;\n\t\t\t\tconst filterId = uuidv4();\n\t\t\t\tconst filterVar = `${$var}_${filterId}`;\n\t\t\t\tif (value === null) {\n\t\t\t\t\tmatches.push(indent(`$${filterVar} isa ${$thing};`, depth));\n\t\t\t\t\tmatches.push(indent(`not { $${filterVar} (${player.plays}: ${playerVar}); };`, depth));\n\t\t\t\t\tmatches.push(indent(`$${$var} is $${filterVar};`, depth));\n\t\t\t\t} else if (Array.isArray(value)) {\n\t\t\t\t\tconst alt = value.map(\n\t\t\t\t\t\t(v) =>\n\t\t\t\t\t\t\t`$${playerVar} isa ${player.thing}, has ${playerIdField} ${serializeValue(v)}; $${filterVar} (${player.plays}: $${playerVar});`,\n\t\t\t\t\t);\n\t\t\t\t\tconst match = joinAlt(alt);\n\t\t\t\t\tif (match) {\n\t\t\t\t\t\tmatches.push(indent(`$${filterVar} isa ${$thing};`, depth));\n\t\t\t\t\t\tmatches.push(indent(match, depth));\n\t\t\t\t\t\tmatches.push(indent(`$${$var} is $${filterVar};`, depth));\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tmatches.push(indent(`$${filterVar} isa ${$thing};`, depth));\n\t\t\t\t\tmatches.push(\n\t\t\t\t\t\tindent(\n\t\t\t\t\t\t\t`$${playerVar} isa ${player.thing}, has ${playerIdField} ${serializeValue(value)}; $${filterVar} (${player.plays}: $${playerVar});`,\n\t\t\t\t\t\t\tdepth,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\tmatches.push(indent(`$${$var} is $${filterVar};`, depth));\n\t\t\t\t}\n\t\t\t\treturn;\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.join('\\n');\n};\n\nconst joinAlt = (alt: string[]): string | undefined => {\n\tif (alt.length > 1) {\n\t\treturn `{ ${alt.join(' } or { ')} };`;\n\t}\n\tconst [match] = alt;\n\treturn match;\n};\n\nconst serializeValue = (value: string | number | boolean | Date | object) => {\n\tif (typeof value === 'string') {\n\t\treturn `'${value}'`;\n\t}\n\tif (value instanceof Date) {\n\t\treturn `'${value.toISOString().replace('Z', '')}'`;\n\t}\n\n\tif (isObject(value)) {\n\t\t//Todo: Temporal fix, enhance on filters refacto. Btw the dbPath to be added also in the fields as [TypeDBMeta]\n\t\tif ('$id' in value) {\n\t\t\tif (isArray(value.$id)) {\n\t\t\t\treturn `like \"^(${value.$id.join('|')})$\"`;\n\t\t\t}\n\t\t\treturn `\"${value.$id}\"`;\n\t\t}\n\t}\n\treturn `${value}`;\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 { 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 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 type {\n\tBQLMutation,\n\tBQLMutationBlock,\n\tBormConfig,\n\tDBHandles,\n\tEnrichedBQLMutationBlock,\n\tEnrichedBormSchema,\n} from '../../types';\nimport { enrichBQLMutation } from './bql/enrich';\nimport type { TqlMutation } from './tql/run';\nimport { runTQLMutation } from './tql/run';\nimport type { TqlRes } from './tql/parse';\nimport { parseTQLMutation } from './tql/parse';\nimport { parseBQLMutation } from './bql/parse';\nimport { buildTQLMutation } from './tql/build';\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';\n\nconst final = state;\ntype MachineContext = {\n\tbql: {\n\t\traw: BQLMutationBlock | BQLMutationBlock[];\n\t\tcurrent: EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[];\n\t\tthings: any[];\n\t\tedges: any[];\n\t\tres: any[];\n\t};\n\ttypeDB: {\n\t\ttqlMutation: TqlMutation;\n\t\ttqlRes: TqlRes;\n\t};\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, current: event.data },\n\t};\n};\n\nconst updateBqlRes = (ctx: MachineContext, event: any) => {\n\treturn {\n\t\t...ctx,\n\t\tbql: { ...ctx.bql, res: 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 updateTQLMutation = (ctx: MachineContext, event: any) => {\n\treturn {\n\t\t...ctx,\n\t\ttypeDB: {\n\t\t\t...ctx.typeDB,\n\t\t\ttqlMutation: event.data,\n\t\t},\n\t};\n};\n\nconst updateTQLRes = (ctx: MachineContext, event: any) => {\n\treturn {\n\t\t...ctx,\n\t\ttypeDB: {\n\t\t\t...ctx.typeDB,\n\t\t\ttqlRes: event.data,\n\t\t},\n\t};\n};\n\n// Actors\n// ============================================================================\n\nconst enrich = async (ctx: MachineContext) => {\n\treturn Object.keys(ctx.bql.current).length\n\t\t? enrichBQLMutation(ctx.bql.current, ctx.schema, ctx.config)\n\t\t: enrichBQLMutation(ctx.bql.raw, ctx.schema, ctx.config);\n};\n\nconst preQuery = async (ctx: MachineContext) => {\n\treturn mutationPreQuery(ctx.bql.current, ctx.schema, ctx.config, ctx.handles);\n};\n\nconst preQueryDependencies = async (ctx: MachineContext) => {\n\treturn preHookDependencies(ctx.bql.current, ctx.schema, ctx.config, ctx.handles);\n};\n\nconst parseBQL = async (ctx: MachineContext) => {\n\treturn parseBQLMutation(ctx.bql.current, ctx.schema);\n};\n\nconst buildMutation = async (ctx: MachineContext) => {\n\treturn buildTQLMutation(ctx.bql.things, ctx.bql.edges, ctx.schema);\n};\n\nconst runMutation = async (ctx: MachineContext) => {\n\treturn runTQLMutation(ctx.typeDB.tqlMutation, ctx.handles, ctx.config);\n};\n\nconst parseMutation = async (ctx: MachineContext) => {\n\treturn parseTQLMutation(ctx.typeDB.tqlRes, ctx.bql.things, ctx.bql.edges, ctx.schema, ctx.config);\n};\n\n// Guards\n// ============================================================================\nconst requiresPreQuery = () => {\n\treturn true;\n};\n\nconst requiresPreHookDependencies = (ctx: MachineContext) => {\n\treturn dependenciesGuard(ctx.bql.current);\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) => stringify(ctx.bql.raw, ctx.schema),\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\tpreHookDependencies: invoke(\n\t\t\tpreQueryDependencies,\n\t\t\ttransition('done', 'enrich', 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\tparseBQL: invoke(parseBQL, transition('done', 'buildMutation', reduce(updateThingsEdges)), errorTransition),\n\t\tbuildMutation: invoke(buildMutation, transition('done', 'runMutation', reduce(updateTQLMutation)), errorTransition),\n\t\trunMutation: invoke(runMutation, transition('done', 'parseMutation', reduce(updateTQLRes)), errorTransition),\n\t\tparseMutation: invoke(parseMutation, transition('done', 'success', reduce(updateBqlRes)), errorTransition),\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\tcurrent: {} as EnrichedBQLMutationBlock,\n\t\t\tthings: [],\n\t\t\tedges: [],\n\t\t\tres: [],\n\t\t},\n\t\ttypeDB: {\n\t\t\ttqlMutation: {} as TqlMutation,\n\t\t\ttqlRes: {} as TqlRes,\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 { 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('$')) {\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\tconst [oppositeThing] = role.playedBy || [];\n\t\tif (!oppositeThing) {\n\t\t\tthrow new Error(`Role ${role.name} 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"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/default.config.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/enrich.ts","../src/stateMachine/mutation/bql/enrichSteps/replaces.ts","../src/stateMachine/mutation/bql/shared/getOppositePlayers.ts","../src/stateMachine/mutation/bql/enrichSteps/rootMeta.ts","../src/stateMachine/mutation/bql/shared/validateOp.ts","../src/stateMachine/mutation/bql/shared/getOp.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/enrichSteps/computeFields.ts","../src/engine/helpers.ts","../src/engine/compute.ts","../src/stateMachine/mutation/bql/enrichSteps/preHookValidations.ts","../src/stateMachine/mutation/bql/shared/getTriggeredActions.ts","../src/stateMachine/mutation/bql/enrichSteps/preHookTransformations.ts","../src/stateMachine/mutation/bql/enrichSteps/unlinkAll.ts","../src/stateMachine/mutation/bql/guards/dependenciesGuard.ts","../src/stateMachine/mutation/tql/run.ts","../src/adapters/typeDB/helpers.ts","../src/stateMachine/mutation/tql/parse.ts","../src/stateMachine/mutation/bql/parse.ts","../tests/helpers/matchers.ts","../src/stateMachine/mutation/tql/build.ts","../src/adapters/typeDB/parseFlexVal.ts","../src/stateMachine/mutation/bql/preQuery.ts","../src/stateMachine/robot3/index.ts","../src/stateMachine/query/bql/clean.ts","../src/stateMachine/query/bql/enrich.ts","../src/stateMachine/query/postHook.ts","../src/stateMachine/query/surql/build.ts","../src/adapters/surrealDB/helpers.ts","../src/stateMachine/query/surql/run.ts","../src/stateMachine/query/surql/parse.ts","../src/stateMachine/query/surql/machine.ts","../src/stateMachine/query/tql/build.ts","../src/stateMachine/query/tql/parse.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/stateMachine/mutation/mutationMachine.ts"],"names":["tryit","TypeDB","SessionType","TypeDBCredential","Surreal","defaultConfig","TransactionType","removeDuplicateObjects","arr","uniqueObjects","uniqueMap","obj","dbPath","contentType","key","bormDefine","config","schema","dbHandles","typeDBString","output","usedAttributes","entityName","entity","idFields","dataFields","linkFields","name","commonDataFields","commonLinkFields","commonIdFields","parentEntity","dataField","linkField","idField","idsAsData","setIds","idFieldsString","field","usedLinkFields","relation","plays","relationName","roles","commonRoleFields","parentRelation","roleField","roleName","attributes","attribute","singleHandlerV0","session","client","dbName","schemaSession","schemaTransaction","getSchemaTransaction","conceptMap","thing","_label","_name","produce","isDraft","current","getNodeByPath","traverse","isArray","isObject","listify","mapEntries","Schema","QueryPath","StepPrint","EdgeType","EdgeSchema","DBNode","IsTransformed","FieldSchema","SharedMetadata","SuqlMetadata","adapterContext","getSurrealLinkFieldQueryPath","originalRelation","withExtensionsSchema","targetRelationSubTypes","targetRelationThings","pathToRelation","targetRole","targetRoleSubTypes","oppositeRoleThings","pathToTunneledRole","getDbPath","shared","oFind","fn","k","v","oFilter","enrichSchema","allLinkedFields","draft","value","meta","df","extendedSchema","allExtends","ext","deepExtendedThing","deepSchema","deepDf","val","extendedRelationSchema","extendedRelationSchemaWithOrigin","roleKey","role","lf","thingTypes","thingPath","withThing","x","thingType","thingDB","playedBy","$things","playerThingsWithSubTypes","playerThing","subTypes","getSchemaByThing","queryPath","linkFieldRelation","allOppositeLinkFields","playedBySet","type","thingId","draftSchema","$thing","getCurrentSchema","node","getFieldType","currentSchema","dataFieldSchema","linkFieldSchema","roleFieldSchema","getIdFieldKey","getThingType","rootNode","getFieldSchema","foundLinkField","foundDataField","foundRoleField","getCardinality","getCurrentFields","availableDataFields","availableLinkFields","availableRoleFields","availableFields","allowedFields","usedFields","localFilterFields","nestedFilterFields","unidentifiedFields","localFilters","_v","nestedFilters","capitalizeFirstLetter","string","getParentNode","blocks","parent","pathParts","parentPath","getSymbols","oldBlock","symbols","symbolKey","isBQLBlock","block","deepCurrent","item","plainObject","result","assertDefined","msg","indent","line","depth","_indent","enableMapSet","getOppositePlayers","fieldSchema","oppositePlayer","uuidv4","replaceToObj","subNodes","child","oppositePlayers","player","$op","$thingType","validateOp","parentNode","nodeSchema","usedDataFields","getOp","setRootMeta","withMetadataRootArray","rootOp","isSet","doAction","stepName","splitMultipleIds","transformedChildren","subNode","$id","i","enrichChildren","newNodes","$bzId","acorn","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","clone","getTriggeredActions","hooks","currentEvent","hook","preHookValidations","requiredFields","enumFields","fnValidatedFields","enumOptions","error","userContext","dbNode","action","validationResult","preHookTransformations","triggeredActions","newProps","unlinkAll","dependenciesGuard","mut","o","cleanStep","tempId","dataFieldStep","enrichBQLMutation","rootBlock","hasFields","paths","toIgnore","lastPath","secondToLastPath","isFilter","preValidate","cleanPath","subNodeSchema","fields","uf","usedLinkFieldsSchemas","lf1","lf2","j","getSessionOrOpenNewOne","runTQLMutation","tqlMutation","mutateTransaction","tqlDeletion","tqlInsertion","insertionsStream","insertionsRes","e","parseTQLMutation","tqlRes","reqThings","reqEdges","expected","parsed","exp","y","dbIdd","props","_","acc","f","matchedThings","z","pick","shake","deepRemoveMetaData","removeMeta","s","parseBQLMutation","listNodes","nodes","edges","getIdValue","idDataField","defaultIdField","idValue","toNodes","toEdges","edge","currentThingSchema","dataFieldPaths","roleFieldPaths","linkFieldPaths","getChildOp","usedRoleFields","dataObj","edgeSchema","ownRelation","linkTempId","parentId","getLinkObjOp","relationSchema","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","tempIds","orphanTempIds","isDate","parseFlexVal","nanoid","buildTQLMutation","things","nodeToTypeQL","bzId","defaultDBConnector","thingDbPath","currentDataField","dbField","parsedVal","attributesVar","matchAttributes","idValueTQL","idAttributes","allAttributes","getDeletionMatchInNodes","getInsertionMatchInNodes","edgeToTypeQL","relationDbPath","roleFields","roleDbPaths","fromRoleFields","roleDbPath","fromRoleFieldsTql","edgeType","relationTql","relationTqlWithoutRoles","getInsertionsInEdges","getInsertionMatchInEdges","getDeletionMatchInEdges","getDeletionsInEdges","toTypeQL","mode","typeQL","preDeletionBatch","insertionMatch","deletionMatch","insertion","deletion","nodeOperations","arrayNodeOperations","edgeOperations","arrayEdgeOperations","allOperations","d","valueEnumerable","valueEnumerableWritable","truthy","empty","identity","a","callBoth","par","self","args","callForward","b","create","stack","fns","def","caller","fnType","reduceType","reduce","guardType","guard","filter","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","context","original","newMachine","send","eventName","currentStateName","onChange","initialContext","cleanQueryRes","bqlRes","withPostHooks","queryPostHooks","cleanOutput","symbol","enrichBQLQuery","rawBqlQuery","batches","checkFilterByUnique","enrichFilter","newFields","processed","processField","getAllFields","isId","$filter","isIdField","isUniqueDataField","isSingle$id","createDataField","fieldStr","$justId","isVirtual","createLinkField","target","oppositeLinkFieldsPlayedBy","idNotIncluded","createRoleField","wasArray","resultArray","valueAsArray","fieldType","fieldSchemaTyped","childrenThing","postHooks","enrichedBqlQuery","originalNode","queriedFields","excludedFields","virtualFieldPath","computedValue","excludedField","sanitizeTableNameSurrealDb","tableName","specialChars","prepareTableNameSurrealDB","char","build","queries","query","buildQuery","$fields","$offset","$limit","$sort","lines","fieldLines","buildFieldsQuery","allTypesNormed","$ids","allCombinations","id","parseFilter","buildSuqlFilter","buildSorter","level","parentQuery","buildFieldQuery","buildAttributeQuery","buildLinkQuery","buildRoleQuery","queryLevel","built","fieldLevel","surrealDBKey","entries","parts","logicalOperator","nestedFilter","operator","nextValue","sort","run","batchedQuery","parse","res","parseRes","parseObj","newObj","parseFieldResult","errorTransition","ctx","surrealDbQueryMachine","awaitQueryMachine","resolve","reject","runSurrealDbQueryMachine","enrichedBql","separator","buildTQLQuery","$path","$WithIdFilter","buildFilter","sorter","randomId","processDataFields","processLinkFields","processRoleFields","postStrParts","asMetaDataParts","multiVals","postStr","$metaData","multiVal","dotPath","nextDepth","$as","$idNotIncluded","$filterByUnique","$roleVar","withId","withIdFilter","$playedBy","$linkVar","mapFilterKeys","thingSchema","mapper","$not","newFilter","mapPositiveFilterKeys","filterValue","newKey","$nonMappedFilter","$var","rest","matches","serializeValue","opposite","oppositeIdField","oppVar","playerIdField","playerVar","filterId","filterVar","alt","match","joinAlt","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","items","resDataFields","linkFieldsRes","$linkFields","str","asRegex","justIdRegex","idNotIncludedRegex","filterByUniqueRegex","asMatch","justIdMatch","idNotIncludedMatch","filterByUniqueMatch","converted","jsonString","p1","p2","parallel","TypeDBOptions","runTQLQuery","tqlRequest","options","transaction","err","resArray","queryString","updateBqlRes","updateTqlReq","updateTqlRes","typeDbQueryMachine","runTypeDbQueryMachine","bql","handles","updateBqlReq","queryMachine","adapters","q","raw","adapter","adapterList","proms","results","orderedResults","index","runQueryMachine","preQueryPathSeparator","grandChildOfCreateSymbol","mutationPreQuery","getFieldKeys","noDataFields","ops","preQueryReq","processBlock","root","filteredBlock","toRemoveFromRoot","toRemove","opBlock","newField","preQueryRes","getObjectPath","$objectPath","ids","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","_opBlock","getAllKeyCombinations","dataFieldObj","allKeys","combinableKeys","generateCombinations","currentObj","fullObj","newObjInclude","crossReferencedOperations","multipleBlock","combinationsToKeep","combinationBlock","foundKeys","childKey","subBlock","c","newOps","parentKey","idsOfParent","cKey","originalOp","processReplaces","newOpBlocks","replaceIds","createIds","replaceBlock","cardinality","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","final","updateThingsEdges","updateTQLMutation","updateTQLRes","enrich","preQuery","preQueryDependencies","parseBQL","buildMutation","runMutation","parseMutation","requiresPreQuery","requiresPreHookDependencies","awaitMachine","runMutationMachine","mutation","BormClient","dbc","db","clientErr","message","sessionErr","credential","enrichedSchema","#enforceConnection","queryConfig","qConfig","isBatched","errorRes","mutationConfig","mConfig","src_default"],"mappings":"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","sourcesContent":["import { tryit } from 'radash';\nimport { TypeDB, SessionType, TypeDBCredential } from 'typedb-driver';\nimport { Surreal } from 'surrealdb.js';\n\nimport { defaultConfig } from './default.config';\nimport { bormDefine } from './define';\nimport { enrichSchema } from './helpers';\nimport type {\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';\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 = { 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 db = new Surreal();\n\n\t\t\t\t\tawait db.connect(dbc.url, {\n\t\t\t\t\t\tnamespace: dbc.namespace,\n\t\t\t\t\t\tdatabase: dbc.dbName,\n\t\t\t\t\t\tauth: {\n\t\t\t\t\t\t\tnamespace: dbc.namespace,\n\t\t\t\t\t\t\tdatabase: dbc.dbName,\n\t\t\t\t\t\t\tusername: dbc.username,\n\t\t\t\t\t\t\tpassword: dbc.password,\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\n\t\t\t\t\tdbHandles.surrealDB.set(dbc.id, { client: db });\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\treturn bormDefine(this.config, this.schema, this.dbHandles);\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 { 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';\n\nimport type { BormConfig, BormSchema, LinkField } 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 bormDefine = async (config: BormConfig, schema: BormSchema, dbHandles: any) => {\n\tconst convertSchema = () => {\n\t\tlet output = '';\n\t\tconst usedAttributes: Attribute[] = [];\n\n\t\toutput += '\\n';\n\n\t\t// CONVERTING ENTITIES\n\n\t\tObject.keys(schema.entities).forEach((entityName) => {\n\t\t\tconst entity = schema.entities[entityName];\n\t\t\t// @ts-expect-error - TODO description\n\t\t\tconst { idFields, dataFields, linkFields, name } = entity;\n\t\t\t// Checks to see if parent already contains these fields\n\t\t\tconst commonDataFields: string[] = [];\n\t\t\tconst commonLinkFields: string[] = [];\n\t\t\tconst commonIdFields: string[] = [];\n\n\t\t\t// If extended by parent, get rid of parent's declared attributes\n\t\t\tif ('extends' in entity) {\n\t\t\t\tconst parentEntity = schema.entities[entity.extends];\n\t\t\t\tif (parentEntity.dataFields) {\n\t\t\t\t\tparentEntity.dataFields.forEach((dataField: any) => {\n\t\t\t\t\t\tcommonDataFields.push(dataField.dbPath);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (parentEntity.linkFields) {\n\t\t\t\t\tparentEntity.linkFields.forEach((linkField: LinkField) => {\n\t\t\t\t\t\tcommonLinkFields.push(linkField.path);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (parentEntity.idFields) {\n\t\t\t\t\tparentEntity.idFields.forEach((idField: any) => {\n\t\t\t\t\t\tcommonIdFields.push(idField);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\toutput += `${name} sub ${'extends' in entity ? entity.extends : 'entity'},\\n`;\n\t\t\t// Removes ids from data fields, so their attributes aren't repeated\n\t\t\tconst idsAsData: string[] = [];\n\t\t\t// Adding id fields\n\t\t\tif (idFields && idFields.length > 0) {\n\t\t\t\tconst setIds = new Set(idFields);\n\t\t\t\tconst newIdFields = Array.from(setIds);\n\t\t\t\tconst idFieldsString = newIdFields.map((field: string) => `${field}`).join(', ');\n\t\t\t\tif (!commonIdFields.includes(idFieldsString)) {\n\t\t\t\t\toutput += ` owns ${idFieldsString} @key,\\n`;\n\t\t\t\t\tidsAsData.push(idFieldsString);\n\t\t\t\t}\n\t\t\t}\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 (!commonDataFields.includes(field.dbPath) && !idsAsData.includes(field.dbPath)) {\n\t\t\t\t\t\toutput += ` owns ${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 } = linkField;\n\t\t\t\t\tif (!commonLinkFields.includes(linkField.path) && !usedLinkFields.includes(`${relation}:${plays}`)) {\n\t\t\t\t\t\toutput += ` plays ${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\t// CONVERTING RELATIONS\n\t\tObject.keys(schema.relations).forEach((relationName) => {\n\t\t\tconst relation = schema.relations[relationName];\n\t\t\t// TODO: fix name ts error\n\t\t\t// @ts-expect-error - TODO description\n\t\t\tconst { idFields, dataFields, roles, name, linkFields } = relation;\n\t\t\t// Checks to see if parent already contains these fields\n\t\t\tconst commonDataFields: string[] = [];\n\t\t\tconst commonLinkFields: string[] = [];\n\t\t\tconst commonRoleFields: string[] = [];\n\t\t\tconst commonIdFields: string[] = [];\n\n\t\t\t// If extended by parent, get rid of parent's declared attributes\n\t\t\tif ('extends' in relation) {\n\t\t\t\tconst parentRelation = schema.relations[relation.extends];\n\t\t\t\tif (parentRelation.dataFields) {\n\t\t\t\t\tparentRelation.dataFields.forEach((dataField: any) => {\n\t\t\t\t\t\tcommonDataFields.push(dataField.dbPath);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (parentRelation.linkFields) {\n\t\t\t\t\tparentRelation.linkFields.forEach((linkField: any) => {\n\t\t\t\t\t\tcommonLinkFields.push(linkField.dbPath);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (parentRelation.roles) {\n\t\t\t\t\tconst roleFields = Object.values(parentRelation.roles);\n\t\t\t\t\troleFields.forEach((roleField: any) => {\n\t\t\t\t\t\tcommonRoleFields.push(roleField.name);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (parentRelation.idFields) {\n\t\t\t\t\tparentRelation.idFields.forEach((idField: any) => {\n\t\t\t\t\t\tcommonIdFields.push(idField);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\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\t\t\tconst idsAsData: string[] = [];\n\t\t\t// Adding id fields\n\t\t\tif (idFields && idFields.length > 0) {\n\t\t\t\tconst setIds = new Set(idFields);\n\t\t\t\tconst newIdFields = Array.from(setIds);\n\t\t\t\tconst idFieldsString = newIdFields.map((field: string) => `${field}`).join(', ');\n\t\t\t\tif (!commonIdFields.includes(idFieldsString)) {\n\t\t\t\t\toutput += ` owns ${idFieldsString} @key,\\n`;\n\t\t\t\t\tidsAsData.push(idFieldsString);\n\t\t\t\t}\n\t\t\t}\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 (!commonDataFields.includes(field.dbPath) && !idsAsData.includes(field.dbPath)) {\n\t\t\t\t\t\toutput += ` owns ${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 role fields\n\t\t\tif (roles) {\n\t\t\t\tObject.keys(roles).forEach((roleName) => {\n\t\t\t\t\tif (!commonRoleFields.includes(roleName)) {\n\t\t\t\t\t\toutput += ` relates ${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 } = linkField;\n\t\t\t\t\tif (!commonLinkFields.includes(linkField.path) && !usedLinkFields.includes(`${relation}:${plays}`)) {\n\t\t\t\t\t\toutput += ` plays ${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\t// DEFINING ATTRIBUTES\n\n\t\tlet attributes = 'define\\n\\n';\n\t\tconst newUsedAttributes = removeDuplicateObjects(usedAttributes);\n\n\t\tnewUsedAttributes.forEach((attribute: Attribute) => {\n\t\t\tattributes += `${attribute.dbPath} sub attribute,\\n`;\n\t\t\t// All conditions for BORM to TQL attribute types\n\t\t\tif (attribute.contentType === 'TEXT' || attribute.contentType === 'ID' || attribute.contentType === 'JSON') {\n\t\t\t\tattributes += ' value string;\\n';\n\t\t\t} else if (attribute.contentType === 'EMAIL') {\n\t\t\t\tattributes += ' value string,\\n';\n\t\t\t\tattributes +=\n\t\t\t\t\t\" regex '^(?=.{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\t} else if (attribute.contentType === 'DATE') {\n\t\t\t\tattributes += ' value datetime;\\n';\n\t\t\t} else if (attribute.contentType === 'BOOLEAN') {\n\t\t\t\tattributes += ' value boolean;\\n';\n\t\t\t} else if (attribute.contentType === 'NUMBER') {\n\t\t\t\tattributes += ' value long;\\n';\n\t\t\t} else {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Conversion of borm schema to TypeDB schema for data type \"${attribute.contentType}\" is not implemented`,\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\n\t\treturn `${attributes}\\n\\n${output}`;\n\t};\n\n\t// TYPE DB TRANSACTIONS\n\n\tconst typeDBString = convertSchema();\n\tconst singleHandlerV0 = config.dbConnectors[0].id;\n\tconst session = dbHandles.typeDB.get(singleHandlerV0)?.session;\n\tconst client = dbHandles.typeDB.get(singleHandlerV0)?.client;\n\tif (!session) {\n\t\tconsole.log('Session Status: ', 'NO SESSION');\n\t\treturn;\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\n\t// 3. Defining new schema\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\tconst getSchemaTransaction = await schemaSession.transaction(TransactionType.READ);\n\tconst getSchemaQuery = 'match $a sub thing;';\n\tconst getSchemaStream = await getSchemaTransaction.query.match(getSchemaQuery);\n\tconst schemaThings = await getSchemaStream.collect();\n\tschemaThings.forEach(async (conceptMap: any) => {\n\t\t// * Match the group as the main entity\n\t\tconst thing = conceptMap.get('a');\n\t\tconst { _label } = thing;\n\t\tconst { _name } = _label;\n\t});\n\tawait getSchemaTransaction.close();\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 } from 'radash';\nimport { SharedMetadata, SuqlMetadata } from './types/symbols';\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} 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> => Object.fromEntries(Object.entries(obj).filter(([k, v]) => fn(k as K, v))) 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\tif (key) {\n\t\t\t\t\t// * Adding dbPath of local dataFields\n\t\t\t\t\tvalue.dataFields = value.dataFields?.map((df: DataField) => ({\n\t\t\t\t\t\t...df,\n\t\t\t\t\t\tcardinality: df.cardinality || 'ONE',\n\t\t\t\t\t\tdbPath: getDbPath(key, df.path, df.shared),\n\t\t\t\t\t}));\n\t\t\t\t}\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\tdbPath: getDbPath(deepExtendedThing, df.path, df.shared),\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\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\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\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\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\t[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) => ({ ...x, ...thingTypes }));\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\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// 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// eslint-disable-next-line no-param-reassign\n\t\t\t\t\t\trole.fieldType = 'roleField';\n\t\t\t\t\t\tconst playedBy = allLinkedFields.filter((x) => x.relation === key && x.plays === roleKey) || [];\n\t\t\t\t\t\trole.playedBy = playedBy;\n\t\t\t\t\t\trole.name = roleKey;\n\t\t\t\t\t\tconst $things = [...new Set(playedBy.map((x) => x.thing))];\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\tif ($things.length > 1) {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`Not supported yet: Role ${roleKey} in ${value.name} 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 queryPath = `->\\`${originalRelation}_${roleKey}\\`->(\\`${playerThingsWithSubTypes.join('`,`')}\\`)`;\n\n\t\t\t\t\t\trole[SuqlMetadata] = {\n\t\t\t\t\t\t\tqueryPath,\n\t\t\t\t\t\t};\n\t\t\t\t\t});\n\t\t\t\t}\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\tlinkField.fieldType = 'linkField';\n\t\t\t\t\t\tconst linkFieldRelation = withExtensionsSchema.relations[linkField.relation];\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];\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\tconst allOppositeLinkFields =\n\t\t\t\t\t\t\t\tallLinkedFields.filter((x) => x.relation === linkField.relation && x.plays !== linkField.plays) || [];\n\n\t\t\t\t\t\t\t// by default, all oppositeLinkFields\n\t\t\t\t\t\t\tlinkField.oppositeLinkFieldsPlayedBy = allOppositeLinkFields;\n\n\t\t\t\t\t\t\t// We remove the target relation ones\n\t\t\t\t\t\t\tlinkField.oppositeLinkFieldsPlayedBy = linkField.oppositeLinkFieldsPlayedBy.filter(\n\t\t\t\t\t\t\t\t(x) => 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\tlinkField.$things = linkField.oppositeLinkFieldsPlayedBy.map((x) => x.thing);\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\tthrow new Error(\n\t\t\t\t\t\t\t\t\t`Not supported: 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\t// We take the original relation as its the one that holds the name of the relation in surrealDB\n\t\t\t\t\t\tconst originalRelation =\n\t\t\t\t\t\t\t// @ts-expect-error - This is fine, extensions schema is a middle state\n\t\t\t\t\t\t\tlinkFieldRelation?.roles?.[linkField.plays][SharedMetadata]?.inheritanceOrigin ?? linkField.relation;\n\t\t\t\t\t\tconst queryPath = getSurrealLinkFieldQueryPath({ linkField, originalRelation, withExtensionsSchema });\n\n\t\t\t\t\t\tlinkField[SuqlMetadata] = {\n\t\t\t\t\t\t\tqueryPath,\n\t\t\t\t\t\t};\n\t\t\t\t\t\t//#endregion\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 (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\tthrow new Error(\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\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): ['dataField' | 'linkField' | 'roleField', EnrichedDataField | EnrichedLinkField | EnrichedRoleField] => {\n\tconst dataFieldSchema = currentSchema.dataFields?.find((dataField: any) => dataField.path === key);\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 => {\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\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};\n\ntype ReturnTypeWithNode = ReturnTypeWithoutNode & {\n\tusedFields: string[];\n\tusedRoleFields: string[];\n\tusedLinkFields: string[];\n\tusedDataFields: 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 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];\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!\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\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\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","export 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');\n\nexport const DBNode = Symbol.for('dbNode');\nexport const IsTransformed = Symbol.for('isTransformed');\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","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}: {\n\tlinkField: EnrichedLinkField;\n\toriginalRelation: string;\n\twithExtensionsSchema: BormSchema;\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\treturn pathToRelation; //Not original relation in the second, but all the potential targets\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\treturn `${pathToRelation}${pathToTunneledRole}`;\n\t} else {\n\t\tthrow new Error('Unsupported linkField target');\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 } 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';\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\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 hasFields = dependenciesGuard(Array.isArray(blocks) ? blocks : [blocks]);\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\t\t\tif (isObject(value)) {\n\t\t\t\tconst paths = meta.nodePath?.split('.') || [];\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 (!toIgnore.includes(lastPath) && !toIgnore.includes(secondToLastPath)) {\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\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\t\t\t\t\tconst fieldSchema =\n\t\t\t\t\t\tfield !== '$root' ? getFieldSchema(schema, node, field) : ({ 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///2.DATAFIELD STEP\n\t\t\t\t\tif ('contentType' in fieldSchema) {\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\n\t\t\t\t\tif (['rootField', 'linkField', 'roleField'].includes(fieldSchema.fieldType)) {\n\t\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\t/// 3.2.1 replaces\n\t\t\t\t\t\tif (['linkField', 'roleField'].includes(fieldSchema.fieldType)) {\n\t\t\t\t\t\t\tif (node[field] === null) {\n\t\t\t\t\t\t\t\tunlinkAll(node, field, fieldSchema);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\treplaceToObj(node, field, fieldSchema);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t//3.2.2 root $thing\n\t\t\t\t\t\tif (fieldSchema.fieldType === 'rootField') {\n\t\t\t\t\t\t\tif (!('$root' in node)) {\n\t\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\t}\n\t\t\t\t\t\t\tconst rootNode = node as unknown as { $root: BQLMutationBlock | BQLMutationBlock[] };\n\t\t\t\t\t\t\tsetRootMeta(rootNode, schema);\n\t\t\t\t\t\t}\n\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\tconst preValidate = isArray(node[field]) ? node[field] : [node[field]];\n\n\t\t\t\t\t\tconst cleanPath = paths.slice(1).join('.');\n\t\t\t\t\t\tpreValidate.forEach((subNode: BQLMutationBlock) => {\n\t\t\t\t\t\t\tif (!subNode) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t/// For cardinality ONE, we need to specify the $op of the children\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tfieldSchema?.cardinality === 'ONE' &&\n\t\t\t\t\t\t\t\t!subNode.$op &&\n\t\t\t\t\t\t\t\t!subNode.$id &&\n\t\t\t\t\t\t\t\t!subNode.$filter &&\n\t\t\t\t\t\t\t\t!subNode.$tempId &&\n\t\t\t\t\t\t\t\tnode.$op !== 'create'\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tthrow new Error(`Please specify if it is a create or an update. Path: ${cleanPath}.${field}`);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (subNode.$tempId) {\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t!(\n\t\t\t\t\t\t\t\t\t\tsubNode.$op === undefined ||\n\t\t\t\t\t\t\t\t\t\tsubNode.$op === 'link' ||\n\t\t\t\t\t\t\t\t\t\tsubNode.$op === 'create' ||\n\t\t\t\t\t\t\t\t\t\tsubNode.$op === 'update'\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\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t\t`Invalid op ${subNode.$op} for tempId. TempIds can be created, or when created in another part of the same mutation. In the future maybe we can use them to catch stuff in the DB as well and group them under the same tempId.`,\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/// 3.2.4 children enrichment\n\t\t\t\t\t\t//redefining childrenArray as it might have changed\n\t\t\t\t\t\tif (['linkField', 'roleField'].includes(fieldSchema.fieldType)) {\n\t\t\t\t\t\t\tenrichChildren(node, field, fieldSchema, schema);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t//3.2.5 splitIds()\n\t\t\t\t\t\tsplitMultipleIds(node, field, schema);\n\n\t\t\t\t\t\t/// 3.2.6 Field computes\n\t\t\t\t\t\tif (['rootField', 'linkField', 'roleField'].includes(fieldSchema.fieldType)) {\n\t\t\t\t\t\t\tcomputeFields(node, field, schema);\n\t\t\t\t\t\t}\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\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 (!hasFields) {\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 { isArray } from 'radash';\nimport type { BQLMutationBlock, EnrichedLinkField, EnrichedRoleField } from '../../../../types';\nimport { getOppositePlayers } from '../shared/getOppositePlayers';\nimport { v4 as uuidv4 } from 'uuid';\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\t\tif (subNodes.some((child: unknown) => (child as string).startsWith('_:'))) {\n\t\t\tthrow new Error('[Not supported] At least one child of a replace is a tempId');\n\t\t}\n\n\t\t// eslint-disable-next-line no-param-reassign\n\t\tnode[field] = {\n\t\t\t$id: node[field],\n\t\t\t$op,\n\t\t\t$thing,\n\t\t\t$thingType,\n\t\t\t$bzId: `S_${uuidv4()}`,\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","import type { EnrichedLinkField, EnrichedRoleField } from '../../../../types';\n\nexport const getOppositePlayers = (field: string, fieldSchema: EnrichedLinkField | EnrichedRoleField) => {\n\tif (fieldSchema.fieldType === 'linkField') {\n\t\tconst oppositePlayer = fieldSchema.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.fieldType === 'roleField') {\n\t\tif ([...new Set(fieldSchema.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 (!fieldSchema.playedBy?.length) {\n\t\t\tthrow new Error(`[Internal] Field ${field} should have a player`);\n\t\t}\n\t\treturn fieldSchema.playedBy;\n\t} else {\n\t\tthrow new Error(`[Internal] Field ${field} is not a linkField or roleField`);\n\t}\n};\n","import { isArray } from 'radash';\nimport type { BQLMutationBlock, EnrichedBormSchema } from '../../../../types';\nimport { getOp } from '../shared/getOp';\nimport { v4 as uuidv4 } from 'uuid';\nimport { 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 = getOp(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_${uuidv4()}` }),\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 { getCurrentSchema, getCurrentFields } from '../../../../helpers';\nimport type { BQLMutationBlock, EnrichedBormSchema, BormOperation } from '../../../../types';\n\nexport const validateOp = (parentNode: BQLMutationBlock, node: BQLMutationBlock, schema: EnrichedBormSchema) => {\n\tconst nodeSchema = getCurrentSchema(schema, node);\n\tconst { usedDataFields } = getCurrentFields(nodeSchema, node);\n\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\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","import { getCurrentSchema, getCurrentFields } from '../../../../helpers';\nimport type { BQLMutationBlock, EnrichedBormSchema, BormOperation } from '../../../../types';\nimport { validateOp } from './validateOp';\n\nexport const getOp = (\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, 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 > 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 } from 'radash';\nimport type {\n\tBQLMutationBlock,\n\tEnrichedBormSchema,\n\tEnrichedBQLMutationBlock,\n\tEnrichedLinkField,\n\tEnrichedRoleField,\n} from '../../../../types';\nimport { EdgeSchema } from '../../../../types/symbols';\nimport { getOp } from '../shared/getOp';\nimport { v4 as uuidv4 } from 'uuid';\nimport { getOppositePlayers } from '../shared/getOppositePlayers';\n\nexport const enrichChildren = (\n\tnode: BQLMutationBlock,\n\tfield: string,\n\tfieldSchema: EnrichedLinkField | EnrichedRoleField,\n\tschema: EnrichedBormSchema,\n) => {\n\tconst newNodes = (isArray(node[field]) ? node[field] : [node[field]]).map((subNode: EnrichedBQLMutationBlock) => {\n\t\t///symbols\n\t\t//#region nested nodes\n\t\tconst oppositePlayers = getOppositePlayers(field, fieldSchema);\n\t\tconst [player] = oppositePlayers;\n\n\t\tconst $op = getOp(node, { ...subNode, $thing: player.thing, $thingType: player.thingType }, schema);\n\t\tconst $bzId = subNode.$bzId ? subNode.$bzId : subNode.$tempId ? subNode.$tempId : `N_${uuidv4()}`;\n\n\t\tif (!fieldSchema) {\n\t\t\tthrow new Error(`[Internal] No fieldSchema found in ${JSON.stringify(fieldSchema)}`);\n\t\t}\n\t\treturn {\n\t\t\t...subNode,\n\t\t\t[EdgeSchema]: fieldSchema,\n\t\t\t$thing: player.thing,\n\t\t\t$thingType: player.thingType,\n\t\t\t$op,\n\t\t\t$bzId,\n\t\t};\n\n\t\t//#endregion nested nodes\n\t});\n\n\tnode[field] = isArray(node[field]) ? newNodes : newNodes[0];\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\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.$op === 'create' && !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};\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\tconst computedValue = 'default' in fieldSchema ? fieldSchema.default?.fn(currentThing) : undefined;\n\treturn computedValue;\n};\n\nexport const computeNode = () => {};\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\t// @ts-expect-error - TODO\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\t//@ts-expect-error - TODO\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","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 } 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 newNodes = (isArray(node[field]) ? node[field] : [node[field]]).map((subNode: EnrichedBQLMutationBlock) => {\n\t\t// Step 1: Default node attributes\n\n\t\t// Step 2: Transform nodes\n\t\tif (isBQLBlock(subNode)) {\n\t\t\t// @ts-expect-error todo\n\t\t\tif (subNode.$fields || subNode[IsTransformed]) {\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 triggeredActions = getTriggeredActions(subNode, schema).filter(\n\t\t\t\t(action) => action.type === 'transform',\n\t\t\t) as TransFormAction[];\n\n\t\t\tconst parentNode = clone(deepCurrent(node)) as EnrichedBQLMutationBlock;\n\t\t\tconst currentNode = clone(deepCurrent(subNode)) as EnrichedBQLMutationBlock;\n\t\t\tconst userContext = (config.mutation?.context || {}) as Record<string, any>;\n\t\t\tconst dbNode = clone(\n\t\t\t\tdeepCurrent<EnrichedBQLMutationBlock | Record<string, never>>(subNode[DBNode] || subNode.$dbNode),\n\t\t\t) as EnrichedBQLMutationBlock | Record<string, never>;\n\n\t\t\ttriggeredActions.forEach((action) => {\n\t\t\t\t//! Todo: Sandbox the function in computeFunction()\n\t\t\t\tconst newProps = action.fn(currentNode, parentNode, userContext, dbNode || {});\n\t\t\t\tif (Object.keys(newProps).length === 0) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// eslint-disable-next-line no-param-reassign\n\t\t\t\tsubNode = { ...currentNode, ...newProps, ...getSymbols(subNode), [IsTransformed]: true };\n\t\t\t});\n\n\t\t\treturn subNode;\n\t\t}\n\t\t//#endregion nested nodes\n\t});\n\n\tnode[field] = isArray(node[field]) ? newNodes : newNodes[0];\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","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 { 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","/* 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 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 } 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\t\t\t\tif (edges.find((x) => x.$bzId === node.$bzId)) {\n\t\t\t\t\tthrow new Error(`Duplicate $bzId ${node.$bzId} for node ${JSON.stringify(node)}`);\n\t\t\t\t}\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)) {\n\t\t\t\t\t// throw new Error(`Duplicate id ${idValue} for edge ${JSON.stringify(edge)}`);\n\t\t\t\t}\n\t\t\t\tif (edges.find((x) => x.$bzId === edge.$bzId)) {\n\t\t\t\t\tthrow new Error(`Duplicate %bzId ${edge.$bzIdd} 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\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');\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?.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.relation === value.$thing;\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\tthrow new Error('Unsupported: Nested replaces not implemented yet');\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: edgeSchema.relation,\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\tif (v.length > 1) {\n\t\t\t\t\t\t\t\t\t\t\tthrow new Error(`[Error] Role ${k} is not a MANY relation`);\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\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// 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/// VALIDATIONS\n\n\t// VALIDATION: Check that every thing in the list that is an edge, has at least one player\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\nconst getCommonKey = (obj1: Record<string, any>, obj2: Record<string, any>): string | undefined => {\n\tconst keys1 = Object.keys(obj1);\n\tconst keys2 = Object.keys(obj2);\n\tconst commonKeys = keys1.filter((key) => keys2.includes(key));\n\n\tconst commonKeysWithStringOrNumber = commonKeys\n\t\t.find((key) => typeof obj1[key] === 'string' || typeof obj1[key] === 'number')\n\t\t?.toString();\n\tif (commonKeysWithStringOrNumber) {\n\t\treturn commonKeysWithStringOrNumber;\n\t}\n\t// todo: skip and filter by children keys?\n\tif (commonKeys) {\n\t\tthrow new Error('Todo. Meanwhile get id of everything so you can sort by id(or other prop)');\n\t}\n\treturn undefined;\n};\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 { isArray, listify, mapEntries, shake } from 'radash';\n\nimport { getCurrentSchema, isBQLBlock } from '../../../helpers';\nimport type { EnrichedBormSchema, EnrichedBQLMutationBlock } from '../../../types';\nimport { EdgeType } from '../../../types/symbols';\nimport { parseFlexVal } from '../../../adapters/typeDB/parseFlexVal';\nimport { nanoid } from 'nanoid';\n\nexport const buildTQLMutation = async (things: any, edges: any, schema: EnrichedBormSchema) => {\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${nanoid()}`;\n\n\t\t\t\tconst parsedVal = isArray(v) ? v.map((v) => parseFlexVal(v)) : parseFlexVal(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","import { isDate } from 'radash';\n\nexport const parseFlexVal = (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","/* eslint-disable no-param-reassign */\nimport { produce } from 'immer';\nimport { traverse } from 'object-traversal';\nimport { 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 getFieldKeys = (block: FilledBQLMutationBlock | Partial<FilledBQLMutationBlock>, noDataFields?: boolean) => {\n\t\treturn Object.keys(block).filter((key) => {\n\t\t\tif (!key.startsWith('$') && 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('$') && isObject(parent)) {\n\t\t\tconst values = Array.isArray(parent[key]) ? parent[key] : [parent[key]];\n\t\t\t// @ts-expect-error todo\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 = block[k];\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\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\tconfig,\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\tconst ids = hardId ? hardId : Array.isArray($objectPath?.ids) ? `[${$objectPath?.ids}]` : $objectPath?.ids;\n\n\t\tconst final = `${root}.${ids}___${$objectPath?.key}`;\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};\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, (context) => {\n\t\t\t\tconst { key, parent } = context;\n\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\t// @ts-expect-error todo\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}\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, (context) => {\n\t\t\t\tconst { key, value, parent } = context;\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\tparent[key].$parentIsCreate = parent.$op === 'create';\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\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\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(_opBlock) => !_opBlock.$id && !_opBlock.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\totherOps.push({ ...opBlock, $bzId: opBlock.$tempId || `T_${uuidv4()}` });\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\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\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) {\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\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\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 || `T_${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];\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: { beforePath: combinationBlock.$objectPath, ids: id, key: k },\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\tcombinationBlock[k] = newBlocks;\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 || `T_${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\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\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 } = 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\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 : [])\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","/* 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","/* 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} 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// 1. Moving $id into filter based on schema's idFields\n\t\t\t\tif (value.$id) {\n\t\t\t\t\t//Skip the filter branch\n\t\t\t\t\tif (meta.nodePath?.includes('.$filter')) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\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\t\t\t\t\tvalue[QueryPath as any] = meta.nodePath;\n\t\t\t\t\tconst currentSchema = getCurrentSchema(schema, node);\n\t\t\t\t\tif (value.$filter) {\n\t\t\t\t\t\tvalue.$filterByUnique = checkFilterByUnique(value.$filter, currentSchema);\n\t\t\t\t\t\tvalue.$filter = enrichFilter(value.$filter, value.$thing, schema);\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\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 allFields = [...dataFields, ...linkFields, ...roleFields];\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\tif (!Array.isArray($filter[field])) {\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($filter[field]);\n\n\t\t\treturn isIdField || isUniqueDataField || isSingle$id;\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 } : {}), ...enrichFilter(field.$filter, $thing, schema) }\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: playedBy,\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 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 } : {}), ...enrichFilter(field.$filter, thing, schema) }\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,\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\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}\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\nconst 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 {\n\t\t\t\t\t// we don't want to enrich the special keys, for instance $or: ... stays as it is but we enrich nested things:\n\t\t\t\t\tacc[key] = enrichFilter(value, $thing, schema); //$thing does not change as we are just jumping throws reserved words like $or, $eq etc\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 === 'dataField') {\n\t\t\t\t\tacc[key] = value;\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\treturn acc;\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","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\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');\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\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\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\tEnrichedLinkField,\n\tEnrichedLinkQuery,\n\tEnrichedRoleField,\n\tEnrichedRoleQuery,\n\tFilter,\n} from '../../../types';\nimport { getFieldType, indent } from '../../../helpers';\nimport { FieldSchema, QueryPath, SuqlMetadata } from '../../../types/symbols';\nimport { isArray, isObject, shake } from 'radash';\nimport { prepareTableNameSurrealDB } from '../../../adapters/surrealDB/helpers';\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) => prepareTableNameSurrealDB(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('meta::id(id) as `$id`', level));\n\tlines.push(indent('meta::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\n\tif (query.$fieldType === 'data') {\n\t\treturn buildAttributeQuery({ query, level });\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(`meta::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\nconst parseFilter = (filter: Filter, currentThing: string, schema: EnrichedBormSchema): Filter => {\n\tif (filter === null || filter === undefined) {\n\t\treturn filter;\n\t}\n\tconst wasArray = isArray(filter);\n\tconst arrayFilter = wasArray ? filter : [filter];\n\n\tconst resultArray = arrayFilter.map((f) => {\n\t\tconst keys = Object.keys(f);\n\t\tconst result = keys.reduce((acc, key) => {\n\t\t\tconst value = f[key];\n\t\t\tif (key.startsWith('$')) {\n\t\t\t\tif (key === '$not') {\n\t\t\t\t\treturn { ...acc, $not: undefined, ['$!']: parseFilter(value, currentThing, schema) };\n\t\t\t\t}\n\t\t\t\tif (key === '$or') {\n\t\t\t\t\treturn { ...acc, $or: undefined, $OR: parseFilter(value, currentThing, schema) };\n\t\t\t\t}\n\t\t\t\tif (key === '$and') {\n\t\t\t\t\treturn { ...acc, $and: undefined, $AND: parseFilter(value, currentThing, schema) };\n\t\t\t\t}\n\t\t\t\tif (key === '$eq') {\n\t\t\t\t\treturn { ...acc, '$nor': undefined, '$=': parseFilter(value, currentThing, schema) };\n\t\t\t\t}\n\t\t\t\tif (key === '$id') {\n\t\t\t\t\treturn { ...acc, '$id': undefined, 'meta::id(id)': { $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 meta::tb(id) ...\n\t\t\t\t}\n\t\t\t\treturn { ...acc, [key]: parseFilter(value, currentThing, schema) };\n\t\t\t}\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\t\t\tif (fieldType === 'dataField') {\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\t\t\t\tif (key === currentSchema.idFields[0]) {\n\t\t\t\t\treturn { ...acc, 'meta::id(id)': { $IN: isArray(value) ? value : [value] } };\n\t\t\t\t}\n\t\t\t\treturn { ...acc, [key]: value }; //Probably good place to add ONLY and other stuff depending on the fieldSchema\n\t\t\t}\n\t\t\tif (fieldType === 'linkField' || fieldType === 'roleField') {\n\t\t\t\tconst fieldSchemaTyped = fieldSchema as EnrichedLinkField | EnrichedRoleField;\n\t\t\t\tconst [childrenThing] = fieldSchemaTyped.$things;\n\t\t\t\tconst surrealDBKey = fieldSchemaTyped[SuqlMetadata].queryPath;\n\n\t\t\t\treturn { ...acc, [surrealDBKey]: parseFilter(value, childrenThing, schema) };\n\t\t\t}\n\t\t\tthrow new Error(`Field ${key} not found in schema, Defined in $filter`);\n\t\t}, {});\n\t\treturn shake(result);\n\t});\n\treturn wasArray ? resultArray : resultArray[0];\n};\n\nconst buildSuqlFilter = (filter: object) => {\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//TODO: probably better to do it by key first, instead of filtering by the type of value, but it works so to refacto once needed.\n\t\tif (['$OR', '$AND', '$!'].includes(key)) {\n\t\t\tconst logicalOperator = key.replace('$', '');\n\t\t\tconst nestedFilters = Array.isArray(value) ? value.map((v) => buildSuqlFilter(v)) : [buildSuqlFilter(value)];\n\t\t\tif (logicalOperator === '!') {\n\t\t\t\tparts.push(`!(${nestedFilters.join(` ${logicalOperator} `)})`);\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\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('$')) {\n\t\t\t\tthrow new Error(`Invalid key ${key}`);\n\t\t\t} else {\n\t\t\t\tif (Object.keys.length === 1 && Object.keys(value)[0].startsWith('$')) {\n\t\t\t\t\t// This is the case where the filter has an operator manually defined\n\t\t\t\t\tconst [operator] = Object.keys(value);\n\t\t\t\t\t//@ts-expect-error its ok, single key\n\t\t\t\t\tconst nextValue = value[operator];\n\t\t\t\t\tif (isArray(nextValue)) {\n\t\t\t\t\t\tparts.push(`${key} ${operator.replace('$', '')} [${nextValue.map((v) => `'${v}'`).join(', ')}]`);\n\t\t\t\t\t} else if (isObject(nextValue)) {\n\t\t\t\t\t\tconst nestedFilter = buildSuqlFilter(nextValue);\n\t\t\t\t\t\tparts.push(`${key} ${operator.replace('$', '')} ${nestedFilter}`);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tparts.push(`${key} ${operator.replace('$', '')} '${nextValue}'`);\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\tif (Array.isArray(value)) {\n\t\t\t\tconst operator = key.startsWith('$') ? key.replace('$', '') : 'IN';\n\t\t\t\tparts.push(`${key} ${operator} [${value.map((v) => `'${v}'`).join(', ')}]`);\n\t\t\t} else {\n\t\t\t\tconst operator = key.startsWith('$') ? key.replace('$', '') : '=';\n\t\t\t\tparts.push(`${key} ${operator} '${value}'`);\n\t\t\t}\n\t\t}\n\t});\n\n\treturn parts.join(' AND ');\n};\n\nconst 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\t\tconst { field, desc } = i;\n\t\treturn `${field}${desc ? ' DESC' : ' ASC'}`;\n\t});\n\treturn `ORDER BY ${sorters.join(', ')}`;\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 prepareTableNameSurrealDB = (tableName: string) => {\n\t//if tableName includes any of the chars of this array, then wrap it in backticks\n\n\tif (specialChars.some((char) => tableName.includes(char))) {\n\t\treturn `⟨\\`${tableName}\\`⟩`;\n\t}\n\treturn tableName;\n};\n","import type { Surreal } from 'surrealdb.js';\n\nexport const run = async (props: { client: Surreal; queries: string[] }): Promise<any[][]> => {\n\tconst { client, queries } = props;\n\tconst batchedQuery = `\n\tBEGIN TRANSACTION;\n\t${queries.join(';')};\n\tCOMMIT TRANSACTION;\n\t`;\n\treturn await client.query(batchedQuery);\n};\n","import { isArray } from 'radash';\nimport type {\n\tBormConfig,\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';\n\nexport const parse = (props: {\n\tres: Record<string, any>[][];\n\tqueries: EnrichedBQLQuery[];\n\tschema: EnrichedBormSchema;\n\tconfig: BormConfig;\n}) => {\n\tconst { res, queries } = props;\n\t//console.log('res!', res);\n\tconst result = res.map((r, i) => parseRes(queries[i], r));\n\t//console.log('result', result);\n\treturn result;\n};\n\nconst parseRes = (query: EnrichedBQLQuery | EnrichedLinkQuery | EnrichedRoleQuery, res: Record<string, any>[]) => {\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]);\n\t\t\t}\n\t\t}\n\t\tif (res.length >= 1) {\n\t\t\treturn res.map((r) => parseObj(query, r));\n\t\t}\n\t} else {\n\t\tthrow new Error('res is unexpectedly not an array');\n\t}\n};\n\nconst parseObj = (query: EnrichedBQLQuery | EnrichedLinkQuery | EnrichedRoleQuery, obj: Record<string, any>) => {\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(obj['$thing']),\n\t\t$thingType: query.$thingType, //This is actually not true always, will need to be fetched from the $thing\n\t};\n\n\tquery.$fields.forEach((f) => {\n\t\t//console.log('FIELD', f.$dbPath, 'object', obj);\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);\n\t});\n\treturn newObj;\n};\n\nconst parseFieldResult = (query: EnrichedFieldQuery, value: any) => {\n\tif (value === undefined || value === null || (isArray(value) && value.length === 0)) {\n\t\treturn null;\n\t}\n\tif (query.$fieldType === 'data') {\n\t\tif (query[FieldSchema].cardinality === 'ONE') {\n\t\t\tisArray(value) ? value[0] : value;\n\t\t}\n\t\treturn value ?? null;\n\t}\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\treturn value[0]?.id ?? null;\n\t\t}\n\t\t// TODO: Look up what the id field is in the schema.\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]);\n\t\t}\n\t\treturn parseRes(query, value);\n\t}\n};\n","import type { Surreal } from 'surrealdb.js';\nimport 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';\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: Surreal;\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) => build({ queries: ctx.bql.queries, schema: ctx.schema }),\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) });\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: Surreal,\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 { isArray, isObject } from 'radash';\nimport { getIdFieldKey, getSchemaByThing, indent } from '../../../helpers';\nimport type {\n\tEnrichedAttributeQuery,\n\tEnrichedBormEntity,\n\tEnrichedBormRelation,\n\tEnrichedBormSchema,\n\tEnrichedBQLQuery,\n\tEnrichedLinkQuery,\n\tEnrichedRoleQuery,\n} from '../../../types';\nimport type { Filter, PositiveFilter } from '../../../types/requests/queries';\nimport { FieldSchema, QueryPath } from '../../../types/symbols';\nimport { v4 as uuidv4 } from 'uuid';\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 mapFilterKeys = (filter: Filter, thingSchema: EnrichedBormEntity | EnrichedBormRelation) => {\n\t//? This does not work recursively?\n\tconst mapper: Record<string, string> = {};\n\n\tthingSchema.dataFields?.forEach((df) => {\n\t\tif (df.path !== df.dbPath) {\n\t\t\t//todo dbPath into TQLMetadata instead of a global dbPath. To be done during enrichment\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) {\n\t\tnewFilter.$not = mapPositiveFilterKeys($not as PositiveFilter, mapper);\n\t}\n\n\treturn newFilter;\n};\n\nconst mapPositiveFilterKeys = (filter: PositiveFilter, mapper: Record<string, string>) => {\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 buildFilter = (props: {\n\t$filter: Filter;\n\t$var: string;\n\t$thing: string;\n\tschema: EnrichedBormSchema;\n\tdepth: number;\n}) => {\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 thing = getSchemaByThing(schema, $thing);\n\tconst matches: string[] = [];\n\n\tObject.entries($not || {}).forEach(([key, value]) => {\n\t\tif (key.startsWith('$')) {\n\t\t\treturn; //todo: buildFilter should look similar to the surrealDB one, where we actually check the $or, $and, $not, $id, $thing etc. Aso we can split it in two step, parse to get all the keys etc, and build that only changes the format\n\t\t}\n\t\tconst df = thing.dataFields?.find((df) => df.dbPath === key);\n\t\tif (df) {\n\t\t\tif (value === null) {\n\t\t\t\tmatches.push(indent(`$${$var} has ${key} $${key}_${uuidv4()};`, depth));\n\t\t\t} else if (Array.isArray(value)) {\n\t\t\t\tvalue.forEach((v) => {\n\t\t\t\t\tmatches.push(indent(`not { $${$var} has ${key} ${serializeValue(v)}; };`, depth));\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tmatches.push(indent(`not { $${$var} has ${key} ${serializeValue(value)}; };`, depth));\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tconst lf = thing.linkFields?.find((lf) => lf.path === key);\n\t\tif (lf) {\n\t\t\tconst [opposite] = lf.oppositeLinkFieldsPlayedBy;\n\t\t\tconst oppositeThing = getSchemaByThing(schema, opposite.thing);\n\t\t\tconst oppositeIdField = oppositeThing.idFields?.[0];\n\t\t\tif (!oppositeIdField) {\n\t\t\t\tthrow new Error(`\"${opposite.thing}\" does not have an id field`);\n\t\t\t}\n\t\t\tif (lf.target === 'relation') {\n\t\t\t\tif (value === null) {\n\t\t\t\t\tmatches.push(indent(`(${lf.plays}: $${$var}) isa ${lf.relation};`, depth));\n\t\t\t\t} else if (Array.isArray(value)) {\n\t\t\t\t\tvalue.forEach((v) => {\n\t\t\t\t\t\tmatches.push(\n\t\t\t\t\t\t\tindent(\n\t\t\t\t\t\t\t\t`not { (${lf.plays}: $${$var}) isa ${lf.relation}, has ${oppositeIdField} ${serializeValue(v)}; };`,\n\t\t\t\t\t\t\t\tdepth,\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} else {\n\t\t\t\t\tmatches.push(\n\t\t\t\t\t\tindent(\n\t\t\t\t\t\t\t`not { (${lf.plays}: $${$var}) isa ${lf.relation}, has ${oppositeIdField} ${serializeValue(value)}; };`,\n\t\t\t\t\t\t\tdepth,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst oppVar = `${opposite.thing}_${uuidv4()}`;\n\t\t\t\tif (value === null) {\n\t\t\t\t\tmatches.push(\n\t\t\t\t\t\tindent(\n\t\t\t\t\t\t\t`$${oppVar} isa ${opposite.thing}; (${lf.plays}: $${$var}, ${opposite.plays}: $${oppVar}) isa ${lf.relation};`,\n\t\t\t\t\t\t\tdepth,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t} else if (Array.isArray(value)) {\n\t\t\t\t\tvalue.forEach((v) => {\n\t\t\t\t\t\tmatches.push(\n\t\t\t\t\t\t\tindent(\n\t\t\t\t\t\t\t\t`not { $${oppVar} isa ${opposite.thing}, has ${oppositeIdField} ${serializeValue(v)}; (${lf.plays}: $${$var}, ${opposite.plays}: $${oppVar}) isa ${lf.relation}; };`,\n\t\t\t\t\t\t\t\tdepth,\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} else {\n\t\t\t\t\tmatches.push(\n\t\t\t\t\t\tindent(\n\t\t\t\t\t\t\t`not { $${oppVar} isa ${opposite.thing}, has ${oppositeIdField} ${serializeValue(value)}; (${lf.plays}: $${$var}, ${opposite.plays}: $${oppVar}) isa ${lf.relation}; };`,\n\t\t\t\t\t\t\tdepth,\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\treturn;\n\t\t}\n\n\t\tif (thing.thingType === 'relation') {\n\t\t\tconst role = thing.roles[key];\n\t\t\tif (role) {\n\t\t\t\tconst [player] = role.playedBy || [];\n\t\t\t\tconst playerThing = getSchemaByThing(schema, player.thing);\n\t\t\t\tconst playerIdField = playerThing.idFields?.[0];\n\t\t\t\tif (!playerIdField) {\n\t\t\t\t\tthrow new Error(`\"${player.thing}\" does not have an id field`);\n\t\t\t\t}\n\t\t\t\tconst playerVar = `${player.thing}_${uuidv4()}`;\n\t\t\t\tconst filterId = uuidv4();\n\t\t\t\tconst filterVar = `${$var}_${filterId}`;\n\t\t\t\tif (value === null) {\n\t\t\t\t\tmatches.push(indent(`$${filterVar} isa ${$thing};`, depth));\n\t\t\t\t\tmatches.push(indent(`$${filterVar} (${player.plays}: ${playerVar});`, depth));\n\t\t\t\t\tmatches.push(indent(`$${$var} is $${filterVar};`, depth));\n\t\t\t\t} else if (Array.isArray(value)) {\n\t\t\t\t\tvalue.forEach((v) => {\n\t\t\t\t\t\tmatches.push(indent(`$${filterVar} isa ${$thing};`, depth));\n\t\t\t\t\t\tmatches.push(\n\t\t\t\t\t\t\tindent(\n\t\t\t\t\t\t\t\t`not { $${playerVar} isa ${player.thing}, has ${playerIdField} ${serializeValue(v)}; $${filterVar} (${player.plays}: $${playerVar}); };`,\n\t\t\t\t\t\t\t\tdepth,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tmatches.push(indent(`$${$var} is $${filterVar};`, depth));\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tmatches.push(indent(`$${filterVar} isa ${$thing};`, depth));\n\t\t\t\t\tmatches.push(\n\t\t\t\t\t\tindent(\n\t\t\t\t\t\t\t`not { $${playerVar} isa ${player.thing}, has ${playerIdField} ${serializeValue(value)}; $${filterVar} (${player.plays}: $${playerVar}); };`,\n\t\t\t\t\t\t\tdepth,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\tmatches.push(indent(`$${$var} is $${filterVar};`, depth));\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t});\n\n\tObject.entries(rest).forEach(([key, value]) => {\n\t\tif (key.startsWith('$')) {\n\t\t\treturn; //todo: buildFilter should look similar to the surrealDB one, where we actually check the $or, $and, $not, $id, $thing etc\n\t\t}\n\t\tconst df = thing.dataFields?.find((df) => df.dbPath === key);\n\t\tif (df) {\n\t\t\tif (value === null) {\n\t\t\t\tmatches.push(indent(`not { $${$var} has ${key} $${key}_${uuidv4()}; };`, depth));\n\t\t\t} else if (Array.isArray(value)) {\n\t\t\t\tconst alt = value.map((v) => `$${$var} has ${key} ${serializeValue(v)};`);\n\t\t\t\tconst match = joinAlt(alt);\n\t\t\t\tif (match) {\n\t\t\t\t\tmatches.push(indent(match, depth));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tmatches.push(indent(`$${$var} has ${key} ${serializeValue(value)};`, depth));\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tconst lf = thing.linkFields?.find((lf) => lf.path === key);\n\t\tif (lf) {\n\t\t\tconst [opposite] = lf.oppositeLinkFieldsPlayedBy;\n\t\t\tconst oppositeThing = getSchemaByThing(schema, opposite.thing);\n\t\t\tconst oppositeIdField = oppositeThing.idFields?.[0];\n\t\t\tif (!oppositeIdField) {\n\t\t\t\tthrow new Error(`\"${opposite.thing}\" does not have an id field`);\n\t\t\t}\n\t\t\tif (lf.target === 'relation') {\n\t\t\t\tif (value === null) {\n\t\t\t\t\tmatches.push(indent(`not { (${lf.plays}: $${$var}) isa ${lf.relation}; };`, depth));\n\t\t\t\t} else if (Array.isArray(value)) {\n\t\t\t\t\tconst alt = value.map(\n\t\t\t\t\t\t(v) => `(${lf.plays}: $${$var}) isa ${lf.relation}, has ${oppositeIdField} ${serializeValue(v)};`,\n\t\t\t\t\t);\n\t\t\t\t\tconst match = joinAlt(alt);\n\t\t\t\t\tif (match) {\n\t\t\t\t\t\tmatches.push(indent(match, depth));\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tmatches.push(\n\t\t\t\t\t\tindent(\n\t\t\t\t\t\t\t`(${lf.plays}: $${$var}) isa ${lf.relation}, has ${oppositeIdField} ${serializeValue(value)};`,\n\t\t\t\t\t\t\tdepth,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst oppVar = `${opposite.thing}_${uuidv4()}`;\n\t\t\t\tif (value === null) {\n\t\t\t\t\tmatches.push(\n\t\t\t\t\t\tindent(\n\t\t\t\t\t\t\t`not { $${oppVar} isa ${opposite.thing}; (${lf.plays}: $${$var}, ${opposite.plays}: $${oppVar}) isa ${lf.relation}; };`,\n\t\t\t\t\t\t\tdepth,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t} else if (Array.isArray(value)) {\n\t\t\t\t\tconst alt = value.map(\n\t\t\t\t\t\t(v) =>\n\t\t\t\t\t\t\t`$${oppVar} isa ${opposite.thing}, has ${oppositeIdField} ${serializeValue(v)}; (${lf.plays}: $${$var}, ${opposite.plays}: $${oppVar}) isa ${lf.relation};`,\n\t\t\t\t\t);\n\t\t\t\t\tconst match = joinAlt(alt);\n\t\t\t\t\tif (match) {\n\t\t\t\t\t\tmatches.push(indent(match, depth));\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tmatches.push(\n\t\t\t\t\t\tindent(\n\t\t\t\t\t\t\t`$${oppVar} isa ${opposite.thing}, has ${oppositeIdField} ${serializeValue(value)}; (${lf.plays}: $${$var}, ${opposite.plays}: $${oppVar}) isa ${lf.relation};`,\n\t\t\t\t\t\t\tdepth,\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\treturn;\n\t\t}\n\n\t\tif (thing.thingType === 'relation') {\n\t\t\tconst role = thing.roles[key];\n\t\t\tif (role) {\n\t\t\t\tconst [player] = role.playedBy || [];\n\t\t\t\tconst playerThing = getSchemaByThing(schema, player.thing);\n\t\t\t\tconst playerIdField = playerThing.idFields?.[0];\n\t\t\t\tif (!playerIdField) {\n\t\t\t\t\tthrow new Error(`\"${player.thing}\" does not have an id field`);\n\t\t\t\t}\n\t\t\t\tconst playerVar = `${player.thing}_${uuidv4()}`;\n\t\t\t\tconst filterId = uuidv4();\n\t\t\t\tconst filterVar = `${$var}_${filterId}`;\n\t\t\t\tif (value === null) {\n\t\t\t\t\tmatches.push(indent(`$${filterVar} isa ${$thing};`, depth));\n\t\t\t\t\tmatches.push(indent(`not { $${filterVar} (${player.plays}: ${playerVar}); };`, depth));\n\t\t\t\t\tmatches.push(indent(`$${$var} is $${filterVar};`, depth));\n\t\t\t\t} else if (Array.isArray(value)) {\n\t\t\t\t\tconst alt = value.map(\n\t\t\t\t\t\t(v) =>\n\t\t\t\t\t\t\t`$${playerVar} isa ${player.thing}, has ${playerIdField} ${serializeValue(v)}; $${filterVar} (${player.plays}: $${playerVar});`,\n\t\t\t\t\t);\n\t\t\t\t\tconst match = joinAlt(alt);\n\t\t\t\t\tif (match) {\n\t\t\t\t\t\tmatches.push(indent(`$${filterVar} isa ${$thing};`, depth));\n\t\t\t\t\t\tmatches.push(indent(match, depth));\n\t\t\t\t\t\tmatches.push(indent(`$${$var} is $${filterVar};`, depth));\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tmatches.push(indent(`$${filterVar} isa ${$thing};`, depth));\n\t\t\t\t\tmatches.push(\n\t\t\t\t\t\tindent(\n\t\t\t\t\t\t\t`$${playerVar} isa ${player.thing}, has ${playerIdField} ${serializeValue(value)}; $${filterVar} (${player.plays}: $${playerVar});`,\n\t\t\t\t\t\t\tdepth,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\tmatches.push(indent(`$${$var} is $${filterVar};`, depth));\n\t\t\t\t}\n\t\t\t\treturn;\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.join('\\n');\n};\n\nconst joinAlt = (alt: string[]): string | undefined => {\n\tif (alt.length > 1) {\n\t\treturn `{ ${alt.join(' } or { ')} };`;\n\t}\n\tconst [match] = alt;\n\treturn match;\n};\n\nconst serializeValue = (value: string | number | boolean | Date | object) => {\n\tif (typeof value === 'string') {\n\t\treturn `'${value}'`;\n\t}\n\tif (value instanceof Date) {\n\t\treturn `'${value.toISOString().replace('Z', '')}'`;\n\t}\n\n\tif (isObject(value)) {\n\t\t//Todo: Temporal fix, enhance on filters refacto. Btw the dbPath to be added also in the fields as [TypeDBMeta]\n\t\tif ('$id' in value) {\n\t\t\tif (isArray(value.$id)) {\n\t\t\t\treturn `like \"^(${value.$id.join('|')})$\"`;\n\t\t\t}\n\t\t\treturn `\"${value.$id}\"`;\n\t\t}\n\t}\n\treturn `${value}`;\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 { 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 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 { Surreal } from 'surrealdb.js';\nimport 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';\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: Surreal;\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) => enrichBQLQuery(ctx.bql.raw, ctx.schema),\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\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\t\t\t\t\treturn runSurrealDbQueryMachine(a.bqlQueries, ctx.schema, ctx.config, a.client);\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('$')) {\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\tconst [oppositeThing] = role.playedBy || [];\n\t\tif (!oppositeThing) {\n\t\t\tthrow new Error(`Role ${role.name} 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 type {\n\tBQLMutation,\n\tBQLMutationBlock,\n\tBormConfig,\n\tDBHandles,\n\tEnrichedBQLMutationBlock,\n\tEnrichedBormSchema,\n} from '../../types';\nimport { enrichBQLMutation } from './bql/enrich';\nimport type { TqlMutation } from './tql/run';\nimport { runTQLMutation } from './tql/run';\nimport type { TqlRes } from './tql/parse';\nimport { parseTQLMutation } from './tql/parse';\nimport { parseBQLMutation } from './bql/parse';\nimport { buildTQLMutation } from './tql/build';\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';\n\nconst final = state;\ntype MachineContext = {\n\tbql: {\n\t\traw: BQLMutationBlock | BQLMutationBlock[];\n\t\tcurrent: EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[];\n\t\tthings: any[];\n\t\tedges: any[];\n\t\tres: any[];\n\t};\n\ttypeDB: {\n\t\ttqlMutation: TqlMutation;\n\t\ttqlRes: TqlRes;\n\t};\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, current: event.data },\n\t};\n};\n\nconst updateBqlRes = (ctx: MachineContext, event: any) => {\n\treturn {\n\t\t...ctx,\n\t\tbql: { ...ctx.bql, res: 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 updateTQLMutation = (ctx: MachineContext, event: any) => {\n\treturn {\n\t\t...ctx,\n\t\ttypeDB: {\n\t\t\t...ctx.typeDB,\n\t\t\ttqlMutation: event.data,\n\t\t},\n\t};\n};\n\nconst updateTQLRes = (ctx: MachineContext, event: any) => {\n\treturn {\n\t\t...ctx,\n\t\ttypeDB: {\n\t\t\t...ctx.typeDB,\n\t\t\ttqlRes: event.data,\n\t\t},\n\t};\n};\n\n// Actors\n// ============================================================================\n\nconst enrich = async (ctx: MachineContext) => {\n\treturn Object.keys(ctx.bql.current).length\n\t\t? enrichBQLMutation(ctx.bql.current, ctx.schema, ctx.config)\n\t\t: enrichBQLMutation(ctx.bql.raw, ctx.schema, ctx.config);\n};\n\nconst preQuery = async (ctx: MachineContext) => {\n\treturn mutationPreQuery(ctx.bql.current, ctx.schema, ctx.config, ctx.handles);\n};\n\nconst preQueryDependencies = async (ctx: MachineContext) => {\n\treturn preHookDependencies(ctx.bql.current, ctx.schema, ctx.config, ctx.handles);\n};\n\nconst parseBQL = async (ctx: MachineContext) => {\n\treturn parseBQLMutation(ctx.bql.current, ctx.schema);\n};\n\nconst buildMutation = async (ctx: MachineContext) => {\n\treturn buildTQLMutation(ctx.bql.things, ctx.bql.edges, ctx.schema);\n};\n\nconst runMutation = async (ctx: MachineContext) => {\n\treturn runTQLMutation(ctx.typeDB.tqlMutation, ctx.handles, ctx.config);\n};\n\nconst parseMutation = async (ctx: MachineContext) => {\n\treturn parseTQLMutation(ctx.typeDB.tqlRes, ctx.bql.things, ctx.bql.edges, ctx.schema, ctx.config);\n};\n\n// Guards\n// ============================================================================\nconst requiresPreQuery = () => {\n\treturn true;\n};\n\nconst requiresPreHookDependencies = (ctx: MachineContext) => {\n\treturn dependenciesGuard(ctx.bql.current);\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) => stringify(ctx.bql.raw, ctx.schema),\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\tpreHookDependencies: invoke(\n\t\t\tpreQueryDependencies,\n\t\t\ttransition('done', 'enrich', 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\tparseBQL: invoke(parseBQL, transition('done', 'buildMutation', reduce(updateThingsEdges)), errorTransition),\n\t\tbuildMutation: invoke(buildMutation, transition('done', 'runMutation', reduce(updateTQLMutation)), errorTransition),\n\t\trunMutation: invoke(runMutation, transition('done', 'parseMutation', reduce(updateTQLRes)), errorTransition),\n\t\tparseMutation: invoke(parseMutation, transition('done', 'success', reduce(updateBqlRes)), errorTransition),\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\tcurrent: {} as EnrichedBQLMutationBlock,\n\t\t\tthings: [],\n\t\t\tedges: [],\n\t\t\tres: [],\n\t\t},\n\t\ttypeDB: {\n\t\t\ttqlMutation: {} as TqlMutation,\n\t\t\ttqlRes: {} as TqlRes,\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"]}