@live-state/sync 0.0.6-canary-2 → 0.0.6-canary-4
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/server.cjs +2 -2
- package/dist/server.js +2 -2
- package/package.json +1 -1
package/dist/server.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
'use strict';var Q=require('crypto'),jsXxhash=require('js-xxhash'),ft=require('qs'),zod=require('zod'),kysely=require('kysely'),postgres=require('kysely/helpers/postgres');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var Q__default=/*#__PURE__*/_interopDefault(Q);var ft__default=/*#__PURE__*/_interopDefault(ft);var De=Object.create;var Te=Object.defineProperty;var Ke=Object.getOwnPropertyDescriptor;var Fe=Object.getOwnPropertyNames;var qe=Object.getPrototypeOf,Ue=Object.prototype.hasOwnProperty;var Be=(i,e)=>()=>(e||i((e={exports:{}}).exports,e),e.exports);var Qe=(i,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Fe(e))!Ue.call(i,n)&&n!==t&&Te(i,n,{get:()=>e[n],enumerable:!(r=Ke(e,n))||r.enumerable});return i};var ge=(i,e,t)=>(t=i!=null?De(qe(i)):{},Qe(Te(t,"default",{value:i,enumerable:true}),i));var oe=Be(H=>{Object.defineProperty(H,"__esModule",{value:true});H.parse=ct;H.serialize=ut;var rt=/^[\u0021-\u003A\u003C\u003E-\u007E]+$/,nt=/^[\u0021-\u003A\u003C-\u007E]*$/,it=/^([.]?[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)([.][a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)*$/i,at=/^[\u0020-\u003A\u003D-\u007E]*$/,ot=Object.prototype.toString,st=(()=>{let i=function(){};return i.prototype=Object.create(null),i})();function ct(i,e){let t=new st,r=i.length;if(r<2)return t;let n=(e==null?void 0:e.decode)||lt,a=0;do{let c=i.indexOf("=",a);if(c===-1)break;let o=i.indexOf(";",a),s=o===-1?r:o;if(c>s){a=i.lastIndexOf(";",c-1)+1;continue}let l=Ie(i,a,c),f=Me(i,c,l),u=i.slice(l,f);if(t[u]===void 0){let h=Ie(i,c+1,s),R=Me(i,s,h),d=n(i.slice(h,R));t[u]=d;}a=s+1;}while(a<r);return t}function Ie(i,e,t){do{let r=i.charCodeAt(e);if(r!==32&&r!==9)return e}while(++e<t);return t}function Me(i,e,t){for(;e>t;){let r=i.charCodeAt(--e);if(r!==32&&r!==9)return e+1}return t}function ut(i,e,t){let r=(t==null?void 0:t.encode)||encodeURIComponent;if(!rt.test(i))throw new TypeError(`argument name is invalid: ${i}`);let n=r(e);if(!nt.test(n))throw new TypeError(`argument val is invalid: ${e}`);let a=i+"="+n;if(!t)return a;if(t.maxAge!==void 0){if(!Number.isInteger(t.maxAge))throw new TypeError(`option maxAge is invalid: ${t.maxAge}`);a+="; Max-Age="+t.maxAge;}if(t.domain){if(!it.test(t.domain))throw new TypeError(`option domain is invalid: ${t.domain}`);a+="; Domain="+t.domain;}if(t.path){if(!at.test(t.path))throw new TypeError(`option path is invalid: ${t.path}`);a+="; Path="+t.path;}if(t.expires){if(!dt(t.expires)||!Number.isFinite(t.expires.valueOf()))throw new TypeError(`option expires is invalid: ${t.expires}`);a+="; Expires="+t.expires.toUTCString();}if(t.httpOnly&&(a+="; HttpOnly"),t.secure&&(a+="; Secure"),t.partitioned&&(a+="; Partitioned"),t.priority)switch(typeof t.priority=="string"?t.priority.toLowerCase():void 0){case "low":a+="; Priority=Low";break;case "medium":a+="; Priority=Medium";break;case "high":a+="; 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":a+="; SameSite=Strict";break;case "lax":a+="; SameSite=Lax";break;case "none":a+="; SameSite=None";break;default:throw new TypeError(`option sameSite is invalid: ${t.sameSite}`)}return a}function lt(i){if(i.indexOf("%")===-1)return i;try{return decodeURIComponent(i)}catch{return i}}function dt(i){return ot.call(i)==="[object Date]"}});var be="0123456789ABCDEFGHJKMNPQRSTVWXYZ",W=32;var Ge=16,xe=10,Re=0xffffffffffff;var C;(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";})(C||(C={}));var $=class extends Error{constructor(e,t){super(`${t} (${e})`),this.name="ULIDError",this.code=e;}};function Ze(i){let e=Math.floor(i()*W);return e===W&&(e=W-1),be.charAt(e)}function He(i){var r;let e=Je(),t=e&&(e.crypto||e.msCrypto)||(typeof Q__default.default<"u"?Q__default.default:null);if(typeof(t==null?void 0:t.getRandomValues)=="function")return ()=>{let n=new Uint8Array(1);return t.getRandomValues(n),n[0]/255};if(typeof(t==null?void 0:t.randomBytes)=="function")return ()=>t.randomBytes(1).readUInt8()/255;if((r=Q__default.default)!=null&&r.randomBytes)return ()=>Q__default.default.randomBytes(1).readUInt8()/255;throw new $(C.PRNGDetectFailure,"Failed to find a reliable PRNG")}function Je(){return et()?self:typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:null}function Ye(i,e){let t="";for(;i>0;i--)t=Ze(e)+t;return t}function Xe(i,e=xe){if(isNaN(i))throw new $(C.EncodeTimeValueMalformed,`Time must be a number: ${i}`);if(i>Re)throw new $(C.EncodeTimeSizeExceeded,`Cannot encode a time larger than ${Re}: ${i}`);if(i<0)throw new $(C.EncodeTimeNegative,`Time must be positive: ${i}`);if(Number.isInteger(i)===false)throw new $(C.EncodeTimeValueMalformed,`Time must be an integer: ${i}`);let t,r="";for(let n=e;n>0;n--)t=i%W,r=be.charAt(t)+r,i=(i-t)/W;return r}function et(){return typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope}function ve(i,e){let t=He(),r=Date.now();return Xe(r,xe)+Ye(Ge,t)}var G=()=>ve().toLowerCase();var z=(...i)=>{let e=i.filter(t=>!!t);return e.length===0?{}:e.length===1?e[0]:{$and:e}};var S=i=>i?Array.isArray(i.value)?i.value.map(t=>S(t)):typeof i.value!="object"||i.value===null||i.value instanceof Date?i.value:Object.fromEntries(Object.entries(i.value).map(([t,r])=>Array.isArray(r)?[t,r.map(n=>S(n))]:[t,S(r)])):void 0;var Se=i=>jsXxhash.xxHash32(JSON.stringify(i)).toString(32),K=(i,e,t)=>{let r={},n=t[e];if(!n)return r;let a=c=>{c.$and?c.$and.forEach(a):c.$or?c.$or.forEach(a):Object.entries(c).forEach(([o,s])=>{var l;if((l=n.relations)!=null&&l[o]&&(r[o]=true,typeof s=="object"&&s!==null&&!Array.isArray(s))){let f=K(s,n.relations[o].entity.name,t);Object.keys(f).length>0&&(r[o]=f);}});};return a(i),r},L=(i,e,t=false)=>Object.entries(e).every(([r,n])=>{if(r==="$and")return n.every(c=>L(i,c,t));if(r==="$or")return n.some(c=>L(i,c,t));let a=(n==null?void 0:n.$eq)!==void 0?n==null?void 0:n.$eq:n;if(typeof n=="object"&&n!==null&&(n==null?void 0:n.$eq)===void 0){if(n.$in!==void 0){let o=i[r];return o===void 0?false:t?!n.$in.includes(o):n.$in.includes(o)}if(n.$not!==void 0&&!t)return L(i,{[r]:n.$not},true);if(n.$gt!==void 0){let o=i[r];return typeof o!="number"?false:t?o<=n.$gt:o>n.$gt}if(n.$gte!==void 0){let o=i[r];return typeof o!="number"?false:t?o<n.$gte:o>=n.$gte}if(n.$lt!==void 0){let o=i[r];return typeof o!="number"?false:t?o>=n.$lt:o<n.$lt}if(n.$lte!==void 0){let o=i[r];return typeof o!="number"?false:t?o>n.$lte:o<=n.$lte}let c=i[r];return !c||typeof c!="object"&&!Array.isArray(c)?false:Array.isArray(c)?t?!c.some(o=>L(o,n,false)):c.some(o=>L(o,n,false)):L(c,n,t)}return t?i[r]!==a:i[r]===a}),j={CRITICAL:0,ERROR:1,WARN:2,INFO:3,DEBUG:4},ae=class{level;prefix;constructor(e={}){this.level=e.level??j.INFO,this.prefix=e.prefix?`[${e.prefix}] `:"";}critical(...e){this.level>=j.CRITICAL&&console.error(`${this.prefix}[CRITICAL]`,...e);}error(...e){this.level>=j.ERROR&&console.error(`${this.prefix}[ERROR]`,...e);}warn(...e){this.level>=j.WARN&&console.warn(`${this.prefix}[WARN]`,...e);}info(...e){this.level>=j.INFO&&console.log(`${this.prefix}[INFO]`,...e);}debug(...e){this.level>=j.DEBUG&&console.log(`${this.prefix}[DEBUG]`,...e);}setLevel(e){this.level=e;}getLevel(){return this.level}},we=i=>new ae(i);var Z=class{storage;queue=new Map;scheduled=false;constructor(e){this.storage=e;}async rawFind({resource:e,commonWhere:t,uniqueWhere:r,...n}){return new Promise((a,c)=>{let o=this.getBatchKey({resource:e,commonWhere:t,...n}),s={resource:e,commonWhere:t,uniqueWhere:r,...n,resolve:a,reject:c};this.queue.has(o)||this.queue.set(o,[]);let l=this.queue.get(o);l&&l.push(s),this.scheduled||(this.scheduled=true,setImmediate(()=>{this.processBatch();}));})}getBatchKey(e){let{resource:t,commonWhere:r,...n}=e;return `${t}:${JSON.stringify(r??{})}:${JSON.stringify(n??{})}`}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(r){t.forEach(n=>{n.reject(r);});}}async executeBatchedRequests(e){var h,R;if(e.length===0)return;let t=e[0],{resource:r,commonWhere:n,include:a,sort:c}=t,o=e.length===1?t.limit:void 0,s=e.map(d=>d.uniqueWhere).filter(d=>d!==void 0),l=n,f=(h=Object.entries(s[0]??{})[0])==null?void 0:h[0];if(s.length>0){let d=s.map(m=>m[f]).filter(m=>m!=null);d.length>0&&(l=z(n,{[f]:{$in:d}}));}let u=await this.storage.rawFind({resource:r,where:l,include:a,sort:c,limit:o});for(let d of e){let m={};if(d.uniqueWhere){let[p,y]=Object.entries(d.uniqueWhere)[0];for(let[T,g]of Object.entries(u))((R=g.value[p])==null?void 0:R.value)===y&&(m[T]=g);}else Object.assign(m,u);d.resolve(m);}}};var Ae=ge(oe());var F=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.string().or(zod.z.number()).or(zod.z.boolean()).or(zod.z.date()).nullable(),_meta:zod.z.object({timestamp:zod.z.string().optional().nullable()}).optional()})),yt=se.superRefine((i,e)=>{i.id&&e.addIssue({code:zod.z.ZodIssueCode.custom,message:"Payload cannot have an id"});}),Le=zod.z.object({id:zod.z.string().optional(),type:zod.z.literal("MUTATE"),resource:zod.z.string(),resourceId:zod.z.string().optional()}),q=Le.extend({procedure:zod.z.string(),payload:zod.z.any().optional()}),U=Le.extend({procedure:zod.z.enum(["INSERT","UPDATE"]),payload:yt});zod.z.union([U,q]);var Oe=F.omit({resource:true}),ce=q.omit({id:true,type:true,resource:true,procedure:true}),ue=U.omit({id:true,type:true,resource:true,procedure:true});zod.z.union([ue,ce]);var je=i=>{let e=i.logger;return async t=>{var r;try{let n=typeof t.headers.getSetCookie=="function"?Object.fromEntries(t.headers):t.headers,a={headers:n,cookies:n.cookie?Ae.default.parse(n.cookie):{}},c=new URL(t.url),o=c.pathname.split("/"),s=c.searchParams,l=ft__default.default.parse(s.toString()),f=await((r=i.contextProvider)==null?void 0:r.call(i,{transport:"HTTP",headers:a.headers,cookies:a.cookies,queryParams:l}))??{};if(t.method==="GET"){let u=o[o.length-1],{success:h,data:R,error:d}=Oe.safeParse(l);if(!h)return Response.json({message:"Invalid query",code:"INVALID_QUERY",details:d},{status:400});let m=await i.handleQuery({req:{...a,...R,type:"QUERY",resource:u,context:f,queryParams:l}});return !m||!m.data?Response.json({message:"Invalid resource",code:"INVALID_RESOURCE"},{status:400}):Response.json(m.data)}if(t.method==="POST")try{let u=o[o.length-1],h=o[o.length-2],R=t.body?await t.json():{},d;if(u==="insert"||u==="update"){let{success:p,data:y,error:T}=ue.safeParse(R);if(!p)return Response.json({message:"Invalid mutation",code:"INVALID_REQUEST",details:T},{status:400});d=y;}else {let{success:p,data:y,error:T}=ce.safeParse(R);if(!p)return Response.json({message:"Invalid mutation",code:"INVALID_REQUEST",details:T},{status:400});d=y;}let m=await i.handleMutation({req:{...a,type:"MUTATE",resource:h,input:d.payload,context:f,resourceId:d.resourceId,procedure:u==="insert"||u==="update"?u.toUpperCase():u,queryParams:{}}});return Response.json(m)}catch(u){return e.error("Error parsing mutation from the client:",u),Response.json({message:"Internal server error",code:"INTERNAL_SERVER_ERROR"},{status:500})}return Response.json({message:"Not found",code:"NOT_FOUND"},{status:404})}catch(n){return e.error("Unexpected error:",n),Response.json({message:"Internal server error",code:"INTERNAL_SERVER_ERROR"},{status:500})}}};var $e=ge(oe());var V=zod.z.string(),mt=F.extend({id:V,type:zod.z.literal("SUBSCRIBE")}),ht=F.extend({id:V,type:zod.z.literal("QUERY")}),Ee=U.extend({id:V}),Tt=q.extend({id:V}),gt=zod.z.union([Tt,Ee]),Ce=zod.z.union([mt,ht,gt]),Rt=zod.z.object({id:V,type:zod.z.literal("REJECT"),resource:zod.z.string(),message:zod.z.string().optional()}),bt=zod.z.object({id:V,type:zod.z.literal("REPLY"),data:zod.z.any()});zod.z.union([Rt,bt,Ee]);zod.z.object({resource:zod.z.string(),data:zod.z.record(zod.z.string(),se)});var Pe=i=>{let e={},t=i.logger;return (r,n)=>{var u;let a=h=>{r.send(JSON.stringify(h));},c=G(),o=new Set,s={headers:n.headers,cookies:typeof n.headers.cookie=="string"?$e.default.parse(n.headers.cookie):{}},l=ft.parse(n.url.split("?")[1]),f=(u=i.contextProvider)==null?void 0:u.call(i,{transport:"WEBSOCKET",headers:s.headers,cookies:s.cookies,queryParams:l});e[c]=r,t.info("Client connected:",c),r.on("message",async h=>{var R;try{t.debug("Message received from the client:",h);let d=Ce.parse(JSON.parse(h.toString()));if(d.type==="SUBSCRIBE"){let m=await f??{},p=d.resource,y=i.router.routes[p],T;if((R=y==null?void 0:y.authorization)!=null&&R.read){let g=y.authorization.read({ctx:m});T=typeof g=="object"?g:void 0;}o.add(i.subscribeToMutations(d,g=>{var x;!g.resourceId||!g.payload||!Object.keys(g.payload).length||(x=e[c])==null||x.send(JSON.stringify(g));},T));}else if(d.type==="QUERY"){let{resource:m}=d,p=await i.handleQuery({req:{...s,type:"QUERY",resource:m,context:await f??{},queryParams:l}});if(!p||!p.data)throw new Error("Invalid resource");a({id:d.id,type:"REPLY",data:{resource:m,data:Object.fromEntries(Object.entries(p.data??{}).map(([y,T])=>[y,T.value]))}});}else if(d.type==="MUTATE"){let{resource:m}=d;t.debug("Received mutation from client:",d);try{let p=await i.handleMutation({req:{...s,type:"MUTATE",resource:m,input:d.payload,context:{messageId:d.id,...await f??{}},resourceId:d.resourceId,procedure:d.procedure,queryParams:l}});d.procedure&&d.procedure!=="INSERT"&&d.procedure!=="UPDATE"&&a({id:d.id,type:"REPLY",data:p});}catch(p){a({id:d.id,type:"REJECT",resource:m,message:p.message}),t.error("Error parsing mutation from the client:",p);}}}catch(d){t.error("Error handling message from the client:",d);}}),r.on("close",()=>{t.info("Connection closed",c),delete e[c];for(let h of Array.from(o))h();});}};function ze(i){let e=`${i.protocol}://${i.hostname}${i.url}`,t=new Headers;return Object.entries(i.headers).forEach(([r,n])=>{n&&t.set(r,Array.isArray(n)?n.join(","):n);}),new Request(e,{method:i.method,headers:t,body:i.body&&i.method!=="GET"?JSON.stringify(i.body):void 0})}var Rr=(i,e,t)=>{i.ws(`${(t==null?void 0:t.basePath)??""}/ws`,Pe(e)),i.use(`${(t==null?void 0:t.basePath)??""}/`,(r,n)=>{je(e)(ze(r)).then(c=>c.json().then(o=>n.status(c.status).send(o)));});};var le=class i{routes;constructor(e){this.routes=e.routes;}static create(e){return new i(e)}},Ir=i=>le.create({...i}),St=i=>({handler:e=>({inputValidator:i??zod.z.undefined(),handler:e})}),de=class i{resourceSchema;middlewares;customMutations;authorization;constructor(e,t,r){this.resourceSchema=e,this.middlewares=new Set,this.customMutations=t??{},this.authorization=r;}use(...e){for(let t of e)this.middlewares.add(t);return this}withMutations(e){return new i(this.resourceSchema,e({mutation:St}),this.authorization)}handleQuery=async({req:e,batcher:t})=>await this.wrapInMiddlewares(async r=>{var a,c;let n=(c=(a=this.authorization)==null?void 0:a.read)==null?void 0:c.call(a,{ctx:r.context});if(typeof n=="boolean"&&!n)throw new Error("Not authorized");return {data:await t.rawFind({resource:r.resource,commonWhere:z(r.where,typeof n=="object"?n:void 0),uniqueWhere:r.relationalWhere,include:r.include,limit:r.limit,sort:r.sort})}})(e);handleMutation=async({req:e,db:t,schema:r})=>await this.wrapInMiddlewares(async n=>{if(!n.procedure)throw new Error("Procedure is required for mutations");let a=this.customMutations[n.procedure];if(a){let c=a.inputValidator.parse(n.input);return n.input=c,a.handler({req:n,db:t})}else {if(n.procedure==="INSERT"||n.procedure==="UPDATE")return this.handleSet({req:n,db:t,operation:n.procedure,schema:r});throw new Error(`Unknown procedure: ${n.procedure}`)}})(e);handleSet=async({req:e,db:t,operation:r,schema:n})=>{if(!e.input)throw new Error("Payload is required");if(!e.resourceId)throw new Error("ResourceId is required");let a=await t.rawFindById(e.resource,e.resourceId);if(r==="INSERT"&&a)throw new Error("Resource already exists");if(r==="UPDATE"&&!a)throw new Error("Resource not found");return t.transaction(async({trx:c})=>{var f,u,h,R,d;let[o,s]=this.resourceSchema.mergeMutation("set",e.input,a);if(!s)throw new Error("Mutation rejected");if(r==="INSERT"){let m=await c.rawInsert(e.resource,e.resourceId,o),p=S(m);if(p.id=p.id??e.resourceId,(f=this.authorization)!=null&&f.insert){let y=this.authorization.insert({ctx:e.context,value:p});if(typeof y=="boolean"){if(!y)throw new Error("Not authorized")}else {let T=K(y,e.resource,n),g=Object.keys(T).length>0?await c.rawFindById(e.resource,e.resourceId,T):m,x=S(g);if(x.id=x.id??e.resourceId,!L(x,y))throw new Error("Not authorized")}}return {data:m,acceptedValues:s}}if((h=(u=this.authorization)==null?void 0:u.update)!=null&&h.preMutation){let m=S(a);m.id=m.id??e.resourceId;let p=this.authorization.update.preMutation({ctx:e.context,value:m});if(typeof p=="boolean"){if(!p)throw new Error("Not authorized")}else {let y=K(p,e.resource,n),T=Object.keys(y).length>0?await c.rawFindById(e.resource,e.resourceId,y):a,g=S(T);if(g.id=g.id??e.resourceId,!L(g,p))throw new Error("Not authorized")}}let l=await c.rawUpdate(e.resource,e.resourceId,o);if((d=(R=this.authorization)==null?void 0:R.update)!=null&&d.postMutation){let m=S(l);m.id=m.id??e.resourceId;let p=this.authorization.update.postMutation({ctx:e.context,value:m});if(typeof p=="boolean"){if(!p)throw new Error("Not authorized")}else {let y=K(p,e.resource,n),T=Object.keys(y).length>0?await c.rawFindById(e.resource,e.resourceId,y):l,g=S(T);if(g.id=g.id??e.resourceId,!L(g,p))throw new Error("Not authorized")}}return {data:l,acceptedValues:s}})};wrapInMiddlewares(e){return t=>Array.from(this.middlewares.values()).reduceRight((r,n)=>a=>n({req:a,next:r}),e)(t)}},ye=class i{middlewares;constructor(e=[]){this.middlewares=e;}collectionRoute(e,t){return new de(e,void 0,t).use(...this.middlewares)}use(...e){return new i([...this.middlewares,...e])}static create(){return new i}},Mr=ye.create;var B=class{async insert(e,t){let r=new Date().toISOString();return S(await this.rawInsert(e.name,t.id,{value:Object.fromEntries(Object.entries(t).map(([n,a])=>[n,{value:a,_meta:{timestamp:r}}]))}))}async update(e,t,r){let n=new Date().toISOString(),{id:a,...c}=r;return S(await this.rawUpdate(e.name,t,{value:Object.fromEntries(Object.entries(c).map(([o,s])=>[o,{value:s,_meta:{timestamp:n}}]))}))}};function J(i,e,t,r){if(!i)throw new Error("Schema not initialized");let n=i[e];if(!n)throw new Error("Resource not found");let a=r.$or,c=r.$and;return (a?t.or:t.and)(a?r.$or.map(o=>J(i,e,t,o)):c?r.$and.map(o=>J(i,e,t,o)):Object.entries(r).map(([o,s])=>{var l,f;if(n.fields[o])return (s==null?void 0:s.$eq)!==void 0?t(`${e}.${o}`,s.$eq===null?"is":"=",s.$eq):(s==null?void 0:s.$in)!==void 0?t(`${e}.${o}`,"in",s.$in):(s==null?void 0:s.$not)!==void 0?((l=s==null?void 0:s.$not)==null?void 0:l.$in)!==void 0?t(`${e}.${o}`,"not in",s.$not.$in):((f=s==null?void 0:s.$not)==null?void 0:f.$eq)!==void 0?t(`${e}.${o}`,s.$not.$eq===null?"is not":"!=",s.$not.$eq):t(`${e}.${o}`,s.$not===null?"is not":"!=",s.$not):(s==null?void 0:s.$gt)!==void 0?t(`${e}.${o}`,">",s.$gt):(s==null?void 0:s.$gte)!==void 0?t(`${e}.${o}`,">=",s.$gte):(s==null?void 0:s.$lt)!==void 0?t(`${e}.${o}`,"<",s.$lt):(s==null?void 0:s.$lte)!==void 0?t(`${e}.${o}`,"<=",s.$lte):t(`${e}.${o}`,s===null?"is":"=",s);if(n.relations[o]){let u=n.relations[o],h=u.entity.name;return u.type==="many"?t.exists(pe(i,h,t.selectFrom(h).select("id").whereRef(u.foreignColumn,"=",`${e}.id`),s)):J(i,h,t,s)}return null}).filter(Boolean))}function Y(i,e,t,r){let n=i[e];if(!n)throw new Error("Resource not found");if(!r)return t;if(r.$and){for(let a of r.$and)t=Y(i,e,t,a);return t}else if(r.$or){for(let a of r.$or)t=Y(i,e,t,a);return t}for(let[a,c]of Object.entries(r)){if(!n.relations[a])continue;let o=n.relations[a],s=o.entity.name,l=o.type==="one"?"id":o.foreignColumn,f=o.type==="one"?o.relationalColumn:"id";t=t.leftJoin(s,`${s}.${l}`,`${e}.${f}`),c instanceof Object&&!Array.isArray(c)&&c!==null&&(t=Y(i,s,t,c));}return t}function pe(i,e,t,r){return !r||Object.keys(r).length===0?t:(t=Y(i,e,t,r),t.where(n=>J(i,e,n,r)))}function X(i,e,t,r){if(!r)return t;if(!i)throw new Error("Schema not initialized");let n=i[e];if(!n)throw new Error(`Resource not found: ${e}`);for(let a of Object.keys(r)){if(!n.relations[a])throw new Error(`Relation ${a} not found in resource ${e}`);let c=n.relations[a],o=c.entity.name,s=r[a],l=c.type==="one"?"id":c.foreignColumn,f=c.type==="one"?c.relationalColumn:"id",u=c.type==="one"?postgres.jsonObjectFrom:postgres.jsonArrayFrom,h=typeof s=="object"&&s!==null;t=t.select(R=>{let d=R.selectFrom(o).selectAll(o).whereRef(`${o}.${l}`,"=",`${e}.${f}`).select(m=>postgres.jsonObjectFrom(m.selectFrom(`${o}_meta`).selectAll(`${o}_meta`).whereRef(`${o}_meta.id`,"=",`${o}.id`)).as("_meta"));return h&&(d=X(i,o,d,s)),u(d).as(a)});}return t}var ke="42701",fe=class i extends B{db;schema;logger;server;mutationStack=[];constructor(e,t,r,n){super(),this.isKyselyLike(e)?this.db=e:this.db=new kysely.Kysely({dialect:new kysely.PostgresDialect({pool:e})}),this.schema=t,this.logger=r,this.server=n,this.rawInsert=this.rawInsert.bind(this),this.rawUpdate=this.rawUpdate.bind(this);}async init(e,t,r){var a;this.schema=e,this.logger=t,this.server=r;let n=await this.db.introspection.getTables();for(let[c,o]of Object.entries(e)){let s=n.find(u=>u.name===c);s||await this.db.schema.createTable(c).ifNotExists().execute();let l=`${c}_meta`,f=n.find(u=>u.name===l);f||await this.db.schema.createTable(l).ifNotExists().execute();for(let[u,h]of Object.entries(o.fields)){let R=s==null?void 0:s.columns.find(p=>p.name===u),d=h.getStorageFieldType();R?R.dataType!==d.type&&((a=this.logger)==null||a.warn("Column type mismatch:",u,"expected to have type:",d.type,"but has type:",R.dataType)):(await this.db.schema.alterTable(c).addColumn(u,d.type,p=>{let y=p;return d.unique&&(y=y.unique()),d.nullable||(y=y.notNull()),d.references&&(y=y.references(d.references)),d.primary&&(y=y.primaryKey()),d.default!==void 0&&(y=y.defaultTo(d.default)),y}).execute().catch(p=>{var y;if(p.code!==ke)throw (y=this.logger)==null||y.error("Error adding column",u,p),p}),d.index&&await this.db.schema.createIndex(`${c}_${u}_index`).on(c).column(u).execute().catch(()=>{})),(f==null?void 0:f.columns.find(p=>p.name===u))||await this.db.schema.alterTable(l).addColumn(u,"varchar",p=>{let y=p;return d.primary&&(y=y.primaryKey().references(`${c}.${u}`)),y}).execute().catch(p=>{var y;if(p.code!==ke)throw (y=this.logger)==null||y.error("Error adding meta column",u,p),p});}}}async rawFindById(e,t,r){if(!this.schema)throw new Error("Schema not initialized");let n=await this.db.selectFrom(e).where("id","=",t).selectAll(e).select(c=>postgres.jsonObjectFrom(c.selectFrom(`${e}_meta`).selectAll(`${e}_meta`).whereRef(`${e}_meta.id`,"=",`${e}.id`)).as("_meta"));n=X(this.schema,e,n,r);let a=await n.executeTakeFirst();if(a)return this.convertToMaterializedLiveType(a)}async findOne(e,t,r){let n=await this.rawFindById(e.name,t,r==null?void 0:r.include);if(n)return S(n)}async rawFind(e){if(!this.schema)throw new Error("Schema not initialized");let{resource:t,where:r,include:n,limit:a,sort:c}=e,o=this.db.selectFrom(t).selectAll(t).select(u=>postgres.jsonObjectFrom(u.selectFrom(`${t}_meta`).selectAll(`${t}_meta`).whereRef(`${t}_meta.id`,"=",`${t}.id`)).as("_meta"));o=pe(this.schema,t,o,r),o=X(this.schema,t,o,n),a!==void 0&&(o=o.limit(a)),c!==void 0&&c.forEach(u=>{o=o.orderBy(u.key,u.direction);});let s=await o.execute(),l=Object.fromEntries(s.map(u=>{let{id:h}=u;return [h,u]}));return Object.keys(l).length===0?{}:Object.entries(l).reduce((u,[h,R])=>(u[h]=this.convertToMaterializedLiveType(R),u),{})}async find(e,t){let r=await this.rawFind({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});return Object.fromEntries(Object.entries(r).map(([n,a])=>[n,S(a)]))}async rawInsert(e,t,r){var o;let n={},a={};for(let[s,l]of Object.entries(r.value)){let f=(o=l._meta)==null?void 0:o.timestamp;f&&(n[s]=l.value,a[s]=f);}await this.db.insertInto(e).values({...n,id:t}).execute().then(()=>{this.db.insertInto(`${e}_meta`).values({...a,id:t}).execute();});let c=this.buildMutation(e,t,"INSERT",r);return c&&this.trackMutation(c,r),r}async rawUpdate(e,t,r){var o;let n={},a={};for(let[s,l]of Object.entries(r.value)){let f=(o=l._meta)==null?void 0:o.timestamp;f&&(n[s]=l.value,a[s]=f);}await Promise.all([this.db.updateTable(e).set(n).where("id","=",t).execute(),this.db.insertInto(`${e}_meta`).values({...a,id:t}).onConflict(s=>s.column("id").doUpdateSet(a)).execute()]);let c=this.buildMutation(e,t,"UPDATE",r);return c&&this.trackMutation(c,r),r}async transaction(e){if(!this.schema)throw new Error("Schema not initialized");if(this.db.isTransaction){let a=Math.random().toString(36).substring(2,15),c=this.mutationStack,o=[];this.mutationStack=o;let s=await this.db.savepoint(a).execute();try{return await e({trx:this,commit:async()=>{await s.releaseSavepoint(a).execute(),c.push(...o);},rollback:async()=>{await s.rollbackToSavepoint(a).execute(),o.length=0;}}).then(l=>s.isCommitted||s.isRolledBack?l:s.releaseSavepoint(a).execute().then(()=>(c.push(...o),l)))}catch(l){throw await s.rollbackToSavepoint(a).execute().catch(()=>{}),o.length=0,l}finally{this.mutationStack=c;}}let t=[],r=this.mutationStack;this.mutationStack=t;let n=await this.db.startTransaction().execute();try{let a=new i(n,this.schema,this.logger,this.server);return a.mutationStack=t,await e({trx:a,commit:async()=>{await n.commit().execute(),this.notifyMutations(t);},rollback:async()=>{await n.rollback().execute(),t.length=0;}}).then(c=>n.isCommitted||n.isRolledBack?c:n.commit().execute().then(()=>(this.notifyMutations(t),c)))}catch(a){throw await n.rollback().execute(),t.length=0,a}finally{this.mutationStack=r;}}get internalDB(){return this.db}convertToMaterializedLiveType(e){return {value:Object.entries(e).reduce((t,[r,n])=>{var a,c,o;return r==="_meta"||(r==="id"?t[r]={value:n}:Array.isArray(n)?t[r]={value:n.map(s=>this.convertToMaterializedLiveType(s)),_meta:{timestamp:(a=e==null?void 0:e._meta)==null?void 0:a[r]}}:typeof n=="object"&&n!==null&&!(n instanceof Date)?t[r]={...this.convertToMaterializedLiveType(n),_meta:{timestamp:(c=e==null?void 0:e._meta)==null?void 0:c[r]}}:t[r]={value:n,_meta:{timestamp:(o=e==null?void 0:e._meta)==null?void 0:o[r]}}),t},{})}}isKyselyLike(e){if(e instanceof kysely.Kysely)return true;if(!e||typeof e!="object")return false;let t=e,r=typeof t.selectFrom=="function",n=typeof t.startTransaction=="function",a=typeof t.savepoint=="function",c=typeof t.isTransaction=="boolean"||typeof t.isTransaction=="function";return r&&n||a&&c}buildMutation(e,t,r,n){var c;let a={};for(let[o,s]of Object.entries(n.value)){if(o==="id")continue;let l=(c=s._meta)==null?void 0:c.timestamp;l&&(a[o]={value:s.value,_meta:{timestamp:l}});}return Object.keys(a).length===0?null:{id:G(),type:"MUTATE",resource:e,resourceId:t,procedure:r,payload:a}}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 r=e;for(let n of r)this.server.notifySubscribers(n,t);}else {let r=e;for(let{mutation:n,entityData:a}of r)this.server.notifySubscribers(n,a);}}};var me=class i{router;storage;schema;middlewares=new Set;logger;contextProvider;mutationSubscriptions=new Set;collectionSubscriptions=new Map;constructor(e){var t;this.router=e.router,this.storage=e.storage,this.schema=e.schema,this.logger=we({level:e.logLevel??j.INFO}),(t=e.middlewares)==null||t.forEach(r=>{this.middlewares.add(r);}),this.storage.init(this.schema,this.logger,this),this.contextProvider=e.contextProvider;}static create(e){return new i(e)}handleQuery(e){let t=new Z(this.storage);return this.wrapInMiddlewares(async r=>{var R,d,m;let n=We(r,this.schema,{stepId:"query",collectionName:r.resource,included:Object.keys(r.include??{})}),a={headers:r.headers,cookies:r.cookies,queryParams:r.queryParams,context:r.context},c={};for(let p=0;p<n.length;p++){let y=n[p],T=this.router.routes[y.resource];if(!T)throw new Error("Invalid resource");let g;if(y.getWhere&&y.referenceGetter){let v=y.referenceGetter(c);g=[];for(let I=0;I<v.length;I++)g.push(y.getWhere(v[I]));}else g=[void 0];let x=c[y.prevStepId??""],M=[];if(x)for(let v=0;v<x.length;v++){let I=x[v],A=Object.keys(((R=I==null?void 0:I.result)==null?void 0:R.data)??{});for(let k=0;k<A.length;k++)M.push(A[k]);}let E=[];for(let v=0;v<g.length;v++){let I=g[v],A=M[v];E.push((async()=>{let k=await T.handleQuery({req:{type:"QUERY",...y,...a,where:y.where,relationalWhere:I},batcher:t});return {includedBy:A,result:k}})());}let O=await Promise.allSettled(E),_=[];for(let v=0;v<O.length;v++){let I=O[v];I.status==="fulfilled"&&_.push(I.value);}c[y.stepId]=_;}let o=new Map,s=0;for(let p in c){let y=c[p],T=n[s];s++;for(let g=0;g<y.length;g++){let x=y[g],M=x.result.data;for(let E in M){let O=M[E],_=`${p}.${E}`,v=[];p!=="query"&&x.includedBy&&(v=[`${T.prevStepId}.${x.includedBy}`]);let I=o.get(_);if(I)for(let A=0;A<v.length;A++)I.includedBy.add(v[A]);else o.set(_,{data:O,includedBy:new Set(v),path:p.split(".").slice(-1)[0],isMany:T.isMany??false,collectionName:T.collectionName,included:T.included});}}}let l=Object.fromEntries(o),f={data:{}},u=Object.keys(l);for(let p=u.length-1;p>=0;p--){let y=u[p],T=l[y],g=T.path;if(g==="query"&&(f.data[y.replace("query.","")]=T.data),T.included.length)for(let x=0;x<T.included.length;x++){let M=T.included[x];T.data.value[M]??=((m=(d=this.schema[T.collectionName])==null?void 0:d.relations[M])==null?void 0:m.type)==="many"?{value:[]}:{value:null};}if(T.includedBy.size>0){let x=Array.from(T.includedBy);for(let M=0;M<x.length;M++){let E=x[M],O=l[E];O&&(T.isMany?(O.data.value[g]??={value:[]},O.data.value[g].value.push(T.data)):O.data.value[g]=T.data);}}}return f})(e.req)}async handleMutation(e){let t=await this.wrapInMiddlewares(async r=>{let n=this.router.routes[r.resource];if(!n)throw new Error("Invalid resource");return n.handleMutation({req:r,db:this.storage,schema:this.schema})})(e.req);if(t&&e.req.type==="MUTATE"&&t.acceptedValues&&(e.req.procedure==="INSERT"||e.req.procedure==="UPDATE")&&e.req.resourceId){let n=t.acceptedValues??{},a=e.req,c=a.resourceId;Object.keys(n).length&&c&&this.mutationSubscriptions.forEach(o=>{o({id:e.req.context.messageId,type:"MUTATE",resource:a.resource,payload:n,resourceId:c,procedure:a.procedure});});}return t}use(e){return this.middlewares.add(e),this}context(e){return this.contextProvider=e,this}subscribeToMutations(e,t,r){let n=e.resource,a={query:e,authorizationWhere:r},c=Se(a),o=this.collectionSubscriptions.get(n);o||(o=new Map,this.collectionSubscriptions.set(n,o));let s=o.get(c);return s?(s.callbacks.add(t),r!==void 0&&(s.authorizationWhere=r)):o.set(c,{callbacks:new Set([t]),...a}),()=>{var f,u;let l=this.collectionSubscriptions.get(n);l&&((f=l.get(c))==null||f.callbacks.delete(t),((u=l.get(c))==null?void 0:u.callbacks.size)===0&&l.delete(c));}}notifySubscribers(e,t){let r=e.resource,n=this.collectionSubscriptions.get(r);if(n&&t)for(let a of Array.from(n.values())){let c=he(a.query.where,this.schema[r]),o=z(c,a.authorizationWhere),s=S(t);if(!s)continue;(e.resourceId&&typeof s=="object"&&s!==null&&!("id"in s)||e.resourceId&&typeof s=="object"&&s!==null&&s.id!==e.resourceId)&&(s.id=e.resourceId);let l=Object.keys(o).length>0,f=true;l&&(f=L(s,o)),f&&a.callbacks.forEach(u=>{var h;try{u(e);}catch(R){(h=this.logger)==null||h.error(`Error in mutation subscription for resource ${r}:`,R);}});}}wrapInMiddlewares(e){return t=>Array.from(this.middlewares.values()).reduceRight((r,n)=>a=>n({req:a,next:r}),e)(t)}},Br=me.create;function We(i,e,t){let{include:r,where:n,...a}=i,{stepId:c}=t,o=[{...a,...t,where:n}];if(r&&typeof r=="object"&&Object.keys(r).length>0){let s=e[a.resource];if(!s)throw new Error(`Resource ${a.resource} not found`);o.push(...Object.entries(r).flatMap(([l,f])=>{let u=s.relations[l];if(!u)throw new Error(`Relation ${l} not found for resource ${a.resource}`);let h=u.entity.name;return We({...a,resource:h,include:f},e,{getWhere:u.type==="one"?R=>({id:R}):R=>({[u.foreignColumn]:R}),referenceGetter:R=>R[c].flatMap(d=>d.result.data?u.type==="one"?Object.values(d.result.data).map(m=>{var p,y;return (y=(p=m.value)==null?void 0:p[u.relationalColumn])==null?void 0:y.value}):Object.keys(d.result.data):[]),stepId:`${c}.${l}`,prevStepId:c,isMany:u.type==="many",collectionName:h,included:typeof f=="object"?Object.keys(f):[]})}));}return o}function he(i,e){if(!i||!e||Object.keys(i).length===0)return i;if(i.$and){let r=i.$and.map(n=>he(n,e)).filter(n=>!!n&&Object.keys(n).length>0);return r.length===0?void 0:r.length===1?r[0]:{$and:r}}if(i.$or){let r=i.$or.map(n=>he(n,e)).filter(n=>!!n&&Object.keys(n).length>0);return r.length===0?void 0:r.length===1?r[0]:{$or:r}}let t={};for(let[r,n]of Object.entries(i))e.fields[r]&&(t[r]=n);return Object.keys(t).length>0?t:void 0}
|
|
2
|
-
exports.Route=
|
|
1
|
+
'use strict';var Q=require('crypto'),jsXxhash=require('js-xxhash'),mt=require('qs'),zod=require('zod'),kysely=require('kysely'),postgres=require('kysely/helpers/postgres');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var Q__default=/*#__PURE__*/_interopDefault(Q);var mt__default=/*#__PURE__*/_interopDefault(mt);var Ke=Object.create;var ge=Object.defineProperty;var Fe=Object.getOwnPropertyDescriptor;var qe=Object.getOwnPropertyNames;var Ue=Object.getPrototypeOf,Be=Object.prototype.hasOwnProperty;var Qe=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports);var Ge=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of qe(e))!Be.call(r,i)&&i!==t&&ge(r,i,{get:()=>e[i],enumerable:!(n=Fe(e,i))||n.enumerable});return r};var Re=(r,e,t)=>(t=r!=null?Ke(Ue(r)):{},Ge(ge(t,"default",{value:r,enumerable:true}),r));var oe=Qe(H=>{Object.defineProperty(H,"__esModule",{value:true});H.parse=ut;H.serialize=lt;var rt=/^[\u0021-\u003A\u003C\u003E-\u007E]+$/,it=/^[\u0021-\u003A\u003C-\u007E]*$/,at=/^([.]?[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)([.][a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)*$/i,ot=/^[\u0020-\u003A\u003D-\u007E]*$/,st=Object.prototype.toString,ct=(()=>{let r=function(){};return r.prototype=Object.create(null),r})();function ut(r,e){let t=new ct,n=r.length;if(n<2)return t;let i=(e==null?void 0:e.decode)||dt,a=0;do{let s=r.indexOf("=",a);if(s===-1)break;let o=r.indexOf(";",a),c=o===-1?n:o;if(s>c){a=r.lastIndexOf(";",s-1)+1;continue}let l=Me(r,a,s),p=Le(r,s,l),u=r.slice(l,p);if(t[u]===void 0){let h=Me(r,s+1,c),g=Le(r,c,h),d=i(r.slice(h,g));t[u]=d;}a=c+1;}while(a<n);return t}function Me(r,e,t){do{let n=r.charCodeAt(e);if(n!==32&&n!==9)return e}while(++e<t);return t}function Le(r,e,t){for(;e>t;){let n=r.charCodeAt(--e);if(n!==32&&n!==9)return e+1}return t}function lt(r,e,t){let n=(t==null?void 0:t.encode)||encodeURIComponent;if(!rt.test(r))throw new TypeError(`argument name is invalid: ${r}`);let i=n(e);if(!it.test(i))throw new TypeError(`argument val is invalid: ${e}`);let a=r+"="+i;if(!t)return a;if(t.maxAge!==void 0){if(!Number.isInteger(t.maxAge))throw new TypeError(`option maxAge is invalid: ${t.maxAge}`);a+="; Max-Age="+t.maxAge;}if(t.domain){if(!at.test(t.domain))throw new TypeError(`option domain is invalid: ${t.domain}`);a+="; Domain="+t.domain;}if(t.path){if(!ot.test(t.path))throw new TypeError(`option path is invalid: ${t.path}`);a+="; Path="+t.path;}if(t.expires){if(!yt(t.expires)||!Number.isFinite(t.expires.valueOf()))throw new TypeError(`option expires is invalid: ${t.expires}`);a+="; Expires="+t.expires.toUTCString();}if(t.httpOnly&&(a+="; HttpOnly"),t.secure&&(a+="; Secure"),t.partitioned&&(a+="; Partitioned"),t.priority)switch(typeof t.priority=="string"?t.priority.toLowerCase():void 0){case "low":a+="; Priority=Low";break;case "medium":a+="; Priority=Medium";break;case "high":a+="; 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":a+="; SameSite=Strict";break;case "lax":a+="; SameSite=Lax";break;case "none":a+="; SameSite=None";break;default:throw new TypeError(`option sameSite is invalid: ${t.sameSite}`)}return a}function dt(r){if(r.indexOf("%")===-1)return r;try{return decodeURIComponent(r)}catch{return r}}function yt(r){return st.call(r)==="[object Date]"}});var xe="0123456789ABCDEFGHJKMNPQRSTVWXYZ",W=32;var Ze=16,ve=10,be=0xffffffffffff;var C;(function(r){r.Base32IncorrectEncoding="B32_ENC_INVALID",r.DecodeTimeInvalidCharacter="DEC_TIME_CHAR",r.DecodeTimeValueMalformed="DEC_TIME_MALFORMED",r.EncodeTimeNegative="ENC_TIME_NEG",r.EncodeTimeSizeExceeded="ENC_TIME_SIZE_EXCEED",r.EncodeTimeValueMalformed="ENC_TIME_MALFORMED",r.PRNGDetectFailure="PRNG_DETECT",r.ULIDInvalid="ULID_INVALID",r.Unexpected="UNEXPECTED",r.UUIDInvalid="UUID_INVALID";})(C||(C={}));var $=class extends Error{constructor(e,t){super(`${t} (${e})`),this.name="ULIDError",this.code=e;}};function He(r){let e=Math.floor(r()*W);return e===W&&(e=W-1),xe.charAt(e)}function Je(r){var n;let e=Ye(),t=e&&(e.crypto||e.msCrypto)||(typeof Q__default.default<"u"?Q__default.default:null);if(typeof(t==null?void 0:t.getRandomValues)=="function")return ()=>{let i=new Uint8Array(1);return t.getRandomValues(i),i[0]/255};if(typeof(t==null?void 0:t.randomBytes)=="function")return ()=>t.randomBytes(1).readUInt8()/255;if((n=Q__default.default)!=null&&n.randomBytes)return ()=>Q__default.default.randomBytes(1).readUInt8()/255;throw new $(C.PRNGDetectFailure,"Failed to find a reliable PRNG")}function Ye(){return tt()?self:typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:null}function Xe(r,e){let t="";for(;r>0;r--)t=He(e)+t;return t}function et(r,e=ve){if(isNaN(r))throw new $(C.EncodeTimeValueMalformed,`Time must be a number: ${r}`);if(r>be)throw new $(C.EncodeTimeSizeExceeded,`Cannot encode a time larger than ${be}: ${r}`);if(r<0)throw new $(C.EncodeTimeNegative,`Time must be positive: ${r}`);if(Number.isInteger(r)===false)throw new $(C.EncodeTimeValueMalformed,`Time must be an integer: ${r}`);let t,n="";for(let i=e;i>0;i--)t=r%W,n=xe.charAt(t)+n,r=(r-t)/W;return n}function tt(){return typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope}function Se(r,e){let t=Je(),n=Date.now();return et(n,ve)+Xe(Ze,t)}var G=()=>Se().toLowerCase();var z=(...r)=>{let e=r.filter(t=>!!t);return e.length===0?{}:e.length===1?e[0]:{$and:e}};var w=r=>r?Array.isArray(r.value)?r.value.map(t=>w(t)):typeof r.value!="object"||r.value===null||r.value instanceof Date?r.value:Object.fromEntries(Object.entries(r.value).map(([t,n])=>Array.isArray(n)?[t,n.map(i=>w(i))]:[t,w(n)])):void 0;var we=r=>jsXxhash.xxHash32(JSON.stringify(r)).toString(32),K=(r,e,t)=>{let n={},i=t[e];if(!i)return n;let a=s=>{s.$and?s.$and.forEach(a):s.$or?s.$or.forEach(a):Object.entries(s).forEach(([o,c])=>{var l;if((l=i.relations)!=null&&l[o]&&(n[o]=true,typeof c=="object"&&c!==null&&!Array.isArray(c))){let p=K(c,i.relations[o].entity.name,t);Object.keys(p).length>0&&(n[o]=p);}});};return a(r),n},O=(r,e,t=false)=>Object.entries(e).every(([n,i])=>{if(n==="$and")return i.every(s=>O(r,s,t));if(n==="$or")return i.some(s=>O(r,s,t));let a=(i==null?void 0:i.$eq)!==void 0?i==null?void 0:i.$eq:i;if(typeof i=="object"&&i!==null&&(i==null?void 0:i.$eq)===void 0){if(i.$in!==void 0){let o=r[n];return o===void 0?false:t?!i.$in.includes(o):i.$in.includes(o)}if(i.$not!==void 0&&!t)return O(r,{[n]:i.$not},true);if(i.$gt!==void 0){let o=r[n];return typeof o!="number"?false:t?o<=i.$gt:o>i.$gt}if(i.$gte!==void 0){let o=r[n];return typeof o!="number"?false:t?o<i.$gte:o>=i.$gte}if(i.$lt!==void 0){let o=r[n];return typeof o!="number"?false:t?o>=i.$lt:o<i.$lt}if(i.$lte!==void 0){let o=r[n];return typeof o!="number"?false:t?o>i.$lte:o<=i.$lte}let s=r[n];return !s||typeof s!="object"&&!Array.isArray(s)?false:Array.isArray(s)?t?!s.some(o=>O(o,i,false)):s.some(o=>O(o,i,false)):O(s,i,t)}return t?r[n]!==a:r[n]===a}),E={CRITICAL:0,ERROR:1,WARN:2,INFO:3,DEBUG:4},ae=class{level;prefix;constructor(e={}){this.level=e.level??E.INFO,this.prefix=e.prefix?`[${e.prefix}] `:"";}critical(...e){this.level>=E.CRITICAL&&console.error(`${this.prefix}[CRITICAL]`,...e);}error(...e){this.level>=E.ERROR&&console.error(`${this.prefix}[ERROR]`,...e);}warn(...e){this.level>=E.WARN&&console.warn(`${this.prefix}[WARN]`,...e);}info(...e){this.level>=E.INFO&&console.log(`${this.prefix}[INFO]`,...e);}debug(...e){this.level>=E.DEBUG&&console.log(`${this.prefix}[DEBUG]`,...e);}setLevel(e){this.level=e;}getLevel(){return this.level}},Ie=r=>new ae(r);var Z=class{storage;queue=new Map;scheduled=false;constructor(e){this.storage=e;}async rawFind({resource:e,commonWhere:t,uniqueWhere:n,...i}){return new Promise((a,s)=>{let o=this.getBatchKey({resource:e,commonWhere:t,...i}),c={resource:e,commonWhere:t,uniqueWhere:n,...i,resolve:a,reject:s};this.queue.has(o)||this.queue.set(o,[]);let l=this.queue.get(o);l&&l.push(c),this.scheduled||(this.scheduled=true,setImmediate(()=>{this.processBatch();}));})}getBatchKey(e){let{resource:t,commonWhere:n,...i}=e;return `${t}:${JSON.stringify(n??{})}:${JSON.stringify(i??{})}`}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(i=>{i.reject(n);});}}async executeBatchedRequests(e){var h,g;if(e.length===0)return;let t=e[0],{resource:n,commonWhere:i,include:a,sort:s}=t,o=e.length===1?t.limit:void 0,c=e.map(d=>d.uniqueWhere).filter(d=>d!==void 0),l=i,p=(h=Object.entries(c[0]??{})[0])==null?void 0:h[0];if(c.length>0){let d=c.map(R=>R[p]).filter(R=>R!=null);d.length>0&&(l=z(i,{[p]:{$in:d}}));}let u=await this.storage.rawFind({resource:n,where:l,include:a,sort:s,limit:o});for(let d of e){let R={};if(d.uniqueWhere){let[f,y]=Object.entries(d.uniqueWhere)[0];for(let[m,T]of Object.entries(u))((g=T.value[f])==null?void 0:g.value)===y&&(R[m]=T);}else Object.assign(R,u);d.resolve(R);}}};var je=Re(oe());var F=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.string().or(zod.z.number()).or(zod.z.boolean()).or(zod.z.date()).nullable(),_meta:zod.z.object({timestamp:zod.z.string().optional().nullable()}).optional()})),pt=se.superRefine((r,e)=>{r.id&&e.addIssue({code:zod.z.ZodIssueCode.custom,message:"Payload cannot have an id"});}),Oe=zod.z.object({id:zod.z.string().optional(),type:zod.z.literal("MUTATE"),resource:zod.z.string(),resourceId:zod.z.string().optional()}),q=Oe.extend({procedure:zod.z.string(),payload:zod.z.any().optional()}),U=Oe.extend({procedure:zod.z.enum(["INSERT","UPDATE"]),payload:pt});zod.z.union([U,q]);var Ae=F.omit({resource:true}),ce=q.omit({id:true,type:true,resource:true,procedure:true}),ue=U.omit({id:true,type:true,resource:true,procedure:true});zod.z.union([ue,ce]);var le=r=>{if(r==null)return r;if(r==="null")return null;if(Array.isArray(r))return r.map(le);if(typeof r=="object"&&r.constructor===Object){let e={};for(let[t,n]of Object.entries(r))e[t]=le(n);return e}return r},Ee=r=>{let e=r.logger;return async t=>{var n;try{let i=typeof t.headers.getSetCookie=="function"?Object.fromEntries(t.headers):t.headers,a={headers:i,cookies:i.cookie?je.default.parse(i.cookie):{}},s=new URL(t.url),o=s.pathname.split("/"),c=s.searchParams,l=le(mt__default.default.parse(c.toString())),p=await((n=r.contextProvider)==null?void 0:n.call(r,{transport:"HTTP",headers:a.headers,cookies:a.cookies,queryParams:l}))??{};if(t.method==="GET"){let u=o[o.length-1],{success:h,data:g,error:d}=Ae.safeParse(l);if(!h)return Response.json({message:"Invalid query",code:"INVALID_QUERY",details:d},{status:400});let R=await r.handleQuery({req:{...a,...g,type:"QUERY",resource:u,context:p,queryParams:l}});return !R||!R.data?Response.json({message:"Invalid resource",code:"INVALID_RESOURCE"},{status:400}):Response.json(R.data)}if(t.method==="POST")try{let u=o[o.length-1],h=o[o.length-2],g=t.body?await t.json():{},d;if(u==="insert"||u==="update"){let{success:f,data:y,error:m}=ue.safeParse(g);if(!f)return Response.json({message:"Invalid mutation",code:"INVALID_REQUEST",details:m},{status:400});d=y;}else {let{success:f,data:y,error:m}=ce.safeParse(g);if(!f)return Response.json({message:"Invalid mutation",code:"INVALID_REQUEST",details:m},{status:400});d=y;}let R=await r.handleMutation({req:{...a,type:"MUTATE",resource:h,input:d.payload,context:p,resourceId:d.resourceId,procedure:u==="insert"||u==="update"?u.toUpperCase():u,queryParams:{}}});return Response.json(R)}catch(u){return e.error("Error parsing mutation from the client:",u),Response.json({message:"Internal server error",code:"INTERNAL_SERVER_ERROR"},{status:500})}return Response.json({message:"Not found",code:"NOT_FOUND"},{status:404})}catch(i){return e.error("Unexpected error:",i),Response.json({message:"Internal server error",code:"INTERNAL_SERVER_ERROR"},{status:500})}}};var Pe=Re(oe());var V=zod.z.string(),ht=F.extend({id:V,type:zod.z.literal("SUBSCRIBE")}),Tt=F.extend({id:V,type:zod.z.literal("QUERY")}),Ce=U.extend({id:V}),gt=q.extend({id:V}),Rt=zod.z.union([gt,Ce]),$e=zod.z.union([ht,Tt,Rt]),bt=zod.z.object({id:V,type:zod.z.literal("REJECT"),resource:zod.z.string(),message:zod.z.string().optional()}),xt=zod.z.object({id:V,type:zod.z.literal("REPLY"),data:zod.z.any()});zod.z.union([bt,xt,Ce]);zod.z.object({resource:zod.z.string(),data:zod.z.record(zod.z.string(),se)});var ze=r=>{let e={},t=r.logger;return (n,i)=>{var u;let a=h=>{n.send(JSON.stringify(h));},s=G(),o=new Set,c={headers:i.headers,cookies:typeof i.headers.cookie=="string"?Pe.default.parse(i.headers.cookie):{}},l=mt.parse(i.url.split("?")[1]),p=(u=r.contextProvider)==null?void 0:u.call(r,{transport:"WEBSOCKET",headers:c.headers,cookies:c.cookies,queryParams:l});e[s]=n,t.info("Client connected:",s),n.on("message",async h=>{var g;try{t.debug("Message received from the client:",h);let d=$e.parse(JSON.parse(h.toString()));if(d.type==="SUBSCRIBE"){let R=await p??{},f=d.resource,y=r.router.routes[f],m;if((g=y==null?void 0:y.authorization)!=null&&g.read){let T=y.authorization.read({ctx:R});m=typeof T=="object"?T:void 0;}o.add(r.subscribeToMutations(d,T=>{var x;!T.resourceId||!T.payload||!Object.keys(T.payload).length||(x=e[s])==null||x.send(JSON.stringify(T));},m));}else if(d.type==="QUERY"){let{resource:R}=d,f=await r.handleQuery({req:{...c,type:"QUERY",resource:R,context:await p??{},queryParams:l}});if(!f||!f.data)throw new Error("Invalid resource");a({id:d.id,type:"REPLY",data:{resource:R,data:Object.fromEntries(Object.entries(f.data??{}).map(([y,m])=>[y,m.value]))}});}else if(d.type==="MUTATE"){let{resource:R}=d;t.debug("Received mutation from client:",d);try{let f=await r.handleMutation({req:{...c,type:"MUTATE",resource:R,input:d.payload,context:{messageId:d.id,...await p??{}},resourceId:d.resourceId,procedure:d.procedure,queryParams:l}});d.procedure&&d.procedure!=="INSERT"&&d.procedure!=="UPDATE"&&a({id:d.id,type:"REPLY",data:f});}catch(f){a({id:d.id,type:"REJECT",resource:R,message:f.message}),t.error("Error parsing mutation from the client:",f);}}}catch(d){t.error("Error handling message from the client:",d);}}),n.on("close",()=>{t.info("Connection closed",s),delete e[s];for(let h of Array.from(o))h();});}};function Ne(r){let e=`${r.protocol}://${r.hostname}${r.url}`,t=new Headers;return Object.entries(r.headers).forEach(([n,i])=>{i&&t.set(n,Array.isArray(i)?i.join(","):i);}),new Request(e,{method:r.method,headers:t,body:r.body&&r.method!=="GET"?JSON.stringify(r.body):void 0})}var xn=(r,e,t)=>{r.ws(`${(t==null?void 0:t.basePath)??""}/ws`,ze(e)),r.use(`${(t==null?void 0:t.basePath)??""}/`,(n,i)=>{Ee(e)(Ne(n)).then(s=>s.json().then(o=>i.status(s.status).send(o)));});};var de=class r{routes;constructor(e){this.routes=e.routes;}static create(e){return new r(e)}},Ln=r=>de.create({...r}),wt=r=>({handler:e=>({inputValidator:r??zod.z.undefined(),handler:e})}),ye=class r{resourceSchema;middlewares;customMutations;authorization;constructor(e,t,n){this.resourceSchema=e,this.middlewares=new Set,this.customMutations=t??{},this.authorization=n;}use(...e){for(let t of e)this.middlewares.add(t);return this}withMutations(e){return new r(this.resourceSchema,e({mutation:wt}),this.authorization)}handleQuery=async({req:e,batcher:t})=>await this.wrapInMiddlewares(async n=>{var a,s;let i=(s=(a=this.authorization)==null?void 0:a.read)==null?void 0:s.call(a,{ctx:n.context});if(typeof i=="boolean"&&!i)throw new Error("Not authorized");return {data:await t.rawFind({resource:n.resource,commonWhere:z(n.where,typeof i=="object"?i:void 0),uniqueWhere:n.relationalWhere,include:n.include,limit:n.limit,sort:n.sort})}})(e);handleMutation=async({req:e,db:t,schema:n})=>await this.wrapInMiddlewares(async i=>{if(!i.procedure)throw new Error("Procedure is required for mutations");let a=this.customMutations[i.procedure];if(a){let s=a.inputValidator.parse(i.input);return i.input=s,a.handler({req:i,db:t})}else {if(i.procedure==="INSERT"||i.procedure==="UPDATE")return this.handleSet({req:i,db:t,operation:i.procedure,schema:n});throw new Error(`Unknown procedure: ${i.procedure}`)}})(e);handleSet=async({req:e,db:t,operation:n,schema:i})=>{if(!e.input)throw new Error("Payload is required");if(!e.resourceId)throw new Error("ResourceId is required");let a=await t.rawFindById(e.resource,e.resourceId);if(n==="INSERT"&&a)throw new Error("Resource already exists");if(n==="UPDATE"&&!a)throw new Error("Resource not found");return t.transaction(async({trx:s})=>{var p,u,h,g,d,R,f;let[o,c]=this.resourceSchema.mergeMutation("set",e.input,a);if(!c)throw new Error("Mutation rejected");if(n==="INSERT"){let y=await s.rawInsert(e.resource,e.resourceId,o,(p=e.context)==null?void 0:p.messageId),m=w(y);if(m.id=m.id??e.resourceId,(u=this.authorization)!=null&&u.insert){let T=this.authorization.insert({ctx:e.context,value:m});if(typeof T=="boolean"){if(!T)throw new Error("Not authorized")}else {let x=K(T,e.resource,i),v=Object.keys(x).length>0?await s.rawFindById(e.resource,e.resourceId,x):y,L=w(v);if(L.id=L.id??e.resourceId,!O(L,T))throw new Error("Not authorized")}}return {data:y,acceptedValues:c}}if((g=(h=this.authorization)==null?void 0:h.update)!=null&&g.preMutation){let y=w(a);y.id=y.id??e.resourceId;let m=this.authorization.update.preMutation({ctx:e.context,value:y});if(typeof m=="boolean"){if(!m)throw new Error("Not authorized")}else {let T=K(m,e.resource,i),x=Object.keys(T).length>0?await s.rawFindById(e.resource,e.resourceId,T):a,v=w(x);if(v.id=v.id??e.resourceId,!O(v,m))throw new Error("Not authorized")}}let l=await s.rawUpdate(e.resource,e.resourceId,o,(d=e.context)==null?void 0:d.messageId);if((f=(R=this.authorization)==null?void 0:R.update)!=null&&f.postMutation){let y=w(l);y.id=y.id??e.resourceId;let m=this.authorization.update.postMutation({ctx:e.context,value:y});if(typeof m=="boolean"){if(!m)throw new Error("Not authorized")}else {let T=K(m,e.resource,i),x=Object.keys(T).length>0?await s.rawFindById(e.resource,e.resourceId,T):l,v=w(x);if(v.id=v.id??e.resourceId,!O(v,m))throw new Error("Not authorized")}}return {data:l,acceptedValues:c}})};wrapInMiddlewares(e){return t=>Array.from(this.middlewares.values()).reduceRight((n,i)=>a=>i({req:a,next:n}),e)(t)}},pe=class r{middlewares;constructor(e=[]){this.middlewares=e;}collectionRoute(e,t){return new ye(e,void 0,t).use(...this.middlewares)}use(...e){return new r([...this.middlewares,...e])}static create(){return new r}},On=pe.create;var B=class{async insert(e,t){let n=new Date().toISOString();return w(await this.rawInsert(e.name,t.id,{value:Object.fromEntries(Object.entries(t).map(([i,a])=>[i,{value:a,_meta:{timestamp:n}}]))}))}async update(e,t,n){let i=new Date().toISOString(),{id:a,...s}=n;return w(await this.rawUpdate(e.name,t,{value:Object.fromEntries(Object.entries(s).map(([o,c])=>[o,{value:c,_meta:{timestamp:i}}]))}))}};function J(r,e,t,n){if(!r)throw new Error("Schema not initialized");let i=r[e];if(!i)throw new Error("Resource not found");let a=n.$or,s=n.$and;return (a?t.or:t.and)(a?n.$or.map(o=>J(r,e,t,o)):s?n.$and.map(o=>J(r,e,t,o)):Object.entries(n).map(([o,c])=>{var l,p;if(i.fields[o])return (c==null?void 0:c.$eq)!==void 0?t(`${e}.${o}`,c.$eq===null?"is":"=",c.$eq):(c==null?void 0:c.$in)!==void 0?t(`${e}.${o}`,"in",c.$in):(c==null?void 0:c.$not)!==void 0?((l=c==null?void 0:c.$not)==null?void 0:l.$in)!==void 0?t(`${e}.${o}`,"not in",c.$not.$in):((p=c==null?void 0:c.$not)==null?void 0:p.$eq)!==void 0?t(`${e}.${o}`,c.$not.$eq===null?"is not":"!=",c.$not.$eq):t(`${e}.${o}`,c.$not===null?"is not":"!=",c.$not):(c==null?void 0:c.$gt)!==void 0?t(`${e}.${o}`,">",c.$gt):(c==null?void 0:c.$gte)!==void 0?t(`${e}.${o}`,">=",c.$gte):(c==null?void 0:c.$lt)!==void 0?t(`${e}.${o}`,"<",c.$lt):(c==null?void 0:c.$lte)!==void 0?t(`${e}.${o}`,"<=",c.$lte):t(`${e}.${o}`,c===null?"is":"=",c);if(i.relations[o]){let u=i.relations[o],h=u.entity.name;return u.type==="many"?t.exists(fe(r,h,t.selectFrom(h).select("id").whereRef(u.foreignColumn,"=",`${e}.id`),c)):J(r,h,t,c)}return null}).filter(Boolean))}function Y(r,e,t,n){let i=r[e];if(!i)throw new Error("Resource not found");if(!n)return t;if(n.$and){for(let a of n.$and)t=Y(r,e,t,a);return t}else if(n.$or){for(let a of n.$or)t=Y(r,e,t,a);return t}for(let[a,s]of Object.entries(n)){if(!i.relations[a])continue;let o=i.relations[a],c=o.entity.name,l=o.type==="one"?"id":o.foreignColumn,p=o.type==="one"?o.relationalColumn:"id";t=t.leftJoin(c,`${c}.${l}`,`${e}.${p}`),s instanceof Object&&!Array.isArray(s)&&s!==null&&(t=Y(r,c,t,s));}return t}function fe(r,e,t,n){return !n||Object.keys(n).length===0?t:(t=Y(r,e,t,n),t.where(i=>J(r,e,i,n)))}function X(r,e,t,n){if(!n)return t;if(!r)throw new Error("Schema not initialized");let i=r[e];if(!i)throw new Error(`Resource not found: ${e}`);for(let a of Object.keys(n)){if(!i.relations[a])throw new Error(`Relation ${a} not found in resource ${e}`);let s=i.relations[a],o=s.entity.name,c=n[a],l=s.type==="one"?"id":s.foreignColumn,p=s.type==="one"?s.relationalColumn:"id",u=s.type==="one"?postgres.jsonObjectFrom:postgres.jsonArrayFrom,h=typeof c=="object"&&c!==null;t=t.select(g=>{let d=g.selectFrom(o).selectAll(o).whereRef(`${o}.${l}`,"=",`${e}.${p}`).select(R=>postgres.jsonObjectFrom(R.selectFrom(`${o}_meta`).selectAll(`${o}_meta`).whereRef(`${o}_meta.id`,"=",`${o}.id`)).as("_meta"));return h&&(d=X(r,o,d,c)),u(d).as(a)});}return t}var We="42701",me=class r extends B{db;schema;logger;server;mutationStack=[];constructor(e,t,n,i){super(),this.isKyselyLike(e)?this.db=e:this.db=new kysely.Kysely({dialect:new kysely.PostgresDialect({pool:e})}),this.schema=t,this.logger=n,this.server=i,this.rawInsert=this.rawInsert.bind(this),this.rawUpdate=this.rawUpdate.bind(this);}async init(e,t,n){var a;this.schema=e,this.logger=t,this.server=n;let i=await this.db.introspection.getTables();for(let[s,o]of Object.entries(e)){let c=i.find(u=>u.name===s);c||await this.db.schema.createTable(s).ifNotExists().execute();let l=`${s}_meta`,p=i.find(u=>u.name===l);p||await this.db.schema.createTable(l).ifNotExists().execute();for(let[u,h]of Object.entries(o.fields)){let g=c==null?void 0:c.columns.find(f=>f.name===u),d=h.getStorageFieldType();g?g.dataType!==d.type&&((a=this.logger)==null||a.warn("Column type mismatch:",u,"expected to have type:",d.type,"but has type:",g.dataType)):(await this.db.schema.alterTable(s).addColumn(u,d.type,f=>{let y=f;return d.unique&&(y=y.unique()),d.nullable||(y=y.notNull()),d.references&&(y=y.references(d.references)),d.primary&&(y=y.primaryKey()),d.default!==void 0&&(y=y.defaultTo(d.default)),y}).execute().catch(f=>{var y;if(f.code!==We)throw (y=this.logger)==null||y.error("Error adding column",u,f),f}),d.index&&await this.db.schema.createIndex(`${s}_${u}_index`).on(s).column(u).execute().catch(()=>{})),(p==null?void 0:p.columns.find(f=>f.name===u))||await this.db.schema.alterTable(l).addColumn(u,"varchar",f=>{let y=f;return d.primary&&(y=y.primaryKey().references(`${s}.${u}`)),y}).execute().catch(f=>{var y;if(f.code!==We)throw (y=this.logger)==null||y.error("Error adding meta column",u,f),f});}}}async rawFindById(e,t,n){if(!this.schema)throw new Error("Schema not initialized");let i=await this.db.selectFrom(e).where("id","=",t).selectAll(e).select(s=>postgres.jsonObjectFrom(s.selectFrom(`${e}_meta`).selectAll(`${e}_meta`).whereRef(`${e}_meta.id`,"=",`${e}.id`)).as("_meta"));i=X(this.schema,e,i,n);let a=await i.executeTakeFirst();if(a)return this.convertToMaterializedLiveType(a)}async findOne(e,t,n){let i=await this.rawFindById(e.name,t,n==null?void 0:n.include);if(i)return w(i)}async rawFind(e){if(!this.schema)throw new Error("Schema not initialized");let{resource:t,where:n,include:i,limit:a,sort:s}=e,o=this.db.selectFrom(t).selectAll(t).select(u=>postgres.jsonObjectFrom(u.selectFrom(`${t}_meta`).selectAll(`${t}_meta`).whereRef(`${t}_meta.id`,"=",`${t}.id`)).as("_meta"));o=fe(this.schema,t,o,n),o=X(this.schema,t,o,i),a!==void 0&&(o=o.limit(a)),s!==void 0&&s.forEach(u=>{o=o.orderBy(u.key,u.direction);});let c=await o.execute(),l=Object.fromEntries(c.map(u=>{let{id:h}=u;return [h,u]}));return Object.keys(l).length===0?{}:Object.entries(l).reduce((u,[h,g])=>(u[h]=this.convertToMaterializedLiveType(g),u),{})}async find(e,t){let n=await this.rawFind({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});return Object.fromEntries(Object.entries(n).map(([i,a])=>[i,w(a)]))}async rawInsert(e,t,n,i){var c;let a={},s={};for(let[l,p]of Object.entries(n.value)){let u=(c=p._meta)==null?void 0:c.timestamp;u&&(a[l]=p.value,s[l]=u);}await this.db.insertInto(e).values({...a,id:t}).execute().then(()=>{this.db.insertInto(`${e}_meta`).values({...s,id:t}).execute();});let o=this.buildMutation(e,t,"INSERT",n,i);return o&&this.trackMutation(o,n),n}async rawUpdate(e,t,n,i){var c;let a={},s={};for(let[l,p]of Object.entries(n.value)){let u=(c=p._meta)==null?void 0:c.timestamp;u&&(a[l]=p.value,s[l]=u);}await Promise.all([this.db.updateTable(e).set(a).where("id","=",t).execute(),this.db.insertInto(`${e}_meta`).values({...s,id:t}).onConflict(l=>l.column("id").doUpdateSet(s)).execute()]);let o=this.buildMutation(e,t,"UPDATE",n,i);return o&&this.trackMutation(o,n),n}async transaction(e){if(!this.schema)throw new Error("Schema not initialized");if(this.db.isTransaction){let a=Math.random().toString(36).substring(2,15),s=this.mutationStack,o=[];this.mutationStack=o;let c=await this.db.savepoint(a).execute();try{return await e({trx:this,commit:async()=>{await c.releaseSavepoint(a).execute(),s.push(...o);},rollback:async()=>{await c.rollbackToSavepoint(a).execute(),o.length=0;}}).then(l=>c.isCommitted||c.isRolledBack?l:c.releaseSavepoint(a).execute().then(()=>(s.push(...o),l)))}catch(l){throw await c.rollbackToSavepoint(a).execute().catch(()=>{}),o.length=0,l}finally{this.mutationStack=s;}}let t=[],n=this.mutationStack;this.mutationStack=t;let i=await this.db.startTransaction().execute();try{let a=new r(i,this.schema,this.logger,this.server);return a.mutationStack=t,await e({trx:a,commit:async()=>{await i.commit().execute(),this.notifyMutations(t);},rollback:async()=>{await i.rollback().execute(),t.length=0;}}).then(s=>i.isCommitted||i.isRolledBack?s:i.commit().execute().then(()=>(this.notifyMutations(t),s)))}catch(a){throw await i.rollback().execute(),t.length=0,a}finally{this.mutationStack=n;}}get internalDB(){return this.db}convertToMaterializedLiveType(e){return {value:Object.entries(e).reduce((t,[n,i])=>{var a,s,o;return n==="_meta"||(n==="id"?t[n]={value:i}:Array.isArray(i)?t[n]={value:i.map(c=>this.convertToMaterializedLiveType(c)),_meta:{timestamp:(a=e==null?void 0:e._meta)==null?void 0:a[n]}}:typeof i=="object"&&i!==null&&!(i instanceof Date)?t[n]={...this.convertToMaterializedLiveType(i),_meta:{timestamp:(s=e==null?void 0:e._meta)==null?void 0:s[n]}}:t[n]={value:i,_meta:{timestamp:(o=e==null?void 0:e._meta)==null?void 0:o[n]}}),t},{})}}isKyselyLike(e){if(e instanceof kysely.Kysely)return true;if(!e||typeof e!="object")return false;let t=e,n=typeof t.selectFrom=="function",i=typeof t.startTransaction=="function",a=typeof t.savepoint=="function",s=typeof t.isTransaction=="boolean"||typeof t.isTransaction=="function";return n&&i||a&&s}buildMutation(e,t,n,i,a){var o;let s={};for(let[c,l]of Object.entries(i.value)){if(c==="id")continue;let p=(o=l._meta)==null?void 0:o.timestamp;p&&(s[c]={value:l.value,_meta:{timestamp:p}});}return Object.keys(s).length===0?null:{id:a??G(),type:"MUTATE",resource:e,resourceId:t,procedure:n,payload:s}}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 i of n)this.server.notifySubscribers(i,t);}else {let n=e;for(let{mutation:i,entityData:a}of n)this.server.notifySubscribers(i,a);}}};var he=class r{router;storage;schema;middlewares=new Set;logger;contextProvider;mutationSubscriptions=new Set;collectionSubscriptions=new Map;constructor(e){var t;this.router=e.router,this.storage=e.storage,this.schema=e.schema,this.logger=Ie({level:e.logLevel??E.INFO}),(t=e.middlewares)==null||t.forEach(n=>{this.middlewares.add(n);}),this.storage.init(this.schema,this.logger,this),this.contextProvider=e.contextProvider;}static create(e){return new r(e)}handleQuery(e){let t=new Z(this.storage);return this.wrapInMiddlewares(async n=>{var g,d,R;let i=De(n,this.schema,{stepId:"query",collectionName:n.resource,included:Object.keys(n.include??{})}),a={headers:n.headers,cookies:n.cookies,queryParams:n.queryParams,context:n.context},s={};for(let f=0;f<i.length;f++){let y=i[f],m=this.router.routes[y.resource];if(!m)throw new Error("Invalid resource");let T;if(y.getWhere&&y.referenceGetter){let S=y.referenceGetter(s);T=[];for(let M=0;M<S.length;M++)T.push(y.getWhere(S[M]));}else T=[void 0];let x=s[y.prevStepId??""],v=[];if(x)for(let S=0;S<x.length;S++){let M=x[S],j=Object.keys(((g=M==null?void 0:M.result)==null?void 0:g.data)??{});for(let _=0;_<j.length;_++)v.push(j[_]);}let L=[];for(let S=0;S<T.length;S++){let M=T[S],j=v[S];L.push((async()=>{let _=await m.handleQuery({req:{type:"QUERY",...y,...a,where:y.where,relationalWhere:M},batcher:t});return {includedBy:j,result:_}})());}let A=await Promise.allSettled(L),k=[];for(let S=0;S<A.length;S++){let M=A[S];M.status==="fulfilled"&&k.push(M.value);}s[y.stepId]=k;}let o=new Map,c=0;for(let f in s){let y=s[f],m=i[c];c++;for(let T=0;T<y.length;T++){let x=y[T],v=x.result.data;for(let L in v){let A=v[L],k=`${f}.${L}`,S=[];f!=="query"&&x.includedBy&&(S=[`${m.prevStepId}.${x.includedBy}`]);let M=o.get(k);if(M)for(let j=0;j<S.length;j++)M.includedBy.add(S[j]);else o.set(k,{data:A,includedBy:new Set(S),path:f.split(".").slice(-1)[0],isMany:m.isMany??false,collectionName:m.collectionName,included:m.included});}}}let l=Object.fromEntries(o),p={data:{}},u=Object.keys(l);for(let f=u.length-1;f>=0;f--){let y=u[f],m=l[y],T=m.path;if(T==="query"&&(p.data[y.replace("query.","")]=m.data),m.included.length)for(let x=0;x<m.included.length;x++){let v=m.included[x];m.data.value[v]??=((R=(d=this.schema[m.collectionName])==null?void 0:d.relations[v])==null?void 0:R.type)==="many"?{value:[]}:{value:null};}if(m.includedBy.size>0){let x=Array.from(m.includedBy);for(let v=0;v<x.length;v++){let L=x[v],A=l[L];A&&(m.isMany?(A.data.value[T]??={value:[]},A.data.value[T].value.push(m.data)):A.data.value[T]=m.data);}}}return p})(e.req)}async handleMutation(e){let t=await this.wrapInMiddlewares(async n=>{let i=this.router.routes[n.resource];if(!i)throw new Error("Invalid resource");return i.handleMutation({req:n,db:this.storage,schema:this.schema})})(e.req);if(t&&e.req.type==="MUTATE"&&t.acceptedValues&&(e.req.procedure==="INSERT"||e.req.procedure==="UPDATE")&&e.req.resourceId){let i=t.acceptedValues??{},a=e.req,s=a.resourceId;Object.keys(i).length&&s&&this.mutationSubscriptions.forEach(o=>{o({id:e.req.context.messageId,type:"MUTATE",resource:a.resource,payload:i,resourceId:s,procedure:a.procedure});});}return t}use(e){return this.middlewares.add(e),this}context(e){return this.contextProvider=e,this}subscribeToMutations(e,t,n){let i=e.resource,a={query:e,authorizationWhere:n},s=we(a),o=this.collectionSubscriptions.get(i);o||(o=new Map,this.collectionSubscriptions.set(i,o));let c=o.get(s);return c?(c.callbacks.add(t),n!==void 0&&(c.authorizationWhere=n)):o.set(s,{callbacks:new Set([t]),...a}),()=>{var p,u;let l=this.collectionSubscriptions.get(i);l&&((p=l.get(s))==null||p.callbacks.delete(t),((u=l.get(s))==null?void 0:u.callbacks.size)===0&&l.delete(s));}}notifySubscribers(e,t){let n=e.resource,i=this.collectionSubscriptions.get(n);if(i&&t)for(let a of Array.from(i.values())){let s=Te(a.query.where,this.schema[n]),o=z(s,a.authorizationWhere),c=w(t);if(!c)continue;(e.resourceId&&typeof c=="object"&&c!==null&&!("id"in c)||e.resourceId&&typeof c=="object"&&c!==null&&c.id!==e.resourceId)&&(c.id=e.resourceId);let l=Object.keys(o).length>0,p=true;l&&(p=O(c,o)),p&&a.callbacks.forEach(u=>{var h;try{u(e);}catch(g){(h=this.logger)==null||h.error(`Error in mutation subscription for resource ${n}:`,g);}});}}wrapInMiddlewares(e){return t=>Array.from(this.middlewares.values()).reduceRight((n,i)=>a=>i({req:a,next:n}),e)(t)}},Gn=he.create;function De(r,e,t){let{include:n,where:i,...a}=r,{stepId:s}=t,o=[{...a,...t,where:i}];if(n&&typeof n=="object"&&Object.keys(n).length>0){let c=e[a.resource];if(!c)throw new Error(`Resource ${a.resource} not found`);o.push(...Object.entries(n).flatMap(([l,p])=>{let u=c.relations[l];if(!u)throw new Error(`Relation ${l} not found for resource ${a.resource}`);let h=u.entity.name;return De({...a,resource:h,include:p},e,{getWhere:u.type==="one"?g=>({id:g}):g=>({[u.foreignColumn]:g}),referenceGetter:g=>g[s].flatMap(d=>d.result.data?u.type==="one"?Object.values(d.result.data).map(R=>{var f,y;return (y=(f=R.value)==null?void 0:f[u.relationalColumn])==null?void 0:y.value}):Object.keys(d.result.data):[]),stepId:`${s}.${l}`,prevStepId:s,isMany:u.type==="many",collectionName:h,included:typeof p=="object"?Object.keys(p):[]})}));}return o}function Te(r,e){if(!r||!e||Object.keys(r).length===0)return r;if(r.$and){let n=r.$and.map(i=>Te(i,e)).filter(i=>!!i&&Object.keys(i).length>0);return n.length===0?void 0:n.length===1?n[0]:{$and:n}}if(r.$or){let n=r.$or.map(i=>Te(i,e)).filter(i=>!!i&&Object.keys(i).length>0);return n.length===0?void 0:n.length===1?n[0]:{$or:n}}let t={};for(let[n,i]of Object.entries(r))e.fields[n]&&(t[n]=i);return Object.keys(t).length>0?t:void 0}
|
|
2
|
+
exports.Route=ye;exports.RouteFactory=pe;exports.Router=de;exports.SQLStorage=me;exports.Server=he;exports.Storage=B;exports.expressAdapter=xn;exports.routeFactory=On;exports.router=Ln;exports.server=Gn;
|
package/dist/server.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {a,b,t,w,x,z as z$2,y,v}from'./chunk-3SQDLIFN.js';import V from'node:crypto';import Je,{parse}from'qs';import {z as z$1}from'zod';import {Kysely,PostgresDialect}from'kysely';import {jsonObjectFrom,jsonArrayFrom}from'kysely/helpers/postgres';var H=a(Q=>{Object.defineProperty(Q,"__esModule",{value:true});Q.parse=Fe;Q.serialize=Qe;var De=/^[\u0021-\u003A\u003C\u003E-\u007E]+$/,Ue=/^[\u0021-\u003A\u003C-\u007E]*$/,Be=/^([.]?[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)([.][a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)*$/i,_e=/^[\u0020-\u003A\u003D-\u007E]*$/,Ve=Object.prototype.toString,qe=(()=>{let i=function(){};return i.prototype=Object.create(null),i})();function Fe(i,t){let e=new qe,r=i.length;if(r<2)return e;let n=(t==null?void 0:t.decode)||Ge,a=0;do{let s=i.indexOf("=",a);if(s===-1)break;let c=i.indexOf(";",a),o=c===-1?r:c;if(s>o){a=i.lastIndexOf(";",s-1)+1;continue}let p=me(i,a,s),f=he(i,s,p),u=i.slice(p,f);if(e[u]===void 0){let h=me(i,s+1,o),R=he(i,o,h),d=n(i.slice(h,R));e[u]=d;}a=o+1;}while(a<r);return e}function me(i,t,e){do{let r=i.charCodeAt(t);if(r!==32&&r!==9)return t}while(++t<e);return e}function he(i,t,e){for(;t>e;){let r=i.charCodeAt(--t);if(r!==32&&r!==9)return t+1}return e}function Qe(i,t,e){let r=(e==null?void 0:e.encode)||encodeURIComponent;if(!De.test(i))throw new TypeError(`argument name is invalid: ${i}`);let n=r(t);if(!Ue.test(n))throw new TypeError(`argument val is invalid: ${t}`);let a=i+"="+n;if(!e)return a;if(e.maxAge!==void 0){if(!Number.isInteger(e.maxAge))throw new TypeError(`option maxAge is invalid: ${e.maxAge}`);a+="; Max-Age="+e.maxAge;}if(e.domain){if(!Be.test(e.domain))throw new TypeError(`option domain is invalid: ${e.domain}`);a+="; Domain="+e.domain;}if(e.path){if(!_e.test(e.path))throw new TypeError(`option path is invalid: ${e.path}`);a+="; Path="+e.path;}if(e.expires){if(!Ze(e.expires)||!Number.isFinite(e.expires.valueOf()))throw new TypeError(`option expires is invalid: ${e.expires}`);a+="; Expires="+e.expires.toUTCString();}if(e.httpOnly&&(a+="; HttpOnly"),e.secure&&(a+="; Secure"),e.partitioned&&(a+="; Partitioned"),e.priority)switch(typeof e.priority=="string"?e.priority.toLowerCase():void 0){case "low":a+="; Priority=Low";break;case "medium":a+="; Priority=Medium";break;case "high":a+="; Priority=High";break;default:throw new TypeError(`option priority is invalid: ${e.priority}`)}if(e.sameSite)switch(typeof e.sameSite=="string"?e.sameSite.toLowerCase():e.sameSite){case true:case "strict":a+="; SameSite=Strict";break;case "lax":a+="; SameSite=Lax";break;case "none":a+="; SameSite=None";break;default:throw new TypeError(`option sameSite is invalid: ${e.sameSite}`)}return a}function Ge(i){if(i.indexOf("%")===-1)return i;try{return decodeURIComponent(i)}catch{return i}}function Ze(i){return Ve.call(i)==="[object Date]"}});var pe="0123456789ABCDEFGHJKMNPQRSTVWXYZ",N=32;var Ce=16,ye=10,le=0xffffffffffff;var O;(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";})(O||(O={}));var L=class extends Error{constructor(t,e){super(`${e} (${t})`),this.name="ULIDError",this.code=t;}};function $e(i){let t=Math.floor(i()*N);return t===N&&(t=N-1),pe.charAt(t)}function ze(i){var r;let t=Pe(),e=t&&(t.crypto||t.msCrypto)||(typeof V<"u"?V:null);if(typeof(e==null?void 0:e.getRandomValues)=="function")return ()=>{let n=new Uint8Array(1);return e.getRandomValues(n),n[0]/255};if(typeof(e==null?void 0:e.randomBytes)=="function")return ()=>e.randomBytes(1).readUInt8()/255;if((r=V)!=null&&r.randomBytes)return ()=>V.randomBytes(1).readUInt8()/255;throw new L(O.PRNGDetectFailure,"Failed to find a reliable PRNG")}function Pe(){return We()?self:typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:null}function ke(i,t){let e="";for(;i>0;i--)e=$e(t)+e;return e}function Ne(i,t=ye){if(isNaN(i))throw new L(O.EncodeTimeValueMalformed,`Time must be a number: ${i}`);if(i>le)throw new L(O.EncodeTimeSizeExceeded,`Cannot encode a time larger than ${le}: ${i}`);if(i<0)throw new L(O.EncodeTimeNegative,`Time must be positive: ${i}`);if(Number.isInteger(i)===false)throw new L(O.EncodeTimeValueMalformed,`Time must be an integer: ${i}`);let e,r="";for(let n=t;n>0;n--)e=i%N,r=pe.charAt(e)+r,i=(i-e)/N;return r}function We(){return typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope}function fe(i,t){let e=ze(),r=Date.now();return Ne(r,ye)+ke(Ce,e)}var q=()=>fe().toLowerCase();var $=(...i)=>{let t=i.filter(e=>!!e);return t.length===0?{}:t.length===1?t[0]:{$and:t}};var F=class{storage;queue=new Map;scheduled=false;constructor(t){this.storage=t;}async rawFind({resource:t,commonWhere:e,uniqueWhere:r,...n}){return new Promise((a,s)=>{let c=this.getBatchKey({resource:t,commonWhere:e,...n}),o={resource:t,commonWhere:e,uniqueWhere:r,...n,resolve:a,reject:s};this.queue.has(c)||this.queue.set(c,[]);let p=this.queue.get(c);p&&p.push(o),this.scheduled||(this.scheduled=true,setImmediate(()=>{this.processBatch();}));})}getBatchKey(t){let{resource:e,commonWhere:r,...n}=t;return `${e}:${JSON.stringify(r??{})}:${JSON.stringify(n??{})}`}async processBatch(){this.scheduled=false;let t=Array.from(this.queue.entries());this.queue.clear();for(let[,e]of t)try{await this.executeBatchedRequests(e);}catch(r){e.forEach(n=>{n.reject(r);});}}async executeBatchedRequests(t){var h,R;if(t.length===0)return;let e=t[0],{resource:r,commonWhere:n,include:a,sort:s}=e,c=t.length===1?e.limit:void 0,o=t.map(d=>d.uniqueWhere).filter(d=>d!==void 0),p=n,f=(h=Object.entries(o[0]??{})[0])==null?void 0:h[0];if(o.length>0){let d=o.map(m=>m[f]).filter(m=>m!=null);d.length>0&&(p=$(n,{[f]:{$in:d}}));}let u=await this.storage.rawFind({resource:r,where:p,include:a,sort:s,limit:c});for(let d of t){let m={};if(d.uniqueWhere){let[y,l]=Object.entries(d.uniqueWhere)[0];for(let[g,T]of Object.entries(u))((R=T.value[y])==null?void 0:R.value)===l&&(m[g]=T);}else Object.assign(m,u);d.resolve(m);}}};var Re=b(H(),1);var W=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.string().or(z$1.number()).or(z$1.boolean()).or(z$1.date()).nullable(),_meta:z$1.object({timestamp:z$1.string().optional().nullable()}).optional()})),Ke=J.superRefine((i,t)=>{i.id&&t.addIssue({code:z$1.ZodIssueCode.custom,message:"Payload cannot have an id"});}),ge=z$1.object({id:z$1.string().optional(),type:z$1.literal("MUTATE"),resource:z$1.string(),resourceId:z$1.string().optional()}),D=ge.extend({procedure:z$1.string(),payload:z$1.any().optional()}),U=ge.extend({procedure:z$1.enum(["INSERT","UPDATE"]),payload:Ke});z$1.union([U,D]);var Te=W.omit({resource:true}),Y=D.omit({id:true,type:true,resource:true,procedure:true}),X=U.omit({id:true,type:true,resource:true,procedure:true});z$1.union([X,Y]);var be=i=>{let t=i.logger;return async e=>{var r;try{let n=typeof e.headers.getSetCookie=="function"?Object.fromEntries(e.headers):e.headers,a={headers:n,cookies:n.cookie?Re.default.parse(n.cookie):{}},s=new URL(e.url),c=s.pathname.split("/"),o=s.searchParams,p=Je.parse(o.toString()),f=await((r=i.contextProvider)==null?void 0:r.call(i,{transport:"HTTP",headers:a.headers,cookies:a.cookies,queryParams:p}))??{};if(e.method==="GET"){let u=c[c.length-1],{success:h,data:R,error:d}=Te.safeParse(p);if(!h)return Response.json({message:"Invalid query",code:"INVALID_QUERY",details:d},{status:400});let m=await i.handleQuery({req:{...a,...R,type:"QUERY",resource:u,context:f,queryParams:p}});return !m||!m.data?Response.json({message:"Invalid resource",code:"INVALID_RESOURCE"},{status:400}):Response.json(m.data)}if(e.method==="POST")try{let u=c[c.length-1],h=c[c.length-2],R=e.body?await e.json():{},d;if(u==="insert"||u==="update"){let{success:y,data:l,error:g}=X.safeParse(R);if(!y)return Response.json({message:"Invalid mutation",code:"INVALID_REQUEST",details:g},{status:400});d=l;}else {let{success:y,data:l,error:g}=Y.safeParse(R);if(!y)return Response.json({message:"Invalid mutation",code:"INVALID_REQUEST",details:g},{status:400});d=l;}let m=await i.handleMutation({req:{...a,type:"MUTATE",resource:h,input:d.payload,context:f,resourceId:d.resourceId,procedure:u==="insert"||u==="update"?u.toUpperCase():u,queryParams:{}}});return Response.json(m)}catch(u){return t.error("Error parsing mutation from the client:",u),Response.json({message:"Internal server error",code:"INTERNAL_SERVER_ERROR"},{status:500})}return Response.json({message:"Not found",code:"NOT_FOUND"},{status:404})}catch(n){return t.error("Unexpected error:",n),Response.json({message:"Internal server error",code:"INTERNAL_SERVER_ERROR"},{status:500})}}};var xe=b(H(),1);var z=z$1.string(),Ye=W.extend({id:z,type:z$1.literal("SUBSCRIBE")}),Xe=W.extend({id:z,type:z$1.literal("QUERY")}),Se=U.extend({id:z}),et=D.extend({id:z}),tt=z$1.union([et,Se]),we=z$1.union([Ye,Xe,tt]),rt=z$1.object({id:z,type:z$1.literal("REJECT"),resource:z$1.string(),message:z$1.string().optional()}),nt=z$1.object({id:z,type:z$1.literal("REPLY"),data:z$1.any()});z$1.union([rt,nt,Se]);z$1.object({resource:z$1.string(),data:z$1.record(z$1.string(),J)});var Me=i=>{let t={},e=i.logger;return (r,n)=>{var u;let a=h=>{r.send(JSON.stringify(h));},s=q(),c=new Set,o={headers:n.headers,cookies:typeof n.headers.cookie=="string"?xe.default.parse(n.headers.cookie):{}},p=parse(n.url.split("?")[1]),f=(u=i.contextProvider)==null?void 0:u.call(i,{transport:"WEBSOCKET",headers:o.headers,cookies:o.cookies,queryParams:p});t[s]=r,e.info("Client connected:",s),r.on("message",async h=>{var R;try{e.debug("Message received from the client:",h);let d=we.parse(JSON.parse(h.toString()));if(d.type==="SUBSCRIBE"){let m=await f??{},y=d.resource,l=i.router.routes[y],g;if((R=l==null?void 0:l.authorization)!=null&&R.read){let T=l.authorization.read({ctx:m});g=typeof T=="object"?T:void 0;}c.add(i.subscribeToMutations(d,T=>{var S;!T.resourceId||!T.payload||!Object.keys(T.payload).length||(S=t[s])==null||S.send(JSON.stringify(T));},g));}else if(d.type==="QUERY"){let{resource:m}=d,y=await i.handleQuery({req:{...o,type:"QUERY",resource:m,context:await f??{},queryParams:p}});if(!y||!y.data)throw new Error("Invalid resource");a({id:d.id,type:"REPLY",data:{resource:m,data:Object.fromEntries(Object.entries(y.data??{}).map(([l,g])=>[l,g.value]))}});}else if(d.type==="MUTATE"){let{resource:m}=d;e.debug("Received mutation from client:",d);try{let y=await i.handleMutation({req:{...o,type:"MUTATE",resource:m,input:d.payload,context:{messageId:d.id,...await f??{}},resourceId:d.resourceId,procedure:d.procedure,queryParams:p}});d.procedure&&d.procedure!=="INSERT"&&d.procedure!=="UPDATE"&&a({id:d.id,type:"REPLY",data:y});}catch(y){a({id:d.id,type:"REJECT",resource:m,message:y.message}),e.error("Error parsing mutation from the client:",y);}}}catch(d){e.error("Error handling message from the client:",d);}}),r.on("close",()=>{e.info("Connection closed",s),delete t[s];for(let h of Array.from(c))h();});}};function Ie(i){let t=`${i.protocol}://${i.hostname}${i.url}`,e=new Headers;return Object.entries(i.headers).forEach(([r,n])=>{n&&e.set(r,Array.isArray(n)?n.join(","):n);}),new Request(t,{method:i.method,headers:e,body:i.body&&i.method!=="GET"?JSON.stringify(i.body):void 0})}var Dt=(i,t,e)=>{i.ws(`${(e==null?void 0:e.basePath)??""}/ws`,Me(t)),i.use(`${(e==null?void 0:e.basePath)??""}/`,(r,n)=>{be(t)(Ie(r)).then(s=>s.json().then(c=>n.status(s.status).send(c)));});};var ee=class i{routes;constructor(t){this.routes=t.routes;}static create(t){return new i(t)}},Ft=i=>ee.create({...i}),ot=i=>({handler:t=>({inputValidator:i??z$1.undefined(),handler:t})}),te=class i{resourceSchema;middlewares;customMutations;authorization;constructor(t,e,r){this.resourceSchema=t,this.middlewares=new Set,this.customMutations=e??{},this.authorization=r;}use(...t){for(let e of t)this.middlewares.add(e);return this}withMutations(t){return new i(this.resourceSchema,t({mutation:ot}),this.authorization)}handleQuery=async({req:t,batcher:e})=>await this.wrapInMiddlewares(async r=>{var a,s;let n=(s=(a=this.authorization)==null?void 0:a.read)==null?void 0:s.call(a,{ctx:r.context});if(typeof n=="boolean"&&!n)throw new Error("Not authorized");return {data:await e.rawFind({resource:r.resource,commonWhere:$(r.where,typeof n=="object"?n:void 0),uniqueWhere:r.relationalWhere,include:r.include,limit:r.limit,sort:r.sort})}})(t);handleMutation=async({req:t,db:e,schema:r})=>await this.wrapInMiddlewares(async n=>{if(!n.procedure)throw new Error("Procedure is required for mutations");let a=this.customMutations[n.procedure];if(a){let s=a.inputValidator.parse(n.input);return n.input=s,a.handler({req:n,db:e})}else {if(n.procedure==="INSERT"||n.procedure==="UPDATE")return this.handleSet({req:n,db:e,operation:n.procedure,schema:r});throw new Error(`Unknown procedure: ${n.procedure}`)}})(t);handleSet=async({req:t$1,db:e,operation:r,schema:n})=>{if(!t$1.input)throw new Error("Payload is required");if(!t$1.resourceId)throw new Error("ResourceId is required");let a=await e.rawFindById(t$1.resource,t$1.resourceId);if(r==="INSERT"&&a)throw new Error("Resource already exists");if(r==="UPDATE"&&!a)throw new Error("Resource not found");return e.transaction(async({trx:s})=>{var f,u,h,R,d;let[c,o]=this.resourceSchema.mergeMutation("set",t$1.input,a);if(!o)throw new Error("Mutation rejected");if(r==="INSERT"){let m=await s.rawInsert(t$1.resource,t$1.resourceId,c),y=t(m);if(y.id=y.id??t$1.resourceId,(f=this.authorization)!=null&&f.insert){let l=this.authorization.insert({ctx:t$1.context,value:y});if(typeof l=="boolean"){if(!l)throw new Error("Not authorized")}else {let g=w(l,t$1.resource,n),T=Object.keys(g).length>0?await s.rawFindById(t$1.resource,t$1.resourceId,g):m,S=t(T);if(S.id=S.id??t$1.resourceId,!x(S,l))throw new Error("Not authorized")}}return {data:m,acceptedValues:o}}if((h=(u=this.authorization)==null?void 0:u.update)!=null&&h.preMutation){let m=t(a);m.id=m.id??t$1.resourceId;let y=this.authorization.update.preMutation({ctx:t$1.context,value:m});if(typeof y=="boolean"){if(!y)throw new Error("Not authorized")}else {let l=w(y,t$1.resource,n),g=Object.keys(l).length>0?await s.rawFindById(t$1.resource,t$1.resourceId,l):a,T=t(g);if(T.id=T.id??t$1.resourceId,!x(T,y))throw new Error("Not authorized")}}let p=await s.rawUpdate(t$1.resource,t$1.resourceId,c);if((d=(R=this.authorization)==null?void 0:R.update)!=null&&d.postMutation){let m=t(p);m.id=m.id??t$1.resourceId;let y=this.authorization.update.postMutation({ctx:t$1.context,value:m});if(typeof y=="boolean"){if(!y)throw new Error("Not authorized")}else {let l=w(y,t$1.resource,n),g=Object.keys(l).length>0?await s.rawFindById(t$1.resource,t$1.resourceId,l):p,T=t(g);if(T.id=T.id??t$1.resourceId,!x(T,y))throw new Error("Not authorized")}}return {data:p,acceptedValues:o}})};wrapInMiddlewares(t){return e=>Array.from(this.middlewares.values()).reduceRight((r,n)=>a=>n({req:a,next:r}),t)(e)}},re=class i{middlewares;constructor(t=[]){this.middlewares=t;}collectionRoute(t,e){return new te(t,void 0,e).use(...this.middlewares)}use(...t){return new i([...this.middlewares,...t])}static create(){return new i}},Qt=re.create;var B=class{async insert(t$1,e){let r=new Date().toISOString();return t(await this.rawInsert(t$1.name,e.id,{value:Object.fromEntries(Object.entries(e).map(([n,a])=>[n,{value:a,_meta:{timestamp:r}}]))}))}async update(t$1,e,r){let n=new Date().toISOString(),{id:a,...s}=r;return t(await this.rawUpdate(t$1.name,e,{value:Object.fromEntries(Object.entries(s).map(([c,o])=>[c,{value:o,_meta:{timestamp:n}}]))}))}};function G(i,t,e,r){if(!i)throw new Error("Schema not initialized");let n=i[t];if(!n)throw new Error("Resource not found");let a=r.$or,s=r.$and;return (a?e.or:e.and)(a?r.$or.map(c=>G(i,t,e,c)):s?r.$and.map(c=>G(i,t,e,c)):Object.entries(r).map(([c,o])=>{var p,f;if(n.fields[c])return (o==null?void 0:o.$eq)!==void 0?e(`${t}.${c}`,o.$eq===null?"is":"=",o.$eq):(o==null?void 0:o.$in)!==void 0?e(`${t}.${c}`,"in",o.$in):(o==null?void 0:o.$not)!==void 0?((p=o==null?void 0:o.$not)==null?void 0:p.$in)!==void 0?e(`${t}.${c}`,"not in",o.$not.$in):((f=o==null?void 0:o.$not)==null?void 0:f.$eq)!==void 0?e(`${t}.${c}`,o.$not.$eq===null?"is not":"!=",o.$not.$eq):e(`${t}.${c}`,o.$not===null?"is not":"!=",o.$not):(o==null?void 0:o.$gt)!==void 0?e(`${t}.${c}`,">",o.$gt):(o==null?void 0:o.$gte)!==void 0?e(`${t}.${c}`,">=",o.$gte):(o==null?void 0:o.$lt)!==void 0?e(`${t}.${c}`,"<",o.$lt):(o==null?void 0:o.$lte)!==void 0?e(`${t}.${c}`,"<=",o.$lte):e(`${t}.${c}`,o===null?"is":"=",o);if(n.relations[c]){let u=n.relations[c],h=u.entity.name;return u.type==="many"?e.exists(ne(i,h,e.selectFrom(h).select("id").whereRef(u.foreignColumn,"=",`${t}.id`),o)):G(i,h,e,o)}return null}).filter(Boolean))}function Z(i,t,e,r){let n=i[t];if(!n)throw new Error("Resource not found");if(!r)return e;if(r.$and){for(let a of r.$and)e=Z(i,t,e,a);return e}else if(r.$or){for(let a of r.$or)e=Z(i,t,e,a);return e}for(let[a,s]of Object.entries(r)){if(!n.relations[a])continue;let c=n.relations[a],o=c.entity.name,p=c.type==="one"?"id":c.foreignColumn,f=c.type==="one"?c.relationalColumn:"id";e=e.leftJoin(o,`${o}.${p}`,`${t}.${f}`),s instanceof Object&&!Array.isArray(s)&&s!==null&&(e=Z(i,o,e,s));}return e}function ne(i,t,e,r){return !r||Object.keys(r).length===0?e:(e=Z(i,t,e,r),e.where(n=>G(i,t,n,r)))}function K(i,t,e,r){if(!r)return e;if(!i)throw new Error("Schema not initialized");let n=i[t];if(!n)throw new Error(`Resource not found: ${t}`);for(let a of Object.keys(r)){if(!n.relations[a])throw new Error(`Relation ${a} not found in resource ${t}`);let s=n.relations[a],c=s.entity.name,o=r[a],p=s.type==="one"?"id":s.foreignColumn,f=s.type==="one"?s.relationalColumn:"id",u=s.type==="one"?jsonObjectFrom:jsonArrayFrom,h=typeof o=="object"&&o!==null;e=e.select(R=>{let d=R.selectFrom(c).selectAll(c).whereRef(`${c}.${p}`,"=",`${t}.${f}`).select(m=>jsonObjectFrom(m.selectFrom(`${c}_meta`).selectAll(`${c}_meta`).whereRef(`${c}_meta.id`,"=",`${c}.id`)).as("_meta"));return h&&(d=K(i,c,d,o)),u(d).as(a)});}return e}var je="42701",ie=class i extends B{db;schema;logger;server;mutationStack=[];constructor(t,e,r,n){super(),this.isKyselyLike(t)?this.db=t:this.db=new Kysely({dialect:new PostgresDialect({pool:t})}),this.schema=e,this.logger=r,this.server=n,this.rawInsert=this.rawInsert.bind(this),this.rawUpdate=this.rawUpdate.bind(this);}async init(t,e,r){var a;this.schema=t,this.logger=e,this.server=r;let n=await this.db.introspection.getTables();for(let[s,c]of Object.entries(t)){let o=n.find(u=>u.name===s);o||await this.db.schema.createTable(s).ifNotExists().execute();let p=`${s}_meta`,f=n.find(u=>u.name===p);f||await this.db.schema.createTable(p).ifNotExists().execute();for(let[u,h]of Object.entries(c.fields)){let R=o==null?void 0:o.columns.find(y=>y.name===u),d=h.getStorageFieldType();R?R.dataType!==d.type&&((a=this.logger)==null||a.warn("Column type mismatch:",u,"expected to have type:",d.type,"but has type:",R.dataType)):(await this.db.schema.alterTable(s).addColumn(u,d.type,y=>{let l=y;return d.unique&&(l=l.unique()),d.nullable||(l=l.notNull()),d.references&&(l=l.references(d.references)),d.primary&&(l=l.primaryKey()),d.default!==void 0&&(l=l.defaultTo(d.default)),l}).execute().catch(y=>{var l;if(y.code!==je)throw (l=this.logger)==null||l.error("Error adding column",u,y),y}),d.index&&await this.db.schema.createIndex(`${s}_${u}_index`).on(s).column(u).execute().catch(()=>{})),(f==null?void 0:f.columns.find(y=>y.name===u))||await this.db.schema.alterTable(p).addColumn(u,"varchar",y=>{let l=y;return d.primary&&(l=l.primaryKey().references(`${s}.${u}`)),l}).execute().catch(y=>{var l;if(y.code!==je)throw (l=this.logger)==null||l.error("Error adding meta column",u,y),y});}}}async rawFindById(t,e,r){if(!this.schema)throw new Error("Schema not initialized");let n=await this.db.selectFrom(t).where("id","=",e).selectAll(t).select(s=>jsonObjectFrom(s.selectFrom(`${t}_meta`).selectAll(`${t}_meta`).whereRef(`${t}_meta.id`,"=",`${t}.id`)).as("_meta"));n=K(this.schema,t,n,r);let a=await n.executeTakeFirst();if(a)return this.convertToMaterializedLiveType(a)}async findOne(t$1,e,r){let n=await this.rawFindById(t$1.name,e,r==null?void 0:r.include);if(n)return t(n)}async rawFind(t){if(!this.schema)throw new Error("Schema not initialized");let{resource:e,where:r,include:n,limit:a,sort:s}=t,c=this.db.selectFrom(e).selectAll(e).select(u=>jsonObjectFrom(u.selectFrom(`${e}_meta`).selectAll(`${e}_meta`).whereRef(`${e}_meta.id`,"=",`${e}.id`)).as("_meta"));c=ne(this.schema,e,c,r),c=K(this.schema,e,c,n),a!==void 0&&(c=c.limit(a)),s!==void 0&&s.forEach(u=>{c=c.orderBy(u.key,u.direction);});let o=await c.execute(),p=Object.fromEntries(o.map(u=>{let{id:h}=u;return [h,u]}));return Object.keys(p).length===0?{}:Object.entries(p).reduce((u,[h,R])=>(u[h]=this.convertToMaterializedLiveType(R),u),{})}async find(t$1,e){let r=await this.rawFind({resource:t$1.name,where:e==null?void 0:e.where,include:e==null?void 0:e.include,limit:e==null?void 0:e.limit,sort:e==null?void 0:e.sort});return Object.fromEntries(Object.entries(r).map(([n,a])=>[n,t(a)]))}async rawInsert(t,e,r){var c;let n={},a={};for(let[o,p]of Object.entries(r.value)){let f=(c=p._meta)==null?void 0:c.timestamp;f&&(n[o]=p.value,a[o]=f);}await this.db.insertInto(t).values({...n,id:e}).execute().then(()=>{this.db.insertInto(`${t}_meta`).values({...a,id:e}).execute();});let s=this.buildMutation(t,e,"INSERT",r);return s&&this.trackMutation(s,r),r}async rawUpdate(t,e,r){var c;let n={},a={};for(let[o,p]of Object.entries(r.value)){let f=(c=p._meta)==null?void 0:c.timestamp;f&&(n[o]=p.value,a[o]=f);}await Promise.all([this.db.updateTable(t).set(n).where("id","=",e).execute(),this.db.insertInto(`${t}_meta`).values({...a,id:e}).onConflict(o=>o.column("id").doUpdateSet(a)).execute()]);let s=this.buildMutation(t,e,"UPDATE",r);return s&&this.trackMutation(s,r),r}async transaction(t){if(!this.schema)throw new Error("Schema not initialized");if(this.db.isTransaction){let a=Math.random().toString(36).substring(2,15),s=this.mutationStack,c=[];this.mutationStack=c;let o=await this.db.savepoint(a).execute();try{return await t({trx:this,commit:async()=>{await o.releaseSavepoint(a).execute(),s.push(...c);},rollback:async()=>{await o.rollbackToSavepoint(a).execute(),c.length=0;}}).then(p=>o.isCommitted||o.isRolledBack?p:o.releaseSavepoint(a).execute().then(()=>(s.push(...c),p)))}catch(p){throw await o.rollbackToSavepoint(a).execute().catch(()=>{}),c.length=0,p}finally{this.mutationStack=s;}}let e=[],r=this.mutationStack;this.mutationStack=e;let n=await this.db.startTransaction().execute();try{let a=new i(n,this.schema,this.logger,this.server);return a.mutationStack=e,await t({trx:a,commit:async()=>{await n.commit().execute(),this.notifyMutations(e);},rollback:async()=>{await n.rollback().execute(),e.length=0;}}).then(s=>n.isCommitted||n.isRolledBack?s:n.commit().execute().then(()=>(this.notifyMutations(e),s)))}catch(a){throw await n.rollback().execute(),e.length=0,a}finally{this.mutationStack=r;}}get internalDB(){return this.db}convertToMaterializedLiveType(t){return {value:Object.entries(t).reduce((e,[r,n])=>{var a,s,c;return r==="_meta"||(r==="id"?e[r]={value:n}:Array.isArray(n)?e[r]={value:n.map(o=>this.convertToMaterializedLiveType(o)),_meta:{timestamp:(a=t==null?void 0:t._meta)==null?void 0:a[r]}}:typeof n=="object"&&n!==null&&!(n instanceof Date)?e[r]={...this.convertToMaterializedLiveType(n),_meta:{timestamp:(s=t==null?void 0:t._meta)==null?void 0:s[r]}}:e[r]={value:n,_meta:{timestamp:(c=t==null?void 0:t._meta)==null?void 0:c[r]}}),e},{})}}isKyselyLike(t){if(t instanceof Kysely)return true;if(!t||typeof t!="object")return false;let e=t,r=typeof e.selectFrom=="function",n=typeof e.startTransaction=="function",a=typeof e.savepoint=="function",s=typeof e.isTransaction=="boolean"||typeof e.isTransaction=="function";return r&&n||a&&s}buildMutation(t,e,r,n){var s;let a={};for(let[c,o]of Object.entries(n.value)){if(c==="id")continue;let p=(s=o._meta)==null?void 0:s.timestamp;p&&(a[c]={value:o.value,_meta:{timestamp:p}});}return Object.keys(a).length===0?null:{id:q(),type:"MUTATE",resource:t,resourceId:e,procedure:r,payload:a}}trackMutation(t,e){this.db.isTransaction?this.mutationStack.push({mutation:t,entityData:e}):this.notifyMutations([t],e);}notifyMutations(t,e){if(this.server)if(e!==void 0){let r=t;for(let n of r)this.server.notifySubscribers(n,e);}else {let r=t;for(let{mutation:n,entityData:a}of r)this.server.notifySubscribers(n,a);}}};var ae=class i{router;storage;schema;middlewares=new Set;logger;contextProvider;mutationSubscriptions=new Set;collectionSubscriptions=new Map;constructor(t){var e;this.router=t.router,this.storage=t.storage,this.schema=t.schema,this.logger=z$2({level:t.logLevel??y.INFO}),(e=t.middlewares)==null||e.forEach(r=>{this.middlewares.add(r);}),this.storage.init(this.schema,this.logger,this),this.contextProvider=t.contextProvider;}static create(t){return new i(t)}handleQuery(t){let e=new F(this.storage);return this.wrapInMiddlewares(async r=>{var R,d,m;let n=Oe(r,this.schema,{stepId:"query",collectionName:r.resource,included:Object.keys(r.include??{})}),a={headers:r.headers,cookies:r.cookies,queryParams:r.queryParams,context:r.context},s={};for(let y=0;y<n.length;y++){let l=n[y],g=this.router.routes[l.resource];if(!g)throw new Error("Invalid resource");let T;if(l.getWhere&&l.referenceGetter){let w=l.referenceGetter(s);T=[];for(let M=0;M<w.length;M++)T.push(l.getWhere(w[M]));}else T=[void 0];let S=s[l.prevStepId??""],v=[];if(S)for(let w=0;w<S.length;w++){let M=S[w],A=Object.keys(((R=M==null?void 0:M.result)==null?void 0:R.data)??{});for(let k=0;k<A.length;k++)v.push(A[k]);}let j=[];for(let w=0;w<T.length;w++){let M=T[w],A=v[w];j.push((async()=>{let k=await g.handleQuery({req:{type:"QUERY",...l,...a,where:l.where,relationalWhere:M},batcher:e});return {includedBy:A,result:k}})());}let E=await Promise.allSettled(j),P=[];for(let w=0;w<E.length;w++){let M=E[w];M.status==="fulfilled"&&P.push(M.value);}s[l.stepId]=P;}let c=new Map,o=0;for(let y in s){let l=s[y],g=n[o];o++;for(let T=0;T<l.length;T++){let S=l[T],v=S.result.data;for(let j in v){let E=v[j],P=`${y}.${j}`,w=[];y!=="query"&&S.includedBy&&(w=[`${g.prevStepId}.${S.includedBy}`]);let M=c.get(P);if(M)for(let A=0;A<w.length;A++)M.includedBy.add(w[A]);else c.set(P,{data:E,includedBy:new Set(w),path:y.split(".").slice(-1)[0],isMany:g.isMany??false,collectionName:g.collectionName,included:g.included});}}}let p=Object.fromEntries(c),f={data:{}},u=Object.keys(p);for(let y=u.length-1;y>=0;y--){let l=u[y],g=p[l],T=g.path;if(T==="query"&&(f.data[l.replace("query.","")]=g.data),g.included.length)for(let S=0;S<g.included.length;S++){let v=g.included[S];g.data.value[v]??=((m=(d=this.schema[g.collectionName])==null?void 0:d.relations[v])==null?void 0:m.type)==="many"?{value:[]}:{value:null};}if(g.includedBy.size>0){let S=Array.from(g.includedBy);for(let v=0;v<S.length;v++){let j=S[v],E=p[j];E&&(g.isMany?(E.data.value[T]??={value:[]},E.data.value[T].value.push(g.data)):E.data.value[T]=g.data);}}}return f})(t.req)}async handleMutation(t){let e=await this.wrapInMiddlewares(async r=>{let n=this.router.routes[r.resource];if(!n)throw new Error("Invalid resource");return n.handleMutation({req:r,db:this.storage,schema:this.schema})})(t.req);if(e&&t.req.type==="MUTATE"&&e.acceptedValues&&(t.req.procedure==="INSERT"||t.req.procedure==="UPDATE")&&t.req.resourceId){let n=e.acceptedValues??{},a=t.req,s=a.resourceId;Object.keys(n).length&&s&&this.mutationSubscriptions.forEach(c=>{c({id:t.req.context.messageId,type:"MUTATE",resource:a.resource,payload:n,resourceId:s,procedure:a.procedure});});}return e}use(t){return this.middlewares.add(t),this}context(t){return this.contextProvider=t,this}subscribeToMutations(t,e,r){let n=t.resource,a={query:t,authorizationWhere:r},s=v(a),c=this.collectionSubscriptions.get(n);c||(c=new Map,this.collectionSubscriptions.set(n,c));let o=c.get(s);return o?(o.callbacks.add(e),r!==void 0&&(o.authorizationWhere=r)):c.set(s,{callbacks:new Set([e]),...a}),()=>{var f,u;let p=this.collectionSubscriptions.get(n);p&&((f=p.get(s))==null||f.callbacks.delete(e),((u=p.get(s))==null?void 0:u.callbacks.size)===0&&p.delete(s));}}notifySubscribers(t$1,e){let r=t$1.resource,n=this.collectionSubscriptions.get(r);if(n&&e)for(let a of Array.from(n.values())){let s=oe(a.query.where,this.schema[r]),c=$(s,a.authorizationWhere),o=t(e);if(!o)continue;(t$1.resourceId&&typeof o=="object"&&o!==null&&!("id"in o)||t$1.resourceId&&typeof o=="object"&&o!==null&&o.id!==t$1.resourceId)&&(o.id=t$1.resourceId);let p=Object.keys(c).length>0,f=true;p&&(f=x(o,c)),f&&a.callbacks.forEach(u=>{var h;try{u(t$1);}catch(R){(h=this.logger)==null||h.error(`Error in mutation subscription for resource ${r}:`,R);}});}}wrapInMiddlewares(t){return e=>Array.from(this.middlewares.values()).reduceRight((r,n)=>a=>n({req:a,next:r}),t)(e)}},pr=ae.create;function Oe(i,t,e){let{include:r,where:n,...a}=i,{stepId:s}=e,c=[{...a,...e,where:n}];if(r&&typeof r=="object"&&Object.keys(r).length>0){let o=t[a.resource];if(!o)throw new Error(`Resource ${a.resource} not found`);c.push(...Object.entries(r).flatMap(([p,f])=>{let u=o.relations[p];if(!u)throw new Error(`Relation ${p} not found for resource ${a.resource}`);let h=u.entity.name;return Oe({...a,resource:h,include:f},t,{getWhere:u.type==="one"?R=>({id:R}):R=>({[u.foreignColumn]:R}),referenceGetter:R=>R[s].flatMap(d=>d.result.data?u.type==="one"?Object.values(d.result.data).map(m=>{var y,l;return (l=(y=m.value)==null?void 0:y[u.relationalColumn])==null?void 0:l.value}):Object.keys(d.result.data):[]),stepId:`${s}.${p}`,prevStepId:s,isMany:u.type==="many",collectionName:h,included:typeof f=="object"?Object.keys(f):[]})}));}return c}function oe(i,t){if(!i||!t||Object.keys(i).length===0)return i;if(i.$and){let r=i.$and.map(n=>oe(n,t)).filter(n=>!!n&&Object.keys(n).length>0);return r.length===0?void 0:r.length===1?r[0]:{$and:r}}if(i.$or){let r=i.$or.map(n=>oe(n,t)).filter(n=>!!n&&Object.keys(n).length>0);return r.length===0?void 0:r.length===1?r[0]:{$or:r}}let e={};for(let[r,n]of Object.entries(i))t.fields[r]&&(e[r]=n);return Object.keys(e).length>0?e:void 0}
|
|
2
|
-
export{
|
|
1
|
+
import {a,b,t,w,x,z as z$2,y,v}from'./chunk-3SQDLIFN.js';import V from'node:crypto';import Ye,{parse}from'qs';import {z as z$1}from'zod';import {Kysely,PostgresDialect}from'kysely';import {jsonObjectFrom,jsonArrayFrom}from'kysely/helpers/postgres';var H=a(Q=>{Object.defineProperty(Q,"__esModule",{value:true});Q.parse=Qe;Q.serialize=Ge;var Ue=/^[\u0021-\u003A\u003C\u003E-\u007E]+$/,Be=/^[\u0021-\u003A\u003C-\u007E]*$/,_e=/^([.]?[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)([.][a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)*$/i,Ve=/^[\u0020-\u003A\u003D-\u007E]*$/,Fe=Object.prototype.toString,qe=(()=>{let i=function(){};return i.prototype=Object.create(null),i})();function Qe(i,t){let e=new qe,r=i.length;if(r<2)return e;let n=(t==null?void 0:t.decode)||Ze,a=0;do{let s=i.indexOf("=",a);if(s===-1)break;let c=i.indexOf(";",a),o=c===-1?r:c;if(s>o){a=i.lastIndexOf(";",s-1)+1;continue}let l=he(i,a,s),f=ge(i,s,l),u=i.slice(l,f);if(e[u]===void 0){let h=he(i,s+1,o),T=ge(i,o,h),d=n(i.slice(h,T));e[u]=d;}a=o+1;}while(a<r);return e}function he(i,t,e){do{let r=i.charCodeAt(t);if(r!==32&&r!==9)return t}while(++t<e);return e}function ge(i,t,e){for(;t>e;){let r=i.charCodeAt(--t);if(r!==32&&r!==9)return t+1}return e}function Ge(i,t,e){let r=(e==null?void 0:e.encode)||encodeURIComponent;if(!Ue.test(i))throw new TypeError(`argument name is invalid: ${i}`);let n=r(t);if(!Be.test(n))throw new TypeError(`argument val is invalid: ${t}`);let a=i+"="+n;if(!e)return a;if(e.maxAge!==void 0){if(!Number.isInteger(e.maxAge))throw new TypeError(`option maxAge is invalid: ${e.maxAge}`);a+="; Max-Age="+e.maxAge;}if(e.domain){if(!_e.test(e.domain))throw new TypeError(`option domain is invalid: ${e.domain}`);a+="; Domain="+e.domain;}if(e.path){if(!Ve.test(e.path))throw new TypeError(`option path is invalid: ${e.path}`);a+="; Path="+e.path;}if(e.expires){if(!Ke(e.expires)||!Number.isFinite(e.expires.valueOf()))throw new TypeError(`option expires is invalid: ${e.expires}`);a+="; Expires="+e.expires.toUTCString();}if(e.httpOnly&&(a+="; HttpOnly"),e.secure&&(a+="; Secure"),e.partitioned&&(a+="; Partitioned"),e.priority)switch(typeof e.priority=="string"?e.priority.toLowerCase():void 0){case "low":a+="; Priority=Low";break;case "medium":a+="; Priority=Medium";break;case "high":a+="; Priority=High";break;default:throw new TypeError(`option priority is invalid: ${e.priority}`)}if(e.sameSite)switch(typeof e.sameSite=="string"?e.sameSite.toLowerCase():e.sameSite){case true:case "strict":a+="; SameSite=Strict";break;case "lax":a+="; SameSite=Lax";break;case "none":a+="; SameSite=None";break;default:throw new TypeError(`option sameSite is invalid: ${e.sameSite}`)}return a}function Ze(i){if(i.indexOf("%")===-1)return i;try{return decodeURIComponent(i)}catch{return i}}function Ke(i){return Fe.call(i)==="[object Date]"}});var ye="0123456789ABCDEFGHJKMNPQRSTVWXYZ",N=32;var $e=16,fe=10,pe=0xffffffffffff;var O;(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";})(O||(O={}));var L=class extends Error{constructor(t,e){super(`${e} (${t})`),this.name="ULIDError",this.code=t;}};function ze(i){let t=Math.floor(i()*N);return t===N&&(t=N-1),ye.charAt(t)}function Pe(i){var r;let t=ke(),e=t&&(t.crypto||t.msCrypto)||(typeof V<"u"?V:null);if(typeof(e==null?void 0:e.getRandomValues)=="function")return ()=>{let n=new Uint8Array(1);return e.getRandomValues(n),n[0]/255};if(typeof(e==null?void 0:e.randomBytes)=="function")return ()=>e.randomBytes(1).readUInt8()/255;if((r=V)!=null&&r.randomBytes)return ()=>V.randomBytes(1).readUInt8()/255;throw new L(O.PRNGDetectFailure,"Failed to find a reliable PRNG")}function ke(){return De()?self:typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:null}function Ne(i,t){let e="";for(;i>0;i--)e=ze(t)+e;return e}function We(i,t=fe){if(isNaN(i))throw new L(O.EncodeTimeValueMalformed,`Time must be a number: ${i}`);if(i>pe)throw new L(O.EncodeTimeSizeExceeded,`Cannot encode a time larger than ${pe}: ${i}`);if(i<0)throw new L(O.EncodeTimeNegative,`Time must be positive: ${i}`);if(Number.isInteger(i)===false)throw new L(O.EncodeTimeValueMalformed,`Time must be an integer: ${i}`);let e,r="";for(let n=t;n>0;n--)e=i%N,r=ye.charAt(e)+r,i=(i-e)/N;return r}function De(){return typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope}function me(i,t){let e=Pe(),r=Date.now();return We(r,fe)+Ne($e,e)}var F=()=>me().toLowerCase();var $=(...i)=>{let t=i.filter(e=>!!e);return t.length===0?{}:t.length===1?t[0]:{$and:t}};var q=class{storage;queue=new Map;scheduled=false;constructor(t){this.storage=t;}async rawFind({resource:t,commonWhere:e,uniqueWhere:r,...n}){return new Promise((a,s)=>{let c=this.getBatchKey({resource:t,commonWhere:e,...n}),o={resource:t,commonWhere:e,uniqueWhere:r,...n,resolve:a,reject:s};this.queue.has(c)||this.queue.set(c,[]);let l=this.queue.get(c);l&&l.push(o),this.scheduled||(this.scheduled=true,setImmediate(()=>{this.processBatch();}));})}getBatchKey(t){let{resource:e,commonWhere:r,...n}=t;return `${e}:${JSON.stringify(r??{})}:${JSON.stringify(n??{})}`}async processBatch(){this.scheduled=false;let t=Array.from(this.queue.entries());this.queue.clear();for(let[,e]of t)try{await this.executeBatchedRequests(e);}catch(r){e.forEach(n=>{n.reject(r);});}}async executeBatchedRequests(t){var h,T;if(t.length===0)return;let e=t[0],{resource:r,commonWhere:n,include:a,sort:s}=e,c=t.length===1?e.limit:void 0,o=t.map(d=>d.uniqueWhere).filter(d=>d!==void 0),l=n,f=(h=Object.entries(o[0]??{})[0])==null?void 0:h[0];if(o.length>0){let d=o.map(R=>R[f]).filter(R=>R!=null);d.length>0&&(l=$(n,{[f]:{$in:d}}));}let u=await this.storage.rawFind({resource:r,where:l,include:a,sort:s,limit:c});for(let d of t){let R={};if(d.uniqueWhere){let[y,p]=Object.entries(d.uniqueWhere)[0];for(let[m,g]of Object.entries(u))((T=g.value[y])==null?void 0:T.value)===p&&(R[m]=g);}else Object.assign(R,u);d.resolve(R);}}};var be=b(H(),1);var W=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.string().or(z$1.number()).or(z$1.boolean()).or(z$1.date()).nullable(),_meta:z$1.object({timestamp:z$1.string().optional().nullable()}).optional()})),He=J.superRefine((i,t)=>{i.id&&t.addIssue({code:z$1.ZodIssueCode.custom,message:"Payload cannot have an id"});}),Te=z$1.object({id:z$1.string().optional(),type:z$1.literal("MUTATE"),resource:z$1.string(),resourceId:z$1.string().optional()}),D=Te.extend({procedure:z$1.string(),payload:z$1.any().optional()}),U=Te.extend({procedure:z$1.enum(["INSERT","UPDATE"]),payload:He});z$1.union([U,D]);var Re=W.omit({resource:true}),Y=D.omit({id:true,type:true,resource:true,procedure:true}),X=U.omit({id:true,type:true,resource:true,procedure:true});z$1.union([X,Y]);var ee=i=>{if(i==null)return i;if(i==="null")return null;if(Array.isArray(i))return i.map(ee);if(typeof i=="object"&&i.constructor===Object){let t={};for(let[e,r]of Object.entries(i))t[e]=ee(r);return t}return i},Se=i=>{let t=i.logger;return async e=>{var r;try{let n=typeof e.headers.getSetCookie=="function"?Object.fromEntries(e.headers):e.headers,a={headers:n,cookies:n.cookie?be.default.parse(n.cookie):{}},s=new URL(e.url),c=s.pathname.split("/"),o=s.searchParams,l=ee(Ye.parse(o.toString())),f=await((r=i.contextProvider)==null?void 0:r.call(i,{transport:"HTTP",headers:a.headers,cookies:a.cookies,queryParams:l}))??{};if(e.method==="GET"){let u=c[c.length-1],{success:h,data:T,error:d}=Re.safeParse(l);if(!h)return Response.json({message:"Invalid query",code:"INVALID_QUERY",details:d},{status:400});let R=await i.handleQuery({req:{...a,...T,type:"QUERY",resource:u,context:f,queryParams:l}});return !R||!R.data?Response.json({message:"Invalid resource",code:"INVALID_RESOURCE"},{status:400}):Response.json(R.data)}if(e.method==="POST")try{let u=c[c.length-1],h=c[c.length-2],T=e.body?await e.json():{},d;if(u==="insert"||u==="update"){let{success:y,data:p,error:m}=X.safeParse(T);if(!y)return Response.json({message:"Invalid mutation",code:"INVALID_REQUEST",details:m},{status:400});d=p;}else {let{success:y,data:p,error:m}=Y.safeParse(T);if(!y)return Response.json({message:"Invalid mutation",code:"INVALID_REQUEST",details:m},{status:400});d=p;}let R=await i.handleMutation({req:{...a,type:"MUTATE",resource:h,input:d.payload,context:f,resourceId:d.resourceId,procedure:u==="insert"||u==="update"?u.toUpperCase():u,queryParams:{}}});return Response.json(R)}catch(u){return t.error("Error parsing mutation from the client:",u),Response.json({message:"Internal server error",code:"INTERNAL_SERVER_ERROR"},{status:500})}return Response.json({message:"Not found",code:"NOT_FOUND"},{status:404})}catch(n){return t.error("Unexpected error:",n),Response.json({message:"Internal server error",code:"INTERNAL_SERVER_ERROR"},{status:500})}}};var Me=b(H(),1);var z=z$1.string(),Xe=W.extend({id:z,type:z$1.literal("SUBSCRIBE")}),et=W.extend({id:z,type:z$1.literal("QUERY")}),we=U.extend({id:z}),tt=D.extend({id:z}),rt=z$1.union([tt,we]),xe=z$1.union([Xe,et,rt]),nt=z$1.object({id:z,type:z$1.literal("REJECT"),resource:z$1.string(),message:z$1.string().optional()}),it=z$1.object({id:z,type:z$1.literal("REPLY"),data:z$1.any()});z$1.union([nt,it,we]);z$1.object({resource:z$1.string(),data:z$1.record(z$1.string(),J)});var Ie=i=>{let t={},e=i.logger;return (r,n)=>{var u;let a=h=>{r.send(JSON.stringify(h));},s=F(),c=new Set,o={headers:n.headers,cookies:typeof n.headers.cookie=="string"?Me.default.parse(n.headers.cookie):{}},l=parse(n.url.split("?")[1]),f=(u=i.contextProvider)==null?void 0:u.call(i,{transport:"WEBSOCKET",headers:o.headers,cookies:o.cookies,queryParams:l});t[s]=r,e.info("Client connected:",s),r.on("message",async h=>{var T;try{e.debug("Message received from the client:",h);let d=xe.parse(JSON.parse(h.toString()));if(d.type==="SUBSCRIBE"){let R=await f??{},y=d.resource,p=i.router.routes[y],m;if((T=p==null?void 0:p.authorization)!=null&&T.read){let g=p.authorization.read({ctx:R});m=typeof g=="object"?g:void 0;}c.add(i.subscribeToMutations(d,g=>{var S;!g.resourceId||!g.payload||!Object.keys(g.payload).length||(S=t[s])==null||S.send(JSON.stringify(g));},m));}else if(d.type==="QUERY"){let{resource:R}=d,y=await i.handleQuery({req:{...o,type:"QUERY",resource:R,context:await f??{},queryParams:l}});if(!y||!y.data)throw new Error("Invalid resource");a({id:d.id,type:"REPLY",data:{resource:R,data:Object.fromEntries(Object.entries(y.data??{}).map(([p,m])=>[p,m.value]))}});}else if(d.type==="MUTATE"){let{resource:R}=d;e.debug("Received mutation from client:",d);try{let y=await i.handleMutation({req:{...o,type:"MUTATE",resource:R,input:d.payload,context:{messageId:d.id,...await f??{}},resourceId:d.resourceId,procedure:d.procedure,queryParams:l}});d.procedure&&d.procedure!=="INSERT"&&d.procedure!=="UPDATE"&&a({id:d.id,type:"REPLY",data:y});}catch(y){a({id:d.id,type:"REJECT",resource:R,message:y.message}),e.error("Error parsing mutation from the client:",y);}}}catch(d){e.error("Error handling message from the client:",d);}}),r.on("close",()=>{e.info("Connection closed",s),delete t[s];for(let h of Array.from(c))h();});}};function ve(i){let t=`${i.protocol}://${i.hostname}${i.url}`,e=new Headers;return Object.entries(i.headers).forEach(([r,n])=>{n&&e.set(r,Array.isArray(n)?n.join(","):n);}),new Request(t,{method:i.method,headers:e,body:i.body&&i.method!=="GET"?JSON.stringify(i.body):void 0})}var Ut=(i,t,e)=>{i.ws(`${(e==null?void 0:e.basePath)??""}/ws`,Ie(t)),i.use(`${(e==null?void 0:e.basePath)??""}/`,(r,n)=>{Se(t)(ve(r)).then(s=>s.json().then(c=>n.status(s.status).send(c)));});};var te=class i{routes;constructor(t){this.routes=t.routes;}static create(t){return new i(t)}},Qt=i=>te.create({...i}),st=i=>({handler:t=>({inputValidator:i??z$1.undefined(),handler:t})}),re=class i{resourceSchema;middlewares;customMutations;authorization;constructor(t,e,r){this.resourceSchema=t,this.middlewares=new Set,this.customMutations=e??{},this.authorization=r;}use(...t){for(let e of t)this.middlewares.add(e);return this}withMutations(t){return new i(this.resourceSchema,t({mutation:st}),this.authorization)}handleQuery=async({req:t,batcher:e})=>await this.wrapInMiddlewares(async r=>{var a,s;let n=(s=(a=this.authorization)==null?void 0:a.read)==null?void 0:s.call(a,{ctx:r.context});if(typeof n=="boolean"&&!n)throw new Error("Not authorized");return {data:await e.rawFind({resource:r.resource,commonWhere:$(r.where,typeof n=="object"?n:void 0),uniqueWhere:r.relationalWhere,include:r.include,limit:r.limit,sort:r.sort})}})(t);handleMutation=async({req:t,db:e,schema:r})=>await this.wrapInMiddlewares(async n=>{if(!n.procedure)throw new Error("Procedure is required for mutations");let a=this.customMutations[n.procedure];if(a){let s=a.inputValidator.parse(n.input);return n.input=s,a.handler({req:n,db:e})}else {if(n.procedure==="INSERT"||n.procedure==="UPDATE")return this.handleSet({req:n,db:e,operation:n.procedure,schema:r});throw new Error(`Unknown procedure: ${n.procedure}`)}})(t);handleSet=async({req:t$1,db:e,operation:r,schema:n})=>{if(!t$1.input)throw new Error("Payload is required");if(!t$1.resourceId)throw new Error("ResourceId is required");let a=await e.rawFindById(t$1.resource,t$1.resourceId);if(r==="INSERT"&&a)throw new Error("Resource already exists");if(r==="UPDATE"&&!a)throw new Error("Resource not found");return e.transaction(async({trx:s})=>{var f,u,h,T,d,R,y;let[c,o]=this.resourceSchema.mergeMutation("set",t$1.input,a);if(!o)throw new Error("Mutation rejected");if(r==="INSERT"){let p=await s.rawInsert(t$1.resource,t$1.resourceId,c,(f=t$1.context)==null?void 0:f.messageId),m=t(p);if(m.id=m.id??t$1.resourceId,(u=this.authorization)!=null&&u.insert){let g=this.authorization.insert({ctx:t$1.context,value:m});if(typeof g=="boolean"){if(!g)throw new Error("Not authorized")}else {let S=w(g,t$1.resource,n),w$1=Object.keys(S).length>0?await s.rawFindById(t$1.resource,t$1.resourceId,S):p,E=t(w$1);if(E.id=E.id??t$1.resourceId,!x(E,g))throw new Error("Not authorized")}}return {data:p,acceptedValues:o}}if((T=(h=this.authorization)==null?void 0:h.update)!=null&&T.preMutation){let p=t(a);p.id=p.id??t$1.resourceId;let m=this.authorization.update.preMutation({ctx:t$1.context,value:p});if(typeof m=="boolean"){if(!m)throw new Error("Not authorized")}else {let g=w(m,t$1.resource,n),S=Object.keys(g).length>0?await s.rawFindById(t$1.resource,t$1.resourceId,g):a,w$1=t(S);if(w$1.id=w$1.id??t$1.resourceId,!x(w$1,m))throw new Error("Not authorized")}}let l=await s.rawUpdate(t$1.resource,t$1.resourceId,c,(d=t$1.context)==null?void 0:d.messageId);if((y=(R=this.authorization)==null?void 0:R.update)!=null&&y.postMutation){let p=t(l);p.id=p.id??t$1.resourceId;let m=this.authorization.update.postMutation({ctx:t$1.context,value:p});if(typeof m=="boolean"){if(!m)throw new Error("Not authorized")}else {let g=w(m,t$1.resource,n),S=Object.keys(g).length>0?await s.rawFindById(t$1.resource,t$1.resourceId,g):l,w$1=t(S);if(w$1.id=w$1.id??t$1.resourceId,!x(w$1,m))throw new Error("Not authorized")}}return {data:l,acceptedValues:o}})};wrapInMiddlewares(t){return e=>Array.from(this.middlewares.values()).reduceRight((r,n)=>a=>n({req:a,next:r}),t)(e)}},ne=class i{middlewares;constructor(t=[]){this.middlewares=t;}collectionRoute(t,e){return new re(t,void 0,e).use(...this.middlewares)}use(...t){return new i([...this.middlewares,...t])}static create(){return new i}},Gt=ne.create;var B=class{async insert(t$1,e){let r=new Date().toISOString();return t(await this.rawInsert(t$1.name,e.id,{value:Object.fromEntries(Object.entries(e).map(([n,a])=>[n,{value:a,_meta:{timestamp:r}}]))}))}async update(t$1,e,r){let n=new Date().toISOString(),{id:a,...s}=r;return t(await this.rawUpdate(t$1.name,e,{value:Object.fromEntries(Object.entries(s).map(([c,o])=>[c,{value:o,_meta:{timestamp:n}}]))}))}};function G(i,t,e,r){if(!i)throw new Error("Schema not initialized");let n=i[t];if(!n)throw new Error("Resource not found");let a=r.$or,s=r.$and;return (a?e.or:e.and)(a?r.$or.map(c=>G(i,t,e,c)):s?r.$and.map(c=>G(i,t,e,c)):Object.entries(r).map(([c,o])=>{var l,f;if(n.fields[c])return (o==null?void 0:o.$eq)!==void 0?e(`${t}.${c}`,o.$eq===null?"is":"=",o.$eq):(o==null?void 0:o.$in)!==void 0?e(`${t}.${c}`,"in",o.$in):(o==null?void 0:o.$not)!==void 0?((l=o==null?void 0:o.$not)==null?void 0:l.$in)!==void 0?e(`${t}.${c}`,"not in",o.$not.$in):((f=o==null?void 0:o.$not)==null?void 0:f.$eq)!==void 0?e(`${t}.${c}`,o.$not.$eq===null?"is not":"!=",o.$not.$eq):e(`${t}.${c}`,o.$not===null?"is not":"!=",o.$not):(o==null?void 0:o.$gt)!==void 0?e(`${t}.${c}`,">",o.$gt):(o==null?void 0:o.$gte)!==void 0?e(`${t}.${c}`,">=",o.$gte):(o==null?void 0:o.$lt)!==void 0?e(`${t}.${c}`,"<",o.$lt):(o==null?void 0:o.$lte)!==void 0?e(`${t}.${c}`,"<=",o.$lte):e(`${t}.${c}`,o===null?"is":"=",o);if(n.relations[c]){let u=n.relations[c],h=u.entity.name;return u.type==="many"?e.exists(ie(i,h,e.selectFrom(h).select("id").whereRef(u.foreignColumn,"=",`${t}.id`),o)):G(i,h,e,o)}return null}).filter(Boolean))}function Z(i,t,e,r){let n=i[t];if(!n)throw new Error("Resource not found");if(!r)return e;if(r.$and){for(let a of r.$and)e=Z(i,t,e,a);return e}else if(r.$or){for(let a of r.$or)e=Z(i,t,e,a);return e}for(let[a,s]of Object.entries(r)){if(!n.relations[a])continue;let c=n.relations[a],o=c.entity.name,l=c.type==="one"?"id":c.foreignColumn,f=c.type==="one"?c.relationalColumn:"id";e=e.leftJoin(o,`${o}.${l}`,`${t}.${f}`),s instanceof Object&&!Array.isArray(s)&&s!==null&&(e=Z(i,o,e,s));}return e}function ie(i,t,e,r){return !r||Object.keys(r).length===0?e:(e=Z(i,t,e,r),e.where(n=>G(i,t,n,r)))}function K(i,t,e,r){if(!r)return e;if(!i)throw new Error("Schema not initialized");let n=i[t];if(!n)throw new Error(`Resource not found: ${t}`);for(let a of Object.keys(r)){if(!n.relations[a])throw new Error(`Relation ${a} not found in resource ${t}`);let s=n.relations[a],c=s.entity.name,o=r[a],l=s.type==="one"?"id":s.foreignColumn,f=s.type==="one"?s.relationalColumn:"id",u=s.type==="one"?jsonObjectFrom:jsonArrayFrom,h=typeof o=="object"&&o!==null;e=e.select(T=>{let d=T.selectFrom(c).selectAll(c).whereRef(`${c}.${l}`,"=",`${t}.${f}`).select(R=>jsonObjectFrom(R.selectFrom(`${c}_meta`).selectAll(`${c}_meta`).whereRef(`${c}_meta.id`,"=",`${c}.id`)).as("_meta"));return h&&(d=K(i,c,d,o)),u(d).as(a)});}return e}var Oe="42701",ae=class i extends B{db;schema;logger;server;mutationStack=[];constructor(t,e,r,n){super(),this.isKyselyLike(t)?this.db=t:this.db=new Kysely({dialect:new PostgresDialect({pool:t})}),this.schema=e,this.logger=r,this.server=n,this.rawInsert=this.rawInsert.bind(this),this.rawUpdate=this.rawUpdate.bind(this);}async init(t,e,r){var a;this.schema=t,this.logger=e,this.server=r;let n=await this.db.introspection.getTables();for(let[s,c]of Object.entries(t)){let o=n.find(u=>u.name===s);o||await this.db.schema.createTable(s).ifNotExists().execute();let l=`${s}_meta`,f=n.find(u=>u.name===l);f||await this.db.schema.createTable(l).ifNotExists().execute();for(let[u,h]of Object.entries(c.fields)){let T=o==null?void 0:o.columns.find(y=>y.name===u),d=h.getStorageFieldType();T?T.dataType!==d.type&&((a=this.logger)==null||a.warn("Column type mismatch:",u,"expected to have type:",d.type,"but has type:",T.dataType)):(await this.db.schema.alterTable(s).addColumn(u,d.type,y=>{let p=y;return d.unique&&(p=p.unique()),d.nullable||(p=p.notNull()),d.references&&(p=p.references(d.references)),d.primary&&(p=p.primaryKey()),d.default!==void 0&&(p=p.defaultTo(d.default)),p}).execute().catch(y=>{var p;if(y.code!==Oe)throw (p=this.logger)==null||p.error("Error adding column",u,y),y}),d.index&&await this.db.schema.createIndex(`${s}_${u}_index`).on(s).column(u).execute().catch(()=>{})),(f==null?void 0:f.columns.find(y=>y.name===u))||await this.db.schema.alterTable(l).addColumn(u,"varchar",y=>{let p=y;return d.primary&&(p=p.primaryKey().references(`${s}.${u}`)),p}).execute().catch(y=>{var p;if(y.code!==Oe)throw (p=this.logger)==null||p.error("Error adding meta column",u,y),y});}}}async rawFindById(t,e,r){if(!this.schema)throw new Error("Schema not initialized");let n=await this.db.selectFrom(t).where("id","=",e).selectAll(t).select(s=>jsonObjectFrom(s.selectFrom(`${t}_meta`).selectAll(`${t}_meta`).whereRef(`${t}_meta.id`,"=",`${t}.id`)).as("_meta"));n=K(this.schema,t,n,r);let a=await n.executeTakeFirst();if(a)return this.convertToMaterializedLiveType(a)}async findOne(t$1,e,r){let n=await this.rawFindById(t$1.name,e,r==null?void 0:r.include);if(n)return t(n)}async rawFind(t){if(!this.schema)throw new Error("Schema not initialized");let{resource:e,where:r,include:n,limit:a,sort:s}=t,c=this.db.selectFrom(e).selectAll(e).select(u=>jsonObjectFrom(u.selectFrom(`${e}_meta`).selectAll(`${e}_meta`).whereRef(`${e}_meta.id`,"=",`${e}.id`)).as("_meta"));c=ie(this.schema,e,c,r),c=K(this.schema,e,c,n),a!==void 0&&(c=c.limit(a)),s!==void 0&&s.forEach(u=>{c=c.orderBy(u.key,u.direction);});let o=await c.execute(),l=Object.fromEntries(o.map(u=>{let{id:h}=u;return [h,u]}));return Object.keys(l).length===0?{}:Object.entries(l).reduce((u,[h,T])=>(u[h]=this.convertToMaterializedLiveType(T),u),{})}async find(t$1,e){let r=await this.rawFind({resource:t$1.name,where:e==null?void 0:e.where,include:e==null?void 0:e.include,limit:e==null?void 0:e.limit,sort:e==null?void 0:e.sort});return Object.fromEntries(Object.entries(r).map(([n,a])=>[n,t(a)]))}async rawInsert(t,e,r,n){var o;let a={},s={};for(let[l,f]of Object.entries(r.value)){let u=(o=f._meta)==null?void 0:o.timestamp;u&&(a[l]=f.value,s[l]=u);}await this.db.insertInto(t).values({...a,id:e}).execute().then(()=>{this.db.insertInto(`${t}_meta`).values({...s,id:e}).execute();});let c=this.buildMutation(t,e,"INSERT",r,n);return c&&this.trackMutation(c,r),r}async rawUpdate(t,e,r,n){var o;let a={},s={};for(let[l,f]of Object.entries(r.value)){let u=(o=f._meta)==null?void 0:o.timestamp;u&&(a[l]=f.value,s[l]=u);}await Promise.all([this.db.updateTable(t).set(a).where("id","=",e).execute(),this.db.insertInto(`${t}_meta`).values({...s,id:e}).onConflict(l=>l.column("id").doUpdateSet(s)).execute()]);let c=this.buildMutation(t,e,"UPDATE",r,n);return c&&this.trackMutation(c,r),r}async transaction(t){if(!this.schema)throw new Error("Schema not initialized");if(this.db.isTransaction){let a=Math.random().toString(36).substring(2,15),s=this.mutationStack,c=[];this.mutationStack=c;let o=await this.db.savepoint(a).execute();try{return await t({trx:this,commit:async()=>{await o.releaseSavepoint(a).execute(),s.push(...c);},rollback:async()=>{await o.rollbackToSavepoint(a).execute(),c.length=0;}}).then(l=>o.isCommitted||o.isRolledBack?l:o.releaseSavepoint(a).execute().then(()=>(s.push(...c),l)))}catch(l){throw await o.rollbackToSavepoint(a).execute().catch(()=>{}),c.length=0,l}finally{this.mutationStack=s;}}let e=[],r=this.mutationStack;this.mutationStack=e;let n=await this.db.startTransaction().execute();try{let a=new i(n,this.schema,this.logger,this.server);return a.mutationStack=e,await t({trx:a,commit:async()=>{await n.commit().execute(),this.notifyMutations(e);},rollback:async()=>{await n.rollback().execute(),e.length=0;}}).then(s=>n.isCommitted||n.isRolledBack?s:n.commit().execute().then(()=>(this.notifyMutations(e),s)))}catch(a){throw await n.rollback().execute(),e.length=0,a}finally{this.mutationStack=r;}}get internalDB(){return this.db}convertToMaterializedLiveType(t){return {value:Object.entries(t).reduce((e,[r,n])=>{var a,s,c;return r==="_meta"||(r==="id"?e[r]={value:n}:Array.isArray(n)?e[r]={value:n.map(o=>this.convertToMaterializedLiveType(o)),_meta:{timestamp:(a=t==null?void 0:t._meta)==null?void 0:a[r]}}:typeof n=="object"&&n!==null&&!(n instanceof Date)?e[r]={...this.convertToMaterializedLiveType(n),_meta:{timestamp:(s=t==null?void 0:t._meta)==null?void 0:s[r]}}:e[r]={value:n,_meta:{timestamp:(c=t==null?void 0:t._meta)==null?void 0:c[r]}}),e},{})}}isKyselyLike(t){if(t instanceof Kysely)return true;if(!t||typeof t!="object")return false;let e=t,r=typeof e.selectFrom=="function",n=typeof e.startTransaction=="function",a=typeof e.savepoint=="function",s=typeof e.isTransaction=="boolean"||typeof e.isTransaction=="function";return r&&n||a&&s}buildMutation(t,e,r,n,a){var c;let s={};for(let[o,l]of Object.entries(n.value)){if(o==="id")continue;let f=(c=l._meta)==null?void 0:c.timestamp;f&&(s[o]={value:l.value,_meta:{timestamp:f}});}return Object.keys(s).length===0?null:{id:a??F(),type:"MUTATE",resource:t,resourceId:e,procedure:r,payload:s}}trackMutation(t,e){this.db.isTransaction?this.mutationStack.push({mutation:t,entityData:e}):this.notifyMutations([t],e);}notifyMutations(t,e){if(this.server)if(e!==void 0){let r=t;for(let n of r)this.server.notifySubscribers(n,e);}else {let r=t;for(let{mutation:n,entityData:a}of r)this.server.notifySubscribers(n,a);}}};var oe=class i{router;storage;schema;middlewares=new Set;logger;contextProvider;mutationSubscriptions=new Set;collectionSubscriptions=new Map;constructor(t){var e;this.router=t.router,this.storage=t.storage,this.schema=t.schema,this.logger=z$2({level:t.logLevel??y.INFO}),(e=t.middlewares)==null||e.forEach(r=>{this.middlewares.add(r);}),this.storage.init(this.schema,this.logger,this),this.contextProvider=t.contextProvider;}static create(t){return new i(t)}handleQuery(t){let e=new q(this.storage);return this.wrapInMiddlewares(async r=>{var T,d,R;let n=Le(r,this.schema,{stepId:"query",collectionName:r.resource,included:Object.keys(r.include??{})}),a={headers:r.headers,cookies:r.cookies,queryParams:r.queryParams,context:r.context},s={};for(let y=0;y<n.length;y++){let p=n[y],m=this.router.routes[p.resource];if(!m)throw new Error("Invalid resource");let g;if(p.getWhere&&p.referenceGetter){let x=p.referenceGetter(s);g=[];for(let I=0;I<x.length;I++)g.push(p.getWhere(x[I]));}else g=[void 0];let S=s[p.prevStepId??""],w=[];if(S)for(let x=0;x<S.length;x++){let I=S[x],j=Object.keys(((T=I==null?void 0:I.result)==null?void 0:T.data)??{});for(let k=0;k<j.length;k++)w.push(j[k]);}let E=[];for(let x=0;x<g.length;x++){let I=g[x],j=w[x];E.push((async()=>{let k=await m.handleQuery({req:{type:"QUERY",...p,...a,where:p.where,relationalWhere:I},batcher:e});return {includedBy:j,result:k}})());}let A=await Promise.allSettled(E),P=[];for(let x=0;x<A.length;x++){let I=A[x];I.status==="fulfilled"&&P.push(I.value);}s[p.stepId]=P;}let c=new Map,o=0;for(let y in s){let p=s[y],m=n[o];o++;for(let g=0;g<p.length;g++){let S=p[g],w=S.result.data;for(let E in w){let A=w[E],P=`${y}.${E}`,x=[];y!=="query"&&S.includedBy&&(x=[`${m.prevStepId}.${S.includedBy}`]);let I=c.get(P);if(I)for(let j=0;j<x.length;j++)I.includedBy.add(x[j]);else c.set(P,{data:A,includedBy:new Set(x),path:y.split(".").slice(-1)[0],isMany:m.isMany??false,collectionName:m.collectionName,included:m.included});}}}let l=Object.fromEntries(c),f={data:{}},u=Object.keys(l);for(let y=u.length-1;y>=0;y--){let p=u[y],m=l[p],g=m.path;if(g==="query"&&(f.data[p.replace("query.","")]=m.data),m.included.length)for(let S=0;S<m.included.length;S++){let w=m.included[S];m.data.value[w]??=((R=(d=this.schema[m.collectionName])==null?void 0:d.relations[w])==null?void 0:R.type)==="many"?{value:[]}:{value:null};}if(m.includedBy.size>0){let S=Array.from(m.includedBy);for(let w=0;w<S.length;w++){let E=S[w],A=l[E];A&&(m.isMany?(A.data.value[g]??={value:[]},A.data.value[g].value.push(m.data)):A.data.value[g]=m.data);}}}return f})(t.req)}async handleMutation(t){let e=await this.wrapInMiddlewares(async r=>{let n=this.router.routes[r.resource];if(!n)throw new Error("Invalid resource");return n.handleMutation({req:r,db:this.storage,schema:this.schema})})(t.req);if(e&&t.req.type==="MUTATE"&&e.acceptedValues&&(t.req.procedure==="INSERT"||t.req.procedure==="UPDATE")&&t.req.resourceId){let n=e.acceptedValues??{},a=t.req,s=a.resourceId;Object.keys(n).length&&s&&this.mutationSubscriptions.forEach(c=>{c({id:t.req.context.messageId,type:"MUTATE",resource:a.resource,payload:n,resourceId:s,procedure:a.procedure});});}return e}use(t){return this.middlewares.add(t),this}context(t){return this.contextProvider=t,this}subscribeToMutations(t,e,r){let n=t.resource,a={query:t,authorizationWhere:r},s=v(a),c=this.collectionSubscriptions.get(n);c||(c=new Map,this.collectionSubscriptions.set(n,c));let o=c.get(s);return o?(o.callbacks.add(e),r!==void 0&&(o.authorizationWhere=r)):c.set(s,{callbacks:new Set([e]),...a}),()=>{var f,u;let l=this.collectionSubscriptions.get(n);l&&((f=l.get(s))==null||f.callbacks.delete(e),((u=l.get(s))==null?void 0:u.callbacks.size)===0&&l.delete(s));}}notifySubscribers(t$1,e){let r=t$1.resource,n=this.collectionSubscriptions.get(r);if(n&&e)for(let a of Array.from(n.values())){let s=se(a.query.where,this.schema[r]),c=$(s,a.authorizationWhere),o=t(e);if(!o)continue;(t$1.resourceId&&typeof o=="object"&&o!==null&&!("id"in o)||t$1.resourceId&&typeof o=="object"&&o!==null&&o.id!==t$1.resourceId)&&(o.id=t$1.resourceId);let l=Object.keys(c).length>0,f=true;l&&(f=x(o,c)),f&&a.callbacks.forEach(u=>{var h;try{u(t$1);}catch(T){(h=this.logger)==null||h.error(`Error in mutation subscription for resource ${r}:`,T);}});}}wrapInMiddlewares(t){return e=>Array.from(this.middlewares.values()).reduceRight((r,n)=>a=>n({req:a,next:r}),t)(e)}},yr=oe.create;function Le(i,t,e){let{include:r,where:n,...a}=i,{stepId:s}=e,c=[{...a,...e,where:n}];if(r&&typeof r=="object"&&Object.keys(r).length>0){let o=t[a.resource];if(!o)throw new Error(`Resource ${a.resource} not found`);c.push(...Object.entries(r).flatMap(([l,f])=>{let u=o.relations[l];if(!u)throw new Error(`Relation ${l} not found for resource ${a.resource}`);let h=u.entity.name;return Le({...a,resource:h,include:f},t,{getWhere:u.type==="one"?T=>({id:T}):T=>({[u.foreignColumn]:T}),referenceGetter:T=>T[s].flatMap(d=>d.result.data?u.type==="one"?Object.values(d.result.data).map(R=>{var y,p;return (p=(y=R.value)==null?void 0:y[u.relationalColumn])==null?void 0:p.value}):Object.keys(d.result.data):[]),stepId:`${s}.${l}`,prevStepId:s,isMany:u.type==="many",collectionName:h,included:typeof f=="object"?Object.keys(f):[]})}));}return c}function se(i,t){if(!i||!t||Object.keys(i).length===0)return i;if(i.$and){let r=i.$and.map(n=>se(n,t)).filter(n=>!!n&&Object.keys(n).length>0);return r.length===0?void 0:r.length===1?r[0]:{$and:r}}if(i.$or){let r=i.$or.map(n=>se(n,t)).filter(n=>!!n&&Object.keys(n).length>0);return r.length===0?void 0:r.length===1?r[0]:{$or:r}}let e={};for(let[r,n]of Object.entries(i))t.fields[r]&&(e[r]=n);return Object.keys(e).length>0?e:void 0}
|
|
2
|
+
export{re as Route,ne as RouteFactory,te as Router,ae as SQLStorage,oe as Server,B as Storage,Ut as expressAdapter,Gt as routeFactory,Qt as router,yr as server};
|