@live-state/sync 0.0.4-beta.1 → 0.0.4-beta.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-E7NFSHVD.js +1 -0
- package/dist/chunk-GUSCESQZ.js +1 -0
- package/dist/client.d.ts +3 -1
- package/dist/client.js +1 -1
- package/dist/fetch-client.d.ts +4 -13
- package/dist/fetch-client.js +1 -1
- package/dist/{index-C1FzxdnB.d.ts → index-C5AAiO4g.d.ts} +143 -72
- package/dist/index-COp5Ib0a.d.cts +282 -0
- package/dist/index-COp5Ib0a.d.ts +282 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +1 -236
- package/dist/index.d.ts +1 -236
- package/dist/index.js +1 -1
- package/dist/server.cjs +2 -2
- package/dist/server.d.cts +113 -59
- package/dist/server.d.ts +113 -59
- package/dist/server.js +2 -2
- package/package.json +1 -1
- package/dist/chunk-G5SVBG4B.js +0 -1
- package/dist/chunk-LLHCJUB6.js +0 -1
package/dist/server.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {a,b,r}from'./chunk-LLHCJUB6.js';import Re,{parse}from'qs';import {z as z$1}from'zod';import $ from'node:crypto';import {Kysely,PostgresDialect}from'kysely';import {jsonObjectFrom,jsonArrayFrom}from'kysely/helpers/postgres';var O=a(v=>{Object.defineProperty(v,"__esModule",{value:true});v.parse=fe;v.serialize=ye;var ce=/^[\u0021-\u003A\u003C\u003E-\u007E]+$/,de=/^[\u0021-\u003A\u003C-\u007E]*$/,ue=/^([.]?[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)([.][a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)*$/i,le=/^[\u0020-\u003A\u003D-\u007E]*$/,me=Object.prototype.toString,pe=(()=>{let r=function(){};return r.prototype=Object.create(null),r})();function fe(r,e){let t=new pe,n=r.length;if(n<2)return t;let a=(e==null?void 0:e.decode)||he,o=0;do{let s=r.indexOf("=",o);if(s===-1)break;let c=r.indexOf(";",o),i=c===-1?n:c;if(s>i){o=r.lastIndexOf(";",s-1)+1;continue}let y=q(r,o,s),f=B(r,s,y),d=r.slice(y,f);if(t[d]===void 0){let m=q(r,s+1,i),p=B(r,i,m),u=a(r.slice(m,p));t[d]=u;}o=i+1;}while(o<n);return t}function q(r,e,t){do{let n=r.charCodeAt(e);if(n!==32&&n!==9)return e}while(++e<t);return t}function B(r,e,t){for(;e>t;){let n=r.charCodeAt(--e);if(n!==32&&n!==9)return e+1}return t}function ye(r,e,t){let n=(t==null?void 0:t.encode)||encodeURIComponent;if(!ce.test(r))throw new TypeError(`argument name is invalid: ${r}`);let a=n(e);if(!de.test(a))throw new TypeError(`argument val is invalid: ${e}`);let o=r+"="+a;if(!t)return o;if(t.maxAge!==void 0){if(!Number.isInteger(t.maxAge))throw new TypeError(`option maxAge is invalid: ${t.maxAge}`);o+="; Max-Age="+t.maxAge;}if(t.domain){if(!ue.test(t.domain))throw new TypeError(`option domain is invalid: ${t.domain}`);o+="; Domain="+t.domain;}if(t.path){if(!le.test(t.path))throw new TypeError(`option path is invalid: ${t.path}`);o+="; Path="+t.path;}if(t.expires){if(!Te(t.expires)||!Number.isFinite(t.expires.valueOf()))throw new TypeError(`option expires is invalid: ${t.expires}`);o+="; Expires="+t.expires.toUTCString();}if(t.httpOnly&&(o+="; HttpOnly"),t.secure&&(o+="; Secure"),t.partitioned&&(o+="; Partitioned"),t.priority)switch(typeof t.priority=="string"?t.priority.toLowerCase():void 0){case "low":o+="; Priority=Low";break;case "medium":o+="; Priority=Medium";break;case "high":o+="; Priority=High";break;default:throw new TypeError(`option priority is invalid: ${t.priority}`)}if(t.sameSite)switch(typeof t.sameSite=="string"?t.sameSite.toLowerCase():t.sameSite){case true:case "strict":o+="; SameSite=Strict";break;case "lax":o+="; SameSite=Lax";break;case "none":o+="; SameSite=None";break;default:throw new TypeError(`option sameSite is invalid: ${t.sameSite}`)}return o}function he(r){if(r.indexOf("%")===-1)return r;try{return decodeURIComponent(r)}catch{return r}}function Te(r){return me.call(r)==="[object Date]"}});var Q=b(O(),1);var A=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.number().optional(),sort:z$1.array(z$1.object({key:z$1.string(),direction:z$1.enum(["asc","desc"])})).optional()}),L=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()})).superRefine((r,e)=>{r.id&&e.addIssue({code:z$1.ZodIssueCode.custom,message:"Payload cannot have an id"});}),H=z$1.object({id:z$1.string().optional(),type:z$1.literal("MUTATE"),resource:z$1.string()}),S=H.extend({procedure:z$1.string(),payload:z$1.any().optional()}),M=H.extend({resourceId:z$1.string(),payload:L});z$1.union([S,M]);var G=A.omit({resource:true}),P=S.omit({id:true,type:true,resource:true,procedure:true}),C=M.omit({id:true,type:true,resource:true});z$1.union([C,P]);var W=r=>async e=>{var t;try{let n=typeof e.headers.getSetCookie=="function"?Object.fromEntries(e.headers):e.headers,a={headers:n,cookies:n.cookie?Q.default.parse(n.cookie):{}},o=new URL(e.url),s=o.pathname.split("/"),c=o.searchParams,i=Re.parse(c.toString()),y=await((t=r.contextProvider)==null?void 0:t.call(r,{transport:"HTTP",headers:a.headers,cookies:a.cookies,query:i}))??{};if(e.method==="GET"){let f=s[s.length-1],{success:d,data:m,error:p}=G.safeParse(i);if(!d)return Response.json({message:"Invalid query",code:"INVALID_QUERY",details:p},{status:400});let u=await r.handleRequest({req:{...a,type:"QUERY",resourceName:f,context:y,where:m.where,include:m.include,query:i}});return !u||!u.data?Response.json({message:"Invalid resource",code:"INVALID_RESOURCE"},{status:400}):Response.json(u.data)}if(e.method==="POST")try{let f=s[s.length-1],d=s[s.length-2],m=e.body?await e.json():{},p;if(f==="set"){let{success:b,data:x,error:j}=C.safeParse(m);if(!b)return Response.json({message:"Invalid mutation",code:"INVALID_REQUEST",details:j},{status:400});p=x;}else {let{success:b,data:x,error:j}=P.safeParse(m);if(!b)return Response.json({message:"Invalid mutation",code:"INVALID_REQUEST",details:j},{status:400});p=x;}let u=await r.handleRequest({req:{...a,type:"MUTATE",resourceName:d,input:p.payload,context:y,resourceId:p.resourceId,procedure:f!=="set"?f:void 0,query:{}}});return Response.json(u)}catch(f){return console.error("Error parsing mutation from the client:",f),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 console.error("Unexpected error:",n),Response.json({message:"Internal server error",code:"INTERNAL_SERVER_ERROR"},{status:500})}};var re=b(O(),1);var w=z$1.string(),we=z$1.object({id:w,type:z$1.literal("SUBSCRIBE"),resource:z$1.string()}),be=A.extend({id:w,type:z$1.literal("QUERY")}),Y=M.extend({id:w}),xe=S.extend({id:w}),Se=z$1.union([xe,Y]),J=z$1.union([we,be,Se]),Me=z$1.object({id:w,type:z$1.literal("REJECT"),resource:z$1.string(),message:z$1.string().optional()}),Ie=z$1.object({id:w,type:z$1.literal("REPLY"),data:z$1.any()});z$1.union([Me,Ie,Y]);z$1.object({resource:z$1.string(),data:z$1.record(z$1.string(),L)});var X="0123456789ABCDEFGHJKMNPQRSTVWXYZ",I=32;var Ee=16,ee=10,K=0xffffffffffff;var T;(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";})(T||(T={}));var g=class extends Error{constructor(e,t){super(`${t} (${e})`),this.name="ULIDError",this.code=e;}};function ve(r){let e=Math.floor(r()*I);return e===I&&(e=I-1),X.charAt(e)}function Ae(r){var n;let e=$e(),t=e&&(e.crypto||e.msCrypto)||(typeof $<"u"?$:null);if(typeof(t==null?void 0:t.getRandomValues)=="function")return ()=>{let a=new Uint8Array(1);return t.getRandomValues(a),a[0]/255};if(typeof(t==null?void 0:t.randomBytes)=="function")return ()=>t.randomBytes(1).readUInt8()/255;if((n=$)!=null&&n.randomBytes)return ()=>$.randomBytes(1).readUInt8()/255;throw new g(T.PRNGDetectFailure,"Failed to find a reliable PRNG")}function $e(){return Le()?self:typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:null}function je(r,e){let t="";for(;r>0;r--)t=ve(e)+t;return t}function Oe(r,e=ee){if(isNaN(r))throw new g(T.EncodeTimeValueMalformed,`Time must be a number: ${r}`);if(r>K)throw new g(T.EncodeTimeSizeExceeded,`Cannot encode a time larger than ${K}: ${r}`);if(r<0)throw new g(T.EncodeTimeNegative,`Time must be positive: ${r}`);if(Number.isInteger(r)===false)throw new g(T.EncodeTimeValueMalformed,`Time must be an integer: ${r}`);let t,n="";for(let a=e;a>0;a--)t=r%I,n=X.charAt(t)+n,r=(r-t)/I;return n}function Le(){return typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope}function te(r,e){let t=Ae(),n=Date.now();return Oe(n,ee)+je(Ee,t)}var _=()=>te().toLowerCase();var ne=r=>{let e={},t={};return r.subscribeToMutations(n=>{let a=n;!a.resourceId||!a.payload||(console.log("Mutation propagated:",a),Object.entries(t[a.resource]??{}).forEach(([o,s])=>{var c;(c=e[o])==null||c.send(JSON.stringify({...a,id:a.id??_()}));}));}),(n,a)=>{var f;let o=d=>{n.send(JSON.stringify(d));},s=_(),c={headers:a.headers,cookies:typeof a.headers.cookie=="string"?re.default.parse(a.headers.cookie):{}},i=parse(a.url.split("?")[1]),y=(f=r.contextProvider)==null?void 0:f.call(r,{transport:"WEBSOCKET",headers:c.headers,cookies:c.cookies,query:i});e[s]=n,console.log("Client connected:",s),n.on("message",async d=>{try{console.log("Message received from the client:",d);let m=J.parse(JSON.parse(d.toString()));if(m.type==="SUBSCRIBE"){let{resource:p}=m;t[p]||(t[p]={}),t[p][s]={};}else if(m.type==="QUERY"){let{resource:p}=m,u=await r.handleRequest({req:{...c,type:"QUERY",resourceName:p,context:await y??{},query:i}});if(!u||!u.data)throw new Error("Invalid resource");o({id:m.id,type:"REPLY",data:{resource:p,data:Object.fromEntries(Object.entries(u.data??{}).map(([b,x])=>[b,x.value]))}});}else if(m.type==="MUTATE"){let{resource:p}=m;console.log("Received mutation from client:",m);try{let u=await r.handleRequest({req:{...c,type:"MUTATE",resourceName:p,input:m.payload,context:{messageId:m.id,...await y??{}},resourceId:m.resourceId,procedure:m.procedure,query:i}});m.procedure&&o({id:m.id,type:"REPLY",data:u});}catch(u){o({id:m.id,type:"REJECT",resource:p,message:u.message}),console.error("Error parsing mutation from the client:",u);}}}catch(m){console.error("Error handling message from the client:",m);}}),n.on("close",()=>{console.log("Connection closed",s),delete e[s];for(let d of Object.values(t))delete d[s];});}};function ae(r){let e=`${r.protocol}://${r.hostname}${r.url}`,t=new Headers;return Object.entries(r.headers).forEach(([n,a])=>{a&&t.set(n,Array.isArray(a)?a.join(","):a);}),new Request(e,{method:r.method,headers:t,body:r.body&&r.method!=="GET"?JSON.stringify(r.body):void 0})}var pt=(r,e,t)=>{r.ws(`${(t==null?void 0:t.basePath)??""}/ws`,ne(e)),r.use(`${(t==null?void 0:t.basePath)??""}/`,(n,a)=>{W(e)(ae(n)).then(s=>s.json().then(c=>a.status(s.status).send(c)));});};var U=class r{routes;constructor(e){this.routes=e.routes;}static create(e){return new r(e)}},ht=r=>U.create({...r}),_e=r=>({handler:e=>({inputValidator:r??z$1.undefined(),handler:e})}),N=class r{_resourceSchema;resourceName;middlewares;customMutations;constructor(e,t){this.resourceName=e,this.middlewares=new Set,this.customMutations=t??{};}handleFind=async({req:e,db:t})=>({data:await t.rawFind(e.resourceName,e.where,e.include),acceptedValues:null});handleSet=async({req:e,db:t,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.resourceName,e.resourceId),[o,s]=n[this.resourceName].mergeMutation("set",e.input,a);if(!s)throw new Error("Mutation rejected");return {data:await t.rawUpsert(e.resourceName,e.resourceId,o),acceptedValues:s}};async handleRequest(e){let t=n=>(()=>{if(n.type==="QUERY")return this.handleFind({req:n,db:e.db,schema:e.schema});if(n.type==="MUTATE")if(n.procedure){if(this.customMutations[n.procedure]){let a=this.customMutations[n.procedure].inputValidator.parse(n.input);return n.input=a,this.customMutations[n.procedure].handler({req:n,db:e.db,schema:e.schema})}}else return this.handleSet({req:n,db:e.db,schema:e.schema});throw new Error("Invalid request")})();return await Array.from(this.middlewares.values()).reduceRight((n,a)=>o=>a({req:o,next:n}),async n=>t(n))(e.req)}use(...e){for(let t of e)this.middlewares.add(t);return this}withMutations(e){return new r(this.resourceName,e({mutation:_e}))}},D=class r{middlewares;constructor(e=[]){this.middlewares=e;}createBasicRoute(e){return new N(e.name).use(...this.middlewares)}use(...e){return new r([...this.middlewares,...e])}static create(){return new r}},Tt=D.create;var E=class{async insert(e,t){let n=new Date().toISOString();return r(await this.rawUpsert(e.name,t.id,{value:Object.fromEntries(Object.entries(t).map(([a,o])=>[a,{value:o,_meta:{timestamp:n}}]))}))}async update(e,t,n){let a=new Date().toISOString(),{id:o,...s}=n;return r(await this.rawUpsert(e.name,t,{value:Object.fromEntries(Object.entries(s).map(([c,i])=>[c,{value:i,_meta:{timestamp:a}}]))}))}};function z(r,e,t,n){var o,s;if(!n)return t;if(!r)throw new Error("Schema not initialized");let a=r[e];if(!a)throw new Error("Resource not found");for(let[c,i]of Object.entries(n))if(a.fields[c])(i==null?void 0:i.$eq)!==void 0?t=t.where(`${e}.${c}`,i.$eq===null?"is":"=",i.$eq):(i==null?void 0:i.$in)!==void 0?t=t.where(`${e}.${c}`,"in",i.$in):(i==null?void 0:i.$not)!==void 0?((o=i==null?void 0:i.$not)==null?void 0:o.$in)!==void 0?t=t.where(`${e}.${c}`,"not in",i.$not.$in):((s=i==null?void 0:i.$not)==null?void 0:s.$eq)!==void 0?t=t.where(`${e}.${c}`,i.$not.$eq===null?"is not":"!=",i.$not.$eq):t=t.where(`${e}.${c}`,i.$not===null?"is not":"!=",i.$not):(i==null?void 0:i.$gt)!==void 0?t=t.where(`${e}.${c}`,">",i.$gt):(i==null?void 0:i.$gte)!==void 0?t=t.where(`${e}.${c}`,">=",i.$gte):(i==null?void 0:i.$lt)!==void 0?t=t.where(`${e}.${c}`,"<",i.$lt):(i==null?void 0:i.$lte)!==void 0?t=t.where(`${e}.${c}`,"<=",i.$lte):t=t.where(`${e}.${c}`,i===null?"is":"=",i);else if(a.relations[c]){let y=a.relations[c],f=y.entity.name,d=y.type==="one"?"id":y.foreignColumn,m=y.type==="one"?y.relationalColumn:"id";t=t.leftJoin(f,`${f}.${d}`,`${e}.${m}`),t=z(r,f,t,i);}return t}function V(r,e,t,n){if(!n)return t;if(!r)throw new Error("Schema not initialized");let a=r[e];if(!a)throw new Error(`Resource not found: ${e}`);for(let o of Object.keys(n)){if(!a.relations[o])throw new Error(`Relation ${o} not found in resource ${e}`);let s=a.relations[o],c=s.entity.name,i=s.type==="one"?"id":s.foreignColumn,y=s.type==="one"?s.relationalColumn:"id",f=s.type==="one"?jsonObjectFrom:jsonArrayFrom;t=t.select(d=>f(d.selectFrom(c).selectAll(c).whereRef(`${c}.${i}`,"=",`${e}.${y}`).select(m=>jsonObjectFrom(m.selectFrom(`${c}_meta`).selectAll(`${c}_meta`).whereRef(`${c}_meta.id`,"=",`${c}.id`)).as("_meta"))).as(o));}return t}var k=class extends E{db;schema;constructor(e){super(),this.db=new Kysely({dialect:new PostgresDialect({pool:e})});}async updateSchema(e){this.schema=e;let t=await this.db.introspection.getTables();for(let[n,a]of Object.entries(e)){let o=t.find(i=>i.name===n);o||await this.db.schema.createTable(n).ifNotExists().execute();let s=`${n}_meta`,c=t.find(i=>i.name===s);c||await this.db.schema.createTable(s).ifNotExists().execute();for(let[i,y]of Object.entries(a.fields)){let f=o==null?void 0:o.columns.find(p=>p.name===i),d=y.getStorageFieldType();f?f.dataType!==d.type&&console.error("Column type mismatch:",i,"expected to have type:",d.type,"but has type:",f.dataType):(await this.db.schema.alterTable(n).addColumn(i,d.type,p=>{let u=p;return d.unique&&(u=u.unique()),d.nullable||(u=u.notNull()),d.references&&(u=u.references(d.references)),d.primary&&(u=u.primaryKey()),d.default!==void 0&&(u=u.defaultTo(d.default)),u}).execute().catch(p=>{throw console.error("Error adding column",i,p),p}),d.index&&await this.db.schema.createIndex(`${n}_${i}_index`).on(n).column(i).execute().catch(p=>{})),(c==null?void 0:c.columns.find(p=>p.name===i))||await this.db.schema.alterTable(s).addColumn(i,"varchar",p=>{let u=p;return d.primary&&(u=u.primaryKey().references(`${n}.${i}`)),u}).execute();}}}async rawFindById(e,t,n){if(!this.schema)throw new Error("Schema not initialized");let a=await this.db.selectFrom(e).where("id","=",t).selectAll(e).select(s=>jsonObjectFrom(s.selectFrom(`${e}_meta`).selectAll(`${e}_meta`).whereRef(`${e}_meta.id`,"=",`${e}.id`)).as("_meta"));a=V(this.schema,e,a,n);let o=await a.executeTakeFirst();if(o)return this.convertToMaterializedLiveType(o)}async findOne(e,t,n){let a=await this.rawFindById(e.name,t,n==null?void 0:n.include);if(a)return r(a)}async rawFind(e,t,n){if(!this.schema)throw new Error("Schema not initialized");let a=this.db.selectFrom(e).selectAll(e).select(i=>jsonObjectFrom(i.selectFrom(`${e}_meta`).selectAll(`${e}_meta`).whereRef(`${e}_meta.id`,"=",`${e}.id`)).as("_meta"));a=z(this.schema,e,a,t),a=V(this.schema,e,a,n);let o=await a.execute(),s=Object.fromEntries(o.map(i=>{let{id:y,...f}=i;return [y,f]}));return Object.keys(s).length===0?{}:Object.entries(s).reduce((i,[y,f])=>(i[y]=this.convertToMaterializedLiveType(f),i),{})}async find(e,t){let n=await this.rawFind(e.name,t==null?void 0:t.where,t==null?void 0:t.include);return Object.fromEntries(Object.entries(n).map(([a,o])=>[a,r(o)]))}async rawUpsert(e,t,n){return await this.db.transaction().execute(async a=>{var i;let o=!!await a.selectFrom(e).select("id").where("id","=",t).executeTakeFirst(),s={},c={};for(let[y,f]of Object.entries(n.value)){let d=(i=f._meta)==null?void 0:i.timestamp;d&&(s[y]=f.value,c[y]=d);}o?await Promise.all([a.updateTable(e).set(s).where("id","=",t).execute(),a.updateTable(`${e}_meta`).set(c).where("id","=",t).execute()]):await Promise.all([a.insertInto(e).values({...s,id:t}).execute(),a.insertInto(`${e}_meta`).values({...c,id:t}).execute()]);}),n}convertToMaterializedLiveType(e){if(!e._meta)throw new Error("Missing _meta");return {value:Object.entries(e).reduce((t,[n,a])=>{var o,s,c;return n==="_meta"||(n==="id"?t[n]={value:a}:Array.isArray(a)?t[n]={value:a.map(i=>this.convertToMaterializedLiveType(i)),_meta:{timestamp:(o=e==null?void 0:e._meta)==null?void 0:o[n]}}:typeof a=="object"&&a!==null&&!(a instanceof Date)?t[n]={...this.convertToMaterializedLiveType(a),_meta:{timestamp:(s=e==null?void 0:e._meta)==null?void 0:s[n]}}:t[n]={value:a,_meta:{timestamp:(c=e==null?void 0:e._meta)==null?void 0:c[n]}}),t},{})}}};var F=class r{router;storage;schema;middlewares=new Set;contextProvider;mutationSubscriptions=new Set;constructor(e){var t;this.router=e.router,this.storage=e.storage,this.schema=e.schema,(t=e.middlewares)==null||t.forEach(n=>{this.middlewares.add(n);}),this.storage.updateSchema(this.schema),this.contextProvider=e.contextProvider;}static create(e){return new r(e)}subscribeToMutations(e){return this.mutationSubscriptions.add(e),()=>{this.mutationSubscriptions.delete(e);}}async handleRequest(e){if(!this.router.routes[e.req.resourceName])throw new Error("Invalid resource");let t=await Array.from(this.middlewares.values()).reduceRight((n,a)=>o=>a({req:o,next:n}),async n=>this.router.routes[e.req.resourceName].handleRequest({req:n,db:this.storage,schema:this.schema}))(e.req);return t&&e.req.type==="MUTATE"&&t.acceptedValues&&Object.keys(t.acceptedValues).length>0&&this.mutationSubscriptions.forEach(n=>{n({id:e.req.context.messageId,type:"MUTATE",resource:e.req.resourceName,payload:t.acceptedValues??{},resourceId:e.req.resourceId});}),t}use(e){return this.middlewares.add(e),this}context(e){return this.contextProvider=e,this}},Lt=F.create;
|
|
2
|
-
export{
|
|
1
|
+
import {a,b,t,v as v$1,w,y,x}from'./chunk-GUSCESQZ.js';import C from'node:crypto';import Be,{parse}from'qs';import {z as z$1}from'zod';import {Kysely,PostgresDialect}from'kysely';import {jsonObjectFrom,jsonArrayFrom}from'kysely/helpers/postgres';var _=a(N=>{Object.defineProperty(N,"__esModule",{value:true});N.parse=Pe;N.serialize=ze;var Ae=/^[\u0021-\u003A\u003C\u003E-\u007E]+$/,Oe=/^[\u0021-\u003A\u003C-\u007E]*$/,je=/^([.]?[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)([.][a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)*$/i,Le=/^[\u0020-\u003A\u003D-\u007E]*$/,$e=Object.prototype.toString,Ce=(()=>{let i=function(){};return i.prototype=Object.create(null),i})();function Pe(i,t){let e=new Ce,r=i.length;if(r<2)return e;let n=(t==null?void 0:t.decode)||Ne,o=0;do{let c=i.indexOf("=",o);if(c===-1)break;let a=i.indexOf(";",o),s=a===-1?r:a;if(c>s){o=i.lastIndexOf(";",c-1)+1;continue}let f=oe(i,o,c),m=ae(i,c,f),d=i.slice(f,m);if(e[d]===void 0){let l=oe(i,c+1,s),u=ae(i,s,l),h=n(i.slice(l,u));e[d]=h;}o=s+1;}while(o<r);return e}function oe(i,t,e){do{let r=i.charCodeAt(t);if(r!==32&&r!==9)return t}while(++t<e);return e}function ae(i,t,e){for(;t>e;){let r=i.charCodeAt(--t);if(r!==32&&r!==9)return t+1}return e}function ze(i,t,e){let r=(e==null?void 0:e.encode)||encodeURIComponent;if(!Ae.test(i))throw new TypeError(`argument name is invalid: ${i}`);let n=r(t);if(!Oe.test(n))throw new TypeError(`argument val is invalid: ${t}`);let o=i+"="+n;if(!e)return o;if(e.maxAge!==void 0){if(!Number.isInteger(e.maxAge))throw new TypeError(`option maxAge is invalid: ${e.maxAge}`);o+="; Max-Age="+e.maxAge;}if(e.domain){if(!je.test(e.domain))throw new TypeError(`option domain is invalid: ${e.domain}`);o+="; Domain="+e.domain;}if(e.path){if(!Le.test(e.path))throw new TypeError(`option path is invalid: ${e.path}`);o+="; Path="+e.path;}if(e.expires){if(!Ue(e.expires)||!Number.isFinite(e.expires.valueOf()))throw new TypeError(`option expires is invalid: ${e.expires}`);o+="; Expires="+e.expires.toUTCString();}if(e.httpOnly&&(o+="; HttpOnly"),e.secure&&(o+="; Secure"),e.partitioned&&(o+="; Partitioned"),e.priority)switch(typeof e.priority=="string"?e.priority.toLowerCase():void 0){case "low":o+="; Priority=Low";break;case "medium":o+="; Priority=Medium";break;case "high":o+="; Priority=High";break;default:throw new TypeError(`option priority is invalid: ${e.priority}`)}if(e.sameSite)switch(typeof e.sameSite=="string"?e.sameSite.toLowerCase():e.sameSite){case true:case "strict":o+="; SameSite=Strict";break;case "lax":o+="; SameSite=Lax";break;case "none":o+="; SameSite=None";break;default:throw new TypeError(`option sameSite is invalid: ${e.sameSite}`)}return o}function Ne(i){if(i.indexOf("%")===-1)return i;try{return decodeURIComponent(i)}catch{return i}}function Ue(i){return $e.call(i)==="[object Date]"}});var re="0123456789ABCDEFGHJKMNPQRSTVWXYZ",E=32;var we=16,ne=10,te=0xffffffffffff;var I;(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";})(I||(I={}));var M=class extends Error{constructor(t,e){super(`${e} (${t})`),this.name="ULIDError",this.code=t;}};function xe(i){let t=Math.floor(i()*E);return t===E&&(t=E-1),re.charAt(t)}function Se(i){var r;let t=Ie(),e=t&&(t.crypto||t.msCrypto)||(typeof C<"u"?C: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=C)!=null&&r.randomBytes)return ()=>C.randomBytes(1).readUInt8()/255;throw new M(I.PRNGDetectFailure,"Failed to find a reliable PRNG")}function Ie(){return Ee()?self:typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:null}function Me(i,t){let e="";for(;i>0;i--)e=xe(t)+e;return e}function ve(i,t=ne){if(isNaN(i))throw new M(I.EncodeTimeValueMalformed,`Time must be a number: ${i}`);if(i>te)throw new M(I.EncodeTimeSizeExceeded,`Cannot encode a time larger than ${te}: ${i}`);if(i<0)throw new M(I.EncodeTimeNegative,`Time must be positive: ${i}`);if(Number.isInteger(i)===false)throw new M(I.EncodeTimeValueMalformed,`Time must be an integer: ${i}`);let e,r="";for(let n=t;n>0;n--)e=i%E,r=re.charAt(e)+r,i=(i-e)/E;return r}function Ee(){return typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope}function ie(i,t){let e=Se(),r=Date.now();return ve(r,ne)+Me(we,e)}var D=()=>ie().toLowerCase();var P=(...i)=>{let t=i.filter(e=>!!e);return t.length===0?{}:t.length===1?t[0]:{$and:t}};var z=class{storage;queue=new Map;scheduled=false;constructor(t){this.storage=t;}async rawFind({resource:t,commonWhere:e,uniqueWhere:r,...n}){return new Promise((o,c)=>{let a=this.getBatchKey({resource:t,commonWhere:e,...n}),s={resource:t,commonWhere:e,uniqueWhere:r,...n,resolve:o,reject:c};this.queue.has(a)||this.queue.set(a,[]);let f=this.queue.get(a);f&&f.push(s),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 l,u;if(t.length===0)return;let e=t[0],{resource:r,commonWhere:n,include:o,sort:c}=e,a=t.length===1?e.limit:void 0,s=t.map(h=>h.uniqueWhere).filter(h=>h!==void 0),f=n,m=(l=Object.entries(s[0]??{})[0])==null?void 0:l[0];if(s.length>0){let h=s.map(p=>p[m]).filter(p=>p!=null);h.length>0&&(f=P(n,{[m]:{$in:h}}));}let d=await this.storage.rawFind({resource:r,where:f,include:o,sort:c,limit:a});for(let h of t){let p={};if(h.uniqueWhere){let[y,T]=Object.entries(h.uniqueWhere)[0];for(let[b,w]of Object.entries(d))((u=w.value[y])==null?void 0:u.value)===T&&(p[b]=w);}else Object.assign(p,d);h.resolve(p);}}};var ue=b(_(),1);var U=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()}),F=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()})),We=F.superRefine((i,t)=>{i.id&&t.addIssue({code:z$1.ZodIssueCode.custom,message:"Payload cannot have an id"});}),se=z$1.object({id:z$1.string().optional(),type:z$1.literal("MUTATE"),resource:z$1.string(),resourceId:z$1.string().optional()}),A=se.extend({procedure:z$1.string(),payload:z$1.any().optional()}),O=se.extend({procedure:z$1.enum(["INSERT","UPDATE"]),payload:We});z$1.union([O,A]);var ce=U.omit({resource:true}),V=A.omit({id:true,type:true,resource:true,procedure:true}),q=O.omit({id:true,type:true,resource:true,procedure:true});z$1.union([q,V]);var de=i=>{let t=i.logger;return async e=>{var r;try{let n=typeof e.headers.getSetCookie=="function"?Object.fromEntries(e.headers):e.headers,o={headers:n,cookies:n.cookie?ue.default.parse(n.cookie):{}},c=new URL(e.url),a=c.pathname.split("/"),s=c.searchParams,f=Be.parse(s.toString()),m=await((r=i.contextProvider)==null?void 0:r.call(i,{transport:"HTTP",headers:o.headers,cookies:o.cookies,queryParams:f}))??{};if(e.method==="GET"){let d=a[a.length-1],{success:l,data:u,error:h}=ce.safeParse(f);if(!l)return Response.json({message:"Invalid query",code:"INVALID_QUERY",details:h},{status:400});let p=await i.handleQuery({req:{...o,...u,type:"QUERY",resource:d,context:m,queryParams:f}});return !p||!p.data?Response.json({message:"Invalid resource",code:"INVALID_RESOURCE"},{status:400}):Response.json(p.data)}if(e.method==="POST")try{let d=a[a.length-1],l=a[a.length-2],u=e.body?await e.json():{},h;if(d==="insert"||d==="update"){let{success:y,data:T,error:b}=q.safeParse(u);if(!y)return Response.json({message:"Invalid mutation",code:"INVALID_REQUEST",details:b},{status:400});h=T;}else {let{success:y,data:T,error:b}=V.safeParse(u);if(!y)return Response.json({message:"Invalid mutation",code:"INVALID_REQUEST",details:b},{status:400});h=T;}let p=await i.handleMutation({req:{...o,type:"MUTATE",resource:l,input:h.payload,context:m,resourceId:h.resourceId,procedure:d==="insert"||d==="update"?d.toUpperCase():d,queryParams:{}}});return Response.json(p)}catch(d){return t.error("Error parsing mutation from the client:",d),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(_(),1);var v=z$1.string(),De=z$1.object({id:v,type:z$1.literal("SUBSCRIBE"),resource:z$1.string()}),_e=U.extend({id:v,type:z$1.literal("QUERY")}),le=O.extend({id:v}),Fe=A.extend({id:v}),Ve=z$1.union([Fe,le]),pe=z$1.union([De,_e,Ve]),qe=z$1.object({id:v,type:z$1.literal("REJECT"),resource:z$1.string(),message:z$1.string().optional()}),Qe=z$1.object({id:v,type:z$1.literal("REPLY"),data:z$1.any()});z$1.union([qe,Qe,le]);z$1.object({resource:z$1.string(),data:z$1.record(z$1.string(),F)});var ye=i=>{let t={},e={},r=i.logger;return i.subscribeToMutations(n=>{let o=n;!o.resourceId||!o.payload||(r.debug("Mutation propagated:",o),Object.entries(e[o.resource]??{}).forEach(([c,a])=>{var s;(s=t[c])==null||s.send(JSON.stringify({...o,id:o.id??D()}));}));}),(n,o)=>{var d;let c=l=>{n.send(JSON.stringify(l));},a=D(),s={headers:o.headers,cookies:typeof o.headers.cookie=="string"?me.default.parse(o.headers.cookie):{}},f=parse(o.url.split("?")[1]),m=(d=i.contextProvider)==null?void 0:d.call(i,{transport:"WEBSOCKET",headers:s.headers,cookies:s.cookies,queryParams:f});t[a]=n,r.info("Client connected:",a),n.on("message",async l=>{try{r.debug("Message received from the client:",l);let u=pe.parse(JSON.parse(l.toString()));if(u.type==="SUBSCRIBE"){let{resource:h}=u;e[h]||(e[h]={}),e[h][a]={};}else if(u.type==="QUERY"){let{resource:h}=u,p=await i.handleQuery({req:{...s,type:"QUERY",resource:h,context:await m??{},queryParams:f}});if(!p||!p.data)throw new Error("Invalid resource");c({id:u.id,type:"REPLY",data:{resource:h,data:Object.fromEntries(Object.entries(p.data??{}).map(([y,T])=>[y,T.value]))}});}else if(u.type==="MUTATE"){let{resource:h}=u;r.debug("Received mutation from client:",u);try{let p=await i.handleMutation({req:{...s,type:"MUTATE",resource:h,input:u.payload,context:{messageId:u.id,...await m??{}},resourceId:u.resourceId,procedure:u.procedure,queryParams:f}});u.procedure&&u.procedure!=="INSERT"&&u.procedure!=="UPDATE"&&c({id:u.id,type:"REPLY",data:p});}catch(p){c({id:u.id,type:"REJECT",resource:h,message:p.message}),r.error("Error parsing mutation from the client:",p);}}}catch(u){r.error("Error handling message from the client:",u);}}),n.on("close",()=>{r.info("Connection closed",a),delete t[a];for(let l of Object.values(e))delete l[a];});}};function fe(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 Ot=(i,t,e)=>{i.ws(`${(e==null?void 0:e.basePath)??""}/ws`,ye(t)),i.use(`${(e==null?void 0:e.basePath)??""}/`,(r,n)=>{de(t)(fe(r)).then(c=>c.json().then(a=>n.status(c.status).send(a)));});};var Q=class i{routes;constructor(t){this.routes=t.routes;}static create(t){return new i(t)}},zt=i=>Q.create({...i}),He=i=>({handler:t=>({inputValidator:i??z$1.undefined(),handler:t})}),Z=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:He}),this.authorization)}handleQuery=async({req:t,batcher:e})=>await this.wrapInMiddlewares(async r=>{var o,c;let n=(c=(o=this.authorization)==null?void 0:o.read)==null?void 0:c.call(o,{ctx:r.context});if(typeof n=="boolean"&&!n)throw new Error("Not authorized");return {data:await e.rawFind({resource:r.resource,commonWhere:P(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 o=this.customMutations[n.procedure];if(o){let c=o.inputValidator.parse(n.input);return n.input=c,o.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 o=await e.rawFindById(t$1.resource,t$1.resourceId);if(r==="INSERT"&&o)throw new Error("Resource already exists");if(r==="UPDATE"&&!o)throw new Error("Resource not found");return e.transaction(async({trx:c})=>{var m,d,l,u,h;let[a,s]=this.resourceSchema.mergeMutation("set",t$1.input,o);if(!s)throw new Error("Mutation rejected");if(r==="INSERT"){let p=await c.rawInsert(t$1.resource,t$1.resourceId,a),y=t(p);if(y.id=y.id??t$1.resourceId,(m=this.authorization)!=null&&m.insert){let T=this.authorization.insert({ctx:t$1.context,value:y});if(typeof T=="boolean"){if(!T)throw new Error("Not authorized")}else {let b=v$1(T,t$1.resource,n),w$1=Object.keys(b).length>0?await c.rawFindById(t$1.resource,t$1.resourceId,b):p,S=t(w$1);if(S.id=S.id??t$1.resourceId,!w(S,T))throw new Error("Not authorized")}}return {data:p,acceptedValues:s}}if((l=(d=this.authorization)==null?void 0:d.update)!=null&&l.preMutation){let p=t(o);p.id=p.id??t$1.resourceId;let y=this.authorization.update.preMutation({ctx:t$1.context,value:p});if(typeof y=="boolean"){if(!y)throw new Error("Not authorized")}else {let T=v$1(y,t$1.resource,n),b=Object.keys(T).length>0?await c.rawFindById(t$1.resource,t$1.resourceId,T):o,w$1=t(b);if(w$1.id=w$1.id??t$1.resourceId,!w(w$1,y))throw new Error("Not authorized")}}let f=await c.rawUpdate(t$1.resource,t$1.resourceId,a);if((h=(u=this.authorization)==null?void 0:u.update)!=null&&h.postMutation){let p=t(f);p.id=p.id??t$1.resourceId;let y=this.authorization.update.postMutation({ctx:t$1.context,value:p});if(typeof y=="boolean"){if(!y)throw new Error("Not authorized")}else {let T=v$1(y,t$1.resource,n),b=Object.keys(T).length>0?await c.rawFindById(t$1.resource,t$1.resourceId,T):f,w$1=t(b);if(w$1.id=w$1.id??t$1.resourceId,!w(w$1,y))throw new Error("Not authorized")}}return {data:f,acceptedValues:s}})};wrapInMiddlewares(t){return e=>Array.from(this.middlewares.values()).reduceRight((r,n)=>o=>n({req:o,next:r}),t)(e)}},G=class i{middlewares;constructor(t=[]){this.middlewares=t;}collectionRoute(t,e){return new Z(t,void 0,e).use(...this.middlewares)}use(...t){return new i([...this.middlewares,...t])}static create(){return new i}},Nt=G.create;var j=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,o])=>[n,{value:o,_meta:{timestamp:r}}]))}))}async update(t$1,e,r){let n=new Date().toISOString(),{id:o,...c}=r;return t(await this.rawUpdate(t$1.name,e,{value:Object.fromEntries(Object.entries(c).map(([a,s])=>[a,{value:s,_meta:{timestamp:n}}]))}))}};function W(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 o=r.$or,c=r.$and;return (o?e.or:e.and)(o?r.$or.map(a=>W(i,t,e,a)):c?r.$and.map(a=>W(i,t,e,a)):Object.entries(r).map(([a,s])=>{var f,m;if(n.fields[a])return (s==null?void 0:s.$eq)!==void 0?e(`${t}.${a}`,s.$eq===null?"is":"=",s.$eq):(s==null?void 0:s.$in)!==void 0?e(`${t}.${a}`,"in",s.$in):(s==null?void 0:s.$not)!==void 0?((f=s==null?void 0:s.$not)==null?void 0:f.$in)!==void 0?e(`${t}.${a}`,"not in",s.$not.$in):((m=s==null?void 0:s.$not)==null?void 0:m.$eq)!==void 0?e(`${t}.${a}`,s.$not.$eq===null?"is not":"!=",s.$not.$eq):e(`${t}.${a}`,s.$not===null?"is not":"!=",s.$not):(s==null?void 0:s.$gt)!==void 0?e(`${t}.${a}`,">",s.$gt):(s==null?void 0:s.$gte)!==void 0?e(`${t}.${a}`,">=",s.$gte):(s==null?void 0:s.$lt)!==void 0?e(`${t}.${a}`,"<",s.$lt):(s==null?void 0:s.$lte)!==void 0?e(`${t}.${a}`,"<=",s.$lte):e(`${t}.${a}`,s===null?"is":"=",s);if(n.relations[a]){let d=n.relations[a],l=d.entity.name;return d.type==="many"?e.exists(H(i,l,e.selectFrom(l).select("id").whereRef(d.foreignColumn,"=",`${t}.id`),s)):W(i,l,e,s)}return null}).filter(Boolean))}function k(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 o of r.$and)e=k(i,t,e,o);return e}else if(r.$or){for(let o of r.$or)e=k(i,t,e,o);return e}for(let[o,c]of Object.entries(r)){if(!n.relations[o])continue;let a=n.relations[o],s=a.entity.name,f=a.type==="one"?"id":a.foreignColumn,m=a.type==="one"?a.relationalColumn:"id";e=e.leftJoin(s,`${s}.${f}`,`${t}.${m}`),c instanceof Object&&!Array.isArray(c)&&c!==null&&(e=k(i,s,e,c));}return e}function H(i,t,e,r){return !r||Object.keys(r).length===0?e:(e=k(i,t,e,r),e.where(n=>W(i,t,n,r)))}function B(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 o of Object.keys(r)){if(!n.relations[o])throw new Error(`Relation ${o} not found in resource ${t}`);let c=n.relations[o],a=c.entity.name,s=r[o],f=c.type==="one"?"id":c.foreignColumn,m=c.type==="one"?c.relationalColumn:"id",d=c.type==="one"?jsonObjectFrom:jsonArrayFrom,l=typeof s=="object"&&s!==null;e=e.select(u=>{let h=u.selectFrom(a).selectAll(a).whereRef(`${a}.${f}`,"=",`${t}.${m}`).select(p=>jsonObjectFrom(p.selectFrom(`${a}_meta`).selectAll(`${a}_meta`).whereRef(`${a}_meta.id`,"=",`${a}.id`)).as("_meta"));return l&&(h=B(i,a,h,s)),d(h).as(o)});}return e}var K=class i extends j{db;schema;logger;constructor(t,e,r){super(),this.isKyselyLike(t)?this.db=t:this.db=new Kysely({dialect:new PostgresDialect({pool:t})}),this.schema=e,this.logger=r,this.rawInsert=this.rawInsert.bind(this),this.rawUpdate=this.rawUpdate.bind(this);}async init(t,e){var n;this.schema=t,this.logger=e;let r=await this.db.introspection.getTables();for(let[o,c]of Object.entries(t)){let a=r.find(m=>m.name===o);a||await this.db.schema.createTable(o).ifNotExists().execute();let s=`${o}_meta`,f=r.find(m=>m.name===s);f||await this.db.schema.createTable(s).ifNotExists().execute();for(let[m,d]of Object.entries(c.fields)){let l=a==null?void 0:a.columns.find(p=>p.name===m),u=d.getStorageFieldType();l?l.dataType!==u.type&&((n=this.logger)==null||n.warn("Column type mismatch:",m,"expected to have type:",u.type,"but has type:",l.dataType)):(await this.db.schema.alterTable(o).addColumn(m,u.type,p=>{let y=p;return u.unique&&(y=y.unique()),u.nullable||(y=y.notNull()),u.references&&(y=y.references(u.references)),u.primary&&(y=y.primaryKey()),u.default!==void 0&&(y=y.defaultTo(u.default)),y}).execute().catch(p=>{var y;throw (y=this.logger)==null||y.error("Error adding column",m,p),p}),u.index&&await this.db.schema.createIndex(`${o}_${m}_index`).on(o).column(m).execute().catch(()=>{})),(f==null?void 0:f.columns.find(p=>p.name===m))||await this.db.schema.alterTable(s).addColumn(m,"varchar",p=>{let y=p;return u.primary&&(y=y.primaryKey().references(`${o}.${m}`)),y}).execute();}}}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(c=>jsonObjectFrom(c.selectFrom(`${t}_meta`).selectAll(`${t}_meta`).whereRef(`${t}_meta.id`,"=",`${t}.id`)).as("_meta"));n=B(this.schema,t,n,r);let o=await n.executeTakeFirst();if(o)return this.convertToMaterializedLiveType(o)}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:o,sort:c}=t,a=this.db.selectFrom(e).selectAll(e).select(d=>jsonObjectFrom(d.selectFrom(`${e}_meta`).selectAll(`${e}_meta`).whereRef(`${e}_meta.id`,"=",`${e}.id`)).as("_meta"));a=H(this.schema,e,a,r),a=B(this.schema,e,a,n),o!==void 0&&(a=a.limit(o)),c!==void 0&&c.forEach(d=>{a=a.orderBy(d.key,d.direction);});let s=await a.execute(),f=Object.fromEntries(s.map(d=>{let{id:l}=d;return [l,d]}));return Object.keys(f).length===0?{}:Object.entries(f).reduce((d,[l,u])=>(d[l]=this.convertToMaterializedLiveType(u),d),{})}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,o])=>[n,t(o)]))}async rawInsert(t,e,r){var c;let n={},o={};for(let[a,s]of Object.entries(r.value)){let f=(c=s._meta)==null?void 0:c.timestamp;f&&(n[a]=s.value,o[a]=f);}return await this.db.insertInto(t).values({...n,id:e}).execute().then(()=>{this.db.insertInto(`${t}_meta`).values({...o,id:e}).execute();}),r}async rawUpdate(t,e,r){var c;let n={},o={};for(let[a,s]of Object.entries(r.value)){let f=(c=s._meta)==null?void 0:c.timestamp;f&&(n[a]=s.value,o[a]=f);}return await Promise.all([this.db.updateTable(t).set(n).where("id","=",e).execute(),this.db.insertInto(`${t}_meta`).values({...o,id:e}).onConflict(a=>a.column("id").doUpdateSet(o)).execute()]),r}async transaction(t){if(!this.schema)throw new Error("Schema not initialized");if(this.db.isTransaction){let r=Math.random().toString(36).substring(2,15),n=await this.db.savepoint(r).execute();try{return await t({trx:this,commit:()=>n.releaseSavepoint(r).execute().then(()=>{}),rollback:()=>n.rollbackToSavepoint(r).execute().then(()=>{})}).then(o=>n.isCommitted||n.isRolledBack?o:n.releaseSavepoint(r).execute().then(()=>o))}catch(o){throw await n.rollbackToSavepoint(r).execute().catch(()=>{}),o}}let e=await this.db.startTransaction().execute();try{return await t({trx:new i(e,this.schema,this.logger),commit:()=>e.commit().execute(),rollback:()=>e.rollback().execute()}).then(r=>e.isCommitted||e.isRolledBack?r:e.commit().execute().then(()=>r))}catch(r){throw await e.rollback().execute(),r}}convertToMaterializedLiveType(t){return {value:Object.entries(t).reduce((e,[r,n])=>{var o,c,a;return r==="_meta"||(r==="id"?e[r]={value:n}:Array.isArray(n)?e[r]={value:n.map(s=>this.convertToMaterializedLiveType(s)),_meta:{timestamp:(o=t==null?void 0:t._meta)==null?void 0:o[r]}}:typeof n=="object"&&n!==null&&!(n instanceof Date)?e[r]={...this.convertToMaterializedLiveType(n),_meta:{timestamp:(c=t==null?void 0:t._meta)==null?void 0:c[r]}}:e[r]={value:n,_meta:{timestamp:(a=t==null?void 0:t._meta)==null?void 0:a[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",o=typeof e.savepoint=="function",c=typeof e.isTransaction=="boolean"||typeof e.isTransaction=="function";return r&&n||o&&c}};var J=class i{router;storage;schema;middlewares=new Set;logger;contextProvider;mutationSubscriptions=new Set;constructor(t){var e;this.router=t.router,this.storage=t.storage,this.schema=t.schema,this.logger=y({level:t.logLevel??x.INFO}),(e=t.middlewares)==null||e.forEach(r=>{this.middlewares.add(r);}),this.storage.init(this.schema,this.logger),this.contextProvider=t.contextProvider;}static create(t){return new i(t)}subscribeToMutations(t){return this.mutationSubscriptions.add(t),()=>{this.mutationSubscriptions.delete(t);}}handleQuery(t){let e=new z(this.storage);return this.wrapInMiddlewares(async r=>{var f;let n=Re(r,this.schema,{stepId:"query",collectionName:r.resource,included:Object.keys(r.include??{})}),o={headers:r.headers,cookies:r.cookies,queryParams:r.queryParams,context:r.context},c={};for(let m=0;m<n.length;m++){let d=n[m],l=this.router.routes[d.resource];if(!l)throw new Error("Invalid resource");let u=d.getWhere&&d.referenceGetter?d.referenceGetter(c).map(d.getWhere):[void 0],h=(f=c[d.prevStepId??""])==null?void 0:f.flatMap(T=>{var b;return Object.keys(((b=T==null?void 0:T.result)==null?void 0:b.data)??{})}),y=(await Promise.allSettled(u.map(async(T,b)=>{let w=h==null?void 0:h[b],S=await l.handleQuery({req:{type:"QUERY",...d,...o,where:d.where,relationalWhere:T},batcher:e});return {includedBy:w,result:S}}))).flatMap(T=>T.status==="fulfilled"?[T.value]:[]);c[d.stepId]=y;}let a=Object.fromEntries(Object.entries(c).flatMap(([m,d],l)=>d.flatMap(u=>Object.entries(u.result.data).map(([h,p])=>[`${m}.${h}`,{data:p,includedBy:m!=="query"&&u.includedBy?`${m.split(".").slice(0,-1).join(".")}.${u.includedBy}`:void 0,path:m.split(".").slice(-1)[0],isMany:n[l].isMany,collectionName:n[l].collectionName,included:n[l].included}]))));return Object.keys(a).reduceRight((m,d)=>{var h,p;let l=a[d],u=l.path;if(u==="query"&&(m.data[d.replace("query.","")]=l.data),l.included.length)for(let y of l.included)l.data.value[y]??=((p=(h=this.schema[l.collectionName])==null?void 0:h.relations[y])==null?void 0:p.type)==="many"?{value:[]}:{value:null};if(l.includedBy){let y=a[l.includedBy];if(!y)return m;l.isMany?(y.data.value[u]??={value:[]},y.data.value[u].value.push(l.data)):y.data.value[u]=l.data;}return m},{data:{}})})(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??{},o=t.req,c=o.resourceId;Object.keys(n).length&&c&&this.mutationSubscriptions.forEach(a=>{a({id:t.req.context.messageId,type:"MUTATE",resource:o.resource,payload:n,resourceId:c,procedure:o.procedure});});}return e}use(t){return this.middlewares.add(t),this}context(t){return this.contextProvider=t,this}wrapInMiddlewares(t){return e=>Array.from(this.middlewares.values()).reduceRight((r,n)=>o=>n({req:o,next:r}),t)(e)}},Xt=J.create;function Re(i,t,e){let{include:r,...n}=i,{stepId:o}=e,c=[{...n,...e}];if(r&&typeof r=="object"&&Object.keys(r).length>0){let a=t[n.resource];if(!a)throw new Error(`Resource ${n.resource} not found`);c.push(...Object.entries(r).flatMap(([s,f])=>{let m=a.relations[s];if(!m)throw new Error(`Relation ${s} not found for resource ${n.resource}`);let d=m.entity.name;return Re({...n,resource:d,include:f},t,{getWhere:m.type==="one"?l=>({id:l}):l=>({[m.foreignColumn]:l}),referenceGetter:l=>l[o].flatMap(u=>u.result.data?m.type==="one"?Object.values(u.result.data).map(h=>{var p,y;return (y=(p=h.value)==null?void 0:p[m.relationalColumn])==null?void 0:y.value}):Object.keys(u.result.data):[]),stepId:`${o}.${s}`,prevStepId:o,isMany:m.type==="many",collectionName:d,included:typeof f=="object"?Object.keys(f):[]})}));}return c}
|
|
2
|
+
export{Z as Route,G as RouteFactory,Q as Router,K as SQLStorage,J as Server,j as Storage,Ot as expressAdapter,Nt as routeFactory,zt as router,Xt as server};
|
package/package.json
CHANGED
package/dist/chunk-G5SVBG4B.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
var L="0123456789ABCDEFGHJKMNPQRSTVWXYZ";var l;(function(e){e.Base32IncorrectEncoding="B32_ENC_INVALID",e.DecodeTimeInvalidCharacter="DEC_TIME_CHAR",e.DecodeTimeValueMalformed="DEC_TIME_MALFORMED",e.EncodeTimeNegative="ENC_TIME_NEG",e.EncodeTimeSizeExceeded="ENC_TIME_SIZE_EXCEED",e.EncodeTimeValueMalformed="ENC_TIME_MALFORMED",e.PRNGDetectFailure="PRNG_DETECT",e.ULIDInvalid="ULID_INVALID",e.Unexpected="UNEXPECTED",e.UUIDInvalid="UUID_INVALID";})(l||(l={}));var u=class extends Error{constructor(t,n){super(`${n} (${t})`),this.name="ULIDError",this.code=t;}};function I(e){let t=Math.floor(e()*32);return t===32&&(t=31),L.charAt(t)}function M(e){let t=E(),n=t&&(t.crypto||t.msCrypto)||null;if(typeof(n==null?void 0:n.getRandomValues)=="function")return ()=>{let i=new Uint8Array(1);return n.getRandomValues(i),i[0]/255};if(typeof(n==null?void 0:n.randomBytes)=="function")return ()=>n.randomBytes(1).readUInt8()/255;throw new u(l.PRNGDetectFailure,"Failed to find a reliable PRNG")}function E(){return O()?self:typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:null}function A(e,t){let n="";for(;e>0;e--)n=I(t)+n;return n}function _(e,t=10){if(isNaN(e))throw new u(l.EncodeTimeValueMalformed,`Time must be a number: ${e}`);if(e>0xffffffffffff)throw new u(l.EncodeTimeSizeExceeded,`Cannot encode a time larger than ${0xffffffffffff}: ${e}`);if(e<0)throw new u(l.EncodeTimeNegative,`Time must be positive: ${e}`);if(Number.isInteger(e)===false)throw new u(l.EncodeTimeValueMalformed,`Time must be an integer: ${e}`);let n,i="";for(let r=t;r>0;r--)n=e%32,i=L.charAt(n)+i,e=(e-n)/32;return i}function O(){return typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope}function b(e,t){let n=M(),i=Date.now();return _(i,10)+A(16,n)}var j=()=>b().toLowerCase(),V=(e,t)=>typeof e=="function"?e(t):e;var w=(e,t,n=[])=>new Proxy(e,{get:(i,r)=>{var p,T;if(r==="__isProxy__")return true;let o=(p=t.get)==null?void 0:p.call(t,i,[...n,r]);if(o!==void 0)return o;let a=i,s=r;return (T=a[s])!=null&&T.__isProxy__||(a[s]=w(typeof a[s]=="object"?a[s]:()=>{},t,[...n,r])),a[s]},apply:(i,r,o)=>{var a;return (a=t.apply)==null?void 0:a.call(t,i,n,o)}}),f=(e,t,n=false)=>Object.entries(t).every(([i,r])=>{if(i==="$and")return r.every(a=>f(e,a,n));if(i==="$or")return r.some(a=>f(e,a,n));let o=(r==null?void 0:r.$eq)!==void 0?r==null?void 0:r.$eq:r;if(typeof r=="object"&&r!==null&&(r==null?void 0:r.$eq)===void 0){if(r.$in!==void 0){let a=e[i];return a===void 0?false:n?!r.$in.includes(a):r.$in.includes(a)}if(r.$not!==void 0&&!n)return f(e,{[i]:r.$not},true);if(r.$gt!==void 0){let a=e[i];return typeof a!="number"?false:n?a<=r.$gt:a>r.$gt}if(r.$gte!==void 0){let a=e[i];return typeof a!="number"?false:n?a<r.$gte:a>=r.$gte}if(r.$lt!==void 0){let a=e[i];return typeof a!="number"?false:n?a>=r.$lt:a<r.$lt}if(r.$lte!==void 0){let a=e[i];return typeof a!="number"?false:n?a>r.$lte:a<=r.$lte}return !e[i]||typeof e[i]!="object"?false:f(e[i],r)}return n?e[i]!==o:e[i]===o}),D=(e,t,n)=>{let i=[],r=0;for(let o=0;o<e.length&&(n===void 0||r<n);o++)t(e[o],o)&&(i.push(e[o]),r++);return i};var R=e=>{if(e)return Array.isArray(e.value)?e.value.map(t=>R(t)):typeof e.value!="object"||e.value===null||e.value instanceof Date?e.value:Object.fromEntries(Object.entries(e.value).map(([t,n])=>[t,R(n)]))};export{j as a,V as b,w as c,f as d,D as e,R as f};
|
package/dist/chunk-LLHCJUB6.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
var L=Object.create;var h=Object.defineProperty;var g=Object.getOwnPropertyDescriptor;var b=Object.getOwnPropertyNames;var M=Object.getPrototypeOf,I=Object.prototype.hasOwnProperty;var j=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var O=(t,e,n,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of b(e))!I.call(t,i)&&i!==n&&h(t,i,{get:()=>e[i],enumerable:!(a=g(e,i))||a.enumerable});return t};var S=(t,e,n)=>(n=t!=null?L(M(t)):{},O(e||!t||!t.__esModule?h(n,"default",{value:t,enumerable:true}):n,t));var s=class{_value;_meta;_encodeInput;_decodeInput};var c=class extends s{inner;constructor(e){super(),this.inner=e;}encodeMutation(e,n,a){return this.inner.encodeMutation(e,n,a)}mergeMutation(e,n,a){return this.inner.mergeMutation(e,n,a)}getStorageFieldType(){return {...this.inner.getStorageFieldType(),nullable:true}}},o=class t extends s{storageType;convertFunc;isIndex;isUnique;defaultValue;foreignReference;isPrimary;constructor(e,n,a,i,r,u,y){super(),this.storageType=e,this.convertFunc=n,this.isIndex=a??false,this.isUnique=i??false,this.defaultValue=r,this.foreignReference=u,this.isPrimary=y??false;}encodeMutation(e,n,a){return {value:n,_meta:{timestamp:a}}}mergeMutation(e,n,a){return a&&a._meta.timestamp&&n._meta.timestamp&&a._meta.timestamp.localeCompare(n._meta.timestamp)>=0?[a,null]:[{value:this.convertFunc?this.convertFunc(n.value):n.value,_meta:n._meta},n]}getStorageFieldType(){return {type:this.storageType,nullable:false,index:this.isIndex,unique:this.isUnique,default:this.defaultValue,references:this.foreignReference,primary:this.isPrimary}}unique(){return new t(this.storageType,this.convertFunc,this.isIndex,true,this.defaultValue,this.foreignReference,this.isPrimary)}index(){return new t(this.storageType,this.convertFunc,true,this.isUnique,this.defaultValue,this.foreignReference,this.isPrimary)}default(e){return new t(this.storageType,this.convertFunc,this.isIndex,this.isUnique,e,this.foreignReference,this.isPrimary)}primary(){return new t(this.storageType,this.convertFunc,this.isIndex,this.isUnique,this.defaultValue,this.foreignReference,true)}nullable(){return new c(this)}},p=class t extends o{constructor(){super("integer",e=>Number(e));}static create(){return new t}},_=p.create,l=class t extends o{constructor(e){super("varchar",void 0,void 0,void 0,void 0,e);}static create(){return new t}static createId(){return new t().index().unique().primary()}static createReference(e){return new t(e)}},V=l.create,E=l.createId,C=l.createReference,d=class t extends o{constructor(){super("boolean",e=>typeof e=="string"?e.toLowerCase()==="true":!!e);}static create(){return new t}},F=d.create,m=class t extends o{constructor(){super("timestamp",e=>typeof e=="string"?new Date(e):e);}static create(){return new t}},q=m.create;var v=class t extends s{name;fields;relations;constructor(e,n,a){super(),this.name=e,this.fields=n,this.relations=a??{};}encodeMutation(e,n,a){return Object.fromEntries(Object.entries(n).map(([i,r])=>[i,(this.fields[i]??this.relations[i]).encodeMutation("set",r,a)]))}mergeMutation(e,n,a){let i={};return [{value:{...(a==null?void 0:a.value)??{},...Object.fromEntries(Object.entries(n).map(([r,u])=>{let y=this.fields[r]??this.relations[r];if(!y)return [r,u];let[R,f]=y.mergeMutation(e,u,a==null?void 0:a.value[r]);return f&&(i[r]=f),[r,R]}))}},i]}setRelations(e){return new t(this.name,this.fields,e)}getStorageFieldType(){throw new Error("Method not implemented.")}static create(e,n){return new t(e,n)}},$=v.create,T=class t extends s{entity;type;required;relationalColumn;foreignColumn;sourceEntity;constructor(e,n,a,i,r){super(),this.entity=e,this.type=n,this.required=r??false,this.relationalColumn=a,this.foreignColumn=i;}encodeMutation(e,n,a){if(e!=="set")throw new Error("Mutation type not implemented.");if(this.type==="many")throw new Error("Many not implemented.");return {value:n,_meta:{timestamp:a}}}mergeMutation(e,n,a){if(this.type==="many")throw new Error("Many not implemented.");return a&&a._meta.timestamp&&n._meta.timestamp&&a._meta.timestamp.localeCompare(n._meta.timestamp)>=0?[a,null]:[n,n]}getStorageFieldType(){return {type:"varchar",nullable:!this.required,references:`${this.entity.name}.${String(this.foreignColumn??this.relationalColumn??"id")}`}}toJSON(){return {entityName:this.entity.name,type:this.type,required:this.required,relationalColumn:this.relationalColumn,foreignColumn:this.foreignColumn}}static createOneFactory(){return (e,n,a)=>new t(e,"one",n,void 0,a??false)}static createManyFactory(){return (e,n,a)=>new t(e,"many",void 0,n,a??false)}},D=(t,e)=>({$type:"relations",objectName:t.name,relations:e({one:T.createOneFactory(),many:T.createManyFactory()})}),x=t=>{if(t)return Array.isArray(t.value)?t.value.map(e=>x(e)):typeof t.value!="object"||t.value===null||t.value instanceof Date?t.value:Object.fromEntries(Object.entries(t.value).map(([e,n])=>[e,x(n)]))},k=t=>Object.fromEntries(Object.entries(t).flatMap(([e,n])=>{if(n.$type==="relations")return [];let a=n,i=Object.values(t).find(r=>r.$type==="relations"&&r.objectName===n.name);return i&&(a=a.setRelations(i.relations)),[[a.name,a]]}));export{j as a,S as b,s as c,p as d,_ as e,l as f,V as g,E as h,C as i,d as j,F as k,m as l,q as m,v as n,$ as o,T as p,D as q,x as r,k as s};
|