@live-state/sync 0.0.7-canary-3 → 0.0.7-canary-5
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/client.d.ts +1 -1
- package/dist/client.js +1 -1
- package/dist/fetch-client.d.ts +1 -1
- package/dist/{index-CLkafi56.d.ts → index-LV6LHPwh.d.ts} +5 -1
- package/dist/optimistic-client.d.ts +1 -1
- package/dist/server.cjs +5 -5
- package/dist/server.d.cts +98 -79
- package/dist/server.d.ts +98 -79
- package/dist/server.js +6 -6
- package/package.json +1 -1
package/dist/client.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { z as Client, y as ClientEvents, C as ClientOptions, a as ClientRouterConstraint, n as ClientStorageLoadedEvent, m as ConnectionStateChangeEvent, o as DataLoadReplyEvent, D as DataLoadRequestedEvent, M as MessageReceivedEvent, q as MutationReceivedEvent, r as MutationRejectedEvent, p as MutationSentEvent, e as OptimisticHandlerContext, w as OptimisticMutationAppliedEvent, x as OptimisticMutationUndoneEvent, O as OptimisticMutationsConfig, c as OptimisticMutationsRegistry, g as OptimisticOperation, f as OptimisticStorageProxy, Q as QueryExecutedEvent, t as QuerySubscriptionTriggeredEvent, v as StoreStateUpdatedEvent, S as SubscriptionCreatedEvent, s as SubscriptionRemovedEvent, A as createClient, d as defineOptimisticMutations, u as useLiveQuery, l as useLoadData } from './index-
|
|
1
|
+
export { z as Client, y as ClientEvents, C as ClientOptions, a as ClientRouterConstraint, n as ClientStorageLoadedEvent, m as ConnectionStateChangeEvent, o as DataLoadReplyEvent, D as DataLoadRequestedEvent, M as MessageReceivedEvent, q as MutationReceivedEvent, r as MutationRejectedEvent, p as MutationSentEvent, e as OptimisticHandlerContext, w as OptimisticMutationAppliedEvent, x as OptimisticMutationUndoneEvent, O as OptimisticMutationsConfig, c as OptimisticMutationsRegistry, g as OptimisticOperation, f as OptimisticStorageProxy, Q as QueryExecutedEvent, t as QuerySubscriptionTriggeredEvent, v as StoreStateUpdatedEvent, S as SubscriptionCreatedEvent, s as SubscriptionRemovedEvent, A as createClient, d as defineOptimisticMutations, u as useLiveQuery, l as useLoadData } from './index-LV6LHPwh.js';
|
|
2
2
|
import '@standard-schema/spec';
|
|
3
3
|
import 'zod';
|
package/dist/client.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import {d,a,b,f as f$1,e,c}from'./chunk-LSAVBBUS.js';import {a as a$1}from'./chunk-RSSRYEM3.js';export{b as defineOptimisticMutations}from'./chunk-RSSRYEM3.js';import {useSyncExternalStore,useEffect}from'react';import {xxHash32}from'js-xxhash';import {z as z$1}from'zod';import {stringify}from'qs';import fe from'fast-deep-equal';import {openDB}from'idb';var f=d=>xxHash32(JSON.stringify(d)).toString(32);var M=(d,e,t=false)=>Object.entries(e).every(([i,s])=>{if(i==="$and")return s.every(n=>M(d,n,t));if(i==="$or")return s.some(n=>M(d,n,t));let o=(s==null?void 0:s.$eq)!==void 0?s==null?void 0:s.$eq:s;if(typeof s=="object"&&s!==null&&(s==null?void 0:s.$eq)===void 0){if(s.$in!==void 0){let r=d[i];return r===void 0?false:t?!s.$in.includes(r):s.$in.includes(r)}if(s.$not!==void 0&&!t)return M(d,{[i]:s.$not},true);if(s.$gt!==void 0){let r=d[i];return typeof r!="number"?false:t?r<=s.$gt:r>s.$gt}if(s.$gte!==void 0){let r=d[i];return typeof r!="number"?false:t?r<s.$gte:r>=s.$gte}if(s.$lt!==void 0){let r=d[i];return typeof r!="number"?false:t?r>=s.$lt:r<s.$lt}if(s.$lte!==void 0){let r=d[i];return typeof r!="number"?false:t?r>s.$lte:r<=s.$lte}let n=d[i];return !n||typeof n!="object"&&!Array.isArray(n)?false:Array.isArray(n)?t?!n.some(r=>M(r,s,false)):n.some(r=>M(r,s,false)):M(n,s,t)}return t?d[i]!==o:d[i]===o}),O=d=>{if(typeof d!="object"||d===null)return false;let e=d;return "where"in e||"limit"in e||"orderBy"in e||"include"in e},v={CRITICAL:0,ERROR:1,WARN:2,INFO:3,DEBUG:4},x=class{level;prefix;constructor(e={}){this.level=e.level??v.INFO,this.prefix=e.prefix?`[${e.prefix}] `:"";}critical(...e){this.level>=v.CRITICAL&&console.error(`${this.prefix}[CRITICAL]`,...e);}error(...e){this.level>=v.ERROR&&console.error(`${this.prefix}[ERROR]`,...e);}warn(...e){this.level>=v.WARN&&console.warn(`${this.prefix}[WARN]`,...e);}info(...e){this.level>=v.INFO&&console.log(`${this.prefix}[INFO]`,...e);}debug(...e){this.level>=v.DEBUG&&console.log(`${this.prefix}[DEBUG]`,...e);}setLevel(e){this.level=e;}getLevel(){return this.level}},G=d=>new x(d);var L=class{subscriptions=new Map;getOrStoreSubscription(e){let t=e.buildQueryRequest(),i=f(t);if(this.subscriptions.has(i))return this.subscriptions.get(i).subscribe;let s={subscribe:o=>{let n=this.subscriptions.get(i);return n.callbacks.add(o),n.unsubscribe||(n.unsubscribe=()=>{},n.unsubscribe=e.subscribe(()=>{n.callbacks.forEach(r=>{r();});})),()=>{var r;(r=this.subscriptions.get(i))==null||r.callbacks.delete(o),setTimeout(()=>{var c;let a=this.subscriptions.get(i);a&&a.callbacks.size===0&&((c=a.unsubscribe)==null||c.call(a),this.subscriptions.delete(i));},10);}},callbacks:new Set,unsubscribe:void 0};return this.subscriptions.set(i,s),this.subscriptions.get(i).subscribe}},oe=new L,Ee=d=>useSyncExternalStore(oe.getOrStoreSubscription(d),d.get),Oe=(d,e)=>{useEffect(()=>{let t=d.load(e.buildQueryRequest());return ()=>{t();}},[e,d.load]);};var H=z$1.object({resource:z$1.string(),where:z$1.record(z$1.string(),z$1.any()).optional(),include:z$1.record(z$1.string(),z$1.any()).optional(),lastSyncedAt:z$1.string().optional(),limit:z$1.coerce.number().optional(),sort:z$1.array(z$1.object({key:z$1.string(),direction:z$1.enum(["asc","desc"])})).optional()}),j=z$1.record(z$1.string(),z$1.object({value:z$1.any().nullable(),_meta:z$1.object({timestamp:z$1.string().optional().nullable()}).optional()})),ae=j.superRefine((d,e)=>{d.id&&e.addIssue({code:z$1.ZodIssueCode.custom,message:"Payload cannot have an id"});}),z=z$1.object({id:z$1.string().optional(),type:z$1.literal("MUTATE"),resource:z$1.string(),resourceId:z$1.string().optional()}),K=z$1.object({timestamp:z$1.string().optional()}).optional(),k=z.extend({procedure:z$1.string(),payload:z$1.any().optional(),meta:K}),D=z.extend({procedure:z$1.enum(["INSERT","UPDATE"]),payload:ae,meta:K});z$1.union([D,k]);var Y=z$1.object({resource:z$1.string(),procedure:z$1.string(),input:z$1.any().optional()});var S=z$1.string(),P=z$1.union([Y,H]),ce=z$1.object({id:S,type:z$1.literal("SUBSCRIBE")}).and(P),ue=z$1.object({id:S,type:z$1.literal("UNSUBSCRIBE")}).and(P),le=z$1.object({id:S,type:z$1.literal("QUERY")}).and(P),pe=z$1.object({id:S,type:z$1.literal("CUSTOM_QUERY"),resource:z$1.string(),procedure:z$1.string(),input:z$1.any().optional()}),V=D.extend({id:S}),de=k.extend({id:S}),he=z$1.union([de,V]);z$1.union([ce,le,pe,he,ue]);var ye=z$1.object({id:S,type:z$1.literal("REJECT"),resource:z$1.string(),message:z$1.string().optional()}),me=z$1.object({id:S,type:z$1.literal("REPLY"),data:z$1.any()}),F=z$1.union([ye,me,V]),J=z$1.object({resource:z$1.string(),data:z$1.array(j)});var R=class{ws=null;url;autoConnect;autoReconnect;reconnectTimeout;reconnectLimit;reconnectAttempts=0;eventListeners=new Map;reconnectTimer=null;intentionallyDisconnected=false;credentials;constructor(e){this.url=e.url,this.autoConnect=e.autoConnect??false,this.autoReconnect=e.autoReconnect??false,this.reconnectTimeout=e.reconnectTimeout??5e3,this.reconnectLimit=e.reconnectLimit,this.credentials=e.credentials,this.autoConnect&&this.connect();}connected(){var e;return ((e=this.ws)==null?void 0:e.readyState)===WebSocket.OPEN}async connect(){if(this.ws&&(this.ws.readyState===WebSocket.OPEN||this.ws.readyState===WebSocket.CONNECTING))return;this.intentionallyDisconnected=false;let e=await c(this.credentials);this.ws=new WebSocket(this.url+(e?`?${stringify(e)}`:"")),this.ws.addEventListener("open",this.handleOpen.bind(this)),this.ws.addEventListener("close",this.handleClose.bind(this)),this.ws.addEventListener("error",this.handleError.bind(this)),this.ws.addEventListener("message",this.handleMessage.bind(this));}disconnect(){this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null),this.intentionallyDisconnected=true,this.ws&&(this.ws.close(),this.ws=null);}addEventListener(e,t){var i;this.eventListeners.has(e)||this.eventListeners.set(e,new Set),(i=this.eventListeners.get(e))==null||i.add(t);}removeEventListener(e,t){var i;this.eventListeners.has(e)&&((i=this.eventListeners.get(e))==null||i.delete(t));}send(e){if(this.ws&&this.ws.readyState===WebSocket.OPEN)this.ws.send(e);else throw new Error("WebSocket is not open")}handleOpen(e){this.reconnectAttempts=0,this.dispatchEvent("open",e),this.dispatchEvent("connectionChange",{open:true});}handleClose(e){this.dispatchEvent("close",e),this.dispatchEvent("connectionChange",{open:false}),this.autoReconnect&&!this.intentionallyDisconnected&&this.scheduleReconnect();}handleError(e){var t,i;this.dispatchEvent("error",e),this.dispatchEvent("connectionChange",{open:false}),(i=(t=e.error)==null?void 0:t.message)!=null&&i.includes("non-101")&&(this.ws&&(this.ws.close(),this.ws=null),this.autoReconnect&&!this.intentionallyDisconnected&&this.scheduleReconnect());}handleMessage(e){this.dispatchEvent("message",e);}scheduleReconnect(){this.reconnectLimit&&this.reconnectAttempts>=this.reconnectLimit||(this.reconnectAttempts++,this.reconnectTimer=setTimeout(()=>{this.connect();},this.reconnectTimeout));}dispatchEvent(e,t){var i;(i=this.eventListeners.get(e))==null||i.forEach(s=>{s(t);});}};var T=class{constructor(e){this.logger=e;this.nodes=new Map;}nodes;createNode(e,t,i){if(this.nodes.has(e))throw new Error(`Node with id ${e} already exists`);let s={id:e,type:t,referencedBy:new Map(i.map(o=>[o,new Set])),references:new Map,subscriptions:new Set};return this.nodes.set(e,s),s}getNode(e){return this.nodes.get(e)}hasNode(e){return this.nodes.has(e)}createLink(e,t){let i=this.nodes.get(e),s=this.nodes.get(t);if(!i)throw new Error(`Source node with id ${e} does not exist`);if(!s)throw new Error(`Target node with id ${t} does not exist`);i.references.set(s.type,t);let o=s.referencedBy.get(i.type);o&&o instanceof Set?o.add(e):s.referencedBy.set(i.type,e),this.notifySubscribers(t);}removeLink(e,t){let i=this.nodes.get(e);if(!i)throw new Error(`Node with id ${e} does not exist`);let s=i.references.get(t);if(!s)return;i.references.delete(t);let o=this.nodes.get(s);if(!o)return;let n=o.referencedBy.get(i.type);n&&(n instanceof Set?n.delete(e):o.referencedBy.delete(i.type),this.notifySubscribers(s)),this.notifySubscribers(e);}subscribe(e,t){let i=this.nodes.get(e);if(!i)throw new Error(`Node with id ${e} does not exist`);return i.subscriptions.add(t),()=>{i.subscriptions.delete(t);}}removeNode(e){let t=this.nodes.get(e);t&&(Array.from(t.referencedBy.entries()).forEach(([i,s])=>{(s instanceof Set?Array.from(s.values()):[s]).forEach(n=>{let r=this.nodes.get(n);!r||!r.references.get(i)||(r.references.delete(i),this.notifySubscribers(n));});}),this.nodes.delete(e));}updateNode(e,t){let i=this.nodes.get(e);if(!i)throw new Error(`Node with id ${e} does not exist`);t(i),this.notifySubscribers(e);}notifySubscribers(e){let t=this.nodes.get(e);t&&Array.from(t.subscriptions).forEach(i=>{var s;try{i(e);}catch(o){(s=this.logger)==null||s.error(`Error in node subscription for node ${e}:`,o);}});}getAllNodes(){return Array.from(this.nodes.values())}};var U="__meta",C="databases",w=class{db;async init(e,t){var c,l;if(typeof window>"u")return;let s=((c=(await window.indexedDB.databases()).find(u=>u.name===t))==null?void 0:c.version)??1,o=await f(e),n=Object.fromEntries(await Promise.all(Object.entries(e).map(async([u,p])=>[u,await f(p)]))),r=await openDB("live-state-databases",1,{upgrade(u){u.objectStoreNames.contains(C)||u.createObjectStore(C);}}),a=(l=await this.getAll(r,C))==null?void 0:l[t];(a==null?void 0:a.schemaHash)!==o&&s++,this.db=await openDB(t,s,{async upgrade(u){[...Object.keys(e),U].forEach(p=>{(a==null?void 0:a.objectHashes[p])!==n[p]&&u.objectStoreNames.contains(p)&&u.deleteObjectStore(p),u.objectStoreNames.contains(p)||u.createObjectStore(p);}),await r.put(C,{schemaHash:o,objectHashes:n},t);},blocking(){window.location.reload();},blocked(){window.location.reload();}});}async get(e){return await this.getAll(this.db,e)??{}}getOne(e,t){return this.db?this.db.get(e,t):new Promise(i=>i(void 0))}set(e,t,i){var s;return (s=this.db)==null?void 0:s.put(e,i,t)}delete(e,t){var i;return (i=this.db)==null?void 0:i.delete(e,t)}getMeta(e){return this.db?this.db.get(U,e):new Promise(t=>t(void 0))}setMeta(e,t){var i;return (i=this.db)==null?void 0:i.put(U,t,e)}async getAll(e,t){if(!e)return;if(e.getAllRecords)return e.getAllRecords(t);let[i,s]=await Promise.all([e.getAll(t),e.getAllKeys(t)]);return Object.fromEntries(i.map((o,n)=>[s[n],o]))}};var I=class{constructor(e,t,i,s,o,n){this.schema=e;this.logger=i,this.optimisticObjGraph=new T(i),this.kvStorage=new w,this.onQuerySubscriptionTriggered=n,t!==false&&this.kvStorage.init(this.schema,t.name).then(()=>{Promise.all([this.kvStorage.getMeta("mutationStack"),this.kvStorage.getMeta("customMutationStack"),this.kvStorage.getMeta("customMutationIndex")]).then(([r,a,c])=>{r&&Object.keys(r).length>0&&(this.optimisticMutationStack=r),a&&a.length>0&&(this.customMutationStack=a),c&&Object.keys(c).length>0&&(this.customMutationIndex=c),s==null||s(this.optimisticMutationStack,this.customMutationStack,this.customMutationIndex);}).then(()=>{Object.entries(this.schema).forEach(([r])=>{this.kvStorage.get(r).then(a=>{if(!a||Object.keys(a).length===0){o==null||o(r,0);return}let c=Object.entries(a).map(([l,u])=>({...u,id:{value:l}}));o==null||o(r,c.length),this.loadConsolidatedState(r,c);});});}).catch(r=>{i.debug("Storage initialization failed (may not be available in this environment):",r);});});}rawObjPool={};optimisticMutationStack={};customMutationStack=[];optimisticObjGraph;optimisticRawObjPool={};logger;onQuerySubscriptionTriggered;customMutationIndex={};collectionSubscriptions=new Map;querySnapshots={};kvStorage;get(e$1,t,i=false){var a;let s=t??f(e$1);if(this.querySnapshots[s]&&!i){let c=this.querySnapshots[s];if(c)return c}let o,n=(a=e$1.where)==null?void 0:a.id;n===void 0?o=Object.keys(this.optimisticRawObjPool[e$1.resource]??{}):typeof n=="string"?o=[n]:typeof n=="object"&&n!==null?"$in"in n&&Array.isArray(n.$in)?o=n.$in:"$eq"in n&&typeof n.$eq=="string"?o=[n.$eq]:o=Object.keys(this.optimisticRawObjPool[e$1.resource]??{}):o=Object.keys(this.optimisticRawObjPool[e$1.resource]??{});let r=o.flatMap(c=>{let l=f$1(this.materializeOneWithInclude(c,e$1.include));return l?[l]:[]});if(e$1.sort&&e$1.sort.length>0){let c=(l,u)=>{for(let p of e$1.sort){let m=l[p.key],g=u[p.key];if(m<g)return p.direction==="asc"?-1:1;if(m>g)return p.direction==="asc"?1:-1}return 0};r.sort(c);}if(e$1.where||e$1.limit){let c=e$1.where?l=>M(l,e$1.where):()=>true;r=e(r,c,e$1.limit);}return !i&&this.collectionSubscriptions.has(s)&&(this.querySnapshots[s]=r),r}subscribe(e,t){var o;let i=f(e);return this.collectionSubscriptions.get(i)||this.collectionSubscriptions.set(i,{callbacks:new Set,query:e,flatInclude:e.include?this.flattenIncludes(e.include,e.resource):void 0}),(o=this.collectionSubscriptions.get(i))==null||o.callbacks.add(t),()=>{var n,r;(n=this.collectionSubscriptions.get(i))==null||n.callbacks.delete(t),((r=this.collectionSubscriptions.get(i))==null?void 0:r.callbacks.size)===0&&(this.collectionSubscriptions.delete(i),delete this.querySnapshots[i]);}}addMutation(e,t,i=false){var n,r,a;let s=this.schema[e];if(this.logger.debug("Adding mutation",t),!s)throw new Error("Schema not found");let o=(n=this.optimisticRawObjPool[e])==null?void 0:n[t.resourceId];if(i)this.optimisticMutationStack[e]??=[],this.optimisticMutationStack[e].push(t);else {this.optimisticMutationStack[e]=((a=(r=this.optimisticMutationStack)==null?void 0:r[e])==null?void 0:a.filter(u=>u.id!==t.id))??[],this.rawObjPool[e]??={};let c={value:{...this.schema[e].mergeMutation("set",t.payload,this.rawObjPool[e][t.resourceId])[0].value,id:{value:t.resourceId}}};this.rawObjPool[e][t.resourceId]=c;let l=c.value;delete l.id,this.kvStorage.set(e,t.resourceId,l);}this.kvStorage.setMeta("mutationStack",this.optimisticMutationStack),this.updateRawObjPool(e,t.resourceId,t.payload,o);}undoMutation(e,t){var n,r;if(!this.optimisticMutationStack[e])return;let i=(n=this.optimisticMutationStack[e])==null?void 0:n.findIndex(a=>a.id===t);if(i===-1)return;let s=this.optimisticMutationStack[e][i];this.logger.debug("Removing mutation",s);let o=(r=this.optimisticRawObjPool[e])==null?void 0:r[s.resourceId];this.optimisticMutationStack[e].splice(i,1),this.kvStorage.setMeta("mutationStack",this.optimisticMutationStack),this.updateRawObjPool(e,s.resourceId,Object.fromEntries(Object.entries(s.payload).map(([a])=>[a,{value:null,_meta:{}}])),o);}addCustomMutationMessage(e){this.customMutationStack.push(e),this.kvStorage.setMeta("customMutationStack",this.customMutationStack);}registerCustomMutation(e,t){this.customMutationIndex[e]=t,this.kvStorage.setMeta("customMutationIndex",this.customMutationIndex);}confirmCustomMutation(e){let t=this.customMutationIndex[e];if(t){for(let{resource:i,mutationId:s}of t)this.undoMutation(i,s);delete this.customMutationIndex[e],this.kvStorage.setMeta("customMutationIndex",this.customMutationIndex),this.customMutationStack=this.customMutationStack.filter(i=>i.id!==e),this.kvStorage.setMeta("customMutationStack",this.customMutationStack);}}undoCustomMutation(e){var s;let t=this.customMutationIndex[e];if(!t)return [];let i=[];for(let{resource:o,mutationId:n}of t){let r=(s=this.optimisticMutationStack[o])==null?void 0:s.find(a=>a.id===n);this.undoMutation(o,n),r&&i.push({resource:o,mutationId:n,resourceId:r.resourceId});}return delete this.customMutationIndex[e],this.kvStorage.setMeta("customMutationIndex",this.customMutationIndex),this.customMutationStack=this.customMutationStack.filter(o=>o.id!==e),this.kvStorage.setMeta("customMutationStack",this.customMutationStack),i}getCustomMutationMutationIds(){let e=new Set;for(let t of Object.values(this.customMutationIndex))for(let{mutationId:i}of t)e.add(i);return e}loadConsolidatedState(e,t){t.forEach(i=>{var r;let s=(r=i.id)==null?void 0:r.value;if(!s)return;let{cleanedPayload:o,nestedMutations:n}=this.extractNestedRelations(e,i);n.forEach(a=>{this.addMutation(a.resource,a);}),this.addMutation(e,{id:s,type:"MUTATE",resource:e,resourceId:s,procedure:"INSERT",payload:o});});}extractNestedRelations(e,t){let i=this.schema[e],s={...t},o=[];return i!=null&&i.relations?(Object.entries(t).forEach(([n,r])=>{var u;let a=i.relations[n];if(!a)return;let c=a.entity.name,l=r==null?void 0:r.value;if(a.type==="one"){if(l&&typeof l=="object"&&!Array.isArray(l)&&((u=l.id)!=null&&u.value)){let p=l.id.value,m={...l},{cleanedPayload:g,nestedMutations:E}=this.extractNestedRelations(c,m);o.push(...E),o.push({id:p,type:"MUTATE",resource:c,resourceId:p,procedure:"INSERT",payload:g}),delete s[n];}}else a.type==="many"&&Array.isArray(l)&&(l.forEach(p=>{var m,g;if(p&&typeof p=="object"&&!Array.isArray(p)&&((g=(m=p.value)==null?void 0:m.id)!=null&&g.value)){let E=p.value.id.value,Z={...p.value},{cleanedPayload:ee,nestedMutations:te}=this.extractNestedRelations(c,Z);o.push(...te),o.push({id:E,type:"MUTATE",resource:c,resourceId:E,procedure:"INSERT",payload:ee});}}),delete s[n]);}),{cleanedPayload:s,nestedMutations:o}):{cleanedPayload:s,nestedMutations:o}}updateRawObjPool(e,t,i,s){var r;if(!this.schema[e])return;let o=(r=this.rawObjPool[e])==null?void 0:r[t],n=(this.optimisticMutationStack[e]??[]).reduce((a,c)=>c.resourceId!==t?a:this.schema[e].mergeMutation("set",c.payload,a)[0],o);if(this.optimisticRawObjPool[e]??={},n?this.optimisticRawObjPool[e][t]={value:{...n.value,id:{value:t}}}:delete this.optimisticRawObjPool[e][t],!(!this.optimisticObjGraph.hasNode(t)&&!n)){if(this.optimisticObjGraph.hasNode(t)||this.optimisticObjGraph.createNode(t,e,Object.values(this.schema[e].relations).flatMap(a=>a.type==="many"?[a.entity.name]:[])),Object.keys(this.schema[e].relations).length>0){let a=Object.fromEntries(Object.entries(this.schema[e].relations).flatMap(([c,l])=>l.type==="one"?[[l.relationalColumn,c]]:[]));Object.entries(i).forEach(([c,l])=>{let u=this.schema[e].relations[a[c]];if(!a[c])return;let p=s==null?void 0:s.value[c],[,m]=u.mergeMutation("set",l,p);if(m){if(!this.optimisticObjGraph.hasNode(m.value)){let g=u.entity.name;this.optimisticObjGraph.createNode(m.value,g,Object.values(this.schema[g].relations).flatMap(E=>E.type==="many"?[E.entity.name]:[]));}p!=null&&p.value&&this.optimisticObjGraph.removeLink(t,u.entity.name),this.optimisticObjGraph.createLink(t,m.value);}});}this.notifyCollectionSubscribers(e),this.optimisticObjGraph.notifySubscribers(t);}}materializeOneWithInclude(e,t={}){var a;if(!e)return;let i=this.optimisticObjGraph.getNode(e);if(!i)return;let s=i.type,o=(a=this.optimisticRawObjPool[s])==null?void 0:a[e];if(!o)return;let[n,r]=Object.entries(t).reduce((c,[l,u])=>{let p=this.schema[s].relations[l];return p&&(p.type==="one"?c[0].push([l,p.entity.name,u??true]):p.type==="many"&&c[1].push([l,p.entity.name,u??true])),c},[[],[]]);return {value:{...o.value,...Object.fromEntries(n.map(([c,l,u])=>[c,this.materializeOneWithInclude(i.references.get(l),O(u)?u.include??{}:typeof u=="object"&&u!==null?u:{})])),...Object.fromEntries(r.map(([c,l,u])=>{let p=i.referencedBy.get(l),m=p instanceof Set;return [c,m?{value:Array.from(p.values()).map(g=>this.materializeOneWithInclude(g,O(u)?u.include??{}:typeof u=="object"&&u!==null?u:{}))}:this.materializeOneWithInclude(p,O(u)?u.include??{}:typeof u=="object"&&u!==null?u:{})]}))}}}notifyCollectionSubscribers(e){this.collectionSubscriptions.forEach(t=>{var i,s;if(t.query.resource===e||(i=t.flatInclude)!=null&&i.includes(e)){let o=f(t.query),n=this.querySnapshots[o],r=this.get(t.query,void 0,true);if(fe(r,n))return;this.querySnapshots[o]=r,(s=this.onQuerySubscriptionTriggered)==null||s.call(this,t.query),t.callbacks.forEach(a=>{a(r);});}});}flattenIncludes(e,t){let i=[];return Object.entries(e).forEach(([s,o])=>{var a;let n=(a=this.schema[t])==null?void 0:a.relations[s];if(!n)return;let r=n.entity.name;if(i.push(r),typeof o=="object"&&o!==null){let c=O(o)?o.include??{}:o;i.push(...this.flattenIncludes(c,r));}}),Array.from(new Set(i))}};var A=class{constructor(e,t){this.client=e;this.query=t;}buildQueryRequest(){return this.query}then(e,t){return this.client.genericQuery(this.query.resource,this.query.procedure,this.query.input).then(e,t)}},Q=class{url;ws;store;logger;optimisticMutations;remoteSubscriptions=new Map;eventListeners=new Set;replyHandlers={};constructor(e){var t,i,s,o;this.url=e.url,this.logger=G({level:e.logLevel??v.INFO}),this.optimisticMutations=e.optimisticMutations,this.store=new I(e.schema,e.storage,this.logger,(n,r,a)=>{var l,u;let c=new Set;if(a)for(let p of Object.values(a))for(let{mutationId:m}of p)c.add(m);(u=(l=Object.values(n))==null?void 0:l.flat())==null||u.forEach(p=>{c.has(p.id)||this.sendWsMessage(p);}),this.replayCustomMutationStack();},(n,r)=>{this.emitEvent({type:"CLIENT_STORAGE_LOADED",resource:n,itemCount:r});},n=>{this.emitEvent({type:"QUERY_SUBSCRIPTION_TRIGGERED",query:n});}),this.ws=new R({url:e.url,autoConnect:((t=e.connection)==null?void 0:t.autoConnect)??true,autoReconnect:((i=e.connection)==null?void 0:i.autoReconnect)??true,reconnectTimeout:((s=e.connection)==null?void 0:s.reconnectTimeout)??5e3,reconnectLimit:(o=e.connection)==null?void 0:o.maxReconnectAttempts,credentials:e.credentials}),this.ws.addEventListener("message",n=>{this.handleServerMessage(n.data);}),this.ws.addEventListener("connectionChange",n=>{if(this.emitEvent({type:"CONNECTION_STATE_CHANGE",open:n.open}),n.open){Array.from(this.remoteSubscriptions.values()).forEach(({query:a})=>{this.sendWsMessage({id:b(),type:"SUBSCRIBE",...a});});let r=this.store.getCustomMutationMutationIds();Object.values(this.store.optimisticMutationStack).forEach(a=>{a&&a.forEach(c=>{r.has(c.id)||(this.emitEvent({type:"MUTATION_SENT",mutationId:c.id,resource:c.resource,resourceId:c.resourceId,procedure:c.procedure??"UNKNOWN",optimistic:true}),this.sendWsMessage(c));});}),this.replayCustomMutationStack();}});}get(e){let t=this.store.get(e);return this.emitEvent({type:"QUERY_EXECUTED",query:e,resultCount:Array.isArray(t)?t.length:t?1:0}),t}handleServerMessage(e){var t,i,s,o;try{this.logger.debug("Message received from the server:",e);let n=F.parse(JSON.parse(e));if(this.logger.debug("Parsed message:",n),this.emitEvent({type:"MESSAGE_RECEIVED",message:n}),n.type==="MUTATE"){let{resource:r,id:a,resourceId:c,procedure:l}=n;this.emitEvent({type:"MUTATION_RECEIVED",mutationId:a,resource:r,resourceId:c,procedure:l??"UNKNOWN"});try{this.store.addMutation(r,n);}catch(u){this.logger.error("Error merging mutation from the server:",u);}}else if(n.type==="REJECT"){if(this.replyHandlers[n.id]){clearTimeout(this.replyHandlers[n.id].timeoutHandle),this.emitUndoEvents(this.store.undoCustomMutation(n.id));let c=n.message??"Mutation rejected";(i=(t=this.replyHandlers[n.id]).reject)==null||i.call(t,new Error(c)),delete this.replyHandlers[n.id];}let r=((s=this.store.optimisticMutationStack[n.resource])==null?void 0:s.length)??0,a=(o=this.store.optimisticMutationStack[n.resource])==null?void 0:o.find(c=>c.id===n.id);this.store.undoMutation(n.resource,n.id),this.emitEvent({type:"MUTATION_REJECTED",mutationId:n.id,resource:n.resource}),a&&this.emitEvent({type:"OPTIMISTIC_MUTATION_UNDONE",mutationId:n.id,resource:n.resource,resourceId:a.resourceId,pendingMutations:r-1});}else if(n.type==="REPLY"){let{id:r,data:a}=n;if(this.replyHandlers[r]){clearTimeout(this.replyHandlers[r].timeoutHandle),this.replyHandlers[r].handler(a);return}let c=J.parse(a);this.emitEvent({type:"DATA_LOAD_REPLY",resource:c.resource,itemCount:c.data.length}),this.store.loadConsolidatedState(c.resource,c.data),this.emitEvent({type:"STORE_STATE_UPDATED",resource:c.resource,itemCount:c.data.length});}}catch(n){this.logger.error("Error parsing message from the server:",n);}}load(e){let t=b(),i=f(e);this.emitEvent({type:"DATA_LOAD_REQUESTED",query:e,subscriptionId:t}),this.sendWsMessage({id:t,type:"SUBSCRIBE",...e});let s=!this.remoteSubscriptions.has(i);return this.remoteSubscriptions.has(i)?this.remoteSubscriptions.get(i).subCounter+=1:this.remoteSubscriptions.set(i,{query:e,subCounter:1}),s&&this.emitEvent({type:"SUBSCRIPTION_CREATED",query:e,subscriptionKey:i,subscriberCount:1}),()=>{if(this.remoteSubscriptions.has(i)){let o=this.remoteSubscriptions.get(i);o.subCounter-=1,this.remoteSubscriptions.get(i).subCounter<=0&&(this.remoteSubscriptions.delete(i),this.sendWsMessage({id:b(),type:"UNSUBSCRIBE",...e}),this.emitEvent({type:"SUBSCRIPTION_REMOVED",query:e,subscriptionKey:i}));}}}subscribe(e,t){return this.store.subscribe(e,t)}mutate(e,t,i,s){var r,a;let o={id:b(),type:"MUTATE",resource:e,payload:this.store.schema[e].encodeMutation("set",s,new Date().toISOString()),resourceId:t,procedure:i},n=(((r=this.store.optimisticMutationStack[e])==null?void 0:r.length)??0)+1;(a=this.store)==null||a.addMutation(e,o,true),this.emitEvent({type:"OPTIMISTIC_MUTATION_APPLIED",mutationId:o.id,resource:e,resourceId:t,procedure:i,pendingMutations:n}),this.emitEvent({type:"MUTATION_SENT",mutationId:o.id,resource:e,resourceId:t,procedure:i,optimistic:true}),this.sendWsMessage(o);}genericMutate(e,t,i){var r,a;let s=(r=this.ws)==null?void 0:r.connected(),o=(a=this.optimisticMutations)==null?void 0:a.getHandler(e,t);if(!s&&!o)throw new Error("WebSocket not connected");let n={id:b(),type:"MUTATE",resource:e,procedure:t,payload:i,meta:{timestamp:new Date().toISOString()}};if(o)try{let{proxy:c,getOperations:l}=a$1(this.store,this.store.schema);o({input:i,storage:c});let u=l(),p=this.applyOptimisticOperations(u);this.store.registerCustomMutation(n.id,p),this.emitEvent({type:"MUTATION_SENT",mutationId:n.id,resource:e,resourceId:"",procedure:t,optimistic:!0});}catch(c){throw this.logger.error("Error executing optimistic handler:",c),this.emitUndoEvents(this.store.undoCustomMutation(n.id)),c}else this.emitEvent({type:"MUTATION_SENT",mutationId:n.id,resource:e,resourceId:"",procedure:t,optimistic:false});return s?(this.sendWsMessage(n),new Promise((c,l)=>{this.replyHandlers[n.id]={timeoutHandle:setTimeout(()=>{delete this.replyHandlers[n.id],this.emitUndoEvents(this.store.undoCustomMutation(n.id)),l(new Error("Reply timeout"));},5e3),handler:u=>{delete this.replyHandlers[n.id],this.store.confirmCustomMutation(n.id),c(u);},reject:l};})):(this.store.addCustomMutationMessage(n),Promise.resolve(void 0))}applyOptimisticOperations(e){var i;let t=[];try{for(let s of e){let o=b(),n=new Date().toISOString(),r={id:o,type:"MUTATE",resource:s.resource,resourceId:s.id,procedure:s.type==="insert"?"INSERT":"UPDATE",payload:this.store.schema[s.resource].encodeMutation("set",s.data,n)},a=(((i=this.store.optimisticMutationStack[s.resource])==null?void 0:i.length)??0)+1;this.store.addMutation(s.resource,r,!0),t.push({resource:s.resource,mutationId:o}),this.emitEvent({type:"OPTIMISTIC_MUTATION_APPLIED",mutationId:o,resource:s.resource,resourceId:s.id,procedure:s.type==="insert"?"INSERT":"UPDATE",pendingMutations:a});}return t}catch(s){for(let{resource:o,mutationId:n}of t)this.store.undoMutation(o,n);throw s}}emitUndoEvents(e){var t;for(let{resource:i,mutationId:s,resourceId:o}of e){let n=((t=this.store.optimisticMutationStack[i])==null?void 0:t.length)??0;this.emitEvent({type:"OPTIMISTIC_MUTATION_UNDONE",mutationId:s,resource:i,resourceId:o,pendingMutations:n});}}genericQuery(e,t,i){if(!this.ws||!this.ws.connected())throw new Error("WebSocket not connected");let s={id:b(),type:"CUSTOM_QUERY",resource:e,procedure:t,input:i};return this.sendWsMessage(s),new Promise((o,n)=>{this.replyHandlers[s.id]={timeoutHandle:setTimeout(()=>{delete this.replyHandlers[s.id],n(new Error("Reply timeout"));},5e3),handler:r=>{delete this.replyHandlers[s.id],o(r);},reject:n};})}addEventListener(e){return this.eventListeners.add(e),()=>{this.eventListeners.delete(e);}}replayCustomMutationStack(){var e;if((e=this.ws)!=null&&e.connected())for(let t of this.store.customMutationStack)this.sendWsMessage(t),!this.replyHandlers[t.id]&&(this.replyHandlers[t.id]={timeoutHandle:setTimeout(()=>{delete this.replyHandlers[t.id],this.emitUndoEvents(this.store.undoCustomMutation(t.id));},5e3),handler:()=>{delete this.replyHandlers[t.id],this.store.confirmCustomMutation(t.id);}});}sendWsMessage(e){var t;(t=this.ws)!=null&&t.connected()&&this.ws.send(JSON.stringify(e));}emitEvent(e){this.eventListeners.forEach(t=>{t(e);});}},et=d$1=>{let e=new Q(d$1),t=(i,s)=>new Proxy(s,{get(o,n,r){if(n in o)return Reflect.get(o,n,r);if(typeof n=="string")return a=>new A(e,{resource:i,procedure:n,input:a})}});return {client:{ws:e.ws,load:i=>e.load(i),addEventListener:i=>e.addEventListener(i)},store:{query:new Proxy({},{get(i,s){if(typeof s=="string")return Object.hasOwn(d$1.schema,s)?t(s,a._init(d$1.schema[s],e)):new Proxy({},{get(o,n){if(typeof n=="string")return r=>new A(e,{resource:s,procedure:n,input:r})}})},has(i,s){return typeof s=="string"}}),mutate:d(()=>{},{apply:(i,s,o)=>{if(s.length<2)return;if(s.length>2)throw new Error("Trying to access an invalid path");let[n,r]=s;if(r==="insert"){let{id:a,...c}=o[0];return e.mutate(n,a,"INSERT",c)}if(r==="update"){let[a,c]=o;return e.mutate(n,a,"UPDATE",c)}return e.genericMutate(n,r,o[0])}})}}};export{et as createClient,Ee as useLiveQuery,Oe as useLoadData};
|
|
1
|
+
import {d,a,b as b$1,f,e,c}from'./chunk-LSAVBBUS.js';import {a as a$1}from'./chunk-RSSRYEM3.js';export{b as defineOptimisticMutations}from'./chunk-RSSRYEM3.js';import {useSyncExternalStore,useEffect}from'react';import {xxHash32}from'js-xxhash';import {z as z$1}from'zod';import {stringify}from'qs';import fe from'fast-deep-equal';import {openDB}from'idb';var b=d=>xxHash32(JSON.stringify(d)).toString(32);var v=(d,e,t=false)=>Object.entries(e).every(([i,s])=>{if(i==="$and")return s.every(n=>v(d,n,t));if(i==="$or")return s.some(n=>v(d,n,t));let o=(s==null?void 0:s.$eq)!==void 0?s==null?void 0:s.$eq:s;if(typeof s=="object"&&s!==null&&(s==null?void 0:s.$eq)===void 0){if(s.$in!==void 0){let r=d[i];return r===void 0?false:t?!s.$in.includes(r):s.$in.includes(r)}if(s.$not!==void 0&&!t)return v(d,{[i]:s.$not},true);if(s.$gt!==void 0){let r=d[i];return typeof r!="number"?false:t?r<=s.$gt:r>s.$gt}if(s.$gte!==void 0){let r=d[i];return typeof r!="number"?false:t?r<s.$gte:r>=s.$gte}if(s.$lt!==void 0){let r=d[i];return typeof r!="number"?false:t?r>=s.$lt:r<s.$lt}if(s.$lte!==void 0){let r=d[i];return typeof r!="number"?false:t?r>s.$lte:r<=s.$lte}let n=d[i];return !n||typeof n!="object"&&!Array.isArray(n)?false:Array.isArray(n)?t?!n.some(r=>v(r,s,false)):n.some(r=>v(r,s,false)):v(n,s,t)}return t?d[i]!==o:d[i]===o}),R=d=>{if(typeof d!="object"||d===null)return false;let e=d;return "where"in e||"limit"in e||"orderBy"in e||"include"in e},S={CRITICAL:0,ERROR:1,WARN:2,INFO:3,DEBUG:4},j=class{level;prefix;constructor(e={}){this.level=e.level??S.INFO,this.prefix=e.prefix?`[${e.prefix}] `:"";}critical(...e){this.level>=S.CRITICAL&&console.error(`${this.prefix}[CRITICAL]`,...e);}error(...e){this.level>=S.ERROR&&console.error(`${this.prefix}[ERROR]`,...e);}warn(...e){this.level>=S.WARN&&console.warn(`${this.prefix}[WARN]`,...e);}info(...e){this.level>=S.INFO&&console.log(`${this.prefix}[INFO]`,...e);}debug(...e){this.level>=S.DEBUG&&console.log(`${this.prefix}[DEBUG]`,...e);}setLevel(e){this.level=e;}getLevel(){return this.level}},z=d=>new j(d);var k=class{subscriptions=new Map;getOrStoreSubscription(e){let t=e.buildQueryRequest(),i=b(t);if(this.subscriptions.has(i))return this.subscriptions.get(i).subscribe;let s={subscribe:o=>{let n=this.subscriptions.get(i);return n.callbacks.add(o),n.unsubscribe||(n.unsubscribe=()=>{},n.unsubscribe=e.subscribe(()=>{n.callbacks.forEach(r=>{r();});})),()=>{var r;(r=this.subscriptions.get(i))==null||r.callbacks.delete(o),setTimeout(()=>{var c;let a=this.subscriptions.get(i);a&&a.callbacks.size===0&&((c=a.unsubscribe)==null||c.call(a),this.subscriptions.delete(i));},10);}},callbacks:new Set,unsubscribe:void 0};return this.subscriptions.set(i,s),this.subscriptions.get(i).subscribe}},oe=new k,Ee=d=>useSyncExternalStore(oe.getOrStoreSubscription(d),d.get),Oe=(d,e)=>{useEffect(()=>{let t=d.load(e.buildQueryRequest());return ()=>{t();}},[e,d.load]);};var K=z$1.object({resource:z$1.string(),where:z$1.record(z$1.string(),z$1.any()).optional(),include:z$1.record(z$1.string(),z$1.any()).optional(),lastSyncedAt:z$1.string().optional(),limit:z$1.coerce.number().optional(),sort:z$1.array(z$1.object({key:z$1.string(),direction:z$1.enum(["asc","desc"])})).optional()}),D=z$1.record(z$1.string(),z$1.object({value:z$1.any().nullable(),_meta:z$1.object({timestamp:z$1.string().optional().nullable()}).optional()})),ae=D.superRefine((d,e)=>{d.id&&e.addIssue({code:z$1.ZodIssueCode.custom,message:"Payload cannot have an id"});}),Y=z$1.object({id:z$1.string().optional(),type:z$1.literal("MUTATE"),resource:z$1.string(),resourceId:z$1.string().optional()}),V=z$1.object({timestamp:z$1.string().optional(),originMutationId:z$1.string().optional()}).optional(),P=Y.extend({procedure:z$1.string(),payload:z$1.any().optional(),meta:V}),U=Y.extend({procedure:z$1.enum(["INSERT","UPDATE"]),payload:ae,meta:V});z$1.union([U,P]);var F=z$1.object({resource:z$1.string(),procedure:z$1.string(),input:z$1.any().optional()});var E=z$1.string(),Q=z$1.union([F,K]),ce=z$1.object({id:E,type:z$1.literal("SUBSCRIBE")}).and(Q),ue=z$1.object({id:E,type:z$1.literal("UNSUBSCRIBE")}).and(Q),le=z$1.object({id:E,type:z$1.literal("QUERY")}).and(Q),pe=z$1.object({id:E,type:z$1.literal("CUSTOM_QUERY"),resource:z$1.string(),procedure:z$1.string(),input:z$1.any().optional()}),J=U.extend({id:E}),de=P.extend({id:E}),he=z$1.union([de,J]);z$1.union([ce,le,pe,he,ue]);var ye=z$1.object({id:E,type:z$1.literal("REJECT"),resource:z$1.string(),message:z$1.string().optional()}),me=z$1.object({id:E,type:z$1.literal("REPLY"),data:z$1.any()}),X=z$1.union([ye,me,J]),Z=z$1.object({resource:z$1.string(),data:z$1.array(D)});var C=class{ws=null;url;autoConnect;autoReconnect;reconnectTimeout;reconnectLimit;reconnectAttempts=0;eventListeners=new Map;reconnectTimer=null;intentionallyDisconnected=false;credentials;constructor(e){this.url=e.url,this.autoConnect=e.autoConnect??false,this.autoReconnect=e.autoReconnect??false,this.reconnectTimeout=e.reconnectTimeout??5e3,this.reconnectLimit=e.reconnectLimit,this.credentials=e.credentials,this.autoConnect&&this.connect();}connected(){var e;return ((e=this.ws)==null?void 0:e.readyState)===WebSocket.OPEN}async connect(){if(this.ws&&(this.ws.readyState===WebSocket.OPEN||this.ws.readyState===WebSocket.CONNECTING))return;this.intentionallyDisconnected=false;let e=await c(this.credentials);this.ws=new WebSocket(this.url+(e?`?${stringify(e)}`:"")),this.ws.addEventListener("open",this.handleOpen.bind(this)),this.ws.addEventListener("close",this.handleClose.bind(this)),this.ws.addEventListener("error",this.handleError.bind(this)),this.ws.addEventListener("message",this.handleMessage.bind(this));}disconnect(){this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null),this.intentionallyDisconnected=true,this.ws&&(this.ws.close(),this.ws=null);}addEventListener(e,t){var i;this.eventListeners.has(e)||this.eventListeners.set(e,new Set),(i=this.eventListeners.get(e))==null||i.add(t);}removeEventListener(e,t){var i;this.eventListeners.has(e)&&((i=this.eventListeners.get(e))==null||i.delete(t));}send(e){if(this.ws&&this.ws.readyState===WebSocket.OPEN)this.ws.send(e);else throw new Error("WebSocket is not open")}handleOpen(e){this.reconnectAttempts=0,this.dispatchEvent("open",e),this.dispatchEvent("connectionChange",{open:true});}handleClose(e){this.dispatchEvent("close",e),this.dispatchEvent("connectionChange",{open:false}),this.autoReconnect&&!this.intentionallyDisconnected&&this.scheduleReconnect();}handleError(e){var t,i;this.dispatchEvent("error",e),this.dispatchEvent("connectionChange",{open:false}),(i=(t=e.error)==null?void 0:t.message)!=null&&i.includes("non-101")&&(this.ws&&(this.ws.close(),this.ws=null),this.autoReconnect&&!this.intentionallyDisconnected&&this.scheduleReconnect());}handleMessage(e){this.dispatchEvent("message",e);}scheduleReconnect(){this.reconnectLimit&&this.reconnectAttempts>=this.reconnectLimit||(this.reconnectAttempts++,this.reconnectTimer=setTimeout(()=>{this.connect();},this.reconnectTimeout));}dispatchEvent(e,t){var i;(i=this.eventListeners.get(e))==null||i.forEach(s=>{s(t);});}};var w=class{constructor(e){this.logger=e;this.nodes=new Map;}nodes;createNode(e,t,i){if(this.nodes.has(e))throw new Error(`Node with id ${e} already exists`);let s={id:e,type:t,referencedBy:new Map(i.map(o=>[o,new Set])),references:new Map,subscriptions:new Set};return this.nodes.set(e,s),s}getNode(e){return this.nodes.get(e)}hasNode(e){return this.nodes.has(e)}createLink(e,t){let i=this.nodes.get(e),s=this.nodes.get(t);if(!i)throw new Error(`Source node with id ${e} does not exist`);if(!s)throw new Error(`Target node with id ${t} does not exist`);i.references.set(s.type,t);let o=s.referencedBy.get(i.type);o&&o instanceof Set?o.add(e):s.referencedBy.set(i.type,e),this.notifySubscribers(t);}removeLink(e,t){let i=this.nodes.get(e);if(!i)throw new Error(`Node with id ${e} does not exist`);let s=i.references.get(t);if(!s)return;i.references.delete(t);let o=this.nodes.get(s);if(!o)return;let n=o.referencedBy.get(i.type);n&&(n instanceof Set?n.delete(e):o.referencedBy.delete(i.type),this.notifySubscribers(s)),this.notifySubscribers(e);}subscribe(e,t){let i=this.nodes.get(e);if(!i)throw new Error(`Node with id ${e} does not exist`);return i.subscriptions.add(t),()=>{i.subscriptions.delete(t);}}removeNode(e){let t=this.nodes.get(e);t&&(Array.from(t.referencedBy.entries()).forEach(([i,s])=>{(s instanceof Set?Array.from(s.values()):[s]).forEach(n=>{let r=this.nodes.get(n);!r||!r.references.get(i)||(r.references.delete(i),this.notifySubscribers(n));});}),this.nodes.delete(e));}updateNode(e,t){let i=this.nodes.get(e);if(!i)throw new Error(`Node with id ${e} does not exist`);t(i),this.notifySubscribers(e);}notifySubscribers(e){let t=this.nodes.get(e);t&&Array.from(t.subscriptions).forEach(i=>{var s;try{i(e);}catch(o){(s=this.logger)==null||s.error(`Error in node subscription for node ${e}:`,o);}});}getAllNodes(){return Array.from(this.nodes.values())}};var _="__meta",I="databases",A=class{db;async init(e,t){var c,p;if(typeof window>"u")return;let s=((c=(await window.indexedDB.databases()).find(u=>u.name===t))==null?void 0:c.version)??1,o=await b(e),n=Object.fromEntries(await Promise.all(Object.entries(e).map(async([u,l])=>[u,await b(l)]))),r=await openDB("live-state-databases",1,{upgrade(u){u.objectStoreNames.contains(I)||u.createObjectStore(I);}}),a=(p=await this.getAll(r,I))==null?void 0:p[t];(a==null?void 0:a.schemaHash)!==o&&s++,this.db=await openDB(t,s,{async upgrade(u){[...Object.keys(e),_].forEach(l=>{(a==null?void 0:a.objectHashes[l])!==n[l]&&u.objectStoreNames.contains(l)&&u.deleteObjectStore(l),u.objectStoreNames.contains(l)||u.createObjectStore(l);}),await r.put(I,{schemaHash:o,objectHashes:n},t);},blocking(){window.location.reload();},blocked(){window.location.reload();}});}async get(e){return await this.getAll(this.db,e)??{}}getOne(e,t){return this.db?this.db.get(e,t):new Promise(i=>i(void 0))}set(e,t,i){var s;return (s=this.db)==null?void 0:s.put(e,i,t)}delete(e,t){var i;return (i=this.db)==null?void 0:i.delete(e,t)}getMeta(e){return this.db?this.db.get(_,e):new Promise(t=>t(void 0))}setMeta(e,t){var i;return (i=this.db)==null?void 0:i.put(_,t,e)}async getAll(e,t){if(!e)return;if(e.getAllRecords)return e.getAllRecords(t);let[i,s]=await Promise.all([e.getAll(t),e.getAllKeys(t)]);return Object.fromEntries(i.map((o,n)=>[s[n],o]))}};var x=class{constructor(e,t,i,s,o,n){this.schema=e;this.logger=i,this.optimisticObjGraph=new w(i),this.kvStorage=new A,this.onQuerySubscriptionTriggered=n,t!==false&&this.kvStorage.init(this.schema,t.name).then(()=>{Promise.all([this.kvStorage.getMeta("mutationStack"),this.kvStorage.getMeta("customMutationStack"),this.kvStorage.getMeta("customMutationIndex")]).then(([r,a,c])=>{r&&Object.keys(r).length>0&&(this.optimisticMutationStack=r),a&&a.length>0&&(this.customMutationStack=a),c&&Object.keys(c).length>0&&(this.customMutationIndex=c),s==null||s(this.optimisticMutationStack,this.customMutationStack,this.customMutationIndex);}).then(()=>{Object.entries(this.schema).forEach(([r])=>{this.kvStorage.get(r).then(a=>{if(!a||Object.keys(a).length===0){o==null||o(r,0);return}let c=Object.entries(a).map(([p,u])=>({...u,id:{value:p}}));o==null||o(r,c.length),this.loadConsolidatedState(r,c);});});}).catch(r=>{i.debug("Storage initialization failed (may not be available in this environment):",r);});});}rawObjPool={};optimisticMutationStack={};customMutationStack=[];optimisticObjGraph;optimisticRawObjPool={};logger;onQuerySubscriptionTriggered;customMutationIndex={};collectionSubscriptions=new Map;querySnapshots={};kvStorage;get(e$1,t,i=false){var a;let s=t??b(e$1);if(this.querySnapshots[s]&&!i){let c=this.querySnapshots[s];if(c)return c}let o,n=(a=e$1.where)==null?void 0:a.id;n===void 0?o=Object.keys(this.optimisticRawObjPool[e$1.resource]??{}):typeof n=="string"?o=[n]:typeof n=="object"&&n!==null?"$in"in n&&Array.isArray(n.$in)?o=n.$in:"$eq"in n&&typeof n.$eq=="string"?o=[n.$eq]:o=Object.keys(this.optimisticRawObjPool[e$1.resource]??{}):o=Object.keys(this.optimisticRawObjPool[e$1.resource]??{});let r=o.flatMap(c=>{let p=f(this.materializeOneWithInclude(c,e$1.include));return p?[p]:[]});if(e$1.sort&&e$1.sort.length>0){let c=(p,u)=>{for(let l of e$1.sort){let m=p[l.key],g=u[l.key];if(m<g)return l.direction==="asc"?-1:1;if(m>g)return l.direction==="asc"?1:-1}return 0};r.sort(c);}if(e$1.where||e$1.limit){let c=e$1.where?p=>v(p,e$1.where):()=>true;r=e(r,c,e$1.limit);}return !i&&this.collectionSubscriptions.has(s)&&(this.querySnapshots[s]=r),r}subscribe(e,t){var o;let i=b(e);return this.collectionSubscriptions.get(i)||this.collectionSubscriptions.set(i,{callbacks:new Set,query:e,flatInclude:e.include?this.flattenIncludes(e.include,e.resource):void 0}),(o=this.collectionSubscriptions.get(i))==null||o.callbacks.add(t),()=>{var n,r;(n=this.collectionSubscriptions.get(i))==null||n.callbacks.delete(t),((r=this.collectionSubscriptions.get(i))==null?void 0:r.callbacks.size)===0&&(this.collectionSubscriptions.delete(i),delete this.querySnapshots[i]);}}addMutation(e,t,i=false){var n,r,a,c,p;let s=this.schema[e];if(this.logger.debug("Adding mutation",t),!s)throw new Error("Schema not found");let o=(n=this.optimisticRawObjPool[e])==null?void 0:n[t.resourceId];if(i)this.optimisticMutationStack[e]??=[],this.optimisticMutationStack[e].push(t);else {this.optimisticMutationStack[e]=((a=(r=this.optimisticMutationStack)==null?void 0:r[e])==null?void 0:a.filter(g=>g.id!==t.id))??[];let u=(c=t.meta)==null?void 0:c.originMutationId;if(u&&this.customMutationIndex[u]){let g=this.customMutationIndex[u];for(let f of g)if(f.resource===e){let T=(p=this.optimisticMutationStack[e])==null?void 0:p.find(O=>O.id===f.mutationId);T&&T.resourceId===t.resourceId&&(this.optimisticMutationStack[e]=this.optimisticMutationStack[e].filter(O=>O.id!==f.mutationId));}}this.rawObjPool[e]??={};let l={value:{...this.schema[e].mergeMutation("set",t.payload,this.rawObjPool[e][t.resourceId])[0].value,id:{value:t.resourceId}}};this.rawObjPool[e][t.resourceId]=l;let m=l.value;delete m.id,this.kvStorage.set(e,t.resourceId,m);}this.kvStorage.setMeta("mutationStack",this.optimisticMutationStack),this.updateRawObjPool(e,t.resourceId,t.payload,o);}undoMutation(e,t){var n,r;if(!this.optimisticMutationStack[e])return;let i=(n=this.optimisticMutationStack[e])==null?void 0:n.findIndex(a=>a.id===t);if(i===-1)return;let s=this.optimisticMutationStack[e][i];this.logger.debug("Removing mutation",s);let o=(r=this.optimisticRawObjPool[e])==null?void 0:r[s.resourceId];this.optimisticMutationStack[e].splice(i,1),this.kvStorage.setMeta("mutationStack",this.optimisticMutationStack),this.updateRawObjPool(e,s.resourceId,Object.fromEntries(Object.entries(s.payload).map(([a])=>[a,{value:null,_meta:{}}])),o);}addCustomMutationMessage(e){this.customMutationStack.push(e),this.kvStorage.setMeta("customMutationStack",this.customMutationStack);}registerCustomMutation(e,t){this.customMutationIndex[e]=t,this.kvStorage.setMeta("customMutationIndex",this.customMutationIndex);}confirmCustomMutation(e){let t=this.customMutationIndex[e];if(t){for(let{resource:i,mutationId:s}of t)this.undoMutation(i,s);delete this.customMutationIndex[e],this.kvStorage.setMeta("customMutationIndex",this.customMutationIndex),this.customMutationStack=this.customMutationStack.filter(i=>i.id!==e),this.kvStorage.setMeta("customMutationStack",this.customMutationStack);}}undoCustomMutation(e){var s;let t=this.customMutationIndex[e];if(!t)return [];let i=[];for(let{resource:o,mutationId:n}of t){let r=(s=this.optimisticMutationStack[o])==null?void 0:s.find(a=>a.id===n);this.undoMutation(o,n),r&&i.push({resource:o,mutationId:n,resourceId:r.resourceId});}return delete this.customMutationIndex[e],this.kvStorage.setMeta("customMutationIndex",this.customMutationIndex),this.customMutationStack=this.customMutationStack.filter(o=>o.id!==e),this.kvStorage.setMeta("customMutationStack",this.customMutationStack),i}getCustomMutationMutationIds(){let e=new Set;for(let t of Object.values(this.customMutationIndex))for(let{mutationId:i}of t)e.add(i);return e}loadConsolidatedState(e,t){t.forEach(i=>{var r;let s=(r=i.id)==null?void 0:r.value;if(!s)return;let{cleanedPayload:o,nestedMutations:n}=this.extractNestedRelations(e,i);n.forEach(a=>{this.addMutation(a.resource,a);}),this.addMutation(e,{id:s,type:"MUTATE",resource:e,resourceId:s,procedure:"INSERT",payload:o});});}extractNestedRelations(e,t){let i=this.schema[e],s={...t},o=[];return i!=null&&i.relations?(Object.entries(t).forEach(([n,r])=>{var u;let a=i.relations[n];if(!a)return;let c=a.entity.name,p=r==null?void 0:r.value;if(a.type==="one"){if(p&&typeof p=="object"&&!Array.isArray(p)&&((u=p.id)!=null&&u.value)){let l=p.id.value,m={...p},{cleanedPayload:g,nestedMutations:f}=this.extractNestedRelations(c,m);o.push(...f),o.push({id:l,type:"MUTATE",resource:c,resourceId:l,procedure:"INSERT",payload:g}),delete s[n];}}else a.type==="many"&&Array.isArray(p)&&(p.forEach(l=>{var m,g;if(l&&typeof l=="object"&&!Array.isArray(l)&&((g=(m=l.value)==null?void 0:m.id)!=null&&g.value)){let f=l.value.id.value,T={...l.value},{cleanedPayload:O,nestedMutations:te}=this.extractNestedRelations(c,T);o.push(...te),o.push({id:f,type:"MUTATE",resource:c,resourceId:f,procedure:"INSERT",payload:O});}}),delete s[n]);}),{cleanedPayload:s,nestedMutations:o}):{cleanedPayload:s,nestedMutations:o}}updateRawObjPool(e,t,i,s){var r;if(!this.schema[e])return;let o=(r=this.rawObjPool[e])==null?void 0:r[t],n=(this.optimisticMutationStack[e]??[]).reduce((a,c)=>c.resourceId!==t?a:this.schema[e].mergeMutation("set",c.payload,a)[0],o);if(this.optimisticRawObjPool[e]??={},n?this.optimisticRawObjPool[e][t]={value:{...n.value,id:{value:t}}}:delete this.optimisticRawObjPool[e][t],!(!this.optimisticObjGraph.hasNode(t)&&!n)){if(this.optimisticObjGraph.hasNode(t)||this.optimisticObjGraph.createNode(t,e,Object.values(this.schema[e].relations).flatMap(a=>a.type==="many"?[a.entity.name]:[])),Object.keys(this.schema[e].relations).length>0){let a=Object.fromEntries(Object.entries(this.schema[e].relations).flatMap(([c,p])=>p.type==="one"?[[p.relationalColumn,c]]:[]));Object.entries(i).forEach(([c,p])=>{let u=this.schema[e].relations[a[c]];if(!a[c])return;let l=s==null?void 0:s.value[c],[,m]=u.mergeMutation("set",p,l);if(m){if(!this.optimisticObjGraph.hasNode(m.value)){let g=u.entity.name;this.optimisticObjGraph.createNode(m.value,g,Object.values(this.schema[g].relations).flatMap(f=>f.type==="many"?[f.entity.name]:[]));}l!=null&&l.value&&this.optimisticObjGraph.removeLink(t,u.entity.name),this.optimisticObjGraph.createLink(t,m.value);}});}this.notifyCollectionSubscribers(e),this.optimisticObjGraph.notifySubscribers(t);}}materializeOneWithInclude(e,t={}){var a;if(!e)return;let i=this.optimisticObjGraph.getNode(e);if(!i)return;let s=i.type,o=(a=this.optimisticRawObjPool[s])==null?void 0:a[e];if(!o)return;let[n,r]=Object.entries(t).reduce((c,[p,u])=>{let l=this.schema[s].relations[p];return l&&(l.type==="one"?c[0].push([p,l.entity.name,u??true]):l.type==="many"&&c[1].push([p,l.entity.name,u??true])),c},[[],[]]);return {value:{...o.value,...Object.fromEntries(n.map(([c,p,u])=>[c,this.materializeOneWithInclude(i.references.get(p),R(u)?u.include??{}:typeof u=="object"&&u!==null?u:{})])),...Object.fromEntries(r.map(([c,p,u])=>{let l=i.referencedBy.get(p),m=l instanceof Set;return [c,m?{value:Array.from(l.values()).map(g=>this.materializeOneWithInclude(g,R(u)?u.include??{}:typeof u=="object"&&u!==null?u:{}))}:this.materializeOneWithInclude(l,R(u)?u.include??{}:typeof u=="object"&&u!==null?u:{})]}))}}}notifyCollectionSubscribers(e){this.collectionSubscriptions.forEach(t=>{var i,s;if(t.query.resource===e||(i=t.flatInclude)!=null&&i.includes(e)){let o=b(t.query),n=this.querySnapshots[o],r=this.get(t.query,void 0,true);if(fe(r,n))return;this.querySnapshots[o]=r,(s=this.onQuerySubscriptionTriggered)==null||s.call(this,t.query),t.callbacks.forEach(a=>{a(r);});}});}flattenIncludes(e,t){let i=[];return Object.entries(e).forEach(([s,o])=>{var a;let n=(a=this.schema[t])==null?void 0:a.relations[s];if(!n)return;let r=n.entity.name;if(i.push(r),typeof o=="object"&&o!==null){let c=R(o)?o.include??{}:o;i.push(...this.flattenIncludes(c,r));}}),Array.from(new Set(i))}};var L=class{constructor(e,t){this.client=e;this.query=t;}buildQueryRequest(){return this.query}then(e,t){return this.client.genericQuery(this.query.resource,this.query.procedure,this.query.input).then(e,t)}},N=class{url;ws;store;logger;optimisticMutations;remoteSubscriptions=new Map;eventListeners=new Set;replyHandlers={};constructor(e){var t,i,s,o;this.url=e.url,this.logger=z({level:e.logLevel??S.INFO}),this.optimisticMutations=e.optimisticMutations,this.store=new x(e.schema,e.storage,this.logger,(n,r,a)=>{var p,u;let c=new Set;if(a)for(let l of Object.values(a))for(let{mutationId:m}of l)c.add(m);(u=(p=Object.values(n))==null?void 0:p.flat())==null||u.forEach(l=>{c.has(l.id)||this.sendWsMessage(l);}),this.replayCustomMutationStack();},(n,r)=>{this.emitEvent({type:"CLIENT_STORAGE_LOADED",resource:n,itemCount:r});},n=>{this.emitEvent({type:"QUERY_SUBSCRIPTION_TRIGGERED",query:n});}),this.ws=new C({url:e.url,autoConnect:((t=e.connection)==null?void 0:t.autoConnect)??true,autoReconnect:((i=e.connection)==null?void 0:i.autoReconnect)??true,reconnectTimeout:((s=e.connection)==null?void 0:s.reconnectTimeout)??5e3,reconnectLimit:(o=e.connection)==null?void 0:o.maxReconnectAttempts,credentials:e.credentials}),this.ws.addEventListener("message",n=>{this.handleServerMessage(n.data);}),this.ws.addEventListener("connectionChange",n=>{if(this.emitEvent({type:"CONNECTION_STATE_CHANGE",open:n.open}),n.open){Array.from(this.remoteSubscriptions.values()).forEach(({query:a})=>{this.sendWsMessage({id:b$1(),type:"SUBSCRIBE",...a});});let r=this.store.getCustomMutationMutationIds();Object.values(this.store.optimisticMutationStack).forEach(a=>{a&&a.forEach(c=>{r.has(c.id)||(this.emitEvent({type:"MUTATION_SENT",mutationId:c.id,resource:c.resource,resourceId:c.resourceId,procedure:c.procedure??"UNKNOWN",optimistic:true}),this.sendWsMessage(c));});}),this.replayCustomMutationStack();}});}get(e){let t=this.store.get(e);return this.emitEvent({type:"QUERY_EXECUTED",query:e,resultCount:Array.isArray(t)?t.length:t?1:0}),t}handleServerMessage(e){var t,i,s,o;try{this.logger.debug("Message received from the server:",e);let n=X.parse(JSON.parse(e));if(this.logger.debug("Parsed message:",n),this.emitEvent({type:"MESSAGE_RECEIVED",message:n}),n.type==="MUTATE"){let{resource:r,id:a,resourceId:c,procedure:p}=n;this.emitEvent({type:"MUTATION_RECEIVED",mutationId:a,resource:r,resourceId:c,procedure:p??"UNKNOWN"});try{this.store.addMutation(r,n);}catch(u){this.logger.error("Error merging mutation from the server:",u);}}else if(n.type==="REJECT"){if(this.replyHandlers[n.id]){clearTimeout(this.replyHandlers[n.id].timeoutHandle),this.emitUndoEvents(this.store.undoCustomMutation(n.id));let c=n.message??"Mutation rejected";(i=(t=this.replyHandlers[n.id]).reject)==null||i.call(t,new Error(c)),delete this.replyHandlers[n.id];}let r=((s=this.store.optimisticMutationStack[n.resource])==null?void 0:s.length)??0,a=(o=this.store.optimisticMutationStack[n.resource])==null?void 0:o.find(c=>c.id===n.id);this.store.undoMutation(n.resource,n.id),this.emitEvent({type:"MUTATION_REJECTED",mutationId:n.id,resource:n.resource}),a&&this.emitEvent({type:"OPTIMISTIC_MUTATION_UNDONE",mutationId:n.id,resource:n.resource,resourceId:a.resourceId,pendingMutations:r-1});}else if(n.type==="REPLY"){let{id:r,data:a}=n;if(this.replyHandlers[r]){clearTimeout(this.replyHandlers[r].timeoutHandle),this.replyHandlers[r].handler(a);return}let c=Z.parse(a);this.emitEvent({type:"DATA_LOAD_REPLY",resource:c.resource,itemCount:c.data.length}),this.store.loadConsolidatedState(c.resource,c.data),this.emitEvent({type:"STORE_STATE_UPDATED",resource:c.resource,itemCount:c.data.length});}}catch(n){this.logger.error("Error parsing message from the server:",n);}}load(e){let t=b$1(),i=b(e);this.emitEvent({type:"DATA_LOAD_REQUESTED",query:e,subscriptionId:t}),this.sendWsMessage({id:t,type:"SUBSCRIBE",...e});let s=!this.remoteSubscriptions.has(i);return this.remoteSubscriptions.has(i)?this.remoteSubscriptions.get(i).subCounter+=1:this.remoteSubscriptions.set(i,{query:e,subCounter:1}),s&&this.emitEvent({type:"SUBSCRIPTION_CREATED",query:e,subscriptionKey:i,subscriberCount:1}),()=>{if(this.remoteSubscriptions.has(i)){let o=this.remoteSubscriptions.get(i);o.subCounter-=1,this.remoteSubscriptions.get(i).subCounter<=0&&(this.remoteSubscriptions.delete(i),this.sendWsMessage({id:b$1(),type:"UNSUBSCRIBE",...e}),this.emitEvent({type:"SUBSCRIPTION_REMOVED",query:e,subscriptionKey:i}));}}}subscribe(e,t){return this.store.subscribe(e,t)}mutate(e,t,i,s){var r,a;let o={id:b$1(),type:"MUTATE",resource:e,payload:this.store.schema[e].encodeMutation("set",s,new Date().toISOString()),resourceId:t,procedure:i},n=(((r=this.store.optimisticMutationStack[e])==null?void 0:r.length)??0)+1;(a=this.store)==null||a.addMutation(e,o,true),this.emitEvent({type:"OPTIMISTIC_MUTATION_APPLIED",mutationId:o.id,resource:e,resourceId:t,procedure:i,pendingMutations:n}),this.emitEvent({type:"MUTATION_SENT",mutationId:o.id,resource:e,resourceId:t,procedure:i,optimistic:true}),this.sendWsMessage(o);}genericMutate(e,t,i){var r,a;let s=(r=this.ws)==null?void 0:r.connected(),o=(a=this.optimisticMutations)==null?void 0:a.getHandler(e,t);if(!s&&!o)throw new Error("WebSocket not connected");let n={id:b$1(),type:"MUTATE",resource:e,procedure:t,payload:i,meta:{timestamp:new Date().toISOString()}};if(o)try{let{proxy:c,getOperations:p}=a$1(this.store,this.store.schema);o({input:i,storage:c});let u=p(),l=this.applyOptimisticOperations(u);this.store.registerCustomMutation(n.id,l),this.emitEvent({type:"MUTATION_SENT",mutationId:n.id,resource:e,resourceId:"",procedure:t,optimistic:!0});}catch(c){throw this.logger.error("Error executing optimistic handler:",c),this.emitUndoEvents(this.store.undoCustomMutation(n.id)),c}else this.emitEvent({type:"MUTATION_SENT",mutationId:n.id,resource:e,resourceId:"",procedure:t,optimistic:false});return s?(this.sendWsMessage(n),new Promise((c,p)=>{this.replyHandlers[n.id]={timeoutHandle:setTimeout(()=>{delete this.replyHandlers[n.id],this.emitUndoEvents(this.store.undoCustomMutation(n.id)),p(new Error("Reply timeout"));},5e3),handler:u=>{delete this.replyHandlers[n.id],this.store.confirmCustomMutation(n.id),c(u);},reject:p};})):(this.store.addCustomMutationMessage(n),Promise.resolve(void 0))}applyOptimisticOperations(e){var i;let t=[];try{for(let s of e){let o=b$1(),n=new Date().toISOString(),r={id:o,type:"MUTATE",resource:s.resource,resourceId:s.id,procedure:s.type==="insert"?"INSERT":"UPDATE",payload:this.store.schema[s.resource].encodeMutation("set",s.data,n)},a=(((i=this.store.optimisticMutationStack[s.resource])==null?void 0:i.length)??0)+1;this.store.addMutation(s.resource,r,!0),t.push({resource:s.resource,mutationId:o}),this.emitEvent({type:"OPTIMISTIC_MUTATION_APPLIED",mutationId:o,resource:s.resource,resourceId:s.id,procedure:s.type==="insert"?"INSERT":"UPDATE",pendingMutations:a});}return t}catch(s){for(let{resource:o,mutationId:n}of t)this.store.undoMutation(o,n);throw s}}emitUndoEvents(e){var t;for(let{resource:i,mutationId:s,resourceId:o}of e){let n=((t=this.store.optimisticMutationStack[i])==null?void 0:t.length)??0;this.emitEvent({type:"OPTIMISTIC_MUTATION_UNDONE",mutationId:s,resource:i,resourceId:o,pendingMutations:n});}}genericQuery(e,t,i){if(!this.ws||!this.ws.connected())throw new Error("WebSocket not connected");let s={id:b$1(),type:"CUSTOM_QUERY",resource:e,procedure:t,input:i};return this.sendWsMessage(s),new Promise((o,n)=>{this.replyHandlers[s.id]={timeoutHandle:setTimeout(()=>{delete this.replyHandlers[s.id],n(new Error("Reply timeout"));},5e3),handler:r=>{delete this.replyHandlers[s.id],o(r);},reject:n};})}addEventListener(e){return this.eventListeners.add(e),()=>{this.eventListeners.delete(e);}}replayCustomMutationStack(){var e;if((e=this.ws)!=null&&e.connected())for(let t of this.store.customMutationStack)this.sendWsMessage(t),!this.replyHandlers[t.id]&&(this.replyHandlers[t.id]={timeoutHandle:setTimeout(()=>{delete this.replyHandlers[t.id],this.emitUndoEvents(this.store.undoCustomMutation(t.id));},5e3),handler:()=>{delete this.replyHandlers[t.id],this.store.confirmCustomMutation(t.id);}});}sendWsMessage(e){var t;(t=this.ws)!=null&&t.connected()&&this.ws.send(JSON.stringify(e));}emitEvent(e){this.eventListeners.forEach(t=>{t(e);});}},et=d$1=>{let e=new N(d$1),t=(i,s)=>new Proxy(s,{get(o,n,r){if(n in o)return Reflect.get(o,n,r);if(typeof n=="string")return a=>new L(e,{resource:i,procedure:n,input:a})}});return {client:{ws:e.ws,load:i=>e.load(i),addEventListener:i=>e.addEventListener(i)},store:{query:new Proxy({},{get(i,s){if(typeof s=="string")return Object.hasOwn(d$1.schema,s)?t(s,a._init(d$1.schema[s],e)):new Proxy({},{get(o,n){if(typeof n=="string")return r=>new L(e,{resource:s,procedure:n,input:r})}})},has(i,s){return typeof s=="string"}}),mutate:d(()=>{},{apply:(i,s,o)=>{if(s.length<2)return;if(s.length>2)throw new Error("Trying to access an invalid path");let[n,r]=s;if(r==="insert"){let{id:a,...c}=o[0];return e.mutate(n,a,"INSERT",c)}if(r==="update"){let[a,c]=o;return e.mutate(n,a,"UPDATE",c)}return e.genericMutate(n,r,o[0])}})}}};export{et as createClient,Ee as useLiveQuery,Oe as useLoadData};
|
package/dist/fetch-client.d.ts
CHANGED
|
@@ -705,6 +705,7 @@ declare const defaultMutationMsgSchema: z.ZodObject<{
|
|
|
705
705
|
}, z.core.$strip>>;
|
|
706
706
|
meta: z.ZodOptional<z.ZodObject<{
|
|
707
707
|
timestamp: z.ZodOptional<z.ZodString>;
|
|
708
|
+
originMutationId: z.ZodOptional<z.ZodString>;
|
|
708
709
|
}, z.core.$strip>>;
|
|
709
710
|
id: z.ZodString;
|
|
710
711
|
}, z.core.$strip>;
|
|
@@ -719,6 +720,7 @@ declare const mutationMsgSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
|
719
720
|
payload: z.ZodOptional<z.ZodAny>;
|
|
720
721
|
meta: z.ZodOptional<z.ZodObject<{
|
|
721
722
|
timestamp: z.ZodOptional<z.ZodString>;
|
|
723
|
+
originMutationId: z.ZodOptional<z.ZodString>;
|
|
722
724
|
}, z.core.$strip>>;
|
|
723
725
|
id: z.ZodString;
|
|
724
726
|
}, z.core.$strip>, z.ZodObject<{
|
|
@@ -737,6 +739,7 @@ declare const mutationMsgSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
|
737
739
|
}, z.core.$strip>>;
|
|
738
740
|
meta: z.ZodOptional<z.ZodObject<{
|
|
739
741
|
timestamp: z.ZodOptional<z.ZodString>;
|
|
742
|
+
originMutationId: z.ZodOptional<z.ZodString>;
|
|
740
743
|
}, z.core.$strip>>;
|
|
741
744
|
id: z.ZodString;
|
|
742
745
|
}, z.core.$strip>]>;
|
|
@@ -766,6 +769,7 @@ declare const serverMessageSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
|
766
769
|
}, z.core.$strip>>;
|
|
767
770
|
meta: z.ZodOptional<z.ZodObject<{
|
|
768
771
|
timestamp: z.ZodOptional<z.ZodString>;
|
|
772
|
+
originMutationId: z.ZodOptional<z.ZodString>;
|
|
769
773
|
}, z.core.$strip>>;
|
|
770
774
|
id: z.ZodString;
|
|
771
775
|
}, z.core.$strip>]>;
|
|
@@ -1010,7 +1014,7 @@ type ClientOptions<TSchema extends Schema<any> = Schema<any>> = {
|
|
|
1010
1014
|
name: string;
|
|
1011
1015
|
} | false;
|
|
1012
1016
|
logLevel?: LogLevel;
|
|
1013
|
-
optimisticMutations?: OptimisticMutationsRegistry<
|
|
1017
|
+
optimisticMutations?: OptimisticMutationsRegistry<any>;
|
|
1014
1018
|
};
|
|
1015
1019
|
|
|
1016
1020
|
export { createClient as A, type ClientOptions as C, type DataLoadRequestedEvent as D, type MessageReceivedEvent as M, type OptimisticMutationsConfig as O, type QueryExecutedEvent as Q, type SubscriptionCreatedEvent as S, type ClientRouterConstraint as a, type Client$1 as b, type OptimisticMutationsRegistry as c, defineOptimisticMutations as d, type OptimisticHandlerContext as e, type OptimisticStorageProxy as f, type OptimisticOperation as g, type OptimisticInsertOperation as h, type OptimisticUpdateOperation as i, type OptimisticMutationHandler as j, createOptimisticStorageProxy as k, useLoadData as l, type ConnectionStateChangeEvent as m, type ClientStorageLoadedEvent as n, type DataLoadReplyEvent as o, type MutationSentEvent as p, type MutationReceivedEvent as q, type MutationRejectedEvent as r, type SubscriptionRemovedEvent as s, type QuerySubscriptionTriggeredEvent as t, useLiveQuery as u, type StoreStateUpdatedEvent as v, type OptimisticMutationAppliedEvent as w, type OptimisticMutationUndoneEvent as x, type ClientEvents as y, type Client as z };
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { e as OptimisticHandlerContext, h as OptimisticInsertOperation, j as OptimisticMutationHandler, O as OptimisticMutationsConfig, c as OptimisticMutationsRegistry, g as OptimisticOperation, f as OptimisticStorageProxy, i as OptimisticUpdateOperation, k as createOptimisticStorageProxy, d as defineOptimisticMutations } from './index-
|
|
1
|
+
export { e as OptimisticHandlerContext, h as OptimisticInsertOperation, j as OptimisticMutationHandler, O as OptimisticMutationsConfig, c as OptimisticMutationsRegistry, g as OptimisticOperation, f as OptimisticStorageProxy, i as OptimisticUpdateOperation, k as createOptimisticStorageProxy, d as defineOptimisticMutations } from './index-LV6LHPwh.js';
|
|
2
2
|
import '@standard-schema/spec';
|
|
3
3
|
import 'zod';
|
package/dist/server.cjs
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
'use strict';var ie=require('crypto'),jsXxhash=require('js-xxhash'),Jt=require('qs'),zod=require('zod'),kysely=require('kysely'),mysql=require('kysely/helpers/mysql'),postgres=require('kysely/helpers/postgres'),sqlite=require('kysely/helpers/sqlite');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var ie__default=/*#__PURE__*/_interopDefault(ie);var Jt__default=/*#__PURE__*/_interopDefault(Jt);var yt=Object.create;var Qe=Object.defineProperty;var pt=Object.getOwnPropertyDescriptor;var mt=Object.getOwnPropertyNames;var ft=Object.getPrototypeOf,ht=Object.prototype.hasOwnProperty;var Tt=(i,e)=>()=>(e||i((e={exports:{}}).exports,e),e.exports);var gt=(i,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of mt(e))!ht.call(i,r)&&r!==t&&Qe(i,r,{get:()=>e[r],enumerable:!(n=pt(e,r))||n.enumerable});return i};var $e=(i,e,t)=>(t=i!=null?yt(ft(i)):{},gt(Qe(t,"default",{value:i,enumerable:true}),i));var Se=Tt(le=>{Object.defineProperty(le,"__esModule",{value:true});le.parse=Bt;le.serialize=zt;var Qt=/^[\u0021-\u003A\u003C\u003E-\u007E]+$/,$t=/^[\u0021-\u003A\u003C-\u007E]*$/,Dt=/^([.]?[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)([.][a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)*$/i,Ft=/^[\u0020-\u003A\u003D-\u007E]*$/,_t=Object.prototype.toString,kt=(()=>{let i=function(){};return i.prototype=Object.create(null),i})();function Bt(i,e){let t=new kt,n=i.length;if(n<2)return t;let r=(e==null?void 0:e.decode)||Kt,o=0;do{let u=i.indexOf("=",o);if(u===-1)break;let s=i.indexOf(";",o),a=s===-1?n:s;if(u>a){o=i.lastIndexOf(";",u-1)+1;continue}let c=ze(i,o,u),d=Ke(i,u,c),l=i.slice(c,d);if(t[l]===void 0){let p=ze(i,u+1,a),y=Ke(i,a,p),f=r(i.slice(p,y));t[l]=f;}o=a+1;}while(o<n);return t}function ze(i,e,t){do{let n=i.charCodeAt(e);if(n!==32&&n!==9)return e}while(++e<t);return t}function Ke(i,e,t){for(;e>t;){let n=i.charCodeAt(--e);if(n!==32&&n!==9)return e+1}return t}function zt(i,e,t){let n=(t==null?void 0:t.encode)||encodeURIComponent;if(!Qt.test(i))throw new TypeError(`argument name is invalid: ${i}`);let r=n(e);if(!$t.test(r))throw new TypeError(`argument val is invalid: ${e}`);let o=i+"="+r;if(!t)return o;if(t.maxAge!==void 0){if(!Number.isInteger(t.maxAge))throw new TypeError(`option maxAge is invalid: ${t.maxAge}`);o+="; Max-Age="+t.maxAge;}if(t.domain){if(!Dt.test(t.domain))throw new TypeError(`option domain is invalid: ${t.domain}`);o+="; Domain="+t.domain;}if(t.path){if(!Ft.test(t.path))throw new TypeError(`option path is invalid: ${t.path}`);o+="; Path="+t.path;}if(t.expires){if(!Ut(t.expires)||!Number.isFinite(t.expires.valueOf()))throw new TypeError(`option expires is invalid: ${t.expires}`);o+="; Expires="+t.expires.toUTCString();}if(t.httpOnly&&(o+="; HttpOnly"),t.secure&&(o+="; Secure"),t.partitioned&&(o+="; Partitioned"),t.priority)switch(typeof t.priority=="string"?t.priority.toLowerCase():void 0){case "low":o+="; Priority=Low";break;case "medium":o+="; Priority=Medium";break;case "high":o+="; Priority=High";break;default:throw new TypeError(`option priority is invalid: ${t.priority}`)}if(t.sameSite)switch(typeof t.sameSite=="string"?t.sameSite.toLowerCase():t.sameSite){case true:case "strict":o+="; SameSite=Strict";break;case "lax":o+="; SameSite=Lax";break;case "none":o+="; SameSite=None";break;default:throw new TypeError(`option sameSite is invalid: ${t.sameSite}`)}return o}function Kt(i){if(i.indexOf("%")===-1)return i;try{return decodeURIComponent(i)}catch{return i}}function Ut(i){return _t.call(i)==="[object Date]"}});var Te=i=>typeof i=="object"&&i!==null&&"value"in i&&!Array.isArray(i),w=i=>i?Array.isArray(i.value)?i.value.map(t=>Te(t)?w(t):t):typeof i.value!="object"||i.value===null||i.value instanceof Date?i.value:Object.fromEntries(Object.entries(i.value).map(([t,n])=>Array.isArray(n)?[t,n.map(r=>Te(r)?w(r):r)]:Te(n)?[t,w(n)]:[t,n])):void 0;var Fe="0123456789ABCDEFGHJKMNPQRSTVWXYZ",W=32;var At=16,_e=10,De=0xffffffffffff;var D;(function(i){i.Base32IncorrectEncoding="B32_ENC_INVALID",i.DecodeTimeInvalidCharacter="DEC_TIME_CHAR",i.DecodeTimeValueMalformed="DEC_TIME_MALFORMED",i.EncodeTimeNegative="ENC_TIME_NEG",i.EncodeTimeSizeExceeded="ENC_TIME_SIZE_EXCEED",i.EncodeTimeValueMalformed="ENC_TIME_MALFORMED",i.PRNGDetectFailure="PRNG_DETECT",i.ULIDInvalid="ULID_INVALID",i.Unexpected="UNEXPECTED",i.UUIDInvalid="UUID_INVALID";})(D||(D={}));var F=class extends Error{constructor(e,t){super(`${t} (${e})`),this.name="ULIDError",this.code=e;}};function jt(i){let e=Math.floor(i()*W);return e===W&&(e=W-1),Fe.charAt(e)}function Et(i){var n;let e=Ot(),t=e&&(e.crypto||e.msCrypto)||(typeof ie__default.default<"u"?ie__default.default:null);if(typeof(t==null?void 0:t.getRandomValues)=="function")return ()=>{let r=new Uint8Array(1);return t.getRandomValues(r),r[0]/255};if(typeof(t==null?void 0:t.randomBytes)=="function")return ()=>t.randomBytes(1).readUInt8()/255;if((n=ie__default.default)!=null&&n.randomBytes)return ()=>ie__default.default.randomBytes(1).readUInt8()/255;throw new F(D.PRNGDetectFailure,"Failed to find a reliable PRNG")}function Ot(){return Nt()?self:typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:null}function Pt(i,e){let t="";for(;i>0;i--)t=jt(e)+t;return t}function Vt(i,e=_e){if(isNaN(i))throw new F(D.EncodeTimeValueMalformed,`Time must be a number: ${i}`);if(i>De)throw new F(D.EncodeTimeSizeExceeded,`Cannot encode a time larger than ${De}: ${i}`);if(i<0)throw new F(D.EncodeTimeNegative,`Time must be positive: ${i}`);if(Number.isInteger(i)===false)throw new F(D.EncodeTimeValueMalformed,`Time must be an integer: ${i}`);let t,n="";for(let r=e;r>0;r--)t=i%W,n=Fe.charAt(t)+n,i=(i-t)/W;return n}function Nt(){return typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope}function ke(i,e){let t=Et(),n=Date.now();return Vt(n,_e)+Pt(At,t)}var se=()=>ke().toLowerCase(),ae=i=>({then(e,t){try{if(e){let n=e(i);return n instanceof Promise?n:ae(n)}return ae(i)}catch(n){if(t){let r=t(n);return r instanceof Promise?r:ae(r)}throw n}}}),ge=i=>i instanceof Promise?i:ae(i);var K=(...i)=>{let e=i.filter(t=>!!t);return e.length===0?{}:e.length===1?e[0]:{$and:e}};var oe=class{storage;queue=new Map;scheduled=false;constructor(e){this.storage=e;}async rawFind({resource:e,commonWhere:t,uniqueWhere:n,...r}){return new Promise((o,u)=>{let s=this.getBatchKey({resource:e,commonWhere:t,...r}),a={resource:e,commonWhere:t,uniqueWhere:n,...r,resolve:o,reject:u};this.queue.has(s)||this.queue.set(s,[]);let c=this.queue.get(s);c&&c.push(a),this.scheduled||(this.scheduled=true,setImmediate(()=>{this.processBatch();}));})}getBatchKey(e){let{resource:t,commonWhere:n,...r}=e;return `${t}:${JSON.stringify(n??{})}:${JSON.stringify(r??{})}`}async processBatch(){this.scheduled=false;let e=Array.from(this.queue.entries());this.queue.clear();for(let[,t]of e)try{await this.executeBatchedRequests(t);}catch(n){t.forEach(r=>{r.reject(n);});}}async executeBatchedRequests(e){var p;if(e.length===0)return;let t=e[0],{resource:n,commonWhere:r,include:o,sort:u}=t,s=e.length===1?t.limit:void 0,a=e.map(y=>y.uniqueWhere).filter(y=>y!==void 0),c=r,d=(p=Object.entries(a[0]??{})[0])==null?void 0:p[0];if(a.length>0){let y=a.map(f=>f[d]).filter(f=>f!=null);y.length>0&&(c=K(r,{[d]:{$in:y}}));}let l=await this.storage.get({resource:n,where:c,include:o,sort:u,limit:s});for(let y of e){let f=l;if(y.uniqueWhere){let[m,h]=Object.entries(y.uniqueWhere)[0];f=l.filter(g=>{var T;return ((T=g.value[m])==null?void 0:T.value)===h});}y.resolve(f);}}};var N=i=>jsXxhash.xxHash32(JSON.stringify(i)).toString(32),_=(i,e,t)=>{let n={},r=t[e];if(!r)return n;let o=u=>{u.$and?u.$and.forEach(o):u.$or?u.$or.forEach(o):Object.entries(u).forEach(([s,a])=>{var c;if((c=r.relations)!=null&&c[s]&&(n[s]=true,typeof a=="object"&&a!==null&&!Array.isArray(a))){let d=_(a,r.relations[s].entity.name,t);Object.keys(d).length>0&&(n[s]={include:d});}});};return o(i),n},A=(i,e,t=false)=>Object.entries(e).every(([n,r])=>{if(n==="$and")return r.every(u=>A(i,u,t));if(n==="$or")return r.some(u=>A(i,u,t));let o=(r==null?void 0:r.$eq)!==void 0?r==null?void 0:r.$eq:r;if(typeof r=="object"&&r!==null&&(r==null?void 0:r.$eq)===void 0){if(r.$in!==void 0){let s=i[n];return s===void 0?false:t?!r.$in.includes(s):r.$in.includes(s)}if(r.$not!==void 0&&!t)return A(i,{[n]:r.$not},true);if(r.$gt!==void 0){let s=i[n];return typeof s!="number"?false:t?s<=r.$gt:s>r.$gt}if(r.$gte!==void 0){let s=i[n];return typeof s!="number"?false:t?s<r.$gte:s>=r.$gte}if(r.$lt!==void 0){let s=i[n];return typeof s!="number"?false:t?s>=r.$lt:s<r.$lt}if(r.$lte!==void 0){let s=i[n];return typeof s!="number"?false:t?s>r.$lte:s<=r.$lte}let u=i[n];return !u||typeof u!="object"&&!Array.isArray(u)?false:Array.isArray(u)?t?!u.some(s=>A(s,r,false)):u.some(s=>A(s,r,false)):A(u,r,t)}return t?i[n]!==o:i[n]===o}),ue=i=>{if(typeof i!="object"||i===null)return false;let e=i;return "where"in e||"limit"in e||"orderBy"in e||"include"in e},Q={CRITICAL:0,ERROR:1,WARN:2,INFO:3,DEBUG:4},Re=class{level;prefix;constructor(e={}){this.level=e.level??Q.INFO,this.prefix=e.prefix?`[${e.prefix}] `:"";}critical(...e){this.level>=Q.CRITICAL&&console.error(`${this.prefix}[CRITICAL]`,...e);}error(...e){this.level>=Q.ERROR&&console.error(`${this.prefix}[ERROR]`,...e);}warn(...e){this.level>=Q.WARN&&console.warn(`${this.prefix}[WARN]`,...e);}info(...e){this.level>=Q.INFO&&console.log(`${this.prefix}[INFO]`,...e);}debug(...e){this.level>=Q.DEBUG&&console.log(`${this.prefix}[DEBUG]`,...e);}setLevel(e){this.level=e;}getLevel(){return this.level}},Be=i=>new Re(i);function be(i){return N({resource:i.query.resource,where:i.query.where,include:i.query.include,stepPath:i.stepPath,isMany:i.isMany,relationName:i.relationName})}var ce=class{router;storage;schema;logger;queryNodes=new Map;objectNodes=new Map;constructor(e){this.router=e.router,this.storage=e.storage,this.schema=e.schema,this.logger=e.logger;}getRelationalColumns(e){let t=new Map,n=this.schema[e];if(!(n!=null&&n.relations))return t;for(let[r,o]of Object.entries(n.relations))o.type==="one"&&o.relationalColumn&&t.set(String(o.relationalColumn),{relationName:r,targetResource:o.entity.name});return t}ensureObjectNode(e,t,n){let r=this.objectNodes.get(e);return r?n&&r.matchedQueries.add(n):(r={id:e,type:t,matchedQueries:new Set(n?[n]:[]),referencesObjects:new Map,referencedByObjects:new Map},this.objectNodes.set(e,r)),r}storeRelation(e,t,n,r){let o=this.objectNodes.get(e),u=this.objectNodes.get(t);if(o&&o.referencesObjects.set(n,t),u&&r){let s=u.referencedByObjects.get(r);s||(s=new Set,u.referencedByObjects.set(r,s)),s.add(e);}}removeRelation(e,t,n,r){let o=this.objectNodes.get(e),u=this.objectNodes.get(t);if(o&&o.referencesObjects.delete(n),u&&r){let s=u.referencedByObjects.get(r);s&&(s.delete(e),s.size===0&&u.referencedByObjects.delete(r));}}getInverseRelationName(e,t,n){let r=this.schema[e];if(!(r!=null&&r.relations))return;let o=r.relations[n];if(!o)return;let u=this.schema[t];if(u!=null&&u.relations){if(o.type==="many"&&o.foreignColumn){for(let[s,a]of Object.entries(u.relations))if(a.entity.name===e&&a.type==="one"&&a.relationalColumn===o.foreignColumn)return s}if(o.type==="one"&&o.relationalColumn){for(let[s,a]of Object.entries(u.relations))if(a.entity.name===e&&a.type==="many"&&a.foreignColumn===o.relationalColumn)return s}}}updateRelationsFromMutation(e,t,n,r){let o=this.getRelationalColumns(e),u=this.objectNodes.get(t);if(u)for(let[s,{relationName:a,targetResource:c}]of Array.from(o)){if(!(r&&s in r))continue;let l=this.getInverseRelationName(e,c,a),p=u.referencesObjects.get(a),y=n[s];p!==y&&(p&&this.removeRelation(t,p,a,l),y&&(this.ensureObjectNode(y,c),this.storeRelation(t,y,a,l)));}}get(e,t){let n=this.breakdownQuery({query:e,context:(t==null?void 0:t.context)??{}});return this.resolveQuery(n,{context:(t==null?void 0:t.context)??{},batcher:(t==null?void 0:t.batcher)??new oe(this.storage)})}subscribe(e,t,n={}){let r=this.breakdownQuery({query:e,context:n}),o={},u=[];for(let s of r){this.logger.debug("[QueryEngine] Subscribing to step",s.stepPath.join("."));let a=be(s),c=o[s.stepPath.at(-2)??""],d=s.stepPath.at(-1)??"",l=this.queryNodes.get(a);if(l)l.subscriptions.add(t);else if(l={hash:a,queryStep:s,relationName:d,trackedObjects:new Set,subscriptions:new Set([t]),parentQuery:c,childQueries:new Set},this.queryNodes.set(l.hash,l),c){let p=this.queryNodes.get(c);p&&p.childQueries.add(l.hash);}o[d]=a,u.push(()=>{let p=this.queryNodes.get(a);p&&(p.subscriptions.delete(t),p.subscriptions.size===0&&this.queryNodes.delete(a));});}return ()=>{for(let s of u)s();}}breakdownQuery(e){var h;let{query:t,stepPath:n=[],context:r={},parentResource:o}=e,{include:u}=t,s=n.length===0,a=n.at(-1),c,d,l;if(!s&&o&&a){let g=this.schema[o],T=(h=g==null?void 0:g.relations)==null?void 0:h[a];T&&(l=T.type==="many",T.type==="one"?(c=R=>({id:R}),d=R=>R.map(b=>{var S,v;return (v=(S=b.value)==null?void 0:S[T.relationalColumn])==null?void 0:v.value}).filter(b=>b!==void 0)):(c=R=>({[T.foreignColumn]:R}),d=R=>R.map(b=>{var S,v;return (v=(S=b.value)==null?void 0:S.id)==null?void 0:v.value}).filter(b=>b!==void 0)));}let{include:p,...y}=t,m=[this.router.incrementQueryStep({query:y,stepPath:[...n],getWhere:c,referenceGetter:d,isMany:l,relationName:a},r)];if(u&&typeof u=="object"&&Object.keys(u).length>0){let g=this.schema[t.resource];if(!g)throw new Error(`Resource ${t.resource} not found`);m.push(...Object.entries(u).flatMap(([T,R])=>{let b=g.relations[T];if(!b)throw new Error(`Relation ${T} not found for resource ${t.resource}`);let S=b.entity.name,v=ue(R)?R:null;return this.breakdownQuery({query:{resource:S,include:v?v.include:typeof R=="object"?R:void 0,where:v==null?void 0:v.where,limit:v==null?void 0:v.limit,sort:v==null?void 0:v.orderBy},stepPath:[...n,T],context:r,parentResource:t.resource})}));}return m}resolveQuery(e,t){this.logger.debug("[QueryEngine] Resolving query",e.map(o=>o.stepPath.join(".")).join(" -> "));let n={},r=this.resolveStep(e[0],t).then(o=>{this.logger.debug("[QueryEngine] Resolved step",e[0].stepPath.join("."),"with results count:",o.length),n[e[0].stepPath.join(".")]=[{data:o}];});for(let o=1;o<e.length;o++){let u=e[o],s=u.stepPath.slice(0,-1).join(".");r=r.then(async()=>{var c,d;let a=n[s];if(!a){n[u.stepPath.join(".")]=[];return}if(u.referenceGetter&&u.getWhere){let l=new Map;for(let f of a)for(let m of f.data){let h=(d=(c=m==null?void 0:m.value)==null?void 0:c.id)==null?void 0:d.value;if(!h)continue;let T=u.referenceGetter([m])[0];if(T){l.has(T)||l.set(T,new Set);let R=l.get(T);R&&R.add(h);}}let p=Array.from(l.keys());if(p.length===0){n[u.stepPath.join(".")]=[];return}let y=[];for(let f of p){let m=u.getWhere(f),h={...u,relationalWhere:m},g=await this.resolveStep(h,t),T=l.get(f);if(T)for(let R of Array.from(T))y.push({includedBy:R,data:g});}this.logger.debug("[QueryEngine] Resolved step",u.stepPath.join("."),"with results count:",y.reduce((f,m)=>f+m.data.length,0)),n[u.stepPath.join(".")]=y;}else {let l=await this.resolveStep(u,t);n[u.stepPath.join(".")]=[{data:l}];}});}return r=r.then((()=>(this.logger.debug("[QueryEngine] Assembling results"),this.assembleResults(e,n)))),r}assembleResults(e,t){var u,s,a,c,d;this.logger.debug("[QueryEngine] assembleResults: Starting assembly"),this.logger.debug("[QueryEngine] assembleResults: Plan steps:",e.length),this.logger.debug("[QueryEngine] assembleResults: Step results keys:",Object.keys(t));let n=new Map;for(let l of e){let p=l.stepPath.join("."),y=t[p]??[],f=Object.keys(l.query.include??{});this.logger.debug(`[QueryEngine] assembleResults: Processing step "${p}"`,{resource:l.query.resource,includedRelations:f,resultGroups:y.length,isMany:l.isMany,relationName:l.relationName});for(let m of y){this.logger.debug(`[QueryEngine] assembleResults: Processing result group for "${p}"`,{dataCount:m.data.length,includedBy:m.includedBy});for(let h of m.data){let g=(s=(u=h==null?void 0:h.value)==null?void 0:u.id)==null?void 0:s.value;if(!g){this.logger.debug(`[QueryEngine] assembleResults: Skipping data without id in step "${p}"`);continue}let T=p?`${p}.${g}`:g,R=[];if(l.stepPath.length>0&&m.includedBy){let S=l.stepPath.slice(0,-1).join(".");R=[S?`${S}.${m.includedBy}`:m.includedBy],this.logger.debug(`[QueryEngine] assembleResults: Child entity "${T}" has parent keys:`,R,{stepPath:p,parentStepPath:S,includedBy:m.includedBy});}else this.logger.debug(`[QueryEngine] assembleResults: Root entity "${T}" (no parent)`);let b=n.get(T);if(b){this.logger.debug(`[QueryEngine] assembleResults: Entity "${T}" already exists, adding parent keys:`,R);for(let S of R)b.includedBy.add(S);}else this.logger.debug(`[QueryEngine] assembleResults: Adding new entity "${T}"`,{resource:l.query.resource,path:l.stepPath.at(-1)??"",isMany:l.isMany??false,relationName:l.relationName,includedRelations:f,parentKeys:R}),n.set(T,{data:h,includedBy:new Set(R),path:l.stepPath.at(-1)??"",isMany:l.isMany??false,relationName:l.relationName,resourceName:l.query.resource,includedRelations:f});}}}this.logger.debug(`[QueryEngine] assembleResults: Built entriesMap with ${n.size} entries`),this.logger.debug("[QueryEngine] assembleResults: EntriesMap keys:",Array.from(n.keys()));let r=Array.from(n.entries()),o=[];this.logger.debug(`[QueryEngine] assembleResults: Starting assembly phase with ${r.length} entries`);for(let l=r.length-1;l>=0;l--){let[p,y]=r[l],f=this.schema[y.resourceName];this.logger.debug(`[QueryEngine] assembleResults: Processing entry "${p}"`,{resource:y.resourceName,path:y.path,isMany:y.isMany,relationName:y.relationName,includedRelations:y.includedRelations,parentKeys:Array.from(y.includedBy)});for(let m of y.includedRelations){let h=(c=(a=f==null?void 0:f.relations)==null?void 0:a[m])==null?void 0:c.type,g=!!y.data.value[m];if(this.logger.debug(`[QueryEngine] assembleResults: Checking included relation "${m}" for "${p}"`,{relationType:h,hasRelation:g,resourceHasRelation:!!((d=f==null?void 0:f.relations)!=null&&d[m])}),y.data.value[m])this.logger.debug(`[QueryEngine] assembleResults: Relation "${m}" already exists for "${p}"`,y.data.value[m]);else {let T=h==="many"?{value:[]}:{value:null};y.data.value[m]=T,this.logger.debug(`[QueryEngine] assembleResults: Initialized relation "${m}" for "${p}" with`,T);}}if(y.path===""){this.logger.debug(`[QueryEngine] assembleResults: Adding root entity "${p}" to resultData`),o.unshift(y.data);continue}this.logger.debug(`[QueryEngine] assembleResults: Attaching "${p}" to ${y.includedBy.size} parent(s)`);for(let m of Array.from(y.includedBy)){let h=n.get(m);if(!h){this.logger.warn(`[QueryEngine] assembleResults: WARNING - Parent "${m}" not found in entriesMap for child "${p}"`);continue}let g=y.relationName??y.path;this.logger.debug(`[QueryEngine] assembleResults: Attaching "${p}" to parent "${m}" via relation "${g}"`,{isMany:y.isMany,parentHasRelation:!!h.data.value[g]}),y.isMany?(h.data.value[g]??={value:[]},h.data.value[g].value.push(y.data),this.logger.debug(`[QueryEngine] assembleResults: Added "${p}" to many relation "${g}" on parent "${m}"`,{arrayLength:h.data.value[g].value.length})):(h.data.value[g]=y.data,this.logger.debug(`[QueryEngine] assembleResults: Set one relation "${g}" on parent "${m}" to "${p}"`));}}return this.logger.debug(`[QueryEngine] assembleResults: Assembly complete. Returning ${o.length} root items`),o}resolveStep(e,t){this.logger.debug("[QueryEngine] Resolving step",e.stepPath.join("."),"with query",JSON.stringify(e.query,null,2),"relationalWhere",JSON.stringify(e.relationalWhere,null,2));let{query:n,relationalWhere:r}=e,o=n.where&&r?K(n.where,r):r??n.where,u=o?{...n,where:o}:n;return ge(this.router.get(u,t)).then(s=>(this.loadStepResults(e,s),s))}loadStepResults(e,t){this.logger.debug("[QueryEngine] Loading step results",e.stepPath.join("."),"with results",JSON.stringify(t,null,2));let n=be(e),r=this.queryNodes.get(n),o=e.query.resource;if(!r)return;let u=this.getRelationalColumns(o);for(let s of t){let a=w(s),c=a.id;this.ensureObjectNode(c,o,n),r.trackedObjects.add(c);for(let[d,{relationName:l,targetResource:p}]of Array.from(u)){let y=a[d];if(y){this.ensureObjectNode(y,p);let f=this.getInverseRelationName(o,p,l);this.storeRelation(c,y,l,f);}}this.loadNestedRelations(o,c,a),this.logger.debug("[QueryEngine] Loaded nested relations for",c);}}loadNestedRelations(e,t,n){let r=this.schema[e];if(r!=null&&r.relations)for(let[o,u]of Object.entries(r.relations)){let s=n[o];if(!s)continue;let a=u.entity.name,c=this.getInverseRelationName(e,a,o);if(u.type==="one")s&&typeof s=="object"&&s.id&&(this.ensureObjectNode(s.id,a),this.storeRelation(t,s.id,o,c),this.loadNestedRelations(a,s.id,s));else if(u.type==="many"&&Array.isArray(s)){for(let d of s)if(d&&typeof d=="object"&&d.id){this.ensureObjectNode(d.id,a);let l=this.getInverseRelationName(a,e,o);l&&this.storeRelation(d.id,t,l,o),this.loadNestedRelations(a,d.id,d);}}}}buildIncludeFromChildQueries(e){let t=this.queryNodes.get(e);if(!t||t.childQueries.size===0)return {};let n={};for(let r of Array.from(t.childQueries)){let o=this.queryNodes.get(r);if(!o||!o.relationName)continue;let u=this.buildIncludeFromChildQueries(r);n[o.relationName]=Object.keys(u).length>0?u:true;}return n}sendInsertsForTree(e,t,n){var s,a;let r=(a=(s=t==null?void 0:t.value)==null?void 0:s.id)==null?void 0:a.value;if(!r)return;let o={procedure:"INSERT",resource:n,resourceId:r,type:"MUTATE",payload:t.value};for(let c of Array.from(e.subscriptions))try{c(o);}catch(d){this.logger.error("[QueryEngine] Error in subscription callback during sendInsertsForTree",{error:d,queryHash:e.hash,resource:n,resourceId:r,stepPath:e.queryStep.stepPath.join(".")});}e.trackedObjects.add(r),this.ensureObjectNode(r,n,e.hash).matchedQueries.add(e.hash);for(let c of Array.from(e.childQueries)){let d=this.queryNodes.get(c);if(!d||!d.relationName)continue;let l=d.relationName,p=d.queryStep.query.resource,y=t.value[l];if(!y)continue;let f=y.value;if(Array.isArray(f))for(let m of f)this.sendInsertsForTree(d,m,p);else f&&typeof f=="object"&&this.sendInsertsForTree(d,f,p);}}handleMutation(e,t){if(e.procedure==="INSERT"){if(this.objectNodes.has(e.resourceId))return;let n=w(t);if(!n)return;let r={id:e.resourceId,type:e.resource,matchedQueries:new Set,referencesObjects:new Map,referencedByObjects:new Map};this.objectNodes.set(e.resourceId,r);let o=this.getRelationalColumns(e.resource);for(let[s,{relationName:a,targetResource:c}]of Array.from(o)){let d=n[s];if(d){this.ensureObjectNode(d,c);let l=this.getInverseRelationName(e.resource,c,a);this.storeRelation(e.resourceId,d,a,l);}}let u=this.objectNodes.get(e.resourceId);this.getMatchingQueries(e,n).then(s=>{for(let a of s){let c=this.queryNodes.get(a);if(c){c.trackedObjects.add(e.resourceId),u&&u.matchedQueries.add(a);for(let d of Array.from(c.subscriptions))try{d(e);}catch(l){this.logger.error("[QueryEngine] Error in subscription callback during INSERT mutation",{error:l,queryHash:c.hash,resource:e.resource,resourceId:e.resourceId,stepPath:c.queryStep.stepPath.join(".")});}}}});return}if(e.procedure==="UPDATE"){let n=w(t);if(!n)return;let r=this.objectNodes.get(e.resourceId),o=new Set((r==null?void 0:r.matchedQueries)??[]);r||(r={id:e.resourceId,type:e.resource,matchedQueries:new Set,referencesObjects:new Map,referencedByObjects:new Map},this.objectNodes.set(e.resourceId,r)),this.updateRelationsFromMutation(e.resource,e.resourceId,n,e.payload),this.getMatchingQueries(e,n).then(u=>{let s=new Set(u),a=[],c=[],d=[];for(let p of u)o.has(p)?d.push(p):a.push(p);for(let p of Array.from(o))s.has(p)||c.push(p);for(let p of a){let y=this.queryNodes.get(p);y&&y.trackedObjects.add(e.resourceId);}for(let p of c){let y=this.queryNodes.get(p);y&&y.trackedObjects.delete(e.resourceId);}let l=this.objectNodes.get(e.resourceId);if(l){for(let p of a)l.matchedQueries.add(p);for(let p of c)l.matchedQueries.delete(p);}for(let p of [...c,...d]){let y=this.queryNodes.get(p);if(y)for(let f of Array.from(y.subscriptions))try{f(e);}catch(m){this.logger.error("[QueryEngine] Error in subscription callback during UPDATE mutation",{error:m,queryHash:y.hash,resource:e.resource,resourceId:e.resourceId,stepPath:y.queryStep.stepPath.join(".")});}}if(a.length>0)for(let p of a){let y=this.queryNodes.get(p);if(!y)continue;let f=this.buildIncludeFromChildQueries(p);this.get({resource:e.resource,where:{id:e.resourceId},include:Object.keys(f).length>0?f:void 0}).then(m=>{!m||m.length===0||this.sendInsertsForTree(y,m[0],e.resource);});}});return}}getMatchingQueries(e,t){let n=[];for(let r of Array.from(this.queryNodes.values()))r.queryStep.query.resource===e.resource&&n.push(r);return n.length===0?ge([]):Promise.all(n.map(async r=>{let o=r.queryStep.query.where,u=r.queryStep.query.resource,s=e.resourceId,a=this.objectNodes.get(s);if(!a)return {hash:r.hash,matches:false};if(r.relationName){let y=r.parentQuery?this.queryNodes.get(r.parentQuery):void 0,f=y==null?void 0:y.queryStep.query.resource,m=f?this.getInverseRelationName(f,u,r.relationName):void 0,h=m?a.referencesObjects.get(m):void 0;if(!h)return {hash:r.hash,matches:false};let g=this.objectNodes.get(h);return !g||!y||!g.matchedQueries.has(y.hash)?{hash:r.hash,matches:false}:{hash:r.hash,matches:true}}if(!o)return {hash:r.hash,matches:true};let c=_(o,u,this.schema),d=Object.keys(c).length>0;if(!d&&t!==void 0)return {hash:r.hash,matches:A(t,o)};let l=await this.storage.get({resource:u,where:{id:s},include:d?c:void 0});if(!l||l.length===0)return {hash:r.hash,matches:false};let p=w(l[0]);return p?{hash:r.hash,matches:A(p,o)}:{hash:r.hash,matches:false}})).then(r=>r.filter(o=>o.matches).map(o=>o.hash))}};var Ge=$e(Se());var de=zod.z.object({resource:zod.z.string(),where:zod.z.record(zod.z.string(),zod.z.any()).optional(),include:zod.z.record(zod.z.string(),zod.z.any()).optional(),lastSyncedAt:zod.z.string().optional(),limit:zod.z.coerce.number().optional(),sort:zod.z.array(zod.z.object({key:zod.z.string(),direction:zod.z.enum(["asc","desc"])})).optional()}),ve=zod.z.record(zod.z.string(),zod.z.object({value:zod.z.any().nullable(),_meta:zod.z.object({timestamp:zod.z.string().optional().nullable()}).optional()})),Wt=ve.superRefine((i,e)=>{i.id&&e.addIssue({code:zod.z.ZodIssueCode.custom,message:"Payload cannot have an id"});}),Ue=zod.z.object({id:zod.z.string().optional(),type:zod.z.literal("MUTATE"),resource:zod.z.string(),resourceId:zod.z.string().optional()}),We=zod.z.object({timestamp:zod.z.string().optional()}).optional(),U=Ue.extend({procedure:zod.z.string(),payload:zod.z.any().optional(),meta:We}),H=Ue.extend({procedure:zod.z.enum(["INSERT","UPDATE"]),payload:Wt,meta:We});zod.z.union([H,U]);var He=zod.z.object({resource:zod.z.string(),procedure:zod.z.string(),input:zod.z.any().optional()});var Je=de.omit({resource:true}),xe=U.omit({id:true,type:true,resource:true,procedure:true}).extend({meta:U.shape.meta}),we=H.omit({id:true,type:true,resource:true,procedure:true});zod.z.union([we,xe]);var Me=i=>{if(i==null)return i;if(i==="null")return null;if(Array.isArray(i))return i.map(Me);if(typeof i=="object"&&i.constructor===Object){let e={};for(let[t,n]of Object.entries(i))e[t]=Me(n);return e}return i},Ze=i=>{let e=i.logger;return async t=>{var n;try{let r=typeof t.headers.getSetCookie=="function"?Object.fromEntries(t.headers):t.headers,o={headers:r,cookies:r.cookie?Ge.default.parse(r.cookie):{}},u=new URL(t.url),s=u.pathname.split("/"),a=u.searchParams,c=Me(Jt__default.default.parse(a.toString())),d=await((n=i.contextProvider)==null?void 0:n.call(i,{transport:"HTTP",headers:o.headers,cookies:o.cookies,queryParams:c}))??{};if(t.method==="GET"){let l=s[s.length-1],{success:p,data:y,error:f}=Je.safeParse(c);if(!p)return Response.json({message:"Invalid query",code:"INVALID_QUERY",details:f},{status:400});let m=await i.handleQuery({req:{...o,...y,type:"QUERY",resource:l,context:d,queryParams:c}});return !m||!m.data?Response.json({message:"Invalid resource",code:"INVALID_RESOURCE"},{status:400}):Response.json(m.data)}if(t.method==="POST")try{let l=s[s.length-1],p=s[s.length-2];if(p==="query"){if(s.length<3)return Response.json({message:"Invalid path structure for custom query",code:"INVALID_PATH"},{status:400});let g=s[s.length-3],T=t.body?await t.json():{};if(!g||g.trim()==="")return Response.json({message:"Invalid resource in path",code:"INVALID_RESOURCE"},{status:400});let R=await i.handleCustomQuery({req:{...o,type:"CUSTOM_QUERY",resource:g,procedure:l,input:T.input,context:d,queryParams:c}});return Response.json(R)}let y=p,f=t.body?await t.json():{},m;if(l==="insert"||l==="update"){let{success:g,data:T,error:R}=we.safeParse(f);if(!g)return Response.json({message:"Invalid mutation",code:"INVALID_REQUEST",details:R},{status:400});m=T;}else {let{success:g,data:T,error:R}=xe.safeParse(f);if(!g)return Response.json({message:"Invalid mutation",code:"INVALID_REQUEST",details:R},{status:400});m=T;}let h=await i.handleMutation({req:{...o,type:"MUTATE",resource:y,input:m.payload,context:d,resourceId:m.resourceId,procedure:l==="insert"||l==="update"?l.toUpperCase():l,queryParams:{},meta:m.meta}});return Response.json(h)}catch(l){return e.error("Error parsing mutation from the client:",l),Response.json({message:"Internal server error",code:"INTERNAL_SERVER_ERROR"},{status:500})}return Response.json({message:"Not found",code:"NOT_FOUND"},{status:404})}catch(r){return e.error("Unexpected error:",r),Response.json({message:"Internal server error",code:"INTERNAL_SERVER_ERROR"},{status:500})}}};var et=$e(Se());var $=zod.z.string(),Ie=zod.z.union([He,de]),Gt=zod.z.object({id:$,type:zod.z.literal("SUBSCRIBE")}).and(Ie),Zt=zod.z.object({id:$,type:zod.z.literal("UNSUBSCRIBE")}).and(Ie),Yt=zod.z.object({id:$,type:zod.z.literal("QUERY")}).and(Ie),Xt=zod.z.object({id:$,type:zod.z.literal("CUSTOM_QUERY"),resource:zod.z.string(),procedure:zod.z.string(),input:zod.z.any().optional()}),Ye=H.extend({id:$}),en=U.extend({id:$}),tn=zod.z.union([en,Ye]),Xe=zod.z.union([Gt,Yt,Xt,tn,Zt]),nn=zod.z.object({id:$,type:zod.z.literal("REJECT"),resource:zod.z.string(),message:zod.z.string().optional()}),rn=zod.z.object({id:$,type:zod.z.literal("REPLY"),data:zod.z.any()});zod.z.union([nn,rn,Ye]);zod.z.object({resource:zod.z.string(),data:zod.z.array(ve)});var tt=i=>{let e={},t=i.logger;return (n,r)=>{var l;let o=p=>{n.send(JSON.stringify(p));},u=se(),s=new Map,a={headers:r.headers,cookies:typeof r.headers.cookie=="string"?et.default.parse(r.headers.cookie):{}},c=Jt.parse(r.url.split("?")[1]),d=(l=i.contextProvider)==null?void 0:l.call(i,{transport:"WEBSOCKET",headers:a.headers,cookies:a.cookies,queryParams:c});e[u]=n,t.info("Client connected:",u),n.on("message",async p=>{try{t.debug("Message received from the client:",p);let y=Xe.parse(JSON.parse(p.toString()));if(y.type==="SUBSCRIBE"||y.type==="QUERY"){let{type:f,id:m,...h}=y,g=f==="SUBSCRIBE";if("procedure"in h){let T=await i.handleCustomQuery({req:{...a,type:"CUSTOM_QUERY",resource:h.resource,procedure:h.procedure,input:h.input,context:await d??{},queryParams:c},subscription:g?R=>{var b;!R.resourceId||!R.payload||!Object.keys(R.payload).length||(b=e[u])==null||b.send(JSON.stringify(R));}:void 0});if(g){if(!T||!T.data||!T.query)throw new Error("Invalid resource");T.unsubscribe&&s.set(N(h),T.unsubscribe),o({id:m,type:"REPLY",data:{resource:T.query.resource,data:(T.data??[]).map(R=>R.value)}});}else o({id:m,type:"REPLY",data:T});}else {let T=await i.handleQuery({req:{...a,...h,type:"QUERY",context:await d??{},queryParams:c},subscription:g?R=>{var b;!R.resourceId||!R.payload||!Object.keys(R.payload).length||(b=e[u])==null||b.send(JSON.stringify(R));}:void 0});if(!T||!T.data)throw new Error("Invalid resource");g&&T.unsubscribe&&s.set(N(h),T.unsubscribe),o({id:m,type:"REPLY",data:{resource:h.resource,data:(T.data??[]).map(R=>R.value)}});}}else if(y.type==="UNSUBSCRIBE"){let{type:f,id:m,...h}=y,g=s.get(N(h));g&&(g(),s.delete(N(h)));}else if(y.type==="CUSTOM_QUERY"){let{resource:f,procedure:m,input:h,id:g}=y;t.debug("Received custom query from client:",y);try{let T=await i.handleCustomQuery({req:{...a,type:"CUSTOM_QUERY",resource:f,procedure:m,input:h,context:await d??{},queryParams:c}});o({id:g,type:"REPLY",data:T});}catch(T){o({id:g,type:"REJECT",resource:f,message:T.message}),t.error("Error handling custom query from the client:",T);}}else if(y.type==="MUTATE"){let{resource:f}=y;t.debug("Received mutation from client:",y);try{let m=await i.handleMutation({req:{...a,type:"MUTATE",resource:f,input:y.payload,context:{messageId:y.id,...await d??{}},resourceId:y.resourceId,procedure:y.procedure,queryParams:c,meta:y.meta}});y.procedure&&y.procedure!=="INSERT"&&y.procedure!=="UPDATE"&&o({id:y.id,type:"REPLY",data:m});}catch(m){o({id:y.id,type:"REJECT",resource:f,message:m.message}),t.error("Error parsing mutation from the client:",m);}}}catch(y){t.error("Error handling message from the client:",y);}}),n.on("close",()=>{t.info("Connection closed",u),delete e[u];for(let p of Array.from(s.values()))p();});}};function nt(i){let e=`${i.protocol}://${i.hostname}${i.url}`,t=new Headers;return Object.entries(i.headers).forEach(([n,r])=>{r&&t.set(n,Array.isArray(r)?r.join(","):r);}),new Request(e,{method:i.method,headers:t,body:i.body&&i.method!=="GET"?JSON.stringify(i.body):void 0})}var Nr=(i,e,t)=>{i.ws(`${(t==null?void 0:t.basePath)??""}/ws`,tt(e)),i.use(`${(t==null?void 0:t.basePath)??""}/`,(n,r)=>{Ze(e)(nt(n)).then(u=>u.json().then(s=>r.status(u.status).send(s)));});};var ye=class i{_collection;_client;_where;_include;_limit;_single;_sort;_shouldAwait;constructor(e,t,n,r,o,u,s,a){this._collection=e,this._client=t,this._where=n??{},this._include=r??{},this._limit=o,this._single=u,this._sort=s,this._shouldAwait=a,this.get=this.get.bind(this),this.subscribe=this.subscribe.bind(this);}where(e){return new i(this._collection,this._client,{...this._where,...e},this._include,this._limit,this._single,this._sort,this._shouldAwait)}include(e){return new i(this._collection,this._client,this._where,{...this._include,...e},this._limit,this._single,this._sort,this._shouldAwait)}limit(e){return new i(this._collection,this._client,this._where,this._include,e,this._single,this._sort,this._shouldAwait)}one(e){return this.first({id:e})}first(e){return new i(this._collection,this._client,e??this._where,this._include,1,true,this._sort,this._shouldAwait)}orderBy(e,t="asc"){let n=[...this._sort??[],{key:e,direction:t}];return new i(this._collection,this._client,this._where,this._include,this._limit,this._single,n,this._shouldAwait)}toJSON(){return {resource:this._collection.name,where:this._where,include:this._include,limit:this._limit,sort:this._sort}}buildQueryRequest(){return {resource:this._collection.name,where:this._where,include:this._include,limit:this._limit,sort:this._sort}}get(){let e=this._client.get(this.buildQueryRequest());return this._shouldAwait?Promise.resolve(e).then(t=>this._single?t[0]:t):this._single?e[0]:e}subscribe(e){return this._client.subscribe(this.buildQueryRequest(),t=>{if(this._single)return e(t[0]);e(t);})}static _init(e,t,n){return new i(e,t,void 0,void 0,void 0,void 0,void 0,n??false)}};var sn=i=>typeof i=="object"&&i!==null&&"value"in i&&!Array.isArray(i),Le=class{constructor(e){this.storage=e;}get(e){return Promise.resolve(this.storage.get(e)).then(t=>t.map(n=>sn(n)?w(n):n))}subscribe(){throw new Error("Subscriptions are not supported server-side. Use .get() instead.")}};function k(i,e){let t=new Le(i),n=o=>{let u=ye._init(o,t,true);return Object.assign(Object.create(u),{insert:a=>i.insert(o,a),update:(a,c)=>i.update(o,a,c)})},r={get(o,u){if(u==="findOne")return i.findOne.bind(i);if(u==="find")return i.find.bind(i);if(u==="insert")return i.insert.bind(i);if(u==="update")return i.update.bind(i);if(u==="transaction")return async s=>i.transaction(async({trx:a,commit:c,rollback:d})=>{let l=k(a,e);return s({trx:l,commit:c,rollback:d})});if(u in e){let s=e[u];return n(s)}}};return new Proxy({},r)}var Ce=class i{routes;hooksRegistry=new Map;constructor(e){this.routes=e.routes;for(let t of Object.values(e.routes)){if(t.resourceSchema===void 0)continue;let n=t;n.hooks&&this.hooksRegistry.set(n.resourceSchema.name,n.hooks);}}static create(e){return new i(e)}getHooks(e){return this.hooksRegistry.get(e)}},Kr=i=>Ce.create({...i}),it=(i=>({handler:e=>({_type:"query",inputValidator:i??zod.z.undefined(),handler:e})})),at=(i=>({handler:e=>({_type:"mutation",inputValidator:i??zod.z.undefined(),handler:e})})),Ae=class i{resourceSchema;middlewares;customMutations;customQueries;authorization;hooks;constructor(e,t,n,r,o){this.resourceSchema=e,this.middlewares=new Set,this.customMutations=t??{},this.customQueries=n??{},this.authorization=r,this.hooks=o;}use(...e){for(let t of e)this.middlewares.add(t);return this}withProcedures(e){let t=e({mutation:at,query:it}),n={},r={};for(let[o,u]of Object.entries(t))u._type==="mutation"?n[o]=u:r[o]=u;return new i(this.resourceSchema,n,r,this.authorization,this.hooks)}withMutations(e){return this.withProcedures(({mutation:t})=>e({mutation:t}))}withHooks(e){return new i(this.resourceSchema,this.customMutations,this.customQueries,this.authorization,e)}handleQuery=async({req:e,batcher:t})=>await this.wrapInMiddlewares(async n=>{let r={resource:n.resource,where:n.where,include:n.include,lastSyncedAt:n.lastSyncedAt,limit:n.limit,sort:n.sort},o=N(r);return {data:await t.rawFind({resource:n.resource,commonWhere:n.where,uniqueWhere:n.relationalWhere,include:n.include,limit:n.limit,sort:n.sort}),unsubscribe:void 0,queryHash:o}})(e);handleMutation=async({req:e,db:t,schema:n})=>{var s;let r=((s=e.meta)==null?void 0:s.timestamp)??new Date().toISOString(),o=t._setMutationTimestamp(r),u=k(o,n);return await this.wrapInMiddlewares(async a=>{if(!a.procedure)throw new Error("Procedure is required for mutations");let c=this.customMutations[a.procedure];if(c){let d=c.inputValidator["~standard"].validate(a.input),l=d instanceof Promise?await d:d;if(l.issues){let p=l.issues.map(y=>{var m;let f=(m=y.path)==null?void 0:m.map(h=>typeof h=="object"&&"key"in h?String(h.key):String(h)).join(".");return f?`${f}: ${y.message}`:y.message}).join(", ");throw new Error(`Validation failed: ${p}`)}return a.input=l.value,c.handler({req:a,db:u})}else {if(a.procedure==="INSERT"||a.procedure==="UPDATE")return this.handleSet({req:a,db:o,operation:a.procedure,schema:n});throw new Error(`Unknown procedure: ${a.procedure}`)}})(e)};handleCustomQuery=async({req:e,db:t,schema:n})=>{let r=k(t,n);return await this.wrapInMiddlewares(async o=>{let u=this.customQueries[o.procedure];if(!u)throw new Error(`Unknown query procedure: ${o.procedure}`);let s=u.inputValidator["~standard"].validate(o.input),a=s instanceof Promise?await s:s;if(a.issues){let c=a.issues.map(d=>{var p;let l=(p=d.path)==null?void 0:p.map(y=>typeof y=="object"&&"key"in y?String(y.key):String(y)).join(".");return l?`${l}: ${d.message}`:d.message}).join(", ");throw new Error(`Validation failed: ${c}`)}return o.input=a.value,u.handler({req:o,db:r})})(e)};getAuthorizationClause(e){var t,n;return (n=(t=this.authorization)==null?void 0:t.read)==null?void 0:n.call(t,{ctx:e.context})}handleSet=async({req:e,db:t,operation:n,schema:r})=>{if(!e.input)throw new Error("Payload is required");if(!e.resourceId)throw new Error("ResourceId is required");let o=await t.rawFindById(e.resource,e.resourceId);if(n==="INSERT"&&o)throw new Error("Resource already exists");if(n==="UPDATE"&&!o)throw new Error("Resource not found");let u={value:e.input};return t.transaction(async({trx:s})=>{var d,l,p,y,f,m,h;if(n==="INSERT"){let{data:g,acceptedValues:T}=await s.rawInsert(e.resource,e.resourceId,u,(d=e.context)==null?void 0:d.messageId,e.context);if(!T)throw new Error("Mutation rejected");let R=w(g);if(R.id=R.id??e.resourceId,(l=this.authorization)!=null&&l.insert){let b=this.authorization.insert({ctx:e.context,value:R});if(typeof b=="boolean"){if(!b)throw new Error("Not authorized")}else {let S=_(b,e.resource,r),v=Object.keys(S).length>0?await s.rawFindById(e.resource,e.resourceId,S):g,M=w(v);if(M.id=M.id??e.resourceId,!A(M,b))throw new Error("Not authorized")}}return {data:g,acceptedValues:T}}if((y=(p=this.authorization)==null?void 0:p.update)!=null&&y.preMutation){let g=w(o);g.id=g.id??e.resourceId;let T=this.authorization.update.preMutation({ctx:e.context,value:g});if(typeof T=="boolean"){if(!T)throw new Error("Not authorized")}else {let R=_(T,e.resource,r),b=Object.keys(R).length>0?await s.rawFindById(e.resource,e.resourceId,R):o,S=w(b);if(S.id=S.id??e.resourceId,!A(S,T))throw new Error("Not authorized")}}let{data:a,acceptedValues:c}=await s.rawUpdate(e.resource,e.resourceId,u,(f=e.context)==null?void 0:f.messageId,e.context);if(!c)throw new Error("Mutation rejected");if((h=(m=this.authorization)==null?void 0:m.update)!=null&&h.postMutation){let g=w(a);g.id=g.id??e.resourceId;let T=this.authorization.update.postMutation({ctx:e.context,value:g});if(typeof T=="boolean"){if(!T)throw new Error("Not authorized")}else {let R=_(T,e.resource,r),b=Object.keys(R).length>0?await s.rawFindById(e.resource,e.resourceId,R):a,S=w(b);if(S.id=S.id??e.resourceId,!A(S,T))throw new Error("Not authorized")}}return {data:a,acceptedValues:c}})};wrapInMiddlewares(e){return t=>Array.from(this.middlewares.values()).reduceRight((n,r)=>o=>r({req:o,next:n}),e)(t)}},je=class{resourceSchema=void 0;middlewares;customMutations;customQueries;constructor(e,t){this.middlewares=new Set,this.customMutations=e??{},this.customQueries=t??{};}use(...e){for(let t of e)this.middlewares.add(t);return this}handleMutation=async({req:e,db:t,schema:n})=>{var s;let r=((s=e.meta)==null?void 0:s.timestamp)??new Date().toISOString(),o=t._setMutationTimestamp(r),u=k(o,n);return await this.wrapInMiddlewares(async a=>{if(!a.procedure)throw new Error("Procedure is required for mutations");let c=this.customMutations[a.procedure];if(c){let d=c.inputValidator["~standard"].validate(a.input),l=d instanceof Promise?await d:d;if(l.issues){let p=l.issues.map(y=>{var m;let f=(m=y.path)==null?void 0:m.map(h=>typeof h=="object"&&"key"in h?String(h.key):String(h)).join(".");return f?`${f}: ${y.message}`:y.message}).join(", ");throw new Error(`Validation failed: ${p}`)}return a.input=l.value,c.handler({req:a,db:u})}throw new Error(`Unknown procedure: ${a.procedure}`)})(e)};handleCustomQuery=async({req:e,db:t,schema:n})=>{let r=k(t,n);return await this.wrapInMiddlewares(async o=>{let u=this.customQueries[o.procedure];if(!u)throw new Error(`Unknown query procedure: ${o.procedure}`);let s=u.inputValidator["~standard"].validate(o.input),a=s instanceof Promise?await s:s;if(a.issues){let c=a.issues.map(d=>{var p;let l=(p=d.path)==null?void 0:p.map(y=>typeof y=="object"&&"key"in y?String(y.key):String(y)).join(".");return l?`${l}: ${d.message}`:d.message}).join(", ");throw new Error(`Validation failed: ${c}`)}return o.input=a.value,u.handler({req:o,db:r})})(e)};getAuthorizationClause(){}wrapInMiddlewares(e){return t=>Array.from(this.middlewares.values()).reduceRight((n,r)=>o=>r({req:o,next:n}),e)(t)}},Ee=class i{middlewares;constructor(e=[]){this.middlewares=e;}collectionRoute(e,t){return new Ae(e,void 0,void 0,t,void 0).use(...this.middlewares)}withProcedures(e){let t=e({mutation:at,query:it}),n={},r={};for(let[o,u]of Object.entries(t))u._type==="mutation"?n[o]=u:r[o]=u;return new je(n,r).use(...this.middlewares)}use(...e){return new i([...this.middlewares,...e])}static create(){return new i}},Ur=Ee.create;var J=class{_mutationTimestamp;_setMutationTimestamp(e){let t=this._clone();return t._mutationTimestamp=e,t}_getTimestamp(){return this._mutationTimestamp??new Date().toISOString()}_clone(){return Object.assign(Object.create(Object.getPrototypeOf(this)),this)}async insert(e,t){let n=this._getTimestamp(),r=await this.rawInsert(e.name,t.id,{value:Object.fromEntries(Object.entries(t).map(([o,u])=>[o,{value:u,_meta:{timestamp:n}}]))});return w(r.data)}async update(e,t,n){let r=this._getTimestamp(),{id:o,...u}=n,s=await this.rawUpdate(e.name,t,{value:Object.fromEntries(Object.entries(u).map(([d,l])=>[d,{value:l,_meta:{timestamp:r}}]))}),a=w(s.data),c={};for(let d of Object.keys(u))d in a&&(c[d]=a[d]);return c}};var pn={postgres:{jsonObjectFrom:postgres.jsonObjectFrom,jsonArrayFrom:postgres.jsonArrayFrom},mysql:{jsonObjectFrom:mysql.jsonObjectFrom,jsonArrayFrom:mysql.jsonArrayFrom},sqlite:{jsonObjectFrom:sqlite.jsonObjectFrom,jsonArrayFrom:sqlite.jsonArrayFrom}};function q(i){var r,o,u;let e=(r=i.getExecutor)==null?void 0:r.call(i),t=e==null?void 0:e.adapter;if(!t)return "postgres";let n=((u=(o=t.constructor)==null?void 0:o.name)==null?void 0:u.toLowerCase())??"";return n.includes("postgres")?"postgres":n.includes("mysql")?"mysql":n.includes("sqlite")?"sqlite":"postgres"}function st(i){let e=q(i);return pn[e]}var mn="42701";function G(i){var t;if(i.code===mn)return true;let e=((t=i.message)==null?void 0:t.toLowerCase())||"";return e.includes("already exists")||e.includes("duplicate")||e.includes("already defined")}function Pe(i,e){let{type:t,enumValues:n,enumName:r}=i;if(n&&n.length>0)return e==="postgres"&&r?r:"varchar";if(t==="jsonb"||t==="json")switch(e){case "postgres":return "jsonb";case "mysql":return "json";case "sqlite":return "text"}return t}async function fn(i,e,t,n){if(t!=="postgres")return;let r=new Map;for(let o of Object.values(e))for(let u of Object.values(o.fields)){let s=u.getStorageFieldType();s.enumValues&&s.enumName&&r.set(s.enumName,{name:s.enumName,values:s.enumValues});}for(let o of Array.from(r.values())){let{name:u,values:s}=o;try{let a=s.map(c=>`'${c}'`).join(", ");await kysely.sql`
|
|
1
|
+
'use strict';var ie=require('crypto'),jsXxhash=require('js-xxhash'),Jt=require('qs'),zod=require('zod'),kysely=require('kysely'),mysql=require('kysely/helpers/mysql'),postgres=require('kysely/helpers/postgres'),sqlite=require('kysely/helpers/sqlite');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var ie__default=/*#__PURE__*/_interopDefault(ie);var Jt__default=/*#__PURE__*/_interopDefault(Jt);var yt=Object.create;var qe=Object.defineProperty;var pt=Object.getOwnPropertyDescriptor;var mt=Object.getOwnPropertyNames;var ft=Object.getPrototypeOf,ht=Object.prototype.hasOwnProperty;var Tt=(i,e)=>()=>(e||i((e={exports:{}}).exports,e),e.exports);var gt=(i,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of mt(e))!ht.call(i,r)&&r!==t&&qe(i,r,{get:()=>e[r],enumerable:!(n=pt(e,r))||n.enumerable});return i};var $e=(i,e,t)=>(t=i!=null?yt(ft(i)):{},gt(qe(t,"default",{value:i,enumerable:true}),i));var be=Tt(le=>{Object.defineProperty(le,"__esModule",{value:true});le.parse=Bt;le.serialize=zt;var qt=/^[\u0021-\u003A\u003C\u003E-\u007E]+$/,$t=/^[\u0021-\u003A\u003C-\u007E]*$/,Dt=/^([.]?[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)([.][a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)*$/i,Ft=/^[\u0020-\u003A\u003D-\u007E]*$/,_t=Object.prototype.toString,kt=(()=>{let i=function(){};return i.prototype=Object.create(null),i})();function Bt(i,e){let t=new kt,n=i.length;if(n<2)return t;let r=(e==null?void 0:e.decode)||Kt,o=0;do{let u=i.indexOf("=",o);if(u===-1)break;let a=i.indexOf(";",o),s=a===-1?n:a;if(u>s){o=i.lastIndexOf(";",u-1)+1;continue}let c=ze(i,o,u),d=Ke(i,u,c),l=i.slice(c,d);if(t[l]===void 0){let p=ze(i,u+1,s),y=Ke(i,s,p),f=r(i.slice(p,y));t[l]=f;}o=s+1;}while(o<n);return t}function ze(i,e,t){do{let n=i.charCodeAt(e);if(n!==32&&n!==9)return e}while(++e<t);return t}function Ke(i,e,t){for(;e>t;){let n=i.charCodeAt(--e);if(n!==32&&n!==9)return e+1}return t}function zt(i,e,t){let n=(t==null?void 0:t.encode)||encodeURIComponent;if(!qt.test(i))throw new TypeError(`argument name is invalid: ${i}`);let r=n(e);if(!$t.test(r))throw new TypeError(`argument val is invalid: ${e}`);let o=i+"="+r;if(!t)return o;if(t.maxAge!==void 0){if(!Number.isInteger(t.maxAge))throw new TypeError(`option maxAge is invalid: ${t.maxAge}`);o+="; Max-Age="+t.maxAge;}if(t.domain){if(!Dt.test(t.domain))throw new TypeError(`option domain is invalid: ${t.domain}`);o+="; Domain="+t.domain;}if(t.path){if(!Ft.test(t.path))throw new TypeError(`option path is invalid: ${t.path}`);o+="; Path="+t.path;}if(t.expires){if(!Ut(t.expires)||!Number.isFinite(t.expires.valueOf()))throw new TypeError(`option expires is invalid: ${t.expires}`);o+="; Expires="+t.expires.toUTCString();}if(t.httpOnly&&(o+="; HttpOnly"),t.secure&&(o+="; Secure"),t.partitioned&&(o+="; Partitioned"),t.priority)switch(typeof t.priority=="string"?t.priority.toLowerCase():void 0){case "low":o+="; Priority=Low";break;case "medium":o+="; Priority=Medium";break;case "high":o+="; Priority=High";break;default:throw new TypeError(`option priority is invalid: ${t.priority}`)}if(t.sameSite)switch(typeof t.sameSite=="string"?t.sameSite.toLowerCase():t.sameSite){case true:case "strict":o+="; SameSite=Strict";break;case "lax":o+="; SameSite=Lax";break;case "none":o+="; SameSite=None";break;default:throw new TypeError(`option sameSite is invalid: ${t.sameSite}`)}return o}function Kt(i){if(i.indexOf("%")===-1)return i;try{return decodeURIComponent(i)}catch{return i}}function Ut(i){return _t.call(i)==="[object Date]"}});var Te=i=>typeof i=="object"&&i!==null&&"value"in i&&!Array.isArray(i),w=i=>i?Array.isArray(i.value)?i.value.map(t=>Te(t)?w(t):t):typeof i.value!="object"||i.value===null||i.value instanceof Date?i.value:Object.fromEntries(Object.entries(i.value).map(([t,n])=>Array.isArray(n)?[t,n.map(r=>Te(r)?w(r):r)]:Te(n)?[t,w(n)]:[t,n])):void 0;var Fe="0123456789ABCDEFGHJKMNPQRSTVWXYZ",W=32;var At=16,_e=10,De=0xffffffffffff;var D;(function(i){i.Base32IncorrectEncoding="B32_ENC_INVALID",i.DecodeTimeInvalidCharacter="DEC_TIME_CHAR",i.DecodeTimeValueMalformed="DEC_TIME_MALFORMED",i.EncodeTimeNegative="ENC_TIME_NEG",i.EncodeTimeSizeExceeded="ENC_TIME_SIZE_EXCEED",i.EncodeTimeValueMalformed="ENC_TIME_MALFORMED",i.PRNGDetectFailure="PRNG_DETECT",i.ULIDInvalid="ULID_INVALID",i.Unexpected="UNEXPECTED",i.UUIDInvalid="UUID_INVALID";})(D||(D={}));var F=class extends Error{constructor(e,t){super(`${t} (${e})`),this.name="ULIDError",this.code=e;}};function jt(i){let e=Math.floor(i()*W);return e===W&&(e=W-1),Fe.charAt(e)}function Ot(i){var n;let e=Et(),t=e&&(e.crypto||e.msCrypto)||(typeof ie__default.default<"u"?ie__default.default:null);if(typeof(t==null?void 0:t.getRandomValues)=="function")return ()=>{let r=new Uint8Array(1);return t.getRandomValues(r),r[0]/255};if(typeof(t==null?void 0:t.randomBytes)=="function")return ()=>t.randomBytes(1).readUInt8()/255;if((n=ie__default.default)!=null&&n.randomBytes)return ()=>ie__default.default.randomBytes(1).readUInt8()/255;throw new F(D.PRNGDetectFailure,"Failed to find a reliable PRNG")}function Et(){return Nt()?self:typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:null}function Pt(i,e){let t="";for(;i>0;i--)t=jt(e)+t;return t}function Vt(i,e=_e){if(isNaN(i))throw new F(D.EncodeTimeValueMalformed,`Time must be a number: ${i}`);if(i>De)throw new F(D.EncodeTimeSizeExceeded,`Cannot encode a time larger than ${De}: ${i}`);if(i<0)throw new F(D.EncodeTimeNegative,`Time must be positive: ${i}`);if(Number.isInteger(i)===false)throw new F(D.EncodeTimeValueMalformed,`Time must be an integer: ${i}`);let t,n="";for(let r=e;r>0;r--)t=i%W,n=Fe.charAt(t)+n,i=(i-t)/W;return n}function Nt(){return typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope}function ke(i,e){let t=Ot(),n=Date.now();return Vt(n,_e)+Pt(At,t)}var se=()=>ke().toLowerCase(),ae=i=>({then(e,t){try{if(e){let n=e(i);return n instanceof Promise?n:ae(n)}return ae(i)}catch(n){if(t){let r=t(n);return r instanceof Promise?r:ae(r)}throw n}}}),ge=i=>i instanceof Promise?i:ae(i);var K=(...i)=>{let e=i.filter(t=>!!t);return e.length===0?{}:e.length===1?e[0]:{$and:e}};var oe=class{storage;queue=new Map;scheduled=false;constructor(e){this.storage=e;}async rawFind({resource:e,commonWhere:t,uniqueWhere:n,...r}){return new Promise((o,u)=>{let a=this.getBatchKey({resource:e,commonWhere:t,...r}),s={resource:e,commonWhere:t,uniqueWhere:n,...r,resolve:o,reject:u};this.queue.has(a)||this.queue.set(a,[]);let c=this.queue.get(a);c&&c.push(s),this.scheduled||(this.scheduled=true,setImmediate(()=>{this.processBatch();}));})}getBatchKey(e){let{resource:t,commonWhere:n,...r}=e;return `${t}:${JSON.stringify(n??{})}:${JSON.stringify(r??{})}`}async processBatch(){this.scheduled=false;let e=Array.from(this.queue.entries());this.queue.clear();for(let[,t]of e)try{await this.executeBatchedRequests(t);}catch(n){t.forEach(r=>{r.reject(n);});}}async executeBatchedRequests(e){var p;if(e.length===0)return;let t=e[0],{resource:n,commonWhere:r,include:o,sort:u}=t,a=e.length===1?t.limit:void 0,s=e.map(y=>y.uniqueWhere).filter(y=>y!==void 0),c=r,d=(p=Object.entries(s[0]??{})[0])==null?void 0:p[0];if(s.length>0){let y=s.map(f=>f[d]).filter(f=>f!=null);y.length>0&&(c=K(r,{[d]:{$in:y}}));}let l=await this.storage.get({resource:n,where:c,include:o,sort:u,limit:a});for(let y of e){let f=l;if(y.uniqueWhere){let[m,h]=Object.entries(y.uniqueWhere)[0];f=l.filter(g=>{var T;return ((T=g.value[m])==null?void 0:T.value)===h});}y.resolve(f);}}};var N=i=>jsXxhash.xxHash32(JSON.stringify(i)).toString(32),_=(i,e,t)=>{let n={},r=t[e];if(!r)return n;let o=u=>{u.$and?u.$and.forEach(o):u.$or?u.$or.forEach(o):Object.entries(u).forEach(([a,s])=>{var c;if((c=r.relations)!=null&&c[a]&&(n[a]=true,typeof s=="object"&&s!==null&&!Array.isArray(s))){let d=_(s,r.relations[a].entity.name,t);Object.keys(d).length>0&&(n[a]={include:d});}});};return o(i),n},A=(i,e,t=false)=>Object.entries(e).every(([n,r])=>{if(n==="$and")return r.every(u=>A(i,u,t));if(n==="$or")return r.some(u=>A(i,u,t));let o=(r==null?void 0:r.$eq)!==void 0?r==null?void 0:r.$eq:r;if(typeof r=="object"&&r!==null&&(r==null?void 0:r.$eq)===void 0){if(r.$in!==void 0){let a=i[n];return a===void 0?false:t?!r.$in.includes(a):r.$in.includes(a)}if(r.$not!==void 0&&!t)return A(i,{[n]:r.$not},true);if(r.$gt!==void 0){let a=i[n];return typeof a!="number"?false:t?a<=r.$gt:a>r.$gt}if(r.$gte!==void 0){let a=i[n];return typeof a!="number"?false:t?a<r.$gte:a>=r.$gte}if(r.$lt!==void 0){let a=i[n];return typeof a!="number"?false:t?a>=r.$lt:a<r.$lt}if(r.$lte!==void 0){let a=i[n];return typeof a!="number"?false:t?a>r.$lte:a<=r.$lte}let u=i[n];return !u||typeof u!="object"&&!Array.isArray(u)?false:Array.isArray(u)?t?!u.some(a=>A(a,r,false)):u.some(a=>A(a,r,false)):A(u,r,t)}return t?i[n]!==o:i[n]===o}),ue=i=>{if(typeof i!="object"||i===null)return false;let e=i;return "where"in e||"limit"in e||"orderBy"in e||"include"in e},q={CRITICAL:0,ERROR:1,WARN:2,INFO:3,DEBUG:4},Re=class{level;prefix;constructor(e={}){this.level=e.level??q.INFO,this.prefix=e.prefix?`[${e.prefix}] `:"";}critical(...e){this.level>=q.CRITICAL&&console.error(`${this.prefix}[CRITICAL]`,...e);}error(...e){this.level>=q.ERROR&&console.error(`${this.prefix}[ERROR]`,...e);}warn(...e){this.level>=q.WARN&&console.warn(`${this.prefix}[WARN]`,...e);}info(...e){this.level>=q.INFO&&console.log(`${this.prefix}[INFO]`,...e);}debug(...e){this.level>=q.DEBUG&&console.log(`${this.prefix}[DEBUG]`,...e);}setLevel(e){this.level=e;}getLevel(){return this.level}},Be=i=>new Re(i);function xe(i){return N({resource:i.query.resource,where:i.query.where,include:i.query.include,stepPath:i.stepPath,isMany:i.isMany,relationName:i.relationName})}var ce=class{router;storage;schema;logger;queryNodes=new Map;objectNodes=new Map;constructor(e){this.router=e.router,this.storage=e.storage,this.schema=e.schema,this.logger=e.logger;}getRelationalColumns(e){let t=new Map,n=this.schema[e];if(!(n!=null&&n.relations))return t;for(let[r,o]of Object.entries(n.relations))o.type==="one"&&o.relationalColumn&&t.set(String(o.relationalColumn),{relationName:r,targetResource:o.entity.name});return t}ensureObjectNode(e,t,n){let r=this.objectNodes.get(e);return r?n&&r.matchedQueries.add(n):(r={id:e,type:t,matchedQueries:new Set(n?[n]:[]),referencesObjects:new Map,referencedByObjects:new Map},this.objectNodes.set(e,r)),r}storeRelation(e,t,n,r){let o=this.objectNodes.get(e),u=this.objectNodes.get(t);if(o&&o.referencesObjects.set(n,t),u&&r){let a=u.referencedByObjects.get(r);a||(a=new Set,u.referencedByObjects.set(r,a)),a.add(e);}}removeRelation(e,t,n,r){let o=this.objectNodes.get(e),u=this.objectNodes.get(t);if(o&&o.referencesObjects.delete(n),u&&r){let a=u.referencedByObjects.get(r);a&&(a.delete(e),a.size===0&&u.referencedByObjects.delete(r));}}getInverseRelationName(e,t,n){let r=this.schema[e];if(!(r!=null&&r.relations))return;let o=r.relations[n];if(!o)return;let u=this.schema[t];if(u!=null&&u.relations){if(o.type==="many"&&o.foreignColumn){for(let[a,s]of Object.entries(u.relations))if(s.entity.name===e&&s.type==="one"&&s.relationalColumn===o.foreignColumn)return a}if(o.type==="one"&&o.relationalColumn){for(let[a,s]of Object.entries(u.relations))if(s.entity.name===e&&s.type==="many"&&s.foreignColumn===o.relationalColumn)return a}}}updateRelationsFromMutation(e,t,n,r){let o=this.getRelationalColumns(e),u=this.objectNodes.get(t);if(u)for(let[a,{relationName:s,targetResource:c}]of Array.from(o)){if(!(r&&a in r))continue;let l=this.getInverseRelationName(e,c,s),p=u.referencesObjects.get(s),y=n[a];p!==y&&(p&&this.removeRelation(t,p,s,l),y&&(this.ensureObjectNode(y,c),this.storeRelation(t,y,s,l)));}}get(e,t){let n=this.breakdownQuery({query:e,context:(t==null?void 0:t.context)??{}});return this.resolveQuery(n,{context:(t==null?void 0:t.context)??{},batcher:(t==null?void 0:t.batcher)??new oe(this.storage)})}subscribe(e,t,n={}){let r=this.breakdownQuery({query:e,context:n}),o={},u=[];for(let a of r){this.logger.debug("[QueryEngine] Subscribing to step",a.stepPath.join("."));let s=xe(a),c=o[a.stepPath.at(-2)??""],d=a.stepPath.at(-1)??"",l=this.queryNodes.get(s);if(l)l.subscriptions.add(t);else if(l={hash:s,queryStep:a,relationName:d,trackedObjects:new Set,subscriptions:new Set([t]),parentQuery:c,childQueries:new Set},this.queryNodes.set(l.hash,l),c){let p=this.queryNodes.get(c);p&&p.childQueries.add(l.hash);}o[d]=s,u.push(()=>{let p=this.queryNodes.get(s);p&&(p.subscriptions.delete(t),p.subscriptions.size===0&&this.queryNodes.delete(s));});}return ()=>{for(let a of u)a();}}breakdownQuery(e){var h;let{query:t,stepPath:n=[],context:r={},parentResource:o}=e,{include:u}=t,a=n.length===0,s=n.at(-1),c,d,l;if(!a&&o&&s){let g=this.schema[o],T=(h=g==null?void 0:g.relations)==null?void 0:h[s];T&&(l=T.type==="many",T.type==="one"?(c=R=>({id:R}),d=R=>R.map(x=>{var b,S;return (S=(b=x.value)==null?void 0:b[T.relationalColumn])==null?void 0:S.value}).filter(x=>x!==void 0)):(c=R=>({[T.foreignColumn]:R}),d=R=>R.map(x=>{var b,S;return (S=(b=x.value)==null?void 0:b.id)==null?void 0:S.value}).filter(x=>x!==void 0)));}let{include:p,...y}=t,m=[this.router.incrementQueryStep({query:y,stepPath:[...n],getWhere:c,referenceGetter:d,isMany:l,relationName:s},r)];if(u&&typeof u=="object"&&Object.keys(u).length>0){let g=this.schema[t.resource];if(!g)throw new Error(`Resource ${t.resource} not found`);m.push(...Object.entries(u).flatMap(([T,R])=>{let x=g.relations[T];if(!x)throw new Error(`Relation ${T} not found for resource ${t.resource}`);let b=x.entity.name,S=ue(R)?R:null;return this.breakdownQuery({query:{resource:b,include:S?S.include:typeof R=="object"?R:void 0,where:S==null?void 0:S.where,limit:S==null?void 0:S.limit,sort:S==null?void 0:S.orderBy},stepPath:[...n,T],context:r,parentResource:t.resource})}));}return m}resolveQuery(e,t){this.logger.debug("[QueryEngine] Resolving query",e.map(o=>o.stepPath.join(".")).join(" -> "));let n={},r=this.resolveStep(e[0],t).then(o=>{this.logger.debug("[QueryEngine] Resolved step",e[0].stepPath.join("."),"with results count:",o.length),n[e[0].stepPath.join(".")]=[{data:o}];});for(let o=1;o<e.length;o++){let u=e[o],a=u.stepPath.slice(0,-1).join(".");r=r.then(async()=>{var c,d;let s=n[a];if(!s){n[u.stepPath.join(".")]=[];return}if(u.referenceGetter&&u.getWhere){let l=new Map;for(let f of s)for(let m of f.data){let h=(d=(c=m==null?void 0:m.value)==null?void 0:c.id)==null?void 0:d.value;if(!h)continue;let T=u.referenceGetter([m])[0];if(T){l.has(T)||l.set(T,new Set);let R=l.get(T);R&&R.add(h);}}let p=Array.from(l.keys());if(p.length===0){n[u.stepPath.join(".")]=[];return}let y=[];for(let f of p){let m=u.getWhere(f),h={...u,relationalWhere:m},g=await this.resolveStep(h,t),T=l.get(f);if(T)for(let R of Array.from(T))y.push({includedBy:R,data:g});}this.logger.debug("[QueryEngine] Resolved step",u.stepPath.join("."),"with results count:",y.reduce((f,m)=>f+m.data.length,0)),n[u.stepPath.join(".")]=y;}else {let l=await this.resolveStep(u,t);n[u.stepPath.join(".")]=[{data:l}];}});}return r=r.then((()=>(this.logger.debug("[QueryEngine] Assembling results"),this.assembleResults(e,n)))),r}assembleResults(e,t){var u,a,s,c,d;this.logger.debug("[QueryEngine] assembleResults: Starting assembly"),this.logger.debug("[QueryEngine] assembleResults: Plan steps:",e.length),this.logger.debug("[QueryEngine] assembleResults: Step results keys:",Object.keys(t));let n=new Map;for(let l of e){let p=l.stepPath.join("."),y=t[p]??[],f=Object.keys(l.query.include??{});this.logger.debug(`[QueryEngine] assembleResults: Processing step "${p}"`,{resource:l.query.resource,includedRelations:f,resultGroups:y.length,isMany:l.isMany,relationName:l.relationName});for(let m of y){this.logger.debug(`[QueryEngine] assembleResults: Processing result group for "${p}"`,{dataCount:m.data.length,includedBy:m.includedBy});for(let h of m.data){let g=(a=(u=h==null?void 0:h.value)==null?void 0:u.id)==null?void 0:a.value;if(!g){this.logger.debug(`[QueryEngine] assembleResults: Skipping data without id in step "${p}"`);continue}let T=p?`${p}.${g}`:g,R=[];if(l.stepPath.length>0&&m.includedBy){let b=l.stepPath.slice(0,-1).join(".");R=[b?`${b}.${m.includedBy}`:m.includedBy],this.logger.debug(`[QueryEngine] assembleResults: Child entity "${T}" has parent keys:`,R,{stepPath:p,parentStepPath:b,includedBy:m.includedBy});}else this.logger.debug(`[QueryEngine] assembleResults: Root entity "${T}" (no parent)`);let x=n.get(T);if(x){this.logger.debug(`[QueryEngine] assembleResults: Entity "${T}" already exists, adding parent keys:`,R);for(let b of R)x.includedBy.add(b);}else this.logger.debug(`[QueryEngine] assembleResults: Adding new entity "${T}"`,{resource:l.query.resource,path:l.stepPath.at(-1)??"",isMany:l.isMany??false,relationName:l.relationName,includedRelations:f,parentKeys:R}),n.set(T,{data:h,includedBy:new Set(R),path:l.stepPath.at(-1)??"",isMany:l.isMany??false,relationName:l.relationName,resourceName:l.query.resource,includedRelations:f});}}}this.logger.debug(`[QueryEngine] assembleResults: Built entriesMap with ${n.size} entries`),this.logger.debug("[QueryEngine] assembleResults: EntriesMap keys:",Array.from(n.keys()));let r=Array.from(n.entries()),o=[];this.logger.debug(`[QueryEngine] assembleResults: Starting assembly phase with ${r.length} entries`);for(let l=r.length-1;l>=0;l--){let[p,y]=r[l],f=this.schema[y.resourceName];this.logger.debug(`[QueryEngine] assembleResults: Processing entry "${p}"`,{resource:y.resourceName,path:y.path,isMany:y.isMany,relationName:y.relationName,includedRelations:y.includedRelations,parentKeys:Array.from(y.includedBy)});for(let m of y.includedRelations){let h=(c=(s=f==null?void 0:f.relations)==null?void 0:s[m])==null?void 0:c.type,g=!!y.data.value[m];if(this.logger.debug(`[QueryEngine] assembleResults: Checking included relation "${m}" for "${p}"`,{relationType:h,hasRelation:g,resourceHasRelation:!!((d=f==null?void 0:f.relations)!=null&&d[m])}),y.data.value[m])this.logger.debug(`[QueryEngine] assembleResults: Relation "${m}" already exists for "${p}"`,y.data.value[m]);else {let T=h==="many"?{value:[]}:{value:null};y.data.value[m]=T,this.logger.debug(`[QueryEngine] assembleResults: Initialized relation "${m}" for "${p}" with`,T);}}if(y.path===""){this.logger.debug(`[QueryEngine] assembleResults: Adding root entity "${p}" to resultData`),o.unshift(y.data);continue}this.logger.debug(`[QueryEngine] assembleResults: Attaching "${p}" to ${y.includedBy.size} parent(s)`);for(let m of Array.from(y.includedBy)){let h=n.get(m);if(!h){this.logger.warn(`[QueryEngine] assembleResults: WARNING - Parent "${m}" not found in entriesMap for child "${p}"`);continue}let g=y.relationName??y.path;this.logger.debug(`[QueryEngine] assembleResults: Attaching "${p}" to parent "${m}" via relation "${g}"`,{isMany:y.isMany,parentHasRelation:!!h.data.value[g]}),y.isMany?(h.data.value[g]??={value:[]},h.data.value[g].value.push(y.data),this.logger.debug(`[QueryEngine] assembleResults: Added "${p}" to many relation "${g}" on parent "${m}"`,{arrayLength:h.data.value[g].value.length})):(h.data.value[g]=y.data,this.logger.debug(`[QueryEngine] assembleResults: Set one relation "${g}" on parent "${m}" to "${p}"`));}}return this.logger.debug(`[QueryEngine] assembleResults: Assembly complete. Returning ${o.length} root items`),o}resolveStep(e,t){this.logger.debug("[QueryEngine] Resolving step",e.stepPath.join("."),"with query",JSON.stringify(e.query,null,2),"relationalWhere",JSON.stringify(e.relationalWhere,null,2));let{query:n,relationalWhere:r}=e,o=n.where&&r?K(n.where,r):r??n.where,u=o?{...n,where:o}:n;return ge(this.router.get(u,t)).then(a=>(this.loadStepResults(e,a),a))}loadStepResults(e,t){this.logger.debug("[QueryEngine] Loading step results",e.stepPath.join("."),"with results",JSON.stringify(t,null,2));let n=xe(e),r=this.queryNodes.get(n),o=e.query.resource;if(!r)return;let u=this.getRelationalColumns(o);for(let a of t){let s=w(a),c=s.id;this.ensureObjectNode(c,o,n),r.trackedObjects.add(c);for(let[d,{relationName:l,targetResource:p}]of Array.from(u)){let y=s[d];if(y){this.ensureObjectNode(y,p);let f=this.getInverseRelationName(o,p,l);this.storeRelation(c,y,l,f);}}this.loadNestedRelations(o,c,s),this.logger.debug("[QueryEngine] Loaded nested relations for",c);}}loadNestedRelations(e,t,n){let r=this.schema[e];if(r!=null&&r.relations)for(let[o,u]of Object.entries(r.relations)){let a=n[o];if(!a)continue;let s=u.entity.name,c=this.getInverseRelationName(e,s,o);if(u.type==="one")a&&typeof a=="object"&&a.id&&(this.ensureObjectNode(a.id,s),this.storeRelation(t,a.id,o,c),this.loadNestedRelations(s,a.id,a));else if(u.type==="many"&&Array.isArray(a)){for(let d of a)if(d&&typeof d=="object"&&d.id){this.ensureObjectNode(d.id,s);let l=this.getInverseRelationName(s,e,o);l&&this.storeRelation(d.id,t,l,o),this.loadNestedRelations(s,d.id,d);}}}}buildIncludeFromChildQueries(e){let t=this.queryNodes.get(e);if(!t||t.childQueries.size===0)return {};let n={};for(let r of Array.from(t.childQueries)){let o=this.queryNodes.get(r);if(!o||!o.relationName)continue;let u=this.buildIncludeFromChildQueries(r);n[o.relationName]=Object.keys(u).length>0?u:true;}return n}sendInsertsForTree(e,t,n){var a,s;let r=(s=(a=t==null?void 0:t.value)==null?void 0:a.id)==null?void 0:s.value;if(!r)return;let o={procedure:"INSERT",resource:n,resourceId:r,type:"MUTATE",payload:t.value};for(let c of Array.from(e.subscriptions))try{c(o);}catch(d){this.logger.error("[QueryEngine] Error in subscription callback during sendInsertsForTree",{error:d,queryHash:e.hash,resource:n,resourceId:r,stepPath:e.queryStep.stepPath.join(".")});}e.trackedObjects.add(r),this.ensureObjectNode(r,n,e.hash).matchedQueries.add(e.hash);for(let c of Array.from(e.childQueries)){let d=this.queryNodes.get(c);if(!d||!d.relationName)continue;let l=d.relationName,p=d.queryStep.query.resource,y=t.value[l];if(!y)continue;let f=y.value;if(Array.isArray(f))for(let m of f)this.sendInsertsForTree(d,m,p);else f&&typeof f=="object"&&this.sendInsertsForTree(d,f,p);}}handleMutation(e,t){if(e.procedure==="INSERT"){if(this.objectNodes.has(e.resourceId))return;let n=w(t);if(!n)return;let r={id:e.resourceId,type:e.resource,matchedQueries:new Set,referencesObjects:new Map,referencedByObjects:new Map};this.objectNodes.set(e.resourceId,r);let o=this.getRelationalColumns(e.resource);for(let[a,{relationName:s,targetResource:c}]of Array.from(o)){let d=n[a];if(d){this.ensureObjectNode(d,c);let l=this.getInverseRelationName(e.resource,c,s);this.storeRelation(e.resourceId,d,s,l);}}let u=this.objectNodes.get(e.resourceId);this.getMatchingQueries(e,n).then(a=>{for(let s of a){let c=this.queryNodes.get(s);if(c){c.trackedObjects.add(e.resourceId),u&&u.matchedQueries.add(s);for(let d of Array.from(c.subscriptions))try{d(e);}catch(l){this.logger.error("[QueryEngine] Error in subscription callback during INSERT mutation",{error:l,queryHash:c.hash,resource:e.resource,resourceId:e.resourceId,stepPath:c.queryStep.stepPath.join(".")});}}}});return}if(e.procedure==="UPDATE"){let n=w(t);if(!n)return;let r=this.objectNodes.get(e.resourceId),o=new Set((r==null?void 0:r.matchedQueries)??[]);r||(r={id:e.resourceId,type:e.resource,matchedQueries:new Set,referencesObjects:new Map,referencedByObjects:new Map},this.objectNodes.set(e.resourceId,r)),this.updateRelationsFromMutation(e.resource,e.resourceId,n,e.payload),this.getMatchingQueries(e,n).then(u=>{let a=new Set(u),s=[],c=[],d=[];for(let p of u)o.has(p)?d.push(p):s.push(p);for(let p of Array.from(o))a.has(p)||c.push(p);for(let p of s){let y=this.queryNodes.get(p);y&&y.trackedObjects.add(e.resourceId);}for(let p of c){let y=this.queryNodes.get(p);y&&y.trackedObjects.delete(e.resourceId);}let l=this.objectNodes.get(e.resourceId);if(l){for(let p of s)l.matchedQueries.add(p);for(let p of c)l.matchedQueries.delete(p);}for(let p of [...c,...d]){let y=this.queryNodes.get(p);if(y)for(let f of Array.from(y.subscriptions))try{f(e);}catch(m){this.logger.error("[QueryEngine] Error in subscription callback during UPDATE mutation",{error:m,queryHash:y.hash,resource:e.resource,resourceId:e.resourceId,stepPath:y.queryStep.stepPath.join(".")});}}if(s.length>0)for(let p of s){let y=this.queryNodes.get(p);if(!y)continue;let f=this.buildIncludeFromChildQueries(p);this.get({resource:e.resource,where:{id:e.resourceId},include:Object.keys(f).length>0?f:void 0}).then(m=>{!m||m.length===0||this.sendInsertsForTree(y,m[0],e.resource);});}});return}}getMatchingQueries(e,t){let n=[];for(let r of Array.from(this.queryNodes.values()))r.queryStep.query.resource===e.resource&&n.push(r);return n.length===0?ge([]):Promise.all(n.map(async r=>{let o=r.queryStep.query.where,u=r.queryStep.query.resource,a=e.resourceId,s=this.objectNodes.get(a);if(!s)return {hash:r.hash,matches:false};if(r.relationName){let y=r.parentQuery?this.queryNodes.get(r.parentQuery):void 0,f=y==null?void 0:y.queryStep.query.resource,m=f?this.getInverseRelationName(f,u,r.relationName):void 0,h=m?s.referencesObjects.get(m):void 0;if(!h)return {hash:r.hash,matches:false};let g=this.objectNodes.get(h);return !g||!y||!g.matchedQueries.has(y.hash)?{hash:r.hash,matches:false}:{hash:r.hash,matches:true}}if(!o)return {hash:r.hash,matches:true};let c=_(o,u,this.schema),d=Object.keys(c).length>0;if(!d&&t!==void 0)return {hash:r.hash,matches:A(t,o)};let l=await this.storage.get({resource:u,where:{id:a},include:d?c:void 0});if(!l||l.length===0)return {hash:r.hash,matches:false};let p=w(l[0]);return p?{hash:r.hash,matches:A(p,o)}:{hash:r.hash,matches:false}})).then(r=>r.filter(o=>o.matches).map(o=>o.hash))}};var Ge=$e(be());var de=zod.z.object({resource:zod.z.string(),where:zod.z.record(zod.z.string(),zod.z.any()).optional(),include:zod.z.record(zod.z.string(),zod.z.any()).optional(),lastSyncedAt:zod.z.string().optional(),limit:zod.z.coerce.number().optional(),sort:zod.z.array(zod.z.object({key:zod.z.string(),direction:zod.z.enum(["asc","desc"])})).optional()}),Se=zod.z.record(zod.z.string(),zod.z.object({value:zod.z.any().nullable(),_meta:zod.z.object({timestamp:zod.z.string().optional().nullable()}).optional()})),Wt=Se.superRefine((i,e)=>{i.id&&e.addIssue({code:zod.z.ZodIssueCode.custom,message:"Payload cannot have an id"});}),Ue=zod.z.object({id:zod.z.string().optional(),type:zod.z.literal("MUTATE"),resource:zod.z.string(),resourceId:zod.z.string().optional()}),We=zod.z.object({timestamp:zod.z.string().optional(),originMutationId:zod.z.string().optional()}).optional(),U=Ue.extend({procedure:zod.z.string(),payload:zod.z.any().optional(),meta:We}),H=Ue.extend({procedure:zod.z.enum(["INSERT","UPDATE"]),payload:Wt,meta:We});zod.z.union([H,U]);var He=zod.z.object({resource:zod.z.string(),procedure:zod.z.string(),input:zod.z.any().optional()});var Je=de.omit({resource:true}),ve=U.omit({id:true,type:true,resource:true,procedure:true}).extend({meta:U.shape.meta}),we=H.omit({id:true,type:true,resource:true,procedure:true});zod.z.union([we,ve]);var Me=i=>{if(i==null)return i;if(i==="null")return null;if(Array.isArray(i))return i.map(Me);if(typeof i=="object"&&i.constructor===Object){let e={};for(let[t,n]of Object.entries(i))e[t]=Me(n);return e}return i},Ze=i=>{let e=i.logger;return async t=>{var n;try{let r=typeof t.headers.getSetCookie=="function"?Object.fromEntries(t.headers):t.headers,o={headers:r,cookies:r.cookie?Ge.default.parse(r.cookie):{}},u=new URL(t.url),a=u.pathname.split("/"),s=u.searchParams,c=Me(Jt__default.default.parse(s.toString())),d=await((n=i.contextProvider)==null?void 0:n.call(i,{transport:"HTTP",headers:o.headers,cookies:o.cookies,queryParams:c}))??{};if(t.method==="GET"){let l=a[a.length-1],{success:p,data:y,error:f}=Je.safeParse(c);if(!p)return Response.json({message:"Invalid query",code:"INVALID_QUERY",details:f},{status:400});let m=await i.handleQuery({req:{...o,...y,type:"QUERY",resource:l,context:d,queryParams:c}});return !m||!m.data?Response.json({message:"Invalid resource",code:"INVALID_RESOURCE"},{status:400}):Response.json(m.data)}if(t.method==="POST")try{let l=a[a.length-1],p=a[a.length-2];if(p==="query"){if(a.length<3)return Response.json({message:"Invalid path structure for custom query",code:"INVALID_PATH"},{status:400});let g=a[a.length-3],T=t.body?await t.json():{};if(!g||g.trim()==="")return Response.json({message:"Invalid resource in path",code:"INVALID_RESOURCE"},{status:400});let R=await i.handleCustomQuery({req:{...o,type:"CUSTOM_QUERY",resource:g,procedure:l,input:T.input,context:d,queryParams:c}});return Response.json(R)}let y=p,f=t.body?await t.json():{},m;if(l==="insert"||l==="update"){let{success:g,data:T,error:R}=we.safeParse(f);if(!g)return Response.json({message:"Invalid mutation",code:"INVALID_REQUEST",details:R},{status:400});m=T;}else {let{success:g,data:T,error:R}=ve.safeParse(f);if(!g)return Response.json({message:"Invalid mutation",code:"INVALID_REQUEST",details:R},{status:400});m=T;}let h=await i.handleMutation({req:{...o,type:"MUTATE",resource:y,input:m.payload,context:d,resourceId:m.resourceId,procedure:l==="insert"||l==="update"?l.toUpperCase():l,queryParams:{},meta:m.meta}});return Response.json(h)}catch(l){return e.error("Error parsing mutation from the client:",l),Response.json({message:"Internal server error",code:"INTERNAL_SERVER_ERROR"},{status:500})}return Response.json({message:"Not found",code:"NOT_FOUND"},{status:404})}catch(r){return e.error("Unexpected error:",r),Response.json({message:"Internal server error",code:"INTERNAL_SERVER_ERROR"},{status:500})}}};var et=$e(be());var $=zod.z.string(),Ie=zod.z.union([He,de]),Gt=zod.z.object({id:$,type:zod.z.literal("SUBSCRIBE")}).and(Ie),Zt=zod.z.object({id:$,type:zod.z.literal("UNSUBSCRIBE")}).and(Ie),Yt=zod.z.object({id:$,type:zod.z.literal("QUERY")}).and(Ie),Xt=zod.z.object({id:$,type:zod.z.literal("CUSTOM_QUERY"),resource:zod.z.string(),procedure:zod.z.string(),input:zod.z.any().optional()}),Ye=H.extend({id:$}),en=U.extend({id:$}),tn=zod.z.union([en,Ye]),Xe=zod.z.union([Gt,Yt,Xt,tn,Zt]),nn=zod.z.object({id:$,type:zod.z.literal("REJECT"),resource:zod.z.string(),message:zod.z.string().optional()}),rn=zod.z.object({id:$,type:zod.z.literal("REPLY"),data:zod.z.any()});zod.z.union([nn,rn,Ye]);zod.z.object({resource:zod.z.string(),data:zod.z.array(Se)});var tt=i=>{let e={},t=i.logger;return (n,r)=>{var l;let o=p=>{n.send(JSON.stringify(p));},u=se(),a=new Map,s={headers:r.headers,cookies:typeof r.headers.cookie=="string"?et.default.parse(r.headers.cookie):{}},c=Jt.parse(r.url.split("?")[1]),d=(l=i.contextProvider)==null?void 0:l.call(i,{transport:"WEBSOCKET",headers:s.headers,cookies:s.cookies,queryParams:c});e[u]=n,t.info("Client connected:",u),n.on("message",async p=>{try{t.debug("Message received from the client:",p);let y=Xe.parse(JSON.parse(p.toString()));if(y.type==="SUBSCRIBE"||y.type==="QUERY"){let{type:f,id:m,...h}=y,g=f==="SUBSCRIBE";if("procedure"in h){let T=await i.handleCustomQuery({req:{...s,type:"CUSTOM_QUERY",resource:h.resource,procedure:h.procedure,input:h.input,context:await d??{},queryParams:c},subscription:g?R=>{var x;!R.resourceId||!R.payload||!Object.keys(R.payload).length||(x=e[u])==null||x.send(JSON.stringify(R));}:void 0});if(g){if(!T||!T.data||!T.query)throw new Error("Invalid resource");T.unsubscribe&&a.set(N(h),T.unsubscribe),o({id:m,type:"REPLY",data:{resource:T.query.resource,data:(T.data??[]).map(R=>R.value)}});}else o({id:m,type:"REPLY",data:T});}else {let T=await i.handleQuery({req:{...s,...h,type:"QUERY",context:await d??{},queryParams:c},subscription:g?R=>{var x;!R.resourceId||!R.payload||!Object.keys(R.payload).length||(x=e[u])==null||x.send(JSON.stringify(R));}:void 0});if(!T||!T.data)throw new Error("Invalid resource");g&&T.unsubscribe&&a.set(N(h),T.unsubscribe),o({id:m,type:"REPLY",data:{resource:h.resource,data:(T.data??[]).map(R=>R.value)}});}}else if(y.type==="UNSUBSCRIBE"){let{type:f,id:m,...h}=y,g=a.get(N(h));g&&(g(),a.delete(N(h)));}else if(y.type==="CUSTOM_QUERY"){let{resource:f,procedure:m,input:h,id:g}=y;t.debug("Received custom query from client:",y);try{let T=await i.handleCustomQuery({req:{...s,type:"CUSTOM_QUERY",resource:f,procedure:m,input:h,context:await d??{},queryParams:c}});o({id:g,type:"REPLY",data:T});}catch(T){o({id:g,type:"REJECT",resource:f,message:T.message}),t.error("Error handling custom query from the client:",T);}}else if(y.type==="MUTATE"){let{resource:f}=y;t.debug("Received mutation from client:",y);try{let m=await i.handleMutation({req:{...s,type:"MUTATE",resource:f,input:y.payload,context:{messageId:y.id,...await d??{}},resourceId:y.resourceId,procedure:y.procedure,queryParams:c,meta:y.meta}});y.procedure&&y.procedure!=="INSERT"&&y.procedure!=="UPDATE"&&o({id:y.id,type:"REPLY",data:m});}catch(m){o({id:y.id,type:"REJECT",resource:f,message:m.message}),t.error("Error parsing mutation from the client:",m);}}}catch(y){t.error("Error handling message from the client:",y);}}),n.on("close",()=>{t.info("Connection closed",u),delete e[u];for(let p of Array.from(a.values()))p();});}};function nt(i){let e=`${i.protocol}://${i.hostname}${i.url}`,t=new Headers;return Object.entries(i.headers).forEach(([n,r])=>{r&&t.set(n,Array.isArray(r)?r.join(","):r);}),new Request(e,{method:i.method,headers:t,body:i.body&&i.method!=="GET"?JSON.stringify(i.body):void 0})}var Nr=(i,e,t)=>{i.ws(`${(t==null?void 0:t.basePath)??""}/ws`,tt(e)),i.use(`${(t==null?void 0:t.basePath)??""}/`,(n,r)=>{Ze(e)(nt(n)).then(u=>u.json().then(a=>r.status(u.status).send(a)));});};var ye=class i{_collection;_client;_where;_include;_limit;_single;_sort;_shouldAwait;constructor(e,t,n,r,o,u,a,s){this._collection=e,this._client=t,this._where=n??{},this._include=r??{},this._limit=o,this._single=u,this._sort=a,this._shouldAwait=s,this.get=this.get.bind(this),this.subscribe=this.subscribe.bind(this);}where(e){return new i(this._collection,this._client,{...this._where,...e},this._include,this._limit,this._single,this._sort,this._shouldAwait)}include(e){return new i(this._collection,this._client,this._where,{...this._include,...e},this._limit,this._single,this._sort,this._shouldAwait)}limit(e){return new i(this._collection,this._client,this._where,this._include,e,this._single,this._sort,this._shouldAwait)}one(e){return this.first({id:e})}first(e){return new i(this._collection,this._client,e??this._where,this._include,1,true,this._sort,this._shouldAwait)}orderBy(e,t="asc"){let n=[...this._sort??[],{key:e,direction:t}];return new i(this._collection,this._client,this._where,this._include,this._limit,this._single,n,this._shouldAwait)}toJSON(){return {resource:this._collection.name,where:this._where,include:this._include,limit:this._limit,sort:this._sort}}buildQueryRequest(){return {resource:this._collection.name,where:this._where,include:this._include,limit:this._limit,sort:this._sort}}get(){let e=this._client.get(this.buildQueryRequest());return this._shouldAwait?Promise.resolve(e).then(t=>this._single?t[0]:t):this._single?e[0]:e}subscribe(e){return this._client.subscribe(this.buildQueryRequest(),t=>{if(this._single)return e(t[0]);e(t);})}static _init(e,t,n){return new i(e,t,void 0,void 0,void 0,void 0,void 0,n??false)}};var sn=i=>typeof i=="object"&&i!==null&&"value"in i&&!Array.isArray(i),Ce=class{constructor(e){this.storage=e;}get(e){return Promise.resolve(this.storage.get(e)).then(t=>t.map(n=>sn(n)?w(n):n))}subscribe(){throw new Error("Subscriptions are not supported server-side. Use .get() instead.")}};function k(i,e,t){let n=new Ce(i),r=u=>{let a=ye._init(u,n,true);return Object.assign(Object.create(a),{insert:async c=>{let d=i._getTimestamp(),l=await i.rawInsert(u.name,c.id,{value:Object.fromEntries(Object.entries(c).map(([p,y])=>[p,{value:y,_meta:{timestamp:d}}]))},void 0,t);return w(l.data)},update:async(c,d)=>{let l=i._getTimestamp(),{id:p,...y}=d,f=await i.rawUpdate(u.name,c,{value:Object.fromEntries(Object.entries(y).map(([g,T])=>[g,{value:T,_meta:{timestamp:l}}]))},void 0,t),m=w(f.data),h={};for(let g of Object.keys(y))g in m&&(h[g]=m[g]);return h}})},o={get(u,a){if(a==="findOne")return i.findOne.bind(i);if(a==="find")return i.find.bind(i);if(a==="insert")return i.insert.bind(i);if(a==="update")return i.update.bind(i);if(a==="transaction")return async s=>i.transaction(async({trx:c,commit:d,rollback:l})=>{let p=k(c,e,t);return s({trx:p,commit:d,rollback:l})});if(a in e){let s=e[a];return r(s)}}};return new Proxy({},o)}var Le=class i{routes;hooksRegistry=new Map;constructor(e){this.routes=e.routes;for(let t of Object.values(e.routes)){if(t.resourceSchema===void 0)continue;let n=t;n.hooks&&this.hooksRegistry.set(n.resourceSchema.name,n.hooks);}}static create(e){return new i(e)}getHooks(e){return this.hooksRegistry.get(e)}},Kr=i=>Le.create({...i}),it=(i=>({handler:e=>({_type:"query",inputValidator:i??zod.z.undefined(),handler:e})})),at=(i=>({handler:e=>({_type:"mutation",inputValidator:i??zod.z.undefined(),handler:e})})),Ae=class i{resourceSchema;middlewares;customMutations;customQueries;authorization;hooks;constructor(e,t,n,r,o){this.resourceSchema=e,this.middlewares=new Set,this.customMutations=t??{},this.customQueries=n??{},this.authorization=r,this.hooks=o;}use(...e){for(let t of e)this.middlewares.add(t);return this}withProcedures(e){let t=e({mutation:at,query:it}),n={},r={};for(let[o,u]of Object.entries(t))u._type==="mutation"?n[o]=u:r[o]=u;return new i(this.resourceSchema,n,r,this.authorization,this.hooks)}withMutations(e){return this.withProcedures(({mutation:t})=>e({mutation:t}))}withHooks(e){return new i(this.resourceSchema,this.customMutations,this.customQueries,this.authorization,e)}handleQuery=async({req:e,batcher:t})=>await this.wrapInMiddlewares(async n=>{let r={resource:n.resource,where:n.where,include:n.include,lastSyncedAt:n.lastSyncedAt,limit:n.limit,sort:n.sort},o=N(r);return {data:await t.rawFind({resource:n.resource,commonWhere:n.where,uniqueWhere:n.relationalWhere,include:n.include,limit:n.limit,sort:n.sort}),unsubscribe:void 0,queryHash:o}})(e);handleMutation=async({req:e,db:t,schema:n})=>{var a;let r=((a=e.meta)==null?void 0:a.timestamp)??new Date().toISOString(),o=t._setMutationTimestamp(r),u=k(o,n,e.context);return await this.wrapInMiddlewares(async s=>{if(!s.procedure)throw new Error("Procedure is required for mutations");let c=this.customMutations[s.procedure];if(c){let d=c.inputValidator["~standard"].validate(s.input),l=d instanceof Promise?await d:d;if(l.issues){let p=l.issues.map(y=>{var m;let f=(m=y.path)==null?void 0:m.map(h=>typeof h=="object"&&"key"in h?String(h.key):String(h)).join(".");return f?`${f}: ${y.message}`:y.message}).join(", ");throw new Error(`Validation failed: ${p}`)}return s.input=l.value,c.handler({req:s,db:u})}else {if(s.procedure==="INSERT"||s.procedure==="UPDATE")return this.handleSet({req:s,db:o,operation:s.procedure,schema:n});throw new Error(`Unknown procedure: ${s.procedure}`)}})(e)};handleCustomQuery=async({req:e,db:t,schema:n})=>{let r=k(t,n,e.context);return await this.wrapInMiddlewares(async o=>{let u=this.customQueries[o.procedure];if(!u)throw new Error(`Unknown query procedure: ${o.procedure}`);let a=u.inputValidator["~standard"].validate(o.input),s=a instanceof Promise?await a:a;if(s.issues){let c=s.issues.map(d=>{var p;let l=(p=d.path)==null?void 0:p.map(y=>typeof y=="object"&&"key"in y?String(y.key):String(y)).join(".");return l?`${l}: ${d.message}`:d.message}).join(", ");throw new Error(`Validation failed: ${c}`)}return o.input=s.value,u.handler({req:o,db:r})})(e)};getAuthorizationClause(e){var t,n;return (n=(t=this.authorization)==null?void 0:t.read)==null?void 0:n.call(t,{ctx:e.context})}handleSet=async({req:e,db:t,operation:n,schema:r})=>{if(!e.input)throw new Error("Payload is required");if(!e.resourceId)throw new Error("ResourceId is required");let o=await t.rawFindById(e.resource,e.resourceId);if(n==="INSERT"&&o)throw new Error("Resource already exists");if(n==="UPDATE"&&!o)throw new Error("Resource not found");let u={value:e.input};return t.transaction(async({trx:a})=>{var d,l,p,y,f,m,h;if(n==="INSERT"){let{data:g,acceptedValues:T}=await a.rawInsert(e.resource,e.resourceId,u,(d=e.context)==null?void 0:d.messageId,e.context);if(!T)throw new Error("Mutation rejected");let R=w(g);if(R.id=R.id??e.resourceId,(l=this.authorization)!=null&&l.insert){let x=this.authorization.insert({ctx:e.context,value:R});if(typeof x=="boolean"){if(!x)throw new Error("Not authorized")}else {let b=_(x,e.resource,r),S=Object.keys(b).length>0?await a.rawFindById(e.resource,e.resourceId,b):g,M=w(S);if(M.id=M.id??e.resourceId,!A(M,x))throw new Error("Not authorized")}}return {data:g,acceptedValues:T}}if((y=(p=this.authorization)==null?void 0:p.update)!=null&&y.preMutation){let g=w(o);g.id=g.id??e.resourceId;let T=this.authorization.update.preMutation({ctx:e.context,value:g});if(typeof T=="boolean"){if(!T)throw new Error("Not authorized")}else {let R=_(T,e.resource,r),x=Object.keys(R).length>0?await a.rawFindById(e.resource,e.resourceId,R):o,b=w(x);if(b.id=b.id??e.resourceId,!A(b,T))throw new Error("Not authorized")}}let{data:s,acceptedValues:c}=await a.rawUpdate(e.resource,e.resourceId,u,(f=e.context)==null?void 0:f.messageId,e.context);if(!c)throw new Error("Mutation rejected");if((h=(m=this.authorization)==null?void 0:m.update)!=null&&h.postMutation){let g=w(s);g.id=g.id??e.resourceId;let T=this.authorization.update.postMutation({ctx:e.context,value:g});if(typeof T=="boolean"){if(!T)throw new Error("Not authorized")}else {let R=_(T,e.resource,r),x=Object.keys(R).length>0?await a.rawFindById(e.resource,e.resourceId,R):s,b=w(x);if(b.id=b.id??e.resourceId,!A(b,T))throw new Error("Not authorized")}}return {data:s,acceptedValues:c}})};wrapInMiddlewares(e){return t=>Array.from(this.middlewares.values()).reduceRight((n,r)=>o=>r({req:o,next:n}),e)(t)}},je=class{resourceSchema=void 0;middlewares;customMutations;customQueries;constructor(e,t){this.middlewares=new Set,this.customMutations=e??{},this.customQueries=t??{};}use(...e){for(let t of e)this.middlewares.add(t);return this}handleMutation=async({req:e,db:t,schema:n})=>{var a;let r=((a=e.meta)==null?void 0:a.timestamp)??new Date().toISOString(),o=t._setMutationTimestamp(r),u=k(o,n,e.context);return await this.wrapInMiddlewares(async s=>{if(!s.procedure)throw new Error("Procedure is required for mutations");let c=this.customMutations[s.procedure];if(c){let d=c.inputValidator["~standard"].validate(s.input),l=d instanceof Promise?await d:d;if(l.issues){let p=l.issues.map(y=>{var m;let f=(m=y.path)==null?void 0:m.map(h=>typeof h=="object"&&"key"in h?String(h.key):String(h)).join(".");return f?`${f}: ${y.message}`:y.message}).join(", ");throw new Error(`Validation failed: ${p}`)}return s.input=l.value,c.handler({req:s,db:u})}throw new Error(`Unknown procedure: ${s.procedure}`)})(e)};handleCustomQuery=async({req:e,db:t,schema:n})=>{let r=k(t,n,e.context);return await this.wrapInMiddlewares(async o=>{let u=this.customQueries[o.procedure];if(!u)throw new Error(`Unknown query procedure: ${o.procedure}`);let a=u.inputValidator["~standard"].validate(o.input),s=a instanceof Promise?await a:a;if(s.issues){let c=s.issues.map(d=>{var p;let l=(p=d.path)==null?void 0:p.map(y=>typeof y=="object"&&"key"in y?String(y.key):String(y)).join(".");return l?`${l}: ${d.message}`:d.message}).join(", ");throw new Error(`Validation failed: ${c}`)}return o.input=s.value,u.handler({req:o,db:r})})(e)};getAuthorizationClause(){}wrapInMiddlewares(e){return t=>Array.from(this.middlewares.values()).reduceRight((n,r)=>o=>r({req:o,next:n}),e)(t)}};function Ur(i){return {_brand:"TypedMiddleware",_rawMiddleware:({req:t,next:n})=>i({ctx:t.context,req:t,next:r=>(t.context=r,n(t))})}}var Oe=class i{middlewares;constructor(e=[]){this.middlewares=e;}collectionRoute(e,t){return new Ae(e,void 0,void 0,t,void 0).use(...this.middlewares)}withProcedures(e){let t=e({mutation:at,query:it}),n={},r={};for(let[o,u]of Object.entries(t))u._type==="mutation"?n[o]=u:r[o]=u;return new je(n,r).use(...this.middlewares)}use(...e){let t=e.map(n=>n&&n._brand==="TypedMiddleware"?n._rawMiddleware:n);return new i([...this.middlewares,...t])}static create(){return new i}},Wr=Oe.create;var J=class{_mutationTimestamp;_setMutationTimestamp(e){let t=this._clone();return t._mutationTimestamp=e,t}_getTimestamp(){return this._mutationTimestamp??new Date().toISOString()}_clone(){return Object.assign(Object.create(Object.getPrototypeOf(this)),this)}async insert(e,t){let n=this._getTimestamp(),r=await this.rawInsert(e.name,t.id,{value:Object.fromEntries(Object.entries(t).map(([o,u])=>[o,{value:u,_meta:{timestamp:n}}]))});return w(r.data)}async update(e,t,n){let r=this._getTimestamp(),{id:o,...u}=n,a=await this.rawUpdate(e.name,t,{value:Object.fromEntries(Object.entries(u).map(([d,l])=>[d,{value:l,_meta:{timestamp:r}}]))}),s=w(a.data),c={};for(let d of Object.keys(u))d in s&&(c[d]=s[d]);return c}};var pn={postgres:{jsonObjectFrom:postgres.jsonObjectFrom,jsonArrayFrom:postgres.jsonArrayFrom},mysql:{jsonObjectFrom:mysql.jsonObjectFrom,jsonArrayFrom:mysql.jsonArrayFrom},sqlite:{jsonObjectFrom:sqlite.jsonObjectFrom,jsonArrayFrom:sqlite.jsonArrayFrom}};function Q(i){var r,o,u;let e=(r=i.getExecutor)==null?void 0:r.call(i),t=e==null?void 0:e.adapter;if(!t)return "postgres";let n=((u=(o=t.constructor)==null?void 0:o.name)==null?void 0:u.toLowerCase())??"";return n.includes("postgres")?"postgres":n.includes("mysql")?"mysql":n.includes("sqlite")?"sqlite":"postgres"}function st(i){let e=Q(i);return pn[e]}var mn="42701";function G(i){var t;if(i.code===mn)return true;let e=((t=i.message)==null?void 0:t.toLowerCase())||"";return e.includes("already exists")||e.includes("duplicate")||e.includes("already defined")}function Pe(i,e){let{type:t,enumValues:n,enumName:r}=i;if(n&&n.length>0)return e==="postgres"&&r?r:"varchar";if(t==="jsonb"||t==="json")switch(e){case "postgres":return "jsonb";case "mysql":return "json";case "sqlite":return "text"}return t}async function fn(i,e,t,n){if(t!=="postgres")return;let r=new Map;for(let o of Object.values(e))for(let u of Object.values(o.fields)){let a=u.getStorageFieldType();a.enumValues&&a.enumName&&r.set(a.enumName,{name:a.enumName,values:a.enumValues});}for(let o of Array.from(r.values())){let{name:u,values:a}=o;try{let s=a.map(c=>`'${c}'`).join(", ");await kysely.sql`
|
|
2
2
|
DO $$ BEGIN
|
|
3
|
-
CREATE TYPE ${kysely.sql.id(u)} AS ENUM (${kysely.sql.raw(
|
|
3
|
+
CREATE TYPE ${kysely.sql.id(u)} AS ENUM (${kysely.sql.raw(s)});
|
|
4
4
|
EXCEPTION
|
|
5
5
|
WHEN duplicate_object THEN null;
|
|
6
6
|
END $$;
|
|
7
|
-
`.execute(i);}catch(
|
|
7
|
+
`.execute(i);}catch(s){n==null||n.warn("Could not create enum type",u,s);}}}function Z(i,e){return i.some(t=>t.name===e)}function hn(i,e){return (i==null?void 0:i.columns.some(t=>t.name===e))??false}function Ve(i,e){let[t]=e.split(".");return Z(i,t)}function Ee(i,e,t,n=false){let r=i;return e.unique&&(r=r.unique()),e.nullable||(r=r.notNull()),e.primary&&(r=r.primaryKey()),e.default!==void 0&&(r=r.defaultTo(e.default)),!n&&e.references&&Ve(t,e.references)&&(r=r.references(e.references)),r}function Tn(i,e,t,n,r){let o=[];for(let[u,a]of Object.entries(i.fields)){let s=e==null?void 0:e.columns.find(d=>d.name===u),c=a.getStorageFieldType();s?(s.dataType,c.type):(o.push({name:u,storageFieldType:c}),c.references&&!Ve(t,c.references)&&n.push({tableName:r,columnName:u,references:c.references}));}return o}function ot(i,e){return e==="postgres"&&!!i.enumValues&&i.enumValues.length>0&&!!i.enumName}async function gn(i,e,t,n,r,o){if(t.length===0)return;let u=i.schema.createTable(e);for(let{name:a,storageFieldType:s}of t)if(ot(s,r))u=u.addColumn(a,kysely.sql.raw(s.enumName),c=>Ee(c,s,n));else {let c=Pe(s,r);u=u.addColumn(a,c,d=>Ee(d,s,n));}await u.execute().catch(a=>{if(!G(a))throw o==null||o.error("Error creating table",e,a),a});}async function Rn(i,e,t,n,r,o,u){for(let{name:a,storageFieldType:s}of t){let c=s.references?Ve(n,s.references):false,d=ot(s,o)?kysely.sql.raw(s.enumName):Pe(s,o);await i.schema.alterTable(e).addColumn(a,d,l=>Ee(l,s,n,!c)).execute().catch(l=>{if(!G(l))throw u==null||u.error("Error adding column",a,l),l}),s.references&&!c&&!r.some(l=>l.tableName===e&&l.columnName===a)&&r.push({tableName:e,columnName:a,references:s.references}),s.index&&await i.schema.createIndex(`${e}_${a}_index`).on(e).column(a).execute().catch(()=>{});}}async function xn(i,e,t,n,r,o){let u=`${e}_meta`,a=[];for(let[s,c]of Object.entries(t.fields)){let d=c.getStorageFieldType();hn(n,s)||a.push({name:s,storageFieldType:d});}if(!n&&a.length>0){let s=i.schema.createTable(u);for(let{name:c,storageFieldType:d}of a)s=s.addColumn(c,"varchar",l=>{let p=l;return d.primary&&(p=p.primaryKey(),Z(r,e)&&(p=p.references(`${e}.${c}`))),p});await s.execute().catch(c=>{if(!G(c))throw o==null||o.error("Error creating meta table",u,c),c});}else if(n)for(let{name:s,storageFieldType:c}of a)await i.schema.alterTable(u).addColumn(s,"varchar",d=>{let l=d;return c.primary&&(l=l.primaryKey(),Z(r,e)&&(l=l.references(`${e}.${s}`))),l}).execute().catch(d=>{if(!G(d))throw o==null||o.error("Error adding meta column",s,d),d});}async function ut(i,e,t,n,r){let[o,u]=n.split("."),a=`${e}_${t}_fk`;try{await kysely.sql`
|
|
8
8
|
ALTER TABLE ${kysely.sql.id(e)}
|
|
9
|
-
ADD CONSTRAINT ${kysely.sql.id(
|
|
9
|
+
ADD CONSTRAINT ${kysely.sql.id(a)}
|
|
10
10
|
FOREIGN KEY (${kysely.sql.id(t)})
|
|
11
11
|
REFERENCES ${kysely.sql.id(o)} (${kysely.sql.id(u)})
|
|
12
|
-
`.execute(i);}catch(a){G(a)||r==null||r.warn("Could not add foreign key constraint",e,t,n,a);}}async function Sn(i,e,t,n){for(let{tableName:r,columnName:o,references:u}of e){let s=t.find(d=>d.name===r),a=s==null?void 0:s.columns.find(d=>d.name===o),[c]=u.split(".");s&&a&&Z(t,c)&&await ut(i,r,o,u,n);}}async function vn(i,e,t,n){for(let[r,o]of Object.entries(e)){let u=`${r}_meta`,s=t.find(a=>a.name===u);if(s)for(let[a,c]of Object.entries(o.fields)){let d=c.getStorageFieldType(),l=s.columns.find(p=>p.name===a);d.primary&&l&&Z(t,r)&&await ut(i,u,a,`${r}.${a}`,n);}}}async function ct(i,e,t){let n=q(i),r=await i.introspection.getTables(),o=[];await fn(i,e,n,t);for(let[s,a]of Object.entries(e)){let c=r.find(p=>p.name===s),d=r.find(p=>p.name===`${s}_meta`),l=Tn(a,c,r,o,s);if(c)for(let[p,y]of Object.entries(a.fields)){let f=c.columns.find(g=>g.name===p),m=y.getStorageFieldType(),h=Pe(m,n);f&&f.dataType!==h&&(t==null||t.warn("Column type mismatch:",p,"expected to have type:",h,"but has type:",f.dataType));}!c&&l.length>0?await gn(i,s,l,r,n,t):c&&await Rn(i,s,l,r,o,n,t),await bn(i,s,a,d,r,t);}let u=await i.introspection.getTables();await Sn(i,o,u,t),await vn(i,e,u,t);}function pe(i,e,t,n){if(!i)throw new Error("Schema not initialized");let r=i[e];if(!r)throw new Error("Resource not found");let o=n.$or,u=n.$and;return (o?t.or:t.and)(o?n.$or.map(s=>pe(i,e,t,s)):u?n.$and.map(s=>pe(i,e,t,s)):Object.entries(n).map(([s,a])=>{var c,d;if(r.fields[s])return (a==null?void 0:a.$eq)!==void 0?t(`${e}.${s}`,a.$eq===null?"is":"=",a.$eq):(a==null?void 0:a.$in)!==void 0?t(`${e}.${s}`,"in",a.$in):(a==null?void 0:a.$not)!==void 0?((c=a==null?void 0:a.$not)==null?void 0:c.$in)!==void 0?t(`${e}.${s}`,"not in",a.$not.$in):((d=a==null?void 0:a.$not)==null?void 0:d.$eq)!==void 0?t(`${e}.${s}`,a.$not.$eq===null?"is not":"!=",a.$not.$eq):t(`${e}.${s}`,a.$not===null?"is not":"!=",a.$not):(a==null?void 0:a.$gt)!==void 0?t(`${e}.${s}`,">",a.$gt):(a==null?void 0:a.$gte)!==void 0?t(`${e}.${s}`,">=",a.$gte):(a==null?void 0:a.$lt)!==void 0?t(`${e}.${s}`,"<",a.$lt):(a==null?void 0:a.$lte)!==void 0?t(`${e}.${s}`,"<=",a.$lte):t(`${e}.${s}`,a===null?"is":"=",a);if(r.relations[s]){let l=r.relations[s],p=l.entity.name;return l.type==="many"?t.exists(fe(i,p,t.selectFrom(p).select("id").whereRef(l.foreignColumn,"=",`${e}.id`),a)):pe(i,p,t,a)}return null}).filter(Boolean))}function me(i,e,t,n){let r=i[e];if(!r)throw new Error("Resource not found");if(!n)return t;if(n.$and){for(let o of n.$and)t=me(i,e,t,o);return t}else if(n.$or){for(let o of n.$or)t=me(i,e,t,o);return t}for(let[o,u]of Object.entries(n)){if(!r.relations[o])continue;let s=r.relations[o],a=s.entity.name,c=s.type==="one"?"id":s.foreignColumn,d=s.type==="one"?s.relationalColumn:"id";t=t.leftJoin(a,`${a}.${c}`,`${e}.${d}`),u instanceof Object&&!Array.isArray(u)&&u!==null&&(t=me(i,a,t,u));}return t}function fe(i,e,t,n){return !n||Object.keys(n).length===0?t:(t=me(i,e,t,n),t.where(r=>pe(i,e,r,n)))}function xn(i,e,t,n,r){let o=q(r),u=e[t];if(o==="sqlite"&&(u!=null&&u.fields)){let s=Object.keys(u.fields),a=i.selectFrom(n);for(let c of s)a=a.select(`${n}.${c}`);return a}return i.selectFrom(n).selectAll(n)}function wn(i,e,t,n,r){let o=q(r),u=e[t];if(o==="sqlite"&&(u!=null&&u.fields)){let s=Object.keys(u.fields),a=i.selectFrom(n);for(let c of s)a=a.select(`${n}.${c}`);return a}return i.selectFrom(n).selectAll(n)}function he(i,e,t,n,r,o){if(!n)return t;if(!i)throw new Error("Schema not initialized");let u=i[e];if(!u)throw new Error(`Resource not found: ${e}`);let{jsonObjectFrom:s,jsonArrayFrom:a}=r;for(let c of Object.keys(n)){if(!u.relations[c])throw new Error(`Relation ${c} not found in resource ${e}`);let d=u.relations[c],l=d.entity.name,p=n[c],y=d.type==="one"?"id":d.foreignColumn,f=d.type==="one"?d.relationalColumn:"id",m=d.type==="one"?s:a,h=ue(p)?p:null,g=h==null?void 0:h.include;t=t.select(T=>{let R=`${l}_meta`,b=wn(T,i,l,l,o).whereRef(`${l}.${y}`,"=",`${e}.${f}`).select(S=>s(xn(S,i,l,R,o).whereRef(`${R}.id`,"=",`${l}.id`)).as("_meta"));if(h!=null&&h.where&&(b=fe(i,l,b,h.where)),h!=null&&h.orderBy)for(let S of h.orderBy)b=b.orderBy(`${l}.${S.key}`,S.direction);return (h==null?void 0:h.limit)!==void 0&&(b=b.limit(h.limit)),g&&Object.keys(g).length>0&&(b=he(i,l,b,g,r,o)),m(b).as(c)});}return t}var Ne=class i extends J{db;dialectHelpers;schema;logger;server;mutationStack=[];constructor(e,t,n,r){super(),this.isKyselyLike(e)?this.db=e:this.db=new kysely.Kysely({dialect:new kysely.PostgresDialect({pool:e})}),this.dialectHelpers=st(this.db),this.schema=t,this.logger=n,this.server=r,this.rawInsert=this.rawInsert.bind(this),this.rawUpdate=this.rawUpdate.bind(this);}async init(e,t,n){this.schema=e,this.logger=t,this.server=n,await ct(this.db,e,t);}selectMetaColumns(e,t,n){var u;let r=q(this.db),o=(u=this.schema)==null?void 0:u[t];if(r==="sqlite"&&(o!=null&&o.fields)){let s=Object.keys(o.fields),a=e.selectFrom(n);for(let c of s)a=a.select(`${n}.${c}`);return a}return e.selectFrom(n).selectAll(n)}async rawFindById(e,t,n){if(!this.schema)throw new Error("Schema not initialized");let r=`${e}_meta`,o=await this.db.selectFrom(e).where("id","=",t).selectAll(e).select(a=>this.dialectHelpers.jsonObjectFrom(this.selectMetaColumns(a,e,r).whereRef(`${r}.id`,"=",`${e}.id`)).as("_meta"));o=he(this.schema,e,o,n,this.dialectHelpers,this.db);let u=await o.executeTakeFirst();if(!u)return;let s=this.parseRelationalJsonStrings(u,e);return this.convertToMaterializedLiveType(s,e)}async findOne(e,t,n){let r=await this.rawFindById(e.name,t,n==null?void 0:n.include);if(r)return w(r)}async get(e){if(!this.schema)throw new Error("Schema not initialized");let{resource:t,where:n,include:r,limit:o,sort:u}=e,s=`${t}_meta`,a=this.db.selectFrom(t).selectAll(t).select(d=>this.dialectHelpers.jsonObjectFrom(this.selectMetaColumns(d,t,s).whereRef(`${s}.id`,"=",`${t}.id`)).as("_meta"));a=fe(this.schema,t,a,n),a=he(this.schema,t,a,r,this.dialectHelpers,this.db),o!==void 0&&(a=a.limit(o)),u!==void 0&&u.forEach(d=>{a=a.orderBy(d.key,d.direction);});let c=await a.execute();return c.length===0?[]:c.map(d=>{let l=this.parseRelationalJsonStrings(d,t);return this.convertToMaterializedLiveType(l,t)})}async find(e,t){return (await this.get({resource:e.name,where:t==null?void 0:t.where,include:t==null?void 0:t.include,limit:t==null?void 0:t.limit,sort:t==null?void 0:t.sort})).map(r=>w(r))}async rawInsert(e,t,n,r,o){var m,h,g,T,R,b,S;let u=(h=(m=this.server)==null?void 0:m.router)==null?void 0:h.getHooks(e),s=(g=this.schema)==null?void 0:g[e],[a,c]=((T=s==null?void 0:s.mergeMutation)==null?void 0:T.call(s,"set",n.value,void 0))??[n,n.value];if(!c)return {data:n,acceptedValues:null};let d=a,l={...d,value:{...d.value,id:{value:t}}};if(u!=null&&u.beforeInsert){let v=w(l);v.id=t;let M=await u.beforeInsert({ctx:o,value:v,rawValue:l,db:this});M&&(d=M);}let p={},y={};for(let[v,M]of Object.entries(d.value)){let C=(R=M._meta)==null?void 0:R.timestamp;if(!C)continue;let L=(S=(b=s==null?void 0:s.fields[v])==null?void 0:b.getStorageFieldType)==null?void 0:S.call(b);(L==null?void 0:L.type)==="jsonb"||(L==null?void 0:L.type)==="json"?p[v]=JSON.stringify(M.value):p[v]=M.value,y[v]=C;}await this.db.insertInto(e).values({...p,id:t}).execute(),await this.db.insertInto(`${e}_meta`).values({...y,id:t}).execute();let f=this.buildMutation(e,t,"INSERT",d,r);if(f&&this.trackMutation(f,d),u!=null&&u.afterInsert){let v={...d,value:{...d.value,id:{value:t}}},M=w(v);M.id=t,await u.afterInsert({ctx:o,value:M,rawValue:v,db:this});}return {data:d,acceptedValues:c}}async rawUpdate(e,t,n,r,o){var h,g,T,R,b,S,v;let u=(g=(h=this.server)==null?void 0:h.router)==null?void 0:g.getHooks(e),s=(T=this.schema)==null?void 0:T[e],a=await this.rawFindById(e,t),[c,d]=((R=s==null?void 0:s.mergeMutation)==null?void 0:R.call(s,"set",n.value,a))??[n,n.value];if(!d)return {data:n,acceptedValues:null};let l=c,p={...l,value:{...l.value,id:{value:t}}};if(u!=null&&u.beforeUpdate){let M=w(p);M.id=t;let C;if(a){let j={...a,value:{...a.value,id:{value:t}}};C=w(j),C.id=t;}let L=await u.beforeUpdate({ctx:o,value:M,rawValue:p,previousValue:C,previousRawValue:a,db:this});L&&(l=L);}let y={},f={};for(let[M,C]of Object.entries(l.value)){let L=(b=C._meta)==null?void 0:b.timestamp;if(!L)continue;let j=(v=(S=s==null?void 0:s.fields[M])==null?void 0:S.getStorageFieldType)==null?void 0:v.call(S);(j==null?void 0:j.type)==="jsonb"||(j==null?void 0:j.type)==="json"?y[M]=JSON.stringify(C.value):y[M]=C.value,f[M]=L;}if(Object.keys(y).length===0)return {data:l,acceptedValues:d};await Promise.all([this.db.updateTable(e).set(y).where("id","=",t).execute(),this.db.insertInto(`${e}_meta`).values({...f,id:t}).onConflict(M=>M.column("id").doUpdateSet(f)).execute()]);let m=this.buildMutation(e,t,"UPDATE",l,r);if(m){let M=await this.rawFindById(e,t);M&&this.trackMutation(m,M);}if(u!=null&&u.afterUpdate){let M=await this.rawFindById(e,t);if(M){let C={...M,value:{...M.value,id:{value:t}}},L=w(C);L.id=t;let j;if(a){let dt={...a,value:{...a.value,id:{value:t}}};j=w(dt),j.id=t;}await u.afterUpdate({ctx:o,value:L,rawValue:C,previousValue:j,previousRawValue:a,db:this});}}return {data:l,acceptedValues:d}}async transaction(e){if(!this.schema)throw new Error("Schema not initialized");if(this.db.isTransaction){let o=Math.random().toString(36).substring(2,15),u=this.mutationStack,s=[];this.mutationStack=s;let a=await this.db.savepoint(o).execute(),c=false,d=false;try{return await e({trx:this,commit:async()=>{await a.releaseSavepoint(o).execute(),c=!0,u.push(...s);},rollback:async()=>{await a.rollbackToSavepoint(o).execute(),d=!0,s.length=0;}}).then(l=>a.isCommitted||a.isRolledBack||c||d?l:a.releaseSavepoint(o).execute().then(()=>(u.push(...s),l)))}catch(l){throw d||await a.rollbackToSavepoint(o).execute().catch(()=>{}),s.length=0,l}finally{this.mutationStack=u;}}let t=[],n=this.mutationStack;this.mutationStack=t;let r=await this.db.startTransaction().execute();try{let o=new i(r,this.schema,this.logger,this.server);return o.mutationStack=t,await e({trx:o,commit:async()=>{await r.commit().execute(),this.notifyMutations(t);},rollback:async()=>{await r.rollback().execute(),t.length=0;}}).then(u=>r.isCommitted||r.isRolledBack?u:r.commit().execute().then(()=>(this.notifyMutations(t),u)))}catch(o){throw await r.rollback().execute(),t.length=0,o}finally{this.mutationStack=n;}}get internalDB(){return this.db}isRelationalField(e,t){var r;if(!this.schema)return false;let n=this.schema[e];return !!((r=n==null?void 0:n.relations)!=null&&r[t])}parseRelationalJsonStrings(e,t){var o,u;if(q(this.db)!=="sqlite"||typeof e!="object"||e===null||e instanceof Date)return e;if(Array.isArray(e))return e.map(s=>this.parseRelationalJsonStrings(s,t));let r={};for(let[s,a]of Object.entries(e))if(s==="_meta"&&typeof a=="string")if(a.startsWith("{")&&a.endsWith("}")||a.startsWith("[")&&a.endsWith("]"))try{r[s]=JSON.parse(a);}catch{r[s]=a;}else r[s]=a;else if(this.isRelationalField(t,s))if(typeof a=="string")if(a.startsWith("{")&&a.endsWith("}")||a.startsWith("[")&&a.endsWith("]"))try{let c=JSON.parse(a);if(this.schema){let d=this.schema[t],l=(o=d==null?void 0:d.relations)==null?void 0:o[s];if(l){let p=l.entity.name;r[s]=this.parseRelationalJsonStrings(c,p);}else r[s]=c;}else r[s]=c;}catch{r[s]=a;}else r[s]=a;else if(typeof a=="object"&&a!==null&&!Array.isArray(a))if(this.schema){let c=this.schema[t],d=(u=c==null?void 0:c.relations)==null?void 0:u[s];if(d){let l=d.entity.name;r[s]=this.parseRelationalJsonStrings(a,l);}else r[s]=a;}else r[s]=a;else Array.isArray(a)?r[s]=a.map(c=>{var d,l;if(typeof c=="string")try{let p=JSON.parse(c);if(this.schema){let y=this.schema[t],f=(d=y==null?void 0:y.relations)==null?void 0:d[s];if(f){let m=f.entity.name;return this.parseRelationalJsonStrings(p,m)}}return p}catch{return c}if(typeof c=="object"&&c!==null&&this.schema){let p=this.schema[t],y=(l=p==null?void 0:p.relations)==null?void 0:l[s];if(y){let f=y.entity.name;return this.parseRelationalJsonStrings(c,f)}}return c}):r[s]=a;else r[s]=a;return r}convertToMaterializedLiveType(e,t){var r;let n=(r=this.schema)==null?void 0:r[t];return {value:Object.entries(e).reduce((o,[u,s])=>{var l,p,y,f,m,h,g,T,R;if(u==="_meta")return o;let a=(p=(l=n==null?void 0:n.fields[u])==null?void 0:l.getStorageFieldType)==null?void 0:p.call(l),c=(a==null?void 0:a.type)==="jsonb"||(a==null?void 0:a.type)==="json",d=(n==null?void 0:n.relations)&&u in n.relations;if(u==="id")o[u]={value:s};else if(c)o[u]={value:s,_meta:{timestamp:(y=e==null?void 0:e._meta)==null?void 0:y[u]}};else if(d){let b=n.relations[u].entity,S=(b==null?void 0:b.name)??t;Array.isArray(s)?o[u]={value:s.map(v=>this.convertToMaterializedLiveType(v,S)),_meta:{timestamp:(f=e==null?void 0:e._meta)==null?void 0:f[u],relation:true}}:s!==null&&typeof s=="object"?o[u]={...this.convertToMaterializedLiveType(s,S),_meta:{timestamp:(m=e==null?void 0:e._meta)==null?void 0:m[u],relation:true}}:o[u]={value:s,_meta:{timestamp:(h=e==null?void 0:e._meta)==null?void 0:h[u],relation:true}};}else Array.isArray(s)?o[u]={value:s,_meta:{timestamp:(g=e==null?void 0:e._meta)==null?void 0:g[u]}}:typeof s=="object"&&s!==null&&!(s instanceof Date)?o[u]={value:s,_meta:{timestamp:(T=e==null?void 0:e._meta)==null?void 0:T[u]}}:o[u]={value:s,_meta:{timestamp:(R=e==null?void 0:e._meta)==null?void 0:R[u]}};return o},{})}}isKyselyLike(e){if(e instanceof kysely.Kysely)return true;if(!e||typeof e!="object")return false;let t=e,n=typeof t.selectFrom=="function",r=typeof t.startTransaction=="function",o=typeof t.savepoint=="function",u=typeof t.isTransaction=="boolean"||typeof t.isTransaction=="function";return n&&r||o&&u}buildMutation(e,t,n,r,o){var s;let u={};for(let[a,c]of Object.entries(r.value)){if(a==="id")continue;let d=(s=c._meta)==null?void 0:s.timestamp;d&&(u[a]={value:c.value,_meta:{timestamp:d}});}return Object.keys(u).length===0?null:{id:o??se(),type:"MUTATE",resource:e,resourceId:t,procedure:n,payload:u}}trackMutation(e,t){this.db.isTransaction?this.mutationStack.push({mutation:e,entityData:t}):this.notifyMutations([e],t);}notifyMutations(e,t){if(this.server)if(t!==void 0){let n=e;for(let r of n)this.server.notifySubscribers(r,t);}else {let n=e;for(let{mutation:r,entityData:o}of n)this.server.notifySubscribers(r,o);}}};var qe=class i{router;storage;schema;middlewares=new Set;logger;contextProvider;queryEngine;constructor(e){var t;this.router=e.router,this.storage=e.storage,this.schema=e.schema,this.logger=Be({level:e.logLevel??Q.INFO}),(t=e.middlewares)==null||t.forEach(n=>{this.middlewares.add(n);}),this.storage.init(this.schema,this.logger,this),this.contextProvider=e.contextProvider,this.queryEngine=new ce({router:{get:async(n,r)=>{var l;let{headers:o,cookies:u,queryParams:s,context:a}=(r==null?void 0:r.context)??{};if(!(r!=null&&r.batcher))throw new Error("Batcher is required");let c={...n,type:"QUERY",headers:o,cookies:u,queryParams:s,context:a},d=await((l=this.router.routes[n.resource])==null?void 0:l.handleQuery({req:c,batcher:r.batcher}));return (d==null?void 0:d.data)??[]},incrementQueryStep:(n,r={})=>{var s;let o=(s=this.router.routes[n.query.resource])==null?void 0:s.getAuthorizationClause({...n.query,type:"QUERY",headers:r.headers,cookies:r.cookies,queryParams:r.queryParams,context:r.context});if(typeof o=="boolean"&&!o)throw new Error("Not authorized");let u=K(n.query.where,typeof o=="object"?o:void 0);return {...n,query:{...n.query,where:u}}}},storage:this.storage,schema:this.schema,logger:this.logger});}static create(e){return new i(e)}handleQuery(e){return this.wrapInMiddlewares(async t=>{let{headers:n,cookies:r,queryParams:o,context:u,...s}=t,a={headers:n,cookies:r,queryParams:o,context:u},c=e.subscription?this.queryEngine.subscribe(s,l=>{var p;(p=e.subscription)==null||p.call(e,l);},a):void 0;return {data:await this.queryEngine.get(s,{context:a}),unsubscribe:c}})(e.req)}async handleMutation(e){return await this.wrapInMiddlewares(async n=>{let r=this.router.routes[n.resource];if(!r)throw new Error("Invalid resource");return r.handleMutation({req:n,db:this.storage,schema:this.schema})})(e.req)}async handleCustomQuery(e){let t=await this.wrapInMiddlewares(async p=>{let y=this.router.routes[p.resource];if(!y)throw new Error("Invalid resource");return y.handleCustomQuery({req:p,db:this.storage,schema:this.schema})})(e.req);if(!(typeof t=="object"&&t!==null&&"buildQueryRequest"in t&&typeof t.buildQueryRequest=="function")){if(e.subscription)throw new Error("Subscriptions require custom queries to return a QueryBuilder");return t}let{headers:r,cookies:o,queryParams:u,context:s}=e.req,a={headers:r,cookies:o,queryParams:u,context:s},c=t.buildQueryRequest(),d=e.subscription?this.queryEngine.subscribe(c,p=>{var y;(y=e.subscription)==null||y.call(e,p);},a):void 0,l=await this.queryEngine.get(c,{context:a});return e.subscription?{data:l,unsubscribe:d,query:c}:l.map(p=>w(p))}use(e){return this.middlewares.add(e),this}context(e){return this.contextProvider=e,this}notifySubscribers(e,t){this.queryEngine.handleMutation(e,t);}wrapInMiddlewares(e){return t=>Array.from(this.middlewares.values()).reduceRight((n,r)=>o=>r({req:o,next:n}),e)(t)}},vi=qe.create;exports.ProcedureRoute=je;exports.Route=Ae;exports.RouteFactory=Ee;exports.Router=Ce;exports.SQLStorage=Ne;exports.Server=qe;exports.Storage=J;exports.createServerDB=k;exports.expressAdapter=Nr;exports.routeFactory=Ur;exports.router=Kr;exports.server=vi;
|
|
12
|
+
`.execute(i);}catch(s){G(s)||r==null||r.warn("Could not add foreign key constraint",e,t,n,s);}}async function bn(i,e,t,n){for(let{tableName:r,columnName:o,references:u}of e){let a=t.find(d=>d.name===r),s=a==null?void 0:a.columns.find(d=>d.name===o),[c]=u.split(".");a&&s&&Z(t,c)&&await ut(i,r,o,u,n);}}async function Sn(i,e,t,n){for(let[r,o]of Object.entries(e)){let u=`${r}_meta`,a=t.find(s=>s.name===u);if(a)for(let[s,c]of Object.entries(o.fields)){let d=c.getStorageFieldType(),l=a.columns.find(p=>p.name===s);d.primary&&l&&Z(t,r)&&await ut(i,u,s,`${r}.${s}`,n);}}}async function ct(i,e,t){let n=Q(i),r=await i.introspection.getTables(),o=[];await fn(i,e,n,t);for(let[a,s]of Object.entries(e)){let c=r.find(p=>p.name===a),d=r.find(p=>p.name===`${a}_meta`),l=Tn(s,c,r,o,a);if(c)for(let[p,y]of Object.entries(s.fields)){let f=c.columns.find(g=>g.name===p),m=y.getStorageFieldType(),h=Pe(m,n);f&&f.dataType!==h&&(t==null||t.warn("Column type mismatch:",p,"expected to have type:",h,"but has type:",f.dataType));}!c&&l.length>0?await gn(i,a,l,r,n,t):c&&await Rn(i,a,l,r,o,n,t),await xn(i,a,s,d,r,t);}let u=await i.introspection.getTables();await bn(i,o,u,t),await Sn(i,e,u,t);}function pe(i,e,t,n){if(!i)throw new Error("Schema not initialized");let r=i[e];if(!r)throw new Error("Resource not found");let o=n.$or,u=n.$and;return (o?t.or:t.and)(o?n.$or.map(a=>pe(i,e,t,a)):u?n.$and.map(a=>pe(i,e,t,a)):Object.entries(n).map(([a,s])=>{var c,d;if(r.fields[a])return (s==null?void 0:s.$eq)!==void 0?t(`${e}.${a}`,s.$eq===null?"is":"=",s.$eq):(s==null?void 0:s.$in)!==void 0?t(`${e}.${a}`,"in",s.$in):(s==null?void 0:s.$not)!==void 0?((c=s==null?void 0:s.$not)==null?void 0:c.$in)!==void 0?t(`${e}.${a}`,"not in",s.$not.$in):((d=s==null?void 0:s.$not)==null?void 0:d.$eq)!==void 0?t(`${e}.${a}`,s.$not.$eq===null?"is not":"!=",s.$not.$eq):t(`${e}.${a}`,s.$not===null?"is not":"!=",s.$not):(s==null?void 0:s.$gt)!==void 0?t(`${e}.${a}`,">",s.$gt):(s==null?void 0:s.$gte)!==void 0?t(`${e}.${a}`,">=",s.$gte):(s==null?void 0:s.$lt)!==void 0?t(`${e}.${a}`,"<",s.$lt):(s==null?void 0:s.$lte)!==void 0?t(`${e}.${a}`,"<=",s.$lte):t(`${e}.${a}`,s===null?"is":"=",s);if(r.relations[a]){let l=r.relations[a],p=l.entity.name;return l.type==="many"?t.exists(fe(i,p,t.selectFrom(p).select("id").whereRef(l.foreignColumn,"=",`${e}.id`),s)):pe(i,p,t,s)}return null}).filter(Boolean))}function me(i,e,t,n){let r=i[e];if(!r)throw new Error("Resource not found");if(!n)return t;if(n.$and){for(let o of n.$and)t=me(i,e,t,o);return t}else if(n.$or){for(let o of n.$or)t=me(i,e,t,o);return t}for(let[o,u]of Object.entries(n)){if(!r.relations[o])continue;let a=r.relations[o],s=a.entity.name,c=a.type==="one"?"id":a.foreignColumn,d=a.type==="one"?a.relationalColumn:"id";t=t.leftJoin(s,`${s}.${c}`,`${e}.${d}`),u instanceof Object&&!Array.isArray(u)&&u!==null&&(t=me(i,s,t,u));}return t}function fe(i,e,t,n){return !n||Object.keys(n).length===0?t:(t=me(i,e,t,n),t.where(r=>pe(i,e,r,n)))}function vn(i,e,t,n,r){let o=Q(r),u=e[t];if(o==="sqlite"&&(u!=null&&u.fields)){let a=Object.keys(u.fields),s=i.selectFrom(n);for(let c of a)s=s.select(`${n}.${c}`);return s}return i.selectFrom(n).selectAll(n)}function wn(i,e,t,n,r){let o=Q(r),u=e[t];if(o==="sqlite"&&(u!=null&&u.fields)){let a=Object.keys(u.fields),s=i.selectFrom(n);for(let c of a)s=s.select(`${n}.${c}`);return s}return i.selectFrom(n).selectAll(n)}function he(i,e,t,n,r,o){if(!n)return t;if(!i)throw new Error("Schema not initialized");let u=i[e];if(!u)throw new Error(`Resource not found: ${e}`);let{jsonObjectFrom:a,jsonArrayFrom:s}=r;for(let c of Object.keys(n)){if(!u.relations[c])throw new Error(`Relation ${c} not found in resource ${e}`);let d=u.relations[c],l=d.entity.name,p=n[c],y=d.type==="one"?"id":d.foreignColumn,f=d.type==="one"?d.relationalColumn:"id",m=d.type==="one"?a:s,h=ue(p)?p:null,g=h==null?void 0:h.include;t=t.select(T=>{let R=`${l}_meta`,x=wn(T,i,l,l,o).whereRef(`${l}.${y}`,"=",`${e}.${f}`).select(b=>a(vn(b,i,l,R,o).whereRef(`${R}.id`,"=",`${l}.id`)).as("_meta"));if(h!=null&&h.where&&(x=fe(i,l,x,h.where)),h!=null&&h.orderBy)for(let b of h.orderBy)x=x.orderBy(`${l}.${b.key}`,b.direction);return (h==null?void 0:h.limit)!==void 0&&(x=x.limit(h.limit)),g&&Object.keys(g).length>0&&(x=he(i,l,x,g,r,o)),m(x).as(c)});}return t}var Ne=class i extends J{db;dialectHelpers;schema;logger;server;mutationStack=[];constructor(e,t,n,r){super(),this.isKyselyLike(e)?this.db=e:this.db=new kysely.Kysely({dialect:new kysely.PostgresDialect({pool:e})}),this.dialectHelpers=st(this.db),this.schema=t,this.logger=n,this.server=r,this.rawInsert=this.rawInsert.bind(this),this.rawUpdate=this.rawUpdate.bind(this);}async init(e,t,n){this.schema=e,this.logger=t,this.server=n,await ct(this.db,e,t);}selectMetaColumns(e,t,n){var u;let r=Q(this.db),o=(u=this.schema)==null?void 0:u[t];if(r==="sqlite"&&(o!=null&&o.fields)){let a=Object.keys(o.fields),s=e.selectFrom(n);for(let c of a)s=s.select(`${n}.${c}`);return s}return e.selectFrom(n).selectAll(n)}async rawFindById(e,t,n){if(!this.schema)throw new Error("Schema not initialized");let r=`${e}_meta`,o=await this.db.selectFrom(e).where("id","=",t).selectAll(e).select(s=>this.dialectHelpers.jsonObjectFrom(this.selectMetaColumns(s,e,r).whereRef(`${r}.id`,"=",`${e}.id`)).as("_meta"));o=he(this.schema,e,o,n,this.dialectHelpers,this.db);let u=await o.executeTakeFirst();if(!u)return;let a=this.parseRelationalJsonStrings(u,e);return this.convertToMaterializedLiveType(a,e)}async findOne(e,t,n){let r=await this.rawFindById(e.name,t,n==null?void 0:n.include);if(r)return w(r)}async get(e){if(!this.schema)throw new Error("Schema not initialized");let{resource:t,where:n,include:r,limit:o,sort:u}=e,a=`${t}_meta`,s=this.db.selectFrom(t).selectAll(t).select(d=>this.dialectHelpers.jsonObjectFrom(this.selectMetaColumns(d,t,a).whereRef(`${a}.id`,"=",`${t}.id`)).as("_meta"));s=fe(this.schema,t,s,n),s=he(this.schema,t,s,r,this.dialectHelpers,this.db),o!==void 0&&(s=s.limit(o)),u!==void 0&&u.forEach(d=>{s=s.orderBy(d.key,d.direction);});let c=await s.execute();return c.length===0?[]:c.map(d=>{let l=this.parseRelationalJsonStrings(d,t);return this.convertToMaterializedLiveType(l,t)})}async find(e,t){return (await this.get({resource:e.name,where:t==null?void 0:t.where,include:t==null?void 0:t.include,limit:t==null?void 0:t.limit,sort:t==null?void 0:t.sort})).map(r=>w(r))}async rawInsert(e,t,n,r,o){var m,h,g,T,R,x,b;let u=(h=(m=this.server)==null?void 0:m.router)==null?void 0:h.getHooks(e),a=(g=this.schema)==null?void 0:g[e],[s,c]=((T=a==null?void 0:a.mergeMutation)==null?void 0:T.call(a,"set",n.value,void 0))??[n,n.value];if(!c)return {data:n,acceptedValues:null};let d=s,l={...d,value:{...d.value,id:{value:t}}};if(u!=null&&u.beforeInsert){let S=w(l);S.id=t;let M=await u.beforeInsert({ctx:o,value:S,rawValue:l,db:this});M&&(d=M);}let p={},y={};for(let[S,M]of Object.entries(d.value)){let L=(R=M._meta)==null?void 0:R.timestamp;if(!L)continue;let C=(b=(x=a==null?void 0:a.fields[S])==null?void 0:x.getStorageFieldType)==null?void 0:b.call(x);(C==null?void 0:C.type)==="jsonb"||(C==null?void 0:C.type)==="json"?p[S]=JSON.stringify(M.value):p[S]=M.value,y[S]=L;}await this.db.insertInto(e).values({...p,id:t}).execute(),await this.db.insertInto(`${e}_meta`).values({...y,id:t}).execute();let f=this.buildMutation(e,t,"INSERT",d,r,o==null?void 0:o.messageId);if(f&&this.trackMutation(f,d),u!=null&&u.afterInsert){let S={...d,value:{...d.value,id:{value:t}}},M=w(S);M.id=t,await u.afterInsert({ctx:o,value:M,rawValue:S,db:this});}return {data:d,acceptedValues:c}}async rawUpdate(e,t,n,r,o){var h,g,T,R,x,b,S;let u=(g=(h=this.server)==null?void 0:h.router)==null?void 0:g.getHooks(e),a=(T=this.schema)==null?void 0:T[e],s=await this.rawFindById(e,t),[c,d]=((R=a==null?void 0:a.mergeMutation)==null?void 0:R.call(a,"set",n.value,s))??[n,n.value];if(!d)return {data:n,acceptedValues:null};let l=c,p={...l,value:{...l.value,id:{value:t}}};if(u!=null&&u.beforeUpdate){let M=w(p);M.id=t;let L;if(s){let j={...s,value:{...s.value,id:{value:t}}};L=w(j),L.id=t;}let C=await u.beforeUpdate({ctx:o,value:M,rawValue:p,previousValue:L,previousRawValue:s,db:this});C&&(l=C);}let y={},f={};for(let[M,L]of Object.entries(l.value)){let C=(x=L._meta)==null?void 0:x.timestamp;if(!C)continue;let j=(S=(b=a==null?void 0:a.fields[M])==null?void 0:b.getStorageFieldType)==null?void 0:S.call(b);(j==null?void 0:j.type)==="jsonb"||(j==null?void 0:j.type)==="json"?y[M]=JSON.stringify(L.value):y[M]=L.value,f[M]=C;}if(Object.keys(y).length===0)return {data:l,acceptedValues:d};await Promise.all([this.db.updateTable(e).set(y).where("id","=",t).execute(),this.db.insertInto(`${e}_meta`).values({...f,id:t}).onConflict(M=>M.column("id").doUpdateSet(f)).execute()]);let m=this.buildMutation(e,t,"UPDATE",l,r,o==null?void 0:o.messageId);if(m){let M=await this.rawFindById(e,t);M&&this.trackMutation(m,M);}if(u!=null&&u.afterUpdate){let M=await this.rawFindById(e,t);if(M){let L={...M,value:{...M.value,id:{value:t}}},C=w(L);C.id=t;let j;if(s){let dt={...s,value:{...s.value,id:{value:t}}};j=w(dt),j.id=t;}await u.afterUpdate({ctx:o,value:C,rawValue:L,previousValue:j,previousRawValue:s,db:this});}}return {data:l,acceptedValues:d}}async transaction(e){if(!this.schema)throw new Error("Schema not initialized");if(this.db.isTransaction){let o=Math.random().toString(36).substring(2,15),u=this.mutationStack,a=[];this.mutationStack=a;let s=await this.db.savepoint(o).execute(),c=false,d=false;try{return await e({trx:this,commit:async()=>{await s.releaseSavepoint(o).execute(),c=!0,u.push(...a);},rollback:async()=>{await s.rollbackToSavepoint(o).execute(),d=!0,a.length=0;}}).then(l=>s.isCommitted||s.isRolledBack||c||d?l:s.releaseSavepoint(o).execute().then(()=>(u.push(...a),l)))}catch(l){throw d||await s.rollbackToSavepoint(o).execute().catch(()=>{}),a.length=0,l}finally{this.mutationStack=u;}}let t=[],n=this.mutationStack;this.mutationStack=t;let r=await this.db.startTransaction().execute();try{let o=new i(r,this.schema,this.logger,this.server);return o.mutationStack=t,await e({trx:o,commit:async()=>{await r.commit().execute(),this.notifyMutations(t);},rollback:async()=>{await r.rollback().execute(),t.length=0;}}).then(u=>r.isCommitted||r.isRolledBack?u:r.commit().execute().then(()=>(this.notifyMutations(t),u)))}catch(o){throw await r.rollback().execute(),t.length=0,o}finally{this.mutationStack=n;}}get internalDB(){return this.db}isRelationalField(e,t){var r;if(!this.schema)return false;let n=this.schema[e];return !!((r=n==null?void 0:n.relations)!=null&&r[t])}parseRelationalJsonStrings(e,t){var o,u;if(Q(this.db)!=="sqlite"||typeof e!="object"||e===null||e instanceof Date)return e;if(Array.isArray(e))return e.map(a=>this.parseRelationalJsonStrings(a,t));let r={};for(let[a,s]of Object.entries(e))if(a==="_meta"&&typeof s=="string")if(s.startsWith("{")&&s.endsWith("}")||s.startsWith("[")&&s.endsWith("]"))try{r[a]=JSON.parse(s);}catch{r[a]=s;}else r[a]=s;else if(this.isRelationalField(t,a))if(typeof s=="string")if(s.startsWith("{")&&s.endsWith("}")||s.startsWith("[")&&s.endsWith("]"))try{let c=JSON.parse(s);if(this.schema){let d=this.schema[t],l=(o=d==null?void 0:d.relations)==null?void 0:o[a];if(l){let p=l.entity.name;r[a]=this.parseRelationalJsonStrings(c,p);}else r[a]=c;}else r[a]=c;}catch{r[a]=s;}else r[a]=s;else if(typeof s=="object"&&s!==null&&!Array.isArray(s))if(this.schema){let c=this.schema[t],d=(u=c==null?void 0:c.relations)==null?void 0:u[a];if(d){let l=d.entity.name;r[a]=this.parseRelationalJsonStrings(s,l);}else r[a]=s;}else r[a]=s;else Array.isArray(s)?r[a]=s.map(c=>{var d,l;if(typeof c=="string")try{let p=JSON.parse(c);if(this.schema){let y=this.schema[t],f=(d=y==null?void 0:y.relations)==null?void 0:d[a];if(f){let m=f.entity.name;return this.parseRelationalJsonStrings(p,m)}}return p}catch{return c}if(typeof c=="object"&&c!==null&&this.schema){let p=this.schema[t],y=(l=p==null?void 0:p.relations)==null?void 0:l[a];if(y){let f=y.entity.name;return this.parseRelationalJsonStrings(c,f)}}return c}):r[a]=s;else r[a]=s;return r}convertToMaterializedLiveType(e,t){var r;let n=(r=this.schema)==null?void 0:r[t];return {value:Object.entries(e).reduce((o,[u,a])=>{var l,p,y,f,m,h,g,T,R;if(u==="_meta")return o;let s=(p=(l=n==null?void 0:n.fields[u])==null?void 0:l.getStorageFieldType)==null?void 0:p.call(l),c=(s==null?void 0:s.type)==="jsonb"||(s==null?void 0:s.type)==="json",d=(n==null?void 0:n.relations)&&u in n.relations;if(u==="id")o[u]={value:a};else if(c)o[u]={value:a,_meta:{timestamp:(y=e==null?void 0:e._meta)==null?void 0:y[u]}};else if(d){let x=n.relations[u].entity,b=(x==null?void 0:x.name)??t;Array.isArray(a)?o[u]={value:a.map(S=>this.convertToMaterializedLiveType(S,b)),_meta:{timestamp:(f=e==null?void 0:e._meta)==null?void 0:f[u],relation:true}}:a!==null&&typeof a=="object"?o[u]={...this.convertToMaterializedLiveType(a,b),_meta:{timestamp:(m=e==null?void 0:e._meta)==null?void 0:m[u],relation:true}}:o[u]={value:a,_meta:{timestamp:(h=e==null?void 0:e._meta)==null?void 0:h[u],relation:true}};}else Array.isArray(a)?o[u]={value:a,_meta:{timestamp:(g=e==null?void 0:e._meta)==null?void 0:g[u]}}:typeof a=="object"&&a!==null&&!(a instanceof Date)?o[u]={value:a,_meta:{timestamp:(T=e==null?void 0:e._meta)==null?void 0:T[u]}}:o[u]={value:a,_meta:{timestamp:(R=e==null?void 0:e._meta)==null?void 0:R[u]}};return o},{})}}isKyselyLike(e){if(e instanceof kysely.Kysely)return true;if(!e||typeof e!="object")return false;let t=e,n=typeof t.selectFrom=="function",r=typeof t.startTransaction=="function",o=typeof t.savepoint=="function",u=typeof t.isTransaction=="boolean"||typeof t.isTransaction=="function";return n&&r||o&&u}buildMutation(e,t,n,r,o,u){var s;let a={};for(let[c,d]of Object.entries(r.value)){if(c==="id")continue;let l=(s=d._meta)==null?void 0:s.timestamp;l&&(a[c]={value:d.value,_meta:{timestamp:l}});}return Object.keys(a).length===0?null:{id:o??se(),type:"MUTATE",resource:e,resourceId:t,procedure:n,payload:a,meta:u?{originMutationId:u}:void 0}}trackMutation(e,t){this.db.isTransaction?this.mutationStack.push({mutation:e,entityData:t}):this.notifyMutations([e],t);}notifyMutations(e,t){if(this.server)if(t!==void 0){let n=e;for(let r of n)this.server.notifySubscribers(r,t);}else {let n=e;for(let{mutation:r,entityData:o}of n)this.server.notifySubscribers(r,o);}}};var Qe=class i{router;storage;schema;middlewares=new Set;logger;contextProvider;queryEngine;constructor(e){var t;this.router=e.router,this.storage=e.storage,this.schema=e.schema,this.logger=Be({level:e.logLevel??q.INFO}),(t=e.middlewares)==null||t.forEach(n=>{this.middlewares.add(n);}),this.storage.init(this.schema,this.logger,this),this.contextProvider=e.contextProvider,this.queryEngine=new ce({router:{get:async(n,r)=>{var l;let{headers:o,cookies:u,queryParams:a,context:s}=(r==null?void 0:r.context)??{};if(!(r!=null&&r.batcher))throw new Error("Batcher is required");let c={...n,type:"QUERY",headers:o,cookies:u,queryParams:a,context:s},d=await((l=this.router.routes[n.resource])==null?void 0:l.handleQuery({req:c,batcher:r.batcher}));return (d==null?void 0:d.data)??[]},incrementQueryStep:(n,r={})=>{var a;let o=(a=this.router.routes[n.query.resource])==null?void 0:a.getAuthorizationClause({...n.query,type:"QUERY",headers:r.headers,cookies:r.cookies,queryParams:r.queryParams,context:r.context});if(typeof o=="boolean"&&!o)throw new Error("Not authorized");let u=K(n.query.where,typeof o=="object"?o:void 0);return {...n,query:{...n.query,where:u}}}},storage:this.storage,schema:this.schema,logger:this.logger});}static create(e){return new i(e)}handleQuery(e){return this.wrapInMiddlewares(async t=>{let{headers:n,cookies:r,queryParams:o,context:u,...a}=t,s={headers:n,cookies:r,queryParams:o,context:u},c=e.subscription?this.queryEngine.subscribe(a,l=>{var p;(p=e.subscription)==null||p.call(e,l);},s):void 0;return {data:await this.queryEngine.get(a,{context:s}),unsubscribe:c}})(e.req)}async handleMutation(e){return await this.wrapInMiddlewares(async n=>{let r=this.router.routes[n.resource];if(!r)throw new Error("Invalid resource");return r.handleMutation({req:n,db:this.storage,schema:this.schema})})(e.req)}async handleCustomQuery(e){let t=await this.wrapInMiddlewares(async p=>{let y=this.router.routes[p.resource];if(!y)throw new Error("Invalid resource");return y.handleCustomQuery({req:p,db:this.storage,schema:this.schema})})(e.req);if(!(typeof t=="object"&&t!==null&&"buildQueryRequest"in t&&typeof t.buildQueryRequest=="function")){if(e.subscription)throw new Error("Subscriptions require custom queries to return a QueryBuilder");return t}let{headers:r,cookies:o,queryParams:u,context:a}=e.req,s={headers:r,cookies:o,queryParams:u,context:a},c=t.buildQueryRequest(),d=e.subscription?this.queryEngine.subscribe(c,p=>{var y;(y=e.subscription)==null||y.call(e,p);},s):void 0,l=await this.queryEngine.get(c,{context:s});return e.subscription?{data:l,unsubscribe:d,query:c}:l.map(p=>w(p))}use(e){return this.middlewares.add(e),this}context(e){return this.contextProvider=e,this}notifySubscribers(e,t){this.queryEngine.handleMutation(e,t);}wrapInMiddlewares(e){return t=>Array.from(this.middlewares.values()).reduceRight((n,r)=>o=>r({req:o,next:n}),e)(t)}},vi=Qe.create;exports.ProcedureRoute=je;exports.Route=Ae;exports.RouteFactory=Oe;exports.Router=Le;exports.SQLStorage=Ne;exports.Server=Qe;exports.Storage=J;exports.createMiddleware=Ur;exports.createServerDB=k;exports.expressAdapter=Nr;exports.routeFactory=Wr;exports.router=Kr;exports.server=vi;
|