@blitznocode/blitz-orm 0.13.5 → 0.13.6

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/adapters/surrealDB/client.ts","../src/default.config.ts","../src/adapters/surrealDB/helpers.ts","../src/adapters/surrealDB/parsing/parseFlexVal.ts","../src/adapters/surrealDB/parsing/values.ts","../src/adapters/surrealDB/schema/define.ts","../src/adapters/typeDB/schema/define.ts","../src/define/index.ts","../src/adapters/index.ts","../src/types/symbols/index.ts","../src/enrichSchema.ts","../src/helpers.ts","../src/stateMachine/query/bql/enrich.ts","../src/stateMachine/mutation/bql/enrichSteps/computeFields.ts","../src/engine/helpers.ts","../src/engine/compute.ts","../src/stateMachine/mutation/bql/shared/get$bzId.ts","../src/stateMachine/mutation/bql/shared/validateOp.ts","../src/stateMachine/mutation/bql/shared/getOp.ts","../src/stateMachine/mutation/bql/shared/getOppositePlayers.ts","../src/stateMachine/mutation/bql/enrichSteps/enrichChildren.ts","../src/stateMachine/mutation/bql/enrichSteps/preHookTransformations.ts","../src/stateMachine/mutation/bql/shared/getTriggeredActions.ts","../src/stateMachine/mutation/bql/enrichSteps/preHookValidations.ts","../src/stateMachine/mutation/bql/enrichSteps/preValidate.ts","../src/stateMachine/mutation/bql/enrichSteps/replaces.ts","../src/stateMachine/mutation/bql/enrichSteps/rootMeta.ts","../src/stateMachine/mutation/bql/shared/doActions.ts","../src/stateMachine/mutation/bql/enrichSteps/splitIds.ts","../src/stateMachine/mutation/bql/enrichSteps/unlinkAll.ts","../src/stateMachine/mutation/bql/guards/dependenciesGuard.ts","../src/stateMachine/mutation/bql/enrich.ts","../tests/helpers/matchers.ts","../src/stateMachine/mutation/bql/parse.ts","../src/logger.ts","../src/version.ts","../src/stateMachine/query/queryMachine.ts","../src/stateMachine/query/bql/clean.ts","../src/stateMachine/query/postHook.ts","../src/adapters/surrealDB/filters/filters.ts","../src/stateMachine/query/surql/build.ts","../src/stateMachine/query/surql/buildRefs.ts","../src/stateMachine/query/surql/parse.ts","../src/stateMachine/query/surql/run.ts","../src/stateMachine/query/surql/machine.ts","../src/stateMachine/query/tql/machine.ts","../src/stateMachine/query/tql/filters.ts","../src/stateMachine/query/tql/build.ts","../src/stateMachine/query/tql/parse.ts","../src/adapters/typeDB/helpers.ts","../src/stateMachine/query/tql/run.ts","../src/stateMachine/mutation/bql/preQuery.ts","../src/stateMachine/mutation/mutationMachine.ts","../src/stateMachine/mutation/bql/enrichSteps/preHookDependencies.ts","../src/stateMachine/mutation/bql/flatter.ts","../src/stateMachine/mutation/bql/stringify.ts","../src/stateMachine/mutation/surql/build.ts","../src/stateMachine/mutation/surql/parse.ts","../src/stateMachine/mutation/surql/run.ts","../src/stateMachine/mutation/surql/machine.ts","../src/adapters/typeDB/parseFlexVal.ts","../src/stateMachine/mutation/tql/build.ts","../src/stateMachine/mutation/tql/parse.ts","../src/stateMachine/mutation/tql/run.ts","../src/stateMachine/mutation/tql/machine.ts","../src/index.ts"],"names":["SimpleSurrealClient","params","cb","db","Surreal","args","defaultConfig","sanitizeTableNameSurrealDb","tableName","specialChars","sanitizeNameSurrealDB","value","char","parseFlexValSurrealDB","v","isDate","surrealDBtypeMap","parseValueSurrealDB","ct","parsedVal","isArray","INDENTATION","indent","n","indentPar","str","level","line","convertBQLToSurQL","schema","header","entities","convertSchemaItems","relations","utilityFunctions","addUtilityFunctions","items","name","item","convertSchemaItem","baseDefinition","dataFields","convertDataFields","linkFields","convertLinkFields","roles","convertRoles","parentName","field","fieldType","mapContentTypeToSurQL","dbValue","linkField","relationLinkField","lf","targetPath","type","pathToRelation","relationPath","baseField","supportField","roleName","role","fieldDefinition","roleEvent","generateRoleEvent","eventName","targetRelationLinkField","targetRelationPath","firstTargetRoleLinkField","firstTargetRolePath","usedLinkField","generateSet","fields","action","path","cardinality","impactedLinkFields","allFields","removalsSet","additionsSet","cardOneEvents","cardManyEvents","contentType","validations","defineSURQLSchema","removeDuplicateObjects","arr","uniqueObjects","uniqueMap","obj","dbPath","key","convertTQLSchema","connectorId","output","usedAttributes","eName","entityName","entity","usedLinkFields","relation","plays","inherited","rName","relationName","attributes","attribute","defineTQLSchema","config","dbHandles","typeDBString","session","client","dbName","schemaTransaction","SessionType","TransactionType","bormDefine","typeDBEntriesFixed","entry","surrealDBEntriesFixed","adapterContext","Schema","QueryPath","StepPrint","EdgeType","EdgeSchema","DBNode","IsTransformed","Parent","FieldSchema","SharedMetadata","SuqlMetadata","Extension","enrichSchema","orderedEntities","orderExtended","orderedRelations","allLinkFields","getAllLinkFields","enrichedSchema","thing","extendedThing","addSubType","enrichedThing","enrichThing","enrichedRelation","k","enrichRoleField","expandSubThings","thingMap","ordered","seen","inProcess","pushExtended","getAllExtended","extended","_extended","subThing","_thing","_","handle","idFields","hooks","df","enrichDataField","enrichLinkField","refFields","enrichRefField","getDbPath","refField","thingName","linkFieldRelation","hasRole","queryPath","oppositeLinkFieldsPlayedBy","x","i","allExtends","playedBy","shared","things","oFind","fn","oFilter","entries","error","result","tryit","getSchemaByThing","$thing","getCurrentSchema","node","getFieldType","currentSchema","dataFieldSchema","dataField","linkFieldSchema","roleFieldSchema","getIdFieldKey","idField","getThingType","rootNode","getFieldSchema","foundLinkField","foundDataField","foundRoleField","foundRefField","getCardinality","getCurrentFields","availableDataFields","availableLinkFields","availableRefFields","listify","availableRoleFields","availableFields","allowedFields","usedFields","localFilterFields","nestedFilterFields","unidentifiedFields","localFilters","_v","nestedFilters","capitalizeFirstLetter","string","getParentNode","blocks","parent","meta","pathParts","parentPath","getNodeByPath","getSymbols","oldBlock","symbols","symbolKey","isBQLBlock","block","isObject","deepCurrent","current","plainObject","isDraft","assertDefined","msg","depth","_indent","genId","customAlphabet","enrichBQLQuery","rawBqlQuery","batches","produce","draft","traverse","context","val","enrichFilter","checkFilterByUnique","newFields","processed","processField","getAllFields","f","isId","roleFields","$filter","fieldFilter","isIdField","isUniqueDataField","isSingle$id","filterOperators","eqValue","createDataField","props","fieldStr","$justId","isVirtual","fieldSchema","createLinkField","target","$thingType","idNotIncluded","createRefField","createRoleField","roleField","thingType","wasArray","resultArray","filter","acc","valueAsArray","fieldSchemaTyped","childrenThing","STRIP_COMMENTS","STRIP_KEYWORDS","getParamNames","func","fnBodyStr","paramsBlock","param","p","computeField","currentThing","mandatoryDependencies","missingArgs","arg","computeFields","currentNode","subNode","computedFields","virtualFields","filledFields","attKey","virtualFilledFields","fieldPath","currentFieldDef","currentLinkedDef","currentRoleDef","currentDef","defaultValue","get$bzId","validateOp","parentNode","nodeSchema","usedDataFields","validateChildren","getOp","getOpAndValidate","getOppositePlayers","oppositePlayer","enrichChildren","newNodes","$op","$bzId","refSchema","relationSchema","relFieldSchema","oppositePlayers","player","getTriggeredActions","currentEvent","hook","preHookTransformations","triggeredActions","clone","workingNode","userContext","dbNode","newProps","preHookValidations","requiredFields","enumFields","fnValidatedFields","enumOptions","validationResult","preValidate","paths","subNodes","cleanPath","prefixedToObj","standardPrefixMatch","id","replaceToObj","child","isPrefixed","replaceToObjRef","setRootMeta","withMetadataRootArray","rootOp","doAction","_stepName","isSet","splitMultipleIds","transformedChildren","$id","unlinkAll","uuidv4","dependenciesGuard","mut","o","cleanStep","tempId","dataFieldStep","_node","_field","enrichBQLMutation","rootBlock","has$Fields","toIgnore","lastPath","secondToLastPath","isFilter","relField","rootField","subNodeSchema","uf","usedLinkFieldsSchemas","lf1","lf2","j","deepRemoveMetaData","removeMeta","s","parseBQLMutation","listNodes","nodes","edges","getIdValue","idDataField","defaultIdField","idValue","toNodes","toEdges","edge","currentThingSchema","dataFieldPaths","roleFieldPaths","linkFieldPaths","refFieldPaths","getChildOp","usedRoleFields","usedRefFields","dataObj","shake","pick","edgeSchema","ownRelation","linkTempId","parentId","getLinkObjOp","edgeType1","rolesObjFiltered","rolesObjOnlyIds","mapEntries","objWithMetaDataOnly","getEdgeOp","currentRoles","rolesObjOnlyIdsGrouped","currentRoleCardinality","vNested","edgeType2","operations","operationsArray","childOp","operation","op","edgeType3","parsedThings","parsedEdges","mergedThings","existingIndex","t","mergedEdges","curr","existingEdge","r","newRelation","existingVal","currVal","allThings","tempIds","orphanTempIds","LOG_LEVEL","log","l","logDebug","VERSION","cleanQueryRes","bqlRes","withPostHooks","queryPostHooks","cleanOutput","symbol","postHooks","enrichedBqlQuery","originalNode","queriedFields","excludedFields","virtualFieldPath","computedValue","excludedField","surqlOperators","parseFilter","surrealDBKey","buildSuqlFilter","parts","logicalOperator","nestedFilter","keyWithoutPrefix","valueKeys","operator","nextValue","surrealOperator","buildSorter","sort","desc","build","queries","query","buildQuery","$fields","$offset","$limit","$sort","lines","fieldLines","buildFieldsQuery","allTypesNormed","$ids","allCombinations","parsed","parentQuery","buildFieldQuery","buildAttributeQuery","buildLinkQuery","buildRoleQuery","queryLevel","from","built","fieldLevel","buildRefs","META","createMetaFields","DATA_FIELDS","createDataFields","EDGE_FIELDS","createEdgeFields","REF_FIELDS","createRefFields","FIELDS","FROM","createRootFromClause","WHERE","SORT","LIMIT","OFFSET","formatId","joinTypes","ids","edgeFields","ef","LINK_FIELDS","rf","parse","res","parseRes","parseObj","newObj","parseFieldResult","parseValue","parsedContent","flatNestedField","nf","content","asArray","run","batchedQuery","errorTransition","transition","reduce","ctx","event","surrealDbQueryMachine","createMachine","invoke","linkMode","c","state","awaitQueryMachine","resolve","reject","interpret","service","runSurrealDbQueryMachine","enrichedBql","buildFilter","$nonMappedFilter","$var","mapFilterKeys","$not","rest","matches","isPositiveFilter","notMatches","processPositiveFilter","positiveMatches","isNegated","normalizedKey","subMatches","subFilter","joinedSubMatches","fieldMatches","handleDataFieldFilter","linkMatches","handleLinkFieldFilter","roleMatches","handleRelationRoleFilter","opValue","normalizedOp","match","serializeValue","inAlt","joinAlt","ninMatch","alt","opposite","oppositeIdField","oppVar","playerIdField","playerVar","filterId","filterVar","thingSchema","mapper","newFilter","mapPositiveFilterKeys","filterValue","newKey","separator","buildTQLQuery","$path","$WithIdFilter","sorter","randomId","processDataFields","processLinkFields","processRoleFields","postStrParts","asMetaDataParts","multiVals","postStr","$metaData","multiVal","dotPath","nextDepth","$as","$idNotIncluded","$filterByUnique","$roleVar","withId","withIdFilter","$playedBy","$linkVar","normalizeSorter","sortMatch","attrVar","order","parseTQLQuery","rawBqlRequest","rawTqlRes","rawBql","realParse","schemaValue","parseFields","parsedDataFields","parseDataFields","parsedLinkFields","parseLinkFields","parsedRoleFields","parseRoleFields","keys","dataFieldsKey","multiValKeys","multiValKey","multiValKeyWithout$multiVal","realValue","metaDataKey","dataFieldsThing","$key","parseArrayMetadata","mainDataFields","$asKey","fieldValue","roleFieldsRes","$roleFields","$cardinality","as","justId","filterByUnique","parseMetaData","resDataFields","linkFieldsRes","$linkFields","asRegex","justIdRegex","idNotIncludedRegex","filterByUniqueRegex","asMatch","justIdMatch","idNotIncludedMatch","filterByUniqueMatch","converted","jsonString","_match","p1","p2","e","getSessionOrOpenNewOne","singleHandlerV0","runTQLQuery","tqlRequest","options","TypeDBOptions","transaction","err","resArray","parallel","queryString","updateBqlRes","updateTqlReq","updateTqlRes","typeDbQueryMachine","runTypeDbQueryMachine","bql","handles","updateBqlReq","queryMachine","adapters","q","raw","adapter","adapterList","proms","a","results","orderedResults","index","b","runQueryMachine","preQueryPathSeparator","grandChildOfCreateSymbol","mutationPreQuery","operatorKeys","getFieldKeys","noDataFields","ops","preQueryReq","processBlock","root","filteredBlock","toRemoveFromRoot","toRemove","extractValueFromFilter","opBlock","newField","preQueryRes","getObjectPath","$objectPath","objectPathToKey","hardId","convertManyPaths","input","prefix","itemsWithBrackets","suffix","cache","newObjPath","cacheKey","cacheArray","fillObjectPaths","bqlWithObjectPaths","fillIds","newBlocks","cacheFound","newBlock","subBlocks","newSubBlocks","bqlFilledIds","newFilled","splitBql","processBlocks","getOperationsWithMultiples","opBlocks","operationWithMultiples","operationWithoutMultiples","otherOps","hasMultiple","ob","getAllKeyCombinations","dataFieldObj","allKeys","combinableKeys","generateCombinations","currentObj","fullObj","newObjInclude","crossReferencedOperations","multipleBlock","combinationsToKeep","combinationBlock","foundKeys","childKey","subBlock","newOps","parentKey","idsOfParent","cKey","originalOp","processReplaces","newOpBlocks","replaceIds","createIds","replaceBlock","cacheIds","unlinkIds","linkIds","processedReplaces","processArrayIdsFound","arrayOfIds","cacheOfIds","isOccupied","filledPaths","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","newNode","isObj","getIdFromDbValue","getDbNodeFromDbValue","map","flattenBQLMutation","tree","$tempId","parentObj","operationMap","edgeMeta","isSymbol","opTypes","filteredEdges","ulf","arc","urf","children","childMeta","filteredChildren","orderedEdges","stringify","tObject","tField","oppositeThing","buildSURQLMutation","flat","buildThings","sanitizedThings","restString","metaString","dataFieldStrings","VAR","COND","table","TARGET","parentRef","SET","OUTPUT","DELETE_OUTPUT","buildEdges","asArrayOfVars","arrayString","nodesString","roleFieldsString","buildArcs","roleA","roleB","thingsA","thingsB","isMany1","isMany2","buildReferences","refFieldSchema","refFieldsString","parseSURQLMutation","nulledAtts","_k","withMetaAndId","runSURQLMutation","batchedMutation","filteredErrorRes","updateSURQLMutation","d","updateSURQLRes","surrealDbMutationMachine","awaitMutationMachine","runSurrealDbMutationMachine","bqlRaw","bqlFlat","parseFlexValTypeDB","buildTQLMutation","nodeToTypeQL","bzId","defaultDBConnector","thingDbPath","currentDataField","dbField","attributesVar","matchAttributes","idValueTQL","idAttributes","allAttributes","getDeletionMatchInNodes","getInsertionMatchInNodes","edgeToTypeQL","relationDbPath","roleDbPaths","fromRoleFields","roleDbPath","fromRoleFieldsTql","edgeType","relationTql","relationTqlWithoutRoles","getInsertionsInEdges","getInsertionMatchInEdges","getDeletionMatchInEdges","getDeletionsInEdges","toTypeQL","mode","typeQL","preDeletionBatch","insertionMatch","deletionMatch","insertion","deletion","z","y","nodeOperations","arrayNodeOperations","edgeOperations","arrayEdgeOperations","allOperations","parseTQLMutation","tqlRes","reqThings","reqEdges","expected","exp","dbIdd","matchedThings","runTQLMutation","tqlMutation","mutateTransaction","tqlDeletion","tqlInsertion","insertionsStream","insertionsRes","updateTQLMutation","updateTQLRes","typeDbMutationMachine","runTypeDbMutationMachine","bqRaw","final","updateThingsEdges","updateBQLFlat","updateBQLRes","enrich","preQuery","preQueryDependencies","parseBQL","flattenBQL","requiresPreQuery","dbConnectors","provider","requiresPreHookDependencies","machine","guard","awaitMachine","runMutationMachine","mutation","enableMapSet","BormClient","dbc","clientErr","TypeDB","message","sessionErr","credential","TypeDBCredential","subscribers","initialized","queryConfig","qConfig","isBatched","errorRes","mutationConfig","mConfig","index_default"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { QueryParameters, QueryResult } from 'surrealdb';\nimport Surreal, { ConnectionStatus } from 'surrealdb';\n\nconst QUEUE_TIMEOUT = 5000; // The max duration a query is queued before \"Timeout\" error is thrown.\nconst QUERY_TIMEOUT = 180000; // The max duration a query is run before \"Timeout\" error is thrown.\nconst RECONNECT_INTERVAL = 2000; // Check the connection every `RECONNECT_INTERVAL` and reconnect it if it's not connected.\nconst INITIAL_RECONNECT_INTERVAL = 1000; // If it's failed to reconnect wait with exponential backoff with this initial interval and then try to reconnect again.\nconst MAX_RECONNECT_RETRY_INTERVAL = 60000; // If the reconnection failed wait with exponential backoff with this max interval and then try to reconnect again.\n\nclass SurrealClient {\n private db: Surreal;\n private url: string;\n private username: string;\n private password: string;\n private namespace: string;\n private database: string;\n private isConnecting: boolean;\n private reconnectInterval: ReturnType<typeof setInterval> | null;\n\n constructor(params: { url: string; username: string; password: string; namespace: string; database: string }) {\n this.db = new Surreal();\n this.url = params.url;\n this.username = params.username;\n this.password = params.password;\n this.namespace = params.namespace;\n this.database = params.database;\n this.isConnecting = false;\n this.reconnectInterval = null;\n }\n\n private async _connect() {\n if (\n this.isConnecting ||\n this.db.status === ConnectionStatus.Connecting ||\n this.db.status === ConnectionStatus.Connected\n ) {\n return;\n }\n this.isConnecting = true;\n this.db = new Surreal();\n let retryTimeout = Math.max(INITIAL_RECONNECT_INTERVAL, 1);\n // eslint-disable-next-line no-constant-condition\n while (true) {\n let failed = false;\n try {\n await this.db.connect(this.url, {\n namespace: this.namespace,\n database: this.database,\n auth: {\n username: this.username,\n password: this.password,\n },\n versionCheck: false,\n });\n break;\n } catch (_e) {\n failed = true;\n await this.close();\n if (this.isClosed) {\n break;\n }\n }\n if (failed) {\n await sleep((1 + Math.random() * 0.1) * retryTimeout);\n retryTimeout = Math.min(2 * retryTimeout, MAX_RECONNECT_RETRY_INTERVAL);\n await this._connect();\n }\n }\n this.isConnecting = false;\n }\n\n async connect() {\n if (this.isClosed) {\n this.reconnectInterval = setInterval(() => this._connect(), RECONNECT_INTERVAL);\n }\n return this._connect();\n }\n\n async close() {\n if (this.reconnectInterval !== null) {\n clearInterval(this.reconnectInterval);\n this.reconnectInterval = null;\n try {\n await this.db.close();\n } catch (e) {\n console.error('Trying to close an already closed connection:', e);\n }\n }\n }\n\n get isClosed() {\n return this.reconnectInterval === null;\n }\n\n private async run<T>(cb: (db: Surreal) => Promise<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.close();\n this.connect();\n reject(new Error('Timeout'));\n }, QUERY_TIMEOUT);\n this.connect()\n .then(() => {\n cb(this.db)\n .then(resolve)\n .catch(reject)\n .finally(() => {\n clearTimeout(timeout);\n });\n })\n .catch(reject);\n });\n }\n\n async query<T = unknown>(...args: QueryParameters): Promise<T[]> {\n return this.run((db) => {\n return db.query(...args);\n });\n }\n\n async query_raw<T = unknown>(...args: QueryParameters): Promise<QueryResult<T>[]> {\n return this.run((db) => {\n return db.query_raw(...args);\n });\n }\n}\n\nconst sleep = async (timeout: number) => {\n return new Promise((resolve) => {\n setTimeout(resolve, timeout);\n });\n};\n\ninterface QueueItem {\n cb: (err?: any, client?: SurrealClient) => void;\n timeout: () => boolean;\n}\n\nexport class SurrealPool {\n private queue: QueueItem[]; // TODO: Make this more sophisticated\n private connections: SurrealClient[]; // TODO: Make this more sophisticated\n\n constructor(params: {\n url: string;\n username: string;\n password: string;\n namespace: string;\n database: string;\n totalConnections: number;\n }) {\n const { totalConnections, ...clientParams } = params;\n this.queue = [];\n this.connections = new Array(totalConnections).fill(0).map(() => {\n const client = new SurrealClient(clientParams);\n client.connect();\n return client;\n });\n }\n\n private async dequeue() {\n if (this.queue.length === 0 || this.connections.length === 0) {\n return;\n }\n const q = this.queue[0] as QueueItem;\n this.queue = this.queue.slice(1);\n if (q.timeout()) {\n q.cb(new Error('Timeout'), undefined);\n this.dequeue();\n return;\n }\n\n const con = this.connections.pop() as SurrealClient;\n\n try {\n q.cb(undefined, con);\n } catch (err) {\n q.cb(err, undefined);\n } finally {\n this.connections.push(con);\n this.dequeue();\n }\n }\n\n private async run<T>(cb: (err?: any, client?: SurrealClient) => Promise<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n let isTimeout = false;\n const timeout = setTimeout(() => {\n isTimeout = true;\n reject(new Error('Timeout'));\n }, QUEUE_TIMEOUT);\n this.queue.push({\n cb: (err, client) => {\n clearTimeout(timeout);\n cb(err, client)\n .then((res) => resolve(res))\n .catch((e) => reject(e));\n },\n timeout: () => isTimeout,\n });\n this.dequeue();\n });\n }\n\n async query<T = unknown>(...args: QueryParameters): Promise<T[]> {\n return this.run((err, client) => {\n if (client) {\n return client.query<T>(...args);\n }\n throw err;\n });\n }\n\n async query_raw<T = unknown>(...args: QueryParameters): Promise<QueryResult<T>[]> {\n return this.run((err, client) => {\n if (client) {\n return client.query_raw<T>(...args);\n }\n throw err;\n });\n }\n}\n\nexport class SimpleSurrealClient {\n private url: string;\n private username: string;\n private password: string;\n private namespace: string;\n private database: string;\n\n constructor(params: { url: string; username: string; password: string; namespace: string; database: string }) {\n this.url = params.url;\n this.username = params.username;\n this.password = params.password;\n this.namespace = params.namespace;\n this.database = params.database;\n }\n\n private async run<T>(cb: (db: Surreal) => Promise<T>): Promise<T> {\n const db = new Surreal();\n try {\n await db.connect(this.url, {\n namespace: this.namespace,\n database: this.database,\n auth: {\n username: this.username,\n password: this.password,\n },\n versionCheck: false,\n });\n return await cb(db);\n } finally {\n await db.close();\n }\n }\n\n async query<T = unknown>(...args: QueryParameters): Promise<T[]> {\n return this.run<T[]>((db) => db.query(...args));\n }\n\n async query_raw<T = unknown>(...args: QueryParameters): Promise<QueryResult<T>[]> {\n return this.run<QueryResult<T>[]>((db) => db.query_raw(...args));\n }\n}\n","import type { BormConfig } from './types';\n\nexport const defaultConfig: Partial<BormConfig> = {\n query: {\n noMetadata: false,\n simplifiedLinks: true,\n debugger: false,\n returnNulls: false,\n },\n\n mutation: {\n noMetadata: false,\n preQuery: true,\n ignoreNonexistingThings: false,\n },\n};\n","export const sanitizeTableNameSurrealDb = (tableName: string) => {\n return tableName.replace(/`/g, '');\n};\n\nconst specialChars = [\n ' ',\n '-',\n '+',\n '*',\n '/',\n '=',\n '!',\n '@',\n '#',\n '$',\n '%',\n '^',\n '&',\n '(',\n ')',\n '[',\n ']',\n '{',\n '}',\n '|',\n '\\\\',\n ';',\n ':',\n \"'\",\n '\"',\n ',',\n '<',\n '>',\n '.',\n '?',\n '~',\n '`',\n];\n\nexport const sanitizeNameSurrealDB = (value: string) => {\n //if tableName includes any of the chars of this array, then wrap it in backticks\n\n if (specialChars.some((char) => value.includes(char))) {\n return `⟨${value}⟩`;\n }\n return value;\n};\n","import { isDate } from 'radash';\n\nexport const parseFlexValSurrealDB = (v: unknown) => {\n //dates are potentially defined as strings in flex-values\n if (\n typeof v === 'string' &&\n !Number.isNaN(Date.parse(v)) &&\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d{3})?Z$/.test(v)\n ) {\n return `<datetime>\"${v}\"`;\n }\n if (isDate(v)) {\n return `d\"${v.toISOString()}\"`;\n }\n if (typeof v === 'string') {\n return JSON.stringify(v);\n }\n if (['number', 'boolean'].includes(typeof v)) {\n return v;\n }\n throw new Error(`Unsupported type ${typeof v}`);\n};\n","import { isArray, isDate } from 'radash';\nimport { parseFlexValSurrealDB } from './parseFlexVal';\n\nexport const surrealDBtypeMap: Record<string, string> = {\n TEXT: 'string',\n RICH_TEXT: 'string',\n LANGUAGE_TEXT: 'string',\n PASSWORD: 'string',\n URL: 'string',\n PHONE: 'string',\n ID: 'string',\n EMAIL: 'string',\n NUMBER: 'number',\n NUMBER_DECIMAL: 'decimal',\n BOOLEAN: 'bool',\n DATE: 'datetime',\n JSON: 'object',\n FLEX: 'bool|bytes|datetime|duration|geometry|number|object|string',\n};\n\nexport const parseValueSurrealDB = (value: unknown, ct?: string): any => {\n if (value === null) {\n return 'NONE';\n }\n if (ct) {\n switch (ct) {\n case 'TEXT':\n case 'RICH_TEXT':\n case 'LANGUAGE_TEXT':\n case 'PASSWORD':\n case 'URL':\n case 'PHONE':\n case 'ID':\n case 'EMAIL':\n if (typeof value !== 'string') {\n throw new Error(`Invalid value for TEXT type: ${value}`);\n }\n return JSON.stringify(value);\n case 'NUMBER':\n case 'NUMBER_DECIMAL':\n case 'BOOLEAN':\n case 'JSON':\n return value;\n case 'DATE':\n if (\n typeof value === 'string' &&\n !Number.isNaN(Date.parse(value)) &&\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d{3})?Z$/.test(value)\n ) {\n return `<datetime>\"${value}\"`;\n }\n if (isDate(value)) {\n return `d\"${value.toISOString()}\"`;\n }\n return `<datetime>\"${value}\"`; //let surrealDB try to do the conversion\n case 'FLEX': {\n // array elements go throw the parsing\n const parsedVal = isArray(value) ? value.map((v) => parseFlexValSurrealDB(v)) : parseFlexValSurrealDB(value);\n return `${isArray(parsedVal) ? parsedVal.map((v) => v) : parsedVal}`;\n }\n default:\n throw new Error(`Unsupported data field type ${ct}.`);\n }\n }\n throw new Error(`Failed parsing value ${value} with content type ${ct}`);\n};\n","import type {\n EnrichedBormEntity,\n EnrichedBormRelation,\n EnrichedBormSchema,\n EnrichedDataField,\n EnrichedLinkField,\n EnrichedRoleField,\n Validations,\n} from '../../../types';\nimport { sanitizeNameSurrealDB } from '../helpers';\nimport { parseValueSurrealDB, surrealDBtypeMap } from '../parsing/values';\n\nconst INDENTATION = '\\t' as const;\nconst indent = (n: number): string => INDENTATION.repeat(n);\n\nconst indentPar = (str: string, level: number): string =>\n str\n .split('\\n')\n .map((line) => (line.trim() ? `${indent(level)}${line}` : line))\n .join('\\n');\n\ntype SchemaItem = EnrichedBormEntity | EnrichedBormRelation;\n\nconst convertBQLToSurQL = (schema: EnrichedBormSchema): string => {\n const header = `USE NS test;\nUSE DB test;\n\nBEGIN TRANSACTION;\n`;\n\n const entities = `-- ENTITIES\\n${convertSchemaItems(schema.entities)}`;\n const relations = `\\n-- RELATIONS\\n${convertSchemaItems(schema.relations)}`;\n const utilityFunctions = addUtilityFunctions();\n\n return `${header}${entities}${relations}${utilityFunctions}COMMIT TRANSACTION;`;\n};\n\nconst convertSchemaItems = (items: Record<string, SchemaItem>): string =>\n Object.entries(items)\n .map(([name, item]) => convertSchemaItem(sanitizeNameSurrealDB(name), item, 1))\n .join('\\n\\n');\n\nconst convertSchemaItem = (name: string, item: SchemaItem, level: number): string => {\n const baseDefinition = `${indent(level)}DEFINE TABLE ${name} SCHEMAFULL PERMISSIONS FULL;${'extends' in item && item.extends ? ` //EXTENDS ${item.extends};` : ''}`;\n const dataFields = indentPar(`-- DATA FIELDS\\n${convertDataFields(item.dataFields ?? [], name, level)}`, level + 1);\n const linkFields = indentPar(`\\n-- LINK FIELDS\\n${convertLinkFields(item.linkFields ?? [], name, level)}`, level + 1);\n const roles = 'roles' in item ? indentPar(`\\n-- ROLES\\n${convertRoles(item.roles, name, level)}`, level + 1) : '';\n\n return `${baseDefinition}\\n${dataFields}${linkFields}${roles}`;\n};\n\nconst convertDataFields = (dataFields: EnrichedDataField[], parentName: string, level: number): string =>\n dataFields\n .map((field) => {\n if (field.path === 'id') {\n return ''; //skip id fields for now, we will migrate it to a different name later like _id\n }\n const fieldType = mapContentTypeToSurQL(field.contentType, field.validations);\n const baseDefinition = `${indent(level)}DEFINE FIELD ${field.path} ON TABLE ${parentName}${['FLEX', 'JSON'].includes(field.contentType) ? ' FLEXIBLE' : ''}`; //TTODO: Better type json\n\n if (field.isVirtual) {\n const dbValue = field.dbValue?.surrealDB;\n if (!dbValue) {\n return ''; //it means is computed in BORM instead\n }\n return `${baseDefinition} VALUE ${dbValue};`;\n }\n return `${baseDefinition} TYPE ${fieldType};`;\n })\n .filter(Boolean)\n .join('\\n');\n\nconst convertLinkFields = (linkFields: EnrichedLinkField[], parentName: string, level: number): string =>\n linkFields\n .map((linkField) => {\n const fieldType =\n //linkField.cardinality === 'MANY' ? `array<record<${linkField.relation}>>` : `record<${linkField.relation}>`; //todo: uncomment once surrealDB has smart transactions\n linkField.cardinality === 'MANY'\n ? `option<array<record<${linkField.$things.map(sanitizeNameSurrealDB).join('|')}>>>`\n : `option<record<${linkField.$things.map(sanitizeNameSurrealDB).join('|')}>>`;\n\n const baseDefinition = `${indent(level)}DEFINE FIELD ${sanitizeNameSurrealDB(linkField.path)} ON TABLE ${parentName}`;\n\n if (linkField.isVirtual) {\n const dbValue = linkField.dbValue?.surrealDB;\n if (!dbValue) {\n return ''; //it means is computed in BORM instead\n }\n\n return `${baseDefinition} VALUE ${dbValue};`;\n }\n\n if (linkField.target === 'role') {\n const relationLinkField = linkFields.find(\n (lf) => lf.target === 'relation' && lf.relation === linkField.relation,\n );\n const targetRole = linkField.oppositeLinkFieldsPlayedBy?.[0];\n const targetPath = targetRole.plays;\n\n if (!targetPath || linkField.oppositeLinkFieldsPlayedBy?.length !== 1) {\n throw new Error(`Invalid link field: ${linkField.path}`);\n }\n\n const type =\n linkField.cardinality === 'ONE'\n ? `record<${sanitizeNameSurrealDB(linkField.relation)}>`\n : `array<record<${sanitizeNameSurrealDB(linkField.relation)}>>`;\n\n const pathToRelation = sanitizeNameSurrealDB(linkField.pathToRelation || '');\n const relationPath = `${pathToRelation}.${targetPath}`;\n\n const baseField =\n linkField.cardinality === 'ONE'\n ? `${baseDefinition} VALUE <future> {RETURN SELECT VALUE ${relationPath} FROM ONLY $this};`\n : `${baseDefinition} VALUE <future> {array::distinct(SELECT VALUE array::flatten(${relationPath} || []) FROM ONLY $this)};`;\n const supportField = relationLinkField?.path\n ? ''\n : `${indent(level + 1)}DEFINE FIELD ${pathToRelation} ON TABLE ${parentName} TYPE option<${type}>;`;\n\n return [baseField, supportField].join('\\n');\n }\n if (linkField.target === 'relation') {\n const fieldDefinition = `${indent(level)}DEFINE FIELD ${sanitizeNameSurrealDB(linkField.path)} ON TABLE ${parentName} TYPE ${fieldType};`;\n return `${fieldDefinition}`;\n }\n throw new Error(`Invalid link field: ${JSON.stringify(linkField)}`);\n })\n .join('\\n');\n\nconst convertRoles = (roles: Record<string, EnrichedRoleField>, parentName: string, level: number): string =>\n Object.entries(roles)\n .map(([roleName, role]) => {\n const fieldType =\n role.cardinality === 'MANY'\n ? `array<record<${role.$things.map(sanitizeNameSurrealDB).join('|')}>>`\n : `record<${role.$things.map(sanitizeNameSurrealDB).join('|')}>`;\n const fieldDefinition = `${indent(level)}DEFINE FIELD ${roleName} ON TABLE ${parentName} TYPE option<${fieldType}>;`; //Todo: remove option when surrealDB transactions are smarter.\n const roleEvent = generateRoleEvent(roleName, parentName, role, level);\n return `${fieldDefinition}\\n${roleEvent}`;\n })\n .join('\\n');\n\nconst generateRoleEvent = (roleName: string, parentName: string, role: EnrichedRoleField, level: number): string => {\n const eventName = `update_${roleName}`;\n\n const targetRelationLinkField = role.playedBy?.find((lf) => lf.target === 'relation');\n const targetRelationPath = targetRelationLinkField?.pathToRelation;\n const firstTargetRoleLinkField = role.playedBy?.find((lf) => lf.target === 'role');\n const firstTargetRolePath = firstTargetRoleLinkField?.pathToRelation;\n\n const usedLinkField = targetRelationLinkField ?? firstTargetRoleLinkField;\n\n if (!usedLinkField) {\n throw new Error(`Invalid link field: ${JSON.stringify(role)}`);\n }\n\n const pathToRelation = sanitizeNameSurrealDB((targetRelationPath ?? firstTargetRolePath) as string);\n\n const generateSet = (fields: { path: string; cardinality: 'ONE' | 'MANY' }[], action: 'remove' | 'add'): string => {\n return fields\n .map(({ path, cardinality }) => {\n const operator =\n action === 'remove' ? (cardinality === 'ONE' ? '=' : '-=') : cardinality === 'ONE' ? '=' : '+=';\n const value = action === 'remove' ? (cardinality === 'ONE' ? 'NONE' : '$before.id') : '$after.id';\n return `${path} ${operator} ${value}`;\n })\n .join(', ');\n };\n\n const impactedLinkFields =\n role.impactedLinkFields?.map((lf) => ({\n path: lf.path,\n cardinality: lf.cardinality,\n })) || [];\n\n const directField = { path: pathToRelation, cardinality: usedLinkField.cardinality };\n const allFields = [directField, ...impactedLinkFields];\n\n const removalsSet = generateSet(allFields, 'remove');\n const additionsSet = generateSet(allFields, 'add');\n\n const cardOneEvents = `\n\tIF ($before.${roleName}) THEN {UPDATE $before.${roleName} SET ${removalsSet}} END;\n\tIF ($after.${roleName}) THEN {UPDATE $after.${roleName} SET ${additionsSet}} END;`;\n\n const cardManyEvents = `\n\tLET $edges = fn::get_mutated_edges($before.${roleName}, $after.${roleName});\n\tFOR $unlink IN $edges.deletions {UPDATE $unlink SET ${removalsSet};};\n\tFOR $link IN $edges.additions {${\n usedLinkField.cardinality === 'ONE'\n ? `\n\t\tIF ($link.${pathToRelation}) THEN {UPDATE $link.${pathToRelation} SET ${roleName} ${role.cardinality === 'ONE' ? '= NONE' : '-= $link.id'}} END;` //! This should probably be an independnt event on card one field, that it replaces old one by new one, instead of doing it from here\n : ''\n }\n\t\tUPDATE $link SET ${additionsSet};\n\t};`;\n\n return indentPar(\n `DEFINE EVENT ${eventName} ON TABLE ${parentName} WHEN $before.${roleName} != $after.${roleName} THEN {${role.cardinality === 'ONE' ? cardOneEvents : cardManyEvents}\n};`,\n level + 1,\n );\n};\n\nconst mapContentTypeToSurQL = (contentType: string, validations?: Validations): string => {\n const type = validations?.enum\n ? `${validations.enum.map((value: unknown) => parseValueSurrealDB(value, contentType)).join('|')}`\n : surrealDBtypeMap[contentType];\n if (!type) {\n throw new Error(`Unknown content type: ${contentType}`);\n }\n\n if (validations?.required) {\n return `${type}`;\n }\n return `option<${type}>`;\n};\n\nconst addUtilityFunctions = (): string => `\n-- BORM TOOLS\n\tDEFINE FUNCTION fn::get_mutated_edges(\n\t\t$before_relation: option<array|record>,\n\t\t$after_relation: option<array|record>,\n\t) {\n\t\tLET $notEmptyCurrent = $before_relation ?? [];\n\t\tLET $current = array::flatten([$notEmptyCurrent]);\n\t\tLET $notEmptyResult = $after_relation ?? [];\n\t\tLET $result = array::flatten([$notEmptyResult]);\n\t\tLET $links = array::complement($result, $current);\n\t\tLET $unlinks = array::complement($current, $result);\n\t\t\n\t\tRETURN {\n\t\t\tadditions: $links,\n\t\t\tdeletions: $unlinks\n\t\t};\n\t};\n\n\tDEFINE FUNCTION fn::as_array($var: option<array<record>|record>) { \n\t\tRETURN (type::is::array($var) AND $var) OR [$var]\n\t};\n`;\n\nexport const defineSURQLSchema = (schema: EnrichedBormSchema): string => convertBQLToSurQL(schema);\n","import { SessionType, TransactionType } from 'typedb-driver';\nimport type { BormConfig, DBHandles, EnrichedBormSchema } from '../../../types';\n\ntype Attribute = {\n dbPath: string;\n contentType: string;\n};\n\nconst removeDuplicateObjects = (arr: Attribute[]) => {\n const uniqueObjects: Attribute[] = [];\n\n const uniqueMap = new Map();\n\n arr.forEach((obj) => {\n const { dbPath, contentType } = obj;\n const key = `${dbPath}-${contentType}`;\n\n if (!uniqueMap.has(key)) {\n uniqueMap.set(key, true);\n uniqueObjects.push(obj);\n }\n });\n\n return uniqueObjects;\n};\n\nexport const convertTQLSchema = (connectorId: any, schema: EnrichedBormSchema) => {\n let output = '';\n const usedAttributes: Attribute[] = [];\n\n output += '\\n';\n\n // CONVERTING ENTITIES\n\n Object.keys(schema.entities)\n .filter((eName) => schema.entities[eName].defaultDBConnector.id === connectorId)\n .forEach((entityName) => {\n const entity = schema.entities[entityName];\n const { dataFields, linkFields, name } = entity;\n // Checks to see if parent already contains these fields\n\n output += `${name} sub ${'extends' in entity ? entity.extends : 'entity'},\\n`;\n\n // Adding data fields\n if (dataFields && dataFields.length > 0) {\n dataFields.forEach((field: any) => {\n if (field.contentType === 'REF') {\n return;\n } //ignore ref types\n if (field.inherited) {\n return;\n }\n if (field.isIdField) {\n output += `\\towns ${field.dbPath} @key,\\n`;\n } else {\n output += `\\towns ${field.dbPath},\\n`;\n }\n usedAttributes.push({ dbPath: field.dbPath, contentType: field.contentType });\n });\n }\n // Adding link fields\n if (linkFields && linkFields.length > 0) {\n const usedLinkFields: string[] = [];\n linkFields.forEach((linkField) => {\n const { relation, plays, inherited } = linkField;\n if (inherited) {\n return;\n }\n //check if the role in the relation is inherited\n const isInheritedRole = schema.relations[relation].roles[plays].inherited;\n if (!isInheritedRole && !usedLinkFields.includes(`${relation}:${plays}`)) {\n output += `\\tplays ${relation}:${plays},\\n`;\n usedLinkFields.push(`${relation}:${plays}`);\n }\n });\n }\n output = output.replace(/,\\s*$/, ';\\n');\n output += '\\n';\n });\n\n // CONVERTING RELATIONS\n Object.keys(schema.relations)\n .filter((rName) => schema.relations[rName].defaultDBConnector.id === connectorId)\n .forEach((relationName) => {\n const relation = schema.relations[relationName];\n // TODO: fix name ts error\n const { dataFields, roles, name, linkFields } = relation;\n // Checks to see if parent already contains these fields\n\n output += `${name} sub ${'extends' in relation ? relation.extends : 'relation'},\\n`;\n // Removes ids from data fields, so their attributes aren't repeated\n\n // Adding data fields\n if (dataFields && dataFields.length > 0) {\n dataFields.forEach((field: any) => {\n if (!field.inherited) {\n if (field.isIdField) {\n output += `\\towns ${field.dbPath} @key,\\n`;\n } else {\n output += `\\towns ${field.dbPath},\\n`;\n }\n usedAttributes.push({ dbPath: field.dbPath, contentType: field.contentType });\n }\n });\n }\n // Adding role fields\n if (roles) {\n Object.keys(roles).forEach((roleName) => {\n if (!roles[roleName].inherited) {\n output += `\\trelates ${roleName},\\n`;\n }\n });\n }\n // Adding link fields\n if (linkFields && linkFields.length > 0) {\n const usedLinkFields: string[] = [];\n linkFields.forEach((linkField) => {\n const { plays, relation } = linkField;\n const isInheritedRole = schema.relations[relation].roles[plays].inherited;\n if (!isInheritedRole && !linkField.inherited && !usedLinkFields.includes(`${relation}:${plays}`)) {\n output += `\\tplays ${linkField.relation}:${plays},\\n`;\n usedLinkFields.push(`${relation}:${plays}`);\n }\n });\n }\n output = output.replace(/,\\s*$/, ';\\n');\n output += '\\n';\n });\n\n // DEFINING ATTRIBUTES\n\n let attributes = 'define\\n\\n';\n const newUsedAttributes = removeDuplicateObjects(usedAttributes);\n\n newUsedAttributes.forEach((attribute: Attribute) => {\n // All conditions for BORM to TQL attribute types\n if (attribute.contentType === 'TEXT' || attribute.contentType === 'ID' || attribute.contentType === 'JSON') {\n attributes += `${attribute.dbPath} sub attribute, value string;\\n`;\n } else if (attribute.contentType === 'EMAIL') {\n attributes += `${attribute.dbPath} sub attribute, value string,\\n`;\n attributes +=\n \"\\tregex '^(?=.{1,64}@)[A-Za-z0-9_-]+(\\\\\\\\.[A-Za-z0-9_-]+)*@[^-][A-Za-z0-9-]+(\\\\\\\\.[A-Za-z0-9-]+)*(\\\\\\\\.[A-Za-z]{2,})$';\\n\";\n } else if (attribute.contentType === 'DATE') {\n attributes += `${attribute.dbPath} sub attribute, value datetime;\\n`;\n } else if (attribute.contentType === 'BOOLEAN') {\n attributes += `${attribute.dbPath} sub attribute, value boolean;\\n`;\n } else if (attribute.contentType === 'NUMBER') {\n attributes += `${attribute.dbPath} sub attribute, value long;\\n`;\n } else if (attribute.contentType === 'FLEX') {\n attributes += `${attribute.dbPath} sub flexAttribute;\\n`;\n } else if (attribute.contentType === 'REF') {\n return; //not compatible with typeDB\n } else {\n throw new Error(\n `Conversion of borm schema to TypeDB schema for data type \"${attribute.contentType}\" is not implemented`,\n );\n }\n });\n\n const utils = `#Tools, reserved for every schema using borm\n\nstringAttribute sub attribute, value string;\nlongAttribute sub attribute, value long;\ndoubleAttribute sub attribute, value double;\nbooleanAttribute sub attribute, value boolean;\ndatetimeAttribute sub attribute, value datetime;\nflexAttribute sub attribute, abstract, value string,\n\towns stringAttribute,\n\towns longAttribute,\n\towns doubleAttribute,\n\towns booleanAttribute,\n\towns datetimeAttribute;\n`;\n\n return `${attributes}\\n\\n${output}\\n${utils}`;\n};\n\nexport const defineTQLSchema = async (\n connectorId: string,\n config: BormConfig,\n schema: EnrichedBormSchema,\n dbHandles: DBHandles,\n) => {\n if (!dbHandles.typeDB) {\n throw new Error('No TypeDB handles found');\n }\n const typeDBString = convertTQLSchema(connectorId, schema);\n const session = dbHandles.typeDB.get(connectorId)?.session;\n const client = dbHandles.typeDB.get(connectorId)?.client;\n if (!session) {\n console.log('Session Status: ', 'NO SESSION');\n return;\n }\n\n if (!client) {\n throw new Error('No TypeDB client found');\n }\n\n await session.close();\n const [{ dbName }] = config.dbConnectors;\n const db = await client.databases.get(dbName);\n await db.delete();\n await client.databases.create(dbName);\n\n const schemaSession = await client.session(config.dbConnectors[0].dbName, SessionType.SCHEMA);\n //const dataSession = await client.session(config.dbConnectors[0].dbName, SessionType.DATA);\n\n // 3. Defining new schema\n\n const schemaTransaction = await schemaSession.transaction(TransactionType.WRITE);\n\n await schemaTransaction.query.define(typeDBString);\n await schemaTransaction.commit();\n await schemaTransaction.close();\n\n /*const getSchemaTransaction = await dataSession.transaction(TransactionType.READ);\n\tconst getSchemaQuery = 'match $a sub thing; get $a;';\n\tconst getSchemaStream = await getSchemaTransaction.query.fetch(getSchemaQuery);\n\tconst schemaThings = await getSchemaStream.collect();\n\tconsole.log('schemaThings', schemaThings);\n\t*/\n return typeDBString;\n //await getSchemaTransaction.close();\n};\n","import { defineSURQLSchema } from '../adapters/surrealDB/schema/define';\nimport { defineTQLSchema } from '../adapters/typeDB/schema/define';\nimport type { BormConfig, DBHandles, EnrichedBormSchema } from '../types';\n\nexport const bormDefine = async (config: BormConfig, schema: EnrichedBormSchema, dbHandles: DBHandles) => {\n const schemas = async () => {\n const typeDBEntries = await Promise.all(\n [...(dbHandles.typeDB || [])].map(async ([key]) => [key, await defineTQLSchema(key, config, schema, dbHandles)]),\n );\n\n const typeDBEntriesFixed = typeDBEntries.map((entry) => [entry[0], entry[1]] as const);\n\n const surrealDBEntries = await Promise.all(\n [...(dbHandles.surrealDB || [])].map(async ([key]) => [key, defineSURQLSchema(schema)]),\n );\n\n const surrealDBEntriesFixed = surrealDBEntries.map((entry) => [entry[0], entry[1]] as const);\n return {\n typeDB: Object.fromEntries(typeDBEntriesFixed),\n surrealDB: Object.fromEntries(surrealDBEntriesFixed),\n };\n };\n return await schemas();\n\n // TYPE DB TRANSACTIONS\n\n // 4. Closing sessions\n};\n","import type { DBHandleKey } from '../types';\n\nexport type AdapterContext = {\n mutation: {\n splitArray$Ids: boolean;\n requiresParseBQL: boolean;\n };\n};\n\nexport const adapterContext: Record<DBHandleKey, AdapterContext> = {\n typeDB: {\n mutation: {\n splitArray$Ids: true,\n requiresParseBQL: true,\n },\n },\n surrealDB: {\n mutation: {\n splitArray$Ids: false, //probably not needed\n requiresParseBQL: false, //probably not needed\n },\n },\n} as const;\n","//! TO-DO Rule: Everything that can be changed or defined by the user should use $ prefix, but the rest is metadata and should be packed in symbols, depending on their origin. extension inside the schema and schema or query inside the query. Probably no more categories are necessary\nexport const Schema = Symbol.for('schema');\n\nexport const QueryPath = Symbol.for('queryPath');\n\nexport const StepPrint = Symbol.for('stepPrint');\n\nexport const EdgeType = Symbol.for('edgeType');\nexport const EdgeSchema = Symbol.for('edgeSchema');\nexport const Path = Symbol.for('path');\n\nexport const DBNode = Symbol.for('dbNode');\nexport const IsTransformed = Symbol.for('isTransformed');\n\n//flatBQL\nexport const Parent = Symbol.for('parent');\n\n/// Fields\nexport const FieldSchema = Symbol.for('fieldSchema');\n\n/// Shared schema metadata\nexport const SharedMetadata = Symbol.for('sharedMetadata');\n\n/// SurrealDB schema metadata\nexport const SuqlMetadata = Symbol.for('suqlMetadata');\n\n//TODO: restructure everything on top of this to be packed in the 3 symbols hereunder.\n//* SCHEMA STORED\n// For metadata that extends the schema\nexport const Extension = Symbol.for('extension');\n\n//* QUERY STORED\n//export const QueryContext = Symbol.for('queryContext'); //todo: queryContext and schemaContext as the only two symbols with a particular structure\n//export const SchemaContext = Symbol.for('schemaContext');\n","import { adapterContext } from './adapters';\nimport type {\n AllDbHandles,\n BormEntity,\n BormRelation,\n BormSchema,\n DBHandles,\n DataField,\n EnrichedBormEntity,\n EnrichedBormRelation,\n EnrichedBormSchema,\n EnrichedDataField,\n EnrichedLinkField,\n EnrichedRefField,\n EnrichedRoleField,\n LinkField,\n LinkedFieldWithThing,\n RefField,\n RoleField,\n SharedEnrichedProps,\n} from './types';\nimport { SharedMetadata, SuqlMetadata } from './types/symbols';\n\nexport const enrichSchema = (schema: BormSchema, dbHandles: DBHandles) => {\n const orderedEntities = orderExtended(schema.entities);\n const orderedRelations = orderExtended(schema.relations);\n const allLinkFields = getAllLinkFields(schema);\n const enrichedSchema: EnrichedBormSchema = { entities: {}, relations: {} };\n\n orderedEntities.forEach((name) => {\n const thing = schema.entities[name];\n if (!thing) {\n throw new Error(`Entity \"${name}\" does not exist`);\n }\n const extendedThing = 'extends' in thing ? enrichedSchema.entities[thing.extends] : undefined;\n if (extendedThing) {\n addSubType(enrichedSchema, extendedThing.name, name);\n }\n const enrichedThing = enrichThing({ schema, enrichedSchema, extendedThing, name, thing, dbHandles, allLinkFields });\n enrichedSchema.entities[name] = {\n ...enrichedThing,\n defaultDBConnector: thing.defaultDBConnector,\n thingType: 'entity',\n };\n });\n\n orderedRelations.forEach((name) => {\n const thing = schema.relations[name];\n if (!thing) {\n throw new Error(`Relation \"${name}\" does not exist`);\n }\n const extendedThing = 'extends' in thing ? enrichedSchema.relations[thing.extends] : undefined;\n if (extendedThing) {\n addSubType(enrichedSchema, extendedThing.name, name);\n }\n const enrichedThing = enrichThing({ schema, enrichedSchema, extendedThing, name, thing, dbHandles, allLinkFields });\n const enrichedRelation: EnrichedBormRelation = {\n ...enrichedThing,\n defaultDBConnector: thing.defaultDBConnector,\n roles: Object.fromEntries(\n Object.entries(thing.roles ?? {}).map(([k, role]) => [\n k,\n enrichRoleField({\n role,\n roleName: k,\n relationName: name,\n relation: thing,\n allExtends: enrichedThing.allExtends,\n allLinkFields,\n }),\n ]),\n ),\n thingType: 'relation',\n };\n if ('extends' in thing && extendedThing) {\n Object.entries(extendedThing?.roles ?? {}).forEach(([k, role]) => {\n const inherited = enrichRoleField({\n role,\n roleName: k,\n relationName: name,\n relation: thing,\n allExtends: enrichedThing.allExtends,\n allLinkFields,\n });\n enrichedRelation.roles[k] = {\n ...inherited,\n inherited: true,\n [SharedMetadata]: {\n ...role[SharedMetadata],\n inheritanceOrigin: role[SharedMetadata]?.inheritanceOrigin || thing.extends,\n },\n };\n });\n }\n enrichedSchema.relations[name] = enrichedRelation;\n });\n\n Object.values(enrichedSchema.entities).forEach((entity) => {\n entity.linkFields?.forEach((lf) => {\n // eslint-disable-next-line no-param-reassign\n lf.$things = expandSubThings(enrichedSchema, lf.$things);\n });\n });\n\n Object.values(enrichedSchema.relations).forEach((relation) => {\n relation.linkFields?.forEach((lf) => {\n // eslint-disable-next-line no-param-reassign\n lf.$things = expandSubThings(enrichedSchema, lf.$things);\n });\n Object.values(relation.roles ?? {}).forEach((role) => {\n // eslint-disable-next-line no-param-reassign\n role.$things = expandSubThings(enrichedSchema, role.$things);\n });\n });\n\n return enrichedSchema;\n};\n\nconst orderExtended = (thingMap: Record<string, BormEntity | BormRelation>) => {\n const ordered: string[] = [];\n const seen = new Set<string>();\n const inProcess = new Set<string>();\n Object.keys(thingMap).forEach((name) => pushExtended({ thingMap, name, inProcess, seen, ordered }));\n return ordered;\n};\n\n/**\n * Mutate `ordered` and `seen`.\n */\nconst pushExtended = (params: {\n thingMap: Record<string, BormEntity | BormRelation>;\n name: string;\n inProcess: Set<string>;\n seen: Set<string>;\n ordered: string[];\n}) => {\n const { thingMap, name, inProcess, seen, ordered } = params;\n if (seen.has(name)) {\n return;\n }\n if (inProcess.has(name)) {\n throw new Error(`A list of thing extends each other that creates circular dependencies: ${[...inProcess]}`);\n }\n inProcess.add(name);\n const entity = thingMap[name];\n if (!entity) {\n throw new Error(`Entity/relation \"${name}\" does not exist`);\n }\n if ('extends' in entity) {\n pushExtended({ ...params, name: entity.extends });\n }\n inProcess.delete(name);\n seen.add(name);\n ordered.push(name);\n};\n\nconst getAllExtended = (schema: EnrichedBormSchema, extended: string) => {\n let name: string | undefined = extended;\n const _extended: string[] = [];\n while (name) {\n const thing: EnrichedBormEntity | EnrichedBormRelation | undefined =\n schema.entities[name] || schema.relations[name];\n if (!thing) {\n throw new Error(`Entity/relation \"${name}\" does not exist`);\n }\n _extended.push(name);\n name = 'extends' in thing ? thing.extends : undefined;\n }\n return _extended.length !== 0 ? _extended : undefined;\n};\n\n/**\n * Mutate `enrichedSchema`.\n */\nconst addSubType = (enrichedSchema: EnrichedBormSchema, thing: string, subThing: string) => {\n const _thing = enrichedSchema.entities[thing] ?? enrichedSchema.relations[thing];\n if (!_thing) {\n throw new Error(`Entity/relation \"${thing}\" does not exist`);\n }\n _thing.subTypes = _thing.subTypes ?? [];\n _thing.subTypes.push(subThing);\n if (_thing.extends) {\n addSubType(enrichedSchema, _thing.extends, subThing);\n }\n};\n\nconst enrichThing = <T extends BormEntity | BormRelation>(params: {\n schema: BormSchema;\n enrichedSchema: EnrichedBormSchema;\n name: string;\n thing: T;\n extendedThing?: T extends BormRelation ? EnrichedBormRelation : EnrichedBormEntity;\n dbHandles: DBHandles;\n allLinkFields: LinkedFieldWithThing[];\n}): SharedEnrichedProps => {\n const { schema, enrichedSchema, name, thing, dbHandles, extendedThing, allLinkFields } = params;\n const [db] =\n (Object.entries(dbHandles).find(([_, handle]) =>\n handle.get(thing.defaultDBConnector.id),\n ) as (keyof AllDbHandles)[]) ?? [];\n\n if (!db) {\n throw new Error(`DB handle for ${thing.defaultDBConnector.id} does not exist`);\n }\n\n const idFields = [...(thing.idFields ?? extendedThing?.idFields ?? [])]; // TODO: Where to get the idFields if it's not defined?\n if (idFields.length === 0) {\n throw new Error(`\"${name}\" does not have an id field`);\n }\n\n const hooks = { ...thing.hooks };\n const dataFields = thing.dataFields?.map((df) => enrichDataField(df, name, idFields)) ?? [];\n const linkFields =\n thing.linkFields?.map((linkField) =>\n enrichLinkField({ linkField, thingName: name, thing, schema, allLinkFields }),\n ) ?? [];\n const refFields = Object.fromEntries(\n Object.entries(thing.refFields ?? {}).map(([k, v]) => [k, enrichRefField(v, k)]),\n );\n\n if ('extends' in thing && extendedThing) {\n if (extendedThing.hooks?.pre) {\n hooks.pre = [...(extendedThing.hooks.pre || []), ...(thing.hooks?.pre || [])];\n }\n\n extendedThing.dataFields?.forEach((df) => {\n dataFields.push({\n ...df,\n inherited: true,\n [SharedMetadata]: {\n ...df[SharedMetadata],\n inheritanceOrigin: df[SharedMetadata]?.inheritanceOrigin || thing.extends,\n },\n });\n });\n\n extendedThing.linkFields?.forEach((lf) => {\n linkFields.push({\n ...lf,\n inherited: true,\n [SharedMetadata]: {\n ...lf[SharedMetadata],\n inheritanceOrigin: lf[SharedMetadata]?.inheritanceOrigin || thing.extends,\n },\n });\n });\n\n Object.entries(extendedThing.refFields ?? {}).forEach(([k, v]) => {\n refFields[k] = {\n ...v,\n inherited: true,\n [SharedMetadata]: {\n ...v[SharedMetadata],\n inheritanceOrigin: v[SharedMetadata]?.inheritanceOrigin || thing.extends,\n },\n };\n });\n }\n\n return {\n ...thing,\n name,\n db,\n dbContext: adapterContext[db],\n idFields,\n hooks,\n dataFields,\n linkFields,\n refFields,\n enumFields: dataFields?.filter((df) => df.validations?.enum).map((df) => df.path) ?? [],\n fnValidatedFields: dataFields?.filter((df) => df.validations?.fn).map((df) => df.path) ?? [],\n virtualFields: dataFields?.filter((df) => df.isVirtual).map((df) => df.path) ?? [],\n computedFields: dataFields?.filter((df) => df.default && !df.isVirtual).map((df) => df.path) ?? [],\n requiredFields: dataFields?.filter((df) => df.validations?.required).map((df) => df.path) ?? [],\n allExtends: 'extends' in thing ? getAllExtended(enrichedSchema, thing.extends) : undefined,\n // @ts-expect-error TODO: Define it in the type\n dbProviderConfig: db === 'surrealDB' ? dbHandles[db]?.get(thing.defaultDBConnector.id)?.providerConfig : undefined,\n };\n};\n\nconst getAllLinkFields = (schema: BormSchema): LinkedFieldWithThing[] => {\n const linkFields: LinkedFieldWithThing[] = [];\n Object.entries(schema.entities).forEach(([name, entity]) => {\n entity.linkFields?.forEach((lf) => {\n linkFields.push({\n ...lf,\n thing: name,\n thingType: 'entity',\n pathToRelation: lf.target === 'relation' ? lf.path : lf.relation.toLocaleLowerCase(),\n });\n });\n });\n Object.entries(schema.relations).forEach(([name, entity]) => {\n entity.linkFields?.forEach((lf) => {\n linkFields.push({\n ...lf,\n thing: name,\n thingType: 'relation',\n pathToRelation: lf.target === 'relation' ? lf.path : lf.relation.toLocaleLowerCase(),\n });\n });\n });\n return linkFields;\n};\n\nconst enrichDataField = (df: DataField, thing: string, idFields: string[]): EnrichedDataField => ({\n ...df,\n cardinality: df.cardinality || 'ONE',\n dbPath: 'dbPath' in df && typeof df.dbPath === 'string' ? df.dbPath : getDbPath(thing, df.path, df.shared),\n isIdField: !!idFields?.includes(df.path),\n inherited: false,\n [SharedMetadata]: {\n fieldType: 'dataField',\n },\n [SuqlMetadata]: {\n dbPath: df.path, // TODO: What should be the value?\n },\n});\n\nconst enrichRefField = (refField: RefField, path: string): EnrichedRefField => ({\n ...refField,\n cardinality: refField.cardinality || 'ONE',\n path,\n dbPath: refField.dbPath || path,\n inherited: false,\n [SharedMetadata]: {\n fieldType: 'refField',\n },\n});\n\nconst enrichLinkField = (params: {\n linkField: LinkField;\n thing: BormEntity | BormRelation;\n thingName: string;\n schema: BormSchema;\n allLinkFields: LinkedFieldWithThing[];\n}): EnrichedLinkField => {\n const { linkField, thing, thingName, schema, allLinkFields } = params;\n const linkFieldRelation = schema.relations[linkField.relation] as EnrichedBormRelation;\n\n if (!linkField.isVirtual) {\n //its ok for virtual linkFields to don't have a relation\n if (!linkFieldRelation) {\n throw new Error(`The relation ${linkField.relation} does not exist in the schema`);\n }\n\n if (!hasRole(schema, linkField.relation, linkField.plays)) {\n throw new Error(\n `The role ${linkField.plays} is not defined in the relation ${linkField.relation} (linkField: ${linkField.path})`,\n );\n }\n }\n\n const queryPath =\n linkField.cardinality === 'MANY' ? `$parent.[\\`${linkField.path}\\`]` : `$parent.\\`${linkField.path}\\``;\n\n if (linkField.target === 'relation') {\n if (linkField.isVirtual) {\n throw new Error(\n `[Schema] Virtual linkFields can't target a relation. Thing: \"${thingName}\" LinkField: \"${linkField.path}.\"`,\n );\n }\n\n return {\n ...linkField,\n $things: [linkField.relation],\n oppositeLinkFieldsPlayedBy: [\n {\n plays: linkField.path,\n thing: linkField.relation,\n thingType: 'relation',\n },\n ],\n fieldType: 'linkField',\n inherited: false,\n [SharedMetadata]: {\n fieldType: 'linkField',\n },\n [SuqlMetadata]: {\n queryPath,\n },\n };\n }\n\n const oppositeLinkFieldsPlayedBy = allLinkFields.filter(\n (x) => x.relation === linkField.relation && x.plays !== linkField.plays && x.target === 'role',\n );\n\n if (oppositeLinkFieldsPlayedBy.length === 0) {\n throw new Error(\n `[Schema] LinkFields require to have at least one opposite linkField playing an opposite role. Thing: \"${thingName}\" LinkField: \"${linkField.path}.\"`,\n );\n }\n\n if (oppositeLinkFieldsPlayedBy.length > 1) {\n //temp: lets just warn and add an error only if actually used\n console.warn(\n `[Schema] LinkField ${linkField.path} in ${thingName} has multiple candidates ${oppositeLinkFieldsPlayedBy.map((lf) => lf.thing).join(',')} and this is not yet supported. Please target a single one using targetRoles with a single role`,\n );\n }\n\n return {\n ...linkField,\n fieldType: 'linkField',\n pathToRelation:\n thing.linkFields?.find((lf) => lf.target === 'relation' && lf.relation === linkField.relation)?.path ??\n linkField.relation.toLocaleLowerCase(),\n inherited: false,\n $things: oppositeLinkFieldsPlayedBy.map((i) => i.thing),\n oppositeLinkFieldsPlayedBy,\n [SharedMetadata]: {\n fieldType: 'linkField',\n },\n [SuqlMetadata]: {\n queryPath,\n },\n };\n};\n\nconst enrichRoleField = (params: {\n role: RoleField;\n roleName: string;\n relationName: string;\n relation: BormRelation;\n allExtends?: string[];\n allLinkFields: LinkedFieldWithThing[];\n}): EnrichedRoleField => {\n const { role, roleName, relationName, relation, allExtends, allLinkFields } = params;\n\n //Check if the key is used by linkFields or roleFields already\n if (\n relation.dataFields?.find((df) => df.path === roleName) ||\n relation.linkFields?.find((lf) => lf.path === roleName)\n ) {\n throw new Error(`[Schema] The path ${roleName} is already in use by a dataField or linkField in ${relationName}.`);\n }\n const playedBy = allLinkFields.filter((x) => x.relation === relationName && x.plays === roleName);\n\n const impactedLinkFields = allLinkFields.filter(\n (x) => x.target === 'relation' && x.plays === roleName && allExtends?.includes(x.relation),\n );\n\n return {\n ...role,\n fieldType: 'roleField',\n inherited: false,\n playedBy: playedBy.map((lf) => ({\n ...lf,\n pathToRelation:\n lf.target === 'relation'\n ? lf.path\n : (relation.linkFields?.find(\n (lf) => lf.target === 'relation' && lf.relation === roleName && lf.plays === roleName,\n )?.path ?? lf.relation.toLocaleLowerCase()),\n })),\n impactedLinkFields,\n path: roleName,\n $things: [...new Set(playedBy.map((i) => i.thing))],\n [SharedMetadata]: {\n fieldType: 'roleField',\n },\n [SuqlMetadata]: {\n queryPath: role.cardinality === 'MANY' ? `$parent.[\\`${roleName}\\`]` : `$parent.\\`${roleName}\\``,\n },\n };\n};\n\nconst getDbPath = (thing: string, attribute: string, shared?: boolean) =>\n shared ? attribute : `${thing}·${attribute}`;\n\nconst hasRole = (schema: BormSchema, thing: string, role: string) => {\n const _thing = schema.relations[thing];\n if (!_thing) {\n throw new Error(`Relation \"${thing}\" does not exist`);\n }\n if (_thing.roles?.[role]) {\n return true;\n }\n if ('extends' in _thing) {\n return hasRole(schema, _thing.extends, role);\n }\n return false;\n};\n\nconst expandSubThings = (enrichedSchema: EnrichedBormSchema, things: string[]) => {\n return things.flatMap((i) => [i, ...((enrichedSchema.entities[i] ?? enrichedSchema.relations[i])?.subTypes ?? [])]);\n};\n\n//todo!: review line per line to ensure all behaviour has been migrated. Specially the errors and checks\n// /* eslint-disable no-param-reassign */\n// import { produce } from 'immer';\n// import type { TraversalCallbackContext } from 'object-traversal';\n// import { traverse } from 'object-traversal';\n// import { isArray, mapEntries } from 'radash';\n// import { SharedMetadata, SuqlMetadata } from './types/symbols';\n\n// // todo: split helpers between common helpers, typeDBhelpers, dgraphelpers...\n// import type {\n// \tBormSchema,\n// \tBormRelation,\n// \tEnrichedBormEntity,\n// \tEnrichedBormRelation,\n// \tEnrichedBormSchema,\n// \tLinkedFieldWithThing,\n// \tDataField,\n// \tBormEntity,\n// \tDBHandles,\n// \tDBHandleKey,\n// \tEnrichedDataField,\n// \tEnrichedLinkField,\n// \tLinkField,\n// \tRefField,\n// } from './types';\n// import type { AdapterContext } from './adapters';\n// import { adapterContext } from './adapters';\n// import { getSurrealLinkFieldQueryPath } from './adapters/surrealDB/enrichSchema/helpers';\n// import { getSchemaByThing } from './helpers';\n\n// const getDbPath = (thing: string, attribute: string, shared?: boolean) =>\n// \tshared ? attribute : `${thing}·${attribute}`;\n\n// export const getPath = (dbPath: string) => {\n// \tconst parts = dbPath.split('·');\n// \treturn parts[parts.length - 1];\n// };\n\n// export const extendSchema = (schema: BormSchema): BormSchema => {\n// \tconst withExtensionsSchema = produce(schema, (draft) =>\n// \t\ttraverse(\n// \t\t\tdraft,\n// \t\t\t({ key, value, meta }: TraversalCallbackContext) => {\n// \t\t\t\tif (meta.depth !== 2) {\n// \t\t\t\t\treturn;\n// \t\t\t\t}\n// \t\t\t\tconst val = value as BormEntity | BormRelation;\n\n// \t\t\t\tif (key) {\n// \t\t\t\t\t//* DATA_FIELDS: Adding default values and metadata to every dataField\n// \t\t\t\t\tval.dataFields = val.dataFields?.map((df: DataField | EnrichedDataField) => ({\n// \t\t\t\t\t\t...df,\n// \t\t\t\t\t\t...(val.idFields?.includes(df.path) ? { isIdField: true } : { isIdField: false }),\n// \t\t\t\t\t\tcardinality: df.cardinality || 'ONE',\n// \t\t\t\t\t\t//todo: Make this user defined and remove the prefix by default\n// \t\t\t\t\t\tdbPath: 'dbPath' in df ? df.dbPath : getDbPath(key, df.path, df.shared), //if it was already defined in a parent, we keep it\n// \t\t\t\t\t\t[SharedMetadata]: {\n// \t\t\t\t\t\t\tfieldType: 'dataField',\n// \t\t\t\t\t\t},\n// \t\t\t\t\t})) as EnrichedDataField[];\n\n// \t\t\t\t\t//* REFERENCE_FIELDS: Adding default values and metadata to every refField\n// \t\t\t\t\tif (val.refFields) {\n// \t\t\t\t\t\tval.refFields = mapEntries(val.refFields || {}, (refFieldKey, refField) => {\n// \t\t\t\t\t\t\treturn [\n// \t\t\t\t\t\t\t\trefFieldKey,\n// \t\t\t\t\t\t\t\t{\n// \t\t\t\t\t\t\t\t\t...refField,\n// \t\t\t\t\t\t\t\t\tcardinality: refField.cardinality || 'ONE',\n// \t\t\t\t\t\t\t\t\tpath: refFieldKey,\n// \t\t\t\t\t\t\t\t\t[SharedMetadata]: {\n// \t\t\t\t\t\t\t\t\t\tfieldType: 'refField',\n// \t\t\t\t\t\t\t\t\t},\n// \t\t\t\t\t\t\t\t},\n// \t\t\t\t\t\t\t];\n// \t\t\t\t\t\t});\n// \t\t\t\t\t}\n\n// \t\t\t\t\t//* LINK_FIELDS: Adding default values and metadata to every linkField\n// \t\t\t\t\tval.linkFields = val.linkFields?.map((lf: LinkField | EnrichedLinkField) => ({\n// \t\t\t\t\t\t...lf,\n// \t\t\t\t\t\t[SharedMetadata]: {\n// \t\t\t\t\t\t\tfieldType: 'linkField',\n// \t\t\t\t\t\t},\n// \t\t\t\t\t}));\n\n// \t\t\t\t\t//* ROLE_FIELDS: Adding default values and metadata to every roleField\n// \t\t\t\t\tif ('roles' in val) {\n// \t\t\t\t\t\tval.roles = mapEntries(val.roles || {}, (roleKey, role) => {\n// \t\t\t\t\t\t\treturn [\n// \t\t\t\t\t\t\t\troleKey,\n// \t\t\t\t\t\t\t\t{\n// \t\t\t\t\t\t\t\t\t...role,\n// \t\t\t\t\t\t\t\t\tcardinality: role.cardinality || 'ONE',\n// \t\t\t\t\t\t\t\t\t[SharedMetadata]: {\n// \t\t\t\t\t\t\t\t\t\tfieldType: 'roleField',\n// \t\t\t\t\t\t\t\t\t},\n// \t\t\t\t\t\t\t\t},\n// \t\t\t\t\t\t\t];\n// \t\t\t\t\t\t});\n// \t\t\t\t\t}\n// \t\t\t\t}\n\n// \t\t\t\tif (value.extends) {\n// \t\t\t\t\tif (!value.defaultDBConnector.as) {\n// \t\t\t\t\t\t//todo: Check if we can add the \"as\" as default. When the path of the parent === name of the parent then it's fine. As would be used for those cases where they are not equal (same as path, which is needed only if different names)\n// \t\t\t\t\t\tthrow new Error(\n// \t\t\t\t\t\t\t`[Schema] ${key} is extending a thing but missing the \"as\" property in its defaultDBConnector. Path:${meta.nodePath}`,\n// \t\t\t\t\t\t);\n// \t\t\t\t\t}\n\n// \t\t\t\t\t/// IMPORT THE EXTENDED SCHEMA\n// \t\t\t\t\tconst extendedSchema = (draft.entities[value.extends] || draft.relations[value.extends]) as\n// \t\t\t\t\t\t| EnrichedBormRelation\n// \t\t\t\t\t\t| EnrichedBormEntity;\n\n// \t\t\t\t\t/// find out all the thingTypes this thingType is extending\n// \t\t\t\t\tconst allExtends = [value.extends, ...(extendedSchema.allExtends || [])];\n// \t\t\t\t\tvalue.allExtends = allExtends;\n// \t\t\t\t\tvalue as BormEntity | BormRelation;\n\n// \t\t\t\t\tallExtends.forEach((ext) => {\n// \t\t\t\t\t\tif (draft.entities[ext]) {\n// \t\t\t\t\t\t\t//@ts-expect-error : it's normal is just a draft\n// \t\t\t\t\t\t\tdraft.entities[ext].subTypes = [key, ...(draft.entities[ext].subTypes || [])];\n// \t\t\t\t\t\t} else if (draft.relations[ext]) {\n// \t\t\t\t\t\t\t//@ts-expect-error : it's normal is just a draft\n// \t\t\t\t\t\t\tdraft.relations[ext].subTypes = [key, ...(draft.relations[ext].subTypes || [])];\n// \t\t\t\t\t\t} else {\n// \t\t\t\t\t\t\tthrow new Error(`[Schema] ${key} is extending a thing that does not exist in the schema: ${ext}`);\n// \t\t\t\t\t\t}\n// \t\t\t\t\t});\n\n// \t\t\t\t\tvalue.idFields = extendedSchema.idFields\n// \t\t\t\t\t\t? Array.from(new Set((value.idFields || []).concat(extendedSchema.idFields)))\n// \t\t\t\t\t\t: value.idFields;\n\n// \t\t\t\t\tvalue.dataFields = extendedSchema.dataFields\n// \t\t\t\t\t\t? (value.dataFields || []).concat(\n// \t\t\t\t\t\t\t\textendedSchema.dataFields.map((df: DataField) => {\n// \t\t\t\t\t\t\t\t\t// * Adding dbPath of extended dataFields\n// \t\t\t\t\t\t\t\t\tlet deepExtendedThing = value.extends;\n// \t\t\t\t\t\t\t\t\tlet deepSchema = schema.entities[deepExtendedThing] || schema.relations[deepExtendedThing];\n// \t\t\t\t\t\t\t\t\twhile (!deepSchema.dataFields?.find((deepDf: DataField) => deepDf.path === df.path)) {\n// \t\t\t\t\t\t\t\t\t\tdeepExtendedThing = 'extends' in deepSchema ? deepSchema.extends : undefined;\n// \t\t\t\t\t\t\t\t\t\tdeepSchema = schema.entities[deepExtendedThing] || schema.relations[deepExtendedThing];\n// \t\t\t\t\t\t\t\t\t}\n// \t\t\t\t\t\t\t\t\treturn {\n// \t\t\t\t\t\t\t\t\t\t...df,\n// \t\t\t\t\t\t\t\t\t\tinherited: true,\n// \t\t\t\t\t\t\t\t\t\tdbPath: 'dbPath' in df ? df.dbPath : getDbPath(deepExtendedThing, df.path, df.shared), //i\n// \t\t\t\t\t\t\t\t\t\t[SharedMetadata]: {\n// \t\t\t\t\t\t\t\t\t\t\t//@ts-expect-error - Is normal because we are extending it here\n// \t\t\t\t\t\t\t\t\t\t\t...df[SharedMetadata],\n// \t\t\t\t\t\t\t\t\t\t\t//@ts-expect-error - Is normal because we are extending it here\n// \t\t\t\t\t\t\t\t\t\t\tinheritanceOrigin: df[SharedMetadata]?.inheritanceOrigin || value.extends,\n// \t\t\t\t\t\t\t\t\t\t},\n// \t\t\t\t\t\t\t\t\t};\n// \t\t\t\t\t\t\t\t}),\n// \t\t\t\t\t\t\t)\n// \t\t\t\t\t\t: value.dataFields;\n\n// \t\t\t\t\t//Only for roles in th extended schema\n// \t\t\t\t\tif ('roles' in extendedSchema) {\n// \t\t\t\t\t\tconst val = value as BormRelation;\n// \t\t\t\t\t\tconst extendedRelationSchema = extendedSchema as BormRelation;\n// \t\t\t\t\t\tif (extendedRelationSchema.roles) {\n// \t\t\t\t\t\t\tconst extendedRelationSchemaWithOrigin = mapEntries(extendedRelationSchema.roles, (roleKey, role) => {\n// \t\t\t\t\t\t\t\treturn [\n// \t\t\t\t\t\t\t\t\troleKey,\n// \t\t\t\t\t\t\t\t\t{\n// \t\t\t\t\t\t\t\t\t\t...role,\n// \t\t\t\t\t\t\t\t\t\tinherited: true,\n// \t\t\t\t\t\t\t\t\t\t[SharedMetadata]: {\n// \t\t\t\t\t\t\t\t\t\t\t//@ts-expect-error - Is normal because we are extending it here\n// \t\t\t\t\t\t\t\t\t\t\t...role[SharedMetadata],\n// \t\t\t\t\t\t\t\t\t\t\t//@ts-expect-error - Is normal because we are extending it here\n// \t\t\t\t\t\t\t\t\t\t\tinheritanceOrigin: role[SharedMetadata]?.inheritanceOrigin || value.extends,\n// \t\t\t\t\t\t\t\t\t\t},\n// \t\t\t\t\t\t\t\t\t},\n// \t\t\t\t\t\t\t\t];\n// \t\t\t\t\t\t\t});\n\n// \t\t\t\t\t\t\tval.roles = {\n// \t\t\t\t\t\t\t\t...(val.roles || {}),\n// \t\t\t\t\t\t\t\t...extendedRelationSchemaWithOrigin,\n// \t\t\t\t\t\t\t};\n// \t\t\t\t\t\t}\n// \t\t\t\t\t}\n\n// \t\t\t\t\tif ('refFields' in extendedSchema) {\n// \t\t\t\t\t\tconst val = value as BormRelation | BormEntity;\n// \t\t\t\t\t\tconst extendedThingSchema = extendedSchema as BormRelation | BormEntity;\n// \t\t\t\t\t\tif (extendedThingSchema.refFields) {\n// \t\t\t\t\t\t\tconst extendedRefFields = mapEntries(extendedThingSchema.refFields, (refFieldKey, refField) => {\n// \t\t\t\t\t\t\t\treturn [\n// \t\t\t\t\t\t\t\t\trefFieldKey,\n// \t\t\t\t\t\t\t\t\t{\n// \t\t\t\t\t\t\t\t\t\t...refField,\n// \t\t\t\t\t\t\t\t\t\tinherited: true,\n// \t\t\t\t\t\t\t\t\t\t[SharedMetadata]: {\n// \t\t\t\t\t\t\t\t\t\t\t//@ts-expect-error - Is normal because we are extending it here\n// \t\t\t\t\t\t\t\t\t\t\t...refField[SharedMetadata],\n// \t\t\t\t\t\t\t\t\t\t\t//@ts-expect-error - Is normal because we are extending it here\n// \t\t\t\t\t\t\t\t\t\t\tinheritanceOrigin: refField[SharedMetadata]?.inheritanceOrigin || value.extends,\n// \t\t\t\t\t\t\t\t\t\t},\n// \t\t\t\t\t\t\t\t\t},\n// \t\t\t\t\t\t\t\t];\n// \t\t\t\t\t\t\t});\n\n// \t\t\t\t\t\t\tval.refFields = {\n// \t\t\t\t\t\t\t\t...(val.refFields || {}),\n// \t\t\t\t\t\t\t\t...extendedRefFields,\n// \t\t\t\t\t\t\t};\n// \t\t\t\t\t\t}\n// \t\t\t\t\t}\n\n// \t\t\t\t\tvalue.linkFields = extendedSchema.linkFields\n// \t\t\t\t\t\t? (value.linkFields || []).concat(\n// \t\t\t\t\t\t\t\textendedSchema.linkFields.map((lf) => ({\n// \t\t\t\t\t\t\t\t\t...lf,\n// \t\t\t\t\t\t\t\t\tinherited: true,\n// \t\t\t\t\t\t\t\t\t[SharedMetadata]: {\n// \t\t\t\t\t\t\t\t\t\t...lf[SharedMetadata],\n// \t\t\t\t\t\t\t\t\t\tinheritanceOrigin: lf[SharedMetadata]?.inheritanceOrigin || value.extends,\n// \t\t\t\t\t\t\t\t\t},\n// \t\t\t\t\t\t\t\t})),\n// \t\t\t\t\t\t\t)\n// \t\t\t\t\t\t: value.linkFields;\n\n// \t\t\t\t\t//todo: Do some checks, and potentially simplify the hooks structure\n// \t\t\t\t\tif (extendedSchema?.hooks?.pre) {\n// \t\t\t\t\t\tvalue.hooks = value.hooks || {};\n// \t\t\t\t\t\tvalue.hooks.pre = value.hooks.pre || [];\n// \t\t\t\t\t\tvalue.hooks.pre = [...(extendedSchema?.hooks?.pre || []), ...(value?.hooks?.pre || [])];\n// \t\t\t\t\t}\n// \t\t\t\t}\n// \t\t\t},\n// \t\t\t{ traversalType: 'breadth-first' },\n// \t\t),\n// \t);\n// \treturn withExtensionsSchema;\n// };\n\n// export const enrichSchema = (schema: BormSchema, dbHandles: DBHandles): EnrichedBormSchema => {\n// \tconst allLinkedFields: LinkedFieldWithThing[] = [];\n// \t// #region 1)\n\n// \t// #endregion\n\n// \t// * Gather linkFields\n// \ttraverse(schema, ({ key, value, meta }: TraversalCallbackContext) => {\n// \t\tif (key === 'linkFields') {\n// \t\t\tconst getThingTypes = () => {\n// \t\t\t\tif (!meta.nodePath) {\n// \t\t\t\t\tthrow new Error('No path');\n// \t\t\t\t}\n// \t\t\t\tconst [thingPath, thing] = meta.nodePath.split('.');\n// \t\t\t\tconst thingType = thingPath === 'entities' ? 'entity' : thingPath === 'relations' ? 'relation' : '';\n// \t\t\t\treturn {\n// \t\t\t\t\tthing,\n// \t\t\t\t\tthingType,\n// \t\t\t\t};\n// \t\t\t};\n// \t\t\tconst thingTypes = getThingTypes();\n// \t\t\tconst withThing = !Array.isArray(value)\n// \t\t\t\t? [\n// \t\t\t\t\t\t{\n// \t\t\t\t\t\t\t...value,\n// \t\t\t\t\t\t\t...thingTypes,\n// \t\t\t\t\t\t},\n// \t\t\t\t\t]\n// \t\t\t\t: value.map((x) => ({\n// \t\t\t\t\t\t...x,\n// \t\t\t\t\t\t...thingTypes,\n// \t\t\t\t\t}));\n\n// \t\t\tallLinkedFields.push(...withThing);\n// \t\t}\n// \t});\n\n// \tconst withExtensionsSchema = extendSchema(schema);\n\n// \t// * Enrich the schema\n// \tconst enrichedSchema = produce(withExtensionsSchema, (draft: Partial<EnrichedBormSchema>) =>\n// \t\ttraverse(draft, ({ value, key, meta }: TraversalCallbackContext) => {\n// \t\t\t// id things\n// \t\t\tif (meta.depth === 2 && value.idFields && !value.id) {\n// \t\t\t\t// depth 2 are entities and relations\n// \t\t\t\t// eslint-disable-next-line prefer-destructuring\n// \t\t\t\tvalue.name = key;\n// \t\t\t\tconst thingType = () => {\n// \t\t\t\t\tif (meta.nodePath?.split('.')[0] === 'entities') {\n// \t\t\t\t\t\treturn 'entity';\n// \t\t\t\t\t}\n// \t\t\t\t\tif (meta.nodePath?.split('.')[0] === 'relations') {\n// \t\t\t\t\t\treturn 'relation';\n// \t\t\t\t\t}\n// \t\t\t\t\tthrow new Error('Unsupported node attributes');\n// \t\t\t\t};\n// \t\t\t\tvalue.thingType = thingType();\n// \t\t\t\t/// We identify the database assigned to this thing\n// \t\t\t\t//@ts-expect-error - TODO\n// \t\t\t\tconst thingDB: DBHandleKey = Object.keys(dbHandles).find((key) =>\n// \t\t\t\t\t// @ts-expect-error - TODO\n// \t\t\t\t\tdbHandles[key]?.get(value.defaultDBConnector.id),\n// \t\t\t\t);\n// \t\t\t\tvalue.db = thingDB as DBHandleKey; //todo\n// \t\t\t\tvalue.dbContext = adapterContext[thingDB] as AdapterContext; //todo\n\n// \t\t\t\tvalue.dbProviderConfig =\n// \t\t\t\t\tthingDB === 'surrealDB' ? dbHandles[thingDB]?.get(value.defaultDBConnector.id)?.providerConfig : undefined;\n\n// \t\t\t\t// init the arrays\n// \t\t\t\tvalue.computedFields = [];\n// \t\t\t\tvalue.virtualFields = [];\n// \t\t\t\tvalue.requiredFields = [];\n// \t\t\t\tvalue.enumFields = [];\n// \t\t\t\tvalue.fnValidatedFields = [];\n\n// \t\t\t\t//todo: Maybe move all this to the pre-step and enrich all the linkFields there and same with the roles so then we can usse allLinkFields and allRoles as enriched ones.\n// \t\t\t\tif ('linkFields' in value && value.linkFields) {\n// \t\t\t\t\tconst val = value as EnrichedBormRelation;\n\n// \t\t\t\t\tval.linkFields?.forEach((linkField) => {\n// \t\t\t\t\t\t///Check if the path is already in use\n// \t\t\t\t\t\tif (\n// \t\t\t\t\t\t\tval.dataFields?.find((df) => df.path === linkField.path) ||\n// \t\t\t\t\t\t\tObject.keys(val.roles || {}).includes(linkField.path)\n// \t\t\t\t\t\t) {\n// \t\t\t\t\t\t\tthrow new Error(\n// \t\t\t\t\t\t\t\t`[Schema] The path ${linkField.path} is already in use by a dataField or linkField in ${val.name}. Path:${meta.nodePath}`,\n// \t\t\t\t\t\t\t);\n// \t\t\t\t\t\t}\n// \t\t\t\t\t\tconst linkFieldRelation = withExtensionsSchema.relations[linkField.relation] as EnrichedBormRelation;\n\n// \t\t\t\t\t\tif (!linkField.isVirtual) {\n// \t\t\t\t\t\t\t//its ok for virtual linkFields to don't have a relation\n// \t\t\t\t\t\t\tif (!linkFieldRelation) {\n// \t\t\t\t\t\t\t\tthrow new Error(`The relation ${linkField.relation} does not exist in the schema`);\n// \t\t\t\t\t\t\t}\n\n// \t\t\t\t\t\t\tif (linkFieldRelation.roles?.[linkField.plays] === undefined) {\n// \t\t\t\t\t\t\t\tthrow new Error(\n// \t\t\t\t\t\t\t\t\t`The role ${linkField.plays} is not defined in the relation ${linkField.relation} (linkField: ${linkField.path})`,\n// \t\t\t\t\t\t\t\t);\n// \t\t\t\t\t\t\t}\n// \t\t\t\t\t\t}\n\n// \t\t\t\t\t\t//#region SHARED METADATA\n\n// \t\t\t\t\t\tif (linkField.target === 'relation') {\n// \t\t\t\t\t\t\tif (linkField.isVirtual) {\n// \t\t\t\t\t\t\t\tthrow new Error(\n// \t\t\t\t\t\t\t\t\t`[Schema] Virtual linkFields can't target a relation. Thing: \"${val.name}\" LinkField: \"${linkField.path}. Path:${meta.nodePath}.\"`,\n// \t\t\t\t\t\t\t\t);\n// \t\t\t\t\t\t\t}\n// \t\t\t\t\t\t\tlinkField.$things = [linkField.relation, ...(linkFieldRelation.subTypes || [])];\n// \t\t\t\t\t\t\tlinkField.oppositeLinkFieldsPlayedBy = [\n// \t\t\t\t\t\t\t\t{\n// \t\t\t\t\t\t\t\t\tplays: linkField.path,\n// \t\t\t\t\t\t\t\t\tthing: linkField.relation,\n// \t\t\t\t\t\t\t\t\tthingType: 'relation',\n// \t\t\t\t\t\t\t\t},\n// \t\t\t\t\t\t\t];\n// \t\t\t\t\t\t}\n// \t\t\t\t\t\tif (linkField.target === 'role') {\n// \t\t\t\t\t\t\t///target role\n// \t\t\t\t\t\t\tlinkField.oppositeLinkFieldsPlayedBy = allLinkedFields.filter(\n// \t\t\t\t\t\t\t\t(x) => x.relation === linkField.relation && x.plays !== linkField.plays && x.target === 'role',\n// \t\t\t\t\t\t\t);\n\n// \t\t\t\t\t\t\tif (linkField.oppositeLinkFieldsPlayedBy.length === 0) {\n// \t\t\t\t\t\t\t\tthrow new Error(\n// \t\t\t\t\t\t\t\t\t`[Schema] LinkFields require to have at least one opposite linkField playing an opposite role. Thing: \"${val.name}\" LinkField: \"${linkField.path}. Path:${meta.nodePath}.\"`,\n// \t\t\t\t\t\t\t\t);\n// \t\t\t\t\t\t\t}\n\n// \t\t\t\t\t\t\t// This is duplicated here and in playedBy on purpose\n// \t\t\t\t\t\t\tlinkField.pathToRelation =\n// \t\t\t\t\t\t\t\tval.linkFields?.find((lf) => lf.target === 'relation' && lf.relation === linkField.relation)?.path ??\n// \t\t\t\t\t\t\t\tlinkField.relation.toLocaleLowerCase();\n\n// \t\t\t\t\t\t\tlinkField.$things = [\n// \t\t\t\t\t\t\t\t...new Set(\n// \t\t\t\t\t\t\t\t\tlinkField.oppositeLinkFieldsPlayedBy.flatMap((x) => [\n// \t\t\t\t\t\t\t\t\t\tx.thing,\n// \t\t\t\t\t\t\t\t\t\t...(getSchemaByThing(withExtensionsSchema, x.thing)?.subTypes || []),\n// \t\t\t\t\t\t\t\t\t]),\n// \t\t\t\t\t\t\t\t),\n// \t\t\t\t\t\t\t];\n\n// \t\t\t\t\t\t\t// #region FILTERING OPPOSITE LINKFIELDS\n// \t\t\t\t\t\t\t// const { targetRoles, filter } = linkField;\n// \t\t\t\t\t\t\t// Example targetRoles: ['color', 'users']\n// \t\t\t\t\t\t\t//Can be combined with filter, for instance to automatically filter by $thing\n\n// \t\t\t\t\t\t\t//If after the filters, we still have 2, then the schema is wrong\n// \t\t\t\t\t\t\tif (linkField.oppositeLinkFieldsPlayedBy.length > 1) {\n// \t\t\t\t\t\t\t\t//temp: lets just warn and add an error only if actually used\n// \t\t\t\t\t\t\t\tconsole.warn(\n// \t\t\t\t\t\t\t\t\t`[Schema] LinkField ${linkField.path} in ${val.name} has multiple candidates ${linkField.oppositeLinkFieldsPlayedBy.map((lf) => lf.thing).join(',')} and this is not yet supported. Please target a single one using targetRoles with a single role`,\n// \t\t\t\t\t\t\t\t);\n// \t\t\t\t\t\t\t}\n// \t\t\t\t\t\t\t// #endregion\n// \t\t\t\t\t\t}\n// \t\t\t\t\t\t//#endregion\n\n// \t\t\t\t\t\t//#region SUREALDB METADATA\n\n// \t\t\t\t\t\tif (value.db === 'surrealDB') {\n// \t\t\t\t\t\t\tconst originalRelation =\n// \t\t\t\t\t\t\t\tlinkFieldRelation?.roles?.[linkField.plays][SharedMetadata]?.inheritanceOrigin ?? linkField.relation;\n\n// \t\t\t\t\t\t\tconst queryPath = getSurrealLinkFieldQueryPath({\n// \t\t\t\t\t\t\t\tlinkField,\n// \t\t\t\t\t\t\t\toriginalRelation,\n// \t\t\t\t\t\t\t\twithExtensionsSchema,\n// \t\t\t\t\t\t\t\tlinkMode: value.dbProviderConfig.linkMode,\n// \t\t\t\t\t\t\t});\n\n// \t\t\t\t\t\t\tlinkField[SuqlMetadata] = {\n// \t\t\t\t\t\t\t\tqueryPath,\n// \t\t\t\t\t\t\t};\n// \t\t\t\t\t\t}\n\n// \t\t\t\t\t\t// We take the original relation as its the one that holds the name of the relation in surrealDB\n\n// \t\t\t\t\t\t//#endregion\n// \t\t\t\t\t});\n// \t\t\t\t}\n\n// \t\t\t\tif ('refFields' in value && value.refFields) {\n// \t\t\t\t\tvalue.refFields = mapEntries(value.refFields, (refFieldKey: string, refField: RefField) => {\n// \t\t\t\t\t\tconst enrichedRefField = {\n// \t\t\t\t\t\t\t...refField,\n// \t\t\t\t\t\t\tdbPath: refField.dbPath || refFieldKey,\n// \t\t\t\t\t\t};\n// \t\t\t\t\t\treturn [refFieldKey, enrichedRefField];\n// \t\t\t\t\t});\n// \t\t\t\t}\n\n// \t\t\t\t// adding all the linkFields to roles\n// \t\t\t\tif ('roles' in value) {\n// \t\t\t\t\tconst val = value as EnrichedBormRelation;\n\n// \t\t\t\t\tObject.entries(val.roles).forEach(([roleKey, role]) => {\n// \t\t\t\t\t\t//Check if the key is used by linkFields or roleFields already\n// \t\t\t\t\t\tif (\n// \t\t\t\t\t\t\tval.dataFields?.find((df) => df.path === roleKey) ||\n// \t\t\t\t\t\t\tval.linkFields?.find((lf) => lf.path === roleKey)\n// \t\t\t\t\t\t) {\n// \t\t\t\t\t\t\tthrow new Error(\n// \t\t\t\t\t\t\t\t`[Schema] The path ${roleKey} is already in use by a dataField or linkField in ${val.name}. Path:${meta.nodePath}`,\n// \t\t\t\t\t\t\t);\n// \t\t\t\t\t\t}\n// \t\t\t\t\t\tconst playedBy = allLinkedFields.filter((x) => x.relation === key && x.plays === roleKey) || [];\n// \t\t\t\t\t\t// Duplicating path to relation here and in normal linkfields as it is used in both places\n// \t\t\t\t\t\trole.playedBy = playedBy.map((lf) => ({\n// \t\t\t\t\t\t\t...lf,\n// \t\t\t\t\t\t\tpathToRelation:\n// \t\t\t\t\t\t\t\tlf.target === 'relation'\n// \t\t\t\t\t\t\t\t\t? lf.path\n// \t\t\t\t\t\t\t\t\t: (val.linkFields?.find(\n// \t\t\t\t\t\t\t\t\t\t\t(lf) => lf.target === 'relation' && lf.relation === key && lf.plays === roleKey,\n// \t\t\t\t\t\t\t\t\t\t)?.path ?? lf.relation.toLocaleLowerCase()),\n// \t\t\t\t\t\t}));\n\n// \t\t\t\t\t\tconst impactedLinkFields = allLinkedFields.filter(\n// \t\t\t\t\t\t\t(x) => x.target === 'relation' && x.plays === roleKey && val.allExtends?.includes(x.relation),\n// \t\t\t\t\t\t);\n// \t\t\t\t\t\trole.impactedLinkFields = impactedLinkFields;\n\n// \t\t\t\t\t\trole.path = roleKey;\n// \t\t\t\t\t\tconst $things = [\n// \t\t\t\t\t\t\t...new Set(\n// \t\t\t\t\t\t\t\tplayedBy\n// \t\t\t\t\t\t\t\t\t.flatMap((x) => {\n// \t\t\t\t\t\t\t\t\t\tconst playerSchema = getSchemaByThing(withExtensionsSchema, x.thing);\n// \t\t\t\t\t\t\t\t\t\treturn [...(playerSchema.subTypes || []), x.thing];\n// \t\t\t\t\t\t\t\t\t})\n// \t\t\t\t\t\t\t\t\t.flat()\n// \t\t\t\t\t\t\t\t\t.filter(Boolean),\n// \t\t\t\t\t\t\t),\n// \t\t\t\t\t\t];\n\n// \t\t\t\t\t\trole.$things = $things;\n\n// \t\t\t\t\t\tconst originalRelation = role[SharedMetadata]?.inheritanceOrigin || value.name;\n\n// \t\t\t\t\t\t/*if ($things.length > 1) {\n// \t\t\t\t\t\t\tconsole.warn(\n// \t\t\t\t\t\t\t\t`Not supported yet: Role ${roleKey} in ${'name' in value ? value.name : JSON.stringify(value)} is played by multiple things: ${$things.join(', ')}`,\n// \t\t\t\t\t\t\t);\n// \t\t\t\t\t\t}*/\n// \t\t\t\t\t\t//get all subTyped for each potential player\n// \t\t\t\t\t\tconst playerThingsWithSubTypes = $things.flatMap((playerThing) => {\n// \t\t\t\t\t\t\tconst playerSchema = getSchemaByThing(schema, playerThing);\n// \t\t\t\t\t\t\tconst subTypes = playerSchema?.subTypes || [];\n// \t\t\t\t\t\t\treturn [playerThing, ...subTypes];\n// \t\t\t\t\t\t});\n\n// \t\t\t\t\t\tconst getQueryPath = () => {\n// \t\t\t\t\t\t\tif (value.dbProviderConfig.linkMode === 'edges') {\n// \t\t\t\t\t\t\t\treturn `->\\`${originalRelation}_${roleKey}\\`->(\\`${playerThingsWithSubTypes.join('`,`')}\\`)`;\n// \t\t\t\t\t\t\t}\n// \t\t\t\t\t\t\tif (value.dbProviderConfig.linkMode === 'refs') {\n// \t\t\t\t\t\t\t\tif (role.cardinality === 'MANY') {\n// \t\t\t\t\t\t\t\t\treturn `$parent.[\\`${roleKey}\\`]`;\n// \t\t\t\t\t\t\t\t}\n// \t\t\t\t\t\t\t\tif (role.cardinality === 'ONE') {\n// \t\t\t\t\t\t\t\t\treturn `$parent.\\`${roleKey}\\``;\n// \t\t\t\t\t\t\t\t}\n// \t\t\t\t\t\t\t}\n// \t\t\t\t\t\t\tthrow new Error('Unsupported linkMode');\n// \t\t\t\t\t\t};\n\n// \t\t\t\t\t\tif (value.db === 'surrealDB') {\n// \t\t\t\t\t\t\tconst queryPath = getQueryPath();\n\n// \t\t\t\t\t\t\trole[SuqlMetadata] = {\n// \t\t\t\t\t\t\t\tqueryPath,\n// \t\t\t\t\t\t\t};\n// \t\t\t\t\t\t}\n// \t\t\t\t\t});\n// \t\t\t\t}\n// \t\t\t}\n\n// \t\t\t// role fields\n// \t\t\tif (value && typeof value === 'object' && 'playedBy' in value) {\n// \t\t\t\t// if (value.playedBy.length > 1) {\n// \t\t\t\tconst playedBySet = [...new Set(value.playedBy.map((x: LinkedFieldWithThing) => x.thing))];\n// \t\t\t\tif (playedBySet.length > 1) {\n// \t\t\t\t\tconsole.warn(\n// \t\t\t\t\t\t`[Schema] roleFields can be only played by one thing. Role: ${key}, path:${meta.nodePath}, played by: ${playedBySet.join(', ')}`,\n// \t\t\t\t\t);\n// \t\t\t\t}\n// \t\t\t\tif (value.playedBy.length === 0) {\n// \t\t\t\t\tthrow new Error(\n// \t\t\t\t\t\t`[Schema] roleFields should be played at least by one thing. Role: ${key}, path:${meta.nodePath}`,\n// \t\t\t\t\t);\n// \t\t\t\t}\n// \t\t\t}\n\n// \t\t\t//if default or computed, add to computed fields list\n// \t\t\tif (meta.depth === 4) {\n// \t\t\t\tconst [type, thingId] = meta.nodePath?.split('.') || [];\n// \t\t\t\t//todo change \"type\" to \"thingType\"\n// \t\t\t\t// @ts-expect-error - TODO\n// \t\t\t\tconst draftSchema = draft[type][thingId] as EnrichedBormEntity;\n\n// \t\t\t\tif (!isArray(value) && typeof value === 'object') {\n// \t\t\t\t\t//skip meta.depth 4 when its arrays or undefined or not an object\n// \t\t\t\t\tif (value.validations) {\n// \t\t\t\t\t\tif (value.validations.required) {\n// \t\t\t\t\t\t\tdraftSchema.requiredFields.push(value.path);\n// \t\t\t\t\t\t}\n// \t\t\t\t\t\tif (value.validations.enum) {\n// \t\t\t\t\t\t\tdraftSchema.enumFields.push(value.path);\n// \t\t\t\t\t\t}\n// \t\t\t\t\t\tif (value.validations.fn) {\n// \t\t\t\t\t\t\tdraftSchema.fnValidatedFields.push(value.path);\n// \t\t\t\t\t\t}\n// \t\t\t\t\t}\n\n// \t\t\t\t\tif (value.default) {\n// \t\t\t\t\t\tif (value.isVirtual) {\n// \t\t\t\t\t\t\t// default and virtual means computed\n// \t\t\t\t\t\t\tdraftSchema.virtualFields.push(value.path);\n// \t\t\t\t\t\t} else {\n// \t\t\t\t\t\t\t//default but not virtual means pre-computed (default value), borm side\n// \t\t\t\t\t\t\tdraftSchema.computedFields.push(value.path);\n// \t\t\t\t\t\t}\n// \t\t\t\t\t} else {\n// \t\t\t\t\t\tif (value.isVirtual) {\n// \t\t\t\t\t\t\t//not default but isVirtual means, computed in the DB side, not borm side\n// \t\t\t\t\t\t\tdraftSchema.virtualFields.push(value.path);\n// \t\t\t\t\t\t}\n// \t\t\t\t\t}\n// \t\t\t\t}\n// \t\t\t}\n\n// \t\t\t//if it requires validations, add to the fields that required validations\n// \t\t}),\n// \t) as EnrichedBormSchema;\n\n// \t//console.log('schema and enrichedSchema', JSON.stringify(schema), JSON.stringify(enrichedSchema));\n// \treturn enrichedSchema;\n// };\n","/* eslint-disable no-param-reassign */\nimport type { Draft } from 'immer';\nimport { current, isDraft } from 'immer';\nimport { customAlphabet } from 'nanoid';\nimport type { TraversalMeta } from 'object-traversal';\nimport { getNodeByPath } from 'object-traversal';\nimport { isArray, isObject, listify, tryit } from 'radash';\n\n// todo: split helpers between common helpers, typeDBhelpers, dgraphelpers...\nimport type {\n BQLMutationBlock,\n BormSchema,\n EnrichedBormEntity,\n EnrichedBormRelation,\n EnrichedBormSchema,\n EnrichedDataField,\n EnrichedLinkField,\n EnrichedRefField,\n EnrichedRoleField,\n FilledBQLMutationBlock,\n PositiveFilter,\n RawBQLQuery,\n ThingType,\n} from './types';\n\nexport const oFind = <RemovedKeys extends string, T extends Record<string | number | symbol, any>>(\n obj: T,\n fn: (k: string | number | symbol, v: any) => boolean,\n): Omit<T, RemovedKeys>[Exclude<keyof T, RemovedKeys>] =>\n Object.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 obj: T,\n fn: (k: K, v: any) => boolean,\n): Partial<T> => {\n const entries = Reflect.ownKeys(obj).map((key) => [key, obj[key as keyof T]]);\n return Object.fromEntries(\n entries.filter(([k, v]) => {\n const [error, result] = tryit(() => fn(k as K, v))();\n return error ? false : result;\n }),\n ) as Partial<T>;\n};\n\nexport const getSchemaByThing = (\n schema: BormSchema | EnrichedBormSchema,\n $thing: string,\n): EnrichedBormEntity | EnrichedBormRelation => {\n if ($thing in schema.entities) {\n return schema.entities[$thing] as EnrichedBormEntity;\n }\n if ($thing in schema.relations) {\n return schema.relations[$thing] as EnrichedBormRelation;\n }\n throw new Error(`${$thing} is not defined in the schema`);\n};\n\nexport const getCurrentSchema = (\n schema: BormSchema | EnrichedBormSchema,\n node: Partial<BQLMutationBlock>,\n): EnrichedBormEntity | EnrichedBormRelation => {\n if (!node) {\n throw new Error('[Internal] No node for getCurrentSchema');\n }\n if (node.$thing) {\n if (node.$thingType === 'entity') {\n if (!(node.$thing in schema.entities)) {\n throw new Error(`Missing entity '${node.$thing}' in the schema`);\n }\n return schema.entities[node.$thing] as EnrichedBormEntity;\n }\n if (node.$thingType === 'relation') {\n if (!(node.$thing in schema.relations)) {\n throw new Error(`Missing relation '${node.$thing}' in the schema`);\n }\n return schema.relations[node.$thing] as EnrichedBormRelation;\n }\n // TODO: This should be validated during the initialization\n if (node.$thing in schema.entities && node.$thing in schema.relations) {\n throw new Error(`Ambiguous $thing ${node.$thing}`);\n }\n if (node.$thing in schema.entities) {\n return schema.entities[node.$thing] as EnrichedBormEntity;\n }\n if (node.$thing in schema.relations) {\n return schema.relations[node.$thing] as EnrichedBormRelation;\n }\n throw new Error(`Wrong schema or query for ${JSON.stringify(node, null, 2)}`);\n }\n\n //! Todo: delete when this works with the new $thing and $thingType fields\n if (node.$entity) {\n if (!(node.$entity in schema.entities)) {\n throw new Error(`Missing entity '${node.$entity}' in the schema`);\n }\n return schema.entities[node.$entity] as EnrichedBormEntity;\n }\n if (node.$relation) {\n if (!(node.$relation in schema.relations)) {\n throw new Error(`Missing relation '${node.$relation}' in the schema`);\n }\n return schema.relations[node.$relation] as EnrichedBormRelation;\n }\n throw new Error(`Wrong schema or query for ${JSON.stringify(node, null, 2)}`);\n};\n\nexport const getFieldType = (\n currentSchema: EnrichedBormRelation | EnrichedBormEntity,\n key: string,\n): ['idField' | 'dataField' | 'linkField' | 'roleField', EnrichedDataField | EnrichedLinkField | EnrichedRoleField] => {\n const dataFieldSchema = currentSchema.dataFields?.find((dataField: any) => dataField.path === key);\n\n if (currentSchema.idFields?.includes(key)) {\n if (!dataFieldSchema) {\n throw new Error(`Field ${key} is an idField but not a dataField in schema`);\n }\n return ['idField', dataFieldSchema];\n }\n if (dataFieldSchema) {\n return ['dataField', dataFieldSchema];\n }\n const linkFieldSchema = currentSchema.linkFields?.find((linkField: any) => linkField.path === key);\n if (linkFieldSchema) {\n return ['linkField', linkFieldSchema];\n }\n const roleFieldSchema = 'roles' in currentSchema ? currentSchema.roles[key] : undefined;\n if (roleFieldSchema) {\n return ['roleField', roleFieldSchema];\n }\n throw new Error(`Field ${key} not found in schema, Defined in $filter`);\n};\nexport const getIdFieldKey = (schema: EnrichedBormSchema, node: Partial<BQLMutationBlock>) => {\n const currentSchema = getCurrentSchema(schema, node);\n if (currentSchema?.idFields?.length && currentSchema?.idFields?.length > 1) {\n throw new Error(`Multiple ids not yet enabled / composite ids: ${currentSchema?.idFields}`);\n }\n\n const [idField] = currentSchema.idFields; //todo composed ids\n return idField;\n};\n\nexport const getThingType = (rootNode: BQLMutationBlock, schema: EnrichedBormSchema): ThingType => {\n const thing = rootNode.$thing || rootNode.$entity || rootNode.$relation;\n if (!thing) {\n throw new Error('[Internal] No thing found');\n }\n if (rootNode.$entity) {\n return 'entity';\n }\n if (rootNode.$relation) {\n return 'relation';\n }\n if (schema.entities[thing]) {\n return 'entity';\n }\n if (schema.relations[thing]) {\n return 'relation';\n }\n throw new Error('No thing found');\n};\n\nexport const getFieldSchema = (\n schema: EnrichedBormSchema,\n node: Partial<BQLMutationBlock>,\n field: string,\n): EnrichedDataField | EnrichedLinkField | EnrichedRoleField | EnrichedRefField => {\n const currentSchema = getCurrentSchema(schema, node);\n const foundLinkField = currentSchema.linkFields?.find((lf) => lf.path === field);\n if (foundLinkField) {\n return foundLinkField as EnrichedLinkField;\n }\n const foundDataField = currentSchema.dataFields?.find((lf) => lf.path === field);\n if (foundDataField) {\n return foundDataField as EnrichedDataField;\n }\n const foundRoleField = 'roles' in currentSchema ? currentSchema.roles?.[field] : undefined;\n if (foundRoleField) {\n return foundRoleField as EnrichedRoleField;\n }\n const foundRefField = 'refFields' in currentSchema ? currentSchema.refFields?.[field] : undefined;\n if (foundRefField) {\n return foundRefField as EnrichedRefField;\n }\n throw new Error(`Field ${field} not found in schema`);\n};\n\nexport const getCardinality = (\n schema: EnrichedBormSchema,\n node: Partial<BQLMutationBlock>,\n field: string,\n): 'ONE' | 'MANY' | 'INTERVAL' | undefined => {\n const currentFieldSchema = getFieldSchema(schema, node, field);\n return currentFieldSchema?.cardinality;\n};\n\ntype ReturnTypeWithoutNode = {\n fields: string[];\n dataFields: string[];\n roleFields: string[];\n linkFields: string[];\n refFields: string[];\n};\n\ntype ReturnTypeWithNode = ReturnTypeWithoutNode & {\n usedFields: string[];\n usedRoleFields: string[];\n usedLinkFields: string[];\n usedDataFields: string[];\n usedRefFields: string[];\n unidentifiedFields: 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 currentSchema: EnrichedBormEntity | EnrichedBormRelation,\n node?: T,\n): T extends undefined ? ReturnTypeWithoutNode : ReturnTypeWithNode => {\n const availableDataFields = currentSchema.dataFields?.map((x) => x.path) || [];\n const availableLinkFields = currentSchema.linkFields?.map((x) => x.path) || [];\n const availableRefFields = 'refFields' in currentSchema ? listify(currentSchema.refFields, (k: string) => k) : [];\n const availableRoleFields = 'roles' in currentSchema ? listify(currentSchema.roles, (k: string) => k) : [];\n const availableFields = [\n ...(availableDataFields || []),\n ...(availableLinkFields || []),\n ...(availableRoleFields || []),\n ...(availableRefFields || []),\n ];\n\n // spot non existing fields\n const reservedRootFields = [\n '$entity',\n '$op',\n '$id',\n '$tempId',\n '$bzId',\n '$relation',\n '$parentKey', //todo: this is not a valid one, to delete and migrate to symbol!\n '$filter',\n '$fields',\n '$excludedFields',\n '$thing',\n '$thingType',\n ];\n\n const allowedFields = [...reservedRootFields, ...availableFields];\n\n if (!node) {\n return {\n fields: availableFields,\n dataFields: availableDataFields,\n roleFields: availableRoleFields,\n linkFields: availableLinkFields,\n } as ReturnTypeWithNode;\n }\n const usedFields = node.$fields\n ? //queries\n (node.$fields.map((x: string | { $path: string }) => {\n if (typeof x === 'string') {\n if (x.startsWith('$') || x.startsWith('%')) {\n return undefined;\n }\n if (!availableFields.includes(x)) {\n throw new Error(`Field ${x} not found in the schema`);\n }\n return x;\n }\n if ('$path' in x && typeof x.$path === 'string') {\n return x.$path;\n }\n throw new Error('[Wrong format] Wrongly structured query');\n }) as string[])\n : //mutations\n (listify<any, string, any>(node, (k: string) => {\n if (k.startsWith('$') || k.startsWith('%')) {\n return undefined;\n }\n if (!availableFields.includes(k)) {\n throw new Error(`[Schema] Field ${k} not found in the schema`);\n }\n return k;\n }).filter((x) => x !== undefined) as string[]);\n\n const localFilterFields = !node.$filter\n ? []\n : listify(node.$filter as PositiveFilter, (k: string) =>\n k.toString().startsWith('$') ? undefined : k.toString(),\n ).filter((x) => x && availableDataFields?.includes(x));\n const nestedFilterFields = !node.$filter\n ? []\n : listify(node.$filter as PositiveFilter, (k: string) =>\n k.toString().startsWith('$') ? undefined : k.toString(),\n ).filter((x) => x && [...(availableRoleFields || []), ...(availableLinkFields || [])]?.includes(x));\n\n const unidentifiedFields = [...usedFields, ...localFilterFields]\n .filter((x) => !x?.startsWith('%'))\n // @ts-expect-error - TODO description\n .filter((x) => !allowedFields.includes(x))\n .filter((x) => x) as string[]; // todo 🤔\n const localFilters = !node.$filter ? {} : oFilter(node.$filter, (k: string, _v) => localFilterFields.includes(k));\n const nestedFilters = !node.$filter ? {} : oFilter(node.$filter, (k: string, _v) => nestedFilterFields.includes(k));\n\n return {\n fields: availableFields,\n dataFields: availableDataFields,\n roleFields: availableRoleFields,\n linkFields: availableLinkFields,\n refFields: availableRefFields,\n usedFields,\n usedLinkFields: availableLinkFields.filter((x) => usedFields.includes(x)),\n usedRoleFields: availableRoleFields.filter((x) => usedFields.includes(x)),\n usedDataFields: availableDataFields.filter((x) => usedFields.includes(x)),\n usedRefFields: availableRefFields.filter((x) => usedFields.includes(x)),\n unidentifiedFields,\n ...(localFilterFields.length ? { localFilters } : {}),\n ...(nestedFilterFields.length ? { nestedFilters } : {}),\n } 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 return value !== null;\n};\n\nexport const extractChildEntities = (entities: EnrichedBormSchema['entities'], parentEntity: string) => {\n return Object.values(entities).reduce((acc: string[], value) => {\n if (value.extends === parentEntity) {\n acc.push(value.name);\n }\n return acc;\n }, []);\n};\n\nexport const capitalizeFirstLetter = (string: string) => {\n if (typeof string !== 'string') {\n throw new Error('capitalizeFirstLetter: string is not a string');\n }\n return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();\n};\n\nexport const getParentNode = (blocks: Record<any, any>, parent: any, meta: TraversalMeta) => {\n const currentPath = meta.nodePath || '';\n const pathParts = currentPath.split('.');\n const parentPath = isArray(parent)\n ? pathParts\n .slice(0, -2)\n .join('.') // Remove last two parts for an array parent\n : pathParts.slice(0, -1).join('.'); // Remove only the last part for a non-array parent\n return parent ? getNodeByPath(blocks, parentPath) : {}; //undefined parent for root\n};\n\nexport const getSymbols = (oldBlock: Partial<FilledBQLMutationBlock>): Record<symbol, any> => {\n return Reflect.ownKeys(oldBlock)\n .filter((key): key is symbol => typeof key === 'symbol')\n .reduce(\n (symbols, symbolKey) => {\n //@ts-expect-error - TODO\n // eslint-disable-next-line no-param-reassign\n symbols[symbolKey] = oldBlock[symbolKey];\n return symbols;\n },\n {} as Record<symbol, any>,\n );\n};\n\nexport const normalPropsCount = (obj: Record<string, any>) => {\n return Object.keys(obj).filter((key) => !key.startsWith('$')).length;\n};\n\nexport const isBQLBlock = (block: unknown): block is FilledBQLMutationBlock => {\n return 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> = T extends Array<infer U>\n ? Array<DeepCurrent<U>>\n : T extends object\n ? { [K in keyof T]: DeepCurrent<T[K]> }\n : T;\n\nexport const deepCurrent = <T>(obj: Drafted<T>): any => {\n if (Array.isArray(obj)) {\n // Explicitly cast the return type for arrays\n return obj.map((item) => current(item)) as DeepCurrent<T>;\n }\n if (obj && typeof obj === 'object') {\n // Handle non-null objects\n const plainObject = isDraft(obj) ? current(obj) : obj;\n const result: any = {};\n Object.entries(plainObject).forEach(([key, value]) => {\n // Use the key to dynamically assign the converted value\n result[key] = isDraft(value) ? current(value) : value;\n });\n // Explicitly cast the return type for objects\n return result as DeepCurrent<T>;\n }\n // Return the value directly for non-objects and non-arrays\n return obj as DeepCurrent<T>;\n};\n\nexport const assertDefined = <T>(value?: T, msg?: string): T => {\n if (value === undefined) {\n if (msg) {\n throw new Error(msg);\n }\n throw new Error('Value is undefined');\n }\n return value;\n};\n\nexport const indent = (line: string, depth: number) => {\n let _indent = '';\n for (let i = 0; i < depth; i++) {\n _indent += ' ';\n }\n return `${_indent}${line}`;\n};\n\nexport const genId = (n?: number) => {\n const idLength = n ?? 21;\n const alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz';\n const nanoid = customAlphabet(alphabet, idLength);\n return nanoid();\n};\n","/* eslint-disable no-param-reassign */\nimport { produce } from 'immer';\nimport { traverse } from 'object-traversal';\nimport { isArray, isObject } from 'radash';\nimport { getCurrentSchema, getFieldType } from '../../../helpers';\nimport type {\n BQLMutationBlock,\n EnrichedAttributeQuery,\n EnrichedBQLQuery,\n EnrichedBormEntity,\n EnrichedBormRelation,\n EnrichedBormSchema,\n EnrichedDataField,\n EnrichedLinkField,\n EnrichedLinkQuery,\n EnrichedRefField,\n EnrichedRefQuery,\n EnrichedRoleField,\n EnrichedRoleQuery,\n Filter,\n RawBQLQuery,\n} from '../../../types';\nimport { FieldSchema, QueryPath } from '../../../types/symbols';\n\nexport const enrichBQLQuery = (rawBqlQuery: RawBQLQuery[], schema: EnrichedBormSchema): EnrichedBQLQuery[] => {\n for (const item of rawBqlQuery) {\n if (!('$entity' in item) && !('$relation' in item) && (!('$thing' in item) || !('$thingType' in item))) {\n throw new Error('No entity specified in query');\n }\n }\n\n const batches = Array.isArray(rawBqlQuery) ? rawBqlQuery : [rawBqlQuery];\n\n // TODO: The raw query and the enriched query have different type.\n // Instead of mutating the existing object (copy + mutate)\n // replace `produce` and `traverse` with a function that returns a new object.\n // This way we don't need to force the enriched query (RawBQLQuery that has been mutated)\n // to have type EnrichedBQLQuery, thus we get better type check.\n const enriched = produce(batches, (draft: any) =>\n traverse(draft, (context) => {\n const { value: val, meta } = context;\n const value: BQLMutationBlock = val;\n\n if (isObject(value)) {\n // Places to be skipped\n if (meta.nodePath?.includes('.$filter') || meta.nodePath?.includes('.$playedBy')) {\n return;\n }\n // 0. Everytime we have some object we append its path\n //console.log('value!', value, 'path', meta.nodePath);\n value[QueryPath as any] = meta.nodePath;\n\n // 1. Moving $id into filter based on schema's idFields\n if (value.$id) {\n const node = value.$entity || value.$relation ? value : { [`$${value.$thingType}`]: value.$thing };\n const currentSchema = getCurrentSchema(schema, node);\n if (!currentSchema?.name) {\n throw new Error(`Schema not found for ${value.$thing}`);\n }\n value.$path = currentSchema.name;\n if (!Array.isArray(value.$id)) {\n value.$filterByUnique = true;\n }\n if (currentSchema.idFields.length === 1) {\n const [idField] = currentSchema.idFields;\n value.$filter = { ...value.$filter, [idField]: value.$id };\n value.$id = undefined;\n } else {\n throw new Error('Multiple ids not yet enabled / composite ids');\n }\n } else if ('$entity' in value || '$relation' in value || '$thing' in value) {\n const currentSchema = getCurrentSchema(schema, value);\n if (!currentSchema?.name) {\n throw new Error(`Schema not found for ${value.$thing}`);\n }\n value.$path = currentSchema.name;\n }\n // 2. Converting $entity or $relation into $thingType and $thing\n if (value.$entity) {\n value.$thing = value.$entity;\n value.$thingType = 'entity';\n value.$entity = undefined;\n } else if (value.$relation) {\n value.$thing = value.$relation;\n value.$thingType = 'relation';\n value.$relation = undefined;\n }\n\n if (isObject(value) && '$thing' in value && value.$thing) {\n const node = value.$entity || value.$relation ? value : { [`$${value.$thingType}`]: value.$thing };\n\n const currentSchema = getCurrentSchema(schema, node);\n if (value.$filter) {\n if (Object.keys(value.$filter).length === 0) {\n value.$filter = undefined;\n } else {\n value.$filter = enrichFilter(value.$filter, value.$thing, schema);\n value.$filterByUnique = checkFilterByUnique(value.$filter, currentSchema);\n }\n }\n // if no fields, then it's all fields\n if (value.$fields) {\n const idFieldIncluded = value.$fields.some((field: any) =>\n currentSchema?.idFields?.includes(field?.$path || field),\n );\n if (!idFieldIncluded) {\n value.$fields = [\n ...value.$fields,\n ...(Array.isArray(currentSchema.idFields) ? currentSchema.idFields : []),\n ];\n value.$idNotIncluded = true;\n }\n const newFields = value.$fields\n ?.flatMap((field: any) => {\n const processed = processField(field, currentSchema, schema);\n if (Array.isArray(processed)) {\n return processed;\n }\n return [processed];\n })\n .filter(Boolean);\n value.$fields = newFields;\n } else {\n const allFields = getAllFields(currentSchema);\n const newFields = allFields\n ?.flatMap((field: any) => {\n const processed = processField(field, currentSchema, schema);\n return Array.isArray(processed) ? processed : [processed];\n })\n .filter(Boolean);\n value.$fields = newFields;\n }\n\n if (value.$excludedFields) {\n value.$fields = value.$fields.filter((f: { $path: string }) => {\n if (isId(currentSchema, f)) {\n return true;\n }\n return !value.$excludedFields.includes(f.$path);\n });\n }\n }\n }\n }),\n );\n //console.log('enriched', JSON.stringify(enriched));\n\n return enriched as EnrichedBQLQuery[];\n};\n\nconst getAllFields = (currentSchema: EnrichedBormEntity | EnrichedBormRelation) => {\n const dataFields = currentSchema.dataFields?.map((field: any) => field.path) || [];\n const linkFields = currentSchema.linkFields?.map((field: any) => field.path) || [];\n const roleFields = Object.keys((currentSchema as EnrichedBormRelation).roles || {}) || [];\n const refFields = Object.keys(currentSchema.refFields || {}) || [];\n const allFields = [...dataFields, ...linkFields, ...roleFields, ...refFields];\n return allFields;\n};\n\nconst checkFilterByUnique = ($filter: any, currentSchema: EnrichedBormEntity | EnrichedBormRelation) => {\n const fields = Object.keys($filter || {});\n return fields.some((field) => {\n const fieldFilter = $filter[field];\n if (fieldFilter !== null && typeof fieldFilter !== 'undefined') {\n const isIdField = currentSchema.idFields?.includes(field);\n const isUniqueDataField = currentSchema.dataFields?.some(\n (f) => (f.dbPath === field || f.path === field) && f?.validations?.unique,\n );\n const isSingle$id = field === '$id' && !Array.isArray(fieldFilter);\n\n const isUniqueField = isIdField || isUniqueDataField || isSingle$id;\n\n if (isUniqueField) {\n // Now check if the filter on the field is an equality filter\n if (typeof fieldFilter !== 'object' || fieldFilter === null || Array.isArray(fieldFilter)) {\n // fieldFilter is a scalar value, so consider equality\n if (!Array.isArray(fieldFilter)) {\n // Scalar value, equality filter\n return true;\n }\n // Array of values, IN filter; not unique\n return false;\n }\n // fieldFilter is an object, check for $eq operator\n const filterOperators = Object.keys(fieldFilter);\n if (filterOperators.length === 1 && filterOperators[0] === '$eq') {\n // Equality operator\n const eqValue = fieldFilter.$eq;\n if (typeof eqValue !== 'object' || eqValue === null || !Array.isArray(eqValue)) {\n // Scalar value\n return true;\n }\n }\n // Not an equality filter on unique field\n return false;\n }\n }\n return false;\n });\n};\n\nconst isId = (currentSchema: EnrichedBormEntity | EnrichedBormRelation, field: any) =>\n typeof field === 'string' ? currentSchema.idFields?.includes(field) : currentSchema.idFields?.includes(field.$path);\n\nconst createDataField = (props: {\n field: any;\n fieldStr: string;\n $justId: boolean;\n dbPath: string;\n isVirtual?: boolean;\n fieldSchema: EnrichedDataField;\n}): EnrichedAttributeQuery => {\n const { field, fieldStr, $justId, dbPath, isVirtual, fieldSchema } = props;\n // todo: get all dependencies of the virtual field in the query and then remove from the output\n return {\n $path: fieldStr,\n $dbPath: dbPath,\n $thingType: 'attribute',\n $as: field.$as || fieldStr,\n $var: fieldStr,\n $fieldType: 'data',\n $justId,\n $id: field.$id,\n $isVirtual: isVirtual,\n [FieldSchema]: fieldSchema,\n };\n};\n\nconst createLinkField = (props: {\n field: any;\n fieldStr: string;\n linkField: any;\n $justId: boolean;\n dbPath: string;\n schema: EnrichedBormSchema;\n fieldSchema: EnrichedLinkField;\n}): EnrichedLinkQuery => {\n const { field, fieldStr, linkField, $justId, dbPath, schema, fieldSchema } = props;\n const { target, oppositeLinkFieldsPlayedBy } = linkField;\n return oppositeLinkFieldsPlayedBy.map((playedBy: any) => {\n const $thingType = target === 'role' ? playedBy.thingType : 'relation';\n const $thing = target === 'role' ? playedBy.thing : linkField.relation;\n const node = { [`$${$thingType}`]: $thing };\n const currentSchema = getCurrentSchema(schema, node);\n const idNotIncluded = field?.$fields?.filter((f: any) => isId(currentSchema, f)).length === 0;\n\n let fields = [];\n if (typeof field !== 'string') {\n if (field.$fields) {\n if (idNotIncluded) {\n const idFields = currentSchema.idFields || [];\n fields = [...field.$fields, ...idFields];\n } else {\n fields = field.$fields;\n }\n } else {\n fields = getAllFields(currentSchema);\n }\n } else {\n fields = ['id'];\n }\n\n if (field.$excludedFields) {\n fields = fields.filter((f: { $path: string }) => {\n if (isId(currentSchema, f)) {\n return true;\n }\n return !field.$excludedFields.includes(f.$path);\n });\n }\n\n const $filter =\n field.$id || field.$filter //skip if no $id and not $filter. In the future $thing can filter too\n ? { ...(field.$id ? { $id: field.$id } : {}), ...field.$filter }\n : undefined;\n\n return {\n $thingType,\n $plays: linkField.plays,\n $playedBy: {\n ...playedBy,\n oppositeLinkFieldsPlayedBy: undefined, // Remove this to break the loop\n },\n $path: playedBy.path,\n $dbPath: dbPath,\n $as: field.$as || fieldStr,\n $var: fieldStr,\n $thing,\n $fields: fields,\n $excludedFields: field.$excludedFields,\n $fieldType: 'link',\n $target: target,\n $intermediary: playedBy.relation,\n $justId,\n $id: field.$id,\n $filter,\n $idNotIncluded: idNotIncluded,\n $filterByUnique: checkFilterByUnique(field.$filter, currentSchema),\n $sort: field.$sort,\n $offset: field.$offset,\n $limit: field.$limit,\n [FieldSchema]: fieldSchema,\n };\n });\n};\n\nconst createRefField = (props: {\n field: any;\n fieldStr: string;\n $justId: boolean;\n dbPath: string;\n isVirtual?: boolean;\n fieldSchema: EnrichedRefField;\n}): EnrichedRefQuery => {\n const { field, fieldStr, $justId, dbPath, fieldSchema } = props;\n if ('$filter' in props) {\n throw new Error('Filter not supported in ref fields');\n }\n return {\n $path: fieldStr,\n $dbPath: dbPath,\n $contentType: fieldSchema.contentType,\n $as: field.$as || fieldStr,\n $var: fieldStr,\n $fieldType: 'ref',\n $justId,\n $fields: field.$fields,\n $id: field.$id,\n [FieldSchema]: fieldSchema,\n };\n};\n\nconst createRoleField = (props: {\n field: any;\n fieldStr: string;\n roleField: any;\n $justId: boolean;\n dbPath: string;\n schema: EnrichedBormSchema;\n fieldSchema: EnrichedRoleField;\n}): EnrichedRoleQuery => {\n const { field, fieldStr, roleField, $justId, dbPath, schema, fieldSchema } = props;\n\n return roleField.playedBy.map((playedBy: any) => {\n const { thing, thingType, relation } = playedBy;\n const node = { [`$${thingType}`]: thing };\n const currentSchema = getCurrentSchema(schema, node);\n const idNotIncluded =\n field?.$fields?.filter(\n (field: any) => currentSchema?.idFields?.includes(field) || currentSchema?.idFields?.includes(field.$path),\n ).length === 0;\n\n let fields = [];\n if (typeof field !== 'string') {\n if (field.$fields) {\n if (idNotIncluded) {\n const idFields = currentSchema.idFields || [];\n fields = [...field.$fields, ...idFields];\n } else {\n fields = field.$fields;\n }\n } else {\n fields = getAllFields(currentSchema);\n }\n } else {\n fields = ['id'];\n }\n\n if (field.$excludedFields) {\n fields = fields.filter((f: { $path: string }) => {\n if (isId(currentSchema, f)) {\n return true;\n }\n return !field.$excludedFields.includes(f.$path);\n });\n }\n\n const $filter =\n field.$id || field.$filter //skip if no $id and not $filter. In the future $thing can filter too\n ? { ...(field.$id ? { $id: field.$id } : {}), ...field.$filter }\n : undefined;\n\n return {\n $thingType: thingType,\n $path: fieldStr,\n $dbPath: dbPath,\n $as: field.$as || fieldStr,\n $var: fieldStr,\n $thing: thing,\n $fields: fields,\n $excludedFields: field.$excludedFields,\n $fieldType: 'role',\n $intermediary: relation,\n $justId,\n $id: field.$id,\n $filter,\n //$filter: field.$filter,\n $idNotIncluded: idNotIncluded,\n $filterByUnique: checkFilterByUnique(field.$filter, currentSchema),\n $playedBy: { ...playedBy, oppositeLinkFieldsPlayedBy: undefined },\n $sort: field.$sort,\n $offset: field.$offset,\n $limit: field.$limit,\n [FieldSchema]: fieldSchema,\n };\n });\n};\n\nconst processField = (\n field: any,\n currentSchema: EnrichedBormEntity | EnrichedBormRelation,\n schema: EnrichedBormSchema,\n) => {\n const fieldStr = typeof field === 'string' ? field : field.$path;\n const $justId = typeof field === 'string';\n const dataField = currentSchema.dataFields?.find((dataField: any) => dataField.path === fieldStr);\n const linkField = currentSchema.linkFields?.find((linkField: any) => linkField.path === fieldStr);\n const roleField = (currentSchema as EnrichedBormRelation).roles?.[fieldStr];\n const refField = currentSchema.refFields?.[fieldStr];\n\n if (dataField) {\n const isVirtual = !!dataField.isVirtual && !!dataField.default; //if there is no default value, then is fully virtual, the computing is managed in the DB\n return createDataField({\n field,\n fieldStr,\n $justId,\n dbPath: dataField.dbPath,\n isVirtual,\n fieldSchema: dataField,\n }); //ignore computed ones\n }\n if (linkField) {\n return createLinkField({\n field,\n fieldStr,\n linkField,\n $justId,\n dbPath: linkField.path,\n schema,\n fieldSchema: linkField,\n });\n }\n if (roleField) {\n return createRoleField({\n field,\n fieldStr,\n roleField,\n $justId,\n dbPath: fieldStr,\n schema,\n fieldSchema: roleField,\n });\n }\n if (refField) {\n return createRefField({\n field,\n fieldStr,\n $justId,\n dbPath: fieldStr,\n isVirtual: false,\n fieldSchema: refField,\n });\n }\n return null;\n};\n\n// Recursive enrich filter that checks all the tree of filters. Sometimes is dataFields, which is easier, but sometimes is linkFields or roleFields so we need to keep drilling\nexport const enrichFilter = ($filter: Filter | Filter[], $thing: string, schema: EnrichedBormSchema) => {\n if ($filter === null || $filter === undefined) {\n return $filter;\n }\n const wasArray = isArray($filter);\n\n const filterArray = wasArray ? $filter : [$filter];\n\n const resultArray = filterArray.map((filter: any) => {\n const keys = Object.keys(filter);\n\n const enrichedFilter = keys.reduce((acc: any, key: string) => {\n const value = filter[key];\n\n const valueAsArray = isArray(value) ? value : [value];\n\n if (key.startsWith('$')) {\n if (['$id', '$thing'].includes(key)) {\n acc[key] = value;\n } else if (['$not', '$or', '$and'].includes(key)) {\n // We don't want to enrich the special keys; we enrich nested things instead\n acc[key] = enrichFilter(value, $thing, schema);\n } else if (['$eq', '$in', '$exists'].includes(key)) {\n acc[key] = value;\n } else {\n throw new Error(`[Internal] Unknown filter operator ${key}`);\n }\n } else {\n // Must be a field\n const currentSchema = $thing in schema.entities ? schema.entities[$thing] : schema.relations[$thing];\n const [fieldType, fieldSchema] = getFieldType(currentSchema, key);\n\n if (fieldType === 'idField') {\n acc[key] = value;\n } else if (fieldType === 'dataField') {\n if (isObject(value) || (isArray(value) && value.some(isObject))) {\n acc[key] = isArray(value)\n ? { $or: enrichFilter(value, $thing, schema) }\n : enrichFilter(value, $thing, schema);\n } else if (isArray(value)) {\n acc[key] = { $in: value };\n } else {\n acc[key] = { $eq: value };\n }\n } else if (fieldType === 'linkField' || fieldType === 'roleField') {\n const fieldSchemaTyped = fieldSchema as EnrichedLinkField | EnrichedRoleField;\n const [childrenThing] = fieldSchemaTyped.$things; // TODO: Manage polymorphism\n if (valueAsArray.every((v: any) => typeof v === 'string')) {\n acc[key] = { $id: valueAsArray, $thing: childrenThing }; // Avoid the traverse to check this\n } else if (valueAsArray.every((v: any) => isObject(v))) {\n acc[key] = isArray(value)\n ? { $or: enrichFilter(value, childrenThing, schema) }\n : enrichFilter(value, childrenThing, schema);\n }\n } else {\n throw new Error(`Field ${key} not found in schema of ${$thing}`);\n }\n }\n return acc;\n }, {});\n return enrichedFilter;\n });\n\n if (!wasArray) {\n return resultArray[0];\n }\n if (resultArray.length === 1) {\n return resultArray[0];\n }\n return { $or: resultArray };\n};\n","/* eslint-disable no-param-reassign */\nimport { isArray, listify } from 'radash';\nimport { computeField } from '../../../../engine/compute';\nimport { getCurrentFields, getCurrentSchema, oFind } from '../../../../helpers';\nimport type {\n BQLMutationBlock,\n EnrichedBQLMutationBlock,\n EnrichedBormSchema,\n EnrichedDataField,\n} from '../../../../types';\n\nexport const computeFields = (node: BQLMutationBlock, field: string, schema: EnrichedBormSchema) => {\n const currentNode = node[field] as EnrichedBQLMutationBlock;\n if (!currentNode) {\n return;\n }\n (isArray(currentNode) ? currentNode : [currentNode]).forEach((subNode: EnrichedBQLMutationBlock) => {\n if (subNode.$op !== 'create') {\n return;\n }\n const currentSchema = getCurrentSchema(schema, subNode);\n const { unidentifiedFields } = getCurrentFields(currentSchema, subNode);\n const { computedFields, virtualFields } = currentSchema;\n\n //@ts-expect-error - TODO\n const filledFields = listify(subNode, (attKey, v) => (v !== undefined ? attKey : undefined)) as string[];\n /// if at least one of the filled fields is virtual, then throw error\n const virtualFilledFields = filledFields.filter((x) => virtualFields?.includes(x));\n if (virtualFilledFields.length > 0) {\n throw new Error(`Virtual fields can't be sent to DB: \"${virtualFilledFields.join(',')}\"`);\n }\n const missingComputedFields = computedFields.filter((x) => !filledFields.includes(x));\n\n // fill computed values\n missingComputedFields.forEach((fieldPath) => {\n const currentFieldDef = currentSchema.dataFields?.find((x) => x.path === fieldPath);\n const currentLinkDef = currentSchema.linkFields?.find((x) => x.path === fieldPath);\n // todo: multiple playedBy\n const currentLinkedDef = currentLinkDef?.oppositeLinkFieldsPlayedBy[0];\n\n const currentRoleDef =\n 'roles' in currentSchema ? oFind(currentSchema.roles, (k, _v) => k === fieldPath) : undefined;\n const currentDef = currentFieldDef || currentLinkedDef || currentRoleDef;\n if (!currentDef) {\n throw new Error(`no field Def for ${fieldPath}`);\n }\n\n // We generate the other default fields if they are not defined. We ignore the id field which was created before for $id\n if (!subNode[fieldPath]) {\n const defaultValue = computeField({\n currentThing: subNode,\n fieldSchema: currentDef as EnrichedDataField, //id is always a datafield.\n mandatoryDependencies: true, //can't send to db without every dependency being there\n });\n\n subNode[fieldPath] = defaultValue;\n }\n });\n\n if (unidentifiedFields.length > 0) {\n throw new Error(`Unknown fields: [${unidentifiedFields.join(',')}] in ${JSON.stringify(subNode)}`);\n }\n });\n return node;\n};\n","import * as acorn from 'acorn';\n\nconst STRIP_COMMENTS = /((\\/\\/.*$)|(\\/\\*[\\s\\S]*?\\*\\/))/gm;\nconst STRIP_KEYWORDS = /(\\s*async\\s*|\\s*function\\s*|\\s*\\(\\s*|\\s*\\)\\s*=>|\\s*\\)\\s*\\{)/;\n\nexport const getParamNames = (func: (...args: any[]) => any): string[] => {\n const fnStr: string = func.toString().replace(STRIP_COMMENTS, '').trim();\n // Remove function keywords and split at the first => or { to isolate parameters\n const fnBodyStr: string = fnStr.split('=>')[0].split('{')[0].replace(STRIP_KEYWORDS, '').trim();\n const paramsBlock = fnBodyStr.substring(fnBodyStr.indexOf('(') + 1, fnBodyStr.lastIndexOf(')')).trim();\n\n if (!paramsBlock) {\n return [];\n }\n\n // Match including destructured parameters with special characters\n const paramsMatch = paramsBlock.match(/(\\{[^}]*\\}|[^,]+)/g) || [];\n\n return paramsMatch\n .flatMap((param) => {\n // Remove leading/trailing braces and split based on comma outside of quotes\n if (param.includes('{') && param.includes('}')) {\n const destructuredParams = param.replace(/^\\{|\\}$/g, '').match(/(?:[^,\"']+|\"[^\"]*\"|'[^']*')+/g) || [];\n return destructuredParams.map((p) =>\n p\n .split(':')[0]\n .trim()\n .replace(/['\"[\\]]/g, ''),\n );\n }\n return param.trim();\n })\n .filter(Boolean);\n};\n\nexport const getDependencies = (fn: (...args: any[]) => void) => {\n const code = fn.toString();\n const ast = acorn.parse(code, { ecmaVersion: 2020 });\n let current: string[] = [];\n let parent: string[] = [];\n let context: string[] = [];\n const statement = ast.body.find((i) => i.type === 'ExpressionStatement') as acorn.ExpressionStatement | undefined;\n if (statement) {\n const fn = statement.expression;\n if (fn.type === 'ArrowFunctionExpression' || fn.type === 'FunctionExpression') {\n const [cur, par, ctx] = fn.params;\n current = getKeys(cur);\n parent = getKeys(par);\n context = getKeys(ctx);\n }\n }\n return { current, parent, context };\n};\n\nconst getKeys = (pat?: acorn.Pattern): string[] => {\n const keys: string[] = [];\n if (pat?.type === 'ObjectPattern') {\n pat?.properties?.forEach((p) => {\n if (p.type === 'Property') {\n if (p.key.type === 'Identifier') {\n keys.push(p.key.name);\n }\n }\n });\n }\n return keys;\n};\n","import type { BQLMutationBlock, EnrichedDataField } from '../types';\nimport { getParamNames } from './helpers';\n\nexport const computeField = ({\n currentThing,\n fieldSchema,\n mandatoryDependencies = false,\n}: {\n currentThing: BQLMutationBlock;\n fieldSchema?: EnrichedDataField;\n mandatoryDependencies?: boolean;\n}) => {\n if (!fieldSchema || !fieldSchema.default || !('fn' in fieldSchema.default || 'value' in fieldSchema.default)) {\n throw new Error(\n `[Internal] Virtual field: No field schema found, or wrongly configured. Field: ${JSON.stringify(fieldSchema, null, 3)}`,\n );\n }\n\n //check if all the args are in the entity, if not, throw a missing error with all the not present ones\n\n if (fieldSchema.default.type === 'value') {\n return fieldSchema.default.value;\n }\n\n if (mandatoryDependencies) {\n const { fn } = fieldSchema.default;\n\n const args = getParamNames(fn);\n const missingArgs = args.filter((arg) => !(arg in currentThing));\n\n if (missingArgs.length) {\n throw new Error(`Virtual field: Missing arguments ${missingArgs.join(', ')}`);\n }\n }\n if (!fieldSchema.default.fn) {\n throw new Error('[Schema] No fn in default field schema');\n }\n if ('default' in fieldSchema) {\n //@ts-expect-error can't find the issue, all subtypes have a value type, and a fn type\n if (fieldSchema.default.type === 'value') {\n //@ts-expect-error can't find the issue, all subtypes have a value type, and a fn type\n return fieldSchema.default.value;\n }\n if (fieldSchema.default.type === 'fn') {\n return fieldSchema.default.fn(currentThing);\n }\n\n throw new Error('[Schema] No default field definition');\n }\n};\n\nexport const computeNode = () => {};\n","import { isArray } from 'radash';\nimport { genId } from '../../../../helpers';\nimport type { BQLMutationBlock } from '../../../../types';\n\nexport const get$bzId = (node: BQLMutationBlock, thing?: string) => {\n if (node.$bzId) {\n return node.$bzId;\n }\n if (node.$tempId) {\n return node.$tempId;\n }\n // particular case, where we have a single $id, which is unique per $things so no need to generate multiple bzIds we can unify\n if (node.$id && !isArray(node.$id)) {\n return thing ? `SN_ONE_${thing}_${node.$id}` : `SN_ONE_${node.$id}`; //also we add prefix SN_ONE as we know is cardinality ONE\n }\n if (node.$id && isArray(node.$id)) {\n return thing ? `SN_MANY_${thing}_${genId()}` : `SN_MANY_${genId()}`; //also we add prefix SN_MANY as we know is cardinality MANY\n }\n\n return `SM_${genId()}`;\n};\n","import { isArray } from 'radash';\nimport { getCurrentFields, getCurrentSchema } from '../../../../helpers';\nimport type { BQLMutationBlock, BormOperation, EnrichedBormSchema } from '../../../../types';\n\nexport const validateOp = (parentNode: BQLMutationBlock, node: BQLMutationBlock, schema: EnrichedBormSchema) => {\n if (node.$op) {\n // $op validations /// Order: most specific to least specific\n if (node.$op === 'create' && node.$id) {\n throw new Error(\"[Wrong format] Can't write to computed field $id. Try writing to the id field directly.\");\n }\n if (['unlink', 'delete', 'update'].includes(node.$op) && parentNode.$op === 'create') {\n throw new Error(`[Wrong format] Cannot ${node.$op} under a create`);\n }\n\n const nodeSchema = getCurrentSchema(schema, node);\n const { usedDataFields } = getCurrentFields(nodeSchema, node);\n\n if (node.$op === 'delete' && usedDataFields.length > 0) {\n //linkFields can be updated, for instance nested deletions\n throw new Error('[Wrong format] Cannot update on deletion');\n }\n if (['unlink', 'link'].includes(node.$op) && usedDataFields.length > 0) {\n //linkFields can be updated, for instance nested unlinks\n throw new Error(\"[Unsupported] Can't update fields on Link / Unlink\");\n }\n return node.$op as BormOperation;\n }\n};\n\nexport const validateChildren = (parentNode: BQLMutationBlock, node: BQLMutationBlock, schema: EnrichedBormSchema) => {\n const subNodes = isArray(node) ? node : [node];\n subNodes.forEach((subNode) => {\n validateOp(parentNode, subNode, schema);\n });\n};\n","import { getCurrentFields, getCurrentSchema } from '../../../../helpers';\nimport type { BQLMutationBlock, BormOperation, EnrichedBormSchema } from '../../../../types';\nimport { validateOp } from './validateOp';\n\nexport const getOp = (node: BQLMutationBlock): BormOperation => {\n const usedFields = Object.keys(node).filter((key) => !(key.startsWith('$') || key.startsWith('%')));\n\n if (node.$op) {\n return node.$op as BormOperation;\n }\n if (node.$id || node.$filter) {\n if (usedFields.length > 0) {\n return 'update';\n }\n return 'link';\n }\n if (node.$tempId) {\n if (usedFields.length > 0) {\n return 'create'; //only difference is $id + stuff means update, while $tempIds are usually for creation and recovering it later from the res\n }\n return 'link';\n }\n return 'create';\n};\n\nexport const getOpAndValidate = (\n parentNode: BQLMutationBlock,\n node: BQLMutationBlock,\n schema: EnrichedBormSchema,\n): BormOperation => {\n const nodeSchema = getCurrentSchema(schema, node);\n const { usedFields } = getCurrentFields(nodeSchema, node);\n\n if (node.$op) {\n validateOp(parentNode, node, schema);\n return node.$op as BormOperation;\n }\n if (node.$id || node.$filter) {\n if (usedFields.length > 0) {\n validateOp(parentNode, { ...node, $op: 'update' }, schema);\n return 'update';\n }\n validateOp(parentNode, { ...node, $op: 'link' }, schema);\n return 'link';\n }\n if (node.$tempId) {\n if (usedFields.length > 0) {\n validateOp(parentNode, { ...node, $op: 'create' }, schema);\n return 'create'; //only difference is $id + stuff means update, while $tempIds are usually for creation and recovering it later from the res\n }\n validateOp(parentNode, { ...node, $op: 'create' }, schema);\n return 'link';\n }\n validateOp(parentNode, { ...node, $op: 'create' }, schema);\n return 'create';\n};\n","import type { EnrichedLinkField, EnrichedRoleField } from '../../../../types';\nimport { SharedMetadata } from '../../../../types/symbols';\n\nexport const getOppositePlayers = (field: string, fieldSchema: EnrichedLinkField | EnrichedRoleField) => {\n if (fieldSchema[SharedMetadata].fieldType === 'linkField') {\n const linkFieldSchema = fieldSchema as EnrichedLinkField;\n const oppositePlayer = linkFieldSchema.oppositeLinkFieldsPlayedBy;\n if (oppositePlayer?.length !== 1) {\n throw new Error(`[Internal] Field ${field} should have a single player`);\n }\n if (!oppositePlayer?.length) {\n throw new Error(`[Internal] Field ${field} should have a player`);\n }\n return oppositePlayer;\n }\n if (fieldSchema[SharedMetadata].fieldType === 'roleField') {\n const roleFieldSchema = fieldSchema as EnrichedRoleField;\n if ([...new Set(roleFieldSchema.playedBy?.map((x) => x.thing))]?.length !== 1) {\n throw new Error(`[Internal] Field ${field} should have a single player`);\n }\n if (!roleFieldSchema.playedBy?.length) {\n throw new Error(`[Internal] Field ${field} should have a player`);\n }\n return roleFieldSchema.playedBy;\n }\n throw new Error(`[Internal] Field ${field} is not a linkField or roleField`);\n};\n","/* eslint-disable no-param-reassign */\nimport { isArray, isObject } from 'radash';\nimport type {\n BQLMutationBlock,\n EnrichedBQLMutationBlock,\n EnrichedBormSchema,\n EnrichedLinkField,\n EnrichedRefField,\n EnrichedRoleField,\n} from '../../../../types';\nimport { EdgeSchema, SharedMetadata } from '../../../../types/symbols';\nimport { get$bzId } from '../shared/get$bzId';\nimport { getOp } from '../shared/getOp';\nimport { getOppositePlayers } from '../shared/getOppositePlayers';\n\nexport const enrichChildren = (\n node: BQLMutationBlock,\n field: string,\n fieldSchema: EnrichedLinkField | EnrichedRoleField | EnrichedRefField,\n schema: EnrichedBormSchema,\n) => {\n const newNodes = (isArray(node[field]) ? node[field] : [node[field]]).flatMap((subNode: EnrichedBQLMutationBlock) => {\n if (!fieldSchema) {\n throw new Error(`[Internal] No fieldSchema found in ${JSON.stringify(fieldSchema)}`);\n }\n\n const $op = getOp(subNode);\n const $bzId = get$bzId(subNode);\n\n if (fieldSchema[SharedMetadata].fieldType === 'refField') {\n const refSchema = fieldSchema as EnrichedRefField;\n\n if (!isObject(subNode)) {\n if (refSchema.contentType === 'FLEX') {\n return subNode;\n }\n throw new Error(`[Wrong format] The refField ${field} must receive an object`);\n }\n\n if (!subNode.$thing) {\n throw new Error('[Wrong format] The field $thing is required in refFields');\n }\n return { ...subNode, $op, $bzId };\n }\n\n const relationSchema = fieldSchema as EnrichedRoleField | EnrichedLinkField;\n\n if (relationSchema.$things.length === 0) {\n //todo: maybe add all the potential $things to a ref field?\n throw new Error(`[Internal error] The field ${field} can't be played by any thing.`);\n }\n\n const relFieldSchema = fieldSchema as EnrichedRoleField | EnrichedLinkField;\n\n if (relFieldSchema.$things.length === 1) {\n const oppositePlayers = getOppositePlayers(field, relationSchema);\n const [player] = oppositePlayers;\n\n if (subNode.$thing && subNode.$thing !== player.thing) {\n throw new Error(`[Wrong format] The field ${field} can only be played by ${player.thing}.`);\n }\n return {\n ...subNode,\n [EdgeSchema]: relFieldSchema,\n $thing: player.thing,\n $thingType: player.thing in schema.entities ? 'entity' : 'relation',\n $op,\n $bzId,\n };\n }\n if (relFieldSchema.$things.length > 1) {\n if (subNode.$thing) {\n return [\n {\n ...subNode,\n [EdgeSchema]: relFieldSchema,\n $thing: subNode.$thing,\n $thingType: subNode.$thing in schema.entities ? 'entity' : 'relation',\n $op,\n $bzId,\n },\n ];\n }\n if (!subNode.$thing) {\n if (subNode.$tempId) {\n throw new Error(\n '[Unsupported] Objects with $tempId and multiple potential players require to explicitly indicate the $thing type.',\n );\n }\n if ($op === 'create') {\n throw new Error(\n `[Wrong format] The field ${field} can be played by multiple things, please specify one on creation.`,\n );\n }\n\n return relFieldSchema.$things.map((thing) => {\n return {\n ...subNode,\n [EdgeSchema]: relFieldSchema,\n $thing: thing,\n $thingType: thing in schema.entities ? 'entity' : 'relation',\n $op,\n $bzId: get$bzId(subNode, thing),\n //[QueryContext]: { ...subNode[QueryContext], $multiThing: true }, //multiThing is used so the arcs of this manual split are merged in a single arc\n };\n });\n }\n }\n //#endregion nested nodes\n });\n\n if (isArray(node[field])) {\n node[field] = newNodes;\n } else {\n if (newNodes.length > 1) {\n //we might have added deduplicated things\n node[field] = newNodes;\n } else {\n // eslint-disable-next-line prefer-destructuring\n node[field] = newNodes[0];\n }\n }\n\n node[field] = isArray(node[field]) ? newNodes : newNodes[0];\n};\n","/* eslint-disable no-param-reassign */\nimport { clone, isArray } from 'radash';\nimport { deepCurrent, getSymbols, isBQLBlock } from '../../../../helpers';\nimport type { BormConfig, EnrichedBQLMutationBlock, EnrichedBormSchema, TransFormAction } from '../../../../types';\nimport { DBNode, IsTransformed } from '../../../../types/symbols';\nimport { getTriggeredActions } from '../shared/getTriggeredActions';\n\nexport const preHookTransformations = (\n node: EnrichedBQLMutationBlock,\n field: string,\n schema: EnrichedBormSchema,\n config: BormConfig,\n) => {\n const nodes = isArray(node[field]) ? node[field] : [node[field]];\n\n nodes.forEach((subNode: EnrichedBQLMutationBlock) => {\n if (!isBQLBlock(subNode)) {\n return;\n }\n\n // @ts-expect-error todo\n if (subNode.$fields || subNode[IsTransformed]) {\n ///todo: change machine context so we are sure we run preQueryDeps before coming back to here\n return;\n }\n\n const triggeredActions = getTriggeredActions(subNode, schema).filter(\n (action) => action.type === 'transform',\n ) as TransFormAction[];\n\n const parentNode = clone(deepCurrent(node)) as EnrichedBQLMutationBlock;\n let workingNode = clone(deepCurrent(subNode)) as EnrichedBQLMutationBlock;\n const userContext = (config.mutation?.context || {}) as Record<string, any>;\n const dbNode = clone(\n deepCurrent<EnrichedBQLMutationBlock | Record<string, never>>(subNode[DBNode] || subNode.$dbNode),\n ) as EnrichedBQLMutationBlock | Record<string, never>;\n\n triggeredActions.forEach((action) => {\n const newProps = action.fn(workingNode, parentNode, userContext, dbNode || {});\n if (Object.keys(newProps).length === 0) {\n return;\n }\n\n // Update working node to be used by next action\n workingNode = { ...workingNode, ...newProps, ...getSymbols(subNode), [IsTransformed]: true };\n\n // Update the draft state in Immer\n Object.assign(subNode, workingNode);\n });\n });\n};\n","import { capitalizeFirstLetter, getCurrentSchema } from '../../../../helpers';\nimport type { Action, BormTrigger, EnrichedBormSchema, FilledBQLMutationBlock, Hooks } from '../../../../types';\n\nexport const getTriggeredActions = (node: FilledBQLMutationBlock, schema: EnrichedBormSchema) => {\n const hooks = getCurrentSchema(schema, node).hooks as Hooks;\n if (hooks?.pre) {\n const currentEvent = `on${capitalizeFirstLetter(node.$op)}` as BormTrigger;\n const currentHooks = hooks.pre.filter((hook) => !hook.triggers || hook.triggers[currentEvent]?.()); //No triggers triggers everything\n const actions = currentHooks.flatMap((hook) => hook.actions);\n return actions;\n }\n return [] as Action[];\n};\n","/* eslint-disable no-param-reassign */\nimport { clone, isArray, isObject } from 'radash';\nimport { deepCurrent, getCurrentSchema } from '../../../../helpers';\nimport type { BormConfig, EnrichedBQLMutationBlock, EnrichedBormSchema } from '../../../../types';\nimport { DBNode } from '../../../../types/symbols';\nimport { getTriggeredActions } from '../shared/getTriggeredActions';\n\nexport const preHookValidations = (\n node: EnrichedBQLMutationBlock,\n field: string,\n schema: EnrichedBormSchema,\n config: BormConfig,\n) => {\n const subNodes = isArray(node[field]) ? node[field] : [node[field]];\n subNodes.forEach((subNode: EnrichedBQLMutationBlock) => {\n if ('$thing' in subNode) {\n if (subNode.$fields) {\n ///change machine context so we are sure we run preQueryDeps before coming back to here\n return subNode;\n }\n\n const { requiredFields, enumFields, fnValidatedFields, dataFields } = getCurrentSchema(schema, subNode);\n\n /// Required fields\n if ('$op' in subNode && subNode.$op === 'create') {\n requiredFields.forEach((field) => {\n if (!(field in subNode)) {\n throw new Error(`[Validations] Required field \"${field}\" is missing.`);\n }\n });\n }\n /// Enums\n if (('$op' in subNode && subNode.$op === 'update') || subNode.$op === 'create') {\n enumFields.forEach((field) => {\n if (field in subNode) {\n const enumOptions = dataFields?.find((df) => df.path === field)?.validations?.enum;\n if (!enumOptions) {\n throw new Error(`[Validations] Enum field \"${field}\" is missing enum options.`);\n }\n if (isArray(subNode[field])) {\n subNode[field].some((val: any) => {\n if (val !== null && !enumOptions.includes(val)) {\n throw new Error(`[Validations] Option \"${val}\" is not a valid option for field \"${field}\".`);\n }\n });\n } else if (enumOptions && !enumOptions.includes(subNode[field]) && !(subNode[field] === null)) {\n throw new Error(`[Validations] Option \"${subNode[field]}\" is not a valid option for field \"${field}\".`);\n }\n }\n });\n }\n /// fn\n if (('$op' in subNode && subNode.$op === 'update') || subNode.$op === 'create') {\n fnValidatedFields.forEach((field: string) => {\n if (field in subNode) {\n try {\n const fn = dataFields?.find((df) => df.path === field)?.validations?.fn;\n if (!fn) {\n throw new Error('Missing validation function.');\n }\n // @ts-expect-error - TODO\n if (!fn(subNode[field])) {\n throw new Error('Failed validation function.');\n }\n } catch (error: any) {\n throw new Error(`[Validations:attribute:${field}] ${error.message}`);\n }\n }\n });\n }\n\n /// Node validations\n if (isObject(subNode) && '$thing' in subNode) {\n const currentThing = subNode.$thing;\n const value = subNode as EnrichedBQLMutationBlock;\n\n const parentNode = clone(deepCurrent(node));\n const currentNode = clone(deepCurrent(value));\n const userContext = (config.mutation?.context || {}) as Record<string, any>;\n const dbNode = clone(deepCurrent<EnrichedBQLMutationBlock | Record<string, never>>(subNode[DBNode] || {})) as\n | EnrichedBQLMutationBlock\n | Record<string, never>;\n\n const triggeredActions = getTriggeredActions(value, schema);\n triggeredActions.forEach((action) => {\n if (action.type === 'validate') {\n if (action.severity !== 'error') {\n return; // in borm we only use the errors\n }\n\n try {\n //! Todo: Sandbox the function in nodeCompute() instead of the existing fieldCompute()\n const validationResult = action.fn(currentNode, parentNode, userContext, dbNode);\n\n if (validationResult === false) {\n throw new Error(`${action.message}.`);\n }\n if (validationResult !== true) {\n throw new Error(\"Validation function's output is not a boolean value.\");\n }\n } catch (error: any) {\n throw new Error(`[Validations:thing:${currentThing}] ${error.message}`);\n }\n }\n });\n }\n }\n });\n};\n","/* eslint-disable no-param-reassign */\nimport { isArray } from 'radash';\nimport type { BQLMutationBlock, EnrichedLinkField, EnrichedRoleField } from '../../../../types';\n\nexport const preValidate = (\n node: BQLMutationBlock,\n field: string,\n fieldSchema: EnrichedLinkField | EnrichedRoleField,\n paths: string[],\n) => {\n const subNodes = isArray(node[field]) ? node[field] : [node[field]];\n\n const cleanPath = paths.slice(1).join('.');\n subNodes.forEach((subNode: BQLMutationBlock) => {\n if (!subNode) {\n return;\n }\n /// For cardinality ONE, we need to specify the $op of the children\n if (\n fieldSchema?.cardinality === 'ONE' &&\n !subNode.$op &&\n !subNode.$id &&\n !subNode.$filter &&\n !subNode.$tempId &&\n node.$op !== 'create'\n ) {\n throw new Error(`Please specify if it is a create or an update. Path: ${cleanPath}.${field}`);\n }\n if (subNode.$tempId) {\n if (\n !(\n subNode.$op === undefined ||\n subNode.$op === 'link' ||\n subNode.$op === 'create' ||\n subNode.$op === 'update' ||\n subNode.$op === 'replace'\n )\n ) {\n throw new Error(\n `Invalid op ${subNode.$op} for tempId. TempIds can be created, or linked when created in another part of the same mutation.`,\n );\n }\n }\n });\n};\n","/* eslint-disable no-param-reassign */\nimport { isArray, isObject } from 'radash';\nimport type { BQLMutationBlock, EnrichedRefField } from '../../../../types';\n\ntype PrefixedResult =\n | { isPrefixed: true; obj: { $thing: string; $id: string } | { $thing: string; $tempId: string } }\n | { isPrefixed: false; obj: unknown };\n\nconst prefixedToObj = (value: unknown): PrefixedResult => {\n if (typeof value !== 'string') {\n return { isPrefixed: false, obj: value };\n }\n\n // Handle case 1: $thing:$id (xxx:yyy)\n const standardPrefixMatch = value.match(/^([^:]+):([^:].*)$/);\n\n if (standardPrefixMatch) {\n const [, $thing, id] = standardPrefixMatch;\n\n return { isPrefixed: true, obj: { $thing, ...(id.startsWith('_:') ? { $tempId: id } : { $id: id }) } };\n }\n\n return { isPrefixed: false, obj: value };\n};\nexport const replaceToObj = (node: BQLMutationBlock, field: string) => {\n ///Simplified so the only purpose of this function is to change strings to obj, but not assign BzIds or $things\n const subNodes = isArray(node[field]) ? node[field] : [node[field]];\n\n // If all elements are objects, return early (no transformation needed)\n if (subNodes.every((child) => typeof child === 'object')) {\n return;\n }\n\n // Ensure all elements are strings or objects with \"$op: replace\"; otherwise, throw an error\n if (\n !subNodes.every(\n (child) => typeof child === 'string' || (isObject(child) && '$op' in child && child.$op === 'replace'),\n )\n ) {\n throw new Error(\n `[Mutation Error] Replace can only be used with a single id, an array of ids, or objects with $op: replace. (Field: ${field} Nodes: ${JSON.stringify(subNodes)})`,\n );\n }\n\n const $op = node.$op === 'create' ? 'link' : 'replace';\n\n node[field] = subNodes.map((child) => {\n if (typeof child === 'string') {\n if (child.startsWith('_:')) {\n return { $tempId: child, $op };\n }\n\n const { isPrefixed, obj } = prefixedToObj(child);\n if (isPrefixed) {\n return { ...obj, $op };\n }\n\n // Otherwise, it's a normal $id\n return { $id: child, $op };\n }\n // If already an object with $op: replace, keep it as is\n return child;\n });\n};\n\n//todo: This is not doing any replaces, just checking the format, should be cleaned to do it\nexport const replaceToObjRef = (node: BQLMutationBlock, field: string, fieldSchema: EnrichedRefField) => {\n const subNodes = isArray(node[field]) ? node[field] : [node[field]];\n\n const $op = node.$op === 'create' ? 'link' : 'replace';\n\n node[field] = subNodes.map((child) => {\n if (typeof child === 'string') {\n if (child.startsWith('_:')) {\n return { $tempId: child, $op };\n }\n\n const { isPrefixed, obj } = prefixedToObj(child);\n if (isPrefixed) {\n return { ...obj, $op };\n }\n\n if (fieldSchema.contentType === 'FLEX') {\n // it's ok we just keep the string\n return child;\n }\n\n throw new Error(\n \"[Wrong format] Field of contentType REF can't use strings as references unless they follow the format `$thing:$id`\", //future: unless they are prefixed\n );\n }\n\n if (typeof child === 'object' && '$thing' in child) {\n return child; //this is ok as well\n }\n\n if (fieldSchema.contentType === 'FLEX') {\n return child; //any other type is fine in FLEX too\n }\n\n throw new Error(\n '[Wrong format] Field of contentType REF can use prefixed id strings, tempIds or objects indicating their $thing', //future: unless they are prefixed\n );\n });\n return node[field];\n};\n","import { isArray } from 'radash';\nimport { genId, getThingType } from '../../../../helpers';\nimport type { BQLMutationBlock, EnrichedBormSchema } from '../../../../types';\nimport { getOpAndValidate } from '../shared/getOp';\n\nexport const setRootMeta = (node: { $root: BQLMutationBlock | BQLMutationBlock[] }, schema: EnrichedBormSchema) => {\n const rootArray = isArray(node.$root) ? node.$root : [node.$root];\n\n const withMetadataRootArray = rootArray.map((rootNode) => {\n const rootOp = getOpAndValidate(rootNode, rootNode, schema);\n\n const withMetadata = {\n ...(rootNode.$thing ? {} : { $thing: rootNode.$entity || rootNode.$relation }),\n ...(rootNode.$thingType ? {} : { $thingType: getThingType(rootNode, schema) }),\n ...(rootNode.$op ? {} : { $op: rootOp }),\n ...(rootNode.$bzId ? {} : { $bzId: `R_${genId()}` }),\n };\n // eslint-disable-next-line no-param-reassign\n return { ...withMetadata, ...rootNode };\n });\n // eslint-disable-next-line no-param-reassign\n node.$root = isArray(node.$root) ? withMetadataRootArray : withMetadataRootArray[0];\n};\n","import { isSet } from 'util/types';\nimport { StepPrint } from '../../../../types/symbols';\n\nexport const doAction = (_stepName: string, block: Record<string | symbol | number, any>) => {\n const current = block[StepPrint];\n if (!isSet(current)) {\n Reflect.set(block, StepPrint, new Set(['clean']));\n return true;\n }\n if (!current.has('clean')) {\n return false;\n }\n Reflect.set(block, StepPrint, current.add('clean'));\n return true;\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 if (doAction('split_ids', node)) {\n //insert here\n const transformedChildren = (isArray(node[field]) ? node[field] : [node[field]]).flatMap(\n (child: EnrichedBQLMutationBlock) => {\n if (isObject(child) && '$id' in child && isArray(child.$id)) {\n const subNode = child as EnrichedBQLMutationBlock & { $id: string[] };\n /*const childSchema =*/ getCurrentSchema(schema, subNode);\n /// Depending on the DB this operation is required or not\n if (!subNode.$bzId) {\n throw new Error('[Internal Error] No bzId found');\n }\n // biome-ignore lint/correctness/noConstantCondition: <Todo>\n if (/*childSchema.dbContext.mutation?.splitArray$Ids*/ true) {\n return subNode.$id.map(($id: string, i: number) => ({\n ...deepCurrent(subNode), //structured clone generates a weird bug with traverse, so not using it\n $id: $id,\n $bzId: `${subNode.$bzId}_${i}`,\n ...getSymbols(subNode),\n }));\n }\n }\n return child;\n },\n );\n // if we splitted something, then reassign\n if (transformedChildren.length > 0 && isArray(node[field]) ? node[field] : [node[field]].length) {\n // eslint-disable-next-line no-param-reassign\n node[field] = transformedChildren;\n }\n }\n};\n","import { v4 as uuidv4 } from 'uuid';\n/* eslint-disable no-param-reassign */\nimport type { BQLMutationBlock, EnrichedLinkField, EnrichedRoleField } from '../../../../types';\nimport { EdgeSchema } from '../../../../types/symbols';\nimport { getOppositePlayers } from '../shared/getOppositePlayers';\n\nexport const unlinkAll = (\n node: BQLMutationBlock,\n field: string,\n fieldSchema: EnrichedLinkField | EnrichedRoleField,\n) => {\n const oppositePlayers = getOppositePlayers(field, fieldSchema);\n const [player] = oppositePlayers;\n\n node[field] = {\n $thing: player.thing,\n $thingType: player.thingType,\n $op: 'unlink',\n $bzId: `U_${uuidv4()}`,\n [EdgeSchema]: fieldSchema,\n };\n};\n","import type { EnrichedBQLMutationBlock } from '../../../../types';\n\nexport const dependenciesGuard = (mut: EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[]) => {\n if (Array.isArray(mut)) {\n for (const o of mut) {\n if (dependenciesGuard(o)) {\n return true;\n }\n }\n return false;\n }\n\n if (mut.$fields) {\n return true;\n }\n\n for (const key in mut) {\n if (key.startsWith('$')) {\n continue;\n }\n const value = mut[key];\n if (value && typeof value === 'object' && dependenciesGuard(mut[key])) {\n return true;\n }\n }\n\n return false;\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 { SharedMetadata } from '../../../types/symbols';\nimport { enrichFilter } from '../../query/bql/enrich';\nimport { computeFields } from './enrichSteps/computeFields';\nimport { enrichChildren } from './enrichSteps/enrichChildren';\nimport { preHookTransformations } from './enrichSteps/preHookTransformations';\nimport { preHookValidations } from './enrichSteps/preHookValidations';\nimport { preValidate } from './enrichSteps/preValidate';\nimport { replaceToObj, replaceToObjRef } from './enrichSteps/replaces';\nimport { setRootMeta } from './enrichSteps/rootMeta';\nimport { splitMultipleIds } from './enrichSteps/splitIds';\nimport { unlinkAll } from './enrichSteps/unlinkAll';\nimport { dependenciesGuard } from './guards/dependenciesGuard';\nimport { doAction } from './shared/doActions';\nimport { validateChildren } from './shared/validateOp';\n\nconst cleanStep = (node: BQLMutationBlock, field: string) => {\n if (node[field] === undefined) {\n delete node[field];\n }\n\n if (field === '$tempId') {\n if (doAction('set_tempId', node)) {\n if (node.$tempId?.startsWith('_:')) {\n const tempId = node.$tempId.substring(2);\n node.$tempId = tempId;\n node.$bzId = tempId;\n } else {\n throw new Error('[Wrong format] TempIds must start with \"_:\"');\n }\n } else {\n throw new Error('[Internal] TempId already modified');\n }\n }\n\n if (field === '$filter') {\n if (node.$filter && Object.keys(node.$filter).length === 0) {\n node.$filter = undefined;\n }\n }\n};\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst dataFieldStep = (_node: BQLMutationBlock, _field: string) => {};\n\nexport const enrichBQLMutation = (\n blocks: BQLMutationBlock | BQLMutationBlock[] | EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[],\n schema: EnrichedBormSchema,\n config: BormConfig,\n): EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[] => {\n const rootBlock = { $rootWrap: { $root: blocks } };\n // @ts-expect-error todo\n const has$Fields = dependenciesGuard(Array.isArray(blocks) ? blocks : [blocks]);\n\n const result = produce(rootBlock, (draft) =>\n traverse(draft, ({ value, parent, key, meta }: TraversalCallbackContext) => {\n if (!parent || !key) {\n return;\n }\n\n if (isObject(value)) {\n const paths = meta.nodePath?.split('.') || [];\n if (paths.some((p) => p.startsWith('%'))) {\n //we don't go inside %vars even if they are objects\n return;\n }\n\n if ('$root' in value) {\n // This is hte $root object, we will split the real root if needed in this iteration\n } else if (!('$thing' in value || '$entity' in value || '$relation' in value)) {\n const toIgnore = ['$fields', '$dbNode', '$filter'];\n const lastPath = paths.at(-1);\n const secondToLastPath = paths.at(-2);\n if (key === '$root') {\n throw new Error('Root things must specify $entity or $relation');\n }\n if (\n !toIgnore.includes(lastPath || '') &&\n !toIgnore.includes(secondToLastPath || '') &&\n !lastPath?.startsWith('%') &&\n !secondToLastPath?.startsWith('%')\n ) {\n throw new Error(\n `[Internal] This object has not been initiated with a $thing: ${JSON.stringify(isDraft(value) ? current(value) : value)}`,\n );\n }\n }\n\n const node = value as EnrichedBQLMutationBlock;\n const isFilter = paths.includes('$filter');\n\n if ('$filter' in node && node.$filter) {\n node.$filter = enrichFilter(node.$filter, node.$thing, schema);\n }\n\n Object.keys(node).forEach((field) => {\n ///1. Clean step\n cleanStep(node, field);\n if (field !== '$root' && isFilter) {\n return;\n }\n\n if (field !== '$root' && (field.startsWith('$') || field.startsWith('%'))) {\n return;\n }\n\n const fieldSchema =\n field !== '$root'\n ? getFieldSchema(schema, node, field)\n : ({ [SharedMetadata]: { fieldType: 'rootField' } } as any);\n if (!fieldSchema) {\n throw new Error(`[Internal] Field ${field} not found in schema`);\n }\n\n //console.log('field1', field, fieldSchema);\n\n const { fieldType } = fieldSchema[SharedMetadata];\n const relField = ['linkField', 'roleField'].includes(fieldType);\n const refField = fieldType === 'refField';\n const rootField = fieldType === 'rootField';\n\n //console.log('field2', field, fieldType);\n ///2.DATAFIELD STEP\n if (fieldType === 'dataField') {\n return dataFieldStep(node, field);\n }\n\n ///3.NESTED OBJECTS: RoleFields and linkFields\n\n // 3.1 splitIds\n\n ///3.2$thing => linkField or roleField or references\n\n ///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 /// 3.2.1 replaces\n if (relField || refField) {\n if (node[field] === null) {\n relField ? unlinkAll(node, field, fieldSchema) : undefined;\n } else {\n //todo: replaceObj in refFields, as we are just doing some validation\n relField ? replaceToObj(node, field) : replaceToObjRef(node, field, fieldSchema);\n }\n }\n\n //3.2.2 root $thing\n if (rootField) {\n if (!('$root' in node)) {\n throw new Error(`[Internal] Field ${field} is a rootField but the object is not a root`);\n }\n const rootNode = node as unknown as { $root: BQLMutationBlock | BQLMutationBlock[] };\n setRootMeta(rootNode, schema);\n }\n\n if (relField || refField) {\n // 3.2.3 BQL pre-validations => All validations should happen on subNode, if else, leaves are skipped\n preValidate(node, field, fieldSchema, paths);\n }\n /// 3.2.4 children enrichment\n //redefining childrenArray as it might have changed\n\n if (relField || refField) {\n enrichChildren(node, field, fieldSchema, schema);\n\n //validateChildren\n validateChildren(node, node[field], schema);\n }\n\n if (relField || rootField) {\n //3.2.5 splitIds()\n //this simplifies typeDB mutations\n splitMultipleIds(node, field, schema);\n\n /// 3.2.6 Field computes on nested created nodes. It only runs in CREATE operations.\n computeFields(node, field, schema);\n\n // 3.2.7\n //#region BQL validations\n //Ideally, in updates we could not demand the $thing, but then we need to check that the field belongs to all the potential $things\n const toValidate = isArray(node[field]) ? node[field] : [node[field]];\n\n toValidate.forEach((subNode: BQLMutationBlock) => {\n const subNodeSchema = getCurrentSchema(schema, subNode);\n const { unidentifiedFields, usedLinkFields, usedFields, fields } = getCurrentFields(\n subNodeSchema,\n subNode,\n );\n\n //Check that every used field is in the fields array\n usedFields.forEach((uf) => {\n if (!fields.includes(uf)) {\n throw new Error(`[Schema] Field ${uf} not found in the schema`);\n }\n });\n\n if (unidentifiedFields.length > 0) {\n throw new Error(`Unknown fields: [${unidentifiedFields.join(',')}] in ${JSON.stringify(value)}`);\n }\n //Can't use a link field with target === 'role' and another with target === 'relation' in the same mutation.\n if (usedLinkFields.length > 1) {\n const usedLinkFieldsSchemas = subNodeSchema.linkFields?.filter((lf) =>\n usedLinkFields.includes(lf.path),\n );\n /// Check if at least two of the usedLinkFields schemas, share same relation and have different targets\n usedLinkFieldsSchemas?.some((lf1, i) => {\n return usedLinkFieldsSchemas.some((lf2, j) => {\n if (i !== j && lf1.target !== lf2.target && lf1.relation === lf2.relation) {\n throw new Error(\n \"[Wrong format]: Can't use a link field with target === 'role' and another with target === 'relation' in the same mutation.\",\n );\n }\n });\n });\n }\n });\n\n if (!has$Fields) {\n //if it has $field, it has dependencies so its still not ready for transformation\n //#endregion BQL validations\n\n // 3.3.8\n //#region pre-hook transformations\n preHookTransformations(node, field, schema, config);\n //#endregion pre-hook transformations\n\n // 3.2.9\n //#region pre-hook validations\n preHookValidations(node, field, schema, config);\n //#endregion pre-hook validations\n }\n }\n });\n }\n }),\n );\n\n if (isArray(result.$rootWrap.$root)) {\n return result.$rootWrap.$root as EnrichedBQLMutationBlock[];\n }\n return result.$rootWrap.$root as EnrichedBQLMutationBlock;\n};\n","/* eslint-disable no-param-reassign */\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport { produce } from 'immer';\nimport type { TraversalCallbackContext } from 'object-traversal';\nimport { traverse } from 'object-traversal';\nimport { expect } from 'vitest';\n\nexport const deepSort = <T>(obj: T, key = '$id'): T => {\n if (typeof obj !== 'object' || obj === null) {\n return obj;\n }\n\n const sorter = (a: unknown, b: unknown) => {\n if (Array.isArray(a) || Array.isArray(b) || typeof a !== typeof b) {\n // Don't sort an array of arrays or an array with different types.\n return 0;\n }\n let aCmp: any;\n let bCmp: any;\n if (typeof a === 'object' && a !== null) {\n aCmp = (a as Record<string, any>)[key];\n } else {\n aCmp = a;\n }\n if (typeof b === 'object' && b !== null) {\n bCmp = (b as Record<string, any>)[key];\n } else {\n bCmp = b;\n }\n if (aCmp < bCmp) {\n return -1;\n }\n if (aCmp > bCmp) {\n return 1;\n }\n return 0;\n };\n\n if (Array.isArray(obj)) {\n const newObj = obj.map((i) => deepSort(i, key));\n return newObj.sort(sorter) as T;\n }\n\n if (typeof obj === 'object' && obj !== null) {\n return Object.fromEntries(Object.entries(obj).map(([k, v]) => [k, deepSort(v, key)])) as T;\n }\n\n return obj;\n};\n\nexport const deepRemoveMetaData = (obj: object) => {\n const removeMeta = ({ value }: TraversalCallbackContext) => {\n if (value && typeof value === 'object' && '$id' in value) {\n const metas = Object.keys(value).filter((k) => k.startsWith('$'));\n metas.forEach((k) => delete value[k]);\n const symbols = Object.keys(value).filter((s) => typeof s === 'symbol');\n symbols.forEach((s) => delete value[s]);\n }\n return value;\n };\n return produce(obj, (draft) => traverse(draft, removeMeta));\n};\n\nconst checkRecursive = <T>(obj: T): T => {\n if (Array.isArray(obj)) {\n return expect.arrayContaining(obj.map(checkRecursive)) as unknown as T;\n }\n if (typeof obj === 'object' && obj !== null) {\n const newObj: { [key: string]: any } = {};\n Object.entries(obj).forEach(([key, value]) => {\n newObj[key] = checkRecursive(value);\n });\n return newObj as T;\n }\n return obj;\n};\n\nexport const expectArraysInObjectToContainSameElements = <T extends any[]>(received: T, expected: T): void => {\n if (Array.isArray(received)) {\n expect(received.length).toEqual(expected.length);\n expect(received).toEqual(expect.arrayContaining(expected.map(checkRecursive)));\n } else if (typeof received === 'object' && received !== null) {\n Object.entries(received).forEach(([key, value]) => {\n // @ts-expect-error - TODO description\n expectArraysInObjectToContainSameElements(value, expected[key as keyof typeof expected]);\n });\n } else {\n if (typeof expected === 'string' && (expected as string).startsWith('$')) {\n return;\n }\n expect(received).toEqual(expected);\n }\n};\n\nexport const expectResLikeTemplate = () => {};\n\n/* //TODO probably using permutations\nexport const expectResLikeTemplate = (\n res: Record<string, any>,\n template: Record<string, any>,\n tempIds: Record<string, any> = {}\n): Record<string, any> => {\n const findMatchesForTemplatesWithVars = (\n resItems: any[],\n currentTemplatesWithVars: any[],\n currentTempIds: Record<string, any>\n ): boolean => {\n if (currentTemplatesWithVars.length === 0) {\n return true;\n }\n\n const template = currentTemplatesWithVars[0];\n\n for (let i = 0; i < resItems.length; i += 1) {\n const resItem = resItems[i];\n const originalTempIds = { ...currentTempIds };\n if (typeof template === 'string' && !(template in currentTempIds)) {\n currentTempIds[template] = resItem;\n }\n if (expectResLikeTemplate(resItem, template, currentTempIds)) {\n const remainingResItems = [...resItems];\n remainingResItems.splice(i, 1);\n const remainingTemplatesWithVars = [...currentTemplatesWithVars];\n remainingTemplatesWithVars.shift();\n if (findMatchesForTemplatesWithVars(remainingResItems, remainingTemplatesWithVars, currentTempIds)) {\n return true;\n }\n }\n currentTempIds = originalTempIds;\n }\n return false;\n };\n\n const isMatch = Object.keys(template).every((key) => {\n if (Array.isArray(template[key])) {\n const templatesWithVars: any[] = [];\n const templatesWithoutVars: any[] = [];\n template[key].forEach((item: any) => {\n if (\n (typeof item === 'string' && item.startsWith('$')) ||\n (typeof item === 'object' &&\n Object.values(item).some((val: any) => typeof val === 'string' && val.startsWith('$')))\n ) {\n templatesWithVars.push(item);\n } else {\n templatesWithoutVars.push(item);\n }\n });\n\n templatesWithoutVars.every((item: any) => {\n const matchIndex = res[key].findIndex((resItem: any) => {\n return expectResLikeTemplate(resItem, item, { ...tempIds });\n });\n if (matchIndex !== -1) {\n res[key].splice(matchIndex, 1);\n return true;\n }\n return false;\n });\n\n return findMatchesForTemplatesWithVars(res[key], templatesWithVars, tempIds);\n }\n if (typeof template[key] === 'object' && template[key] !== null && !(template[key] instanceof Date)) {\n return expectResLikeTemplate(res[key], template[key], tempIds);\n }\n if (typeof template[key] === 'string' && template[key].startsWith('$')) {\n if (!(template[key] in tempIds)) {\n tempIds[template[key]] = res[key];\n }\n return res[key] === tempIds[template[key]];\n }\n return res[key] === template[key];\n });\n\n if (!isMatch) {\n throw new Error('No matching item found for template');\n }\n\n return tempIds;\n};\n*/\n","import type { TraversalCallbackContext } from 'object-traversal';\nimport { traverse } from 'object-traversal';\nimport { isArray, isObject, mapEntries, pick, shake } from 'radash';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { deepRemoveMetaData } from '../../../../tests/helpers/matchers';\nimport { computeField } from '../../../engine/compute';\nimport { getCurrentFields, getCurrentSchema, getParentNode, oFilter } from '../../../helpers';\nimport type {\n BQLMutationBlock,\n BormOperation,\n EnrichedBQLMutationBlock,\n EnrichedBormRelation,\n EnrichedBormSchema,\n EnrichedLinkField,\n} from '../../../types';\nimport { EdgeSchema, EdgeType, SharedMetadata } from '../../../types/symbols';\n\nexport const parseBQLMutation = async (\n blocks: EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[],\n schema: EnrichedBormSchema,\n) => {\n const listNodes = (blocks: EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[]) => {\n // todo: make immutable\n\n const nodes: BQLMutationBlock[] = [];\n const edges: BQLMutationBlock[] = [];\n\n /*\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 const getIdValue = (node: EnrichedBQLMutationBlock) => {\n if (node.$id) {\n return node.$id;\n }\n\n const currentSchema = getCurrentSchema(schema, node);\n const { idFields } = currentSchema;\n\n if (!idFields) {\n throw new Error(`no idFields: ${JSON.stringify(node)}`);\n }\n // todo: composite ids\n const [idField] = idFields;\n if (!idField) {\n throw new Error(`no idField: ${JSON.stringify(node)}`);\n }\n /// 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 const idDataField = currentSchema.dataFields?.find((x) => x.path === idField);\n\n const defaultIdField = computeField({\n currentThing: node,\n fieldSchema: idDataField, //id is always a datafield.\n mandatoryDependencies: true, //can't send to db without every dependency being there\n });\n\n const idValue = node[idField] || node.$id || defaultIdField;\n\n if (!idValue) {\n throw new Error(`no idValue: ${JSON.stringify(node)}`);\n }\n return idValue;\n };\n\n const toNodes = (node: EnrichedBQLMutationBlock) => {\n if (node.$op === 'create') {\n const idValue = getIdValue(node);\n\n if (nodes.find((x) => x.$id === idValue && x.$op === 'create')) {\n throw new Error(`Duplicate id ${idValue} for node ${JSON.stringify(node)}`);\n }\n\n nodes.push({ ...node, $id: idValue });\n return;\n }\n\n if (node.$tempId && node.$op === 'match') {\n /// 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 return;\n }\n nodes.push(node);\n };\n\n const toEdges = (edge: EnrichedBQLMutationBlock) => {\n if (edge.$op === 'create') {\n const idValue = getIdValue(edge);\n\n if (nodes.find((x) => x.$id === idValue && x.$op === 'create')) {\n throw new Error(`Duplicate id ${idValue} for edge ${JSON.stringify(edge)}`);\n }\n edges.push({ ...edge, $id: idValue });\n return;\n }\n edges.push(edge);\n };\n\n const listOp = ({ value: val, parent, meta }: TraversalCallbackContext) => {\n if (!isObject(val)) {\n return;\n }\n const value = val as EnrichedBQLMutationBlock;\n\n if (meta.nodePath?.includes('.$filter')) {\n return;\n }\n\n /// no idea why this is needed lol, but sometimes is indeed undefined 🤷‍♀️\n if (value.$thing) {\n if (!value.$op) {\n throw new Error(`Operation should be defined at this step ${JSON.stringify(value)}`);\n }\n\n if (!value.$bzId) {\n throw new Error(`[internal error] BzId not found ${JSON.stringify(value)}`);\n }\n /// this is used to group the right delete/unlink operations with the involved things\n\n const currentThingSchema = getCurrentSchema(schema, value);\n const {\n dataFields: dataFieldPaths,\n roleFields: roleFieldPaths,\n linkFields: linkFieldPaths,\n refFields: refFieldPaths,\n usedFields,\n } = getCurrentFields(currentThingSchema, value);\n\n const getChildOp = () => {\n if (value.$op === 'create' || value.$op === 'delete') {\n return value.$op;\n }\n // if its un update because linkfields or rolefields updated, but no attributes, then it a match\n if (value.$op === 'update') {\n const usedDataFields = usedFields.filter((x: string) => dataFieldPaths?.includes(x));\n const usedRoleFields = usedFields.filter((x: string) => roleFieldPaths?.includes(x));\n const usedLinkFields = usedFields.filter((x: string) => linkFieldPaths?.includes(x));\n const usedRefFields = usedFields.filter((x: string) => refFieldPaths?.includes(x));\n if (usedDataFields.length > 0) {\n return 'update';\n }\n if (usedRoleFields.length > 0 || usedLinkFields.length > 0 || usedRefFields.length > 0) {\n return 'match';\n }\n throw new Error(`No fields on an $op:\"update\" for node ${JSON.stringify(value)}`);\n }\n\n return 'match';\n };\n\n const dataObj = {\n ...(value.$id && { $id: value.$id }),\n ...(value.$tempId && { $tempId: value.$tempId }),\n ...(value.$filter && { $filter: value.$filter }),\n ...{ $thing: value.$thing },\n ...(value.$thingType && { $thingType: value.$thingType }),\n ...shake(pick(value, dataFieldPaths || [''])),\n $op: getChildOp() as BormOperation,\n $bzId: value.$bzId,\n };\n\n /// split nodes with multiple ids // why? //no longer doing that\n toNodes(dataObj);\n\n // CASE 1: HAVE A PARENT THROUGH LINKFIELDS\n const edgeSchema = value[EdgeSchema] as EnrichedLinkField;\n\n if (edgeSchema?.[SharedMetadata].fieldType === 'linkField') {\n if (value.$op === 'link' || value.$op === 'unlink') {\n if (value.$id || value.$filter) {\n if (value.$tempId) {\n throw new Error(\"can't specify a existing and a new element at once. Use an id/filter or a tempId\");\n }\n nodes.push({ ...value, $op: 'match' });\n }\n // we add a \"linkable\" version of it so we can query it in the insertion\n }\n\n // this linkObj comes from nesting, which means it has no properties and no ID\n // relations explicitely created are not impacted by this, and they get the $id from it's actual current value\n\n const ownRelation = edgeSchema.$things.includes(value.$thing); //might be a subclass of the relation\n\n const linkTempId = ownRelation ? value.$bzId : `LT_${uuidv4()}`;\n\n const parentNode = getParentNode(blocks, parent, meta);\n\n const parentId = parentNode.$bzId;\n\n if (!parentId) {\n throw new Error('No parent id found');\n }\n\n const getLinkObjOp = () => {\n if (value.$op === 'delete') {\n if (ownRelation) {\n return 'match';\n }\n return 'delete';\n }\n if (value.$op === 'unlink') {\n if (ownRelation) {\n return 'unlink';\n } // delete already present in the nodes array\n return 'delete';\n }\n if (value.$op === 'link' || value.$op === 'create') {\n if (ownRelation) {\n return 'link';\n } // create already present in the nodes array\n return 'create';\n }\n // todo: probably check replaces\n if (value.$op === 'replace') {\n // Currently pre-queries do not cross reference data nested below a create operation\n //throw new Error('Unsupported: Nested replaces not implemented yet');\n /// So this does not work in typedb without replaces, so basically if you're using typeDB this should not be reached. In other DBs its ok\n //throw new Error('Unsupported: Nested replaces not implemented yet');\n return 'replace';\n }\n return 'match';\n };\n //validate that field is an actual role from the relation\n const relationSchema = getCurrentSchema(schema, {\n $thing: edgeSchema.relation,\n $thingType: 'relation',\n }) as EnrichedBormRelation;\n const roles = Object.keys(relationSchema.roles);\n if (!roles.includes(edgeSchema.plays)) {\n throw new Error(\n `[Wrong format] Field ${edgeSchema.plays} is not a role of relation ${edgeSchema.relation}`,\n );\n }\n\n const edgeType1 = {\n $bzId: linkTempId,\n $thing: ownRelation ? value.$thing : edgeSchema.relation, //if it is its own relation, it might be a relation that extends it\n $thingType: 'relation' as const,\n ...(value.$tempId ? { $tempId: value.$tempId } : {}),\n $op: getLinkObjOp(),\n\n // roles\n ...(!ownRelation ? { [edgeSchema.path]: value.$bzId } : {}),\n [edgeSchema.plays]: parentId,\n\n //Metadata\n [EdgeSchema]: edgeSchema,\n [EdgeType]: 'linkField',\n };\n\n // const testVal = {};\n\n // todo: stuff 😂\n //@ts-expect-error - TODO\n toEdges(edgeType1);\n\n /// when it has a parent through a linkField, we need to add an additional node (its dependency), as well as a match\n /// 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 /// this is only for relations that are not $self, as other relations will be deleted and don't need a match\n if ((value.$op === 'unlink' || getLinkObjOp() === 'unlink') && ownRelation) {\n toEdges({\n $thing: edgeSchema.relation,\n $thingType: 'relation' as const,\n $bzId: linkTempId,\n $op: 'match',\n [edgeSchema.plays]: parentId,\n [EdgeSchema]: edgeSchema,\n [EdgeType]: 'linkField',\n });\n }\n }\n\n // CASE 2: IS RELATION AND HAS THINGS IN THEIR ROLES\n if (value.$thingType === 'relation') {\n const rolesObjFiltered = oFilter(value, (k: string, _v) => roleFieldPaths.includes(k));\n\n /// 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 // todo: this is super weird, remove\n //@ts-expect-error - TODO\n const rolesObjOnlyIds = mapEntries(rolesObjFiltered, (k: string, v) => {\n if (isArray(v)) {\n return [k, v];\n }\n if (isObject(v)) {\n // @ts-expect-error - TODO description\n return [k, v.$bzId];\n }\n return [k, v];\n });\n\n const objWithMetaDataOnly = oFilter(val, (k, _v) => {\n // @ts-expect-error - TODO description\n return k.startsWith('$') || k.startsWith('Symbol');\n });\n\n if (Object.keys(rolesObjFiltered).filter((x) => !x.startsWith('$')).length > 0) {\n // 2.1 EDGE TYPE 2\n if (value.$op === 'create' || value.$op === 'delete') {\n /// if the relation is being created, then all objects in the roles are actually add\n const getEdgeOp = (): BormOperation => {\n if (value.$op === 'create') {\n return 'link';\n }\n if (value.$op === 'delete') {\n return 'match';\n } /// if i'm not wrong, no need to unlink becasue is the director relation and will disappear 🤔\n throw new Error('Unsupported parent of edge op');\n };\n\n const currentRoles = (getCurrentSchema(schema, value) as EnrichedBormRelation).roles;\n /// group ids when cardinality MANY\n const rolesObjOnlyIdsGrouped = mapEntries(rolesObjOnlyIds, (k: string, v) => {\n const currentRoleCardinality = currentRoles[k]?.cardinality;\n if (!currentRoleCardinality) {\n throw new Error(`Role ${k} not found in schema`);\n }\n\n if (Array.isArray(v)) {\n if (currentRoleCardinality === 'ONE') {\n //console.log('v!', v);\n if (v.length > 1) {\n return [k, v.map((vNested: any) => vNested.$bzId || vNested)]; //Even if is Card ONE, we might actually try to link to N things, as long as the result is a single one, it is ok. The DB should throw an error if it is not the case\n }\n return [k, v[0].$bzId || v[0]];\n }\n /// Replace the array of objects with an array of ids\n return [k, v.map((vNested: any) => vNested.$bzId || vNested)];\n }\n //@ts-expect-error - TODO\n return [k, v.$bzId || v];\n });\n\n // todo: validations\n /// 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 const edgeType2 = {\n ...objWithMetaDataOnly,\n $thing: value.$thing,\n $thingType: 'relation' as const,\n $op: getEdgeOp(),\n ...rolesObjOnlyIdsGrouped, // override role fields by ids or tempIDs\n $bzId: value.$bzId,\n [EdgeType]: 'roleField' as const,\n };\n\n toEdges(edgeType2);\n return;\n }\n // #endregion\n // 2.2 EDGE TYPE 3\n if (value.$op === 'match' || (value.$op === 'update' && Object.keys(rolesObjFiltered).length > 0)) {\n let totalUnlinks = 0;\n\n Object.entries(rolesObjFiltered).forEach(([role, operations]) => {\n const operationsArray = isArray(operations) ? operations : [operations];\n\n const getOp = (childOp: BormOperation): BormOperation => {\n if (childOp === 'create' || childOp === 'replace') {\n // if the children is being created, the edge is a link\n return 'link';\n }\n return childOp;\n };\n\n operationsArray.forEach((operation) => {\n if (!operation) {\n return;\n }\n const op = getOp(operation.$op);\n /// validations\n if (op === 'replace') {\n throw new Error('Not supported yet: replace on roleFields');\n }\n if (op === 'unlink' && totalUnlinks > 0) {\n totalUnlinks += 1; // ugly temp solution while multiple roles can't be replaced\n throw new Error(\n 'Not supported yet: Cannot unlink more than one role at a time, please split into two mutations',\n );\n }\n\n /// 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 const edgeType3 = {\n ...objWithMetaDataOnly,\n $thing: value.$thing,\n $thingType: 'relation' as const,\n $op: op === 'delete' ? 'unlink' : op,\n [role]: operation.$bzId,\n $bzId: value.$bzId,\n [EdgeType]: 'roleField' as const,\n };\n\n toEdges(edgeType3);\n /// when unlinking stuff, it must be merged with other potential roles.\n /// so we need to add it as both as match and 'unlink' so it gets merged with other unlinks\n // todo maybe a way to transform unlinks already in its own matches later? maybe split match-unlink and match-link\n if (op === 'unlink') {\n // toEdges({ ...edgeType3, $op: 'match' }); ///apparently no longer needed\n }\n });\n });\n }\n // throw new Error('Unsupported direct relation operation');\n }\n }\n }\n };\n\n traverse(blocks, listOp);\n\n return [nodes, edges];\n };\n\n const [parsedThings, parsedEdges] = listNodes(blocks);\n //console.log('parsedStuff', parsedThings, parsedEdges);\n\n //console.log('parsedThings', parsedThings);\n /// some cases where we extract things, they must be ignored.\n /// One of this cases is the situation where we have a thing that is linked somwhere and created, or updated.\n /// 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 const mergedThings = parsedThings.reduce((acc, thing) => {\n // Skip if the current item doesn't have a $tempId\n if (!thing.$bzId) {\n return [...acc, thing];\n }\n\n // Check if this $tempId already exists in the accumulator\n const existingIndex = acc.findIndex((t) => t.$bzId === thing.$bzId);\n\n if (existingIndex === -1) {\n // If it doesn't exist, add it to the accumulator\n return [...acc, thing];\n }\n // If it exists, let's check the $op\n if (acc[existingIndex].$op === 'create' && thing.$op === 'match') {\n // If existing is 'create' and current is 'match', ignore current\n return acc;\n }\n if (acc[existingIndex].$op === 'match' && (thing.$op === 'create' || thing.$op === 'match')) {\n // If existing is 'match' and current is 'create' or 'match', replace existing with current\n return [...acc.slice(0, existingIndex), thing, ...acc.slice(existingIndex + 1)];\n }\n //if both are update, we simply merge them\n if (acc[existingIndex].$op === 'update' && thing.$op === 'update') {\n return [...acc.slice(0, existingIndex), { ...acc[existingIndex], ...thing }, ...acc.slice(existingIndex + 1)];\n }\n //if one is update and the other is merge, same, we merge them and keep it as update.\n if (\n (acc[existingIndex].$op === 'update' && thing.$op === 'match') ||\n (acc[existingIndex].$op === 'match' && thing.$op === 'update')\n ) {\n return [\n ...acc.slice(0, existingIndex),\n { ...acc[existingIndex], ...thing, $op: 'update' },\n ...acc.slice(existingIndex + 1),\n ];\n }\n //if both are deletions, is fine as long as they have the same $filter\n if (acc[existingIndex].$op === 'delete' && thing.$op === 'delete') {\n if (JSON.stringify(acc[existingIndex].$filter) === JSON.stringify(thing.$filter)) {\n return acc;\n }\n throw new Error(\n `[Wrong format] Can't delete the same thing with different filters. Existing: ${acc[existingIndex].$filter}. Current: ${thing.$filter}`,\n );\n }\n // For all other cases, throw an error\n throw new Error(\n `[Wrong format] Wrong operation combination for $tempId/$id \"${thing.$tempId || thing.$id}\". Existing: ${acc[existingIndex].$op}. Current: ${thing.$op}`,\n );\n }, [] as BQLMutationBlock[]);\n\n /// merge attributes of relations that share the same $id\n /// 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 const mergedEdges = parsedEdges.reduce((acc, curr) => {\n const existingEdge = acc.find(\n (r) =>\n ((r.$id && r.$id === curr.$id) || (r.$bzId && r.$bzId === curr.$bzId)) &&\n r.$thing === curr.$thing &&\n r.$op === curr.$op,\n );\n\n if (existingEdge) {\n const newRelation = { ...existingEdge };\n\n Object.keys(curr).forEach((key) => {\n if (typeof key === 'symbol' || key.startsWith('$')) {\n return;\n }\n\n const existingVal = existingEdge[key];\n const currVal = curr[key];\n\n //both values are arrays\n if (Array.isArray(existingVal) && Array.isArray(currVal)) {\n newRelation[key] = Array.from(new Set([...existingVal, ...currVal]));\n }\n ///the curent one is not but hte new one it is\n else if (!Array.isArray(existingVal) && Array.isArray(currVal)) {\n if (existingVal !== undefined) {\n // Avoid merging with undefined values.\n newRelation[key] = Array.from(new Set([existingVal, ...currVal]));\n } else {\n newRelation[key] = currVal;\n }\n }\n ///the current one is but the new one it is not\n else if (Array.isArray(existingVal) && !Array.isArray(currVal)) {\n if (currVal !== undefined) {\n // Avoid merging with undefined values.\n newRelation[key] = Array.from(new Set([...existingVal, currVal]));\n }\n }\n //both exist and are not arrays\n else if (existingVal !== null && currVal !== null && existingVal !== undefined && currVal !== undefined) {\n newRelation[key] = Array.from(new Set([existingVal, currVal]));\n } else if (existingVal === undefined || existingVal === null) {\n newRelation[key] = currVal;\n }\n });\n\n const newAcc = acc.filter(\n (r) =>\n !(\n ((r.$id && r.$id === curr.$id) || (r.$bzId && r.$bzId === curr.$bzId)) &&\n r.$thing === curr.$thing &&\n r.$op === curr.$op\n ),\n );\n\n return [...newAcc, newRelation];\n }\n\n return [...acc, curr];\n }, [] as BQLMutationBlock[]);\n\n //console.log('parsedThings', parsedThings);\n //console.log('parsedEdges', parsedEdges);\n //console.log('mergedEdges', mergedEdges);\n /// VALIDATIONS\n\n // VALIDATION: Check that every thing in the list that is an edge, has at least one player\n\n mergedThings.forEach((thing) => {\n if (thing.$thingType === 'relation' || 'relation' in thing) {\n //if it is a relation, we need at lease one edge defined for it\n if (\n mergedEdges.filter((edge) => edge.$bzId === thing.$bzId || (edge.$tempId && edge.$tempId === thing.$tempId))\n .length === 0\n ) {\n if (thing.$op === 'delete' || thing.$op === 'match' || thing.$op === 'update') {\n return;\n }\n throw new Error(\n `[Wrong format] Can't create a relation without any player. Node: ${JSON.stringify(deepRemoveMetaData(thing))}`,\n );\n }\n }\n });\n\n ///Validate that each tempId has at least one creation op:\n const allThings = [...mergedThings, ...mergedEdges];\n const tempIds = new Set(allThings.filter((x) => x.$tempId).map((x) => x.$tempId));\n const orphanTempIds = Array.from(tempIds).filter(\n (tempId) => !allThings.some((x) => x.$tempId === tempId && x.$op === 'create'),\n );\n\n if (orphanTempIds.length > 0) {\n throw new Error(\n `Can't link a $tempId that has not been created in the current mutation: ${orphanTempIds.join(', ')}`,\n );\n }\n\n return {\n mergedThings,\n mergedEdges,\n };\n};\n","const LOG_LEVEL = new Set(\n // eslint-disable-next-line turbo/no-undeclared-env-vars\n (process.env.BORM_LOG_LEVEL || '')\n .split(',')\n .map((i) => i.trim())\n .filter((i) => !!i),\n);\n\ntype LogLevel = 'debug' | 'info' | 'warning' | 'error';\n\nexport const log = (level: LogLevel | LogLevel[], ...args: unknown[]) => {\n const shouldLog = Array.isArray(level) ? level.some((l) => LOG_LEVEL.has(l)) : LOG_LEVEL.has(level);\n if (shouldLog) {\n console.log(...args);\n }\n};\n\nexport const logDebug = (...args: unknown[]) => log('debug', ...args);\n\nexport const logInfo = (...args: unknown[]) => log('info', ...args);\n\nexport const logWarning = (...args: unknown[]) => log('warning', ...args);\n\nexport const logError = (...args: unknown[]) => log('error', ...args);\n","// eslint-disable-next-line turbo/no-undeclared-env-vars\nexport const VERSION = process.env.npm_package_version;\n","import type { TypeDBDriver } from 'typedb-driver';\nimport type { SimpleSurrealClient } from '../../adapters/surrealDB/client';\nimport { assertDefined, getSchemaByThing } from '../../helpers';\nimport { logDebug } from '../../logger';\nimport type { BormConfig, DBHandles, EnrichedBQLQuery, EnrichedBormSchema, RawBQLQuery } from '../../types';\nimport { VERSION } from '../../version';\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 bql: {\n raw: RawBQLQuery[];\n queries?: EnrichedBQLQuery[];\n res?: any[]; // TODO\n };\n schema: EnrichedBormSchema;\n config: BormConfig;\n handles: DBHandles;\n error: string | null;\n};\n\nconst updateBqlReq = (ctx: MachineContext, event: any) => {\n if (!event.data) {\n return ctx;\n }\n return {\n ...ctx,\n bql: { ...ctx.bql, queries: event.data },\n };\n};\n\nconst updateBqlRes = (ctx: MachineContext, event: any) => {\n if (!event.data) {\n return ctx;\n }\n return {\n ...ctx,\n bql: { ...ctx.bql, res: event.data },\n };\n};\n\nconst errorTransition = transition(\n 'error',\n 'error',\n reduce((ctx: MachineContext, event: any) => {\n return {\n ...ctx,\n error: event.error,\n };\n }),\n);\n\ntype TypeDBAdapter = {\n db: 'typeDB';\n client: TypeDBDriver;\n rawBql: RawBQLQuery[];\n bqlQueries: EnrichedBQLQuery[];\n indices: number[];\n};\n\ntype SurrealDBAdapter = {\n db: 'surrealDB';\n client: SimpleSurrealClient;\n rawBql: RawBQLQuery[];\n bqlQueries: EnrichedBQLQuery[];\n indices: number[];\n};\n\ntype Adapter = TypeDBAdapter | SurrealDBAdapter;\n\nexport const queryMachine = createMachine(\n 'enrich',\n {\n enrich: invoke(\n async (ctx: MachineContext) => {\n logDebug(`originalBQLQuery[${VERSION}]`, JSON.stringify(ctx.bql.raw));\n return enrichBQLQuery(ctx.bql.raw, ctx.schema);\n },\n transition('done', 'adapter', reduce(updateBqlReq)),\n errorTransition,\n ),\n adapter: invoke(\n async (ctx: MachineContext) => {\n const adapters: Record<string, Adapter> = {};\n\n ctx.bql.queries?.forEach((q, i) => {\n const raw = ctx.bql.raw[i];\n const thing = getSchemaByThing(ctx.schema, q.$thing);\n const { id } = thing.defaultDBConnector;\n\n if (thing.db === 'typeDB') {\n if (!adapters[id]) {\n const client = ctx.handles.typeDB?.get(id)?.client;\n if (!client) {\n throw new Error(`TypeDB client with id \"${thing.defaultDBConnector.id}\" does not exist`);\n }\n adapters[id] = {\n db: 'typeDB',\n client,\n rawBql: [],\n bqlQueries: [],\n indices: [],\n };\n }\n } else if (thing.db === 'surrealDB') {\n if (!adapters[id]) {\n const client = ctx.handles.surrealDB?.get(id)?.client;\n if (!client) {\n throw new Error(`SurrealDB client with id \"${thing.defaultDBConnector.id}\" does not exist`);\n }\n adapters[id] = {\n db: 'surrealDB',\n client,\n rawBql: [],\n bqlQueries: [],\n indices: [],\n };\n }\n } else {\n throw new Error(`Unsupported DB \"${thing.db}\"`);\n }\n const adapter = adapters[id];\n adapter.rawBql.push(raw);\n adapter.bqlQueries.push(q);\n adapter.indices.push(i);\n });\n const adapterList = Object.values(adapters);\n const proms = adapterList.map((a) => {\n if (a.db === 'typeDB') {\n // TODO: Replace DBHandles with TypeDBAdapter\n return runTypeDbQueryMachine(a.rawBql, a.bqlQueries, ctx.schema, ctx.config, ctx.handles);\n }\n\n if (a.db === 'surrealDB') {\n return runSurrealDbQueryMachine(a.bqlQueries, ctx.schema, ctx.config, a.client);\n }\n\n throw new Error(`Unsupported DB \"${JSON.stringify(a, null, 2)}\"`);\n });\n const results = await Promise.all(proms);\n const orderedResults = adapterList.flatMap((a, i) => {\n const result = results[i];\n return a.indices.map((index, j) => ({ index, result: result[j] }));\n });\n orderedResults.sort((a, b) => (a.index < b.index ? -1 : a.index > b.index ? 1 : 0));\n const result = orderedResults.map(({ result }) => result);\n return result;\n },\n transition('done', 'postHooks', reduce(updateBqlRes)),\n errorTransition,\n ),\n postHooks: invoke(\n async (ctx: MachineContext) => postHooks(ctx.schema, assertDefined(ctx.bql.queries), assertDefined(ctx.bql.res)),\n transition('done', 'clean', reduce(updateBqlRes)),\n errorTransition,\n ),\n clean: invoke(\n async (ctx: MachineContext) => cleanQueryRes(ctx.config, assertDefined(ctx.bql.res)),\n transition('done', 'success', reduce(updateBqlRes)),\n errorTransition,\n ),\n success: state(),\n error: state(),\n },\n (ctx: MachineContext) => ctx,\n);\n\nexport const awaitQueryMachine = async (context: MachineContext) => {\n return new Promise<MachineContext>((resolve, reject) => {\n interpret(\n queryMachine,\n (service) => {\n if (service.machine.state.name === 'success') {\n resolve(service.context);\n }\n if (service.machine.state.name === 'error') {\n reject(service.context);\n }\n },\n context,\n );\n });\n};\n\nexport const runQueryMachine = async (\n bql: RawBQLQuery[],\n schema: EnrichedBormSchema,\n config: BormConfig,\n handles: DBHandles,\n) => {\n return awaitQueryMachine({\n bql: {\n raw: bql,\n },\n schema: schema,\n config: config,\n handles: handles,\n error: null,\n });\n};\n","import { produce } from 'immer';\nimport type { TraversalCallbackContext } from 'object-traversal';\nimport { traverse } from 'object-traversal';\nimport { isArray, isObject } from 'radash';\nimport type { BQLResponse, BormConfig, QueryConfig } from '../../../types';\n\nexport const cleanQueryRes = (config: BormConfig, bqlRes: BQLResponse) => {\n if (!bqlRes) {\n return;\n }\n const withPostHooks = queryPostHooks(bqlRes);\n const cleanedMetadata = cleanOutput(withPostHooks, config.query);\n return cleanedMetadata;\n};\n\nconst queryPostHooks = (blocks: any) => {\n return produce(blocks, (draft: any) =>\n traverse(draft, ({ value: val }: TraversalCallbackContext) => {\n if (isObject(val)) {\n // eslint-disable-next-line no-param-reassign\n }\n }),\n );\n};\n\nconst cleanOutput = (blocks: any, config?: QueryConfig) => {\n return produce(blocks, (draft: any) =>\n traverse(draft, ({ value: val }: TraversalCallbackContext) => {\n if (isObject(val)) {\n const value = val as any;\n\n // UNDEFINED FIELDS\n Object.keys(value).forEach((k: string) => {\n if (value[k] === undefined || value[k] === null || (isArray(value[k]) && value[k].length === 0)) {\n if (config?.returnNulls) {\n value[k] = null;\n } else {\n delete value[k];\n }\n }\n if (value[k] === undefined) {\n delete value[k];\n }\n });\n\n // INTERNAL SYMBOLS\n Object.getOwnPropertySymbols(value).forEach((symbol) => {\n delete value[symbol];\n });\n\n /// USER FACING METADATA\n if (config?.noMetadata === true) {\n // eslint-disable-next-line no-param-reassign\n Object.keys(value).forEach((k: string) => {\n if (k.startsWith('$')) {\n delete value[k];\n }\n });\n }\n }\n }),\n );\n};\n","import { produce } from 'immer';\nimport type { TraversalCallbackContext } from 'object-traversal';\nimport { getNodeByPath, traverse } from 'object-traversal';\nimport { isObject } from 'radash';\nimport { computeField } from '../../engine/compute';\nimport { getCurrentSchema } from '../../helpers';\nimport type { BQLResponseMulti, EnrichedBQLQuery, EnrichedBormSchema } from '../../types';\nimport { QueryPath } from '../../types/symbols';\n\nexport const postHooks = async (\n schema: EnrichedBormSchema,\n enrichedBqlQuery: EnrichedBQLQuery[],\n bqlRes: BQLResponseMulti,\n) => {\n if (!bqlRes) {\n return;\n }\n\n const queryPostHooks = (blocks: any) => {\n //console.log('queryPostHooks', blocks[0]);\n return produce(blocks, (draft: any) =>\n traverse(draft, ({ value: val }: TraversalCallbackContext) => {\n if (isObject(val)) {\n const value = val as Record<string, any>;\n\n if (!value.$thing) {\n // JSON object.\n return;\n }\n if (value.$thing) {\n const currentSchema = getCurrentSchema(schema, value);\n const { virtualFields } = currentSchema;\n\n const queryPath = value[QueryPath as any];\n if (!queryPath) {\n throw new Error(`[Internal] QueryPath is missing. Value: ${JSON.stringify(value)}`);\n }\n\n const originalNode = getNodeByPath(enrichedBqlQuery, queryPath);\n if (originalNode.$fieldType === 'ref') {\n return; // Not supported with refFields\n }\n const queriedFields = originalNode.$fields.map((f: any) => f.$path);\n const excludedFields = originalNode.$excludedFields;\n\n /// ADD VIRTUAL FIELDS\n virtualFields.forEach((virtualFieldPath) => {\n if (\n excludedFields?.includes(virtualFieldPath) ||\n (queriedFields.length > 0 && !queriedFields.includes(virtualFieldPath))\n ) {\n return;\n }\n const field = currentSchema.dataFields?.find((f) => f.path === virtualFieldPath);\n\n if (!field?.default) {\n ///then is a virtual field and should be computed from the DB already\n if (value[virtualFieldPath] === undefined) {\n throw new Error(`[Internal] Virtual field: No db value found for virtual field: ${virtualFieldPath}`);\n }\n } else {\n const computedValue = computeField({\n currentThing: value,\n fieldSchema: field,\n mandatoryDependencies: true,\n });\n value[virtualFieldPath] = computedValue;\n }\n });\n\n //EXCLUDE FIELDS\n if (excludedFields) {\n //this should only happen for id fields, as we query them always. Might remove also dependencies in the future\n //todo: move this as a last step of the machine, as a cleaner. Note: we are skipping it now for reference fields but we should not\n excludedFields.forEach((excludedField: string) => {\n if (typeof excludedField !== 'string') {\n throw new Error('[Internal] ExcludedField is not a string');\n }\n delete value[excludedField];\n });\n }\n }\n }\n }),\n );\n };\n\n const postHooksBqlRes = queryPostHooks(bqlRes);\n return postHooksBqlRes;\n};\n","import { isArray, isObject, shake } from 'radash';\nimport { getFieldType } from '../../../helpers';\nimport type { EnrichedBormSchema, EnrichedLinkField, EnrichedRoleField, Filter } from '../../../types';\nimport { SuqlMetadata } from '../../../types/symbols';\n\nconst surqlOperators = {\n $eq: '$=',\n $not: '$!',\n $or: '$OR',\n $and: '$AND',\n $in: '$IN',\n $id: 'record::id(id)',\n $exists: '$exists',\n};\n\nexport const parseFilter = (filter: Filter, currentThing: string, schema: EnrichedBormSchema): Filter => {\n if (filter === null || filter === undefined) {\n return filter;\n }\n\n const wasArray = isArray(filter);\n\n const arrayFilter = wasArray ? filter : [filter];\n\n const resultArray = arrayFilter.map((f) => {\n const keys = Object.keys(f);\n\n const result = keys.reduce((acc, key) => {\n const value = f[key];\n\n if (key.startsWith('$')) {\n //LOGICAL OPERATORS\n if (['$or', '$and', '$not'].includes(key)) {\n return {\n ...acc,\n [key]: undefined,\n [surqlOperators[key as keyof typeof surqlOperators]]: parseFilter(value, currentThing, schema),\n };\n }\n\n // FILTER OPERATORS\n if (key === '$id') {\n return { ...acc, $id: undefined, [surqlOperators[key]]: { $IN: isArray(value) ? value : [value] } };\n }\n if (key === '$thing') {\n return acc; //do nothing for now, but in the future we will need to filter by tables as well, maybe record::tb(id) ...\n }\n\n //AUXILIARY OPERATORS\n if (key === '$exists') {\n return { ...acc, $exists: undefined, [surqlOperators[key]]: value };\n }\n\n //VALUE OPERATORS\n if (key === '$eq') {\n return { ...acc, $eq: undefined, [surqlOperators[key]]: value };\n }\n if (key === '$in') {\n return { ...acc, $in: undefined, [surqlOperators[key]]: value };\n }\n\n throw new Error(`Unknown filter operator ${key}`);\n //return { ...acc, [key]: parseFilter(value, currentThing, schema) };\n }\n\n const currentSchema =\n currentThing in schema.entities ? schema.entities[currentThing] : schema.relations[currentThing];\n\n const [fieldType, fieldSchema] = getFieldType(currentSchema, key);\n\n if (fieldType === 'idField') {\n if (currentSchema.idFields.length > 1) {\n throw new Error('Multiple id fields not supported');\n } //todo: When composed id, this changes:\n\n return { ...acc, 'record::id(id)': { $IN: isArray(value) ? value : [value] } };\n }\n\n if (fieldType === 'dataField') {\n return { ...acc, [key]: parseFilter(value, currentThing, schema) }; //Probably good place to add ONLY and other stuff depending on the fieldSchema\n }\n\n if (fieldType === 'linkField' || fieldType === 'roleField') {\n const fieldSchemaTyped = fieldSchema as EnrichedLinkField | EnrichedRoleField;\n\n const surrealDBKey = fieldSchemaTyped[SuqlMetadata].queryPath;\n\n return { ...acc, [surrealDBKey]: parseFilter(value, currentThing, schema) };\n\n /*if (fieldSchemaTyped.$things.length !== 1) {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t`Not supported yet: Role ${key} in ${JSON.stringify(value)} is played by multiple things: ${fieldSchemaTyped.$things.join(', ')}`,\n\t\t\t\t\t);\n\n\t\t\t\t\treturn { ...acc, [surrealDBKey]: parseFilter(value, currentThing, schema) };\n\t\t\t\t}\n\t\t\t\t//todo: we need to be able to filter by fields that only belong to subtypes\n\t\t\t\tconst [childrenThing] = fieldSchemaTyped.$things; //todo: multiple players, then it must be efined\n\n\t\t\t\treturn { ...acc, [surrealDBKey]: parseFilter(value, childrenThing, schema) };*/\n }\n\n throw new Error(`Field ${key} not found in schema, Defined in $filter`);\n }, {});\n\n return shake(result);\n });\n\n return wasArray ? resultArray : resultArray[0];\n};\n\nexport const buildSuqlFilter = (filter: object): string => {\n if (filter === null || filter === undefined) {\n return '';\n }\n\n const entries = Object.entries(filter);\n const parts: string[] = [];\n\n entries.forEach(([key, value]) => {\n // Handle logical operators\n if (['$OR', '$AND', '$!'].includes(key)) {\n const logicalOperator = key.replace('$', '');\n\n const nestedFilters = Array.isArray(value) ? value.map((v) => buildSuqlFilter(v)) : [buildSuqlFilter(value)];\n\n if (logicalOperator === '!') {\n // Correctly handle the negation\n parts.push(`!(${nestedFilters.join(' AND ')})`);\n } else {\n parts.push(`(${nestedFilters.join(` ${logicalOperator} `)})`);\n }\n return;\n }\n\n // Handle field-specific filters\n if (isObject(value)) {\n if (key.includes('<-') || key.includes('->')) {\n const nestedFilter = buildSuqlFilter(value);\n parts.push(`${key}[WHERE ${nestedFilter}]`);\n } else if (key.startsWith('$parent.[')) {\n // Handle references with cardinality MANY\n const nestedFilter = buildSuqlFilter(value);\n const keyWithoutPrefix = key.replace('$parent.', '').replace(/^\\[(.*)\\]$/, '$1');\n parts.push(`fn::as_array(${keyWithoutPrefix})[WHERE id && ${nestedFilter}]`);\n } else if (key.startsWith('$parent')) {\n // Handle references with cardinality ONE\n const nestedFilter = buildSuqlFilter(value);\n const keyWithoutPrefix = key.replace('$parent.', '');\n parts.push(`fn::as_array(${keyWithoutPrefix})[WHERE id && ${nestedFilter}]`);\n } else if (key.startsWith('$')) {\n throw new Error(`Invalid key ${key}`);\n } else {\n // Handle field operators\n const valueKeys = Object.keys(value);\n if (valueKeys.length === 1 && valueKeys[0].startsWith('$')) {\n const [operator] = valueKeys;\n //@ts-expect-error - Todo\n const nextValue: unknown = value[operator];\n\n if (operator === '$exists') {\n // Handle $exists operator\n if (nextValue === true) {\n parts.push(`${key} IS NOT NONE`);\n } else if (nextValue === false) {\n parts.push(`${key} IS NONE`);\n } else {\n throw new Error(`Invalid value for $exists: ${nextValue}`);\n }\n } else {\n // Handle other operators\n const surrealOperator = operator.replace('$', '');\n if (Array.isArray(nextValue)) {\n parts.push(\n `${key} ${surrealOperator} [${nextValue.map((v) => (v === null ? 'NONE' : `'${v}'`)).join(', ')}]`,\n );\n } else if (isObject(nextValue)) {\n const nestedFilter = buildSuqlFilter(nextValue);\n parts.push(`${key} ${surrealOperator} ${nestedFilter}`);\n } else {\n parts.push(`${key} ${surrealOperator} ${nextValue === null ? 'NONE' : `'${nextValue}'`}`);\n }\n }\n } else {\n throw new Error(`Invalid key ${key}`);\n }\n }\n } else {\n // Handle simple field equality\n if (Array.isArray(value)) {\n const operator = key.startsWith('$') ? key.replace('$', '') : 'IN'; //maybe could do const operator = 'IN';\n parts.push(`${key} ${operator} [${value.map((v) => (v === null ? 'NONE' : `'${v}'`)).join(', ')}]`);\n } else {\n const operator = key.startsWith('$') ? key.replace('$', '') : '='; //maybe could do const operator = '=';\n parts.push(`${key} ${operator} ${value === null ? 'NONE' : `'${value}'`}`);\n }\n }\n });\n\n return parts.join(' AND ');\n};\n\nexport const buildSorter = (sort: ({ field: string; desc?: boolean } | string)[]) => {\n const sorters = sort.map((i) => {\n if (typeof i === 'string') {\n return i;\n }\n\n const { field, desc } = i;\n\n return `${field}${desc ? ' DESC' : ' ASC'}`;\n });\n\n return `ORDER BY ${sorters.join(', ')}`;\n};\n","import { isArray } from 'radash';\nimport { buildSorter, buildSuqlFilter, parseFilter } from '../../../adapters/surrealDB/filters/filters';\nimport { sanitizeNameSurrealDB } from '../../../adapters/surrealDB/helpers';\nimport { indent } from '../../../helpers';\nimport type {\n EnrichedAttributeQuery,\n EnrichedBQLQuery,\n EnrichedBormSchema,\n EnrichedFieldQuery,\n EnrichedLinkQuery,\n EnrichedRoleQuery,\n} from '../../../types';\nimport { FieldSchema, QueryPath, SuqlMetadata } from '../../../types/symbols';\n\nexport const build = (props: { queries: EnrichedBQLQuery[]; schema: EnrichedBormSchema }) => {\n const { queries, schema } = props;\n //console.log('queries!', queries);\n return queries.map((query) => buildQuery({ query, schema }));\n};\n\nconst buildQuery = (props: { query: EnrichedBQLQuery; schema: EnrichedBormSchema }): string | null => {\n const { query, schema } = props;\n const { $thing, $fields, $filter, $offset, $limit, $sort } = query;\n\n if ($fields.length === 0) {\n return null;\n }\n\n const lines: string[] = [];\n\n lines.push('SELECT');\n\n const fieldLines = buildFieldsQuery({ parentQuery: query, queries: $fields, level: 1, schema });\n if (fieldLines) {\n lines.push(fieldLines);\n }\n\n const currentSchema = schema.entities[$thing] || schema.relations[$thing];\n if (!currentSchema) {\n throw new Error(`Schema for ${$thing} not found`);\n }\n const allTypes = currentSchema.subTypes ? [$thing, ...currentSchema.subTypes] : [$thing];\n const allTypesNormed = allTypes.map((t) => sanitizeNameSurrealDB(t));\n\n if (query.$id) {\n if (typeof query.$id === 'string') {\n lines.push(`FROM ${allTypesNormed.map((t) => `${t}:⟨${query.$id}⟩`).join(',')}`);\n } else if (isArray(query.$id)) {\n const $ids = query.$id;\n const allCombinations = allTypesNormed.flatMap((t) => $ids?.map((id) => `${t}:⟨${id}⟩`));\n lines.push(`FROM ${allCombinations.join(',')}`);\n //throw new Error('Multiple ids not supported');\n } else {\n throw new Error('Invalid $id');\n }\n } else {\n lines.push(`FROM ${allTypesNormed.join(',')}`);\n }\n\n if ($filter) {\n const parsed = parseFilter($filter, $thing, schema);\n const filter = buildSuqlFilter(parsed);\n lines.push(`WHERE ${filter}`);\n }\n\n if ($sort) {\n lines.push(buildSorter($sort));\n }\n\n if (typeof $limit === 'number') {\n lines.push(`LIMIT ${$limit}`);\n }\n\n if (typeof $offset === 'number') {\n lines.push(`START ${$offset}`);\n }\n\n return lines.join('\\n');\n};\n\nconst buildFieldsQuery = (props: {\n queries: EnrichedFieldQuery[];\n schema: EnrichedBormSchema;\n level: number;\n parentQuery: EnrichedBQLQuery | EnrichedRoleQuery | EnrichedLinkQuery;\n}) => {\n const { queries, schema, level, parentQuery } = props;\n const lines: string[] = [];\n\n const queryPath = parentQuery[QueryPath];\n //Metadata\n lines.push(indent(`\"${queryPath}\" as \\`$$queryPath\\``, level));\n lines.push(indent('record::id(id) as `$id`', level));\n lines.push(indent('record::tb(id) as `$thing`', level));\n\n queries.forEach((i) => {\n const line = buildFieldQuery({ query: i, level, schema });\n if (line) {\n lines.push(line);\n }\n });\n if (lines.length === 0) {\n return null;\n }\n return lines.join(',\\n');\n};\n\nconst buildFieldQuery = (props: {\n query: EnrichedFieldQuery;\n schema: EnrichedBormSchema;\n level: number;\n}): string | null => {\n const { query, schema, level } = props;\n //console.log('query!', query);\n\n if (query.$fieldType === 'data') {\n return buildAttributeQuery({ query, level });\n }\n if (query.$fieldType === 'ref') {\n throw new Error('Ref fields are not supported in this context');\n //return buildLinkQuery({ query, level, schema });\n }\n if (query.$fieldType === 'link') {\n return buildLinkQuery({ query, level, schema });\n }\n if (query.$fieldType === 'role') {\n return buildRoleQuery({ query, level, schema });\n }\n return null;\n};\n\nconst buildAttributeQuery = (props: { query: EnrichedAttributeQuery; level: number }): string | null => {\n const { query, level } = props;\n if (query.$isVirtual) {\n return null;\n }\n // TODO: Get the field id from the schema.\n if (query.$path === 'id') {\n return indent(`record::id(${query.$path}) AS ${query.$as}`, level);\n }\n if (query.$path === query.$as) {\n return indent(`\\`${query.$path}\\``, level);\n }\n return indent(`\\`${query.$path}\\` AS \\`${query.$as}\\``, level);\n};\n\nconst buildLinkQuery = (props: {\n query: EnrichedLinkQuery;\n schema: EnrichedBormSchema;\n level: number;\n}): string | null => {\n const { query, schema, level } = props;\n const { $fields, $filter, $offset, $limit, $sort } = query;\n\n if ($fields.length === 0) {\n return null;\n }\n\n const lines: string[] = [];\n\n lines.push(indent('(', level));\n\n const queryLevel = level + 1;\n lines.push(indent('SELECT', queryLevel));\n\n const fieldLines = buildFieldsQuery({ parentQuery: query, queries: $fields, level: queryLevel + 1, schema });\n if (fieldLines) {\n lines.push(fieldLines);\n }\n\n /// FROM\n const from = query[FieldSchema][SuqlMetadata].queryPath;\n lines.push(indent(`FROM ${from}`, queryLevel));\n\n /// FILTER WHERE\n if ($filter) {\n const parsed = parseFilter($filter, query.$thing, schema);\n const built = buildSuqlFilter(parsed);\n lines.push(`WHERE ${built}`);\n }\n\n /// SORT AND PAGINATION\n if ($sort) {\n lines.push(indent(buildSorter($sort), queryLevel));\n }\n\n if (typeof $limit === 'number') {\n lines.push(indent(`LIMIT ${$limit}`, queryLevel));\n }\n\n if (typeof $offset === 'number') {\n lines.push(indent(`START ${$offset}`, queryLevel));\n }\n\n lines.push(indent(`) AS \\`${query.$as}\\``, level));\n\n return lines.join('\\n');\n};\n\nconst buildRoleQuery = (props: {\n query: EnrichedRoleQuery;\n schema: EnrichedBormSchema;\n level: number;\n}): string | null => {\n const { query, schema, level } = props;\n\n if (query.$fields.length === 0) {\n return null;\n }\n\n const lines: string[] = [];\n\n lines.push(indent('(', level));\n\n const queryLevel = level + 1;\n lines.push(indent('SELECT', queryLevel));\n\n const fieldLevel = queryLevel + 1;\n const fieldLines = buildFieldsQuery({ parentQuery: query, queries: query.$fields, level: fieldLevel, schema });\n if (fieldLines) {\n lines.push(fieldLines);\n }\n\n const from = query[FieldSchema][SuqlMetadata].queryPath;\n lines.push(indent(`FROM ${from}`, queryLevel));\n\n if (query.$filter) {\n const parsed = parseFilter(query.$filter, query.$playedBy.thing, schema);\n const built = buildSuqlFilter(parsed);\n lines.push(`WHERE ${built}`);\n }\n\n lines.push(indent(`) AS \\`${query.$as}\\``, level));\n\n return lines.join('\\n');\n};\n","import { isObject } from 'radash';\nimport { buildSorter, buildSuqlFilter, parseFilter } from '../../../adapters/surrealDB/filters/filters';\nimport { sanitizeNameSurrealDB } from '../../../adapters/surrealDB/helpers';\nimport type {\n EnrichedAttributeQuery,\n EnrichedBQLQuery,\n EnrichedBormEntity,\n EnrichedBormRelation,\n EnrichedBormSchema,\n EnrichedFieldQuery,\n EnrichedLinkQuery,\n EnrichedRefQuery,\n EnrichedRoleQuery,\n} from '../../../types';\nimport { FieldSchema, QueryPath } from '../../../types/symbols';\n\n//todo: Change name to build and remove the edge mode\nexport const buildRefs = (props: { queries: EnrichedBQLQuery[]; schema: EnrichedBormSchema }) => {\n const { queries, schema } = props;\n //console.log('queries!', queries);\n return queries.map((query) => buildQuery({ query, schema }));\n};\n\nconst buildQuery = (props: { query: EnrichedBQLQuery; schema: EnrichedBormSchema }): string | null => {\n const { query, schema } = props;\n const { $thing, $fields, $filter, $offset, $limit, $sort } = query;\n\n if ($fields.length === 0) {\n return null;\n }\n\n const currentSchema = schema.entities[$thing] || schema.relations[$thing];\n if (!currentSchema) {\n throw new Error(`Schema for ${$thing} not found`);\n }\n\n const queryPath = query[QueryPath];\n\n const META = createMetaFields(queryPath);\n const DATA_FIELDS = createDataFields($fields.filter((f) => f.$fieldType === 'data'));\n const EDGE_FIELDS = createEdgeFields(\n $fields.filter((f) => f.$fieldType === 'link' || f.$fieldType === 'role') as (\n | EnrichedLinkQuery\n | EnrichedRoleQuery\n )[],\n schema,\n );\n const REF_FIELDS = createRefFields($fields.filter((f) => f.$fieldType === 'ref') as EnrichedRefQuery[]);\n const FIELDS = [...META, ...DATA_FIELDS, ...EDGE_FIELDS, ...REF_FIELDS].join(',\\n');\n const FROM = createRootFromClause(query, currentSchema);\n const WHERE = $filter ? `WHERE id AND (${buildSuqlFilter(parseFilter($filter, $thing, schema))})` : 'WHERE id';\n\n const SORT = $sort ? buildSorter($sort) : '';\n const LIMIT = typeof $limit === 'number' ? `LIMIT ${$limit}` : '';\n const OFFSET = typeof $offset === 'number' ? `START ${$offset}` : '';\n\n return `SELECT ${FIELDS} ${FROM} ${WHERE} ${SORT} ${LIMIT} ${OFFSET}`;\n};\n\nconst createRootFromClause = (query: EnrichedBQLQuery, currentSchema: EnrichedBormEntity | EnrichedBormRelation) => {\n const allTypes = currentSchema.subTypes ? [query.$thing, ...currentSchema.subTypes] : [query.$thing];\n const allTypesNormed = allTypes.map((t) => sanitizeNameSurrealDB(t));\n\n const formatId = (type: string, id: string) => `${type}:\\`${id}\\``;\n const joinTypes = (ids: string[]) => allTypesNormed.flatMap((type) => ids.map((id) => formatId(type, id))).join(',');\n\n if (!query.$id) {\n return `FROM ${allTypesNormed.join(',')}`;\n }\n\n if (typeof query.$id === 'string') {\n return `FROM ${joinTypes([query.$id])}`;\n }\n\n if (Array.isArray(query.$id)) {\n return `FROM ${joinTypes(query.$id)}`;\n }\n\n throw new Error('Invalid $id');\n};\n\nconst createMetaFields = (queryPath: string) => {\n return [\n `\"${queryPath}\" as \\`$$queryPath\\``,\n 'id && record::id(id) || null as `$id`', //the id is on case we try to extend flex stuff\n 'id && record::tb(id) || null as `$thing`',\n ];\n};\n\nconst createDataFields = (dataFields: EnrichedAttributeQuery[] | EnrichedFieldQuery[]) => {\n return dataFields.map((df) => {\n if (df.$path === 'id') {\n return `record::id(${df.$path}) AS ${df.$as}`;\n }\n if (df.$path === df.$as) {\n return `\\`${df.$path}\\``;\n }\n return `\\`${df.$path}\\` AS \\`${df.$as}\\``;\n });\n};\n\nconst createEdgeFields = (\n edgeFields: (EnrichedLinkQuery | EnrichedRoleQuery)[],\n schema: EnrichedBormSchema,\n): string[] => {\n return edgeFields\n .map((ef) => {\n //logger('ef', ef);\n if (!ef[QueryPath]) {\n throw new Error(`[Internal] QueryPath is missing. Value: ${JSON.stringify(ef)}`);\n }\n const META = createMetaFields(ef[QueryPath]);\n const DATA_FIELDS = createDataFields(ef.$fields.filter((f) => f.$fieldType === 'data'));\n const LINK_FIELDS = createEdgeFields(\n ef.$fields.filter((f) => f.$fieldType === 'link' || f.$fieldType === 'role') as (\n | EnrichedLinkQuery\n | EnrichedRoleQuery\n )[],\n schema,\n );\n const REF_FIELDS = createRefFields(ef.$fields.filter((f) => f.$fieldType === 'ref'));\n const FIELDS = [...META, ...DATA_FIELDS, ...LINK_FIELDS, ...REF_FIELDS].filter(Boolean).join(',\\n');\n const FROM = `FROM $parent.\\`${ef[FieldSchema].path}\\`[*]`;\n const WHERE =\n ef.$filter && Object.keys(ef.$filter).length > 0\n ? `WHERE id AND(${buildSuqlFilter(parseFilter(ef.$filter, ef.$thing, schema))})`\n : 'WHERE id';\n const SORT = ef.$sort ? buildSorter(ef.$sort) : '';\n const LIMIT = typeof ef.$limit === 'number' ? `LIMIT ${ef.$limit}` : '';\n const OFFSET = typeof ef.$offset === 'number' ? `START ${ef.$offset}` : '';\n return `( SELECT ${FIELDS} ${FROM} ${WHERE} ${SORT} ${LIMIT} ${OFFSET} ) AS \\`${ef.$as}\\``;\n })\n .filter((f) => f);\n};\nconst createRefFields = (refFields: EnrichedRefQuery[]) => {\n return refFields.map((rf) => {\n if (!rf[QueryPath]) {\n throw new Error(`[Internal] QueryPath is missing. Value: ${JSON.stringify(rf)}`);\n }\n const META = createMetaFields(rf[QueryPath]);\n if (rf.$fields?.some((f) => isObject(f))) {\n throw new Error(\"[Unsupported]: Can't query nested ref fields yet\");\n }\n const FLEX_REF = 'id && null || $this as `$value`';\n const FIELDS = [...META, FLEX_REF, ...(rf.$justId ? '' : rf.$fields?.map((f) => `⟨${f}⟩`) || ['*'])].join(',\\n'); //if no fields, get everything\n const FROM = `FROM $parent.\\`${rf[FieldSchema].dbPath}\\``; //removing the [*]\n //const WHERE = 'WHERE true'; //can't filter inside ref Fields\n // In ref fields we don't have the ref of the fields so we go blind\n return `( SELECT ${FIELDS} ${FROM}) AS \\`${rf.$as}\\``;\n });\n};\n","import { isArray, isDate, mapEntries } from 'radash';\nimport { sanitizeTableNameSurrealDb } from '../../../adapters/surrealDB/helpers';\nimport { getSchemaByThing } from '../../../helpers';\nimport type {\n BormConfig,\n ContentType,\n EnrichedBQLQuery,\n EnrichedBormSchema,\n EnrichedFieldQuery,\n EnrichedLinkQuery,\n EnrichedRoleQuery,\n} from '../../../types';\nimport { FieldSchema, QueryPath } from '../../../types/symbols';\n\nexport const parse = (props: {\n res: Record<string, any>[][];\n queries: EnrichedBQLQuery[];\n schema: EnrichedBormSchema;\n config: BormConfig;\n}) => {\n const { res, queries, schema } = props;\n //console.log('res!', JSON.stringify(res, null, 2));\n const result = res.map((r, i) => parseRes(queries[i], r, schema));\n //console.log('result', result);\n return result;\n};\n\nconst parseRes = (\n query: EnrichedBQLQuery | EnrichedLinkQuery | EnrichedRoleQuery,\n res: Record<string, any>[],\n schema: EnrichedBormSchema,\n) => {\n if (isArray(res)) {\n if (res.length === 0) {\n return null;\n }\n if (query.$filterByUnique) {\n if (res.length > 1) {\n throw new Error('Multiple results found for unique query');\n }\n return parseObj(query, res[0], schema);\n }\n if (res.length >= 1) {\n return res.map((r) => parseObj(query, r, schema));\n }\n } else {\n throw new Error('res is unexpectedly not an array');\n }\n};\n\nconst parseObj = (\n query: EnrichedBQLQuery | EnrichedLinkQuery | EnrichedRoleQuery,\n obj: Record<string, any>,\n schema: EnrichedBormSchema,\n) => {\n // eslint-disable-next-line prefer-destructuring\n const $thing = obj.$thing || obj.tb;\n const $thingType = $thing in schema.entities ? 'entity' : $thing in schema.relations ? 'relation' : 'error';\n if ($thingType === 'error') {\n throw new Error(`[Internal] The $thing ${$thing} is not defined in the schema.`);\n }\n\n const newObj: Record<string, any> = {\n //init with symbols\n [QueryPath]: obj.$$queryPath,\n $id: obj.$id,\n $thing: sanitizeTableNameSurrealDb($thing),\n $thingType, //This is actually not true always, will need to be fetched from the $thing\n };\n\n // For normal fields, we parse each field classically\n query.$fields.forEach((f) => {\n const key = f.$as;\n const value = obj[key];\n // TODO: Look up what the id field is in the schema.\n if (f.$path === 'id' && query.$idNotIncluded) {\n return;\n }\n newObj[key] = parseFieldResult(f, value, schema);\n });\n\n return newObj;\n};\n\nconst parseFieldResult = (query: EnrichedFieldQuery, value: any, schema: EnrichedBormSchema) => {\n if (value === undefined || value === null || (isArray(value) && value.length === 0)) {\n return null;\n }\n\n if (query.$fieldType === 'data') {\n const { contentType /*,cardinality*/ } = query[FieldSchema];\n\n return parseValue(value, contentType) ?? null;\n }\n if (query.$fieldType === 'ref') {\n const asArray = isArray(value) ? value : [value];\n const parsedContent = asArray.map((v) => {\n if (v.$thing) {\n const currentSchema = getSchemaByThing(schema, v.$thing);\n const [idField] = currentSchema.idFields;\n //console.log('currentSchema!', currentSchema);\n if (query.$justId) {\n return v.$id;\n }\n //todo: We will fix this once surrealDB enables some sort of SELECT ( SELECT * FROM $parent.*). Meanwhile we can only query one nested level\n const flatNestedField = (nf: unknown) => {\n if (nf && typeof nf === 'object' && 'id' in nf && 'tb' in nf) {\n return nf.id;\n }\n //todo: This is a value, and we might need to parse it correctly. We know the schema and the key, so we can do it.\n return nf;\n };\n const temporallyFlatNestedIds = mapEntries(v, (key, content) => {\n if (isArray(content)) {\n return [key, content.map((i) => flatNestedField(i))];\n }\n return [key, flatNestedField(content)];\n });\n\n return {\n ...temporallyFlatNestedIds,\n [QueryPath]: v.$$queryPath,\n [idField]: v.$id, //todo: this is a hack. But we should add this always!\n };\n }\n if (v.$value) {\n return parseValue(v.$value, 'FLEX');\n }\n return v; //in cardinality many the query returns the values already. Todo: To optimize this we can remove the $value when cardinality MANY or find a smarter solution\n });\n const { cardinality } = query[FieldSchema];\n if (cardinality === 'ONE') {\n //not filterByUnique because we can't filter inside a refField\n return parsedContent[0];\n }\n return parsedContent;\n }\n\n if (query.$justId) {\n if (query.$filterByUnique || query[FieldSchema].cardinality === 'ONE') {\n // TODO: Look up what the id field is in the schema.\n //return isArray(value) ? value[0]?.id : value?.id; //RefFields receive direct\n return value[0]?.$id ?? null;\n }\n return value?.map((i: Record<string, any>) => i.$id) ?? [];\n }\n if (query.$filterByUnique || query[FieldSchema].cardinality === 'ONE') {\n return parseObj(query, value[0], schema);\n }\n return parseRes(query, value, schema);\n};\n\nconst parseValue = (value: unknown, contentType: ContentType) => {\n const asArray = isArray(value) ? value : [value];\n if (contentType === 'DATE') {\n const res = asArray.map((v) => new Date(v).toISOString());\n return isArray(value) ? res : res[0];\n }\n if (contentType === 'FLEX') {\n const res = asArray.map((v) => {\n if (isDate(v)) {\n return new Date(v).toISOString(); //Todo: in the future probably just return the date object instead, but we need to fix it in typedb.\n }\n return v;\n });\n return isArray(value) ? res : res[0];\n }\n return value;\n};\n","import type { SimpleSurrealClient } from '../../../adapters/surrealDB/client';\nimport { logDebug } from '../../../logger';\nimport type { BormConfig } from '../../../types';\nimport { VERSION } from '../../../version';\n\nexport const run = async (props: {\n client: SimpleSurrealClient;\n queries: string[];\n config: BormConfig;\n}): Promise<any[][]> => {\n const { client, queries, config } = props;\n const batchedQuery = `\n\tBEGIN TRANSACTION;\n\t${queries.join(';')};\n\tCOMMIT TRANSACTION;\n\t`;\n\n if (config.query?.debugger) {\n logDebug(`batchedQuery[${VERSION}]`, JSON.stringify({ batchedQuery }));\n }\n //console.log('batchedQuery!', batchedQuery);\n\n return await client.query(batchedQuery);\n};\n","import type { SimpleSurrealClient } from '../../../adapters/surrealDB/client';\nimport { assertDefined } from '../../../helpers';\nimport type { BormConfig, EnrichedBQLQuery, EnrichedBormSchema } from '../../../types';\nimport type { SurrealDBProviderObject } from '../../../types/config/surrealdb';\nimport { createMachine, interpret, invoke, reduce, state, transition } from 'robot3';\nimport { build } from './build';\nimport { buildRefs } from './buildRefs';\nimport { parse } from './parse';\nimport { run } from './run';\n\nexport type SurrealDbMachineContext = {\n bql: {\n queries: EnrichedBQLQuery[];\n res?: any[];\n };\n surql: {\n queries?: string[];\n res?: any[];\n };\n schema: EnrichedBormSchema;\n config: BormConfig;\n client: SimpleSurrealClient;\n error?: string | null;\n};\n\nconst errorTransition = transition(\n 'error',\n 'error',\n reduce((ctx: SurrealDbMachineContext, event: any): SurrealDbMachineContext => {\n return {\n ...ctx,\n error: event.error,\n };\n }),\n);\n\nconst surrealDbQueryMachine = createMachine(\n 'build',\n {\n build: invoke(\n async (ctx: SurrealDbMachineContext) => {\n // todo: This works only if there is a single surrealDB connector\n const { linkMode } = (\n ctx.config.dbConnectors.find((c) => c.provider === 'surrealDB') as SurrealDBProviderObject\n ).providerConfig;\n if (linkMode === 'edges') {\n return build({ queries: ctx.bql.queries, schema: ctx.schema });\n }\n if (linkMode === 'refs') {\n return buildRefs({ queries: ctx.bql.queries, schema: ctx.schema });\n }\n },\n transition(\n 'done',\n 'run',\n reduce(\n (ctx: SurrealDbMachineContext, event: any): SurrealDbMachineContext => ({\n ...ctx,\n surql: {\n ...ctx.surql,\n queries: event.data,\n },\n }),\n ),\n ),\n errorTransition,\n ),\n run: invoke(\n async (ctx: SurrealDbMachineContext) => {\n return run({ client: ctx.client, queries: assertDefined(ctx.surql.queries), config: ctx.config });\n },\n transition(\n 'done',\n 'parse',\n reduce(\n (ctx: SurrealDbMachineContext, event: any): SurrealDbMachineContext => ({\n ...ctx,\n surql: {\n ...ctx.surql,\n res: event.data,\n },\n }),\n ),\n ),\n errorTransition,\n ),\n parse: invoke(\n async (ctx: SurrealDbMachineContext) => {\n return parse({\n res: assertDefined(ctx.surql.res),\n queries: ctx.bql.queries,\n schema: ctx.schema,\n config: ctx.config,\n });\n },\n transition(\n 'done',\n 'success',\n reduce(\n (ctx: SurrealDbMachineContext, event: any): SurrealDbMachineContext => ({\n ...ctx,\n bql: {\n ...ctx.bql,\n res: event.data,\n },\n }),\n ),\n ),\n errorTransition,\n ),\n success: state(),\n error: state(),\n },\n (ctx: SurrealDbMachineContext) => ctx,\n);\n\nconst awaitQueryMachine = async (context: SurrealDbMachineContext) => {\n return new Promise<any[]>((resolve, reject) => {\n interpret(\n surrealDbQueryMachine,\n (service) => {\n if (service.machine.state.name === 'success') {\n //@ts-expect-error = todo\n resolve(service.context.bql.res);\n }\n if (service.machine.state.name === 'error') {\n reject(service.context.error);\n }\n },\n context,\n );\n });\n};\n\nexport const runSurrealDbQueryMachine = async (\n enrichedBql: EnrichedBQLQuery[],\n schema: EnrichedBormSchema,\n config: BormConfig,\n client: SimpleSurrealClient,\n) => {\n return awaitQueryMachine({\n bql: {\n queries: enrichedBql,\n },\n surql: {},\n schema: schema,\n config: config,\n client,\n error: null,\n });\n};\n","import { assertDefined } from '../../../helpers';\nimport type { BormConfig, DBHandles, EnrichedBQLQuery, EnrichedBormSchema, 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 bql: {\n raw: RawBQLQuery[];\n queries: EnrichedBQLQuery[];\n res?: any[];\n };\n tql: {\n queries?: string[];\n res?: any[];\n };\n schema: EnrichedBormSchema;\n config: BormConfig;\n handles: DBHandles;\n error?: string | null;\n};\n\nconst updateBqlRes = (ctx: TypeDbMachineContext, event: any): TypeDbMachineContext => {\n if (!event.data) {\n return ctx;\n }\n return {\n ...ctx,\n bql: { ...ctx.bql, res: event.data },\n };\n};\n\nconst updateTqlReq = (ctx: TypeDbMachineContext, event: any): TypeDbMachineContext => {\n if (!event.data) {\n return ctx;\n }\n return {\n ...ctx,\n tql: { ...ctx.tql, queries: event.data },\n };\n};\n\nconst updateTqlRes = (ctx: TypeDbMachineContext, event: any): TypeDbMachineContext => {\n if (!event.data) {\n return ctx;\n }\n return {\n ...ctx,\n tql: { ...ctx.tql, res: event.data },\n };\n};\n\nconst errorTransition = transition(\n 'error',\n 'error',\n reduce((ctx: TypeDbMachineContext, event: any): TypeDbMachineContext => {\n return {\n ...ctx,\n error: event.error,\n };\n }),\n);\n\nexport const typeDbQueryMachine = createMachine(\n 'build',\n {\n build: invoke(\n async (ctx: TypeDbMachineContext) => buildTQLQuery({ queries: ctx.bql.queries, schema: ctx.schema }),\n transition('done', 'run', reduce(updateTqlReq)),\n errorTransition,\n ),\n run: invoke(\n async (ctx: TypeDbMachineContext) => {\n return runTQLQuery({\n dbHandles: ctx.handles,\n tqlRequest: assertDefined(ctx.tql.queries),\n config: ctx.config,\n });\n },\n transition('done', 'parse', reduce(updateTqlRes)),\n errorTransition,\n ),\n parse: invoke(\n async (ctx: TypeDbMachineContext) =>\n parseTQLQuery({\n rawBqlRequest: ctx.bql.raw,\n enrichedBqlQuery: ctx.bql.queries,\n schema: ctx.schema,\n config: ctx.config,\n rawTqlRes: assertDefined(ctx.tql.res),\n }),\n transition('done', 'success', reduce(updateBqlRes)),\n errorTransition,\n ),\n success: state(),\n error: state(),\n },\n (ctx: TypeDbMachineContext) => ctx,\n);\n\nconst awaitQueryMachine = async (context: TypeDbMachineContext) => {\n return new Promise<any[]>((resolve, reject) => {\n interpret(\n typeDbQueryMachine,\n (service) => {\n if (service.machine.state.name === 'success') {\n //@ts-expect-error = todo\n resolve(service.context.bql.res);\n }\n if (service.machine.state.name === 'error') {\n reject(service.context.error);\n }\n },\n context,\n );\n });\n};\n\nexport const runTypeDbQueryMachine = async (\n bql: RawBQLQuery[],\n enrichedBql: EnrichedBQLQuery[],\n schema: EnrichedBormSchema,\n config: BormConfig,\n handles: DBHandles,\n) => {\n return awaitQueryMachine({\n bql: {\n raw: bql,\n queries: enrichedBql,\n },\n tql: {},\n schema: schema,\n config: config,\n handles: handles,\n error: null,\n });\n};\n","import { isArray, isObject } from 'radash';\nimport { v4 as uuidv4 } from 'uuid';\nimport { getSchemaByThing, indent } from '../../../helpers';\nimport type {\n EnrichedBormEntity,\n EnrichedBormRelation,\n EnrichedBormSchema,\n Filter,\n PositiveFilter,\n} from '../../../types';\n\nexport const buildFilter = (props: {\n $filter: Filter;\n $var: string;\n $thing: string;\n schema: EnrichedBormSchema;\n depth: number;\n}): string => {\n const { $filter: $nonMappedFilter, $var, $thing, schema, depth } = props;\n const $filter = mapFilterKeys($nonMappedFilter, getSchemaByThing(schema, $thing));\n\n const { $not, ...rest } = $filter;\n\n const matches: string[] = [];\n\n // Handle $not filters\n if (isPositiveFilter($not)) {\n const notMatches = processPositiveFilter($not, $var, $thing, schema, depth, true);\n matches.push(...notMatches);\n } else if ($not !== undefined) {\n throw new Error('$not must be a PositiveFilter object');\n }\n\n // Handle positive filters\n const positiveMatches = processPositiveFilter(rest, $var, $thing, schema, depth, false);\n matches.push(...positiveMatches);\n\n return matches.join('\\n');\n};\n\nconst processPositiveFilter = (\n filter: PositiveFilter,\n $var: string,\n $thing: string,\n schema: EnrichedBormSchema,\n depth: number,\n isNegated: boolean,\n): string[] => {\n const thing = getSchemaByThing(schema, $thing);\n const matches: string[] = [];\n\n for (const [key, value] of Object.entries(filter)) {\n if (key.startsWith('$')) {\n // Handle logical operators ($and, $or)\n const normalizedKey = key.toLowerCase() as '$and' | '$or';\n if (normalizedKey === '$and' || normalizedKey === '$or') {\n const subFilters = isArray(value) ? value : [value];\n const subMatches = subFilters.map((subFilter) => {\n if (isPositiveFilter(subFilter)) {\n const subFilterMatches = processPositiveFilter(subFilter, $var, $thing, schema, depth + 1, isNegated);\n return subFilterMatches.join('\\n');\n }\n throw new Error(`Invalid subfilter in ${normalizedKey}: ${JSON.stringify(subFilter)}`);\n });\n const joinedSubMatches = subMatches.join(normalizedKey === '$and' ? '\\n' : ' } or { ');\n if (normalizedKey === '$or' && subMatches.length > 1) {\n matches.push(indent(`{ ${joinedSubMatches} };`, depth));\n } else {\n matches.push(indent(joinedSubMatches, depth));\n }\n continue;\n }\n // Skip other special keys\n continue;\n }\n\n // Handle data fields\n const df = thing.dataFields?.find((df) => df.dbPath === key || df.path === key);\n if (df) {\n const fieldMatches = handleDataFieldFilter(key, value, $var, depth, isNegated);\n matches.push(...fieldMatches);\n continue;\n }\n\n // Handle link fields\n const lf = thing.linkFields?.find((lf) => lf.path === key);\n if (lf) {\n const linkMatches = handleLinkFieldFilter(lf, value, $var, schema, depth, isNegated);\n matches.push(...linkMatches);\n continue;\n }\n\n // Handle roles in relations\n if (thing.thingType === 'relation') {\n const role = thing.roles[key];\n if (role) {\n const roleMatches = handleRelationRoleFilter(role, value, $var, $thing, schema, depth, isNegated);\n matches.push(...roleMatches);\n continue;\n }\n }\n\n throw new Error(`\"${$thing}\" does not have property \"${key}\"`);\n }\n\n return matches;\n};\n\nconst handleDataFieldFilter = (key: string, value: any, $var: string, depth: number, isNegated: boolean): string[] => {\n const matches: string[] = [];\n\n if (isObject(value) && !isArray(value)) {\n // Handle operator-based filters (e.g., { $eq: value })\n for (const [op, opValue] of Object.entries(value)) {\n const normalizedOp = op.toLowerCase() as '$eq' | '$ne' | '$in' | '$nin' | '$exists';\n let match = '';\n switch (normalizedOp) {\n case '$eq':\n match = `$${$var} has ${key} ${serializeValue(opValue)};`;\n break;\n case '$ne':\n match = `not { $${$var} has ${key} ${serializeValue(opValue)}; };`;\n break;\n case '$in': {\n if (!isArray(opValue)) {\n throw new Error('Value for $in operator must be an array');\n }\n const inAlt = opValue.map((v) => `$${$var} has ${key} ${serializeValue(v)};`);\n match = joinAlt(inAlt);\n if (isNegated) {\n match = `not { ${match} };`;\n }\n break;\n }\n case '$nin':\n if (!isArray(opValue)) {\n throw new Error('Value for $nin operator must be an array');\n }\n for (const v of opValue) {\n const ninMatch = `not { $${$var} has ${key} ${serializeValue(v)}; };`;\n matches.push(indent(ninMatch, depth));\n }\n continue; // Skip the rest of the loop for '$nin'\n case '$exists':\n if (opValue === true) {\n match = `$${$var} has ${key} $${key}_${uuidv4()};`;\n } else if (opValue === false) {\n match = `not { $${$var} has ${key} $${key}_${uuidv4()}; };`;\n } else {\n throw new Error(`Invalid value for $exists: ${opValue}`);\n }\n break;\n default:\n throw new Error(`Unsupported operator \"${op}\" for data field \"${key}\"`);\n }\n if (isNegated) {\n match = `not { ${match} };`;\n }\n matches.push(indent(match, depth));\n }\n } else if (isArray(value)) {\n // Treat array value as an $in operator\n const alt = value.map((v) => `$${$var} has ${key} ${serializeValue(v)};`);\n let match = joinAlt(alt);\n if (match) {\n if (isNegated) {\n match = `not { ${match} };`;\n }\n matches.push(indent(match, depth));\n }\n } else {\n // Scalar value\n let match = `$${$var} has ${key} ${serializeValue(value)};`;\n if (isNegated) {\n match = `not { ${match} };`;\n }\n matches.push(indent(match, depth));\n }\n\n return matches;\n};\n\nconst handleLinkFieldFilter = (\n lf: any, // Adjust type as needed\n value: any,\n $var: string,\n schema: EnrichedBormSchema,\n depth: number,\n isNegated: boolean,\n): string[] => {\n const matches: string[] = [];\n const [opposite] = lf.oppositeLinkFieldsPlayedBy;\n const oppositeThing = getSchemaByThing(schema, opposite.thing);\n const oppositeIdField = oppositeThing.idFields?.[0];\n if (!oppositeIdField) {\n throw new Error(`\"${opposite.thing}\" does not have an id field`);\n }\n\n const oppVar = `${opposite.thing}_${uuidv4()}`;\n\n let match = '';\n\n if (lf.target === 'relation') {\n // Handle link field targeting a relation\n if (value === null) {\n match = isNegated\n ? `(${lf.plays}: $${$var}) isa ${lf.relation};`\n : `not { (${lf.plays}: $${$var}) isa ${lf.relation}; };`;\n } else if (isArray(value)) {\n const alt = value.map(\n (v) => `(${lf.plays}: $${$var}) isa ${lf.relation}, has ${oppositeIdField} ${serializeValue(v)};`,\n );\n match = joinAlt(alt);\n if (isNegated) {\n match = `not { ${match} };`;\n }\n } else {\n match = `(${lf.plays}: $${$var}) isa ${lf.relation}, has ${oppositeIdField} ${serializeValue(value)};`;\n if (isNegated) {\n match = `not { ${match} };`;\n }\n }\n } else {\n // Handle link field without intermediary relation\n if (value === null) {\n match = isNegated\n ? `$${oppVar} isa ${opposite.thing}; (${lf.plays}: $${$var}, ${opposite.plays}: $${oppVar}) isa ${lf.relation};`\n : `not { $${oppVar} isa ${opposite.thing}; (${lf.plays}: $${$var}, ${opposite.plays}: $${oppVar}) isa ${lf.relation}; };`;\n } else if (isArray(value)) {\n const alt = value.map(\n (v) =>\n `$${oppVar} isa ${opposite.thing}, has ${oppositeIdField} ${serializeValue(\n v,\n )}; (${lf.plays}: $${$var}, ${opposite.plays}: $${oppVar}) isa ${lf.relation};`,\n );\n match = joinAlt(alt);\n if (isNegated) {\n match = `not { ${match} };`;\n }\n } else {\n match = `$${oppVar} isa ${opposite.thing}, has ${oppositeIdField} ${serializeValue(\n value,\n )}; (${lf.plays}: $${$var}, ${opposite.plays}: $${oppVar}) isa ${lf.relation};`;\n if (isNegated) {\n match = `not { ${match} };`;\n }\n }\n }\n\n matches.push(indent(match, depth));\n return matches;\n};\n\nconst handleRelationRoleFilter = (\n role: any, // Adjust type as needed\n value: any,\n $var: string,\n $thing: string,\n schema: EnrichedBormSchema,\n depth: number,\n isNegated: boolean,\n): string[] => {\n const matches: string[] = [];\n const [player] = role.playedBy || [];\n const playerThing = getSchemaByThing(schema, player.thing);\n const playerIdField = playerThing.idFields?.[0];\n if (!playerIdField) {\n throw new Error(`\"${player.thing}\" does not have an id field`);\n }\n const playerVar = `${player.thing}_${uuidv4()}`;\n const filterId = uuidv4();\n const filterVar = `${$var}_${filterId}`;\n\n matches.push(indent(`$${filterVar} isa ${$thing};`, depth));\n\n let match = '';\n\n if (value === null) {\n match = `$${filterVar} (${player.plays}: ${playerVar});`;\n if (isNegated) {\n matches.push(indent(match, depth));\n } else {\n matches.push(indent(`not { ${match} };`, depth));\n }\n } else if (isArray(value)) {\n const alt = value.map(\n (v) =>\n `$${playerVar} isa ${player.thing}, has ${playerIdField} ${serializeValue(\n v,\n )}; $${filterVar} (${player.plays}: $${playerVar});`,\n );\n match = joinAlt(alt);\n if (isNegated) {\n matches.push(indent(`not { ${match} };`, depth));\n } else {\n matches.push(indent(match, depth));\n }\n } else {\n match = `$${playerVar} isa ${player.thing}, has ${playerIdField} ${serializeValue(\n value,\n )}; $${filterVar} (${player.plays}: $${playerVar});`;\n if (isNegated) {\n matches.push(indent(`not { ${match} };`, depth));\n } else {\n matches.push(indent(match, depth));\n }\n }\n\n matches.push(indent(`$${$var} is $${filterVar};`, depth));\n\n return matches;\n};\n\nconst joinAlt = (alt: string[]): string => {\n if (alt.length > 1) {\n return `{ ${alt.join(' } or { ')} };`;\n }\n if (alt.length === 1) {\n return alt[0];\n }\n throw new Error('No alternatives provided to joinAlt');\n};\n\nconst serializeValue = (value: string | number | boolean | Date | object): string => {\n if (typeof value === 'string') {\n return `'${value}'`;\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return `${value}`;\n }\n if (value instanceof Date) {\n return `'${value.toISOString().replace('Z', '')}'`;\n }\n if (isObject(value)) {\n if ('$id' in value) {\n const idValue = (value as any).$id;\n if (isArray(idValue)) {\n return `like \"^(${idValue.join('|')})$\"`;\n }\n return serializeValue(idValue);\n }\n throw new Error('Cannot serialize complex object values in filter');\n }\n throw new Error(`Unsupported value type: ${typeof value}`);\n};\n\nconst mapFilterKeys = (filter: Filter, thingSchema: EnrichedBormEntity | EnrichedBormRelation): Filter => {\n const mapper: Record<string, string> = {};\n\n thingSchema.dataFields?.forEach((df) => {\n if (df.path !== df.dbPath) {\n mapper[df.path] = df.dbPath;\n }\n });\n\n if (Object.keys(mapper).length === 0) {\n return filter;\n }\n\n const { $not, ...f } = filter;\n const newFilter: Filter = mapPositiveFilterKeys(f, mapper);\n\n if ($not && isPositiveFilter($not)) {\n newFilter.$not = mapPositiveFilterKeys($not, mapper);\n }\n\n return newFilter;\n};\n\nconst mapPositiveFilterKeys = (filter: PositiveFilter, mapper: Record<string, string>): PositiveFilter => {\n const newFilter: PositiveFilter = {};\n Object.entries(filter).forEach(([key, filterValue]) => {\n const newKey = mapper[key] || key;\n newFilter[newKey] = filterValue;\n });\n return newFilter;\n};\n\nconst isPositiveFilter = (filter: any): filter is PositiveFilter => {\n return typeof filter === 'object' && filter !== null && !Array.isArray(filter);\n};\n","import { v4 as uuidv4 } from 'uuid';\nimport { getIdFieldKey, getSchemaByThing, indent } from '../../../helpers';\nimport type {\n EnrichedAttributeQuery,\n EnrichedBQLQuery,\n EnrichedBormSchema,\n EnrichedLinkQuery,\n EnrichedRoleQuery,\n} from '../../../types';\nimport { FieldSchema, QueryPath } from '../../../types/symbols';\nimport { buildFilter } from './filters';\n\nconst separator = '___';\n\nexport const buildTQLQuery = async (props: { queries: EnrichedBQLQuery[]; schema: EnrichedBormSchema }) => {\n const { queries: batches, schema } = props;\n return batches.map((query) => buildQuery({ query, schema }));\n};\n\nconst buildQuery = (props: { query: EnrichedBQLQuery; schema: EnrichedBormSchema }) => {\n const { query, schema } = props;\n const { $path, $thing, $filter, $fields, $sort, $offset, $limit, $id } = query;\n\n if (!$path) {\n throw new Error('Path is not defined');\n }\n\n const lines: string[] = [];\n const queryPath = query[QueryPath];\n lines.push('match');\n lines.push(`$${$path} isa ${$thing};`);\n\n if ($filter || $id) {\n const idField = getIdFieldKey(schema, query);\n const $WithIdFilter = { ...$filter, ...($id ? { [idField]: $id } : {}) };\n const filter = buildFilter({ $filter: $WithIdFilter, $var: $path, $thing, schema, depth: 0 });\n lines.push(`\\n${filter}`);\n }\n\n const sorter = buildSorter({ schema, $thing, $var: $path, $sort, depth: 0 });\n\n if (sorter) {\n lines.push(sorter.match);\n }\n\n const randomId = `M_${uuidv4()}`;\n\n lines.push(`?queryPath${randomId} = \"${queryPath}\";`);\n lines.push('fetch');\n lines.push(`?queryPath${randomId} as \"queryPath\";`);\n\n if ($fields) {\n const dataFields = $fields.filter((f) => f.$fieldType === 'data') as EnrichedAttributeQuery[];\n if (dataFields && dataFields.length > 0) {\n lines.push(...processDataFields(dataFields, $path, 0));\n }\n\n const linkFields = $fields.filter((f) => f.$fieldType === 'link') as EnrichedLinkQuery[];\n if (linkFields && linkFields.length > 0) {\n lines.push(...processLinkFields(linkFields, $path, $path, 0, schema));\n }\n\n const roleFields = $fields.filter((f) => f.$fieldType === 'role') as EnrichedRoleQuery[];\n if (roleFields && roleFields.length > 0) {\n lines.push(...processRoleFields(roleFields, $path, $path, 0, schema));\n }\n }\n\n if (sorter) {\n lines.push(sorter.sort);\n }\n\n if (typeof $offset === 'number') {\n lines.push(`\\noffset ${$offset};`);\n }\n\n if (typeof $limit === 'number') {\n lines.push(`\\nlimit ${$limit};`);\n }\n\n return lines.join('\\n');\n};\n\nconst processDataFields = (dataFields: EnrichedAttributeQuery[], $path: string, depth: number) => {\n const postStrParts: string[] = [];\n const asMetaDataParts: string[] = [];\n const multiVals: { path: string }[] = [];\n\n for (let i = 0; i < dataFields.length; i++) {\n if (!dataFields[i].$isVirtual) {\n postStrParts.push(dataFields[i].$dbPath);\n }\n if (dataFields[i][FieldSchema].contentType === 'FLEX') {\n multiVals.push({ path: dataFields[i][FieldSchema].dbPath });\n }\n asMetaDataParts.push(`{${dataFields[i].$dbPath}:${dataFields[i].$as}}`);\n }\n\n const postStr = postStrParts.join(', ');\n const $asMetaData = asMetaDataParts.join(',');\n const $metaData = `$metadata:{as:[${$asMetaData}]}`;\n const lines = [indent(`$${$path} as \"${$path}.${$metaData}.$dataFields\": ${postStr};`, depth)];\n\n if (multiVals.length > 0) {\n multiVals.forEach((multiVal) => {\n lines.push(\n indent(\n `\"${multiVal.path}.$multiVal\": {match $${$path} has ${multiVal.path} $${multiVal.path}; fetch $${multiVal.path}: attribute;};`,\n depth,\n ),\n );\n });\n }\n return lines;\n};\n\nconst processRoleFields = (\n roleFields: EnrichedRoleQuery[],\n $path: string,\n dotPath: string,\n depth: number,\n schema: EnrichedBormSchema,\n) => {\n const nextDepth = depth + 1;\n const lines: string[] = [];\n\n for (const roleField of roleFields) {\n const { $fields, $as, $justId, $idNotIncluded, $filterByUnique, $thing, $sort, $offset, $limit } = roleField;\n const queryPath = roleField[QueryPath];\n\n const $metaData = `$metadata:{as:${$as},justId:${\n $justId ? 'T' : 'F'\n },idNotIncluded:${$idNotIncluded},filterByUnique:${$filterByUnique}}`;\n lines.push(indent(`\"${dotPath}.${$metaData}.${roleField.$var}\": {`, depth));\n lines.push(indent('match', nextDepth));\n const $roleVar = `${$path}${separator}${roleField.$var}`;\n lines.push(indent(`$${$roleVar} isa ${roleField.$thing};`, nextDepth));\n lines.push(\n indent(\n // TODO: The parent node already declare $path\n `$${$path} (${roleField.$var}: $${$path}${separator}${roleField.$var}) isa ${roleField.$intermediary};`,\n nextDepth,\n ),\n );\n\n if (roleField.$filter || roleField.$id) {\n const idField = getIdFieldKey(schema, roleField);\n const withId = roleField.$id ? { [idField]: roleField.$id } : {};\n const withIdFilter = { ...roleField.$filter, ...withId };\n\n lines.push(\n buildFilter({\n $filter: withIdFilter,\n $var: $roleVar,\n $thing: roleField.$thing,\n schema,\n depth: nextDepth,\n }),\n );\n }\n\n const sorter = buildSorter({ schema, $thing, $var: $roleVar, $sort, depth: nextDepth });\n\n if (sorter) {\n lines.push(sorter.match);\n }\n\n if ($fields) {\n const randomId = `M_${uuidv4()}`;\n lines.push(indent(`\\n?queryPath${randomId} = \"${queryPath}\";`, nextDepth)); ///rawPaths => to inject metadata in the response, in this case only the path\n lines.push(indent('fetch', nextDepth));\n lines.push(indent(`?queryPath${randomId} as \"queryPath\";`, nextDepth)); ///rawPaths => to recover metadata in the response\n\n const dataFields = $fields?.filter((f) => f.$fieldType === 'data') as EnrichedAttributeQuery[];\n if (dataFields && dataFields.length > 0) {\n lines.push(...processDataFields(dataFields, $roleVar, nextDepth));\n }\n\n const linkFields = $fields?.filter((f) => f.$fieldType === 'link') as EnrichedLinkQuery[];\n if (linkFields && linkFields.length > 0) {\n lines.push(...processLinkFields(linkFields, $roleVar, `${$path}.${roleField.$var}`, nextDepth, schema));\n }\n const roleFields = $fields?.filter((f) => f.$fieldType === 'role') as EnrichedRoleQuery[];\n if (roleFields && roleFields.length > 0) {\n lines.push(...processRoleFields(roleFields, $roleVar, `${$path}.${roleField.$var}`, nextDepth, schema));\n }\n }\n\n if (sorter) {\n lines.push(sorter.sort);\n }\n\n if (typeof $offset === 'number') {\n lines.push(indent(`offset ${$offset};`, nextDepth));\n }\n\n if (typeof $limit === 'number') {\n lines.push(indent(`limit ${$limit};`, nextDepth));\n }\n\n lines.push(indent('};', depth));\n }\n\n return lines;\n};\n\nconst processLinkFields = (\n linkFields: EnrichedLinkQuery[],\n $path: string,\n dotPath: string,\n depth: number,\n schema: EnrichedBormSchema,\n) => {\n const nextDepth = depth + 1;\n const lines: string[] = [];\n\n for (const linkField of linkFields) {\n const { $fields, $as, $justId, $idNotIncluded, $filterByUnique, $playedBy, $thing, $sort, $offset, $limit } =\n linkField;\n const queryPath = linkField[QueryPath];\n const $metaData = `$metadata:{as:${$as},justId:${\n $justId ? 'T' : 'F'\n },idNotIncluded:${$idNotIncluded},filterByUnique:${$filterByUnique}}`;\n lines.push(indent(`\"${dotPath}.${$metaData}.${linkField.$var}\": {`, depth));\n lines.push(indent('match', nextDepth));\n const $linkVar = `${$path}${separator}${linkField.$var}`;\n lines.push(indent(`$${$linkVar} isa ${linkField.$thing};`, nextDepth));\n\n if (linkField.$filter || linkField.$id) {\n const idField = getIdFieldKey(schema, linkField);\n const withId = linkField.$id ? { [idField]: linkField.$id } : {};\n const withIdFilter = { ...linkField.$filter, ...withId };\n lines.push(\n buildFilter({\n $filter: withIdFilter,\n $var: $linkVar,\n $thing: linkField.$thing,\n schema,\n depth: nextDepth,\n }),\n );\n }\n\n const sorter = buildSorter({ schema, $thing, $var: $linkVar, $sort, depth: nextDepth });\n\n if (sorter) {\n lines.push(sorter.match);\n }\n\n if (linkField.$target === 'role') {\n // a. intermediary\n lines.push(\n indent(\n `$${$path}_intermediary (${linkField.$plays}: $${$path}, ${$playedBy.plays}: $${$linkVar}) isa ${linkField.$intermediary};`,\n nextDepth,\n ),\n );\n } else {\n // b. no intermediary\n lines.push(\n indent(\n // TODO: There can't be multiple \"isa\" for the same variable\n // TODO: There can't be multiple relation constraints for the same variable. The filter may contain multiple relation constraints.\n `$${$linkVar} (${linkField.$plays}: $${$path});`,\n nextDepth,\n ),\n );\n }\n\n if ($fields) {\n const randomId = `M_${uuidv4()}`;\n lines.push(indent(`?queryPath${randomId} = \"${queryPath}\";`, nextDepth)); ///queryPath => to inject metadata in the response, in this case only the path\n lines.push(indent('fetch', nextDepth));\n lines.push(indent(`?queryPath${randomId} as \"queryPath\";`, nextDepth)); ///queryPath => to recover metadata in the response\n\n const dataFields = $fields?.filter((f) => f.$fieldType === 'data') as EnrichedAttributeQuery[];\n if (dataFields && dataFields.length > 0) {\n lines.push(...processDataFields(dataFields, $linkVar, nextDepth));\n }\n\n const linkFields = $fields?.filter((f) => f.$fieldType === 'link') as EnrichedLinkQuery[];\n if (linkFields && linkFields.length > 0) {\n lines.push(...processLinkFields(linkFields, $linkVar, `${$path}.${linkField.$var}`, nextDepth, schema));\n }\n\n const roleFields = $fields?.filter((f) => f.$fieldType === 'role') as EnrichedRoleQuery[];\n if (roleFields && roleFields.length > 0) {\n lines.push(...processRoleFields(roleFields, $linkVar, `${$path}.${linkField.$var}`, nextDepth, schema));\n }\n }\n\n if (sorter) {\n lines.push(sorter.sort);\n }\n\n if (typeof $offset === 'number') {\n lines.push(indent(`offset ${$offset};`, nextDepth));\n }\n\n if (typeof $limit === 'number') {\n lines.push(indent(`limit ${$limit};`, nextDepth));\n }\n\n lines.push(indent('};', depth));\n }\n\n return lines;\n};\n\nconst normalizeSorter = (sort: { field: string; desc?: boolean } | string) => {\n if (typeof sort === 'string') {\n return {\n field: sort,\n desc: false,\n };\n }\n return { ...sort, desc: sort.desc ?? false };\n};\n\nconst buildSorter = (props: {\n $var: string;\n $thing: string;\n schema: EnrichedBormSchema;\n $sort?: ({ field: string; desc?: boolean } | string)[];\n depth: number;\n}) => {\n const { $var, $thing, schema, $sort, depth } = props;\n\n const thing = getSchemaByThing(schema, $thing);\n const sortMatch: string[] = [];\n const sorter: string[] = [];\n\n $sort?.forEach((sort) => {\n const s = normalizeSorter(sort);\n const df = thing.dataFields?.find((df) => df.path === s.field);\n if (!df) {\n throw new Error(`\"${$thing}\" does not have data field \"${s.field}\"`);\n }\n const attrVar = `${s.field}_${uuidv4()}`;\n sortMatch.push(indent('{', depth));\n sortMatch.push(indent(`$${$var} has ${df.dbPath} $${attrVar}_1;`, depth + 1));\n sortMatch.push(indent('not {', depth + 1));\n sortMatch.push(indent(`$${$var} has ${df.dbPath} $${attrVar}_2;`, depth + 2));\n sortMatch.push(indent(`$${attrVar}_2 < $${attrVar}_1;`, depth + 2));\n sortMatch.push(indent('};', depth + 1));\n sortMatch.push(indent(`?${attrVar}_ = $${attrVar}_1;`, depth + 1));\n sortMatch.push(indent('} or {', depth));\n sortMatch.push(indent(`not { $${$var} has ${df.dbPath} $${attrVar}_1; };`, depth + 1));\n // TODO: This is a workaround to put things with undefined attribute at the end.\n // \"~\" is the last non-control char (DEC 126) in ASCII.\n sortMatch.push(indent(`?${attrVar}_ = \"~\";`, depth + 1));\n sortMatch.push(indent('};', depth));\n sortMatch.push(indent(`?${attrVar} = ?${attrVar}_;`, depth));\n const order = s.desc ? 'desc' : 'asc';\n sorter.push(`?${attrVar} ${order}`);\n });\n\n if (sortMatch.length === 0) {\n return;\n }\n\n return {\n match: sortMatch.join(''),\n sort: indent(`sort ${sorter.join(', ')};`, depth),\n };\n};\n","import { isArray } from 'radash';\nimport { assertDefined, getCurrentSchema } from '../../../helpers';\nimport type {\n BormConfig,\n EnrichedBQLQuery,\n EnrichedBormEntity,\n EnrichedBormRelation,\n EnrichedBormSchema,\n RawBQLQuery,\n} from '../../../types';\nimport { QueryPath } from '../../../types/symbols';\n\ntype TypeDbResponse = Record<string, any>; //TODO\n\nexport const parseTQLQuery = async (props: {\n rawBqlRequest: RawBQLQuery[];\n enrichedBqlQuery: EnrichedBQLQuery[];\n schema: EnrichedBormSchema;\n config: BormConfig;\n rawTqlRes: Record<string, any>[][];\n}): Promise<TypeDbResponse[]> => {\n const { enrichedBqlQuery, rawBqlRequest, schema, config, rawTqlRes } = props;\n\n if (!enrichedBqlQuery) {\n throw new Error('BQL request not enriched');\n }\n if (!rawTqlRes) {\n throw new Error('TQL query not executed');\n }\n\n return rawTqlRes.map((res, i) => {\n const rawBql = rawBqlRequest[i];\n const query = enrichedBqlQuery[i];\n const parsed = realParse(res, rawBql, query, schema, config);\n return parsed;\n });\n};\n\nconst realParse = (\n res: any[],\n rawBqlRequest: RawBQLQuery,\n enrichedBqlQuery: EnrichedBQLQuery,\n schema: EnrichedBormSchema,\n config: BormConfig,\n) => {\n if (res.length === 0) {\n // This is a little inconsistent. In the prop if the result is empty\n // we return null or undefined based on the config, but the test\n // expect the top level result to always return null.\n // always return\n // return config.query?.returnNulls ? null : undefined;\n return null;\n }\n if (enrichedBqlQuery.$filterByUnique) {\n return parseObj(res[0], rawBqlRequest, schema, config);\n }\n return res.map((item) => parseObj(item, rawBqlRequest, schema, config));\n};\n\nconst parseObj = (res: any, rawBqlRequest: RawBQLQuery, schema: EnrichedBormSchema, config: BormConfig) => {\n const { dataFields, currentSchema, linkFields, roleFields, schemaValue } = parseFields(res, schema);\n\n const parsedDataFields = parseDataFields(dataFields, currentSchema, config);\n const parsedLinkFields = parseLinkFields(linkFields, schema, config);\n const parsedRoleFields = parseRoleFields(roleFields, schema, config);\n const idNotIncluded = rawBqlRequest?.$fields?.every(\n (field) => !currentSchema?.idFields?.includes(typeof field === 'string' ? field : field.$path),\n );\n\n const finalObj = {\n ...parsedLinkFields,\n ...parsedRoleFields,\n ...schemaValue,\n ...(!config.query?.noMetadata && rawBqlRequest.$id\n ? // TODO: This line is wrong: the id field may not be \"id\"; $id may be an array of string;\n { $id: Array.isArray(rawBqlRequest.$id) ? parsedDataFields.id : rawBqlRequest.$id }\n : {}),\n ...(idNotIncluded\n ? Object.fromEntries(Object.entries(parsedDataFields).filter(([key]) => !currentSchema?.idFields?.includes(key)))\n : parsedDataFields),\n };\n\n return finalObj;\n};\n\nconst parseFields = (obj: any, schema: EnrichedBormSchema) => {\n const keys = Object.keys(obj);\n // Find and process $dataFields\n const dataFieldsKey = keys.find((key) => key.endsWith('.$dataFields'));\n const multiValKeys = keys.filter((key) => key.endsWith('.$multiVal'));\n if (!dataFieldsKey) {\n throw new Error('No dataFields');\n }\n\n //if there are multiValKeys, we replace it in the Object\n if (multiValKeys?.length > 0) {\n multiValKeys.forEach((multiValKey) => {\n const multiValKeyWithout$multiVal = multiValKey.replace(/\\.\\$multiVal$/, '');\n const realValue = obj[multiValKey][0][multiValKeyWithout$multiVal].attribute; //there is an easier way for sure\n // eslint-disable-next-line no-param-reassign\n obj[dataFieldsKey][multiValKeyWithout$multiVal] = realValue;\n });\n }\n const dataFields = obj[dataFieldsKey];\n\n const metaDataKey = dataFieldsKey.split('.')[dataFieldsKey.split('.').length - 2];\n dataFields.$metaData = metaDataKey;\n\n if (dataFields.length === 0) {\n throw new Error('No dataFields');\n }\n\n const dataFieldsThing = dataFields.type;\n const schemaValue = {\n $thing: dataFieldsThing.label,\n $thingType: dataFieldsThing.root,\n [QueryPath]: obj.queryPath.value,\n };\n const node = { [`$${schemaValue.$thingType}`]: schemaValue.$thing };\n const currentSchema = getCurrentSchema(schema, node);\n\n // Process linkFields and roleFields\n const linkFields = keys\n .filter((key) => {\n const $key = assertDefined(key.split('.').pop());\n return !key.endsWith('.$dataFields') && currentSchema.linkFields?.some((o) => o.path === $key);\n })\n .map((key) => {\n const $key = assertDefined(key.split('.').pop());\n const linkField = assertDefined(currentSchema.linkFields?.find((o) => o.path === $key));\n return {\n $linkFields: obj[key],\n $key,\n $metaData: key.split('.')[key.split('.').length - 2],\n $cardinality: linkField.cardinality,\n };\n });\n\n const roleFields = keys\n .filter((key) => {\n const role = key.split('.').pop();\n return (\n role && !key.endsWith('.$dataFields') && currentSchema.thingType === 'relation' && currentSchema.roles?.[role]\n );\n })\n .map((key) => {\n const role = assertDefined(key.split('.').pop());\n return {\n $roleFields: obj[key],\n $key: role,\n $metaData: key.split('.')[key.split('.').length - 2],\n $cardinality: (currentSchema as EnrichedBormRelation).roles[role].cardinality,\n };\n });\n\n return { dataFields, schemaValue, currentSchema, linkFields, roleFields };\n};\n\nconst parseDataFields = (\n dataFields: any,\n currentSchema: EnrichedBormEntity | EnrichedBormRelation,\n config: BormConfig,\n) => {\n const { $metaData } = dataFields;\n const { as: $as } = parseArrayMetadata($metaData);\n\n // Process the main data fields\n const mainDataFields = Object.entries(dataFields as Record<string, any>)\n .filter(([key]) => key !== 'type' && !key.startsWith('$'))\n .flatMap(([key, value]) => {\n const field = currentSchema.dataFields?.find((f) => f.path === key || f.dbPath === key);\n const isIdField = key === 'id';\n const $asKey = Array.isArray($as) ? $as.find((o) => o[key])?.[key] : key;\n\n let fieldValue: any;\n if (field?.cardinality === 'ONE') {\n fieldValue = value[0] ? value[0].value : config.query?.returnNulls ? null : undefined;\n if (field.contentType === 'DATE' || (field.contentType === 'FLEX' && value[0].type.value_type === 'datetime')) {\n /// date fields need to be converted to ISO format including the timezone\n fieldValue = fieldValue ? `${fieldValue}Z` : fieldValue;\n } else if (field.contentType === 'JSON') {\n fieldValue = fieldValue && JSON.parse(fieldValue);\n }\n if (isIdField) {\n return [\n [$asKey, fieldValue],\n ['$id', fieldValue],\n ].filter(([_, v]) => v !== undefined);\n }\n } else if (field?.cardinality === 'MANY') {\n if (!isArray(value)) {\n throw new Error('Typedb fetch has changed its format');\n }\n if (value.length === 0) {\n return config.query?.returnNulls ? [[$asKey, null]] : []; //return nothing unles the returnNulls flag is set\n }\n if (field.contentType === 'DATE') {\n fieldValue = value.map((o) => {\n return `${o.value}Z`;\n });\n } else if (field.contentType === 'FLEX') {\n fieldValue = value.map((o) => {\n if (o.type.value_type === 'datetime') {\n return `${o.value}Z`;\n }\n return o.value;\n });\n } else if (field.contentType === 'JSON') {\n fieldValue = value.map((o) => {\n return o.value && JSON.parse(o.value);\n });\n } else {\n fieldValue = value.map((o) => {\n return o.value;\n });\n }\n }\n return [[$asKey, fieldValue]].filter(([_, v]) => v !== undefined);\n });\n\n return Object.fromEntries([...mainDataFields]);\n};\n\nconst parseRoleFields = (\n roleFields: { $roleFields: any[]; $key: string; $metaData: string; $cardinality: 'MANY' | 'ONE' }[],\n schema: EnrichedBormSchema,\n config: BormConfig,\n) => {\n const roleFieldsRes: Record<string, any> = {};\n\n roleFields.forEach((roleField) => {\n const { $roleFields, $metaData, $cardinality } = roleField;\n const { as, justId, idNotIncluded, filterByUnique } = parseMetaData($metaData);\n\n if (as === null) {\n return;\n }\n\n const items = $roleFields.map((item) => {\n const { dataFields, currentSchema, linkFields, roleFields, schemaValue } = parseFields(item, schema);\n const parsedDataFields = parseDataFields(dataFields, currentSchema, config);\n\n if (justId === 'T') {\n return parsedDataFields.id;\n }\n const parsedLinkFields = parseLinkFields(linkFields, schema, config);\n const parsedRoleFields = parseRoleFields(roleFields, schema, config);\n const resDataFields = { ...parsedDataFields };\n if (idNotIncluded === 'true') {\n currentSchema?.idFields?.forEach((field) => delete resDataFields[field]);\n }\n return {\n ...resDataFields,\n ...parsedLinkFields,\n ...parsedRoleFields,\n ...schemaValue,\n };\n });\n\n if (items.length > 0) {\n roleFieldsRes[as] = $cardinality === 'MANY' && filterByUnique === 'false' ? items : items[0];\n } else if (config.query?.returnNulls) {\n roleFieldsRes[as] = null;\n }\n });\n\n return roleFieldsRes;\n};\n\nconst parseLinkFields = (\n linkFields: { $linkFields: any[]; $key: string; $metaData: string; $cardinality: 'MANY' | 'ONE' }[],\n schema: EnrichedBormSchema,\n config: BormConfig,\n) => {\n const linkFieldsRes: Record<string, any> = {};\n\n linkFields.forEach((linkField) => {\n const { $linkFields, $metaData, $cardinality } = linkField;\n const { as, justId, idNotIncluded, filterByUnique } = parseMetaData($metaData);\n\n if (as === null) {\n return;\n }\n\n const items = $linkFields.map((item) => {\n const { dataFields, currentSchema, linkFields, roleFields, schemaValue } = parseFields(item, schema);\n const parsedDataFields = parseDataFields(dataFields, currentSchema, config);\n\n if (justId === 'T') {\n return parsedDataFields.id;\n }\n const parsedLinkFields = parseLinkFields(linkFields, schema, config);\n const parsedRoleFields = parseRoleFields(roleFields, schema, config);\n const resDataFields = { ...parsedDataFields };\n\n if (idNotIncluded === 'true') {\n currentSchema.idFields?.forEach((field) => delete resDataFields[field]);\n }\n\n return {\n ...resDataFields,\n ...parsedLinkFields,\n ...parsedRoleFields,\n ...schemaValue,\n };\n });\n\n // eslint-disable-next-line no-param-reassign\n linkFieldsRes[as] =\n items.length > 0\n ? $cardinality === 'MANY' && filterByUnique === 'false'\n ? items\n : items[0]\n : config.query?.returnNulls\n ? null\n : undefined;\n });\n\n return linkFieldsRes;\n};\n\n//todo: add this metadata as a typedb \"?\" var instead\nconst parseMetaData = (str: string) => {\n const asRegex = /as:([a-zA-Z0-9_\\-·]+)/;\n const justIdRegex = /justId:([a-zA-Z0-9_\\-·]+)/;\n const idNotIncludedRegex = /idNotIncluded:([a-zA-Z0-9_\\-·]+)/;\n const filterByUniqueRegex = /filterByUnique:([a-zA-Z0-9_\\-·]+)/;\n\n const asMatch = str.match(asRegex);\n const justIdMatch = str.match(justIdRegex);\n const idNotIncludedMatch = str.match(idNotIncludedRegex);\n const filterByUniqueMatch = str.match(filterByUniqueRegex);\n\n return {\n as: asMatch ? asMatch[1] : null,\n justId: justIdMatch ? justIdMatch[1] : null,\n idNotIncluded: idNotIncludedMatch ? idNotIncludedMatch[1] : null,\n filterByUnique: filterByUniqueMatch ? filterByUniqueMatch[1] : null,\n };\n};\n\nconst parseArrayMetadata = (str: string) => {\n try {\n const convertToJson = (str: string) => {\n // Remove $metadata: from the string\n let jsonString = str.replace('$metadata:', '');\n\n // Enclose keys in quotes\n jsonString = jsonString.replace(/([a-zA-Z0-9_\\-·]+)(?=:)/g, '\"$1\"');\n\n // Enclose values in quotes, handling nested object values separately\n jsonString = jsonString.replace(/:(\\s*)([a-zA-Z0-9_\\-·]+)/g, (_match, p1, p2) => {\n // Check if the value is part of an object\n if (/^{.*}$/.test(p2)) {\n return `:${p2}`;\n }\n return `:${p1}\"${p2}\"`;\n });\n\n // Convert array elements (non-object) to strings\n jsonString = jsonString.replace(/\\[([^\\]]+)\\]/g, (_match, p1) => {\n return `[${p1\n .split(',')\n .map((s: string) => {\n // Check if element is an object-like structure\n if (s.trim().startsWith('{') && s.trim().endsWith('}')) {\n return s.trim();\n }\n return `\"${s.trim()}\"`;\n })\n .join(',')}]`;\n });\n\n return jsonString;\n };\n const converted = convertToJson(str);\n\n const parsed = JSON.parse(converted);\n return parsed;\n } catch (e) {\n console.error(e);\n return { as: [] };\n }\n};\n","import { SessionType } from 'typedb-driver';\nimport type { BormConfig, DBHandles } from '../../types';\n\nexport const getSessionOrOpenNewOne = async (dbHandles: DBHandles, config: BormConfig) => {\n const singleHandlerV0 = config.dbConnectors[0].id;\n let session = dbHandles.typeDB?.get(singleHandlerV0)?.session;\n const client = dbHandles.typeDB?.get(singleHandlerV0)?.client;\n\n if (!session || !session.isOpen()) {\n if (!client) {\n throw new Error('Client not found');\n }\n session = await client.session(config.dbConnectors[0].dbName, SessionType.DATA);\n dbHandles.typeDB?.set(singleHandlerV0, { client, session });\n }\n\n return { client, session };\n};\n","import { 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 tqlRequest: string[];\n dbHandles: DBHandles;\n config: BormConfig;\n}): Promise<any> => {\n const { tqlRequest, dbHandles, config } = props;\n //TODO condition this only to have infer if there are virtual fields (without default fn)\n const options = new TypeDBOptions();\n options.infer = true;\n\n const { session } = await getSessionOrOpenNewOne(dbHandles, config);\n const transaction = await session.transaction(TransactionType.READ, options);\n\n //console.log('query', JSON.stringify(tqlRequest, null, 2));\n const [err, resArray] = await tryit(parallel)(tqlRequest.length, tqlRequest, async (queryString) => {\n const tqlStream = transaction.query.fetch(queryString as string);\n const tqlRes = await tqlStream.collect();\n return tqlRes;\n });\n\n if (err) {\n await transaction.rollback();\n const error = err as AggregateError;\n throw new Error(`Error running TQL query: ${error.errors}`);\n }\n await transaction.close();\n\n // todo: type the rawTqlRes\n return resArray;\n};\n","/* eslint-disable no-param-reassign */\nimport { produce } from 'immer';\nimport { traverse } from 'object-traversal';\nimport { isArray, isObject } from 'radash';\nimport { v4 as uuidv4 } from 'uuid';\nimport { getCardinality, getCurrentSchema, getSymbols } from '../../../helpers';\nimport type {\n BQLResponse,\n BormConfig,\n DBHandles,\n EnrichedBQLMutationBlock,\n EnrichedBormSchema,\n FilledBQLMutationBlock,\n} from '../../../types';\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 blocks: EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[],\n schema: EnrichedBormSchema,\n config: BormConfig,\n dbHandles: DBHandles,\n) => {\n const operatorKeys = ['$eq', '$ne', '$in', '$nin', '$gt', '$gte', '$lt', '$lte', '$exists'];\n\n const getFieldKeys = (block: FilledBQLMutationBlock | Partial<FilledBQLMutationBlock>, noDataFields?: boolean) => {\n return Object.keys(block).filter((key) => {\n if (!key.startsWith('$') && !operatorKeys.includes(key) && block[key] !== undefined) {\n if (noDataFields) {\n const currentSchema = getCurrentSchema(schema, block);\n if (currentSchema.dataFields?.find((field) => field.path === key)) {\n return false;\n }\n return true;\n }\n return true;\n }\n return false;\n });\n };\n\n /// 1. Check if pre-query should be run\n\n if (!blocks) {\n throw new Error('[BQLE-M-PQ-1] No blocks found');\n }\n\n if (config.mutation?.preQuery === false) {\n return;\n }\n\n const ops: string[] = [];\n\n traverse(blocks, ({ parent, key, value }) => {\n if (parent && key && !key.includes('$') && !operatorKeys.includes(key) && isObject(parent)) {\n const values = Array.isArray(parent[key]) ? parent[key] : [parent[key]];\n values.forEach((val) => {\n if (isObject(val)) {\n if (parent.$op !== 'create') {\n // @ts-expect-error todo\n if (!ops.includes(val.$op)) {\n // @ts-expect-error todo\n ops.push(val.$op);\n }\n } else {\n // @ts-expect-error todo\n if (val.$op === 'delete' || val.$op === 'unlink') {\n // @ts-expect-error todo\n throw new Error(`Cannot ${val.$op} under a create`);\n }\n }\n }\n });\n } else if (!parent && isObject(value)) {\n // @ts-expect-error todo\n if (!ops.includes(value.$op)) {\n // @ts-expect-error todo\n ops.push(value.$op);\n }\n }\n });\n\n if (\n !ops.includes('delete') &&\n !ops.includes('unlink') &&\n !ops.includes('replace') &&\n !ops.includes('update') &&\n !ops.includes('link')\n ) {\n return;\n }\n /// 2. Convert mutation into query for all children nodes\n\n const convertMutationToQuery = (blocks: FilledBQLMutationBlock[]) => {\n const processBlock = (block: FilledBQLMutationBlock, root?: boolean) => {\n let $fields: any[] = [];\n const filteredBlock = {};\n const toRemoveFromRoot = ['$op', '$bzId', '$parentKey'];\n const toRemove = ['$relation', '$entity', '$id', ...toRemoveFromRoot];\n for (const k in block) {\n if (toRemoveFromRoot.includes(k)) {\n continue;\n }\n if (toRemove.includes(k) && !root) {\n continue;\n }\n if (!k.includes('$') && (isObject(block[k]) || Array.isArray(block[k]))) {\n const v = extractValueFromFilter(block[k]) as FilledBQLMutationBlock;\n\n if (Array.isArray(v) && v.length > 0) {\n v.forEach((opBlock) => {\n const newField = {\n $path: k,\n ...processBlock(opBlock),\n ...(opBlock.$filter && { $as: opBlock.$bzId }),\n };\n // todo: make sure it keeps the one with the most keys\n if (!$fields.find((o) => o.$path === newField.$path && !o.$filter)) {\n $fields = [...$fields, newField];\n }\n });\n } else {\n const newField = {\n $path: k,\n ...processBlock(v),\n ...(!v.$filter && { $as: v.$bzId }),\n };\n $fields = [...$fields, newField];\n }\n } else {\n // @ts-expect-error todo\n filteredBlock[k] = block[k];\n }\n }\n return {\n ...filteredBlock,\n $fields,\n };\n };\n return blocks.map((block) => processBlock(block, true));\n };\n\n const preQueryReq = convertMutationToQuery(Array.isArray(blocks) ? blocks : [blocks]);\n //console.log('preQueryReq', JSON.stringify(preQueryReq, null, 2));\n\n /// 3. Perform query\n const res = await runQueryMachine(\n // @ts-expect-error todo\n preQueryReq,\n schema,\n { ...config, query: { ...config.query, returnNulls: true } },\n dbHandles,\n );\n const preQueryRes = res.bql.res as BQLResponse[];\n\n const getObjectPath = (parent: any, key: string) => {\n const idField: string | string[] = parent.$id || parent.id || parent.$bzId;\n if (parent.$objectPath) {\n const { $objectPath } = parent;\n\n const root = $objectPath?.beforePath || 'root';\n const ids = Array.isArray($objectPath.ids) ? `[${$objectPath.ids}]` : $objectPath.ids;\n const final = `${root}.${ids}___${$objectPath.key}`;\n\n const new$objectPath = {\n beforePath: final,\n ids: idField,\n key,\n };\n return new$objectPath;\n }\n return {\n beforePath: 'root',\n ids: idField,\n key,\n };\n\n // return `${parent.$objectPath || 'root'}${idField ? `.${idField}` : ''}${preQueryPathSeparator}${key}`;\n };\n\n const objectPathToKey = ($objectPath: ObjectPath, hardId?: string) => {\n const root = $objectPath?.beforePath || 'root';\n if (typeof root !== 'string') {\n throw new Error('[PQ]objectPathToKey: root is not a string');\n }\n const ids = hardId ? hardId : Array.isArray($objectPath?.ids) ? `[${$objectPath?.ids}]` : $objectPath?.ids;\n\n const final = `${root}.${ids}___${$objectPath?.key}`;\n\n return final;\n };\n\n const convertManyPaths = (input: string) => {\n // Check if the string contains square brackets\n if (input.includes('[') && input.includes(']')) {\n // Extract the part before the brackets, the items within the brackets, and the part after the brackets\n const [prefix, itemsWithBrackets, suffix] = input.split(/[[\\]]/);\n const items = itemsWithBrackets.split(',');\n\n // Combine each item with the prefix and suffix and return the array\n return items.map((item) => `${prefix}${item}${suffix}`);\n }\n // If no brackets are present, return an array with the original string\n return [input];\n };\n\n // 4. Create cache of paths\n type Cache<K extends string> = {\n [key in K]: {\n $objectPath: ObjectPath;\n $ids: string[];\n } | null;\n };\n const cache: Cache<string> = {};\n const cachePaths = (\n blocks: FilledBQLMutationBlock | FilledBQLMutationBlock[],\n ): FilledBQLMutationBlock | FilledBQLMutationBlock[] => {\n return produce(blocks, (draft) =>\n traverse(draft, ({ key, parent }) => {\n if (parent && key && parent.$id && !key.includes('$')) {\n const newObjPath = getObjectPath(parent, key);\n const cacheKey = objectPathToKey(newObjPath);\n if (Array.isArray(parent[key])) {\n // @ts-expect-error todo\n const cacheArray = [];\n parent[key].forEach((val) => {\n if (isObject(val)) {\n // @ts-expect-error todo\n // eslint-disable-next-line no-param-reassign\n val.$objectPath = newObjPath;\n // @ts-expect-error todo\n cacheArray.push(val.$id.toString());\n } else if (val) {\n cacheArray.push(val.toString());\n }\n });\n // @ts-expect-error todo\n cache[cacheKey] = { $objectPath: newObjPath, $ids: cacheArray };\n } else {\n const val = parent[key];\n if (isObject(val)) {\n // @ts-expect-error todo\n cache[cacheKey] = { $objectPath: newObjPath, $ids: [val.$id.toString()] };\n\n // @ts-expect-error todo\n // eslint-disable-next-line no-param-reassign\n val.$objectPath = newObjPath;\n } else if (val) {\n cache[cacheKey] = { $objectPath: newObjPath, $ids: [val.toString()] };\n } else if (val === null) {\n cache[cacheKey] = null; //we clarify a null entry, which means it was queried, but found empty (to be pruned)\n }\n }\n }\n }),\n );\n };\n //@ts-expect-error - todo\n cachePaths(preQueryRes || {});\n\n /// 5. Fill all nodes with their correct object paths\n\n const fillObjectPaths = (\n blocks: FilledBQLMutationBlock | FilledBQLMutationBlock[],\n ): FilledBQLMutationBlock | FilledBQLMutationBlock[] => {\n return produce(blocks, (draft) =>\n traverse(draft, ({ key, value, parent }) => {\n if (\n parent &&\n key &&\n !key.includes('$') &&\n (Array.isArray(value) || isObject(value)) &&\n !Array.isArray(parent)\n ) {\n if (Array.isArray(parent[key])) {\n parent[key].forEach(\n (\n o: string | { $objectPath: ObjectPath; $parentIsCreate: boolean; [grandChildOfCreateSymbol]: boolean },\n ) => {\n if (typeof o !== 'string') {\n // eslint-disable-next-line no-param-reassign\n o.$objectPath = getObjectPath(parent, key);\n // eslint-disable-next-line no-param-reassign\n o.$parentIsCreate = parent.$op === 'create';\n // eslint-disable-next-line no-param-reassign\n o[grandChildOfCreateSymbol] =\n parent.$parentIsCreate || parent[Symbol.for('grandChildOfCreate') as any];\n }\n },\n );\n } else if (isObject(parent[key])) {\n //@ts-expect-error - todo\n parent[key].$parentIsCreate = parent.$op === 'create';\n //@ts-expect-error - todo\n parent[key][Symbol.for('grandChildOfCreate')] =\n parent.$parentIsCreate || parent[Symbol.for('grandChildOfCreate') as any];\n //@ts-expect-error - todo\n parent[key].$objectPath = getObjectPath(parent, key);\n }\n }\n }),\n );\n };\n\n const bqlWithObjectPaths = fillObjectPaths(blocks);\n\n /// 6. For every node that doesn't have a $id, give it the correct ones based on the pre-query\n\n const fillIds = (blocks: FilledBQLMutationBlock[]) => {\n const newBlocks: FilledBQLMutationBlock[] = [];\n blocks.forEach((block) => {\n // todo: if block has a filter, do a filter search in the cache\n if (!block.$id && !block.id && !block.$tempId) {\n if (block.$filter) {\n const cacheKey = objectPathToKey({ ...block.$objectPath, key: block.$bzId });\n const cacheFound = cache[cacheKey];\n\n if (cacheFound) {\n const ids = Array.isArray(cacheFound.$ids) ? cacheFound.$ids : [cacheFound.$ids];\n ids.forEach((id) => {\n const newBlock = { ...block, $id: id, $bzId: `T4_${uuidv4()}`, $filterBzId: block.$bzId };\n newBlocks.push(newBlock);\n });\n }\n } else {\n const cacheKey = objectPathToKey(block.$objectPath);\n const cacheFound = cache[cacheKey];\n\n if (cacheFound) {\n cacheFound?.$ids?.forEach((id) => {\n const newBlock = { ...block, $id: id, $bzId: `T4_${uuidv4()}` };\n newBlocks.push(newBlock);\n });\n } else {\n newBlocks.push(block);\n }\n }\n } else {\n newBlocks.push(block);\n }\n });\n\n const finalBlocks = newBlocks.map((block) => {\n const newBlock = { ...block };\n getFieldKeys(newBlock, true).forEach((key) => {\n const subBlocks = Array.isArray(newBlock[key]) ? newBlock[key] : [newBlock[key]];\n const newSubBlocks = fillIds(subBlocks);\n newBlock[key] = newSubBlocks;\n });\n return newBlock;\n });\n return finalBlocks;\n };\n\n const bqlFilledIds = fillIds(Array.isArray(bqlWithObjectPaths) ? bqlWithObjectPaths : [bqlWithObjectPaths]);\n const newFilled = fillObjectPaths(bqlFilledIds);\n\n /// 7. For every node that is a multiple (many $ids or $filter), find all combinations that are based on the pre-query\n\n const splitBzIds = (blocks: FilledBQLMutationBlock[]) => {\n const processBlocks = (blocks: FilledBQLMutationBlock[]) => {\n // a. Filter operations with multiples and operations without multiples\n const getOperationsWithMultiples = (opBlocks: FilledBQLMutationBlock[]) => {\n const operationWithMultiples: FilledBQLMutationBlock[] = [];\n const operationWithoutMultiples: FilledBQLMutationBlock[] = [];\n const otherOps: FilledBQLMutationBlock[] = [];\n\n opBlocks.forEach((opBlock) => {\n const keys = getFieldKeys(opBlock, true);\n\n //keys length > 0 means its not a leaf node\n if (keys.length > 0) {\n let hasMultiple = false;\n keys.forEach((key) => {\n const opBlocks: FilledBQLMutationBlock[] = Array.isArray(opBlock[key]) ? opBlock[key] : [opBlock[key]];\n\n // todo: check for $filters\n const blockMultiples: FilledBQLMutationBlock[] = opBlocks.filter(\n (ob) => !ob.$id && !ob.id && typeof opBlock === 'object',\n );\n if (blockMultiples.length) {\n hasMultiple = true;\n }\n });\n if (hasMultiple) {\n operationWithMultiples.push(opBlock);\n } else {\n operationWithoutMultiples.push(opBlock);\n }\n } else {\n /// LEAF NODE, no keys so it probably being deleted , unlinked, or linked\n if (opBlock.$id) {\n //no need to split if it already has an $id, or an array of ids, we can keep its bzId\n otherOps.push({ ...opBlock, $bzId: opBlock.$tempId || opBlock.$bzId });\n } else {\n //PQ1 is the case where its a multi but does not need to be pruned, so we are not adding the $ids\n otherOps.push({ ...opBlock, $bzId: opBlock.$tempId || `PQ1_${uuidv4()}` });\n }\n }\n });\n return { operationWithMultiples, operationWithoutMultiples, otherOps };\n };\n const { operationWithMultiples, operationWithoutMultiples, otherOps } = getOperationsWithMultiples(blocks);\n // b. For multiples get all possible combinations\n const getAllKeyCombinations = (obj: FilledBQLMutationBlock) => {\n const getDataFields = () => {\n const dataFieldObj: any = {};\n for (const key in obj) {\n const currentSchema = getCurrentSchema(schema, obj);\n if (!key.startsWith('$') && currentSchema.dataFields?.find((df) => df.path === key)) {\n dataFieldObj[key] = obj[key];\n }\n }\n return dataFieldObj;\n };\n const dataFieldObj = getDataFields();\n\n // Get all keys, but only use non-$ keys for generating combinations\n const allKeys = Object.keys(obj);\n const combinableKeys = getFieldKeys(obj, true);\n const allCombinations: Partial<FilledBQLMutationBlock>[] = [];\n const generateCombinations = (index: number, currentObj: Partial<FilledBQLMutationBlock>) => {\n if (index === combinableKeys.length) {\n // Construct the full object with the current id\n const fullObj = { ...currentObj };\n allKeys.forEach((key) => {\n if (key.startsWith('$')) {\n fullObj[key] = obj[key];\n }\n });\n allCombinations.push({ ...fullObj, ...dataFieldObj });\n return;\n }\n\n // Include the current key\n const newObjInclude = {\n ...currentObj,\n [combinableKeys[index]]: obj[combinableKeys[index]],\n ...getSymbols(currentObj),\n ...dataFieldObj,\n };\n generateCombinations(index + 1, newObjInclude);\n // Exclude the current key and move to the next\n generateCombinations(index + 1, currentObj);\n };\n generateCombinations(0, { ...getSymbols(obj) });\n return allCombinations;\n };\n\n /// For all multiples we will do know all the combinations, to see if they will fail or not\n const crossReferencedOperations: Partial<FilledBQLMutationBlock>[] = [];\n operationWithMultiples.forEach((multipleBlock) => {\n const allCombinations: Partial<FilledBQLMutationBlock>[] = getAllKeyCombinations(multipleBlock);\n const combinationsToKeep: Partial<FilledBQLMutationBlock>[] = [];\n // c. Check cache and prune combinations that don't have any ids in the cache\n allCombinations.forEach((combinationBlock) => {\n const keys = getFieldKeys(combinationBlock, true);\n\n //if its creation, we can just push it, as there will be no false match in DB\n if (combinationBlock.$op === 'create') {\n combinationsToKeep.push(combinationBlock);\n } else if (combinationBlock.$id) {\n // check result for if there exists one with the kinds of keys\n const cacheKey = objectPathToKey(combinationBlock.$objectPath);\n const foundKeys: { key: string; ids: string[] }[] = [];\n keys.forEach((key) => {\n const childKey = `${cacheKey.includes('undefined') ? 'root' : cacheKey}.${combinationBlock.$id}${preQueryPathSeparator}${key}`;\n const cacheFound = cache[childKey];\n const hasRemove =\n combinationBlock[key].filter(\n (subBlock: FilledBQLMutationBlock) =>\n subBlock.$op === 'unlink' || subBlock.$op === 'delete' || subBlock.$op === 'update',\n ).length > 0;\n if (hasRemove) {\n if (cacheFound?.$ids) {\n foundKeys.push({ key, ids: cacheFound.$ids });\n }\n } else {\n foundKeys.push({ key, ids: [''] });\n }\n });\n\n if (foundKeys.length === keys.length && !combinationsToKeep.find((c) => c.$id === combinationBlock.$id)) {\n combinationsToKeep.push(combinationBlock);\n } else {\n // only prune the child batched operation\n const newBlock = { ...combinationBlock, $bzId: combinationBlock.$tempId || `T4_${uuidv4()}` };\n keys.forEach((key) => {\n // keeping ops that aren't batched (non-multiples)\n const newOps = combinationBlock[key].filter((op: FilledBQLMutationBlock) => op.$id);\n if (newOps.length > 0) {\n // @ts-expect-error todo\n newBlock[key] = newOps;\n } else {\n // @ts-expect-error todo\n newBlock[key] = undefined;\n }\n });\n const newBlockKeys = getFieldKeys(newBlock, true);\n if (newBlockKeys.length > 0) {\n combinationsToKeep.push(newBlock);\n }\n }\n }\n // When the block is not from the root level\n else if (combinationBlock.$objectPath) {\n const parentKey = objectPathToKey(combinationBlock.$objectPath);\n\n // d. get all ids of the parent block\n const idsOfParent = cache[parentKey]?.$ids || [];\n idsOfParent.forEach((id) => {\n const foundKeys: { key: string; ids: string[] }[] = [];\n keys.forEach((key) => {\n const cacheKey = `${parentKey}.${id}${preQueryPathSeparator}${key}`;\n const cacheFound = cache[cacheKey];\n if (cacheFound) {\n foundKeys.push({ key, ids: cacheFound.$ids });\n }\n });\n\n // If this is the combination with no keys, create an opBlock per remaining $id\n if (keys.length === 0) {\n const remainingIds = idsOfParent.filter((id) => !combinationsToKeep.find((c) => c.$id === id));\n remainingIds.forEach((id) => {\n combinationsToKeep.push({\n ...combinationBlock,\n $id: id,\n $bzId: combinationBlock.$tempId || `PQT2_${uuidv4()}`,\n });\n });\n } else if (foundKeys.length === keys.length && !combinationsToKeep.find((c) => c.$id === id)) {\n keys.forEach((k) => {\n const cKey = `${objectPathToKey(combinationBlock.$objectPath)}.${id}${preQueryPathSeparator}${k}`;\n const $ids = cache[cKey]?.$ids || [];\n /// making sure other ops are included as well, replace the old batched op with these new ops\n const originalOp = combinationBlock[k].find((b: FilledBQLMutationBlock) => !b.$id);\n const newBlocks = [\n ...$ids.map((id) => {\n return {\n ...originalOp,\n $id: id,\n $objectPath: {\n beforePath: combinationBlock.$objectPath.beforePath,\n ids: id,\n key: k,\n },\n };\n }),\n ...combinationBlock[k].filter((b: FilledBQLMutationBlock) => b.$id),\n ];\n if (newBlocks.length > 0) {\n combinationBlock[k] = newBlocks;\n }\n });\n\n combinationsToKeep.push({\n ...combinationBlock,\n $id: id,\n $bzId: combinationBlock.$tempId || `PQ3_${uuidv4()}`,\n });\n }\n });\n } else {\n combinationsToKeep.push(combinationBlock);\n }\n });\n combinationsToKeep.forEach((c) => {\n crossReferencedOperations.push(c);\n });\n });\n //console.log('crossReferencedOperations', crossReferencedOperations);\n\n // filter out odd leftover cases\n const allOperations = [...crossReferencedOperations, ...operationWithoutMultiples, ...otherOps];\n const filteredOperations = allOperations.filter((b) => {\n const hasKeys = getFieldKeys(b).length > 0;\n if (hasKeys) {\n return true;\n }\n if (b.$op === 'update') {\n return false;\n }\n return true;\n });\n\n // e. Recursion\n const finalBlocks = filteredOperations.map((block) => {\n const newBlock = { ...block };\n getFieldKeys(newBlock, true).forEach((key) => {\n const subBlocks = Array.isArray(newBlock[key]) ? newBlock[key] : [newBlock[key]];\n const newSubBlocks = processBlocks(subBlocks);\n newBlock[key] = newSubBlocks;\n });\n return newBlock;\n });\n\n return finalBlocks;\n };\n return processBlocks(blocks);\n };\n\n const splitBql = splitBzIds(Array.isArray(newFilled) ? newFilled : [newFilled]);\n //console.log('_____3splitBql', JSON.stringify(splitBql, null, 2));\n\n /// 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 const processReplaces = (blocks: FilledBQLMutationBlock[]) => {\n return blocks.map((block) => {\n const fields = getFieldKeys(block, true);\n const newBlock = { ...block };\n\n fields.forEach((field) => {\n const opBlocks: FilledBQLMutationBlock[] = Array.isArray(block[field]) ? block[field] : [block[field]];\n const newOpBlocks: FilledBQLMutationBlock[] = [];\n let replaceIds: string[] = [];\n let createIds: string[] = [];\n\n // todo: Step 1, get all replaces and their ids as replaceIds, just push blocks that aren't replaces\n // @ts-expect-error todo\n let replaceBlock: FilledBQLMutationBlock = {};\n const cardinality = getCardinality(schema, block, field);\n\n opBlocks\n .filter((opBlock) => opBlock)\n .forEach((opBlock) => {\n // todo: if it is create and this field is cardinality one\n if (opBlock.$op === 'replace' && opBlock.$id) {\n // eslint-disable-next-line prefer-destructuring\n replaceBlock = opBlock;\n if (Array.isArray(opBlock.$id)) {\n replaceIds = [...replaceIds, ...opBlock.$id];\n } else {\n replaceIds.push(opBlock.$id);\n }\n } else if (opBlock.$op === 'create' && cardinality === 'ONE' && opBlock.id) {\n replaceBlock = opBlock;\n if (Array.isArray(opBlock.id)) {\n createIds = [...replaceIds, ...opBlock.id];\n } else {\n createIds.push(opBlock.id);\n }\n } else {\n newOpBlocks.push(opBlock);\n }\n });\n\n const cacheKey = objectPathToKey(replaceBlock.$objectPath);\n const cacheKeys = convertManyPaths(cacheKey);\n const foundKeys = cacheKeys.map((cacheKey) => {\n return cache[cacheKey];\n });\n\n // todo: Step 2, get cacheIds for this\n let cacheIds: string[] = [];\n foundKeys\n .filter((k) => k !== null && k !== undefined)\n .forEach((key) => {\n cacheIds = [...cacheIds, ...(key?.$ids || [])];\n });\n\n // todo: Step 3, unlinkIds contain all cacheIds that aren't found in replaceIds\n // todo: Step 4, linkIds are all replaceIds that aren't found in the cacheIds\n const unlinkIds = cacheIds.filter((id) => !replaceIds.includes(id));\n const linkIds = replaceIds.filter((id) => !cacheIds.includes(id));\n const symbols = getSymbols(replaceBlock);\n if (unlinkIds.length > 0) {\n newOpBlocks.push({\n ...replaceBlock,\n $op: 'unlink',\n $id: unlinkIds,\n $bzId: replaceBlock.$tempId || `T4_${uuidv4()}`,\n id: undefined,\n ...symbols,\n });\n }\n if (linkIds.length > 0) {\n linkIds.forEach((id) => {\n newOpBlocks.push({\n ...replaceBlock,\n $op: 'link',\n $id: id,\n $bzId: replaceBlock.$tempId || `T5_${uuidv4()}`,\n ...symbols,\n });\n });\n }\n if (createIds.length > 0) {\n createIds.forEach((id) => {\n newOpBlocks.push({\n ...replaceBlock,\n $op: 'create',\n id,\n $bzId: replaceBlock.$tempId || `T6_${uuidv4()}`,\n ...symbols,\n });\n });\n }\n\n newBlock[field] = processReplaces(newOpBlocks);\n });\n return newBlock;\n });\n };\n\n // @ts-expect-error todo\n const processedReplaces = fillObjectPaths(processReplaces(fillObjectPaths(splitBql)));\n\n /// 9. Throw any error case\n\n const throwErrors = (\n blocks: FilledBQLMutationBlock | FilledBQLMutationBlock[],\n ): FilledBQLMutationBlock | FilledBQLMutationBlock[] => {\n return produce(blocks, (draft) =>\n traverse(draft, (context) => {\n const { key, value, parent, meta } = context;\n\n // a. only work for role fields that are arrays or objects\n if (\n key &&\n parent &&\n !key?.includes('$') &&\n key !== '$filter' &&\n !meta.nodePath?.includes('.$filter.') && //ignore children of $filter\n (Array.isArray(value) || isObject(value)) &&\n !Array.isArray(parent)\n ) {\n const values: FilledBQLMutationBlock[] = Array.isArray(value) ? value : [value];\n\n values.forEach((thing) => {\n // todo: If user op is trying to link something that already has it's role filled by something else\n\n const $objectPath = thing.$filter ? { ...thing.$objectPath, key: thing.$filterBzId } : thing.$objectPath;\n const cacheKey = objectPathToKey($objectPath);\n const cacheFound = cache[cacheKey];\n\n const processArrayIdsFound = (arrayOfIds: string[], cacheOfIds: string[]) => {\n return arrayOfIds.every((id) => cacheOfIds.includes(id));\n };\n // todo: if filter, use bzId\n const isOccupied = thing.$id\n ? Array.isArray(thing.$id)\n ? processArrayIdsFound(thing.$id, cacheFound?.$ids ? cacheFound.$ids : [])\n : cacheFound?.$ids?.includes(thing.$id)\n : cacheFound;\n const cardinality = getCardinality(schema, parent, thing.$objectPath.key);\n\n if (thing.$op === 'link' && isOccupied && cardinality === 'ONE') {\n throw new Error(\n `[BQLE-Q-M-2] Cannot link on:\"${objectPathToKey(thing.$objectPath)}\" because it is already occupied.`,\n );\n }\n\n if (thing.$op) {\n switch (thing.$op) {\n case 'delete':\n if (!isOccupied) {\n if (!config.mutation?.ignoreNonexistingThings) {\n throw new Error(\n `[BQLE-Q-M-2] Cannot delete $id:\"${thing.$id}\" because it is not linked to $id:\"${parent.$id}\"`,\n );\n }\n }\n break;\n case 'update':\n if (!isOccupied) {\n if (!config.mutation?.ignoreNonexistingThings) {\n throw new Error(\n `[BQLE-Q-M-2] Cannot update $id:\"${thing.$id}\" because it is not linked to $id:\"${parent.$id}\"`,\n );\n }\n }\n break;\n case 'unlink':\n if (!isOccupied) {\n if (!config.mutation?.ignoreNonexistingThings) {\n throw new Error(\n `[BQLE-Q-M-2] Cannot unlink $id:\"${thing.$id}\" because it is not linked to $id:\"${parent.$id}\"`,\n );\n }\n }\n break;\n case 'link':\n if (isOccupied) {\n throw new Error(\n `[BQLE-Q-M-2] Cannot link $id:\"${thing.$id}\" because it is already linked to $id:\"${parent.$id}\"`,\n );\n }\n break;\n\n default:\n break;\n }\n }\n });\n }\n }),\n );\n };\n\n throwErrors(processedReplaces);\n\n /// 10. Refill paths that are needed for the rest of the pipeline\n\n const fillPaths = (\n blocks: FilledBQLMutationBlock | FilledBQLMutationBlock[],\n ): FilledBQLMutationBlock | FilledBQLMutationBlock[] => {\n return produce(blocks, (draft) =>\n traverse(draft, (context) => {\n const { value, meta } = context;\n if (isObject(value)) {\n // @ts-expect-error todo\n value[Symbol.for('path') as any] = meta.nodePath;\n // @ts-expect-error todo\n value.$objectPath = undefined;\n // @ts-expect-error todo\n value.$parentIsCreate = undefined;\n }\n }),\n );\n };\n\n /// 11. Sort tree\n\n const filledPaths = fillPaths(processedReplaces);\n const filledPathsArray = Array.isArray(filledPaths) ? filledPaths : [filledPaths];\n const copy = [...filledPathsArray];\n const sortedArray = copy.sort((a: FilledBQLMutationBlock, b: FilledBQLMutationBlock) => {\n if (a.$op === 'create' && b.$op !== 'create') {\n return -1; // Move 'a' to an index lower than 'b' (to the top of the array)\n }\n if (a.$op !== 'create' && b.$op === 'create') {\n return 1; // Move 'b' to an index lower than 'a'\n }\n return 0; // Keep the original order if both have the same $op value or don't involve 'create'\n });\n\n return sortedArray;\n};\n\nconst extractValueFromFilter = (filterValue: any): any => {\n if (isObject(filterValue) && !isArray(filterValue)) {\n if ('$eq' in filterValue) {\n return filterValue.$eq;\n }\n // Handle other operators if needed\n }\n return filterValue;\n};\n","import type {\n BQLMutation,\n BQLMutationBlock,\n BormConfig,\n DBHandles,\n EnrichedBQLMutationBlock,\n EnrichedBormSchema,\n} from '../../types';\nimport { enrichBQLMutation } from './bql/enrich';\nimport { parseBQLMutation } from './bql/parse';\nimport { mutationPreQuery } from './bql/preQuery';\n\nimport { logDebug } from '../../logger';\nimport { VERSION } from '../../version';\nimport { createMachine, guard, interpret, invoke, reduce, state, transition } from 'robot3';\nimport { preHookDependencies } from './bql/enrichSteps/preHookDependencies';\nimport type { FlatBqlMutation } from './bql/flatter';\nimport { flattenBQLMutation } from './bql/flatter';\nimport { dependenciesGuard } from './bql/guards/dependenciesGuard';\nimport { stringify } from './bql/stringify';\nimport { runSurrealDbMutationMachine } from './surql/machine';\nimport { runTypeDbMutationMachine } from './tql/machine';\n\nconst final = state;\n\nexport type bqlMutationContext = {\n raw: BQLMutationBlock | BQLMutationBlock[];\n enriched: EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[];\n flat: FlatBqlMutation;\n things: any[];\n edges: any[];\n res: any[];\n};\n\ntype MachineContext = {\n bql: bqlMutationContext;\n schema: EnrichedBormSchema;\n config: BormConfig;\n handles: DBHandles;\n depthLevel: number;\n error: string | null;\n};\n\n// Reducer\n// ============================================================================\n\nconst updateBqlReq = (ctx: MachineContext, event: any) => {\n if (!event.data) {\n ///when preQueries return nothing, that should not affect the ctx\n return ctx;\n }\n return {\n ...ctx,\n bql: { ...ctx.bql, enriched: event.data },\n };\n};\n\nconst updateThingsEdges = (ctx: MachineContext, event: any) => {\n return {\n ...ctx,\n bql: {\n ...ctx.bql,\n things: event.data.mergedThings,\n edges: event.data.mergedEdges,\n },\n };\n};\n\nconst updateBQLFlat = (ctx: MachineContext, event: any) => {\n return {\n ...ctx,\n bql: {\n ...ctx.bql,\n flat: event.data || 'test',\n },\n };\n};\n\nconst updateBQLRes = (ctx: MachineContext, event: any) => {\n return {\n ...ctx,\n bql: {\n ...ctx.bql,\n res: event.data,\n },\n };\n};\n\n// Actors\n// ============================================================================\n\nconst enrich = async (ctx: MachineContext) => {\n logDebug(\n `>>> mutationMachine/enrich[${VERSION}]`,\n JSON.stringify(Object.keys(ctx.bql.enriched).length ? ctx.bql.enriched : ctx.bql.raw),\n );\n const enriched = Object.keys(ctx.bql.enriched).length\n ? enrichBQLMutation(ctx.bql.enriched, ctx.schema, ctx.config)\n : enrichBQLMutation(ctx.bql.raw, ctx.schema, ctx.config);\n return enriched;\n};\n\nconst preQuery = async (ctx: MachineContext) => {\n logDebug(`>>> mutationMachine/preQuery[${VERSION}]`, JSON.stringify(ctx.bql.enriched));\n return mutationPreQuery(ctx.bql.enriched, ctx.schema, ctx.config, ctx.handles);\n};\n\nconst preQueryDependencies = async (ctx: MachineContext) => {\n logDebug(`>>> mutationMachine/preQueryDependencies[${VERSION}]`, JSON.stringify(ctx.bql.enriched));\n return preHookDependencies(ctx.bql.enriched, ctx.schema, ctx.config, ctx.handles);\n};\n\nconst parseBQL = async (ctx: MachineContext) => {\n logDebug(`>>> mutationMachine/parseBQL[${VERSION}]`, JSON.stringify(ctx.bql.enriched));\n return parseBQLMutation(ctx.bql.enriched, ctx.schema);\n};\n\nconst flattenBQL = async (ctx: MachineContext) => {\n logDebug(`>>> mutationMachine/flattenBQL[${VERSION}]`, JSON.stringify(ctx.bql.enriched));\n return flattenBQLMutation(ctx.bql.enriched, ctx.schema);\n};\n\n// Guards\n// ============================================================================\nconst requiresPreQuery = (ctx: MachineContext) => {\n const { dbConnectors } = ctx.config;\n if (dbConnectors.length !== 1) {\n throw new Error('Multiple providers not supported yet in mutations');\n }\n const [{ provider }] = dbConnectors;\n\n if (provider === 'typeDB') {\n return true;\n }\n if (provider === 'surrealDB') {\n return false;\n }\n throw new Error(`Unsupported provider ${provider}.`);\n};\n\nconst requiresPreHookDependencies = (ctx: MachineContext) => {\n return dependenciesGuard(ctx.bql.enriched);\n};\n\n// Transitions\n// ============================================================================\n\nconst errorTransition = transition(\n 'error',\n 'error',\n reduce((ctx: MachineContext, event: any) => {\n return {\n ...ctx,\n error: event.error,\n };\n }),\n);\n\nexport const machine = createMachine(\n 'stringify',\n {\n stringify: invoke(\n async (ctx: MachineContext) => {\n logDebug(`>>> mutationMachine/stringify[${VERSION}]`, JSON.stringify(ctx.bql.raw));\n return stringify(ctx.bql.raw, ctx.schema);\n },\n transition('done', 'enrich', reduce(updateBqlReq)),\n errorTransition,\n ),\n enrich: invoke(\n enrich,\n transition('done', 'preQuery', guard(requiresPreQuery), reduce(updateBqlReq)),\n transition('done', 'parseBQL', reduce(updateBqlReq)),\n errorTransition,\n ),\n preQuery: invoke(\n preQuery,\n transition('done', 'preHookDependencies', guard(requiresPreHookDependencies), reduce(updateBqlReq)),\n transition('done', 'parseBQL', reduce(updateBqlReq)),\n errorTransition,\n ),\n preHookDependencies: invoke(\n preQueryDependencies,\n transition('done', 'enrich', reduce(updateBqlReq)),\n errorTransition,\n ),\n parseBQL: invoke(parseBQL, transition('done', 'flattenBQL', reduce(updateThingsEdges)), errorTransition),\n flattenBQL: invoke(flattenBQL, transition('done', 'adapter', reduce(updateBQLFlat)), errorTransition),\n adapter: invoke(\n async (ctx: MachineContext) => {\n logDebug(\n `>>> mutationMachine/adapter[${VERSION}]`,\n JSON.stringify({ enriched: ctx.bql.enriched, flat: ctx.bql.flat }),\n );\n //todo: do this properly with multiple providers\n const { dbConnectors } = ctx.config;\n if (dbConnectors.length !== 1) {\n throw new Error('Multiple providers not supported yet in mutations');\n }\n const [{ provider }] = dbConnectors;\n\n if (provider === 'typeDB') {\n return runTypeDbMutationMachine(\n ctx.bql.raw,\n ctx.bql.enriched,\n ctx.bql.things,\n ctx.bql.edges,\n ctx.schema,\n ctx.config,\n ctx.handles,\n );\n }\n if (provider === 'surrealDB') {\n //console.log('things!', ctx.bql.flat.things);\n //console.log('edges!', ctx.bql.flat.edges);\n return runSurrealDbMutationMachine(\n ctx.bql.raw,\n ctx.bql.enriched,\n ctx.bql.flat,\n ctx.schema,\n ctx.config,\n ctx.handles,\n );\n }\n throw new Error(`Unsupported provider ${provider}.`);\n },\n transition('done', 'success', reduce(updateBQLRes)),\n errorTransition,\n ),\n success: final(),\n error: final(),\n },\n (ctx: MachineContext) => ctx,\n);\n\nexport const awaitMachine = async (context: MachineContext) => {\n return new Promise<MachineContext>((resolve, reject) => {\n interpret(\n machine,\n (service) => {\n if (service.machine.state.name === 'success') {\n resolve(service.context);\n }\n if (service.machine.state.name === 'error') {\n reject(service.context);\n }\n },\n context,\n );\n });\n};\n\nexport const runMutationMachine = async (\n mutation: BQLMutation,\n schema: EnrichedBormSchema,\n config: BormConfig,\n handles: DBHandles,\n) => {\n return awaitMachine({\n bql: {\n raw: mutation,\n enriched: {} as EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[],\n things: [],\n edges: [],\n flat: {\n things: [],\n edges: [],\n arcs: [],\n references: [],\n },\n res: [],\n },\n schema: schema as EnrichedBormSchema,\n config: config,\n handles: handles,\n depthLevel: 0,\n error: null,\n });\n};\n","import { isObject } from 'radash';\nimport { getSchemaByThing } from '../../../../helpers';\nimport type {\n BQLResponse,\n BormConfig,\n DBHandles,\n EnrichedBQLMutationBlock,\n EnrichedBormEntity,\n EnrichedBormRelation,\n EnrichedBormSchema,\n EnrichedDataField,\n EnrichedLinkField,\n EnrichedRoleField,\n FilledBQLMutationBlock,\n} from '../../../../types';\nimport { DBNode } from '../../../../types/symbols';\nimport { runQueryMachine } from '../../../query/queryMachine';\n\nexport const preHookDependencies = async (\n blocks: EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[],\n schema: EnrichedBormSchema,\n config: BormConfig,\n dbHandles: DBHandles,\n) => {\n const mutations = Array.isArray(blocks) ? blocks : [blocks];\n const transformationPreQueryReq = mutations.map((m) => mutationToQuery(m, true));\n const res = await runQueryMachine(\n // @ts-expect-error todo\n transformationPreQueryReq,\n schema,\n config,\n dbHandles,\n );\n const transformationPreQueryRes = res.bql.res as BQLResponse[];\n return mutations.map((mut, i) => {\n const thing = getSchemaByThing(schema, mut.$thing);\n return setDbNode({\n mut: mut as Mutation,\n node: transformationPreQueryRes[i] as DbValue,\n schema,\n thing,\n });\n });\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 const $fields: Record<string, FieldQuery> = {};\n block.$fields?.forEach((f: any) => {\n if (typeof f === 'string') {\n $fields[f] = f;\n } else {\n $fields[f.$path] = f;\n }\n });\n const filteredBlock: { $fields?: FieldQuery[]; [k: `$${string}`]: any } = {};\n\n for (const k in block) {\n if (FORBIDDEN_ROOT_QUERY_PROP.has(k)) {\n continue;\n }\n if (FORBIDDEN_SUB_QUERY_PROP.has(k) && !root) {\n continue;\n }\n const v = block[k];\n if (k.startsWith('$')) {\n filteredBlock[k as `$${string}`] = v;\n } else if (Array.isArray(v)) {\n // NOTE: If a link/role field mutation is an array, we only look at the first mutation block.\n // Each mutation block may have totally different structures.\n if (v[0] && typeof v[0] === 'object') {\n $fields[k] = {\n $path: k,\n ...mutationToQuery(v[0], false),\n };\n }\n } else if (isObject(v)) {\n $fields[k] = {\n $path: k,\n ...mutationToQuery(v as any, false),\n };\n }\n }\n\n filteredBlock.$fields = Object.values($fields);\n\n return filteredBlock;\n};\n\ntype Mutation = {\n $id: string;\n $fields?: FieldQuery[];\n} & {\n [k: string]: string | number | null | Mutation | Mutation[];\n};\n\ntype MutationWithDBNode = {\n $id: string;\n [DBNode]?: DbNode;\n [k: string]: string | number | null | MutationWithDBNode | MutationWithDBNode[];\n};\n\nconst setDbNode = (props: {\n mut: Mutation | Mutation[];\n node: DbValue | DbValue[];\n schema: EnrichedBormSchema;\n thing: EnrichedBormEntity | EnrichedBormRelation;\n}) => {\n const { mut, node, schema, thing } = props;\n const fieldMap = getFieldMap(thing);\n const subNodeMap = getNodeMap(node);\n if (Array.isArray(mut)) {\n return mut.map((subMut) => {\n const subNode = subNodeMap[subMut.$id];\n if (!subNode) {\n return subMut;\n }\n return setDbNodeSingle({\n mut: subMut,\n node: subNode,\n schema,\n thing,\n ...fieldMap,\n });\n });\n }\n const subNode = subNodeMap[mut.$id];\n return setDbNodeSingle({\n mut,\n node: subNode,\n schema,\n thing,\n ...fieldMap,\n });\n};\n\nconst setDbNodeSingle = (props: {\n mut: Mutation;\n node?: DbNode;\n schema: EnrichedBormSchema;\n thing: EnrichedBormEntity | EnrichedBormRelation;\n dataFieldMap: Record<string, EnrichedDataField>;\n linkFieldMap: Record<string, EnrichedLinkField>;\n roleFieldMap: Record<string, EnrichedRoleField>;\n}) => {\n const { mut, node, schema, thing, dataFieldMap, linkFieldMap, roleFieldMap } = props;\n const { $fields: _, ..._mut } = mut;\n if (!node) {\n return _mut;\n }\n const dbNode = getDbNode({\n $fields: mut.$fields,\n node,\n schema,\n thing,\n dataFieldMap,\n linkFieldMap,\n roleFieldMap,\n });\n const newMut: MutationWithDBNode = { ..._mut, [DBNode]: dbNode };\n\n // Update sub-mutation that has pre-queried db node.\n for (const key in mut) {\n if (key.startsWith('$')) {\n continue;\n }\n const value = mut[key];\n const df = dataFieldMap[key];\n if (df || !value || typeof value !== 'object') {\n newMut[key] = value;\n continue;\n }\n const $thing = linkFieldMap[key]?.oppositeLinkFieldsPlayedBy?.[0]?.thing || roleFieldMap[key]?.playedBy?.[0]?.thing;\n if (!$thing) {\n throw new Error(`\"${thing.name}\" does not have field \"${key}\"`);\n }\n const subThing = getSchemaByThing(schema, $thing);\n newMut[key] = setDbNode({\n mut: value,\n schema,\n node: node[key],\n thing: subThing,\n });\n }\n\n return newMut;\n};\n\ntype DbValue = string | number | boolean | null | DbNode;\n\ntype DbNode = {\n $id: string;\n [k: string]: DbValue | DbValue[];\n};\n\n/**\n * Extract the response of field queries from a superset query response.\n */\nconst getDbNode = (props: {\n $fields?: FieldQuery[];\n node: DbNode;\n schema: EnrichedBormSchema;\n thing: EnrichedBormEntity | EnrichedBormRelation;\n dataFieldMap: Record<string, EnrichedDataField>;\n linkFieldMap: Record<string, EnrichedLinkField>;\n roleFieldMap: Record<string, EnrichedRoleField>;\n}) => {\n const { $fields, node, schema, thing, dataFieldMap, linkFieldMap, roleFieldMap } = props;\n const fields = $fields ? $fields : getAllFields(thing);\n const newNode: DbNode = { $id: node.$id };\n\n fields.forEach((f) => {\n const isObj = typeof f !== 'string';\n const key = isObj ? f.$path : f;\n const value = node[key];\n const df = dataFieldMap[key];\n if (df) {\n newNode[key] = value;\n return;\n }\n const $thing = linkFieldMap[key]?.oppositeLinkFieldsPlayedBy?.[0]?.thing || roleFieldMap[key]?.playedBy?.[0]?.thing;\n if (!$thing) {\n throw new Error(`\"${thing.name}\" does not have field \"${key}\"`);\n }\n if (!isObj) {\n if (value) {\n newNode[key] = Array.isArray(value) ? value.map(getIdFromDbValue) : getIdFromDbValue(value);\n }\n return;\n }\n const subThing = getSchemaByThing(schema, $thing);\n const fieldMap = getFieldMap(subThing);\n newNode[key] = Array.isArray(value)\n ? value.map((v) => getDbNodeFromDbValue({ ...fieldMap, $fields: f.$fields, value: v, schema, thing: subThing }))\n : getDbNodeFromDbValue({ ...fieldMap, $fields: f.$fields, value, schema, thing: subThing });\n });\n\n return newNode;\n};\n\n/**\n * Get data field, link field, and role paths of a thing.\n */\nconst getAllFields = (thing: EnrichedBormEntity | EnrichedBormRelation): string[] => {\n const fields: string[] = [];\n thing.dataFields?.forEach((f) => {\n fields.push(f.path);\n });\n thing.linkFields?.forEach((f) => {\n fields.push(f.path);\n });\n if (thing.thingType === 'relation') {\n fields.push(...Object.keys(thing.roles));\n }\n return 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 if (typeof value === 'string') {\n return value;\n }\n if (!value || typeof value !== 'object') {\n throw new Error(`\"${JSON.stringify(value)}\" is neither an id nor an object with prop \"$id\"`);\n }\n if (typeof value.$id !== 'string') {\n throw new Error(`\"${JSON.stringify(value)}\" is does not have prop \"$id\"`);\n }\n return value.$id;\n};\n\n/**\n * Throw an error if it's not a db node.\n */\nconst getDbNodeFromDbValue = (props: {\n $fields?: FieldQuery[];\n value: DbValue;\n schema: EnrichedBormSchema;\n thing: EnrichedBormEntity | EnrichedBormRelation;\n dataFieldMap: Record<string, EnrichedDataField>;\n linkFieldMap: Record<string, EnrichedLinkField>;\n roleFieldMap: Record<string, EnrichedRoleField>;\n}) => {\n const { value } = props;\n if (!value || typeof value !== 'object' || !value.$id) {\n throw new Error(`\"${JSON.stringify(props)}\" is neither an id nor an object with prop \"$id\"`);\n }\n return getDbNode({ ...props, node: value });\n};\n\nconst getFieldMap = (thing: EnrichedBormEntity | EnrichedBormRelation) => {\n const dataFieldMap = Object.fromEntries(thing.dataFields?.map((f) => [f.path, f]) || []);\n const linkFieldMap = Object.fromEntries(thing.linkFields?.map((f) => [f.path, f]) || []);\n const roleFieldMap = thing.thingType === 'relation' ? thing.roles || {} : {};\n return { dataFieldMap, linkFieldMap, roleFieldMap };\n};\n\n/**\n * Non-DbNode(s) are ignored.\n */\nconst getNodeMap = (value: DbValue | DbValue[]) => {\n if (!Array.isArray(value)) {\n if (value && typeof value === 'object' && value.$id) {\n return { [value.$id]: value };\n }\n return {};\n }\n\n const map: Record<string, DbNode> = {};\n\n value.forEach((v) => {\n if (!v || typeof v !== 'object' || !v.$id) {\n return;\n }\n map[v.$id] = v;\n });\n\n return map;\n};\n","import { isArray, isSymbol } from 'radash';\nimport { parseValueSurrealDB } from '../../../adapters/surrealDB/parsing/values';\nimport { getCurrentFields, oFilter } from '../../../helpers';\nimport type { BormOperation, EnrichedBQLMutationBlock, EnrichedBormSchema, EnrichedLinkField } from '../../../types';\nimport { Parent } from '../../../types/symbols';\n\nexport type FlatBqlMutation = {\n things: EnrichedBQLMutationBlock[];\n edges: EnrichedBQLMutationBlock[];\n arcs: EnrichedBQLMutationBlock[];\n references: EnrichedBQLMutationBlock[];\n};\n\nexport const flattenBQLMutation = (\n tree: EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[],\n schema: EnrichedBormSchema,\n): FlatBqlMutation => {\n //console.log('>>> flattenBQLMutation', JSON.stringify({ tree, schema }));\n const result: FlatBqlMutation = {\n things: [],\n edges: [],\n arcs: [],\n references: [],\n };\n\n const traverse = (\n block: EnrichedBQLMutationBlock,\n parent?: { bzId: string; edgeField: string; tempId?: string },\n ): void => {\n if (!block?.$thing) {\n //console.log('block without $thing', block);\n //this for instance happens in flexValues inside refFields\n return;\n }\n const { $op, $bzId, $tempId } = block;\n\n const currentSchema = schema.relations[block.$thing] || schema.entities[block.$thing];\n if (!currentSchema) {\n throw new Error(`[Internal] No schema found for ${block.$thing}`);\n }\n\n const parentObj = parent?.bzId ? parent : { bzId: '', edgeField: 'root' };\n\n //const { idFields } = currentSchema;\n const { usedDataFields, usedLinkFields, usedRoleFields, usedRefFields } = getCurrentFields(currentSchema, block);\n\n //const isOne = $op === 'create' || !isArray($id);\n\n //1. THINGS\n if (['create', 'update', 'delete', 'link', 'unlink', 'match', 'replace'].includes($op)) {\n const thing = {\n ...oFilter(block, (k: string) => ![...usedRoleFields, ...usedLinkFields, ...usedRefFields].includes(k)),\n ...($op === 'link' || $op === 'unlink' || $op === 'replace' || ($op === 'update' && usedDataFields.length === 0)\n ? { $op: 'match' }\n : {}),\n ...($op === 'link' || $op === 'replace' ? {} : { [Parent]: parentObj }), //links and replaces don't read from the parent but the entire table,\n } as EnrichedBQLMutationBlock;\n\n result.things.push(thing);\n }\n\n //2. EDGES\n // 2.1 Case one direct EDGES\n\n // left side is what happens in the edge, right side is the op in the children that creates that edge op\n const operationMap = {\n link: ['link', 'create'],\n unlink: ['unlink', 'delete'],\n replace: ['replace'],\n };\n\n if (usedRoleFields) {\n const edgeMeta = oFilter(\n block,\n (k: string | symbol) => isSymbol(k) || k.startsWith('$'),\n ) as EnrichedBQLMutationBlock;\n\n usedRoleFields.forEach((role) => {\n //1 traverse them as well\n isArray(block[role])\n ? block[role].forEach((child: EnrichedBQLMutationBlock) =>\n traverse(child, { bzId: $bzId, edgeField: role, tempId: $tempId }),\n )\n : traverse(block[role], { bzId: $bzId, edgeField: role, tempId: $tempId });\n\n //2 fill the arrays\n const edges = (isArray(block[role]) ? block[role] : [block[role]]).filter(\n Boolean,\n ) as EnrichedBQLMutationBlock[]; //pre-queries add some undefineds\n\n Object.entries(operationMap).forEach(([operation, opTypes]) => {\n const filteredEdges = edges.filter((edge) => opTypes.includes(edge.$op)).map((edge) => edge.$bzId);\n\n if (filteredEdges.length > 0) {\n result.edges.push({\n ...edgeMeta,\n [role]: filteredEdges,\n $op: operation as BormOperation,\n });\n }\n });\n });\n }\n if (usedLinkFields) {\n usedLinkFields.forEach((ulf) => {\n //1 traverse them\n isArray(block[ulf])\n ? block[ulf].forEach((child: EnrichedBQLMutationBlock) =>\n traverse(child, { bzId: $bzId, edgeField: ulf, tempId: $tempId }),\n )\n : traverse(block[ulf], { bzId: $bzId, edgeField: ulf, tempId: $tempId });\n\n //2 fill the arrays\n const edgeSchema = currentSchema.linkFields?.find((lf) => lf.path === ulf) as EnrichedLinkField;\n const edges = (isArray(block[ulf]) ? block[ulf] : [block[ulf]]) as EnrichedBQLMutationBlock[];\n //console.log('edges:', edges);\n\n //case 2.2 indirect edges\n if (edgeSchema.target === 'relation') {\n Object.entries(operationMap).forEach(([operation, opTypes]) => {\n const filteredEdges = edges.filter((edge) => opTypes.includes(edge.$op));\n\n filteredEdges.forEach((edge) => {\n const edgeMeta = oFilter(\n edge,\n (k: string | symbol) => isSymbol(k) || k.startsWith('$'),\n ) as EnrichedBQLMutationBlock;\n\n result.edges.push({\n ...edgeMeta,\n [edgeSchema.plays]: $bzId,\n $op: operation as BormOperation,\n });\n });\n });\n }\n // 3. INFERRED EDGES\n if (edgeSchema.target === 'role') {\n const arcOperationMap = {\n create: ['link', 'create'],\n delete: ['unlink', 'delete'],\n replace: ['replace'],\n };\n\n Object.entries(arcOperationMap).forEach(([operation, opTypes]) => {\n const filteredEdges = edges.filter((edge) => opTypes.includes(edge.$op));\n\n if (filteredEdges.length === 0) {\n return;\n }\n\n filteredEdges.forEach((edge) => {\n const arc = {\n //technically is a multi-arc\n $thing: edgeSchema.relation,\n $thingType: 'relation' as const,\n $bzId: `arc_${edge.$bzId}`,\n [edgeSchema.plays]: $bzId,\n [edgeSchema.oppositeLinkFieldsPlayedBy[0].plays]: edge.$bzId,\n $op: operation as BormOperation,\n };\n\n result.arcs.push(arc);\n });\n });\n }\n });\n }\n if (usedRefFields) {\n usedRefFields.forEach((urf) => {\n //const { contentType } = currentSchema.refFields[urf];\n //1 traverse them to push the nested items\n isArray(block[urf])\n ? block[urf].forEach((child: EnrichedBQLMutationBlock) =>\n traverse(child, { bzId: $bzId, edgeField: urf, tempId: $tempId }),\n )\n : traverse(block[urf], { bzId: $bzId, edgeField: urf, tempId: $tempId });\n\n //2 fill the arrays. We need this with refFields as well because in surrealdb we need to apply link operations at the end in case the order is incorrect\n const children = (isArray(block[urf]) ? block[urf] : [block[urf]]).filter(\n (x) => x !== null && x !== undefined,\n ) as EnrichedBQLMutationBlock[];\n\n const childMeta = oFilter(\n block,\n (k: string | symbol) => isSymbol(k) || k.startsWith('$'),\n ) as EnrichedBQLMutationBlock;\n\n const filteredChildren = children.map((child) =>\n child.$op ? `$⟨${child.$bzId}⟩` : parseValueSurrealDB(child, 'FLEX'),\n );\n\n if (filteredChildren.length > 0) {\n result.references.push({\n ...childMeta,\n [urf]: filteredChildren,\n $op: 'replace' as BormOperation, //Probably add / replace/ remove byt lets do only replaces for now\n });\n }\n });\n }\n };\n\n const treeItems = Array.isArray(tree) ? tree : [tree];\n treeItems.forEach((item) => traverse(item));\n\n //order by $Op, first unlink, then link\n const orderedEdges = [...result.edges].sort((a, b) => {\n const order = ['unlink', 'link'];\n return order.indexOf(a.$op) - order.indexOf(b.$op);\n });\n\n //console.log('tree:', JSON.stringify(tree, null, 2));\n //console.log('flat:', JSON.stringify(result, null, 2));\n\n return {\n ...result,\n edges: orderedEdges,\n };\n};\n","import { produce } from 'immer';\nimport { getSchemaByThing } from '../../../helpers';\nimport type {\n BQLMutationBlock,\n EnrichedBQLMutationBlock,\n EnrichedBormEntity,\n EnrichedBormRelation,\n EnrichedBormSchema,\n} from '../../../types';\n\n/**\n * Convert JSON attributes into strings.\n */\nexport const stringify = (\n blocks: BQLMutationBlock | BQLMutationBlock[],\n schema: EnrichedBormSchema,\n): EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[] => {\n const result = produce(blocks, (draft) => tObject(schema, draft));\n return 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 schema: EnrichedBormSchema,\n tree: Record<string, any> | string | (Record<string, any> | string)[],\n $thing?: string,\n) => {\n if (typeof tree === 'string') {\n // It's an id.\n return;\n }\n if (Array.isArray(tree)) {\n tree.forEach((i) => tObject(schema, i, $thing));\n return;\n }\n const thing = getSchemaByThing(schema, $thing || tree.$entity || tree.$relation || tree.$thing);\n Object.entries(tree).forEach(([k]) => {\n if (k.startsWith('$') || k.startsWith('%')) {\n return;\n }\n tField(schema, tree, k, thing);\n });\n};\n\nconst tField = (\n schema: EnrichedBormSchema,\n tree: Record<string, any>,\n key: string,\n thing: EnrichedBormEntity | EnrichedBormRelation,\n) => {\n const value = tree[key];\n if (!value) {\n // Not a JSON or a thing.\n return;\n }\n const dataField = thing.dataFields?.find((f) => f.path === key);\n if (dataField) {\n if (dataField.contentType === 'JSON') {\n if (value !== null && value !== undefined) {\n // eslint-disable-next-line no-param-reassign\n tree[key] = JSON.stringify(value);\n }\n }\n return;\n }\n const linkField = thing.linkFields?.find((f) => f.path === key);\n if (linkField) {\n const $thing = linkField.oppositeLinkFieldsPlayedBy[0]?.thing;\n tObject(schema, value, $thing);\n return;\n }\n\n const refField = 'refFields' in thing && thing.refFields[key];\n if (refField) {\n //We can't know its thing beforehand\n return;\n }\n\n if (thing.thingType === 'relation') {\n const role = thing.roles[key];\n // Assume a role can be played by only one thing.\n if (!role) {\n throw new Error(`[Schema] Role ${key} in ${thing.name} is not defined`);\n }\n const [oppositeThing] = role.playedBy || [];\n if (!oppositeThing) {\n throw new Error(`Role ${role.path} in ${thing} is not played by anything`);\n }\n tObject(schema, value, oppositeThing.thing);\n }\n};\n","import { isArray } from 'radash';\nimport { buildSuqlFilter, parseFilter } from '../../../adapters/surrealDB/filters/filters';\nimport { sanitizeNameSurrealDB } from '../../../adapters/surrealDB/helpers';\nimport { parseValueSurrealDB } from '../../../adapters/surrealDB/parsing/values';\nimport { getCurrentFields, getSchemaByThing, oFilter } from '../../../helpers';\nimport type { EnrichedBQLMutationBlock, EnrichedBormRelation, EnrichedBormSchema } from '../../../types';\nimport { Parent } from '../../../types/symbols';\nimport type { FlatBqlMutation } from '../bql/flatter';\n\nexport const buildSURQLMutation = async (flat: FlatBqlMutation, schema: EnrichedBormSchema) => {\n const buildThings = (block: EnrichedBQLMutationBlock) => {\n //console.log('currentThing:', block);\n const { $filter, $thing, $bzId, $op, $id, $tempId } = block;\n\n const currentSchema = getSchemaByThing(schema, $thing);\n const { usedDataFields } = getCurrentFields(currentSchema, block);\n const { idFields } = currentSchema;\n const idValue = $id || block[idFields[0]];\n\n const sanitizedThings = (isArray($thing) ? $thing : [$thing]).map(sanitizeNameSurrealDB);\n\n const meta = oFilter(block, (k: string) => k.startsWith('$'));\n const rest = oFilter(block, (k: string) => !k.startsWith('$'));\n const restString = JSON.stringify(rest);\n const metaString = Object.entries(meta)\n .map(([key, value]) => (key === '$tempId' ? `'$tempId': '_:${value}'` : `'${key}': '${value}'`)) //todo: At some point migrate tempIds so they only use _: when not explicit.\n .join(',');\n\n const parent = block[Parent as any]; //todo\n\n const dataFieldStrings = usedDataFields\n .filter((df) => !idFields.includes(df))\n .map((df) => {\n const dataFieldSchema = currentSchema.dataFields?.find((f) => f.path === df || f.dbPath === df);\n if (!dataFieldSchema) {\n throw new Error(`Data field schema not found for ${df}`);\n }\n const value = block[df];\n if (value === null) {\n return `${df} = NONE`;\n }\n return `${df} = ${parseValueSurrealDB(value, dataFieldSchema.contentType)}`;\n })\n .filter(Boolean);\n\n const VAR = `$⟨${$tempId || $bzId}⟩`;\n\n const COND = (() => {\n if (parent?.bzId) {\n return `array::flatten($⟨${parent.bzId}⟩.⟨${parent.edgeField}⟩ || []).filter(|$v| $v != NONE).len`;\n }\n if (idValue) {\n if (isArray(idValue)) {\n return sanitizedThings.flatMap((table: string) => idValue.map((id: string) => `${table}:⟨${id}⟩`)).join(', ');\n }\n return sanitizedThings.map((table: string) => `${table}:⟨${idValue}⟩`).join(', ');\n }\n return true; // no parent, no id value, then we can run the update or deletion safely\n })();\n\n const TARGET = (() => {\n //Non root\n if (parent?.bzId) {\n const parentRef = `array::flatten($⟨${parent.bzId}⟩.⟨${parent.edgeField}⟩ || []).filter(|$v| $v != NONE)`; //needed to fix an issue where deletions fail when finding none. If we want to thow an error on undefined this might be a good place\n\n if (idValue) {\n if (isArray(idValue)) {\n return `${parentRef}[? $this.id() IN [${idValue.map((id) => `'${id}'`).join(', ')}] ]`;\n }\n return `${parentRef}[? $this.id() IN ['${idValue}'] ]`;\n }\n return parentRef;\n }\n if (idValue) {\n if (isArray(idValue)) {\n return sanitizedThings.flatMap((table: string) => idValue.map((id: string) => `${table}:⟨${id}⟩`)).join(', ');\n }\n return sanitizedThings.map((table: string) => `${table}:⟨${idValue}⟩`).join(', ');\n }\n return sanitizedThings.join(', ');\n })();\n const WHERE = $filter ? `WHERE ${buildSuqlFilter(parseFilter($filter, $thing, schema))}` : '';\n const SET = dataFieldStrings.length > 0 ? `SET ${dataFieldStrings.join(', ')}` : '';\n\n const OUTPUT = `VALUE (CREATE ONLY Delta SET input = ${restString}, meta = {${metaString}, \"$sid\": $parent.id, \"$id\": record::id($parent.id)}, after = $after, before = $before RETURN VALUE $parent.id )`;\n const DELETE_OUTPUT = 'BEFORE';\n\n if (['link', 'unlink', 'replace'].includes($op)) {\n throw new Error(\"Edge ops don't belong to things\");\n }\n if (block.$op === 'match') {\n if ($tempId) {\n return ''; //tempIds are already stored on their creation\n }\n return `LET ${VAR} = (SELECT VALUE id FROM ${TARGET} ${WHERE});`;\n }\n if (block.$op === 'create') {\n if (isArray(idValue)) {\n throw new Error('Cannot create multiple things at once');\n }\n const tableName = sanitizeNameSurrealDB($thing);\n return `LET ${VAR} = (CREATE ONLY ${tableName}:⟨${idValue}⟩ ${SET} RETURN ${OUTPUT});`;\n }\n if (block.$op === 'update') {\n return `LET ${VAR} = IF (${COND}) THEN (UPDATE ${TARGET} ${SET} ${WHERE} RETURN ${OUTPUT}) END;`;\n }\n if (block.$op === 'delete') {\n return `LET ${VAR} = IF (${COND}) THEN (DELETE ${TARGET} ${WHERE} RETURN ${DELETE_OUTPUT}) END;`;\n }\n\n throw new Error(`Unsupported operation ${block.$op}`);\n };\n\n const buildEdges = (block: EnrichedBQLMutationBlock) => {\n //console.log('currentEdge:', block);\n const { $thing, $bzId, $op, $tempId } = block;\n const currentSchema = getSchemaByThing(schema, $thing);\n const { usedRoleFields } = getCurrentFields(currentSchema, block);\n\n const VAR = `$⟨${$tempId || $bzId}⟩`;\n\n const roleFields =\n 'roles' in currentSchema\n ? usedRoleFields.flatMap((rf) => {\n const roleFieldSchema = currentSchema.roles[rf];\n if (!roleFieldSchema) {\n throw new Error(`Role field schema not found for ${rf}`);\n }\n const { cardinality } = roleFieldSchema;\n const asArrayOfVars = isArray(block[rf])\n ? block[rf].map((node: string) => `$⟨${node}⟩`)\n : [`$⟨${block[rf]}⟩`];\n\n if (cardinality === 'ONE') {\n if (asArrayOfVars.length > 1) {\n //This is ok as long as only one is a match, but we can link to several in card ONE. This is practical if we don't know the $thing for instance, we can try multiple ones\n const arrayString = `array::filter(array::flatten([${asArrayOfVars}]), |$v| !!$v)`;\n switch ($op) {\n case 'link':\n case 'replace':\n return `${rf} = ((array::len(${arrayString})==1) && ${arrayString}[0]) || ${arrayString}`; //todo: throw a custom error instead\n case 'unlink':\n return `${rf} = NONE`; //todo this is not necessarily correct if $id or $filter! Should be none only if the node has been found\n default:\n throw new Error(`Unsupported operation ${$op} for ONE cardinality`);\n }\n }\n switch ($op) {\n case 'link':\n case 'replace':\n return `${rf} = ((type::is::array(${asArrayOfVars[0]}) && array::len(${asArrayOfVars[0]})==1) && ${asArrayOfVars[0]}[0]) || ${asArrayOfVars[0]}`;\n case 'unlink':\n return `${rf} = NONE`; //todo this is not necessarily correct if $id or $filter! Should be none only if the node has been found\n default:\n throw new Error(`Unsupported operation ${$op} for ONE cardinality`);\n }\n }\n if (cardinality === 'MANY') {\n const nodesString = `array::flatten([${asArrayOfVars}])`;\n switch ($op) {\n case 'link':\n return `${rf} += ${nodesString}`;\n case 'unlink':\n return `${rf} -= ${nodesString}`;\n case 'replace':\n return `${rf} = ${nodesString}`;\n default:\n throw new Error(`Unsupported operation ${$op} for MANY cardinality`);\n }\n }\n throw new Error(`Unsupported cardinality ${cardinality}`);\n })\n : [];\n\n const roleFieldsString = roleFields.length > 0 ? `${roleFields.join(', ')}` : '';\n const SET = roleFieldsString ? `SET ${roleFieldsString}` : '';\n\n return `IF ${VAR} THEN (UPDATE ${VAR} ${SET} RETURN VALUE id) END; ${VAR};`; //todo: confirm if the WHERE is actually needed here?\n };\n\n const buildArcs = (block: EnrichedBQLMutationBlock) => {\n const { $thing, $op } = block;\n const currentSchema = getSchemaByThing(schema, $thing) as EnrichedBormRelation;\n const tableName = sanitizeNameSurrealDB($thing);\n\n const { usedRoleFields } = getCurrentFields(currentSchema, block);\n\n if (!['create', 'delete'].includes($op)) {\n throw new Error('Arcs can only be created or deleted');\n }\n\n const [roleA, roleB] = usedRoleFields;\n const thingsA = (isArray(block[roleA]) ? block[roleA] : [block[roleA]]) as string[];\n const thingsB = (isArray(block[roleB]) ? block[roleB] : [block[roleB]]) as string[];\n\n if ($op === 'create') {\n if (usedRoleFields.length !== 2) {\n throw new Error('Not supported: Arcs must have exactly 2 roles');\n }\n const rest = oFilter(block, (k: string) => !k.startsWith('$'));\n const restString = JSON.stringify(rest);\n\n const OUTPUT = `(CREATE ONLY Delta SET input = ${restString}, meta = {\"$sid\": $parent.id, \"$id\": record::id($parent.id)}, after = $after, before = $before RETURN VALUE $parent.id )`;\n\n const roleOneSchema = currentSchema.roles[roleA];\n const isMany1 = roleOneSchema.cardinality === 'MANY';\n\n const roleTwoSchema = currentSchema.roles[roleB];\n const isMany2 = roleTwoSchema.cardinality === 'MANY';\n\n /*const thingsAString = thingsA.map((thingA) => `$⟨${thingA}⟩`).join(', ');\n\t\t\tconst thingsAArrayString = `array::flatten([${thingsAString}])`;\n\t\t\tconst thingsBString = thingsB.map((thingB) => `$⟨${thingB}⟩`).join(', ');\n\t\t\tconst thingsBArrayString = `array::flatten([${thingsBString}])`;\n*/\n /*\n\t\t\t//this is the third version, where we only create one arc per arc defined in the flatter function. Todo: Check cardinality and throw error if it is not correct instead of the || to trigger it internally\n\t\t\tconst arc = `CREATE ONLY ${tableName} SET\n\t\t\t\t\t${roleA} = ${isMany1 ? thingsAArrayString : `array::len(${thingsAArrayString}) == 1 && array::first(${thingsAArrayString}) || ${thingsAArrayString}`},\n\t\t\t\t\t${roleB} = ${isMany2 ? thingsBArrayString : `array::len(${thingsBArrayString}) == 1 && array::first(${thingsBArrayString}) || ${thingsBArrayString}`}\n\t\t\t`;\n\n\t\t\treturn arc; \n\t\t\t*/\n\n ///before it was multiple arcs, running a loop over thingsA and thingsB in addition to the surrealDB loop inside the surql\n const arcs = [\n ///This ignored cardinality and created N*M arcs. I keep it here as it could be an option in the mutation config in the future.\n\n //\n //\n `\n\t\t\t\t${!isMany1 ? `IF array::len(array::filter(array::flatten([$⟨${thingsA}⟩]), |$v| !!$v))>1 { THROW \"[Validation] Cardinality constraint: ${roleA} is cardinality one and can link a single thing.\" + <string>$⟨${thingsA}⟩; };` : ''}\n\t\t\t\t${!isMany2 ? `IF array::len(array::filter(array::flatten([$⟨${thingsB}⟩]), |$v| !!$v))>1 { THROW \"[Validation] Cardinality constraint: ${roleB} is cardinality one and can link a single thing.\" + <string>$⟨${thingsB}⟩; };` : ''}\n\t\t\t\tFOR $node1 IN array::flatten([$⟨${thingsA}⟩]) { \n\t\t\t\t\t\t\tIF $node1 {\n\t\t\t\t\t\t\t\tFOR $node2 IN array::flatten([$⟨${thingsB}⟩]) { \n\t\t\t\t\t\t\t\t\tIF $node2 {\n\t\t\t\t\t\t\t\t\t\tCREATE ONLY ${tableName} SET \n\t\t\t\t\t\t\t\t\t\t\t${roleA} = ${isMany1 ? 'array::flatten([$node1])' : '$node1'}, \n\t\t\t\t\t\t\t\t\t\t\t${roleB} = ${isMany2 ? 'array::flatten([$node2])' : '$node2'} \n\t\t\t\t\t\t\t\t\t\tRETURN ${OUTPUT}; \n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}`,\n ];\n\n ///This is the throw error version that checks the cardinality, if it is ugly but it works, it ain't ugly\n //\t`CREATE ONLY ${tableName} SET ${roleA} = ${isMany1 ? `fn::as_array($⟨${thingA}⟩)` : `array::len(fn::as_array($⟨${thingA}⟩)) == 1 && array::first(fn::as_array($⟨${thingA}⟩)) || $⟨${thingA}⟩`}, ${roleB} = ${isMany2 ? `fn::as_array($⟨${thingB}⟩)` : `array::len(fn::as_array($⟨${thingB}⟩)) == 1 && array::first(fn::as_array($⟨${thingB}⟩)) || $⟨${thingB}⟩`} RETURN ${OUTPUT};`,\n\n //console.log('arcs', arcs);\n return arcs;\n }\n\n if ($op === 'delete') {\n return `DELETE FROM ${tableName} WHERE fn::as_array(${roleA}) CONTAINSANY $⟨${thingsA}⟩ AND fn::as_array(${roleB}) CONTAINSANY $⟨${thingsB}⟩ RETURN BEFORE`;\n }\n };\n\n const buildReferences = (block: EnrichedBQLMutationBlock) => {\n const { $thing, $bzId, $op, $tempId } = block;\n const currentSchema = getSchemaByThing(schema, $thing);\n const { usedRefFields } = getCurrentFields(currentSchema, block);\n\n const VAR = `$⟨${$tempId || $bzId}⟩`;\n\n const refFields = usedRefFields.flatMap((rf) => {\n const refFieldSchema = currentSchema.refFields[rf];\n if (!refFieldSchema) {\n throw new Error(`ReferenceField schema not found for ${rf}`);\n }\n const { cardinality, contentType } = refFieldSchema;\n if (contentType === 'REF') {\n const asArrayOfVars = isArray(block[rf]) ? block[rf] : [`${block[rf]}`];\n\n if (cardinality === 'ONE') {\n if (asArrayOfVars.length > 1) {\n //This is ok as long as only one is a match, but we can link to several in card ONE. This is practical if we don't know the $thing for instance, we can try multiple ones\n const arrayString = `array::filter(array::flatten([${asArrayOfVars}]), |$v| !!$v)`;\n switch ($op) {\n case 'link':\n case 'replace':\n return `${rf} = ((array::len(${arrayString})==1) && ${arrayString}[0]) || ${arrayString}`; //todo: throw a custom error instead\n case 'unlink':\n return `${rf} = NONE`; //todo this is not necessarily correct if $id or $filter! Should be none only if the node has been found\n default:\n throw new Error(`Unsupported operation ${$op} for ONE cardinality`);\n }\n }\n switch ($op) {\n case 'link':\n case 'replace':\n return `${rf} = ((type::is::array(${asArrayOfVars[0]}) && array::len(${asArrayOfVars[0]})==1) && ${asArrayOfVars[0]}[0]) || ${asArrayOfVars[0]}`;\n case 'unlink':\n return `${rf} = NONE`; //todo this is not necessarily correct if $id or $filter! Should be none only if the node has been found\n default:\n throw new Error(`Unsupported operation ${$op} for ONE cardinality`);\n }\n }\n if (cardinality === 'MANY') {\n const nodesString = `array::flatten([${asArrayOfVars}])`;\n switch ($op) {\n case 'link':\n return `${rf} += ${nodesString}`;\n case 'unlink':\n return `${rf} -= ${nodesString}`;\n case 'replace':\n return `${rf} = ${nodesString}`;\n default:\n throw new Error(`Unsupported operation ${$op} for MANY cardinality`);\n }\n }\n throw new Error(`Unsupported cardinality ${cardinality}`);\n }\n if (contentType === 'FLEX') {\n //todo: card one check len 1\n //todo: add/remove etc\n return `${rf} = ${cardinality === 'ONE' ? `array::flatten([${block[rf]}])[0]` : `array::flatten([${block[rf]}])`}`;\n }\n });\n const refFieldsString = refFields.length > 0 ? `${refFields.join(', ')}` : '';\n const SET = refFieldsString ? `SET ${refFieldsString}` : '';\n\n return `IF ${VAR} THEN (UPDATE ${VAR} ${SET} RETURN VALUE id) END; ${VAR};`;\n };\n\n const result = [\n ...flat.things.map(buildThings),\n ...flat.edges.map(buildEdges),\n ...flat.arcs.flatMap(buildArcs),\n ...flat.references.map(buildReferences),\n ];\n //console.log('builtMutation', result);\n return result;\n};\n","import { isArray, isObject, mapEntries } from 'radash';\nimport { oFilter } from '../../../helpers';\nimport type { BormConfig, EnrichedBormSchema } from '../../../types';\n\nexport type EnrichedSURQLMutationRes = {\n meta: Record<string, any>;\n input?: Record<string, any>;\n after?: Record<string, any>;\n};\n\nexport const parseSURQLMutation = (props: {\n res: EnrichedSURQLMutationRes[][];\n schema: EnrichedBormSchema;\n config: BormConfig;\n}) => {\n const { res, config } = props;\n //console.log('res!', JSON.stringify(res, null, 2));\n\n const result = res\n .flat() //Todo: try to get it flat instead of [][]\n .filter(Boolean)\n .flatMap((b: object) => {\n if (isArray(b)) {\n return b.map((r) => {\n if (!isObject(r) || !('meta' in r)) {\n throw new Error(`Internal error: Invalid response from DB: ${JSON.stringify(r)}`);\n }\n return parseRes(r as EnrichedSURQLMutationRes, config);\n });\n }\n if (!isObject(b) || !('meta' in b)) {\n throw new Error(`Internal error: Invalid response from DB: ${JSON.stringify(b)}`);\n }\n return parseRes(b as EnrichedSURQLMutationRes, config);\n });\n return result;\n};\n\nconst parseRes = (block: EnrichedSURQLMutationRes, config: BormConfig) => {\n const thing = mapEntries(block.after || {}, (key, value) => [\n key,\n key === 'id' ? value.id : isArray(value) && value.length === 0 ? undefined : value,\n ]);\n\n const nulledAtts = oFilter(block.input || {}, (_k: string, v: any) => v === null);\n const withMetaAndId = { ...thing, ...block.meta, ...nulledAtts };\n\n if (!config.mutation?.noMetadata) {\n return withMetaAndId;\n }\n return oFilter(withMetaAndId, (k: string) => !k.startsWith('$'));\n};\n","import type { SimpleSurrealClient } from '../../../adapters/surrealDB/client';\nimport { logDebug } from '../../../logger';\nimport { VERSION } from '../../../version';\n\nexport const runSURQLMutation = async (client: SimpleSurrealClient, mutations: string[]): Promise<any[]> => {\n const batchedMutation = `\n\tBEGIN TRANSACTION;\n\t${mutations.join(';')};\n\tLET $DELTAS = SELECT * FROM Delta;\n\tDELETE Delta;\n\tRETURN $DELTAS;\n\n\tLET $LOGS = SELECT * FROM LOG;\n\tRETURN $LOGS;\n\tCOMMIT TRANSACTION; \n\t`;\n\n logDebug(`>>> batchedMutation[${VERSION}]`, JSON.stringify({ batchedMutation }));\n //console.log('mutations', mutations);\n //console.log('batchedMutation', batchedMutation);\n try {\n const result = await client.query(batchedMutation);\n return result.filter(Boolean);\n } catch (error) {\n const errorRes = await client.query_raw(batchedMutation);\n //console.log('errorRes!', JSON.stringify(errorRes, null, 2));\n const filteredErrorRes = errorRes.filter(\n (r) =>\n r.result !== 'The query was not executed due to a failed transaction' &&\n r.result !== 'There was an error when starting a new datastore transaction' &&\n r.status === 'ERR',\n );\n if (filteredErrorRes.length > 0) {\n throw new Error(`Error running SURQL mutation: ${JSON.stringify(filteredErrorRes)}`);\n }\n throw error;\n }\n};\n","import { isArray } from 'radash';\nimport type { SimpleSurrealClient } from '../../../adapters/surrealDB/client';\nimport { logDebug } from '../../../logger';\nimport type {\n BQLMutationBlock,\n BormConfig,\n DBHandles,\n EnrichedBQLMutationBlock,\n EnrichedBormSchema,\n} from '../../../types';\nimport { VERSION } from '../../../version';\nimport { createMachine, interpret, invoke, reduce, state, transition } from 'robot3';\nimport type { FlatBqlMutation } from '../bql/flatter';\nimport type { bqlMutationContext } from '../mutationMachine';\nimport { buildSURQLMutation } from './build';\nimport type { EnrichedSURQLMutationRes } from './parse';\nimport { parseSURQLMutation } from './parse';\nimport { runSURQLMutation } from './run';\n\ntype SurrealDbMachineContext = {\n bql: bqlMutationContext;\n surql: {\n mutations: string[];\n res: EnrichedSURQLMutationRes[][]; //todo maybe a flat versi\n };\n schema: EnrichedBormSchema;\n config: BormConfig;\n handles: DBHandles;\n error?: string | null;\n};\n\nconst updateBqlRes = (ctx: SurrealDbMachineContext, event: any) => {\n return {\n ...ctx,\n bql: { ...ctx.bql, res: event.data },\n };\n};\n\nconst updateSURQLMutation = (ctx: SurrealDbMachineContext, event: any) => {\n if (!event.data || !isArray(event.data) || event.data.some((d: any) => typeof d !== 'string')) {\n throw new Error('Invalid event data');\n }\n return {\n ...ctx,\n surql: {\n ...ctx.surql,\n mutations: event.data as string[],\n },\n };\n};\n\nconst updateSURQLRes = (ctx: SurrealDbMachineContext, event: any) => {\n if (!event.data || !isArray(event.data)) {\n throw new Error('Invalid event data');\n }\n return {\n ...ctx,\n surql: {\n ...ctx.surql,\n res: event.data as EnrichedSURQLMutationRes[][],\n },\n };\n};\n\nconst errorTransition = transition(\n 'error',\n 'error',\n reduce((ctx: SurrealDbMachineContext, event: any): SurrealDbMachineContext => {\n return {\n ...ctx,\n error: event.error,\n };\n }),\n);\n\nconst surrealDbMutationMachine = createMachine(\n 'buildMutation',\n {\n buildMutation: invoke(\n async (ctx: SurrealDbMachineContext) => {\n logDebug(`>>> surqlMachine/buildMutation[${VERSION}]`, JSON.stringify(ctx.bql.flat));\n return buildSURQLMutation(ctx.bql.flat, ctx.schema);\n },\n transition('done', 'runMutation', reduce(updateSURQLMutation)),\n errorTransition,\n ),\n runMutation: invoke(\n async (ctx: SurrealDbMachineContext) => {\n logDebug(`>>> surqlMachine/runMutation[${VERSION}]`, JSON.stringify(ctx.surql.mutations));\n return runSURQLMutation(\n ctx.handles.surrealDB?.get(ctx.handles.surrealDB?.keys().next().value as string)\n ?.client as SimpleSurrealClient,\n ctx.surql.mutations,\n );\n },\n transition('done', 'parseMutation', reduce(updateSURQLRes)),\n errorTransition,\n ),\n parseMutation: invoke(\n async (ctx: SurrealDbMachineContext) => {\n logDebug(`>>> surqlMachine/parseMutation[${VERSION}]`, JSON.stringify(ctx.surql.res));\n return parseSURQLMutation({ res: ctx.surql.res, config: ctx.config, schema: ctx.schema });\n },\n transition('done', 'success', reduce(updateBqlRes)),\n errorTransition,\n ),\n success: state(),\n error: state(),\n },\n (ctx: SurrealDbMachineContext) => ctx,\n);\n\nconst awaitMutationMachine = async (context: SurrealDbMachineContext) => {\n return new Promise<any[]>((resolve, reject) => {\n interpret(\n surrealDbMutationMachine,\n (service) => {\n if (service.machine.state.name === 'success') {\n resolve(service.context.bql.res);\n }\n if (service.machine.state.name === 'error') {\n reject(service.context.error);\n }\n },\n context,\n );\n });\n};\n\nexport const runSurrealDbMutationMachine = async (\n bqlRaw: BQLMutationBlock | BQLMutationBlock[],\n enrichedBql: EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[],\n bqlFlat: FlatBqlMutation,\n schema: EnrichedBormSchema,\n config: BormConfig,\n handles: DBHandles,\n) => {\n return awaitMutationMachine({\n bql: {\n raw: bqlRaw,\n enriched: enrichedBql,\n flat: bqlFlat,\n things: [],\n edges: [],\n res: [],\n },\n surql: {\n mutations: [],\n res: [],\n },\n schema: schema,\n config: config,\n handles: handles,\n error: null,\n });\n};\n","import { isDate } from 'radash';\n\nexport const parseFlexValTypeDB = (v: unknown) => {\n if (isDate(v)) {\n return { type: 'datetime', value: v.toISOString().replace('Z', '') };\n }\n if (typeof v === 'string') {\n return { type: 'string', value: `\"${v}\"` };\n }\n if (typeof v === 'number') {\n if (v % 1 !== 0) {\n return { type: 'double', value: v };\n }\n return { type: 'long', value: v };\n }\n if (typeof v === 'boolean') {\n return { type: 'boolean', value: v };\n }\n throw new Error(`Unsupported type ${typeof v}`);\n};\n","import { isArray, listify, mapEntries, shake } from 'radash';\n\nimport { parseFlexValTypeDB } from '../../../adapters/typeDB/parseFlexVal';\nimport { genId, getCurrentSchema, isBQLBlock } from '../../../helpers';\nimport type { EnrichedBQLMutationBlock, EnrichedBormSchema } from '../../../types';\nimport { EdgeType } from '../../../types/symbols';\n\nexport const buildTQLMutation = async (things: any[], edges: any[], schema: EnrichedBormSchema) => {\n if ((!things && !edges) || (!things.length && !edges.length)) {\n throw new Error('TQL request error, no things');\n }\n\n if (!schema) {\n throw new Error('No schema provided');\n }\n\n // todo: Split attributes and edges\n const nodeToTypeQL = (\n node: EnrichedBQLMutationBlock,\n ): {\n preDeletionBatch?: any[];\n deletionMatch?: string;\n insertionMatch?: string;\n deletion?: string;\n insertion?: string;\n op: string;\n } => {\n const op = node.$op as string;\n const bzId = `$${node.$bzId}`;\n const currentSchema = getCurrentSchema(schema, node);\n const { idFields, defaultDBConnector } = currentSchema;\n\n const thingDbPath = defaultDBConnector?.path || node.$thing;\n\n const idValue = node.$id;\n\n // todo: composite ids\n const idField = idFields?.[0];\n\n //@ts-expect-error - TODO\n const attributes = listify(node, (k, v) => {\n // @ts-expect-error - TODO description\n if (k.startsWith('$') || k.startsWith('%') || k === idField || v === undefined || v === null) {\n return '';\n }\n // if (k.startsWith('$') || !v) return '';\n const currentDataField = currentSchema.dataFields?.find((x) => x.path === k);\n const fieldDbPath = currentDataField?.path;\n\n if (!fieldDbPath) {\n // throw new Error('noFieldDbPath');\n return '';\n }\n const dbField = currentDataField.dbPath;\n\n if (['TEXT', 'ID', 'EMAIL', 'JSON'].includes(currentDataField.contentType)) {\n return `has ${dbField} '${v}'`;\n }\n if (['NUMBER', 'BOOLEAN'].includes(currentDataField.contentType)) {\n return `has ${dbField} ${v}`;\n }\n if (currentDataField.contentType === 'DATE') {\n if (Number.isNaN(v.valueOf())) {\n throw new Error('Invalid format, Nan Date');\n }\n if (v instanceof Date) {\n return `has ${dbField} ${v.toISOString().replace('Z', '')}`;\n }\n return `has ${dbField} ${new Date(v).toISOString().replace('Z', '')}`;\n }\n if (currentDataField.contentType === 'FLEX') {\n //ex: $color isa Color, has id 'testi', has Color·freeForAll $tempId; $tempId \"number\" isa Color·freeForAll, has longVal 7;\n const tempId = `bza${genId()}`;\n\n const parsedVal = isArray(v) ? v.map((v) => parseFlexValTypeDB(v)) : parseFlexValTypeDB(v);\n if (Array.isArray(parsedVal)) {\n throw new Error('Array in FLEX fields not supported yet');\n }\n return `has ${dbField} $${tempId}; $${tempId} '${tempId}' isa ${dbField}, has ${parsedVal.type}Attribute ${parsedVal.value}`;\n }\n throw new Error(`Unsupported contentType ${currentDataField.contentType}`);\n }).filter((x) => x);\n\n const attributesVar = `${bzId}-atts`;\n\n //@ts-expect-error - TODO\n const matchAttributes = listify(node, (k) => {\n // @ts-expect-error - TODO description\n if (k.startsWith('$') || k.startsWith('%') || k === idField) {\n return '';\n }\n // if (k.startsWith('$') || !v) return '';\n const currentDataField = currentSchema.dataFields?.find((x) => x.path === k);\n const fieldDbPath = currentDataField?.path;\n\n if (!fieldDbPath) {\n // throw new Error('noFieldDbPath');\n return '';\n }\n const dbField = currentDataField.dbPath;\n\n return `{${attributesVar} isa ${dbField};}`;\n }).filter((x) => x);\n\n const idValueTQL = isArray(idValue) ? `like '${idValue.join('|')}'` : `'${idValue}'`;\n const idAttributes = idValue // it must have id values, and they must be realDBIds\n ? // 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 [`has ${idField} ${idValueTQL}`]\n : [];\n\n const allAttributes = [...idAttributes, ...attributes].filter((x) => x).join(',');\n\n const getDeletionMatchInNodes = () => {\n // if (node.$tempId) return ''; /// commented because we need tempIds to work when replacing a unlink/link all operation\n // todo: ensure parents belong to grandparents. [https://github.com/Blitzapps/blitz/issues/9]\n if (op === 'delete' || op === 'unlink' || op === 'match') {\n return `${bzId} isa ${[thingDbPath, ...idAttributes].filter((x) => x).join(',')};`;\n }\n if (op === 'update') {\n if (!matchAttributes.length) {\n throw new Error('update without attributes');\n }\n return `${bzId} isa ${[thingDbPath, ...idAttributes].filter((x) => x).join(',')}, has ${attributesVar};\n ${matchAttributes.join(' or ')};`;\n }\n return '';\n };\n\n const getInsertionMatchInNodes = () => {\n // todo: ensure parents belong to grandparents. [https://github.com/Blitzapps/blitz/issues/9]\n // if (node.$tempId) return ''; /// same as getDeletionMatch\n if (op === 'update' || op === 'link' || op === 'match') {\n return `${bzId} isa ${[thingDbPath, ...idAttributes].filter((x) => x).join(',')};`;\n }\n return '';\n };\n\n if (isBQLBlock(node)) {\n return {\n op,\n deletionMatch: getDeletionMatchInNodes(),\n insertionMatch: getInsertionMatchInNodes(),\n insertion:\n op === 'create'\n ? `${bzId} isa ${[thingDbPath, allAttributes].filter((x) => x).join(',')};`\n : op === 'update' && attributes.length\n ? `${bzId} ${attributes.join(',')};`\n : '',\n deletion:\n op === 'delete'\n ? `${bzId} isa ${thingDbPath};`\n : op === 'update' && matchAttributes.length\n ? `${bzId} has ${attributesVar};`\n : '',\n };\n }\n\n throw new Error('in attributes');\n };\n\n const edgeToTypeQL = (\n node: EnrichedBQLMutationBlock,\n ): {\n preDeletionBatch?: any[];\n deletionMatch?: string;\n insertionMatch?: string;\n deletion?: string;\n insertion?: string;\n op: string;\n } => {\n const op = node.$op as string;\n const currentSchema = getCurrentSchema(schema, node);\n const bzId = `$${node.$bzId}`;\n const idValue = node.$id;\n\n const relationDbPath = currentSchema.defaultDBConnector?.path || node.$thing;\n\n const roleFields = 'roles' in currentSchema ? listify(currentSchema.roles, (k) => k) : [];\n\n const roleDbPaths =\n 'roles' in currentSchema\n ? mapEntries(currentSchema.roles, (k, v) => [k, v.dbConnector?.path || k])\n : ({} as { [k: string]: string });\n\n // 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 // 1) roleFields\n\n //@ts-expect-error - TODO\n const fromRoleFields = listify(node, (k: string, v) => {\n if (!roleFields.includes(k)) {\n return null;\n }\n if (!('roles' in currentSchema)) {\n throw new Error('This should have roles! ');\n }\n const roleDbPath = roleDbPaths[k];\n if (Array.isArray(v)) {\n return v.map((x) => ({ path: roleDbPath, id: x }));\n }\n return { path: roleDbPath, id: v };\n })\n .filter((x) => x)\n .flat();\n\n /// 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 const fromRoleFieldsTql = fromRoleFields.map((x) => {\n //@ts-expect-error - TODO\n if (!x?.path) {\n throw new Error('Object without path');\n }\n //@ts-expect-error - TODO\n return `${x.path}: $${x.id}`;\n });\n\n const roles = fromRoleFields.length > 0 ? `( ${fromRoleFieldsTql.join(' , ')} )` : '';\n const edgeType = node[EdgeType];\n\n if (!edgeType) {\n throw new Error('[internal error] Symbol edgeType not defined');\n }\n\n const relationTql = !roles\n ? ''\n : `${bzId} ${roles} ${\n edgeType === 'linkField' || op === 'delete' || op === 'unlink' ? `isa ${relationDbPath}` : ''\n }`;\n\n const relationTqlWithoutRoles = `${bzId} ${\n edgeType === 'linkField' || op === 'delete' ? `isa ${relationDbPath}` : ''\n }`;\n\n const getInsertionsInEdges = () => {\n if (!relationTql) {\n return '';\n }\n if (op === 'link') {\n return `${relationTql};`;\n }\n if (op === 'create') {\n return `${relationTql}, has id '${idValue}';`;\n }\n return '';\n };\n\n const getInsertionMatchInEdges = () => {\n if (!relationTql) {\n return '';\n }\n // if (op === 'link') return `${relationTql};`;\n // if (op === 'create') return `${relationTqlWithoutRoles};`;\n if (op === 'match') {\n return `${relationTql};`;\n }\n return '';\n };\n\n const getDeletionMatchInEdges = () => {\n if (!relationTql) {\n return '';\n }\n /// edge delete: we are removing an automatic relation\n if (op === 'delete') {\n return `${relationTql};`;\n }\n /// edge unlink means: We are editing a real relation's roles\n if (op === 'unlink') {\n /* 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 /// unlinking more than one role is not supported yet\n /// this got commented as the match brings what is needed but will probably need a refacto\n /// this is coded as generating a match block in [parseBQLmutation.ts], toEdges(edgeType1)\n // return `${bzId} ${roles} isa ${relationDbPath};`;\n //return `${relationTql};`; //!this fixes rep-del1 but breaks other tests, ideally should be added\n }\n if (op === 'match') {\n return `${relationTql};`;\n }\n return '';\n };\n\n const getDeletionsInEdges = () => {\n if (!relationTql) {\n return '';\n }\n // todo: same as insertions, better manage the ids here\n if (op === 'delete') {\n return `${relationTqlWithoutRoles};`;\n }\n if (op === 'unlink') {\n return `${bzId} ${roles};`;\n }\n // if (op === 'unlink') return `${bzId} ($roles-${node.$bzId}: $players-${node.$bzId});`;\n return '';\n };\n\n /* 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 return {\n // preDeletionBatch: getPreDeletionBatch(),\n deletionMatch: getDeletionMatchInEdges(),\n insertionMatch: getInsertionMatchInEdges(),\n deletion: getDeletionsInEdges(),\n insertion: getInsertionsInEdges(),\n op: '',\n };\n };\n\n const toTypeQL = (\n nodes: EnrichedBQLMutationBlock[] | EnrichedBQLMutationBlock,\n mode?: 'nodes' | 'edges',\n ):\n | {\n preDeletionBatch?: any[];\n insertionMatch?: string;\n deletionMatch?: string;\n insertion?: string;\n deletion?: string;\n }[]\n | {\n preDeletionBatch?: any[];\n insertionMatch?: string;\n deletionMatch?: string;\n insertion?: string;\n deletion?: string;\n } => {\n const typeQL = mode === 'edges' ? edgeToTypeQL : nodeToTypeQL;\n\n if (Array.isArray(nodes)) {\n return nodes\n .map((x) => {\n const { preDeletionBatch, insertionMatch, deletionMatch, insertion, deletion } = typeQL(x);\n return shake({ preDeletionBatch, insertionMatch, deletionMatch, insertion, deletion }, (z) => !z); /// ! WARNING: falsy values are removed (0, \"\", etc)\n })\n .filter((y) => y);\n }\n const { preDeletionBatch, insertionMatch, deletionMatch, insertion, deletion } = typeQL(nodes);\n\n return shake({ preDeletionBatch, insertionMatch, deletionMatch, insertion, deletion }, (z) => !z); /// ! WARNING: falsy values are removed (0, \"\", etc)\n };\n\n const nodeOperations = toTypeQL(things);\n const arrayNodeOperations = Array.isArray(nodeOperations) ? nodeOperations : [nodeOperations];\n const edgeOperations = toTypeQL(edges, 'edges');\n const arrayEdgeOperations = Array.isArray(edgeOperations) ? edgeOperations : [edgeOperations];\n const allOperations = [...arrayNodeOperations, ...arrayEdgeOperations];\n\n // todo: split BQL mutation in N DBstreams per DB\n // todo: then pack them per DB,\n\n const tqlMutation = shake(\n {\n // preDeletionBatch: allOperations.flatMap((x) => x.preDeletionBatch).filter((y) => y !== undefined),\n insertionMatches: allOperations\n .map((x) => x.insertionMatch)\n .join(' ')\n .trim(),\n deletionMatches: allOperations\n .map((x) => x.deletionMatch)\n .join(' ')\n .trim(),\n insertions: allOperations\n .map((x) => x.insertion)\n .join(' ')\n .trim(),\n deletions: allOperations\n .map((x) => x.deletion)\n .join(' ')\n .trim(),\n // ...(typeQLRelations?.length && { relations: typeQLRelations }),\n },\n (x) => !x,\n );\n\n return tqlMutation;\n};\n","import { clone } from 'radash';\n/* eslint-disable no-param-reassign */\nimport { getSchemaByThing } from '../../../helpers';\nimport type { BQLMutationBlock, BormConfig, EnrichedBormSchema } from '../../../types';\n\nexport type TqlRes = any;\n\nexport const parseTQLMutation = async (\n tqlRes: TqlRes,\n reqThings: any[],\n reqEdges: any[],\n schema: EnrichedBormSchema,\n config: BormConfig,\n) => {\n // todo: check if something weird happened\n const expected = [...reqThings, ...reqEdges];\n\n const parsed = expected\n .map((exp) => {\n //! reads all the insertions and gets the first match. This means each id must be unique\n // @ts-expect-error - TODO description\n const currentNode = tqlRes.insertions?.find((y) => y.get(`${exp.$bzId}`))?.get(`${exp.$bzId}`);\n const $thing = exp.$thing || exp.$relation || exp.$entity;\n const thing = $thing ? getSchemaByThing(schema, $thing) : undefined;\n\n if (exp.$op === 'create' || exp.$op === 'update' || exp.$op === 'link') {\n /// Creation and links should show an $error. Update on the other hand might not get here as typeDB does not return deleted thibgs.\n if (!(exp.$op === 'update') && !currentNode && exp.$id) {\n return { $id: exp.$id, $error: \"Does not exist or it's not linked to the parent\" }; //todo: Return with $error not found?\n }\n\n const dbIdd = currentNode?.asThing().iid;\n const props = Object.entries(exp)\n .filter(([k, _]) => !k.startsWith('$')) // Skip keys starting with '$'\n .reduce(\n (acc, [k, v]) => {\n ///Relations come with the $bzId in the roles instead of the $ids, lets replace them:\n const dataField = thing?.dataFields?.find((f) => f.path === k);\n if (dataField?.contentType === 'JSON') {\n acc[k] = JSON.parse(v as any);\n return acc;\n }\n if (exp.$thingType === 'relation') {\n const matchedThings = expected.filter((x) => x.$id && x.$bzId === v);\n /*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 acc[k] = matchedThings[0].$id;\n return acc;\n }\n acc[k] = v;\n return acc;\n }\n acc[k] = v;\n return acc;\n },\n {} as Record<string, any>,\n );\n\n if (config.mutation?.noMetadata) {\n return props;\n }\n\n /// We revert the cleaning of the tempId\n const tempId = exp.$tempId && !exp.$tempId.startsWith('_:') ? { $tempId: `_:${exp.$tempId}` } : {};\n // TODO: exp.path is undefined\n return { $dbId: dbIdd, ...exp, ...props, ...{ [exp.path]: exp.$id, ...tempId } } as BQLMutationBlock;\n }\n if (exp.$op === 'delete' || exp.$op === 'unlink') {\n // todo when typeDB confirms deletions, check them here\n return exp as BQLMutationBlock;\n }\n if (exp.$op === 'match') {\n return undefined;\n }\n throw new Error(`Unsupported op ${exp.$op}`);\n })\n .filter((z) => z);\n\n return clone(parsed);\n};\n","import { TransactionType } from 'typedb-driver';\nimport { getSessionOrOpenNewOne } from '../../../adapters/typeDB/helpers';\nimport type { BormConfig, DBHandles } from '../../../types';\n\nexport type TqlMutation = {\n deletions: string;\n deletionMatches: string;\n insertions: string;\n insertionMatches: string;\n};\n\nexport const runTQLMutation = async (tqlMutation: TqlMutation, dbHandles: DBHandles, config: BormConfig) => {\n if (!tqlMutation) {\n throw new Error('TQL request not built');\n }\n if (!((tqlMutation.deletions && tqlMutation.deletionMatches) || tqlMutation.insertions)) {\n throw new Error('TQL request error, no things');\n }\n\n const { session } = await getSessionOrOpenNewOne(dbHandles, config);\n const mutateTransaction = await session.transaction(TransactionType.WRITE);\n\n // deletes and pre-update deletes\n const tqlDeletion =\n tqlMutation.deletionMatches &&\n tqlMutation.deletions &&\n `match ${tqlMutation.deletionMatches} delete ${tqlMutation.deletions}`;\n\n // insertions and updates\n const tqlInsertion =\n tqlMutation.insertions &&\n `${tqlMutation.insertionMatches ? `match ${tqlMutation.insertionMatches}` : ''} insert ${tqlMutation.insertions}`;\n\n try {\n // does not receive a result\n if (tqlDeletion) {\n await mutateTransaction.query.delete(tqlDeletion);\n }\n\n const insertionsStream = tqlInsertion && mutateTransaction.query.insert(tqlInsertion);\n const insertionsRes = insertionsStream ? await insertionsStream.collect() : undefined;\n\n await mutateTransaction.commit();\n return { insertions: insertionsRes };\n } catch (e: any) {\n throw new Error(`Transaction failed: ${e.message}`);\n } finally {\n await mutateTransaction.close();\n }\n};\n","import type {\n BQLMutationBlock,\n BormConfig,\n DBHandles,\n EnrichedBQLMutationBlock,\n EnrichedBormSchema,\n} from '../../../types';\nimport { createMachine, interpret, invoke, reduce, state, transition } from 'robot3';\nimport type { bqlMutationContext } from '../mutationMachine';\nimport { buildTQLMutation } from './build';\nimport type { TqlRes } from './parse';\nimport { parseTQLMutation } from './parse';\nimport type { TqlMutation } from './run';\nimport { runTQLMutation } from './run';\n\ntype TypeDbMachineContext = {\n bql: bqlMutationContext;\n tql: {\n mutation?: TqlMutation;\n res?: TqlRes;\n };\n schema: EnrichedBormSchema;\n config: BormConfig;\n handles: DBHandles;\n error?: string | null;\n};\n\nconst updateBqlRes = (ctx: TypeDbMachineContext, event: any) => {\n return {\n ...ctx,\n bql: { ...ctx.bql, res: event.data },\n };\n};\n\nconst updateTQLMutation = (ctx: TypeDbMachineContext, event: any) => {\n return {\n ...ctx,\n tql: {\n ...ctx.tql,\n mutation: event.data,\n },\n };\n};\n\nconst updateTQLRes = (ctx: TypeDbMachineContext, event: any) => {\n return {\n ...ctx,\n tql: {\n ...ctx.tql,\n res: event.data,\n },\n };\n};\n\nconst errorTransition = transition(\n 'error',\n 'error',\n reduce((ctx: TypeDbMachineContext, event: any): TypeDbMachineContext => {\n return {\n ...ctx,\n error: event.error,\n };\n }),\n);\n\nexport const typeDbMutationMachine = createMachine(\n 'buildMutation',\n {\n buildMutation: invoke(\n async (ctx: TypeDbMachineContext) => buildTQLMutation(ctx.bql.things, ctx.bql.edges, ctx.schema),\n transition('done', 'runMutation', reduce(updateTQLMutation)),\n errorTransition,\n ),\n runMutation: invoke(\n async (ctx: TypeDbMachineContext) => runTQLMutation(ctx.tql.mutation as TqlMutation, ctx.handles, ctx.config),\n transition('done', 'parseMutation', reduce(updateTQLRes)),\n errorTransition,\n ),\n parseMutation: invoke(\n async (ctx: TypeDbMachineContext) =>\n parseTQLMutation(ctx.tql.res, ctx.bql.things, ctx.bql.edges, ctx.schema, ctx.config),\n transition('done', 'success', reduce(updateBqlRes)),\n errorTransition,\n ),\n success: state(),\n error: state(),\n },\n (ctx: TypeDbMachineContext) => ctx,\n);\n\nconst awaitMutationMachine = async (context: TypeDbMachineContext) => {\n return new Promise<any[]>((resolve, reject) => {\n interpret(\n typeDbMutationMachine,\n (service) => {\n if (service.machine.state.name === 'success') {\n resolve(service.context.bql.res);\n }\n if (service.machine.state.name === 'error') {\n reject(service.context.error);\n }\n },\n context,\n );\n });\n};\n\nexport const runTypeDbMutationMachine = async (\n bqRaw: BQLMutationBlock | BQLMutationBlock[],\n enrichedBql: EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[],\n things: unknown[],\n edges: unknown[],\n schema: EnrichedBormSchema,\n config: BormConfig,\n handles: DBHandles,\n) => {\n return awaitMutationMachine({\n bql: {\n raw: bqRaw,\n enriched: enrichedBql,\n things: things, //to unify at some point with the flat notation\n edges: edges,\n flat: {\n //this is the new version, used for surrealDB\n things: [],\n edges: [],\n arcs: [],\n references: [],\n },\n res: [],\n },\n tql: {},\n schema: schema,\n config: config,\n handles: handles,\n error: null,\n });\n};\n","import { tryit } from 'radash';\nimport { SessionType, TypeDB, TypeDBCredential } from 'typedb-driver';\n\nimport { enableMapSet } from 'immer';\nimport { SimpleSurrealClient } from './adapters/surrealDB/client';\nimport { defaultConfig } from './default.config';\nimport { bormDefine } from './define';\nimport { enrichSchema } from './enrichSchema';\nimport { runMutationMachine } from './stateMachine/mutation/mutationMachine';\nimport { runQueryMachine } from './stateMachine/query/queryMachine';\nimport type {\n AllDbHandles,\n BQLMutation,\n BQLResponse,\n BQLResponseMulti,\n BormConfig,\n BormSchema,\n DBHandles,\n EnrichedBormSchema,\n MutationConfig,\n QueryConfig,\n RawBQLQuery,\n} from './types';\n\nexport * from './types';\n\ntype BormProps = {\n schema: BormSchema;\n config: BormConfig;\n};\n\n/// Global config\n// immer\nenableMapSet();\n\nclass BormClient {\n private schema: BormSchema;\n private config: BormConfig;\n private initializing = false;\n private subscribers: ((err?: unknown) => void)[] = [];\n private initialized: { enrichedSchema: EnrichedBormSchema; dbHandles: DBHandles } | null = null;\n\n constructor({ schema, config }: BormProps) {\n this.schema = schema;\n this.config = config;\n }\n\n getDbHandles = () => this.initialized?.dbHandles;\n\n private getInitialized = async () => {\n if (this.initialized) {\n return this.initialized;\n }\n await this.init();\n if (this.initialized) {\n return this.initialized;\n }\n throw new Error('Client is not initialized');\n };\n\n init = async () => {\n if (this.initializing) {\n return new Promise<void>((resolve, reject) => {\n this.subscribers.push((err) => {\n if (err) {\n reject(err);\n } else {\n resolve();\n }\n });\n });\n }\n\n this.initializing = true;\n const dbHandles: AllDbHandles = { typeDB: new Map(), surrealDB: new Map() };\n\n try {\n await Promise.all(\n this.config.dbConnectors.map(async (dbc) => {\n if (dbc.provider === 'surrealDB') {\n const client = new SimpleSurrealClient({\n url: dbc.url,\n username: dbc.username,\n password: dbc.password,\n namespace: dbc.namespace,\n database: dbc.dbName,\n });\n // const pool = new SurrealPool({\n // \turl: dbc.url,\n // \tusername: dbc.username,\n // \tpassword: dbc.password,\n // \tnamespace: dbc.namespace,\n // \tdatabase: dbc.dbName,\n // \ttotalConnections: 8,\n // });\n dbHandles.surrealDB.set(dbc.id, { client, providerConfig: dbc.providerConfig });\n } else if (dbc.provider === 'typeDB' && dbc.dbName) {\n // const client = await TypeDB.coreClient(dbc.url);\n // const clientErr = undefined;\n const [clientErr, client] = await tryit(TypeDB.coreDriver)(dbc.url);\n if (clientErr) {\n const message = `[BORM:${dbc.provider}:${dbc.dbName}:core] ${\n // clientErr.messageTemplate?._messageBody() ?? \"Can't create TypeDB Client\"\n clientErr.message ?? \"Can't create TypeDB Client\"\n }`;\n throw new Error(message);\n }\n try {\n const session = await client.session(dbc.dbName, SessionType.DATA);\n dbHandles.typeDB.set(dbc.id, { client, session });\n } catch (sessionErr: any) {\n const message = `[BORM:${dbc.provider}:${dbc.dbName}:session] ${\n // eslint-disable-next-line no-underscore-dangle\n (sessionErr.messageTemplate?._messageBody() || sessionErr.message) ?? \"Can't create TypeDB Session\"\n }`;\n throw new Error(message);\n }\n } else if (dbc.provider === 'typeDBCluster' && dbc.dbName) {\n const credential = new TypeDBCredential(dbc.username, dbc.password, dbc.tlsRootCAPath);\n const [clientErr, client] = await tryit(TypeDB.cloudDriver)(dbc.addresses, credential);\n\n if (clientErr) {\n const message = `[BORM:${dbc.provider}:${dbc.dbName}:core] ${\n // clientErr.messageTemplate?._messageBody() ?? \"Can't create TypeDB Client\"\n clientErr.message ?? \"Can't create TypeDB Cluster Client\"\n }`;\n throw new Error(message);\n }\n try {\n const session = await client.session(dbc.dbName, SessionType.DATA);\n dbHandles.typeDB.set(dbc.id, { client, session });\n } catch (sessionErr: any) {\n const message = `[BORM:${dbc.provider}:${dbc.dbName}:session] ${\n // eslint-disable-next-line no-underscore-dangle\n (sessionErr.messageTemplate?._messageBody() || sessionErr.message) ?? \"Can't create TypeDB Session\"\n }`;\n throw new Error(message);\n }\n }\n }),\n );\n\n this.initialized = {\n enrichedSchema: enrichSchema(this.schema, dbHandles),\n dbHandles,\n };\n const subscribers = this.subscribers;\n this.subscribers = [];\n subscribers.forEach((s) => s());\n } catch (e) {\n const subscribers = this.subscribers;\n this.subscribers = [];\n subscribers.forEach((s) => s(e));\n } finally {\n this.initializing = false;\n }\n };\n\n introspect = async () => {\n return (await this.getInitialized()).enrichedSchema;\n };\n\n define = async () => {\n const initialized = await this.getInitialized();\n const schemas = await bormDefine(this.config, initialized.enrichedSchema, initialized.dbHandles);\n return schemas;\n };\n\n /// no types yet, but we can do \"as ...\" after getting the type fro the schema\n // query = async (query: RawBQLQuery | RawBQLQuery[], queryConfig?: QueryConfig) => {\n // \tconst handles = this.dbHandles;\n // \tif (!handles) {\n // \t\tthrow new Error('dbHandles undefined');\n // \t}\n\n // \tawait this.#enforceConnection();\n\n // \tconst qConfig = {\n // \t\t...this.config,\n // \t\tquery: { ...defaultConfig.query, ...this.config.query, ...queryConfig },\n // \t};\n\n // \t// @ts-expect-error type of Query is incorrect\n // \treturn queryPipeline(query, qConfig, this.schema, handles);\n // };\n\n query = async (query: RawBQLQuery | RawBQLQuery[], queryConfig?: QueryConfig) => {\n const initialized = await this.getInitialized();\n\n const qConfig = {\n ...this.config,\n query: {\n ...defaultConfig.query,\n ...this.config.query,\n ...queryConfig,\n },\n };\n const isBatched = Array.isArray(query);\n const queries = isBatched ? query : [query];\n\n const [errorRes, res] = await tryit(runQueryMachine)(\n queries,\n initialized.enrichedSchema,\n qConfig,\n initialized.dbHandles,\n );\n if (errorRes) {\n //@ts-expect-error - errorRes has error. Also no idea where the error: comes from\n const error = new Error(errorRes.error);\n //@ts-expect-error - errorRes has error. Also no idea where the error: comes from\n error.stack = errorRes.error.stack;\n throw error;\n }\n\n const result = res.bql.res as BQLResponse[];\n\n return isBatched ? result : result[0];\n };\n\n mutate = async (mutation: BQLMutation, mutationConfig?: MutationConfig) => {\n const initialized = await this.getInitialized();\n const mConfig = {\n ...this.config,\n mutation: {\n ...defaultConfig.mutation,\n ...this.config.mutation,\n ...mutationConfig,\n },\n };\n\n const [errorRes, res] = await tryit(runMutationMachine)(\n mutation,\n initialized.enrichedSchema,\n mConfig,\n initialized.dbHandles,\n );\n if (errorRes) {\n //@ts-expect-error - errorRes has error. Also no idea where the error: comes from\n const error = new Error(errorRes.error.message);\n //@ts-expect-error - errorRes has error. Also no idea where the error: comes from\n error.stack = errorRes.error.stack;\n throw error;\n }\n\n const result = res.bql.res;\n\n return result as BQLResponseMulti;\n };\n\n close = async () => {\n if (!this.initialized) {\n return;\n }\n //todo: probably migrate dbHandles to be an array, where each handle has .type=\"typeDB\" for instance\n try {\n await Promise.all(\n [...(this.initialized.dbHandles.typeDB?.values() ?? [])].map(async ({ client, session }) => {\n if (session.isOpen()) {\n await session.close();\n }\n await client.close();\n }),\n );\n // TODO: Close SurrealDB clients.\n } finally {\n this.initialized = null;\n }\n // Currently there's no `close()` method in the client.\n // See https://github.com/surrealdb/surrealdb.node/issues/36\n };\n}\n\nexport default BormClient;\n"]}
1
+ {"version":3,"sources":["../src/adapters/surrealDB/client.ts","../src/default.config.ts","../src/adapters/surrealDB/helpers.ts","../src/adapters/surrealDB/parsing/parseFlexVal.ts","../src/adapters/surrealDB/parsing/values.ts","../src/adapters/surrealDB/schema/define.ts","../src/adapters/typeDB/schema/define.ts","../src/define/index.ts","../src/adapters/index.ts","../src/types/symbols/index.ts","../src/enrichSchema.ts","../src/stateMachine/mutation/bql/enrich.ts","../src/helpers.ts","../src/stateMachine/query/bql/enrich.ts","../src/engine/helpers.ts","../src/engine/compute.ts","../src/stateMachine/mutation/bql/enrichSteps/computeFields.ts","../src/stateMachine/mutation/bql/shared/get$bzId.ts","../src/stateMachine/mutation/bql/shared/validateOp.ts","../src/stateMachine/mutation/bql/shared/getOp.ts","../src/stateMachine/mutation/bql/shared/getOppositePlayers.ts","../src/stateMachine/mutation/bql/enrichSteps/enrichChildren.ts","../src/stateMachine/mutation/bql/shared/getTriggeredActions.ts","../src/stateMachine/mutation/bql/enrichSteps/preHookTransformations.ts","../src/stateMachine/mutation/bql/enrichSteps/preHookValidations.ts","../src/stateMachine/mutation/bql/enrichSteps/preValidate.ts","../src/stateMachine/mutation/bql/enrichSteps/replaces.ts","../src/stateMachine/mutation/bql/enrichSteps/rootMeta.ts","../src/stateMachine/mutation/bql/enrichSteps/splitIds.ts","../src/stateMachine/mutation/bql/shared/doActions.ts","../src/stateMachine/mutation/bql/enrichSteps/unlinkAll.ts","../src/stateMachine/mutation/bql/guards/dependenciesGuard.ts","../src/stateMachine/mutation/bql/parse.ts","../tests/helpers/matchers.ts","../src/stateMachine/mutation/bql/preQuery.ts","../src/logger.ts","../src/version.ts","../src/robot3.ts","../src/stateMachine/query/bql/clean.ts","../src/stateMachine/query/postHook.ts","../src/stateMachine/query/surql/build.ts","../src/adapters/surrealDB/filters/filters.ts","../src/stateMachine/query/surql/buildRefs.ts","../src/stateMachine/query/surql/parse.ts","../src/stateMachine/query/surql/run.ts","../src/stateMachine/query/surql/machine.ts","../src/stateMachine/query/tql/filters.ts","../src/stateMachine/query/tql/build.ts","../src/stateMachine/query/tql/parse.ts","../src/stateMachine/query/tql/run.ts","../src/adapters/typeDB/helpers.ts","../src/stateMachine/query/tql/machine.ts","../src/stateMachine/query/queryMachine.ts","../src/stateMachine/mutation/bql/enrichSteps/preHookDependencies.ts","../src/stateMachine/mutation/bql/flatter.ts","../src/stateMachine/mutation/bql/stringify.ts","../src/stateMachine/mutation/surql/build.ts","../src/stateMachine/mutation/surql/parse.ts","../src/stateMachine/mutation/surql/run.ts","../src/stateMachine/mutation/surql/machine.ts","../src/adapters/typeDB/parseFlexVal.ts","../src/stateMachine/mutation/tql/build.ts","../src/stateMachine/mutation/tql/parse.ts","../src/stateMachine/mutation/tql/run.ts","../src/stateMachine/mutation/tql/machine.ts","../src/stateMachine/mutation/mutationMachine.ts","../src/index.ts"],"names":["SimpleSurrealClient","params","cb","db","Surreal","args","defaultConfig","sanitizeTableNameSurrealDb","tableName","specialChars","sanitizeNameSurrealDB","value","char","parseFlexValSurrealDB","v","isDate","surrealDBtypeMap","parseValueSurrealDB","ct","parsedVal","isArray","INDENTATION","indent","n","indentPar","str","level","line","convertBQLToSurQL","schema","header","entities","convertSchemaItems","relations","utilityFunctions","addUtilityFunctions","items","name","item","convertSchemaItem","baseDefinition","dataFields","convertDataFields","linkFields","convertLinkFields","roles","convertRoles","parentName","field","fieldType","mapContentTypeToSurQL","dbValue","linkField","relationLinkField","lf","targetPath","type","pathToRelation","relationPath","baseField","supportField","roleName","role","fieldDefinition","roleEvent","generateRoleEvent","eventName","targetRelationLinkField","targetRelationPath","firstTargetRoleLinkField","firstTargetRolePath","usedLinkField","generateSet","fields","action","path","cardinality","impactedLinkFields","allFields","removalsSet","additionsSet","cardOneEvents","cardManyEvents","contentType","validations","defineSURQLSchema","removeDuplicateObjects","arr","uniqueObjects","uniqueMap","obj","dbPath","key","convertTQLSchema","connectorId","output","usedAttributes","eName","entityName","entity","usedLinkFields","relation","plays","inherited","rName","relationName","attributes","attribute","defineTQLSchema","config","dbHandles","typeDBString","session","client","dbName","schemaTransaction","SessionType","TransactionType","bormDefine","typeDBEntriesFixed","entry","surrealDBEntriesFixed","adapterContext","QueryPath","StepPrint","EdgeType","EdgeSchema","DBNode","IsTransformed","Parent","FieldSchema","SharedMetadata","SuqlMetadata","enrichSchema","orderedEntities","orderExtended","orderedRelations","allLinkFields","getAllLinkFields","enrichedSchema","thing","extendedThing","addSubType","enrichedThing","enrichThing","enrichedRelation","k","enrichRoleField","expandSubThings","thingMap","ordered","seen","inProcess","pushExtended","getAllExtended","extended","_extended","subThing","_thing","_","handle","idFields","hooks","df","enrichDataField","enrichLinkField","refFields","enrichRefField","getDbPath","refField","thingName","linkFieldRelation","hasRole","queryPath","oppositeLinkFieldsPlayedBy","x","i","allExtends","playedBy","shared","things","oFind","fn","oFilter","entries","error","result","tryit","getSchemaByThing","$thing","getCurrentSchema","node","getFieldType","currentSchema","dataFieldSchema","dataField","linkFieldSchema","roleFieldSchema","getIdFieldKey","idField","getThingType","rootNode","getFieldSchema","foundLinkField","foundDataField","foundRoleField","foundRefField","getCardinality","getCurrentFields","availableDataFields","availableLinkFields","availableRefFields","listify","availableRoleFields","availableFields","allowedFields","usedFields","localFilterFields","nestedFilterFields","unidentifiedFields","localFilters","_v","nestedFilters","capitalizeFirstLetter","string","getParentNode","blocks","parent","meta","pathParts","parentPath","getNodeByPath","getSymbols","oldBlock","symbols","symbolKey","isBQLBlock","block","isObject","deepCurrent","current","plainObject","isDraft","assertDefined","msg","depth","_indent","genId","customAlphabet","enrichBQLQuery","rawBqlQuery","batches","produce","draft","traverse","context","val","enrichFilter","checkFilterByUnique","newFields","processed","processField","getAllFields","f","isId","roleFields","$filter","fieldFilter","isIdField","isUniqueDataField","isSingle$id","filterOperators","eqValue","createDataField","props","fieldStr","$justId","isVirtual","fieldSchema","createLinkField","target","$thingType","idNotIncluded","createRefField","createRoleField","roleField","thingType","wasArray","resultArray","filter","acc","valueAsArray","fieldSchemaTyped","childrenThing","STRIP_COMMENTS","STRIP_KEYWORDS","getParamNames","func","fnBodyStr","paramsBlock","param","p","computeField","currentThing","mandatoryDependencies","missingArgs","arg","computeFields","currentNode","subNode","computedFields","virtualFields","filledFields","attKey","virtualFilledFields","fieldPath","currentFieldDef","currentLinkedDef","currentRoleDef","currentDef","defaultValue","get$bzId","validateOp","parentNode","nodeSchema","usedDataFields","validateChildren","getOp","getOpAndValidate","getOppositePlayers","oppositePlayer","enrichChildren","newNodes","$op","$bzId","refSchema","relationSchema","relFieldSchema","oppositePlayers","player","getTriggeredActions","currentEvent","hook","preHookTransformations","triggeredActions","clone","workingNode","userContext","dbNode","newProps","preHookValidations","requiredFields","enumFields","fnValidatedFields","enumOptions","validationResult","preValidate","paths","subNodes","cleanPath","prefixedToObj","standardPrefixMatch","id","replaceToObj","child","isPrefixed","replaceToObjRef","setRootMeta","withMetadataRootArray","rootOp","doAction","_stepName","isSet","splitMultipleIds","transformedChildren","$id","unlinkAll","uuidv4","dependenciesGuard","mut","o","cleanStep","tempId","dataFieldStep","_node","_field","enrichBQLMutation","rootBlock","has$Fields","toIgnore","lastPath","secondToLastPath","isFilter","relField","rootField","subNodeSchema","uf","usedLinkFieldsSchemas","lf1","lf2","j","deepRemoveMetaData","removeMeta","s","parseBQLMutation","listNodes","nodes","edges","getIdValue","idDataField","defaultIdField","idValue","toNodes","toEdges","edge","currentThingSchema","dataFieldPaths","roleFieldPaths","linkFieldPaths","refFieldPaths","getChildOp","usedRoleFields","usedRefFields","dataObj","shake","pick","edgeSchema","ownRelation","linkTempId","parentId","getLinkObjOp","edgeType1","rolesObjFiltered","rolesObjOnlyIds","mapEntries","objWithMetaDataOnly","getEdgeOp","currentRoles","rolesObjOnlyIdsGrouped","currentRoleCardinality","vNested","edgeType2","operations","operationsArray","childOp","operation","op","edgeType3","parsedThings","parsedEdges","mergedThings","existingIndex","t","mergedEdges","curr","existingEdge","r","newRelation","existingVal","currVal","allThings","tempIds","orphanTempIds","LOG_LEVEL","log","l","logDebug","VERSION","createMachine","guard","interpret","invoke","reduce","state","transition","Robot","cleanQueryRes","bqlRes","withPostHooks","queryPostHooks","cleanOutput","symbol","postHooks","enrichedBqlQuery","originalNode","queriedFields","excludedFields","virtualFieldPath","computedValue","excludedField","surqlOperators","parseFilter","surrealDBKey","buildSuqlFilter","parts","logicalOperator","nestedFilter","keyWithoutPrefix","valueKeys","operator","nextValue","surrealOperator","buildSorter","sort","desc","build","queries","query","buildQuery","$fields","$offset","$limit","$sort","lines","fieldLines","buildFieldsQuery","allTypesNormed","$ids","allCombinations","parsed","parentQuery","buildFieldQuery","buildAttributeQuery","buildLinkQuery","buildRoleQuery","queryLevel","from","built","fieldLevel","buildRefs","META","createMetaFields","DATA_FIELDS","createDataFields","EDGE_FIELDS","createEdgeFields","REF_FIELDS","createRefFields","FIELDS","FROM","createRootFromClause","WHERE","SORT","LIMIT","OFFSET","formatId","joinTypes","ids","edgeFields","ef","LINK_FIELDS","rf","parse","res","parseRes","parseObj","newObj","parseFieldResult","parseValue","parsedContent","flatNestedField","nf","content","asArray","run","batchedQuery","errorTransition","ctx","event","surrealDbQueryMachine","linkMode","c","awaitQueryMachine","resolve","reject","service","runSurrealDbQueryMachine","enrichedBql","buildFilter","$nonMappedFilter","$var","mapFilterKeys","$not","rest","matches","isPositiveFilter","notMatches","processPositiveFilter","positiveMatches","isNegated","normalizedKey","subMatches","subFilter","joinedSubMatches","fieldMatches","handleDataFieldFilter","linkMatches","handleLinkFieldFilter","roleMatches","handleRelationRoleFilter","opValue","normalizedOp","match","serializeValue","inAlt","joinAlt","ninMatch","alt","opposite","oppositeIdField","oppVar","playerIdField","playerVar","filterId","filterVar","thingSchema","mapper","newFilter","mapPositiveFilterKeys","filterValue","newKey","separator","buildTQLQuery","$path","$WithIdFilter","sorter","randomId","processDataFields","processLinkFields","processRoleFields","postStrParts","asMetaDataParts","multiVals","postStr","$metaData","multiVal","dotPath","nextDepth","$as","$idNotIncluded","$filterByUnique","$roleVar","withId","withIdFilter","$playedBy","$linkVar","normalizeSorter","sortMatch","attrVar","order","parseTQLQuery","rawBqlRequest","rawTqlRes","rawBql","realParse","schemaValue","parseFields","parsedDataFields","parseDataFields","parsedLinkFields","parseLinkFields","parsedRoleFields","parseRoleFields","keys","dataFieldsKey","multiValKeys","multiValKey","multiValKeyWithout$multiVal","realValue","metaDataKey","dataFieldsThing","$key","parseArrayMetadata","mainDataFields","$asKey","fieldValue","roleFieldsRes","$roleFields","$cardinality","as","justId","filterByUnique","parseMetaData","resDataFields","linkFieldsRes","$linkFields","asRegex","justIdRegex","idNotIncludedRegex","filterByUniqueRegex","asMatch","justIdMatch","idNotIncludedMatch","filterByUniqueMatch","converted","jsonString","_match","p1","p2","e","getSessionOrOpenNewOne","singleHandlerV0","runTQLQuery","tqlRequest","options","TypeDBOptions","transaction","err","resArray","parallel","queryString","updateBqlRes","updateTqlReq","updateTqlRes","typeDbQueryMachine","runTypeDbQueryMachine","bql","handles","updateBqlReq","queryMachine","adapters","q","raw","adapter","adapterList","proms","a","results","orderedResults","index","b","runQueryMachine","preQueryPathSeparator","grandChildOfCreateSymbol","mutationPreQuery","operatorKeys","getFieldKeys","noDataFields","ops","preQueryReq","processBlock","root","filteredBlock","toRemoveFromRoot","toRemove","extractValueFromFilter","opBlock","newField","preQueryRes","getObjectPath","$objectPath","objectPathToKey","hardId","convertManyPaths","input","prefix","itemsWithBrackets","suffix","cache","newObjPath","cacheKey","cacheArray","fillObjectPaths","bqlWithObjectPaths","fillIds","newBlocks","cacheFound","newBlock","subBlocks","newSubBlocks","bqlFilledIds","newFilled","splitBql","processBlocks","getOperationsWithMultiples","opBlocks","operationWithMultiples","operationWithoutMultiples","otherOps","hasMultiple","ob","getAllKeyCombinations","dataFieldObj","allKeys","combinableKeys","generateCombinations","currentObj","fullObj","newObjInclude","crossReferencedOperations","multipleBlock","combinationsToKeep","combinationBlock","foundKeys","childKey","subBlock","newOps","parentKey","idsOfParent","cKey","originalOp","processReplaces","newOpBlocks","replaceIds","createIds","replaceBlock","cacheIds","unlinkIds","linkIds","processedReplaces","processArrayIdsFound","arrayOfIds","cacheOfIds","isOccupied","filledPaths","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","newNode","isObj","getIdFromDbValue","getDbNodeFromDbValue","map","flattenBQLMutation","tree","$tempId","parentObj","operationMap","edgeMeta","isSymbol","opTypes","filteredEdges","ulf","arc","urf","children","childMeta","filteredChildren","orderedEdges","stringify","tObject","tField","oppositeThing","buildSURQLMutation","flat","buildThings","sanitizedThings","restString","metaString","dataFieldStrings","VAR","COND","table","TARGET","parentRef","SET","OUTPUT","DELETE_OUTPUT","buildEdges","asArrayOfVars","arrayString","nodesString","roleFieldsString","buildArcs","roleA","roleB","thingsA","thingsB","isMany1","isMany2","buildReferences","refFieldSchema","refFieldsString","parseSURQLMutation","nulledAtts","_k","withMetaAndId","runSURQLMutation","batchedMutation","filteredErrorRes","updateSURQLMutation","d","updateSURQLRes","surrealDbMutationMachine","awaitMutationMachine","runSurrealDbMutationMachine","bqlRaw","bqlFlat","parseFlexValTypeDB","buildTQLMutation","nodeToTypeQL","bzId","defaultDBConnector","thingDbPath","currentDataField","dbField","attributesVar","matchAttributes","idValueTQL","idAttributes","allAttributes","getDeletionMatchInNodes","getInsertionMatchInNodes","edgeToTypeQL","relationDbPath","roleDbPaths","fromRoleFields","roleDbPath","fromRoleFieldsTql","edgeType","relationTql","relationTqlWithoutRoles","getInsertionsInEdges","getInsertionMatchInEdges","getDeletionMatchInEdges","getDeletionsInEdges","toTypeQL","mode","typeQL","preDeletionBatch","insertionMatch","deletionMatch","insertion","deletion","z","y","nodeOperations","arrayNodeOperations","edgeOperations","arrayEdgeOperations","allOperations","parseTQLMutation","tqlRes","reqThings","reqEdges","expected","exp","dbIdd","matchedThings","runTQLMutation","tqlMutation","mutateTransaction","tqlDeletion","tqlInsertion","insertionsStream","insertionsRes","updateTQLMutation","updateTQLRes","typeDbMutationMachine","runTypeDbMutationMachine","bqRaw","final","updateThingsEdges","updateBQLFlat","updateBQLRes","enrich","preQuery","preQueryDependencies","parseBQL","flattenBQL","requiresPreQuery","dbConnectors","provider","requiresPreHookDependencies","machine","awaitMachine","runMutationMachine","mutation","enableMapSet","BormClient","dbc","clientErr","TypeDB","message","sessionErr","credential","TypeDBCredential","subscribers","initialized","queryConfig","qConfig","isBatched","errorRes","mutationConfig","mConfig","index_default"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { QueryParameters, QueryResult } from 'surrealdb';\nimport Surreal, { ConnectionStatus } from 'surrealdb';\n\nconst QUEUE_TIMEOUT = 5000; // The max duration a query is queued before \"Timeout\" error is thrown.\nconst QUERY_TIMEOUT = 180000; // The max duration a query is run before \"Timeout\" error is thrown.\nconst RECONNECT_INTERVAL = 2000; // Check the connection every `RECONNECT_INTERVAL` and reconnect it if it's not connected.\nconst INITIAL_RECONNECT_INTERVAL = 1000; // If it's failed to reconnect wait with exponential backoff with this initial interval and then try to reconnect again.\nconst MAX_RECONNECT_RETRY_INTERVAL = 60000; // If the reconnection failed wait with exponential backoff with this max interval and then try to reconnect again.\n\nclass SurrealClient {\n private db: Surreal;\n private url: string;\n private username: string;\n private password: string;\n private namespace: string;\n private database: string;\n private isConnecting: boolean;\n private reconnectInterval: ReturnType<typeof setInterval> | null;\n\n constructor(params: { url: string; username: string; password: string; namespace: string; database: string }) {\n this.db = new Surreal();\n this.url = params.url;\n this.username = params.username;\n this.password = params.password;\n this.namespace = params.namespace;\n this.database = params.database;\n this.isConnecting = false;\n this.reconnectInterval = null;\n }\n\n private async _connect() {\n if (\n this.isConnecting ||\n this.db.status === ConnectionStatus.Connecting ||\n this.db.status === ConnectionStatus.Connected\n ) {\n return;\n }\n this.isConnecting = true;\n this.db = new Surreal();\n let retryTimeout = Math.max(INITIAL_RECONNECT_INTERVAL, 1);\n // eslint-disable-next-line no-constant-condition\n while (true) {\n let failed = false;\n try {\n await this.db.connect(this.url, {\n namespace: this.namespace,\n database: this.database,\n auth: {\n username: this.username,\n password: this.password,\n },\n versionCheck: false,\n });\n break;\n } catch (_e) {\n failed = true;\n await this.close();\n if (this.isClosed) {\n break;\n }\n }\n if (failed) {\n await sleep((1 + Math.random() * 0.1) * retryTimeout);\n retryTimeout = Math.min(2 * retryTimeout, MAX_RECONNECT_RETRY_INTERVAL);\n await this._connect();\n }\n }\n this.isConnecting = false;\n }\n\n async connect() {\n if (this.isClosed) {\n this.reconnectInterval = setInterval(() => this._connect(), RECONNECT_INTERVAL);\n }\n return this._connect();\n }\n\n async close() {\n if (this.reconnectInterval !== null) {\n clearInterval(this.reconnectInterval);\n this.reconnectInterval = null;\n try {\n await this.db.close();\n } catch (e) {\n console.error('Trying to close an already closed connection:', e);\n }\n }\n }\n\n get isClosed() {\n return this.reconnectInterval === null;\n }\n\n private async run<T>(cb: (db: Surreal) => Promise<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.close();\n this.connect();\n reject(new Error('Timeout'));\n }, QUERY_TIMEOUT);\n this.connect()\n .then(() => {\n cb(this.db)\n .then(resolve)\n .catch(reject)\n .finally(() => {\n clearTimeout(timeout);\n });\n })\n .catch(reject);\n });\n }\n\n async query<T = unknown>(...args: QueryParameters): Promise<T[]> {\n return this.run((db) => {\n return db.query(...args);\n });\n }\n\n async query_raw<T = unknown>(...args: QueryParameters): Promise<QueryResult<T>[]> {\n return this.run((db) => {\n return db.query_raw(...args);\n });\n }\n}\n\nconst sleep = async (timeout: number) => {\n return new Promise((resolve) => {\n setTimeout(resolve, timeout);\n });\n};\n\ninterface QueueItem {\n cb: (err?: any, client?: SurrealClient) => void;\n timeout: () => boolean;\n}\n\nexport class SurrealPool {\n private queue: QueueItem[]; // TODO: Make this more sophisticated\n private connections: SurrealClient[]; // TODO: Make this more sophisticated\n\n constructor(params: {\n url: string;\n username: string;\n password: string;\n namespace: string;\n database: string;\n totalConnections: number;\n }) {\n const { totalConnections, ...clientParams } = params;\n this.queue = [];\n this.connections = new Array(totalConnections).fill(0).map(() => {\n const client = new SurrealClient(clientParams);\n client.connect();\n return client;\n });\n }\n\n private async dequeue() {\n if (this.queue.length === 0 || this.connections.length === 0) {\n return;\n }\n const q = this.queue[0] as QueueItem;\n this.queue = this.queue.slice(1);\n if (q.timeout()) {\n q.cb(new Error('Timeout'), undefined);\n this.dequeue();\n return;\n }\n\n const con = this.connections.pop() as SurrealClient;\n\n try {\n q.cb(undefined, con);\n } catch (err) {\n q.cb(err, undefined);\n } finally {\n this.connections.push(con);\n this.dequeue();\n }\n }\n\n private async run<T>(cb: (err?: any, client?: SurrealClient) => Promise<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n let isTimeout = false;\n const timeout = setTimeout(() => {\n isTimeout = true;\n reject(new Error('Timeout'));\n }, QUEUE_TIMEOUT);\n this.queue.push({\n cb: (err, client) => {\n clearTimeout(timeout);\n cb(err, client)\n .then((res) => resolve(res))\n .catch((e) => reject(e));\n },\n timeout: () => isTimeout,\n });\n this.dequeue();\n });\n }\n\n async query<T = unknown>(...args: QueryParameters): Promise<T[]> {\n return this.run((err, client) => {\n if (client) {\n return client.query<T>(...args);\n }\n throw err;\n });\n }\n\n async query_raw<T = unknown>(...args: QueryParameters): Promise<QueryResult<T>[]> {\n return this.run((err, client) => {\n if (client) {\n return client.query_raw<T>(...args);\n }\n throw err;\n });\n }\n}\n\nexport class SimpleSurrealClient {\n private url: string;\n private username: string;\n private password: string;\n private namespace: string;\n private database: string;\n\n constructor(params: { url: string; username: string; password: string; namespace: string; database: string }) {\n this.url = params.url;\n this.username = params.username;\n this.password = params.password;\n this.namespace = params.namespace;\n this.database = params.database;\n }\n\n private async run<T>(cb: (db: Surreal) => Promise<T>): Promise<T> {\n const db = new Surreal();\n try {\n await db.connect(this.url, {\n namespace: this.namespace,\n database: this.database,\n auth: {\n username: this.username,\n password: this.password,\n },\n versionCheck: false,\n });\n return await cb(db);\n } finally {\n await db.close();\n }\n }\n\n async query<T = unknown>(...args: QueryParameters): Promise<T[]> {\n return this.run<T[]>((db) => db.query(...args));\n }\n\n async query_raw<T = unknown>(...args: QueryParameters): Promise<QueryResult<T>[]> {\n return this.run<QueryResult<T>[]>((db) => db.query_raw(...args));\n }\n}\n","import type { BormConfig } from './types';\n\nexport const defaultConfig: Partial<BormConfig> = {\n query: {\n noMetadata: false,\n simplifiedLinks: true,\n debugger: false,\n returnNulls: false,\n },\n\n mutation: {\n noMetadata: false,\n preQuery: true,\n ignoreNonexistingThings: false,\n },\n};\n","export const sanitizeTableNameSurrealDb = (tableName: string) => {\n return tableName.replace(/`/g, '');\n};\n\nconst specialChars = [\n ' ',\n '-',\n '+',\n '*',\n '/',\n '=',\n '!',\n '@',\n '#',\n '$',\n '%',\n '^',\n '&',\n '(',\n ')',\n '[',\n ']',\n '{',\n '}',\n '|',\n '\\\\',\n ';',\n ':',\n \"'\",\n '\"',\n ',',\n '<',\n '>',\n '.',\n '?',\n '~',\n '`',\n];\n\nexport const sanitizeNameSurrealDB = (value: string) => {\n //if tableName includes any of the chars of this array, then wrap it in backticks\n\n if (specialChars.some((char) => value.includes(char))) {\n return `⟨${value}⟩`;\n }\n return value;\n};\n","import { isDate } from 'radash';\n\nexport const parseFlexValSurrealDB = (v: unknown) => {\n //dates are potentially defined as strings in flex-values\n if (\n typeof v === 'string' &&\n !Number.isNaN(Date.parse(v)) &&\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d{3})?Z$/.test(v)\n ) {\n return `<datetime>\"${v}\"`;\n }\n if (isDate(v)) {\n return `d\"${v.toISOString()}\"`;\n }\n if (typeof v === 'string') {\n return JSON.stringify(v);\n }\n if (['number', 'boolean'].includes(typeof v)) {\n return v;\n }\n throw new Error(`Unsupported type ${typeof v}`);\n};\n","import { isArray, isDate } from 'radash';\nimport { parseFlexValSurrealDB } from './parseFlexVal';\n\nexport const surrealDBtypeMap: Record<string, string> = {\n TEXT: 'string',\n RICH_TEXT: 'string',\n LANGUAGE_TEXT: 'string',\n PASSWORD: 'string',\n URL: 'string',\n PHONE: 'string',\n ID: 'string',\n EMAIL: 'string',\n NUMBER: 'number',\n NUMBER_DECIMAL: 'decimal',\n BOOLEAN: 'bool',\n DATE: 'datetime',\n JSON: 'object',\n FLEX: 'bool|bytes|datetime|duration|geometry|number|object|string',\n};\n\nexport const parseValueSurrealDB = (value: unknown, ct?: string): any => {\n if (value === null) {\n return 'NONE';\n }\n if (ct) {\n switch (ct) {\n case 'TEXT':\n case 'RICH_TEXT':\n case 'LANGUAGE_TEXT':\n case 'PASSWORD':\n case 'URL':\n case 'PHONE':\n case 'ID':\n case 'EMAIL':\n if (typeof value !== 'string') {\n throw new Error(`Invalid value for TEXT type: ${value}`);\n }\n return JSON.stringify(value);\n case 'NUMBER':\n case 'NUMBER_DECIMAL':\n case 'BOOLEAN':\n case 'JSON':\n return value;\n case 'DATE':\n if (\n typeof value === 'string' &&\n !Number.isNaN(Date.parse(value)) &&\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d{3})?Z$/.test(value)\n ) {\n return `<datetime>\"${value}\"`;\n }\n if (isDate(value)) {\n return `d\"${value.toISOString()}\"`;\n }\n return `<datetime>\"${value}\"`; //let surrealDB try to do the conversion\n case 'FLEX': {\n // array elements go throw the parsing\n const parsedVal = isArray(value) ? value.map((v) => parseFlexValSurrealDB(v)) : parseFlexValSurrealDB(value);\n return `${isArray(parsedVal) ? parsedVal.map((v) => v) : parsedVal}`;\n }\n default:\n throw new Error(`Unsupported data field type ${ct}.`);\n }\n }\n throw new Error(`Failed parsing value ${value} with content type ${ct}`);\n};\n","import type {\n EnrichedBormEntity,\n EnrichedBormRelation,\n EnrichedBormSchema,\n EnrichedDataField,\n EnrichedLinkField,\n EnrichedRoleField,\n Validations,\n} from '../../../types';\nimport { sanitizeNameSurrealDB } from '../helpers';\nimport { parseValueSurrealDB, surrealDBtypeMap } from '../parsing/values';\n\nconst INDENTATION = '\\t' as const;\nconst indent = (n: number): string => INDENTATION.repeat(n);\n\nconst indentPar = (str: string, level: number): string =>\n str\n .split('\\n')\n .map((line) => (line.trim() ? `${indent(level)}${line}` : line))\n .join('\\n');\n\ntype SchemaItem = EnrichedBormEntity | EnrichedBormRelation;\n\nconst convertBQLToSurQL = (schema: EnrichedBormSchema): string => {\n const header = `USE NS test;\nUSE DB test;\n\nBEGIN TRANSACTION;\n`;\n\n const entities = `-- ENTITIES\\n${convertSchemaItems(schema.entities)}`;\n const relations = `\\n-- RELATIONS\\n${convertSchemaItems(schema.relations)}`;\n const utilityFunctions = addUtilityFunctions();\n\n return `${header}${entities}${relations}${utilityFunctions}COMMIT TRANSACTION;`;\n};\n\nconst convertSchemaItems = (items: Record<string, SchemaItem>): string =>\n Object.entries(items)\n .map(([name, item]) => convertSchemaItem(sanitizeNameSurrealDB(name), item, 1))\n .join('\\n\\n');\n\nconst convertSchemaItem = (name: string, item: SchemaItem, level: number): string => {\n const baseDefinition = `${indent(level)}DEFINE TABLE ${name} SCHEMAFULL PERMISSIONS FULL;${'extends' in item && item.extends ? ` //EXTENDS ${item.extends};` : ''}`;\n const dataFields = indentPar(`-- DATA FIELDS\\n${convertDataFields(item.dataFields ?? [], name, level)}`, level + 1);\n const linkFields = indentPar(`\\n-- LINK FIELDS\\n${convertLinkFields(item.linkFields ?? [], name, level)}`, level + 1);\n const roles = 'roles' in item ? indentPar(`\\n-- ROLES\\n${convertRoles(item.roles, name, level)}`, level + 1) : '';\n\n return `${baseDefinition}\\n${dataFields}${linkFields}${roles}`;\n};\n\nconst convertDataFields = (dataFields: EnrichedDataField[], parentName: string, level: number): string =>\n dataFields\n .map((field) => {\n if (field.path === 'id') {\n return ''; //skip id fields for now, we will migrate it to a different name later like _id\n }\n const fieldType = mapContentTypeToSurQL(field.contentType, field.validations);\n const baseDefinition = `${indent(level)}DEFINE FIELD ${field.path} ON TABLE ${parentName}${['FLEX', 'JSON'].includes(field.contentType) ? ' FLEXIBLE' : ''}`; //TTODO: Better type json\n\n if (field.isVirtual) {\n const dbValue = field.dbValue?.surrealDB;\n if (!dbValue) {\n return ''; //it means is computed in BORM instead\n }\n return `${baseDefinition} VALUE ${dbValue};`;\n }\n return `${baseDefinition} TYPE ${fieldType};`;\n })\n .filter(Boolean)\n .join('\\n');\n\nconst convertLinkFields = (linkFields: EnrichedLinkField[], parentName: string, level: number): string =>\n linkFields\n .map((linkField) => {\n const fieldType =\n //linkField.cardinality === 'MANY' ? `array<record<${linkField.relation}>>` : `record<${linkField.relation}>`; //todo: uncomment once surrealDB has smart transactions\n linkField.cardinality === 'MANY'\n ? `option<array<record<${linkField.$things.map(sanitizeNameSurrealDB).join('|')}>>>`\n : `option<record<${linkField.$things.map(sanitizeNameSurrealDB).join('|')}>>`;\n\n const baseDefinition = `${indent(level)}DEFINE FIELD ${sanitizeNameSurrealDB(linkField.path)} ON TABLE ${parentName}`;\n\n if (linkField.isVirtual) {\n const dbValue = linkField.dbValue?.surrealDB;\n if (!dbValue) {\n return ''; //it means is computed in BORM instead\n }\n\n return `${baseDefinition} VALUE ${dbValue};`;\n }\n\n if (linkField.target === 'role') {\n const relationLinkField = linkFields.find(\n (lf) => lf.target === 'relation' && lf.relation === linkField.relation,\n );\n const targetRole = linkField.oppositeLinkFieldsPlayedBy?.[0];\n const targetPath = targetRole.plays;\n\n if (!targetPath || linkField.oppositeLinkFieldsPlayedBy?.length !== 1) {\n throw new Error(`Invalid link field: ${linkField.path}`);\n }\n\n const type =\n linkField.cardinality === 'ONE'\n ? `record<${sanitizeNameSurrealDB(linkField.relation)}>`\n : `array<record<${sanitizeNameSurrealDB(linkField.relation)}>>`;\n\n const pathToRelation = sanitizeNameSurrealDB(linkField.pathToRelation || '');\n const relationPath = `${pathToRelation}.${targetPath}`;\n\n const baseField =\n linkField.cardinality === 'ONE'\n ? `${baseDefinition} VALUE <future> {RETURN SELECT VALUE ${relationPath} FROM ONLY $this};`\n : `${baseDefinition} VALUE <future> {array::distinct(SELECT VALUE array::flatten(${relationPath} || []) FROM ONLY $this)};`;\n const supportField = relationLinkField?.path\n ? ''\n : `${indent(level + 1)}DEFINE FIELD ${pathToRelation} ON TABLE ${parentName} TYPE option<${type}>;`;\n\n return [baseField, supportField].join('\\n');\n }\n if (linkField.target === 'relation') {\n const fieldDefinition = `${indent(level)}DEFINE FIELD ${sanitizeNameSurrealDB(linkField.path)} ON TABLE ${parentName} TYPE ${fieldType};`;\n return `${fieldDefinition}`;\n }\n throw new Error(`Invalid link field: ${JSON.stringify(linkField)}`);\n })\n .join('\\n');\n\nconst convertRoles = (roles: Record<string, EnrichedRoleField>, parentName: string, level: number): string =>\n Object.entries(roles)\n .map(([roleName, role]) => {\n const fieldType =\n role.cardinality === 'MANY'\n ? `array<record<${role.$things.map(sanitizeNameSurrealDB).join('|')}>>`\n : `record<${role.$things.map(sanitizeNameSurrealDB).join('|')}>`;\n const fieldDefinition = `${indent(level)}DEFINE FIELD ${roleName} ON TABLE ${parentName} TYPE option<${fieldType}>;`; //Todo: remove option when surrealDB transactions are smarter.\n const roleEvent = generateRoleEvent(roleName, parentName, role, level);\n return `${fieldDefinition}\\n${roleEvent}`;\n })\n .join('\\n');\n\nconst generateRoleEvent = (roleName: string, parentName: string, role: EnrichedRoleField, level: number): string => {\n const eventName = `update_${roleName}`;\n\n const targetRelationLinkField = role.playedBy?.find((lf) => lf.target === 'relation');\n const targetRelationPath = targetRelationLinkField?.pathToRelation;\n const firstTargetRoleLinkField = role.playedBy?.find((lf) => lf.target === 'role');\n const firstTargetRolePath = firstTargetRoleLinkField?.pathToRelation;\n\n const usedLinkField = targetRelationLinkField ?? firstTargetRoleLinkField;\n\n if (!usedLinkField) {\n throw new Error(`Invalid link field: ${JSON.stringify(role)}`);\n }\n\n const pathToRelation = sanitizeNameSurrealDB((targetRelationPath ?? firstTargetRolePath) as string);\n\n const generateSet = (fields: { path: string; cardinality: 'ONE' | 'MANY' }[], action: 'remove' | 'add'): string => {\n return fields\n .map(({ path, cardinality }) => {\n const operator =\n action === 'remove' ? (cardinality === 'ONE' ? '=' : '-=') : cardinality === 'ONE' ? '=' : '+=';\n const value = action === 'remove' ? (cardinality === 'ONE' ? 'NONE' : '$before.id') : '$after.id';\n return `${path} ${operator} ${value}`;\n })\n .join(', ');\n };\n\n const impactedLinkFields =\n role.impactedLinkFields?.map((lf) => ({\n path: lf.path,\n cardinality: lf.cardinality,\n })) || [];\n\n const directField = { path: pathToRelation, cardinality: usedLinkField.cardinality };\n const allFields = [directField, ...impactedLinkFields];\n\n const removalsSet = generateSet(allFields, 'remove');\n const additionsSet = generateSet(allFields, 'add');\n\n const cardOneEvents = `\n\tIF ($before.${roleName}) THEN {UPDATE $before.${roleName} SET ${removalsSet}} END;\n\tIF ($after.${roleName}) THEN {UPDATE $after.${roleName} SET ${additionsSet}} END;`;\n\n const cardManyEvents = `\n\tLET $edges = fn::get_mutated_edges($before.${roleName}, $after.${roleName});\n\tFOR $unlink IN $edges.deletions {UPDATE $unlink SET ${removalsSet};};\n\tFOR $link IN $edges.additions {${\n usedLinkField.cardinality === 'ONE'\n ? `\n\t\tIF ($link.${pathToRelation}) THEN {UPDATE $link.${pathToRelation} SET ${roleName} ${role.cardinality === 'ONE' ? '= NONE' : '-= $link.id'}} END;` //! This should probably be an independnt event on card one field, that it replaces old one by new one, instead of doing it from here\n : ''\n }\n\t\tUPDATE $link SET ${additionsSet};\n\t};`;\n\n return indentPar(\n `DEFINE EVENT ${eventName} ON TABLE ${parentName} WHEN $before.${roleName} != $after.${roleName} THEN {${role.cardinality === 'ONE' ? cardOneEvents : cardManyEvents}\n};`,\n level + 1,\n );\n};\n\nconst mapContentTypeToSurQL = (contentType: string, validations?: Validations): string => {\n const type = validations?.enum\n ? `${validations.enum.map((value: unknown) => parseValueSurrealDB(value, contentType)).join('|')}`\n : surrealDBtypeMap[contentType];\n if (!type) {\n throw new Error(`Unknown content type: ${contentType}`);\n }\n\n if (validations?.required) {\n return `${type}`;\n }\n return `option<${type}>`;\n};\n\nconst addUtilityFunctions = (): string => `\n-- BORM TOOLS\n\tDEFINE FUNCTION fn::get_mutated_edges(\n\t\t$before_relation: option<array|record>,\n\t\t$after_relation: option<array|record>,\n\t) {\n\t\tLET $notEmptyCurrent = $before_relation ?? [];\n\t\tLET $current = array::flatten([$notEmptyCurrent]);\n\t\tLET $notEmptyResult = $after_relation ?? [];\n\t\tLET $result = array::flatten([$notEmptyResult]);\n\t\tLET $links = array::complement($result, $current);\n\t\tLET $unlinks = array::complement($current, $result);\n\t\t\n\t\tRETURN {\n\t\t\tadditions: $links,\n\t\t\tdeletions: $unlinks\n\t\t};\n\t};\n\n\tDEFINE FUNCTION fn::as_array($var: option<array<record>|record>) { \n\t\tRETURN (type::is::array($var) AND $var) OR [$var]\n\t};\n`;\n\nexport const defineSURQLSchema = (schema: EnrichedBormSchema): string => convertBQLToSurQL(schema);\n","import { SessionType, TransactionType } from 'typedb-driver';\nimport type { BormConfig, DBHandles, EnrichedBormSchema } from '../../../types';\n\ntype Attribute = {\n dbPath: string;\n contentType: string;\n};\n\nconst removeDuplicateObjects = (arr: Attribute[]) => {\n const uniqueObjects: Attribute[] = [];\n\n const uniqueMap = new Map();\n\n arr.forEach((obj) => {\n const { dbPath, contentType } = obj;\n const key = `${dbPath}-${contentType}`;\n\n if (!uniqueMap.has(key)) {\n uniqueMap.set(key, true);\n uniqueObjects.push(obj);\n }\n });\n\n return uniqueObjects;\n};\n\nexport const convertTQLSchema = (connectorId: any, schema: EnrichedBormSchema) => {\n let output = '';\n const usedAttributes: Attribute[] = [];\n\n output += '\\n';\n\n // CONVERTING ENTITIES\n\n Object.keys(schema.entities)\n .filter((eName) => schema.entities[eName].defaultDBConnector.id === connectorId)\n .forEach((entityName) => {\n const entity = schema.entities[entityName];\n const { dataFields, linkFields, name } = entity;\n // Checks to see if parent already contains these fields\n\n output += `${name} sub ${'extends' in entity ? entity.extends : 'entity'},\\n`;\n\n // Adding data fields\n if (dataFields && dataFields.length > 0) {\n dataFields.forEach((field: any) => {\n if (field.contentType === 'REF') {\n return;\n } //ignore ref types\n if (field.inherited) {\n return;\n }\n if (field.isIdField) {\n output += `\\towns ${field.dbPath} @key,\\n`;\n } else {\n output += `\\towns ${field.dbPath},\\n`;\n }\n usedAttributes.push({ dbPath: field.dbPath, contentType: field.contentType });\n });\n }\n // Adding link fields\n if (linkFields && linkFields.length > 0) {\n const usedLinkFields: string[] = [];\n linkFields.forEach((linkField) => {\n const { relation, plays, inherited } = linkField;\n if (inherited) {\n return;\n }\n //check if the role in the relation is inherited\n const isInheritedRole = schema.relations[relation].roles[plays].inherited;\n if (!isInheritedRole && !usedLinkFields.includes(`${relation}:${plays}`)) {\n output += `\\tplays ${relation}:${plays},\\n`;\n usedLinkFields.push(`${relation}:${plays}`);\n }\n });\n }\n output = output.replace(/,\\s*$/, ';\\n');\n output += '\\n';\n });\n\n // CONVERTING RELATIONS\n Object.keys(schema.relations)\n .filter((rName) => schema.relations[rName].defaultDBConnector.id === connectorId)\n .forEach((relationName) => {\n const relation = schema.relations[relationName];\n // TODO: fix name ts error\n const { dataFields, roles, name, linkFields } = relation;\n // Checks to see if parent already contains these fields\n\n output += `${name} sub ${'extends' in relation ? relation.extends : 'relation'},\\n`;\n // Removes ids from data fields, so their attributes aren't repeated\n\n // Adding data fields\n if (dataFields && dataFields.length > 0) {\n dataFields.forEach((field: any) => {\n if (!field.inherited) {\n if (field.isIdField) {\n output += `\\towns ${field.dbPath} @key,\\n`;\n } else {\n output += `\\towns ${field.dbPath},\\n`;\n }\n usedAttributes.push({ dbPath: field.dbPath, contentType: field.contentType });\n }\n });\n }\n // Adding role fields\n if (roles) {\n Object.keys(roles).forEach((roleName) => {\n if (!roles[roleName].inherited) {\n output += `\\trelates ${roleName},\\n`;\n }\n });\n }\n // Adding link fields\n if (linkFields && linkFields.length > 0) {\n const usedLinkFields: string[] = [];\n linkFields.forEach((linkField) => {\n const { plays, relation } = linkField;\n const isInheritedRole = schema.relations[relation].roles[plays].inherited;\n if (!isInheritedRole && !linkField.inherited && !usedLinkFields.includes(`${relation}:${plays}`)) {\n output += `\\tplays ${linkField.relation}:${plays},\\n`;\n usedLinkFields.push(`${relation}:${plays}`);\n }\n });\n }\n output = output.replace(/,\\s*$/, ';\\n');\n output += '\\n';\n });\n\n // DEFINING ATTRIBUTES\n\n let attributes = 'define\\n\\n';\n const newUsedAttributes = removeDuplicateObjects(usedAttributes);\n\n newUsedAttributes.forEach((attribute: Attribute) => {\n // All conditions for BORM to TQL attribute types\n if (attribute.contentType === 'TEXT' || attribute.contentType === 'ID' || attribute.contentType === 'JSON') {\n attributes += `${attribute.dbPath} sub attribute, value string;\\n`;\n } else if (attribute.contentType === 'EMAIL') {\n attributes += `${attribute.dbPath} sub attribute, value string,\\n`;\n attributes +=\n \"\\tregex '^(?=.{1,64}@)[A-Za-z0-9_-]+(\\\\\\\\.[A-Za-z0-9_-]+)*@[^-][A-Za-z0-9-]+(\\\\\\\\.[A-Za-z0-9-]+)*(\\\\\\\\.[A-Za-z]{2,})$';\\n\";\n } else if (attribute.contentType === 'DATE') {\n attributes += `${attribute.dbPath} sub attribute, value datetime;\\n`;\n } else if (attribute.contentType === 'BOOLEAN') {\n attributes += `${attribute.dbPath} sub attribute, value boolean;\\n`;\n } else if (attribute.contentType === 'NUMBER') {\n attributes += `${attribute.dbPath} sub attribute, value long;\\n`;\n } else if (attribute.contentType === 'FLEX') {\n attributes += `${attribute.dbPath} sub flexAttribute;\\n`;\n } else if (attribute.contentType === 'REF') {\n return; //not compatible with typeDB\n } else {\n throw new Error(\n `Conversion of borm schema to TypeDB schema for data type \"${attribute.contentType}\" is not implemented`,\n );\n }\n });\n\n const utils = `#Tools, reserved for every schema using borm\n\nstringAttribute sub attribute, value string;\nlongAttribute sub attribute, value long;\ndoubleAttribute sub attribute, value double;\nbooleanAttribute sub attribute, value boolean;\ndatetimeAttribute sub attribute, value datetime;\nflexAttribute sub attribute, abstract, value string,\n\towns stringAttribute,\n\towns longAttribute,\n\towns doubleAttribute,\n\towns booleanAttribute,\n\towns datetimeAttribute;\n`;\n\n return `${attributes}\\n\\n${output}\\n${utils}`;\n};\n\nexport const defineTQLSchema = async (\n connectorId: string,\n config: BormConfig,\n schema: EnrichedBormSchema,\n dbHandles: DBHandles,\n) => {\n if (!dbHandles.typeDB) {\n throw new Error('No TypeDB handles found');\n }\n const typeDBString = convertTQLSchema(connectorId, schema);\n const session = dbHandles.typeDB.get(connectorId)?.session;\n const client = dbHandles.typeDB.get(connectorId)?.client;\n if (!session) {\n console.log('Session Status: ', 'NO SESSION');\n return;\n }\n\n if (!client) {\n throw new Error('No TypeDB client found');\n }\n\n await session.close();\n const [{ dbName }] = config.dbConnectors;\n const db = await client.databases.get(dbName);\n await db.delete();\n await client.databases.create(dbName);\n\n const schemaSession = await client.session(config.dbConnectors[0].dbName, SessionType.SCHEMA);\n //const dataSession = await client.session(config.dbConnectors[0].dbName, SessionType.DATA);\n\n // 3. Defining new schema\n\n const schemaTransaction = await schemaSession.transaction(TransactionType.WRITE);\n\n await schemaTransaction.query.define(typeDBString);\n await schemaTransaction.commit();\n await schemaTransaction.close();\n\n /*const getSchemaTransaction = await dataSession.transaction(TransactionType.READ);\n\tconst getSchemaQuery = 'match $a sub thing; get $a;';\n\tconst getSchemaStream = await getSchemaTransaction.query.fetch(getSchemaQuery);\n\tconst schemaThings = await getSchemaStream.collect();\n\tconsole.log('schemaThings', schemaThings);\n\t*/\n return typeDBString;\n //await getSchemaTransaction.close();\n};\n","import { defineSURQLSchema } from '../adapters/surrealDB/schema/define';\nimport { defineTQLSchema } from '../adapters/typeDB/schema/define';\nimport type { BormConfig, DBHandles, EnrichedBormSchema } from '../types';\n\nexport const bormDefine = async (config: BormConfig, schema: EnrichedBormSchema, dbHandles: DBHandles) => {\n const schemas = async () => {\n const typeDBEntries = await Promise.all(\n [...(dbHandles.typeDB || [])].map(async ([key]) => [key, await defineTQLSchema(key, config, schema, dbHandles)]),\n );\n\n const typeDBEntriesFixed = typeDBEntries.map((entry) => [entry[0], entry[1]] as const);\n\n const surrealDBEntries = await Promise.all(\n [...(dbHandles.surrealDB || [])].map(async ([key]) => [key, defineSURQLSchema(schema)]),\n );\n\n const surrealDBEntriesFixed = surrealDBEntries.map((entry) => [entry[0], entry[1]] as const);\n return {\n typeDB: Object.fromEntries(typeDBEntriesFixed),\n surrealDB: Object.fromEntries(surrealDBEntriesFixed),\n };\n };\n return await schemas();\n\n // TYPE DB TRANSACTIONS\n\n // 4. Closing sessions\n};\n","import type { DBHandleKey } from '../types';\n\nexport type AdapterContext = {\n mutation: {\n splitArray$Ids: boolean;\n requiresParseBQL: boolean;\n };\n};\n\nexport const adapterContext: Record<DBHandleKey, AdapterContext> = {\n typeDB: {\n mutation: {\n splitArray$Ids: true,\n requiresParseBQL: true,\n },\n },\n surrealDB: {\n mutation: {\n splitArray$Ids: false, //probably not needed\n requiresParseBQL: false, //probably not needed\n },\n },\n} as const;\n","//! TO-DO Rule: Everything that can be changed or defined by the user should use $ prefix, but the rest is metadata and should be packed in symbols, depending on their origin. extension inside the schema and schema or query inside the query. Probably no more categories are necessary\nexport const Schema = Symbol.for('schema');\n\nexport const QueryPath = Symbol.for('queryPath');\n\nexport const StepPrint = Symbol.for('stepPrint');\n\nexport const EdgeType = Symbol.for('edgeType');\nexport const EdgeSchema = Symbol.for('edgeSchema');\nexport const Path = Symbol.for('path');\n\nexport const DBNode = Symbol.for('dbNode');\nexport const IsTransformed = Symbol.for('isTransformed');\n\n//flatBQL\nexport const Parent = Symbol.for('parent');\n\n/// Fields\nexport const FieldSchema = Symbol.for('fieldSchema');\n\n/// Shared schema metadata\nexport const SharedMetadata = Symbol.for('sharedMetadata');\n\n/// SurrealDB schema metadata\nexport const SuqlMetadata = Symbol.for('suqlMetadata');\n\n//TODO: restructure everything on top of this to be packed in the 3 symbols hereunder.\n//* SCHEMA STORED\n// For metadata that extends the schema\nexport const Extension = Symbol.for('extension');\n\n//* QUERY STORED\n//export const QueryContext = Symbol.for('queryContext'); //todo: queryContext and schemaContext as the only two symbols with a particular structure\n//export const SchemaContext = Symbol.for('schemaContext');\n","import { adapterContext } from './adapters';\nimport type {\n AllDbHandles,\n BormEntity,\n BormRelation,\n BormSchema,\n DBHandles,\n DataField,\n EnrichedBormEntity,\n EnrichedBormRelation,\n EnrichedBormSchema,\n EnrichedDataField,\n EnrichedLinkField,\n EnrichedRefField,\n EnrichedRoleField,\n LinkField,\n LinkedFieldWithThing,\n RefField,\n RoleField,\n SharedEnrichedProps,\n} from './types';\nimport { SharedMetadata, SuqlMetadata } from './types/symbols';\n\nexport const enrichSchema = (schema: BormSchema, dbHandles: DBHandles) => {\n const orderedEntities = orderExtended(schema.entities);\n const orderedRelations = orderExtended(schema.relations);\n const allLinkFields = getAllLinkFields(schema);\n const enrichedSchema: EnrichedBormSchema = { entities: {}, relations: {} };\n\n orderedEntities.forEach((name) => {\n const thing = schema.entities[name];\n if (!thing) {\n throw new Error(`Entity \"${name}\" does not exist`);\n }\n const extendedThing = 'extends' in thing ? enrichedSchema.entities[thing.extends] : undefined;\n if (extendedThing) {\n addSubType(enrichedSchema, extendedThing.name, name);\n }\n const enrichedThing = enrichThing({ schema, enrichedSchema, extendedThing, name, thing, dbHandles, allLinkFields });\n enrichedSchema.entities[name] = {\n ...enrichedThing,\n defaultDBConnector: thing.defaultDBConnector,\n thingType: 'entity',\n };\n });\n\n orderedRelations.forEach((name) => {\n const thing = schema.relations[name];\n if (!thing) {\n throw new Error(`Relation \"${name}\" does not exist`);\n }\n const extendedThing = 'extends' in thing ? enrichedSchema.relations[thing.extends] : undefined;\n if (extendedThing) {\n addSubType(enrichedSchema, extendedThing.name, name);\n }\n const enrichedThing = enrichThing({ schema, enrichedSchema, extendedThing, name, thing, dbHandles, allLinkFields });\n const enrichedRelation: EnrichedBormRelation = {\n ...enrichedThing,\n defaultDBConnector: thing.defaultDBConnector,\n roles: Object.fromEntries(\n Object.entries(thing.roles ?? {}).map(([k, role]) => [\n k,\n enrichRoleField({\n role,\n roleName: k,\n relationName: name,\n relation: thing,\n allExtends: enrichedThing.allExtends,\n allLinkFields,\n }),\n ]),\n ),\n thingType: 'relation',\n };\n if ('extends' in thing && extendedThing) {\n Object.entries(extendedThing?.roles ?? {}).forEach(([k, role]) => {\n const inherited = enrichRoleField({\n role,\n roleName: k,\n relationName: name,\n relation: thing,\n allExtends: enrichedThing.allExtends,\n allLinkFields,\n });\n enrichedRelation.roles[k] = {\n ...inherited,\n inherited: true,\n [SharedMetadata]: {\n ...role[SharedMetadata],\n inheritanceOrigin: role[SharedMetadata]?.inheritanceOrigin || thing.extends,\n },\n };\n });\n }\n enrichedSchema.relations[name] = enrichedRelation;\n });\n\n Object.values(enrichedSchema.entities).forEach((entity) => {\n entity.linkFields?.forEach((lf) => {\n // eslint-disable-next-line no-param-reassign\n lf.$things = expandSubThings(enrichedSchema, lf.$things);\n });\n });\n\n Object.values(enrichedSchema.relations).forEach((relation) => {\n relation.linkFields?.forEach((lf) => {\n // eslint-disable-next-line no-param-reassign\n lf.$things = expandSubThings(enrichedSchema, lf.$things);\n });\n Object.values(relation.roles ?? {}).forEach((role) => {\n // eslint-disable-next-line no-param-reassign\n role.$things = expandSubThings(enrichedSchema, role.$things);\n });\n });\n\n return enrichedSchema;\n};\n\nconst orderExtended = (thingMap: Record<string, BormEntity | BormRelation>) => {\n const ordered: string[] = [];\n const seen = new Set<string>();\n const inProcess = new Set<string>();\n Object.keys(thingMap).forEach((name) => pushExtended({ thingMap, name, inProcess, seen, ordered }));\n return ordered;\n};\n\n/**\n * Mutate `ordered` and `seen`.\n */\nconst pushExtended = (params: {\n thingMap: Record<string, BormEntity | BormRelation>;\n name: string;\n inProcess: Set<string>;\n seen: Set<string>;\n ordered: string[];\n}) => {\n const { thingMap, name, inProcess, seen, ordered } = params;\n if (seen.has(name)) {\n return;\n }\n if (inProcess.has(name)) {\n throw new Error(`A list of thing extends each other that creates circular dependencies: ${[...inProcess]}`);\n }\n inProcess.add(name);\n const entity = thingMap[name];\n if (!entity) {\n throw new Error(`Entity/relation \"${name}\" does not exist`);\n }\n if ('extends' in entity) {\n pushExtended({ ...params, name: entity.extends });\n }\n inProcess.delete(name);\n seen.add(name);\n ordered.push(name);\n};\n\nconst getAllExtended = (schema: EnrichedBormSchema, extended: string) => {\n let name: string | undefined = extended;\n const _extended: string[] = [];\n while (name) {\n const thing: EnrichedBormEntity | EnrichedBormRelation | undefined =\n schema.entities[name] || schema.relations[name];\n if (!thing) {\n throw new Error(`Entity/relation \"${name}\" does not exist`);\n }\n _extended.push(name);\n name = 'extends' in thing ? thing.extends : undefined;\n }\n return _extended.length !== 0 ? _extended : undefined;\n};\n\n/**\n * Mutate `enrichedSchema`.\n */\nconst addSubType = (enrichedSchema: EnrichedBormSchema, thing: string, subThing: string) => {\n const _thing = enrichedSchema.entities[thing] ?? enrichedSchema.relations[thing];\n if (!_thing) {\n throw new Error(`Entity/relation \"${thing}\" does not exist`);\n }\n _thing.subTypes = _thing.subTypes ?? [];\n _thing.subTypes.push(subThing);\n if (_thing.extends) {\n addSubType(enrichedSchema, _thing.extends, subThing);\n }\n};\n\nconst enrichThing = <T extends BormEntity | BormRelation>(params: {\n schema: BormSchema;\n enrichedSchema: EnrichedBormSchema;\n name: string;\n thing: T;\n extendedThing?: T extends BormRelation ? EnrichedBormRelation : EnrichedBormEntity;\n dbHandles: DBHandles;\n allLinkFields: LinkedFieldWithThing[];\n}): SharedEnrichedProps => {\n const { schema, enrichedSchema, name, thing, dbHandles, extendedThing, allLinkFields } = params;\n const [db] =\n (Object.entries(dbHandles).find(([_, handle]) =>\n handle.get(thing.defaultDBConnector.id),\n ) as (keyof AllDbHandles)[]) ?? [];\n\n if (!db) {\n throw new Error(`DB handle for ${thing.defaultDBConnector.id} does not exist`);\n }\n\n const idFields = [...(thing.idFields ?? extendedThing?.idFields ?? [])]; // TODO: Where to get the idFields if it's not defined?\n if (idFields.length === 0) {\n throw new Error(`\"${name}\" does not have an id field`);\n }\n\n const hooks = { ...thing.hooks };\n const dataFields = thing.dataFields?.map((df) => enrichDataField(df, name, idFields)) ?? [];\n const linkFields =\n thing.linkFields?.map((linkField) =>\n enrichLinkField({ linkField, thingName: name, thing, schema, allLinkFields }),\n ) ?? [];\n const refFields = Object.fromEntries(\n Object.entries(thing.refFields ?? {}).map(([k, v]) => [k, enrichRefField(v, k)]),\n );\n\n if ('extends' in thing && extendedThing) {\n if (extendedThing.hooks?.pre) {\n hooks.pre = [...(extendedThing.hooks.pre || []), ...(thing.hooks?.pre || [])];\n }\n\n extendedThing.dataFields?.forEach((df) => {\n dataFields.push({\n ...df,\n inherited: true,\n [SharedMetadata]: {\n ...df[SharedMetadata],\n inheritanceOrigin: df[SharedMetadata]?.inheritanceOrigin || thing.extends,\n },\n });\n });\n\n extendedThing.linkFields?.forEach((lf) => {\n linkFields.push({\n ...lf,\n inherited: true,\n [SharedMetadata]: {\n ...lf[SharedMetadata],\n inheritanceOrigin: lf[SharedMetadata]?.inheritanceOrigin || thing.extends,\n },\n });\n });\n\n Object.entries(extendedThing.refFields ?? {}).forEach(([k, v]) => {\n refFields[k] = {\n ...v,\n inherited: true,\n [SharedMetadata]: {\n ...v[SharedMetadata],\n inheritanceOrigin: v[SharedMetadata]?.inheritanceOrigin || thing.extends,\n },\n };\n });\n }\n\n return {\n ...thing,\n name,\n db,\n dbContext: adapterContext[db],\n idFields,\n hooks,\n dataFields,\n linkFields,\n refFields,\n enumFields: dataFields?.filter((df) => df.validations?.enum).map((df) => df.path) ?? [],\n fnValidatedFields: dataFields?.filter((df) => df.validations?.fn).map((df) => df.path) ?? [],\n virtualFields: dataFields?.filter((df) => df.isVirtual).map((df) => df.path) ?? [],\n computedFields: dataFields?.filter((df) => df.default && !df.isVirtual).map((df) => df.path) ?? [],\n requiredFields: dataFields?.filter((df) => df.validations?.required).map((df) => df.path) ?? [],\n allExtends: 'extends' in thing ? getAllExtended(enrichedSchema, thing.extends) : undefined,\n // @ts-expect-error TODO: Define it in the type\n dbProviderConfig: db === 'surrealDB' ? dbHandles[db]?.get(thing.defaultDBConnector.id)?.providerConfig : undefined,\n };\n};\n\nconst getAllLinkFields = (schema: BormSchema): LinkedFieldWithThing[] => {\n const linkFields: LinkedFieldWithThing[] = [];\n Object.entries(schema.entities).forEach(([name, entity]) => {\n entity.linkFields?.forEach((lf) => {\n linkFields.push({\n ...lf,\n thing: name,\n thingType: 'entity',\n pathToRelation: lf.target === 'relation' ? lf.path : lf.relation.toLocaleLowerCase(),\n });\n });\n });\n Object.entries(schema.relations).forEach(([name, entity]) => {\n entity.linkFields?.forEach((lf) => {\n linkFields.push({\n ...lf,\n thing: name,\n thingType: 'relation',\n pathToRelation: lf.target === 'relation' ? lf.path : lf.relation.toLocaleLowerCase(),\n });\n });\n });\n return linkFields;\n};\n\nconst enrichDataField = (df: DataField, thing: string, idFields: string[]): EnrichedDataField => ({\n ...df,\n cardinality: df.cardinality || 'ONE',\n dbPath: 'dbPath' in df && typeof df.dbPath === 'string' ? df.dbPath : getDbPath(thing, df.path, df.shared),\n isIdField: !!idFields?.includes(df.path),\n inherited: false,\n [SharedMetadata]: {\n fieldType: 'dataField',\n },\n [SuqlMetadata]: {\n dbPath: df.path, // TODO: What should be the value?\n },\n});\n\nconst enrichRefField = (refField: RefField, path: string): EnrichedRefField => ({\n ...refField,\n cardinality: refField.cardinality || 'ONE',\n path,\n dbPath: refField.dbPath || path,\n inherited: false,\n [SharedMetadata]: {\n fieldType: 'refField',\n },\n});\n\nconst enrichLinkField = (params: {\n linkField: LinkField;\n thing: BormEntity | BormRelation;\n thingName: string;\n schema: BormSchema;\n allLinkFields: LinkedFieldWithThing[];\n}): EnrichedLinkField => {\n const { linkField, thing, thingName, schema, allLinkFields } = params;\n const linkFieldRelation = schema.relations[linkField.relation] as EnrichedBormRelation;\n\n if (!linkField.isVirtual) {\n //its ok for virtual linkFields to don't have a relation\n if (!linkFieldRelation) {\n throw new Error(`The relation ${linkField.relation} does not exist in the schema`);\n }\n\n if (!hasRole(schema, linkField.relation, linkField.plays)) {\n throw new Error(\n `The role ${linkField.plays} is not defined in the relation ${linkField.relation} (linkField: ${linkField.path})`,\n );\n }\n }\n\n const queryPath =\n linkField.cardinality === 'MANY' ? `$parent.[\\`${linkField.path}\\`]` : `$parent.\\`${linkField.path}\\``;\n\n if (linkField.target === 'relation') {\n if (linkField.isVirtual) {\n throw new Error(\n `[Schema] Virtual linkFields can't target a relation. Thing: \"${thingName}\" LinkField: \"${linkField.path}.\"`,\n );\n }\n\n return {\n ...linkField,\n $things: [linkField.relation],\n oppositeLinkFieldsPlayedBy: [\n {\n plays: linkField.path,\n thing: linkField.relation,\n thingType: 'relation',\n },\n ],\n fieldType: 'linkField',\n inherited: false,\n [SharedMetadata]: {\n fieldType: 'linkField',\n },\n [SuqlMetadata]: {\n queryPath,\n },\n };\n }\n\n const oppositeLinkFieldsPlayedBy = allLinkFields.filter(\n (x) => x.relation === linkField.relation && x.plays !== linkField.plays && x.target === 'role',\n );\n\n if (oppositeLinkFieldsPlayedBy.length === 0) {\n throw new Error(\n `[Schema] LinkFields require to have at least one opposite linkField playing an opposite role. Thing: \"${thingName}\" LinkField: \"${linkField.path}.\"`,\n );\n }\n\n if (oppositeLinkFieldsPlayedBy.length > 1) {\n //temp: lets just warn and add an error only if actually used\n console.warn(\n `[Schema] LinkField ${linkField.path} in ${thingName} has multiple candidates ${oppositeLinkFieldsPlayedBy.map((lf) => lf.thing).join(',')} and this is not yet supported. Please target a single one using targetRoles with a single role`,\n );\n }\n\n return {\n ...linkField,\n fieldType: 'linkField',\n pathToRelation:\n thing.linkFields?.find((lf) => lf.target === 'relation' && lf.relation === linkField.relation)?.path ??\n linkField.relation.toLocaleLowerCase(),\n inherited: false,\n $things: oppositeLinkFieldsPlayedBy.map((i) => i.thing),\n oppositeLinkFieldsPlayedBy,\n [SharedMetadata]: {\n fieldType: 'linkField',\n },\n [SuqlMetadata]: {\n queryPath,\n },\n };\n};\n\nconst enrichRoleField = (params: {\n role: RoleField;\n roleName: string;\n relationName: string;\n relation: BormRelation;\n allExtends?: string[];\n allLinkFields: LinkedFieldWithThing[];\n}): EnrichedRoleField => {\n const { role, roleName, relationName, relation, allExtends, allLinkFields } = params;\n\n //Check if the key is used by linkFields or roleFields already\n if (\n relation.dataFields?.find((df) => df.path === roleName) ||\n relation.linkFields?.find((lf) => lf.path === roleName)\n ) {\n throw new Error(`[Schema] The path ${roleName} is already in use by a dataField or linkField in ${relationName}.`);\n }\n const playedBy = allLinkFields.filter((x) => x.relation === relationName && x.plays === roleName);\n\n const impactedLinkFields = allLinkFields.filter(\n (x) => x.target === 'relation' && x.plays === roleName && allExtends?.includes(x.relation),\n );\n\n return {\n ...role,\n fieldType: 'roleField',\n inherited: false,\n playedBy: playedBy.map((lf) => ({\n ...lf,\n pathToRelation:\n lf.target === 'relation'\n ? lf.path\n : (relation.linkFields?.find(\n (lf) => lf.target === 'relation' && lf.relation === roleName && lf.plays === roleName,\n )?.path ?? lf.relation.toLocaleLowerCase()),\n })),\n impactedLinkFields,\n path: roleName,\n $things: [...new Set(playedBy.map((i) => i.thing))],\n [SharedMetadata]: {\n fieldType: 'roleField',\n },\n [SuqlMetadata]: {\n queryPath: role.cardinality === 'MANY' ? `$parent.[\\`${roleName}\\`]` : `$parent.\\`${roleName}\\``,\n },\n };\n};\n\nconst getDbPath = (thing: string, attribute: string, shared?: boolean) =>\n shared ? attribute : `${thing}·${attribute}`;\n\nconst hasRole = (schema: BormSchema, thing: string, role: string) => {\n const _thing = schema.relations[thing];\n if (!_thing) {\n throw new Error(`Relation \"${thing}\" does not exist`);\n }\n if (_thing.roles?.[role]) {\n return true;\n }\n if ('extends' in _thing) {\n return hasRole(schema, _thing.extends, role);\n }\n return false;\n};\n\nconst expandSubThings = (enrichedSchema: EnrichedBormSchema, things: string[]) => {\n return things.flatMap((i) => [i, ...((enrichedSchema.entities[i] ?? enrichedSchema.relations[i])?.subTypes ?? [])]);\n};\n\n//todo!: review line per line to ensure all behaviour has been migrated. Specially the errors and checks\n// /* eslint-disable no-param-reassign */\n// import { produce } from 'immer';\n// import type { TraversalCallbackContext } from 'object-traversal';\n// import { traverse } from 'object-traversal';\n// import { isArray, mapEntries } from 'radash';\n// import { SharedMetadata, SuqlMetadata } from './types/symbols';\n\n// // todo: split helpers between common helpers, typeDBhelpers, dgraphelpers...\n// import type {\n// \tBormSchema,\n// \tBormRelation,\n// \tEnrichedBormEntity,\n// \tEnrichedBormRelation,\n// \tEnrichedBormSchema,\n// \tLinkedFieldWithThing,\n// \tDataField,\n// \tBormEntity,\n// \tDBHandles,\n// \tDBHandleKey,\n// \tEnrichedDataField,\n// \tEnrichedLinkField,\n// \tLinkField,\n// \tRefField,\n// } from './types';\n// import type { AdapterContext } from './adapters';\n// import { adapterContext } from './adapters';\n// import { getSurrealLinkFieldQueryPath } from './adapters/surrealDB/enrichSchema/helpers';\n// import { getSchemaByThing } from './helpers';\n\n// const getDbPath = (thing: string, attribute: string, shared?: boolean) =>\n// \tshared ? attribute : `${thing}·${attribute}`;\n\n// export const getPath = (dbPath: string) => {\n// \tconst parts = dbPath.split('·');\n// \treturn parts[parts.length - 1];\n// };\n\n// export const extendSchema = (schema: BormSchema): BormSchema => {\n// \tconst withExtensionsSchema = produce(schema, (draft) =>\n// \t\ttraverse(\n// \t\t\tdraft,\n// \t\t\t({ key, value, meta }: TraversalCallbackContext) => {\n// \t\t\t\tif (meta.depth !== 2) {\n// \t\t\t\t\treturn;\n// \t\t\t\t}\n// \t\t\t\tconst val = value as BormEntity | BormRelation;\n\n// \t\t\t\tif (key) {\n// \t\t\t\t\t//* DATA_FIELDS: Adding default values and metadata to every dataField\n// \t\t\t\t\tval.dataFields = val.dataFields?.map((df: DataField | EnrichedDataField) => ({\n// \t\t\t\t\t\t...df,\n// \t\t\t\t\t\t...(val.idFields?.includes(df.path) ? { isIdField: true } : { isIdField: false }),\n// \t\t\t\t\t\tcardinality: df.cardinality || 'ONE',\n// \t\t\t\t\t\t//todo: Make this user defined and remove the prefix by default\n// \t\t\t\t\t\tdbPath: 'dbPath' in df ? df.dbPath : getDbPath(key, df.path, df.shared), //if it was already defined in a parent, we keep it\n// \t\t\t\t\t\t[SharedMetadata]: {\n// \t\t\t\t\t\t\tfieldType: 'dataField',\n// \t\t\t\t\t\t},\n// \t\t\t\t\t})) as EnrichedDataField[];\n\n// \t\t\t\t\t//* REFERENCE_FIELDS: Adding default values and metadata to every refField\n// \t\t\t\t\tif (val.refFields) {\n// \t\t\t\t\t\tval.refFields = mapEntries(val.refFields || {}, (refFieldKey, refField) => {\n// \t\t\t\t\t\t\treturn [\n// \t\t\t\t\t\t\t\trefFieldKey,\n// \t\t\t\t\t\t\t\t{\n// \t\t\t\t\t\t\t\t\t...refField,\n// \t\t\t\t\t\t\t\t\tcardinality: refField.cardinality || 'ONE',\n// \t\t\t\t\t\t\t\t\tpath: refFieldKey,\n// \t\t\t\t\t\t\t\t\t[SharedMetadata]: {\n// \t\t\t\t\t\t\t\t\t\tfieldType: 'refField',\n// \t\t\t\t\t\t\t\t\t},\n// \t\t\t\t\t\t\t\t},\n// \t\t\t\t\t\t\t];\n// \t\t\t\t\t\t});\n// \t\t\t\t\t}\n\n// \t\t\t\t\t//* LINK_FIELDS: Adding default values and metadata to every linkField\n// \t\t\t\t\tval.linkFields = val.linkFields?.map((lf: LinkField | EnrichedLinkField) => ({\n// \t\t\t\t\t\t...lf,\n// \t\t\t\t\t\t[SharedMetadata]: {\n// \t\t\t\t\t\t\tfieldType: 'linkField',\n// \t\t\t\t\t\t},\n// \t\t\t\t\t}));\n\n// \t\t\t\t\t//* ROLE_FIELDS: Adding default values and metadata to every roleField\n// \t\t\t\t\tif ('roles' in val) {\n// \t\t\t\t\t\tval.roles = mapEntries(val.roles || {}, (roleKey, role) => {\n// \t\t\t\t\t\t\treturn [\n// \t\t\t\t\t\t\t\troleKey,\n// \t\t\t\t\t\t\t\t{\n// \t\t\t\t\t\t\t\t\t...role,\n// \t\t\t\t\t\t\t\t\tcardinality: role.cardinality || 'ONE',\n// \t\t\t\t\t\t\t\t\t[SharedMetadata]: {\n// \t\t\t\t\t\t\t\t\t\tfieldType: 'roleField',\n// \t\t\t\t\t\t\t\t\t},\n// \t\t\t\t\t\t\t\t},\n// \t\t\t\t\t\t\t];\n// \t\t\t\t\t\t});\n// \t\t\t\t\t}\n// \t\t\t\t}\n\n// \t\t\t\tif (value.extends) {\n// \t\t\t\t\tif (!value.defaultDBConnector.as) {\n// \t\t\t\t\t\t//todo: Check if we can add the \"as\" as default. When the path of the parent === name of the parent then it's fine. As would be used for those cases where they are not equal (same as path, which is needed only if different names)\n// \t\t\t\t\t\tthrow new Error(\n// \t\t\t\t\t\t\t`[Schema] ${key} is extending a thing but missing the \"as\" property in its defaultDBConnector. Path:${meta.nodePath}`,\n// \t\t\t\t\t\t);\n// \t\t\t\t\t}\n\n// \t\t\t\t\t/// IMPORT THE EXTENDED SCHEMA\n// \t\t\t\t\tconst extendedSchema = (draft.entities[value.extends] || draft.relations[value.extends]) as\n// \t\t\t\t\t\t| EnrichedBormRelation\n// \t\t\t\t\t\t| EnrichedBormEntity;\n\n// \t\t\t\t\t/// find out all the thingTypes this thingType is extending\n// \t\t\t\t\tconst allExtends = [value.extends, ...(extendedSchema.allExtends || [])];\n// \t\t\t\t\tvalue.allExtends = allExtends;\n// \t\t\t\t\tvalue as BormEntity | BormRelation;\n\n// \t\t\t\t\tallExtends.forEach((ext) => {\n// \t\t\t\t\t\tif (draft.entities[ext]) {\n// \t\t\t\t\t\t\t//@ts-expect-error : it's normal is just a draft\n// \t\t\t\t\t\t\tdraft.entities[ext].subTypes = [key, ...(draft.entities[ext].subTypes || [])];\n// \t\t\t\t\t\t} else if (draft.relations[ext]) {\n// \t\t\t\t\t\t\t//@ts-expect-error : it's normal is just a draft\n// \t\t\t\t\t\t\tdraft.relations[ext].subTypes = [key, ...(draft.relations[ext].subTypes || [])];\n// \t\t\t\t\t\t} else {\n// \t\t\t\t\t\t\tthrow new Error(`[Schema] ${key} is extending a thing that does not exist in the schema: ${ext}`);\n// \t\t\t\t\t\t}\n// \t\t\t\t\t});\n\n// \t\t\t\t\tvalue.idFields = extendedSchema.idFields\n// \t\t\t\t\t\t? Array.from(new Set((value.idFields || []).concat(extendedSchema.idFields)))\n// \t\t\t\t\t\t: value.idFields;\n\n// \t\t\t\t\tvalue.dataFields = extendedSchema.dataFields\n// \t\t\t\t\t\t? (value.dataFields || []).concat(\n// \t\t\t\t\t\t\t\textendedSchema.dataFields.map((df: DataField) => {\n// \t\t\t\t\t\t\t\t\t// * Adding dbPath of extended dataFields\n// \t\t\t\t\t\t\t\t\tlet deepExtendedThing = value.extends;\n// \t\t\t\t\t\t\t\t\tlet deepSchema = schema.entities[deepExtendedThing] || schema.relations[deepExtendedThing];\n// \t\t\t\t\t\t\t\t\twhile (!deepSchema.dataFields?.find((deepDf: DataField) => deepDf.path === df.path)) {\n// \t\t\t\t\t\t\t\t\t\tdeepExtendedThing = 'extends' in deepSchema ? deepSchema.extends : undefined;\n// \t\t\t\t\t\t\t\t\t\tdeepSchema = schema.entities[deepExtendedThing] || schema.relations[deepExtendedThing];\n// \t\t\t\t\t\t\t\t\t}\n// \t\t\t\t\t\t\t\t\treturn {\n// \t\t\t\t\t\t\t\t\t\t...df,\n// \t\t\t\t\t\t\t\t\t\tinherited: true,\n// \t\t\t\t\t\t\t\t\t\tdbPath: 'dbPath' in df ? df.dbPath : getDbPath(deepExtendedThing, df.path, df.shared), //i\n// \t\t\t\t\t\t\t\t\t\t[SharedMetadata]: {\n// \t\t\t\t\t\t\t\t\t\t\t//@ts-expect-error - Is normal because we are extending it here\n// \t\t\t\t\t\t\t\t\t\t\t...df[SharedMetadata],\n// \t\t\t\t\t\t\t\t\t\t\t//@ts-expect-error - Is normal because we are extending it here\n// \t\t\t\t\t\t\t\t\t\t\tinheritanceOrigin: df[SharedMetadata]?.inheritanceOrigin || value.extends,\n// \t\t\t\t\t\t\t\t\t\t},\n// \t\t\t\t\t\t\t\t\t};\n// \t\t\t\t\t\t\t\t}),\n// \t\t\t\t\t\t\t)\n// \t\t\t\t\t\t: value.dataFields;\n\n// \t\t\t\t\t//Only for roles in th extended schema\n// \t\t\t\t\tif ('roles' in extendedSchema) {\n// \t\t\t\t\t\tconst val = value as BormRelation;\n// \t\t\t\t\t\tconst extendedRelationSchema = extendedSchema as BormRelation;\n// \t\t\t\t\t\tif (extendedRelationSchema.roles) {\n// \t\t\t\t\t\t\tconst extendedRelationSchemaWithOrigin = mapEntries(extendedRelationSchema.roles, (roleKey, role) => {\n// \t\t\t\t\t\t\t\treturn [\n// \t\t\t\t\t\t\t\t\troleKey,\n// \t\t\t\t\t\t\t\t\t{\n// \t\t\t\t\t\t\t\t\t\t...role,\n// \t\t\t\t\t\t\t\t\t\tinherited: true,\n// \t\t\t\t\t\t\t\t\t\t[SharedMetadata]: {\n// \t\t\t\t\t\t\t\t\t\t\t//@ts-expect-error - Is normal because we are extending it here\n// \t\t\t\t\t\t\t\t\t\t\t...role[SharedMetadata],\n// \t\t\t\t\t\t\t\t\t\t\t//@ts-expect-error - Is normal because we are extending it here\n// \t\t\t\t\t\t\t\t\t\t\tinheritanceOrigin: role[SharedMetadata]?.inheritanceOrigin || value.extends,\n// \t\t\t\t\t\t\t\t\t\t},\n// \t\t\t\t\t\t\t\t\t},\n// \t\t\t\t\t\t\t\t];\n// \t\t\t\t\t\t\t});\n\n// \t\t\t\t\t\t\tval.roles = {\n// \t\t\t\t\t\t\t\t...(val.roles || {}),\n// \t\t\t\t\t\t\t\t...extendedRelationSchemaWithOrigin,\n// \t\t\t\t\t\t\t};\n// \t\t\t\t\t\t}\n// \t\t\t\t\t}\n\n// \t\t\t\t\tif ('refFields' in extendedSchema) {\n// \t\t\t\t\t\tconst val = value as BormRelation | BormEntity;\n// \t\t\t\t\t\tconst extendedThingSchema = extendedSchema as BormRelation | BormEntity;\n// \t\t\t\t\t\tif (extendedThingSchema.refFields) {\n// \t\t\t\t\t\t\tconst extendedRefFields = mapEntries(extendedThingSchema.refFields, (refFieldKey, refField) => {\n// \t\t\t\t\t\t\t\treturn [\n// \t\t\t\t\t\t\t\t\trefFieldKey,\n// \t\t\t\t\t\t\t\t\t{\n// \t\t\t\t\t\t\t\t\t\t...refField,\n// \t\t\t\t\t\t\t\t\t\tinherited: true,\n// \t\t\t\t\t\t\t\t\t\t[SharedMetadata]: {\n// \t\t\t\t\t\t\t\t\t\t\t//@ts-expect-error - Is normal because we are extending it here\n// \t\t\t\t\t\t\t\t\t\t\t...refField[SharedMetadata],\n// \t\t\t\t\t\t\t\t\t\t\t//@ts-expect-error - Is normal because we are extending it here\n// \t\t\t\t\t\t\t\t\t\t\tinheritanceOrigin: refField[SharedMetadata]?.inheritanceOrigin || value.extends,\n// \t\t\t\t\t\t\t\t\t\t},\n// \t\t\t\t\t\t\t\t\t},\n// \t\t\t\t\t\t\t\t];\n// \t\t\t\t\t\t\t});\n\n// \t\t\t\t\t\t\tval.refFields = {\n// \t\t\t\t\t\t\t\t...(val.refFields || {}),\n// \t\t\t\t\t\t\t\t...extendedRefFields,\n// \t\t\t\t\t\t\t};\n// \t\t\t\t\t\t}\n// \t\t\t\t\t}\n\n// \t\t\t\t\tvalue.linkFields = extendedSchema.linkFields\n// \t\t\t\t\t\t? (value.linkFields || []).concat(\n// \t\t\t\t\t\t\t\textendedSchema.linkFields.map((lf) => ({\n// \t\t\t\t\t\t\t\t\t...lf,\n// \t\t\t\t\t\t\t\t\tinherited: true,\n// \t\t\t\t\t\t\t\t\t[SharedMetadata]: {\n// \t\t\t\t\t\t\t\t\t\t...lf[SharedMetadata],\n// \t\t\t\t\t\t\t\t\t\tinheritanceOrigin: lf[SharedMetadata]?.inheritanceOrigin || value.extends,\n// \t\t\t\t\t\t\t\t\t},\n// \t\t\t\t\t\t\t\t})),\n// \t\t\t\t\t\t\t)\n// \t\t\t\t\t\t: value.linkFields;\n\n// \t\t\t\t\t//todo: Do some checks, and potentially simplify the hooks structure\n// \t\t\t\t\tif (extendedSchema?.hooks?.pre) {\n// \t\t\t\t\t\tvalue.hooks = value.hooks || {};\n// \t\t\t\t\t\tvalue.hooks.pre = value.hooks.pre || [];\n// \t\t\t\t\t\tvalue.hooks.pre = [...(extendedSchema?.hooks?.pre || []), ...(value?.hooks?.pre || [])];\n// \t\t\t\t\t}\n// \t\t\t\t}\n// \t\t\t},\n// \t\t\t{ traversalType: 'breadth-first' },\n// \t\t),\n// \t);\n// \treturn withExtensionsSchema;\n// };\n\n// export const enrichSchema = (schema: BormSchema, dbHandles: DBHandles): EnrichedBormSchema => {\n// \tconst allLinkedFields: LinkedFieldWithThing[] = [];\n// \t// #region 1)\n\n// \t// #endregion\n\n// \t// * Gather linkFields\n// \ttraverse(schema, ({ key, value, meta }: TraversalCallbackContext) => {\n// \t\tif (key === 'linkFields') {\n// \t\t\tconst getThingTypes = () => {\n// \t\t\t\tif (!meta.nodePath) {\n// \t\t\t\t\tthrow new Error('No path');\n// \t\t\t\t}\n// \t\t\t\tconst [thingPath, thing] = meta.nodePath.split('.');\n// \t\t\t\tconst thingType = thingPath === 'entities' ? 'entity' : thingPath === 'relations' ? 'relation' : '';\n// \t\t\t\treturn {\n// \t\t\t\t\tthing,\n// \t\t\t\t\tthingType,\n// \t\t\t\t};\n// \t\t\t};\n// \t\t\tconst thingTypes = getThingTypes();\n// \t\t\tconst withThing = !Array.isArray(value)\n// \t\t\t\t? [\n// \t\t\t\t\t\t{\n// \t\t\t\t\t\t\t...value,\n// \t\t\t\t\t\t\t...thingTypes,\n// \t\t\t\t\t\t},\n// \t\t\t\t\t]\n// \t\t\t\t: value.map((x) => ({\n// \t\t\t\t\t\t...x,\n// \t\t\t\t\t\t...thingTypes,\n// \t\t\t\t\t}));\n\n// \t\t\tallLinkedFields.push(...withThing);\n// \t\t}\n// \t});\n\n// \tconst withExtensionsSchema = extendSchema(schema);\n\n// \t// * Enrich the schema\n// \tconst enrichedSchema = produce(withExtensionsSchema, (draft: Partial<EnrichedBormSchema>) =>\n// \t\ttraverse(draft, ({ value, key, meta }: TraversalCallbackContext) => {\n// \t\t\t// id things\n// \t\t\tif (meta.depth === 2 && value.idFields && !value.id) {\n// \t\t\t\t// depth 2 are entities and relations\n// \t\t\t\t// eslint-disable-next-line prefer-destructuring\n// \t\t\t\tvalue.name = key;\n// \t\t\t\tconst thingType = () => {\n// \t\t\t\t\tif (meta.nodePath?.split('.')[0] === 'entities') {\n// \t\t\t\t\t\treturn 'entity';\n// \t\t\t\t\t}\n// \t\t\t\t\tif (meta.nodePath?.split('.')[0] === 'relations') {\n// \t\t\t\t\t\treturn 'relation';\n// \t\t\t\t\t}\n// \t\t\t\t\tthrow new Error('Unsupported node attributes');\n// \t\t\t\t};\n// \t\t\t\tvalue.thingType = thingType();\n// \t\t\t\t/// We identify the database assigned to this thing\n// \t\t\t\t//@ts-expect-error - TODO\n// \t\t\t\tconst thingDB: DBHandleKey = Object.keys(dbHandles).find((key) =>\n// \t\t\t\t\t// @ts-expect-error - TODO\n// \t\t\t\t\tdbHandles[key]?.get(value.defaultDBConnector.id),\n// \t\t\t\t);\n// \t\t\t\tvalue.db = thingDB as DBHandleKey; //todo\n// \t\t\t\tvalue.dbContext = adapterContext[thingDB] as AdapterContext; //todo\n\n// \t\t\t\tvalue.dbProviderConfig =\n// \t\t\t\t\tthingDB === 'surrealDB' ? dbHandles[thingDB]?.get(value.defaultDBConnector.id)?.providerConfig : undefined;\n\n// \t\t\t\t// init the arrays\n// \t\t\t\tvalue.computedFields = [];\n// \t\t\t\tvalue.virtualFields = [];\n// \t\t\t\tvalue.requiredFields = [];\n// \t\t\t\tvalue.enumFields = [];\n// \t\t\t\tvalue.fnValidatedFields = [];\n\n// \t\t\t\t//todo: Maybe move all this to the pre-step and enrich all the linkFields there and same with the roles so then we can usse allLinkFields and allRoles as enriched ones.\n// \t\t\t\tif ('linkFields' in value && value.linkFields) {\n// \t\t\t\t\tconst val = value as EnrichedBormRelation;\n\n// \t\t\t\t\tval.linkFields?.forEach((linkField) => {\n// \t\t\t\t\t\t///Check if the path is already in use\n// \t\t\t\t\t\tif (\n// \t\t\t\t\t\t\tval.dataFields?.find((df) => df.path === linkField.path) ||\n// \t\t\t\t\t\t\tObject.keys(val.roles || {}).includes(linkField.path)\n// \t\t\t\t\t\t) {\n// \t\t\t\t\t\t\tthrow new Error(\n// \t\t\t\t\t\t\t\t`[Schema] The path ${linkField.path} is already in use by a dataField or linkField in ${val.name}. Path:${meta.nodePath}`,\n// \t\t\t\t\t\t\t);\n// \t\t\t\t\t\t}\n// \t\t\t\t\t\tconst linkFieldRelation = withExtensionsSchema.relations[linkField.relation] as EnrichedBormRelation;\n\n// \t\t\t\t\t\tif (!linkField.isVirtual) {\n// \t\t\t\t\t\t\t//its ok for virtual linkFields to don't have a relation\n// \t\t\t\t\t\t\tif (!linkFieldRelation) {\n// \t\t\t\t\t\t\t\tthrow new Error(`The relation ${linkField.relation} does not exist in the schema`);\n// \t\t\t\t\t\t\t}\n\n// \t\t\t\t\t\t\tif (linkFieldRelation.roles?.[linkField.plays] === undefined) {\n// \t\t\t\t\t\t\t\tthrow new Error(\n// \t\t\t\t\t\t\t\t\t`The role ${linkField.plays} is not defined in the relation ${linkField.relation} (linkField: ${linkField.path})`,\n// \t\t\t\t\t\t\t\t);\n// \t\t\t\t\t\t\t}\n// \t\t\t\t\t\t}\n\n// \t\t\t\t\t\t//#region SHARED METADATA\n\n// \t\t\t\t\t\tif (linkField.target === 'relation') {\n// \t\t\t\t\t\t\tif (linkField.isVirtual) {\n// \t\t\t\t\t\t\t\tthrow new Error(\n// \t\t\t\t\t\t\t\t\t`[Schema] Virtual linkFields can't target a relation. Thing: \"${val.name}\" LinkField: \"${linkField.path}. Path:${meta.nodePath}.\"`,\n// \t\t\t\t\t\t\t\t);\n// \t\t\t\t\t\t\t}\n// \t\t\t\t\t\t\tlinkField.$things = [linkField.relation, ...(linkFieldRelation.subTypes || [])];\n// \t\t\t\t\t\t\tlinkField.oppositeLinkFieldsPlayedBy = [\n// \t\t\t\t\t\t\t\t{\n// \t\t\t\t\t\t\t\t\tplays: linkField.path,\n// \t\t\t\t\t\t\t\t\tthing: linkField.relation,\n// \t\t\t\t\t\t\t\t\tthingType: 'relation',\n// \t\t\t\t\t\t\t\t},\n// \t\t\t\t\t\t\t];\n// \t\t\t\t\t\t}\n// \t\t\t\t\t\tif (linkField.target === 'role') {\n// \t\t\t\t\t\t\t///target role\n// \t\t\t\t\t\t\tlinkField.oppositeLinkFieldsPlayedBy = allLinkedFields.filter(\n// \t\t\t\t\t\t\t\t(x) => x.relation === linkField.relation && x.plays !== linkField.plays && x.target === 'role',\n// \t\t\t\t\t\t\t);\n\n// \t\t\t\t\t\t\tif (linkField.oppositeLinkFieldsPlayedBy.length === 0) {\n// \t\t\t\t\t\t\t\tthrow new Error(\n// \t\t\t\t\t\t\t\t\t`[Schema] LinkFields require to have at least one opposite linkField playing an opposite role. Thing: \"${val.name}\" LinkField: \"${linkField.path}. Path:${meta.nodePath}.\"`,\n// \t\t\t\t\t\t\t\t);\n// \t\t\t\t\t\t\t}\n\n// \t\t\t\t\t\t\t// This is duplicated here and in playedBy on purpose\n// \t\t\t\t\t\t\tlinkField.pathToRelation =\n// \t\t\t\t\t\t\t\tval.linkFields?.find((lf) => lf.target === 'relation' && lf.relation === linkField.relation)?.path ??\n// \t\t\t\t\t\t\t\tlinkField.relation.toLocaleLowerCase();\n\n// \t\t\t\t\t\t\tlinkField.$things = [\n// \t\t\t\t\t\t\t\t...new Set(\n// \t\t\t\t\t\t\t\t\tlinkField.oppositeLinkFieldsPlayedBy.flatMap((x) => [\n// \t\t\t\t\t\t\t\t\t\tx.thing,\n// \t\t\t\t\t\t\t\t\t\t...(getSchemaByThing(withExtensionsSchema, x.thing)?.subTypes || []),\n// \t\t\t\t\t\t\t\t\t]),\n// \t\t\t\t\t\t\t\t),\n// \t\t\t\t\t\t\t];\n\n// \t\t\t\t\t\t\t// #region FILTERING OPPOSITE LINKFIELDS\n// \t\t\t\t\t\t\t// const { targetRoles, filter } = linkField;\n// \t\t\t\t\t\t\t// Example targetRoles: ['color', 'users']\n// \t\t\t\t\t\t\t//Can be combined with filter, for instance to automatically filter by $thing\n\n// \t\t\t\t\t\t\t//If after the filters, we still have 2, then the schema is wrong\n// \t\t\t\t\t\t\tif (linkField.oppositeLinkFieldsPlayedBy.length > 1) {\n// \t\t\t\t\t\t\t\t//temp: lets just warn and add an error only if actually used\n// \t\t\t\t\t\t\t\tconsole.warn(\n// \t\t\t\t\t\t\t\t\t`[Schema] LinkField ${linkField.path} in ${val.name} has multiple candidates ${linkField.oppositeLinkFieldsPlayedBy.map((lf) => lf.thing).join(',')} and this is not yet supported. Please target a single one using targetRoles with a single role`,\n// \t\t\t\t\t\t\t\t);\n// \t\t\t\t\t\t\t}\n// \t\t\t\t\t\t\t// #endregion\n// \t\t\t\t\t\t}\n// \t\t\t\t\t\t//#endregion\n\n// \t\t\t\t\t\t//#region SUREALDB METADATA\n\n// \t\t\t\t\t\tif (value.db === 'surrealDB') {\n// \t\t\t\t\t\t\tconst originalRelation =\n// \t\t\t\t\t\t\t\tlinkFieldRelation?.roles?.[linkField.plays][SharedMetadata]?.inheritanceOrigin ?? linkField.relation;\n\n// \t\t\t\t\t\t\tconst queryPath = getSurrealLinkFieldQueryPath({\n// \t\t\t\t\t\t\t\tlinkField,\n// \t\t\t\t\t\t\t\toriginalRelation,\n// \t\t\t\t\t\t\t\twithExtensionsSchema,\n// \t\t\t\t\t\t\t\tlinkMode: value.dbProviderConfig.linkMode,\n// \t\t\t\t\t\t\t});\n\n// \t\t\t\t\t\t\tlinkField[SuqlMetadata] = {\n// \t\t\t\t\t\t\t\tqueryPath,\n// \t\t\t\t\t\t\t};\n// \t\t\t\t\t\t}\n\n// \t\t\t\t\t\t// We take the original relation as its the one that holds the name of the relation in surrealDB\n\n// \t\t\t\t\t\t//#endregion\n// \t\t\t\t\t});\n// \t\t\t\t}\n\n// \t\t\t\tif ('refFields' in value && value.refFields) {\n// \t\t\t\t\tvalue.refFields = mapEntries(value.refFields, (refFieldKey: string, refField: RefField) => {\n// \t\t\t\t\t\tconst enrichedRefField = {\n// \t\t\t\t\t\t\t...refField,\n// \t\t\t\t\t\t\tdbPath: refField.dbPath || refFieldKey,\n// \t\t\t\t\t\t};\n// \t\t\t\t\t\treturn [refFieldKey, enrichedRefField];\n// \t\t\t\t\t});\n// \t\t\t\t}\n\n// \t\t\t\t// adding all the linkFields to roles\n// \t\t\t\tif ('roles' in value) {\n// \t\t\t\t\tconst val = value as EnrichedBormRelation;\n\n// \t\t\t\t\tObject.entries(val.roles).forEach(([roleKey, role]) => {\n// \t\t\t\t\t\t//Check if the key is used by linkFields or roleFields already\n// \t\t\t\t\t\tif (\n// \t\t\t\t\t\t\tval.dataFields?.find((df) => df.path === roleKey) ||\n// \t\t\t\t\t\t\tval.linkFields?.find((lf) => lf.path === roleKey)\n// \t\t\t\t\t\t) {\n// \t\t\t\t\t\t\tthrow new Error(\n// \t\t\t\t\t\t\t\t`[Schema] The path ${roleKey} is already in use by a dataField or linkField in ${val.name}. Path:${meta.nodePath}`,\n// \t\t\t\t\t\t\t);\n// \t\t\t\t\t\t}\n// \t\t\t\t\t\tconst playedBy = allLinkedFields.filter((x) => x.relation === key && x.plays === roleKey) || [];\n// \t\t\t\t\t\t// Duplicating path to relation here and in normal linkfields as it is used in both places\n// \t\t\t\t\t\trole.playedBy = playedBy.map((lf) => ({\n// \t\t\t\t\t\t\t...lf,\n// \t\t\t\t\t\t\tpathToRelation:\n// \t\t\t\t\t\t\t\tlf.target === 'relation'\n// \t\t\t\t\t\t\t\t\t? lf.path\n// \t\t\t\t\t\t\t\t\t: (val.linkFields?.find(\n// \t\t\t\t\t\t\t\t\t\t\t(lf) => lf.target === 'relation' && lf.relation === key && lf.plays === roleKey,\n// \t\t\t\t\t\t\t\t\t\t)?.path ?? lf.relation.toLocaleLowerCase()),\n// \t\t\t\t\t\t}));\n\n// \t\t\t\t\t\tconst impactedLinkFields = allLinkedFields.filter(\n// \t\t\t\t\t\t\t(x) => x.target === 'relation' && x.plays === roleKey && val.allExtends?.includes(x.relation),\n// \t\t\t\t\t\t);\n// \t\t\t\t\t\trole.impactedLinkFields = impactedLinkFields;\n\n// \t\t\t\t\t\trole.path = roleKey;\n// \t\t\t\t\t\tconst $things = [\n// \t\t\t\t\t\t\t...new Set(\n// \t\t\t\t\t\t\t\tplayedBy\n// \t\t\t\t\t\t\t\t\t.flatMap((x) => {\n// \t\t\t\t\t\t\t\t\t\tconst playerSchema = getSchemaByThing(withExtensionsSchema, x.thing);\n// \t\t\t\t\t\t\t\t\t\treturn [...(playerSchema.subTypes || []), x.thing];\n// \t\t\t\t\t\t\t\t\t})\n// \t\t\t\t\t\t\t\t\t.flat()\n// \t\t\t\t\t\t\t\t\t.filter(Boolean),\n// \t\t\t\t\t\t\t),\n// \t\t\t\t\t\t];\n\n// \t\t\t\t\t\trole.$things = $things;\n\n// \t\t\t\t\t\tconst originalRelation = role[SharedMetadata]?.inheritanceOrigin || value.name;\n\n// \t\t\t\t\t\t/*if ($things.length > 1) {\n// \t\t\t\t\t\t\tconsole.warn(\n// \t\t\t\t\t\t\t\t`Not supported yet: Role ${roleKey} in ${'name' in value ? value.name : JSON.stringify(value)} is played by multiple things: ${$things.join(', ')}`,\n// \t\t\t\t\t\t\t);\n// \t\t\t\t\t\t}*/\n// \t\t\t\t\t\t//get all subTyped for each potential player\n// \t\t\t\t\t\tconst playerThingsWithSubTypes = $things.flatMap((playerThing) => {\n// \t\t\t\t\t\t\tconst playerSchema = getSchemaByThing(schema, playerThing);\n// \t\t\t\t\t\t\tconst subTypes = playerSchema?.subTypes || [];\n// \t\t\t\t\t\t\treturn [playerThing, ...subTypes];\n// \t\t\t\t\t\t});\n\n// \t\t\t\t\t\tconst getQueryPath = () => {\n// \t\t\t\t\t\t\tif (value.dbProviderConfig.linkMode === 'edges') {\n// \t\t\t\t\t\t\t\treturn `->\\`${originalRelation}_${roleKey}\\`->(\\`${playerThingsWithSubTypes.join('`,`')}\\`)`;\n// \t\t\t\t\t\t\t}\n// \t\t\t\t\t\t\tif (value.dbProviderConfig.linkMode === 'refs') {\n// \t\t\t\t\t\t\t\tif (role.cardinality === 'MANY') {\n// \t\t\t\t\t\t\t\t\treturn `$parent.[\\`${roleKey}\\`]`;\n// \t\t\t\t\t\t\t\t}\n// \t\t\t\t\t\t\t\tif (role.cardinality === 'ONE') {\n// \t\t\t\t\t\t\t\t\treturn `$parent.\\`${roleKey}\\``;\n// \t\t\t\t\t\t\t\t}\n// \t\t\t\t\t\t\t}\n// \t\t\t\t\t\t\tthrow new Error('Unsupported linkMode');\n// \t\t\t\t\t\t};\n\n// \t\t\t\t\t\tif (value.db === 'surrealDB') {\n// \t\t\t\t\t\t\tconst queryPath = getQueryPath();\n\n// \t\t\t\t\t\t\trole[SuqlMetadata] = {\n// \t\t\t\t\t\t\t\tqueryPath,\n// \t\t\t\t\t\t\t};\n// \t\t\t\t\t\t}\n// \t\t\t\t\t});\n// \t\t\t\t}\n// \t\t\t}\n\n// \t\t\t// role fields\n// \t\t\tif (value && typeof value === 'object' && 'playedBy' in value) {\n// \t\t\t\t// if (value.playedBy.length > 1) {\n// \t\t\t\tconst playedBySet = [...new Set(value.playedBy.map((x: LinkedFieldWithThing) => x.thing))];\n// \t\t\t\tif (playedBySet.length > 1) {\n// \t\t\t\t\tconsole.warn(\n// \t\t\t\t\t\t`[Schema] roleFields can be only played by one thing. Role: ${key}, path:${meta.nodePath}, played by: ${playedBySet.join(', ')}`,\n// \t\t\t\t\t);\n// \t\t\t\t}\n// \t\t\t\tif (value.playedBy.length === 0) {\n// \t\t\t\t\tthrow new Error(\n// \t\t\t\t\t\t`[Schema] roleFields should be played at least by one thing. Role: ${key}, path:${meta.nodePath}`,\n// \t\t\t\t\t);\n// \t\t\t\t}\n// \t\t\t}\n\n// \t\t\t//if default or computed, add to computed fields list\n// \t\t\tif (meta.depth === 4) {\n// \t\t\t\tconst [type, thingId] = meta.nodePath?.split('.') || [];\n// \t\t\t\t//todo change \"type\" to \"thingType\"\n// \t\t\t\t// @ts-expect-error - TODO\n// \t\t\t\tconst draftSchema = draft[type][thingId] as EnrichedBormEntity;\n\n// \t\t\t\tif (!isArray(value) && typeof value === 'object') {\n// \t\t\t\t\t//skip meta.depth 4 when its arrays or undefined or not an object\n// \t\t\t\t\tif (value.validations) {\n// \t\t\t\t\t\tif (value.validations.required) {\n// \t\t\t\t\t\t\tdraftSchema.requiredFields.push(value.path);\n// \t\t\t\t\t\t}\n// \t\t\t\t\t\tif (value.validations.enum) {\n// \t\t\t\t\t\t\tdraftSchema.enumFields.push(value.path);\n// \t\t\t\t\t\t}\n// \t\t\t\t\t\tif (value.validations.fn) {\n// \t\t\t\t\t\t\tdraftSchema.fnValidatedFields.push(value.path);\n// \t\t\t\t\t\t}\n// \t\t\t\t\t}\n\n// \t\t\t\t\tif (value.default) {\n// \t\t\t\t\t\tif (value.isVirtual) {\n// \t\t\t\t\t\t\t// default and virtual means computed\n// \t\t\t\t\t\t\tdraftSchema.virtualFields.push(value.path);\n// \t\t\t\t\t\t} else {\n// \t\t\t\t\t\t\t//default but not virtual means pre-computed (default value), borm side\n// \t\t\t\t\t\t\tdraftSchema.computedFields.push(value.path);\n// \t\t\t\t\t\t}\n// \t\t\t\t\t} else {\n// \t\t\t\t\t\tif (value.isVirtual) {\n// \t\t\t\t\t\t\t//not default but isVirtual means, computed in the DB side, not borm side\n// \t\t\t\t\t\t\tdraftSchema.virtualFields.push(value.path);\n// \t\t\t\t\t\t}\n// \t\t\t\t\t}\n// \t\t\t\t}\n// \t\t\t}\n\n// \t\t\t//if it requires validations, add to the fields that required validations\n// \t\t}),\n// \t) as EnrichedBormSchema;\n\n// \t//console.log('schema and enrichedSchema', JSON.stringify(schema), JSON.stringify(enrichedSchema));\n// \treturn enrichedSchema;\n// };\n","/* 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 { SharedMetadata } from '../../../types/symbols';\nimport { enrichFilter } from '../../query/bql/enrich';\nimport { computeFields } from './enrichSteps/computeFields';\nimport { enrichChildren } from './enrichSteps/enrichChildren';\nimport { preHookTransformations } from './enrichSteps/preHookTransformations';\nimport { preHookValidations } from './enrichSteps/preHookValidations';\nimport { preValidate } from './enrichSteps/preValidate';\nimport { replaceToObj, replaceToObjRef } from './enrichSteps/replaces';\nimport { setRootMeta } from './enrichSteps/rootMeta';\nimport { splitMultipleIds } from './enrichSteps/splitIds';\nimport { unlinkAll } from './enrichSteps/unlinkAll';\nimport { dependenciesGuard } from './guards/dependenciesGuard';\nimport { doAction } from './shared/doActions';\nimport { validateChildren } from './shared/validateOp';\n\nconst cleanStep = (node: BQLMutationBlock, field: string) => {\n if (node[field] === undefined) {\n delete node[field];\n }\n\n if (field === '$tempId') {\n if (doAction('set_tempId', node)) {\n if (node.$tempId?.startsWith('_:')) {\n const tempId = node.$tempId.substring(2);\n node.$tempId = tempId;\n node.$bzId = tempId;\n } else {\n throw new Error('[Wrong format] TempIds must start with \"_:\"');\n }\n } else {\n throw new Error('[Internal] TempId already modified');\n }\n }\n\n if (field === '$filter') {\n if (node.$filter && Object.keys(node.$filter).length === 0) {\n node.$filter = undefined;\n }\n }\n};\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst dataFieldStep = (_node: BQLMutationBlock, _field: string) => {};\n\nexport const enrichBQLMutation = (\n blocks: BQLMutationBlock | BQLMutationBlock[] | EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[],\n schema: EnrichedBormSchema,\n config: BormConfig,\n): EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[] => {\n const rootBlock = { $rootWrap: { $root: blocks } };\n // @ts-expect-error todo\n const has$Fields = dependenciesGuard(Array.isArray(blocks) ? blocks : [blocks]);\n\n const result = produce(rootBlock, (draft) =>\n traverse(draft, ({ value, parent, key, meta }: TraversalCallbackContext) => {\n if (!parent || !key) {\n return;\n }\n\n if (isObject(value)) {\n const paths = meta.nodePath?.split('.') || [];\n if (paths.some((p) => p.startsWith('%'))) {\n //we don't go inside %vars even if they are objects\n return;\n }\n\n if ('$root' in value) {\n // This is hte $root object, we will split the real root if needed in this iteration\n } else if (!('$thing' in value || '$entity' in value || '$relation' in value)) {\n const toIgnore = ['$fields', '$dbNode', '$filter'];\n const lastPath = paths.at(-1);\n const secondToLastPath = paths.at(-2);\n if (key === '$root') {\n throw new Error('Root things must specify $entity or $relation');\n }\n if (\n !toIgnore.includes(lastPath || '') &&\n !toIgnore.includes(secondToLastPath || '') &&\n !lastPath?.startsWith('%') &&\n !secondToLastPath?.startsWith('%')\n ) {\n throw new Error(\n `[Internal] This object has not been initiated with a $thing: ${JSON.stringify(isDraft(value) ? current(value) : value)}`,\n );\n }\n }\n\n const node = value as EnrichedBQLMutationBlock;\n const isFilter = paths.includes('$filter');\n\n if ('$filter' in node && node.$filter) {\n node.$filter = enrichFilter(node.$filter, node.$thing, schema);\n }\n\n Object.keys(node).forEach((field) => {\n ///1. Clean step\n cleanStep(node, field);\n if (field !== '$root' && isFilter) {\n return;\n }\n\n if (field !== '$root' && (field.startsWith('$') || field.startsWith('%'))) {\n return;\n }\n\n const fieldSchema =\n field !== '$root'\n ? getFieldSchema(schema, node, field)\n : ({ [SharedMetadata]: { fieldType: 'rootField' } } as any);\n if (!fieldSchema) {\n throw new Error(`[Internal] Field ${field} not found in schema`);\n }\n\n //console.log('field1', field, fieldSchema);\n\n const { fieldType } = fieldSchema[SharedMetadata];\n const relField = ['linkField', 'roleField'].includes(fieldType);\n const refField = fieldType === 'refField';\n const rootField = fieldType === 'rootField';\n\n //console.log('field2', field, fieldType);\n ///2.DATAFIELD STEP\n if (fieldType === 'dataField') {\n return dataFieldStep(node, field);\n }\n\n ///3.NESTED OBJECTS: RoleFields and linkFields\n\n // 3.1 splitIds\n\n ///3.2$thing => linkField or roleField or references\n\n ///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 /// 3.2.1 replaces\n if (relField || refField) {\n if (node[field] === null) {\n relField ? unlinkAll(node, field, fieldSchema) : undefined;\n } else {\n //todo: replaceObj in refFields, as we are just doing some validation\n relField ? replaceToObj(node, field) : replaceToObjRef(node, field, fieldSchema);\n }\n }\n\n //3.2.2 root $thing\n if (rootField) {\n if (!('$root' in node)) {\n throw new Error(`[Internal] Field ${field} is a rootField but the object is not a root`);\n }\n const rootNode = node as unknown as { $root: BQLMutationBlock | BQLMutationBlock[] };\n setRootMeta(rootNode, schema);\n }\n\n if (relField || refField) {\n // 3.2.3 BQL pre-validations => All validations should happen on subNode, if else, leaves are skipped\n preValidate(node, field, fieldSchema, paths);\n }\n /// 3.2.4 children enrichment\n //redefining childrenArray as it might have changed\n\n if (relField || refField) {\n enrichChildren(node, field, fieldSchema, schema);\n\n //validateChildren\n validateChildren(node, node[field], schema);\n }\n\n if (relField || rootField) {\n //3.2.5 splitIds()\n //this simplifies typeDB mutations\n splitMultipleIds(node, field, schema);\n\n /// 3.2.6 Field computes on nested created nodes. It only runs in CREATE operations.\n computeFields(node, field, schema);\n\n // 3.2.7\n //#region BQL validations\n //Ideally, in updates we could not demand the $thing, but then we need to check that the field belongs to all the potential $things\n const toValidate = isArray(node[field]) ? node[field] : [node[field]];\n\n toValidate.forEach((subNode: BQLMutationBlock) => {\n const subNodeSchema = getCurrentSchema(schema, subNode);\n const { unidentifiedFields, usedLinkFields, usedFields, fields } = getCurrentFields(\n subNodeSchema,\n subNode,\n );\n\n //Check that every used field is in the fields array\n usedFields.forEach((uf) => {\n if (!fields.includes(uf)) {\n throw new Error(`[Schema] Field ${uf} not found in the schema`);\n }\n });\n\n if (unidentifiedFields.length > 0) {\n throw new Error(`Unknown fields: [${unidentifiedFields.join(',')}] in ${JSON.stringify(value)}`);\n }\n //Can't use a link field with target === 'role' and another with target === 'relation' in the same mutation.\n if (usedLinkFields.length > 1) {\n const usedLinkFieldsSchemas = subNodeSchema.linkFields?.filter((lf) =>\n usedLinkFields.includes(lf.path),\n );\n /// Check if at least two of the usedLinkFields schemas, share same relation and have different targets\n usedLinkFieldsSchemas?.some((lf1, i) => {\n return usedLinkFieldsSchemas.some((lf2, j) => {\n if (i !== j && lf1.target !== lf2.target && lf1.relation === lf2.relation) {\n throw new Error(\n \"[Wrong format]: Can't use a link field with target === 'role' and another with target === 'relation' in the same mutation.\",\n );\n }\n });\n });\n }\n });\n\n if (!has$Fields) {\n //if it has $field, it has dependencies so its still not ready for transformation\n //#endregion BQL validations\n\n // 3.3.8\n //#region pre-hook transformations\n preHookTransformations(node, field, schema, config);\n //#endregion pre-hook transformations\n\n // 3.2.9\n //#region pre-hook validations\n preHookValidations(node, field, schema, config);\n //#endregion pre-hook validations\n }\n }\n });\n }\n }),\n );\n\n if (isArray(result.$rootWrap.$root)) {\n return result.$rootWrap.$root as EnrichedBQLMutationBlock[];\n }\n return result.$rootWrap.$root as EnrichedBQLMutationBlock;\n};\n","/* eslint-disable no-param-reassign */\nimport type { Draft } from 'immer';\nimport { current, isDraft } from 'immer';\nimport { customAlphabet } from 'nanoid';\nimport type { TraversalMeta } from 'object-traversal';\nimport { getNodeByPath } from 'object-traversal';\nimport { isArray, isObject, listify, tryit } from 'radash';\n\n// todo: split helpers between common helpers, typeDBhelpers, dgraphelpers...\nimport type {\n BQLMutationBlock,\n BormSchema,\n EnrichedBormEntity,\n EnrichedBormRelation,\n EnrichedBormSchema,\n EnrichedDataField,\n EnrichedLinkField,\n EnrichedRefField,\n EnrichedRoleField,\n FilledBQLMutationBlock,\n PositiveFilter,\n RawBQLQuery,\n ThingType,\n} from './types';\n\nexport const oFind = <RemovedKeys extends string, T extends Record<string | number | symbol, any>>(\n obj: T,\n fn: (k: string | number | symbol, v: any) => boolean,\n): Omit<T, RemovedKeys>[Exclude<keyof T, RemovedKeys>] =>\n Object.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 obj: T,\n fn: (k: K, v: any) => boolean,\n): Partial<T> => {\n const entries = Reflect.ownKeys(obj).map((key) => [key, obj[key as keyof T]]);\n return Object.fromEntries(\n entries.filter(([k, v]) => {\n const [error, result] = tryit(() => fn(k as K, v))();\n return error ? false : result;\n }),\n ) as Partial<T>;\n};\n\nexport const getSchemaByThing = (\n schema: BormSchema | EnrichedBormSchema,\n $thing: string,\n): EnrichedBormEntity | EnrichedBormRelation => {\n if ($thing in schema.entities) {\n return schema.entities[$thing] as EnrichedBormEntity;\n }\n if ($thing in schema.relations) {\n return schema.relations[$thing] as EnrichedBormRelation;\n }\n throw new Error(`${$thing} is not defined in the schema`);\n};\n\nexport const getCurrentSchema = (\n schema: BormSchema | EnrichedBormSchema,\n node: Partial<BQLMutationBlock>,\n): EnrichedBormEntity | EnrichedBormRelation => {\n if (!node) {\n throw new Error('[Internal] No node for getCurrentSchema');\n }\n if (node.$thing) {\n if (node.$thingType === 'entity') {\n if (!(node.$thing in schema.entities)) {\n throw new Error(`Missing entity '${node.$thing}' in the schema`);\n }\n return schema.entities[node.$thing] as EnrichedBormEntity;\n }\n if (node.$thingType === 'relation') {\n if (!(node.$thing in schema.relations)) {\n throw new Error(`Missing relation '${node.$thing}' in the schema`);\n }\n return schema.relations[node.$thing] as EnrichedBormRelation;\n }\n // TODO: This should be validated during the initialization\n if (node.$thing in schema.entities && node.$thing in schema.relations) {\n throw new Error(`Ambiguous $thing ${node.$thing}`);\n }\n if (node.$thing in schema.entities) {\n return schema.entities[node.$thing] as EnrichedBormEntity;\n }\n if (node.$thing in schema.relations) {\n return schema.relations[node.$thing] as EnrichedBormRelation;\n }\n throw new Error(`Wrong schema or query for ${JSON.stringify(node, null, 2)}`);\n }\n\n //! Todo: delete when this works with the new $thing and $thingType fields\n if (node.$entity) {\n if (!(node.$entity in schema.entities)) {\n throw new Error(`Missing entity '${node.$entity}' in the schema`);\n }\n return schema.entities[node.$entity] as EnrichedBormEntity;\n }\n if (node.$relation) {\n if (!(node.$relation in schema.relations)) {\n throw new Error(`Missing relation '${node.$relation}' in the schema`);\n }\n return schema.relations[node.$relation] as EnrichedBormRelation;\n }\n throw new Error(`Wrong schema or query for ${JSON.stringify(node, null, 2)}`);\n};\n\nexport const getFieldType = (\n currentSchema: EnrichedBormRelation | EnrichedBormEntity,\n key: string,\n): ['idField' | 'dataField' | 'linkField' | 'roleField', EnrichedDataField | EnrichedLinkField | EnrichedRoleField] => {\n const dataFieldSchema = currentSchema.dataFields?.find((dataField: any) => dataField.path === key);\n\n if (currentSchema.idFields?.includes(key)) {\n if (!dataFieldSchema) {\n throw new Error(`Field ${key} is an idField but not a dataField in schema`);\n }\n return ['idField', dataFieldSchema];\n }\n if (dataFieldSchema) {\n return ['dataField', dataFieldSchema];\n }\n const linkFieldSchema = currentSchema.linkFields?.find((linkField: any) => linkField.path === key);\n if (linkFieldSchema) {\n return ['linkField', linkFieldSchema];\n }\n const roleFieldSchema = 'roles' in currentSchema ? currentSchema.roles[key] : undefined;\n if (roleFieldSchema) {\n return ['roleField', roleFieldSchema];\n }\n throw new Error(`Field ${key} not found in schema, Defined in $filter`);\n};\nexport const getIdFieldKey = (schema: EnrichedBormSchema, node: Partial<BQLMutationBlock>) => {\n const currentSchema = getCurrentSchema(schema, node);\n if (currentSchema?.idFields?.length && currentSchema?.idFields?.length > 1) {\n throw new Error(`Multiple ids not yet enabled / composite ids: ${currentSchema?.idFields}`);\n }\n\n const [idField] = currentSchema.idFields; //todo composed ids\n return idField;\n};\n\nexport const getThingType = (rootNode: BQLMutationBlock, schema: EnrichedBormSchema): ThingType => {\n const thing = rootNode.$thing || rootNode.$entity || rootNode.$relation;\n if (!thing) {\n throw new Error('[Internal] No thing found');\n }\n if (rootNode.$entity) {\n return 'entity';\n }\n if (rootNode.$relation) {\n return 'relation';\n }\n if (schema.entities[thing]) {\n return 'entity';\n }\n if (schema.relations[thing]) {\n return 'relation';\n }\n throw new Error('No thing found');\n};\n\nexport const getFieldSchema = (\n schema: EnrichedBormSchema,\n node: Partial<BQLMutationBlock>,\n field: string,\n): EnrichedDataField | EnrichedLinkField | EnrichedRoleField | EnrichedRefField => {\n const currentSchema = getCurrentSchema(schema, node);\n const foundLinkField = currentSchema.linkFields?.find((lf) => lf.path === field);\n if (foundLinkField) {\n return foundLinkField as EnrichedLinkField;\n }\n const foundDataField = currentSchema.dataFields?.find((lf) => lf.path === field);\n if (foundDataField) {\n return foundDataField as EnrichedDataField;\n }\n const foundRoleField = 'roles' in currentSchema ? currentSchema.roles?.[field] : undefined;\n if (foundRoleField) {\n return foundRoleField as EnrichedRoleField;\n }\n const foundRefField = 'refFields' in currentSchema ? currentSchema.refFields?.[field] : undefined;\n if (foundRefField) {\n return foundRefField as EnrichedRefField;\n }\n throw new Error(`Field ${field} not found in schema`);\n};\n\nexport const getCardinality = (\n schema: EnrichedBormSchema,\n node: Partial<BQLMutationBlock>,\n field: string,\n): 'ONE' | 'MANY' | 'INTERVAL' | undefined => {\n const currentFieldSchema = getFieldSchema(schema, node, field);\n return currentFieldSchema?.cardinality;\n};\n\ntype ReturnTypeWithoutNode = {\n fields: string[];\n dataFields: string[];\n roleFields: string[];\n linkFields: string[];\n refFields: string[];\n};\n\ntype ReturnTypeWithNode = ReturnTypeWithoutNode & {\n usedFields: string[];\n usedRoleFields: string[];\n usedLinkFields: string[];\n usedDataFields: string[];\n usedRefFields: string[];\n unidentifiedFields: 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 currentSchema: EnrichedBormEntity | EnrichedBormRelation,\n node?: T,\n): T extends undefined ? ReturnTypeWithoutNode : ReturnTypeWithNode => {\n const availableDataFields = currentSchema.dataFields?.map((x) => x.path) || [];\n const availableLinkFields = currentSchema.linkFields?.map((x) => x.path) || [];\n const availableRefFields = 'refFields' in currentSchema ? listify(currentSchema.refFields, (k: string) => k) : [];\n const availableRoleFields = 'roles' in currentSchema ? listify(currentSchema.roles, (k: string) => k) : [];\n const availableFields = [\n ...(availableDataFields || []),\n ...(availableLinkFields || []),\n ...(availableRoleFields || []),\n ...(availableRefFields || []),\n ];\n\n // spot non existing fields\n const reservedRootFields = [\n '$entity',\n '$op',\n '$id',\n '$tempId',\n '$bzId',\n '$relation',\n '$parentKey', //todo: this is not a valid one, to delete and migrate to symbol!\n '$filter',\n '$fields',\n '$excludedFields',\n '$thing',\n '$thingType',\n ];\n\n const allowedFields = [...reservedRootFields, ...availableFields];\n\n if (!node) {\n return {\n fields: availableFields,\n dataFields: availableDataFields,\n roleFields: availableRoleFields,\n linkFields: availableLinkFields,\n } as ReturnTypeWithNode;\n }\n const usedFields = node.$fields\n ? //queries\n (node.$fields.map((x: string | { $path: string }) => {\n if (typeof x === 'string') {\n if (x.startsWith('$') || x.startsWith('%')) {\n return undefined;\n }\n if (!availableFields.includes(x)) {\n throw new Error(`Field ${x} not found in the schema`);\n }\n return x;\n }\n if ('$path' in x && typeof x.$path === 'string') {\n return x.$path;\n }\n throw new Error('[Wrong format] Wrongly structured query');\n }) as string[])\n : //mutations\n (listify<any, string, any>(node, (k: string) => {\n if (k.startsWith('$') || k.startsWith('%')) {\n return undefined;\n }\n if (!availableFields.includes(k)) {\n throw new Error(`[Schema] Field ${k} not found in the schema`);\n }\n return k;\n }).filter((x) => x !== undefined) as string[]);\n\n const localFilterFields = !node.$filter\n ? []\n : listify(node.$filter as PositiveFilter, (k: string) =>\n k.toString().startsWith('$') ? undefined : k.toString(),\n ).filter((x) => x && availableDataFields?.includes(x));\n const nestedFilterFields = !node.$filter\n ? []\n : listify(node.$filter as PositiveFilter, (k: string) =>\n k.toString().startsWith('$') ? undefined : k.toString(),\n ).filter((x) => x && [...(availableRoleFields || []), ...(availableLinkFields || [])]?.includes(x));\n\n const unidentifiedFields = [...usedFields, ...localFilterFields]\n .filter((x) => !x?.startsWith('%'))\n // @ts-expect-error - TODO description\n .filter((x) => !allowedFields.includes(x))\n .filter((x) => x) as string[]; // todo 🤔\n const localFilters = !node.$filter ? {} : oFilter(node.$filter, (k: string, _v) => localFilterFields.includes(k));\n const nestedFilters = !node.$filter ? {} : oFilter(node.$filter, (k: string, _v) => nestedFilterFields.includes(k));\n\n return {\n fields: availableFields,\n dataFields: availableDataFields,\n roleFields: availableRoleFields,\n linkFields: availableLinkFields,\n refFields: availableRefFields,\n usedFields,\n usedLinkFields: availableLinkFields.filter((x) => usedFields.includes(x)),\n usedRoleFields: availableRoleFields.filter((x) => usedFields.includes(x)),\n usedDataFields: availableDataFields.filter((x) => usedFields.includes(x)),\n usedRefFields: availableRefFields.filter((x) => usedFields.includes(x)),\n unidentifiedFields,\n ...(localFilterFields.length ? { localFilters } : {}),\n ...(nestedFilterFields.length ? { nestedFilters } : {}),\n } 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 return value !== null;\n};\n\nexport const extractChildEntities = (entities: EnrichedBormSchema['entities'], parentEntity: string) => {\n return Object.values(entities).reduce((acc: string[], value) => {\n if (value.extends === parentEntity) {\n acc.push(value.name);\n }\n return acc;\n }, []);\n};\n\nexport const capitalizeFirstLetter = (string: string) => {\n if (typeof string !== 'string') {\n throw new Error('capitalizeFirstLetter: string is not a string');\n }\n return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();\n};\n\nexport const getParentNode = (blocks: Record<any, any>, parent: any, meta: TraversalMeta) => {\n const currentPath = meta.nodePath || '';\n const pathParts = currentPath.split('.');\n const parentPath = isArray(parent)\n ? pathParts\n .slice(0, -2)\n .join('.') // Remove last two parts for an array parent\n : pathParts.slice(0, -1).join('.'); // Remove only the last part for a non-array parent\n return parent ? getNodeByPath(blocks, parentPath) : {}; //undefined parent for root\n};\n\nexport const getSymbols = (oldBlock: Partial<FilledBQLMutationBlock>): Record<symbol, any> => {\n return Reflect.ownKeys(oldBlock)\n .filter((key): key is symbol => typeof key === 'symbol')\n .reduce(\n (symbols, symbolKey) => {\n //@ts-expect-error - TODO\n // eslint-disable-next-line no-param-reassign\n symbols[symbolKey] = oldBlock[symbolKey];\n return symbols;\n },\n {} as Record<symbol, any>,\n );\n};\n\nexport const normalPropsCount = (obj: Record<string, any>) => {\n return Object.keys(obj).filter((key) => !key.startsWith('$')).length;\n};\n\nexport const isBQLBlock = (block: unknown): block is FilledBQLMutationBlock => {\n return 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> = T extends Array<infer U>\n ? Array<DeepCurrent<U>>\n : T extends object\n ? { [K in keyof T]: DeepCurrent<T[K]> }\n : T;\n\nexport const deepCurrent = <T>(obj: Drafted<T>): any => {\n if (Array.isArray(obj)) {\n // Explicitly cast the return type for arrays\n return obj.map((item) => current(item)) as DeepCurrent<T>;\n }\n if (obj && typeof obj === 'object') {\n // Handle non-null objects\n const plainObject = isDraft(obj) ? current(obj) : obj;\n const result: any = {};\n Object.entries(plainObject).forEach(([key, value]) => {\n // Use the key to dynamically assign the converted value\n result[key] = isDraft(value) ? current(value) : value;\n });\n // Explicitly cast the return type for objects\n return result as DeepCurrent<T>;\n }\n // Return the value directly for non-objects and non-arrays\n return obj as DeepCurrent<T>;\n};\n\nexport const assertDefined = <T>(value?: T, msg?: string): T => {\n if (value === undefined) {\n if (msg) {\n throw new Error(msg);\n }\n throw new Error('Value is undefined');\n }\n return value;\n};\n\nexport const indent = (line: string, depth: number) => {\n let _indent = '';\n for (let i = 0; i < depth; i++) {\n _indent += ' ';\n }\n return `${_indent}${line}`;\n};\n\nexport const genId = (n?: number) => {\n const idLength = n ?? 21;\n const alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz';\n const nanoid = customAlphabet(alphabet, idLength);\n return nanoid();\n};\n","/* eslint-disable no-param-reassign */\nimport { produce } from 'immer';\nimport { traverse } from 'object-traversal';\nimport { isArray, isObject } from 'radash';\nimport { getCurrentSchema, getFieldType } from '../../../helpers';\nimport type {\n BQLMutationBlock,\n EnrichedAttributeQuery,\n EnrichedBQLQuery,\n EnrichedBormEntity,\n EnrichedBormRelation,\n EnrichedBormSchema,\n EnrichedDataField,\n EnrichedLinkField,\n EnrichedLinkQuery,\n EnrichedRefField,\n EnrichedRefQuery,\n EnrichedRoleField,\n EnrichedRoleQuery,\n Filter,\n RawBQLQuery,\n} from '../../../types';\nimport { FieldSchema, QueryPath } from '../../../types/symbols';\n\nexport const enrichBQLQuery = (rawBqlQuery: RawBQLQuery[], schema: EnrichedBormSchema): EnrichedBQLQuery[] => {\n for (const item of rawBqlQuery) {\n if (!('$entity' in item) && !('$relation' in item) && (!('$thing' in item) || !('$thingType' in item))) {\n throw new Error('No entity specified in query');\n }\n }\n\n const batches = Array.isArray(rawBqlQuery) ? rawBqlQuery : [rawBqlQuery];\n\n // TODO: The raw query and the enriched query have different type.\n // Instead of mutating the existing object (copy + mutate)\n // replace `produce` and `traverse` with a function that returns a new object.\n // This way we don't need to force the enriched query (RawBQLQuery that has been mutated)\n // to have type EnrichedBQLQuery, thus we get better type check.\n const enriched = produce(batches, (draft: any) =>\n traverse(draft, (context) => {\n const { value: val, meta } = context;\n const value: BQLMutationBlock = val;\n\n if (isObject(value)) {\n // Places to be skipped\n if (meta.nodePath?.includes('.$filter') || meta.nodePath?.includes('.$playedBy')) {\n return;\n }\n // 0. Everytime we have some object we append its path\n //console.log('value!', value, 'path', meta.nodePath);\n value[QueryPath as any] = meta.nodePath;\n\n // 1. Moving $id into filter based on schema's idFields\n if (value.$id) {\n const node = value.$entity || value.$relation ? value : { [`$${value.$thingType}`]: value.$thing };\n const currentSchema = getCurrentSchema(schema, node);\n if (!currentSchema?.name) {\n throw new Error(`Schema not found for ${value.$thing}`);\n }\n value.$path = currentSchema.name;\n if (!Array.isArray(value.$id)) {\n value.$filterByUnique = true;\n }\n if (currentSchema.idFields.length === 1) {\n const [idField] = currentSchema.idFields;\n value.$filter = { ...value.$filter, [idField]: value.$id };\n value.$id = undefined;\n } else {\n throw new Error('Multiple ids not yet enabled / composite ids');\n }\n } else if ('$entity' in value || '$relation' in value || '$thing' in value) {\n const currentSchema = getCurrentSchema(schema, value);\n if (!currentSchema?.name) {\n throw new Error(`Schema not found for ${value.$thing}`);\n }\n value.$path = currentSchema.name;\n }\n // 2. Converting $entity or $relation into $thingType and $thing\n if (value.$entity) {\n value.$thing = value.$entity;\n value.$thingType = 'entity';\n value.$entity = undefined;\n } else if (value.$relation) {\n value.$thing = value.$relation;\n value.$thingType = 'relation';\n value.$relation = undefined;\n }\n\n if (isObject(value) && '$thing' in value && value.$thing) {\n const node = value.$entity || value.$relation ? value : { [`$${value.$thingType}`]: value.$thing };\n\n const currentSchema = getCurrentSchema(schema, node);\n if (value.$filter) {\n if (Object.keys(value.$filter).length === 0) {\n value.$filter = undefined;\n } else {\n value.$filter = enrichFilter(value.$filter, value.$thing, schema);\n value.$filterByUnique = checkFilterByUnique(value.$filter, currentSchema);\n }\n }\n // if no fields, then it's all fields\n if (value.$fields) {\n const idFieldIncluded = value.$fields.some((field: any) =>\n currentSchema?.idFields?.includes(field?.$path || field),\n );\n if (!idFieldIncluded) {\n value.$fields = [\n ...value.$fields,\n ...(Array.isArray(currentSchema.idFields) ? currentSchema.idFields : []),\n ];\n value.$idNotIncluded = true;\n }\n const newFields = value.$fields\n ?.flatMap((field: any) => {\n const processed = processField(field, currentSchema, schema);\n if (Array.isArray(processed)) {\n return processed;\n }\n return [processed];\n })\n .filter(Boolean);\n value.$fields = newFields;\n } else {\n const allFields = getAllFields(currentSchema);\n const newFields = allFields\n ?.flatMap((field: any) => {\n const processed = processField(field, currentSchema, schema);\n return Array.isArray(processed) ? processed : [processed];\n })\n .filter(Boolean);\n value.$fields = newFields;\n }\n\n if (value.$excludedFields) {\n value.$fields = value.$fields.filter((f: { $path: string }) => {\n if (isId(currentSchema, f)) {\n return true;\n }\n return !value.$excludedFields.includes(f.$path);\n });\n }\n }\n }\n }),\n );\n //console.log('enriched', JSON.stringify(enriched));\n\n return enriched as EnrichedBQLQuery[];\n};\n\nconst getAllFields = (currentSchema: EnrichedBormEntity | EnrichedBormRelation) => {\n const dataFields = currentSchema.dataFields?.map((field: any) => field.path) || [];\n const linkFields = currentSchema.linkFields?.map((field: any) => field.path) || [];\n const roleFields = Object.keys((currentSchema as EnrichedBormRelation).roles || {}) || [];\n const refFields = Object.keys(currentSchema.refFields || {}) || [];\n const allFields = [...dataFields, ...linkFields, ...roleFields, ...refFields];\n return allFields;\n};\n\nconst checkFilterByUnique = ($filter: any, currentSchema: EnrichedBormEntity | EnrichedBormRelation) => {\n const fields = Object.keys($filter || {});\n return fields.some((field) => {\n const fieldFilter = $filter[field];\n if (fieldFilter !== null && typeof fieldFilter !== 'undefined') {\n const isIdField = currentSchema.idFields?.includes(field);\n const isUniqueDataField = currentSchema.dataFields?.some(\n (f) => (f.dbPath === field || f.path === field) && f?.validations?.unique,\n );\n const isSingle$id = field === '$id' && !Array.isArray(fieldFilter);\n\n const isUniqueField = isIdField || isUniqueDataField || isSingle$id;\n\n if (isUniqueField) {\n // Now check if the filter on the field is an equality filter\n if (typeof fieldFilter !== 'object' || fieldFilter === null || Array.isArray(fieldFilter)) {\n // fieldFilter is a scalar value, so consider equality\n if (!Array.isArray(fieldFilter)) {\n // Scalar value, equality filter\n return true;\n }\n // Array of values, IN filter; not unique\n return false;\n }\n // fieldFilter is an object, check for $eq operator\n const filterOperators = Object.keys(fieldFilter);\n if (filterOperators.length === 1 && filterOperators[0] === '$eq') {\n // Equality operator\n const eqValue = fieldFilter.$eq;\n if (typeof eqValue !== 'object' || eqValue === null || !Array.isArray(eqValue)) {\n // Scalar value\n return true;\n }\n }\n // Not an equality filter on unique field\n return false;\n }\n }\n return false;\n });\n};\n\nconst isId = (currentSchema: EnrichedBormEntity | EnrichedBormRelation, field: any) =>\n typeof field === 'string' ? currentSchema.idFields?.includes(field) : currentSchema.idFields?.includes(field.$path);\n\nconst createDataField = (props: {\n field: any;\n fieldStr: string;\n $justId: boolean;\n dbPath: string;\n isVirtual?: boolean;\n fieldSchema: EnrichedDataField;\n}): EnrichedAttributeQuery => {\n const { field, fieldStr, $justId, dbPath, isVirtual, fieldSchema } = props;\n // todo: get all dependencies of the virtual field in the query and then remove from the output\n return {\n $path: fieldStr,\n $dbPath: dbPath,\n $thingType: 'attribute',\n $as: field.$as || fieldStr,\n $var: fieldStr,\n $fieldType: 'data',\n $justId,\n $id: field.$id,\n $isVirtual: isVirtual,\n [FieldSchema]: fieldSchema,\n };\n};\n\nconst createLinkField = (props: {\n field: any;\n fieldStr: string;\n linkField: any;\n $justId: boolean;\n dbPath: string;\n schema: EnrichedBormSchema;\n fieldSchema: EnrichedLinkField;\n}): EnrichedLinkQuery => {\n const { field, fieldStr, linkField, $justId, dbPath, schema, fieldSchema } = props;\n const { target, oppositeLinkFieldsPlayedBy } = linkField;\n return oppositeLinkFieldsPlayedBy.map((playedBy: any) => {\n const $thingType = target === 'role' ? playedBy.thingType : 'relation';\n const $thing = target === 'role' ? playedBy.thing : linkField.relation;\n const node = { [`$${$thingType}`]: $thing };\n const currentSchema = getCurrentSchema(schema, node);\n const idNotIncluded = field?.$fields?.filter((f: any) => isId(currentSchema, f)).length === 0;\n\n let fields = [];\n if (typeof field !== 'string') {\n if (field.$fields) {\n if (idNotIncluded) {\n const idFields = currentSchema.idFields || [];\n fields = [...field.$fields, ...idFields];\n } else {\n fields = field.$fields;\n }\n } else {\n fields = getAllFields(currentSchema);\n }\n } else {\n fields = ['id'];\n }\n\n if (field.$excludedFields) {\n fields = fields.filter((f: { $path: string }) => {\n if (isId(currentSchema, f)) {\n return true;\n }\n return !field.$excludedFields.includes(f.$path);\n });\n }\n\n const $filter =\n field.$id || field.$filter //skip if no $id and not $filter. In the future $thing can filter too\n ? { ...(field.$id ? { $id: field.$id } : {}), ...field.$filter }\n : undefined;\n\n return {\n $thingType,\n $plays: linkField.plays,\n $playedBy: {\n ...playedBy,\n oppositeLinkFieldsPlayedBy: undefined, // Remove this to break the loop\n },\n $path: playedBy.path,\n $dbPath: dbPath,\n $as: field.$as || fieldStr,\n $var: fieldStr,\n $thing,\n $fields: fields,\n $excludedFields: field.$excludedFields,\n $fieldType: 'link',\n $target: target,\n $intermediary: playedBy.relation,\n $justId,\n $id: field.$id,\n $filter,\n $idNotIncluded: idNotIncluded,\n $filterByUnique: checkFilterByUnique(field.$filter, currentSchema),\n $sort: field.$sort,\n $offset: field.$offset,\n $limit: field.$limit,\n [FieldSchema]: fieldSchema,\n };\n });\n};\n\nconst createRefField = (props: {\n field: any;\n fieldStr: string;\n $justId: boolean;\n dbPath: string;\n isVirtual?: boolean;\n fieldSchema: EnrichedRefField;\n}): EnrichedRefQuery => {\n const { field, fieldStr, $justId, dbPath, fieldSchema } = props;\n if ('$filter' in props) {\n throw new Error('Filter not supported in ref fields');\n }\n return {\n $path: fieldStr,\n $dbPath: dbPath,\n $contentType: fieldSchema.contentType,\n $as: field.$as || fieldStr,\n $var: fieldStr,\n $fieldType: 'ref',\n $justId,\n $fields: field.$fields,\n $id: field.$id,\n [FieldSchema]: fieldSchema,\n };\n};\n\nconst createRoleField = (props: {\n field: any;\n fieldStr: string;\n roleField: any;\n $justId: boolean;\n dbPath: string;\n schema: EnrichedBormSchema;\n fieldSchema: EnrichedRoleField;\n}): EnrichedRoleQuery => {\n const { field, fieldStr, roleField, $justId, dbPath, schema, fieldSchema } = props;\n\n return roleField.playedBy.map((playedBy: any) => {\n const { thing, thingType, relation } = playedBy;\n const node = { [`$${thingType}`]: thing };\n const currentSchema = getCurrentSchema(schema, node);\n const idNotIncluded =\n field?.$fields?.filter(\n (field: any) => currentSchema?.idFields?.includes(field) || currentSchema?.idFields?.includes(field.$path),\n ).length === 0;\n\n let fields = [];\n if (typeof field !== 'string') {\n if (field.$fields) {\n if (idNotIncluded) {\n const idFields = currentSchema.idFields || [];\n fields = [...field.$fields, ...idFields];\n } else {\n fields = field.$fields;\n }\n } else {\n fields = getAllFields(currentSchema);\n }\n } else {\n fields = ['id'];\n }\n\n if (field.$excludedFields) {\n fields = fields.filter((f: { $path: string }) => {\n if (isId(currentSchema, f)) {\n return true;\n }\n return !field.$excludedFields.includes(f.$path);\n });\n }\n\n const $filter =\n field.$id || field.$filter //skip if no $id and not $filter. In the future $thing can filter too\n ? { ...(field.$id ? { $id: field.$id } : {}), ...field.$filter }\n : undefined;\n\n return {\n $thingType: thingType,\n $path: fieldStr,\n $dbPath: dbPath,\n $as: field.$as || fieldStr,\n $var: fieldStr,\n $thing: thing,\n $fields: fields,\n $excludedFields: field.$excludedFields,\n $fieldType: 'role',\n $intermediary: relation,\n $justId,\n $id: field.$id,\n $filter,\n //$filter: field.$filter,\n $idNotIncluded: idNotIncluded,\n $filterByUnique: checkFilterByUnique(field.$filter, currentSchema),\n $playedBy: { ...playedBy, oppositeLinkFieldsPlayedBy: undefined },\n $sort: field.$sort,\n $offset: field.$offset,\n $limit: field.$limit,\n [FieldSchema]: fieldSchema,\n };\n });\n};\n\nconst processField = (\n field: any,\n currentSchema: EnrichedBormEntity | EnrichedBormRelation,\n schema: EnrichedBormSchema,\n) => {\n const fieldStr = typeof field === 'string' ? field : field.$path;\n const $justId = typeof field === 'string';\n const dataField = currentSchema.dataFields?.find((dataField: any) => dataField.path === fieldStr);\n const linkField = currentSchema.linkFields?.find((linkField: any) => linkField.path === fieldStr);\n const roleField = (currentSchema as EnrichedBormRelation).roles?.[fieldStr];\n const refField = currentSchema.refFields?.[fieldStr];\n\n if (dataField) {\n const isVirtual = !!dataField.isVirtual && !!dataField.default; //if there is no default value, then is fully virtual, the computing is managed in the DB\n return createDataField({\n field,\n fieldStr,\n $justId,\n dbPath: dataField.dbPath,\n isVirtual,\n fieldSchema: dataField,\n }); //ignore computed ones\n }\n if (linkField) {\n return createLinkField({\n field,\n fieldStr,\n linkField,\n $justId,\n dbPath: linkField.path,\n schema,\n fieldSchema: linkField,\n });\n }\n if (roleField) {\n return createRoleField({\n field,\n fieldStr,\n roleField,\n $justId,\n dbPath: fieldStr,\n schema,\n fieldSchema: roleField,\n });\n }\n if (refField) {\n return createRefField({\n field,\n fieldStr,\n $justId,\n dbPath: fieldStr,\n isVirtual: false,\n fieldSchema: refField,\n });\n }\n return null;\n};\n\n// Recursive enrich filter that checks all the tree of filters. Sometimes is dataFields, which is easier, but sometimes is linkFields or roleFields so we need to keep drilling\nexport const enrichFilter = ($filter: Filter | Filter[], $thing: string, schema: EnrichedBormSchema) => {\n if ($filter === null || $filter === undefined) {\n return $filter;\n }\n const wasArray = isArray($filter);\n\n const filterArray = wasArray ? $filter : [$filter];\n\n const resultArray = filterArray.map((filter: any) => {\n const keys = Object.keys(filter);\n\n const enrichedFilter = keys.reduce((acc: any, key: string) => {\n const value = filter[key];\n\n const valueAsArray = isArray(value) ? value : [value];\n\n if (key.startsWith('$')) {\n if (['$id', '$thing'].includes(key)) {\n acc[key] = value;\n } else if (['$not', '$or', '$and'].includes(key)) {\n // We don't want to enrich the special keys; we enrich nested things instead\n acc[key] = enrichFilter(value, $thing, schema);\n } else if (['$eq', '$in', '$exists'].includes(key)) {\n acc[key] = value;\n } else {\n throw new Error(`[Internal] Unknown filter operator ${key}`);\n }\n } else {\n // Must be a field\n const currentSchema = $thing in schema.entities ? schema.entities[$thing] : schema.relations[$thing];\n const [fieldType, fieldSchema] = getFieldType(currentSchema, key);\n\n if (fieldType === 'idField') {\n acc[key] = value;\n } else if (fieldType === 'dataField') {\n if (isObject(value) || (isArray(value) && value.some(isObject))) {\n acc[key] = isArray(value)\n ? { $or: enrichFilter(value, $thing, schema) }\n : enrichFilter(value, $thing, schema);\n } else if (isArray(value)) {\n acc[key] = { $in: value };\n } else {\n acc[key] = { $eq: value };\n }\n } else if (fieldType === 'linkField' || fieldType === 'roleField') {\n const fieldSchemaTyped = fieldSchema as EnrichedLinkField | EnrichedRoleField;\n const [childrenThing] = fieldSchemaTyped.$things; // TODO: Manage polymorphism\n if (valueAsArray.every((v: any) => typeof v === 'string')) {\n acc[key] = { $id: valueAsArray, $thing: childrenThing }; // Avoid the traverse to check this\n } else if (valueAsArray.every((v: any) => isObject(v))) {\n acc[key] = isArray(value)\n ? { $or: enrichFilter(value, childrenThing, schema) }\n : enrichFilter(value, childrenThing, schema);\n }\n } else {\n throw new Error(`Field ${key} not found in schema of ${$thing}`);\n }\n }\n return acc;\n }, {});\n return enrichedFilter;\n });\n\n if (!wasArray) {\n return resultArray[0];\n }\n if (resultArray.length === 1) {\n return resultArray[0];\n }\n return { $or: resultArray };\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 const fnStr: string = func.toString().replace(STRIP_COMMENTS, '').trim();\n // Remove function keywords and split at the first => or { to isolate parameters\n const fnBodyStr: string = fnStr.split('=>')[0].split('{')[0].replace(STRIP_KEYWORDS, '').trim();\n const paramsBlock = fnBodyStr.substring(fnBodyStr.indexOf('(') + 1, fnBodyStr.lastIndexOf(')')).trim();\n\n if (!paramsBlock) {\n return [];\n }\n\n // Match including destructured parameters with special characters\n const paramsMatch = paramsBlock.match(/(\\{[^}]*\\}|[^,]+)/g) || [];\n\n return paramsMatch\n .flatMap((param) => {\n // Remove leading/trailing braces and split based on comma outside of quotes\n if (param.includes('{') && param.includes('}')) {\n const destructuredParams = param.replace(/^\\{|\\}$/g, '').match(/(?:[^,\"']+|\"[^\"]*\"|'[^']*')+/g) || [];\n return destructuredParams.map((p) =>\n p\n .split(':')[0]\n .trim()\n .replace(/['\"[\\]]/g, ''),\n );\n }\n return param.trim();\n })\n .filter(Boolean);\n};\n\nexport const getDependencies = (fn: (...args: any[]) => void) => {\n const code = fn.toString();\n const ast = acorn.parse(code, { ecmaVersion: 2020 });\n let current: string[] = [];\n let parent: string[] = [];\n let context: string[] = [];\n const statement = ast.body.find((i) => i.type === 'ExpressionStatement') as acorn.ExpressionStatement | undefined;\n if (statement) {\n const fn = statement.expression;\n if (fn.type === 'ArrowFunctionExpression' || fn.type === 'FunctionExpression') {\n const [cur, par, ctx] = fn.params;\n current = getKeys(cur);\n parent = getKeys(par);\n context = getKeys(ctx);\n }\n }\n return { current, parent, context };\n};\n\nconst getKeys = (pat?: acorn.Pattern): string[] => {\n const keys: string[] = [];\n if (pat?.type === 'ObjectPattern') {\n pat?.properties?.forEach((p) => {\n if (p.type === 'Property') {\n if (p.key.type === 'Identifier') {\n keys.push(p.key.name);\n }\n }\n });\n }\n return keys;\n};\n","import type { BQLMutationBlock, EnrichedDataField } from '../types';\nimport { getParamNames } from './helpers';\n\nexport const computeField = ({\n currentThing,\n fieldSchema,\n mandatoryDependencies = false,\n}: {\n currentThing: BQLMutationBlock;\n fieldSchema?: EnrichedDataField;\n mandatoryDependencies?: boolean;\n}) => {\n if (!fieldSchema || !fieldSchema.default || !('fn' in fieldSchema.default || 'value' in fieldSchema.default)) {\n throw new Error(\n `[Internal] Virtual field: No field schema found, or wrongly configured. Field: ${JSON.stringify(fieldSchema, null, 3)}`,\n );\n }\n\n //check if all the args are in the entity, if not, throw a missing error with all the not present ones\n\n if (fieldSchema.default.type === 'value') {\n return fieldSchema.default.value;\n }\n\n if (mandatoryDependencies) {\n const { fn } = fieldSchema.default;\n\n const args = getParamNames(fn);\n const missingArgs = args.filter((arg) => !(arg in currentThing));\n\n if (missingArgs.length) {\n throw new Error(`Virtual field: Missing arguments ${missingArgs.join(', ')}`);\n }\n }\n if (!fieldSchema.default.fn) {\n throw new Error('[Schema] No fn in default field schema');\n }\n if ('default' in fieldSchema) {\n //@ts-expect-error can't find the issue, all subtypes have a value type, and a fn type\n if (fieldSchema.default.type === 'value') {\n //@ts-expect-error can't find the issue, all subtypes have a value type, and a fn type\n return fieldSchema.default.value;\n }\n if (fieldSchema.default.type === 'fn') {\n return fieldSchema.default.fn(currentThing);\n }\n\n throw new Error('[Schema] No default field definition');\n }\n};\n\nexport const computeNode = () => {};\n","/* eslint-disable no-param-reassign */\nimport { isArray, listify } from 'radash';\nimport { computeField } from '../../../../engine/compute';\nimport { getCurrentFields, getCurrentSchema, oFind } from '../../../../helpers';\nimport type {\n BQLMutationBlock,\n EnrichedBQLMutationBlock,\n EnrichedBormSchema,\n EnrichedDataField,\n} from '../../../../types';\n\nexport const computeFields = (node: BQLMutationBlock, field: string, schema: EnrichedBormSchema) => {\n const currentNode = node[field] as EnrichedBQLMutationBlock;\n if (!currentNode) {\n return;\n }\n (isArray(currentNode) ? currentNode : [currentNode]).forEach((subNode: EnrichedBQLMutationBlock) => {\n if (subNode.$op !== 'create') {\n return;\n }\n const currentSchema = getCurrentSchema(schema, subNode);\n const { unidentifiedFields } = getCurrentFields(currentSchema, subNode);\n const { computedFields, virtualFields } = currentSchema;\n\n //@ts-expect-error - TODO\n const filledFields = listify(subNode, (attKey, v) => (v !== undefined ? attKey : undefined)) as string[];\n /// if at least one of the filled fields is virtual, then throw error\n const virtualFilledFields = filledFields.filter((x) => virtualFields?.includes(x));\n if (virtualFilledFields.length > 0) {\n throw new Error(`Virtual fields can't be sent to DB: \"${virtualFilledFields.join(',')}\"`);\n }\n const missingComputedFields = computedFields.filter((x) => !filledFields.includes(x));\n\n // fill computed values\n missingComputedFields.forEach((fieldPath) => {\n const currentFieldDef = currentSchema.dataFields?.find((x) => x.path === fieldPath);\n const currentLinkDef = currentSchema.linkFields?.find((x) => x.path === fieldPath);\n // todo: multiple playedBy\n const currentLinkedDef = currentLinkDef?.oppositeLinkFieldsPlayedBy[0];\n\n const currentRoleDef =\n 'roles' in currentSchema ? oFind(currentSchema.roles, (k, _v) => k === fieldPath) : undefined;\n const currentDef = currentFieldDef || currentLinkedDef || currentRoleDef;\n if (!currentDef) {\n throw new Error(`no field Def for ${fieldPath}`);\n }\n\n // We generate the other default fields if they are not defined. We ignore the id field which was created before for $id\n if (!subNode[fieldPath]) {\n const defaultValue = computeField({\n currentThing: subNode,\n fieldSchema: currentDef as EnrichedDataField, //id is always a datafield.\n mandatoryDependencies: true, //can't send to db without every dependency being there\n });\n\n subNode[fieldPath] = defaultValue;\n }\n });\n\n if (unidentifiedFields.length > 0) {\n throw new Error(`Unknown fields: [${unidentifiedFields.join(',')}] in ${JSON.stringify(subNode)}`);\n }\n });\n return node;\n};\n","import { isArray } from 'radash';\nimport { genId } from '../../../../helpers';\nimport type { BQLMutationBlock } from '../../../../types';\n\nexport const get$bzId = (node: BQLMutationBlock, thing?: string) => {\n if (node.$bzId) {\n return node.$bzId;\n }\n if (node.$tempId) {\n return node.$tempId;\n }\n // particular case, where we have a single $id, which is unique per $things so no need to generate multiple bzIds we can unify\n if (node.$id && !isArray(node.$id)) {\n return thing ? `SN_ONE_${thing}_${node.$id}` : `SN_ONE_${node.$id}`; //also we add prefix SN_ONE as we know is cardinality ONE\n }\n if (node.$id && isArray(node.$id)) {\n return thing ? `SN_MANY_${thing}_${genId()}` : `SN_MANY_${genId()}`; //also we add prefix SN_MANY as we know is cardinality MANY\n }\n\n return `SM_${genId()}`;\n};\n","import { isArray } from 'radash';\nimport { getCurrentFields, getCurrentSchema } from '../../../../helpers';\nimport type { BQLMutationBlock, BormOperation, EnrichedBormSchema } from '../../../../types';\n\nexport const validateOp = (parentNode: BQLMutationBlock, node: BQLMutationBlock, schema: EnrichedBormSchema) => {\n if (node.$op) {\n // $op validations /// Order: most specific to least specific\n if (node.$op === 'create' && node.$id) {\n throw new Error(\"[Wrong format] Can't write to computed field $id. Try writing to the id field directly.\");\n }\n if (['unlink', 'delete', 'update'].includes(node.$op) && parentNode.$op === 'create') {\n throw new Error(`[Wrong format] Cannot ${node.$op} under a create`);\n }\n\n const nodeSchema = getCurrentSchema(schema, node);\n const { usedDataFields } = getCurrentFields(nodeSchema, node);\n\n if (node.$op === 'delete' && usedDataFields.length > 0) {\n //linkFields can be updated, for instance nested deletions\n throw new Error('[Wrong format] Cannot update on deletion');\n }\n if (['unlink', 'link'].includes(node.$op) && usedDataFields.length > 0) {\n //linkFields can be updated, for instance nested unlinks\n throw new Error(\"[Unsupported] Can't update fields on Link / Unlink\");\n }\n return node.$op as BormOperation;\n }\n};\n\nexport const validateChildren = (parentNode: BQLMutationBlock, node: BQLMutationBlock, schema: EnrichedBormSchema) => {\n const subNodes = isArray(node) ? node : [node];\n subNodes.forEach((subNode) => {\n validateOp(parentNode, subNode, schema);\n });\n};\n","import { getCurrentFields, getCurrentSchema } from '../../../../helpers';\nimport type { BQLMutationBlock, BormOperation, EnrichedBormSchema } from '../../../../types';\nimport { validateOp } from './validateOp';\n\nexport const getOp = (node: BQLMutationBlock): BormOperation => {\n const usedFields = Object.keys(node).filter((key) => !(key.startsWith('$') || key.startsWith('%')));\n\n if (node.$op) {\n return node.$op as BormOperation;\n }\n if (node.$id || node.$filter) {\n if (usedFields.length > 0) {\n return 'update';\n }\n return 'link';\n }\n if (node.$tempId) {\n if (usedFields.length > 0) {\n return 'create'; //only difference is $id + stuff means update, while $tempIds are usually for creation and recovering it later from the res\n }\n return 'link';\n }\n return 'create';\n};\n\nexport const getOpAndValidate = (\n parentNode: BQLMutationBlock,\n node: BQLMutationBlock,\n schema: EnrichedBormSchema,\n): BormOperation => {\n const nodeSchema = getCurrentSchema(schema, node);\n const { usedFields } = getCurrentFields(nodeSchema, node);\n\n if (node.$op) {\n validateOp(parentNode, node, schema);\n return node.$op as BormOperation;\n }\n if (node.$id || node.$filter) {\n if (usedFields.length > 0) {\n validateOp(parentNode, { ...node, $op: 'update' }, schema);\n return 'update';\n }\n validateOp(parentNode, { ...node, $op: 'link' }, schema);\n return 'link';\n }\n if (node.$tempId) {\n if (usedFields.length > 0) {\n validateOp(parentNode, { ...node, $op: 'create' }, schema);\n return 'create'; //only difference is $id + stuff means update, while $tempIds are usually for creation and recovering it later from the res\n }\n validateOp(parentNode, { ...node, $op: 'create' }, schema);\n return 'link';\n }\n validateOp(parentNode, { ...node, $op: 'create' }, schema);\n return 'create';\n};\n","import type { EnrichedLinkField, EnrichedRoleField } from '../../../../types';\nimport { SharedMetadata } from '../../../../types/symbols';\n\nexport const getOppositePlayers = (field: string, fieldSchema: EnrichedLinkField | EnrichedRoleField) => {\n if (fieldSchema[SharedMetadata].fieldType === 'linkField') {\n const linkFieldSchema = fieldSchema as EnrichedLinkField;\n const oppositePlayer = linkFieldSchema.oppositeLinkFieldsPlayedBy;\n if (oppositePlayer?.length !== 1) {\n throw new Error(`[Internal] Field ${field} should have a single player`);\n }\n if (!oppositePlayer?.length) {\n throw new Error(`[Internal] Field ${field} should have a player`);\n }\n return oppositePlayer;\n }\n if (fieldSchema[SharedMetadata].fieldType === 'roleField') {\n const roleFieldSchema = fieldSchema as EnrichedRoleField;\n if ([...new Set(roleFieldSchema.playedBy?.map((x) => x.thing))]?.length !== 1) {\n throw new Error(`[Internal] Field ${field} should have a single player`);\n }\n if (!roleFieldSchema.playedBy?.length) {\n throw new Error(`[Internal] Field ${field} should have a player`);\n }\n return roleFieldSchema.playedBy;\n }\n throw new Error(`[Internal] Field ${field} is not a linkField or roleField`);\n};\n","/* eslint-disable no-param-reassign */\nimport { isArray, isObject } from 'radash';\nimport type {\n BQLMutationBlock,\n EnrichedBQLMutationBlock,\n EnrichedBormSchema,\n EnrichedLinkField,\n EnrichedRefField,\n EnrichedRoleField,\n} from '../../../../types';\nimport { EdgeSchema, SharedMetadata } from '../../../../types/symbols';\nimport { get$bzId } from '../shared/get$bzId';\nimport { getOp } from '../shared/getOp';\nimport { getOppositePlayers } from '../shared/getOppositePlayers';\n\nexport const enrichChildren = (\n node: BQLMutationBlock,\n field: string,\n fieldSchema: EnrichedLinkField | EnrichedRoleField | EnrichedRefField,\n schema: EnrichedBormSchema,\n) => {\n const newNodes = (isArray(node[field]) ? node[field] : [node[field]]).flatMap((subNode: EnrichedBQLMutationBlock) => {\n if (!fieldSchema) {\n throw new Error(`[Internal] No fieldSchema found in ${JSON.stringify(fieldSchema)}`);\n }\n\n const $op = getOp(subNode);\n const $bzId = get$bzId(subNode);\n\n if (fieldSchema[SharedMetadata].fieldType === 'refField') {\n const refSchema = fieldSchema as EnrichedRefField;\n\n if (!isObject(subNode)) {\n if (refSchema.contentType === 'FLEX') {\n return subNode;\n }\n throw new Error(`[Wrong format] The refField ${field} must receive an object`);\n }\n\n if (!subNode.$thing) {\n throw new Error('[Wrong format] The field $thing is required in refFields');\n }\n return { ...subNode, $op, $bzId };\n }\n\n const relationSchema = fieldSchema as EnrichedRoleField | EnrichedLinkField;\n\n if (relationSchema.$things.length === 0) {\n //todo: maybe add all the potential $things to a ref field?\n throw new Error(`[Internal error] The field ${field} can't be played by any thing.`);\n }\n\n const relFieldSchema = fieldSchema as EnrichedRoleField | EnrichedLinkField;\n\n if (relFieldSchema.$things.length === 1) {\n const oppositePlayers = getOppositePlayers(field, relationSchema);\n const [player] = oppositePlayers;\n\n if (subNode.$thing && subNode.$thing !== player.thing) {\n throw new Error(`[Wrong format] The field ${field} can only be played by ${player.thing}.`);\n }\n return {\n ...subNode,\n [EdgeSchema]: relFieldSchema,\n $thing: player.thing,\n $thingType: player.thing in schema.entities ? 'entity' : 'relation',\n $op,\n $bzId,\n };\n }\n if (relFieldSchema.$things.length > 1) {\n if (subNode.$thing) {\n return [\n {\n ...subNode,\n [EdgeSchema]: relFieldSchema,\n $thing: subNode.$thing,\n $thingType: subNode.$thing in schema.entities ? 'entity' : 'relation',\n $op,\n $bzId,\n },\n ];\n }\n if (!subNode.$thing) {\n if (subNode.$tempId) {\n throw new Error(\n '[Unsupported] Objects with $tempId and multiple potential players require to explicitly indicate the $thing type.',\n );\n }\n if ($op === 'create') {\n throw new Error(\n `[Wrong format] The field ${field} can be played by multiple things, please specify one on creation.`,\n );\n }\n\n return relFieldSchema.$things.map((thing) => {\n return {\n ...subNode,\n [EdgeSchema]: relFieldSchema,\n $thing: thing,\n $thingType: thing in schema.entities ? 'entity' : 'relation',\n $op,\n $bzId: get$bzId(subNode, thing),\n //[QueryContext]: { ...subNode[QueryContext], $multiThing: true }, //multiThing is used so the arcs of this manual split are merged in a single arc\n };\n });\n }\n }\n //#endregion nested nodes\n });\n\n if (isArray(node[field])) {\n node[field] = newNodes;\n } else {\n if (newNodes.length > 1) {\n //we might have added deduplicated things\n node[field] = newNodes;\n } else {\n // eslint-disable-next-line prefer-destructuring\n node[field] = newNodes[0];\n }\n }\n\n node[field] = isArray(node[field]) ? newNodes : newNodes[0];\n};\n","import { capitalizeFirstLetter, getCurrentSchema } from '../../../../helpers';\nimport type { Action, BormTrigger, EnrichedBormSchema, FilledBQLMutationBlock, Hooks } from '../../../../types';\n\nexport const getTriggeredActions = (node: FilledBQLMutationBlock, schema: EnrichedBormSchema) => {\n const hooks = getCurrentSchema(schema, node).hooks as Hooks;\n if (hooks?.pre) {\n const currentEvent = `on${capitalizeFirstLetter(node.$op)}` as BormTrigger;\n const currentHooks = hooks.pre.filter((hook) => !hook.triggers || hook.triggers[currentEvent]?.()); //No triggers triggers everything\n const actions = currentHooks.flatMap((hook) => hook.actions);\n return actions;\n }\n return [] as Action[];\n};\n","/* eslint-disable no-param-reassign */\nimport { clone, isArray } from 'radash';\nimport { deepCurrent, getSymbols, isBQLBlock } from '../../../../helpers';\nimport type { BormConfig, EnrichedBQLMutationBlock, EnrichedBormSchema, TransFormAction } from '../../../../types';\nimport { DBNode, IsTransformed } from '../../../../types/symbols';\nimport { getTriggeredActions } from '../shared/getTriggeredActions';\n\nexport const preHookTransformations = (\n node: EnrichedBQLMutationBlock,\n field: string,\n schema: EnrichedBormSchema,\n config: BormConfig,\n) => {\n const nodes = isArray(node[field]) ? node[field] : [node[field]];\n\n nodes.forEach((subNode: EnrichedBQLMutationBlock) => {\n if (!isBQLBlock(subNode)) {\n return;\n }\n\n // @ts-expect-error todo\n if (subNode.$fields || subNode[IsTransformed]) {\n ///todo: change machine context so we are sure we run preQueryDeps before coming back to here\n return;\n }\n\n const triggeredActions = getTriggeredActions(subNode, schema).filter(\n (action) => action.type === 'transform',\n ) as TransFormAction[];\n\n const parentNode = clone(deepCurrent(node)) as EnrichedBQLMutationBlock;\n let workingNode = clone(deepCurrent(subNode)) as EnrichedBQLMutationBlock;\n const userContext = (config.mutation?.context || {}) as Record<string, any>;\n const dbNode = clone(\n deepCurrent<EnrichedBQLMutationBlock | Record<string, never>>(subNode[DBNode] || subNode.$dbNode),\n ) as EnrichedBQLMutationBlock | Record<string, never>;\n\n triggeredActions.forEach((action) => {\n const newProps = action.fn(workingNode, parentNode, userContext, dbNode || {});\n if (Object.keys(newProps).length === 0) {\n return;\n }\n\n // Update working node to be used by next action\n workingNode = { ...workingNode, ...newProps, ...getSymbols(subNode), [IsTransformed]: true };\n\n // Update the draft state in Immer\n Object.assign(subNode, workingNode);\n });\n });\n};\n","/* eslint-disable no-param-reassign */\nimport { clone, isArray, isObject } from 'radash';\nimport { deepCurrent, getCurrentSchema } from '../../../../helpers';\nimport type { BormConfig, EnrichedBQLMutationBlock, EnrichedBormSchema } from '../../../../types';\nimport { DBNode } from '../../../../types/symbols';\nimport { getTriggeredActions } from '../shared/getTriggeredActions';\n\nexport const preHookValidations = (\n node: EnrichedBQLMutationBlock,\n field: string,\n schema: EnrichedBormSchema,\n config: BormConfig,\n) => {\n const subNodes = isArray(node[field]) ? node[field] : [node[field]];\n subNodes.forEach((subNode: EnrichedBQLMutationBlock) => {\n if ('$thing' in subNode) {\n if (subNode.$fields) {\n ///change machine context so we are sure we run preQueryDeps before coming back to here\n return subNode;\n }\n\n const { requiredFields, enumFields, fnValidatedFields, dataFields } = getCurrentSchema(schema, subNode);\n\n /// Required fields\n if ('$op' in subNode && subNode.$op === 'create') {\n requiredFields.forEach((field) => {\n if (!(field in subNode)) {\n throw new Error(`[Validations] Required field \"${field}\" is missing.`);\n }\n });\n }\n /// Enums\n if (('$op' in subNode && subNode.$op === 'update') || subNode.$op === 'create') {\n enumFields.forEach((field) => {\n if (field in subNode) {\n const enumOptions = dataFields?.find((df) => df.path === field)?.validations?.enum;\n if (!enumOptions) {\n throw new Error(`[Validations] Enum field \"${field}\" is missing enum options.`);\n }\n if (isArray(subNode[field])) {\n subNode[field].some((val: any) => {\n if (val !== null && !enumOptions.includes(val)) {\n throw new Error(`[Validations] Option \"${val}\" is not a valid option for field \"${field}\".`);\n }\n });\n } else if (enumOptions && !enumOptions.includes(subNode[field]) && !(subNode[field] === null)) {\n throw new Error(`[Validations] Option \"${subNode[field]}\" is not a valid option for field \"${field}\".`);\n }\n }\n });\n }\n /// fn\n if (('$op' in subNode && subNode.$op === 'update') || subNode.$op === 'create') {\n fnValidatedFields.forEach((field: string) => {\n if (field in subNode) {\n try {\n const fn = dataFields?.find((df) => df.path === field)?.validations?.fn;\n if (!fn) {\n throw new Error('Missing validation function.');\n }\n // @ts-expect-error - TODO\n if (!fn(subNode[field])) {\n throw new Error('Failed validation function.');\n }\n } catch (error: any) {\n throw new Error(`[Validations:attribute:${field}] ${error.message}`);\n }\n }\n });\n }\n\n /// Node validations\n if (isObject(subNode) && '$thing' in subNode) {\n const currentThing = subNode.$thing;\n const value = subNode as EnrichedBQLMutationBlock;\n\n const parentNode = clone(deepCurrent(node));\n const currentNode = clone(deepCurrent(value));\n const userContext = (config.mutation?.context || {}) as Record<string, any>;\n const dbNode = clone(deepCurrent<EnrichedBQLMutationBlock | Record<string, never>>(subNode[DBNode] || {})) as\n | EnrichedBQLMutationBlock\n | Record<string, never>;\n\n const triggeredActions = getTriggeredActions(value, schema);\n triggeredActions.forEach((action) => {\n if (action.type === 'validate') {\n if (action.severity !== 'error') {\n return; // in borm we only use the errors\n }\n\n try {\n //! Todo: Sandbox the function in nodeCompute() instead of the existing fieldCompute()\n const validationResult = action.fn(currentNode, parentNode, userContext, dbNode);\n\n if (validationResult === false) {\n throw new Error(`${action.message}.`);\n }\n if (validationResult !== true) {\n throw new Error(\"Validation function's output is not a boolean value.\");\n }\n } catch (error: any) {\n throw new Error(`[Validations:thing:${currentThing}] ${error.message}`);\n }\n }\n });\n }\n }\n });\n};\n","/* eslint-disable no-param-reassign */\nimport { isArray } from 'radash';\nimport type { BQLMutationBlock, EnrichedLinkField, EnrichedRoleField } from '../../../../types';\n\nexport const preValidate = (\n node: BQLMutationBlock,\n field: string,\n fieldSchema: EnrichedLinkField | EnrichedRoleField,\n paths: string[],\n) => {\n const subNodes = isArray(node[field]) ? node[field] : [node[field]];\n\n const cleanPath = paths.slice(1).join('.');\n subNodes.forEach((subNode: BQLMutationBlock) => {\n if (!subNode) {\n return;\n }\n /// For cardinality ONE, we need to specify the $op of the children\n if (\n fieldSchema?.cardinality === 'ONE' &&\n !subNode.$op &&\n !subNode.$id &&\n !subNode.$filter &&\n !subNode.$tempId &&\n node.$op !== 'create'\n ) {\n throw new Error(`Please specify if it is a create or an update. Path: ${cleanPath}.${field}`);\n }\n if (subNode.$tempId) {\n if (\n !(\n subNode.$op === undefined ||\n subNode.$op === 'link' ||\n subNode.$op === 'create' ||\n subNode.$op === 'update' ||\n subNode.$op === 'replace'\n )\n ) {\n throw new Error(\n `Invalid op ${subNode.$op} for tempId. TempIds can be created, or linked when created in another part of the same mutation.`,\n );\n }\n }\n });\n};\n","/* eslint-disable no-param-reassign */\nimport { isArray, isObject } from 'radash';\nimport type { BQLMutationBlock, EnrichedRefField } from '../../../../types';\n\ntype PrefixedResult =\n | { isPrefixed: true; obj: { $thing: string; $id: string } | { $thing: string; $tempId: string } }\n | { isPrefixed: false; obj: unknown };\n\nconst prefixedToObj = (value: unknown): PrefixedResult => {\n if (typeof value !== 'string') {\n return { isPrefixed: false, obj: value };\n }\n\n // Handle case 1: $thing:$id (xxx:yyy)\n const standardPrefixMatch = value.match(/^([^:]+):([^:].*)$/);\n\n if (standardPrefixMatch) {\n const [, $thing, id] = standardPrefixMatch;\n\n return { isPrefixed: true, obj: { $thing, ...(id.startsWith('_:') ? { $tempId: id } : { $id: id }) } };\n }\n\n return { isPrefixed: false, obj: value };\n};\nexport const replaceToObj = (node: BQLMutationBlock, field: string) => {\n ///Simplified so the only purpose of this function is to change strings to obj, but not assign BzIds or $things\n const subNodes = isArray(node[field]) ? node[field] : [node[field]];\n\n // If all elements are objects, return early (no transformation needed)\n if (subNodes.every((child) => typeof child === 'object')) {\n return;\n }\n\n // Ensure all elements are strings or objects with \"$op: replace\"; otherwise, throw an error\n if (\n !subNodes.every(\n (child) => typeof child === 'string' || (isObject(child) && '$op' in child && child.$op === 'replace'),\n )\n ) {\n throw new Error(\n `[Mutation Error] Replace can only be used with a single id, an array of ids, or objects with $op: replace. (Field: ${field} Nodes: ${JSON.stringify(subNodes)})`,\n );\n }\n\n const $op = node.$op === 'create' ? 'link' : 'replace';\n\n node[field] = subNodes.map((child) => {\n if (typeof child === 'string') {\n if (child.startsWith('_:')) {\n return { $tempId: child, $op };\n }\n\n const { isPrefixed, obj } = prefixedToObj(child);\n if (isPrefixed) {\n return { ...obj, $op };\n }\n\n // Otherwise, it's a normal $id\n return { $id: child, $op };\n }\n // If already an object with $op: replace, keep it as is\n return child;\n });\n};\n\n//todo: This is not doing any replaces, just checking the format, should be cleaned to do it\nexport const replaceToObjRef = (node: BQLMutationBlock, field: string, fieldSchema: EnrichedRefField) => {\n const subNodes = isArray(node[field]) ? node[field] : [node[field]];\n\n const $op = node.$op === 'create' ? 'link' : 'replace';\n\n node[field] = subNodes.map((child) => {\n if (typeof child === 'string') {\n if (child.startsWith('_:')) {\n return { $tempId: child, $op };\n }\n\n const { isPrefixed, obj } = prefixedToObj(child);\n if (isPrefixed) {\n return { ...obj, $op };\n }\n\n if (fieldSchema.contentType === 'FLEX') {\n // it's ok we just keep the string\n return child;\n }\n\n throw new Error(\n \"[Wrong format] Field of contentType REF can't use strings as references unless they follow the format `$thing:$id`\", //future: unless they are prefixed\n );\n }\n\n if (typeof child === 'object' && '$thing' in child) {\n return child; //this is ok as well\n }\n\n if (fieldSchema.contentType === 'FLEX') {\n return child; //any other type is fine in FLEX too\n }\n\n throw new Error(\n '[Wrong format] Field of contentType REF can use prefixed id strings, tempIds or objects indicating their $thing', //future: unless they are prefixed\n );\n });\n return node[field];\n};\n","import { isArray } from 'radash';\nimport { genId, getThingType } from '../../../../helpers';\nimport type { BQLMutationBlock, EnrichedBormSchema } from '../../../../types';\nimport { getOpAndValidate } from '../shared/getOp';\n\nexport const setRootMeta = (node: { $root: BQLMutationBlock | BQLMutationBlock[] }, schema: EnrichedBormSchema) => {\n const rootArray = isArray(node.$root) ? node.$root : [node.$root];\n\n const withMetadataRootArray = rootArray.map((rootNode) => {\n const rootOp = getOpAndValidate(rootNode, rootNode, schema);\n\n const withMetadata = {\n ...(rootNode.$thing ? {} : { $thing: rootNode.$entity || rootNode.$relation }),\n ...(rootNode.$thingType ? {} : { $thingType: getThingType(rootNode, schema) }),\n ...(rootNode.$op ? {} : { $op: rootOp }),\n ...(rootNode.$bzId ? {} : { $bzId: `R_${genId()}` }),\n };\n // eslint-disable-next-line no-param-reassign\n return { ...withMetadata, ...rootNode };\n });\n // eslint-disable-next-line no-param-reassign\n node.$root = isArray(node.$root) ? withMetadataRootArray : withMetadataRootArray[0];\n};\n","import { isArray, isObject } from 'radash';\nimport { deepCurrent, getCurrentSchema, getSymbols } from '../../../../helpers';\nimport type { BQLMutationBlock, EnrichedBQLMutationBlock, EnrichedBormSchema } from '../../../../types';\nimport { doAction } from '../shared/doActions';\n\nexport const splitMultipleIds = (node: BQLMutationBlock, field: string, schema: EnrichedBormSchema) => {\n if (doAction('split_ids', node)) {\n //insert here\n const transformedChildren = (isArray(node[field]) ? node[field] : [node[field]]).flatMap(\n (child: EnrichedBQLMutationBlock) => {\n if (isObject(child) && '$id' in child && isArray(child.$id)) {\n const subNode = child as EnrichedBQLMutationBlock & { $id: string[] };\n /*const childSchema =*/ getCurrentSchema(schema, subNode);\n /// Depending on the DB this operation is required or not\n if (!subNode.$bzId) {\n throw new Error('[Internal Error] No bzId found');\n }\n // biome-ignore lint/correctness/noConstantCondition: <Todo>\n if (/*childSchema.dbContext.mutation?.splitArray$Ids*/ true) {\n return subNode.$id.map(($id: string, i: number) => ({\n ...deepCurrent(subNode), //structured clone generates a weird bug with traverse, so not using it\n $id: $id,\n $bzId: `${subNode.$bzId}_${i}`,\n ...getSymbols(subNode),\n }));\n }\n }\n return child;\n },\n );\n // if we splitted something, then reassign\n if (transformedChildren.length > 0 && isArray(node[field]) ? node[field] : [node[field]].length) {\n // eslint-disable-next-line no-param-reassign\n node[field] = transformedChildren;\n }\n }\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 const current = block[StepPrint];\n if (!isSet(current)) {\n Reflect.set(block, StepPrint, new Set(['clean']));\n return true;\n }\n if (!current.has('clean')) {\n return false;\n }\n Reflect.set(block, StepPrint, current.add('clean'));\n return true;\n};\n","import { v4 as uuidv4 } from 'uuid';\n/* eslint-disable no-param-reassign */\nimport type { BQLMutationBlock, EnrichedLinkField, EnrichedRoleField } from '../../../../types';\nimport { EdgeSchema } from '../../../../types/symbols';\nimport { getOppositePlayers } from '../shared/getOppositePlayers';\n\nexport const unlinkAll = (\n node: BQLMutationBlock,\n field: string,\n fieldSchema: EnrichedLinkField | EnrichedRoleField,\n) => {\n const oppositePlayers = getOppositePlayers(field, fieldSchema);\n const [player] = oppositePlayers;\n\n node[field] = {\n $thing: player.thing,\n $thingType: player.thingType,\n $op: 'unlink',\n $bzId: `U_${uuidv4()}`,\n [EdgeSchema]: fieldSchema,\n };\n};\n","import type { EnrichedBQLMutationBlock } from '../../../../types';\n\nexport const dependenciesGuard = (mut: EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[]) => {\n if (Array.isArray(mut)) {\n for (const o of mut) {\n if (dependenciesGuard(o)) {\n return true;\n }\n }\n return false;\n }\n\n if (mut.$fields) {\n return true;\n }\n\n for (const key in mut) {\n if (key.startsWith('$')) {\n continue;\n }\n const value = mut[key];\n if (value && typeof value === 'object' && dependenciesGuard(mut[key])) {\n return true;\n }\n }\n\n return false;\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 { deepRemoveMetaData } from '../../../../tests/helpers/matchers';\nimport { computeField } from '../../../engine/compute';\nimport { getCurrentFields, getCurrentSchema, getParentNode, oFilter } from '../../../helpers';\nimport type {\n BQLMutationBlock,\n BormOperation,\n EnrichedBQLMutationBlock,\n EnrichedBormRelation,\n EnrichedBormSchema,\n EnrichedLinkField,\n} from '../../../types';\nimport { EdgeSchema, EdgeType, SharedMetadata } from '../../../types/symbols';\n\nexport const parseBQLMutation = async (\n blocks: EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[],\n schema: EnrichedBormSchema,\n) => {\n const listNodes = (blocks: EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[]) => {\n // todo: make immutable\n\n const nodes: BQLMutationBlock[] = [];\n const edges: BQLMutationBlock[] = [];\n\n /*\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 const getIdValue = (node: EnrichedBQLMutationBlock) => {\n if (node.$id) {\n return node.$id;\n }\n\n const currentSchema = getCurrentSchema(schema, node);\n const { idFields } = currentSchema;\n\n if (!idFields) {\n throw new Error(`no idFields: ${JSON.stringify(node)}`);\n }\n // todo: composite ids\n const [idField] = idFields;\n if (!idField) {\n throw new Error(`no idField: ${JSON.stringify(node)}`);\n }\n /// 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 const idDataField = currentSchema.dataFields?.find((x) => x.path === idField);\n\n const defaultIdField = computeField({\n currentThing: node,\n fieldSchema: idDataField, //id is always a datafield.\n mandatoryDependencies: true, //can't send to db without every dependency being there\n });\n\n const idValue = node[idField] || node.$id || defaultIdField;\n\n if (!idValue) {\n throw new Error(`no idValue: ${JSON.stringify(node)}`);\n }\n return idValue;\n };\n\n const toNodes = (node: EnrichedBQLMutationBlock) => {\n if (node.$op === 'create') {\n const idValue = getIdValue(node);\n\n if (nodes.find((x) => x.$id === idValue && x.$op === 'create')) {\n throw new Error(`Duplicate id ${idValue} for node ${JSON.stringify(node)}`);\n }\n\n nodes.push({ ...node, $id: idValue });\n return;\n }\n\n if (node.$tempId && node.$op === 'match') {\n /// 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 return;\n }\n nodes.push(node);\n };\n\n const toEdges = (edge: EnrichedBQLMutationBlock) => {\n if (edge.$op === 'create') {\n const idValue = getIdValue(edge);\n\n if (nodes.find((x) => x.$id === idValue && x.$op === 'create')) {\n throw new Error(`Duplicate id ${idValue} for edge ${JSON.stringify(edge)}`);\n }\n edges.push({ ...edge, $id: idValue });\n return;\n }\n edges.push(edge);\n };\n\n const listOp = ({ value: val, parent, meta }: TraversalCallbackContext) => {\n if (!isObject(val)) {\n return;\n }\n const value = val as EnrichedBQLMutationBlock;\n\n if (meta.nodePath?.includes('.$filter')) {\n return;\n }\n\n /// no idea why this is needed lol, but sometimes is indeed undefined 🤷‍♀️\n if (value.$thing) {\n if (!value.$op) {\n throw new Error(`Operation should be defined at this step ${JSON.stringify(value)}`);\n }\n\n if (!value.$bzId) {\n throw new Error(`[internal error] BzId not found ${JSON.stringify(value)}`);\n }\n /// this is used to group the right delete/unlink operations with the involved things\n\n const currentThingSchema = getCurrentSchema(schema, value);\n const {\n dataFields: dataFieldPaths,\n roleFields: roleFieldPaths,\n linkFields: linkFieldPaths,\n refFields: refFieldPaths,\n usedFields,\n } = getCurrentFields(currentThingSchema, value);\n\n const getChildOp = () => {\n if (value.$op === 'create' || value.$op === 'delete') {\n return value.$op;\n }\n // if its un update because linkfields or rolefields updated, but no attributes, then it a match\n if (value.$op === 'update') {\n const usedDataFields = usedFields.filter((x: string) => dataFieldPaths?.includes(x));\n const usedRoleFields = usedFields.filter((x: string) => roleFieldPaths?.includes(x));\n const usedLinkFields = usedFields.filter((x: string) => linkFieldPaths?.includes(x));\n const usedRefFields = usedFields.filter((x: string) => refFieldPaths?.includes(x));\n if (usedDataFields.length > 0) {\n return 'update';\n }\n if (usedRoleFields.length > 0 || usedLinkFields.length > 0 || usedRefFields.length > 0) {\n return 'match';\n }\n throw new Error(`No fields on an $op:\"update\" for node ${JSON.stringify(value)}`);\n }\n\n return 'match';\n };\n\n const dataObj = {\n ...(value.$id && { $id: value.$id }),\n ...(value.$tempId && { $tempId: value.$tempId }),\n ...(value.$filter && { $filter: value.$filter }),\n ...{ $thing: value.$thing },\n ...(value.$thingType && { $thingType: value.$thingType }),\n ...shake(pick(value, dataFieldPaths || [''])),\n $op: getChildOp() as BormOperation,\n $bzId: value.$bzId,\n };\n\n /// split nodes with multiple ids // why? //no longer doing that\n toNodes(dataObj);\n\n // CASE 1: HAVE A PARENT THROUGH LINKFIELDS\n const edgeSchema = value[EdgeSchema] as EnrichedLinkField;\n\n if (edgeSchema?.[SharedMetadata].fieldType === 'linkField') {\n if (value.$op === 'link' || value.$op === 'unlink') {\n if (value.$id || value.$filter) {\n if (value.$tempId) {\n throw new Error(\"can't specify a existing and a new element at once. Use an id/filter or a tempId\");\n }\n nodes.push({ ...value, $op: 'match' });\n }\n // we add a \"linkable\" version of it so we can query it in the insertion\n }\n\n // this linkObj comes from nesting, which means it has no properties and no ID\n // relations explicitely created are not impacted by this, and they get the $id from it's actual current value\n\n const ownRelation = edgeSchema.$things.includes(value.$thing); //might be a subclass of the relation\n\n const linkTempId = ownRelation ? value.$bzId : `LT_${uuidv4()}`;\n\n const parentNode = getParentNode(blocks, parent, meta);\n\n const parentId = parentNode.$bzId;\n\n if (!parentId) {\n throw new Error('No parent id found');\n }\n\n const getLinkObjOp = () => {\n if (value.$op === 'delete') {\n if (ownRelation) {\n return 'match';\n }\n return 'delete';\n }\n if (value.$op === 'unlink') {\n if (ownRelation) {\n return 'unlink';\n } // delete already present in the nodes array\n return 'delete';\n }\n if (value.$op === 'link' || value.$op === 'create') {\n if (ownRelation) {\n return 'link';\n } // create already present in the nodes array\n return 'create';\n }\n // todo: probably check replaces\n if (value.$op === 'replace') {\n // Currently pre-queries do not cross reference data nested below a create operation\n //throw new Error('Unsupported: Nested replaces not implemented yet');\n /// So this does not work in typedb without replaces, so basically if you're using typeDB this should not be reached. In other DBs its ok\n //throw new Error('Unsupported: Nested replaces not implemented yet');\n return 'replace';\n }\n return 'match';\n };\n //validate that field is an actual role from the relation\n const relationSchema = getCurrentSchema(schema, {\n $thing: edgeSchema.relation,\n $thingType: 'relation',\n }) as EnrichedBormRelation;\n const roles = Object.keys(relationSchema.roles);\n if (!roles.includes(edgeSchema.plays)) {\n throw new Error(\n `[Wrong format] Field ${edgeSchema.plays} is not a role of relation ${edgeSchema.relation}`,\n );\n }\n\n const edgeType1 = {\n $bzId: linkTempId,\n $thing: ownRelation ? value.$thing : edgeSchema.relation, //if it is its own relation, it might be a relation that extends it\n $thingType: 'relation' as const,\n ...(value.$tempId ? { $tempId: value.$tempId } : {}),\n $op: getLinkObjOp(),\n\n // roles\n ...(!ownRelation ? { [edgeSchema.path]: value.$bzId } : {}),\n [edgeSchema.plays]: parentId,\n\n //Metadata\n [EdgeSchema]: edgeSchema,\n [EdgeType]: 'linkField',\n };\n\n // const testVal = {};\n\n // todo: stuff 😂\n //@ts-expect-error - TODO\n toEdges(edgeType1);\n\n /// when it has a parent through a linkField, we need to add an additional node (its dependency), as well as a match\n /// 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 /// this is only for relations that are not $self, as other relations will be deleted and don't need a match\n if ((value.$op === 'unlink' || getLinkObjOp() === 'unlink') && ownRelation) {\n toEdges({\n $thing: edgeSchema.relation,\n $thingType: 'relation' as const,\n $bzId: linkTempId,\n $op: 'match',\n [edgeSchema.plays]: parentId,\n [EdgeSchema]: edgeSchema,\n [EdgeType]: 'linkField',\n });\n }\n }\n\n // CASE 2: IS RELATION AND HAS THINGS IN THEIR ROLES\n if (value.$thingType === 'relation') {\n const rolesObjFiltered = oFilter(value, (k: string, _v) => roleFieldPaths.includes(k));\n\n /// 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 // todo: this is super weird, remove\n //@ts-expect-error - TODO\n const rolesObjOnlyIds = mapEntries(rolesObjFiltered, (k: string, v) => {\n if (isArray(v)) {\n return [k, v];\n }\n if (isObject(v)) {\n // @ts-expect-error - TODO description\n return [k, v.$bzId];\n }\n return [k, v];\n });\n\n const objWithMetaDataOnly = oFilter(val, (k, _v) => {\n // @ts-expect-error - TODO description\n return k.startsWith('$') || k.startsWith('Symbol');\n });\n\n if (Object.keys(rolesObjFiltered).filter((x) => !x.startsWith('$')).length > 0) {\n // 2.1 EDGE TYPE 2\n if (value.$op === 'create' || value.$op === 'delete') {\n /// if the relation is being created, then all objects in the roles are actually add\n const getEdgeOp = (): BormOperation => {\n if (value.$op === 'create') {\n return 'link';\n }\n if (value.$op === 'delete') {\n return 'match';\n } /// if i'm not wrong, no need to unlink becasue is the director relation and will disappear 🤔\n throw new Error('Unsupported parent of edge op');\n };\n\n const currentRoles = (getCurrentSchema(schema, value) as EnrichedBormRelation).roles;\n /// group ids when cardinality MANY\n const rolesObjOnlyIdsGrouped = mapEntries(rolesObjOnlyIds, (k: string, v) => {\n const currentRoleCardinality = currentRoles[k]?.cardinality;\n if (!currentRoleCardinality) {\n throw new Error(`Role ${k} not found in schema`);\n }\n\n if (Array.isArray(v)) {\n if (currentRoleCardinality === 'ONE') {\n //console.log('v!', v);\n if (v.length > 1) {\n return [k, v.map((vNested: any) => vNested.$bzId || vNested)]; //Even if is Card ONE, we might actually try to link to N things, as long as the result is a single one, it is ok. The DB should throw an error if it is not the case\n }\n return [k, v[0].$bzId || v[0]];\n }\n /// Replace the array of objects with an array of ids\n return [k, v.map((vNested: any) => vNested.$bzId || vNested)];\n }\n //@ts-expect-error - TODO\n return [k, v.$bzId || v];\n });\n\n // todo: validations\n /// 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 const edgeType2 = {\n ...objWithMetaDataOnly,\n $thing: value.$thing,\n $thingType: 'relation' as const,\n $op: getEdgeOp(),\n ...rolesObjOnlyIdsGrouped, // override role fields by ids or tempIDs\n $bzId: value.$bzId,\n [EdgeType]: 'roleField' as const,\n };\n\n toEdges(edgeType2);\n return;\n }\n // #endregion\n // 2.2 EDGE TYPE 3\n if (value.$op === 'match' || (value.$op === 'update' && Object.keys(rolesObjFiltered).length > 0)) {\n let totalUnlinks = 0;\n\n Object.entries(rolesObjFiltered).forEach(([role, operations]) => {\n const operationsArray = isArray(operations) ? operations : [operations];\n\n const getOp = (childOp: BormOperation): BormOperation => {\n if (childOp === 'create' || childOp === 'replace') {\n // if the children is being created, the edge is a link\n return 'link';\n }\n return childOp;\n };\n\n operationsArray.forEach((operation) => {\n if (!operation) {\n return;\n }\n const op = getOp(operation.$op);\n /// validations\n if (op === 'replace') {\n throw new Error('Not supported yet: replace on roleFields');\n }\n if (op === 'unlink' && totalUnlinks > 0) {\n totalUnlinks += 1; // ugly temp solution while multiple roles can't be replaced\n throw new Error(\n 'Not supported yet: Cannot unlink more than one role at a time, please split into two mutations',\n );\n }\n\n /// 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 const edgeType3 = {\n ...objWithMetaDataOnly,\n $thing: value.$thing,\n $thingType: 'relation' as const,\n $op: op === 'delete' ? 'unlink' : op,\n [role]: operation.$bzId,\n $bzId: value.$bzId,\n [EdgeType]: 'roleField' as const,\n };\n\n toEdges(edgeType3);\n /// when unlinking stuff, it must be merged with other potential roles.\n /// so we need to add it as both as match and 'unlink' so it gets merged with other unlinks\n // todo maybe a way to transform unlinks already in its own matches later? maybe split match-unlink and match-link\n if (op === 'unlink') {\n // toEdges({ ...edgeType3, $op: 'match' }); ///apparently no longer needed\n }\n });\n });\n }\n // throw new Error('Unsupported direct relation operation');\n }\n }\n }\n };\n\n traverse(blocks, listOp);\n\n return [nodes, edges];\n };\n\n const [parsedThings, parsedEdges] = listNodes(blocks);\n //console.log('parsedStuff', parsedThings, parsedEdges);\n\n //console.log('parsedThings', parsedThings);\n /// some cases where we extract things, they must be ignored.\n /// One of this cases is the situation where we have a thing that is linked somwhere and created, or updated.\n /// 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 const mergedThings = parsedThings.reduce((acc, thing) => {\n // Skip if the current item doesn't have a $tempId\n if (!thing.$bzId) {\n return [...acc, thing];\n }\n\n // Check if this $tempId already exists in the accumulator\n const existingIndex = acc.findIndex((t) => t.$bzId === thing.$bzId);\n\n if (existingIndex === -1) {\n // If it doesn't exist, add it to the accumulator\n return [...acc, thing];\n }\n // If it exists, let's check the $op\n if (acc[existingIndex].$op === 'create' && thing.$op === 'match') {\n // If existing is 'create' and current is 'match', ignore current\n return acc;\n }\n if (acc[existingIndex].$op === 'match' && (thing.$op === 'create' || thing.$op === 'match')) {\n // If existing is 'match' and current is 'create' or 'match', replace existing with current\n return [...acc.slice(0, existingIndex), thing, ...acc.slice(existingIndex + 1)];\n }\n //if both are update, we simply merge them\n if (acc[existingIndex].$op === 'update' && thing.$op === 'update') {\n return [...acc.slice(0, existingIndex), { ...acc[existingIndex], ...thing }, ...acc.slice(existingIndex + 1)];\n }\n //if one is update and the other is merge, same, we merge them and keep it as update.\n if (\n (acc[existingIndex].$op === 'update' && thing.$op === 'match') ||\n (acc[existingIndex].$op === 'match' && thing.$op === 'update')\n ) {\n return [\n ...acc.slice(0, existingIndex),\n { ...acc[existingIndex], ...thing, $op: 'update' },\n ...acc.slice(existingIndex + 1),\n ];\n }\n //if both are deletions, is fine as long as they have the same $filter\n if (acc[existingIndex].$op === 'delete' && thing.$op === 'delete') {\n if (JSON.stringify(acc[existingIndex].$filter) === JSON.stringify(thing.$filter)) {\n return acc;\n }\n throw new Error(\n `[Wrong format] Can't delete the same thing with different filters. Existing: ${acc[existingIndex].$filter}. Current: ${thing.$filter}`,\n );\n }\n // For all other cases, throw an error\n throw new Error(\n `[Wrong format] Wrong operation combination for $tempId/$id \"${thing.$tempId || thing.$id}\". Existing: ${acc[existingIndex].$op}. Current: ${thing.$op}`,\n );\n }, [] as BQLMutationBlock[]);\n\n /// merge attributes of relations that share the same $id\n /// 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 const mergedEdges = parsedEdges.reduce((acc, curr) => {\n const existingEdge = acc.find(\n (r) =>\n ((r.$id && r.$id === curr.$id) || (r.$bzId && r.$bzId === curr.$bzId)) &&\n r.$thing === curr.$thing &&\n r.$op === curr.$op,\n );\n\n if (existingEdge) {\n const newRelation = { ...existingEdge };\n\n Object.keys(curr).forEach((key) => {\n if (typeof key === 'symbol' || key.startsWith('$')) {\n return;\n }\n\n const existingVal = existingEdge[key];\n const currVal = curr[key];\n\n //both values are arrays\n if (Array.isArray(existingVal) && Array.isArray(currVal)) {\n newRelation[key] = Array.from(new Set([...existingVal, ...currVal]));\n }\n ///the curent one is not but hte new one it is\n else if (!Array.isArray(existingVal) && Array.isArray(currVal)) {\n if (existingVal !== undefined) {\n // Avoid merging with undefined values.\n newRelation[key] = Array.from(new Set([existingVal, ...currVal]));\n } else {\n newRelation[key] = currVal;\n }\n }\n ///the current one is but the new one it is not\n else if (Array.isArray(existingVal) && !Array.isArray(currVal)) {\n if (currVal !== undefined) {\n // Avoid merging with undefined values.\n newRelation[key] = Array.from(new Set([...existingVal, currVal]));\n }\n }\n //both exist and are not arrays\n else if (existingVal !== null && currVal !== null && existingVal !== undefined && currVal !== undefined) {\n newRelation[key] = Array.from(new Set([existingVal, currVal]));\n } else if (existingVal === undefined || existingVal === null) {\n newRelation[key] = currVal;\n }\n });\n\n const newAcc = acc.filter(\n (r) =>\n !(\n ((r.$id && r.$id === curr.$id) || (r.$bzId && r.$bzId === curr.$bzId)) &&\n r.$thing === curr.$thing &&\n r.$op === curr.$op\n ),\n );\n\n return [...newAcc, newRelation];\n }\n\n return [...acc, curr];\n }, [] as BQLMutationBlock[]);\n\n //console.log('parsedThings', parsedThings);\n //console.log('parsedEdges', parsedEdges);\n //console.log('mergedEdges', mergedEdges);\n /// VALIDATIONS\n\n // VALIDATION: Check that every thing in the list that is an edge, has at least one player\n\n mergedThings.forEach((thing) => {\n if (thing.$thingType === 'relation' || 'relation' in thing) {\n //if it is a relation, we need at lease one edge defined for it\n if (\n mergedEdges.filter((edge) => edge.$bzId === thing.$bzId || (edge.$tempId && edge.$tempId === thing.$tempId))\n .length === 0\n ) {\n if (thing.$op === 'delete' || thing.$op === 'match' || thing.$op === 'update') {\n return;\n }\n throw new Error(\n `[Wrong format] Can't create a relation without any player. Node: ${JSON.stringify(deepRemoveMetaData(thing))}`,\n );\n }\n }\n });\n\n ///Validate that each tempId has at least one creation op:\n const allThings = [...mergedThings, ...mergedEdges];\n const tempIds = new Set(allThings.filter((x) => x.$tempId).map((x) => x.$tempId));\n const orphanTempIds = Array.from(tempIds).filter(\n (tempId) => !allThings.some((x) => x.$tempId === tempId && x.$op === 'create'),\n );\n\n if (orphanTempIds.length > 0) {\n throw new Error(\n `Can't link a $tempId that has not been created in the current mutation: ${orphanTempIds.join(', ')}`,\n );\n }\n\n return {\n mergedThings,\n mergedEdges,\n };\n};\n","/* eslint-disable no-param-reassign */\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport { produce } from 'immer';\nimport type { TraversalCallbackContext } from 'object-traversal';\nimport { traverse } from 'object-traversal';\nimport { expect } from 'vitest';\n\nexport const deepSort = <T>(obj: T, key = '$id'): T => {\n if (typeof obj !== 'object' || obj === null) {\n return obj;\n }\n\n const sorter = (a: unknown, b: unknown) => {\n if (Array.isArray(a) || Array.isArray(b) || typeof a !== typeof b) {\n // Don't sort an array of arrays or an array with different types.\n return 0;\n }\n let aCmp: any;\n let bCmp: any;\n if (typeof a === 'object' && a !== null) {\n aCmp = (a as Record<string, any>)[key];\n } else {\n aCmp = a;\n }\n if (typeof b === 'object' && b !== null) {\n bCmp = (b as Record<string, any>)[key];\n } else {\n bCmp = b;\n }\n if (aCmp < bCmp) {\n return -1;\n }\n if (aCmp > bCmp) {\n return 1;\n }\n return 0;\n };\n\n if (Array.isArray(obj)) {\n const newObj = obj.map((i) => deepSort(i, key));\n return newObj.sort(sorter) as T;\n }\n\n if (typeof obj === 'object' && obj !== null) {\n return Object.fromEntries(Object.entries(obj).map(([k, v]) => [k, deepSort(v, key)])) as T;\n }\n\n return obj;\n};\n\nexport const deepRemoveMetaData = (obj: object) => {\n const removeMeta = ({ value }: TraversalCallbackContext) => {\n if (value && typeof value === 'object' && '$id' in value) {\n const metas = Object.keys(value).filter((k) => k.startsWith('$'));\n metas.forEach((k) => delete value[k]);\n const symbols = Object.keys(value).filter((s) => typeof s === 'symbol');\n symbols.forEach((s) => delete value[s]);\n }\n return value;\n };\n return produce(obj, (draft) => traverse(draft, removeMeta));\n};\n\nconst checkRecursive = <T>(obj: T): T => {\n if (Array.isArray(obj)) {\n return expect.arrayContaining(obj.map(checkRecursive)) as unknown as T;\n }\n if (typeof obj === 'object' && obj !== null) {\n const newObj: { [key: string]: any } = {};\n Object.entries(obj).forEach(([key, value]) => {\n newObj[key] = checkRecursive(value);\n });\n return newObj as T;\n }\n return obj;\n};\n\nexport const expectArraysInObjectToContainSameElements = <T extends any[]>(received: T, expected: T): void => {\n if (Array.isArray(received)) {\n expect(received.length).toEqual(expected.length);\n expect(received).toEqual(expect.arrayContaining(expected.map(checkRecursive)));\n } else if (typeof received === 'object' && received !== null) {\n Object.entries(received).forEach(([key, value]) => {\n // @ts-expect-error - TODO description\n expectArraysInObjectToContainSameElements(value, expected[key as keyof typeof expected]);\n });\n } else {\n if (typeof expected === 'string' && (expected as string).startsWith('$')) {\n return;\n }\n expect(received).toEqual(expected);\n }\n};\n\nexport const expectResLikeTemplate = () => {};\n\n/* //TODO probably using permutations\nexport const expectResLikeTemplate = (\n res: Record<string, any>,\n template: Record<string, any>,\n tempIds: Record<string, any> = {}\n): Record<string, any> => {\n const findMatchesForTemplatesWithVars = (\n resItems: any[],\n currentTemplatesWithVars: any[],\n currentTempIds: Record<string, any>\n ): boolean => {\n if (currentTemplatesWithVars.length === 0) {\n return true;\n }\n\n const template = currentTemplatesWithVars[0];\n\n for (let i = 0; i < resItems.length; i += 1) {\n const resItem = resItems[i];\n const originalTempIds = { ...currentTempIds };\n if (typeof template === 'string' && !(template in currentTempIds)) {\n currentTempIds[template] = resItem;\n }\n if (expectResLikeTemplate(resItem, template, currentTempIds)) {\n const remainingResItems = [...resItems];\n remainingResItems.splice(i, 1);\n const remainingTemplatesWithVars = [...currentTemplatesWithVars];\n remainingTemplatesWithVars.shift();\n if (findMatchesForTemplatesWithVars(remainingResItems, remainingTemplatesWithVars, currentTempIds)) {\n return true;\n }\n }\n currentTempIds = originalTempIds;\n }\n return false;\n };\n\n const isMatch = Object.keys(template).every((key) => {\n if (Array.isArray(template[key])) {\n const templatesWithVars: any[] = [];\n const templatesWithoutVars: any[] = [];\n template[key].forEach((item: any) => {\n if (\n (typeof item === 'string' && item.startsWith('$')) ||\n (typeof item === 'object' &&\n Object.values(item).some((val: any) => typeof val === 'string' && val.startsWith('$')))\n ) {\n templatesWithVars.push(item);\n } else {\n templatesWithoutVars.push(item);\n }\n });\n\n templatesWithoutVars.every((item: any) => {\n const matchIndex = res[key].findIndex((resItem: any) => {\n return expectResLikeTemplate(resItem, item, { ...tempIds });\n });\n if (matchIndex !== -1) {\n res[key].splice(matchIndex, 1);\n return true;\n }\n return false;\n });\n\n return findMatchesForTemplatesWithVars(res[key], templatesWithVars, tempIds);\n }\n if (typeof template[key] === 'object' && template[key] !== null && !(template[key] instanceof Date)) {\n return expectResLikeTemplate(res[key], template[key], tempIds);\n }\n if (typeof template[key] === 'string' && template[key].startsWith('$')) {\n if (!(template[key] in tempIds)) {\n tempIds[template[key]] = res[key];\n }\n return res[key] === tempIds[template[key]];\n }\n return res[key] === template[key];\n });\n\n if (!isMatch) {\n throw new Error('No matching item found for template');\n }\n\n return tempIds;\n};\n*/\n","/* eslint-disable no-param-reassign */\nimport { produce } from 'immer';\nimport { traverse } from 'object-traversal';\nimport { isArray, isObject } from 'radash';\nimport { v4 as uuidv4 } from 'uuid';\nimport { getCardinality, getCurrentSchema, getSymbols } from '../../../helpers';\nimport type {\n BQLResponse,\n BormConfig,\n DBHandles,\n EnrichedBQLMutationBlock,\n EnrichedBormSchema,\n FilledBQLMutationBlock,\n} from '../../../types';\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 blocks: EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[],\n schema: EnrichedBormSchema,\n config: BormConfig,\n dbHandles: DBHandles,\n) => {\n const operatorKeys = ['$eq', '$ne', '$in', '$nin', '$gt', '$gte', '$lt', '$lte', '$exists'];\n\n const getFieldKeys = (block: FilledBQLMutationBlock | Partial<FilledBQLMutationBlock>, noDataFields?: boolean) => {\n return Object.keys(block).filter((key) => {\n if (!key.startsWith('$') && !operatorKeys.includes(key) && block[key] !== undefined) {\n if (noDataFields) {\n const currentSchema = getCurrentSchema(schema, block);\n if (currentSchema.dataFields?.find((field) => field.path === key)) {\n return false;\n }\n return true;\n }\n return true;\n }\n return false;\n });\n };\n\n /// 1. Check if pre-query should be run\n\n if (!blocks) {\n throw new Error('[BQLE-M-PQ-1] No blocks found');\n }\n\n if (config.mutation?.preQuery === false) {\n return;\n }\n\n const ops: string[] = [];\n\n traverse(blocks, ({ parent, key, value }) => {\n if (parent && key && !key.includes('$') && !operatorKeys.includes(key) && isObject(parent)) {\n const values = Array.isArray(parent[key]) ? parent[key] : [parent[key]];\n values.forEach((val) => {\n if (isObject(val)) {\n if (parent.$op !== 'create') {\n // @ts-expect-error todo\n if (!ops.includes(val.$op)) {\n // @ts-expect-error todo\n ops.push(val.$op);\n }\n } else {\n // @ts-expect-error todo\n if (val.$op === 'delete' || val.$op === 'unlink') {\n // @ts-expect-error todo\n throw new Error(`Cannot ${val.$op} under a create`);\n }\n }\n }\n });\n } else if (!parent && isObject(value)) {\n // @ts-expect-error todo\n if (!ops.includes(value.$op)) {\n // @ts-expect-error todo\n ops.push(value.$op);\n }\n }\n });\n\n if (\n !ops.includes('delete') &&\n !ops.includes('unlink') &&\n !ops.includes('replace') &&\n !ops.includes('update') &&\n !ops.includes('link')\n ) {\n return;\n }\n /// 2. Convert mutation into query for all children nodes\n\n const convertMutationToQuery = (blocks: FilledBQLMutationBlock[]) => {\n const processBlock = (block: FilledBQLMutationBlock, root?: boolean) => {\n let $fields: any[] = [];\n const filteredBlock = {};\n const toRemoveFromRoot = ['$op', '$bzId', '$parentKey'];\n const toRemove = ['$relation', '$entity', '$id', ...toRemoveFromRoot];\n for (const k in block) {\n if (toRemoveFromRoot.includes(k)) {\n continue;\n }\n if (toRemove.includes(k) && !root) {\n continue;\n }\n if (!k.includes('$') && (isObject(block[k]) || Array.isArray(block[k]))) {\n const v = extractValueFromFilter(block[k]) as FilledBQLMutationBlock;\n\n if (Array.isArray(v) && v.length > 0) {\n v.forEach((opBlock) => {\n const newField = {\n $path: k,\n ...processBlock(opBlock),\n ...(opBlock.$filter && { $as: opBlock.$bzId }),\n };\n // todo: make sure it keeps the one with the most keys\n if (!$fields.find((o) => o.$path === newField.$path && !o.$filter)) {\n $fields = [...$fields, newField];\n }\n });\n } else {\n const newField = {\n $path: k,\n ...processBlock(v),\n ...(!v.$filter && { $as: v.$bzId }),\n };\n $fields = [...$fields, newField];\n }\n } else {\n // @ts-expect-error todo\n filteredBlock[k] = block[k];\n }\n }\n return {\n ...filteredBlock,\n $fields,\n };\n };\n return blocks.map((block) => processBlock(block, true));\n };\n\n const preQueryReq = convertMutationToQuery(Array.isArray(blocks) ? blocks : [blocks]);\n //console.log('preQueryReq', JSON.stringify(preQueryReq, null, 2));\n\n /// 3. Perform query\n const res = await runQueryMachine(\n // @ts-expect-error todo\n preQueryReq,\n schema,\n { ...config, query: { ...config.query, returnNulls: true } },\n dbHandles,\n );\n const preQueryRes = res.bql.res as BQLResponse[];\n\n const getObjectPath = (parent: any, key: string) => {\n const idField: string | string[] = parent.$id || parent.id || parent.$bzId;\n if (parent.$objectPath) {\n const { $objectPath } = parent;\n\n const root = $objectPath?.beforePath || 'root';\n const ids = Array.isArray($objectPath.ids) ? `[${$objectPath.ids}]` : $objectPath.ids;\n const final = `${root}.${ids}___${$objectPath.key}`;\n\n const new$objectPath = {\n beforePath: final,\n ids: idField,\n key,\n };\n return new$objectPath;\n }\n return {\n beforePath: 'root',\n ids: idField,\n key,\n };\n\n // return `${parent.$objectPath || 'root'}${idField ? `.${idField}` : ''}${preQueryPathSeparator}${key}`;\n };\n\n const objectPathToKey = ($objectPath: ObjectPath, hardId?: string) => {\n const root = $objectPath?.beforePath || 'root';\n if (typeof root !== 'string') {\n throw new Error('[PQ]objectPathToKey: root is not a string');\n }\n const ids = hardId ? hardId : Array.isArray($objectPath?.ids) ? `[${$objectPath?.ids}]` : $objectPath?.ids;\n\n const final = `${root}.${ids}___${$objectPath?.key}`;\n\n return final;\n };\n\n const convertManyPaths = (input: string) => {\n // Check if the string contains square brackets\n if (input.includes('[') && input.includes(']')) {\n // Extract the part before the brackets, the items within the brackets, and the part after the brackets\n const [prefix, itemsWithBrackets, suffix] = input.split(/[[\\]]/);\n const items = itemsWithBrackets.split(',');\n\n // Combine each item with the prefix and suffix and return the array\n return items.map((item) => `${prefix}${item}${suffix}`);\n }\n // If no brackets are present, return an array with the original string\n return [input];\n };\n\n // 4. Create cache of paths\n type Cache<K extends string> = {\n [key in K]: {\n $objectPath: ObjectPath;\n $ids: string[];\n } | null;\n };\n const cache: Cache<string> = {};\n const cachePaths = (\n blocks: FilledBQLMutationBlock | FilledBQLMutationBlock[],\n ): FilledBQLMutationBlock | FilledBQLMutationBlock[] => {\n return produce(blocks, (draft) =>\n traverse(draft, ({ key, parent }) => {\n if (parent && key && parent.$id && !key.includes('$')) {\n const newObjPath = getObjectPath(parent, key);\n const cacheKey = objectPathToKey(newObjPath);\n if (Array.isArray(parent[key])) {\n // @ts-expect-error todo\n const cacheArray = [];\n parent[key].forEach((val) => {\n if (isObject(val)) {\n // @ts-expect-error todo\n // eslint-disable-next-line no-param-reassign\n val.$objectPath = newObjPath;\n // @ts-expect-error todo\n cacheArray.push(val.$id.toString());\n } else if (val) {\n cacheArray.push(val.toString());\n }\n });\n // @ts-expect-error todo\n cache[cacheKey] = { $objectPath: newObjPath, $ids: cacheArray };\n } else {\n const val = parent[key];\n if (isObject(val)) {\n // @ts-expect-error todo\n cache[cacheKey] = { $objectPath: newObjPath, $ids: [val.$id.toString()] };\n\n // @ts-expect-error todo\n // eslint-disable-next-line no-param-reassign\n val.$objectPath = newObjPath;\n } else if (val) {\n cache[cacheKey] = { $objectPath: newObjPath, $ids: [val.toString()] };\n } else if (val === null) {\n cache[cacheKey] = null; //we clarify a null entry, which means it was queried, but found empty (to be pruned)\n }\n }\n }\n }),\n );\n };\n //@ts-expect-error - todo\n cachePaths(preQueryRes || {});\n\n /// 5. Fill all nodes with their correct object paths\n\n const fillObjectPaths = (\n blocks: FilledBQLMutationBlock | FilledBQLMutationBlock[],\n ): FilledBQLMutationBlock | FilledBQLMutationBlock[] => {\n return produce(blocks, (draft) =>\n traverse(draft, ({ key, value, parent }) => {\n if (\n parent &&\n key &&\n !key.includes('$') &&\n (Array.isArray(value) || isObject(value)) &&\n !Array.isArray(parent)\n ) {\n if (Array.isArray(parent[key])) {\n parent[key].forEach(\n (\n o: string | { $objectPath: ObjectPath; $parentIsCreate: boolean; [grandChildOfCreateSymbol]: boolean },\n ) => {\n if (typeof o !== 'string') {\n // eslint-disable-next-line no-param-reassign\n o.$objectPath = getObjectPath(parent, key);\n // eslint-disable-next-line no-param-reassign\n o.$parentIsCreate = parent.$op === 'create';\n // eslint-disable-next-line no-param-reassign\n o[grandChildOfCreateSymbol] =\n parent.$parentIsCreate || parent[Symbol.for('grandChildOfCreate') as any];\n }\n },\n );\n } else if (isObject(parent[key])) {\n //@ts-expect-error - todo\n parent[key].$parentIsCreate = parent.$op === 'create';\n //@ts-expect-error - todo\n parent[key][Symbol.for('grandChildOfCreate')] =\n parent.$parentIsCreate || parent[Symbol.for('grandChildOfCreate') as any];\n //@ts-expect-error - todo\n parent[key].$objectPath = getObjectPath(parent, key);\n }\n }\n }),\n );\n };\n\n const bqlWithObjectPaths = fillObjectPaths(blocks);\n\n /// 6. For every node that doesn't have a $id, give it the correct ones based on the pre-query\n\n const fillIds = (blocks: FilledBQLMutationBlock[]) => {\n const newBlocks: FilledBQLMutationBlock[] = [];\n blocks.forEach((block) => {\n // todo: if block has a filter, do a filter search in the cache\n if (!block.$id && !block.id && !block.$tempId) {\n if (block.$filter) {\n const cacheKey = objectPathToKey({ ...block.$objectPath, key: block.$bzId });\n const cacheFound = cache[cacheKey];\n\n if (cacheFound) {\n const ids = Array.isArray(cacheFound.$ids) ? cacheFound.$ids : [cacheFound.$ids];\n ids.forEach((id) => {\n const newBlock = { ...block, $id: id, $bzId: `T4_${uuidv4()}`, $filterBzId: block.$bzId };\n newBlocks.push(newBlock);\n });\n }\n } else {\n const cacheKey = objectPathToKey(block.$objectPath);\n const cacheFound = cache[cacheKey];\n\n if (cacheFound) {\n cacheFound?.$ids?.forEach((id) => {\n const newBlock = { ...block, $id: id, $bzId: `T4_${uuidv4()}` };\n newBlocks.push(newBlock);\n });\n } else {\n newBlocks.push(block);\n }\n }\n } else {\n newBlocks.push(block);\n }\n });\n\n const finalBlocks = newBlocks.map((block) => {\n const newBlock = { ...block };\n getFieldKeys(newBlock, true).forEach((key) => {\n const subBlocks = Array.isArray(newBlock[key]) ? newBlock[key] : [newBlock[key]];\n const newSubBlocks = fillIds(subBlocks);\n newBlock[key] = newSubBlocks;\n });\n return newBlock;\n });\n return finalBlocks;\n };\n\n const bqlFilledIds = fillIds(Array.isArray(bqlWithObjectPaths) ? bqlWithObjectPaths : [bqlWithObjectPaths]);\n const newFilled = fillObjectPaths(bqlFilledIds);\n\n /// 7. For every node that is a multiple (many $ids or $filter), find all combinations that are based on the pre-query\n\n const splitBzIds = (blocks: FilledBQLMutationBlock[]) => {\n const processBlocks = (blocks: FilledBQLMutationBlock[]) => {\n // a. Filter operations with multiples and operations without multiples\n const getOperationsWithMultiples = (opBlocks: FilledBQLMutationBlock[]) => {\n const operationWithMultiples: FilledBQLMutationBlock[] = [];\n const operationWithoutMultiples: FilledBQLMutationBlock[] = [];\n const otherOps: FilledBQLMutationBlock[] = [];\n\n opBlocks.forEach((opBlock) => {\n const keys = getFieldKeys(opBlock, true);\n\n //keys length > 0 means its not a leaf node\n if (keys.length > 0) {\n let hasMultiple = false;\n keys.forEach((key) => {\n const opBlocks: FilledBQLMutationBlock[] = Array.isArray(opBlock[key]) ? opBlock[key] : [opBlock[key]];\n\n // todo: check for $filters\n const blockMultiples: FilledBQLMutationBlock[] = opBlocks.filter(\n (ob) => !ob.$id && !ob.id && typeof opBlock === 'object',\n );\n if (blockMultiples.length) {\n hasMultiple = true;\n }\n });\n if (hasMultiple) {\n operationWithMultiples.push(opBlock);\n } else {\n operationWithoutMultiples.push(opBlock);\n }\n } else {\n /// LEAF NODE, no keys so it probably being deleted , unlinked, or linked\n if (opBlock.$id) {\n //no need to split if it already has an $id, or an array of ids, we can keep its bzId\n otherOps.push({ ...opBlock, $bzId: opBlock.$tempId || opBlock.$bzId });\n } else {\n //PQ1 is the case where its a multi but does not need to be pruned, so we are not adding the $ids\n otherOps.push({ ...opBlock, $bzId: opBlock.$tempId || `PQ1_${uuidv4()}` });\n }\n }\n });\n return { operationWithMultiples, operationWithoutMultiples, otherOps };\n };\n const { operationWithMultiples, operationWithoutMultiples, otherOps } = getOperationsWithMultiples(blocks);\n // b. For multiples get all possible combinations\n const getAllKeyCombinations = (obj: FilledBQLMutationBlock) => {\n const getDataFields = () => {\n const dataFieldObj: any = {};\n for (const key in obj) {\n const currentSchema = getCurrentSchema(schema, obj);\n if (!key.startsWith('$') && currentSchema.dataFields?.find((df) => df.path === key)) {\n dataFieldObj[key] = obj[key];\n }\n }\n return dataFieldObj;\n };\n const dataFieldObj = getDataFields();\n\n // Get all keys, but only use non-$ keys for generating combinations\n const allKeys = Object.keys(obj);\n const combinableKeys = getFieldKeys(obj, true);\n const allCombinations: Partial<FilledBQLMutationBlock>[] = [];\n const generateCombinations = (index: number, currentObj: Partial<FilledBQLMutationBlock>) => {\n if (index === combinableKeys.length) {\n // Construct the full object with the current id\n const fullObj = { ...currentObj };\n allKeys.forEach((key) => {\n if (key.startsWith('$')) {\n fullObj[key] = obj[key];\n }\n });\n allCombinations.push({ ...fullObj, ...dataFieldObj });\n return;\n }\n\n // Include the current key\n const newObjInclude = {\n ...currentObj,\n [combinableKeys[index]]: obj[combinableKeys[index]],\n ...getSymbols(currentObj),\n ...dataFieldObj,\n };\n generateCombinations(index + 1, newObjInclude);\n // Exclude the current key and move to the next\n generateCombinations(index + 1, currentObj);\n };\n generateCombinations(0, { ...getSymbols(obj) });\n return allCombinations;\n };\n\n /// For all multiples we will do know all the combinations, to see if they will fail or not\n const crossReferencedOperations: Partial<FilledBQLMutationBlock>[] = [];\n operationWithMultiples.forEach((multipleBlock) => {\n const allCombinations: Partial<FilledBQLMutationBlock>[] = getAllKeyCombinations(multipleBlock);\n const combinationsToKeep: Partial<FilledBQLMutationBlock>[] = [];\n // c. Check cache and prune combinations that don't have any ids in the cache\n allCombinations.forEach((combinationBlock) => {\n const keys = getFieldKeys(combinationBlock, true);\n\n //if its creation, we can just push it, as there will be no false match in DB\n if (combinationBlock.$op === 'create') {\n combinationsToKeep.push(combinationBlock);\n } else if (combinationBlock.$id) {\n // check result for if there exists one with the kinds of keys\n const cacheKey = objectPathToKey(combinationBlock.$objectPath);\n const foundKeys: { key: string; ids: string[] }[] = [];\n keys.forEach((key) => {\n const childKey = `${cacheKey.includes('undefined') ? 'root' : cacheKey}.${combinationBlock.$id}${preQueryPathSeparator}${key}`;\n const cacheFound = cache[childKey];\n const hasRemove =\n combinationBlock[key].filter(\n (subBlock: FilledBQLMutationBlock) =>\n subBlock.$op === 'unlink' || subBlock.$op === 'delete' || subBlock.$op === 'update',\n ).length > 0;\n if (hasRemove) {\n if (cacheFound?.$ids) {\n foundKeys.push({ key, ids: cacheFound.$ids });\n }\n } else {\n foundKeys.push({ key, ids: [''] });\n }\n });\n\n if (foundKeys.length === keys.length && !combinationsToKeep.find((c) => c.$id === combinationBlock.$id)) {\n combinationsToKeep.push(combinationBlock);\n } else {\n // only prune the child batched operation\n const newBlock = { ...combinationBlock, $bzId: combinationBlock.$tempId || `T4_${uuidv4()}` };\n keys.forEach((key) => {\n // keeping ops that aren't batched (non-multiples)\n const newOps = combinationBlock[key].filter((op: FilledBQLMutationBlock) => op.$id);\n if (newOps.length > 0) {\n // @ts-expect-error todo\n newBlock[key] = newOps;\n } else {\n // @ts-expect-error todo\n newBlock[key] = undefined;\n }\n });\n const newBlockKeys = getFieldKeys(newBlock, true);\n if (newBlockKeys.length > 0) {\n combinationsToKeep.push(newBlock);\n }\n }\n }\n // When the block is not from the root level\n else if (combinationBlock.$objectPath) {\n const parentKey = objectPathToKey(combinationBlock.$objectPath);\n\n // d. get all ids of the parent block\n const idsOfParent = cache[parentKey]?.$ids || [];\n idsOfParent.forEach((id) => {\n const foundKeys: { key: string; ids: string[] }[] = [];\n keys.forEach((key) => {\n const cacheKey = `${parentKey}.${id}${preQueryPathSeparator}${key}`;\n const cacheFound = cache[cacheKey];\n if (cacheFound) {\n foundKeys.push({ key, ids: cacheFound.$ids });\n }\n });\n\n // If this is the combination with no keys, create an opBlock per remaining $id\n if (keys.length === 0) {\n const remainingIds = idsOfParent.filter((id) => !combinationsToKeep.find((c) => c.$id === id));\n remainingIds.forEach((id) => {\n combinationsToKeep.push({\n ...combinationBlock,\n $id: id,\n $bzId: combinationBlock.$tempId || `PQT2_${uuidv4()}`,\n });\n });\n } else if (foundKeys.length === keys.length && !combinationsToKeep.find((c) => c.$id === id)) {\n keys.forEach((k) => {\n const cKey = `${objectPathToKey(combinationBlock.$objectPath)}.${id}${preQueryPathSeparator}${k}`;\n const $ids = cache[cKey]?.$ids || [];\n /// making sure other ops are included as well, replace the old batched op with these new ops\n const originalOp = combinationBlock[k].find((b: FilledBQLMutationBlock) => !b.$id);\n const newBlocks = [\n ...$ids.map((id) => {\n return {\n ...originalOp,\n $id: id,\n $objectPath: {\n beforePath: combinationBlock.$objectPath.beforePath,\n ids: id,\n key: k,\n },\n };\n }),\n ...combinationBlock[k].filter((b: FilledBQLMutationBlock) => b.$id),\n ];\n if (newBlocks.length > 0) {\n combinationBlock[k] = newBlocks;\n }\n });\n\n combinationsToKeep.push({\n ...combinationBlock,\n $id: id,\n $bzId: combinationBlock.$tempId || `PQ3_${uuidv4()}`,\n });\n }\n });\n } else {\n combinationsToKeep.push(combinationBlock);\n }\n });\n combinationsToKeep.forEach((c) => {\n crossReferencedOperations.push(c);\n });\n });\n //console.log('crossReferencedOperations', crossReferencedOperations);\n\n // filter out odd leftover cases\n const allOperations = [...crossReferencedOperations, ...operationWithoutMultiples, ...otherOps];\n const filteredOperations = allOperations.filter((b) => {\n const hasKeys = getFieldKeys(b).length > 0;\n if (hasKeys) {\n return true;\n }\n if (b.$op === 'update') {\n return false;\n }\n return true;\n });\n\n // e. Recursion\n const finalBlocks = filteredOperations.map((block) => {\n const newBlock = { ...block };\n getFieldKeys(newBlock, true).forEach((key) => {\n const subBlocks = Array.isArray(newBlock[key]) ? newBlock[key] : [newBlock[key]];\n const newSubBlocks = processBlocks(subBlocks);\n newBlock[key] = newSubBlocks;\n });\n return newBlock;\n });\n\n return finalBlocks;\n };\n return processBlocks(blocks);\n };\n\n const splitBql = splitBzIds(Array.isArray(newFilled) ? newFilled : [newFilled]);\n //console.log('_____3splitBql', JSON.stringify(splitBql, null, 2));\n\n /// 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 const processReplaces = (blocks: FilledBQLMutationBlock[]) => {\n return blocks.map((block) => {\n const fields = getFieldKeys(block, true);\n const newBlock = { ...block };\n\n fields.forEach((field) => {\n const opBlocks: FilledBQLMutationBlock[] = Array.isArray(block[field]) ? block[field] : [block[field]];\n const newOpBlocks: FilledBQLMutationBlock[] = [];\n let replaceIds: string[] = [];\n let createIds: string[] = [];\n\n // todo: Step 1, get all replaces and their ids as replaceIds, just push blocks that aren't replaces\n // @ts-expect-error todo\n let replaceBlock: FilledBQLMutationBlock = {};\n const cardinality = getCardinality(schema, block, field);\n\n opBlocks\n .filter((opBlock) => opBlock)\n .forEach((opBlock) => {\n // todo: if it is create and this field is cardinality one\n if (opBlock.$op === 'replace' && opBlock.$id) {\n // eslint-disable-next-line prefer-destructuring\n replaceBlock = opBlock;\n if (Array.isArray(opBlock.$id)) {\n replaceIds = [...replaceIds, ...opBlock.$id];\n } else {\n replaceIds.push(opBlock.$id);\n }\n } else if (opBlock.$op === 'create' && cardinality === 'ONE' && opBlock.id) {\n replaceBlock = opBlock;\n if (Array.isArray(opBlock.id)) {\n createIds = [...replaceIds, ...opBlock.id];\n } else {\n createIds.push(opBlock.id);\n }\n } else {\n newOpBlocks.push(opBlock);\n }\n });\n\n const cacheKey = objectPathToKey(replaceBlock.$objectPath);\n const cacheKeys = convertManyPaths(cacheKey);\n const foundKeys = cacheKeys.map((cacheKey) => {\n return cache[cacheKey];\n });\n\n // todo: Step 2, get cacheIds for this\n let cacheIds: string[] = [];\n foundKeys\n .filter((k) => k !== null && k !== undefined)\n .forEach((key) => {\n cacheIds = [...cacheIds, ...(key?.$ids || [])];\n });\n\n // todo: Step 3, unlinkIds contain all cacheIds that aren't found in replaceIds\n // todo: Step 4, linkIds are all replaceIds that aren't found in the cacheIds\n const unlinkIds = cacheIds.filter((id) => !replaceIds.includes(id));\n const linkIds = replaceIds.filter((id) => !cacheIds.includes(id));\n const symbols = getSymbols(replaceBlock);\n if (unlinkIds.length > 0) {\n newOpBlocks.push({\n ...replaceBlock,\n $op: 'unlink',\n $id: unlinkIds,\n $bzId: replaceBlock.$tempId || `T4_${uuidv4()}`,\n id: undefined,\n ...symbols,\n });\n }\n if (linkIds.length > 0) {\n linkIds.forEach((id) => {\n newOpBlocks.push({\n ...replaceBlock,\n $op: 'link',\n $id: id,\n $bzId: replaceBlock.$tempId || `T5_${uuidv4()}`,\n ...symbols,\n });\n });\n }\n if (createIds.length > 0) {\n createIds.forEach((id) => {\n newOpBlocks.push({\n ...replaceBlock,\n $op: 'create',\n id,\n $bzId: replaceBlock.$tempId || `T6_${uuidv4()}`,\n ...symbols,\n });\n });\n }\n\n newBlock[field] = processReplaces(newOpBlocks);\n });\n return newBlock;\n });\n };\n\n // @ts-expect-error todo\n const processedReplaces = fillObjectPaths(processReplaces(fillObjectPaths(splitBql)));\n\n /// 9. Throw any error case\n\n const throwErrors = (\n blocks: FilledBQLMutationBlock | FilledBQLMutationBlock[],\n ): FilledBQLMutationBlock | FilledBQLMutationBlock[] => {\n return produce(blocks, (draft) =>\n traverse(draft, (context) => {\n const { key, value, parent, meta } = context;\n\n // a. only work for role fields that are arrays or objects\n if (\n key &&\n parent &&\n !key?.includes('$') &&\n key !== '$filter' &&\n !meta.nodePath?.includes('.$filter.') && //ignore children of $filter\n (Array.isArray(value) || isObject(value)) &&\n !Array.isArray(parent)\n ) {\n const values: FilledBQLMutationBlock[] = Array.isArray(value) ? value : [value];\n\n values.forEach((thing) => {\n // todo: If user op is trying to link something that already has it's role filled by something else\n\n const $objectPath = thing.$filter ? { ...thing.$objectPath, key: thing.$filterBzId } : thing.$objectPath;\n const cacheKey = objectPathToKey($objectPath);\n const cacheFound = cache[cacheKey];\n\n const processArrayIdsFound = (arrayOfIds: string[], cacheOfIds: string[]) => {\n return arrayOfIds.every((id) => cacheOfIds.includes(id));\n };\n // todo: if filter, use bzId\n const isOccupied = thing.$id\n ? Array.isArray(thing.$id)\n ? processArrayIdsFound(thing.$id, cacheFound?.$ids ? cacheFound.$ids : [])\n : cacheFound?.$ids?.includes(thing.$id)\n : cacheFound;\n const cardinality = getCardinality(schema, parent, thing.$objectPath.key);\n\n if (thing.$op === 'link' && isOccupied && cardinality === 'ONE') {\n throw new Error(\n `[BQLE-Q-M-2] Cannot link on:\"${objectPathToKey(thing.$objectPath)}\" because it is already occupied.`,\n );\n }\n\n if (thing.$op) {\n switch (thing.$op) {\n case 'delete':\n if (!isOccupied) {\n if (!config.mutation?.ignoreNonexistingThings) {\n throw new Error(\n `[BQLE-Q-M-2] Cannot delete $id:\"${thing.$id}\" because it is not linked to $id:\"${parent.$id}\"`,\n );\n }\n }\n break;\n case 'update':\n if (!isOccupied) {\n if (!config.mutation?.ignoreNonexistingThings) {\n throw new Error(\n `[BQLE-Q-M-2] Cannot update $id:\"${thing.$id}\" because it is not linked to $id:\"${parent.$id}\"`,\n );\n }\n }\n break;\n case 'unlink':\n if (!isOccupied) {\n if (!config.mutation?.ignoreNonexistingThings) {\n throw new Error(\n `[BQLE-Q-M-2] Cannot unlink $id:\"${thing.$id}\" because it is not linked to $id:\"${parent.$id}\"`,\n );\n }\n }\n break;\n case 'link':\n if (isOccupied) {\n throw new Error(\n `[BQLE-Q-M-2] Cannot link $id:\"${thing.$id}\" because it is already linked to $id:\"${parent.$id}\"`,\n );\n }\n break;\n\n default:\n break;\n }\n }\n });\n }\n }),\n );\n };\n\n throwErrors(processedReplaces);\n\n /// 10. Refill paths that are needed for the rest of the pipeline\n\n const fillPaths = (\n blocks: FilledBQLMutationBlock | FilledBQLMutationBlock[],\n ): FilledBQLMutationBlock | FilledBQLMutationBlock[] => {\n return produce(blocks, (draft) =>\n traverse(draft, (context) => {\n const { value, meta } = context;\n if (isObject(value)) {\n // @ts-expect-error todo\n value[Symbol.for('path') as any] = meta.nodePath;\n // @ts-expect-error todo\n value.$objectPath = undefined;\n // @ts-expect-error todo\n value.$parentIsCreate = undefined;\n }\n }),\n );\n };\n\n /// 11. Sort tree\n\n const filledPaths = fillPaths(processedReplaces);\n const filledPathsArray = Array.isArray(filledPaths) ? filledPaths : [filledPaths];\n const copy = [...filledPathsArray];\n const sortedArray = copy.sort((a: FilledBQLMutationBlock, b: FilledBQLMutationBlock) => {\n if (a.$op === 'create' && b.$op !== 'create') {\n return -1; // Move 'a' to an index lower than 'b' (to the top of the array)\n }\n if (a.$op !== 'create' && b.$op === 'create') {\n return 1; // Move 'b' to an index lower than 'a'\n }\n return 0; // Keep the original order if both have the same $op value or don't involve 'create'\n });\n\n return sortedArray;\n};\n\nconst extractValueFromFilter = (filterValue: any): any => {\n if (isObject(filterValue) && !isArray(filterValue)) {\n if ('$eq' in filterValue) {\n return filterValue.$eq;\n }\n // Handle other operators if needed\n }\n return filterValue;\n};\n","const LOG_LEVEL = new Set(\n // eslint-disable-next-line turbo/no-undeclared-env-vars\n (process.env.BORM_LOG_LEVEL || '')\n .split(',')\n .map((i) => i.trim())\n .filter((i) => !!i),\n);\n\ntype LogLevel = 'debug' | 'info' | 'warning' | 'error';\n\nexport const log = (level: LogLevel | LogLevel[], ...args: unknown[]) => {\n const shouldLog = Array.isArray(level) ? level.some((l) => LOG_LEVEL.has(l)) : LOG_LEVEL.has(level);\n if (shouldLog) {\n console.log(...args);\n }\n};\n\nexport const logDebug = (...args: unknown[]) => log('debug', ...args);\n\nexport const logInfo = (...args: unknown[]) => log('info', ...args);\n\nexport const logWarning = (...args: unknown[]) => log('warning', ...args);\n\nexport const logError = (...args: unknown[]) => log('error', ...args);\n","// eslint-disable-next-line turbo/no-undeclared-env-vars\nexport const VERSION = process.env.npm_package_version;\n","import * as Robot from \"robot3\";\nexport const {\n createMachine,\n guard,\n interpret,\n invoke,\n reduce,\n state,\n transition,\n} = Robot; ","import { produce } from 'immer';\nimport type { TraversalCallbackContext } from 'object-traversal';\nimport { traverse } from 'object-traversal';\nimport { isArray, isObject } from 'radash';\nimport type { BQLResponse, BormConfig, QueryConfig } from '../../../types';\n\nexport const cleanQueryRes = (config: BormConfig, bqlRes: BQLResponse) => {\n if (!bqlRes) {\n return;\n }\n const withPostHooks = queryPostHooks(bqlRes);\n const cleanedMetadata = cleanOutput(withPostHooks, config.query);\n return cleanedMetadata;\n};\n\nconst queryPostHooks = (blocks: any) => {\n return produce(blocks, (draft: any) =>\n traverse(draft, ({ value: val }: TraversalCallbackContext) => {\n if (isObject(val)) {\n // eslint-disable-next-line no-param-reassign\n }\n }),\n );\n};\n\nconst cleanOutput = (blocks: any, config?: QueryConfig) => {\n return produce(blocks, (draft: any) =>\n traverse(draft, ({ value: val }: TraversalCallbackContext) => {\n if (isObject(val)) {\n const value = val as any;\n\n // UNDEFINED FIELDS\n Object.keys(value).forEach((k: string) => {\n if (value[k] === undefined || value[k] === null || (isArray(value[k]) && value[k].length === 0)) {\n if (config?.returnNulls) {\n value[k] = null;\n } else {\n delete value[k];\n }\n }\n if (value[k] === undefined) {\n delete value[k];\n }\n });\n\n // INTERNAL SYMBOLS\n Object.getOwnPropertySymbols(value).forEach((symbol) => {\n delete value[symbol];\n });\n\n /// USER FACING METADATA\n if (config?.noMetadata === true) {\n // eslint-disable-next-line no-param-reassign\n Object.keys(value).forEach((k: string) => {\n if (k.startsWith('$')) {\n delete value[k];\n }\n });\n }\n }\n }),\n );\n};\n","import { produce } from 'immer';\nimport type { TraversalCallbackContext } from 'object-traversal';\nimport { getNodeByPath, traverse } from 'object-traversal';\nimport { isObject } from 'radash';\nimport { computeField } from '../../engine/compute';\nimport { getCurrentSchema } from '../../helpers';\nimport type { BQLResponseMulti, EnrichedBQLQuery, EnrichedBormSchema } from '../../types';\nimport { QueryPath } from '../../types/symbols';\n\nexport const postHooks = async (\n schema: EnrichedBormSchema,\n enrichedBqlQuery: EnrichedBQLQuery[],\n bqlRes: BQLResponseMulti,\n) => {\n if (!bqlRes) {\n return;\n }\n\n const queryPostHooks = (blocks: any) => {\n //console.log('queryPostHooks', blocks[0]);\n return produce(blocks, (draft: any) =>\n traverse(draft, ({ value: val }: TraversalCallbackContext) => {\n if (isObject(val)) {\n const value = val as Record<string, any>;\n\n if (!value.$thing) {\n // JSON object.\n return;\n }\n if (value.$thing) {\n const currentSchema = getCurrentSchema(schema, value);\n const { virtualFields } = currentSchema;\n\n const queryPath = value[QueryPath as any];\n if (!queryPath) {\n throw new Error(`[Internal] QueryPath is missing. Value: ${JSON.stringify(value)}`);\n }\n\n const originalNode = getNodeByPath(enrichedBqlQuery, queryPath);\n if (originalNode.$fieldType === 'ref') {\n return; // Not supported with refFields\n }\n const queriedFields = originalNode.$fields.map((f: any) => f.$path);\n const excludedFields = originalNode.$excludedFields;\n\n /// ADD VIRTUAL FIELDS\n virtualFields.forEach((virtualFieldPath) => {\n if (\n excludedFields?.includes(virtualFieldPath) ||\n (queriedFields.length > 0 && !queriedFields.includes(virtualFieldPath))\n ) {\n return;\n }\n const field = currentSchema.dataFields?.find((f) => f.path === virtualFieldPath);\n\n if (!field?.default) {\n ///then is a virtual field and should be computed from the DB already\n if (value[virtualFieldPath] === undefined) {\n throw new Error(`[Internal] Virtual field: No db value found for virtual field: ${virtualFieldPath}`);\n }\n } else {\n const computedValue = computeField({\n currentThing: value,\n fieldSchema: field,\n mandatoryDependencies: true,\n });\n value[virtualFieldPath] = computedValue;\n }\n });\n\n //EXCLUDE FIELDS\n if (excludedFields) {\n //this should only happen for id fields, as we query them always. Might remove also dependencies in the future\n //todo: move this as a last step of the machine, as a cleaner. Note: we are skipping it now for reference fields but we should not\n excludedFields.forEach((excludedField: string) => {\n if (typeof excludedField !== 'string') {\n throw new Error('[Internal] ExcludedField is not a string');\n }\n delete value[excludedField];\n });\n }\n }\n }\n }),\n );\n };\n\n const postHooksBqlRes = queryPostHooks(bqlRes);\n return postHooksBqlRes;\n};\n","import { isArray } from 'radash';\nimport { buildSorter, buildSuqlFilter, parseFilter } from '../../../adapters/surrealDB/filters/filters';\nimport { sanitizeNameSurrealDB } from '../../../adapters/surrealDB/helpers';\nimport { indent } from '../../../helpers';\nimport type {\n EnrichedAttributeQuery,\n EnrichedBQLQuery,\n EnrichedBormSchema,\n EnrichedFieldQuery,\n EnrichedLinkQuery,\n EnrichedRoleQuery,\n} from '../../../types';\nimport { FieldSchema, QueryPath, SuqlMetadata } from '../../../types/symbols';\n\nexport const build = (props: { queries: EnrichedBQLQuery[]; schema: EnrichedBormSchema }) => {\n const { queries, schema } = props;\n //console.log('queries!', queries);\n return queries.map((query) => buildQuery({ query, schema }));\n};\n\nconst buildQuery = (props: { query: EnrichedBQLQuery; schema: EnrichedBormSchema }): string | null => {\n const { query, schema } = props;\n const { $thing, $fields, $filter, $offset, $limit, $sort } = query;\n\n if ($fields.length === 0) {\n return null;\n }\n\n const lines: string[] = [];\n\n lines.push('SELECT');\n\n const fieldLines = buildFieldsQuery({ parentQuery: query, queries: $fields, level: 1, schema });\n if (fieldLines) {\n lines.push(fieldLines);\n }\n\n const currentSchema = schema.entities[$thing] || schema.relations[$thing];\n if (!currentSchema) {\n throw new Error(`Schema for ${$thing} not found`);\n }\n const allTypes = currentSchema.subTypes ? [$thing, ...currentSchema.subTypes] : [$thing];\n const allTypesNormed = allTypes.map((t) => sanitizeNameSurrealDB(t));\n\n if (query.$id) {\n if (typeof query.$id === 'string') {\n lines.push(`FROM ${allTypesNormed.map((t) => `${t}:⟨${query.$id}⟩`).join(',')}`);\n } else if (isArray(query.$id)) {\n const $ids = query.$id;\n const allCombinations = allTypesNormed.flatMap((t) => $ids?.map((id) => `${t}:⟨${id}⟩`));\n lines.push(`FROM ${allCombinations.join(',')}`);\n //throw new Error('Multiple ids not supported');\n } else {\n throw new Error('Invalid $id');\n }\n } else {\n lines.push(`FROM ${allTypesNormed.join(',')}`);\n }\n\n if ($filter) {\n const parsed = parseFilter($filter, $thing, schema);\n const filter = buildSuqlFilter(parsed);\n lines.push(`WHERE ${filter}`);\n }\n\n if ($sort) {\n lines.push(buildSorter($sort));\n }\n\n if (typeof $limit === 'number') {\n lines.push(`LIMIT ${$limit}`);\n }\n\n if (typeof $offset === 'number') {\n lines.push(`START ${$offset}`);\n }\n\n return lines.join('\\n');\n};\n\nconst buildFieldsQuery = (props: {\n queries: EnrichedFieldQuery[];\n schema: EnrichedBormSchema;\n level: number;\n parentQuery: EnrichedBQLQuery | EnrichedRoleQuery | EnrichedLinkQuery;\n}) => {\n const { queries, schema, level, parentQuery } = props;\n const lines: string[] = [];\n\n const queryPath = parentQuery[QueryPath];\n //Metadata\n lines.push(indent(`\"${queryPath}\" as \\`$$queryPath\\``, level));\n lines.push(indent('record::id(id) as `$id`', level));\n lines.push(indent('record::tb(id) as `$thing`', level));\n\n queries.forEach((i) => {\n const line = buildFieldQuery({ query: i, level, schema });\n if (line) {\n lines.push(line);\n }\n });\n if (lines.length === 0) {\n return null;\n }\n return lines.join(',\\n');\n};\n\nconst buildFieldQuery = (props: {\n query: EnrichedFieldQuery;\n schema: EnrichedBormSchema;\n level: number;\n}): string | null => {\n const { query, schema, level } = props;\n //console.log('query!', query);\n\n if (query.$fieldType === 'data') {\n return buildAttributeQuery({ query, level });\n }\n if (query.$fieldType === 'ref') {\n throw new Error('Ref fields are not supported in this context');\n //return buildLinkQuery({ query, level, schema });\n }\n if (query.$fieldType === 'link') {\n return buildLinkQuery({ query, level, schema });\n }\n if (query.$fieldType === 'role') {\n return buildRoleQuery({ query, level, schema });\n }\n return null;\n};\n\nconst buildAttributeQuery = (props: { query: EnrichedAttributeQuery; level: number }): string | null => {\n const { query, level } = props;\n if (query.$isVirtual) {\n return null;\n }\n // TODO: Get the field id from the schema.\n if (query.$path === 'id') {\n return indent(`record::id(${query.$path}) AS ${query.$as}`, level);\n }\n if (query.$path === query.$as) {\n return indent(`\\`${query.$path}\\``, level);\n }\n return indent(`\\`${query.$path}\\` AS \\`${query.$as}\\``, level);\n};\n\nconst buildLinkQuery = (props: {\n query: EnrichedLinkQuery;\n schema: EnrichedBormSchema;\n level: number;\n}): string | null => {\n const { query, schema, level } = props;\n const { $fields, $filter, $offset, $limit, $sort } = query;\n\n if ($fields.length === 0) {\n return null;\n }\n\n const lines: string[] = [];\n\n lines.push(indent('(', level));\n\n const queryLevel = level + 1;\n lines.push(indent('SELECT', queryLevel));\n\n const fieldLines = buildFieldsQuery({ parentQuery: query, queries: $fields, level: queryLevel + 1, schema });\n if (fieldLines) {\n lines.push(fieldLines);\n }\n\n /// FROM\n const from = query[FieldSchema][SuqlMetadata].queryPath;\n lines.push(indent(`FROM ${from}`, queryLevel));\n\n /// FILTER WHERE\n if ($filter) {\n const parsed = parseFilter($filter, query.$thing, schema);\n const built = buildSuqlFilter(parsed);\n lines.push(`WHERE ${built}`);\n }\n\n /// SORT AND PAGINATION\n if ($sort) {\n lines.push(indent(buildSorter($sort), queryLevel));\n }\n\n if (typeof $limit === 'number') {\n lines.push(indent(`LIMIT ${$limit}`, queryLevel));\n }\n\n if (typeof $offset === 'number') {\n lines.push(indent(`START ${$offset}`, queryLevel));\n }\n\n lines.push(indent(`) AS \\`${query.$as}\\``, level));\n\n return lines.join('\\n');\n};\n\nconst buildRoleQuery = (props: {\n query: EnrichedRoleQuery;\n schema: EnrichedBormSchema;\n level: number;\n}): string | null => {\n const { query, schema, level } = props;\n\n if (query.$fields.length === 0) {\n return null;\n }\n\n const lines: string[] = [];\n\n lines.push(indent('(', level));\n\n const queryLevel = level + 1;\n lines.push(indent('SELECT', queryLevel));\n\n const fieldLevel = queryLevel + 1;\n const fieldLines = buildFieldsQuery({ parentQuery: query, queries: query.$fields, level: fieldLevel, schema });\n if (fieldLines) {\n lines.push(fieldLines);\n }\n\n const from = query[FieldSchema][SuqlMetadata].queryPath;\n lines.push(indent(`FROM ${from}`, queryLevel));\n\n if (query.$filter) {\n const parsed = parseFilter(query.$filter, query.$playedBy.thing, schema);\n const built = buildSuqlFilter(parsed);\n lines.push(`WHERE ${built}`);\n }\n\n lines.push(indent(`) AS \\`${query.$as}\\``, level));\n\n return lines.join('\\n');\n};\n","import { isArray, isObject, shake } from 'radash';\nimport { getFieldType } from '../../../helpers';\nimport type { EnrichedBormSchema, EnrichedLinkField, EnrichedRoleField, Filter } from '../../../types';\nimport { SuqlMetadata } from '../../../types/symbols';\n\nconst surqlOperators = {\n $eq: '$=',\n $not: '$!',\n $or: '$OR',\n $and: '$AND',\n $in: '$IN',\n $id: 'record::id(id)',\n $exists: '$exists',\n};\n\nexport const parseFilter = (filter: Filter, currentThing: string, schema: EnrichedBormSchema): Filter => {\n if (filter === null || filter === undefined) {\n return filter;\n }\n\n const wasArray = isArray(filter);\n\n const arrayFilter = wasArray ? filter : [filter];\n\n const resultArray = arrayFilter.map((f) => {\n const keys = Object.keys(f);\n\n const result = keys.reduce((acc, key) => {\n const value = f[key];\n\n if (key.startsWith('$')) {\n //LOGICAL OPERATORS\n if (['$or', '$and', '$not'].includes(key)) {\n return {\n ...acc,\n [key]: undefined,\n [surqlOperators[key as keyof typeof surqlOperators]]: parseFilter(value, currentThing, schema),\n };\n }\n\n // FILTER OPERATORS\n if (key === '$id') {\n return { ...acc, $id: undefined, [surqlOperators[key]]: { $IN: isArray(value) ? value : [value] } };\n }\n if (key === '$thing') {\n return acc; //do nothing for now, but in the future we will need to filter by tables as well, maybe record::tb(id) ...\n }\n\n //AUXILIARY OPERATORS\n if (key === '$exists') {\n return { ...acc, $exists: undefined, [surqlOperators[key]]: value };\n }\n\n //VALUE OPERATORS\n if (key === '$eq') {\n return { ...acc, $eq: undefined, [surqlOperators[key]]: value };\n }\n if (key === '$in') {\n return { ...acc, $in: undefined, [surqlOperators[key]]: value };\n }\n\n throw new Error(`Unknown filter operator ${key}`);\n //return { ...acc, [key]: parseFilter(value, currentThing, schema) };\n }\n\n const currentSchema =\n currentThing in schema.entities ? schema.entities[currentThing] : schema.relations[currentThing];\n\n const [fieldType, fieldSchema] = getFieldType(currentSchema, key);\n\n if (fieldType === 'idField') {\n if (currentSchema.idFields.length > 1) {\n throw new Error('Multiple id fields not supported');\n } //todo: When composed id, this changes:\n\n return { ...acc, 'record::id(id)': { $IN: isArray(value) ? value : [value] } };\n }\n\n if (fieldType === 'dataField') {\n return { ...acc, [key]: parseFilter(value, currentThing, schema) }; //Probably good place to add ONLY and other stuff depending on the fieldSchema\n }\n\n if (fieldType === 'linkField' || fieldType === 'roleField') {\n const fieldSchemaTyped = fieldSchema as EnrichedLinkField | EnrichedRoleField;\n\n const surrealDBKey = fieldSchemaTyped[SuqlMetadata].queryPath;\n\n return { ...acc, [surrealDBKey]: parseFilter(value, currentThing, schema) };\n\n /*if (fieldSchemaTyped.$things.length !== 1) {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t`Not supported yet: Role ${key} in ${JSON.stringify(value)} is played by multiple things: ${fieldSchemaTyped.$things.join(', ')}`,\n\t\t\t\t\t);\n\n\t\t\t\t\treturn { ...acc, [surrealDBKey]: parseFilter(value, currentThing, schema) };\n\t\t\t\t}\n\t\t\t\t//todo: we need to be able to filter by fields that only belong to subtypes\n\t\t\t\tconst [childrenThing] = fieldSchemaTyped.$things; //todo: multiple players, then it must be efined\n\n\t\t\t\treturn { ...acc, [surrealDBKey]: parseFilter(value, childrenThing, schema) };*/\n }\n\n throw new Error(`Field ${key} not found in schema, Defined in $filter`);\n }, {});\n\n return shake(result);\n });\n\n return wasArray ? resultArray : resultArray[0];\n};\n\nexport const buildSuqlFilter = (filter: object): string => {\n if (filter === null || filter === undefined) {\n return '';\n }\n\n const entries = Object.entries(filter);\n const parts: string[] = [];\n\n entries.forEach(([key, value]) => {\n // Handle logical operators\n if (['$OR', '$AND', '$!'].includes(key)) {\n const logicalOperator = key.replace('$', '');\n\n const nestedFilters = Array.isArray(value) ? value.map((v) => buildSuqlFilter(v)) : [buildSuqlFilter(value)];\n\n if (logicalOperator === '!') {\n // Correctly handle the negation\n parts.push(`!(${nestedFilters.join(' AND ')})`);\n } else {\n parts.push(`(${nestedFilters.join(` ${logicalOperator} `)})`);\n }\n return;\n }\n\n // Handle field-specific filters\n if (isObject(value)) {\n if (key.includes('<-') || key.includes('->')) {\n const nestedFilter = buildSuqlFilter(value);\n parts.push(`${key}[WHERE ${nestedFilter}]`);\n } else if (key.startsWith('$parent.[')) {\n // Handle references with cardinality MANY\n const nestedFilter = buildSuqlFilter(value);\n const keyWithoutPrefix = key.replace('$parent.', '').replace(/^\\[(.*)\\]$/, '$1');\n parts.push(`fn::as_array(${keyWithoutPrefix})[WHERE id && ${nestedFilter}]`);\n } else if (key.startsWith('$parent')) {\n // Handle references with cardinality ONE\n const nestedFilter = buildSuqlFilter(value);\n const keyWithoutPrefix = key.replace('$parent.', '');\n parts.push(`fn::as_array(${keyWithoutPrefix})[WHERE id && ${nestedFilter}]`);\n } else if (key.startsWith('$')) {\n throw new Error(`Invalid key ${key}`);\n } else {\n // Handle field operators\n const valueKeys = Object.keys(value);\n if (valueKeys.length === 1 && valueKeys[0].startsWith('$')) {\n const [operator] = valueKeys;\n //@ts-expect-error - Todo\n const nextValue: unknown = value[operator];\n\n if (operator === '$exists') {\n // Handle $exists operator\n if (nextValue === true) {\n parts.push(`${key} IS NOT NONE`);\n } else if (nextValue === false) {\n parts.push(`${key} IS NONE`);\n } else {\n throw new Error(`Invalid value for $exists: ${nextValue}`);\n }\n } else {\n // Handle other operators\n const surrealOperator = operator.replace('$', '');\n if (Array.isArray(nextValue)) {\n parts.push(\n `${key} ${surrealOperator} [${nextValue.map((v) => (v === null ? 'NONE' : `'${v}'`)).join(', ')}]`,\n );\n } else if (isObject(nextValue)) {\n const nestedFilter = buildSuqlFilter(nextValue);\n parts.push(`${key} ${surrealOperator} ${nestedFilter}`);\n } else {\n parts.push(`${key} ${surrealOperator} ${nextValue === null ? 'NONE' : `'${nextValue}'`}`);\n }\n }\n } else {\n throw new Error(`Invalid key ${key}`);\n }\n }\n } else {\n // Handle simple field equality\n if (Array.isArray(value)) {\n const operator = key.startsWith('$') ? key.replace('$', '') : 'IN'; //maybe could do const operator = 'IN';\n parts.push(`${key} ${operator} [${value.map((v) => (v === null ? 'NONE' : `'${v}'`)).join(', ')}]`);\n } else {\n const operator = key.startsWith('$') ? key.replace('$', '') : '='; //maybe could do const operator = '=';\n parts.push(`${key} ${operator} ${value === null ? 'NONE' : `'${value}'`}`);\n }\n }\n });\n\n return parts.join(' AND ');\n};\n\nexport const buildSorter = (sort: ({ field: string; desc?: boolean } | string)[]) => {\n const sorters = sort.map((i) => {\n if (typeof i === 'string') {\n return i;\n }\n\n const { field, desc } = i;\n\n return `${field}${desc ? ' DESC' : ' ASC'}`;\n });\n\n return `ORDER BY ${sorters.join(', ')}`;\n};\n","import { isObject } from 'radash';\nimport { buildSorter, buildSuqlFilter, parseFilter } from '../../../adapters/surrealDB/filters/filters';\nimport { sanitizeNameSurrealDB } from '../../../adapters/surrealDB/helpers';\nimport type {\n EnrichedAttributeQuery,\n EnrichedBQLQuery,\n EnrichedBormEntity,\n EnrichedBormRelation,\n EnrichedBormSchema,\n EnrichedFieldQuery,\n EnrichedLinkQuery,\n EnrichedRefQuery,\n EnrichedRoleQuery,\n} from '../../../types';\nimport { FieldSchema, QueryPath } from '../../../types/symbols';\n\n//todo: Change name to build and remove the edge mode\nexport const buildRefs = (props: { queries: EnrichedBQLQuery[]; schema: EnrichedBormSchema }) => {\n const { queries, schema } = props;\n //console.log('queries!', queries);\n return queries.map((query) => buildQuery({ query, schema }));\n};\n\nconst buildQuery = (props: { query: EnrichedBQLQuery; schema: EnrichedBormSchema }): string | null => {\n const { query, schema } = props;\n const { $thing, $fields, $filter, $offset, $limit, $sort } = query;\n\n if ($fields.length === 0) {\n return null;\n }\n\n const currentSchema = schema.entities[$thing] || schema.relations[$thing];\n if (!currentSchema) {\n throw new Error(`Schema for ${$thing} not found`);\n }\n\n const queryPath = query[QueryPath];\n\n const META = createMetaFields(queryPath);\n const DATA_FIELDS = createDataFields($fields.filter((f) => f.$fieldType === 'data'));\n const EDGE_FIELDS = createEdgeFields(\n $fields.filter((f) => f.$fieldType === 'link' || f.$fieldType === 'role') as (\n | EnrichedLinkQuery\n | EnrichedRoleQuery\n )[],\n schema,\n );\n const REF_FIELDS = createRefFields($fields.filter((f) => f.$fieldType === 'ref') as EnrichedRefQuery[]);\n const FIELDS = [...META, ...DATA_FIELDS, ...EDGE_FIELDS, ...REF_FIELDS].join(',\\n');\n const FROM = createRootFromClause(query, currentSchema);\n const WHERE = $filter ? `WHERE id AND (${buildSuqlFilter(parseFilter($filter, $thing, schema))})` : 'WHERE id';\n\n const SORT = $sort ? buildSorter($sort) : '';\n const LIMIT = typeof $limit === 'number' ? `LIMIT ${$limit}` : '';\n const OFFSET = typeof $offset === 'number' ? `START ${$offset}` : '';\n\n return `SELECT ${FIELDS} ${FROM} ${WHERE} ${SORT} ${LIMIT} ${OFFSET}`;\n};\n\nconst createRootFromClause = (query: EnrichedBQLQuery, currentSchema: EnrichedBormEntity | EnrichedBormRelation) => {\n const allTypes = currentSchema.subTypes ? [query.$thing, ...currentSchema.subTypes] : [query.$thing];\n const allTypesNormed = allTypes.map((t) => sanitizeNameSurrealDB(t));\n\n const formatId = (type: string, id: string) => `${type}:\\`${id}\\``;\n const joinTypes = (ids: string[]) => allTypesNormed.flatMap((type) => ids.map((id) => formatId(type, id))).join(',');\n\n if (!query.$id) {\n return `FROM ${allTypesNormed.join(',')}`;\n }\n\n if (typeof query.$id === 'string') {\n return `FROM ${joinTypes([query.$id])}`;\n }\n\n if (Array.isArray(query.$id)) {\n return `FROM ${joinTypes(query.$id)}`;\n }\n\n throw new Error('Invalid $id');\n};\n\nconst createMetaFields = (queryPath: string) => {\n return [\n `\"${queryPath}\" as \\`$$queryPath\\``,\n 'id && record::id(id) || null as `$id`', //the id is on case we try to extend flex stuff\n 'id && record::tb(id) || null as `$thing`',\n ];\n};\n\nconst createDataFields = (dataFields: EnrichedAttributeQuery[] | EnrichedFieldQuery[]) => {\n return dataFields.map((df) => {\n if (df.$path === 'id') {\n return `record::id(${df.$path}) AS ${df.$as}`;\n }\n if (df.$path === df.$as) {\n return `\\`${df.$path}\\``;\n }\n return `\\`${df.$path}\\` AS \\`${df.$as}\\``;\n });\n};\n\nconst createEdgeFields = (\n edgeFields: (EnrichedLinkQuery | EnrichedRoleQuery)[],\n schema: EnrichedBormSchema,\n): string[] => {\n return edgeFields\n .map((ef) => {\n //logger('ef', ef);\n if (!ef[QueryPath]) {\n throw new Error(`[Internal] QueryPath is missing. Value: ${JSON.stringify(ef)}`);\n }\n const META = createMetaFields(ef[QueryPath]);\n const DATA_FIELDS = createDataFields(ef.$fields.filter((f) => f.$fieldType === 'data'));\n const LINK_FIELDS = createEdgeFields(\n ef.$fields.filter((f) => f.$fieldType === 'link' || f.$fieldType === 'role') as (\n | EnrichedLinkQuery\n | EnrichedRoleQuery\n )[],\n schema,\n );\n const REF_FIELDS = createRefFields(ef.$fields.filter((f) => f.$fieldType === 'ref'));\n const FIELDS = [...META, ...DATA_FIELDS, ...LINK_FIELDS, ...REF_FIELDS].filter(Boolean).join(',\\n');\n const FROM = `FROM $parent.\\`${ef[FieldSchema].path}\\`[*]`;\n const WHERE =\n ef.$filter && Object.keys(ef.$filter).length > 0\n ? `WHERE id AND(${buildSuqlFilter(parseFilter(ef.$filter, ef.$thing, schema))})`\n : 'WHERE id';\n const SORT = ef.$sort ? buildSorter(ef.$sort) : '';\n const LIMIT = typeof ef.$limit === 'number' ? `LIMIT ${ef.$limit}` : '';\n const OFFSET = typeof ef.$offset === 'number' ? `START ${ef.$offset}` : '';\n return `( SELECT ${FIELDS} ${FROM} ${WHERE} ${SORT} ${LIMIT} ${OFFSET} ) AS \\`${ef.$as}\\``;\n })\n .filter((f) => f);\n};\nconst createRefFields = (refFields: EnrichedRefQuery[]) => {\n return refFields.map((rf) => {\n if (!rf[QueryPath]) {\n throw new Error(`[Internal] QueryPath is missing. Value: ${JSON.stringify(rf)}`);\n }\n const META = createMetaFields(rf[QueryPath]);\n if (rf.$fields?.some((f) => isObject(f))) {\n throw new Error(\"[Unsupported]: Can't query nested ref fields yet\");\n }\n const FLEX_REF = 'id && null || $this as `$value`';\n const FIELDS = [...META, FLEX_REF, ...(rf.$justId ? '' : rf.$fields?.map((f) => `⟨${f}⟩`) || ['*'])].join(',\\n'); //if no fields, get everything\n const FROM = `FROM $parent.\\`${rf[FieldSchema].dbPath}\\``; //removing the [*]\n //const WHERE = 'WHERE true'; //can't filter inside ref Fields\n // In ref fields we don't have the ref of the fields so we go blind\n return `( SELECT ${FIELDS} ${FROM}) AS \\`${rf.$as}\\``;\n });\n};\n","import { isArray, isDate, mapEntries } from 'radash';\nimport { sanitizeTableNameSurrealDb } from '../../../adapters/surrealDB/helpers';\nimport { getSchemaByThing } from '../../../helpers';\nimport type {\n BormConfig,\n ContentType,\n EnrichedBQLQuery,\n EnrichedBormSchema,\n EnrichedFieldQuery,\n EnrichedLinkQuery,\n EnrichedRoleQuery,\n} from '../../../types';\nimport { FieldSchema, QueryPath } from '../../../types/symbols';\n\nexport const parse = (props: {\n res: Record<string, any>[][];\n queries: EnrichedBQLQuery[];\n schema: EnrichedBormSchema;\n config: BormConfig;\n}) => {\n const { res, queries, schema } = props;\n //console.log('res!', JSON.stringify(res, null, 2));\n const result = res.map((r, i) => parseRes(queries[i], r, schema));\n //console.log('result', result);\n return result;\n};\n\nconst parseRes = (\n query: EnrichedBQLQuery | EnrichedLinkQuery | EnrichedRoleQuery,\n res: Record<string, any>[],\n schema: EnrichedBormSchema,\n) => {\n if (isArray(res)) {\n if (res.length === 0) {\n return null;\n }\n if (query.$filterByUnique) {\n if (res.length > 1) {\n throw new Error('Multiple results found for unique query');\n }\n return parseObj(query, res[0], schema);\n }\n if (res.length >= 1) {\n return res.map((r) => parseObj(query, r, schema));\n }\n } else {\n throw new Error('res is unexpectedly not an array');\n }\n};\n\nconst parseObj = (\n query: EnrichedBQLQuery | EnrichedLinkQuery | EnrichedRoleQuery,\n obj: Record<string, any>,\n schema: EnrichedBormSchema,\n) => {\n // eslint-disable-next-line prefer-destructuring\n const $thing = obj.$thing || obj.tb;\n const $thingType = $thing in schema.entities ? 'entity' : $thing in schema.relations ? 'relation' : 'error';\n if ($thingType === 'error') {\n throw new Error(`[Internal] The $thing ${$thing} is not defined in the schema.`);\n }\n\n const newObj: Record<string, any> = {\n //init with symbols\n [QueryPath]: obj.$$queryPath,\n $id: obj.$id,\n $thing: sanitizeTableNameSurrealDb($thing),\n $thingType, //This is actually not true always, will need to be fetched from the $thing\n };\n\n // For normal fields, we parse each field classically\n query.$fields.forEach((f) => {\n const key = f.$as;\n const value = obj[key];\n // TODO: Look up what the id field is in the schema.\n if (f.$path === 'id' && query.$idNotIncluded) {\n return;\n }\n newObj[key] = parseFieldResult(f, value, schema);\n });\n\n return newObj;\n};\n\nconst parseFieldResult = (query: EnrichedFieldQuery, value: any, schema: EnrichedBormSchema) => {\n if (value === undefined || value === null || (isArray(value) && value.length === 0)) {\n return null;\n }\n\n if (query.$fieldType === 'data') {\n const { contentType /*,cardinality*/ } = query[FieldSchema];\n\n return parseValue(value, contentType) ?? null;\n }\n if (query.$fieldType === 'ref') {\n const asArray = isArray(value) ? value : [value];\n const parsedContent = asArray.map((v) => {\n if (v.$thing) {\n const currentSchema = getSchemaByThing(schema, v.$thing);\n const [idField] = currentSchema.idFields;\n //console.log('currentSchema!', currentSchema);\n if (query.$justId) {\n return v.$id;\n }\n //todo: We will fix this once surrealDB enables some sort of SELECT ( SELECT * FROM $parent.*). Meanwhile we can only query one nested level\n const flatNestedField = (nf: unknown) => {\n if (nf && typeof nf === 'object' && 'id' in nf && 'tb' in nf) {\n return nf.id;\n }\n //todo: This is a value, and we might need to parse it correctly. We know the schema and the key, so we can do it.\n return nf;\n };\n const temporallyFlatNestedIds = mapEntries(v, (key, content) => {\n if (isArray(content)) {\n return [key, content.map((i) => flatNestedField(i))];\n }\n return [key, flatNestedField(content)];\n });\n\n return {\n ...temporallyFlatNestedIds,\n [QueryPath]: v.$$queryPath,\n [idField]: v.$id, //todo: this is a hack. But we should add this always!\n };\n }\n if (v.$value) {\n return parseValue(v.$value, 'FLEX');\n }\n return v; //in cardinality many the query returns the values already. Todo: To optimize this we can remove the $value when cardinality MANY or find a smarter solution\n });\n const { cardinality } = query[FieldSchema];\n if (cardinality === 'ONE') {\n //not filterByUnique because we can't filter inside a refField\n return parsedContent[0];\n }\n return parsedContent;\n }\n\n if (query.$justId) {\n if (query.$filterByUnique || query[FieldSchema].cardinality === 'ONE') {\n // TODO: Look up what the id field is in the schema.\n //return isArray(value) ? value[0]?.id : value?.id; //RefFields receive direct\n return value[0]?.$id ?? null;\n }\n return value?.map((i: Record<string, any>) => i.$id) ?? [];\n }\n if (query.$filterByUnique || query[FieldSchema].cardinality === 'ONE') {\n return parseObj(query, value[0], schema);\n }\n return parseRes(query, value, schema);\n};\n\nconst parseValue = (value: unknown, contentType: ContentType) => {\n const asArray = isArray(value) ? value : [value];\n if (contentType === 'DATE') {\n const res = asArray.map((v) => new Date(v).toISOString());\n return isArray(value) ? res : res[0];\n }\n if (contentType === 'FLEX') {\n const res = asArray.map((v) => {\n if (isDate(v)) {\n return new Date(v).toISOString(); //Todo: in the future probably just return the date object instead, but we need to fix it in typedb.\n }\n return v;\n });\n return isArray(value) ? res : res[0];\n }\n return value;\n};\n","import type { SimpleSurrealClient } from '../../../adapters/surrealDB/client';\nimport { logDebug } from '../../../logger';\nimport type { BormConfig } from '../../../types';\nimport { VERSION } from '../../../version';\n\nexport const run = async (props: {\n client: SimpleSurrealClient;\n queries: string[];\n config: BormConfig;\n}): Promise<any[][]> => {\n const { client, queries, config } = props;\n const batchedQuery = `\n\tBEGIN TRANSACTION;\n\t${queries.join(';')};\n\tCOMMIT TRANSACTION;\n\t`;\n\n if (config.query?.debugger) {\n logDebug(`batchedQuery[${VERSION}]`, JSON.stringify({ batchedQuery }));\n }\n //console.log('batchedQuery!', batchedQuery);\n\n return await client.query(batchedQuery);\n};\n","import type { SimpleSurrealClient } from '../../../adapters/surrealDB/client';\nimport { assertDefined } from '../../../helpers';\nimport type { BormConfig, EnrichedBQLQuery, EnrichedBormSchema } from '../../../types';\nimport type { SurrealDBProviderObject } from '../../../types/config/surrealdb';\nimport { createMachine, interpret, invoke, reduce, state, transition } from '../../../robot3'\nimport { build } from './build';\nimport { buildRefs } from './buildRefs';\nimport { parse } from './parse';\nimport { run } from './run';\n\nexport type SurrealDbMachineContext = {\n bql: {\n queries: EnrichedBQLQuery[];\n res?: any[];\n };\n surql: {\n queries?: string[];\n res?: any[];\n };\n schema: EnrichedBormSchema;\n config: BormConfig;\n client: SimpleSurrealClient;\n error?: string | null;\n};\n\nconst errorTransition = transition(\n 'error',\n 'error',\n reduce((ctx: SurrealDbMachineContext, event: any): SurrealDbMachineContext => {\n return {\n ...ctx,\n error: event.error,\n };\n }),\n);\n\nconst surrealDbQueryMachine = createMachine(\n 'build',\n {\n build: invoke(\n async (ctx: SurrealDbMachineContext) => {\n // todo: This works only if there is a single surrealDB connector\n const { linkMode } = (\n ctx.config.dbConnectors.find((c) => c.provider === 'surrealDB') as SurrealDBProviderObject\n ).providerConfig;\n if (linkMode === 'edges') {\n return build({ queries: ctx.bql.queries, schema: ctx.schema });\n }\n if (linkMode === 'refs') {\n return buildRefs({ queries: ctx.bql.queries, schema: ctx.schema });\n }\n },\n transition(\n 'done',\n 'run',\n reduce(\n (ctx: SurrealDbMachineContext, event: any): SurrealDbMachineContext => ({\n ...ctx,\n surql: {\n ...ctx.surql,\n queries: event.data,\n },\n }),\n ),\n ),\n errorTransition,\n ),\n run: invoke(\n async (ctx: SurrealDbMachineContext) => {\n return run({ client: ctx.client, queries: assertDefined(ctx.surql.queries), config: ctx.config });\n },\n transition(\n 'done',\n 'parse',\n reduce(\n (ctx: SurrealDbMachineContext, event: any): SurrealDbMachineContext => ({\n ...ctx,\n surql: {\n ...ctx.surql,\n res: event.data,\n },\n }),\n ),\n ),\n errorTransition,\n ),\n parse: invoke(\n async (ctx: SurrealDbMachineContext) => {\n return parse({\n res: assertDefined(ctx.surql.res),\n queries: ctx.bql.queries,\n schema: ctx.schema,\n config: ctx.config,\n });\n },\n transition(\n 'done',\n 'success',\n reduce(\n (ctx: SurrealDbMachineContext, event: any): SurrealDbMachineContext => ({\n ...ctx,\n bql: {\n ...ctx.bql,\n res: event.data,\n },\n }),\n ),\n ),\n errorTransition,\n ),\n success: state(),\n error: state(),\n },\n (ctx: SurrealDbMachineContext) => ctx,\n);\n\nconst awaitQueryMachine = async (context: SurrealDbMachineContext) => {\n return new Promise<any[]>((resolve, reject) => {\n interpret(\n surrealDbQueryMachine,\n (service) => {\n if (service.machine.state.name === 'success') {\n //@ts-expect-error = todo\n resolve(service.context.bql.res);\n }\n if (service.machine.state.name === 'error') {\n reject(service.context.error);\n }\n },\n context,\n );\n });\n};\n\nexport const runSurrealDbQueryMachine = async (\n enrichedBql: EnrichedBQLQuery[],\n schema: EnrichedBormSchema,\n config: BormConfig,\n client: SimpleSurrealClient,\n) => {\n return awaitQueryMachine({\n bql: {\n queries: enrichedBql,\n },\n surql: {},\n schema: schema,\n config: config,\n client,\n error: null,\n });\n};\n","import { isArray, isObject } from 'radash';\nimport { v4 as uuidv4 } from 'uuid';\nimport { getSchemaByThing, indent } from '../../../helpers';\nimport type {\n EnrichedBormEntity,\n EnrichedBormRelation,\n EnrichedBormSchema,\n Filter,\n PositiveFilter,\n} from '../../../types';\n\nexport const buildFilter = (props: {\n $filter: Filter;\n $var: string;\n $thing: string;\n schema: EnrichedBormSchema;\n depth: number;\n}): string => {\n const { $filter: $nonMappedFilter, $var, $thing, schema, depth } = props;\n const $filter = mapFilterKeys($nonMappedFilter, getSchemaByThing(schema, $thing));\n\n const { $not, ...rest } = $filter;\n\n const matches: string[] = [];\n\n // Handle $not filters\n if (isPositiveFilter($not)) {\n const notMatches = processPositiveFilter($not, $var, $thing, schema, depth, true);\n matches.push(...notMatches);\n } else if ($not !== undefined) {\n throw new Error('$not must be a PositiveFilter object');\n }\n\n // Handle positive filters\n const positiveMatches = processPositiveFilter(rest, $var, $thing, schema, depth, false);\n matches.push(...positiveMatches);\n\n return matches.join('\\n');\n};\n\nconst processPositiveFilter = (\n filter: PositiveFilter,\n $var: string,\n $thing: string,\n schema: EnrichedBormSchema,\n depth: number,\n isNegated: boolean,\n): string[] => {\n const thing = getSchemaByThing(schema, $thing);\n const matches: string[] = [];\n\n for (const [key, value] of Object.entries(filter)) {\n if (key.startsWith('$')) {\n // Handle logical operators ($and, $or)\n const normalizedKey = key.toLowerCase() as '$and' | '$or';\n if (normalizedKey === '$and' || normalizedKey === '$or') {\n const subFilters = isArray(value) ? value : [value];\n const subMatches = subFilters.map((subFilter) => {\n if (isPositiveFilter(subFilter)) {\n const subFilterMatches = processPositiveFilter(subFilter, $var, $thing, schema, depth + 1, isNegated);\n return subFilterMatches.join('\\n');\n }\n throw new Error(`Invalid subfilter in ${normalizedKey}: ${JSON.stringify(subFilter)}`);\n });\n const joinedSubMatches = subMatches.join(normalizedKey === '$and' ? '\\n' : ' } or { ');\n if (normalizedKey === '$or' && subMatches.length > 1) {\n matches.push(indent(`{ ${joinedSubMatches} };`, depth));\n } else {\n matches.push(indent(joinedSubMatches, depth));\n }\n continue;\n }\n // Skip other special keys\n continue;\n }\n\n // Handle data fields\n const df = thing.dataFields?.find((df) => df.dbPath === key || df.path === key);\n if (df) {\n const fieldMatches = handleDataFieldFilter(key, value, $var, depth, isNegated);\n matches.push(...fieldMatches);\n continue;\n }\n\n // Handle link fields\n const lf = thing.linkFields?.find((lf) => lf.path === key);\n if (lf) {\n const linkMatches = handleLinkFieldFilter(lf, value, $var, schema, depth, isNegated);\n matches.push(...linkMatches);\n continue;\n }\n\n // Handle roles in relations\n if (thing.thingType === 'relation') {\n const role = thing.roles[key];\n if (role) {\n const roleMatches = handleRelationRoleFilter(role, value, $var, $thing, schema, depth, isNegated);\n matches.push(...roleMatches);\n continue;\n }\n }\n\n throw new Error(`\"${$thing}\" does not have property \"${key}\"`);\n }\n\n return matches;\n};\n\nconst handleDataFieldFilter = (key: string, value: any, $var: string, depth: number, isNegated: boolean): string[] => {\n const matches: string[] = [];\n\n if (isObject(value) && !isArray(value)) {\n // Handle operator-based filters (e.g., { $eq: value })\n for (const [op, opValue] of Object.entries(value)) {\n const normalizedOp = op.toLowerCase() as '$eq' | '$ne' | '$in' | '$nin' | '$exists';\n let match = '';\n switch (normalizedOp) {\n case '$eq':\n match = `$${$var} has ${key} ${serializeValue(opValue)};`;\n break;\n case '$ne':\n match = `not { $${$var} has ${key} ${serializeValue(opValue)}; };`;\n break;\n case '$in': {\n if (!isArray(opValue)) {\n throw new Error('Value for $in operator must be an array');\n }\n const inAlt = opValue.map((v) => `$${$var} has ${key} ${serializeValue(v)};`);\n match = joinAlt(inAlt);\n if (isNegated) {\n match = `not { ${match} };`;\n }\n break;\n }\n case '$nin':\n if (!isArray(opValue)) {\n throw new Error('Value for $nin operator must be an array');\n }\n for (const v of opValue) {\n const ninMatch = `not { $${$var} has ${key} ${serializeValue(v)}; };`;\n matches.push(indent(ninMatch, depth));\n }\n continue; // Skip the rest of the loop for '$nin'\n case '$exists':\n if (opValue === true) {\n match = `$${$var} has ${key} $${key}_${uuidv4()};`;\n } else if (opValue === false) {\n match = `not { $${$var} has ${key} $${key}_${uuidv4()}; };`;\n } else {\n throw new Error(`Invalid value for $exists: ${opValue}`);\n }\n break;\n default:\n throw new Error(`Unsupported operator \"${op}\" for data field \"${key}\"`);\n }\n if (isNegated) {\n match = `not { ${match} };`;\n }\n matches.push(indent(match, depth));\n }\n } else if (isArray(value)) {\n // Treat array value as an $in operator\n const alt = value.map((v) => `$${$var} has ${key} ${serializeValue(v)};`);\n let match = joinAlt(alt);\n if (match) {\n if (isNegated) {\n match = `not { ${match} };`;\n }\n matches.push(indent(match, depth));\n }\n } else {\n // Scalar value\n let match = `$${$var} has ${key} ${serializeValue(value)};`;\n if (isNegated) {\n match = `not { ${match} };`;\n }\n matches.push(indent(match, depth));\n }\n\n return matches;\n};\n\nconst handleLinkFieldFilter = (\n lf: any, // Adjust type as needed\n value: any,\n $var: string,\n schema: EnrichedBormSchema,\n depth: number,\n isNegated: boolean,\n): string[] => {\n const matches: string[] = [];\n const [opposite] = lf.oppositeLinkFieldsPlayedBy;\n const oppositeThing = getSchemaByThing(schema, opposite.thing);\n const oppositeIdField = oppositeThing.idFields?.[0];\n if (!oppositeIdField) {\n throw new Error(`\"${opposite.thing}\" does not have an id field`);\n }\n\n const oppVar = `${opposite.thing}_${uuidv4()}`;\n\n let match = '';\n\n if (lf.target === 'relation') {\n // Handle link field targeting a relation\n if (value === null) {\n match = isNegated\n ? `(${lf.plays}: $${$var}) isa ${lf.relation};`\n : `not { (${lf.plays}: $${$var}) isa ${lf.relation}; };`;\n } else if (isArray(value)) {\n const alt = value.map(\n (v) => `(${lf.plays}: $${$var}) isa ${lf.relation}, has ${oppositeIdField} ${serializeValue(v)};`,\n );\n match = joinAlt(alt);\n if (isNegated) {\n match = `not { ${match} };`;\n }\n } else {\n match = `(${lf.plays}: $${$var}) isa ${lf.relation}, has ${oppositeIdField} ${serializeValue(value)};`;\n if (isNegated) {\n match = `not { ${match} };`;\n }\n }\n } else {\n // Handle link field without intermediary relation\n if (value === null) {\n match = isNegated\n ? `$${oppVar} isa ${opposite.thing}; (${lf.plays}: $${$var}, ${opposite.plays}: $${oppVar}) isa ${lf.relation};`\n : `not { $${oppVar} isa ${opposite.thing}; (${lf.plays}: $${$var}, ${opposite.plays}: $${oppVar}) isa ${lf.relation}; };`;\n } else if (isArray(value)) {\n const alt = value.map(\n (v) =>\n `$${oppVar} isa ${opposite.thing}, has ${oppositeIdField} ${serializeValue(\n v,\n )}; (${lf.plays}: $${$var}, ${opposite.plays}: $${oppVar}) isa ${lf.relation};`,\n );\n match = joinAlt(alt);\n if (isNegated) {\n match = `not { ${match} };`;\n }\n } else {\n match = `$${oppVar} isa ${opposite.thing}, has ${oppositeIdField} ${serializeValue(\n value,\n )}; (${lf.plays}: $${$var}, ${opposite.plays}: $${oppVar}) isa ${lf.relation};`;\n if (isNegated) {\n match = `not { ${match} };`;\n }\n }\n }\n\n matches.push(indent(match, depth));\n return matches;\n};\n\nconst handleRelationRoleFilter = (\n role: any, // Adjust type as needed\n value: any,\n $var: string,\n $thing: string,\n schema: EnrichedBormSchema,\n depth: number,\n isNegated: boolean,\n): string[] => {\n const matches: string[] = [];\n const [player] = role.playedBy || [];\n const playerThing = getSchemaByThing(schema, player.thing);\n const playerIdField = playerThing.idFields?.[0];\n if (!playerIdField) {\n throw new Error(`\"${player.thing}\" does not have an id field`);\n }\n const playerVar = `${player.thing}_${uuidv4()}`;\n const filterId = uuidv4();\n const filterVar = `${$var}_${filterId}`;\n\n matches.push(indent(`$${filterVar} isa ${$thing};`, depth));\n\n let match = '';\n\n if (value === null) {\n match = `$${filterVar} (${player.plays}: ${playerVar});`;\n if (isNegated) {\n matches.push(indent(match, depth));\n } else {\n matches.push(indent(`not { ${match} };`, depth));\n }\n } else if (isArray(value)) {\n const alt = value.map(\n (v) =>\n `$${playerVar} isa ${player.thing}, has ${playerIdField} ${serializeValue(\n v,\n )}; $${filterVar} (${player.plays}: $${playerVar});`,\n );\n match = joinAlt(alt);\n if (isNegated) {\n matches.push(indent(`not { ${match} };`, depth));\n } else {\n matches.push(indent(match, depth));\n }\n } else {\n match = `$${playerVar} isa ${player.thing}, has ${playerIdField} ${serializeValue(\n value,\n )}; $${filterVar} (${player.plays}: $${playerVar});`;\n if (isNegated) {\n matches.push(indent(`not { ${match} };`, depth));\n } else {\n matches.push(indent(match, depth));\n }\n }\n\n matches.push(indent(`$${$var} is $${filterVar};`, depth));\n\n return matches;\n};\n\nconst joinAlt = (alt: string[]): string => {\n if (alt.length > 1) {\n return `{ ${alt.join(' } or { ')} };`;\n }\n if (alt.length === 1) {\n return alt[0];\n }\n throw new Error('No alternatives provided to joinAlt');\n};\n\nconst serializeValue = (value: string | number | boolean | Date | object): string => {\n if (typeof value === 'string') {\n return `'${value}'`;\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return `${value}`;\n }\n if (value instanceof Date) {\n return `'${value.toISOString().replace('Z', '')}'`;\n }\n if (isObject(value)) {\n if ('$id' in value) {\n const idValue = (value as any).$id;\n if (isArray(idValue)) {\n return `like \"^(${idValue.join('|')})$\"`;\n }\n return serializeValue(idValue);\n }\n throw new Error('Cannot serialize complex object values in filter');\n }\n throw new Error(`Unsupported value type: ${typeof value}`);\n};\n\nconst mapFilterKeys = (filter: Filter, thingSchema: EnrichedBormEntity | EnrichedBormRelation): Filter => {\n const mapper: Record<string, string> = {};\n\n thingSchema.dataFields?.forEach((df) => {\n if (df.path !== df.dbPath) {\n mapper[df.path] = df.dbPath;\n }\n });\n\n if (Object.keys(mapper).length === 0) {\n return filter;\n }\n\n const { $not, ...f } = filter;\n const newFilter: Filter = mapPositiveFilterKeys(f, mapper);\n\n if ($not && isPositiveFilter($not)) {\n newFilter.$not = mapPositiveFilterKeys($not, mapper);\n }\n\n return newFilter;\n};\n\nconst mapPositiveFilterKeys = (filter: PositiveFilter, mapper: Record<string, string>): PositiveFilter => {\n const newFilter: PositiveFilter = {};\n Object.entries(filter).forEach(([key, filterValue]) => {\n const newKey = mapper[key] || key;\n newFilter[newKey] = filterValue;\n });\n return newFilter;\n};\n\nconst isPositiveFilter = (filter: any): filter is PositiveFilter => {\n return typeof filter === 'object' && filter !== null && !Array.isArray(filter);\n};\n","import { v4 as uuidv4 } from 'uuid';\nimport { getIdFieldKey, getSchemaByThing, indent } from '../../../helpers';\nimport type {\n EnrichedAttributeQuery,\n EnrichedBQLQuery,\n EnrichedBormSchema,\n EnrichedLinkQuery,\n EnrichedRoleQuery,\n} from '../../../types';\nimport { FieldSchema, QueryPath } from '../../../types/symbols';\nimport { buildFilter } from './filters';\n\nconst separator = '___';\n\nexport const buildTQLQuery = async (props: { queries: EnrichedBQLQuery[]; schema: EnrichedBormSchema }) => {\n const { queries: batches, schema } = props;\n return batches.map((query) => buildQuery({ query, schema }));\n};\n\nconst buildQuery = (props: { query: EnrichedBQLQuery; schema: EnrichedBormSchema }) => {\n const { query, schema } = props;\n const { $path, $thing, $filter, $fields, $sort, $offset, $limit, $id } = query;\n\n if (!$path) {\n throw new Error('Path is not defined');\n }\n\n const lines: string[] = [];\n const queryPath = query[QueryPath];\n lines.push('match');\n lines.push(`$${$path} isa ${$thing};`);\n\n if ($filter || $id) {\n const idField = getIdFieldKey(schema, query);\n const $WithIdFilter = { ...$filter, ...($id ? { [idField]: $id } : {}) };\n const filter = buildFilter({ $filter: $WithIdFilter, $var: $path, $thing, schema, depth: 0 });\n lines.push(`\\n${filter}`);\n }\n\n const sorter = buildSorter({ schema, $thing, $var: $path, $sort, depth: 0 });\n\n if (sorter) {\n lines.push(sorter.match);\n }\n\n const randomId = `M_${uuidv4()}`;\n\n lines.push(`?queryPath${randomId} = \"${queryPath}\";`);\n lines.push('fetch');\n lines.push(`?queryPath${randomId} as \"queryPath\";`);\n\n if ($fields) {\n const dataFields = $fields.filter((f) => f.$fieldType === 'data') as EnrichedAttributeQuery[];\n if (dataFields && dataFields.length > 0) {\n lines.push(...processDataFields(dataFields, $path, 0));\n }\n\n const linkFields = $fields.filter((f) => f.$fieldType === 'link') as EnrichedLinkQuery[];\n if (linkFields && linkFields.length > 0) {\n lines.push(...processLinkFields(linkFields, $path, $path, 0, schema));\n }\n\n const roleFields = $fields.filter((f) => f.$fieldType === 'role') as EnrichedRoleQuery[];\n if (roleFields && roleFields.length > 0) {\n lines.push(...processRoleFields(roleFields, $path, $path, 0, schema));\n }\n }\n\n if (sorter) {\n lines.push(sorter.sort);\n }\n\n if (typeof $offset === 'number') {\n lines.push(`\\noffset ${$offset};`);\n }\n\n if (typeof $limit === 'number') {\n lines.push(`\\nlimit ${$limit};`);\n }\n\n return lines.join('\\n');\n};\n\nconst processDataFields = (dataFields: EnrichedAttributeQuery[], $path: string, depth: number) => {\n const postStrParts: string[] = [];\n const asMetaDataParts: string[] = [];\n const multiVals: { path: string }[] = [];\n\n for (let i = 0; i < dataFields.length; i++) {\n if (!dataFields[i].$isVirtual) {\n postStrParts.push(dataFields[i].$dbPath);\n }\n if (dataFields[i][FieldSchema].contentType === 'FLEX') {\n multiVals.push({ path: dataFields[i][FieldSchema].dbPath });\n }\n asMetaDataParts.push(`{${dataFields[i].$dbPath}:${dataFields[i].$as}}`);\n }\n\n const postStr = postStrParts.join(', ');\n const $asMetaData = asMetaDataParts.join(',');\n const $metaData = `$metadata:{as:[${$asMetaData}]}`;\n const lines = [indent(`$${$path} as \"${$path}.${$metaData}.$dataFields\": ${postStr};`, depth)];\n\n if (multiVals.length > 0) {\n multiVals.forEach((multiVal) => {\n lines.push(\n indent(\n `\"${multiVal.path}.$multiVal\": {match $${$path} has ${multiVal.path} $${multiVal.path}; fetch $${multiVal.path}: attribute;};`,\n depth,\n ),\n );\n });\n }\n return lines;\n};\n\nconst processRoleFields = (\n roleFields: EnrichedRoleQuery[],\n $path: string,\n dotPath: string,\n depth: number,\n schema: EnrichedBormSchema,\n) => {\n const nextDepth = depth + 1;\n const lines: string[] = [];\n\n for (const roleField of roleFields) {\n const { $fields, $as, $justId, $idNotIncluded, $filterByUnique, $thing, $sort, $offset, $limit } = roleField;\n const queryPath = roleField[QueryPath];\n\n const $metaData = `$metadata:{as:${$as},justId:${\n $justId ? 'T' : 'F'\n },idNotIncluded:${$idNotIncluded},filterByUnique:${$filterByUnique}}`;\n lines.push(indent(`\"${dotPath}.${$metaData}.${roleField.$var}\": {`, depth));\n lines.push(indent('match', nextDepth));\n const $roleVar = `${$path}${separator}${roleField.$var}`;\n lines.push(indent(`$${$roleVar} isa ${roleField.$thing};`, nextDepth));\n lines.push(\n indent(\n // TODO: The parent node already declare $path\n `$${$path} (${roleField.$var}: $${$path}${separator}${roleField.$var}) isa ${roleField.$intermediary};`,\n nextDepth,\n ),\n );\n\n if (roleField.$filter || roleField.$id) {\n const idField = getIdFieldKey(schema, roleField);\n const withId = roleField.$id ? { [idField]: roleField.$id } : {};\n const withIdFilter = { ...roleField.$filter, ...withId };\n\n lines.push(\n buildFilter({\n $filter: withIdFilter,\n $var: $roleVar,\n $thing: roleField.$thing,\n schema,\n depth: nextDepth,\n }),\n );\n }\n\n const sorter = buildSorter({ schema, $thing, $var: $roleVar, $sort, depth: nextDepth });\n\n if (sorter) {\n lines.push(sorter.match);\n }\n\n if ($fields) {\n const randomId = `M_${uuidv4()}`;\n lines.push(indent(`\\n?queryPath${randomId} = \"${queryPath}\";`, nextDepth)); ///rawPaths => to inject metadata in the response, in this case only the path\n lines.push(indent('fetch', nextDepth));\n lines.push(indent(`?queryPath${randomId} as \"queryPath\";`, nextDepth)); ///rawPaths => to recover metadata in the response\n\n const dataFields = $fields?.filter((f) => f.$fieldType === 'data') as EnrichedAttributeQuery[];\n if (dataFields && dataFields.length > 0) {\n lines.push(...processDataFields(dataFields, $roleVar, nextDepth));\n }\n\n const linkFields = $fields?.filter((f) => f.$fieldType === 'link') as EnrichedLinkQuery[];\n if (linkFields && linkFields.length > 0) {\n lines.push(...processLinkFields(linkFields, $roleVar, `${$path}.${roleField.$var}`, nextDepth, schema));\n }\n const roleFields = $fields?.filter((f) => f.$fieldType === 'role') as EnrichedRoleQuery[];\n if (roleFields && roleFields.length > 0) {\n lines.push(...processRoleFields(roleFields, $roleVar, `${$path}.${roleField.$var}`, nextDepth, schema));\n }\n }\n\n if (sorter) {\n lines.push(sorter.sort);\n }\n\n if (typeof $offset === 'number') {\n lines.push(indent(`offset ${$offset};`, nextDepth));\n }\n\n if (typeof $limit === 'number') {\n lines.push(indent(`limit ${$limit};`, nextDepth));\n }\n\n lines.push(indent('};', depth));\n }\n\n return lines;\n};\n\nconst processLinkFields = (\n linkFields: EnrichedLinkQuery[],\n $path: string,\n dotPath: string,\n depth: number,\n schema: EnrichedBormSchema,\n) => {\n const nextDepth = depth + 1;\n const lines: string[] = [];\n\n for (const linkField of linkFields) {\n const { $fields, $as, $justId, $idNotIncluded, $filterByUnique, $playedBy, $thing, $sort, $offset, $limit } =\n linkField;\n const queryPath = linkField[QueryPath];\n const $metaData = `$metadata:{as:${$as},justId:${\n $justId ? 'T' : 'F'\n },idNotIncluded:${$idNotIncluded},filterByUnique:${$filterByUnique}}`;\n lines.push(indent(`\"${dotPath}.${$metaData}.${linkField.$var}\": {`, depth));\n lines.push(indent('match', nextDepth));\n const $linkVar = `${$path}${separator}${linkField.$var}`;\n lines.push(indent(`$${$linkVar} isa ${linkField.$thing};`, nextDepth));\n\n if (linkField.$filter || linkField.$id) {\n const idField = getIdFieldKey(schema, linkField);\n const withId = linkField.$id ? { [idField]: linkField.$id } : {};\n const withIdFilter = { ...linkField.$filter, ...withId };\n lines.push(\n buildFilter({\n $filter: withIdFilter,\n $var: $linkVar,\n $thing: linkField.$thing,\n schema,\n depth: nextDepth,\n }),\n );\n }\n\n const sorter = buildSorter({ schema, $thing, $var: $linkVar, $sort, depth: nextDepth });\n\n if (sorter) {\n lines.push(sorter.match);\n }\n\n if (linkField.$target === 'role') {\n // a. intermediary\n lines.push(\n indent(\n `$${$path}_intermediary (${linkField.$plays}: $${$path}, ${$playedBy.plays}: $${$linkVar}) isa ${linkField.$intermediary};`,\n nextDepth,\n ),\n );\n } else {\n // b. no intermediary\n lines.push(\n indent(\n // TODO: There can't be multiple \"isa\" for the same variable\n // TODO: There can't be multiple relation constraints for the same variable. The filter may contain multiple relation constraints.\n `$${$linkVar} (${linkField.$plays}: $${$path});`,\n nextDepth,\n ),\n );\n }\n\n if ($fields) {\n const randomId = `M_${uuidv4()}`;\n lines.push(indent(`?queryPath${randomId} = \"${queryPath}\";`, nextDepth)); ///queryPath => to inject metadata in the response, in this case only the path\n lines.push(indent('fetch', nextDepth));\n lines.push(indent(`?queryPath${randomId} as \"queryPath\";`, nextDepth)); ///queryPath => to recover metadata in the response\n\n const dataFields = $fields?.filter((f) => f.$fieldType === 'data') as EnrichedAttributeQuery[];\n if (dataFields && dataFields.length > 0) {\n lines.push(...processDataFields(dataFields, $linkVar, nextDepth));\n }\n\n const linkFields = $fields?.filter((f) => f.$fieldType === 'link') as EnrichedLinkQuery[];\n if (linkFields && linkFields.length > 0) {\n lines.push(...processLinkFields(linkFields, $linkVar, `${$path}.${linkField.$var}`, nextDepth, schema));\n }\n\n const roleFields = $fields?.filter((f) => f.$fieldType === 'role') as EnrichedRoleQuery[];\n if (roleFields && roleFields.length > 0) {\n lines.push(...processRoleFields(roleFields, $linkVar, `${$path}.${linkField.$var}`, nextDepth, schema));\n }\n }\n\n if (sorter) {\n lines.push(sorter.sort);\n }\n\n if (typeof $offset === 'number') {\n lines.push(indent(`offset ${$offset};`, nextDepth));\n }\n\n if (typeof $limit === 'number') {\n lines.push(indent(`limit ${$limit};`, nextDepth));\n }\n\n lines.push(indent('};', depth));\n }\n\n return lines;\n};\n\nconst normalizeSorter = (sort: { field: string; desc?: boolean } | string) => {\n if (typeof sort === 'string') {\n return {\n field: sort,\n desc: false,\n };\n }\n return { ...sort, desc: sort.desc ?? false };\n};\n\nconst buildSorter = (props: {\n $var: string;\n $thing: string;\n schema: EnrichedBormSchema;\n $sort?: ({ field: string; desc?: boolean } | string)[];\n depth: number;\n}) => {\n const { $var, $thing, schema, $sort, depth } = props;\n\n const thing = getSchemaByThing(schema, $thing);\n const sortMatch: string[] = [];\n const sorter: string[] = [];\n\n $sort?.forEach((sort) => {\n const s = normalizeSorter(sort);\n const df = thing.dataFields?.find((df) => df.path === s.field);\n if (!df) {\n throw new Error(`\"${$thing}\" does not have data field \"${s.field}\"`);\n }\n const attrVar = `${s.field}_${uuidv4()}`;\n sortMatch.push(indent('{', depth));\n sortMatch.push(indent(`$${$var} has ${df.dbPath} $${attrVar}_1;`, depth + 1));\n sortMatch.push(indent('not {', depth + 1));\n sortMatch.push(indent(`$${$var} has ${df.dbPath} $${attrVar}_2;`, depth + 2));\n sortMatch.push(indent(`$${attrVar}_2 < $${attrVar}_1;`, depth + 2));\n sortMatch.push(indent('};', depth + 1));\n sortMatch.push(indent(`?${attrVar}_ = $${attrVar}_1;`, depth + 1));\n sortMatch.push(indent('} or {', depth));\n sortMatch.push(indent(`not { $${$var} has ${df.dbPath} $${attrVar}_1; };`, depth + 1));\n // TODO: This is a workaround to put things with undefined attribute at the end.\n // \"~\" is the last non-control char (DEC 126) in ASCII.\n sortMatch.push(indent(`?${attrVar}_ = \"~\";`, depth + 1));\n sortMatch.push(indent('};', depth));\n sortMatch.push(indent(`?${attrVar} = ?${attrVar}_;`, depth));\n const order = s.desc ? 'desc' : 'asc';\n sorter.push(`?${attrVar} ${order}`);\n });\n\n if (sortMatch.length === 0) {\n return;\n }\n\n return {\n match: sortMatch.join(''),\n sort: indent(`sort ${sorter.join(', ')};`, depth),\n };\n};\n","import { isArray } from 'radash';\nimport { assertDefined, getCurrentSchema } from '../../../helpers';\nimport type {\n BormConfig,\n EnrichedBQLQuery,\n EnrichedBormEntity,\n EnrichedBormRelation,\n EnrichedBormSchema,\n RawBQLQuery,\n} from '../../../types';\nimport { QueryPath } from '../../../types/symbols';\n\ntype TypeDbResponse = Record<string, any>; //TODO\n\nexport const parseTQLQuery = async (props: {\n rawBqlRequest: RawBQLQuery[];\n enrichedBqlQuery: EnrichedBQLQuery[];\n schema: EnrichedBormSchema;\n config: BormConfig;\n rawTqlRes: Record<string, any>[][];\n}): Promise<TypeDbResponse[]> => {\n const { enrichedBqlQuery, rawBqlRequest, schema, config, rawTqlRes } = props;\n\n if (!enrichedBqlQuery) {\n throw new Error('BQL request not enriched');\n }\n if (!rawTqlRes) {\n throw new Error('TQL query not executed');\n }\n\n return rawTqlRes.map((res, i) => {\n const rawBql = rawBqlRequest[i];\n const query = enrichedBqlQuery[i];\n const parsed = realParse(res, rawBql, query, schema, config);\n return parsed;\n });\n};\n\nconst realParse = (\n res: any[],\n rawBqlRequest: RawBQLQuery,\n enrichedBqlQuery: EnrichedBQLQuery,\n schema: EnrichedBormSchema,\n config: BormConfig,\n) => {\n if (res.length === 0) {\n // This is a little inconsistent. In the prop if the result is empty\n // we return null or undefined based on the config, but the test\n // expect the top level result to always return null.\n // always return\n // return config.query?.returnNulls ? null : undefined;\n return null;\n }\n if (enrichedBqlQuery.$filterByUnique) {\n return parseObj(res[0], rawBqlRequest, schema, config);\n }\n return res.map((item) => parseObj(item, rawBqlRequest, schema, config));\n};\n\nconst parseObj = (res: any, rawBqlRequest: RawBQLQuery, schema: EnrichedBormSchema, config: BormConfig) => {\n const { dataFields, currentSchema, linkFields, roleFields, schemaValue } = parseFields(res, schema);\n\n const parsedDataFields = parseDataFields(dataFields, currentSchema, config);\n const parsedLinkFields = parseLinkFields(linkFields, schema, config);\n const parsedRoleFields = parseRoleFields(roleFields, schema, config);\n const idNotIncluded = rawBqlRequest?.$fields?.every(\n (field) => !currentSchema?.idFields?.includes(typeof field === 'string' ? field : field.$path),\n );\n\n const finalObj = {\n ...parsedLinkFields,\n ...parsedRoleFields,\n ...schemaValue,\n ...(!config.query?.noMetadata && rawBqlRequest.$id\n ? // TODO: This line is wrong: the id field may not be \"id\"; $id may be an array of string;\n { $id: Array.isArray(rawBqlRequest.$id) ? parsedDataFields.id : rawBqlRequest.$id }\n : {}),\n ...(idNotIncluded\n ? Object.fromEntries(Object.entries(parsedDataFields).filter(([key]) => !currentSchema?.idFields?.includes(key)))\n : parsedDataFields),\n };\n\n return finalObj;\n};\n\nconst parseFields = (obj: any, schema: EnrichedBormSchema) => {\n const keys = Object.keys(obj);\n // Find and process $dataFields\n const dataFieldsKey = keys.find((key) => key.endsWith('.$dataFields'));\n const multiValKeys = keys.filter((key) => key.endsWith('.$multiVal'));\n if (!dataFieldsKey) {\n throw new Error('No dataFields');\n }\n\n //if there are multiValKeys, we replace it in the Object\n if (multiValKeys?.length > 0) {\n multiValKeys.forEach((multiValKey) => {\n const multiValKeyWithout$multiVal = multiValKey.replace(/\\.\\$multiVal$/, '');\n const realValue = obj[multiValKey][0][multiValKeyWithout$multiVal].attribute; //there is an easier way for sure\n // eslint-disable-next-line no-param-reassign\n obj[dataFieldsKey][multiValKeyWithout$multiVal] = realValue;\n });\n }\n const dataFields = obj[dataFieldsKey];\n\n const metaDataKey = dataFieldsKey.split('.')[dataFieldsKey.split('.').length - 2];\n dataFields.$metaData = metaDataKey;\n\n if (dataFields.length === 0) {\n throw new Error('No dataFields');\n }\n\n const dataFieldsThing = dataFields.type;\n const schemaValue = {\n $thing: dataFieldsThing.label,\n $thingType: dataFieldsThing.root,\n [QueryPath]: obj.queryPath.value,\n };\n const node = { [`$${schemaValue.$thingType}`]: schemaValue.$thing };\n const currentSchema = getCurrentSchema(schema, node);\n\n // Process linkFields and roleFields\n const linkFields = keys\n .filter((key) => {\n const $key = assertDefined(key.split('.').pop());\n return !key.endsWith('.$dataFields') && currentSchema.linkFields?.some((o) => o.path === $key);\n })\n .map((key) => {\n const $key = assertDefined(key.split('.').pop());\n const linkField = assertDefined(currentSchema.linkFields?.find((o) => o.path === $key));\n return {\n $linkFields: obj[key],\n $key,\n $metaData: key.split('.')[key.split('.').length - 2],\n $cardinality: linkField.cardinality,\n };\n });\n\n const roleFields = keys\n .filter((key) => {\n const role = key.split('.').pop();\n return (\n role && !key.endsWith('.$dataFields') && currentSchema.thingType === 'relation' && currentSchema.roles?.[role]\n );\n })\n .map((key) => {\n const role = assertDefined(key.split('.').pop());\n return {\n $roleFields: obj[key],\n $key: role,\n $metaData: key.split('.')[key.split('.').length - 2],\n $cardinality: (currentSchema as EnrichedBormRelation).roles[role].cardinality,\n };\n });\n\n return { dataFields, schemaValue, currentSchema, linkFields, roleFields };\n};\n\nconst parseDataFields = (\n dataFields: any,\n currentSchema: EnrichedBormEntity | EnrichedBormRelation,\n config: BormConfig,\n) => {\n const { $metaData } = dataFields;\n const { as: $as } = parseArrayMetadata($metaData);\n\n // Process the main data fields\n const mainDataFields = Object.entries(dataFields as Record<string, any>)\n .filter(([key]) => key !== 'type' && !key.startsWith('$'))\n .flatMap(([key, value]) => {\n const field = currentSchema.dataFields?.find((f) => f.path === key || f.dbPath === key);\n const isIdField = key === 'id';\n const $asKey = Array.isArray($as) ? $as.find((o) => o[key])?.[key] : key;\n\n let fieldValue: any;\n if (field?.cardinality === 'ONE') {\n fieldValue = value[0] ? value[0].value : config.query?.returnNulls ? null : undefined;\n if (field.contentType === 'DATE' || (field.contentType === 'FLEX' && value[0].type.value_type === 'datetime')) {\n /// date fields need to be converted to ISO format including the timezone\n fieldValue = fieldValue ? `${fieldValue}Z` : fieldValue;\n } else if (field.contentType === 'JSON') {\n fieldValue = fieldValue && JSON.parse(fieldValue);\n }\n if (isIdField) {\n return [\n [$asKey, fieldValue],\n ['$id', fieldValue],\n ].filter(([_, v]) => v !== undefined);\n }\n } else if (field?.cardinality === 'MANY') {\n if (!isArray(value)) {\n throw new Error('Typedb fetch has changed its format');\n }\n if (value.length === 0) {\n return config.query?.returnNulls ? [[$asKey, null]] : []; //return nothing unles the returnNulls flag is set\n }\n if (field.contentType === 'DATE') {\n fieldValue = value.map((o) => {\n return `${o.value}Z`;\n });\n } else if (field.contentType === 'FLEX') {\n fieldValue = value.map((o) => {\n if (o.type.value_type === 'datetime') {\n return `${o.value}Z`;\n }\n return o.value;\n });\n } else if (field.contentType === 'JSON') {\n fieldValue = value.map((o) => {\n return o.value && JSON.parse(o.value);\n });\n } else {\n fieldValue = value.map((o) => {\n return o.value;\n });\n }\n }\n return [[$asKey, fieldValue]].filter(([_, v]) => v !== undefined);\n });\n\n return Object.fromEntries([...mainDataFields]);\n};\n\nconst parseRoleFields = (\n roleFields: { $roleFields: any[]; $key: string; $metaData: string; $cardinality: 'MANY' | 'ONE' }[],\n schema: EnrichedBormSchema,\n config: BormConfig,\n) => {\n const roleFieldsRes: Record<string, any> = {};\n\n roleFields.forEach((roleField) => {\n const { $roleFields, $metaData, $cardinality } = roleField;\n const { as, justId, idNotIncluded, filterByUnique } = parseMetaData($metaData);\n\n if (as === null) {\n return;\n }\n\n const items = $roleFields.map((item) => {\n const { dataFields, currentSchema, linkFields, roleFields, schemaValue } = parseFields(item, schema);\n const parsedDataFields = parseDataFields(dataFields, currentSchema, config);\n\n if (justId === 'T') {\n return parsedDataFields.id;\n }\n const parsedLinkFields = parseLinkFields(linkFields, schema, config);\n const parsedRoleFields = parseRoleFields(roleFields, schema, config);\n const resDataFields = { ...parsedDataFields };\n if (idNotIncluded === 'true') {\n currentSchema?.idFields?.forEach((field) => delete resDataFields[field]);\n }\n return {\n ...resDataFields,\n ...parsedLinkFields,\n ...parsedRoleFields,\n ...schemaValue,\n };\n });\n\n if (items.length > 0) {\n roleFieldsRes[as] = $cardinality === 'MANY' && filterByUnique === 'false' ? items : items[0];\n } else if (config.query?.returnNulls) {\n roleFieldsRes[as] = null;\n }\n });\n\n return roleFieldsRes;\n};\n\nconst parseLinkFields = (\n linkFields: { $linkFields: any[]; $key: string; $metaData: string; $cardinality: 'MANY' | 'ONE' }[],\n schema: EnrichedBormSchema,\n config: BormConfig,\n) => {\n const linkFieldsRes: Record<string, any> = {};\n\n linkFields.forEach((linkField) => {\n const { $linkFields, $metaData, $cardinality } = linkField;\n const { as, justId, idNotIncluded, filterByUnique } = parseMetaData($metaData);\n\n if (as === null) {\n return;\n }\n\n const items = $linkFields.map((item) => {\n const { dataFields, currentSchema, linkFields, roleFields, schemaValue } = parseFields(item, schema);\n const parsedDataFields = parseDataFields(dataFields, currentSchema, config);\n\n if (justId === 'T') {\n return parsedDataFields.id;\n }\n const parsedLinkFields = parseLinkFields(linkFields, schema, config);\n const parsedRoleFields = parseRoleFields(roleFields, schema, config);\n const resDataFields = { ...parsedDataFields };\n\n if (idNotIncluded === 'true') {\n currentSchema.idFields?.forEach((field) => delete resDataFields[field]);\n }\n\n return {\n ...resDataFields,\n ...parsedLinkFields,\n ...parsedRoleFields,\n ...schemaValue,\n };\n });\n\n // eslint-disable-next-line no-param-reassign\n linkFieldsRes[as] =\n items.length > 0\n ? $cardinality === 'MANY' && filterByUnique === 'false'\n ? items\n : items[0]\n : config.query?.returnNulls\n ? null\n : undefined;\n });\n\n return linkFieldsRes;\n};\n\n//todo: add this metadata as a typedb \"?\" var instead\nconst parseMetaData = (str: string) => {\n const asRegex = /as:([a-zA-Z0-9_\\-·]+)/;\n const justIdRegex = /justId:([a-zA-Z0-9_\\-·]+)/;\n const idNotIncludedRegex = /idNotIncluded:([a-zA-Z0-9_\\-·]+)/;\n const filterByUniqueRegex = /filterByUnique:([a-zA-Z0-9_\\-·]+)/;\n\n const asMatch = str.match(asRegex);\n const justIdMatch = str.match(justIdRegex);\n const idNotIncludedMatch = str.match(idNotIncludedRegex);\n const filterByUniqueMatch = str.match(filterByUniqueRegex);\n\n return {\n as: asMatch ? asMatch[1] : null,\n justId: justIdMatch ? justIdMatch[1] : null,\n idNotIncluded: idNotIncludedMatch ? idNotIncludedMatch[1] : null,\n filterByUnique: filterByUniqueMatch ? filterByUniqueMatch[1] : null,\n };\n};\n\nconst parseArrayMetadata = (str: string) => {\n try {\n const convertToJson = (str: string) => {\n // Remove $metadata: from the string\n let jsonString = str.replace('$metadata:', '');\n\n // Enclose keys in quotes\n jsonString = jsonString.replace(/([a-zA-Z0-9_\\-·]+)(?=:)/g, '\"$1\"');\n\n // Enclose values in quotes, handling nested object values separately\n jsonString = jsonString.replace(/:(\\s*)([a-zA-Z0-9_\\-·]+)/g, (_match, p1, p2) => {\n // Check if the value is part of an object\n if (/^{.*}$/.test(p2)) {\n return `:${p2}`;\n }\n return `:${p1}\"${p2}\"`;\n });\n\n // Convert array elements (non-object) to strings\n jsonString = jsonString.replace(/\\[([^\\]]+)\\]/g, (_match, p1) => {\n return `[${p1\n .split(',')\n .map((s: string) => {\n // Check if element is an object-like structure\n if (s.trim().startsWith('{') && s.trim().endsWith('}')) {\n return s.trim();\n }\n return `\"${s.trim()}\"`;\n })\n .join(',')}]`;\n });\n\n return jsonString;\n };\n const converted = convertToJson(str);\n\n const parsed = JSON.parse(converted);\n return parsed;\n } catch (e) {\n console.error(e);\n return { as: [] };\n }\n};\n","import { 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 tqlRequest: string[];\n dbHandles: DBHandles;\n config: BormConfig;\n}): Promise<any> => {\n const { tqlRequest, dbHandles, config } = props;\n //TODO condition this only to have infer if there are virtual fields (without default fn)\n const options = new TypeDBOptions();\n options.infer = true;\n\n const { session } = await getSessionOrOpenNewOne(dbHandles, config);\n const transaction = await session.transaction(TransactionType.READ, options);\n\n //console.log('query', JSON.stringify(tqlRequest, null, 2));\n const [err, resArray] = await tryit(parallel)(tqlRequest.length, tqlRequest, async (queryString) => {\n const tqlStream = transaction.query.fetch(queryString as string);\n const tqlRes = await tqlStream.collect();\n return tqlRes;\n });\n\n if (err) {\n await transaction.rollback();\n const error = err as AggregateError;\n throw new Error(`Error running TQL query: ${error.errors}`);\n }\n await transaction.close();\n\n // todo: type the rawTqlRes\n return resArray;\n};\n","import { SessionType } from 'typedb-driver';\nimport type { BormConfig, DBHandles } from '../../types';\n\nexport const getSessionOrOpenNewOne = async (dbHandles: DBHandles, config: BormConfig) => {\n const singleHandlerV0 = config.dbConnectors[0].id;\n let session = dbHandles.typeDB?.get(singleHandlerV0)?.session;\n const client = dbHandles.typeDB?.get(singleHandlerV0)?.client;\n\n if (!session || !session.isOpen()) {\n if (!client) {\n throw new Error('Client not found');\n }\n session = await client.session(config.dbConnectors[0].dbName, SessionType.DATA);\n dbHandles.typeDB?.set(singleHandlerV0, { client, session });\n }\n\n return { client, session };\n};\n","import { assertDefined } from '../../../helpers';\nimport type { BormConfig, DBHandles, EnrichedBQLQuery, EnrichedBormSchema, 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 bql: {\n raw: RawBQLQuery[];\n queries: EnrichedBQLQuery[];\n res?: any[];\n };\n tql: {\n queries?: string[];\n res?: any[];\n };\n schema: EnrichedBormSchema;\n config: BormConfig;\n handles: DBHandles;\n error?: string | null;\n};\n\nconst updateBqlRes = (ctx: TypeDbMachineContext, event: any): TypeDbMachineContext => {\n if (!event.data) {\n return ctx;\n }\n return {\n ...ctx,\n bql: { ...ctx.bql, res: event.data },\n };\n};\n\nconst updateTqlReq = (ctx: TypeDbMachineContext, event: any): TypeDbMachineContext => {\n if (!event.data) {\n return ctx;\n }\n return {\n ...ctx,\n tql: { ...ctx.tql, queries: event.data },\n };\n};\n\nconst updateTqlRes = (ctx: TypeDbMachineContext, event: any): TypeDbMachineContext => {\n if (!event.data) {\n return ctx;\n }\n return {\n ...ctx,\n tql: { ...ctx.tql, res: event.data },\n };\n};\n\nconst errorTransition = transition(\n 'error',\n 'error',\n reduce((ctx: TypeDbMachineContext, event: any): TypeDbMachineContext => {\n return {\n ...ctx,\n error: event.error,\n };\n }),\n);\n\nexport const typeDbQueryMachine = createMachine(\n 'build',\n {\n build: invoke(\n async (ctx: TypeDbMachineContext) => buildTQLQuery({ queries: ctx.bql.queries, schema: ctx.schema }),\n transition('done', 'run', reduce(updateTqlReq)),\n errorTransition,\n ),\n run: invoke(\n async (ctx: TypeDbMachineContext) => {\n return runTQLQuery({\n dbHandles: ctx.handles,\n tqlRequest: assertDefined(ctx.tql.queries),\n config: ctx.config,\n });\n },\n transition('done', 'parse', reduce(updateTqlRes)),\n errorTransition,\n ),\n parse: invoke(\n async (ctx: TypeDbMachineContext) =>\n parseTQLQuery({\n rawBqlRequest: ctx.bql.raw,\n enrichedBqlQuery: ctx.bql.queries,\n schema: ctx.schema,\n config: ctx.config,\n rawTqlRes: assertDefined(ctx.tql.res),\n }),\n transition('done', 'success', reduce(updateBqlRes)),\n errorTransition,\n ),\n success: state(),\n error: state(),\n },\n (ctx: TypeDbMachineContext) => ctx,\n);\n\nconst awaitQueryMachine = async (context: TypeDbMachineContext) => {\n return new Promise<any[]>((resolve, reject) => {\n interpret(\n typeDbQueryMachine,\n (service) => {\n if (service.machine.state.name === 'success') {\n //@ts-expect-error = todo\n resolve(service.context.bql.res);\n }\n if (service.machine.state.name === 'error') {\n reject(service.context.error);\n }\n },\n context,\n );\n });\n};\n\nexport const runTypeDbQueryMachine = async (\n bql: RawBQLQuery[],\n enrichedBql: EnrichedBQLQuery[],\n schema: EnrichedBormSchema,\n config: BormConfig,\n handles: DBHandles,\n) => {\n return awaitQueryMachine({\n bql: {\n raw: bql,\n queries: enrichedBql,\n },\n tql: {},\n schema: schema,\n config: config,\n handles: handles,\n error: null,\n });\n};\n","import type { TypeDBDriver } from 'typedb-driver';\nimport type { SimpleSurrealClient } from '../../adapters/surrealDB/client';\nimport { assertDefined, getSchemaByThing } from '../../helpers';\nimport { logDebug } from '../../logger';\nimport type { BormConfig, DBHandles, EnrichedBQLQuery, EnrichedBormSchema, RawBQLQuery } from '../../types';\nimport { VERSION } from '../../version';\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 bql: {\n raw: RawBQLQuery[];\n queries?: EnrichedBQLQuery[];\n res?: any[]; // TODO\n };\n schema: EnrichedBormSchema;\n config: BormConfig;\n handles: DBHandles;\n error: string | null;\n};\n\nconst updateBqlReq = (ctx: MachineContext, event: any) => {\n if (!event.data) {\n return ctx;\n }\n return {\n ...ctx,\n bql: { ...ctx.bql, queries: event.data },\n };\n};\n\nconst updateBqlRes = (ctx: MachineContext, event: any) => {\n if (!event.data) {\n return ctx;\n }\n return {\n ...ctx,\n bql: { ...ctx.bql, res: event.data },\n };\n};\n\nconst errorTransition = transition(\n 'error',\n 'error',\n reduce((ctx: MachineContext, event: any) => {\n return {\n ...ctx,\n error: event.error,\n };\n }),\n);\n\ntype TypeDBAdapter = {\n db: 'typeDB';\n client: TypeDBDriver;\n rawBql: RawBQLQuery[];\n bqlQueries: EnrichedBQLQuery[];\n indices: number[];\n};\n\ntype SurrealDBAdapter = {\n db: 'surrealDB';\n client: SimpleSurrealClient;\n rawBql: RawBQLQuery[];\n bqlQueries: EnrichedBQLQuery[];\n indices: number[];\n};\n\ntype Adapter = TypeDBAdapter | SurrealDBAdapter;\n\nexport const queryMachine = createMachine(\n 'enrich',\n {\n enrich: invoke(\n async (ctx: MachineContext) => {\n logDebug(`originalBQLQuery[${VERSION}]`, JSON.stringify(ctx.bql.raw));\n return enrichBQLQuery(ctx.bql.raw, ctx.schema);\n },\n transition('done', 'adapter', reduce(updateBqlReq)),\n errorTransition,\n ),\n adapter: invoke(\n async (ctx: MachineContext) => {\n const adapters: Record<string, Adapter> = {};\n\n ctx.bql.queries?.forEach((q, i) => {\n const raw = ctx.bql.raw[i];\n const thing = getSchemaByThing(ctx.schema, q.$thing);\n const { id } = thing.defaultDBConnector;\n\n if (thing.db === 'typeDB') {\n if (!adapters[id]) {\n const client = ctx.handles.typeDB?.get(id)?.client;\n if (!client) {\n throw new Error(`TypeDB client with id \"${thing.defaultDBConnector.id}\" does not exist`);\n }\n adapters[id] = {\n db: 'typeDB',\n client,\n rawBql: [],\n bqlQueries: [],\n indices: [],\n };\n }\n } else if (thing.db === 'surrealDB') {\n if (!adapters[id]) {\n const client = ctx.handles.surrealDB?.get(id)?.client;\n if (!client) {\n throw new Error(`SurrealDB client with id \"${thing.defaultDBConnector.id}\" does not exist`);\n }\n adapters[id] = {\n db: 'surrealDB',\n client,\n rawBql: [],\n bqlQueries: [],\n indices: [],\n };\n }\n } else {\n throw new Error(`Unsupported DB \"${thing.db}\"`);\n }\n const adapter = adapters[id];\n adapter.rawBql.push(raw);\n adapter.bqlQueries.push(q);\n adapter.indices.push(i);\n });\n const adapterList = Object.values(adapters);\n const proms = adapterList.map((a) => {\n if (a.db === 'typeDB') {\n // TODO: Replace DBHandles with TypeDBAdapter\n return runTypeDbQueryMachine(a.rawBql, a.bqlQueries, ctx.schema, ctx.config, ctx.handles);\n }\n\n if (a.db === 'surrealDB') {\n return runSurrealDbQueryMachine(a.bqlQueries, ctx.schema, ctx.config, a.client);\n }\n\n throw new Error(`Unsupported DB \"${JSON.stringify(a, null, 2)}\"`);\n });\n const results = await Promise.all(proms);\n const orderedResults = adapterList.flatMap((a, i) => {\n const result = results[i];\n return a.indices.map((index, j) => ({ index, result: result[j] }));\n });\n orderedResults.sort((a, b) => (a.index < b.index ? -1 : a.index > b.index ? 1 : 0));\n const result = orderedResults.map(({ result }) => result);\n return result;\n },\n transition('done', 'postHooks', reduce(updateBqlRes)),\n errorTransition,\n ),\n postHooks: invoke(\n async (ctx: MachineContext) => postHooks(ctx.schema, assertDefined(ctx.bql.queries), assertDefined(ctx.bql.res)),\n transition('done', 'clean', reduce(updateBqlRes)),\n errorTransition,\n ),\n clean: invoke(\n async (ctx: MachineContext) => cleanQueryRes(ctx.config, assertDefined(ctx.bql.res)),\n transition('done', 'success', reduce(updateBqlRes)),\n errorTransition,\n ),\n success: state(),\n error: state(),\n },\n (ctx: MachineContext) => ctx,\n);\n\nexport const awaitQueryMachine = async (context: MachineContext) => {\n return new Promise<MachineContext>((resolve, reject) => {\n interpret(\n queryMachine,\n (service) => {\n if (service.machine.state.name === 'success') {\n resolve(service.context);\n }\n if (service.machine.state.name === 'error') {\n reject(service.context);\n }\n },\n context,\n );\n });\n};\n\nexport const runQueryMachine = async (\n bql: RawBQLQuery[],\n schema: EnrichedBormSchema,\n config: BormConfig,\n handles: DBHandles,\n) => {\n return awaitQueryMachine({\n bql: {\n raw: bql,\n },\n schema: schema,\n config: config,\n handles: handles,\n error: null,\n });\n};\n","import { isObject } from 'radash';\nimport { getSchemaByThing } from '../../../../helpers';\nimport type {\n BQLResponse,\n BormConfig,\n DBHandles,\n EnrichedBQLMutationBlock,\n EnrichedBormEntity,\n EnrichedBormRelation,\n EnrichedBormSchema,\n EnrichedDataField,\n EnrichedLinkField,\n EnrichedRoleField,\n FilledBQLMutationBlock,\n} from '../../../../types';\nimport { DBNode } from '../../../../types/symbols';\nimport { runQueryMachine } from '../../../query/queryMachine';\n\nexport const preHookDependencies = async (\n blocks: EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[],\n schema: EnrichedBormSchema,\n config: BormConfig,\n dbHandles: DBHandles,\n) => {\n const mutations = Array.isArray(blocks) ? blocks : [blocks];\n const transformationPreQueryReq = mutations.map((m) => mutationToQuery(m, true));\n const res = await runQueryMachine(\n // @ts-expect-error todo\n transformationPreQueryReq,\n schema,\n config,\n dbHandles,\n );\n const transformationPreQueryRes = res.bql.res as BQLResponse[];\n return mutations.map((mut, i) => {\n const thing = getSchemaByThing(schema, mut.$thing);\n return setDbNode({\n mut: mut as Mutation,\n node: transformationPreQueryRes[i] as DbValue,\n schema,\n thing,\n });\n });\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 const $fields: Record<string, FieldQuery> = {};\n block.$fields?.forEach((f: any) => {\n if (typeof f === 'string') {\n $fields[f] = f;\n } else {\n $fields[f.$path] = f;\n }\n });\n const filteredBlock: { $fields?: FieldQuery[]; [k: `$${string}`]: any } = {};\n\n for (const k in block) {\n if (FORBIDDEN_ROOT_QUERY_PROP.has(k)) {\n continue;\n }\n if (FORBIDDEN_SUB_QUERY_PROP.has(k) && !root) {\n continue;\n }\n const v = block[k];\n if (k.startsWith('$')) {\n filteredBlock[k as `$${string}`] = v;\n } else if (Array.isArray(v)) {\n // NOTE: If a link/role field mutation is an array, we only look at the first mutation block.\n // Each mutation block may have totally different structures.\n if (v[0] && typeof v[0] === 'object') {\n $fields[k] = {\n $path: k,\n ...mutationToQuery(v[0], false),\n };\n }\n } else if (isObject(v)) {\n $fields[k] = {\n $path: k,\n ...mutationToQuery(v as any, false),\n };\n }\n }\n\n filteredBlock.$fields = Object.values($fields);\n\n return filteredBlock;\n};\n\ntype Mutation = {\n $id: string;\n $fields?: FieldQuery[];\n} & {\n [k: string]: string | number | null | Mutation | Mutation[];\n};\n\ntype MutationWithDBNode = {\n $id: string;\n [DBNode]?: DbNode;\n [k: string]: string | number | null | MutationWithDBNode | MutationWithDBNode[];\n};\n\nconst setDbNode = (props: {\n mut: Mutation | Mutation[];\n node: DbValue | DbValue[];\n schema: EnrichedBormSchema;\n thing: EnrichedBormEntity | EnrichedBormRelation;\n}) => {\n const { mut, node, schema, thing } = props;\n const fieldMap = getFieldMap(thing);\n const subNodeMap = getNodeMap(node);\n if (Array.isArray(mut)) {\n return mut.map((subMut) => {\n const subNode = subNodeMap[subMut.$id];\n if (!subNode) {\n return subMut;\n }\n return setDbNodeSingle({\n mut: subMut,\n node: subNode,\n schema,\n thing,\n ...fieldMap,\n });\n });\n }\n const subNode = subNodeMap[mut.$id];\n return setDbNodeSingle({\n mut,\n node: subNode,\n schema,\n thing,\n ...fieldMap,\n });\n};\n\nconst setDbNodeSingle = (props: {\n mut: Mutation;\n node?: DbNode;\n schema: EnrichedBormSchema;\n thing: EnrichedBormEntity | EnrichedBormRelation;\n dataFieldMap: Record<string, EnrichedDataField>;\n linkFieldMap: Record<string, EnrichedLinkField>;\n roleFieldMap: Record<string, EnrichedRoleField>;\n}) => {\n const { mut, node, schema, thing, dataFieldMap, linkFieldMap, roleFieldMap } = props;\n const { $fields: _, ..._mut } = mut;\n if (!node) {\n return _mut;\n }\n const dbNode = getDbNode({\n $fields: mut.$fields,\n node,\n schema,\n thing,\n dataFieldMap,\n linkFieldMap,\n roleFieldMap,\n });\n const newMut: MutationWithDBNode = { ..._mut, [DBNode]: dbNode };\n\n // Update sub-mutation that has pre-queried db node.\n for (const key in mut) {\n if (key.startsWith('$')) {\n continue;\n }\n const value = mut[key];\n const df = dataFieldMap[key];\n if (df || !value || typeof value !== 'object') {\n newMut[key] = value;\n continue;\n }\n const $thing = linkFieldMap[key]?.oppositeLinkFieldsPlayedBy?.[0]?.thing || roleFieldMap[key]?.playedBy?.[0]?.thing;\n if (!$thing) {\n throw new Error(`\"${thing.name}\" does not have field \"${key}\"`);\n }\n const subThing = getSchemaByThing(schema, $thing);\n newMut[key] = setDbNode({\n mut: value,\n schema,\n node: node[key],\n thing: subThing,\n });\n }\n\n return newMut;\n};\n\ntype DbValue = string | number | boolean | null | DbNode;\n\ntype DbNode = {\n $id: string;\n [k: string]: DbValue | DbValue[];\n};\n\n/**\n * Extract the response of field queries from a superset query response.\n */\nconst getDbNode = (props: {\n $fields?: FieldQuery[];\n node: DbNode;\n schema: EnrichedBormSchema;\n thing: EnrichedBormEntity | EnrichedBormRelation;\n dataFieldMap: Record<string, EnrichedDataField>;\n linkFieldMap: Record<string, EnrichedLinkField>;\n roleFieldMap: Record<string, EnrichedRoleField>;\n}) => {\n const { $fields, node, schema, thing, dataFieldMap, linkFieldMap, roleFieldMap } = props;\n const fields = $fields ? $fields : getAllFields(thing);\n const newNode: DbNode = { $id: node.$id };\n\n fields.forEach((f) => {\n const isObj = typeof f !== 'string';\n const key = isObj ? f.$path : f;\n const value = node[key];\n const df = dataFieldMap[key];\n if (df) {\n newNode[key] = value;\n return;\n }\n const $thing = linkFieldMap[key]?.oppositeLinkFieldsPlayedBy?.[0]?.thing || roleFieldMap[key]?.playedBy?.[0]?.thing;\n if (!$thing) {\n throw new Error(`\"${thing.name}\" does not have field \"${key}\"`);\n }\n if (!isObj) {\n if (value) {\n newNode[key] = Array.isArray(value) ? value.map(getIdFromDbValue) : getIdFromDbValue(value);\n }\n return;\n }\n const subThing = getSchemaByThing(schema, $thing);\n const fieldMap = getFieldMap(subThing);\n newNode[key] = Array.isArray(value)\n ? value.map((v) => getDbNodeFromDbValue({ ...fieldMap, $fields: f.$fields, value: v, schema, thing: subThing }))\n : getDbNodeFromDbValue({ ...fieldMap, $fields: f.$fields, value, schema, thing: subThing });\n });\n\n return newNode;\n};\n\n/**\n * Get data field, link field, and role paths of a thing.\n */\nconst getAllFields = (thing: EnrichedBormEntity | EnrichedBormRelation): string[] => {\n const fields: string[] = [];\n thing.dataFields?.forEach((f) => {\n fields.push(f.path);\n });\n thing.linkFields?.forEach((f) => {\n fields.push(f.path);\n });\n if (thing.thingType === 'relation') {\n fields.push(...Object.keys(thing.roles));\n }\n return 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 if (typeof value === 'string') {\n return value;\n }\n if (!value || typeof value !== 'object') {\n throw new Error(`\"${JSON.stringify(value)}\" is neither an id nor an object with prop \"$id\"`);\n }\n if (typeof value.$id !== 'string') {\n throw new Error(`\"${JSON.stringify(value)}\" is does not have prop \"$id\"`);\n }\n return value.$id;\n};\n\n/**\n * Throw an error if it's not a db node.\n */\nconst getDbNodeFromDbValue = (props: {\n $fields?: FieldQuery[];\n value: DbValue;\n schema: EnrichedBormSchema;\n thing: EnrichedBormEntity | EnrichedBormRelation;\n dataFieldMap: Record<string, EnrichedDataField>;\n linkFieldMap: Record<string, EnrichedLinkField>;\n roleFieldMap: Record<string, EnrichedRoleField>;\n}) => {\n const { value } = props;\n if (!value || typeof value !== 'object' || !value.$id) {\n throw new Error(`\"${JSON.stringify(props)}\" is neither an id nor an object with prop \"$id\"`);\n }\n return getDbNode({ ...props, node: value });\n};\n\nconst getFieldMap = (thing: EnrichedBormEntity | EnrichedBormRelation) => {\n const dataFieldMap = Object.fromEntries(thing.dataFields?.map((f) => [f.path, f]) || []);\n const linkFieldMap = Object.fromEntries(thing.linkFields?.map((f) => [f.path, f]) || []);\n const roleFieldMap = thing.thingType === 'relation' ? thing.roles || {} : {};\n return { dataFieldMap, linkFieldMap, roleFieldMap };\n};\n\n/**\n * Non-DbNode(s) are ignored.\n */\nconst getNodeMap = (value: DbValue | DbValue[]) => {\n if (!Array.isArray(value)) {\n if (value && typeof value === 'object' && value.$id) {\n return { [value.$id]: value };\n }\n return {};\n }\n\n const map: Record<string, DbNode> = {};\n\n value.forEach((v) => {\n if (!v || typeof v !== 'object' || !v.$id) {\n return;\n }\n map[v.$id] = v;\n });\n\n return map;\n};\n","import { isArray, isSymbol } from 'radash';\nimport { parseValueSurrealDB } from '../../../adapters/surrealDB/parsing/values';\nimport { getCurrentFields, oFilter } from '../../../helpers';\nimport type { BormOperation, EnrichedBQLMutationBlock, EnrichedBormSchema, EnrichedLinkField } from '../../../types';\nimport { Parent } from '../../../types/symbols';\n\nexport type FlatBqlMutation = {\n things: EnrichedBQLMutationBlock[];\n edges: EnrichedBQLMutationBlock[];\n arcs: EnrichedBQLMutationBlock[];\n references: EnrichedBQLMutationBlock[];\n};\n\nexport const flattenBQLMutation = (\n tree: EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[],\n schema: EnrichedBormSchema,\n): FlatBqlMutation => {\n //console.log('>>> flattenBQLMutation', JSON.stringify({ tree, schema }));\n const result: FlatBqlMutation = {\n things: [],\n edges: [],\n arcs: [],\n references: [],\n };\n\n const traverse = (\n block: EnrichedBQLMutationBlock,\n parent?: { bzId: string; edgeField: string; tempId?: string },\n ): void => {\n if (!block?.$thing) {\n //console.log('block without $thing', block);\n //this for instance happens in flexValues inside refFields\n return;\n }\n const { $op, $bzId, $tempId } = block;\n\n const currentSchema = schema.relations[block.$thing] || schema.entities[block.$thing];\n if (!currentSchema) {\n throw new Error(`[Internal] No schema found for ${block.$thing}`);\n }\n\n const parentObj = parent?.bzId ? parent : { bzId: '', edgeField: 'root' };\n\n //const { idFields } = currentSchema;\n const { usedDataFields, usedLinkFields, usedRoleFields, usedRefFields } = getCurrentFields(currentSchema, block);\n\n //const isOne = $op === 'create' || !isArray($id);\n\n //1. THINGS\n if (['create', 'update', 'delete', 'link', 'unlink', 'match', 'replace'].includes($op)) {\n const thing = {\n ...oFilter(block, (k: string) => ![...usedRoleFields, ...usedLinkFields, ...usedRefFields].includes(k)),\n ...($op === 'link' || $op === 'unlink' || $op === 'replace' || ($op === 'update' && usedDataFields.length === 0)\n ? { $op: 'match' }\n : {}),\n ...($op === 'link' || $op === 'replace' ? {} : { [Parent]: parentObj }), //links and replaces don't read from the parent but the entire table,\n } as EnrichedBQLMutationBlock;\n\n result.things.push(thing);\n }\n\n //2. EDGES\n // 2.1 Case one direct EDGES\n\n // left side is what happens in the edge, right side is the op in the children that creates that edge op\n const operationMap = {\n link: ['link', 'create'],\n unlink: ['unlink', 'delete'],\n replace: ['replace'],\n };\n\n if (usedRoleFields) {\n const edgeMeta = oFilter(\n block,\n (k: string | symbol) => isSymbol(k) || k.startsWith('$'),\n ) as EnrichedBQLMutationBlock;\n\n usedRoleFields.forEach((role) => {\n //1 traverse them as well\n isArray(block[role])\n ? block[role].forEach((child: EnrichedBQLMutationBlock) =>\n traverse(child, { bzId: $bzId, edgeField: role, tempId: $tempId }),\n )\n : traverse(block[role], { bzId: $bzId, edgeField: role, tempId: $tempId });\n\n //2 fill the arrays\n const edges = (isArray(block[role]) ? block[role] : [block[role]]).filter(\n Boolean,\n ) as EnrichedBQLMutationBlock[]; //pre-queries add some undefineds\n\n Object.entries(operationMap).forEach(([operation, opTypes]) => {\n const filteredEdges = edges.filter((edge) => opTypes.includes(edge.$op)).map((edge) => edge.$bzId);\n\n if (filteredEdges.length > 0) {\n result.edges.push({\n ...edgeMeta,\n [role]: filteredEdges,\n $op: operation as BormOperation,\n });\n }\n });\n });\n }\n if (usedLinkFields) {\n usedLinkFields.forEach((ulf) => {\n //1 traverse them\n isArray(block[ulf])\n ? block[ulf].forEach((child: EnrichedBQLMutationBlock) =>\n traverse(child, { bzId: $bzId, edgeField: ulf, tempId: $tempId }),\n )\n : traverse(block[ulf], { bzId: $bzId, edgeField: ulf, tempId: $tempId });\n\n //2 fill the arrays\n const edgeSchema = currentSchema.linkFields?.find((lf) => lf.path === ulf) as EnrichedLinkField;\n const edges = (isArray(block[ulf]) ? block[ulf] : [block[ulf]]) as EnrichedBQLMutationBlock[];\n //console.log('edges:', edges);\n\n //case 2.2 indirect edges\n if (edgeSchema.target === 'relation') {\n Object.entries(operationMap).forEach(([operation, opTypes]) => {\n const filteredEdges = edges.filter((edge) => opTypes.includes(edge.$op));\n\n filteredEdges.forEach((edge) => {\n const edgeMeta = oFilter(\n edge,\n (k: string | symbol) => isSymbol(k) || k.startsWith('$'),\n ) as EnrichedBQLMutationBlock;\n\n result.edges.push({\n ...edgeMeta,\n [edgeSchema.plays]: $bzId,\n $op: operation as BormOperation,\n });\n });\n });\n }\n // 3. INFERRED EDGES\n if (edgeSchema.target === 'role') {\n const arcOperationMap = {\n create: ['link', 'create'],\n delete: ['unlink', 'delete'],\n replace: ['replace'],\n };\n\n Object.entries(arcOperationMap).forEach(([operation, opTypes]) => {\n const filteredEdges = edges.filter((edge) => opTypes.includes(edge.$op));\n\n if (filteredEdges.length === 0) {\n return;\n }\n\n filteredEdges.forEach((edge) => {\n const arc = {\n //technically is a multi-arc\n $thing: edgeSchema.relation,\n $thingType: 'relation' as const,\n $bzId: `arc_${edge.$bzId}`,\n [edgeSchema.plays]: $bzId,\n [edgeSchema.oppositeLinkFieldsPlayedBy[0].plays]: edge.$bzId,\n $op: operation as BormOperation,\n };\n\n result.arcs.push(arc);\n });\n });\n }\n });\n }\n if (usedRefFields) {\n usedRefFields.forEach((urf) => {\n //const { contentType } = currentSchema.refFields[urf];\n //1 traverse them to push the nested items\n isArray(block[urf])\n ? block[urf].forEach((child: EnrichedBQLMutationBlock) =>\n traverse(child, { bzId: $bzId, edgeField: urf, tempId: $tempId }),\n )\n : traverse(block[urf], { bzId: $bzId, edgeField: urf, tempId: $tempId });\n\n //2 fill the arrays. We need this with refFields as well because in surrealdb we need to apply link operations at the end in case the order is incorrect\n const children = (isArray(block[urf]) ? block[urf] : [block[urf]]).filter(\n (x) => x !== null && x !== undefined,\n ) as EnrichedBQLMutationBlock[];\n\n const childMeta = oFilter(\n block,\n (k: string | symbol) => isSymbol(k) || k.startsWith('$'),\n ) as EnrichedBQLMutationBlock;\n\n const filteredChildren = children.map((child) =>\n child.$op ? `$⟨${child.$bzId}⟩` : parseValueSurrealDB(child, 'FLEX'),\n );\n\n if (filteredChildren.length > 0) {\n result.references.push({\n ...childMeta,\n [urf]: filteredChildren,\n $op: 'replace' as BormOperation, //Probably add / replace/ remove byt lets do only replaces for now\n });\n }\n });\n }\n };\n\n const treeItems = Array.isArray(tree) ? tree : [tree];\n treeItems.forEach((item) => traverse(item));\n\n //order by $Op, first unlink, then link\n const orderedEdges = [...result.edges].sort((a, b) => {\n const order = ['unlink', 'link'];\n return order.indexOf(a.$op) - order.indexOf(b.$op);\n });\n\n //console.log('tree:', JSON.stringify(tree, null, 2));\n //console.log('flat:', JSON.stringify(result, null, 2));\n\n return {\n ...result,\n edges: orderedEdges,\n };\n};\n","import { produce } from 'immer';\nimport { getSchemaByThing } from '../../../helpers';\nimport type {\n BQLMutationBlock,\n EnrichedBQLMutationBlock,\n EnrichedBormEntity,\n EnrichedBormRelation,\n EnrichedBormSchema,\n} from '../../../types';\n\n/**\n * Convert JSON attributes into strings.\n */\nexport const stringify = (\n blocks: BQLMutationBlock | BQLMutationBlock[],\n schema: EnrichedBormSchema,\n): EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[] => {\n const result = produce(blocks, (draft) => tObject(schema, draft));\n return 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 schema: EnrichedBormSchema,\n tree: Record<string, any> | string | (Record<string, any> | string)[],\n $thing?: string,\n) => {\n if (typeof tree === 'string') {\n // It's an id.\n return;\n }\n if (Array.isArray(tree)) {\n tree.forEach((i) => tObject(schema, i, $thing));\n return;\n }\n const thing = getSchemaByThing(schema, $thing || tree.$entity || tree.$relation || tree.$thing);\n Object.entries(tree).forEach(([k]) => {\n if (k.startsWith('$') || k.startsWith('%')) {\n return;\n }\n tField(schema, tree, k, thing);\n });\n};\n\nconst tField = (\n schema: EnrichedBormSchema,\n tree: Record<string, any>,\n key: string,\n thing: EnrichedBormEntity | EnrichedBormRelation,\n) => {\n const value = tree[key];\n if (!value) {\n // Not a JSON or a thing.\n return;\n }\n const dataField = thing.dataFields?.find((f) => f.path === key);\n if (dataField) {\n if (dataField.contentType === 'JSON') {\n if (value !== null && value !== undefined) {\n // eslint-disable-next-line no-param-reassign\n tree[key] = JSON.stringify(value);\n }\n }\n return;\n }\n const linkField = thing.linkFields?.find((f) => f.path === key);\n if (linkField) {\n const $thing = linkField.oppositeLinkFieldsPlayedBy[0]?.thing;\n tObject(schema, value, $thing);\n return;\n }\n\n const refField = 'refFields' in thing && thing.refFields[key];\n if (refField) {\n //We can't know its thing beforehand\n return;\n }\n\n if (thing.thingType === 'relation') {\n const role = thing.roles[key];\n // Assume a role can be played by only one thing.\n if (!role) {\n throw new Error(`[Schema] Role ${key} in ${thing.name} is not defined`);\n }\n const [oppositeThing] = role.playedBy || [];\n if (!oppositeThing) {\n throw new Error(`Role ${role.path} in ${thing} is not played by anything`);\n }\n tObject(schema, value, oppositeThing.thing);\n }\n};\n","import { isArray } from 'radash';\nimport { buildSuqlFilter, parseFilter } from '../../../adapters/surrealDB/filters/filters';\nimport { sanitizeNameSurrealDB } from '../../../adapters/surrealDB/helpers';\nimport { parseValueSurrealDB } from '../../../adapters/surrealDB/parsing/values';\nimport { getCurrentFields, getSchemaByThing, oFilter } from '../../../helpers';\nimport type { EnrichedBQLMutationBlock, EnrichedBormRelation, EnrichedBormSchema } from '../../../types';\nimport { Parent } from '../../../types/symbols';\nimport type { FlatBqlMutation } from '../bql/flatter';\n\nexport const buildSURQLMutation = async (flat: FlatBqlMutation, schema: EnrichedBormSchema) => {\n const buildThings = (block: EnrichedBQLMutationBlock) => {\n //console.log('currentThing:', block);\n const { $filter, $thing, $bzId, $op, $id, $tempId } = block;\n\n const currentSchema = getSchemaByThing(schema, $thing);\n const { usedDataFields } = getCurrentFields(currentSchema, block);\n const { idFields } = currentSchema;\n const idValue = $id || block[idFields[0]];\n\n const sanitizedThings = (isArray($thing) ? $thing : [$thing]).map(sanitizeNameSurrealDB);\n\n const meta = oFilter(block, (k: string) => k.startsWith('$'));\n const rest = oFilter(block, (k: string) => !k.startsWith('$'));\n const restString = JSON.stringify(rest);\n const metaString = Object.entries(meta)\n .map(([key, value]) => (key === '$tempId' ? `'$tempId': '_:${value}'` : `'${key}': '${value}'`)) //todo: At some point migrate tempIds so they only use _: when not explicit.\n .join(',');\n\n const parent = block[Parent as any]; //todo\n\n const dataFieldStrings = usedDataFields\n .filter((df) => !idFields.includes(df))\n .map((df) => {\n const dataFieldSchema = currentSchema.dataFields?.find((f) => f.path === df || f.dbPath === df);\n if (!dataFieldSchema) {\n throw new Error(`Data field schema not found for ${df}`);\n }\n const value = block[df];\n if (value === null) {\n return `${df} = NONE`;\n }\n return `${df} = ${parseValueSurrealDB(value, dataFieldSchema.contentType)}`;\n })\n .filter(Boolean);\n\n const VAR = `$⟨${$tempId || $bzId}⟩`;\n\n const COND = (() => {\n if (parent?.bzId) {\n return `array::flatten($⟨${parent.bzId}⟩.⟨${parent.edgeField}⟩ || []).filter(|$v| $v != NONE).len`;\n }\n if (idValue) {\n if (isArray(idValue)) {\n return sanitizedThings.flatMap((table: string) => idValue.map((id: string) => `${table}:⟨${id}⟩`)).join(', ');\n }\n return sanitizedThings.map((table: string) => `${table}:⟨${idValue}⟩`).join(', ');\n }\n return true; // no parent, no id value, then we can run the update or deletion safely\n })();\n\n const TARGET = (() => {\n //Non root\n if (parent?.bzId) {\n const parentRef = `array::flatten($⟨${parent.bzId}⟩.⟨${parent.edgeField}⟩ || []).filter(|$v| $v != NONE)`; //needed to fix an issue where deletions fail when finding none. If we want to thow an error on undefined this might be a good place\n\n if (idValue) {\n if (isArray(idValue)) {\n return `${parentRef}[? $this.id() IN [${idValue.map((id) => `'${id}'`).join(', ')}] ]`;\n }\n return `${parentRef}[? $this.id() IN ['${idValue}'] ]`;\n }\n return parentRef;\n }\n if (idValue) {\n if (isArray(idValue)) {\n return sanitizedThings.flatMap((table: string) => idValue.map((id: string) => `${table}:⟨${id}⟩`)).join(', ');\n }\n return sanitizedThings.map((table: string) => `${table}:⟨${idValue}⟩`).join(', ');\n }\n return sanitizedThings.join(', ');\n })();\n const WHERE = $filter ? `WHERE ${buildSuqlFilter(parseFilter($filter, $thing, schema))}` : '';\n const SET = dataFieldStrings.length > 0 ? `SET ${dataFieldStrings.join(', ')}` : '';\n\n const OUTPUT = `VALUE (CREATE ONLY Delta SET input = ${restString}, meta = {${metaString}, \"$sid\": $parent.id, \"$id\": record::id($parent.id)}, after = $after, before = $before RETURN VALUE $parent.id )`;\n const DELETE_OUTPUT = 'BEFORE';\n\n if (['link', 'unlink', 'replace'].includes($op)) {\n throw new Error(\"Edge ops don't belong to things\");\n }\n if (block.$op === 'match') {\n if ($tempId) {\n return ''; //tempIds are already stored on their creation\n }\n return `LET ${VAR} = (SELECT VALUE id FROM ${TARGET} ${WHERE});`;\n }\n if (block.$op === 'create') {\n if (isArray(idValue)) {\n throw new Error('Cannot create multiple things at once');\n }\n const tableName = sanitizeNameSurrealDB($thing);\n return `LET ${VAR} = (CREATE ONLY ${tableName}:⟨${idValue}⟩ ${SET} RETURN ${OUTPUT});`;\n }\n if (block.$op === 'update') {\n return `LET ${VAR} = IF (${COND}) THEN (UPDATE ${TARGET} ${SET} ${WHERE} RETURN ${OUTPUT}) END;`;\n }\n if (block.$op === 'delete') {\n return `LET ${VAR} = IF (${COND}) THEN (DELETE ${TARGET} ${WHERE} RETURN ${DELETE_OUTPUT}) END;`;\n }\n\n throw new Error(`Unsupported operation ${block.$op}`);\n };\n\n const buildEdges = (block: EnrichedBQLMutationBlock) => {\n //console.log('currentEdge:', block);\n const { $thing, $bzId, $op, $tempId } = block;\n const currentSchema = getSchemaByThing(schema, $thing);\n const { usedRoleFields } = getCurrentFields(currentSchema, block);\n\n const VAR = `$⟨${$tempId || $bzId}⟩`;\n\n const roleFields =\n 'roles' in currentSchema\n ? usedRoleFields.flatMap((rf) => {\n const roleFieldSchema = currentSchema.roles[rf];\n if (!roleFieldSchema) {\n throw new Error(`Role field schema not found for ${rf}`);\n }\n const { cardinality } = roleFieldSchema;\n const asArrayOfVars = isArray(block[rf])\n ? block[rf].map((node: string) => `$⟨${node}⟩`)\n : [`$⟨${block[rf]}⟩`];\n\n if (cardinality === 'ONE') {\n if (asArrayOfVars.length > 1) {\n //This is ok as long as only one is a match, but we can link to several in card ONE. This is practical if we don't know the $thing for instance, we can try multiple ones\n const arrayString = `array::filter(array::flatten([${asArrayOfVars}]), |$v| !!$v)`;\n switch ($op) {\n case 'link':\n case 'replace':\n return `${rf} = ((array::len(${arrayString})==1) && ${arrayString}[0]) || ${arrayString}`; //todo: throw a custom error instead\n case 'unlink':\n return `${rf} = NONE`; //todo this is not necessarily correct if $id or $filter! Should be none only if the node has been found\n default:\n throw new Error(`Unsupported operation ${$op} for ONE cardinality`);\n }\n }\n switch ($op) {\n case 'link':\n case 'replace':\n return `${rf} = ((type::is::array(${asArrayOfVars[0]}) && array::len(${asArrayOfVars[0]})==1) && ${asArrayOfVars[0]}[0]) || ${asArrayOfVars[0]}`;\n case 'unlink':\n return `${rf} = NONE`; //todo this is not necessarily correct if $id or $filter! Should be none only if the node has been found\n default:\n throw new Error(`Unsupported operation ${$op} for ONE cardinality`);\n }\n }\n if (cardinality === 'MANY') {\n const nodesString = `array::flatten([${asArrayOfVars}])`;\n switch ($op) {\n case 'link':\n return `${rf} += ${nodesString}`;\n case 'unlink':\n return `${rf} -= ${nodesString}`;\n case 'replace':\n return `${rf} = ${nodesString}`;\n default:\n throw new Error(`Unsupported operation ${$op} for MANY cardinality`);\n }\n }\n throw new Error(`Unsupported cardinality ${cardinality}`);\n })\n : [];\n\n const roleFieldsString = roleFields.length > 0 ? `${roleFields.join(', ')}` : '';\n const SET = roleFieldsString ? `SET ${roleFieldsString}` : '';\n\n return `IF ${VAR} THEN (UPDATE ${VAR} ${SET} RETURN VALUE id) END; ${VAR};`; //todo: confirm if the WHERE is actually needed here?\n };\n\n const buildArcs = (block: EnrichedBQLMutationBlock) => {\n const { $thing, $op } = block;\n const currentSchema = getSchemaByThing(schema, $thing) as EnrichedBormRelation;\n const tableName = sanitizeNameSurrealDB($thing);\n\n const { usedRoleFields } = getCurrentFields(currentSchema, block);\n\n if (!['create', 'delete'].includes($op)) {\n throw new Error('Arcs can only be created or deleted');\n }\n\n const [roleA, roleB] = usedRoleFields;\n const thingsA = (isArray(block[roleA]) ? block[roleA] : [block[roleA]]) as string[];\n const thingsB = (isArray(block[roleB]) ? block[roleB] : [block[roleB]]) as string[];\n\n if ($op === 'create') {\n if (usedRoleFields.length !== 2) {\n throw new Error('Not supported: Arcs must have exactly 2 roles');\n }\n const rest = oFilter(block, (k: string) => !k.startsWith('$'));\n const restString = JSON.stringify(rest);\n\n const OUTPUT = `(CREATE ONLY Delta SET input = ${restString}, meta = {\"$sid\": $parent.id, \"$id\": record::id($parent.id)}, after = $after, before = $before RETURN VALUE $parent.id )`;\n\n const roleOneSchema = currentSchema.roles[roleA];\n const isMany1 = roleOneSchema.cardinality === 'MANY';\n\n const roleTwoSchema = currentSchema.roles[roleB];\n const isMany2 = roleTwoSchema.cardinality === 'MANY';\n\n /*const thingsAString = thingsA.map((thingA) => `$⟨${thingA}⟩`).join(', ');\n\t\t\tconst thingsAArrayString = `array::flatten([${thingsAString}])`;\n\t\t\tconst thingsBString = thingsB.map((thingB) => `$⟨${thingB}⟩`).join(', ');\n\t\t\tconst thingsBArrayString = `array::flatten([${thingsBString}])`;\n*/\n /*\n\t\t\t//this is the third version, where we only create one arc per arc defined in the flatter function. Todo: Check cardinality and throw error if it is not correct instead of the || to trigger it internally\n\t\t\tconst arc = `CREATE ONLY ${tableName} SET\n\t\t\t\t\t${roleA} = ${isMany1 ? thingsAArrayString : `array::len(${thingsAArrayString}) == 1 && array::first(${thingsAArrayString}) || ${thingsAArrayString}`},\n\t\t\t\t\t${roleB} = ${isMany2 ? thingsBArrayString : `array::len(${thingsBArrayString}) == 1 && array::first(${thingsBArrayString}) || ${thingsBArrayString}`}\n\t\t\t`;\n\n\t\t\treturn arc; \n\t\t\t*/\n\n ///before it was multiple arcs, running a loop over thingsA and thingsB in addition to the surrealDB loop inside the surql\n const arcs = [\n ///This ignored cardinality and created N*M arcs. I keep it here as it could be an option in the mutation config in the future.\n\n //\n //\n `\n\t\t\t\t${!isMany1 ? `IF array::len(array::filter(array::flatten([$⟨${thingsA}⟩]), |$v| !!$v))>1 { THROW \"[Validation] Cardinality constraint: ${roleA} is cardinality one and can link a single thing.\" + <string>$⟨${thingsA}⟩; };` : ''}\n\t\t\t\t${!isMany2 ? `IF array::len(array::filter(array::flatten([$⟨${thingsB}⟩]), |$v| !!$v))>1 { THROW \"[Validation] Cardinality constraint: ${roleB} is cardinality one and can link a single thing.\" + <string>$⟨${thingsB}⟩; };` : ''}\n\t\t\t\tFOR $node1 IN array::flatten([$⟨${thingsA}⟩]) { \n\t\t\t\t\t\t\tIF $node1 {\n\t\t\t\t\t\t\t\tFOR $node2 IN array::flatten([$⟨${thingsB}⟩]) { \n\t\t\t\t\t\t\t\t\tIF $node2 {\n\t\t\t\t\t\t\t\t\t\tCREATE ONLY ${tableName} SET \n\t\t\t\t\t\t\t\t\t\t\t${roleA} = ${isMany1 ? 'array::flatten([$node1])' : '$node1'}, \n\t\t\t\t\t\t\t\t\t\t\t${roleB} = ${isMany2 ? 'array::flatten([$node2])' : '$node2'} \n\t\t\t\t\t\t\t\t\t\tRETURN ${OUTPUT}; \n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}`,\n ];\n\n ///This is the throw error version that checks the cardinality, if it is ugly but it works, it ain't ugly\n //\t`CREATE ONLY ${tableName} SET ${roleA} = ${isMany1 ? `fn::as_array($⟨${thingA}⟩)` : `array::len(fn::as_array($⟨${thingA}⟩)) == 1 && array::first(fn::as_array($⟨${thingA}⟩)) || $⟨${thingA}⟩`}, ${roleB} = ${isMany2 ? `fn::as_array($⟨${thingB}⟩)` : `array::len(fn::as_array($⟨${thingB}⟩)) == 1 && array::first(fn::as_array($⟨${thingB}⟩)) || $⟨${thingB}⟩`} RETURN ${OUTPUT};`,\n\n //console.log('arcs', arcs);\n return arcs;\n }\n\n if ($op === 'delete') {\n return `DELETE FROM ${tableName} WHERE fn::as_array(${roleA}) CONTAINSANY $⟨${thingsA}⟩ AND fn::as_array(${roleB}) CONTAINSANY $⟨${thingsB}⟩ RETURN BEFORE`;\n }\n };\n\n const buildReferences = (block: EnrichedBQLMutationBlock) => {\n const { $thing, $bzId, $op, $tempId } = block;\n const currentSchema = getSchemaByThing(schema, $thing);\n const { usedRefFields } = getCurrentFields(currentSchema, block);\n\n const VAR = `$⟨${$tempId || $bzId}⟩`;\n\n const refFields = usedRefFields.flatMap((rf) => {\n const refFieldSchema = currentSchema.refFields[rf];\n if (!refFieldSchema) {\n throw new Error(`ReferenceField schema not found for ${rf}`);\n }\n const { cardinality, contentType } = refFieldSchema;\n if (contentType === 'REF') {\n const asArrayOfVars = isArray(block[rf]) ? block[rf] : [`${block[rf]}`];\n\n if (cardinality === 'ONE') {\n if (asArrayOfVars.length > 1) {\n //This is ok as long as only one is a match, but we can link to several in card ONE. This is practical if we don't know the $thing for instance, we can try multiple ones\n const arrayString = `array::filter(array::flatten([${asArrayOfVars}]), |$v| !!$v)`;\n switch ($op) {\n case 'link':\n case 'replace':\n return `${rf} = ((array::len(${arrayString})==1) && ${arrayString}[0]) || ${arrayString}`; //todo: throw a custom error instead\n case 'unlink':\n return `${rf} = NONE`; //todo this is not necessarily correct if $id or $filter! Should be none only if the node has been found\n default:\n throw new Error(`Unsupported operation ${$op} for ONE cardinality`);\n }\n }\n switch ($op) {\n case 'link':\n case 'replace':\n return `${rf} = ((type::is::array(${asArrayOfVars[0]}) && array::len(${asArrayOfVars[0]})==1) && ${asArrayOfVars[0]}[0]) || ${asArrayOfVars[0]}`;\n case 'unlink':\n return `${rf} = NONE`; //todo this is not necessarily correct if $id or $filter! Should be none only if the node has been found\n default:\n throw new Error(`Unsupported operation ${$op} for ONE cardinality`);\n }\n }\n if (cardinality === 'MANY') {\n const nodesString = `array::flatten([${asArrayOfVars}])`;\n switch ($op) {\n case 'link':\n return `${rf} += ${nodesString}`;\n case 'unlink':\n return `${rf} -= ${nodesString}`;\n case 'replace':\n return `${rf} = ${nodesString}`;\n default:\n throw new Error(`Unsupported operation ${$op} for MANY cardinality`);\n }\n }\n throw new Error(`Unsupported cardinality ${cardinality}`);\n }\n if (contentType === 'FLEX') {\n //todo: card one check len 1\n //todo: add/remove etc\n return `${rf} = ${cardinality === 'ONE' ? `array::flatten([${block[rf]}])[0]` : `array::flatten([${block[rf]}])`}`;\n }\n });\n const refFieldsString = refFields.length > 0 ? `${refFields.join(', ')}` : '';\n const SET = refFieldsString ? `SET ${refFieldsString}` : '';\n\n return `IF ${VAR} THEN (UPDATE ${VAR} ${SET} RETURN VALUE id) END; ${VAR};`;\n };\n\n const result = [\n ...flat.things.map(buildThings),\n ...flat.edges.map(buildEdges),\n ...flat.arcs.flatMap(buildArcs),\n ...flat.references.map(buildReferences),\n ];\n //console.log('builtMutation', result);\n return result;\n};\n","import { isArray, isObject, mapEntries } from 'radash';\nimport { oFilter } from '../../../helpers';\nimport type { BormConfig, EnrichedBormSchema } from '../../../types';\n\nexport type EnrichedSURQLMutationRes = {\n meta: Record<string, any>;\n input?: Record<string, any>;\n after?: Record<string, any>;\n};\n\nexport const parseSURQLMutation = (props: {\n res: EnrichedSURQLMutationRes[][];\n schema: EnrichedBormSchema;\n config: BormConfig;\n}) => {\n const { res, config } = props;\n //console.log('res!', JSON.stringify(res, null, 2));\n\n const result = res\n .flat() //Todo: try to get it flat instead of [][]\n .filter(Boolean)\n .flatMap((b: object) => {\n if (isArray(b)) {\n return b.map((r) => {\n if (!isObject(r) || !('meta' in r)) {\n throw new Error(`Internal error: Invalid response from DB: ${JSON.stringify(r)}`);\n }\n return parseRes(r as EnrichedSURQLMutationRes, config);\n });\n }\n if (!isObject(b) || !('meta' in b)) {\n throw new Error(`Internal error: Invalid response from DB: ${JSON.stringify(b)}`);\n }\n return parseRes(b as EnrichedSURQLMutationRes, config);\n });\n return result;\n};\n\nconst parseRes = (block: EnrichedSURQLMutationRes, config: BormConfig) => {\n const thing = mapEntries(block.after || {}, (key, value) => [\n key,\n key === 'id' ? value.id : isArray(value) && value.length === 0 ? undefined : value,\n ]);\n\n const nulledAtts = oFilter(block.input || {}, (_k: string, v: any) => v === null);\n const withMetaAndId = { ...thing, ...block.meta, ...nulledAtts };\n\n if (!config.mutation?.noMetadata) {\n return withMetaAndId;\n }\n return oFilter(withMetaAndId, (k: string) => !k.startsWith('$'));\n};\n","import type { SimpleSurrealClient } from '../../../adapters/surrealDB/client';\nimport { logDebug } from '../../../logger';\nimport { VERSION } from '../../../version';\n\nexport const runSURQLMutation = async (client: SimpleSurrealClient, mutations: string[]): Promise<any[]> => {\n const batchedMutation = `\n\tBEGIN TRANSACTION;\n\t${mutations.join(';')};\n\tLET $DELTAS = SELECT * FROM Delta;\n\tDELETE Delta;\n\tRETURN $DELTAS;\n\n\tLET $LOGS = SELECT * FROM LOG;\n\tRETURN $LOGS;\n\tCOMMIT TRANSACTION; \n\t`;\n\n logDebug(`>>> batchedMutation[${VERSION}]`, JSON.stringify({ batchedMutation }));\n //console.log('mutations', mutations);\n //console.log('batchedMutation', batchedMutation);\n try {\n const result = await client.query(batchedMutation);\n return result.filter(Boolean);\n } catch (error) {\n const errorRes = await client.query_raw(batchedMutation);\n //console.log('errorRes!', JSON.stringify(errorRes, null, 2));\n const filteredErrorRes = errorRes.filter(\n (r) =>\n r.result !== 'The query was not executed due to a failed transaction' &&\n r.result !== 'There was an error when starting a new datastore transaction' &&\n r.status === 'ERR',\n );\n if (filteredErrorRes.length > 0) {\n throw new Error(`Error running SURQL mutation: ${JSON.stringify(filteredErrorRes)}`);\n }\n throw error;\n }\n};\n","import { isArray } from 'radash';\nimport type { SimpleSurrealClient } from '../../../adapters/surrealDB/client';\nimport { logDebug } from '../../../logger';\nimport type {\n BQLMutationBlock,\n BormConfig,\n DBHandles,\n EnrichedBQLMutationBlock,\n EnrichedBormSchema,\n} from '../../../types';\nimport { VERSION } from '../../../version';\nimport { createMachine, interpret, invoke, reduce, state, transition } from '../../../robot3'\nimport type { FlatBqlMutation } from '../bql/flatter';\nimport type { bqlMutationContext } from '../mutationMachine';\nimport { buildSURQLMutation } from './build';\nimport type { EnrichedSURQLMutationRes } from './parse';\nimport { parseSURQLMutation } from './parse';\nimport { runSURQLMutation } from './run';\n\ntype SurrealDbMachineContext = {\n bql: bqlMutationContext;\n surql: {\n mutations: string[];\n res: EnrichedSURQLMutationRes[][]; //todo maybe a flat versi\n };\n schema: EnrichedBormSchema;\n config: BormConfig;\n handles: DBHandles;\n error?: string | null;\n};\n\nconst updateBqlRes = (ctx: SurrealDbMachineContext, event: any) => {\n return {\n ...ctx,\n bql: { ...ctx.bql, res: event.data },\n };\n};\n\nconst updateSURQLMutation = (ctx: SurrealDbMachineContext, event: any) => {\n if (!event.data || !isArray(event.data) || event.data.some((d: any) => typeof d !== 'string')) {\n throw new Error('Invalid event data');\n }\n return {\n ...ctx,\n surql: {\n ...ctx.surql,\n mutations: event.data as string[],\n },\n };\n};\n\nconst updateSURQLRes = (ctx: SurrealDbMachineContext, event: any) => {\n if (!event.data || !isArray(event.data)) {\n throw new Error('Invalid event data');\n }\n return {\n ...ctx,\n surql: {\n ...ctx.surql,\n res: event.data as EnrichedSURQLMutationRes[][],\n },\n };\n};\n\nconst errorTransition = transition(\n 'error',\n 'error',\n reduce((ctx: SurrealDbMachineContext, event: any): SurrealDbMachineContext => {\n return {\n ...ctx,\n error: event.error,\n };\n }),\n);\n\nconst surrealDbMutationMachine = createMachine(\n 'buildMutation',\n {\n buildMutation: invoke(\n async (ctx: SurrealDbMachineContext) => {\n logDebug(`>>> surqlMachine/buildMutation[${VERSION}]`, JSON.stringify(ctx.bql.flat));\n return buildSURQLMutation(ctx.bql.flat, ctx.schema);\n },\n transition('done', 'runMutation', reduce(updateSURQLMutation)),\n errorTransition,\n ),\n runMutation: invoke(\n async (ctx: SurrealDbMachineContext) => {\n logDebug(`>>> surqlMachine/runMutation[${VERSION}]`, JSON.stringify(ctx.surql.mutations));\n return runSURQLMutation(\n ctx.handles.surrealDB?.get(ctx.handles.surrealDB?.keys().next().value as string)\n ?.client as SimpleSurrealClient,\n ctx.surql.mutations,\n );\n },\n transition('done', 'parseMutation', reduce(updateSURQLRes)),\n errorTransition,\n ),\n parseMutation: invoke(\n async (ctx: SurrealDbMachineContext) => {\n logDebug(`>>> surqlMachine/parseMutation[${VERSION}]`, JSON.stringify(ctx.surql.res));\n return parseSURQLMutation({ res: ctx.surql.res, config: ctx.config, schema: ctx.schema });\n },\n transition('done', 'success', reduce(updateBqlRes)),\n errorTransition,\n ),\n success: state(),\n error: state(),\n },\n (ctx: SurrealDbMachineContext) => ctx,\n);\n\nconst awaitMutationMachine = async (context: SurrealDbMachineContext) => {\n return new Promise<any[]>((resolve, reject) => {\n interpret(\n surrealDbMutationMachine,\n (service) => {\n if (service.machine.state.name === 'success') {\n resolve(service.context.bql.res);\n }\n if (service.machine.state.name === 'error') {\n reject(service.context.error);\n }\n },\n context,\n );\n });\n};\n\nexport const runSurrealDbMutationMachine = async (\n bqlRaw: BQLMutationBlock | BQLMutationBlock[],\n enrichedBql: EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[],\n bqlFlat: FlatBqlMutation,\n schema: EnrichedBormSchema,\n config: BormConfig,\n handles: DBHandles,\n) => {\n return awaitMutationMachine({\n bql: {\n raw: bqlRaw,\n enriched: enrichedBql,\n flat: bqlFlat,\n things: [],\n edges: [],\n res: [],\n },\n surql: {\n mutations: [],\n res: [],\n },\n schema: schema,\n config: config,\n handles: handles,\n error: null,\n });\n};\n","import { isDate } from 'radash';\n\nexport const parseFlexValTypeDB = (v: unknown) => {\n if (isDate(v)) {\n return { type: 'datetime', value: v.toISOString().replace('Z', '') };\n }\n if (typeof v === 'string') {\n return { type: 'string', value: `\"${v}\"` };\n }\n if (typeof v === 'number') {\n if (v % 1 !== 0) {\n return { type: 'double', value: v };\n }\n return { type: 'long', value: v };\n }\n if (typeof v === 'boolean') {\n return { type: 'boolean', value: v };\n }\n throw new Error(`Unsupported type ${typeof v}`);\n};\n","import { isArray, listify, mapEntries, shake } from 'radash';\n\nimport { parseFlexValTypeDB } from '../../../adapters/typeDB/parseFlexVal';\nimport { genId, getCurrentSchema, isBQLBlock } from '../../../helpers';\nimport type { EnrichedBQLMutationBlock, EnrichedBormSchema } from '../../../types';\nimport { EdgeType } from '../../../types/symbols';\n\nexport const buildTQLMutation = async (things: any[], edges: any[], schema: EnrichedBormSchema) => {\n if ((!things && !edges) || (!things.length && !edges.length)) {\n throw new Error('TQL request error, no things');\n }\n\n if (!schema) {\n throw new Error('No schema provided');\n }\n\n // todo: Split attributes and edges\n const nodeToTypeQL = (\n node: EnrichedBQLMutationBlock,\n ): {\n preDeletionBatch?: any[];\n deletionMatch?: string;\n insertionMatch?: string;\n deletion?: string;\n insertion?: string;\n op: string;\n } => {\n const op = node.$op as string;\n const bzId = `$${node.$bzId}`;\n const currentSchema = getCurrentSchema(schema, node);\n const { idFields, defaultDBConnector } = currentSchema;\n\n const thingDbPath = defaultDBConnector?.path || node.$thing;\n\n const idValue = node.$id;\n\n // todo: composite ids\n const idField = idFields?.[0];\n\n //@ts-expect-error - TODO\n const attributes = listify(node, (k, v) => {\n // @ts-expect-error - TODO description\n if (k.startsWith('$') || k.startsWith('%') || k === idField || v === undefined || v === null) {\n return '';\n }\n // if (k.startsWith('$') || !v) return '';\n const currentDataField = currentSchema.dataFields?.find((x) => x.path === k);\n const fieldDbPath = currentDataField?.path;\n\n if (!fieldDbPath) {\n // throw new Error('noFieldDbPath');\n return '';\n }\n const dbField = currentDataField.dbPath;\n\n if (['TEXT', 'ID', 'EMAIL', 'JSON'].includes(currentDataField.contentType)) {\n return `has ${dbField} '${v}'`;\n }\n if (['NUMBER', 'BOOLEAN'].includes(currentDataField.contentType)) {\n return `has ${dbField} ${v}`;\n }\n if (currentDataField.contentType === 'DATE') {\n if (Number.isNaN(v.valueOf())) {\n throw new Error('Invalid format, Nan Date');\n }\n if (v instanceof Date) {\n return `has ${dbField} ${v.toISOString().replace('Z', '')}`;\n }\n return `has ${dbField} ${new Date(v).toISOString().replace('Z', '')}`;\n }\n if (currentDataField.contentType === 'FLEX') {\n //ex: $color isa Color, has id 'testi', has Color·freeForAll $tempId; $tempId \"number\" isa Color·freeForAll, has longVal 7;\n const tempId = `bza${genId()}`;\n\n const parsedVal = isArray(v) ? v.map((v) => parseFlexValTypeDB(v)) : parseFlexValTypeDB(v);\n if (Array.isArray(parsedVal)) {\n throw new Error('Array in FLEX fields not supported yet');\n }\n return `has ${dbField} $${tempId}; $${tempId} '${tempId}' isa ${dbField}, has ${parsedVal.type}Attribute ${parsedVal.value}`;\n }\n throw new Error(`Unsupported contentType ${currentDataField.contentType}`);\n }).filter((x) => x);\n\n const attributesVar = `${bzId}-atts`;\n\n //@ts-expect-error - TODO\n const matchAttributes = listify(node, (k) => {\n // @ts-expect-error - TODO description\n if (k.startsWith('$') || k.startsWith('%') || k === idField) {\n return '';\n }\n // if (k.startsWith('$') || !v) return '';\n const currentDataField = currentSchema.dataFields?.find((x) => x.path === k);\n const fieldDbPath = currentDataField?.path;\n\n if (!fieldDbPath) {\n // throw new Error('noFieldDbPath');\n return '';\n }\n const dbField = currentDataField.dbPath;\n\n return `{${attributesVar} isa ${dbField};}`;\n }).filter((x) => x);\n\n const idValueTQL = isArray(idValue) ? `like '${idValue.join('|')}'` : `'${idValue}'`;\n const idAttributes = idValue // it must have id values, and they must be realDBIds\n ? // 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 [`has ${idField} ${idValueTQL}`]\n : [];\n\n const allAttributes = [...idAttributes, ...attributes].filter((x) => x).join(',');\n\n const getDeletionMatchInNodes = () => {\n // if (node.$tempId) return ''; /// commented because we need tempIds to work when replacing a unlink/link all operation\n // todo: ensure parents belong to grandparents. [https://github.com/Blitzapps/blitz/issues/9]\n if (op === 'delete' || op === 'unlink' || op === 'match') {\n return `${bzId} isa ${[thingDbPath, ...idAttributes].filter((x) => x).join(',')};`;\n }\n if (op === 'update') {\n if (!matchAttributes.length) {\n throw new Error('update without attributes');\n }\n return `${bzId} isa ${[thingDbPath, ...idAttributes].filter((x) => x).join(',')}, has ${attributesVar};\n ${matchAttributes.join(' or ')};`;\n }\n return '';\n };\n\n const getInsertionMatchInNodes = () => {\n // todo: ensure parents belong to grandparents. [https://github.com/Blitzapps/blitz/issues/9]\n // if (node.$tempId) return ''; /// same as getDeletionMatch\n if (op === 'update' || op === 'link' || op === 'match') {\n return `${bzId} isa ${[thingDbPath, ...idAttributes].filter((x) => x).join(',')};`;\n }\n return '';\n };\n\n if (isBQLBlock(node)) {\n return {\n op,\n deletionMatch: getDeletionMatchInNodes(),\n insertionMatch: getInsertionMatchInNodes(),\n insertion:\n op === 'create'\n ? `${bzId} isa ${[thingDbPath, allAttributes].filter((x) => x).join(',')};`\n : op === 'update' && attributes.length\n ? `${bzId} ${attributes.join(',')};`\n : '',\n deletion:\n op === 'delete'\n ? `${bzId} isa ${thingDbPath};`\n : op === 'update' && matchAttributes.length\n ? `${bzId} has ${attributesVar};`\n : '',\n };\n }\n\n throw new Error('in attributes');\n };\n\n const edgeToTypeQL = (\n node: EnrichedBQLMutationBlock,\n ): {\n preDeletionBatch?: any[];\n deletionMatch?: string;\n insertionMatch?: string;\n deletion?: string;\n insertion?: string;\n op: string;\n } => {\n const op = node.$op as string;\n const currentSchema = getCurrentSchema(schema, node);\n const bzId = `$${node.$bzId}`;\n const idValue = node.$id;\n\n const relationDbPath = currentSchema.defaultDBConnector?.path || node.$thing;\n\n const roleFields = 'roles' in currentSchema ? listify(currentSchema.roles, (k) => k) : [];\n\n const roleDbPaths =\n 'roles' in currentSchema\n ? mapEntries(currentSchema.roles, (k, v) => [k, v.dbConnector?.path || k])\n : ({} as { [k: string]: string });\n\n // 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 // 1) roleFields\n\n //@ts-expect-error - TODO\n const fromRoleFields = listify(node, (k: string, v) => {\n if (!roleFields.includes(k)) {\n return null;\n }\n if (!('roles' in currentSchema)) {\n throw new Error('This should have roles! ');\n }\n const roleDbPath = roleDbPaths[k];\n if (Array.isArray(v)) {\n return v.map((x) => ({ path: roleDbPath, id: x }));\n }\n return { path: roleDbPath, id: v };\n })\n .filter((x) => x)\n .flat();\n\n /// 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 const fromRoleFieldsTql = fromRoleFields.map((x) => {\n //@ts-expect-error - TODO\n if (!x?.path) {\n throw new Error('Object without path');\n }\n //@ts-expect-error - TODO\n return `${x.path}: $${x.id}`;\n });\n\n const roles = fromRoleFields.length > 0 ? `( ${fromRoleFieldsTql.join(' , ')} )` : '';\n const edgeType = node[EdgeType];\n\n if (!edgeType) {\n throw new Error('[internal error] Symbol edgeType not defined');\n }\n\n const relationTql = !roles\n ? ''\n : `${bzId} ${roles} ${\n edgeType === 'linkField' || op === 'delete' || op === 'unlink' ? `isa ${relationDbPath}` : ''\n }`;\n\n const relationTqlWithoutRoles = `${bzId} ${\n edgeType === 'linkField' || op === 'delete' ? `isa ${relationDbPath}` : ''\n }`;\n\n const getInsertionsInEdges = () => {\n if (!relationTql) {\n return '';\n }\n if (op === 'link') {\n return `${relationTql};`;\n }\n if (op === 'create') {\n return `${relationTql}, has id '${idValue}';`;\n }\n return '';\n };\n\n const getInsertionMatchInEdges = () => {\n if (!relationTql) {\n return '';\n }\n // if (op === 'link') return `${relationTql};`;\n // if (op === 'create') return `${relationTqlWithoutRoles};`;\n if (op === 'match') {\n return `${relationTql};`;\n }\n return '';\n };\n\n const getDeletionMatchInEdges = () => {\n if (!relationTql) {\n return '';\n }\n /// edge delete: we are removing an automatic relation\n if (op === 'delete') {\n return `${relationTql};`;\n }\n /// edge unlink means: We are editing a real relation's roles\n if (op === 'unlink') {\n /* 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 /// unlinking more than one role is not supported yet\n /// this got commented as the match brings what is needed but will probably need a refacto\n /// this is coded as generating a match block in [parseBQLmutation.ts], toEdges(edgeType1)\n // return `${bzId} ${roles} isa ${relationDbPath};`;\n //return `${relationTql};`; //!this fixes rep-del1 but breaks other tests, ideally should be added\n }\n if (op === 'match') {\n return `${relationTql};`;\n }\n return '';\n };\n\n const getDeletionsInEdges = () => {\n if (!relationTql) {\n return '';\n }\n // todo: same as insertions, better manage the ids here\n if (op === 'delete') {\n return `${relationTqlWithoutRoles};`;\n }\n if (op === 'unlink') {\n return `${bzId} ${roles};`;\n }\n // if (op === 'unlink') return `${bzId} ($roles-${node.$bzId}: $players-${node.$bzId});`;\n return '';\n };\n\n /* 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 return {\n // preDeletionBatch: getPreDeletionBatch(),\n deletionMatch: getDeletionMatchInEdges(),\n insertionMatch: getInsertionMatchInEdges(),\n deletion: getDeletionsInEdges(),\n insertion: getInsertionsInEdges(),\n op: '',\n };\n };\n\n const toTypeQL = (\n nodes: EnrichedBQLMutationBlock[] | EnrichedBQLMutationBlock,\n mode?: 'nodes' | 'edges',\n ):\n | {\n preDeletionBatch?: any[];\n insertionMatch?: string;\n deletionMatch?: string;\n insertion?: string;\n deletion?: string;\n }[]\n | {\n preDeletionBatch?: any[];\n insertionMatch?: string;\n deletionMatch?: string;\n insertion?: string;\n deletion?: string;\n } => {\n const typeQL = mode === 'edges' ? edgeToTypeQL : nodeToTypeQL;\n\n if (Array.isArray(nodes)) {\n return nodes\n .map((x) => {\n const { preDeletionBatch, insertionMatch, deletionMatch, insertion, deletion } = typeQL(x);\n return shake({ preDeletionBatch, insertionMatch, deletionMatch, insertion, deletion }, (z) => !z); /// ! WARNING: falsy values are removed (0, \"\", etc)\n })\n .filter((y) => y);\n }\n const { preDeletionBatch, insertionMatch, deletionMatch, insertion, deletion } = typeQL(nodes);\n\n return shake({ preDeletionBatch, insertionMatch, deletionMatch, insertion, deletion }, (z) => !z); /// ! WARNING: falsy values are removed (0, \"\", etc)\n };\n\n const nodeOperations = toTypeQL(things);\n const arrayNodeOperations = Array.isArray(nodeOperations) ? nodeOperations : [nodeOperations];\n const edgeOperations = toTypeQL(edges, 'edges');\n const arrayEdgeOperations = Array.isArray(edgeOperations) ? edgeOperations : [edgeOperations];\n const allOperations = [...arrayNodeOperations, ...arrayEdgeOperations];\n\n // todo: split BQL mutation in N DBstreams per DB\n // todo: then pack them per DB,\n\n const tqlMutation = shake(\n {\n // preDeletionBatch: allOperations.flatMap((x) => x.preDeletionBatch).filter((y) => y !== undefined),\n insertionMatches: allOperations\n .map((x) => x.insertionMatch)\n .join(' ')\n .trim(),\n deletionMatches: allOperations\n .map((x) => x.deletionMatch)\n .join(' ')\n .trim(),\n insertions: allOperations\n .map((x) => x.insertion)\n .join(' ')\n .trim(),\n deletions: allOperations\n .map((x) => x.deletion)\n .join(' ')\n .trim(),\n // ...(typeQLRelations?.length && { relations: typeQLRelations }),\n },\n (x) => !x,\n );\n\n return tqlMutation;\n};\n","import { clone } from 'radash';\n/* eslint-disable no-param-reassign */\nimport { getSchemaByThing } from '../../../helpers';\nimport type { BQLMutationBlock, BormConfig, EnrichedBormSchema } from '../../../types';\n\nexport type TqlRes = any;\n\nexport const parseTQLMutation = async (\n tqlRes: TqlRes,\n reqThings: any[],\n reqEdges: any[],\n schema: EnrichedBormSchema,\n config: BormConfig,\n) => {\n // todo: check if something weird happened\n const expected = [...reqThings, ...reqEdges];\n\n const parsed = expected\n .map((exp) => {\n //! reads all the insertions and gets the first match. This means each id must be unique\n // @ts-expect-error - TODO description\n const currentNode = tqlRes.insertions?.find((y) => y.get(`${exp.$bzId}`))?.get(`${exp.$bzId}`);\n const $thing = exp.$thing || exp.$relation || exp.$entity;\n const thing = $thing ? getSchemaByThing(schema, $thing) : undefined;\n\n if (exp.$op === 'create' || exp.$op === 'update' || exp.$op === 'link') {\n /// Creation and links should show an $error. Update on the other hand might not get here as typeDB does not return deleted thibgs.\n if (!(exp.$op === 'update') && !currentNode && exp.$id) {\n return { $id: exp.$id, $error: \"Does not exist or it's not linked to the parent\" }; //todo: Return with $error not found?\n }\n\n const dbIdd = currentNode?.asThing().iid;\n const props = Object.entries(exp)\n .filter(([k, _]) => !k.startsWith('$')) // Skip keys starting with '$'\n .reduce(\n (acc, [k, v]) => {\n ///Relations come with the $bzId in the roles instead of the $ids, lets replace them:\n const dataField = thing?.dataFields?.find((f) => f.path === k);\n if (dataField?.contentType === 'JSON') {\n acc[k] = JSON.parse(v as any);\n return acc;\n }\n if (exp.$thingType === 'relation') {\n const matchedThings = expected.filter((x) => x.$id && x.$bzId === v);\n /*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 acc[k] = matchedThings[0].$id;\n return acc;\n }\n acc[k] = v;\n return acc;\n }\n acc[k] = v;\n return acc;\n },\n {} as Record<string, any>,\n );\n\n if (config.mutation?.noMetadata) {\n return props;\n }\n\n /// We revert the cleaning of the tempId\n const tempId = exp.$tempId && !exp.$tempId.startsWith('_:') ? { $tempId: `_:${exp.$tempId}` } : {};\n // TODO: exp.path is undefined\n return { $dbId: dbIdd, ...exp, ...props, ...{ [exp.path]: exp.$id, ...tempId } } as BQLMutationBlock;\n }\n if (exp.$op === 'delete' || exp.$op === 'unlink') {\n // todo when typeDB confirms deletions, check them here\n return exp as BQLMutationBlock;\n }\n if (exp.$op === 'match') {\n return undefined;\n }\n throw new Error(`Unsupported op ${exp.$op}`);\n })\n .filter((z) => z);\n\n return clone(parsed);\n};\n","import { TransactionType } from 'typedb-driver';\nimport { getSessionOrOpenNewOne } from '../../../adapters/typeDB/helpers';\nimport type { BormConfig, DBHandles } from '../../../types';\n\nexport type TqlMutation = {\n deletions: string;\n deletionMatches: string;\n insertions: string;\n insertionMatches: string;\n};\n\nexport const runTQLMutation = async (tqlMutation: TqlMutation, dbHandles: DBHandles, config: BormConfig) => {\n if (!tqlMutation) {\n throw new Error('TQL request not built');\n }\n if (!((tqlMutation.deletions && tqlMutation.deletionMatches) || tqlMutation.insertions)) {\n throw new Error('TQL request error, no things');\n }\n\n const { session } = await getSessionOrOpenNewOne(dbHandles, config);\n const mutateTransaction = await session.transaction(TransactionType.WRITE);\n\n // deletes and pre-update deletes\n const tqlDeletion =\n tqlMutation.deletionMatches &&\n tqlMutation.deletions &&\n `match ${tqlMutation.deletionMatches} delete ${tqlMutation.deletions}`;\n\n // insertions and updates\n const tqlInsertion =\n tqlMutation.insertions &&\n `${tqlMutation.insertionMatches ? `match ${tqlMutation.insertionMatches}` : ''} insert ${tqlMutation.insertions}`;\n\n try {\n // does not receive a result\n if (tqlDeletion) {\n await mutateTransaction.query.delete(tqlDeletion);\n }\n\n const insertionsStream = tqlInsertion && mutateTransaction.query.insert(tqlInsertion);\n const insertionsRes = insertionsStream ? await insertionsStream.collect() : undefined;\n\n await mutateTransaction.commit();\n return { insertions: insertionsRes };\n } catch (e: any) {\n throw new Error(`Transaction failed: ${e.message}`);\n } finally {\n await mutateTransaction.close();\n }\n};\n","import type {\n BQLMutationBlock,\n BormConfig,\n DBHandles,\n EnrichedBQLMutationBlock,\n EnrichedBormSchema,\n} from '../../../types';\nimport { createMachine, interpret, invoke, reduce, state, transition } from '../../../robot3'\nimport type { bqlMutationContext } from '../mutationMachine';\nimport { buildTQLMutation } from './build';\nimport type { TqlRes } from './parse';\nimport { parseTQLMutation } from './parse';\nimport type { TqlMutation } from './run';\nimport { runTQLMutation } from './run';\n\ntype TypeDbMachineContext = {\n bql: bqlMutationContext;\n tql: {\n mutation?: TqlMutation;\n res?: TqlRes;\n };\n schema: EnrichedBormSchema;\n config: BormConfig;\n handles: DBHandles;\n error?: string | null;\n};\n\nconst updateBqlRes = (ctx: TypeDbMachineContext, event: any) => {\n return {\n ...ctx,\n bql: { ...ctx.bql, res: event.data },\n };\n};\n\nconst updateTQLMutation = (ctx: TypeDbMachineContext, event: any) => {\n return {\n ...ctx,\n tql: {\n ...ctx.tql,\n mutation: event.data,\n },\n };\n};\n\nconst updateTQLRes = (ctx: TypeDbMachineContext, event: any) => {\n return {\n ...ctx,\n tql: {\n ...ctx.tql,\n res: event.data,\n },\n };\n};\n\nconst errorTransition = transition(\n 'error',\n 'error',\n reduce((ctx: TypeDbMachineContext, event: any): TypeDbMachineContext => {\n return {\n ...ctx,\n error: event.error,\n };\n }),\n);\n\nexport const typeDbMutationMachine = createMachine(\n 'buildMutation',\n {\n buildMutation: invoke(\n async (ctx: TypeDbMachineContext) => buildTQLMutation(ctx.bql.things, ctx.bql.edges, ctx.schema),\n transition('done', 'runMutation', reduce(updateTQLMutation)),\n errorTransition,\n ),\n runMutation: invoke(\n async (ctx: TypeDbMachineContext) => runTQLMutation(ctx.tql.mutation as TqlMutation, ctx.handles, ctx.config),\n transition('done', 'parseMutation', reduce(updateTQLRes)),\n errorTransition,\n ),\n parseMutation: invoke(\n async (ctx: TypeDbMachineContext) =>\n parseTQLMutation(ctx.tql.res, ctx.bql.things, ctx.bql.edges, ctx.schema, ctx.config),\n transition('done', 'success', reduce(updateBqlRes)),\n errorTransition,\n ),\n success: state(),\n error: state(),\n },\n (ctx: TypeDbMachineContext) => ctx,\n);\n\nconst awaitMutationMachine = async (context: TypeDbMachineContext) => {\n return new Promise<any[]>((resolve, reject) => {\n interpret(\n typeDbMutationMachine,\n (service) => {\n if (service.machine.state.name === 'success') {\n resolve(service.context.bql.res);\n }\n if (service.machine.state.name === 'error') {\n reject(service.context.error);\n }\n },\n context,\n );\n });\n};\n\nexport const runTypeDbMutationMachine = async (\n bqRaw: BQLMutationBlock | BQLMutationBlock[],\n enrichedBql: EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[],\n things: unknown[],\n edges: unknown[],\n schema: EnrichedBormSchema,\n config: BormConfig,\n handles: DBHandles,\n) => {\n return awaitMutationMachine({\n bql: {\n raw: bqRaw,\n enriched: enrichedBql,\n things: things, //to unify at some point with the flat notation\n edges: edges,\n flat: {\n //this is the new version, used for surrealDB\n things: [],\n edges: [],\n arcs: [],\n references: [],\n },\n res: [],\n },\n tql: {},\n schema: schema,\n config: config,\n handles: handles,\n error: null,\n });\n};\n","import type {\n BQLMutation,\n BQLMutationBlock,\n BormConfig,\n DBHandles,\n EnrichedBQLMutationBlock,\n EnrichedBormSchema,\n} from '../../types';\nimport { enrichBQLMutation } from './bql/enrich';\nimport { parseBQLMutation } from './bql/parse';\nimport { mutationPreQuery } from './bql/preQuery';\n\nimport { logDebug } from '../../logger';\nimport { VERSION } from '../../version';\nimport { createMachine, guard, interpret, invoke, reduce, state, transition } from '../../robot3'\nimport { preHookDependencies } from './bql/enrichSteps/preHookDependencies';\nimport type { FlatBqlMutation } from './bql/flatter';\nimport { flattenBQLMutation } from './bql/flatter';\nimport { dependenciesGuard } from './bql/guards/dependenciesGuard';\nimport { stringify } from './bql/stringify';\nimport { runSurrealDbMutationMachine } from './surql/machine';\nimport { runTypeDbMutationMachine } from './tql/machine';\n\nconst final = state;\n\nexport type bqlMutationContext = {\n raw: BQLMutationBlock | BQLMutationBlock[];\n enriched: EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[];\n flat: FlatBqlMutation;\n things: any[];\n edges: any[];\n res: any[];\n};\n\ntype MachineContext = {\n bql: bqlMutationContext;\n schema: EnrichedBormSchema;\n config: BormConfig;\n handles: DBHandles;\n depthLevel: number;\n error: string | null;\n};\n\n// Reducer\n// ============================================================================\n\nconst updateBqlReq = (ctx: MachineContext, event: any) => {\n if (!event.data) {\n ///when preQueries return nothing, that should not affect the ctx\n return ctx;\n }\n return {\n ...ctx,\n bql: { ...ctx.bql, enriched: event.data },\n };\n};\n\nconst updateThingsEdges = (ctx: MachineContext, event: any) => {\n return {\n ...ctx,\n bql: {\n ...ctx.bql,\n things: event.data.mergedThings,\n edges: event.data.mergedEdges,\n },\n };\n};\n\nconst updateBQLFlat = (ctx: MachineContext, event: any) => {\n return {\n ...ctx,\n bql: {\n ...ctx.bql,\n flat: event.data || 'test',\n },\n };\n};\n\nconst updateBQLRes = (ctx: MachineContext, event: any) => {\n return {\n ...ctx,\n bql: {\n ...ctx.bql,\n res: event.data,\n },\n };\n};\n\n// Actors\n// ============================================================================\n\nconst enrich = async (ctx: MachineContext) => {\n logDebug(\n `>>> mutationMachine/enrich[${VERSION}]`,\n JSON.stringify(Object.keys(ctx.bql.enriched).length ? ctx.bql.enriched : ctx.bql.raw),\n );\n const enriched = Object.keys(ctx.bql.enriched).length\n ? enrichBQLMutation(ctx.bql.enriched, ctx.schema, ctx.config)\n : enrichBQLMutation(ctx.bql.raw, ctx.schema, ctx.config);\n return enriched;\n};\n\nconst preQuery = async (ctx: MachineContext) => {\n logDebug(`>>> mutationMachine/preQuery[${VERSION}]`, JSON.stringify(ctx.bql.enriched));\n return mutationPreQuery(ctx.bql.enriched, ctx.schema, ctx.config, ctx.handles);\n};\n\nconst preQueryDependencies = async (ctx: MachineContext) => {\n logDebug(`>>> mutationMachine/preQueryDependencies[${VERSION}]`, JSON.stringify(ctx.bql.enriched));\n return preHookDependencies(ctx.bql.enriched, ctx.schema, ctx.config, ctx.handles);\n};\n\nconst parseBQL = async (ctx: MachineContext) => {\n logDebug(`>>> mutationMachine/parseBQL[${VERSION}]`, JSON.stringify(ctx.bql.enriched));\n return parseBQLMutation(ctx.bql.enriched, ctx.schema);\n};\n\nconst flattenBQL = async (ctx: MachineContext) => {\n logDebug(`>>> mutationMachine/flattenBQL[${VERSION}]`, JSON.stringify(ctx.bql.enriched));\n return flattenBQLMutation(ctx.bql.enriched, ctx.schema);\n};\n\n// Guards\n// ============================================================================\nconst requiresPreQuery = (ctx: MachineContext) => {\n const { dbConnectors } = ctx.config;\n if (dbConnectors.length !== 1) {\n throw new Error('Multiple providers not supported yet in mutations');\n }\n const [{ provider }] = dbConnectors;\n\n if (provider === 'typeDB') {\n return true;\n }\n if (provider === 'surrealDB') {\n return false;\n }\n throw new Error(`Unsupported provider ${provider}.`);\n};\n\nconst requiresPreHookDependencies = (ctx: MachineContext) => {\n return dependenciesGuard(ctx.bql.enriched);\n};\n\n// Transitions\n// ============================================================================\n\nconst errorTransition = transition(\n 'error',\n 'error',\n reduce((ctx: MachineContext, event: any) => {\n return {\n ...ctx,\n error: event.error,\n };\n }),\n);\n\nexport const machine = createMachine(\n 'stringify',\n {\n stringify: invoke(\n async (ctx: MachineContext) => {\n logDebug(`>>> mutationMachine/stringify[${VERSION}]`, JSON.stringify(ctx.bql.raw));\n return stringify(ctx.bql.raw, ctx.schema);\n },\n transition('done', 'enrich', reduce(updateBqlReq)),\n errorTransition,\n ),\n enrich: invoke(\n enrich,\n transition('done', 'preQuery', guard(requiresPreQuery), reduce(updateBqlReq)),\n transition('done', 'parseBQL', reduce(updateBqlReq)),\n errorTransition,\n ),\n preQuery: invoke(\n preQuery,\n transition('done', 'preHookDependencies', guard(requiresPreHookDependencies), reduce(updateBqlReq)),\n transition('done', 'parseBQL', reduce(updateBqlReq)),\n errorTransition,\n ),\n preHookDependencies: invoke(\n preQueryDependencies,\n transition('done', 'enrich', reduce(updateBqlReq)),\n errorTransition,\n ),\n parseBQL: invoke(parseBQL, transition('done', 'flattenBQL', reduce(updateThingsEdges)), errorTransition),\n flattenBQL: invoke(flattenBQL, transition('done', 'adapter', reduce(updateBQLFlat)), errorTransition),\n adapter: invoke(\n async (ctx: MachineContext) => {\n logDebug(\n `>>> mutationMachine/adapter[${VERSION}]`,\n JSON.stringify({ enriched: ctx.bql.enriched, flat: ctx.bql.flat }),\n );\n //todo: do this properly with multiple providers\n const { dbConnectors } = ctx.config;\n if (dbConnectors.length !== 1) {\n throw new Error('Multiple providers not supported yet in mutations');\n }\n const [{ provider }] = dbConnectors;\n\n if (provider === 'typeDB') {\n return runTypeDbMutationMachine(\n ctx.bql.raw,\n ctx.bql.enriched,\n ctx.bql.things,\n ctx.bql.edges,\n ctx.schema,\n ctx.config,\n ctx.handles,\n );\n }\n if (provider === 'surrealDB') {\n //console.log('things!', ctx.bql.flat.things);\n //console.log('edges!', ctx.bql.flat.edges);\n return runSurrealDbMutationMachine(\n ctx.bql.raw,\n ctx.bql.enriched,\n ctx.bql.flat,\n ctx.schema,\n ctx.config,\n ctx.handles,\n );\n }\n throw new Error(`Unsupported provider ${provider}.`);\n },\n transition('done', 'success', reduce(updateBQLRes)),\n errorTransition,\n ),\n success: final(),\n error: final(),\n },\n (ctx: MachineContext) => ctx,\n);\n\nexport const awaitMachine = async (context: MachineContext) => {\n return new Promise<MachineContext>((resolve, reject) => {\n interpret(\n machine,\n (service) => {\n if (service.machine.state.name === 'success') {\n resolve(service.context);\n }\n if (service.machine.state.name === 'error') {\n reject(service.context);\n }\n },\n context,\n );\n });\n};\n\nexport const runMutationMachine = async (\n mutation: BQLMutation,\n schema: EnrichedBormSchema,\n config: BormConfig,\n handles: DBHandles,\n) => {\n return awaitMachine({\n bql: {\n raw: mutation,\n enriched: {} as EnrichedBQLMutationBlock | EnrichedBQLMutationBlock[],\n things: [],\n edges: [],\n flat: {\n things: [],\n edges: [],\n arcs: [],\n references: [],\n },\n res: [],\n },\n schema: schema as EnrichedBormSchema,\n config: config,\n handles: handles,\n depthLevel: 0,\n error: null,\n });\n};\n","import { tryit } from 'radash';\nimport { SessionType, TypeDB, TypeDBCredential } from 'typedb-driver';\n\nimport { enableMapSet } from 'immer';\nimport { SimpleSurrealClient } from './adapters/surrealDB/client';\nimport { defaultConfig } from './default.config';\nimport { bormDefine } from './define';\nimport { enrichSchema } from './enrichSchema';\nimport { runMutationMachine } from './stateMachine/mutation/mutationMachine';\nimport { runQueryMachine } from './stateMachine/query/queryMachine';\nimport type {\n AllDbHandles,\n BQLMutation,\n BQLResponse,\n BQLResponseMulti,\n BormConfig,\n BormSchema,\n DBHandles,\n EnrichedBormSchema,\n MutationConfig,\n QueryConfig,\n RawBQLQuery,\n} from './types';\n\nexport * from './types';\n\ntype BormProps = {\n schema: BormSchema;\n config: BormConfig;\n};\n\n/// Global config\n// immer\nenableMapSet();\n\nclass BormClient {\n private schema: BormSchema;\n private config: BormConfig;\n private initializing = false;\n private subscribers: ((err?: unknown) => void)[] = [];\n private initialized: { enrichedSchema: EnrichedBormSchema; dbHandles: DBHandles } | null = null;\n\n constructor({ schema, config }: BormProps) {\n this.schema = schema;\n this.config = config;\n }\n\n getDbHandles = () => this.initialized?.dbHandles;\n\n private getInitialized = async () => {\n if (this.initialized) {\n return this.initialized;\n }\n await this.init();\n if (this.initialized) {\n return this.initialized;\n }\n throw new Error('Client is not initialized');\n };\n\n init = async () => {\n if (this.initializing) {\n return new Promise<void>((resolve, reject) => {\n this.subscribers.push((err) => {\n if (err) {\n reject(err);\n } else {\n resolve();\n }\n });\n });\n }\n\n this.initializing = true;\n const dbHandles: AllDbHandles = { typeDB: new Map(), surrealDB: new Map() };\n\n try {\n await Promise.all(\n this.config.dbConnectors.map(async (dbc) => {\n if (dbc.provider === 'surrealDB') {\n const client = new SimpleSurrealClient({\n url: dbc.url,\n username: dbc.username,\n password: dbc.password,\n namespace: dbc.namespace,\n database: dbc.dbName,\n });\n // const pool = new SurrealPool({\n // \turl: dbc.url,\n // \tusername: dbc.username,\n // \tpassword: dbc.password,\n // \tnamespace: dbc.namespace,\n // \tdatabase: dbc.dbName,\n // \ttotalConnections: 8,\n // });\n dbHandles.surrealDB.set(dbc.id, { client, providerConfig: dbc.providerConfig });\n } else if (dbc.provider === 'typeDB' && dbc.dbName) {\n // const client = await TypeDB.coreClient(dbc.url);\n // const clientErr = undefined;\n const [clientErr, client] = await tryit(TypeDB.coreDriver)(dbc.url);\n if (clientErr) {\n const message = `[BORM:${dbc.provider}:${dbc.dbName}:core] ${\n // clientErr.messageTemplate?._messageBody() ?? \"Can't create TypeDB Client\"\n clientErr.message ?? \"Can't create TypeDB Client\"\n }`;\n throw new Error(message);\n }\n try {\n const session = await client.session(dbc.dbName, SessionType.DATA);\n dbHandles.typeDB.set(dbc.id, { client, session });\n } catch (sessionErr: any) {\n const message = `[BORM:${dbc.provider}:${dbc.dbName}:session] ${\n // eslint-disable-next-line no-underscore-dangle\n (sessionErr.messageTemplate?._messageBody() || sessionErr.message) ?? \"Can't create TypeDB Session\"\n }`;\n throw new Error(message);\n }\n } else if (dbc.provider === 'typeDBCluster' && dbc.dbName) {\n const credential = new TypeDBCredential(dbc.username, dbc.password, dbc.tlsRootCAPath);\n const [clientErr, client] = await tryit(TypeDB.cloudDriver)(dbc.addresses, credential);\n\n if (clientErr) {\n const message = `[BORM:${dbc.provider}:${dbc.dbName}:core] ${\n // clientErr.messageTemplate?._messageBody() ?? \"Can't create TypeDB Client\"\n clientErr.message ?? \"Can't create TypeDB Cluster Client\"\n }`;\n throw new Error(message);\n }\n try {\n const session = await client.session(dbc.dbName, SessionType.DATA);\n dbHandles.typeDB.set(dbc.id, { client, session });\n } catch (sessionErr: any) {\n const message = `[BORM:${dbc.provider}:${dbc.dbName}:session] ${\n // eslint-disable-next-line no-underscore-dangle\n (sessionErr.messageTemplate?._messageBody() || sessionErr.message) ?? \"Can't create TypeDB Session\"\n }`;\n throw new Error(message);\n }\n }\n }),\n );\n\n this.initialized = {\n enrichedSchema: enrichSchema(this.schema, dbHandles),\n dbHandles,\n };\n const subscribers = this.subscribers;\n this.subscribers = [];\n subscribers.forEach((s) => s());\n } catch (e) {\n const subscribers = this.subscribers;\n this.subscribers = [];\n subscribers.forEach((s) => s(e));\n } finally {\n this.initializing = false;\n }\n };\n\n introspect = async () => {\n return (await this.getInitialized()).enrichedSchema;\n };\n\n define = async () => {\n const initialized = await this.getInitialized();\n const schemas = await bormDefine(this.config, initialized.enrichedSchema, initialized.dbHandles);\n return schemas;\n };\n\n /// no types yet, but we can do \"as ...\" after getting the type fro the schema\n // query = async (query: RawBQLQuery | RawBQLQuery[], queryConfig?: QueryConfig) => {\n // \tconst handles = this.dbHandles;\n // \tif (!handles) {\n // \t\tthrow new Error('dbHandles undefined');\n // \t}\n\n // \tawait this.#enforceConnection();\n\n // \tconst qConfig = {\n // \t\t...this.config,\n // \t\tquery: { ...defaultConfig.query, ...this.config.query, ...queryConfig },\n // \t};\n\n // \t// @ts-expect-error type of Query is incorrect\n // \treturn queryPipeline(query, qConfig, this.schema, handles);\n // };\n\n query = async (query: RawBQLQuery | RawBQLQuery[], queryConfig?: QueryConfig) => {\n const initialized = await this.getInitialized();\n\n const qConfig = {\n ...this.config,\n query: {\n ...defaultConfig.query,\n ...this.config.query,\n ...queryConfig,\n },\n };\n const isBatched = Array.isArray(query);\n const queries = isBatched ? query : [query];\n\n const [errorRes, res] = await tryit(runQueryMachine)(\n queries,\n initialized.enrichedSchema,\n qConfig,\n initialized.dbHandles,\n );\n if (errorRes) {\n //@ts-expect-error - errorRes has error. Also no idea where the error: comes from\n const error = new Error(errorRes.error);\n //@ts-expect-error - errorRes has error. Also no idea where the error: comes from\n error.stack = errorRes.error.stack;\n throw error;\n }\n\n const result = res.bql.res as BQLResponse[];\n\n return isBatched ? result : result[0];\n };\n\n mutate = async (mutation: BQLMutation, mutationConfig?: MutationConfig) => {\n const initialized = await this.getInitialized();\n const mConfig = {\n ...this.config,\n mutation: {\n ...defaultConfig.mutation,\n ...this.config.mutation,\n ...mutationConfig,\n },\n };\n\n const [errorRes, res] = await tryit(runMutationMachine)(\n mutation,\n initialized.enrichedSchema,\n mConfig,\n initialized.dbHandles,\n );\n if (errorRes) {\n //@ts-expect-error - errorRes has error. Also no idea where the error: comes from\n const error = new Error(errorRes.error.message);\n //@ts-expect-error - errorRes has error. Also no idea where the error: comes from\n error.stack = errorRes.error.stack;\n throw error;\n }\n\n const result = res.bql.res;\n\n return result as BQLResponseMulti;\n };\n\n close = async () => {\n if (!this.initialized) {\n return;\n }\n //todo: probably migrate dbHandles to be an array, where each handle has .type=\"typeDB\" for instance\n try {\n await Promise.all(\n [...(this.initialized.dbHandles.typeDB?.values() ?? [])].map(async ({ client, session }) => {\n if (session.isOpen()) {\n await session.close();\n }\n await client.close();\n }),\n );\n // TODO: Close SurrealDB clients.\n } finally {\n this.initialized = null;\n }\n // Currently there's no `close()` method in the client.\n // See https://github.com/surrealdb/surrealdb.node/issues/36\n };\n}\n\nexport default BormClient;\n"]}