@blitznocode/blitz-orm 0.8.7 → 0.8.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -366,11 +366,11 @@ type BormEntity = {
366
366
  linkFields?: readonly LinkField[];
367
367
  hooks?: Hooks;
368
368
  } | {
369
- extends?: string;
370
369
  idFields: readonly string[];
371
370
  defaultDBConnector: DBConnector;
372
371
  dataFields?: readonly DataField[];
373
372
  linkFields?: readonly LinkField[];
373
+ hooks?: Hooks;
374
374
  };
375
375
  type BormRelation = BormEntity & {
376
376
  defaultDBConnector: DBConnector & {
@@ -391,14 +391,16 @@ type PreHook = {
391
391
  };
392
392
  actions: readonly Action[];
393
393
  };
394
- type Action = {
394
+ type Action = TransFormAction | ValidateAction;
395
+ type TransFormAction = {
396
+ type: 'transform';
397
+ fn: (currentNode: FilledBQLMutationBlock, parentNode?: FilledBQLMutationBlock) => Partial<FilledBQLMutationBlock>;
398
+ };
399
+ type ValidateAction = {
395
400
  type: 'validate';
396
401
  fn: (currentNode: FilledBQLMutationBlock, parentNode: FilledBQLMutationBlock) => boolean;
397
402
  severity: 'error' | 'warning' | 'info';
398
403
  message: string;
399
- } | {
400
- type: 'transform';
401
- fn: (currentNode: FilledBQLMutationBlock, parentNode?: FilledBQLMutationBlock) => Partial<FilledBQLMutationBlock>;
402
404
  };
403
405
 
404
406
  type ContentTypeToType<C extends keyof ContentTypeMapping> = ContentTypeMapping[C];
@@ -468,4 +470,4 @@ declare class BormClient {
468
470
  close: () => Promise<void>;
469
471
  }
470
472
 
471
- export { type Action, type BQLField, type BQLFieldObj, type BQLMutationBlock, type BQLResponse, type BQLResponseMulti, type BQLResponseSingle, type BormConfig, type BormEntity, type BormField, type BormMetadata, type BormOperation, type BormRelation, type BormSchema, type BormTrigger, type CardinalityType, type CommonProperties, type ContentType, type ContentTypeMapping, type DBConnector, type DBHandles, type DataField, type DataFilter, type EnrichedBormEntity, type EnrichedBormRelation, type EnrichedBormSchema, type EnrichedDataField, type EnrichedLinkField, type EnrichedRoleField, type FilledBQLMutationBlock, type Filter, type Hooks, type LinkField, type LinkFilter, type LinkedFieldWithThing, type MiddleFilter, type MutateConfig, type ParsedBQLMutation, type ParsedBQLQuery, type PreHook, type Provider, type ProviderObject, type QueryConfig, type RawBQLMutation, type RawBQLQuery, type RightType, type RoleField, type TQLEntityMutation, type TQLRequest, type ThingType, type TypeDBClusterProviderObject, type TypeDBHandles, type TypeDBProviderObject, type TypeGen, type WithBormMetadata, BormClient as default };
473
+ export { type Action, type BQLField, type BQLFieldObj, type BQLMutationBlock, type BQLResponse, type BQLResponseMulti, type BQLResponseSingle, type BormConfig, type BormEntity, type BormField, type BormMetadata, type BormOperation, type BormRelation, type BormSchema, type BormTrigger, type CardinalityType, type CommonProperties, type ContentType, type ContentTypeMapping, type DBConnector, type DBHandles, type DataField, type DataFilter, type EnrichedBormEntity, type EnrichedBormRelation, type EnrichedBormSchema, type EnrichedDataField, type EnrichedLinkField, type EnrichedRoleField, type FilledBQLMutationBlock, type Filter, type Hooks, type LinkField, type LinkFilter, type LinkedFieldWithThing, type MiddleFilter, type MutateConfig, type ParsedBQLMutation, type ParsedBQLQuery, type PreHook, type Provider, type ProviderObject, type QueryConfig, type RawBQLMutation, type RawBQLQuery, type RightType, type RoleField, type TQLEntityMutation, type TQLRequest, type ThingType, type TransFormAction, type TypeDBClusterProviderObject, type TypeDBHandles, type TypeDBProviderObject, type TypeGen, type ValidateAction, type WithBormMetadata, BormClient as default };
package/dist/index.d.ts CHANGED
@@ -366,11 +366,11 @@ type BormEntity = {
366
366
  linkFields?: readonly LinkField[];
367
367
  hooks?: Hooks;
368
368
  } | {
369
- extends?: string;
370
369
  idFields: readonly string[];
371
370
  defaultDBConnector: DBConnector;
372
371
  dataFields?: readonly DataField[];
373
372
  linkFields?: readonly LinkField[];
373
+ hooks?: Hooks;
374
374
  };
375
375
  type BormRelation = BormEntity & {
376
376
  defaultDBConnector: DBConnector & {
@@ -391,14 +391,16 @@ type PreHook = {
391
391
  };
392
392
  actions: readonly Action[];
393
393
  };
394
- type Action = {
394
+ type Action = TransFormAction | ValidateAction;
395
+ type TransFormAction = {
396
+ type: 'transform';
397
+ fn: (currentNode: FilledBQLMutationBlock, parentNode?: FilledBQLMutationBlock) => Partial<FilledBQLMutationBlock>;
398
+ };
399
+ type ValidateAction = {
395
400
  type: 'validate';
396
401
  fn: (currentNode: FilledBQLMutationBlock, parentNode: FilledBQLMutationBlock) => boolean;
397
402
  severity: 'error' | 'warning' | 'info';
398
403
  message: string;
399
- } | {
400
- type: 'transform';
401
- fn: (currentNode: FilledBQLMutationBlock, parentNode?: FilledBQLMutationBlock) => Partial<FilledBQLMutationBlock>;
402
404
  };
403
405
 
404
406
  type ContentTypeToType<C extends keyof ContentTypeMapping> = ContentTypeMapping[C];
@@ -468,4 +470,4 @@ declare class BormClient {
468
470
  close: () => Promise<void>;
469
471
  }
470
472
 
471
- export { type Action, type BQLField, type BQLFieldObj, type BQLMutationBlock, type BQLResponse, type BQLResponseMulti, type BQLResponseSingle, type BormConfig, type BormEntity, type BormField, type BormMetadata, type BormOperation, type BormRelation, type BormSchema, type BormTrigger, type CardinalityType, type CommonProperties, type ContentType, type ContentTypeMapping, type DBConnector, type DBHandles, type DataField, type DataFilter, type EnrichedBormEntity, type EnrichedBormRelation, type EnrichedBormSchema, type EnrichedDataField, type EnrichedLinkField, type EnrichedRoleField, type FilledBQLMutationBlock, type Filter, type Hooks, type LinkField, type LinkFilter, type LinkedFieldWithThing, type MiddleFilter, type MutateConfig, type ParsedBQLMutation, type ParsedBQLQuery, type PreHook, type Provider, type ProviderObject, type QueryConfig, type RawBQLMutation, type RawBQLQuery, type RightType, type RoleField, type TQLEntityMutation, type TQLRequest, type ThingType, type TypeDBClusterProviderObject, type TypeDBHandles, type TypeDBProviderObject, type TypeGen, type WithBormMetadata, BormClient as default };
473
+ export { type Action, type BQLField, type BQLFieldObj, type BQLMutationBlock, type BQLResponse, type BQLResponseMulti, type BQLResponseSingle, type BormConfig, type BormEntity, type BormField, type BormMetadata, type BormOperation, type BormRelation, type BormSchema, type BormTrigger, type CardinalityType, type CommonProperties, type ContentType, type ContentTypeMapping, type DBConnector, type DBHandles, type DataField, type DataFilter, type EnrichedBormEntity, type EnrichedBormRelation, type EnrichedBormSchema, type EnrichedDataField, type EnrichedLinkField, type EnrichedRoleField, type FilledBQLMutationBlock, type Filter, type Hooks, type LinkField, type LinkFilter, type LinkedFieldWithThing, type MiddleFilter, type MutateConfig, type ParsedBQLMutation, type ParsedBQLQuery, type PreHook, type Provider, type ProviderObject, type QueryConfig, type RawBQLMutation, type RawBQLQuery, type RightType, type RoleField, type TQLEntityMutation, type TQLRequest, type ThingType, type TransFormAction, type TypeDBClusterProviderObject, type TypeDBHandles, type TypeDBProviderObject, type TypeGen, type ValidateAction, type WithBormMetadata, BormClient as default };
package/dist/index.js CHANGED
@@ -6,60 +6,60 @@ var immer = require('immer');
6
6
  var objectTraversal = require('object-traversal');
7
7
  var uuid = require('uuid');
8
8
 
9
- var ke={query:{noMetadata:!1,simplifiedLinks:!0,debugger:!1,returnNulls:!1},mutation:{noMetadata:!1,preQuery:!0,ignoreNonexistingThings:!1}};var Nt=d=>{let r=[],l=new Map;return d.forEach(a=>{let{dbPath:F,contentType:f}=a,y=`${F}-${f}`;l.has(y)||(l.set(y,!0),r.push(a));}),r},De=async(d,r,l)=>{let F=(()=>{let c="",t=[];c+=`
10
- `,Object.keys(r.entities).forEach(w=>{let k=r.entities[w],{idFields:q,dataFields:b,linkFields:T,name:L}=k,h=[],S=[],$=[];if(k.extends){let g=r.entities[k.extends];g.dataFields&&g.dataFields.forEach(m=>{h.push(m.dbPath);}),g.linkFields&&g.linkFields.forEach(m=>{S.push(m.path);}),g.idFields&&g.idFields.forEach(m=>{$.push(m);});}c+=`${L} sub ${k.extends?k.extends:"entity"},
11
- `;let E=[];if(q&&q.length>0){let g=new Set(q),Q=Array.from(g).map(I=>`${I}`).join(", ");$.includes(Q)||(c+=` owns ${Q} @key,
12
- `,E.push(Q));}if(b&&b.length>0&&b.forEach(g=>{!h.includes(g.dbPath)&&!E.includes(g.dbPath)&&(c+=` owns ${g.dbPath},
13
- `),t.push({dbPath:g.dbPath,contentType:g.contentType});}),T&&T.length>0){let g=[];T.forEach(m=>{let{relation:Q,plays:I}=m;!S.includes(m.path)&&!g.includes(`${Q}:${I}`)&&(c+=` plays ${Q}:${I},
14
- `,g.push(`${Q}:${I}`));});}c=c.replace(/,\s*$/,`;
9
+ var It={query:{noMetadata:!1,simplifiedLinks:!0,debugger:!1,returnNulls:!1},mutation:{noMetadata:!1,preQuery:!0,ignoreNonexistingThings:!1}};var ve=f=>{let e=[],s=new Map;return f.forEach(a=>{let{dbPath:F,contentType:p}=a,h=`${F}-${p}`;s.has(h)||(s.set(h,!0),e.push(a));}),e},vt=async(f,e,s)=>{let F=(()=>{let c="",r=[];c+=`
10
+ `,Object.keys(e.entities).forEach(l=>{let T=e.entities[l],{idFields:A,dataFields:B,linkFields:M,name:k}=T,m=[],Q=[],$=[];if("extends"in T){let E=e.entities[T.extends];E.dataFields&&E.dataFields.forEach(y=>{m.push(y.dbPath);}),E.linkFields&&E.linkFields.forEach(y=>{Q.push(y.path);}),E.idFields&&E.idFields.forEach(y=>{$.push(y);});}c+=`${k} sub ${"extends"in T?T.extends:"entity"},
11
+ `;let I=[];if(A&&A.length>0){let E=new Set(A),L=Array.from(E).map(O=>`${O}`).join(", ");$.includes(L)||(c+=` owns ${L} @key,
12
+ `,I.push(L));}if(B&&B.length>0&&B.forEach(E=>{!m.includes(E.dbPath)&&!I.includes(E.dbPath)&&(c+=` owns ${E.dbPath},
13
+ `),r.push({dbPath:E.dbPath,contentType:E.contentType});}),M&&M.length>0){let E=[];M.forEach(y=>{let{relation:L,plays:O}=y;!Q.includes(y.path)&&!E.includes(`${L}:${O}`)&&(c+=` plays ${L}:${O},
14
+ `,E.push(`${L}:${O}`));});}c=c.replace(/,\s*$/,`;
15
15
  `),c+=`
16
- `;}),Object.keys(r.relations).forEach(w=>{let k=r.relations[w],{idFields:q,dataFields:b,roles:T,name:L,linkFields:h}=k,S=[],$=[],E=[],g=[];if(k.extends){let Q=r.relations[k.extends];Q.dataFields&&Q.dataFields.forEach(I=>{S.push(I.dbPath);}),Q.linkFields&&Q.linkFields.forEach(I=>{$.push(I.dbPath);}),Q.roles&&Object.values(Q.roles).forEach(O=>{E.push(O.name);}),Q.idFields&&Q.idFields.forEach(I=>{g.push(I);});}c+=`${L} sub ${k.extends?k.extends:"relation"},
17
- `;let m=[];if(q&&q.length>0){let Q=new Set(q),O=Array.from(Q).map(j=>`${j}`).join(", ");g.includes(O)||(c+=` owns ${O} @key,
18
- `,m.push(O));}if(b&&b.length>0&&b.forEach(Q=>{!S.includes(Q.dbPath)&&!m.includes(Q.dbPath)&&(c+=` owns ${Q.dbPath},
19
- `),t.push({dbPath:Q.dbPath,contentType:Q.contentType});}),T&&Object.keys(T).forEach(Q=>{E.includes(Q)||(c+=` relates ${Q},
20
- `);}),h&&h.length>0){let Q=[];h.forEach(I=>{let{plays:O}=I;!$.includes(I.path)&&!Q.includes(`${k}:${O}`)&&(c+=` plays ${I.relation}:${O},
21
- `,Q.push(`${k}:${O}`));});}c=c.replace(/,\s*$/,`;
16
+ `;}),Object.keys(e.relations).forEach(l=>{let T=e.relations[l],{idFields:A,dataFields:B,roles:M,name:k,linkFields:m}=T,Q=[],$=[],I=[],E=[];if("extends"in T){let L=e.relations[T.extends];L.dataFields&&L.dataFields.forEach(O=>{Q.push(O.dbPath);}),L.linkFields&&L.linkFields.forEach(O=>{$.push(O.dbPath);}),L.roles&&Object.values(L.roles).forEach(S=>{I.push(S.name);}),L.idFields&&L.idFields.forEach(O=>{E.push(O);});}c+=`${k} sub ${"extends"in T?T.extends:"relation"},
17
+ `;let y=[];if(A&&A.length>0){let L=new Set(A),S=Array.from(L).map(D=>`${D}`).join(", ");E.includes(S)||(c+=` owns ${S} @key,
18
+ `,y.push(S));}if(B&&B.length>0&&B.forEach(L=>{!Q.includes(L.dbPath)&&!y.includes(L.dbPath)&&(c+=` owns ${L.dbPath},
19
+ `),r.push({dbPath:L.dbPath,contentType:L.contentType});}),M&&Object.keys(M).forEach(L=>{I.includes(L)||(c+=` relates ${L},
20
+ `);}),m&&m.length>0){let L=[];m.forEach(O=>{let{plays:S}=O;!$.includes(O.path)&&!L.includes(`${T}:${S}`)&&(c+=` plays ${O.relation}:${S},
21
+ `,L.push(`${T}:${S}`));});}c=c.replace(/,\s*$/,`;
22
22
  `),c+=`
23
- `;});let o=`define
23
+ `;});let b=`define
24
24
 
25
- `;return Nt(t).forEach(w=>{o+=`${w.dbPath} sub attribute,
26
- `,w.contentType==="TEXT"||w.contentType==="ID"?o+=` value string;
27
- `:w.contentType==="EMAIL"?(o+=` value string,
28
- `,o+=` regex '^(?=.{1,64}@)[A-Za-z0-9_-]+(\\.[A-Za-z0-9_-]+)*@[^-][A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)*(\\.[A-Za-z]{2,})$';
29
- `):w.contentType==="DATE"?o+=` value datetime;
30
- `:w.contentType==="BOOLEAN"?o+=` value boolean;
31
- `:w.contentType==="NUMBER"&&(o+=` value long;
32
- `);}),`${o}
25
+ `;return ve(r).forEach(l=>{b+=`${l.dbPath} sub attribute,
26
+ `,l.contentType==="TEXT"||l.contentType==="ID"?b+=` value string;
27
+ `:l.contentType==="EMAIL"?(b+=` value string,
28
+ `,b+=` regex '^(?=.{1,64}@)[A-Za-z0-9_-]+(\\.[A-Za-z0-9_-]+)*@[^-][A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)*(\\.[A-Za-z]{2,})$';
29
+ `):l.contentType==="DATE"?b+=` value datetime;
30
+ `:l.contentType==="BOOLEAN"?b+=` value boolean;
31
+ `:l.contentType==="NUMBER"&&(b+=` value long;
32
+ `);}),`${b}
33
33
 
34
- ${c}`})(),f=d.dbConnectors[0].id,y=l.typeDB.get(f)?.session,B=l.typeDB.get(f)?.client;if(!y){console.log("Session Status: ","NO SESSION");return}await y.close();let[{dbName:M}]=d.dbConnectors;await(await B.databases.get(M)).delete(),await B.databases.create(M);let e=await B.session(d.dbConnectors[0].dbName,typedbDriver.SessionType.SCHEMA),s=await e.transaction(typedbDriver.TransactionType.WRITE);await s.query.define(F),await s.commit(),await s.close();let u=await e.transaction(typedbDriver.TransactionType.READ);(await(await u.query.match("match $a sub thing;")).collect()).forEach(async c=>{c.get("a");}),await u.close();};var ve=(d,r,l)=>l?r:`${d}\xB7${r}`;var pe=(d,r)=>Object.values(Object.fromEntries(Object.entries(d).filter(([l,a])=>r(l,a))))[0],ce=(d,r)=>Object.fromEntries(Object.entries(d).filter(([l,a])=>r(l,a))),ze=d=>{let r=[],l=immer.produce(d,F=>objectTraversal.traverse(F,({key:f,value:y,meta:B})=>{if(B.depth===2&&(f&&(y.dataFields=y.dataFields?.map(M=>({...M,cardinality:M.cardinality||"ONE",dbPath:ve(f,M.path,M.shared)}))),y.extends)){let M=F.entities[y.extends]||F.relations[y.extends];if(y.allExtends=[y.extends,...M.allExtends||[]],y.idFields=M.idFields?(y.idFields||[]).concat(M.idFields):y.idFields,y.dataFields=M.dataFields?(y.dataFields||[]).concat(M.dataFields.map(R=>{let e=y.extends,s=d.entities[e]||d.relations[e];for(;!s.dataFields?.find(u=>u.path===R.path);)e=s.extends,s=d.entities[e]||d.relations[e];return {...R,dbPath:ve(e,R.path,R.shared)}})):y.dataFields,y.linkFields=M.linkFields?(y.linkFields||[]).concat(M.linkFields):y.linkFields,"roles"in M){let R=y,e=M;R.roles=R.roles||{},R.roles={...R.roles,...e.roles},Object.keys(R.roles).length===0&&(R.roles={});}}},{traversalType:"breadth-first"}));return objectTraversal.traverse(d,({key:F,value:f,meta:y})=>{if(F==="linkFields"){let M=(()=>{if(!y.nodePath)throw new Error("No path");let[e,s]=y.nodePath.split(".");return {thing:s,thingType:e==="entities"?"entity":e==="relations"?"relation":""}})(),R=Array.isArray(f)?f.map(e=>({...e,...M})):[{...f,...M}];r.push(...R);}}),immer.produce(l,F=>objectTraversal.traverse(F,({value:f,key:y,meta:B})=>{if(B.depth===2&&f.idFields&&!f.id){f.name=y;let M=()=>{if(B.nodePath?.split(".")[0]==="entities")return "entity";if(B.nodePath?.split(".")[0]==="relations")return "relation";throw new Error("Unsupported node attributes")};f.thingType=M(),f.computedFields=[],f.virtualFields=[],f.requiredFields=[],f.enumFields=[],f.fnValidatedFields=[],"roles"in f&&Object.entries(f.roles).forEach(([e,s])=>{s.playedBy=r.filter(u=>u.relation===y&&u.plays===e)||[],s.name=e;}),"linkFields"in f&&f.linkFields&&f.linkFields?.forEach(e=>{if(e.target==="relation"){e.oppositeLinkFieldsPlayedBy=[{plays:e.path,thing:e.relation,thingType:"relation"}];return}let s=r.filter(n=>n.relation===e.relation&&n.plays!==e.plays)||[];e.oppositeLinkFieldsPlayedBy=s;let{filter:u}=e;e.oppositeLinkFieldsPlayedBy=e.oppositeLinkFieldsPlayedBy.filter(n=>n.target==="role"),u&&Array.isArray(u)&&(e.oppositeLinkFieldsPlayedBy=e.oppositeLinkFieldsPlayedBy.filter(n=>u.some(p=>n.thing===p.$role)),e.oppositeLinkFieldsPlayedBy=e.oppositeLinkFieldsPlayedBy.filter(n=>u.some(p=>n.thing===p.$thing))),u&&!Array.isArray(u)&&(e.oppositeLinkFieldsPlayedBy=e.oppositeLinkFieldsPlayedBy.filter(n=>n.$role===u.$role),e.oppositeLinkFieldsPlayedBy=e.oppositeLinkFieldsPlayedBy.filter(n=>n.thing===u.$thing));});}if(typeof f=="object"&&"playedBy"in f){if([...new Set(f.playedBy?.map(M=>M.thing))].length>1)throw new Error(`Unsupported: roleFields can be only played by one thing. Role: ${y} path:${B.nodePath}`);if(f.playedBy.length===0)throw new Error(`Unsupported: roleFields should be played at least by one thing. Role: ${y}, path:${B.nodePath}`)}if(B.depth===4){let[M,R]=B.nodePath?.split(".")||[],e=F[M][R];f.validations&&(f.validations.required&&e.requiredFields.push(f.path),f.validations.enum&&e.enumFields.push(f.path),f.validations.fn&&e.fnValidatedFields.push(f.path)),f.default?f.isVirtual?e.virtualFields.push(f.path):e.computedFields.push(f.path):f.isVirtual&&e.virtualFields.push(f.path);}}))},Se=(d,r,l)=>{let a=N(d,r),F=a.linkFields?.find(B=>B.path===l);if(F)return F.cardinality;let f=a.dataFields?.find(B=>B.path===l);if(f)return f.cardinality;let y=a.roles[l];if(y)return y.cardinality},N=(d,r)=>{if(r.$thing){if(!r.$thingType)throw new Error("Missing $thingType in node$: {JSON.stringify(node, null, 2)");if(r.$thingType==="entity"){if(!(r.$thing in d.entities))throw new Error(`Missing entity '${r.$thing}' in the schema`);return d.entities[r.$thing]}if(r.$thingType==="relation"){if(!(r.$thing in d.relations))throw new Error(`Missing relation '${r.$thing}' in the schema`);return d.relations[r.$thing]}throw new Error(`Wrong schema or query for ${JSON.stringify(r,null,2)}`)}if(r.$entity){if(!(r.$entity in d.entities))throw new Error(`Missing entity '${r.$entity}' in the schema`);return d.entities[r.$entity]}if(r.$relation){if(!(r.$relation in d.relations))throw new Error(`Missing relation '${r.$relation}' in the schema`);return d.relations[r.$relation]}throw new Error(`Wrong schema or query for ${JSON.stringify(r,null,2)}`)},G=(d,r)=>{let l=d.dataFields?.map(p=>p.path)||[],a=d.linkFields?.map(p=>p.path)||[],F="roles"in d?radash.listify(d.roles,p=>p):[],f=[...l||[],...a||[],...F||[]],B=[...["$entity","$op","$id","$tempId","$bzId","$relation","$parentKey","$filter","$fields","$excludedFields"],...f];if(!r)return {fields:f,dataFields:l,roleFields:F,linkFields:a};let M=r.$fields?r.$fields.map(p=>{if(typeof p=="string")return p;if("$path"in p&&typeof p.$path=="string")return p.$path;throw new Error(" Wrongly structured query")}):radash.listify(r,p=>p),R=r.$filter?radash.listify(r.$filter,p=>p.toString().startsWith("$")?void 0:p.toString()).filter(p=>p&&l?.includes(p)):[],e=r.$filter?radash.listify(r.$filter,p=>p.toString().startsWith("$")?void 0:p.toString()).filter(p=>p&&[...F||[],...a||[]].includes(p)):[],s=[...M,...R].filter(p=>!B.includes(p)).filter(p=>p),u=r.$filter?ce(r.$filter,(p,i)=>R.includes(p)):{},n=r.$filter?ce(r.$filter,(p,i)=>e.includes(p)):{};return {fields:f,dataFields:l,roleFields:F,linkFields:a,usedFields:M,usedLinkFields:a.filter(p=>M.includes(p)),usedRoleFields:F.filter(p=>M.includes(p)),unidentifiedFields:s,...R.length?{localFilters:u}:{},...e.length?{nestedFilters:n}:{}}};var _e=d=>{if(typeof d!="string")throw new Error("capitalizeFirstLetter: string is not a string");return d.charAt(0).toUpperCase()+d.slice(1).toLowerCase()},Ve=(d,r,l)=>{let F=(l.nodePath||"").split("."),f=radash.isArray(r)?F.slice(0,-2).join("."):F.slice(0,-1).join(".");return r?objectTraversal.getNodeByPath(d,f):{}};var We=async(d,r)=>{let{bqlRequest:l,config:a,tqlRequest:F}=d,{rawTqlRes:f}=r;if(l){if(!f)throw new Error("TQL query not executed")}else throw new Error("BQL request not parsed");let{query:y}=l;if(!y){if(f.insertions?.length===0&&!F?.deletions){r.bqlRes={};return}let{mutation:B}=l;if(!B)throw new Error("TQL mutation not executed");let R=[...B.things,...B.edges].map(e=>{let s=f.insertions?.find(u=>u.get(`${e.$bzId}`))?.get(`${e.$bzId}`);if(e.$op==="create"||e.$op==="update"||e.$op==="link"){let u=s?.asThing().iid;return a.mutation?.noMetadata?radash.mapEntries(e,(n,p)=>[n.toString().startsWith("$")?Symbol.for(n):n,p]):{$dbId:u,...e,[e.path]:e.$id}}if(e.$op==="delete"||e.$op==="unlink")return e;if(e.$op!=="match")throw new Error(`Unsupported op ${e.$op}`)}).filter(e=>e);r.bqlRes=R;return}};var Vt=(d,r)=>immer.produce(d,l=>objectTraversal.traverse(l,({value:a})=>{if(Array.isArray(a)||typeof a!="object"||a===null)return;a.$tempId&&(a.$tempId=`_:${a.$tempId}`),a.$fields&&delete a.$fields,a.$filter&&delete a.$filter,a.$show&&delete a.$show,a.$bzId&&delete a.$bzId,r.query?.noMetadata&&(a.$entity||a.$relation)&&(delete a.$entity,delete a.$relation,delete a.$id),Object.getOwnPropertySymbols(a).forEach(f=>{delete a[f];}),a.$excludedFields&&(a.$excludedFields.forEach(f=>{delete a[f];}),delete a.$excludedFields);})),Wt=(d,r)=>{let l={};return r.forEach(a=>{l[a.$bzId]=a.$id;}),d.forEach(a=>{Object.keys(a).forEach(F=>{l[a[F]]&&F!=="$tempId"&&(a[F]=l[a[F]]);});}),d},Ht=(d,r)=>{let l=r.map(F=>F.$bzId),a=!1;return d.forEach(F=>{Object.keys(F).forEach(f=>{l.includes(F[f])&&(a=!0);});}),a},He=async(d,r)=>{let{bqlRequest:l,config:a}=d;if(!l)throw new Error("BQL request not parsed");let F=r.bqlRes[0]?r.bqlRes:[r.bqlRes],f=d.bqlRequest?.mutation?.things;if(Ht(F,f)){let M=Wt(F,f);r.bqlRes=M[1]?M:M[0];}let B=Vt(r.bqlRes,a);r.bqlRes=B;};var Ue=async d=>{let{bqlRequest:r,schema:l}=d;if(!r)throw new Error("BQL request not parsed");let{mutation:a}=r;if(!a)throw new Error("BQL request is not a mutation");let F=n=>{let p=n.$op,i=`$${n.$bzId}`,c=N(l,n),{idFields:t,defaultDBConnector:o}=c,P=o?.path||n.$entity||n.$relation,w=n.$id,k=t?.[0],q=radash.listify(n,(m,Q)=>{if(m.startsWith("$")||m===k||Q===void 0||Q===null)return "";let I=c.dataFields?.find(D=>D.path===m);if(!I?.path)return "";let j=I.dbPath;if(["TEXT","ID","EMAIL"].includes(I.contentType))return `has ${j} '${Q}'`;if(["NUMBER","BOOLEAN"].includes(I.contentType))return `has ${j} ${Q}`;if(I.contentType==="DATE"){if(Number.isNaN(Q.valueOf()))throw new Error("Invalid format, Nan Date");return Q instanceof Date?`has ${j} ${Q.toISOString().replace("Z","")}`:`has ${j} ${new Date(Q).toISOString().replace("Z","")}`}throw new Error(`Unsupported contentType ${I.contentType}`)}).filter(m=>m),b=`${i}-atts`,T=radash.listify(n,m=>{if(m.startsWith("$")||m===k)return "";let Q=c.dataFields?.find(j=>j.path===m);if(!Q?.path)return "";let O=Q.dbPath;return `{${b} isa ${O};}`}).filter(m=>m),L=n[Symbol.for("isLocalId")],h=radash.isArray(w)?`like '${w.join("|")}'`:`'${w}'`,S=!L&&w?[`has ${k} ${h}`]:[],$=[...S,...q].filter(m=>m).join(","),E=()=>{if(p==="delete"||p==="unlink"||p==="match")return `${i} isa ${[P,...S].filter(m=>m).join(",")};`;if(p==="update"){if(!T.length)throw new Error("update without attributes");return `${i} isa ${[P,...S].filter(m=>m).join(",")}, has ${b};
35
- ${T.join(" or ")};`}return ""},g=()=>p==="update"||p==="link"||p==="match"?`${i} isa ${[P,...S].filter(m=>m).join(",")};`:"";if(n.$entity||n.$relation)return {op:p,deletionMatch:E(),insertionMatch:g(),insertion:p==="create"?`${i} isa ${[P,$].filter(m=>m).join(",")};`:p==="update"&&q.length?`${i} ${q.join(",")};`:"",deletion:p==="delete"?`${i} isa ${P};`:p==="update"&&T.length?`${i} has ${b};`:""};throw new Error("in attributes")},f=n=>{let p=n.$op,i=N(l,n),c=`$${n.$bzId}`,t=n.$id,o=i.defaultDBConnector?.path||n.$relation,P="roles"in i?radash.listify(i.roles,m=>m):[],w=n.$relation&&"roles"in i&&radash.mapEntries(i.roles,(m,Q)=>[m,Q.dbConnector?.path||m]),k=radash.listify(n,(m,Q)=>{if(!P.includes(m))return null;if(!("roles"in i))throw new Error("This should have roles! ");let I=w[m];return Array.isArray(Q)?Q.map(O=>({path:I,id:O})):{path:I,id:Q}}).filter(m=>m).flat(),q=k.map(m=>{if(!m?.path)throw new Error("Object without path");return `${m.path}: $${m.id}`}),b=k.length>0?`( ${q.join(" , ")} )`:"",T=n[Symbol.for("edgeType")];if(!T)throw new Error("[internal error] Symbol edgeType not defined");let L=b?`${c} ${b} ${T==="linkField"||p==="delete"||p==="unlink"?`isa ${o}`:""}`:"",h=`${c} ${T==="linkField"||p==="delete"?`isa ${o}`:""}`,S=()=>L?p==="link"?`${L};`:p==="create"?`${L}, has id '${t}';`:"":"",$=()=>L&&p==="match"?`${L};`:"",E=()=>L?p==="delete"?`${L};`:p==="match"?`${L};`:"":"",g=()=>L?p==="delete"?`${h};`:p==="unlink"?`${c} ${b};`:"":"";return {deletionMatch:E(),insertionMatch:$(),deletion:g(),insertion:S(),op:""}},y=(n,p)=>{let i=p==="edges"?f:F;if(Array.isArray(n))return n.map(k=>{let{preDeletionBatch:q,insertionMatch:b,deletionMatch:T,insertion:L,deletion:h}=i(k);return radash.shake({preDeletionBatch:q,insertionMatch:b,deletionMatch:T,insertion:L,deletion:h},S=>!S)}).filter(k=>k);let{preDeletionBatch:c,insertionMatch:t,deletionMatch:o,insertion:P,deletion:w}=i(n);return radash.shake({preDeletionBatch:c,insertionMatch:t,deletionMatch:o,insertion:P,deletion:w},k=>!k)},B=y(a.things),M=Array.isArray(B)?B:[B],R=y(a.edges,"edges"),e=Array.isArray(R)?R:[R],s=[...M,...e],u=radash.shake({insertionMatches:s.map(n=>n.insertionMatch).join(" ").trim(),deletionMatches:s.map(n=>n.deletionMatch).join(" ").trim(),insertions:s.map(n=>n.insertion).join(" ").trim(),deletions:s.map(n=>n.deletion).join(" ").trim()},n=>!n);d.tqlRequest=u;};var Jt=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm,Zt=/(\s*async\s*|\s*function\s*|\s*\(\s*|\s*\)\s*=>|\s*\)\s*\{)/,Ke=d=>{let l=d.toString().replace(Jt,"").trim().split("=>")[0].split("{")[0].replace(Zt,"").trim(),a=l.substring(l.indexOf("(")+1,l.lastIndexOf(")")).trim();return a?(a.match(/(\{[^}]*\}|[^,]+)/g)||[]).flatMap(f=>f.includes("{")&&f.includes("}")?(f.replace(/^\{|\}$/g,"").match(/(?:[^,"']+|"[^"]*"|'[^']*')+/g)||[]).map(B=>B.split(":")[0].trim().replace(/['"[\]]/g,"")):f.trim()).filter(Boolean):[]};var X=({currentThing:d,fieldSchema:r,mandatoryDependencies:l=!1})=>{if(!r||!r.default||!("fn"in r.default||"value"in r.default))throw new Error(`[Internal] Virtual field: No field schema found, or wrongly configured. Field: ${JSON.stringify(r,null,3)}`);if(r.default.type==="value")return r.default.value;if(l){let{fn:F}=r.default,y=Ke(F).filter(B=>!(B in d));if(y.length)throw new Error(`Virtual field: Missing arguments ${y.join(", ")}`)}return "default"in r?r.default?.fn(d):void 0},Je=()=>{};var ti=d=>{if(!d.startsWith("_:"))throw new Error("ID must start with '_:'.");let r=d.substring(2);if(!/^[a-zA-Z0-9-_]+$/.test(r))throw new Error("$tempId must contain only alphanumeric characters, hyphens, and underscores.");if(d.length>36)throw new Error("$tempId must not be longer than 36 characters.");return r},Ye=async d=>{let{rawBqlRequest:r,schema:l}=d,F=(s=>immer.produce(s,u=>objectTraversal.traverse(u,({value:n,key:p,parent:i})=>{if(radash.isObject(n)&&(n=radash.shake(n,c=>c===void 0)),p==="$tempId"&&(i[p]=ti(n)),i&&radash.isArray(n)){if(!n.some(t=>typeof t=="object"&&"$id"in t))return;let c=n.flatMap(t=>typeof t=="string"?t:typeof t=="object"&&"$id"in t&&radash.isArray(t.$id)?t.$id.map(o=>({...t,$id:o})):t);i[p]=c;}})))(r),y=(s=>immer.produce(s,u=>objectTraversal.traverse(u,({value:n,meta:p,key:i})=>{if(radash.isObject(n)){if(n.$arrayOp)throw new Error("Array op not supported yet");if(i==="$filter"||p.nodePath?.includes(".$filter."))return;let c=n;if(c.$op==="create"&&c.$id)throw new Error("Can't write to computed field $id. Try writing to the id field directly.");let t=N(l,c),P=Object.keys(c).filter($=>t.virtualFields?.includes($));if(P.length>0){let $=P.filter(E=>c[E]);if($.length>0)throw new Error(`Can't set virtual fields: ["${$.join('","')}"]`)}let k=p.nodePath?.split(".")?.filter($=>Number.isNaN(parseInt($,10))).join(".");if(!t)throw new Error(`Schema not found for ${c.$entity||c.$relation}`);c.$bzId=c.$tempId??`T_${uuid.v4()}`,c[Symbol.for("schema")]=t,c[Symbol.for("dbId")]=t.defaultDBConnector.id;let{usedLinkFields:q,usedRoleFields:b}=G(t,c),T=q.map($=>({fieldType:"linkField",path:$,schema:t.linkFields.find(E=>E.path===$)})),L=t.thingType==="relation"?b.map($=>({fieldType:"roleField",path:$,schema:pe(t.roles,E=>E===$)})):[];if(T.some($=>$.schema?.target==="role")&&T.some($=>$.schema?.target==="relation"))throw new Error("Unsupported: Can't use a link field with target === 'role' and another with target === 'relation' in the same mutation.");let h=L.filter($=>[...new Set($.schema.playedBy?.map(E=>E.thing))].length!==1);if(h.length>1)throw new Error(`Field: ${h[0].path} - If a role can be played by multiple things, you must specify the thing in the mutation: ${JSON.stringify(h[0].schema.playedBy)}. Schema: ${JSON.stringify(h[0].schema)}`);let S=p.nodePath;if([...T,...L].forEach($=>{let E=c[$.path];if(E===void 0)return;let g=$.schema;if(!g)throw new Error(`Field ${$.path} not found in schema`);let m=$.fieldType==="roleField"?g?.playedBy[0]:g,I=g&&"relation"in g&&m?.relation===c.$relation?"$self":m?.relation?m?.relation:"$self",O=I==="$self"?t:l.relations[I];if(pe(O.roles,(v,A)=>v===$.path)?.playedBy?.length===0)throw new Error(`unused role: ${S}.${$.path}`);if(!g)throw new Error(`Field ${$.path} not found in schema`);let D=$.fieldType==="linkField"?g?.oppositeLinkFieldsPlayedBy:g?.playedBy;if(!D)throw new Error(`No opposite fields found for ${JSON.stringify(g)}`);if([...new Set(D?.map(v=>v.thing))].length>1)throw new Error(`Field: ${$.path} - If a role can be played by multiple things, you must specify the thing in the mutation: ${JSON.stringify(D)}. Schema: ${JSON.stringify(g)}`);if(g.cardinality==="ONE"&&Array.isArray(E))throw new Error("Can't have an array in a cardinality === ONE link field");if(g.cardinality==="MANY"&&E!==null&&!Array.isArray(E)&&!E.$arrayOp)throw new Error(`${$.fieldType==="linkField"?g.path:g.name} is a cardinality === MANY thing. Use an array or a $arrayOp object`);if(E?.$entity||E?.$relation)return;let[z]=D,J="plays"in g?"linkField":"roleField",K={[`$${z.thingType}`]:z.thing,[Symbol.for("relation")]:I,[Symbol.for("edgeType")]:J,[Symbol.for("parent")]:{path:S,...c.$id?{$id:c.$id}:{},...c.$tempId?{$tempId:c.$tempId}:{},...c.filter?{filter:c.filter}:{},links:D},[Symbol.for("role")]:z.plays,[Symbol.for("oppositeRole")]:"plays"in g?g.plays:void 0,[Symbol.for("relFieldSchema")]:g};if(radash.isObject(E)&&(c[$.path]={...K,...E}),Array.isArray(E))if(E.every(v=>radash.isObject(v)))c[$.path]=E.map(v=>({...K,...v}));else if(E.every(v=>typeof v=="string"))c[$.path]=E.map(v=>({...K,$op:c.$op==="create"?"link":"replace",$id:v}));else throw new Error(`Invalid array value for ${$.path}`);if(typeof E=="string"&&(c[$.path]={...K,$op:c.$op==="create"?"link":"replace",$id:E}),E===null){let v={...K,$op:"unlink"};c[$.path]=g.cardinality==="MANY"?[v]:v;}}),!k&&!c.$entity&&!c.$relation)throw new Error("Root things must specify $entity or $relation")}})))(F),M=(s=>immer.produce(s,u=>objectTraversal.traverse(u,({parent:n,key:p,value:i,meta:c})=>{if(radash.isObject(i)){if(Object.keys(i).length===0)throw new Error("Empty object!");if(p==="$filter"||c.nodePath?.includes(".$filter."))return;let t=i,o=c.nodePath?.split(".");if(t.$tempId&&!(t.$op===void 0||t.$op==="link"||t.$op==="create"||t.$op==="update"))throw new Error(`Invalid op ${t.$op} for tempId. TempIds can be created, or when created in another part of the same mutation. In the future maybe we can use them to catch stuff in the DB as well and group them under the same tempId.`);let P=o?.filter(I=>Number.isNaN(parseInt(I,10))).join("."),w=P?Array.isArray(n)?o?.slice(0,-1).join("."):c.nodePath:c.nodePath||"",k=N(l,t),{dataFields:q,roleFields:b,linkFields:T}=G(k,t),L=immer.current(t)[Symbol.for("parent")],h=P&&L.path,$=(h?objectTraversal.getNodeByPath(u,h):u)?.$op;if(P&&!$)throw new Error("Error: Parent $op not detected");let E=t[Symbol.for("relFieldSchema")];t.$op==="replace"&&$==="create"&&(t.$op="link");let g=Object.keys(t).some(I=>q?.includes(I)),m=Object.keys(t).some(I=>[...b,...T].includes(I)),Q=()=>{if(t.$op)return t.$op;if(P&&!t.$id&&!t.$tempId&&$!=="create"&&E.cardinality==="ONE")throw new Error(`Please specify if it is a create or an update. Path: ${c.nodePath}`);if(t.$tempId)return "create";if((t.$id||t.$filter)&&g)return "update";if((t.$id||t.$filter)&&P&&!g&&!m)return "link";if(!t.$filter&&!t.$id&&!t.$tempId)return "create";if((t.$id||t.$filter)&&!g&&m)return "match";throw new Error("Wrong op")};if(t.$op||(t.$op=Q()),n||(t.$parentKey=""),typeof n=="object"&&(Array.isArray(n)&&(t[Symbol.for("index")]=p),t[Symbol.for("path")]=w,t[Symbol.for("isRoot")]=!P,t[Symbol.for("depth")]=P?.split(".").length),!t.$entity&&!t.$relation)throw new Error(`Node ${JSON.stringify(t)} without $entity/$relation`)}})))(y),e=(s=>immer.produce(s,u=>objectTraversal.traverse(u,({value:n})=>{if(radash.isObject(n)){let p=n,i=N(l,p),{unidentifiedFields:c}=G(i,p),{idFields:t}=i;if(!t)throw new Error("No idFields found");let[o]=t;if(p.$op==="create"&&!p[o]){let P=i.dataFields?.find(k=>k.path===o),w=X({currentThing:p,fieldSchema:P,mandatoryDependencies:!0});if(typeof w!="string")throw new Error(`Default id field ${o} is not a string`);p[o]=w,p.$id=w;}if(c.length>0)throw new Error(`Unknown fields: [${c.join(",")}] in ${JSON.stringify(p)}`)}})))(M);d.filledBqlRequest=e;};var tt=async d=>{let{filledBqlRequest:r,schema:l}=d,a=e=>{let s=[],u=[],n=t=>{if(t.$id)return t.$id;let o=N(l,t),{idFields:P}=o;if(!P)throw new Error(`no idFields: ${JSON.stringify(t)}`);let[w]=P;if(!w)throw new Error(`no idField: ${JSON.stringify(t)}`);let k=o.dataFields?.find(T=>T.path===w),q=X({currentThing:t,fieldSchema:k,mandatoryDependencies:!0}),b=t[w]||t.$id||q;if(!b)throw new Error(`no idValue: ${JSON.stringify(t)}`);return b},p=t=>{if(t.$op==="create"){let o=n(t);if(s.find(P=>P.$id===o))throw new Error(`Duplicate id ${o} for node ${JSON.stringify(t)}`);if(u.find(P=>P.$bzId===t.$bzId))throw new Error(`Duplicate $bzid ${t.$bzId} for node ${JSON.stringify(t)}`);s.push({...t,$id:o});return}t.$tempId&&t.$op==="match"||s.push(t);},i=t=>{if(t.$op==="create"){let o=n(t);if(s.find(P=>P.$id===o),u.find(P=>P.$bzId===t.$bzId))throw new Error(`Duplicate %bzId ${t.$bzIdd} for edge ${JSON.stringify(t)}`);u.push({...t,$id:o});return}u.push(t);};return objectTraversal.traverse(e,({value:t})=>{if(!radash.isObject(t))return;let o=t;if(o.$entity||o.$relation){if(!o.$op)throw new Error(`Operation should be defined at this step ${JSON.stringify(o)}`);if(!o.$bzId)throw new Error("[internal error] BzId not found");let P=N(l,o),{dataFields:w,roleFields:k,linkFields:q,usedFields:b}=G(P,o),T=()=>{if(o.$op==="create"||o.$op==="delete")return o.$op;if(o.$op==="update"){let h=b.filter(E=>w?.includes(E)),S=b.filter(E=>k?.includes(E)),$=b.filter(E=>q?.includes(E));if(h.length>0)return "update";if(S.length>0||$.length>0)return "match";throw new Error(`No fields on an $op:"update" for node ${JSON.stringify(o)}`)}return "match"},L={...o.$entity&&{$entity:o.$entity},...o.$relation&&{$relation:o.$relation},...o.$id&&{$id:o.$id},...o.$tempId&&{$tempId:o.$tempId},...o.$filter&&{$filter:o.$filter},...radash.shake(radash.pick(o,w||[""])),$op:T(),$bzId:o.$bzId,[Symbol.for("dbId")]:P.defaultDBConnector.id,[Symbol.for("path")]:o[Symbol.for("path")],[Symbol.for("parent")]:o[Symbol.for("parent")],[Symbol.for("isRoot")]:o[Symbol.for("isRoot")],[Symbol.for("isLocalId")]:o[Symbol.for("isLocalId")]||!1};if(p(L),o[Symbol.for("relation")]&&o[Symbol.for("edgeType")]==="linkField"){if((o.$op==="link"||o.$op==="unlink")&&(o.$id||o.$filter)){if(o.$tempId)throw new Error("can't specify a existing and a new element at once. Use an id/filter or a tempId");s.push({...o,$op:"match"});}let h=o[Symbol.for("relation")]===o.$relation,S=h?o.$bzId:`LT_${uuid.v4()}`,E=o[Symbol.for("parent")].path,m=(E?objectTraversal.getNodeByPath(e,E):e).$bzId;if(!m)throw new Error("No parent id found");if(o[Symbol.for("relation")]==="$self")return;let Q=()=>{if(o.$op==="delete")return h?"match":"delete";if(o.$op==="unlink")return h?"unlink":"delete";if(o.$op==="link"||o.$op==="create")return h?"link":"create";if(o.$op==="replace")throw new Error("Unsupported: Nested replaces not implemented yet");return "match"},I={$relation:o[Symbol.for("relation")],$bzId:S,...o.$tempId?{$tempId:o.$tempId}:{},$op:Q(),...h?{}:{[o[Symbol.for("role")]]:o.$bzId},[o[Symbol.for("oppositeRole")]]:m,[Symbol.for("dbId")]:l.relations[o[Symbol.for("relation")]].defaultDBConnector.id,[Symbol.for("edgeType")]:"linkField",[Symbol.for("info")]:"normal linkField",[Symbol.for("path")]:o[Symbol.for("path")],[Symbol.for("parent")]:o[Symbol.for("parent")]};i(I),(o.$op==="unlink"||Q()==="unlink")&&h&&i({$relation:o[Symbol.for("relation")],$bzId:S,$op:"match",[o[Symbol.for("oppositeRole")]]:m,[Symbol.for("dbId")]:l.relations[o[Symbol.for("relation")]].defaultDBConnector.id,[Symbol.for("edgeType")]:"linkField",[Symbol.for("info")]:"additional ownrelation unlink linkField",[Symbol.for("path")]:o[Symbol.for("path")],[Symbol.for("parent")]:o[Symbol.for("parent")]});}if(o.$relation){let h=ce(o,(E,g)=>k.includes(E)),S=radash.mapEntries(h,(E,g)=>radash.isArray(g)?[E,g]:radash.isObject(g)?[E,g.$bzId]:[E,g]),$=ce(t,(E,g)=>E.startsWith("$")||E.startsWith("Symbol"));if(Object.keys(h).filter(E=>!E.startsWith("$")).length>0){if(o.$op==="create"||o.$op==="delete"){let E=()=>{if(o.$op==="create")return "link";if(o.$op==="delete")return "match";throw new Error("Unsupported parent of edge op")},g=radash.mapEntries(S,(Q,I)=>Array.isArray(I)?[Q,I.map(O=>O.$bzId||O)]:[Q,I.$bzId||I]),m={...$,$relation:o.$relation,$op:E(),...g,$bzId:o.$bzId,[Symbol.for("path")]:o[Symbol.for("path")],[Symbol.for("dbId")]:P.defaultDBConnector.id,[Symbol.for("info")]:"coming from created or deleted relation",[Symbol.for("edgeType")]:"roleField on C/D"};i(m);return}if(o.$op==="match"||o.$op==="update"&&Object.keys(h).length>0){let E=0;Object.entries(h).forEach(([g,m])=>{let Q=radash.isArray(m)?m:[m],I=O=>O==="create"||O==="replace"?"link":O;Q.forEach(O=>{if(!O)return;let j=I(O.$op);if(j==="replace")throw new Error("Not supported yet: replace on roleFields");if(j==="unlink"&&E>0)throw E+=1,new Error("Not supported yet: Cannot unlink more than one role at a time, please split into two mutations");let D={...$,$relation:o.$relation,$op:j==="delete"?"unlink":j,[g]:O.$bzId,$bzId:o.$bzId,[Symbol.for("dbId")]:P.defaultDBConnector.id,[Symbol.for("parent")]:o[Symbol.for("parent")],[Symbol.for("path")]:o[Symbol.for("path")],[Symbol.for("info")]:"updating roleFields",[Symbol.for("edgeType")]:"roleField on L/U/R"};i(D);});});}}}}}),[s,u]};if(!r)throw new Error("Undefined filledBqlRequest");let [F,f]=a(r),y=F.reduce((e,s)=>{if(!s.$bzId)return [...e,s];let u=e.findIndex(n=>n.$bzId===s.$bzId);if(u===-1)return [...e,s];if(e[u].$op==="create"&&s.$op==="match")return e;if(e[u].$op==="match"&&(s.$op==="create"||s.$op==="match"))return [...e.slice(0,u),s,...e.slice(u+1)];throw new Error(`Unsupported operation combination for $tempId "${s.$tempId}". Existing: ${e[u].$op}. Current: ${s.$op}`)},[]),B=f.reduce((e,s)=>{let u=e.find(n=>(n.$id&&n.$id===s.$id||n.$bzId&&n.$bzId===s.$bzId)&&n.$relation===s.$relation&&n.$op===s.$op);if(u){let n={...u};return Object.keys(s).forEach(i=>{if(typeof i=="symbol"||i.startsWith("$"))return;let c=u[i],t=s[i];Array.isArray(c)&&Array.isArray(t)?n[i]=Array.from(new Set([...c,...t])):!Array.isArray(c)&&Array.isArray(t)?c!==void 0?n[i]=Array.from(new Set([c,...t])):n[i]=t:Array.isArray(c)&&!Array.isArray(t)?t!==void 0&&(n[i]=Array.from(new Set([...c,t]))):c!==null&&t!==null&&c!==void 0&&t!==void 0?n[i]=Array.from(new Set([c,t])):c==null&&(n[i]=t);}),[...e.filter(i=>!((i.$id&&i.$id===s.$id||i.$bzId&&i.$bzId===s.$bzId)&&i.$relation===s.$relation&&i.$op===s.$op)),n]}return [...e,s]},[]);[...new Set(B.map(e=>e.$relation))];d.bqlRequest={mutation:{things:y,edges:B}};};var fe=async(d,r)=>{let l=r.dbConnectors[0].id,a=d.typeDB.get(l)?.session,F=d.typeDB.get(l)?.client;if(!a||!a.isOpen()){if(!F)throw new Error("Client not found");a=await F.session(r.dbConnectors[0].dbName,typedbDriver.SessionType.DATA),d.typeDB.set(l,{client:F,session:a});}return {client:F,session:a}};var it=async(d,r)=>{let{dbHandles:l,tqlRequest:a,bqlRequest:F,config:f}=d;if(!a)throw new Error("TQL request not built");if(!(a.deletions&&a.deletionMatches||a.insertions))throw new Error("TQL request error, no things");if(!F?.mutation)throw new Error("BQL mutation not parsed");let{session:y}=await fe(l,f),B=await y.transaction(typedbDriver.TransactionType.WRITE);if(!B)throw new Error("Can't create transaction");let M=a.deletionMatches&&a.deletions&&`match ${a.deletionMatches} delete ${a.deletions}`,R=a.insertions&&`${a.insertionMatches?`match ${a.insertionMatches}`:""} insert ${a.insertions}`;M&&await B.query.delete(M);let e=R&&B.query.insert(R);try{let s=e?await e.collect():void 0;await B.commit(),await B.close(),r.rawTqlRes={insertions:s};}catch(s){throw await B.close(),new Error(`Transaction failed: ${s.message}`)}};var be=Symbol.for("schema"),U=Symbol.for("queryPath");var W="___",nt=async d=>{let{enrichedBqlQuery:r}=d;if(!r)throw new Error("BQL query not enriched");let l="",a=(e,s)=>{let u="",n="";for(let p in e){let i=e[p];if(Array.isArray(i))for(let c=0;c<i.length;c++)n+=`{$${s} has ${p} "${i[c]}";}`,c<i.length-1?n+="or":n+=";";else u+=`, has ${p} "${i}"`;}u+=`;
36
- `,l+=u,l+=n;},F=(e,s)=>{let u=[],n=[],p="";for(let t=0;t<e.length;t++)e[t].$isVirtual||u.push(` ${e[t].$dbPath}`),n.push(`{${e[t].$dbPath}:${e[t].$as}}`);let i=`${u.join(",")};
37
- `;p=n.join(",");let c=`$metadata:{as:[${p}]}`;l+=`$${s} as "${s}.${c}.$dataFields": `,l+=i;},f=(e,s,u)=>{for(let n of e){let{$fields:p,$as:i,$justId:c,$idNotIncluded:t,$filterByUnique:o}=n,P=n[U],w=`$metadata:{as:${i},justId:${c?"T":"F"},idNotIncluded:${t},filterByUnique:${o}}`;if(l+=`"${u}.${w}.${n.$var}":{
38
- `,l+=` match
39
- `,n.$filter&&(l+=` $${s}${W}${n.$var} isa ${n.$thing}`,a(n.$filter,`${s}${W}${n.$var}`)),l+=` $${s} (${n.$var}: $${s}${W}${n.$var}) isa ${n.$intermediary};
40
- `,p){let k=`M_${uuid.v4()}`;l+=`?queryPath${k} = "${P}";
41
- `,l+=` fetch
42
- `,l+=`?queryPath${k} as "queryPath"
43
- ;`;let q=p?.filter(L=>L.$fieldType==="data");q&&q.length>0&&F(q,`${s}${W}${n.$var}`,`${s}.${n.$var}`);let b=p?.filter(L=>L.$fieldType==="link");b&&b.length>0&&y(b,`${s}${W}${n.$var}`,`${s}.${n.$var}`);let T=p?.filter(L=>L.$fieldType==="role");T&&T.length>0&&f(T,`${s}${W}${n.$var}`,`${s}.${n.$var}`);}l+=`};
44
- `;}},y=(e,s,u)=>{for(let n of e){let{$fields:p,$as:i,$justId:c,$idNotIncluded:t,$filterByUnique:o,$playedBy:P}=n,w=n[U],k=`$metadata:{as:${i},justId:${c?"T":"F"},idNotIncluded:${t},filterByUnique:${o}}`;if(l+=`"${u}.${k}.${n.$var}":{
45
- `,l+=` match
46
- `,n.$filter&&(l+=` $${s}${W}${n.$var} isa ${n.$thing}`,a(n.$filter,`${s}${W}${n.$var}`)),n.$target==="role"?l+=` $${s}_intermediary (${n.$plays}: $${s}, ${P.plays}: $${s}${W}${n.$var}) isa ${n.$intermediary};
47
- `:l+=` $${s}${W}${n.$var} (${n.$plays}: $${s}) isa ${n.$thing};
48
- `,p){let q=`M_${uuid.v4()}`;l+=`?queryPath${q} = "${w}";
49
- `,l+=` fetch
50
- `,l+=`?queryPath${q} as "queryPath"
51
- ;`;let b=p?.filter(h=>h.$fieldType==="data");b&&b.length>0&&F(b,`${s}${W}${n.$var}`);let T=p?.filter(h=>h.$fieldType==="link");T&&T.length>0&&y(T,`${s}${W}${n.$var}`,`${s}.${n.$var}`);let L=p?.filter(h=>h.$fieldType==="role");L&&L.length>0&&f(L,`${s}${W}${n.$var}`,`${s}.${n.$var}`);}l+=`};
52
- `;}},B=r.length>1,M=[];(e=>{if(B)for(let s of e){let{$path:u,$thing:n,$filter:p,$fields:i}=s,c=s[U];l+=`match
53
- $${u} isa ${n} `,p?a(p,u):l+="; ";let t=`M_${uuid.v4()}`;if(l+=`?queryPath${t} = "${c}";
54
- `,l+=`fetch
55
- `,l+=`?queryPath${t} as "queryPath"
56
- ;`,i){let o=i.filter(k=>k.$fieldType==="data");o&&o.length>0&&F(o,u);let P=i.filter(k=>k.$fieldType==="link");P&&P.length>0&&y(P,u,u);let w=i.filter(k=>k.$fieldType==="role");w&&w.length>0&&f(w,u,u);}M.push(l),l="";}else for(let s of e){let{$path:u,$thing:n,$filter:p,$fields:i}=s,c=s[U];if(l+=`match
57
- $${u} isa ${n} `,p?a(p,u):l+="; ",l+=`?queryPath = "${c}";
58
- `,l+=`fetch
59
- `,l+=`?queryPath as "queryPath"
60
- ;`,i){let t=i.filter(w=>w.$fieldType==="data");t&&t.length>0&&F(t,u);let o=i.filter(w=>w.$fieldType==="link");o&&o.length>0&&y(o,u,u);let P=i.filter(w=>w.$fieldType==="role");P&&P.length>0&&f(P,u,u);}}})(r),d.tqlRequest=B?M:l;};var Re=d=>{let r=d.dataFields?.map(f=>f.path)||[],l=d.linkFields?.map(f=>f.path)||[],a=Object.keys(d.roles||{})||[];return [...r,...l,...a]},qe=(d,r)=>Object.keys(d||{}).some(a=>{if(!Array.isArray(d[a])){let F=r.idFields?.includes(a),f=r.dataFields?.some(y=>(y.dbPath===a||y.path===a)&&y?.validations?.unique);return F||f}return !1}),Oe=(d,r)=>{let l=r.dataFields?.map(y=>({path:y.path,dbPath:y.dbPath}))||[],a=r.linkFields?.map(y=>({path:y.path,dbPath:y.dbPath}))||[],F=Object.keys(r.roles||{}).map(y=>({path:y,dbPath:y}))||[],f=[...l,...a,...F];return Object.entries(d||{}).reduce((y,[B,M])=>{let R=f.find(e=>e.path===B);return y[R?.dbPath||B]=M,y},{})},ot=async d=>{let{rawBqlRequest:r,schema:l}=d;if(Array.isArray(r)){for(let e of r)if(!("$entity"in e)&&!("$relation"in e)&&(!("$thing"in e)||!("$thingType"in e)))throw new Error("No entity specified in query")}else if(!("$entity"in r)&&!("$relation"in r)&&(!("$thing"in r)||!("$thingType"in r)))throw new Error("No entity specified in query");let a=(e,s)=>typeof s=="string"?e.idFields?.includes(s):e.idFields?.includes(s.$path),F=(e,s,u,n,p)=>({$path:s,$dbPath:n,$thingType:"attribute",$as:e.$as||s,$var:s,$fieldType:"data",$excludedFields:e.$excludedFields,$justId:u,$id:e.$id,$filter:e.$filter,$isVirtual:p,$filterProcessed:!0}),f=(e,s,u,n,p)=>{let{target:i,oppositeLinkFieldsPlayedBy:c}=u;return c.map(t=>{let o=i==="role"?t.thingType:"relation",P=i==="role"?t.thing:u.relation,w={[`$${o}`]:P},k=N(l,w),q=e?.$fields?.filter(T=>a(k,T)).length===0,b=[];return typeof e!="string"?e.$fields?q?b=[...e.$fields,...k.idFields]:b=e.$fields:b=Re(k):b=["id"],e.$excludedFields&&(b=b.filter(T=>a(k,T)?!0:!e.$excludedFields.includes(T.$path))),{$thingType:o,$plays:u.plays,$playedBy:t,$path:t.path,$dbPath:p,$as:e.$as||s,$var:s,$thing:P,$fields:b,$excludedFields:e.$excludedFields,$fieldType:"link",$target:i,$intermediary:t.relation,$justId:n,$id:e.$id,$filter:Oe(e.$filter,k),$idNotIncluded:q,$filterByUnique:qe(e.$filter,k),$filterProcessed:!0}})},y=(e,s,u,n,p)=>u.playedBy.map(i=>{let{thing:c,thingType:t,relation:o}=i,P={[`$${t}`]:c},w=N(l,P),k=e?.$fields?.filter(b=>w?.idFields?.includes(b)||w?.idFields?.includes(b.$path)).length===0,q=[];return typeof e!="string"?e.$fields?k?q=[...e.$fields,...w.idFields]:q=e.$fields:q=Re(w):q=["id"],e.$excludedFields&&(q=q.filter(b=>a(w,b)?!0:!e.$excludedFields.includes(b.$path))),{$thingType:t,$path:s,$dbPath:p,$as:e.$as||s,$var:s,$thing:c,$fields:q,$excludedFields:e.$excludedFields,$fieldType:"role",$intermediary:o,$justId:n,$id:e.$id,$filter:Oe(e.$filter,w),$idNotIncluded:k,$filterByUnique:qe(e.$filter,w),$playedBy:i,$filterProcessed:!0}}),B=(e,s)=>{let u=typeof e=="string"?e:e.$path,n=typeof e=="string",p=s.dataFields?.find(t=>t.path===u),i=s.linkFields?.find(t=>t.path===u),c=s.roles?.[u];if(p){let t=p.isVirtual&&p.default;return F(e,u,n,p.dbPath,t)}else {if(i)return f(e,u,i,n,i.dbPath);if(c)return y(e,u,c,n,c.dbPath)}return null},R=(e=>immer.produce(e,s=>objectTraversal.traverse(s,u=>{let{value:n,meta:p}=u,i=n;if(radash.isObject(i)){if(i.$id){let c=i.$entity||i.$relation?i:{[`$${i.$thingType}`]:i.$thing},t=N(l,c);if(i.$path=t.name,Array.isArray(i.$id)||(i.$filterByUnique=!0),t?.idFields?.length===1){let[o]=t.idFields;i.$filter={...i.$filter,[o]:i.$id},delete i.$id;}else throw new Error("Multiple ids not yet enabled / composite ids")}else if("$entity"in i||"$relation"in i){let c=N(l,i);i.$path=c.name,i.$as=c.name;}if(i.$entity?(i.$thing=i.$entity,i.$thingType="entity",delete i.$entity):i.$relation&&(i.$thing=i.$relation,i.$thingType="relation",delete i.$relation),radash.isObject(i)&&"$thing"in i){let c=i.$entity||i.$relation?i:{[`$${i.$thingType}`]:i.$thing};i[U]=p.nodePath;let t=N(l,c);if(i.$filter&&(i.$filterByUnique=qe(i.$filter,t),i.$filterProcessed||(i.$filter=Oe(i.$filter,t))),i.$fields){i.$fields.filter(w=>t?.idFields?.includes(w)||t?.idFields?.includes(w.$path)).length>0||(i.$fields=[...i.$fields,...t.idFields],i.$idNotIncluded=!0);let P=i.$fields?.flatMap(w=>{let k=B(w,t);return Array.isArray(k)?k:[k]}).filter(Boolean);i.$fields=P;}else {let P=Re(t)?.flatMap(w=>{let k=B(w,t);return Array.isArray(k)?k:[k]}).filter(Boolean);i.$fields=P;}i.$excludedFields&&(i.$fields=i.$fields.filter(o=>a(t,o)?!0:!i.$excludedFields.includes(o.$path)));}}})))(Array.isArray(r)?r:[r]);d.enrichedBqlQuery=R;};var at=async(d,r)=>{let{dbHandles:l,enrichedBqlQuery:a,tqlRequest:F,config:f}=d;if(!a)throw new Error("BQL request not parsed");if(!F)throw new Error("TQL request not built");let y=new typedbDriver.TypeDBOptions;if(y.infer=!0,Array.isArray(F)){let M=await radash.parallel(F.length,F,async R=>{let{session:e}=await fe(l,f),s=await e.transaction(typedbDriver.TransactionType.READ,y);if(!s)throw new Error("Can't create transaction");let n=await s.query.fetch(R).collect();return await s.close(),n});r.rawTqlRes=M,r.isBatched=!0;}else {let{session:M}=await fe(l,f),R=await M.transaction(typedbDriver.TransactionType.READ,y);if(!R)throw new Error("Can't create transaction");let s=await R.query.fetch(F).collect();await R.close(),r.rawTqlRes=s;}};var lt=d=>{let r=/as:([a-zA-Z0-9_\-·]+)/,l=/justId:([a-zA-Z0-9_\-·]+)/,a=/idNotIncluded:([a-zA-Z0-9_\-·]+)/,F=/filterByUnique:([a-zA-Z0-9_\-·]+)/,f=d.match(r),y=d.match(l),B=d.match(a),M=d.match(F);return {as:f?f[1]:null,justId:y?y[1]:null,idNotIncluded:B?B[1]:null,filterByUnique:M?M[1]:null}},yi=d=>{try{let l=(F=>{let f=F.replace("$metadata:","");return f=f.replace(/([a-zA-Z0-9_\-·]+)(?=:)/g,'"$1"'),f=f.replace(/:(\s*)([a-zA-Z0-9_\-·]+)/g,(y,B,M)=>/^{.*}$/.test(M)?`:${M}`:`:${B}"${M}"`),f=f.replace(/\[([^\]]+)\]/g,(y,B)=>`[${B.split(",").map(M=>M.trim().startsWith("{")&&M.trim().endsWith("}")?M.trim():`"${M.trim()}"`).join(",")}]`),f})(d);return JSON.parse(l)}catch(r){return console.error(r),{as:[]}}},dt=async(d,r)=>{let{enrichedBqlQuery:l,rawBqlRequest:a,schema:F,config:f}=d,{rawTqlRes:y,isBatched:B}=r;if(l){if(!y)throw new Error("TQL query not executed")}else throw new Error("BQL request not enriched");let M=(i,c)=>{let{$metaData:t}=i,{as:o}=yi(t),P=Object.entries(i).filter(([w])=>w!=="type"&&!w.includes("$")).map(([w,k])=>{let q=c.dataFields?.find(h=>h.path===w||h.dbPath===w),b=w==="id",T=Array.isArray(o)?o.find(h=>h[w])?.[w]:w,L;if(q?.cardinality==="ONE"){if(L=k[0]?k[0].value:f.query?.returnNulls?null:void 0,q.contentType==="DATE"&&(L=L&&`${L}Z`),b)return [[T,L],["$id",L]].filter(([h,S])=>S!==void 0)}else if(q?.cardinality==="MANY"){if(!radash.isArray(k))throw new Error("Typedb fetch has changed its format");if(k.length===0)return f.query?.returnNulls?[[T,null]]:[];q.contentType==="DATE"?L=k.map(h=>`${h.value}Z`):L=k.map(h=>h.value);}return [[T,L]].filter(([h,S])=>S!==void 0)}).flat();return Object.fromEntries([...P])},R=i=>i.reduce((c,t)=>{let{$roleFields:o,$metaData:P,$cardinality:w}=t,{as:k,justId:q,idNotIncluded:b,filterByUnique:T}=lt(P),L=o.map(h=>{let{dataFields:S,currentSchema:$,linkFields:E,roleFields:g,schemaValue:m}=s(h),Q=M(S,$);if(q==="T")return Q.id;{let I=e(E),O=R(g),j={...Q};return b==="true"&&$?.idFields?.forEach(D=>delete j[D]),{...j,...I,...O,...m}}});return L.length>0?c[k]=w==="MANY"&&T==="false"?L:L[0]:f.query?.returnNulls&&(c[k]=null),c},{}),e=i=>i.reduce((c,t)=>{let{$linkFields:o,$metaData:P,$cardinality:w}=t,{as:k,justId:q,idNotIncluded:b,filterByUnique:T}=lt(P),L=o.map(h=>{let{dataFields:S,currentSchema:$,linkFields:E,roleFields:g,schemaValue:m}=s(h),Q=M(S,$);if(q==="T")return Q.id;{let I=e(E),O=R(g),j={...Q};return b==="true"&&$.idFields?.forEach(D=>delete j[D]),{...j,...I,...O,...m}}});return c[k]=L.length>0?w==="MANY"&&T==="false"?L:L[0]:f.query?.returnNulls?null:void 0,c},{}),s=i=>{let c=Object.keys(i),t=c.find(h=>h.endsWith(".$dataFields"));if(!t)throw new Error("No datafields");let o=i[t],P=t.split(".")[t.split(".").length-2];if(o.$metaData=P,o.length===0)throw new Error("No datafields");let w=o.type,k={$thing:w.label,$thingType:w.root,[U]:i.queryPath.value},q={[`$${k.$thingType}`]:k.$thing},b=N(F,q),T=c.filter(h=>!h.endsWith(".$dataFields")&&b.linkFields?.some(S=>S.path===h.split(".").pop())).map(h=>({$linkFields:i[h],$key:h.split(".").pop(),$metaData:h.split(".")[h.split(".").length-2],$cardinality:b?.linkFields?.find(S=>S.path===h.split(".").pop())?.cardinality})),L=c.filter(h=>!h.endsWith(".$dataFields")&&b.roles?.[h.split(".").pop()]).map(h=>({$roleFields:i[h],$key:h.split(".").pop(),$metaData:h.split(".")[h.split(".").length-2],$cardinality:b.roles[h.split(".").pop()].cardinality}));return {dataFields:o,schemaValue:k,currentSchema:b,linkFields:T,roleFields:L}},u=i=>i.map(c=>{let{dataFields:t,currentSchema:o,linkFields:P,roleFields:w,schemaValue:k}=s(c),q=M(t,o),b=e(P),T=R(w),L=a?.$fields?.every(S=>!o?.idFields?.includes(S)&&!o?.idFields?.includes(S.$path));return {...b,...T,...k,...!f.query?.noMetadata&&a.$id?{$id:Array.isArray(a.$id)?q.id:a.$id}:{},...L?Object.fromEntries(Object.entries(q).filter(([S])=>!o?.idFields?.includes(S))):q}}),p=(i=>{let c=t=>{let o=u(t);return a.$id&&!Array.isArray(a.$id)||l[0].$filterByUnique?o[0]??null:o.length===0?null:o};return B?i.map(c):c(i)})(y);r.bqlRes=p;};var hi=Symbol.for("grandChildOfCreate"),ne=d=>({...d[Symbol.for("relation")]&&{[Symbol.for("relation")]:d[Symbol.for("relation")]},...d[Symbol.for("parent")]&&{[Symbol.for("parent")]:d[Symbol.for("parent")]},...d[Symbol.for("edgeType")]&&{[Symbol.for("edgeType")]:d[Symbol.for("edgeType")]},...d[Symbol.for("role")]&&{[Symbol.for("role")]:d[Symbol.for("role")]},...d[Symbol.for("oppositeRole")]&&{[Symbol.for("oppositeRole")]:d[Symbol.for("oppositeRole")]},...d[Symbol.for("relFieldSchema")]&&{[Symbol.for("relFieldSchema")]:d[Symbol.for("relFieldSchema")]},...d[Symbol.for("path")]&&{[Symbol.for("path")]:d[Symbol.for("path")]},...d[Symbol.for("isRoot")]&&{[Symbol.for("isRoot")]:d[Symbol.for("isRoot")]},...d[Symbol.for("depth")]&&{[Symbol.for("depth")]:d[Symbol.for("depth")]},...d[Symbol.for("schema")]&&{[Symbol.for("schema")]:d[Symbol.for("schema")]},...d[Symbol.for("dbId")]&&{[Symbol.for("dbId")]:d[Symbol.for("dbId")]},...d[Symbol.for("index")]&&{[Symbol.for("index")]:d[Symbol.for("index")]}}),ct=async d=>{let{filledBqlRequest:r,config:l,schema:a}=d,F=(b,T)=>Object.keys(b).filter(L=>L.startsWith("$")?!1:T?!N(a,b).dataFields?.find(S=>S.path===L):!0);if(!r)throw new Error("[BQLE-M-PQ-1] No filledBqlRequest found");if(l.mutation?.preQuery===!1)return;let f=[];if(objectTraversal.traverse(r,({parent:b,key:T,value:L})=>{b&&T&&!T.includes("$")&&radash.isObject(b)?(Array.isArray(b[T])?b[T]:[b[T]]).forEach(S=>{if(radash.isObject(S)){if(b.$op!=="create")f.includes(S.$op)||f.push(S.$op);else if(S.$op==="delete"||S.$op==="unlink")throw new Error(`Cannot ${S.$op} under a create`)}}):!b&&radash.isObject(L)&&(f.includes(L.$op)||f.push(L.$op));}),!f.includes("delete")&&!f.includes("unlink")&&!f.includes("replace")&&!f.includes("update")&&!f.includes("link"))return;let B=(b=>{let T=(L,h)=>{let S=[],$={},E=["$op","$bzId","$parentKey"],g=["$relation","$entity","$id",...E];for(let m in L)if(!E.includes(m)&&!(g.includes(m)&&!h))if(!m.includes("$")&&(radash.isObject(L[m])||Array.isArray(L[m]))){let Q=L[m];Array.isArray(Q)&&Q.length>0?Q.forEach(I=>{S.push({$path:m,...T(I)});}):S.push({$path:m,...T(Q)});}else $[m]=L[m];return {...$,$fields:S}};return b.map(L=>T(L,!0))})(Array.isArray(r)?r:[r]),M=await Fe(B,d.config,d.schema,d.dbHandles),R=(b,T)=>{let L=b.$id||b.id||b.$bzId;if(b.$objectPath){let{$objectPath:h}=b,S=h?.beforePath||"root",$=Array.isArray(h.ids)?`[${h.ids}]`:h.ids;return {beforePath:`${S}.${$}___${h.key}`,ids:L,key:T}}else return {beforePath:"root",ids:L,key:T}},e=(b,T)=>{let L=b?.beforePath||"root",h=T||(Array.isArray(b?.ids)?`[${b?.ids}]`:b?.ids);return `${L}.${h}___${b?.key}`},s=b=>{if(b.includes("[")&&b.includes("]")){let[T,L,h]=b.split(/[[\]]/);return L.split(",").map($=>`${T}${$}${h}`)}else return [b]},u={};(b=>immer.produce(b,T=>objectTraversal.traverse(T,L=>{let{key:h,parent:S}=L;if(S&&h&&S.$id&&!h.includes("$")){let $=R(S,h),E=e($);if(Array.isArray(S[h])){let g=[];S[h].forEach(m=>{radash.isObject(m)?(m.$objectPath=$,g.push(m.$id.toString())):m&&g.push(m.toString());}),u[E]={$objectPath:$,$ids:g};}else {let g=S[h];radash.isObject(g)?(u[E]={$objectPath:$,$ids:[g.$id.toString()]},g.$objectPath=$):g&&(u[E]={$objectPath:$,$ids:[g.toString()]});}}})))(M||{});let p=b=>immer.produce(b,T=>objectTraversal.traverse(T,L=>{let{key:h,value:S,parent:$}=L;$&&h&&!h.includes("$")&&(Array.isArray(S)||radash.isObject(S))&&!Array.isArray($)&&(Array.isArray($[h])?$[h].forEach(E=>{typeof E!="string"&&(E.$objectPath=R($,h),E.$parentIsCreate=$.$op==="create",E[hi]=$.$parentIsCreate||$[Symbol.for("grandChildOfCreate")]);}):radash.isObject($[h])&&($[h].$parentIsCreate=$.$op==="create",$[h][Symbol.for("grandChildOfCreate")]=$.$parentIsCreate||$[Symbol.for("grandChildOfCreate")],$[h].$objectPath=R($,h)));})),i=p(r),t=(b=>{let T=($,E)=>{let g=[];$.filter(O=>O).forEach(O=>{let j=Object.keys(O).filter(D=>!D.startsWith("$")).length;if(Array.isArray(O.$id)&&j>0){let D=O.$id.map(z=>({...O,$id:z}));g=[...g,...D];}else g.push({...O});});let m=[],Q=[],I=g.filter(O=>{let D=["delete","update","unlink"].includes(O.$op||""),z=F(O,!0).length;if((!O.$id||Array.isArray(O.$id)&&z>0||O.$filter)&&D)return !0;Q.push({...O});});return I.length>0?I.forEach(O=>{let D=(x=>{let se=(()=>{let _={};for(let C in x){let Y=N(a,x);!C.startsWith("$")&&Y.dataFields?.find(re=>re.path===C)&&(_[C]=x[C]);}return _})(),ae=Object.keys(x),Z=ae.filter(_=>!_.startsWith("$")),we=[],ye=(_,C)=>{if(_===Z.length){let re={...C};ae.forEach(V=>{V.startsWith("$")&&(re[V]=x[V]);}),we.push(re);return}let Y={...C,[Z[_]]:x[Z[_]],...ne(C),...se};ye(_+1,Y),ye(_+1,C);};return ye(0,{...ne(x)}),we})(O).filter(x=>!(x.$op==="update"&&Object.keys(x).filter(ee=>!ee.startsWith("$")).length===0)),z=[],J=e(O.$objectPath),v=u[J]?u[J].$ids:[],A=D.map((x,ee)=>{let se=N(a,x),Z=Object.keys(x).filter(C=>!C.includes("$")&&!se.dataFields?.some(Y=>Y.path===C)).map(C=>(Array.isArray(x[C])?x[C].length>1?x[C].filter(V=>!V.$id||Array.isArray(V.$id)||V.$filter):x[C]:[x[C]]).map(V=>{let Ee=e(V.$objectPath);return {idsToKey:(Le=>{let je=[],de=Le.split("."),Ot=de.slice(0,de.length-1).join("."),At=de.slice(de.length-1,de.length)[0].split("___")[1];for(let Me in u)if(Me.startsWith(Ot)&&Me.endsWith(At)){let Te=Me.split("."),Ct=Te.slice(Te.length-1,Te.length)[0].split("___")[0];je.push(Ct);}return je})(Ee),key:C,multiple:V}})).filter(C=>C!==void 0),_=(C=>{let Y=C.map(V=>V.map(te=>te.idsToKey));return (V=>V.length>0?V.reduce((te,le)=>te.concat(le),[]).reduce((te,le)=>te?le.filter(Le=>te.includes(Le)):le):[])(Y)})(Z).filter(C=>!z.includes(C));if(z=[...z,..._],v=v.filter(C=>!_.includes(C)),ee===D.length-1&&v.length>0)return {...x,$id:v,$bzId:`T_${uuid.v4()}`,...ne(x)};if(_.length>0)return {...x,$id:_,$bzId:`T_${uuid.v4()}`,...ne(x)}}).filter(x=>x!==void 0),qt=(()=>{if(A.length===0&&!E?.$id)return I;if(A.length===0&&E?.$id){let x=Array.isArray(E.$id)?E.$id:[E.$id],ee=[];return x.forEach(se=>{let ae=e({...O.$objectPath,ids:se}),Z=u[ae];Z&&ee.push({...O,$id:Z.$ids,...ne(O),$bzId:`T_${uuid.v4()}`});}),ee}else return A})();m=[...Q,...qt].map(L);}):m=g.map(L),m},L=$=>{let E={...$,$bzId:`T_${uuid.v4()}`,...ne($)},g=N(a,$);return Object.keys($).filter(m=>!m.includes("$")&&!g.dataFields?.some(Q=>Q.path===m)).forEach(m=>{let Q=Array.isArray($[m])?$[m]:[$[m]],I=T(Q,$);E[m]=I.length>0?I:void 0;}),E},h=[];return b.forEach($=>{h=[...h,...T([$])];}),h.map($=>L($))})(Array.isArray(i)?i:[i]),o=b=>b.map(T=>{let L=F(T,!0),h={...T};return L.forEach(S=>{let $=Array.isArray(T[S])?T[S]:[T[S]],E=[],g=[],m=[],Q={},I=Se(a,T,S);$.filter(A=>A).forEach(A=>{A.$op==="replace"&&A.$id?(Q=A,Array.isArray(A.$id)?g=[...g,...A.$id]:g.push(A.$id)):A.$op==="create"&&I==="ONE"&&A.id?(Q=A,Array.isArray(A.id)?m=[...g,...A.id]:m.push(A.id)):E.push(A);});let O=e(Q.$objectPath),D=s(O).map(A=>u[A]),z=[];D.filter(A=>A!=null).forEach(A=>{z=[...z,...A.$ids];});let J=z.filter(A=>!g.includes(A)),K=g.filter(A=>!z.includes(A)),v=ne(Q);J.length>0&&E.push({...Q,$op:"unlink",$id:J,$bzId:`T_${uuid.v4()}`,id:void 0,...v}),K.length>0&&K.forEach(A=>{E.push({...Q,$op:"link",$id:A,$bzId:`T_${uuid.v4()}`,...v});}),m.length>0&&m.forEach(A=>{E.push({...Q,$op:"create",id:A,$bzId:`T_${uuid.v4()}`,...v});}),h[S]=o(E);}),h}),P=p(o(p(t)));(b=>immer.produce(b,T=>objectTraversal.traverse(T,L=>{let{key:h,value:S,parent:$}=L;h&&$&&!h?.includes("$")&&(Array.isArray(S)||radash.isObject(S))&&!Array.isArray($)&&(Array.isArray(S)?S:[S]).forEach(g=>{let m=u[e(g.$objectPath)],Q=(j,D)=>j.every(z=>D.includes(z)),I=g.$id?Array.isArray(g.$id)?Q(g.$id,m?m.$ids:[]):m?.$ids.includes(g.$id):m,O=Se(a,$,g.$objectPath.key);if(g.$op==="link"&&I&&O==="ONE")throw new Error(`[BQLE-Q-M-2] Cannot link on:"${e(g.$objectPath)}" because it is already occupied.`);if(g.$op)switch(g.$op){case"delete":if(!I&&!l.mutation?.ignoreNonexistingThings)throw new Error(`[BQLE-Q-M-2] Cannot delete $id:"${g.$id}" because it is not linked to $id:"${$.$id}"`);break;case"update":if(!I&&!l.mutation?.ignoreNonexistingThings)throw new Error(`[BQLE-Q-M-2] Cannot update $id:"${g.$id}" because it is not linked to $id:"${$.$id}"`);break;case"unlink":if(!I&&!l.mutation?.ignoreNonexistingThings)throw new Error(`[BQLE-Q-M-2] Cannot unlink $id:"${g.$id}" because it is not linked to $id:"${$.$id}"`);break;case"link":if(I)throw new Error(`[BQLE-Q-M-2] Cannot link $id:"${g.$id}" because it is already linked to $id:"${$.$id}"`);break;}});})))(P);let q=(b=>immer.produce(b,T=>objectTraversal.traverse(T,L=>{let{parent:h,key:S,value:$,meta:E}=L;radash.isObject($)&&($[Symbol.for("path")]=E.nodePath,delete $.$objectPath,delete $.$parentIsCreate),S&&h&&!S?.includes("$")&&(Array.isArray($)||radash.isObject($))&&!Array.isArray(h)&&(Array.isArray($)?$:[$]).forEach(m=>{radash.isObject(m)&&(m[Symbol.for("parent")]={...$[Symbol.for("parent")],path:h[Symbol.for("path")]});});})))(P);d.filledBqlRequest=q;};var yt=async d=>{let{filledBqlRequest:r,schema:l}=d;if(!r)throw new Error("Filled BQL request is missing");let F=(B=>immer.produce(B,M=>objectTraversal.traverse(M,({value:R})=>{if(radash.isObject(R)){let e=R,s=N(l,e),{unidentifiedFields:u}=G(s,e),{idFields:n,computedFields:p,virtualFields:i}=s;if(!n)throw new Error("No idFields found");let[c]=n,t=radash.listify(e,(w,k)=>k!==void 0?w:void 0),o=t.filter(w=>i?.includes(w));if(o.length>0)throw new Error(`Virtual fields can't be sent to DB: "${o.join(",")}"`);if(p.filter(w=>!t.includes(w)).forEach(w=>{let k=s.dataFields?.find(h=>h.path===w),b=s.linkFields?.find(h=>h.path===w)?.oppositeLinkFieldsPlayedBy[0],T="roles"in s?pe(s.roles,(h,S)=>h===w):void 0,L=k||b||T;if(!L)throw new Error(`no field Def for ${w}`);if(w!==c&&e.$op==="create"&&!e[w]){let h=X({currentThing:e,fieldSchema:L,mandatoryDependencies:!0});e[w]=h;}}),u.length>0)throw new Error(`Unknown fields: [${u.join(",")}] in ${JSON.stringify(e)}`)}})))(r),y=(B=>immer.produce(B,M=>objectTraversal.traverse(M,({value:R})=>{radash.isObject(R);})))(F);d.filledBqlRequest=y;};var gt=async d=>{let{filledBqlRequest:r}=d;if(!r)throw new Error("Filled BQL request is missing");let a=(y=>immer.produce(y,B=>objectTraversal.traverse(B,({value:M})=>{radash.isObject(M)&&Je();})))(r),f=(y=>immer.produce(y,B=>objectTraversal.traverse(B,({value:M})=>{radash.isObject(M);})))(a);d.filledBqlRequest=f;};var wt=async d=>{let{filledBqlRequest:r}=d;if(!r)throw new Error("Filled BQL request is missing");let l=F=>immer.produce(F,f=>objectTraversal.traverse(f,({value:y})=>{if(radash.isObject(y)&&("$entity"in y||"$relation"in y)){let B=y,{requiredFields:M,enumFields:R,fnValidatedFields:e}=B[be];"$op"in B&&B.$op==="create"&&M.forEach(s=>{if(!(s in B))throw new Error(`[Validations] Required field "${s}" is missing.`)}),("$op"in B&&B.$op==="update"||B.$op==="create")&&R.forEach(s=>{if(s in B){let u=B[be]?.dataFields?.find(n=>n.path===s)?.validations?.enum;if(!u)throw new Error(`[Validations] Enum field "${s}" is missing enum options.`);if(radash.isArray(B[s]))B[s].some(n=>{if(!u.includes(n))throw new Error(`[Validations] Option "${n}" is not a valid option for field "${s}".`)});else if(u&&!u.includes(B[s]))throw new Error(`[Validations] Option "${B[s]}" is not a valid option for field "${s}".`)}}),("$op"in B&&B.$op==="update"||B.$op==="create")&&e.forEach(s=>{if(s in B)try{let u=B[be]?.dataFields?.find(n=>n.path===s)?.validations?.fn;if(!u)throw new Error("Missing validation function.");if(!u(B[s]))throw new Error("Failed validation function.")}catch(u){throw new Error(`[Validations:attribute:${s}] ${u.message}`)}});}})),a=F=>immer.produce(F,f=>objectTraversal.traverse(f,({value:y,parent:B,meta:M})=>{if(radash.isObject(y)&&("$entity"in y||"$relation"in y)){let R="$entity"in y?y.$entity:y.$relation,e=y,s=y[Symbol.for("schema")].hooks;if(s){let{pre:u}=s;if(u){let n=`on${_e(e.$op)}`;u.filter(i=>i.triggers[n]).forEach(i=>{let c=n in i.triggers?i.triggers[n]:void 0;if(c!==void 0&&c()){let t=Ve(F,B,M);i.actions.forEach(o=>{if(o.type==="validate"){if(o.severity!=="error")return;try{let P=o.fn(e,t);if(P===!1)throw new Error(`${o.message}.`);if(P!==!0)throw new Error("Validation function's output is not a boolean value.")}catch(P){throw new Error(`[Validations:thing:${R}] ${P.message}`)}}});}});}}}}));l(r),a(r);};var Et=async(d,r)=>{let{schema:l,enrichedBqlQuery:a}=d,{bqlRes:F}=r;if(!F)return;let y=(B=>immer.produce(B,M=>objectTraversal.traverse(M,({value:R})=>{if(radash.isObject(R)){let e=R;if(!e.$thing)throw new Error("[Internal] Thing is missing");if(e.$thing){let s=N(l,e),{virtualFields:u}=s,n=e[U];if(!n)throw new Error("[Internal] QueryPath is missing");let p=objectTraversal.getNodeByPath(a,n),i=p.$fields.map(t=>t.$path),c=p.$excludedFields;u.forEach(t=>{if(c?.includes(t)||i.length>0&&!i.includes(t))return;let o=s.dataFields?.find(P=>P.path===t);if(o?.default){let P=X({currentThing:e,fieldSchema:o,mandatoryDependencies:!0});e[t]=P;}else if(e[t]===void 0)throw new Error(`[Internal] Virtual field: No db value found for virtual field: ${t}`)}),c&&c.forEach(t=>{if(typeof t!="string")throw new Error("[Internal] ExcludedField is not a string");delete e[t];});}}})))(F);r.bqlRes=y;};var kt=async(d,r)=>{let{config:l}=d,{bqlRes:a}=r;if(!a)return;let f=(M=>immer.produce(M,R=>objectTraversal.traverse(R,({value:e})=>{radash.isObject(e);})))(a),B=(M=>immer.produce(M,R=>objectTraversal.traverse(R,({value:e})=>{if(radash.isObject(e)){let s=e;Object.keys(s).forEach(u=>{s[u]===void 0&&delete s[u];}),Object.getOwnPropertySymbols(s).forEach(u=>{delete s[u];}),l.query?.noMetadata===!0&&Object.keys(s).forEach(u=>{u.startsWith("$")&&delete s[u];});}})))(f);r.bqlRes=B;};var Qt={query:[ot,nt,at,dt,Et,kt],mutation:[Ye,ct,yt,gt,wt,tt,Ue,it,We,He]},Ae=async(d,r,l={},a=!0)=>{for(let F of d){let f=await F(r,l);if(f&&Array.isArray(f))for(let y of f)await Ae(y.pipeline,y.req,y.res,!1);}return a&&r.config.query?.debugger===!0&&typeof l.bqlRes=="object"?{...l.bqlRes,$debugger:{tqlRequest:r.tqlRequest}}:l.bqlRes},Fe=(d,r,l,a)=>Ae(Qt.query,{config:r,schema:l,rawBqlRequest:d,dbHandles:a},{}),St=(d,r,l,a)=>Ae(Qt.mutation,{config:r,schema:l,rawBqlRequest:d,dbHandles:a},{});var Ce=class{schema;config;dbHandles;constructor({schema:r,config:l}){this.schema=r,this.config=l;}getDbHandles=()=>this.dbHandles;init=async()=>{let r={typeDB:new Map},l=ze(this.schema);await Promise.all(this.config.dbConnectors.map(async a=>{if(a.provider==="typeDB"&&a.dbName){let[F,f]=await radash.tryit(typedbDriver.TypeDB.coreDriver)(a.url);if(F){let y=`[BORM:${a.provider}:${a.dbName}:core] ${F.message??"Can't create TypeDB Client"}`;throw new Error(y)}try{let y=await f.session(a.dbName,typedbDriver.SessionType.DATA);r.typeDB.set(a.id,{client:f,session:y});}catch(y){let B=`[BORM:${a.provider}:${a.dbName}:session] ${(y.messageTemplate?._messageBody()||y.message)??"Can't create TypeDB Session"}`;throw new Error(B)}}if(a.provider==="typeDBCluster"&&a.dbName){let[F,f]=await radash.tryit(typedbDriver.TypeDB.cloudDriver)(a.addresses,a.credentials);if(F){let y=`[BORM:${a.provider}:${a.dbName}:core] ${F.message??"Can't create TypeDB Cluster Client"}`;throw new Error(y)}try{let y=await f.session(a.dbName,typedbDriver.SessionType.DATA);r.typeDB.set(a.id,{client:f,session:y});}catch(y){let B=`[BORM:${a.provider}:${a.dbName}:session] ${(y.messageTemplate?._messageBody()||y.message)??"Can't create TypeDB Session"}`;throw new Error(B)}}})),this.schema=l,this.dbHandles=r;};#e=async()=>{if(!this.dbHandles&&(await this.init(),!this.dbHandles))throw new Error("Can't init BormClient")};introspect=async()=>(await this.#e(),this.schema);define=async()=>(await this.#e(),De(this.config,this.schema,this.dbHandles));query=async(r,l)=>{await this.#e();let a={...this.config,query:{...ke.query,...this.config.query,...l}};return Fe(r,a,this.schema,this.dbHandles)};mutate=async(r,l)=>{await this.#e();let a={...this.config,mutation:{...ke.mutation,...this.config.mutation,...l}};return St(r,a,this.schema,this.dbHandles)};close=async()=>{this.dbHandles&&this.dbHandles.typeDB.forEach(async({client:r,session:l})=>{l.isOpen()&&await l.close(),await r.close();});}},vr=Ce;//! Todo: delete when this works with the new $thing and $thingType fields
34
+ ${c}`})(),p=f.dbConnectors[0].id,h=s.typeDB.get(p)?.session,w=s.typeDB.get(p)?.client;if(!h){console.log("Session Status: ","NO SESSION");return}await h.close();let[{dbName:g}]=f.dbConnectors;await(await w.databases.get(g)).delete(),await w.databases.create(g);let t=await w.session(f.dbConnectors[0].dbName,typedbDriver.SessionType.SCHEMA),o=await t.transaction(typedbDriver.TransactionType.WRITE);await o.query.define(F),await o.commit(),await o.close();let u=await t.transaction(typedbDriver.TransactionType.READ);(await(await u.query.match("match $a sub thing;")).collect()).forEach(async c=>{c.get("a");}),await u.close();};var Vt=(f,e,s)=>s?e:`${f}\xB7${e}`;var ft=(f,e)=>Object.values(Object.fromEntries(Object.entries(f).filter(([s,a])=>e(s,a))))[0],ut=(f,e)=>Object.fromEntries(Object.entries(f).filter(([s,a])=>e(s,a))),Wt=f=>{let e=[],s=immer.produce(f,F=>objectTraversal.traverse(F,({key:p,value:h,meta:w})=>{if(w.depth===2&&(p&&(h.dataFields=h.dataFields?.map(g=>({...g,cardinality:g.cardinality||"ONE",dbPath:Vt(p,g.path,g.shared)}))),h.extends)){let g=F.entities[h.extends]||F.relations[h.extends];if(h.allExtends=[h.extends,...g.allExtends||[]],h.idFields=g.idFields?(h.idFields||[]).concat(g.idFields):h.idFields,h.dataFields=g.dataFields?(h.dataFields||[]).concat(g.dataFields.map(R=>{let t=h.extends,o=f.entities[t]||f.relations[t];for(;!o.dataFields?.find(u=>u.path===R.path);)t="extends"in o?o.extends:void 0,o=f.entities[t]||f.relations[t];return {...R,dbPath:Vt(t,R.path,R.shared)}})):h.dataFields,h.linkFields=g.linkFields?(h.linkFields||[]).concat(g.linkFields):h.linkFields,"roles"in g){let R=h,t=g;R.roles=R.roles||{},R.roles={...R.roles,...t.roles},Object.keys(R.roles).length===0&&(R.roles={});}}},{traversalType:"breadth-first"}));return objectTraversal.traverse(f,({key:F,value:p,meta:h})=>{if(F==="linkFields"){let g=(()=>{if(!h.nodePath)throw new Error("No path");let[t,o]=h.nodePath.split(".");return {thing:o,thingType:t==="entities"?"entity":t==="relations"?"relation":""}})(),R=Array.isArray(p)?p.map(t=>({...t,...g})):[{...p,...g}];e.push(...R);}}),immer.produce(s,F=>objectTraversal.traverse(F,({value:p,key:h,meta:w})=>{if(w.depth===2&&p.idFields&&!p.id){p.name=h;let g=()=>{if(w.nodePath?.split(".")[0]==="entities")return "entity";if(w.nodePath?.split(".")[0]==="relations")return "relation";throw new Error("Unsupported node attributes")};p.thingType=g(),p.computedFields=[],p.virtualFields=[],p.requiredFields=[],p.enumFields=[],p.fnValidatedFields=[],"roles"in p&&Object.entries(p.roles).forEach(([t,o])=>{o.playedBy=e.filter(u=>u.relation===h&&u.plays===t)||[],o.name=t;}),"linkFields"in p&&p.linkFields&&p.linkFields?.forEach(t=>{if(t.target==="relation"){t.oppositeLinkFieldsPlayedBy=[{plays:t.path,thing:t.relation,thingType:"relation"}];return}let o=e.filter(n=>n.relation===t.relation&&n.plays!==t.plays)||[];t.oppositeLinkFieldsPlayedBy=o;let{filter:u}=t;t.oppositeLinkFieldsPlayedBy=t.oppositeLinkFieldsPlayedBy.filter(n=>n.target==="role"),u&&Array.isArray(u)&&(t.oppositeLinkFieldsPlayedBy=t.oppositeLinkFieldsPlayedBy.filter(n=>u.some(d=>n.thing===d.$role)),t.oppositeLinkFieldsPlayedBy=t.oppositeLinkFieldsPlayedBy.filter(n=>u.some(d=>n.thing===d.$thing))),u&&!Array.isArray(u)&&(t.oppositeLinkFieldsPlayedBy=t.oppositeLinkFieldsPlayedBy.filter(n=>n.$role===u.$role),t.oppositeLinkFieldsPlayedBy=t.oppositeLinkFieldsPlayedBy.filter(n=>n.thing===u.$thing));});}if(typeof p=="object"&&"playedBy"in p){if([...new Set(p.playedBy?.map(g=>g.thing))].length>1)throw new Error(`Unsupported: roleFields can be only played by one thing. Role: ${h} path:${w.nodePath}`);if(p.playedBy.length===0)throw new Error(`Unsupported: roleFields should be played at least by one thing. Role: ${h}, path:${w.nodePath}`)}if(w.depth===4){let[g,R]=w.nodePath?.split(".")||[],t=F[g][R];p.validations&&(p.validations.required&&t.requiredFields.push(p.path),p.validations.enum&&t.enumFields.push(p.path),p.validations.fn&&t.fnValidatedFields.push(p.path)),p.default?p.isVirtual?t.virtualFields.push(p.path):t.computedFields.push(p.path):p.isVirtual&&t.virtualFields.push(p.path);}}))},At=(f,e,s)=>{let a=N(f,e),F=a.linkFields?.find(w=>w.path===s);if(F)return F.cardinality;let p=a.dataFields?.find(w=>w.path===s);if(p)return p.cardinality;let h=a.roles[s];if(h)return h.cardinality},N=(f,e)=>{if(e.$thing){if(!e.$thingType)throw new Error("Missing $thingType in node$: {JSON.stringify(node, null, 2)");if(e.$thingType==="entity"){if(!(e.$thing in f.entities))throw new Error(`Missing entity '${e.$thing}' in the schema`);return f.entities[e.$thing]}if(e.$thingType==="relation"){if(!(e.$thing in f.relations))throw new Error(`Missing relation '${e.$thing}' in the schema`);return f.relations[e.$thing]}throw new Error(`Wrong schema or query for ${JSON.stringify(e,null,2)}`)}if(e.$entity){if(!(e.$entity in f.entities))throw new Error(`Missing entity '${e.$entity}' in the schema`);return f.entities[e.$entity]}if(e.$relation){if(!(e.$relation in f.relations))throw new Error(`Missing relation '${e.$relation}' in the schema`);return f.relations[e.$relation]}throw new Error(`Wrong schema or query for ${JSON.stringify(e,null,2)}`)},nt=(f,e)=>{let s=f.dataFields?.map(d=>d.path)||[],a=f.linkFields?.map(d=>d.path)||[],F="roles"in f?radash.listify(f.roles,d=>d):[],p=[...s||[],...a||[],...F||[]],w=[...["$entity","$op","$id","$tempId","$bzId","$relation","$parentKey","$filter","$fields","$excludedFields"],...p];if(!e)return {fields:p,dataFields:s,roleFields:F,linkFields:a};let g=e.$fields?e.$fields.map(d=>{if(typeof d=="string")return d;if("$path"in d&&typeof d.$path=="string")return d.$path;throw new Error(" Wrongly structured query")}):radash.listify(e,d=>d),R=e.$filter?radash.listify(e.$filter,d=>d.toString().startsWith("$")?void 0:d.toString()).filter(d=>d&&s?.includes(d)):[],t=e.$filter?radash.listify(e.$filter,d=>d.toString().startsWith("$")?void 0:d.toString()).filter(d=>d&&[...F||[],...a||[]].includes(d)):[],o=[...g,...R].filter(d=>!w.includes(d)).filter(d=>d),u=e.$filter?ut(e.$filter,(d,i)=>R.includes(d)):{},n=e.$filter?ut(e.$filter,(d,i)=>t.includes(d)):{};return {fields:p,dataFields:s,roleFields:F,linkFields:a,usedFields:g,usedLinkFields:a.filter(d=>g.includes(d)),usedRoleFields:F.filter(d=>g.includes(d)),unidentifiedFields:o,...R.length?{localFilters:u}:{},...t.length?{nestedFilters:n}:{}}};var Ht=f=>{if(typeof f!="string")throw new Error("capitalizeFirstLetter: string is not a string");return f.charAt(0).toUpperCase()+f.slice(1).toLowerCase()},G=(f,e,s)=>{let F=(s.nodePath||"").split("."),p=radash.isArray(e)?F.slice(0,-2).join("."):F.slice(0,-1).join(".");return e?objectTraversal.getNodeByPath(f,p):{}},X=f=>Reflect.ownKeys(f).filter(e=>typeof e=="symbol").reduce((e,s)=>(e[s]=f[s],e),{}),Ut=f=>Object.keys(f).filter(e=>!e.startsWith("$")).length,st=f=>radash.isObject(f)&&("$entity"in f||"$relation"in f||"$thing"in f);var Kt=async(f,e)=>{let{bqlRequest:s,config:a,tqlRequest:F}=f,{rawTqlRes:p}=e;if(s){if(!p)throw new Error("TQL query not executed")}else throw new Error("BQL request not parsed");let{query:h}=s;if(!h){if(p.insertions?.length===0&&!F?.deletions){e.bqlRes={};return}let{mutation:w}=s;if(!w)throw new Error("TQL mutation not executed");let R=[...w.things,...w.edges].map(t=>{let o=p.insertions?.find(u=>u.get(`${t.$bzId}`))?.get(`${t.$bzId}`);if(t.$op==="create"||t.$op==="update"||t.$op==="link"){let u=o?.asThing().iid;return a.mutation?.noMetadata?radash.mapEntries(t,(n,d)=>[n.toString().startsWith("$")?Symbol.for(n):n,d]):{$dbId:u,...t,[t.path]:t.$id}}if(t.$op==="delete"||t.$op==="unlink")return t;if(t.$op!=="match")throw new Error(`Unsupported op ${t.$op}`)}).filter(t=>t);e.bqlRes=R;return}};var Je=(f,e)=>immer.produce(f,s=>objectTraversal.traverse(s,({value:a})=>{if(Array.isArray(a)||typeof a!="object"||a===null)return;a.$tempId&&(a.$tempId=`_:${a.$tempId}`),a.$fields&&delete a.$fields,a.$filter&&delete a.$filter,a.$show&&delete a.$show,a.$bzId&&delete a.$bzId,e.query?.noMetadata&&(a.$entity||a.$relation)&&(delete a.$entity,delete a.$relation,delete a.$id),Object.getOwnPropertySymbols(a).forEach(p=>{delete a[p];}),a.$excludedFields&&(a.$excludedFields.forEach(p=>{delete a[p];}),delete a.$excludedFields);})),Ze=(f,e)=>{let s={};return e.forEach(a=>{s[a.$bzId]=a.$id;}),f.forEach(a=>{Object.keys(a).forEach(F=>{s[a[F]]&&F!=="$tempId"&&(a[F]=s[a[F]]);});}),f},Ye=(f,e)=>{let s=e.map(F=>F.$bzId),a=!1;return f.forEach(F=>{Object.keys(F).forEach(p=>{s.includes(F[p])&&(a=!0);});}),a},Jt=async(f,e)=>{let{bqlRequest:s,config:a}=f;if(!s)throw new Error("BQL request not parsed");let F=e.bqlRes[0]?e.bqlRes:[e.bqlRes],p=f.bqlRequest?.mutation?.things;if(Ye(F,p)){let g=Ze(F,p);e.bqlRes=g[1]?g:g[0];}let w=Je(e.bqlRes,a);e.bqlRes=w;};var Zt=async f=>{let{bqlRequest:e,schema:s}=f;if(!e)throw new Error("BQL request not parsed");let{mutation:a}=e;if(!a)throw new Error("BQL request is not a mutation");let F=n=>{let d=n.$op,i=`$${n.$bzId}`,c=N(s,n),{idFields:r,defaultDBConnector:b}=c,P=b?.path||n.$entity||n.$relation,l=n.$id,T=r?.[0],A=radash.listify(n,(y,L)=>{if(y.startsWith("$")||y===T||L===void 0||L===null)return "";let O=c.dataFields?.find(j=>j.path===y);if(!O?.path)return "";let D=O.dbPath;if(["TEXT","ID","EMAIL"].includes(O.contentType))return `has ${D} '${L}'`;if(["NUMBER","BOOLEAN"].includes(O.contentType))return `has ${D} ${L}`;if(O.contentType==="DATE"){if(Number.isNaN(L.valueOf()))throw new Error("Invalid format, Nan Date");return L instanceof Date?`has ${D} ${L.toISOString().replace("Z","")}`:`has ${D} ${new Date(L).toISOString().replace("Z","")}`}throw new Error(`Unsupported contentType ${O.contentType}`)}).filter(y=>y),B=`${i}-atts`,M=radash.listify(n,y=>{if(y.startsWith("$")||y===T)return "";let L=c.dataFields?.find(D=>D.path===y);if(!L?.path)return "";let S=L.dbPath;return `{${B} isa ${S};}`}).filter(y=>y),k=n[Symbol.for("isLocalId")],m=radash.isArray(l)?`like '${l.join("|")}'`:`'${l}'`,Q=!k&&l?[`has ${T} ${m}`]:[],$=[...Q,...A].filter(y=>y).join(","),I=()=>{if(d==="delete"||d==="unlink"||d==="match")return `${i} isa ${[P,...Q].filter(y=>y).join(",")};`;if(d==="update"){if(!M.length)throw new Error("update without attributes");return `${i} isa ${[P,...Q].filter(y=>y).join(",")}, has ${B};
35
+ ${M.join(" or ")};`}return ""},E=()=>d==="update"||d==="link"||d==="match"?`${i} isa ${[P,...Q].filter(y=>y).join(",")};`:"";if(st(n))return {op:d,deletionMatch:I(),insertionMatch:E(),insertion:d==="create"?`${i} isa ${[P,$].filter(y=>y).join(",")};`:d==="update"&&A.length?`${i} ${A.join(",")};`:"",deletion:d==="delete"?`${i} isa ${P};`:d==="update"&&M.length?`${i} has ${B};`:""};throw new Error("in attributes")},p=n=>{let d=n.$op,i=N(s,n),c=`$${n.$bzId}`,r=n.$id,b=i.defaultDBConnector?.path||n.$relation,P="roles"in i?radash.listify(i.roles,y=>y):[],l=n.$relation&&"roles"in i&&radash.mapEntries(i.roles,(y,L)=>[y,L.dbConnector?.path||y]),T=radash.listify(n,(y,L)=>{if(!P.includes(y))return null;if(!("roles"in i))throw new Error("This should have roles! ");let O=l[y];return Array.isArray(L)?L.map(S=>({path:O,id:S})):{path:O,id:L}}).filter(y=>y).flat(),A=T.map(y=>{if(!y?.path)throw new Error("Object without path");return `${y.path}: $${y.id}`}),B=T.length>0?`( ${A.join(" , ")} )`:"",M=n[Symbol.for("edgeType")];if(!M)throw new Error("[internal error] Symbol edgeType not defined");let k=B?`${c} ${B} ${M==="linkField"||d==="delete"||d==="unlink"?`isa ${b}`:""}`:"",m=`${c} ${M==="linkField"||d==="delete"?`isa ${b}`:""}`,Q=()=>k?d==="link"?`${k};`:d==="create"?`${k}, has id '${r}';`:"":"",$=()=>k&&d==="match"?`${k};`:"",I=()=>k?d==="delete"?`${k};`:d==="match"?`${k};`:"":"",E=()=>k?d==="delete"?`${m};`:d==="unlink"?`${c} ${B};`:"":"";return {deletionMatch:I(),insertionMatch:$(),deletion:E(),insertion:Q(),op:""}},h=(n,d)=>{let i=d==="edges"?p:F;if(Array.isArray(n))return n.map(T=>{let{preDeletionBatch:A,insertionMatch:B,deletionMatch:M,insertion:k,deletion:m}=i(T);return radash.shake({preDeletionBatch:A,insertionMatch:B,deletionMatch:M,insertion:k,deletion:m},Q=>!Q)}).filter(T=>T);let{preDeletionBatch:c,insertionMatch:r,deletionMatch:b,insertion:P,deletion:l}=i(n);return radash.shake({preDeletionBatch:c,insertionMatch:r,deletionMatch:b,insertion:P,deletion:l},T=>!T)},w=h(a.things),g=Array.isArray(w)?w:[w],R=h(a.edges,"edges"),t=Array.isArray(R)?R:[R],o=[...g,...t],u=radash.shake({insertionMatches:o.map(n=>n.insertionMatch).join(" ").trim(),deletionMatches:o.map(n=>n.deletionMatch).join(" ").trim(),insertions:o.map(n=>n.insertion).join(" ").trim(),deletions:o.map(n=>n.deletion).join(" ").trim()},n=>!n);f.tqlRequest=u;};var ti=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm,ei=/(\s*async\s*|\s*function\s*|\s*\(\s*|\s*\)\s*=>|\s*\)\s*\{)/,Yt=f=>{let s=f.toString().replace(ti,"").trim().split("=>")[0].split("{")[0].replace(ei,"").trim(),a=s.substring(s.indexOf("(")+1,s.lastIndexOf(")")).trim();return a?(a.match(/(\{[^}]*\}|[^,]+)/g)||[]).flatMap(p=>p.includes("{")&&p.includes("}")?(p.replace(/^\{|\}$/g,"").match(/(?:[^,"']+|"[^"]*"|'[^']*')+/g)||[]).map(w=>w.split(":")[0].trim().replace(/['"[\]]/g,"")):p.trim()).filter(Boolean):[]};var tt=({currentThing:f,fieldSchema:e,mandatoryDependencies:s=!1})=>{if(!e||!e.default||!("fn"in e.default||"value"in e.default))throw new Error(`[Internal] Virtual field: No field schema found, or wrongly configured. Field: ${JSON.stringify(e,null,3)}`);if(e.default.type==="value")return e.default.value;if(s){let{fn:F}=e.default,h=Yt(F).filter(w=>!(w in f));if(h.length)throw new Error(`Virtual field: Missing arguments ${h.join(", ")}`)}return "default"in e?e.default?.fn(f):void 0},Gt=()=>{};var ht=Symbol.for("schema"),H=Symbol.for("queryPath");var ri=f=>{if(!f.startsWith("_:"))throw new Error('TempIds must start with "_:"');let e=f.substring(2);if(!/^[a-zA-Z0-9-_]+$/.test(e))throw new Error("$tempId must contain only alphanumeric characters, hyphens, and underscores.");if(f.length>36)throw new Error("$tempId must not be longer than 36 characters.");return e},te=async f=>{let{rawBqlRequest:e,schema:s}=f,F=(o=>immer.produce(o,u=>objectTraversal.traverse(u,({value:n,key:d,parent:i})=>{if(radash.isObject(n)&&(n=radash.shake(n,c=>c===void 0)),d==="$tempId"&&(i[d]=ri(n)),i&&radash.isArray(n)){if(!n.some(r=>typeof r=="object"&&"$id"in r))return;let c=n.flatMap(r=>typeof r=="string"?r:typeof r=="object"&&"$id"in r&&radash.isArray(r.$id)?r.$id.map(b=>({...r,$id:b})):r);i[d]=c;}})))(e),h=(o=>immer.produce(o,u=>objectTraversal.traverse(u,({value:n,meta:d,key:i})=>{if(radash.isObject(n)){if(n.$arrayOp)throw new Error("Array op not supported yet");if(i==="$filter"||d.nodePath?.includes(".$filter."))return;let c=n;if(c.$op==="create"&&c.$id)throw new Error("Can't write to computed field $id. Try writing to the id field directly.");let r=N(s,c),P=Object.keys(c).filter($=>r.virtualFields?.includes($));if(P.length>0){let $=P.filter(I=>c[I]);if($.length>0)throw new Error(`Can't set virtual fields: ["${$.join('","')}"]`)}let T=d.nodePath?.split(".")?.filter($=>Number.isNaN(parseInt($,10))).join(".");if(!r)throw new Error(`Schema not found for ${c.$entity||c.$relation}`);c.$bzId=c.$tempId??`T_${uuid.v4()}`,!T&&!c.$op&&(c.$id||c.$filter?c.$op="update":c.$op="create"),c[ht]=r,c[Symbol.for("dbId")]=r.defaultDBConnector.id;let{usedLinkFields:A,usedRoleFields:B}=nt(r,c),M=A.map($=>({fieldType:"linkField",path:$,schema:r.linkFields.find(I=>I.path===$)})),k=r.thingType==="relation"?B.map($=>({fieldType:"roleField",path:$,schema:ft(r.roles,I=>I===$)})):[];if(M.some($=>$.schema?.target==="role")&&M.some($=>$.schema?.target==="relation"))throw new Error("Unsupported: Can't use a link field with target === 'role' and another with target === 'relation' in the same mutation.");let m=k.filter($=>[...new Set($.schema.playedBy?.map(I=>I.thing))].length!==1);if(m.length>1)throw new Error(`Field: ${m[0].path} - If a role can be played by multiple things, you must specify the thing in the mutation: ${JSON.stringify(m[0].schema.playedBy)}. Schema: ${JSON.stringify(m[0].schema)}`);let Q=d.nodePath;if([...M,...k].forEach($=>{let I=c[$.path];if(I===void 0)return;let E=$.schema;if(!E)throw new Error(`Field ${$.path} not found in schema`);let y=$.fieldType==="roleField"?E?.playedBy[0]:E,O=E&&"relation"in E&&y?.relation===c.$relation?"$self":y?.relation?y?.relation:"$self",S=O==="$self"?r:s.relations[O];if(ft(S.roles,(q,C)=>q===$.path)?.playedBy?.length===0)throw new Error(`unused role: ${Q}.${$.path}`);if(!E)throw new Error(`Field ${$.path} not found in schema`);let j=$.fieldType==="linkField"?E?.oppositeLinkFieldsPlayedBy:E?.playedBy;if(!j)throw new Error(`No opposite fields found for ${JSON.stringify(E)}`);if([...new Set(j?.map(q=>q.thing))].length>1)throw new Error(`Field: ${$.path} - If a role can be played by multiple things, you must specify the thing in the mutation: ${JSON.stringify(j)}. Schema: ${JSON.stringify(E)}`);if(E.cardinality==="ONE"&&Array.isArray(I))throw new Error("Can't have an array in a cardinality === ONE link field");if(E.cardinality==="MANY"&&I!==null&&!Array.isArray(I)&&!I.$arrayOp)throw new Error(`${$.fieldType==="linkField"?E.path:E.name} is a cardinality === MANY thing. Use an array or a $arrayOp object`);if(st(I))return;let[v]=j,U="plays"in E?"linkField":"roleField",J={[`$${v.thingType}`]:v.thing,[Symbol.for("relation")]:O,[Symbol.for("edgeType")]:U,[Symbol.for("role")]:v.plays,[Symbol.for("oppositeRole")]:"plays"in E?E.plays:void 0,[Symbol.for("relFieldSchema")]:E};if(radash.isObject(I)){let q=I;if(!q.$op&&!q.$id&&!q.$filter&&!q.$tempId&&c.$op!=="create")throw new Error(`Please specify if it is a create or an update. Path: ${d.nodePath?`${d.nodePath}.`:""}${$.path}`);c[$.path]={...J,...q,$op:q.$op?q.$op:q.$id||q.$filter?"link":c.$op==="create"?"create":"update"};}if(Array.isArray(I))if(I.every(q=>radash.isObject(q)))c[$.path]=I.map(q=>({...J,...q,$op:q.$op?q.$op:q.$id||q.$filter?Ut(q)?"update":"link":"create"}));else if(I.every(q=>typeof q=="string"))c[$.path]=I.map(q=>({...J,$op:c.$op==="create"?"link":"replace",$id:q}));else throw new Error(`Invalid array value for ${$.path}`);if(typeof I=="string"&&(c[$.path]={...J,$op:c.$op==="create"?"link":"replace",$id:I}),I===null){let q={...J,$op:"unlink"};c[$.path]=E.cardinality==="MANY"?[q]:q;}}),!T&&!c.$entity&&!c.$relation)throw new Error("Root things must specify $entity or $relation")}})))(F),g=(o=>immer.produce(o,u=>objectTraversal.traverse(u,({parent:n,key:d,value:i,meta:c})=>{if(radash.isObject(i)){if(Object.keys(i).length===0)throw new Error("Empty object!");if(d==="$filter"||c.nodePath?.includes(".$filter."))return;let r=i,b=c.nodePath?.split(".");if(r.$tempId&&!(r.$op===void 0||r.$op==="link"||r.$op==="create"||r.$op==="update"))throw new Error(`Invalid op ${r.$op} for tempId. TempIds can be created, or when created in another part of the same mutation. In the future maybe we can use them to catch stuff in the DB as well and group them under the same tempId.`);let P=b?.filter(B=>Number.isNaN(parseInt(B,10))).join("."),l=P?Array.isArray(n)?b?.slice(0,-1).join("."):c.nodePath:c.nodePath||"",A=G(o,n,c)?.$op;if(P&&!A)throw new Error("Error: Parent $op not detected");if(r.$op==="replace"&&A==="create"&&(r.$op="link"),n||(r.$parentKey=""),typeof n=="object"&&(Array.isArray(n)&&(r[Symbol.for("index")]=d),r[Symbol.for("path")]=l,r[Symbol.for("isRoot")]=!P,r[Symbol.for("depth")]=P?.split(".").length),!r.$entity&&!r.$relation)throw new Error(`Node ${JSON.stringify(r)} without $entity/$relation`)}})))(h),t=(o=>immer.produce(o,u=>objectTraversal.traverse(u,({value:n})=>{if(radash.isObject(n)){let d=n,i=N(s,d),{unidentifiedFields:c}=nt(i,d),{idFields:r}=i;if(!r)throw new Error("No idFields found");let[b]=r;if(d.$op==="create"&&!d[b]){let P=i.dataFields?.find(T=>T.path===b),l=tt({currentThing:d,fieldSchema:P,mandatoryDependencies:!0});if(typeof l!="string")throw new Error(`Default id field ${b} is not a string`);d[b]=l,d.$id=l;}if(c.length>0)throw new Error(`Unknown fields: [${c.join(",")}] in ${JSON.stringify(d)}`)}})))(g);f.filledBqlRequest=t;};var ee=f=>{let e=({value:s})=>(s&&typeof s=="object"&&"$id"in s&&(Object.keys(s).filter(p=>p.startsWith("$")).forEach(p=>delete s[p]),Object.keys(s).filter(p=>typeof p=="symbol").forEach(p=>delete s[p])),s);return immer.produce(f,s=>objectTraversal.traverse(s,e))};var oe=async f=>{let{filledBqlRequest:e,schema:s}=f,a=t=>{let o=[],u=[],n=r=>{if(r.$id)return r.$id;let b=N(s,r),{idFields:P}=b;if(!P)throw new Error(`no idFields: ${JSON.stringify(r)}`);let[l]=P;if(!l)throw new Error(`no idField: ${JSON.stringify(r)}`);let T=b.dataFields?.find(M=>M.path===l),A=tt({currentThing:r,fieldSchema:T,mandatoryDependencies:!0}),B=r[l]||r.$id||A;if(!B)throw new Error(`no idValue: ${JSON.stringify(r)}`);return B},d=r=>{if(r.$op==="create"){let b=n(r);if(o.find(P=>P.$id===b))throw new Error(`Duplicate id ${b} for node ${JSON.stringify(r)}`);if(u.find(P=>P.$bzId===r.$bzId))throw new Error(`Duplicate $bzid ${r.$bzId} for node ${JSON.stringify(r)}`);o.push({...r,$id:b});return}r.$tempId&&r.$op==="match"||o.push(r);},i=r=>{if(r.$op==="create"){let b=n(r);if(o.find(P=>P.$id===b),u.find(P=>P.$bzId===r.$bzId))throw new Error(`Duplicate %bzId ${r.$bzIdd} for edge ${JSON.stringify(r)}`);u.push({...r,$id:b});return}u.push(r);};return objectTraversal.traverse(t,({value:r,meta:b,parent:P})=>{if(!radash.isObject(r))return;let l=r;if(l.$entity||l.$relation){if(!l.$op)throw new Error(`Operation should be defined at this step ${JSON.stringify(l)}`);if(!l.$bzId)throw new Error("[internal error] BzId not found");let T=N(s,l),{dataFields:A,roleFields:B,linkFields:M,usedFields:k}=nt(T,l),m=()=>{if(l.$op==="create"||l.$op==="delete")return l.$op;if(l.$op==="update"){let $=k.filter(y=>A?.includes(y)),I=k.filter(y=>B?.includes(y)),E=k.filter(y=>M?.includes(y));if($.length>0)return "update";if(I.length>0||E.length>0)return "match";throw new Error(`No fields on an $op:"update" for node ${JSON.stringify(l)}`)}return "match"},Q={...l.$entity&&{$entity:l.$entity},...l.$relation&&{$relation:l.$relation},...l.$id&&{$id:l.$id},...l.$tempId&&{$tempId:l.$tempId},...l.$filter&&{$filter:l.$filter},...radash.shake(radash.pick(l,A||[""])),$op:m(),$bzId:l.$tempId?l.$tempId:l.$bzId,[Symbol.for("dbId")]:T.defaultDBConnector.id,[Symbol.for("path")]:l[Symbol.for("path")],[Symbol.for("isRoot")]:l[Symbol.for("isRoot")],[Symbol.for("isLocalId")]:l[Symbol.for("isLocalId")]||!1};if(d(Q),l[Symbol.for("relation")]&&l[Symbol.for("edgeType")]==="linkField"){if((l.$op==="link"||l.$op==="unlink")&&(l.$id||l.$filter)){if(l.$tempId)throw new Error("can't specify a existing and a new element at once. Use an id/filter or a tempId");o.push({...l,$op:"match"});}let $=l[Symbol.for("relation")]===l.$relation,I=$?l.$bzId:`LT_${uuid.v4()}`,y=G(t,P,b).$bzId;if(!y)throw new Error("No parent id found");if(l[Symbol.for("relation")]==="$self")return;let L=()=>{if(l.$op==="delete")return $?"match":"delete";if(l.$op==="unlink")return $?"unlink":"delete";if(l.$op==="link"||l.$op==="create")return $?"link":"create";if(l.$op==="replace")throw new Error("Unsupported: Nested replaces not implemented yet");return "match"},O={$relation:l[Symbol.for("relation")],$bzId:I,...l.$tempId?{$tempId:l.$tempId}:{},$op:L(),...$?{}:{[l[Symbol.for("role")]]:l.$bzId},[l[Symbol.for("oppositeRole")]]:y,[Symbol.for("dbId")]:s.relations[l[Symbol.for("relation")]].defaultDBConnector.id,[Symbol.for("edgeType")]:"linkField",[Symbol.for("info")]:"normal linkField",[Symbol.for("path")]:l[Symbol.for("path")]};i(O),(l.$op==="unlink"||L()==="unlink")&&$&&i({$relation:l[Symbol.for("relation")],$bzId:I,$op:"match",[l[Symbol.for("oppositeRole")]]:y,[Symbol.for("dbId")]:s.relations[l[Symbol.for("relation")]].defaultDBConnector.id,[Symbol.for("edgeType")]:"linkField",[Symbol.for("info")]:"additional ownrelation unlink linkField",[Symbol.for("path")]:l[Symbol.for("path")]});}if(l.$relation){let $=ut(l,(y,L)=>B.includes(y)),I=radash.mapEntries($,(y,L)=>radash.isArray(L)?[y,L]:radash.isObject(L)?[y,L.$bzId]:[y,L]),E=ut(r,(y,L)=>y.startsWith("$")||y.startsWith("Symbol"));if(Object.keys($).filter(y=>!y.startsWith("$")).length>0){if(l.$op==="create"||l.$op==="delete"){let y=()=>{if(l.$op==="create")return "link";if(l.$op==="delete")return "match";throw new Error("Unsupported parent of edge op")},L=radash.mapEntries(I,(S,D)=>Array.isArray(D)?[S,D.map(j=>j.$bzId||j)]:[S,D.$bzId||D]),O={...E,$relation:l.$relation,$op:y(),...L,$bzId:l.$bzId,[Symbol.for("path")]:l[Symbol.for("path")],[Symbol.for("dbId")]:T.defaultDBConnector.id,[Symbol.for("info")]:"coming from created or deleted relation",[Symbol.for("edgeType")]:"roleField on C/D"};i(O);return}if(l.$op==="match"||l.$op==="update"&&Object.keys($).length>0){let y=0;Object.entries($).forEach(([L,O])=>{let S=radash.isArray(O)?O:[O],D=j=>j==="create"||j==="replace"?"link":j;S.forEach(j=>{if(!j)return;let v=D(j.$op);if(v==="replace")throw new Error("Not supported yet: replace on roleFields");if(v==="unlink"&&y>0)throw y+=1,new Error("Not supported yet: Cannot unlink more than one role at a time, please split into two mutations");let U={...E,$relation:l.$relation,$op:v==="delete"?"unlink":v,[L]:j.$bzId,$bzId:l.$bzId,[Symbol.for("dbId")]:T.defaultDBConnector.id,[Symbol.for("path")]:l[Symbol.for("path")],[Symbol.for("info")]:"updating roleFields",[Symbol.for("edgeType")]:"roleField on L/U/R"};i(U);});});}}}}}),[o,u]};if(!e)throw new Error("Undefined filledBqlRequest");let [F,p]=a(e),h=F.reduce((t,o)=>{if(!o.$bzId)return [...t,o];let u=t.findIndex(n=>n.$bzId===o.$bzId);if(u===-1)return [...t,o];if(t[u].$op==="create"&&o.$op==="match")return t;if(t[u].$op==="match"&&(o.$op==="create"||o.$op==="match"))return [...t.slice(0,u),o,...t.slice(u+1)];throw new Error(`Unsupported operation combination for $tempId "${o.$tempId}". Existing: ${t[u].$op}. Current: ${o.$op}`)},[]),w=p.reduce((t,o)=>{let u=t.find(n=>(n.$id&&n.$id===o.$id||n.$bzId&&n.$bzId===o.$bzId)&&n.$relation===o.$relation&&n.$op===o.$op);if(u){let n={...u};return Object.keys(o).forEach(i=>{if(typeof i=="symbol"||i.startsWith("$"))return;let c=u[i],r=o[i];Array.isArray(c)&&Array.isArray(r)?n[i]=Array.from(new Set([...c,...r])):!Array.isArray(c)&&Array.isArray(r)?c!==void 0?n[i]=Array.from(new Set([c,...r])):n[i]=r:Array.isArray(c)&&!Array.isArray(r)?r!==void 0&&(n[i]=Array.from(new Set([...c,r]))):c!==null&&r!==null&&c!==void 0&&r!==void 0?n[i]=Array.from(new Set([c,r])):c==null&&(n[i]=r);}),[...t.filter(i=>!((i.$id&&i.$id===o.$id||i.$bzId&&i.$bzId===o.$bzId)&&i.$relation===o.$relation&&i.$op===o.$op)),n]}return [...t,o]},[]);[...new Set(w.map(t=>t.$relation))];h.forEach(t=>{if("$relation"in t&&w.filter(o=>o.$bzId===t.$bzId||o.$tempId&&o.$tempId===t.$tempId).length===0){if(t.$op==="delete"||t.$op==="match"||t.$op==="update")return;throw new Error(`[Borm] Can't create a relation without any player. Node: ${JSON.stringify(ee(t))}`)}}),f.bqlRequest={mutation:{things:h,edges:w}};};var $t=async(f,e)=>{let s=e.dbConnectors[0].id,a=f.typeDB.get(s)?.session,F=f.typeDB.get(s)?.client;if(!a||!a.isOpen()){if(!F)throw new Error("Client not found");a=await F.session(e.dbConnectors[0].dbName,typedbDriver.SessionType.DATA),f.typeDB.set(s,{client:F,session:a});}return {client:F,session:a}};var se=async(f,e)=>{let{dbHandles:s,tqlRequest:a,bqlRequest:F,config:p}=f;if(!a)throw new Error("TQL request not built");if(!(a.deletions&&a.deletionMatches||a.insertions))throw new Error("TQL request error, no things");if(!F?.mutation)throw new Error("BQL mutation not parsed");let{session:h}=await $t(s,p),w=await h.transaction(typedbDriver.TransactionType.WRITE);if(!w)throw new Error("Can't create transaction");let g=a.deletionMatches&&a.deletions&&`match ${a.deletionMatches} delete ${a.deletions}`,R=a.insertions&&`${a.insertionMatches?`match ${a.insertionMatches}`:""} insert ${a.insertions}`;g&&await w.query.delete(g);let t=R&&w.query.insert(R);try{let o=t?await t.collect():void 0;await w.commit(),await w.close(),e.rawTqlRes={insertions:o};}catch(o){throw await w.close(),new Error(`Transaction failed: ${o.message}`)}};var W="___",ae=async f=>{let{enrichedBqlQuery:e}=f;if(!e)throw new Error("BQL query not enriched");let s="",a=(t,o)=>{let u="",n="";for(let d in t){let i=t[d];if(Array.isArray(i))for(let c=0;c<i.length;c++)n+=`{$${o} has ${d} "${i[c]}";}`,c<i.length-1?n+="or":n+=";";else u+=`, has ${d} "${i}"`;}u+=`;
36
+ `,s+=u,s+=n;},F=(t,o)=>{let u=[],n=[],d="";for(let r=0;r<t.length;r++)t[r].$isVirtual||u.push(` ${t[r].$dbPath}`),n.push(`{${t[r].$dbPath}:${t[r].$as}}`);let i=`${u.join(",")};
37
+ `;d=n.join(",");let c=`$metadata:{as:[${d}]}`;s+=`$${o} as "${o}.${c}.$dataFields": `,s+=i;},p=(t,o,u)=>{for(let n of t){let{$fields:d,$as:i,$justId:c,$idNotIncluded:r,$filterByUnique:b}=n,P=n[H],l=`$metadata:{as:${i},justId:${c?"T":"F"},idNotIncluded:${r},filterByUnique:${b}}`;if(s+=`"${u}.${l}.${n.$var}":{
38
+ `,s+=` match
39
+ `,n.$filter&&(s+=` $${o}${W}${n.$var} isa ${n.$thing}`,a(n.$filter,`${o}${W}${n.$var}`)),s+=` $${o} (${n.$var}: $${o}${W}${n.$var}) isa ${n.$intermediary};
40
+ `,d){let T=`M_${uuid.v4()}`;s+=`?queryPath${T} = "${P}";
41
+ `,s+=` fetch
42
+ `,s+=`?queryPath${T} as "queryPath"
43
+ ;`;let A=d?.filter(k=>k.$fieldType==="data");A&&A.length>0&&F(A,`${o}${W}${n.$var}`,`${o}.${n.$var}`);let B=d?.filter(k=>k.$fieldType==="link");B&&B.length>0&&h(B,`${o}${W}${n.$var}`,`${o}.${n.$var}`);let M=d?.filter(k=>k.$fieldType==="role");M&&M.length>0&&p(M,`${o}${W}${n.$var}`,`${o}.${n.$var}`);}s+=`};
44
+ `;}},h=(t,o,u)=>{for(let n of t){let{$fields:d,$as:i,$justId:c,$idNotIncluded:r,$filterByUnique:b,$playedBy:P}=n,l=n[H],T=`$metadata:{as:${i},justId:${c?"T":"F"},idNotIncluded:${r},filterByUnique:${b}}`;if(s+=`"${u}.${T}.${n.$var}":{
45
+ `,s+=` match
46
+ `,n.$filter&&(s+=` $${o}${W}${n.$var} isa ${n.$thing}`,a(n.$filter,`${o}${W}${n.$var}`)),n.$target==="role"?s+=` $${o}_intermediary (${n.$plays}: $${o}, ${P.plays}: $${o}${W}${n.$var}) isa ${n.$intermediary};
47
+ `:s+=` $${o}${W}${n.$var} (${n.$plays}: $${o}) isa ${n.$thing};
48
+ `,d){let A=`M_${uuid.v4()}`;s+=`?queryPath${A} = "${l}";
49
+ `,s+=` fetch
50
+ `,s+=`?queryPath${A} as "queryPath"
51
+ ;`;let B=d?.filter(m=>m.$fieldType==="data");B&&B.length>0&&F(B,`${o}${W}${n.$var}`);let M=d?.filter(m=>m.$fieldType==="link");M&&M.length>0&&h(M,`${o}${W}${n.$var}`,`${o}.${n.$var}`);let k=d?.filter(m=>m.$fieldType==="role");k&&k.length>0&&p(k,`${o}${W}${n.$var}`,`${o}.${n.$var}`);}s+=`};
52
+ `;}},w=e.length>1,g=[];(t=>{if(w)for(let o of t){let{$path:u,$thing:n,$filter:d,$fields:i}=o;if(!u)throw new Error("Path is not defined");let c=o[H];s+=`match
53
+ $${u} isa ${n} `,d?a(d,u):s+="; ";let r=`M_${uuid.v4()}`;if(s+=`?queryPath${r} = "${c}";
54
+ `,s+=`fetch
55
+ `,s+=`?queryPath${r} as "queryPath"
56
+ ;`,i){let b=i.filter(T=>T.$fieldType==="data");b&&b.length>0&&F(b,u);let P=i.filter(T=>T.$fieldType==="link");P&&P.length>0&&h(P,u,u);let l=i.filter(T=>T.$fieldType==="role");l&&l.length>0&&p(l,u,u);}g.push(s),s="";}else for(let o of t){let{$path:u,$thing:n,$filter:d,$fields:i}=o;if(!u||u==="undefined")throw new Error("Path is not defined");let c=o[H];if(s+=`match
57
+ $${u} isa ${n} `,d?a(d,u):s+="; ",s+=`?queryPath = "${c}";
58
+ `,s+=`fetch
59
+ `,s+=`?queryPath as "queryPath"
60
+ ;`,i){let r=i.filter(l=>l.$fieldType==="data");r&&r.length>0&&F(r,u);let b=i.filter(l=>l.$fieldType==="link");b&&b.length>0&&h(b,u,u);let P=i.filter(l=>l.$fieldType==="role");P&&P.length>0&&p(P,u,u);}}})(e),f.tqlRequest=w?g:s;};var qt=f=>{let e=f.dataFields?.map(p=>p.path)||[],s=f.linkFields?.map(p=>p.path)||[],a=Object.keys(f.roles||{})||[];return [...e,...s,...a]},Ct=(f,e)=>Object.keys(f||{}).some(a=>{if(!Array.isArray(f[a])){let F=e.idFields?.includes(a),p=e.dataFields?.some(h=>(h.dbPath===a||h.path===a)&&h?.validations?.unique);return F||p}return !1}),jt=(f,e)=>{let s=e.dataFields?.map(h=>({path:h.path,dbPath:h.dbPath}))||[],a=e.linkFields?.map(h=>({path:h.path,dbPath:h.dbPath}))||[],F=Object.keys(e.roles||{}).map(h=>({path:h,dbPath:h}))||[],p=[...s,...a,...F];return Object.entries(f||{}).reduce((h,[w,g])=>{let R=p.find(t=>t.path===w);return h[R?.dbPath||w]=g,h},{})},de=async f=>{let{rawBqlRequest:e,schema:s}=f;if(Array.isArray(e)){for(let t of e)if(!("$entity"in t)&&!("$relation"in t)&&(!("$thing"in t)||!("$thingType"in t)))throw new Error("No entity specified in query")}else if(!("$entity"in e)&&!("$relation"in e)&&(!("$thing"in e)||!("$thingType"in e)))throw new Error("No entity specified in query");let a=(t,o)=>typeof o=="string"?t.idFields?.includes(o):t.idFields?.includes(o.$path),F=(t,o,u,n,d)=>({$path:o,$dbPath:n,$thingType:"attribute",$as:t.$as||o,$var:o,$fieldType:"data",$excludedFields:t.$excludedFields,$justId:u,$id:t.$id,$filter:t.$filter,$isVirtual:d,$filterProcessed:!0}),p=(t,o,u,n,d)=>{let{target:i,oppositeLinkFieldsPlayedBy:c}=u;return c.map(r=>{let b=i==="role"?r.thingType:"relation",P=i==="role"?r.thing:u.relation,l={[`$${b}`]:P},T=N(s,l),A=t?.$fields?.filter(M=>a(T,M)).length===0,B=[];return typeof t!="string"?t.$fields?A?B=[...t.$fields,...T.idFields]:B=t.$fields:B=qt(T):B=["id"],t.$excludedFields&&(B=B.filter(M=>a(T,M)?!0:!t.$excludedFields.includes(M.$path))),{$thingType:b,$plays:u.plays,$playedBy:r,$path:r.path,$dbPath:d,$as:t.$as||o,$var:o,$thing:P,$fields:B,$excludedFields:t.$excludedFields,$fieldType:"link",$target:i,$intermediary:r.relation,$justId:n,$id:t.$id,$filter:jt(t.$filter,T),$idNotIncluded:A,$filterByUnique:Ct(t.$filter,T),$filterProcessed:!0}})},h=(t,o,u,n,d)=>u.playedBy.map(i=>{let{thing:c,thingType:r,relation:b}=i,P={[`$${r}`]:c},l=N(s,P),T=t?.$fields?.filter(B=>l?.idFields?.includes(B)||l?.idFields?.includes(B.$path)).length===0,A=[];return typeof t!="string"?t.$fields?T?A=[...t.$fields,...l.idFields]:A=t.$fields:A=qt(l):A=["id"],t.$excludedFields&&(A=A.filter(B=>a(l,B)?!0:!t.$excludedFields.includes(B.$path))),{$thingType:r,$path:o,$dbPath:d,$as:t.$as||o,$var:o,$thing:c,$fields:A,$excludedFields:t.$excludedFields,$fieldType:"role",$intermediary:b,$justId:n,$id:t.$id,$filter:jt(t.$filter,l),$idNotIncluded:T,$filterByUnique:Ct(t.$filter,l),$playedBy:i,$filterProcessed:!0}}),w=(t,o)=>{let u=typeof t=="string"?t:t.$path,n=typeof t=="string",d=o.dataFields?.find(r=>r.path===u),i=o.linkFields?.find(r=>r.path===u),c=o.roles?.[u];if(d){let r=d.isVirtual&&d.default;return F(t,u,n,d.dbPath,r)}else {if(i)return p(t,u,i,n,i.dbPath);if(c)return h(t,u,c,n,c.dbPath)}return null},R=(t=>immer.produce(t,o=>objectTraversal.traverse(o,u=>{let{value:n,meta:d}=u,i=n;if(radash.isObject(i)){if(i.$id){let c=i.$entity||i.$relation?i:{[`$${i.$thingType}`]:i.$thing},r=N(s,c);if(!r?.name)throw new Error(`Schema not found for ${i.$thing}`);if(i.$path=r.name,Array.isArray(i.$id)||(i.$filterByUnique=!0),r?.idFields?.length===1){let[b]=r.idFields;i.$filter={...i.$filter,[b]:i.$id},delete i.$id;}else throw new Error("Multiple ids not yet enabled / composite ids")}else if("$entity"in i||"$relation"in i||"$thing"in i){let c=N(s,i);if(!c?.name)throw new Error(`Schema not found for ${i.$thing}`);i.$path=c.name;}if(i.$entity?(i.$thing=i.$entity,i.$thingType="entity",delete i.$entity):i.$relation&&(i.$thing=i.$relation,i.$thingType="relation",delete i.$relation),radash.isObject(i)&&"$thing"in i){let c=i.$entity||i.$relation?i:{[`$${i.$thingType}`]:i.$thing};i[H]=d.nodePath;let r=N(s,c);if(i.$filter&&(i.$filterByUnique=Ct(i.$filter,r),i.$filterProcessed||(i.$filter=jt(i.$filter,r))),i.$fields){i.$fields.filter(l=>r?.idFields?.includes(l)||r?.idFields?.includes(l.$path)).length>0||(i.$fields=[...i.$fields,...Array.isArray(r.idFields)?r.idFields:[]],i.$idNotIncluded=!0);let P=i.$fields?.flatMap(l=>{let T=w(l,r);return Array.isArray(T)?T:[T]}).filter(Boolean);i.$fields=P;}else {let P=qt(r)?.flatMap(l=>{let T=w(l,r);return Array.isArray(T)?T:[T]}).filter(Boolean);i.$fields=P;}i.$excludedFields&&(i.$fields=i.$fields.filter(b=>a(r,b)?!0:!i.$excludedFields.includes(b.$path)));}}})))(Array.isArray(e)?e:[e]);f.enrichedBqlQuery=R;};var pe=async(f,e)=>{let{dbHandles:s,enrichedBqlQuery:a,tqlRequest:F,config:p}=f;if(!a)throw new Error("BQL request not parsed");if(!F)throw new Error("TQL request not built");let h=new typedbDriver.TypeDBOptions;if(h.infer=!0,Array.isArray(F)){let g=await radash.parallel(F.length,F,async R=>{let{session:t}=await $t(s,p),o=await t.transaction(typedbDriver.TransactionType.READ,h);if(!o)throw new Error("Can't create transaction");let n=await o.query.fetch(R).collect();return await o.close(),n});e.rawTqlRes=g,e.isBatched=!0;}else {let{session:g}=await $t(s,p),R=await g.transaction(typedbDriver.TransactionType.READ,h);if(!R)throw new Error("Can't create transaction");let o=await R.query.fetch(F).collect();await R.close(),e.rawTqlRes=o;}};var ue=f=>{let e=/as:([a-zA-Z0-9_\-·]+)/,s=/justId:([a-zA-Z0-9_\-·]+)/,a=/idNotIncluded:([a-zA-Z0-9_\-·]+)/,F=/filterByUnique:([a-zA-Z0-9_\-·]+)/,p=f.match(e),h=f.match(s),w=f.match(a),g=f.match(F);return {as:p?p[1]:null,justId:h?h[1]:null,idNotIncluded:w?w[1]:null,filterByUnique:g?g[1]:null}},gi=f=>{try{let s=(F=>{let p=F.replace("$metadata:","");return p=p.replace(/([a-zA-Z0-9_\-·]+)(?=:)/g,'"$1"'),p=p.replace(/:(\s*)([a-zA-Z0-9_\-·]+)/g,(h,w,g)=>/^{.*}$/.test(g)?`:${g}`:`:${w}"${g}"`),p=p.replace(/\[([^\]]+)\]/g,(h,w)=>`[${w.split(",").map(g=>g.trim().startsWith("{")&&g.trim().endsWith("}")?g.trim():`"${g.trim()}"`).join(",")}]`),p})(f);return JSON.parse(s)}catch(e){return console.error(e),{as:[]}}},fe=async(f,e)=>{let{enrichedBqlQuery:s,rawBqlRequest:a,schema:F,config:p}=f,{rawTqlRes:h,isBatched:w}=e;if(s){if(!h)throw new Error("TQL query not executed")}else throw new Error("BQL request not enriched");let g=(i,c)=>{let{$metaData:r}=i,{as:b}=gi(r),P=Object.entries(i).filter(([l])=>l!=="type"&&!l.includes("$")).map(([l,T])=>{let A=c.dataFields?.find(m=>m.path===l||m.dbPath===l),B=l==="id",M=Array.isArray(b)?b.find(m=>m[l])?.[l]:l,k;if(A?.cardinality==="ONE"){if(k=T[0]?T[0].value:p.query?.returnNulls?null:void 0,A.contentType==="DATE"&&(k=k&&`${k}Z`),B)return [[M,k],["$id",k]].filter(([m,Q])=>Q!==void 0)}else if(A?.cardinality==="MANY"){if(!radash.isArray(T))throw new Error("Typedb fetch has changed its format");if(T.length===0)return p.query?.returnNulls?[[M,null]]:[];A.contentType==="DATE"?k=T.map(m=>`${m.value}Z`):k=T.map(m=>m.value);}return [[M,k]].filter(([m,Q])=>Q!==void 0)}).flat();return Object.fromEntries([...P])},R=i=>i.reduce((c,r)=>{let{$roleFields:b,$metaData:P,$cardinality:l}=r,{as:T,justId:A,idNotIncluded:B,filterByUnique:M}=ue(P),k=b.map(m=>{let{dataFields:Q,currentSchema:$,linkFields:I,roleFields:E,schemaValue:y}=o(m),L=g(Q,$);if(A==="T")return L.id;{let O=t(I),S=R(E),D={...L};return B==="true"&&$?.idFields?.forEach(j=>delete D[j]),{...D,...O,...S,...y}}});return k.length>0?c[T]=l==="MANY"&&M==="false"?k:k[0]:p.query?.returnNulls&&(c[T]=null),c},{}),t=i=>i.reduce((c,r)=>{let{$linkFields:b,$metaData:P,$cardinality:l}=r,{as:T,justId:A,idNotIncluded:B,filterByUnique:M}=ue(P),k=b.map(m=>{let{dataFields:Q,currentSchema:$,linkFields:I,roleFields:E,schemaValue:y}=o(m),L=g(Q,$);if(A==="T")return L.id;{let O=t(I),S=R(E),D={...L};return B==="true"&&$.idFields?.forEach(j=>delete D[j]),{...D,...O,...S,...y}}});return c[T]=k.length>0?l==="MANY"&&M==="false"?k:k[0]:p.query?.returnNulls?null:void 0,c},{}),o=i=>{let c=Object.keys(i),r=c.find(m=>m.endsWith(".$dataFields"));if(!r)throw new Error("No datafields");let b=i[r],P=r.split(".")[r.split(".").length-2];if(b.$metaData=P,b.length===0)throw new Error("No datafields");let l=b.type,T={$thing:l.label,$thingType:l.root,[H]:i.queryPath.value},A={[`$${T.$thingType}`]:T.$thing},B=N(F,A),M=c.filter(m=>!m.endsWith(".$dataFields")&&B.linkFields?.some(Q=>Q.path===m.split(".").pop())).map(m=>({$linkFields:i[m],$key:m.split(".").pop(),$metaData:m.split(".")[m.split(".").length-2],$cardinality:B?.linkFields?.find(Q=>Q.path===m.split(".").pop())?.cardinality})),k=c.filter(m=>!m.endsWith(".$dataFields")&&B.roles?.[m.split(".").pop()]).map(m=>({$roleFields:i[m],$key:m.split(".").pop(),$metaData:m.split(".")[m.split(".").length-2],$cardinality:B.roles[m.split(".").pop()].cardinality}));return {dataFields:b,schemaValue:T,currentSchema:B,linkFields:M,roleFields:k}},u=i=>i.map(c=>{let{dataFields:r,currentSchema:b,linkFields:P,roleFields:l,schemaValue:T}=o(c),A=g(r,b),B=t(P),M=R(l),k=a?.$fields?.every(Q=>!b?.idFields?.includes(Q)&&!b?.idFields?.includes(Q.$path));return {...B,...M,...T,...!p.query?.noMetadata&&a.$id?{$id:Array.isArray(a.$id)?A.id:a.$id}:{},...k?Object.fromEntries(Object.entries(A).filter(([Q])=>!b?.idFields?.includes(Q))):A}}),d=(i=>{let c=r=>{let b=u(r);return a.$id&&!Array.isArray(a.$id)||s[0].$filterByUnique?b[0]??null:b.length===0?null:b};return w?i.map(c):c(i)})(h);e.bqlRes=d;};var Bi=Symbol.for("grandChildOfCreate"),he=async f=>{let{filledBqlRequest:e,config:s,schema:a}=f,F=(B,M)=>Object.keys(B).filter(k=>k.startsWith("$")?!1:M?!N(a,B).dataFields?.find(Q=>Q.path===k):!0);if(!e)throw new Error("[BQLE-M-PQ-1] No filledBqlRequest found");if(s.mutation?.preQuery===!1)return;let p=[];if(objectTraversal.traverse(e,({parent:B,key:M,value:k})=>{B&&M&&!M.includes("$")&&radash.isObject(B)?(Array.isArray(B[M])?B[M]:[B[M]]).forEach(Q=>{if(radash.isObject(Q)){if(B.$op!=="create")p.includes(Q.$op)||p.push(Q.$op);else if(Q.$op==="delete"||Q.$op==="unlink")throw new Error(`Cannot ${Q.$op} under a create`)}}):!B&&radash.isObject(k)&&(p.includes(k.$op)||p.push(k.$op));}),!p.includes("delete")&&!p.includes("unlink")&&!p.includes("replace")&&!p.includes("update")&&!p.includes("link"))return;let w=(B=>{let M=(k,m)=>{let Q=[],$={},I=["$op","$bzId","$parentKey"],E=["$relation","$entity","$id",...I];for(let y in k)if(!I.includes(y)&&!(E.includes(y)&&!m))if(!y.includes("$")&&(radash.isObject(k[y])||Array.isArray(k[y]))){let L=k[y];Array.isArray(L)&&L.length>0?L.forEach(O=>{Q.push({$path:y,...M(O)});}):Q.push({$path:y,...M(L)});}else $[y]=k[y];return {...$,$fields:Q}};return B.map(k=>M(k,!0))})(Array.isArray(e)?e:[e]),g=await Et(w,f.config,f.schema,f.dbHandles),R=(B,M)=>{let k=B.$id||B.id||B.$bzId;if(B.$objectPath){let{$objectPath:m}=B,Q=m?.beforePath||"root",$=Array.isArray(m.ids)?`[${m.ids}]`:m.ids;return {beforePath:`${Q}.${$}___${m.key}`,ids:k,key:M}}else return {beforePath:"root",ids:k,key:M}},t=(B,M)=>{let k=B?.beforePath||"root",m=M||(Array.isArray(B?.ids)?`[${B?.ids}]`:B?.ids);return `${k}.${m}___${B?.key}`},o=B=>{if(B.includes("[")&&B.includes("]")){let[M,k,m]=B.split(/[[\]]/);return k.split(",").map($=>`${M}${$}${m}`)}else return [B]},u={};(B=>immer.produce(B,M=>objectTraversal.traverse(M,k=>{let{key:m,parent:Q}=k;if(Q&&m&&Q.$id&&!m.includes("$")){let $=R(Q,m),I=t($);if(Array.isArray(Q[m])){let E=[];Q[m].forEach(y=>{radash.isObject(y)?(y.$objectPath=$,E.push(y.$id.toString())):y&&E.push(y.toString());}),u[I]={$objectPath:$,$ids:E};}else {let E=Q[m];radash.isObject(E)?(u[I]={$objectPath:$,$ids:[E.$id.toString()]},E.$objectPath=$):E&&(u[I]={$objectPath:$,$ids:[E.toString()]});}}})))(g||{});let d=B=>immer.produce(B,M=>objectTraversal.traverse(M,k=>{let{key:m,value:Q,parent:$}=k;$&&m&&!m.includes("$")&&(Array.isArray(Q)||radash.isObject(Q))&&!Array.isArray($)&&(Array.isArray($[m])?$[m].forEach(I=>{typeof I!="string"&&(I.$objectPath=R($,m),I.$parentIsCreate=$.$op==="create",I[Bi]=$.$parentIsCreate||$[Symbol.for("grandChildOfCreate")]);}):radash.isObject($[m])&&($[m].$parentIsCreate=$.$op==="create",$[m][Symbol.for("grandChildOfCreate")]=$.$parentIsCreate||$[Symbol.for("grandChildOfCreate")],$[m].$objectPath=R($,m)));})),i=d(e),r=(B=>{let M=($,I)=>{let E=[];$.filter(S=>S).forEach(S=>{let D=Object.keys(S).filter(j=>!j.startsWith("$")).length;if(Array.isArray(S.$id)&&D>0){let j=S.$id.map(v=>({...S,$id:v}));E=[...E,...j];}else E.push({...S});});let y=[],L=[],O=E.filter(S=>{let j=["delete","update","unlink"].includes(S.$op||""),v=F(S,!0).length;if((!S.$id||Array.isArray(S.$id)&&v>0||S.$filter)&&j)return !0;L.push({...S});});return O.length>0?O.forEach(S=>{let j=(z=>{let lt=(()=>{let _={};for(let x in z){let Y=N(a,z);!x.startsWith("$")&&Y.dataFields?.find(ot=>ot.path===x)&&(_[x]=z[x]);}return _})(),dt=Object.keys(z),Z=dt.filter(_=>!_.startsWith("$")),Tt=[],mt=(_,x)=>{if(_===Z.length){let ot={...x};dt.forEach(V=>{V.startsWith("$")&&(ot[V]=z[V]);}),Tt.push(ot);return}let Y={...x,[Z[_]]:z[Z[_]],...X(x),...lt};mt(_+1,Y),mt(_+1,x);};return mt(0,{...X(z)}),Tt})(S).filter(z=>!(z.$op==="update"&&Object.keys(z).filter(et=>!et.startsWith("$")).length===0)),v=[],U=t(S.$objectPath),q=u[U]?u[U].$ids:[],C=j.map((z,et)=>{let lt=N(a,z),Z=Object.keys(z).filter(x=>!x.includes("$")&&!lt.dataFields?.some(Y=>Y.path===x)).map(x=>(Array.isArray(z[x])?z[x].length>1?z[x].filter(V=>!V.$id||Array.isArray(V.$id)||V.$filter):z[x]:[z[x]]).map(V=>{let Lt=t(V.$objectPath);return {idsToKey:(Mt=>{let xt=[],pt=Mt.split("."),Ne=pt.slice(0,pt.length-1).join("."),De=pt.slice(pt.length-1,pt.length)[0].split("___")[1];for(let Qt in u)if(Qt.startsWith(Ne)&&Qt.endsWith(De)){let Pt=Qt.split("."),xe=Pt.slice(Pt.length-1,Pt.length)[0].split("___")[0];xt.push(xe);}return xt})(Lt),key:x,multiple:V}})).filter(x=>x!==void 0),_=(x=>{let Y=x.map(V=>V.map(it=>it.idsToKey));return (V=>V.length>0?V.reduce((it,ct)=>it.concat(ct),[]).reduce((it,ct)=>it?ct.filter(Mt=>it.includes(Mt)):ct):[])(Y)})(Z).filter(x=>!v.includes(x));if(v=[...v,..._],q=q.filter(x=>!_.includes(x)),et===j.length-1&&q.length>0)return {...z,$id:q,$bzId:`T1_${uuid.v4()}`,...X(z)};if(_.length>0)return {...z,$id:_,$bzId:`T2_${uuid.v4()}`,...X(z)}}).filter(z=>z!==void 0),je=(()=>{if(C.length===0&&!I?.$id)return O;if(C.length===0&&I?.$id){let z=Array.isArray(I.$id)?I.$id:[I.$id],et=[];return z.forEach(lt=>{let dt=t({...S.$objectPath,ids:lt}),Z=u[dt];Z&&et.push({...S,$id:Z.$ids,...X(S),$bzId:`T_${uuid.v4()}`});}),et}else return C.filter(z=>z!==void 0)})();y=[...L,...je].map(k);}):y=E.map(k),y},k=$=>{let I={...$,$bzId:$.$tempId??`T3_${uuid.v4()}`,...X($)},E=N(a,$);return Object.keys($).filter(y=>!y.includes("$")&&!E.dataFields?.some(L=>L.path===y)).forEach(y=>{let L=Array.isArray($[y])?$[y]:[$[y]],O=M(L,$);I[y]=O.length>0?O:void 0;}),I},m=[];return B.forEach($=>{m=[...m,...M([$])];}),m.map($=>k($))})(Array.isArray(i)?i:[i]),b=B=>B.map(M=>{let k=F(M,!0),m={...M};return k.forEach(Q=>{let $=Array.isArray(M[Q])?M[Q]:[M[Q]],I=[],E=[],y=[],L={},O=At(a,M,Q);$.filter(C=>C).forEach(C=>{C.$op==="replace"&&C.$id?(L=C,Array.isArray(C.$id)?E=[...E,...C.$id]:E.push(C.$id)):C.$op==="create"&&O==="ONE"&&C.id?(L=C,Array.isArray(C.id)?y=[...E,...C.id]:y.push(C.id)):I.push(C);});let S=t(L.$objectPath),j=o(S).map(C=>u[C]),v=[];j.filter(C=>C!=null).forEach(C=>{v=[...v,...C.$ids];});let U=v.filter(C=>!E.includes(C)),J=E.filter(C=>!v.includes(C)),q=X(L);U.length>0&&I.push({...L,$op:"unlink",$id:U,$bzId:`T4_${uuid.v4()}`,id:void 0,...q}),J.length>0&&J.forEach(C=>{I.push({...L,$op:"link",$id:C,$bzId:`T5_${uuid.v4()}`,...q});}),y.length>0&&y.forEach(C=>{I.push({...L,$op:"create",id:C,$bzId:`T6_${uuid.v4()}`,...q});}),m[Q]=b(I);}),m}),P=d(b(d(r)));(B=>immer.produce(B,M=>objectTraversal.traverse(M,k=>{let{key:m,value:Q,parent:$}=k;m&&$&&!m?.includes("$")&&(Array.isArray(Q)||radash.isObject(Q))&&!Array.isArray($)&&(Array.isArray(Q)?Q:[Q]).forEach(E=>{let y=u[t(E.$objectPath)],L=(D,j)=>D.every(v=>j.includes(v)),O=E.$id?Array.isArray(E.$id)?L(E.$id,y?y.$ids:[]):y?.$ids.includes(E.$id):y,S=At(a,$,E.$objectPath.key);if(E.$op==="link"&&O&&S==="ONE")throw new Error(`[BQLE-Q-M-2] Cannot link on:"${t(E.$objectPath)}" because it is already occupied.`);if(E.$op)switch(E.$op){case"delete":if(!O&&!s.mutation?.ignoreNonexistingThings)throw new Error(`[BQLE-Q-M-2] Cannot delete $id:"${E.$id}" because it is not linked to $id:"${$.$id}"`);break;case"update":if(!O&&!s.mutation?.ignoreNonexistingThings)throw new Error(`[BQLE-Q-M-2] Cannot update $id:"${E.$id}" because it is not linked to $id:"${$.$id}"`);break;case"unlink":if(!O&&!s.mutation?.ignoreNonexistingThings)throw new Error(`[BQLE-Q-M-2] Cannot unlink $id:"${E.$id}" because it is not linked to $id:"${$.$id}"`);break;case"link":if(O)throw new Error(`[BQLE-Q-M-2] Cannot link $id:"${E.$id}" because it is already linked to $id:"${$.$id}"`);break;}});})))(P);let A=(B=>immer.produce(B,M=>objectTraversal.traverse(M,k=>{let{value:m,meta:Q}=k;radash.isObject(m)&&(m[Symbol.for("path")]=Q.nodePath,delete m.$objectPath,delete m.$parentIsCreate);})))(P);f.filledBqlRequest=A;};var ge=async f=>{let{filledBqlRequest:e,schema:s}=f;if(!e)throw new Error("Filled BQL request is missing");let F=(w=>immer.produce(w,g=>objectTraversal.traverse(g,({value:R})=>{if(radash.isObject(R)){let t=R,o=N(s,t),{unidentifiedFields:u}=nt(o,t),{idFields:n,computedFields:d,virtualFields:i}=o;if(!n)throw new Error("No idFields found");let[c]=n,r=radash.listify(t,(l,T)=>T!==void 0?l:void 0),b=r.filter(l=>i?.includes(l));if(b.length>0)throw new Error(`Virtual fields can't be sent to DB: "${b.join(",")}"`);if(d.filter(l=>!r.includes(l)).forEach(l=>{let T=o.dataFields?.find(m=>m.path===l),B=o.linkFields?.find(m=>m.path===l)?.oppositeLinkFieldsPlayedBy[0],M="roles"in o?ft(o.roles,(m,Q)=>m===l):void 0,k=T||B||M;if(!k)throw new Error(`no field Def for ${l}`);if(l!==c&&t.$op==="create"&&!t[l]){let m=tt({currentThing:t,fieldSchema:k,mandatoryDependencies:!0});t[l]=m;}}),u.length>0)throw new Error(`Unknown fields: [${u.join(",")}] in ${JSON.stringify(t)}`)}})))(e),h=(w=>immer.produce(w,g=>objectTraversal.traverse(g,({value:R})=>{radash.isObject(R);})))(F);f.filledBqlRequest=h;};var kt=(f,e)=>{let s=N(e,f).hooks;if(s?.pre){let a=`on${Ht(f.$op)}`;return s.pre.filter(h=>h.triggers[a]?.()).flatMap(h=>h.actions)}return []};var we=async f=>{let{filledBqlRequest:e,schema:s}=f;if(!e)throw new Error("Filled BQL request is missing");let F=(g=>immer.produce(g,R=>objectTraversal.traverse(R,({value:t})=>{radash.isObject(t)&&Gt();})))(e),p=radash.isArray(F)?F:[F],w=(g=>immer.produce(g,R=>objectTraversal.traverse(R,({value:t,parent:o,key:u,meta:n})=>{if(st(t)){if(!o||u===void 0||u===null)throw new Error("[Internal] Parent is missing, should not happen as we artificially have always a root array");let d=kt(t,s).filter(b=>b.type==="transform"),i=structuredClone(G(g,o,n)),c=immer.isDraft(t)?immer.current(t):t,r=structuredClone(c);d.forEach(b=>{let P=b.fn(r,i);Object.keys(P).length!==0&&(o[u]={...c,...P});});}})))(p);if(!radash.isArray(w))throw new Error("[Internal] withTransformedNodes is not an array");w.length>1?f.filledBqlRequest=w:f.filledBqlRequest=w[0];};var Le=async f=>{let{filledBqlRequest:e,schema:s}=f;if(!e)throw new Error("Filled BQL request is missing");let a=p=>immer.produce(p,h=>objectTraversal.traverse(h,({value:w})=>{if(radash.isObject(w)&&("$entity"in w||"$relation"in w)){let g=w,{requiredFields:R,enumFields:t,fnValidatedFields:o}=N(s,g);"$op"in g&&g.$op==="create"&&R.forEach(u=>{if(!(u in g))throw new Error(`[Validations] Required field "${u}" is missing.`)}),("$op"in g&&g.$op==="update"||g.$op==="create")&&t.forEach(u=>{if(u in g){let n=g[ht]?.dataFields?.find(d=>d.path===u)?.validations?.enum;if(!n)throw new Error(`[Validations] Enum field "${u}" is missing enum options.`);if(radash.isArray(g[u]))g[u].some(d=>{if(!n.includes(d))throw new Error(`[Validations] Option "${d}" is not a valid option for field "${u}".`)});else if(n&&!n.includes(g[u]))throw new Error(`[Validations] Option "${g[u]}" is not a valid option for field "${u}".`)}}),("$op"in g&&g.$op==="update"||g.$op==="create")&&o.forEach(u=>{if(u in g)try{let n=g[ht]?.dataFields?.find(d=>d.path===u)?.validations?.fn;if(!n)throw new Error("Missing validation function.");if(!n(g[u]))throw new Error("Failed validation function.")}catch(n){throw new Error(`[Validations:attribute:${u}] ${n.message}`)}});}})),F=p=>immer.produce(p,h=>objectTraversal.traverse(h,({value:w,parent:g,meta:R})=>{if(radash.isObject(w)&&("$entity"in w||"$relation"in w)){let t="$entity"in w?w.$entity:w.$relation,o=w,u=structuredClone(G(p,g,R)),n=structuredClone(immer.isDraft(o)?immer.current(o):o);kt(o,s).forEach(i=>{if(i.type==="validate"){if(i.severity!=="error")return;try{let c=i.fn(n,u);if(c===!1)throw new Error(`${i.message}.`);if(c!==!0)throw new Error("Validation function's output is not a boolean value.")}catch(c){throw new Error(`[Validations:thing:${t}] ${c.message}`)}}});}}));a(e),F(e);};var Me=async(f,e)=>{let{schema:s,enrichedBqlQuery:a}=f,{bqlRes:F}=e;if(!F)return;let h=(w=>immer.produce(w,g=>objectTraversal.traverse(g,({value:R})=>{if(radash.isObject(R)){let t=R;if(!t.$thing)throw new Error("[Internal] Thing is missing");if(t.$thing){let o=N(s,t),{virtualFields:u}=o,n=t[H];if(!n)throw new Error("[Internal] QueryPath is missing");let d=objectTraversal.getNodeByPath(a,n),i=d.$fields.map(r=>r.$path),c=d.$excludedFields;u.forEach(r=>{if(c?.includes(r)||i.length>0&&!i.includes(r))return;let b=o.dataFields?.find(P=>P.path===r);if(b?.default){let P=tt({currentThing:t,fieldSchema:b,mandatoryDependencies:!0});t[r]=P;}else if(t[r]===void 0)throw new Error(`[Internal] Virtual field: No db value found for virtual field: ${r}`)}),c&&c.forEach(r=>{if(typeof r!="string")throw new Error("[Internal] ExcludedField is not a string");delete t[r];});}}})))(F);e.bqlRes=h;};var Re=async(f,e)=>{let{config:s}=f,{bqlRes:a}=e;if(!a)return;let p=(g=>immer.produce(g,R=>objectTraversal.traverse(R,({value:t})=>{radash.isObject(t);})))(a),w=(g=>immer.produce(g,R=>objectTraversal.traverse(R,({value:t})=>{if(radash.isObject(t)){let o=t;Object.keys(o).forEach(u=>{o[u]===void 0&&delete o[u];}),Object.getOwnPropertySymbols(o).forEach(u=>{delete o[u];}),s.query?.noMetadata===!0&&Object.keys(o).forEach(u=>{u.startsWith("$")&&delete o[u];});}})))(p);e.bqlRes=w;};var Ae={query:[de,ae,pe,fe,Me,Re],mutation:[te,he,ge,we,Le,oe,Zt,se,Kt,Jt]},Nt=async(f,e,s={},a=!0)=>{for(let F of f){let p=await F(e,s);if(p&&Array.isArray(p))for(let h of p)await Nt(h.pipeline,h.req,h.res,!1);}return a&&e.config.query?.debugger===!0&&typeof s.bqlRes=="object"?{...s.bqlRes,$debugger:{tqlRequest:e.tqlRequest}}:s.bqlRes},Et=(f,e,s,a)=>Nt(Ae.query,{config:e,schema:s,rawBqlRequest:f,dbHandles:a},{}),Oe=(f,e,s,a)=>Nt(Ae.mutation,{config:e,schema:s,rawBqlRequest:f,dbHandles:a},{});var Dt=class{schema;config;dbHandles;constructor({schema:e,config:s}){this.schema=e,this.config=s;}getDbHandles=()=>this.dbHandles;init=async()=>{let e={typeDB:new Map},s=Wt(this.schema);await Promise.all(this.config.dbConnectors.map(async a=>{if(a.provider==="typeDB"&&a.dbName){let[F,p]=await radash.tryit(typedbDriver.TypeDB.coreDriver)(a.url);if(F){let h=`[BORM:${a.provider}:${a.dbName}:core] ${F.message??"Can't create TypeDB Client"}`;throw new Error(h)}try{let h=await p.session(a.dbName,typedbDriver.SessionType.DATA);e.typeDB.set(a.id,{client:p,session:h});}catch(h){let w=`[BORM:${a.provider}:${a.dbName}:session] ${(h.messageTemplate?._messageBody()||h.message)??"Can't create TypeDB Session"}`;throw new Error(w)}}if(a.provider==="typeDBCluster"&&a.dbName){let[F,p]=await radash.tryit(typedbDriver.TypeDB.cloudDriver)(a.addresses,a.credentials);if(F){let h=`[BORM:${a.provider}:${a.dbName}:core] ${F.message??"Can't create TypeDB Cluster Client"}`;throw new Error(h)}try{let h=await p.session(a.dbName,typedbDriver.SessionType.DATA);e.typeDB.set(a.id,{client:p,session:h});}catch(h){let w=`[BORM:${a.provider}:${a.dbName}:session] ${(h.messageTemplate?._messageBody()||h.message)??"Can't create TypeDB Session"}`;throw new Error(w)}}})),this.schema=s,this.dbHandles=e;};#t=async()=>{if(!this.dbHandles&&(await this.init(),!this.dbHandles))throw new Error("Can't init BormClient")};introspect=async()=>(await this.#t(),this.schema);define=async()=>(await this.#t(),vt(this.config,this.schema,this.dbHandles));query=async(e,s)=>{await this.#t();let a={...this.config,query:{...It.query,...this.config.query,...s}};return Et(e,a,this.schema,this.dbHandles)};mutate=async(e,s)=>{await this.#t();let a={...this.config,mutation:{...It.mutation,...this.config.mutation,...s}};return Oe(e,a,this.schema,this.dbHandles)};close=async()=>{this.dbHandles&&this.dbHandles.typeDB.forEach(async({client:e,session:s})=>{s.isOpen()&&await s.close(),await e.close();});}},so=Dt;//! Todo: delete when this works with the new $thing and $thingType fields
61
61
  //! reads all the insertions and gets the first match. This means each id must be unique
62
62
  //! disabled as it has false positives
63
- //!todo: use computeNode() in the future instead
63
+ //! Todo: Sandbox the function in computeFunction()
64
64
 
65
- module.exports = vr;
65
+ module.exports = so;
package/dist/index.mjs CHANGED
@@ -1,63 +1,63 @@
1
1
  import { tryit, mapEntries, shake, isObject, isArray, parallel, listify, pick } from 'radash';
2
2
  import { TypeDB, SessionType, TransactionType, TypeDBOptions } from 'typedb-driver';
3
- import { produce, current } from 'immer';
3
+ import { produce, isDraft, current } from 'immer';
4
4
  import { traverse, getNodeByPath } from 'object-traversal';
5
5
  import { v4 } from 'uuid';
6
6
 
7
- var ke={query:{noMetadata:!1,simplifiedLinks:!0,debugger:!1,returnNulls:!1},mutation:{noMetadata:!1,preQuery:!0,ignoreNonexistingThings:!1}};var Nt=d=>{let r=[],l=new Map;return d.forEach(a=>{let{dbPath:F,contentType:f}=a,y=`${F}-${f}`;l.has(y)||(l.set(y,!0),r.push(a));}),r},De=async(d,r,l)=>{let F=(()=>{let c="",t=[];c+=`
8
- `,Object.keys(r.entities).forEach(w=>{let k=r.entities[w],{idFields:q,dataFields:b,linkFields:T,name:L}=k,h=[],S=[],$=[];if(k.extends){let g=r.entities[k.extends];g.dataFields&&g.dataFields.forEach(m=>{h.push(m.dbPath);}),g.linkFields&&g.linkFields.forEach(m=>{S.push(m.path);}),g.idFields&&g.idFields.forEach(m=>{$.push(m);});}c+=`${L} sub ${k.extends?k.extends:"entity"},
9
- `;let E=[];if(q&&q.length>0){let g=new Set(q),Q=Array.from(g).map(I=>`${I}`).join(", ");$.includes(Q)||(c+=` owns ${Q} @key,
10
- `,E.push(Q));}if(b&&b.length>0&&b.forEach(g=>{!h.includes(g.dbPath)&&!E.includes(g.dbPath)&&(c+=` owns ${g.dbPath},
11
- `),t.push({dbPath:g.dbPath,contentType:g.contentType});}),T&&T.length>0){let g=[];T.forEach(m=>{let{relation:Q,plays:I}=m;!S.includes(m.path)&&!g.includes(`${Q}:${I}`)&&(c+=` plays ${Q}:${I},
12
- `,g.push(`${Q}:${I}`));});}c=c.replace(/,\s*$/,`;
7
+ var It={query:{noMetadata:!1,simplifiedLinks:!0,debugger:!1,returnNulls:!1},mutation:{noMetadata:!1,preQuery:!0,ignoreNonexistingThings:!1}};var ve=f=>{let e=[],s=new Map;return f.forEach(a=>{let{dbPath:F,contentType:p}=a,h=`${F}-${p}`;s.has(h)||(s.set(h,!0),e.push(a));}),e},vt=async(f,e,s)=>{let F=(()=>{let c="",r=[];c+=`
8
+ `,Object.keys(e.entities).forEach(l=>{let T=e.entities[l],{idFields:A,dataFields:B,linkFields:M,name:k}=T,m=[],Q=[],$=[];if("extends"in T){let E=e.entities[T.extends];E.dataFields&&E.dataFields.forEach(y=>{m.push(y.dbPath);}),E.linkFields&&E.linkFields.forEach(y=>{Q.push(y.path);}),E.idFields&&E.idFields.forEach(y=>{$.push(y);});}c+=`${k} sub ${"extends"in T?T.extends:"entity"},
9
+ `;let I=[];if(A&&A.length>0){let E=new Set(A),L=Array.from(E).map(O=>`${O}`).join(", ");$.includes(L)||(c+=` owns ${L} @key,
10
+ `,I.push(L));}if(B&&B.length>0&&B.forEach(E=>{!m.includes(E.dbPath)&&!I.includes(E.dbPath)&&(c+=` owns ${E.dbPath},
11
+ `),r.push({dbPath:E.dbPath,contentType:E.contentType});}),M&&M.length>0){let E=[];M.forEach(y=>{let{relation:L,plays:O}=y;!Q.includes(y.path)&&!E.includes(`${L}:${O}`)&&(c+=` plays ${L}:${O},
12
+ `,E.push(`${L}:${O}`));});}c=c.replace(/,\s*$/,`;
13
13
  `),c+=`
14
- `;}),Object.keys(r.relations).forEach(w=>{let k=r.relations[w],{idFields:q,dataFields:b,roles:T,name:L,linkFields:h}=k,S=[],$=[],E=[],g=[];if(k.extends){let Q=r.relations[k.extends];Q.dataFields&&Q.dataFields.forEach(I=>{S.push(I.dbPath);}),Q.linkFields&&Q.linkFields.forEach(I=>{$.push(I.dbPath);}),Q.roles&&Object.values(Q.roles).forEach(O=>{E.push(O.name);}),Q.idFields&&Q.idFields.forEach(I=>{g.push(I);});}c+=`${L} sub ${k.extends?k.extends:"relation"},
15
- `;let m=[];if(q&&q.length>0){let Q=new Set(q),O=Array.from(Q).map(j=>`${j}`).join(", ");g.includes(O)||(c+=` owns ${O} @key,
16
- `,m.push(O));}if(b&&b.length>0&&b.forEach(Q=>{!S.includes(Q.dbPath)&&!m.includes(Q.dbPath)&&(c+=` owns ${Q.dbPath},
17
- `),t.push({dbPath:Q.dbPath,contentType:Q.contentType});}),T&&Object.keys(T).forEach(Q=>{E.includes(Q)||(c+=` relates ${Q},
18
- `);}),h&&h.length>0){let Q=[];h.forEach(I=>{let{plays:O}=I;!$.includes(I.path)&&!Q.includes(`${k}:${O}`)&&(c+=` plays ${I.relation}:${O},
19
- `,Q.push(`${k}:${O}`));});}c=c.replace(/,\s*$/,`;
14
+ `;}),Object.keys(e.relations).forEach(l=>{let T=e.relations[l],{idFields:A,dataFields:B,roles:M,name:k,linkFields:m}=T,Q=[],$=[],I=[],E=[];if("extends"in T){let L=e.relations[T.extends];L.dataFields&&L.dataFields.forEach(O=>{Q.push(O.dbPath);}),L.linkFields&&L.linkFields.forEach(O=>{$.push(O.dbPath);}),L.roles&&Object.values(L.roles).forEach(S=>{I.push(S.name);}),L.idFields&&L.idFields.forEach(O=>{E.push(O);});}c+=`${k} sub ${"extends"in T?T.extends:"relation"},
15
+ `;let y=[];if(A&&A.length>0){let L=new Set(A),S=Array.from(L).map(D=>`${D}`).join(", ");E.includes(S)||(c+=` owns ${S} @key,
16
+ `,y.push(S));}if(B&&B.length>0&&B.forEach(L=>{!Q.includes(L.dbPath)&&!y.includes(L.dbPath)&&(c+=` owns ${L.dbPath},
17
+ `),r.push({dbPath:L.dbPath,contentType:L.contentType});}),M&&Object.keys(M).forEach(L=>{I.includes(L)||(c+=` relates ${L},
18
+ `);}),m&&m.length>0){let L=[];m.forEach(O=>{let{plays:S}=O;!$.includes(O.path)&&!L.includes(`${T}:${S}`)&&(c+=` plays ${O.relation}:${S},
19
+ `,L.push(`${T}:${S}`));});}c=c.replace(/,\s*$/,`;
20
20
  `),c+=`
21
- `;});let o=`define
21
+ `;});let b=`define
22
22
 
23
- `;return Nt(t).forEach(w=>{o+=`${w.dbPath} sub attribute,
24
- `,w.contentType==="TEXT"||w.contentType==="ID"?o+=` value string;
25
- `:w.contentType==="EMAIL"?(o+=` value string,
26
- `,o+=` regex '^(?=.{1,64}@)[A-Za-z0-9_-]+(\\.[A-Za-z0-9_-]+)*@[^-][A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)*(\\.[A-Za-z]{2,})$';
27
- `):w.contentType==="DATE"?o+=` value datetime;
28
- `:w.contentType==="BOOLEAN"?o+=` value boolean;
29
- `:w.contentType==="NUMBER"&&(o+=` value long;
30
- `);}),`${o}
23
+ `;return ve(r).forEach(l=>{b+=`${l.dbPath} sub attribute,
24
+ `,l.contentType==="TEXT"||l.contentType==="ID"?b+=` value string;
25
+ `:l.contentType==="EMAIL"?(b+=` value string,
26
+ `,b+=` regex '^(?=.{1,64}@)[A-Za-z0-9_-]+(\\.[A-Za-z0-9_-]+)*@[^-][A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)*(\\.[A-Za-z]{2,})$';
27
+ `):l.contentType==="DATE"?b+=` value datetime;
28
+ `:l.contentType==="BOOLEAN"?b+=` value boolean;
29
+ `:l.contentType==="NUMBER"&&(b+=` value long;
30
+ `);}),`${b}
31
31
 
32
- ${c}`})(),f=d.dbConnectors[0].id,y=l.typeDB.get(f)?.session,B=l.typeDB.get(f)?.client;if(!y){console.log("Session Status: ","NO SESSION");return}await y.close();let[{dbName:M}]=d.dbConnectors;await(await B.databases.get(M)).delete(),await B.databases.create(M);let e=await B.session(d.dbConnectors[0].dbName,SessionType.SCHEMA),s=await e.transaction(TransactionType.WRITE);await s.query.define(F),await s.commit(),await s.close();let u=await e.transaction(TransactionType.READ);(await(await u.query.match("match $a sub thing;")).collect()).forEach(async c=>{c.get("a");}),await u.close();};var ve=(d,r,l)=>l?r:`${d}\xB7${r}`;var pe=(d,r)=>Object.values(Object.fromEntries(Object.entries(d).filter(([l,a])=>r(l,a))))[0],ce=(d,r)=>Object.fromEntries(Object.entries(d).filter(([l,a])=>r(l,a))),ze=d=>{let r=[],l=produce(d,F=>traverse(F,({key:f,value:y,meta:B})=>{if(B.depth===2&&(f&&(y.dataFields=y.dataFields?.map(M=>({...M,cardinality:M.cardinality||"ONE",dbPath:ve(f,M.path,M.shared)}))),y.extends)){let M=F.entities[y.extends]||F.relations[y.extends];if(y.allExtends=[y.extends,...M.allExtends||[]],y.idFields=M.idFields?(y.idFields||[]).concat(M.idFields):y.idFields,y.dataFields=M.dataFields?(y.dataFields||[]).concat(M.dataFields.map(R=>{let e=y.extends,s=d.entities[e]||d.relations[e];for(;!s.dataFields?.find(u=>u.path===R.path);)e=s.extends,s=d.entities[e]||d.relations[e];return {...R,dbPath:ve(e,R.path,R.shared)}})):y.dataFields,y.linkFields=M.linkFields?(y.linkFields||[]).concat(M.linkFields):y.linkFields,"roles"in M){let R=y,e=M;R.roles=R.roles||{},R.roles={...R.roles,...e.roles},Object.keys(R.roles).length===0&&(R.roles={});}}},{traversalType:"breadth-first"}));return traverse(d,({key:F,value:f,meta:y})=>{if(F==="linkFields"){let M=(()=>{if(!y.nodePath)throw new Error("No path");let[e,s]=y.nodePath.split(".");return {thing:s,thingType:e==="entities"?"entity":e==="relations"?"relation":""}})(),R=Array.isArray(f)?f.map(e=>({...e,...M})):[{...f,...M}];r.push(...R);}}),produce(l,F=>traverse(F,({value:f,key:y,meta:B})=>{if(B.depth===2&&f.idFields&&!f.id){f.name=y;let M=()=>{if(B.nodePath?.split(".")[0]==="entities")return "entity";if(B.nodePath?.split(".")[0]==="relations")return "relation";throw new Error("Unsupported node attributes")};f.thingType=M(),f.computedFields=[],f.virtualFields=[],f.requiredFields=[],f.enumFields=[],f.fnValidatedFields=[],"roles"in f&&Object.entries(f.roles).forEach(([e,s])=>{s.playedBy=r.filter(u=>u.relation===y&&u.plays===e)||[],s.name=e;}),"linkFields"in f&&f.linkFields&&f.linkFields?.forEach(e=>{if(e.target==="relation"){e.oppositeLinkFieldsPlayedBy=[{plays:e.path,thing:e.relation,thingType:"relation"}];return}let s=r.filter(n=>n.relation===e.relation&&n.plays!==e.plays)||[];e.oppositeLinkFieldsPlayedBy=s;let{filter:u}=e;e.oppositeLinkFieldsPlayedBy=e.oppositeLinkFieldsPlayedBy.filter(n=>n.target==="role"),u&&Array.isArray(u)&&(e.oppositeLinkFieldsPlayedBy=e.oppositeLinkFieldsPlayedBy.filter(n=>u.some(p=>n.thing===p.$role)),e.oppositeLinkFieldsPlayedBy=e.oppositeLinkFieldsPlayedBy.filter(n=>u.some(p=>n.thing===p.$thing))),u&&!Array.isArray(u)&&(e.oppositeLinkFieldsPlayedBy=e.oppositeLinkFieldsPlayedBy.filter(n=>n.$role===u.$role),e.oppositeLinkFieldsPlayedBy=e.oppositeLinkFieldsPlayedBy.filter(n=>n.thing===u.$thing));});}if(typeof f=="object"&&"playedBy"in f){if([...new Set(f.playedBy?.map(M=>M.thing))].length>1)throw new Error(`Unsupported: roleFields can be only played by one thing. Role: ${y} path:${B.nodePath}`);if(f.playedBy.length===0)throw new Error(`Unsupported: roleFields should be played at least by one thing. Role: ${y}, path:${B.nodePath}`)}if(B.depth===4){let[M,R]=B.nodePath?.split(".")||[],e=F[M][R];f.validations&&(f.validations.required&&e.requiredFields.push(f.path),f.validations.enum&&e.enumFields.push(f.path),f.validations.fn&&e.fnValidatedFields.push(f.path)),f.default?f.isVirtual?e.virtualFields.push(f.path):e.computedFields.push(f.path):f.isVirtual&&e.virtualFields.push(f.path);}}))},Se=(d,r,l)=>{let a=N(d,r),F=a.linkFields?.find(B=>B.path===l);if(F)return F.cardinality;let f=a.dataFields?.find(B=>B.path===l);if(f)return f.cardinality;let y=a.roles[l];if(y)return y.cardinality},N=(d,r)=>{if(r.$thing){if(!r.$thingType)throw new Error("Missing $thingType in node$: {JSON.stringify(node, null, 2)");if(r.$thingType==="entity"){if(!(r.$thing in d.entities))throw new Error(`Missing entity '${r.$thing}' in the schema`);return d.entities[r.$thing]}if(r.$thingType==="relation"){if(!(r.$thing in d.relations))throw new Error(`Missing relation '${r.$thing}' in the schema`);return d.relations[r.$thing]}throw new Error(`Wrong schema or query for ${JSON.stringify(r,null,2)}`)}if(r.$entity){if(!(r.$entity in d.entities))throw new Error(`Missing entity '${r.$entity}' in the schema`);return d.entities[r.$entity]}if(r.$relation){if(!(r.$relation in d.relations))throw new Error(`Missing relation '${r.$relation}' in the schema`);return d.relations[r.$relation]}throw new Error(`Wrong schema or query for ${JSON.stringify(r,null,2)}`)},G=(d,r)=>{let l=d.dataFields?.map(p=>p.path)||[],a=d.linkFields?.map(p=>p.path)||[],F="roles"in d?listify(d.roles,p=>p):[],f=[...l||[],...a||[],...F||[]],B=[...["$entity","$op","$id","$tempId","$bzId","$relation","$parentKey","$filter","$fields","$excludedFields"],...f];if(!r)return {fields:f,dataFields:l,roleFields:F,linkFields:a};let M=r.$fields?r.$fields.map(p=>{if(typeof p=="string")return p;if("$path"in p&&typeof p.$path=="string")return p.$path;throw new Error(" Wrongly structured query")}):listify(r,p=>p),R=r.$filter?listify(r.$filter,p=>p.toString().startsWith("$")?void 0:p.toString()).filter(p=>p&&l?.includes(p)):[],e=r.$filter?listify(r.$filter,p=>p.toString().startsWith("$")?void 0:p.toString()).filter(p=>p&&[...F||[],...a||[]].includes(p)):[],s=[...M,...R].filter(p=>!B.includes(p)).filter(p=>p),u=r.$filter?ce(r.$filter,(p,i)=>R.includes(p)):{},n=r.$filter?ce(r.$filter,(p,i)=>e.includes(p)):{};return {fields:f,dataFields:l,roleFields:F,linkFields:a,usedFields:M,usedLinkFields:a.filter(p=>M.includes(p)),usedRoleFields:F.filter(p=>M.includes(p)),unidentifiedFields:s,...R.length?{localFilters:u}:{},...e.length?{nestedFilters:n}:{}}};var _e=d=>{if(typeof d!="string")throw new Error("capitalizeFirstLetter: string is not a string");return d.charAt(0).toUpperCase()+d.slice(1).toLowerCase()},Ve=(d,r,l)=>{let F=(l.nodePath||"").split("."),f=isArray(r)?F.slice(0,-2).join("."):F.slice(0,-1).join(".");return r?getNodeByPath(d,f):{}};var We=async(d,r)=>{let{bqlRequest:l,config:a,tqlRequest:F}=d,{rawTqlRes:f}=r;if(l){if(!f)throw new Error("TQL query not executed")}else throw new Error("BQL request not parsed");let{query:y}=l;if(!y){if(f.insertions?.length===0&&!F?.deletions){r.bqlRes={};return}let{mutation:B}=l;if(!B)throw new Error("TQL mutation not executed");let R=[...B.things,...B.edges].map(e=>{let s=f.insertions?.find(u=>u.get(`${e.$bzId}`))?.get(`${e.$bzId}`);if(e.$op==="create"||e.$op==="update"||e.$op==="link"){let u=s?.asThing().iid;return a.mutation?.noMetadata?mapEntries(e,(n,p)=>[n.toString().startsWith("$")?Symbol.for(n):n,p]):{$dbId:u,...e,[e.path]:e.$id}}if(e.$op==="delete"||e.$op==="unlink")return e;if(e.$op!=="match")throw new Error(`Unsupported op ${e.$op}`)}).filter(e=>e);r.bqlRes=R;return}};var Vt=(d,r)=>produce(d,l=>traverse(l,({value:a})=>{if(Array.isArray(a)||typeof a!="object"||a===null)return;a.$tempId&&(a.$tempId=`_:${a.$tempId}`),a.$fields&&delete a.$fields,a.$filter&&delete a.$filter,a.$show&&delete a.$show,a.$bzId&&delete a.$bzId,r.query?.noMetadata&&(a.$entity||a.$relation)&&(delete a.$entity,delete a.$relation,delete a.$id),Object.getOwnPropertySymbols(a).forEach(f=>{delete a[f];}),a.$excludedFields&&(a.$excludedFields.forEach(f=>{delete a[f];}),delete a.$excludedFields);})),Wt=(d,r)=>{let l={};return r.forEach(a=>{l[a.$bzId]=a.$id;}),d.forEach(a=>{Object.keys(a).forEach(F=>{l[a[F]]&&F!=="$tempId"&&(a[F]=l[a[F]]);});}),d},Ht=(d,r)=>{let l=r.map(F=>F.$bzId),a=!1;return d.forEach(F=>{Object.keys(F).forEach(f=>{l.includes(F[f])&&(a=!0);});}),a},He=async(d,r)=>{let{bqlRequest:l,config:a}=d;if(!l)throw new Error("BQL request not parsed");let F=r.bqlRes[0]?r.bqlRes:[r.bqlRes],f=d.bqlRequest?.mutation?.things;if(Ht(F,f)){let M=Wt(F,f);r.bqlRes=M[1]?M:M[0];}let B=Vt(r.bqlRes,a);r.bqlRes=B;};var Ue=async d=>{let{bqlRequest:r,schema:l}=d;if(!r)throw new Error("BQL request not parsed");let{mutation:a}=r;if(!a)throw new Error("BQL request is not a mutation");let F=n=>{let p=n.$op,i=`$${n.$bzId}`,c=N(l,n),{idFields:t,defaultDBConnector:o}=c,P=o?.path||n.$entity||n.$relation,w=n.$id,k=t?.[0],q=listify(n,(m,Q)=>{if(m.startsWith("$")||m===k||Q===void 0||Q===null)return "";let I=c.dataFields?.find(D=>D.path===m);if(!I?.path)return "";let j=I.dbPath;if(["TEXT","ID","EMAIL"].includes(I.contentType))return `has ${j} '${Q}'`;if(["NUMBER","BOOLEAN"].includes(I.contentType))return `has ${j} ${Q}`;if(I.contentType==="DATE"){if(Number.isNaN(Q.valueOf()))throw new Error("Invalid format, Nan Date");return Q instanceof Date?`has ${j} ${Q.toISOString().replace("Z","")}`:`has ${j} ${new Date(Q).toISOString().replace("Z","")}`}throw new Error(`Unsupported contentType ${I.contentType}`)}).filter(m=>m),b=`${i}-atts`,T=listify(n,m=>{if(m.startsWith("$")||m===k)return "";let Q=c.dataFields?.find(j=>j.path===m);if(!Q?.path)return "";let O=Q.dbPath;return `{${b} isa ${O};}`}).filter(m=>m),L=n[Symbol.for("isLocalId")],h=isArray(w)?`like '${w.join("|")}'`:`'${w}'`,S=!L&&w?[`has ${k} ${h}`]:[],$=[...S,...q].filter(m=>m).join(","),E=()=>{if(p==="delete"||p==="unlink"||p==="match")return `${i} isa ${[P,...S].filter(m=>m).join(",")};`;if(p==="update"){if(!T.length)throw new Error("update without attributes");return `${i} isa ${[P,...S].filter(m=>m).join(",")}, has ${b};
33
- ${T.join(" or ")};`}return ""},g=()=>p==="update"||p==="link"||p==="match"?`${i} isa ${[P,...S].filter(m=>m).join(",")};`:"";if(n.$entity||n.$relation)return {op:p,deletionMatch:E(),insertionMatch:g(),insertion:p==="create"?`${i} isa ${[P,$].filter(m=>m).join(",")};`:p==="update"&&q.length?`${i} ${q.join(",")};`:"",deletion:p==="delete"?`${i} isa ${P};`:p==="update"&&T.length?`${i} has ${b};`:""};throw new Error("in attributes")},f=n=>{let p=n.$op,i=N(l,n),c=`$${n.$bzId}`,t=n.$id,o=i.defaultDBConnector?.path||n.$relation,P="roles"in i?listify(i.roles,m=>m):[],w=n.$relation&&"roles"in i&&mapEntries(i.roles,(m,Q)=>[m,Q.dbConnector?.path||m]),k=listify(n,(m,Q)=>{if(!P.includes(m))return null;if(!("roles"in i))throw new Error("This should have roles! ");let I=w[m];return Array.isArray(Q)?Q.map(O=>({path:I,id:O})):{path:I,id:Q}}).filter(m=>m).flat(),q=k.map(m=>{if(!m?.path)throw new Error("Object without path");return `${m.path}: $${m.id}`}),b=k.length>0?`( ${q.join(" , ")} )`:"",T=n[Symbol.for("edgeType")];if(!T)throw new Error("[internal error] Symbol edgeType not defined");let L=b?`${c} ${b} ${T==="linkField"||p==="delete"||p==="unlink"?`isa ${o}`:""}`:"",h=`${c} ${T==="linkField"||p==="delete"?`isa ${o}`:""}`,S=()=>L?p==="link"?`${L};`:p==="create"?`${L}, has id '${t}';`:"":"",$=()=>L&&p==="match"?`${L};`:"",E=()=>L?p==="delete"?`${L};`:p==="match"?`${L};`:"":"",g=()=>L?p==="delete"?`${h};`:p==="unlink"?`${c} ${b};`:"":"";return {deletionMatch:E(),insertionMatch:$(),deletion:g(),insertion:S(),op:""}},y=(n,p)=>{let i=p==="edges"?f:F;if(Array.isArray(n))return n.map(k=>{let{preDeletionBatch:q,insertionMatch:b,deletionMatch:T,insertion:L,deletion:h}=i(k);return shake({preDeletionBatch:q,insertionMatch:b,deletionMatch:T,insertion:L,deletion:h},S=>!S)}).filter(k=>k);let{preDeletionBatch:c,insertionMatch:t,deletionMatch:o,insertion:P,deletion:w}=i(n);return shake({preDeletionBatch:c,insertionMatch:t,deletionMatch:o,insertion:P,deletion:w},k=>!k)},B=y(a.things),M=Array.isArray(B)?B:[B],R=y(a.edges,"edges"),e=Array.isArray(R)?R:[R],s=[...M,...e],u=shake({insertionMatches:s.map(n=>n.insertionMatch).join(" ").trim(),deletionMatches:s.map(n=>n.deletionMatch).join(" ").trim(),insertions:s.map(n=>n.insertion).join(" ").trim(),deletions:s.map(n=>n.deletion).join(" ").trim()},n=>!n);d.tqlRequest=u;};var Jt=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm,Zt=/(\s*async\s*|\s*function\s*|\s*\(\s*|\s*\)\s*=>|\s*\)\s*\{)/,Ke=d=>{let l=d.toString().replace(Jt,"").trim().split("=>")[0].split("{")[0].replace(Zt,"").trim(),a=l.substring(l.indexOf("(")+1,l.lastIndexOf(")")).trim();return a?(a.match(/(\{[^}]*\}|[^,]+)/g)||[]).flatMap(f=>f.includes("{")&&f.includes("}")?(f.replace(/^\{|\}$/g,"").match(/(?:[^,"']+|"[^"]*"|'[^']*')+/g)||[]).map(B=>B.split(":")[0].trim().replace(/['"[\]]/g,"")):f.trim()).filter(Boolean):[]};var X=({currentThing:d,fieldSchema:r,mandatoryDependencies:l=!1})=>{if(!r||!r.default||!("fn"in r.default||"value"in r.default))throw new Error(`[Internal] Virtual field: No field schema found, or wrongly configured. Field: ${JSON.stringify(r,null,3)}`);if(r.default.type==="value")return r.default.value;if(l){let{fn:F}=r.default,y=Ke(F).filter(B=>!(B in d));if(y.length)throw new Error(`Virtual field: Missing arguments ${y.join(", ")}`)}return "default"in r?r.default?.fn(d):void 0},Je=()=>{};var ti=d=>{if(!d.startsWith("_:"))throw new Error("ID must start with '_:'.");let r=d.substring(2);if(!/^[a-zA-Z0-9-_]+$/.test(r))throw new Error("$tempId must contain only alphanumeric characters, hyphens, and underscores.");if(d.length>36)throw new Error("$tempId must not be longer than 36 characters.");return r},Ye=async d=>{let{rawBqlRequest:r,schema:l}=d,F=(s=>produce(s,u=>traverse(u,({value:n,key:p,parent:i})=>{if(isObject(n)&&(n=shake(n,c=>c===void 0)),p==="$tempId"&&(i[p]=ti(n)),i&&isArray(n)){if(!n.some(t=>typeof t=="object"&&"$id"in t))return;let c=n.flatMap(t=>typeof t=="string"?t:typeof t=="object"&&"$id"in t&&isArray(t.$id)?t.$id.map(o=>({...t,$id:o})):t);i[p]=c;}})))(r),y=(s=>produce(s,u=>traverse(u,({value:n,meta:p,key:i})=>{if(isObject(n)){if(n.$arrayOp)throw new Error("Array op not supported yet");if(i==="$filter"||p.nodePath?.includes(".$filter."))return;let c=n;if(c.$op==="create"&&c.$id)throw new Error("Can't write to computed field $id. Try writing to the id field directly.");let t=N(l,c),P=Object.keys(c).filter($=>t.virtualFields?.includes($));if(P.length>0){let $=P.filter(E=>c[E]);if($.length>0)throw new Error(`Can't set virtual fields: ["${$.join('","')}"]`)}let k=p.nodePath?.split(".")?.filter($=>Number.isNaN(parseInt($,10))).join(".");if(!t)throw new Error(`Schema not found for ${c.$entity||c.$relation}`);c.$bzId=c.$tempId??`T_${v4()}`,c[Symbol.for("schema")]=t,c[Symbol.for("dbId")]=t.defaultDBConnector.id;let{usedLinkFields:q,usedRoleFields:b}=G(t,c),T=q.map($=>({fieldType:"linkField",path:$,schema:t.linkFields.find(E=>E.path===$)})),L=t.thingType==="relation"?b.map($=>({fieldType:"roleField",path:$,schema:pe(t.roles,E=>E===$)})):[];if(T.some($=>$.schema?.target==="role")&&T.some($=>$.schema?.target==="relation"))throw new Error("Unsupported: Can't use a link field with target === 'role' and another with target === 'relation' in the same mutation.");let h=L.filter($=>[...new Set($.schema.playedBy?.map(E=>E.thing))].length!==1);if(h.length>1)throw new Error(`Field: ${h[0].path} - If a role can be played by multiple things, you must specify the thing in the mutation: ${JSON.stringify(h[0].schema.playedBy)}. Schema: ${JSON.stringify(h[0].schema)}`);let S=p.nodePath;if([...T,...L].forEach($=>{let E=c[$.path];if(E===void 0)return;let g=$.schema;if(!g)throw new Error(`Field ${$.path} not found in schema`);let m=$.fieldType==="roleField"?g?.playedBy[0]:g,I=g&&"relation"in g&&m?.relation===c.$relation?"$self":m?.relation?m?.relation:"$self",O=I==="$self"?t:l.relations[I];if(pe(O.roles,(v,A)=>v===$.path)?.playedBy?.length===0)throw new Error(`unused role: ${S}.${$.path}`);if(!g)throw new Error(`Field ${$.path} not found in schema`);let D=$.fieldType==="linkField"?g?.oppositeLinkFieldsPlayedBy:g?.playedBy;if(!D)throw new Error(`No opposite fields found for ${JSON.stringify(g)}`);if([...new Set(D?.map(v=>v.thing))].length>1)throw new Error(`Field: ${$.path} - If a role can be played by multiple things, you must specify the thing in the mutation: ${JSON.stringify(D)}. Schema: ${JSON.stringify(g)}`);if(g.cardinality==="ONE"&&Array.isArray(E))throw new Error("Can't have an array in a cardinality === ONE link field");if(g.cardinality==="MANY"&&E!==null&&!Array.isArray(E)&&!E.$arrayOp)throw new Error(`${$.fieldType==="linkField"?g.path:g.name} is a cardinality === MANY thing. Use an array or a $arrayOp object`);if(E?.$entity||E?.$relation)return;let[z]=D,J="plays"in g?"linkField":"roleField",K={[`$${z.thingType}`]:z.thing,[Symbol.for("relation")]:I,[Symbol.for("edgeType")]:J,[Symbol.for("parent")]:{path:S,...c.$id?{$id:c.$id}:{},...c.$tempId?{$tempId:c.$tempId}:{},...c.filter?{filter:c.filter}:{},links:D},[Symbol.for("role")]:z.plays,[Symbol.for("oppositeRole")]:"plays"in g?g.plays:void 0,[Symbol.for("relFieldSchema")]:g};if(isObject(E)&&(c[$.path]={...K,...E}),Array.isArray(E))if(E.every(v=>isObject(v)))c[$.path]=E.map(v=>({...K,...v}));else if(E.every(v=>typeof v=="string"))c[$.path]=E.map(v=>({...K,$op:c.$op==="create"?"link":"replace",$id:v}));else throw new Error(`Invalid array value for ${$.path}`);if(typeof E=="string"&&(c[$.path]={...K,$op:c.$op==="create"?"link":"replace",$id:E}),E===null){let v={...K,$op:"unlink"};c[$.path]=g.cardinality==="MANY"?[v]:v;}}),!k&&!c.$entity&&!c.$relation)throw new Error("Root things must specify $entity or $relation")}})))(F),M=(s=>produce(s,u=>traverse(u,({parent:n,key:p,value:i,meta:c})=>{if(isObject(i)){if(Object.keys(i).length===0)throw new Error("Empty object!");if(p==="$filter"||c.nodePath?.includes(".$filter."))return;let t=i,o=c.nodePath?.split(".");if(t.$tempId&&!(t.$op===void 0||t.$op==="link"||t.$op==="create"||t.$op==="update"))throw new Error(`Invalid op ${t.$op} for tempId. TempIds can be created, or when created in another part of the same mutation. In the future maybe we can use them to catch stuff in the DB as well and group them under the same tempId.`);let P=o?.filter(I=>Number.isNaN(parseInt(I,10))).join("."),w=P?Array.isArray(n)?o?.slice(0,-1).join("."):c.nodePath:c.nodePath||"",k=N(l,t),{dataFields:q,roleFields:b,linkFields:T}=G(k,t),L=current(t)[Symbol.for("parent")],h=P&&L.path,$=(h?getNodeByPath(u,h):u)?.$op;if(P&&!$)throw new Error("Error: Parent $op not detected");let E=t[Symbol.for("relFieldSchema")];t.$op==="replace"&&$==="create"&&(t.$op="link");let g=Object.keys(t).some(I=>q?.includes(I)),m=Object.keys(t).some(I=>[...b,...T].includes(I)),Q=()=>{if(t.$op)return t.$op;if(P&&!t.$id&&!t.$tempId&&$!=="create"&&E.cardinality==="ONE")throw new Error(`Please specify if it is a create or an update. Path: ${c.nodePath}`);if(t.$tempId)return "create";if((t.$id||t.$filter)&&g)return "update";if((t.$id||t.$filter)&&P&&!g&&!m)return "link";if(!t.$filter&&!t.$id&&!t.$tempId)return "create";if((t.$id||t.$filter)&&!g&&m)return "match";throw new Error("Wrong op")};if(t.$op||(t.$op=Q()),n||(t.$parentKey=""),typeof n=="object"&&(Array.isArray(n)&&(t[Symbol.for("index")]=p),t[Symbol.for("path")]=w,t[Symbol.for("isRoot")]=!P,t[Symbol.for("depth")]=P?.split(".").length),!t.$entity&&!t.$relation)throw new Error(`Node ${JSON.stringify(t)} without $entity/$relation`)}})))(y),e=(s=>produce(s,u=>traverse(u,({value:n})=>{if(isObject(n)){let p=n,i=N(l,p),{unidentifiedFields:c}=G(i,p),{idFields:t}=i;if(!t)throw new Error("No idFields found");let[o]=t;if(p.$op==="create"&&!p[o]){let P=i.dataFields?.find(k=>k.path===o),w=X({currentThing:p,fieldSchema:P,mandatoryDependencies:!0});if(typeof w!="string")throw new Error(`Default id field ${o} is not a string`);p[o]=w,p.$id=w;}if(c.length>0)throw new Error(`Unknown fields: [${c.join(",")}] in ${JSON.stringify(p)}`)}})))(M);d.filledBqlRequest=e;};var tt=async d=>{let{filledBqlRequest:r,schema:l}=d,a=e=>{let s=[],u=[],n=t=>{if(t.$id)return t.$id;let o=N(l,t),{idFields:P}=o;if(!P)throw new Error(`no idFields: ${JSON.stringify(t)}`);let[w]=P;if(!w)throw new Error(`no idField: ${JSON.stringify(t)}`);let k=o.dataFields?.find(T=>T.path===w),q=X({currentThing:t,fieldSchema:k,mandatoryDependencies:!0}),b=t[w]||t.$id||q;if(!b)throw new Error(`no idValue: ${JSON.stringify(t)}`);return b},p=t=>{if(t.$op==="create"){let o=n(t);if(s.find(P=>P.$id===o))throw new Error(`Duplicate id ${o} for node ${JSON.stringify(t)}`);if(u.find(P=>P.$bzId===t.$bzId))throw new Error(`Duplicate $bzid ${t.$bzId} for node ${JSON.stringify(t)}`);s.push({...t,$id:o});return}t.$tempId&&t.$op==="match"||s.push(t);},i=t=>{if(t.$op==="create"){let o=n(t);if(s.find(P=>P.$id===o),u.find(P=>P.$bzId===t.$bzId))throw new Error(`Duplicate %bzId ${t.$bzIdd} for edge ${JSON.stringify(t)}`);u.push({...t,$id:o});return}u.push(t);};return traverse(e,({value:t})=>{if(!isObject(t))return;let o=t;if(o.$entity||o.$relation){if(!o.$op)throw new Error(`Operation should be defined at this step ${JSON.stringify(o)}`);if(!o.$bzId)throw new Error("[internal error] BzId not found");let P=N(l,o),{dataFields:w,roleFields:k,linkFields:q,usedFields:b}=G(P,o),T=()=>{if(o.$op==="create"||o.$op==="delete")return o.$op;if(o.$op==="update"){let h=b.filter(E=>w?.includes(E)),S=b.filter(E=>k?.includes(E)),$=b.filter(E=>q?.includes(E));if(h.length>0)return "update";if(S.length>0||$.length>0)return "match";throw new Error(`No fields on an $op:"update" for node ${JSON.stringify(o)}`)}return "match"},L={...o.$entity&&{$entity:o.$entity},...o.$relation&&{$relation:o.$relation},...o.$id&&{$id:o.$id},...o.$tempId&&{$tempId:o.$tempId},...o.$filter&&{$filter:o.$filter},...shake(pick(o,w||[""])),$op:T(),$bzId:o.$bzId,[Symbol.for("dbId")]:P.defaultDBConnector.id,[Symbol.for("path")]:o[Symbol.for("path")],[Symbol.for("parent")]:o[Symbol.for("parent")],[Symbol.for("isRoot")]:o[Symbol.for("isRoot")],[Symbol.for("isLocalId")]:o[Symbol.for("isLocalId")]||!1};if(p(L),o[Symbol.for("relation")]&&o[Symbol.for("edgeType")]==="linkField"){if((o.$op==="link"||o.$op==="unlink")&&(o.$id||o.$filter)){if(o.$tempId)throw new Error("can't specify a existing and a new element at once. Use an id/filter or a tempId");s.push({...o,$op:"match"});}let h=o[Symbol.for("relation")]===o.$relation,S=h?o.$bzId:`LT_${v4()}`,E=o[Symbol.for("parent")].path,m=(E?getNodeByPath(e,E):e).$bzId;if(!m)throw new Error("No parent id found");if(o[Symbol.for("relation")]==="$self")return;let Q=()=>{if(o.$op==="delete")return h?"match":"delete";if(o.$op==="unlink")return h?"unlink":"delete";if(o.$op==="link"||o.$op==="create")return h?"link":"create";if(o.$op==="replace")throw new Error("Unsupported: Nested replaces not implemented yet");return "match"},I={$relation:o[Symbol.for("relation")],$bzId:S,...o.$tempId?{$tempId:o.$tempId}:{},$op:Q(),...h?{}:{[o[Symbol.for("role")]]:o.$bzId},[o[Symbol.for("oppositeRole")]]:m,[Symbol.for("dbId")]:l.relations[o[Symbol.for("relation")]].defaultDBConnector.id,[Symbol.for("edgeType")]:"linkField",[Symbol.for("info")]:"normal linkField",[Symbol.for("path")]:o[Symbol.for("path")],[Symbol.for("parent")]:o[Symbol.for("parent")]};i(I),(o.$op==="unlink"||Q()==="unlink")&&h&&i({$relation:o[Symbol.for("relation")],$bzId:S,$op:"match",[o[Symbol.for("oppositeRole")]]:m,[Symbol.for("dbId")]:l.relations[o[Symbol.for("relation")]].defaultDBConnector.id,[Symbol.for("edgeType")]:"linkField",[Symbol.for("info")]:"additional ownrelation unlink linkField",[Symbol.for("path")]:o[Symbol.for("path")],[Symbol.for("parent")]:o[Symbol.for("parent")]});}if(o.$relation){let h=ce(o,(E,g)=>k.includes(E)),S=mapEntries(h,(E,g)=>isArray(g)?[E,g]:isObject(g)?[E,g.$bzId]:[E,g]),$=ce(t,(E,g)=>E.startsWith("$")||E.startsWith("Symbol"));if(Object.keys(h).filter(E=>!E.startsWith("$")).length>0){if(o.$op==="create"||o.$op==="delete"){let E=()=>{if(o.$op==="create")return "link";if(o.$op==="delete")return "match";throw new Error("Unsupported parent of edge op")},g=mapEntries(S,(Q,I)=>Array.isArray(I)?[Q,I.map(O=>O.$bzId||O)]:[Q,I.$bzId||I]),m={...$,$relation:o.$relation,$op:E(),...g,$bzId:o.$bzId,[Symbol.for("path")]:o[Symbol.for("path")],[Symbol.for("dbId")]:P.defaultDBConnector.id,[Symbol.for("info")]:"coming from created or deleted relation",[Symbol.for("edgeType")]:"roleField on C/D"};i(m);return}if(o.$op==="match"||o.$op==="update"&&Object.keys(h).length>0){let E=0;Object.entries(h).forEach(([g,m])=>{let Q=isArray(m)?m:[m],I=O=>O==="create"||O==="replace"?"link":O;Q.forEach(O=>{if(!O)return;let j=I(O.$op);if(j==="replace")throw new Error("Not supported yet: replace on roleFields");if(j==="unlink"&&E>0)throw E+=1,new Error("Not supported yet: Cannot unlink more than one role at a time, please split into two mutations");let D={...$,$relation:o.$relation,$op:j==="delete"?"unlink":j,[g]:O.$bzId,$bzId:o.$bzId,[Symbol.for("dbId")]:P.defaultDBConnector.id,[Symbol.for("parent")]:o[Symbol.for("parent")],[Symbol.for("path")]:o[Symbol.for("path")],[Symbol.for("info")]:"updating roleFields",[Symbol.for("edgeType")]:"roleField on L/U/R"};i(D);});});}}}}}),[s,u]};if(!r)throw new Error("Undefined filledBqlRequest");let [F,f]=a(r),y=F.reduce((e,s)=>{if(!s.$bzId)return [...e,s];let u=e.findIndex(n=>n.$bzId===s.$bzId);if(u===-1)return [...e,s];if(e[u].$op==="create"&&s.$op==="match")return e;if(e[u].$op==="match"&&(s.$op==="create"||s.$op==="match"))return [...e.slice(0,u),s,...e.slice(u+1)];throw new Error(`Unsupported operation combination for $tempId "${s.$tempId}". Existing: ${e[u].$op}. Current: ${s.$op}`)},[]),B=f.reduce((e,s)=>{let u=e.find(n=>(n.$id&&n.$id===s.$id||n.$bzId&&n.$bzId===s.$bzId)&&n.$relation===s.$relation&&n.$op===s.$op);if(u){let n={...u};return Object.keys(s).forEach(i=>{if(typeof i=="symbol"||i.startsWith("$"))return;let c=u[i],t=s[i];Array.isArray(c)&&Array.isArray(t)?n[i]=Array.from(new Set([...c,...t])):!Array.isArray(c)&&Array.isArray(t)?c!==void 0?n[i]=Array.from(new Set([c,...t])):n[i]=t:Array.isArray(c)&&!Array.isArray(t)?t!==void 0&&(n[i]=Array.from(new Set([...c,t]))):c!==null&&t!==null&&c!==void 0&&t!==void 0?n[i]=Array.from(new Set([c,t])):c==null&&(n[i]=t);}),[...e.filter(i=>!((i.$id&&i.$id===s.$id||i.$bzId&&i.$bzId===s.$bzId)&&i.$relation===s.$relation&&i.$op===s.$op)),n]}return [...e,s]},[]);[...new Set(B.map(e=>e.$relation))];d.bqlRequest={mutation:{things:y,edges:B}};};var fe=async(d,r)=>{let l=r.dbConnectors[0].id,a=d.typeDB.get(l)?.session,F=d.typeDB.get(l)?.client;if(!a||!a.isOpen()){if(!F)throw new Error("Client not found");a=await F.session(r.dbConnectors[0].dbName,SessionType.DATA),d.typeDB.set(l,{client:F,session:a});}return {client:F,session:a}};var it=async(d,r)=>{let{dbHandles:l,tqlRequest:a,bqlRequest:F,config:f}=d;if(!a)throw new Error("TQL request not built");if(!(a.deletions&&a.deletionMatches||a.insertions))throw new Error("TQL request error, no things");if(!F?.mutation)throw new Error("BQL mutation not parsed");let{session:y}=await fe(l,f),B=await y.transaction(TransactionType.WRITE);if(!B)throw new Error("Can't create transaction");let M=a.deletionMatches&&a.deletions&&`match ${a.deletionMatches} delete ${a.deletions}`,R=a.insertions&&`${a.insertionMatches?`match ${a.insertionMatches}`:""} insert ${a.insertions}`;M&&await B.query.delete(M);let e=R&&B.query.insert(R);try{let s=e?await e.collect():void 0;await B.commit(),await B.close(),r.rawTqlRes={insertions:s};}catch(s){throw await B.close(),new Error(`Transaction failed: ${s.message}`)}};var be=Symbol.for("schema"),U=Symbol.for("queryPath");var W="___",nt=async d=>{let{enrichedBqlQuery:r}=d;if(!r)throw new Error("BQL query not enriched");let l="",a=(e,s)=>{let u="",n="";for(let p in e){let i=e[p];if(Array.isArray(i))for(let c=0;c<i.length;c++)n+=`{$${s} has ${p} "${i[c]}";}`,c<i.length-1?n+="or":n+=";";else u+=`, has ${p} "${i}"`;}u+=`;
34
- `,l+=u,l+=n;},F=(e,s)=>{let u=[],n=[],p="";for(let t=0;t<e.length;t++)e[t].$isVirtual||u.push(` ${e[t].$dbPath}`),n.push(`{${e[t].$dbPath}:${e[t].$as}}`);let i=`${u.join(",")};
35
- `;p=n.join(",");let c=`$metadata:{as:[${p}]}`;l+=`$${s} as "${s}.${c}.$dataFields": `,l+=i;},f=(e,s,u)=>{for(let n of e){let{$fields:p,$as:i,$justId:c,$idNotIncluded:t,$filterByUnique:o}=n,P=n[U],w=`$metadata:{as:${i},justId:${c?"T":"F"},idNotIncluded:${t},filterByUnique:${o}}`;if(l+=`"${u}.${w}.${n.$var}":{
36
- `,l+=` match
37
- `,n.$filter&&(l+=` $${s}${W}${n.$var} isa ${n.$thing}`,a(n.$filter,`${s}${W}${n.$var}`)),l+=` $${s} (${n.$var}: $${s}${W}${n.$var}) isa ${n.$intermediary};
38
- `,p){let k=`M_${v4()}`;l+=`?queryPath${k} = "${P}";
39
- `,l+=` fetch
40
- `,l+=`?queryPath${k} as "queryPath"
41
- ;`;let q=p?.filter(L=>L.$fieldType==="data");q&&q.length>0&&F(q,`${s}${W}${n.$var}`,`${s}.${n.$var}`);let b=p?.filter(L=>L.$fieldType==="link");b&&b.length>0&&y(b,`${s}${W}${n.$var}`,`${s}.${n.$var}`);let T=p?.filter(L=>L.$fieldType==="role");T&&T.length>0&&f(T,`${s}${W}${n.$var}`,`${s}.${n.$var}`);}l+=`};
42
- `;}},y=(e,s,u)=>{for(let n of e){let{$fields:p,$as:i,$justId:c,$idNotIncluded:t,$filterByUnique:o,$playedBy:P}=n,w=n[U],k=`$metadata:{as:${i},justId:${c?"T":"F"},idNotIncluded:${t},filterByUnique:${o}}`;if(l+=`"${u}.${k}.${n.$var}":{
43
- `,l+=` match
44
- `,n.$filter&&(l+=` $${s}${W}${n.$var} isa ${n.$thing}`,a(n.$filter,`${s}${W}${n.$var}`)),n.$target==="role"?l+=` $${s}_intermediary (${n.$plays}: $${s}, ${P.plays}: $${s}${W}${n.$var}) isa ${n.$intermediary};
45
- `:l+=` $${s}${W}${n.$var} (${n.$plays}: $${s}) isa ${n.$thing};
46
- `,p){let q=`M_${v4()}`;l+=`?queryPath${q} = "${w}";
47
- `,l+=` fetch
48
- `,l+=`?queryPath${q} as "queryPath"
49
- ;`;let b=p?.filter(h=>h.$fieldType==="data");b&&b.length>0&&F(b,`${s}${W}${n.$var}`);let T=p?.filter(h=>h.$fieldType==="link");T&&T.length>0&&y(T,`${s}${W}${n.$var}`,`${s}.${n.$var}`);let L=p?.filter(h=>h.$fieldType==="role");L&&L.length>0&&f(L,`${s}${W}${n.$var}`,`${s}.${n.$var}`);}l+=`};
50
- `;}},B=r.length>1,M=[];(e=>{if(B)for(let s of e){let{$path:u,$thing:n,$filter:p,$fields:i}=s,c=s[U];l+=`match
51
- $${u} isa ${n} `,p?a(p,u):l+="; ";let t=`M_${v4()}`;if(l+=`?queryPath${t} = "${c}";
52
- `,l+=`fetch
53
- `,l+=`?queryPath${t} as "queryPath"
54
- ;`,i){let o=i.filter(k=>k.$fieldType==="data");o&&o.length>0&&F(o,u);let P=i.filter(k=>k.$fieldType==="link");P&&P.length>0&&y(P,u,u);let w=i.filter(k=>k.$fieldType==="role");w&&w.length>0&&f(w,u,u);}M.push(l),l="";}else for(let s of e){let{$path:u,$thing:n,$filter:p,$fields:i}=s,c=s[U];if(l+=`match
55
- $${u} isa ${n} `,p?a(p,u):l+="; ",l+=`?queryPath = "${c}";
56
- `,l+=`fetch
57
- `,l+=`?queryPath as "queryPath"
58
- ;`,i){let t=i.filter(w=>w.$fieldType==="data");t&&t.length>0&&F(t,u);let o=i.filter(w=>w.$fieldType==="link");o&&o.length>0&&y(o,u,u);let P=i.filter(w=>w.$fieldType==="role");P&&P.length>0&&f(P,u,u);}}})(r),d.tqlRequest=B?M:l;};var Re=d=>{let r=d.dataFields?.map(f=>f.path)||[],l=d.linkFields?.map(f=>f.path)||[],a=Object.keys(d.roles||{})||[];return [...r,...l,...a]},qe=(d,r)=>Object.keys(d||{}).some(a=>{if(!Array.isArray(d[a])){let F=r.idFields?.includes(a),f=r.dataFields?.some(y=>(y.dbPath===a||y.path===a)&&y?.validations?.unique);return F||f}return !1}),Oe=(d,r)=>{let l=r.dataFields?.map(y=>({path:y.path,dbPath:y.dbPath}))||[],a=r.linkFields?.map(y=>({path:y.path,dbPath:y.dbPath}))||[],F=Object.keys(r.roles||{}).map(y=>({path:y,dbPath:y}))||[],f=[...l,...a,...F];return Object.entries(d||{}).reduce((y,[B,M])=>{let R=f.find(e=>e.path===B);return y[R?.dbPath||B]=M,y},{})},ot=async d=>{let{rawBqlRequest:r,schema:l}=d;if(Array.isArray(r)){for(let e of r)if(!("$entity"in e)&&!("$relation"in e)&&(!("$thing"in e)||!("$thingType"in e)))throw new Error("No entity specified in query")}else if(!("$entity"in r)&&!("$relation"in r)&&(!("$thing"in r)||!("$thingType"in r)))throw new Error("No entity specified in query");let a=(e,s)=>typeof s=="string"?e.idFields?.includes(s):e.idFields?.includes(s.$path),F=(e,s,u,n,p)=>({$path:s,$dbPath:n,$thingType:"attribute",$as:e.$as||s,$var:s,$fieldType:"data",$excludedFields:e.$excludedFields,$justId:u,$id:e.$id,$filter:e.$filter,$isVirtual:p,$filterProcessed:!0}),f=(e,s,u,n,p)=>{let{target:i,oppositeLinkFieldsPlayedBy:c}=u;return c.map(t=>{let o=i==="role"?t.thingType:"relation",P=i==="role"?t.thing:u.relation,w={[`$${o}`]:P},k=N(l,w),q=e?.$fields?.filter(T=>a(k,T)).length===0,b=[];return typeof e!="string"?e.$fields?q?b=[...e.$fields,...k.idFields]:b=e.$fields:b=Re(k):b=["id"],e.$excludedFields&&(b=b.filter(T=>a(k,T)?!0:!e.$excludedFields.includes(T.$path))),{$thingType:o,$plays:u.plays,$playedBy:t,$path:t.path,$dbPath:p,$as:e.$as||s,$var:s,$thing:P,$fields:b,$excludedFields:e.$excludedFields,$fieldType:"link",$target:i,$intermediary:t.relation,$justId:n,$id:e.$id,$filter:Oe(e.$filter,k),$idNotIncluded:q,$filterByUnique:qe(e.$filter,k),$filterProcessed:!0}})},y=(e,s,u,n,p)=>u.playedBy.map(i=>{let{thing:c,thingType:t,relation:o}=i,P={[`$${t}`]:c},w=N(l,P),k=e?.$fields?.filter(b=>w?.idFields?.includes(b)||w?.idFields?.includes(b.$path)).length===0,q=[];return typeof e!="string"?e.$fields?k?q=[...e.$fields,...w.idFields]:q=e.$fields:q=Re(w):q=["id"],e.$excludedFields&&(q=q.filter(b=>a(w,b)?!0:!e.$excludedFields.includes(b.$path))),{$thingType:t,$path:s,$dbPath:p,$as:e.$as||s,$var:s,$thing:c,$fields:q,$excludedFields:e.$excludedFields,$fieldType:"role",$intermediary:o,$justId:n,$id:e.$id,$filter:Oe(e.$filter,w),$idNotIncluded:k,$filterByUnique:qe(e.$filter,w),$playedBy:i,$filterProcessed:!0}}),B=(e,s)=>{let u=typeof e=="string"?e:e.$path,n=typeof e=="string",p=s.dataFields?.find(t=>t.path===u),i=s.linkFields?.find(t=>t.path===u),c=s.roles?.[u];if(p){let t=p.isVirtual&&p.default;return F(e,u,n,p.dbPath,t)}else {if(i)return f(e,u,i,n,i.dbPath);if(c)return y(e,u,c,n,c.dbPath)}return null},R=(e=>produce(e,s=>traverse(s,u=>{let{value:n,meta:p}=u,i=n;if(isObject(i)){if(i.$id){let c=i.$entity||i.$relation?i:{[`$${i.$thingType}`]:i.$thing},t=N(l,c);if(i.$path=t.name,Array.isArray(i.$id)||(i.$filterByUnique=!0),t?.idFields?.length===1){let[o]=t.idFields;i.$filter={...i.$filter,[o]:i.$id},delete i.$id;}else throw new Error("Multiple ids not yet enabled / composite ids")}else if("$entity"in i||"$relation"in i){let c=N(l,i);i.$path=c.name,i.$as=c.name;}if(i.$entity?(i.$thing=i.$entity,i.$thingType="entity",delete i.$entity):i.$relation&&(i.$thing=i.$relation,i.$thingType="relation",delete i.$relation),isObject(i)&&"$thing"in i){let c=i.$entity||i.$relation?i:{[`$${i.$thingType}`]:i.$thing};i[U]=p.nodePath;let t=N(l,c);if(i.$filter&&(i.$filterByUnique=qe(i.$filter,t),i.$filterProcessed||(i.$filter=Oe(i.$filter,t))),i.$fields){i.$fields.filter(w=>t?.idFields?.includes(w)||t?.idFields?.includes(w.$path)).length>0||(i.$fields=[...i.$fields,...t.idFields],i.$idNotIncluded=!0);let P=i.$fields?.flatMap(w=>{let k=B(w,t);return Array.isArray(k)?k:[k]}).filter(Boolean);i.$fields=P;}else {let P=Re(t)?.flatMap(w=>{let k=B(w,t);return Array.isArray(k)?k:[k]}).filter(Boolean);i.$fields=P;}i.$excludedFields&&(i.$fields=i.$fields.filter(o=>a(t,o)?!0:!i.$excludedFields.includes(o.$path)));}}})))(Array.isArray(r)?r:[r]);d.enrichedBqlQuery=R;};var at=async(d,r)=>{let{dbHandles:l,enrichedBqlQuery:a,tqlRequest:F,config:f}=d;if(!a)throw new Error("BQL request not parsed");if(!F)throw new Error("TQL request not built");let y=new TypeDBOptions;if(y.infer=!0,Array.isArray(F)){let M=await parallel(F.length,F,async R=>{let{session:e}=await fe(l,f),s=await e.transaction(TransactionType.READ,y);if(!s)throw new Error("Can't create transaction");let n=await s.query.fetch(R).collect();return await s.close(),n});r.rawTqlRes=M,r.isBatched=!0;}else {let{session:M}=await fe(l,f),R=await M.transaction(TransactionType.READ,y);if(!R)throw new Error("Can't create transaction");let s=await R.query.fetch(F).collect();await R.close(),r.rawTqlRes=s;}};var lt=d=>{let r=/as:([a-zA-Z0-9_\-·]+)/,l=/justId:([a-zA-Z0-9_\-·]+)/,a=/idNotIncluded:([a-zA-Z0-9_\-·]+)/,F=/filterByUnique:([a-zA-Z0-9_\-·]+)/,f=d.match(r),y=d.match(l),B=d.match(a),M=d.match(F);return {as:f?f[1]:null,justId:y?y[1]:null,idNotIncluded:B?B[1]:null,filterByUnique:M?M[1]:null}},yi=d=>{try{let l=(F=>{let f=F.replace("$metadata:","");return f=f.replace(/([a-zA-Z0-9_\-·]+)(?=:)/g,'"$1"'),f=f.replace(/:(\s*)([a-zA-Z0-9_\-·]+)/g,(y,B,M)=>/^{.*}$/.test(M)?`:${M}`:`:${B}"${M}"`),f=f.replace(/\[([^\]]+)\]/g,(y,B)=>`[${B.split(",").map(M=>M.trim().startsWith("{")&&M.trim().endsWith("}")?M.trim():`"${M.trim()}"`).join(",")}]`),f})(d);return JSON.parse(l)}catch(r){return console.error(r),{as:[]}}},dt=async(d,r)=>{let{enrichedBqlQuery:l,rawBqlRequest:a,schema:F,config:f}=d,{rawTqlRes:y,isBatched:B}=r;if(l){if(!y)throw new Error("TQL query not executed")}else throw new Error("BQL request not enriched");let M=(i,c)=>{let{$metaData:t}=i,{as:o}=yi(t),P=Object.entries(i).filter(([w])=>w!=="type"&&!w.includes("$")).map(([w,k])=>{let q=c.dataFields?.find(h=>h.path===w||h.dbPath===w),b=w==="id",T=Array.isArray(o)?o.find(h=>h[w])?.[w]:w,L;if(q?.cardinality==="ONE"){if(L=k[0]?k[0].value:f.query?.returnNulls?null:void 0,q.contentType==="DATE"&&(L=L&&`${L}Z`),b)return [[T,L],["$id",L]].filter(([h,S])=>S!==void 0)}else if(q?.cardinality==="MANY"){if(!isArray(k))throw new Error("Typedb fetch has changed its format");if(k.length===0)return f.query?.returnNulls?[[T,null]]:[];q.contentType==="DATE"?L=k.map(h=>`${h.value}Z`):L=k.map(h=>h.value);}return [[T,L]].filter(([h,S])=>S!==void 0)}).flat();return Object.fromEntries([...P])},R=i=>i.reduce((c,t)=>{let{$roleFields:o,$metaData:P,$cardinality:w}=t,{as:k,justId:q,idNotIncluded:b,filterByUnique:T}=lt(P),L=o.map(h=>{let{dataFields:S,currentSchema:$,linkFields:E,roleFields:g,schemaValue:m}=s(h),Q=M(S,$);if(q==="T")return Q.id;{let I=e(E),O=R(g),j={...Q};return b==="true"&&$?.idFields?.forEach(D=>delete j[D]),{...j,...I,...O,...m}}});return L.length>0?c[k]=w==="MANY"&&T==="false"?L:L[0]:f.query?.returnNulls&&(c[k]=null),c},{}),e=i=>i.reduce((c,t)=>{let{$linkFields:o,$metaData:P,$cardinality:w}=t,{as:k,justId:q,idNotIncluded:b,filterByUnique:T}=lt(P),L=o.map(h=>{let{dataFields:S,currentSchema:$,linkFields:E,roleFields:g,schemaValue:m}=s(h),Q=M(S,$);if(q==="T")return Q.id;{let I=e(E),O=R(g),j={...Q};return b==="true"&&$.idFields?.forEach(D=>delete j[D]),{...j,...I,...O,...m}}});return c[k]=L.length>0?w==="MANY"&&T==="false"?L:L[0]:f.query?.returnNulls?null:void 0,c},{}),s=i=>{let c=Object.keys(i),t=c.find(h=>h.endsWith(".$dataFields"));if(!t)throw new Error("No datafields");let o=i[t],P=t.split(".")[t.split(".").length-2];if(o.$metaData=P,o.length===0)throw new Error("No datafields");let w=o.type,k={$thing:w.label,$thingType:w.root,[U]:i.queryPath.value},q={[`$${k.$thingType}`]:k.$thing},b=N(F,q),T=c.filter(h=>!h.endsWith(".$dataFields")&&b.linkFields?.some(S=>S.path===h.split(".").pop())).map(h=>({$linkFields:i[h],$key:h.split(".").pop(),$metaData:h.split(".")[h.split(".").length-2],$cardinality:b?.linkFields?.find(S=>S.path===h.split(".").pop())?.cardinality})),L=c.filter(h=>!h.endsWith(".$dataFields")&&b.roles?.[h.split(".").pop()]).map(h=>({$roleFields:i[h],$key:h.split(".").pop(),$metaData:h.split(".")[h.split(".").length-2],$cardinality:b.roles[h.split(".").pop()].cardinality}));return {dataFields:o,schemaValue:k,currentSchema:b,linkFields:T,roleFields:L}},u=i=>i.map(c=>{let{dataFields:t,currentSchema:o,linkFields:P,roleFields:w,schemaValue:k}=s(c),q=M(t,o),b=e(P),T=R(w),L=a?.$fields?.every(S=>!o?.idFields?.includes(S)&&!o?.idFields?.includes(S.$path));return {...b,...T,...k,...!f.query?.noMetadata&&a.$id?{$id:Array.isArray(a.$id)?q.id:a.$id}:{},...L?Object.fromEntries(Object.entries(q).filter(([S])=>!o?.idFields?.includes(S))):q}}),p=(i=>{let c=t=>{let o=u(t);return a.$id&&!Array.isArray(a.$id)||l[0].$filterByUnique?o[0]??null:o.length===0?null:o};return B?i.map(c):c(i)})(y);r.bqlRes=p;};var hi=Symbol.for("grandChildOfCreate"),ne=d=>({...d[Symbol.for("relation")]&&{[Symbol.for("relation")]:d[Symbol.for("relation")]},...d[Symbol.for("parent")]&&{[Symbol.for("parent")]:d[Symbol.for("parent")]},...d[Symbol.for("edgeType")]&&{[Symbol.for("edgeType")]:d[Symbol.for("edgeType")]},...d[Symbol.for("role")]&&{[Symbol.for("role")]:d[Symbol.for("role")]},...d[Symbol.for("oppositeRole")]&&{[Symbol.for("oppositeRole")]:d[Symbol.for("oppositeRole")]},...d[Symbol.for("relFieldSchema")]&&{[Symbol.for("relFieldSchema")]:d[Symbol.for("relFieldSchema")]},...d[Symbol.for("path")]&&{[Symbol.for("path")]:d[Symbol.for("path")]},...d[Symbol.for("isRoot")]&&{[Symbol.for("isRoot")]:d[Symbol.for("isRoot")]},...d[Symbol.for("depth")]&&{[Symbol.for("depth")]:d[Symbol.for("depth")]},...d[Symbol.for("schema")]&&{[Symbol.for("schema")]:d[Symbol.for("schema")]},...d[Symbol.for("dbId")]&&{[Symbol.for("dbId")]:d[Symbol.for("dbId")]},...d[Symbol.for("index")]&&{[Symbol.for("index")]:d[Symbol.for("index")]}}),ct=async d=>{let{filledBqlRequest:r,config:l,schema:a}=d,F=(b,T)=>Object.keys(b).filter(L=>L.startsWith("$")?!1:T?!N(a,b).dataFields?.find(S=>S.path===L):!0);if(!r)throw new Error("[BQLE-M-PQ-1] No filledBqlRequest found");if(l.mutation?.preQuery===!1)return;let f=[];if(traverse(r,({parent:b,key:T,value:L})=>{b&&T&&!T.includes("$")&&isObject(b)?(Array.isArray(b[T])?b[T]:[b[T]]).forEach(S=>{if(isObject(S)){if(b.$op!=="create")f.includes(S.$op)||f.push(S.$op);else if(S.$op==="delete"||S.$op==="unlink")throw new Error(`Cannot ${S.$op} under a create`)}}):!b&&isObject(L)&&(f.includes(L.$op)||f.push(L.$op));}),!f.includes("delete")&&!f.includes("unlink")&&!f.includes("replace")&&!f.includes("update")&&!f.includes("link"))return;let B=(b=>{let T=(L,h)=>{let S=[],$={},E=["$op","$bzId","$parentKey"],g=["$relation","$entity","$id",...E];for(let m in L)if(!E.includes(m)&&!(g.includes(m)&&!h))if(!m.includes("$")&&(isObject(L[m])||Array.isArray(L[m]))){let Q=L[m];Array.isArray(Q)&&Q.length>0?Q.forEach(I=>{S.push({$path:m,...T(I)});}):S.push({$path:m,...T(Q)});}else $[m]=L[m];return {...$,$fields:S}};return b.map(L=>T(L,!0))})(Array.isArray(r)?r:[r]),M=await Fe(B,d.config,d.schema,d.dbHandles),R=(b,T)=>{let L=b.$id||b.id||b.$bzId;if(b.$objectPath){let{$objectPath:h}=b,S=h?.beforePath||"root",$=Array.isArray(h.ids)?`[${h.ids}]`:h.ids;return {beforePath:`${S}.${$}___${h.key}`,ids:L,key:T}}else return {beforePath:"root",ids:L,key:T}},e=(b,T)=>{let L=b?.beforePath||"root",h=T||(Array.isArray(b?.ids)?`[${b?.ids}]`:b?.ids);return `${L}.${h}___${b?.key}`},s=b=>{if(b.includes("[")&&b.includes("]")){let[T,L,h]=b.split(/[[\]]/);return L.split(",").map($=>`${T}${$}${h}`)}else return [b]},u={};(b=>produce(b,T=>traverse(T,L=>{let{key:h,parent:S}=L;if(S&&h&&S.$id&&!h.includes("$")){let $=R(S,h),E=e($);if(Array.isArray(S[h])){let g=[];S[h].forEach(m=>{isObject(m)?(m.$objectPath=$,g.push(m.$id.toString())):m&&g.push(m.toString());}),u[E]={$objectPath:$,$ids:g};}else {let g=S[h];isObject(g)?(u[E]={$objectPath:$,$ids:[g.$id.toString()]},g.$objectPath=$):g&&(u[E]={$objectPath:$,$ids:[g.toString()]});}}})))(M||{});let p=b=>produce(b,T=>traverse(T,L=>{let{key:h,value:S,parent:$}=L;$&&h&&!h.includes("$")&&(Array.isArray(S)||isObject(S))&&!Array.isArray($)&&(Array.isArray($[h])?$[h].forEach(E=>{typeof E!="string"&&(E.$objectPath=R($,h),E.$parentIsCreate=$.$op==="create",E[hi]=$.$parentIsCreate||$[Symbol.for("grandChildOfCreate")]);}):isObject($[h])&&($[h].$parentIsCreate=$.$op==="create",$[h][Symbol.for("grandChildOfCreate")]=$.$parentIsCreate||$[Symbol.for("grandChildOfCreate")],$[h].$objectPath=R($,h)));})),i=p(r),t=(b=>{let T=($,E)=>{let g=[];$.filter(O=>O).forEach(O=>{let j=Object.keys(O).filter(D=>!D.startsWith("$")).length;if(Array.isArray(O.$id)&&j>0){let D=O.$id.map(z=>({...O,$id:z}));g=[...g,...D];}else g.push({...O});});let m=[],Q=[],I=g.filter(O=>{let D=["delete","update","unlink"].includes(O.$op||""),z=F(O,!0).length;if((!O.$id||Array.isArray(O.$id)&&z>0||O.$filter)&&D)return !0;Q.push({...O});});return I.length>0?I.forEach(O=>{let D=(x=>{let se=(()=>{let _={};for(let C in x){let Y=N(a,x);!C.startsWith("$")&&Y.dataFields?.find(re=>re.path===C)&&(_[C]=x[C]);}return _})(),ae=Object.keys(x),Z=ae.filter(_=>!_.startsWith("$")),we=[],ye=(_,C)=>{if(_===Z.length){let re={...C};ae.forEach(V=>{V.startsWith("$")&&(re[V]=x[V]);}),we.push(re);return}let Y={...C,[Z[_]]:x[Z[_]],...ne(C),...se};ye(_+1,Y),ye(_+1,C);};return ye(0,{...ne(x)}),we})(O).filter(x=>!(x.$op==="update"&&Object.keys(x).filter(ee=>!ee.startsWith("$")).length===0)),z=[],J=e(O.$objectPath),v=u[J]?u[J].$ids:[],A=D.map((x,ee)=>{let se=N(a,x),Z=Object.keys(x).filter(C=>!C.includes("$")&&!se.dataFields?.some(Y=>Y.path===C)).map(C=>(Array.isArray(x[C])?x[C].length>1?x[C].filter(V=>!V.$id||Array.isArray(V.$id)||V.$filter):x[C]:[x[C]]).map(V=>{let Ee=e(V.$objectPath);return {idsToKey:(Le=>{let je=[],de=Le.split("."),Ot=de.slice(0,de.length-1).join("."),At=de.slice(de.length-1,de.length)[0].split("___")[1];for(let Me in u)if(Me.startsWith(Ot)&&Me.endsWith(At)){let Te=Me.split("."),Ct=Te.slice(Te.length-1,Te.length)[0].split("___")[0];je.push(Ct);}return je})(Ee),key:C,multiple:V}})).filter(C=>C!==void 0),_=(C=>{let Y=C.map(V=>V.map(te=>te.idsToKey));return (V=>V.length>0?V.reduce((te,le)=>te.concat(le),[]).reduce((te,le)=>te?le.filter(Le=>te.includes(Le)):le):[])(Y)})(Z).filter(C=>!z.includes(C));if(z=[...z,..._],v=v.filter(C=>!_.includes(C)),ee===D.length-1&&v.length>0)return {...x,$id:v,$bzId:`T_${v4()}`,...ne(x)};if(_.length>0)return {...x,$id:_,$bzId:`T_${v4()}`,...ne(x)}}).filter(x=>x!==void 0),qt=(()=>{if(A.length===0&&!E?.$id)return I;if(A.length===0&&E?.$id){let x=Array.isArray(E.$id)?E.$id:[E.$id],ee=[];return x.forEach(se=>{let ae=e({...O.$objectPath,ids:se}),Z=u[ae];Z&&ee.push({...O,$id:Z.$ids,...ne(O),$bzId:`T_${v4()}`});}),ee}else return A})();m=[...Q,...qt].map(L);}):m=g.map(L),m},L=$=>{let E={...$,$bzId:`T_${v4()}`,...ne($)},g=N(a,$);return Object.keys($).filter(m=>!m.includes("$")&&!g.dataFields?.some(Q=>Q.path===m)).forEach(m=>{let Q=Array.isArray($[m])?$[m]:[$[m]],I=T(Q,$);E[m]=I.length>0?I:void 0;}),E},h=[];return b.forEach($=>{h=[...h,...T([$])];}),h.map($=>L($))})(Array.isArray(i)?i:[i]),o=b=>b.map(T=>{let L=F(T,!0),h={...T};return L.forEach(S=>{let $=Array.isArray(T[S])?T[S]:[T[S]],E=[],g=[],m=[],Q={},I=Se(a,T,S);$.filter(A=>A).forEach(A=>{A.$op==="replace"&&A.$id?(Q=A,Array.isArray(A.$id)?g=[...g,...A.$id]:g.push(A.$id)):A.$op==="create"&&I==="ONE"&&A.id?(Q=A,Array.isArray(A.id)?m=[...g,...A.id]:m.push(A.id)):E.push(A);});let O=e(Q.$objectPath),D=s(O).map(A=>u[A]),z=[];D.filter(A=>A!=null).forEach(A=>{z=[...z,...A.$ids];});let J=z.filter(A=>!g.includes(A)),K=g.filter(A=>!z.includes(A)),v=ne(Q);J.length>0&&E.push({...Q,$op:"unlink",$id:J,$bzId:`T_${v4()}`,id:void 0,...v}),K.length>0&&K.forEach(A=>{E.push({...Q,$op:"link",$id:A,$bzId:`T_${v4()}`,...v});}),m.length>0&&m.forEach(A=>{E.push({...Q,$op:"create",id:A,$bzId:`T_${v4()}`,...v});}),h[S]=o(E);}),h}),P=p(o(p(t)));(b=>produce(b,T=>traverse(T,L=>{let{key:h,value:S,parent:$}=L;h&&$&&!h?.includes("$")&&(Array.isArray(S)||isObject(S))&&!Array.isArray($)&&(Array.isArray(S)?S:[S]).forEach(g=>{let m=u[e(g.$objectPath)],Q=(j,D)=>j.every(z=>D.includes(z)),I=g.$id?Array.isArray(g.$id)?Q(g.$id,m?m.$ids:[]):m?.$ids.includes(g.$id):m,O=Se(a,$,g.$objectPath.key);if(g.$op==="link"&&I&&O==="ONE")throw new Error(`[BQLE-Q-M-2] Cannot link on:"${e(g.$objectPath)}" because it is already occupied.`);if(g.$op)switch(g.$op){case"delete":if(!I&&!l.mutation?.ignoreNonexistingThings)throw new Error(`[BQLE-Q-M-2] Cannot delete $id:"${g.$id}" because it is not linked to $id:"${$.$id}"`);break;case"update":if(!I&&!l.mutation?.ignoreNonexistingThings)throw new Error(`[BQLE-Q-M-2] Cannot update $id:"${g.$id}" because it is not linked to $id:"${$.$id}"`);break;case"unlink":if(!I&&!l.mutation?.ignoreNonexistingThings)throw new Error(`[BQLE-Q-M-2] Cannot unlink $id:"${g.$id}" because it is not linked to $id:"${$.$id}"`);break;case"link":if(I)throw new Error(`[BQLE-Q-M-2] Cannot link $id:"${g.$id}" because it is already linked to $id:"${$.$id}"`);break;}});})))(P);let q=(b=>produce(b,T=>traverse(T,L=>{let{parent:h,key:S,value:$,meta:E}=L;isObject($)&&($[Symbol.for("path")]=E.nodePath,delete $.$objectPath,delete $.$parentIsCreate),S&&h&&!S?.includes("$")&&(Array.isArray($)||isObject($))&&!Array.isArray(h)&&(Array.isArray($)?$:[$]).forEach(m=>{isObject(m)&&(m[Symbol.for("parent")]={...$[Symbol.for("parent")],path:h[Symbol.for("path")]});});})))(P);d.filledBqlRequest=q;};var yt=async d=>{let{filledBqlRequest:r,schema:l}=d;if(!r)throw new Error("Filled BQL request is missing");let F=(B=>produce(B,M=>traverse(M,({value:R})=>{if(isObject(R)){let e=R,s=N(l,e),{unidentifiedFields:u}=G(s,e),{idFields:n,computedFields:p,virtualFields:i}=s;if(!n)throw new Error("No idFields found");let[c]=n,t=listify(e,(w,k)=>k!==void 0?w:void 0),o=t.filter(w=>i?.includes(w));if(o.length>0)throw new Error(`Virtual fields can't be sent to DB: "${o.join(",")}"`);if(p.filter(w=>!t.includes(w)).forEach(w=>{let k=s.dataFields?.find(h=>h.path===w),b=s.linkFields?.find(h=>h.path===w)?.oppositeLinkFieldsPlayedBy[0],T="roles"in s?pe(s.roles,(h,S)=>h===w):void 0,L=k||b||T;if(!L)throw new Error(`no field Def for ${w}`);if(w!==c&&e.$op==="create"&&!e[w]){let h=X({currentThing:e,fieldSchema:L,mandatoryDependencies:!0});e[w]=h;}}),u.length>0)throw new Error(`Unknown fields: [${u.join(",")}] in ${JSON.stringify(e)}`)}})))(r),y=(B=>produce(B,M=>traverse(M,({value:R})=>{isObject(R);})))(F);d.filledBqlRequest=y;};var gt=async d=>{let{filledBqlRequest:r}=d;if(!r)throw new Error("Filled BQL request is missing");let a=(y=>produce(y,B=>traverse(B,({value:M})=>{isObject(M)&&Je();})))(r),f=(y=>produce(y,B=>traverse(B,({value:M})=>{isObject(M);})))(a);d.filledBqlRequest=f;};var wt=async d=>{let{filledBqlRequest:r}=d;if(!r)throw new Error("Filled BQL request is missing");let l=F=>produce(F,f=>traverse(f,({value:y})=>{if(isObject(y)&&("$entity"in y||"$relation"in y)){let B=y,{requiredFields:M,enumFields:R,fnValidatedFields:e}=B[be];"$op"in B&&B.$op==="create"&&M.forEach(s=>{if(!(s in B))throw new Error(`[Validations] Required field "${s}" is missing.`)}),("$op"in B&&B.$op==="update"||B.$op==="create")&&R.forEach(s=>{if(s in B){let u=B[be]?.dataFields?.find(n=>n.path===s)?.validations?.enum;if(!u)throw new Error(`[Validations] Enum field "${s}" is missing enum options.`);if(isArray(B[s]))B[s].some(n=>{if(!u.includes(n))throw new Error(`[Validations] Option "${n}" is not a valid option for field "${s}".`)});else if(u&&!u.includes(B[s]))throw new Error(`[Validations] Option "${B[s]}" is not a valid option for field "${s}".`)}}),("$op"in B&&B.$op==="update"||B.$op==="create")&&e.forEach(s=>{if(s in B)try{let u=B[be]?.dataFields?.find(n=>n.path===s)?.validations?.fn;if(!u)throw new Error("Missing validation function.");if(!u(B[s]))throw new Error("Failed validation function.")}catch(u){throw new Error(`[Validations:attribute:${s}] ${u.message}`)}});}})),a=F=>produce(F,f=>traverse(f,({value:y,parent:B,meta:M})=>{if(isObject(y)&&("$entity"in y||"$relation"in y)){let R="$entity"in y?y.$entity:y.$relation,e=y,s=y[Symbol.for("schema")].hooks;if(s){let{pre:u}=s;if(u){let n=`on${_e(e.$op)}`;u.filter(i=>i.triggers[n]).forEach(i=>{let c=n in i.triggers?i.triggers[n]:void 0;if(c!==void 0&&c()){let t=Ve(F,B,M);i.actions.forEach(o=>{if(o.type==="validate"){if(o.severity!=="error")return;try{let P=o.fn(e,t);if(P===!1)throw new Error(`${o.message}.`);if(P!==!0)throw new Error("Validation function's output is not a boolean value.")}catch(P){throw new Error(`[Validations:thing:${R}] ${P.message}`)}}});}});}}}}));l(r),a(r);};var Et=async(d,r)=>{let{schema:l,enrichedBqlQuery:a}=d,{bqlRes:F}=r;if(!F)return;let y=(B=>produce(B,M=>traverse(M,({value:R})=>{if(isObject(R)){let e=R;if(!e.$thing)throw new Error("[Internal] Thing is missing");if(e.$thing){let s=N(l,e),{virtualFields:u}=s,n=e[U];if(!n)throw new Error("[Internal] QueryPath is missing");let p=getNodeByPath(a,n),i=p.$fields.map(t=>t.$path),c=p.$excludedFields;u.forEach(t=>{if(c?.includes(t)||i.length>0&&!i.includes(t))return;let o=s.dataFields?.find(P=>P.path===t);if(o?.default){let P=X({currentThing:e,fieldSchema:o,mandatoryDependencies:!0});e[t]=P;}else if(e[t]===void 0)throw new Error(`[Internal] Virtual field: No db value found for virtual field: ${t}`)}),c&&c.forEach(t=>{if(typeof t!="string")throw new Error("[Internal] ExcludedField is not a string");delete e[t];});}}})))(F);r.bqlRes=y;};var kt=async(d,r)=>{let{config:l}=d,{bqlRes:a}=r;if(!a)return;let f=(M=>produce(M,R=>traverse(R,({value:e})=>{isObject(e);})))(a),B=(M=>produce(M,R=>traverse(R,({value:e})=>{if(isObject(e)){let s=e;Object.keys(s).forEach(u=>{s[u]===void 0&&delete s[u];}),Object.getOwnPropertySymbols(s).forEach(u=>{delete s[u];}),l.query?.noMetadata===!0&&Object.keys(s).forEach(u=>{u.startsWith("$")&&delete s[u];});}})))(f);r.bqlRes=B;};var Qt={query:[ot,nt,at,dt,Et,kt],mutation:[Ye,ct,yt,gt,wt,tt,Ue,it,We,He]},Ae=async(d,r,l={},a=!0)=>{for(let F of d){let f=await F(r,l);if(f&&Array.isArray(f))for(let y of f)await Ae(y.pipeline,y.req,y.res,!1);}return a&&r.config.query?.debugger===!0&&typeof l.bqlRes=="object"?{...l.bqlRes,$debugger:{tqlRequest:r.tqlRequest}}:l.bqlRes},Fe=(d,r,l,a)=>Ae(Qt.query,{config:r,schema:l,rawBqlRequest:d,dbHandles:a},{}),St=(d,r,l,a)=>Ae(Qt.mutation,{config:r,schema:l,rawBqlRequest:d,dbHandles:a},{});var Ce=class{schema;config;dbHandles;constructor({schema:r,config:l}){this.schema=r,this.config=l;}getDbHandles=()=>this.dbHandles;init=async()=>{let r={typeDB:new Map},l=ze(this.schema);await Promise.all(this.config.dbConnectors.map(async a=>{if(a.provider==="typeDB"&&a.dbName){let[F,f]=await tryit(TypeDB.coreDriver)(a.url);if(F){let y=`[BORM:${a.provider}:${a.dbName}:core] ${F.message??"Can't create TypeDB Client"}`;throw new Error(y)}try{let y=await f.session(a.dbName,SessionType.DATA);r.typeDB.set(a.id,{client:f,session:y});}catch(y){let B=`[BORM:${a.provider}:${a.dbName}:session] ${(y.messageTemplate?._messageBody()||y.message)??"Can't create TypeDB Session"}`;throw new Error(B)}}if(a.provider==="typeDBCluster"&&a.dbName){let[F,f]=await tryit(TypeDB.cloudDriver)(a.addresses,a.credentials);if(F){let y=`[BORM:${a.provider}:${a.dbName}:core] ${F.message??"Can't create TypeDB Cluster Client"}`;throw new Error(y)}try{let y=await f.session(a.dbName,SessionType.DATA);r.typeDB.set(a.id,{client:f,session:y});}catch(y){let B=`[BORM:${a.provider}:${a.dbName}:session] ${(y.messageTemplate?._messageBody()||y.message)??"Can't create TypeDB Session"}`;throw new Error(B)}}})),this.schema=l,this.dbHandles=r;};#e=async()=>{if(!this.dbHandles&&(await this.init(),!this.dbHandles))throw new Error("Can't init BormClient")};introspect=async()=>(await this.#e(),this.schema);define=async()=>(await this.#e(),De(this.config,this.schema,this.dbHandles));query=async(r,l)=>{await this.#e();let a={...this.config,query:{...ke.query,...this.config.query,...l}};return Fe(r,a,this.schema,this.dbHandles)};mutate=async(r,l)=>{await this.#e();let a={...this.config,mutation:{...ke.mutation,...this.config.mutation,...l}};return St(r,a,this.schema,this.dbHandles)};close=async()=>{this.dbHandles&&this.dbHandles.typeDB.forEach(async({client:r,session:l})=>{l.isOpen()&&await l.close(),await r.close();});}},vr=Ce;//! Todo: delete when this works with the new $thing and $thingType fields
32
+ ${c}`})(),p=f.dbConnectors[0].id,h=s.typeDB.get(p)?.session,w=s.typeDB.get(p)?.client;if(!h){console.log("Session Status: ","NO SESSION");return}await h.close();let[{dbName:g}]=f.dbConnectors;await(await w.databases.get(g)).delete(),await w.databases.create(g);let t=await w.session(f.dbConnectors[0].dbName,SessionType.SCHEMA),o=await t.transaction(TransactionType.WRITE);await o.query.define(F),await o.commit(),await o.close();let u=await t.transaction(TransactionType.READ);(await(await u.query.match("match $a sub thing;")).collect()).forEach(async c=>{c.get("a");}),await u.close();};var Vt=(f,e,s)=>s?e:`${f}\xB7${e}`;var ft=(f,e)=>Object.values(Object.fromEntries(Object.entries(f).filter(([s,a])=>e(s,a))))[0],ut=(f,e)=>Object.fromEntries(Object.entries(f).filter(([s,a])=>e(s,a))),Wt=f=>{let e=[],s=produce(f,F=>traverse(F,({key:p,value:h,meta:w})=>{if(w.depth===2&&(p&&(h.dataFields=h.dataFields?.map(g=>({...g,cardinality:g.cardinality||"ONE",dbPath:Vt(p,g.path,g.shared)}))),h.extends)){let g=F.entities[h.extends]||F.relations[h.extends];if(h.allExtends=[h.extends,...g.allExtends||[]],h.idFields=g.idFields?(h.idFields||[]).concat(g.idFields):h.idFields,h.dataFields=g.dataFields?(h.dataFields||[]).concat(g.dataFields.map(R=>{let t=h.extends,o=f.entities[t]||f.relations[t];for(;!o.dataFields?.find(u=>u.path===R.path);)t="extends"in o?o.extends:void 0,o=f.entities[t]||f.relations[t];return {...R,dbPath:Vt(t,R.path,R.shared)}})):h.dataFields,h.linkFields=g.linkFields?(h.linkFields||[]).concat(g.linkFields):h.linkFields,"roles"in g){let R=h,t=g;R.roles=R.roles||{},R.roles={...R.roles,...t.roles},Object.keys(R.roles).length===0&&(R.roles={});}}},{traversalType:"breadth-first"}));return traverse(f,({key:F,value:p,meta:h})=>{if(F==="linkFields"){let g=(()=>{if(!h.nodePath)throw new Error("No path");let[t,o]=h.nodePath.split(".");return {thing:o,thingType:t==="entities"?"entity":t==="relations"?"relation":""}})(),R=Array.isArray(p)?p.map(t=>({...t,...g})):[{...p,...g}];e.push(...R);}}),produce(s,F=>traverse(F,({value:p,key:h,meta:w})=>{if(w.depth===2&&p.idFields&&!p.id){p.name=h;let g=()=>{if(w.nodePath?.split(".")[0]==="entities")return "entity";if(w.nodePath?.split(".")[0]==="relations")return "relation";throw new Error("Unsupported node attributes")};p.thingType=g(),p.computedFields=[],p.virtualFields=[],p.requiredFields=[],p.enumFields=[],p.fnValidatedFields=[],"roles"in p&&Object.entries(p.roles).forEach(([t,o])=>{o.playedBy=e.filter(u=>u.relation===h&&u.plays===t)||[],o.name=t;}),"linkFields"in p&&p.linkFields&&p.linkFields?.forEach(t=>{if(t.target==="relation"){t.oppositeLinkFieldsPlayedBy=[{plays:t.path,thing:t.relation,thingType:"relation"}];return}let o=e.filter(n=>n.relation===t.relation&&n.plays!==t.plays)||[];t.oppositeLinkFieldsPlayedBy=o;let{filter:u}=t;t.oppositeLinkFieldsPlayedBy=t.oppositeLinkFieldsPlayedBy.filter(n=>n.target==="role"),u&&Array.isArray(u)&&(t.oppositeLinkFieldsPlayedBy=t.oppositeLinkFieldsPlayedBy.filter(n=>u.some(d=>n.thing===d.$role)),t.oppositeLinkFieldsPlayedBy=t.oppositeLinkFieldsPlayedBy.filter(n=>u.some(d=>n.thing===d.$thing))),u&&!Array.isArray(u)&&(t.oppositeLinkFieldsPlayedBy=t.oppositeLinkFieldsPlayedBy.filter(n=>n.$role===u.$role),t.oppositeLinkFieldsPlayedBy=t.oppositeLinkFieldsPlayedBy.filter(n=>n.thing===u.$thing));});}if(typeof p=="object"&&"playedBy"in p){if([...new Set(p.playedBy?.map(g=>g.thing))].length>1)throw new Error(`Unsupported: roleFields can be only played by one thing. Role: ${h} path:${w.nodePath}`);if(p.playedBy.length===0)throw new Error(`Unsupported: roleFields should be played at least by one thing. Role: ${h}, path:${w.nodePath}`)}if(w.depth===4){let[g,R]=w.nodePath?.split(".")||[],t=F[g][R];p.validations&&(p.validations.required&&t.requiredFields.push(p.path),p.validations.enum&&t.enumFields.push(p.path),p.validations.fn&&t.fnValidatedFields.push(p.path)),p.default?p.isVirtual?t.virtualFields.push(p.path):t.computedFields.push(p.path):p.isVirtual&&t.virtualFields.push(p.path);}}))},At=(f,e,s)=>{let a=N(f,e),F=a.linkFields?.find(w=>w.path===s);if(F)return F.cardinality;let p=a.dataFields?.find(w=>w.path===s);if(p)return p.cardinality;let h=a.roles[s];if(h)return h.cardinality},N=(f,e)=>{if(e.$thing){if(!e.$thingType)throw new Error("Missing $thingType in node$: {JSON.stringify(node, null, 2)");if(e.$thingType==="entity"){if(!(e.$thing in f.entities))throw new Error(`Missing entity '${e.$thing}' in the schema`);return f.entities[e.$thing]}if(e.$thingType==="relation"){if(!(e.$thing in f.relations))throw new Error(`Missing relation '${e.$thing}' in the schema`);return f.relations[e.$thing]}throw new Error(`Wrong schema or query for ${JSON.stringify(e,null,2)}`)}if(e.$entity){if(!(e.$entity in f.entities))throw new Error(`Missing entity '${e.$entity}' in the schema`);return f.entities[e.$entity]}if(e.$relation){if(!(e.$relation in f.relations))throw new Error(`Missing relation '${e.$relation}' in the schema`);return f.relations[e.$relation]}throw new Error(`Wrong schema or query for ${JSON.stringify(e,null,2)}`)},nt=(f,e)=>{let s=f.dataFields?.map(d=>d.path)||[],a=f.linkFields?.map(d=>d.path)||[],F="roles"in f?listify(f.roles,d=>d):[],p=[...s||[],...a||[],...F||[]],w=[...["$entity","$op","$id","$tempId","$bzId","$relation","$parentKey","$filter","$fields","$excludedFields"],...p];if(!e)return {fields:p,dataFields:s,roleFields:F,linkFields:a};let g=e.$fields?e.$fields.map(d=>{if(typeof d=="string")return d;if("$path"in d&&typeof d.$path=="string")return d.$path;throw new Error(" Wrongly structured query")}):listify(e,d=>d),R=e.$filter?listify(e.$filter,d=>d.toString().startsWith("$")?void 0:d.toString()).filter(d=>d&&s?.includes(d)):[],t=e.$filter?listify(e.$filter,d=>d.toString().startsWith("$")?void 0:d.toString()).filter(d=>d&&[...F||[],...a||[]].includes(d)):[],o=[...g,...R].filter(d=>!w.includes(d)).filter(d=>d),u=e.$filter?ut(e.$filter,(d,i)=>R.includes(d)):{},n=e.$filter?ut(e.$filter,(d,i)=>t.includes(d)):{};return {fields:p,dataFields:s,roleFields:F,linkFields:a,usedFields:g,usedLinkFields:a.filter(d=>g.includes(d)),usedRoleFields:F.filter(d=>g.includes(d)),unidentifiedFields:o,...R.length?{localFilters:u}:{},...t.length?{nestedFilters:n}:{}}};var Ht=f=>{if(typeof f!="string")throw new Error("capitalizeFirstLetter: string is not a string");return f.charAt(0).toUpperCase()+f.slice(1).toLowerCase()},G=(f,e,s)=>{let F=(s.nodePath||"").split("."),p=isArray(e)?F.slice(0,-2).join("."):F.slice(0,-1).join(".");return e?getNodeByPath(f,p):{}},X=f=>Reflect.ownKeys(f).filter(e=>typeof e=="symbol").reduce((e,s)=>(e[s]=f[s],e),{}),Ut=f=>Object.keys(f).filter(e=>!e.startsWith("$")).length,st=f=>isObject(f)&&("$entity"in f||"$relation"in f||"$thing"in f);var Kt=async(f,e)=>{let{bqlRequest:s,config:a,tqlRequest:F}=f,{rawTqlRes:p}=e;if(s){if(!p)throw new Error("TQL query not executed")}else throw new Error("BQL request not parsed");let{query:h}=s;if(!h){if(p.insertions?.length===0&&!F?.deletions){e.bqlRes={};return}let{mutation:w}=s;if(!w)throw new Error("TQL mutation not executed");let R=[...w.things,...w.edges].map(t=>{let o=p.insertions?.find(u=>u.get(`${t.$bzId}`))?.get(`${t.$bzId}`);if(t.$op==="create"||t.$op==="update"||t.$op==="link"){let u=o?.asThing().iid;return a.mutation?.noMetadata?mapEntries(t,(n,d)=>[n.toString().startsWith("$")?Symbol.for(n):n,d]):{$dbId:u,...t,[t.path]:t.$id}}if(t.$op==="delete"||t.$op==="unlink")return t;if(t.$op!=="match")throw new Error(`Unsupported op ${t.$op}`)}).filter(t=>t);e.bqlRes=R;return}};var Je=(f,e)=>produce(f,s=>traverse(s,({value:a})=>{if(Array.isArray(a)||typeof a!="object"||a===null)return;a.$tempId&&(a.$tempId=`_:${a.$tempId}`),a.$fields&&delete a.$fields,a.$filter&&delete a.$filter,a.$show&&delete a.$show,a.$bzId&&delete a.$bzId,e.query?.noMetadata&&(a.$entity||a.$relation)&&(delete a.$entity,delete a.$relation,delete a.$id),Object.getOwnPropertySymbols(a).forEach(p=>{delete a[p];}),a.$excludedFields&&(a.$excludedFields.forEach(p=>{delete a[p];}),delete a.$excludedFields);})),Ze=(f,e)=>{let s={};return e.forEach(a=>{s[a.$bzId]=a.$id;}),f.forEach(a=>{Object.keys(a).forEach(F=>{s[a[F]]&&F!=="$tempId"&&(a[F]=s[a[F]]);});}),f},Ye=(f,e)=>{let s=e.map(F=>F.$bzId),a=!1;return f.forEach(F=>{Object.keys(F).forEach(p=>{s.includes(F[p])&&(a=!0);});}),a},Jt=async(f,e)=>{let{bqlRequest:s,config:a}=f;if(!s)throw new Error("BQL request not parsed");let F=e.bqlRes[0]?e.bqlRes:[e.bqlRes],p=f.bqlRequest?.mutation?.things;if(Ye(F,p)){let g=Ze(F,p);e.bqlRes=g[1]?g:g[0];}let w=Je(e.bqlRes,a);e.bqlRes=w;};var Zt=async f=>{let{bqlRequest:e,schema:s}=f;if(!e)throw new Error("BQL request not parsed");let{mutation:a}=e;if(!a)throw new Error("BQL request is not a mutation");let F=n=>{let d=n.$op,i=`$${n.$bzId}`,c=N(s,n),{idFields:r,defaultDBConnector:b}=c,P=b?.path||n.$entity||n.$relation,l=n.$id,T=r?.[0],A=listify(n,(y,L)=>{if(y.startsWith("$")||y===T||L===void 0||L===null)return "";let O=c.dataFields?.find(j=>j.path===y);if(!O?.path)return "";let D=O.dbPath;if(["TEXT","ID","EMAIL"].includes(O.contentType))return `has ${D} '${L}'`;if(["NUMBER","BOOLEAN"].includes(O.contentType))return `has ${D} ${L}`;if(O.contentType==="DATE"){if(Number.isNaN(L.valueOf()))throw new Error("Invalid format, Nan Date");return L instanceof Date?`has ${D} ${L.toISOString().replace("Z","")}`:`has ${D} ${new Date(L).toISOString().replace("Z","")}`}throw new Error(`Unsupported contentType ${O.contentType}`)}).filter(y=>y),B=`${i}-atts`,M=listify(n,y=>{if(y.startsWith("$")||y===T)return "";let L=c.dataFields?.find(D=>D.path===y);if(!L?.path)return "";let S=L.dbPath;return `{${B} isa ${S};}`}).filter(y=>y),k=n[Symbol.for("isLocalId")],m=isArray(l)?`like '${l.join("|")}'`:`'${l}'`,Q=!k&&l?[`has ${T} ${m}`]:[],$=[...Q,...A].filter(y=>y).join(","),I=()=>{if(d==="delete"||d==="unlink"||d==="match")return `${i} isa ${[P,...Q].filter(y=>y).join(",")};`;if(d==="update"){if(!M.length)throw new Error("update without attributes");return `${i} isa ${[P,...Q].filter(y=>y).join(",")}, has ${B};
33
+ ${M.join(" or ")};`}return ""},E=()=>d==="update"||d==="link"||d==="match"?`${i} isa ${[P,...Q].filter(y=>y).join(",")};`:"";if(st(n))return {op:d,deletionMatch:I(),insertionMatch:E(),insertion:d==="create"?`${i} isa ${[P,$].filter(y=>y).join(",")};`:d==="update"&&A.length?`${i} ${A.join(",")};`:"",deletion:d==="delete"?`${i} isa ${P};`:d==="update"&&M.length?`${i} has ${B};`:""};throw new Error("in attributes")},p=n=>{let d=n.$op,i=N(s,n),c=`$${n.$bzId}`,r=n.$id,b=i.defaultDBConnector?.path||n.$relation,P="roles"in i?listify(i.roles,y=>y):[],l=n.$relation&&"roles"in i&&mapEntries(i.roles,(y,L)=>[y,L.dbConnector?.path||y]),T=listify(n,(y,L)=>{if(!P.includes(y))return null;if(!("roles"in i))throw new Error("This should have roles! ");let O=l[y];return Array.isArray(L)?L.map(S=>({path:O,id:S})):{path:O,id:L}}).filter(y=>y).flat(),A=T.map(y=>{if(!y?.path)throw new Error("Object without path");return `${y.path}: $${y.id}`}),B=T.length>0?`( ${A.join(" , ")} )`:"",M=n[Symbol.for("edgeType")];if(!M)throw new Error("[internal error] Symbol edgeType not defined");let k=B?`${c} ${B} ${M==="linkField"||d==="delete"||d==="unlink"?`isa ${b}`:""}`:"",m=`${c} ${M==="linkField"||d==="delete"?`isa ${b}`:""}`,Q=()=>k?d==="link"?`${k};`:d==="create"?`${k}, has id '${r}';`:"":"",$=()=>k&&d==="match"?`${k};`:"",I=()=>k?d==="delete"?`${k};`:d==="match"?`${k};`:"":"",E=()=>k?d==="delete"?`${m};`:d==="unlink"?`${c} ${B};`:"":"";return {deletionMatch:I(),insertionMatch:$(),deletion:E(),insertion:Q(),op:""}},h=(n,d)=>{let i=d==="edges"?p:F;if(Array.isArray(n))return n.map(T=>{let{preDeletionBatch:A,insertionMatch:B,deletionMatch:M,insertion:k,deletion:m}=i(T);return shake({preDeletionBatch:A,insertionMatch:B,deletionMatch:M,insertion:k,deletion:m},Q=>!Q)}).filter(T=>T);let{preDeletionBatch:c,insertionMatch:r,deletionMatch:b,insertion:P,deletion:l}=i(n);return shake({preDeletionBatch:c,insertionMatch:r,deletionMatch:b,insertion:P,deletion:l},T=>!T)},w=h(a.things),g=Array.isArray(w)?w:[w],R=h(a.edges,"edges"),t=Array.isArray(R)?R:[R],o=[...g,...t],u=shake({insertionMatches:o.map(n=>n.insertionMatch).join(" ").trim(),deletionMatches:o.map(n=>n.deletionMatch).join(" ").trim(),insertions:o.map(n=>n.insertion).join(" ").trim(),deletions:o.map(n=>n.deletion).join(" ").trim()},n=>!n);f.tqlRequest=u;};var ti=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm,ei=/(\s*async\s*|\s*function\s*|\s*\(\s*|\s*\)\s*=>|\s*\)\s*\{)/,Yt=f=>{let s=f.toString().replace(ti,"").trim().split("=>")[0].split("{")[0].replace(ei,"").trim(),a=s.substring(s.indexOf("(")+1,s.lastIndexOf(")")).trim();return a?(a.match(/(\{[^}]*\}|[^,]+)/g)||[]).flatMap(p=>p.includes("{")&&p.includes("}")?(p.replace(/^\{|\}$/g,"").match(/(?:[^,"']+|"[^"]*"|'[^']*')+/g)||[]).map(w=>w.split(":")[0].trim().replace(/['"[\]]/g,"")):p.trim()).filter(Boolean):[]};var tt=({currentThing:f,fieldSchema:e,mandatoryDependencies:s=!1})=>{if(!e||!e.default||!("fn"in e.default||"value"in e.default))throw new Error(`[Internal] Virtual field: No field schema found, or wrongly configured. Field: ${JSON.stringify(e,null,3)}`);if(e.default.type==="value")return e.default.value;if(s){let{fn:F}=e.default,h=Yt(F).filter(w=>!(w in f));if(h.length)throw new Error(`Virtual field: Missing arguments ${h.join(", ")}`)}return "default"in e?e.default?.fn(f):void 0},Gt=()=>{};var ht=Symbol.for("schema"),H=Symbol.for("queryPath");var ri=f=>{if(!f.startsWith("_:"))throw new Error('TempIds must start with "_:"');let e=f.substring(2);if(!/^[a-zA-Z0-9-_]+$/.test(e))throw new Error("$tempId must contain only alphanumeric characters, hyphens, and underscores.");if(f.length>36)throw new Error("$tempId must not be longer than 36 characters.");return e},te=async f=>{let{rawBqlRequest:e,schema:s}=f,F=(o=>produce(o,u=>traverse(u,({value:n,key:d,parent:i})=>{if(isObject(n)&&(n=shake(n,c=>c===void 0)),d==="$tempId"&&(i[d]=ri(n)),i&&isArray(n)){if(!n.some(r=>typeof r=="object"&&"$id"in r))return;let c=n.flatMap(r=>typeof r=="string"?r:typeof r=="object"&&"$id"in r&&isArray(r.$id)?r.$id.map(b=>({...r,$id:b})):r);i[d]=c;}})))(e),h=(o=>produce(o,u=>traverse(u,({value:n,meta:d,key:i})=>{if(isObject(n)){if(n.$arrayOp)throw new Error("Array op not supported yet");if(i==="$filter"||d.nodePath?.includes(".$filter."))return;let c=n;if(c.$op==="create"&&c.$id)throw new Error("Can't write to computed field $id. Try writing to the id field directly.");let r=N(s,c),P=Object.keys(c).filter($=>r.virtualFields?.includes($));if(P.length>0){let $=P.filter(I=>c[I]);if($.length>0)throw new Error(`Can't set virtual fields: ["${$.join('","')}"]`)}let T=d.nodePath?.split(".")?.filter($=>Number.isNaN(parseInt($,10))).join(".");if(!r)throw new Error(`Schema not found for ${c.$entity||c.$relation}`);c.$bzId=c.$tempId??`T_${v4()}`,!T&&!c.$op&&(c.$id||c.$filter?c.$op="update":c.$op="create"),c[ht]=r,c[Symbol.for("dbId")]=r.defaultDBConnector.id;let{usedLinkFields:A,usedRoleFields:B}=nt(r,c),M=A.map($=>({fieldType:"linkField",path:$,schema:r.linkFields.find(I=>I.path===$)})),k=r.thingType==="relation"?B.map($=>({fieldType:"roleField",path:$,schema:ft(r.roles,I=>I===$)})):[];if(M.some($=>$.schema?.target==="role")&&M.some($=>$.schema?.target==="relation"))throw new Error("Unsupported: Can't use a link field with target === 'role' and another with target === 'relation' in the same mutation.");let m=k.filter($=>[...new Set($.schema.playedBy?.map(I=>I.thing))].length!==1);if(m.length>1)throw new Error(`Field: ${m[0].path} - If a role can be played by multiple things, you must specify the thing in the mutation: ${JSON.stringify(m[0].schema.playedBy)}. Schema: ${JSON.stringify(m[0].schema)}`);let Q=d.nodePath;if([...M,...k].forEach($=>{let I=c[$.path];if(I===void 0)return;let E=$.schema;if(!E)throw new Error(`Field ${$.path} not found in schema`);let y=$.fieldType==="roleField"?E?.playedBy[0]:E,O=E&&"relation"in E&&y?.relation===c.$relation?"$self":y?.relation?y?.relation:"$self",S=O==="$self"?r:s.relations[O];if(ft(S.roles,(q,C)=>q===$.path)?.playedBy?.length===0)throw new Error(`unused role: ${Q}.${$.path}`);if(!E)throw new Error(`Field ${$.path} not found in schema`);let j=$.fieldType==="linkField"?E?.oppositeLinkFieldsPlayedBy:E?.playedBy;if(!j)throw new Error(`No opposite fields found for ${JSON.stringify(E)}`);if([...new Set(j?.map(q=>q.thing))].length>1)throw new Error(`Field: ${$.path} - If a role can be played by multiple things, you must specify the thing in the mutation: ${JSON.stringify(j)}. Schema: ${JSON.stringify(E)}`);if(E.cardinality==="ONE"&&Array.isArray(I))throw new Error("Can't have an array in a cardinality === ONE link field");if(E.cardinality==="MANY"&&I!==null&&!Array.isArray(I)&&!I.$arrayOp)throw new Error(`${$.fieldType==="linkField"?E.path:E.name} is a cardinality === MANY thing. Use an array or a $arrayOp object`);if(st(I))return;let[v]=j,U="plays"in E?"linkField":"roleField",J={[`$${v.thingType}`]:v.thing,[Symbol.for("relation")]:O,[Symbol.for("edgeType")]:U,[Symbol.for("role")]:v.plays,[Symbol.for("oppositeRole")]:"plays"in E?E.plays:void 0,[Symbol.for("relFieldSchema")]:E};if(isObject(I)){let q=I;if(!q.$op&&!q.$id&&!q.$filter&&!q.$tempId&&c.$op!=="create")throw new Error(`Please specify if it is a create or an update. Path: ${d.nodePath?`${d.nodePath}.`:""}${$.path}`);c[$.path]={...J,...q,$op:q.$op?q.$op:q.$id||q.$filter?"link":c.$op==="create"?"create":"update"};}if(Array.isArray(I))if(I.every(q=>isObject(q)))c[$.path]=I.map(q=>({...J,...q,$op:q.$op?q.$op:q.$id||q.$filter?Ut(q)?"update":"link":"create"}));else if(I.every(q=>typeof q=="string"))c[$.path]=I.map(q=>({...J,$op:c.$op==="create"?"link":"replace",$id:q}));else throw new Error(`Invalid array value for ${$.path}`);if(typeof I=="string"&&(c[$.path]={...J,$op:c.$op==="create"?"link":"replace",$id:I}),I===null){let q={...J,$op:"unlink"};c[$.path]=E.cardinality==="MANY"?[q]:q;}}),!T&&!c.$entity&&!c.$relation)throw new Error("Root things must specify $entity or $relation")}})))(F),g=(o=>produce(o,u=>traverse(u,({parent:n,key:d,value:i,meta:c})=>{if(isObject(i)){if(Object.keys(i).length===0)throw new Error("Empty object!");if(d==="$filter"||c.nodePath?.includes(".$filter."))return;let r=i,b=c.nodePath?.split(".");if(r.$tempId&&!(r.$op===void 0||r.$op==="link"||r.$op==="create"||r.$op==="update"))throw new Error(`Invalid op ${r.$op} for tempId. TempIds can be created, or when created in another part of the same mutation. In the future maybe we can use them to catch stuff in the DB as well and group them under the same tempId.`);let P=b?.filter(B=>Number.isNaN(parseInt(B,10))).join("."),l=P?Array.isArray(n)?b?.slice(0,-1).join("."):c.nodePath:c.nodePath||"",A=G(o,n,c)?.$op;if(P&&!A)throw new Error("Error: Parent $op not detected");if(r.$op==="replace"&&A==="create"&&(r.$op="link"),n||(r.$parentKey=""),typeof n=="object"&&(Array.isArray(n)&&(r[Symbol.for("index")]=d),r[Symbol.for("path")]=l,r[Symbol.for("isRoot")]=!P,r[Symbol.for("depth")]=P?.split(".").length),!r.$entity&&!r.$relation)throw new Error(`Node ${JSON.stringify(r)} without $entity/$relation`)}})))(h),t=(o=>produce(o,u=>traverse(u,({value:n})=>{if(isObject(n)){let d=n,i=N(s,d),{unidentifiedFields:c}=nt(i,d),{idFields:r}=i;if(!r)throw new Error("No idFields found");let[b]=r;if(d.$op==="create"&&!d[b]){let P=i.dataFields?.find(T=>T.path===b),l=tt({currentThing:d,fieldSchema:P,mandatoryDependencies:!0});if(typeof l!="string")throw new Error(`Default id field ${b} is not a string`);d[b]=l,d.$id=l;}if(c.length>0)throw new Error(`Unknown fields: [${c.join(",")}] in ${JSON.stringify(d)}`)}})))(g);f.filledBqlRequest=t;};var ee=f=>{let e=({value:s})=>(s&&typeof s=="object"&&"$id"in s&&(Object.keys(s).filter(p=>p.startsWith("$")).forEach(p=>delete s[p]),Object.keys(s).filter(p=>typeof p=="symbol").forEach(p=>delete s[p])),s);return produce(f,s=>traverse(s,e))};var oe=async f=>{let{filledBqlRequest:e,schema:s}=f,a=t=>{let o=[],u=[],n=r=>{if(r.$id)return r.$id;let b=N(s,r),{idFields:P}=b;if(!P)throw new Error(`no idFields: ${JSON.stringify(r)}`);let[l]=P;if(!l)throw new Error(`no idField: ${JSON.stringify(r)}`);let T=b.dataFields?.find(M=>M.path===l),A=tt({currentThing:r,fieldSchema:T,mandatoryDependencies:!0}),B=r[l]||r.$id||A;if(!B)throw new Error(`no idValue: ${JSON.stringify(r)}`);return B},d=r=>{if(r.$op==="create"){let b=n(r);if(o.find(P=>P.$id===b))throw new Error(`Duplicate id ${b} for node ${JSON.stringify(r)}`);if(u.find(P=>P.$bzId===r.$bzId))throw new Error(`Duplicate $bzid ${r.$bzId} for node ${JSON.stringify(r)}`);o.push({...r,$id:b});return}r.$tempId&&r.$op==="match"||o.push(r);},i=r=>{if(r.$op==="create"){let b=n(r);if(o.find(P=>P.$id===b),u.find(P=>P.$bzId===r.$bzId))throw new Error(`Duplicate %bzId ${r.$bzIdd} for edge ${JSON.stringify(r)}`);u.push({...r,$id:b});return}u.push(r);};return traverse(t,({value:r,meta:b,parent:P})=>{if(!isObject(r))return;let l=r;if(l.$entity||l.$relation){if(!l.$op)throw new Error(`Operation should be defined at this step ${JSON.stringify(l)}`);if(!l.$bzId)throw new Error("[internal error] BzId not found");let T=N(s,l),{dataFields:A,roleFields:B,linkFields:M,usedFields:k}=nt(T,l),m=()=>{if(l.$op==="create"||l.$op==="delete")return l.$op;if(l.$op==="update"){let $=k.filter(y=>A?.includes(y)),I=k.filter(y=>B?.includes(y)),E=k.filter(y=>M?.includes(y));if($.length>0)return "update";if(I.length>0||E.length>0)return "match";throw new Error(`No fields on an $op:"update" for node ${JSON.stringify(l)}`)}return "match"},Q={...l.$entity&&{$entity:l.$entity},...l.$relation&&{$relation:l.$relation},...l.$id&&{$id:l.$id},...l.$tempId&&{$tempId:l.$tempId},...l.$filter&&{$filter:l.$filter},...shake(pick(l,A||[""])),$op:m(),$bzId:l.$tempId?l.$tempId:l.$bzId,[Symbol.for("dbId")]:T.defaultDBConnector.id,[Symbol.for("path")]:l[Symbol.for("path")],[Symbol.for("isRoot")]:l[Symbol.for("isRoot")],[Symbol.for("isLocalId")]:l[Symbol.for("isLocalId")]||!1};if(d(Q),l[Symbol.for("relation")]&&l[Symbol.for("edgeType")]==="linkField"){if((l.$op==="link"||l.$op==="unlink")&&(l.$id||l.$filter)){if(l.$tempId)throw new Error("can't specify a existing and a new element at once. Use an id/filter or a tempId");o.push({...l,$op:"match"});}let $=l[Symbol.for("relation")]===l.$relation,I=$?l.$bzId:`LT_${v4()}`,y=G(t,P,b).$bzId;if(!y)throw new Error("No parent id found");if(l[Symbol.for("relation")]==="$self")return;let L=()=>{if(l.$op==="delete")return $?"match":"delete";if(l.$op==="unlink")return $?"unlink":"delete";if(l.$op==="link"||l.$op==="create")return $?"link":"create";if(l.$op==="replace")throw new Error("Unsupported: Nested replaces not implemented yet");return "match"},O={$relation:l[Symbol.for("relation")],$bzId:I,...l.$tempId?{$tempId:l.$tempId}:{},$op:L(),...$?{}:{[l[Symbol.for("role")]]:l.$bzId},[l[Symbol.for("oppositeRole")]]:y,[Symbol.for("dbId")]:s.relations[l[Symbol.for("relation")]].defaultDBConnector.id,[Symbol.for("edgeType")]:"linkField",[Symbol.for("info")]:"normal linkField",[Symbol.for("path")]:l[Symbol.for("path")]};i(O),(l.$op==="unlink"||L()==="unlink")&&$&&i({$relation:l[Symbol.for("relation")],$bzId:I,$op:"match",[l[Symbol.for("oppositeRole")]]:y,[Symbol.for("dbId")]:s.relations[l[Symbol.for("relation")]].defaultDBConnector.id,[Symbol.for("edgeType")]:"linkField",[Symbol.for("info")]:"additional ownrelation unlink linkField",[Symbol.for("path")]:l[Symbol.for("path")]});}if(l.$relation){let $=ut(l,(y,L)=>B.includes(y)),I=mapEntries($,(y,L)=>isArray(L)?[y,L]:isObject(L)?[y,L.$bzId]:[y,L]),E=ut(r,(y,L)=>y.startsWith("$")||y.startsWith("Symbol"));if(Object.keys($).filter(y=>!y.startsWith("$")).length>0){if(l.$op==="create"||l.$op==="delete"){let y=()=>{if(l.$op==="create")return "link";if(l.$op==="delete")return "match";throw new Error("Unsupported parent of edge op")},L=mapEntries(I,(S,D)=>Array.isArray(D)?[S,D.map(j=>j.$bzId||j)]:[S,D.$bzId||D]),O={...E,$relation:l.$relation,$op:y(),...L,$bzId:l.$bzId,[Symbol.for("path")]:l[Symbol.for("path")],[Symbol.for("dbId")]:T.defaultDBConnector.id,[Symbol.for("info")]:"coming from created or deleted relation",[Symbol.for("edgeType")]:"roleField on C/D"};i(O);return}if(l.$op==="match"||l.$op==="update"&&Object.keys($).length>0){let y=0;Object.entries($).forEach(([L,O])=>{let S=isArray(O)?O:[O],D=j=>j==="create"||j==="replace"?"link":j;S.forEach(j=>{if(!j)return;let v=D(j.$op);if(v==="replace")throw new Error("Not supported yet: replace on roleFields");if(v==="unlink"&&y>0)throw y+=1,new Error("Not supported yet: Cannot unlink more than one role at a time, please split into two mutations");let U={...E,$relation:l.$relation,$op:v==="delete"?"unlink":v,[L]:j.$bzId,$bzId:l.$bzId,[Symbol.for("dbId")]:T.defaultDBConnector.id,[Symbol.for("path")]:l[Symbol.for("path")],[Symbol.for("info")]:"updating roleFields",[Symbol.for("edgeType")]:"roleField on L/U/R"};i(U);});});}}}}}),[o,u]};if(!e)throw new Error("Undefined filledBqlRequest");let [F,p]=a(e),h=F.reduce((t,o)=>{if(!o.$bzId)return [...t,o];let u=t.findIndex(n=>n.$bzId===o.$bzId);if(u===-1)return [...t,o];if(t[u].$op==="create"&&o.$op==="match")return t;if(t[u].$op==="match"&&(o.$op==="create"||o.$op==="match"))return [...t.slice(0,u),o,...t.slice(u+1)];throw new Error(`Unsupported operation combination for $tempId "${o.$tempId}". Existing: ${t[u].$op}. Current: ${o.$op}`)},[]),w=p.reduce((t,o)=>{let u=t.find(n=>(n.$id&&n.$id===o.$id||n.$bzId&&n.$bzId===o.$bzId)&&n.$relation===o.$relation&&n.$op===o.$op);if(u){let n={...u};return Object.keys(o).forEach(i=>{if(typeof i=="symbol"||i.startsWith("$"))return;let c=u[i],r=o[i];Array.isArray(c)&&Array.isArray(r)?n[i]=Array.from(new Set([...c,...r])):!Array.isArray(c)&&Array.isArray(r)?c!==void 0?n[i]=Array.from(new Set([c,...r])):n[i]=r:Array.isArray(c)&&!Array.isArray(r)?r!==void 0&&(n[i]=Array.from(new Set([...c,r]))):c!==null&&r!==null&&c!==void 0&&r!==void 0?n[i]=Array.from(new Set([c,r])):c==null&&(n[i]=r);}),[...t.filter(i=>!((i.$id&&i.$id===o.$id||i.$bzId&&i.$bzId===o.$bzId)&&i.$relation===o.$relation&&i.$op===o.$op)),n]}return [...t,o]},[]);[...new Set(w.map(t=>t.$relation))];h.forEach(t=>{if("$relation"in t&&w.filter(o=>o.$bzId===t.$bzId||o.$tempId&&o.$tempId===t.$tempId).length===0){if(t.$op==="delete"||t.$op==="match"||t.$op==="update")return;throw new Error(`[Borm] Can't create a relation without any player. Node: ${JSON.stringify(ee(t))}`)}}),f.bqlRequest={mutation:{things:h,edges:w}};};var $t=async(f,e)=>{let s=e.dbConnectors[0].id,a=f.typeDB.get(s)?.session,F=f.typeDB.get(s)?.client;if(!a||!a.isOpen()){if(!F)throw new Error("Client not found");a=await F.session(e.dbConnectors[0].dbName,SessionType.DATA),f.typeDB.set(s,{client:F,session:a});}return {client:F,session:a}};var se=async(f,e)=>{let{dbHandles:s,tqlRequest:a,bqlRequest:F,config:p}=f;if(!a)throw new Error("TQL request not built");if(!(a.deletions&&a.deletionMatches||a.insertions))throw new Error("TQL request error, no things");if(!F?.mutation)throw new Error("BQL mutation not parsed");let{session:h}=await $t(s,p),w=await h.transaction(TransactionType.WRITE);if(!w)throw new Error("Can't create transaction");let g=a.deletionMatches&&a.deletions&&`match ${a.deletionMatches} delete ${a.deletions}`,R=a.insertions&&`${a.insertionMatches?`match ${a.insertionMatches}`:""} insert ${a.insertions}`;g&&await w.query.delete(g);let t=R&&w.query.insert(R);try{let o=t?await t.collect():void 0;await w.commit(),await w.close(),e.rawTqlRes={insertions:o};}catch(o){throw await w.close(),new Error(`Transaction failed: ${o.message}`)}};var W="___",ae=async f=>{let{enrichedBqlQuery:e}=f;if(!e)throw new Error("BQL query not enriched");let s="",a=(t,o)=>{let u="",n="";for(let d in t){let i=t[d];if(Array.isArray(i))for(let c=0;c<i.length;c++)n+=`{$${o} has ${d} "${i[c]}";}`,c<i.length-1?n+="or":n+=";";else u+=`, has ${d} "${i}"`;}u+=`;
34
+ `,s+=u,s+=n;},F=(t,o)=>{let u=[],n=[],d="";for(let r=0;r<t.length;r++)t[r].$isVirtual||u.push(` ${t[r].$dbPath}`),n.push(`{${t[r].$dbPath}:${t[r].$as}}`);let i=`${u.join(",")};
35
+ `;d=n.join(",");let c=`$metadata:{as:[${d}]}`;s+=`$${o} as "${o}.${c}.$dataFields": `,s+=i;},p=(t,o,u)=>{for(let n of t){let{$fields:d,$as:i,$justId:c,$idNotIncluded:r,$filterByUnique:b}=n,P=n[H],l=`$metadata:{as:${i},justId:${c?"T":"F"},idNotIncluded:${r},filterByUnique:${b}}`;if(s+=`"${u}.${l}.${n.$var}":{
36
+ `,s+=` match
37
+ `,n.$filter&&(s+=` $${o}${W}${n.$var} isa ${n.$thing}`,a(n.$filter,`${o}${W}${n.$var}`)),s+=` $${o} (${n.$var}: $${o}${W}${n.$var}) isa ${n.$intermediary};
38
+ `,d){let T=`M_${v4()}`;s+=`?queryPath${T} = "${P}";
39
+ `,s+=` fetch
40
+ `,s+=`?queryPath${T} as "queryPath"
41
+ ;`;let A=d?.filter(k=>k.$fieldType==="data");A&&A.length>0&&F(A,`${o}${W}${n.$var}`,`${o}.${n.$var}`);let B=d?.filter(k=>k.$fieldType==="link");B&&B.length>0&&h(B,`${o}${W}${n.$var}`,`${o}.${n.$var}`);let M=d?.filter(k=>k.$fieldType==="role");M&&M.length>0&&p(M,`${o}${W}${n.$var}`,`${o}.${n.$var}`);}s+=`};
42
+ `;}},h=(t,o,u)=>{for(let n of t){let{$fields:d,$as:i,$justId:c,$idNotIncluded:r,$filterByUnique:b,$playedBy:P}=n,l=n[H],T=`$metadata:{as:${i},justId:${c?"T":"F"},idNotIncluded:${r},filterByUnique:${b}}`;if(s+=`"${u}.${T}.${n.$var}":{
43
+ `,s+=` match
44
+ `,n.$filter&&(s+=` $${o}${W}${n.$var} isa ${n.$thing}`,a(n.$filter,`${o}${W}${n.$var}`)),n.$target==="role"?s+=` $${o}_intermediary (${n.$plays}: $${o}, ${P.plays}: $${o}${W}${n.$var}) isa ${n.$intermediary};
45
+ `:s+=` $${o}${W}${n.$var} (${n.$plays}: $${o}) isa ${n.$thing};
46
+ `,d){let A=`M_${v4()}`;s+=`?queryPath${A} = "${l}";
47
+ `,s+=` fetch
48
+ `,s+=`?queryPath${A} as "queryPath"
49
+ ;`;let B=d?.filter(m=>m.$fieldType==="data");B&&B.length>0&&F(B,`${o}${W}${n.$var}`);let M=d?.filter(m=>m.$fieldType==="link");M&&M.length>0&&h(M,`${o}${W}${n.$var}`,`${o}.${n.$var}`);let k=d?.filter(m=>m.$fieldType==="role");k&&k.length>0&&p(k,`${o}${W}${n.$var}`,`${o}.${n.$var}`);}s+=`};
50
+ `;}},w=e.length>1,g=[];(t=>{if(w)for(let o of t){let{$path:u,$thing:n,$filter:d,$fields:i}=o;if(!u)throw new Error("Path is not defined");let c=o[H];s+=`match
51
+ $${u} isa ${n} `,d?a(d,u):s+="; ";let r=`M_${v4()}`;if(s+=`?queryPath${r} = "${c}";
52
+ `,s+=`fetch
53
+ `,s+=`?queryPath${r} as "queryPath"
54
+ ;`,i){let b=i.filter(T=>T.$fieldType==="data");b&&b.length>0&&F(b,u);let P=i.filter(T=>T.$fieldType==="link");P&&P.length>0&&h(P,u,u);let l=i.filter(T=>T.$fieldType==="role");l&&l.length>0&&p(l,u,u);}g.push(s),s="";}else for(let o of t){let{$path:u,$thing:n,$filter:d,$fields:i}=o;if(!u||u==="undefined")throw new Error("Path is not defined");let c=o[H];if(s+=`match
55
+ $${u} isa ${n} `,d?a(d,u):s+="; ",s+=`?queryPath = "${c}";
56
+ `,s+=`fetch
57
+ `,s+=`?queryPath as "queryPath"
58
+ ;`,i){let r=i.filter(l=>l.$fieldType==="data");r&&r.length>0&&F(r,u);let b=i.filter(l=>l.$fieldType==="link");b&&b.length>0&&h(b,u,u);let P=i.filter(l=>l.$fieldType==="role");P&&P.length>0&&p(P,u,u);}}})(e),f.tqlRequest=w?g:s;};var qt=f=>{let e=f.dataFields?.map(p=>p.path)||[],s=f.linkFields?.map(p=>p.path)||[],a=Object.keys(f.roles||{})||[];return [...e,...s,...a]},Ct=(f,e)=>Object.keys(f||{}).some(a=>{if(!Array.isArray(f[a])){let F=e.idFields?.includes(a),p=e.dataFields?.some(h=>(h.dbPath===a||h.path===a)&&h?.validations?.unique);return F||p}return !1}),jt=(f,e)=>{let s=e.dataFields?.map(h=>({path:h.path,dbPath:h.dbPath}))||[],a=e.linkFields?.map(h=>({path:h.path,dbPath:h.dbPath}))||[],F=Object.keys(e.roles||{}).map(h=>({path:h,dbPath:h}))||[],p=[...s,...a,...F];return Object.entries(f||{}).reduce((h,[w,g])=>{let R=p.find(t=>t.path===w);return h[R?.dbPath||w]=g,h},{})},de=async f=>{let{rawBqlRequest:e,schema:s}=f;if(Array.isArray(e)){for(let t of e)if(!("$entity"in t)&&!("$relation"in t)&&(!("$thing"in t)||!("$thingType"in t)))throw new Error("No entity specified in query")}else if(!("$entity"in e)&&!("$relation"in e)&&(!("$thing"in e)||!("$thingType"in e)))throw new Error("No entity specified in query");let a=(t,o)=>typeof o=="string"?t.idFields?.includes(o):t.idFields?.includes(o.$path),F=(t,o,u,n,d)=>({$path:o,$dbPath:n,$thingType:"attribute",$as:t.$as||o,$var:o,$fieldType:"data",$excludedFields:t.$excludedFields,$justId:u,$id:t.$id,$filter:t.$filter,$isVirtual:d,$filterProcessed:!0}),p=(t,o,u,n,d)=>{let{target:i,oppositeLinkFieldsPlayedBy:c}=u;return c.map(r=>{let b=i==="role"?r.thingType:"relation",P=i==="role"?r.thing:u.relation,l={[`$${b}`]:P},T=N(s,l),A=t?.$fields?.filter(M=>a(T,M)).length===0,B=[];return typeof t!="string"?t.$fields?A?B=[...t.$fields,...T.idFields]:B=t.$fields:B=qt(T):B=["id"],t.$excludedFields&&(B=B.filter(M=>a(T,M)?!0:!t.$excludedFields.includes(M.$path))),{$thingType:b,$plays:u.plays,$playedBy:r,$path:r.path,$dbPath:d,$as:t.$as||o,$var:o,$thing:P,$fields:B,$excludedFields:t.$excludedFields,$fieldType:"link",$target:i,$intermediary:r.relation,$justId:n,$id:t.$id,$filter:jt(t.$filter,T),$idNotIncluded:A,$filterByUnique:Ct(t.$filter,T),$filterProcessed:!0}})},h=(t,o,u,n,d)=>u.playedBy.map(i=>{let{thing:c,thingType:r,relation:b}=i,P={[`$${r}`]:c},l=N(s,P),T=t?.$fields?.filter(B=>l?.idFields?.includes(B)||l?.idFields?.includes(B.$path)).length===0,A=[];return typeof t!="string"?t.$fields?T?A=[...t.$fields,...l.idFields]:A=t.$fields:A=qt(l):A=["id"],t.$excludedFields&&(A=A.filter(B=>a(l,B)?!0:!t.$excludedFields.includes(B.$path))),{$thingType:r,$path:o,$dbPath:d,$as:t.$as||o,$var:o,$thing:c,$fields:A,$excludedFields:t.$excludedFields,$fieldType:"role",$intermediary:b,$justId:n,$id:t.$id,$filter:jt(t.$filter,l),$idNotIncluded:T,$filterByUnique:Ct(t.$filter,l),$playedBy:i,$filterProcessed:!0}}),w=(t,o)=>{let u=typeof t=="string"?t:t.$path,n=typeof t=="string",d=o.dataFields?.find(r=>r.path===u),i=o.linkFields?.find(r=>r.path===u),c=o.roles?.[u];if(d){let r=d.isVirtual&&d.default;return F(t,u,n,d.dbPath,r)}else {if(i)return p(t,u,i,n,i.dbPath);if(c)return h(t,u,c,n,c.dbPath)}return null},R=(t=>produce(t,o=>traverse(o,u=>{let{value:n,meta:d}=u,i=n;if(isObject(i)){if(i.$id){let c=i.$entity||i.$relation?i:{[`$${i.$thingType}`]:i.$thing},r=N(s,c);if(!r?.name)throw new Error(`Schema not found for ${i.$thing}`);if(i.$path=r.name,Array.isArray(i.$id)||(i.$filterByUnique=!0),r?.idFields?.length===1){let[b]=r.idFields;i.$filter={...i.$filter,[b]:i.$id},delete i.$id;}else throw new Error("Multiple ids not yet enabled / composite ids")}else if("$entity"in i||"$relation"in i||"$thing"in i){let c=N(s,i);if(!c?.name)throw new Error(`Schema not found for ${i.$thing}`);i.$path=c.name;}if(i.$entity?(i.$thing=i.$entity,i.$thingType="entity",delete i.$entity):i.$relation&&(i.$thing=i.$relation,i.$thingType="relation",delete i.$relation),isObject(i)&&"$thing"in i){let c=i.$entity||i.$relation?i:{[`$${i.$thingType}`]:i.$thing};i[H]=d.nodePath;let r=N(s,c);if(i.$filter&&(i.$filterByUnique=Ct(i.$filter,r),i.$filterProcessed||(i.$filter=jt(i.$filter,r))),i.$fields){i.$fields.filter(l=>r?.idFields?.includes(l)||r?.idFields?.includes(l.$path)).length>0||(i.$fields=[...i.$fields,...Array.isArray(r.idFields)?r.idFields:[]],i.$idNotIncluded=!0);let P=i.$fields?.flatMap(l=>{let T=w(l,r);return Array.isArray(T)?T:[T]}).filter(Boolean);i.$fields=P;}else {let P=qt(r)?.flatMap(l=>{let T=w(l,r);return Array.isArray(T)?T:[T]}).filter(Boolean);i.$fields=P;}i.$excludedFields&&(i.$fields=i.$fields.filter(b=>a(r,b)?!0:!i.$excludedFields.includes(b.$path)));}}})))(Array.isArray(e)?e:[e]);f.enrichedBqlQuery=R;};var pe=async(f,e)=>{let{dbHandles:s,enrichedBqlQuery:a,tqlRequest:F,config:p}=f;if(!a)throw new Error("BQL request not parsed");if(!F)throw new Error("TQL request not built");let h=new TypeDBOptions;if(h.infer=!0,Array.isArray(F)){let g=await parallel(F.length,F,async R=>{let{session:t}=await $t(s,p),o=await t.transaction(TransactionType.READ,h);if(!o)throw new Error("Can't create transaction");let n=await o.query.fetch(R).collect();return await o.close(),n});e.rawTqlRes=g,e.isBatched=!0;}else {let{session:g}=await $t(s,p),R=await g.transaction(TransactionType.READ,h);if(!R)throw new Error("Can't create transaction");let o=await R.query.fetch(F).collect();await R.close(),e.rawTqlRes=o;}};var ue=f=>{let e=/as:([a-zA-Z0-9_\-·]+)/,s=/justId:([a-zA-Z0-9_\-·]+)/,a=/idNotIncluded:([a-zA-Z0-9_\-·]+)/,F=/filterByUnique:([a-zA-Z0-9_\-·]+)/,p=f.match(e),h=f.match(s),w=f.match(a),g=f.match(F);return {as:p?p[1]:null,justId:h?h[1]:null,idNotIncluded:w?w[1]:null,filterByUnique:g?g[1]:null}},gi=f=>{try{let s=(F=>{let p=F.replace("$metadata:","");return p=p.replace(/([a-zA-Z0-9_\-·]+)(?=:)/g,'"$1"'),p=p.replace(/:(\s*)([a-zA-Z0-9_\-·]+)/g,(h,w,g)=>/^{.*}$/.test(g)?`:${g}`:`:${w}"${g}"`),p=p.replace(/\[([^\]]+)\]/g,(h,w)=>`[${w.split(",").map(g=>g.trim().startsWith("{")&&g.trim().endsWith("}")?g.trim():`"${g.trim()}"`).join(",")}]`),p})(f);return JSON.parse(s)}catch(e){return console.error(e),{as:[]}}},fe=async(f,e)=>{let{enrichedBqlQuery:s,rawBqlRequest:a,schema:F,config:p}=f,{rawTqlRes:h,isBatched:w}=e;if(s){if(!h)throw new Error("TQL query not executed")}else throw new Error("BQL request not enriched");let g=(i,c)=>{let{$metaData:r}=i,{as:b}=gi(r),P=Object.entries(i).filter(([l])=>l!=="type"&&!l.includes("$")).map(([l,T])=>{let A=c.dataFields?.find(m=>m.path===l||m.dbPath===l),B=l==="id",M=Array.isArray(b)?b.find(m=>m[l])?.[l]:l,k;if(A?.cardinality==="ONE"){if(k=T[0]?T[0].value:p.query?.returnNulls?null:void 0,A.contentType==="DATE"&&(k=k&&`${k}Z`),B)return [[M,k],["$id",k]].filter(([m,Q])=>Q!==void 0)}else if(A?.cardinality==="MANY"){if(!isArray(T))throw new Error("Typedb fetch has changed its format");if(T.length===0)return p.query?.returnNulls?[[M,null]]:[];A.contentType==="DATE"?k=T.map(m=>`${m.value}Z`):k=T.map(m=>m.value);}return [[M,k]].filter(([m,Q])=>Q!==void 0)}).flat();return Object.fromEntries([...P])},R=i=>i.reduce((c,r)=>{let{$roleFields:b,$metaData:P,$cardinality:l}=r,{as:T,justId:A,idNotIncluded:B,filterByUnique:M}=ue(P),k=b.map(m=>{let{dataFields:Q,currentSchema:$,linkFields:I,roleFields:E,schemaValue:y}=o(m),L=g(Q,$);if(A==="T")return L.id;{let O=t(I),S=R(E),D={...L};return B==="true"&&$?.idFields?.forEach(j=>delete D[j]),{...D,...O,...S,...y}}});return k.length>0?c[T]=l==="MANY"&&M==="false"?k:k[0]:p.query?.returnNulls&&(c[T]=null),c},{}),t=i=>i.reduce((c,r)=>{let{$linkFields:b,$metaData:P,$cardinality:l}=r,{as:T,justId:A,idNotIncluded:B,filterByUnique:M}=ue(P),k=b.map(m=>{let{dataFields:Q,currentSchema:$,linkFields:I,roleFields:E,schemaValue:y}=o(m),L=g(Q,$);if(A==="T")return L.id;{let O=t(I),S=R(E),D={...L};return B==="true"&&$.idFields?.forEach(j=>delete D[j]),{...D,...O,...S,...y}}});return c[T]=k.length>0?l==="MANY"&&M==="false"?k:k[0]:p.query?.returnNulls?null:void 0,c},{}),o=i=>{let c=Object.keys(i),r=c.find(m=>m.endsWith(".$dataFields"));if(!r)throw new Error("No datafields");let b=i[r],P=r.split(".")[r.split(".").length-2];if(b.$metaData=P,b.length===0)throw new Error("No datafields");let l=b.type,T={$thing:l.label,$thingType:l.root,[H]:i.queryPath.value},A={[`$${T.$thingType}`]:T.$thing},B=N(F,A),M=c.filter(m=>!m.endsWith(".$dataFields")&&B.linkFields?.some(Q=>Q.path===m.split(".").pop())).map(m=>({$linkFields:i[m],$key:m.split(".").pop(),$metaData:m.split(".")[m.split(".").length-2],$cardinality:B?.linkFields?.find(Q=>Q.path===m.split(".").pop())?.cardinality})),k=c.filter(m=>!m.endsWith(".$dataFields")&&B.roles?.[m.split(".").pop()]).map(m=>({$roleFields:i[m],$key:m.split(".").pop(),$metaData:m.split(".")[m.split(".").length-2],$cardinality:B.roles[m.split(".").pop()].cardinality}));return {dataFields:b,schemaValue:T,currentSchema:B,linkFields:M,roleFields:k}},u=i=>i.map(c=>{let{dataFields:r,currentSchema:b,linkFields:P,roleFields:l,schemaValue:T}=o(c),A=g(r,b),B=t(P),M=R(l),k=a?.$fields?.every(Q=>!b?.idFields?.includes(Q)&&!b?.idFields?.includes(Q.$path));return {...B,...M,...T,...!p.query?.noMetadata&&a.$id?{$id:Array.isArray(a.$id)?A.id:a.$id}:{},...k?Object.fromEntries(Object.entries(A).filter(([Q])=>!b?.idFields?.includes(Q))):A}}),d=(i=>{let c=r=>{let b=u(r);return a.$id&&!Array.isArray(a.$id)||s[0].$filterByUnique?b[0]??null:b.length===0?null:b};return w?i.map(c):c(i)})(h);e.bqlRes=d;};var Bi=Symbol.for("grandChildOfCreate"),he=async f=>{let{filledBqlRequest:e,config:s,schema:a}=f,F=(B,M)=>Object.keys(B).filter(k=>k.startsWith("$")?!1:M?!N(a,B).dataFields?.find(Q=>Q.path===k):!0);if(!e)throw new Error("[BQLE-M-PQ-1] No filledBqlRequest found");if(s.mutation?.preQuery===!1)return;let p=[];if(traverse(e,({parent:B,key:M,value:k})=>{B&&M&&!M.includes("$")&&isObject(B)?(Array.isArray(B[M])?B[M]:[B[M]]).forEach(Q=>{if(isObject(Q)){if(B.$op!=="create")p.includes(Q.$op)||p.push(Q.$op);else if(Q.$op==="delete"||Q.$op==="unlink")throw new Error(`Cannot ${Q.$op} under a create`)}}):!B&&isObject(k)&&(p.includes(k.$op)||p.push(k.$op));}),!p.includes("delete")&&!p.includes("unlink")&&!p.includes("replace")&&!p.includes("update")&&!p.includes("link"))return;let w=(B=>{let M=(k,m)=>{let Q=[],$={},I=["$op","$bzId","$parentKey"],E=["$relation","$entity","$id",...I];for(let y in k)if(!I.includes(y)&&!(E.includes(y)&&!m))if(!y.includes("$")&&(isObject(k[y])||Array.isArray(k[y]))){let L=k[y];Array.isArray(L)&&L.length>0?L.forEach(O=>{Q.push({$path:y,...M(O)});}):Q.push({$path:y,...M(L)});}else $[y]=k[y];return {...$,$fields:Q}};return B.map(k=>M(k,!0))})(Array.isArray(e)?e:[e]),g=await Et(w,f.config,f.schema,f.dbHandles),R=(B,M)=>{let k=B.$id||B.id||B.$bzId;if(B.$objectPath){let{$objectPath:m}=B,Q=m?.beforePath||"root",$=Array.isArray(m.ids)?`[${m.ids}]`:m.ids;return {beforePath:`${Q}.${$}___${m.key}`,ids:k,key:M}}else return {beforePath:"root",ids:k,key:M}},t=(B,M)=>{let k=B?.beforePath||"root",m=M||(Array.isArray(B?.ids)?`[${B?.ids}]`:B?.ids);return `${k}.${m}___${B?.key}`},o=B=>{if(B.includes("[")&&B.includes("]")){let[M,k,m]=B.split(/[[\]]/);return k.split(",").map($=>`${M}${$}${m}`)}else return [B]},u={};(B=>produce(B,M=>traverse(M,k=>{let{key:m,parent:Q}=k;if(Q&&m&&Q.$id&&!m.includes("$")){let $=R(Q,m),I=t($);if(Array.isArray(Q[m])){let E=[];Q[m].forEach(y=>{isObject(y)?(y.$objectPath=$,E.push(y.$id.toString())):y&&E.push(y.toString());}),u[I]={$objectPath:$,$ids:E};}else {let E=Q[m];isObject(E)?(u[I]={$objectPath:$,$ids:[E.$id.toString()]},E.$objectPath=$):E&&(u[I]={$objectPath:$,$ids:[E.toString()]});}}})))(g||{});let d=B=>produce(B,M=>traverse(M,k=>{let{key:m,value:Q,parent:$}=k;$&&m&&!m.includes("$")&&(Array.isArray(Q)||isObject(Q))&&!Array.isArray($)&&(Array.isArray($[m])?$[m].forEach(I=>{typeof I!="string"&&(I.$objectPath=R($,m),I.$parentIsCreate=$.$op==="create",I[Bi]=$.$parentIsCreate||$[Symbol.for("grandChildOfCreate")]);}):isObject($[m])&&($[m].$parentIsCreate=$.$op==="create",$[m][Symbol.for("grandChildOfCreate")]=$.$parentIsCreate||$[Symbol.for("grandChildOfCreate")],$[m].$objectPath=R($,m)));})),i=d(e),r=(B=>{let M=($,I)=>{let E=[];$.filter(S=>S).forEach(S=>{let D=Object.keys(S).filter(j=>!j.startsWith("$")).length;if(Array.isArray(S.$id)&&D>0){let j=S.$id.map(v=>({...S,$id:v}));E=[...E,...j];}else E.push({...S});});let y=[],L=[],O=E.filter(S=>{let j=["delete","update","unlink"].includes(S.$op||""),v=F(S,!0).length;if((!S.$id||Array.isArray(S.$id)&&v>0||S.$filter)&&j)return !0;L.push({...S});});return O.length>0?O.forEach(S=>{let j=(z=>{let lt=(()=>{let _={};for(let x in z){let Y=N(a,z);!x.startsWith("$")&&Y.dataFields?.find(ot=>ot.path===x)&&(_[x]=z[x]);}return _})(),dt=Object.keys(z),Z=dt.filter(_=>!_.startsWith("$")),Tt=[],mt=(_,x)=>{if(_===Z.length){let ot={...x};dt.forEach(V=>{V.startsWith("$")&&(ot[V]=z[V]);}),Tt.push(ot);return}let Y={...x,[Z[_]]:z[Z[_]],...X(x),...lt};mt(_+1,Y),mt(_+1,x);};return mt(0,{...X(z)}),Tt})(S).filter(z=>!(z.$op==="update"&&Object.keys(z).filter(et=>!et.startsWith("$")).length===0)),v=[],U=t(S.$objectPath),q=u[U]?u[U].$ids:[],C=j.map((z,et)=>{let lt=N(a,z),Z=Object.keys(z).filter(x=>!x.includes("$")&&!lt.dataFields?.some(Y=>Y.path===x)).map(x=>(Array.isArray(z[x])?z[x].length>1?z[x].filter(V=>!V.$id||Array.isArray(V.$id)||V.$filter):z[x]:[z[x]]).map(V=>{let Lt=t(V.$objectPath);return {idsToKey:(Mt=>{let xt=[],pt=Mt.split("."),Ne=pt.slice(0,pt.length-1).join("."),De=pt.slice(pt.length-1,pt.length)[0].split("___")[1];for(let Qt in u)if(Qt.startsWith(Ne)&&Qt.endsWith(De)){let Pt=Qt.split("."),xe=Pt.slice(Pt.length-1,Pt.length)[0].split("___")[0];xt.push(xe);}return xt})(Lt),key:x,multiple:V}})).filter(x=>x!==void 0),_=(x=>{let Y=x.map(V=>V.map(it=>it.idsToKey));return (V=>V.length>0?V.reduce((it,ct)=>it.concat(ct),[]).reduce((it,ct)=>it?ct.filter(Mt=>it.includes(Mt)):ct):[])(Y)})(Z).filter(x=>!v.includes(x));if(v=[...v,..._],q=q.filter(x=>!_.includes(x)),et===j.length-1&&q.length>0)return {...z,$id:q,$bzId:`T1_${v4()}`,...X(z)};if(_.length>0)return {...z,$id:_,$bzId:`T2_${v4()}`,...X(z)}}).filter(z=>z!==void 0),je=(()=>{if(C.length===0&&!I?.$id)return O;if(C.length===0&&I?.$id){let z=Array.isArray(I.$id)?I.$id:[I.$id],et=[];return z.forEach(lt=>{let dt=t({...S.$objectPath,ids:lt}),Z=u[dt];Z&&et.push({...S,$id:Z.$ids,...X(S),$bzId:`T_${v4()}`});}),et}else return C.filter(z=>z!==void 0)})();y=[...L,...je].map(k);}):y=E.map(k),y},k=$=>{let I={...$,$bzId:$.$tempId??`T3_${v4()}`,...X($)},E=N(a,$);return Object.keys($).filter(y=>!y.includes("$")&&!E.dataFields?.some(L=>L.path===y)).forEach(y=>{let L=Array.isArray($[y])?$[y]:[$[y]],O=M(L,$);I[y]=O.length>0?O:void 0;}),I},m=[];return B.forEach($=>{m=[...m,...M([$])];}),m.map($=>k($))})(Array.isArray(i)?i:[i]),b=B=>B.map(M=>{let k=F(M,!0),m={...M};return k.forEach(Q=>{let $=Array.isArray(M[Q])?M[Q]:[M[Q]],I=[],E=[],y=[],L={},O=At(a,M,Q);$.filter(C=>C).forEach(C=>{C.$op==="replace"&&C.$id?(L=C,Array.isArray(C.$id)?E=[...E,...C.$id]:E.push(C.$id)):C.$op==="create"&&O==="ONE"&&C.id?(L=C,Array.isArray(C.id)?y=[...E,...C.id]:y.push(C.id)):I.push(C);});let S=t(L.$objectPath),j=o(S).map(C=>u[C]),v=[];j.filter(C=>C!=null).forEach(C=>{v=[...v,...C.$ids];});let U=v.filter(C=>!E.includes(C)),J=E.filter(C=>!v.includes(C)),q=X(L);U.length>0&&I.push({...L,$op:"unlink",$id:U,$bzId:`T4_${v4()}`,id:void 0,...q}),J.length>0&&J.forEach(C=>{I.push({...L,$op:"link",$id:C,$bzId:`T5_${v4()}`,...q});}),y.length>0&&y.forEach(C=>{I.push({...L,$op:"create",id:C,$bzId:`T6_${v4()}`,...q});}),m[Q]=b(I);}),m}),P=d(b(d(r)));(B=>produce(B,M=>traverse(M,k=>{let{key:m,value:Q,parent:$}=k;m&&$&&!m?.includes("$")&&(Array.isArray(Q)||isObject(Q))&&!Array.isArray($)&&(Array.isArray(Q)?Q:[Q]).forEach(E=>{let y=u[t(E.$objectPath)],L=(D,j)=>D.every(v=>j.includes(v)),O=E.$id?Array.isArray(E.$id)?L(E.$id,y?y.$ids:[]):y?.$ids.includes(E.$id):y,S=At(a,$,E.$objectPath.key);if(E.$op==="link"&&O&&S==="ONE")throw new Error(`[BQLE-Q-M-2] Cannot link on:"${t(E.$objectPath)}" because it is already occupied.`);if(E.$op)switch(E.$op){case"delete":if(!O&&!s.mutation?.ignoreNonexistingThings)throw new Error(`[BQLE-Q-M-2] Cannot delete $id:"${E.$id}" because it is not linked to $id:"${$.$id}"`);break;case"update":if(!O&&!s.mutation?.ignoreNonexistingThings)throw new Error(`[BQLE-Q-M-2] Cannot update $id:"${E.$id}" because it is not linked to $id:"${$.$id}"`);break;case"unlink":if(!O&&!s.mutation?.ignoreNonexistingThings)throw new Error(`[BQLE-Q-M-2] Cannot unlink $id:"${E.$id}" because it is not linked to $id:"${$.$id}"`);break;case"link":if(O)throw new Error(`[BQLE-Q-M-2] Cannot link $id:"${E.$id}" because it is already linked to $id:"${$.$id}"`);break;}});})))(P);let A=(B=>produce(B,M=>traverse(M,k=>{let{value:m,meta:Q}=k;isObject(m)&&(m[Symbol.for("path")]=Q.nodePath,delete m.$objectPath,delete m.$parentIsCreate);})))(P);f.filledBqlRequest=A;};var ge=async f=>{let{filledBqlRequest:e,schema:s}=f;if(!e)throw new Error("Filled BQL request is missing");let F=(w=>produce(w,g=>traverse(g,({value:R})=>{if(isObject(R)){let t=R,o=N(s,t),{unidentifiedFields:u}=nt(o,t),{idFields:n,computedFields:d,virtualFields:i}=o;if(!n)throw new Error("No idFields found");let[c]=n,r=listify(t,(l,T)=>T!==void 0?l:void 0),b=r.filter(l=>i?.includes(l));if(b.length>0)throw new Error(`Virtual fields can't be sent to DB: "${b.join(",")}"`);if(d.filter(l=>!r.includes(l)).forEach(l=>{let T=o.dataFields?.find(m=>m.path===l),B=o.linkFields?.find(m=>m.path===l)?.oppositeLinkFieldsPlayedBy[0],M="roles"in o?ft(o.roles,(m,Q)=>m===l):void 0,k=T||B||M;if(!k)throw new Error(`no field Def for ${l}`);if(l!==c&&t.$op==="create"&&!t[l]){let m=tt({currentThing:t,fieldSchema:k,mandatoryDependencies:!0});t[l]=m;}}),u.length>0)throw new Error(`Unknown fields: [${u.join(",")}] in ${JSON.stringify(t)}`)}})))(e),h=(w=>produce(w,g=>traverse(g,({value:R})=>{isObject(R);})))(F);f.filledBqlRequest=h;};var kt=(f,e)=>{let s=N(e,f).hooks;if(s?.pre){let a=`on${Ht(f.$op)}`;return s.pre.filter(h=>h.triggers[a]?.()).flatMap(h=>h.actions)}return []};var we=async f=>{let{filledBqlRequest:e,schema:s}=f;if(!e)throw new Error("Filled BQL request is missing");let F=(g=>produce(g,R=>traverse(R,({value:t})=>{isObject(t)&&Gt();})))(e),p=isArray(F)?F:[F],w=(g=>produce(g,R=>traverse(R,({value:t,parent:o,key:u,meta:n})=>{if(st(t)){if(!o||u===void 0||u===null)throw new Error("[Internal] Parent is missing, should not happen as we artificially have always a root array");let d=kt(t,s).filter(b=>b.type==="transform"),i=structuredClone(G(g,o,n)),c=isDraft(t)?current(t):t,r=structuredClone(c);d.forEach(b=>{let P=b.fn(r,i);Object.keys(P).length!==0&&(o[u]={...c,...P});});}})))(p);if(!isArray(w))throw new Error("[Internal] withTransformedNodes is not an array");w.length>1?f.filledBqlRequest=w:f.filledBqlRequest=w[0];};var Le=async f=>{let{filledBqlRequest:e,schema:s}=f;if(!e)throw new Error("Filled BQL request is missing");let a=p=>produce(p,h=>traverse(h,({value:w})=>{if(isObject(w)&&("$entity"in w||"$relation"in w)){let g=w,{requiredFields:R,enumFields:t,fnValidatedFields:o}=N(s,g);"$op"in g&&g.$op==="create"&&R.forEach(u=>{if(!(u in g))throw new Error(`[Validations] Required field "${u}" is missing.`)}),("$op"in g&&g.$op==="update"||g.$op==="create")&&t.forEach(u=>{if(u in g){let n=g[ht]?.dataFields?.find(d=>d.path===u)?.validations?.enum;if(!n)throw new Error(`[Validations] Enum field "${u}" is missing enum options.`);if(isArray(g[u]))g[u].some(d=>{if(!n.includes(d))throw new Error(`[Validations] Option "${d}" is not a valid option for field "${u}".`)});else if(n&&!n.includes(g[u]))throw new Error(`[Validations] Option "${g[u]}" is not a valid option for field "${u}".`)}}),("$op"in g&&g.$op==="update"||g.$op==="create")&&o.forEach(u=>{if(u in g)try{let n=g[ht]?.dataFields?.find(d=>d.path===u)?.validations?.fn;if(!n)throw new Error("Missing validation function.");if(!n(g[u]))throw new Error("Failed validation function.")}catch(n){throw new Error(`[Validations:attribute:${u}] ${n.message}`)}});}})),F=p=>produce(p,h=>traverse(h,({value:w,parent:g,meta:R})=>{if(isObject(w)&&("$entity"in w||"$relation"in w)){let t="$entity"in w?w.$entity:w.$relation,o=w,u=structuredClone(G(p,g,R)),n=structuredClone(isDraft(o)?current(o):o);kt(o,s).forEach(i=>{if(i.type==="validate"){if(i.severity!=="error")return;try{let c=i.fn(n,u);if(c===!1)throw new Error(`${i.message}.`);if(c!==!0)throw new Error("Validation function's output is not a boolean value.")}catch(c){throw new Error(`[Validations:thing:${t}] ${c.message}`)}}});}}));a(e),F(e);};var Me=async(f,e)=>{let{schema:s,enrichedBqlQuery:a}=f,{bqlRes:F}=e;if(!F)return;let h=(w=>produce(w,g=>traverse(g,({value:R})=>{if(isObject(R)){let t=R;if(!t.$thing)throw new Error("[Internal] Thing is missing");if(t.$thing){let o=N(s,t),{virtualFields:u}=o,n=t[H];if(!n)throw new Error("[Internal] QueryPath is missing");let d=getNodeByPath(a,n),i=d.$fields.map(r=>r.$path),c=d.$excludedFields;u.forEach(r=>{if(c?.includes(r)||i.length>0&&!i.includes(r))return;let b=o.dataFields?.find(P=>P.path===r);if(b?.default){let P=tt({currentThing:t,fieldSchema:b,mandatoryDependencies:!0});t[r]=P;}else if(t[r]===void 0)throw new Error(`[Internal] Virtual field: No db value found for virtual field: ${r}`)}),c&&c.forEach(r=>{if(typeof r!="string")throw new Error("[Internal] ExcludedField is not a string");delete t[r];});}}})))(F);e.bqlRes=h;};var Re=async(f,e)=>{let{config:s}=f,{bqlRes:a}=e;if(!a)return;let p=(g=>produce(g,R=>traverse(R,({value:t})=>{isObject(t);})))(a),w=(g=>produce(g,R=>traverse(R,({value:t})=>{if(isObject(t)){let o=t;Object.keys(o).forEach(u=>{o[u]===void 0&&delete o[u];}),Object.getOwnPropertySymbols(o).forEach(u=>{delete o[u];}),s.query?.noMetadata===!0&&Object.keys(o).forEach(u=>{u.startsWith("$")&&delete o[u];});}})))(p);e.bqlRes=w;};var Ae={query:[de,ae,pe,fe,Me,Re],mutation:[te,he,ge,we,Le,oe,Zt,se,Kt,Jt]},Nt=async(f,e,s={},a=!0)=>{for(let F of f){let p=await F(e,s);if(p&&Array.isArray(p))for(let h of p)await Nt(h.pipeline,h.req,h.res,!1);}return a&&e.config.query?.debugger===!0&&typeof s.bqlRes=="object"?{...s.bqlRes,$debugger:{tqlRequest:e.tqlRequest}}:s.bqlRes},Et=(f,e,s,a)=>Nt(Ae.query,{config:e,schema:s,rawBqlRequest:f,dbHandles:a},{}),Oe=(f,e,s,a)=>Nt(Ae.mutation,{config:e,schema:s,rawBqlRequest:f,dbHandles:a},{});var Dt=class{schema;config;dbHandles;constructor({schema:e,config:s}){this.schema=e,this.config=s;}getDbHandles=()=>this.dbHandles;init=async()=>{let e={typeDB:new Map},s=Wt(this.schema);await Promise.all(this.config.dbConnectors.map(async a=>{if(a.provider==="typeDB"&&a.dbName){let[F,p]=await tryit(TypeDB.coreDriver)(a.url);if(F){let h=`[BORM:${a.provider}:${a.dbName}:core] ${F.message??"Can't create TypeDB Client"}`;throw new Error(h)}try{let h=await p.session(a.dbName,SessionType.DATA);e.typeDB.set(a.id,{client:p,session:h});}catch(h){let w=`[BORM:${a.provider}:${a.dbName}:session] ${(h.messageTemplate?._messageBody()||h.message)??"Can't create TypeDB Session"}`;throw new Error(w)}}if(a.provider==="typeDBCluster"&&a.dbName){let[F,p]=await tryit(TypeDB.cloudDriver)(a.addresses,a.credentials);if(F){let h=`[BORM:${a.provider}:${a.dbName}:core] ${F.message??"Can't create TypeDB Cluster Client"}`;throw new Error(h)}try{let h=await p.session(a.dbName,SessionType.DATA);e.typeDB.set(a.id,{client:p,session:h});}catch(h){let w=`[BORM:${a.provider}:${a.dbName}:session] ${(h.messageTemplate?._messageBody()||h.message)??"Can't create TypeDB Session"}`;throw new Error(w)}}})),this.schema=s,this.dbHandles=e;};#t=async()=>{if(!this.dbHandles&&(await this.init(),!this.dbHandles))throw new Error("Can't init BormClient")};introspect=async()=>(await this.#t(),this.schema);define=async()=>(await this.#t(),vt(this.config,this.schema,this.dbHandles));query=async(e,s)=>{await this.#t();let a={...this.config,query:{...It.query,...this.config.query,...s}};return Et(e,a,this.schema,this.dbHandles)};mutate=async(e,s)=>{await this.#t();let a={...this.config,mutation:{...It.mutation,...this.config.mutation,...s}};return Oe(e,a,this.schema,this.dbHandles)};close=async()=>{this.dbHandles&&this.dbHandles.typeDB.forEach(async({client:e,session:s})=>{s.isOpen()&&await s.close(),await e.close();});}},so=Dt;//! Todo: delete when this works with the new $thing and $thingType fields
59
59
  //! reads all the insertions and gets the first match. This means each id must be unique
60
60
  //! disabled as it has false positives
61
- //!todo: use computeNode() in the future instead
61
+ //! Todo: Sandbox the function in computeFunction()
62
62
 
63
- export { vr as default };
63
+ export { so as default };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blitznocode/blitz-orm",
3
- "version": "0.8.7",
3
+ "version": "0.8.10",
4
4
  "main": "dist/index.cjs",
5
5
  "module": "./dist/index.mjs",
6
6
  "types": "dist/index.d.ts",