tempest.games 0.1.28 → 0.1.29
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/CHANGELOG.md
CHANGED
|
@@ -79,7 +79,7 @@ ${F}`);let W=fS.join(this.baseDir,`${T}/${$}.output.json`);return JSON.parse(PT.
|
|
|
79
79
|
hash text NOT NULL,
|
|
80
80
|
created_at bigint
|
|
81
81
|
)
|
|
82
|
-
`;await $.execute(y`CREATE SCHEMA IF NOT EXISTS ${y.identifier(M)}`),await $.execute(F);let W=(await $.all(y`select id, hash, created_at from ${y.identifier(M)}.${y.identifier(f)} order by created_at desc limit 1`))[0];await $.transaction(async(A)=>{for await(let w of T)if(!W||Number(W.created_at)<w.folderMillis){for(let X of w.sql)await A.execute(y.raw(X));await A.execute(y`insert into ${y.identifier(M)}.${y.identifier(f)} ("hash", "created_at") values(${w.hash}, ${w.folderMillis})`)}})}escapeName(T){return`"${T}"`}escapeParam(T){return`$${T+1}`}escapeString(T){return`'${T.replace(/'/g,"''")}'`}buildWithCTE(T){if(!T?.length)return;let $=[y`with `];for(let[S,f]of T.entries())if($.push(y`${y.identifier(f._.alias)} as (${f._.sql})`),S<T.length-1)$.push(y`, `);return $.push(y` `),y.join($)}buildDeleteQuery({table:T,where:$,returning:S,withList:f}){let M=this.buildWithCTE(f),F=S?y` returning ${this.buildSelection(S,{isSingleTable:!0})}`:void 0,J=$?y` where ${$}`:void 0;return y`${M}delete from ${T}${J}${F}`}buildUpdateSet(T,$){let S=T[P.Symbol.Columns],f=Object.keys(S).filter((F)=>$[F]!==void 0||S[F]?.onUpdateFn!==void 0),M=f.length;return y.join(f.flatMap((F,J)=>{let W=S[F],A=$[F]??y.param(W.onUpdateFn(),W),w=y`${y.identifier(this.casing.getColumnCasing(W))} = ${A}`;if(J<M-1)return[w,y.raw(", ")];return[w]}))}buildUpdateQuery({table:T,set:$,where:S,returning:f,withList:M,from:F,joins:J}){let W=this.buildWithCTE(M),A=T[J$.Symbol.Name],w=T[J$.Symbol.Schema],X=T[J$.Symbol.OriginalName],Y=A===X?void 0:A,k=y`${w?y`${y.identifier(w)}.`:void 0}${y.identifier(X)}${Y&&y` ${y.identifier(Y)}`}`,R=this.buildUpdateSet(T,$),z=F&&y.join([y.raw(" from "),this.buildFromTable(F)]),Q=this.buildJoins(J),D=f?y` returning ${this.buildSelection(f,{isSingleTable:!F})}`:void 0,N=S?y` where ${S}`:void 0;return y`${W}update ${k} set ${R}${z}${Q}${N}${D}`}buildSelection(T,{isSingleTable:$=!1}={}){let S=T.length,f=T.flatMap(({field:M},F)=>{let J=[];if(U(M,c.Aliased)&&M.isSelectionField)J.push(y.identifier(M.fieldAlias));else if(U(M,c.Aliased)||U(M,c)){let W=U(M,c.Aliased)?M.sql:M;if($)J.push(new c(W.queryChunks.map((A)=>{if(U(A,b))return y.identifier(this.casing.getColumnCasing(A));return A})));else J.push(W);if(U(M,c.Aliased))J.push(y` as ${y.identifier(M.fieldAlias)}`)}else if(U(M,ET))if($)J.push(y.identifier(this.casing.getColumnCasing(M)));else J.push(M);if(F<S-1)J.push(y`, `);return J});return y.join(f)}buildJoins(T){if(!T||T.length===0)return;let $=[];for(let[S,f]of T.entries()){if(S===0)$.push(y` `);let M=f.table,F=f.lateral?y` lateral`:void 0;if(U(M,J$)){let J=M[J$.Symbol.Name],W=M[J$.Symbol.Schema],A=M[J$.Symbol.OriginalName],w=J===A?void 0:f.alias;$.push(y`${y.raw(f.joinType)} join${F} ${W?y`${y.identifier(W)}.`:void 0}${y.identifier(A)}${w&&y` ${y.identifier(w)}`} on ${f.on}`)}else if(U(M,B$)){let J=M[LT].name,W=M[LT].schema,A=M[LT].originalName,w=J===A?void 0:f.alias;$.push(y`${y.raw(f.joinType)} join${F} ${W?y`${y.identifier(W)}.`:void 0}${y.identifier(A)}${w&&y` ${y.identifier(w)}`} on ${f.on}`)}else $.push(y`${y.raw(f.joinType)} join${F} ${M} on ${f.on}`);if(S<T.length-1)$.push(y` `)}return y.join($)}buildFromTable(T){if(U(T,P)&&T[P.Symbol.OriginalName]!==T[P.Symbol.Name]){let $=y`${y.identifier(T[P.Symbol.OriginalName])}`;if(T[P.Symbol.Schema])$=y`${y.identifier(T[P.Symbol.Schema])}.${$}`;return y`${$} ${y.identifier(T[P.Symbol.Name])}`}return T}buildSelectQuery({withList:T,fields:$,fieldsFlat:S,where:f,having:M,table:F,joins:J,orderBy:W,groupBy:A,limit:w,offset:X,lockingClause:Y,distinct:k,setOperators:R}){let z=S??g$($);for(let u of z)if(U(u.field,ET)&&$$(u.field.table)!==(U(F,sT)?F._.alias:U(F,tF)?F[LT].name:U(F,c)?void 0:$$(F))&&!((yT)=>J?.some(({alias:zT})=>zT===(yT[P.Symbol.IsAlias]?$$(yT):yT[P.Symbol.BaseName])))(u.field.table)){let yT=$$(u.field.table);throw new Error(`Your "${u.path.join("->")}" field references a column "${yT}"."${u.field.name}", but the table "${yT}" is not part of the query! Did you forget to join it?`)}let Q=!J||J.length===0,D=this.buildWithCTE(T),N;if(k)N=k===!0?y` distinct`:y` distinct on (${y.join(k.on,y`, `)})`;let V=this.buildSelection(z,{isSingleTable:Q}),L=this.buildFromTable(F),Z=this.buildJoins(J),_=f?y` where ${f}`:void 0,E=M?y` having ${M}`:void 0,B;if(W&&W.length>0)B=y` order by ${y.join(W,y`, `)}`;let q;if(A&&A.length>0)q=y` group by ${y.join(A,y`, `)}`;let v=typeof w==="object"||typeof w==="number"&&w>=0?y` limit ${w}`:void 0,G=X?y` offset ${X}`:void 0,o=y.empty();if(Y){let u=y` for ${y.raw(Y.strength)}`;if(Y.config.of)u.append(y` of ${y.join(Array.isArray(Y.config.of)?Y.config.of:[Y.config.of],y`, `)}`);if(Y.config.noWait)u.append(y` no wait`);else if(Y.config.skipLocked)u.append(y` skip locked`);o.append(u)}let n=y`${D}select${N} ${V} from ${L}${Z}${_}${q}${E}${B}${v}${G}${o}`;if(R.length>0)return this.buildSetOperations(n,R);return n}buildSetOperations(T,$){let[S,...f]=$;if(!S)throw new Error("Cannot pass undefined values to any set operator");if(f.length===0)return this.buildSetOperationQuery({leftSelect:T,setOperator:S});return this.buildSetOperations(this.buildSetOperationQuery({leftSelect:T,setOperator:S}),f)}buildSetOperationQuery({leftSelect:T,setOperator:{type:$,isAll:S,rightSelect:f,limit:M,orderBy:F,offset:J}}){let W=y`(${T.getSQL()}) `,A=y`(${f.getSQL()})`,w;if(F&&F.length>0){let R=[];for(let z of F)if(U(z,b))R.push(y.identifier(z.name));else if(U(z,c)){for(let Q=0;Q<z.queryChunks.length;Q++){let D=z.queryChunks[Q];if(U(D,b))z.queryChunks[Q]=y.identifier(D.name)}R.push(y`${z}`)}else R.push(y`${z}`);w=y` order by ${y.join(R,y`, `)} `}let X=typeof M==="object"||typeof M==="number"&&M>=0?y` limit ${M}`:void 0,Y=y.raw(`${$} ${S?"all ":""}`),k=J?y` offset ${J}`:void 0;return y`${W}${Y}${A}${w}${X}${k}`}buildInsertQuery({table:T,values:$,onConflict:S,returning:f,withList:M,select:F,overridingSystemValue_:J}){let W=[],A=T[P.Symbol.Columns],w=Object.entries(A).filter(([D,N])=>!N.shouldDisableInsert()),X=w.map(([,D])=>y.identifier(this.casing.getColumnCasing(D)));if(F){let D=$;if(U(D,c))W.push(D);else W.push(D.getSQL())}else{let D=$;W.push(y.raw("values "));for(let[N,V]of D.entries()){let L=[];for(let[Z,_]of w){let E=V[Z];if(E===void 0||U(E,q$)&&E.value===void 0)if(_.defaultFn!==void 0){let B=_.defaultFn(),q=U(B,c)?B:y.param(B,_);L.push(q)}else if(!_.default&&_.onUpdateFn!==void 0){let B=_.onUpdateFn(),q=U(B,c)?B:y.param(B,_);L.push(q)}else L.push(y`default`);else L.push(E)}if(W.push(L),N<D.length-1)W.push(y`, `)}}let Y=this.buildWithCTE(M),k=y.join(W),R=f?y` returning ${this.buildSelection(f,{isSingleTable:!0})}`:void 0,z=S?y` on conflict ${S}`:void 0,Q=J===!0?y`overriding system value `:void 0;return y`${Y}insert into ${T} ${X} ${Q}${k}${z}${R}`}buildRefreshMaterializedViewQuery({view:T,concurrently:$,withNoData:S}){let f=$?y` concurrently`:void 0,M=S?y` with no data`:void 0;return y`refresh materialized view${f} ${T}${M}`}prepareTyping(T){if(U(T,KW)||U(T,kW))return"json";else if(U(T,OW))return"decimal";else if(U(T,yW))return"time";else if(U(T,GW)||U(T,RW))return"timestamp";else if(U(T,wW)||U(T,XW))return"date";else if(U(T,zW))return"uuid";else return"none"}sqlToQuery(T,$){return T.toQuery({casing:this.casing,escapeName:this.escapeName,escapeParam:this.escapeParam,escapeString:this.escapeString,prepareTyping:this.prepareTyping,invokeSource:$})}buildRelationalQueryWithoutPK({fullSchema:T,schema:$,tableNamesMap:S,table:f,tableConfig:M,queryConfig:F,tableAlias:J,nestedQueryRelation:W,joinOn:A}){let w=[],X,Y,k=[],R,z=[];if(F===!0)w=Object.entries(M.columns).map(([N,V])=>({dbKey:V.name,tsKey:N,field:OS(V,J),relationTableTsKey:void 0,isJson:!1,selection:[]}));else{let D=Object.fromEntries(Object.entries(M.columns).map(([E,B])=>[E,OS(B,J)]));if(F.where){let E=typeof F.where==="function"?F.where(D,i4()):F.where;R=E&&ZF(E,J)}let N=[],V=[];if(F.columns){let E=!1;for(let[B,q]of Object.entries(F.columns)){if(q===void 0)continue;if(B in M.columns){if(!E&&q===!0)E=!0;V.push(B)}}if(V.length>0)V=E?V.filter((B)=>F.columns?.[B]===!0):Object.keys(M.columns).filter((B)=>!V.includes(B))}else V=Object.keys(M.columns);for(let E of V){let B=M.columns[E];N.push({tsKey:E,value:B})}let L=[];if(F.with)L=Object.entries(F.with).filter((E)=>!!E[1]).map(([E,B])=>({tsKey:E,queryConfig:B,relation:M.relations[E]}));let Z;if(F.extras){Z=typeof F.extras==="function"?F.extras(D,{sql:y}):F.extras;for(let[E,B]of Object.entries(Z))N.push({tsKey:E,value:L1(B,J)})}for(let{tsKey:E,value:B}of N)w.push({dbKey:U(B,c.Aliased)?B.fieldAlias:M.columns[E].name,tsKey:E,field:U(B,ET)?OS(B,J):B,relationTableTsKey:void 0,isJson:!1,selection:[]});let _=typeof F.orderBy==="function"?F.orderBy(D,u4()):F.orderBy??[];if(!Array.isArray(_))_=[_];k=_.map((E)=>{if(U(E,ET))return OS(E,J);return ZF(E,J)}),X=F.limit,Y=F.offset;for(let{tsKey:E,queryConfig:B,relation:q}of L){let v=l4($,S,q),G=Ef(q.referencedTable),o=S[G],n=`${J}_${E}`,u=bF(...v.fields.map((E$,GS)=>JW(OS(v.references[GS],n),OS(E$,J)))),yT=this.buildRelationalQueryWithoutPK({fullSchema:T,schema:$,tableNamesMap:S,table:T[o],tableConfig:$[o],queryConfig:U(q,sS)?B===!0?{limit:1}:{...B,limit:1}:B,tableAlias:n,joinOn:u,nestedQueryRelation:q}),zT=y`${y.identifier(n)}.${y.identifier("data")}`.as(E);z.push({on:y`true`,table:new sT(yT.sql,{},n),alias:n,joinType:"left",lateral:!0}),w.push({dbKey:E,tsKey:E,field:zT,relationTableTsKey:o,isJson:!0,selection:yT.selection})}}if(w.length===0)throw new FW({message:`No fields selected for table "${M.tsName}" ("${J}")`});let Q;if(R=bF(A,R),W){let D=y`json_build_array(${y.join(w.map(({field:L,tsKey:Z,isJson:_})=>_?y`${y.identifier(`${J}_${Z}`)}.${y.identifier("data")}`:U(L,c.Aliased)?L.sql:L),y`, `)})`;if(U(W,vF))D=y`coalesce(json_agg(${D}${k.length>0?y` order by ${y.join(k,y`, `)}`:void 0}), '[]'::json)`;let N=[{dbKey:"data",tsKey:"data",field:D.as("data"),isJson:!0,relationTableTsKey:M.tsName,selection:w}];if(X!==void 0||Y!==void 0||k.length>0)Q=this.buildSelectQuery({table:MW(f,J),fields:{},fieldsFlat:[{path:[],field:y.raw("*")}],where:R,limit:X,offset:Y,orderBy:k,setOperators:[]}),R=void 0,X=void 0,Y=void 0,k=[];else Q=MW(f,J);Q=this.buildSelectQuery({table:U(Q,J$)?Q:new sT(Q,{},J),fields:{},fieldsFlat:N.map(({field:L})=>({path:[],field:U(L,ET)?OS(L,J):L})),joins:z,where:R,limit:X,offset:Y,orderBy:k,setOperators:[]})}else Q=this.buildSelectQuery({table:MW(f,J),fields:{},fieldsFlat:w.map(({field:D})=>({path:[],field:U(D,ET)?OS(D,J):D})),joins:z,where:R,limit:X,offset:Y,orderBy:k,setOperators:[]});return{tableTsKey:M.tsName,sql:Q,selection:w}}}class e1{static[O]="TypedQueryBuilder";getSelectedFields(){return this._.selectedFields}}class _${static[O]="PgSelectBuilder";fields;session;dialect;withList=[];distinct;constructor(T){if(this.fields=T.fields,this.session=T.session,this.dialect=T.dialect,T.withList)this.withList=T.withList;this.distinct=T.distinct}authToken;setToken(T){return this.authToken=T,this}from(T){let $=!!this.fields,S=T,f;if(this.fields)f=this.fields;else if(U(S,sT))f=Object.fromEntries(Object.keys(S._.selectedFields).map((M)=>[M,S[M]]));else if(U(S,tF))f=S[LT].selectedFields;else if(U(S,c))f={};else f=rX(S);return new TA({table:S,fields:f,isPartialSelect:$,session:this.session,dialect:this.dialect,withList:this.withList,distinct:this.distinct}).setToken(this.authToken)}}class RY extends e1{static[O]="PgSelectQueryBuilder";_;config;joinsNotNullableMap;tableName;isPartialSelect;session;dialect;constructor({table:T,fields:$,isPartialSelect:S,session:f,dialect:M,withList:F,distinct:J}){super();this.config={withList:F,table:T,fields:{...$},distinct:J,setOperators:[]},this.isPartialSelect=S,this.session=f,this.dialect=M,this._={selectedFields:$},this.tableName=xS(T),this.joinsNotNullableMap=typeof this.tableName==="string"?{[this.tableName]:!0}:{}}createJoin(T){return($,S)=>{let f=this.tableName,M=xS($);if(typeof M==="string"&&this.config.joins?.some((F)=>F.alias===M))throw new Error(`Alias "${M}" is already used in this query`);if(!this.isPartialSelect){if(Object.keys(this.joinsNotNullableMap).length===1&&typeof f==="string")this.config.fields={[f]:this.config.fields};if(typeof M==="string"&&!U($,c)){let F=U($,sT)?$._.selectedFields:U($,B$)?$[LT].selectedFields:$[P.Symbol.Columns];this.config.fields[M]=F}}if(typeof S==="function")S=S(new Proxy(this.config.fields,new nT({sqlAliasedBehavior:"sql",sqlBehavior:"sql"})));if(!this.config.joins)this.config.joins=[];if(this.config.joins.push({on:S,table:$,joinType:T,alias:M}),typeof M==="string")switch(T){case"left":{this.joinsNotNullableMap[M]=!1;break}case"right":{this.joinsNotNullableMap=Object.fromEntries(Object.entries(this.joinsNotNullableMap).map(([F])=>[F,!1])),this.joinsNotNullableMap[M]=!0;break}case"inner":{this.joinsNotNullableMap[M]=!0;break}case"full":{this.joinsNotNullableMap=Object.fromEntries(Object.entries(this.joinsNotNullableMap).map(([F])=>[F,!1])),this.joinsNotNullableMap[M]=!1;break}}return this}}leftJoin=this.createJoin("left");rightJoin=this.createJoin("right");innerJoin=this.createJoin("inner");fullJoin=this.createJoin("full");createSetOperator(T,$){return(S)=>{let f=typeof S==="function"?S(Oy()):S;if(!qF(this.getSelectedFields(),f.getSelectedFields()))throw new Error("Set operator error (union / intersect / except): selected fields are not the same or are in a different order");return this.config.setOperators.push({type:T,isAll:$,rightSelect:f}),this}}union=this.createSetOperator("union",!1);unionAll=this.createSetOperator("union",!0);intersect=this.createSetOperator("intersect",!1);intersectAll=this.createSetOperator("intersect",!0);except=this.createSetOperator("except",!1);exceptAll=this.createSetOperator("except",!0);addSetOperators(T){return this.config.setOperators.push(...T),this}where(T){if(typeof T==="function")T=T(new Proxy(this.config.fields,new nT({sqlAliasedBehavior:"sql",sqlBehavior:"sql"})));return this.config.where=T,this}having(T){if(typeof T==="function")T=T(new Proxy(this.config.fields,new nT({sqlAliasedBehavior:"sql",sqlBehavior:"sql"})));return this.config.having=T,this}groupBy(...T){if(typeof T[0]==="function"){let $=T[0](new Proxy(this.config.fields,new nT({sqlAliasedBehavior:"alias",sqlBehavior:"sql"})));this.config.groupBy=Array.isArray($)?$:[$]}else this.config.groupBy=T;return this}orderBy(...T){if(typeof T[0]==="function"){let $=T[0](new Proxy(this.config.fields,new nT({sqlAliasedBehavior:"alias",sqlBehavior:"sql"}))),S=Array.isArray($)?$:[$];if(this.config.setOperators.length>0)this.config.setOperators.at(-1).orderBy=S;else this.config.orderBy=S}else{let $=T;if(this.config.setOperators.length>0)this.config.setOperators.at(-1).orderBy=$;else this.config.orderBy=$}return this}limit(T){if(this.config.setOperators.length>0)this.config.setOperators.at(-1).limit=T;else this.config.limit=T;return this}offset(T){if(this.config.setOperators.length>0)this.config.setOperators.at(-1).offset=T;else this.config.offset=T;return this}for(T,$={}){return this.config.lockingClause={strength:T,config:$},this}getSQL(){return this.dialect.buildSelectQuery(this.config)}toSQL(){let{typings:T,...$}=this.dialect.sqlToQuery(this.getSQL());return $}as(T){return new Proxy(new sT(this.getSQL(),this.config.fields,T),new nT({alias:T,sqlAliasedBehavior:"alias",sqlBehavior:"error"}))}getSelectedFields(){return new Proxy(this.config.fields,new nT({alias:this.tableName,sqlAliasedBehavior:"alias",sqlBehavior:"error"}))}$dynamic(){return this}}class TA extends RY{static[O]="PgSelect";_prepare(T){let{session:$,config:S,dialect:f,joinsNotNullableMap:M,authToken:F}=this;if(!$)throw new Error("Cannot execute a query on a query builder. Please use a database instance instead.");return QT.startActiveSpan("drizzle.prepareQuery",()=>{let J=g$(S.fields),W=$.prepareQuery(f.sqlToQuery(this.getSQL()),J,T,!0);return W.joinsNotNullableMap=M,W.setToken(F)})}prepare(T){return this._prepare(T)}authToken;setToken(T){return this.authToken=T,this}execute=(T)=>{return QT.startActiveSpan("drizzle.operation",()=>{return this._prepare().execute(T,this.authToken)})}}lX(TA,[D$]);function VM(T,$){return(S,f,...M)=>{let F=[f,...M].map((J)=>({type:T,isAll:$,rightSelect:J}));for(let J of F)if(!qF(S.getSelectedFields(),J.rightSelect.getSelectedFields()))throw new Error("Set operator error (union / intersect / except): selected fields are not the same or are in a different order");return S.addSetOperators(F)}}var Oy=()=>({union:yy,unionAll:Gy,intersect:Ry,intersectAll:zy,except:Hy,exceptAll:Dy}),yy=VM("union",!1),Gy=VM("union",!0),Ry=VM("intersect",!1),zy=VM("intersect",!0),Hy=VM("except",!1),Dy=VM("except",!0);class pF{static[O]="PgQueryBuilder";dialect;dialectConfig;constructor(T){this.dialect=U(T,Lf)?T:void 0,this.dialectConfig=U(T,Lf)?void 0:T}$with=(T,$)=>{let S=this;return{as:(M)=>{if(typeof M==="function")M=M(S);return new Proxy(new IF(M.getSQL(),$??("getSelectedFields"in M?M.getSelectedFields()??{}:{}),T,!0),new nT({alias:T,sqlAliasedBehavior:"alias",sqlBehavior:"error"}))}}};with(...T){let $=this;function S(F){return new _$({fields:F??void 0,session:void 0,dialect:$.getDialect(),withList:T})}function f(F){return new _$({fields:F??void 0,session:void 0,dialect:$.getDialect(),distinct:!0})}function M(F,J){return new _$({fields:J??void 0,session:void 0,dialect:$.getDialect(),distinct:{on:F}})}return{select:S,selectDistinct:f,selectDistinctOn:M}}select(T){return new _$({fields:T??void 0,session:void 0,dialect:this.getDialect()})}selectDistinct(T){return new _$({fields:T??void 0,session:void 0,dialect:this.getDialect(),distinct:!0})}selectDistinctOn(T,$){return new _$({fields:$??void 0,session:void 0,dialect:this.getDialect(),distinct:{on:T}})}getDialect(){if(!this.dialect)this.dialect=new Lf(this.dialectConfig);return this.dialect}}class xW{constructor(T,$,S,f,M){this.table=T,this.session=$,this.dialect=S,this.withList=f,this.overridingSystemValue_=M}static[O]="PgInsertBuilder";authToken;setToken(T){return this.authToken=T,this}overridingSystemValue(){return this.overridingSystemValue_=!0,this}values(T){if(T=Array.isArray(T)?T:[T],T.length===0)throw new Error("values() must be called with at least one value");let $=T.map((S)=>{let f={},M=this.table[P.Symbol.Columns];for(let F of Object.keys(S)){let J=S[F];f[F]=U(J,c)?J:new q$(J,M[F])}return f});return new $A(this.table,$,this.session,this.dialect,this.withList,!1,this.overridingSystemValue_).setToken(this.authToken)}select(T){let $=typeof T==="function"?T(new pF):T;if(!U($,c)&&!qF(this.table[SW],$._.selectedFields))throw new Error("Insert select error: selected fields are not the same or are in a different order compared to the table definition");return new $A(this.table,$,this.session,this.dialect,this.withList,!0)}}class $A extends D${constructor(T,$,S,f,M,F,J){super();this.session=S,this.dialect=f,this.config={table:T,values:$,withList:M,select:F,overridingSystemValue_:J}}static[O]="PgInsert";config;returning(T=this.config.table[P.Symbol.Columns]){return this.config.returningFields=T,this.config.returning=g$(T),this}onConflictDoNothing(T={}){if(T.target===void 0)this.config.onConflict=y`do nothing`;else{let $="";$=Array.isArray(T.target)?T.target.map((f)=>this.dialect.escapeName(this.dialect.casing.getColumnCasing(f))).join(","):this.dialect.escapeName(this.dialect.casing.getColumnCasing(T.target));let S=T.where?y` where ${T.where}`:void 0;this.config.onConflict=y`(${y.raw($)})${S} do nothing`}return this}onConflictDoUpdate(T){if(T.where&&(T.targetWhere||T.setWhere))throw new Error('You cannot use both "where" and "targetWhere"/"setWhere" at the same time - "where" is deprecated, use "targetWhere" or "setWhere" instead.');let $=T.where?y` where ${T.where}`:void 0,S=T.targetWhere?y` where ${T.targetWhere}`:void 0,f=T.setWhere?y` where ${T.setWhere}`:void 0,M=this.dialect.buildUpdateSet(this.config.table,AW(this.config.table,T.set)),F="";return F=Array.isArray(T.target)?T.target.map((J)=>this.dialect.escapeName(this.dialect.casing.getColumnCasing(J))).join(","):this.dialect.escapeName(this.dialect.casing.getColumnCasing(T.target)),this.config.onConflict=y`(${y.raw(F)})${S} do update set ${M}${$}${f}`,this}getSQL(){return this.dialect.buildInsertQuery(this.config)}toSQL(){let{typings:T,...$}=this.dialect.sqlToQuery(this.getSQL());return $}_prepare(T){return QT.startActiveSpan("drizzle.prepareQuery",()=>{return this.session.prepareQuery(this.dialect.sqlToQuery(this.getSQL()),this.config.returning,T,!0)})}prepare(T){return this._prepare(T)}authToken;setToken(T){return this.authToken=T,this}execute=(T)=>{return QT.startActiveSpan("drizzle.operation",()=>{return this._prepare().execute(T,this.authToken)})};getSelectedFields(){return this.config.returningFields?new Proxy(this.config.returningFields,new nT({alias:$$(this.config.table),sqlAliasedBehavior:"alias",sqlBehavior:"error"})):void 0}$dynamic(){return this}}class SA extends D${constructor(T,$,S){super();this.session=$,this.dialect=S,this.config={view:T}}static[O]="PgRefreshMaterializedView";config;concurrently(){if(this.config.withNoData!==void 0)throw new Error("Cannot use concurrently and withNoData together");return this.config.concurrently=!0,this}withNoData(){if(this.config.concurrently!==void 0)throw new Error("Cannot use concurrently and withNoData together");return this.config.withNoData=!0,this}getSQL(){return this.dialect.buildRefreshMaterializedViewQuery(this.config)}toSQL(){let{typings:T,...$}=this.dialect.sqlToQuery(this.getSQL());return $}_prepare(T){return QT.startActiveSpan("drizzle.prepareQuery",()=>{return this.session.prepareQuery(this.dialect.sqlToQuery(this.getSQL()),void 0,T,!0)})}prepare(T){return this._prepare(T)}authToken;setToken(T){return this.authToken=T,this}execute=(T)=>{return QT.startActiveSpan("drizzle.operation",()=>{return this._prepare().execute(T,this.authToken)})}}class ZW{constructor(T,$,S,f){this.table=T,this.session=$,this.dialect=S,this.withList=f}static[O]="PgUpdateBuilder";authToken;setToken(T){return this.authToken=T,this}set(T){return new zY(this.table,AW(this.table,T),this.session,this.dialect,this.withList).setToken(this.authToken)}}class zY extends D${constructor(T,$,S,f,M){super();this.session=S,this.dialect=f,this.config={set:$,table:T,withList:M,joins:[]},this.tableName=xS(T),this.joinsNotNullableMap=typeof this.tableName==="string"?{[this.tableName]:!0}:{}}static[O]="PgUpdate";config;tableName;joinsNotNullableMap;from(T){let $=T,S=xS($);if(typeof S==="string")this.joinsNotNullableMap[S]=!0;return this.config.from=$,this}getTableLikeFields(T){if(U(T,J$))return T[P.Symbol.Columns];else if(U(T,sT))return T._.selectedFields;return T[LT].selectedFields}createJoin(T){return($,S)=>{let f=xS($);if(typeof f==="string"&&this.config.joins.some((M)=>M.alias===f))throw new Error(`Alias "${f}" is already used in this query`);if(typeof S==="function"){let M=this.config.from&&!U(this.config.from,c)?this.getTableLikeFields(this.config.from):void 0;S=S(new Proxy(this.config.table[P.Symbol.Columns],new nT({sqlAliasedBehavior:"sql",sqlBehavior:"sql"})),M&&new Proxy(M,new nT({sqlAliasedBehavior:"sql",sqlBehavior:"sql"})))}if(this.config.joins.push({on:S,table:$,joinType:T,alias:f}),typeof f==="string")switch(T){case"left":{this.joinsNotNullableMap[f]=!1;break}case"right":{this.joinsNotNullableMap=Object.fromEntries(Object.entries(this.joinsNotNullableMap).map(([M])=>[M,!1])),this.joinsNotNullableMap[f]=!0;break}case"inner":{this.joinsNotNullableMap[f]=!0;break}case"full":{this.joinsNotNullableMap=Object.fromEntries(Object.entries(this.joinsNotNullableMap).map(([M])=>[M,!1])),this.joinsNotNullableMap[f]=!1;break}}return this}}leftJoin=this.createJoin("left");rightJoin=this.createJoin("right");innerJoin=this.createJoin("inner");fullJoin=this.createJoin("full");where(T){return this.config.where=T,this}returning(T){if(!T){if(T=Object.assign({},this.config.table[P.Symbol.Columns]),this.config.from){let $=xS(this.config.from);if(typeof $==="string"&&this.config.from&&!U(this.config.from,c)){let S=this.getTableLikeFields(this.config.from);T[$]=S}for(let S of this.config.joins){let f=xS(S.table);if(typeof f==="string"&&!U(S.table,c)){let M=this.getTableLikeFields(S.table);T[f]=M}}}}return this.config.returningFields=T,this.config.returning=g$(T),this}getSQL(){return this.dialect.buildUpdateQuery(this.config)}toSQL(){let{typings:T,...$}=this.dialect.sqlToQuery(this.getSQL());return $}_prepare(T){let $=this.session.prepareQuery(this.dialect.sqlToQuery(this.getSQL()),this.config.returning,T,!0);return $.joinsNotNullableMap=this.joinsNotNullableMap,$}prepare(T){return this._prepare(T)}authToken;setToken(T){return this.authToken=T,this}execute=(T)=>{return this._prepare().execute(T,this.authToken)};getSelectedFields(){return this.config.returningFields?new Proxy(this.config.returningFields,new nT({alias:$$(this.config.table),sqlAliasedBehavior:"alias",sqlBehavior:"error"})):void 0}$dynamic(){return this}}class iF extends c{constructor(T){super(iF.buildEmbeddedCount(T.source,T.filters).queryChunks);this.params=T,this.mapWith(Number),this.session=T.session,this.sql=iF.buildCount(T.source,T.filters)}sql;token;static[O]="PgCountBuilder";[Symbol.toStringTag]="PgCountBuilder";session;static buildEmbeddedCount(T,$){return y`(select count(*) from ${T}${y.raw(" where ").if($)}${$})`}static buildCount(T,$){return y`select count(*) as count from ${T}${y.raw(" where ").if($)}${$};`}setToken(T){return this.token=T,this}then(T,$){return Promise.resolve(this.session.count(this.sql,this.token)).then(T,$)}catch(T){return this.then(void 0,T)}finally(T){return this.then(($)=>{return T?.(),$},($)=>{throw T?.(),$})}}class MA{constructor(T,$,S,f,M,F,J){this.fullSchema=T,this.schema=$,this.tableNamesMap=S,this.table=f,this.tableConfig=M,this.dialect=F,this.session=J}static[O]="PgRelationalQueryBuilder";findMany(T){return new fA(this.fullSchema,this.schema,this.tableNamesMap,this.table,this.tableConfig,this.dialect,this.session,T?T:{},"many")}findFirst(T){return new fA(this.fullSchema,this.schema,this.tableNamesMap,this.table,this.tableConfig,this.dialect,this.session,T?{...T,limit:1}:{limit:1},"first")}}class fA extends D${constructor(T,$,S,f,M,F,J,W,A){super();this.fullSchema=T,this.schema=$,this.tableNamesMap=S,this.table=f,this.tableConfig=M,this.dialect=F,this.session=J,this.config=W,this.mode=A}static[O]="PgRelationalQuery";_prepare(T){return QT.startActiveSpan("drizzle.prepareQuery",()=>{let{query:$,builtQuery:S}=this._toSQL();return this.session.prepareQuery(S,void 0,T,!0,(f,M)=>{let F=f.map((J)=>HW(this.schema,this.tableConfig,J,$.selection,M));if(this.mode==="first")return F[0];return F})})}prepare(T){return this._prepare(T)}_getQuery(){return this.dialect.buildRelationalQueryWithoutPK({fullSchema:this.fullSchema,schema:this.schema,tableNamesMap:this.tableNamesMap,table:this.table,tableConfig:this.tableConfig,queryConfig:this.config,tableAlias:this.tableConfig.tsName})}getSQL(){return this._getQuery().sql}_toSQL(){let T=this._getQuery(),$=this.dialect.sqlToQuery(T.sql);return{query:T,builtQuery:$}}toSQL(){return this._toSQL().builtQuery}authToken;setToken(T){return this.authToken=T,this}execute(){return QT.startActiveSpan("drizzle.operation",()=>{return this._prepare().execute(void 0,this.authToken)})}}class FA extends D${constructor(T,$,S,f){super();this.execute=T,this.sql=$,this.query=S,this.mapBatchResult=f}static[O]="PgRaw";getSQL(){return this.sql}getQuery(){return this.query}mapResult(T,$){return $?this.mapBatchResult(T):T}_prepare(){return this}isResponseInArrayMode(){return!1}}class uF{constructor(T,$,S){if(this.dialect=T,this.session=$,this._=S?{schema:S.schema,fullSchema:S.fullSchema,tableNamesMap:S.tableNamesMap,session:$}:{schema:void 0,fullSchema:{},tableNamesMap:{},session:$},this.query={},this._.schema)for(let[f,M]of Object.entries(this._.schema))this.query[f]=new MA(S.fullSchema,this._.schema,this._.tableNamesMap,S.fullSchema[f],M,T,$)}static[O]="PgDatabase";query;$with=(T,$)=>{let S=this;return{as:(M)=>{if(typeof M==="function")M=M(new pF(S.dialect));return new Proxy(new IF(M.getSQL(),$??("getSelectedFields"in M?M.getSelectedFields()??{}:{}),T,!0),new nT({alias:T,sqlAliasedBehavior:"alias",sqlBehavior:"error"}))}}};$count(T,$){return new iF({source:T,filters:$,session:this.session})}with(...T){let $=this;function S(A){return new _$({fields:A??void 0,session:$.session,dialect:$.dialect,withList:T})}function f(A){return new _$({fields:A??void 0,session:$.session,dialect:$.dialect,withList:T,distinct:!0})}function M(A,w){return new _$({fields:w??void 0,session:$.session,dialect:$.dialect,withList:T,distinct:{on:A}})}function F(A){return new ZW(A,$.session,$.dialect,T)}function J(A){return new xW(A,$.session,$.dialect,T)}function W(A){return new jW(A,$.session,$.dialect,T)}return{select:S,selectDistinct:f,selectDistinctOn:M,update:F,insert:J,delete:W}}select(T){return new _$({fields:T??void 0,session:this.session,dialect:this.dialect})}selectDistinct(T){return new _$({fields:T??void 0,session:this.session,dialect:this.dialect,distinct:!0})}selectDistinctOn(T,$){return new _$({fields:$??void 0,session:this.session,dialect:this.dialect,distinct:{on:T}})}update(T){return new ZW(T,this.session,this.dialect)}insert(T){return new xW(T,this.session,this.dialect)}delete(T){return new jW(T,this.session,this.dialect)}refreshMaterializedView(T){return new SA(T,this.session,this.dialect)}authToken;execute(T){let $=typeof T==="string"?y.raw(T):T.getSQL(),S=this.dialect.sqlToQuery($),f=this.session.prepareQuery(S,void 0,void 0,!1);return new FA(()=>f.execute(void 0,this.authToken),$,S,(M)=>f.mapResult(M,!0))}transaction(T,$){return this.session.transaction(T,$)}}class HY{constructor(T,$){this.unique=T,this.name=$}static[O]="PgIndexBuilderOn";on(...T){return new bW(T.map(($)=>{if(U($,c))return $;$=$;let S=new CF($.name,!!$.keyAsName,$.columnType,$.indexConfig);return $.indexConfig=JSON.parse(JSON.stringify($.defaultConfig)),S}),this.unique,!1,this.name)}onOnly(...T){return new bW(T.map(($)=>{if(U($,c))return $;$=$;let S=new CF($.name,!!$.keyAsName,$.columnType,$.indexConfig);return $.indexConfig=$.defaultConfig,S}),this.unique,!0,this.name)}using(T,...$){return new bW($.map((S)=>{if(U(S,c))return S;S=S;let f=new CF(S.name,!!S.keyAsName,S.columnType,S.indexConfig);return S.indexConfig=JSON.parse(JSON.stringify(S.defaultConfig)),f}),this.unique,!0,this.name,T)}}class bW{static[O]="PgIndexBuilder";config;constructor(T,$,S,f,M="btree"){this.config={name:f,columns:T,unique:$,only:S,method:M}}concurrently(){return this.config.concurrently=!0,this}with(T){return this.config.with=T,this}where(T){return this.config.where=T,this}build(T){return new DY(this.config,T)}}class DY{static[O]="PgIndex";config;constructor(T,$){this.config={...T,table:$}}}function JA(T){return new HY(!0,T)}class WA{constructor(T){this.query=T}authToken;getQuery(){return this.query}mapResult(T,$){return T}setToken(T){return this.authToken=T,this}static[O]="PgPreparedQuery";joinsNotNullableMap}class AA{constructor(T){this.dialect=T}static[O]="PgSession";execute(T,$){return QT.startActiveSpan("drizzle.operation",()=>{return QT.startActiveSpan("drizzle.prepareQuery",()=>{return this.prepareQuery(this.dialect.sqlToQuery(T),void 0,void 0,!1)}).setToken($).execute(void 0,$)})}all(T){return this.prepareQuery(this.dialect.sqlToQuery(T),void 0,void 0,!1).all()}async count(T,$){let S=await this.execute(T,$);return Number(S[0].count)}}class wA extends uF{constructor(T,$,S,f=0){super(T,$,S);this.schema=S,this.nestedIndex=f}static[O]="PgTransaction";rollback(){throw new N1}getTransactionConfigSQL(T){let $=[];if(T.isolationLevel)$.push(`isolation level ${T.isolationLevel}`);if(T.accessMode)$.push(T.accessMode);if(typeof T.deferrable==="boolean")$.push(T.deferrable?"deferrable":"not deferrable");return y.raw($.join(" "))}setTransaction(T){return this.session.execute(y`set transaction ${this.getTransactionConfigSQL(T)}`)}}class _Y extends WA{constructor(T,$,S,f,M,F,J){super({sql:$,params:S});this.client=T,this.queryString=$,this.params=S,this.logger=f,this.fields=M,this._isResponseInArrayMode=F,this.customResultMapper=J}static[O]="PostgresJsPreparedQuery";async execute(T={}){return QT.startActiveSpan("drizzle.execute",async($)=>{let S=B1(this.params,T);$?.setAttributes({"drizzle.query.text":this.queryString,"drizzle.query.params":JSON.stringify(S)}),this.logger.logQuery(this.queryString,S);let{fields:f,queryString:M,client:F,joinsNotNullableMap:J,customResultMapper:W}=this;if(!f&&!W)return QT.startActiveSpan("drizzle.driver.execute",()=>{return F.unsafe(M,S)});let A=await QT.startActiveSpan("drizzle.driver.execute",()=>{return $?.setAttributes({"drizzle.query.text":M,"drizzle.query.params":JSON.stringify(S)}),F.unsafe(M,S).values()});return QT.startActiveSpan("drizzle.mapResponse",()=>{return W?W(A):A.map((w)=>dX(f,w,J))})})}all(T={}){return QT.startActiveSpan("drizzle.execute",async($)=>{let S=B1(this.params,T);return $?.setAttributes({"drizzle.query.text":this.queryString,"drizzle.query.params":JSON.stringify(S)}),this.logger.logQuery(this.queryString,S),QT.startActiveSpan("drizzle.driver.execute",()=>{return $?.setAttributes({"drizzle.query.text":this.queryString,"drizzle.query.params":JSON.stringify(S)}),this.client.unsafe(this.queryString,S)})})}isResponseInArrayMode(){return this._isResponseInArrayMode}}class dF extends AA{constructor(T,$,S,f={}){super($);this.client=T,this.schema=S,this.options=f,this.logger=f.logger??new I1}static[O]="PostgresJsSession";logger;prepareQuery(T,$,S,f,M){return new _Y(this.client,T.sql,T.params,this.logger,$,f,M)}query(T,$){return this.logger.logQuery(T,$),this.client.unsafe(T,$).values()}queryObjects(T,$){return this.client.unsafe(T,$)}transaction(T,$){return this.client.begin(async(S)=>{let f=new dF(S,this.dialect,this.schema,this.options),M=new XA(this.dialect,f,this.schema);if($)await M.setTransaction($);return T(M)})}}class XA extends wA{constructor(T,$,S,f=0){super(T,$,S,f);this.session=$}static[O]="PostgresJsTransaction";transaction(T){return this.session.client.savepoint(($)=>{let S=new dF($,this.dialect,this.schema,this.session.options),f=new XA(this.dialect,S,this.schema);return T(f)})}}class EY extends uF{static[O]="PostgresJsDatabase"}function BM(T,$={}){let S=(A)=>A;for(let A of["1184","1082","1083","1114"])T.options.parsers[A]=S,T.options.serializers[A]=S;T.options.serializers["114"]=S,T.options.serializers["3802"]=S;let f=new Lf({casing:$.casing}),M;if($.logger===!0)M=new C1;else if($.logger!==!1)M=$.logger;let F;if($.schema){let A=d4($.schema,r4);F={fullSchema:$.schema,schema:A.tables,tableNamesMap:A.tableNamesMap}}let J=new dF(T,f,F,{logger:M}),W=new EY(f,J,F);return W.$client=T,W}function qW(...T){if(typeof T[0]==="string"){let $=UM(T[0]);return BM($,T[1])}if(aX(T[0])){let{connection:$,client:S,...f}=T[0];if(S)return BM(S,f);if(typeof $==="object"&&$.url!==void 0){let{url:F,...J}=$,W=UM(F,J);return BM(W,f)}let M=UM($);return BM(M,f)}return BM(T[0],T[1])}((T)=>{function $(S){return BM({options:{parsers:{},serializers:{}}},S)}T.mock=$})(qW||(qW={}));function _y(T,$){let S={},f=[];for(let M in T){let F=T[M],J=$[M],W=F["~standard"].validate(J);if(W instanceof Promise)throw new Error(`Validation must be synchronous, but ${M} returned a Promise.`);if(W.issues){f.push(...W.issues.map((A)=>({...A,path:[M,...A.path??[]]})));continue}S[M]=W.value}if(f.length)return{issues:f};return{value:S}}function QY(T){let $=T.runtimeEnvStrict??T.runtimeEnv??process.env;if(T.emptyStringAsUndefined??!1){for(let[V,L]of Object.entries($))if(L==="")delete $[V]}if(!!T.skipValidation)return $;let M=typeof T.client==="object"?T.client:{},F=typeof T.server==="object"?T.server:{},J=typeof T.shared==="object"?T.shared:{},W=T.isServer??(typeof window==="undefined"||("Deno"in window)),A=W?{...F,...J,...M}:{...M,...J},w=_y(A,$),X=T.onValidationError??((V)=>{throw console.error("\u274C Invalid environment variables:",V),new Error("Invalid environment variables")}),Y=T.onInvalidAccess??(()=>{throw new Error("\u274C Attempted to access a server-side environment variable on the client")});if(w.issues)return X(w.issues);let k=(V)=>{if(!T.clientPrefix)return!0;return!V.startsWith(T.clientPrefix)&&!(V in J)},R=(V)=>{return W||!k(V)},z=(V)=>{return V==="__esModule"||V==="$$typeof"},Q=(T.extends??[]).reduce((V,L)=>{return Object.assign(V,L)},{}),D=Object.assign(w.value,Q);return new Proxy(D,{get(V,L){if(typeof L!=="string")return;if(z(L))return;if(!R(L))return Y(L);return Reflect.get(V,L)}})}var Ey="__vite_start_time"in globalThis,Qy=typeof window!=="undefined",dm="vitest"in globalThis,bS=QY({isServer:!Ey&&!Qy,server:{CI:_T.string().transform((T)=>!0).optional(),POSTGRES_USER:_T.string(),POSTGRES_PASSWORD:_T.string(),POSTGRES_DATABASE:_T.string(),POSTGRES_HOST:_T.string(),POSTGRES_PORT:_T.string().transform((T)=>Number.parseInt(T,10)),BACKEND_PORT:_T.string().transform((T)=>Number.parseInt(T,10)),RUN_WORKERS_FROM_SOURCE:_T.union([_T.literal("true"),_T.literal("false")]).optional().transform((T)=>T==="true"),FRONTEND_PORT:_T.string().transform((T)=>Number.parseInt(T,10)),FRONTEND_ORIGINS:_T.string().transform((T)=>JSON.parse(T)).pipe(_T.array(_T.string())),OPENAI_API_KEY:_T.string().optional()},clientPrefix:"VITE_",client:{VITE_BACKEND_ORIGIN:_T.string(),VITE_USE_SELF_SIGNED_CERTIFICATE:_T.union([_T.literal("true"),_T.literal("false")]).optional().transform((T)=>T==="true")},runtimeEnv:import.meta.env,emptyStringAsUndefined:!0});var kA={};bk(kA,{users:()=>Nf,userChanges:()=>Vy,untrackedUserColumnNames:()=>Uy,twoFactorMethod:()=>NY,trackedUserColumnName:()=>LY,trackableUserColumnNames:()=>BY,role:()=>VY,players:()=>YA,passwordResetAttempts:()=>Ly,loginHistory:()=>By,games:()=>mW,banishedIps:()=>hW});function UY(T){return y`lower(${T})`}var VY=TW("role",["admin","user"]),Nf=aS("users",{id:m$().primaryKey().defaultRandom(),username:F$({length:16}).notNull(),email:F$({length:254}).notNull(),hash:F$({length:64}).notNull(),salt:F$({length:36}).notNull(),createdAt:FS({withTimezone:!0}).notNull().defaultNow(),createdIp:F$({length:45}).notNull(),isActive:mF().notNull().default(!1),verifiedAt:FS({withTimezone:!0}),userRole:VY().default("user")},(T)=>[JA("usernameUniqueIndex").on(UY(T.username)),JA("emailUniqueIndex").on(UY(T.email))]),Uy=["id","createdAt","createdIp","isActive","salt","verifiedAt"],BY=["username","email","hash","userRole"],LY=TW("trackedUserColumnName",BY),Vy=aS("userChanges",{id:m$().primaryKey().defaultRandom(),userId:m$().notNull().references(()=>Nf.id),changedAt:FS({withTimezone:!0}).notNull().defaultNow(),changedIp:F$({length:45}).notNull(),changedColumn:LY().notNull(),oldValue:F$({length:255}),newValue:F$({length:255})}),mW=aS("games",{id:m$().primaryKey().defaultRandom()}),YA=aS("players",{userId:m$().notNull().references(()=>Nf.id),gameId:m$().notNull().references(()=>mW.id),score:YW().notNull()},(T)=>[g4({name:"players_userId_gameId_pk",columns:[T.userId,T.gameId]})]),By=aS("loginHistory",{id:m$().primaryKey().defaultRandom(),userId:m$().references(()=>Nf.id),loginTime:FS({withTimezone:!0}).notNull().defaultNow(),ipAddress:F$({length:45}).notNull(),userAgent:F$({length:1024}),successful:mF().notNull().default(!1)}),NY=TW("twoFactorMethod",["email","phone"]),Ly=aS("passwordResetAttempts",{id:m$().primaryKey().defaultRandom(),userId:m$().notNull().references(()=>Nf.id),requestedIp:F$({length:45}).notNull(),requestedAt:FS({withTimezone:!0}).notNull().defaultNow(),succeededIp:F$({length:45}),succeededAt:FS({withTimezone:!0}),verificationMethod:NY().notNull()}),hW=aS("banishedIps",{ip:F$({length:45}).primaryKey(),reason:F$({length:2048}).notNull(),banishedAt:FS({withTimezone:!0}).notNull().defaultNow(),banishedUntil:FS({withTimezone:!0})});var __dirname="/home/runner/work/wayforge/wayforge/apps/tempest.games/src/database";class KA{options;sql;drizzle;observers=new Map;async setupTriggersAndNotifications(){await this.sql.file(Ny.resolve(__dirname,"notify_update.sql"));let T=[$$(Nf),$$(mW),$$(YA)];await this.sql`SELECT create_notify_triggers(${this.sql.array(T)})`,await this.sql.listen("table_update",($)=>{let S=$.split(","),f=S[0],M=S[1],F=`${f}("${M}")`;if(this.observers.has(F))this.observers.get(F).next(F)})}constructor(T=!1,$={host:bS.POSTGRES_HOST,port:bS.POSTGRES_PORT,user:bS.POSTGRES_USER,password:bS.POSTGRES_PASSWORD,database:bS.POSTGRES_DATABASE}){this.options=$,this.sql=UM($),this.drizzle=qW(this.sql,{schema:kA,logger:T})}observe(T,$){if(!this.observers.has(T))this.observers.set(T,new fT);this.observers.get(T).subscribe("SINGLETON",$)}}import{resolve as jy}from"path";import{existsSync as OA,mkdirSync as CY,readdirSync as IY,readFileSync as Cy,rmSync as jY,statSync as xY,writeFileSync as Iy}from"fs";import{resolve as yA}from"path";class GA{rootDir;constructor(T){if(this.rootDir=T.path,!OA(this.rootDir))CY(this.rootDir,{recursive:!0})}getItem(T){let $=yA(this.rootDir,T);if(OA($))return Cy($,"utf-8");return null}setItem(T,$){let S=yA(this.rootDir,T);Iy(S,$)}removeItem(T){let $=yA(this.rootDir,T);if(OA($))jY($)}key(T){return IY(this.rootDir).sort((f,M)=>{let F=xY(f);return xY(M).ctimeMs-F.ctimeMs})[T]??null}clear(){jY(this.rootDir,{recursive:!0}),CY(this.rootDir,{recursive:!0})}get length(){return IY(this.rootDir).length}}var RA=new GA({path:jy(process.cwd(),"storage")});import*as vW from"fs";import*as ZY from"readline";function xy(T){let S=T.replace(":","T").replace(" ","").replace(/(\d{2})\/(\w{3})\/(\d{4})T(.+)/,(f,M,F,J,W)=>{let w={Jan:"01",Feb:"02",Mar:"03",Apr:"04",May:"05",Jun:"06",Jul:"07",Aug:"08",Sep:"09",Oct:"10",Nov:"11",Dec:"12"}[F];return`${J}-${w}-${M}T${W}`});return new Date(S)}async function bY(T,$="/var/log/nginx/access.log",S=new Date){let f=new Map;if(!vW.existsSync($))return T.error(`Log file not found: ${$}`),f;let M=vW.createReadStream($),F=ZY.createInterface({input:M,crlfDelay:Number.POSITIVE_INFINITY}),J=new Date(S.getTime()-3600000);return F.on("line",(W)=>{let A=/^(?<ip>\S+) \S+ \S+ \[(?<dateTime>.*?)\]/,w=W.match(A);if(w?.groups){let X=w.groups.ip,Y=w.groups.dateTime,k=xy(Y);if(!Number.isNaN(k.getTime())){if(k>=J&&k<=S){let R=f.get(X);if(!R)R=[],f.set(X,R);R.push(W)}}else T.error(`Failed to parse date: ${Y}`)}}),new Promise((W,A)=>{F.on("error",(w)=>{A(w)}),F.on("close",()=>{W(f)})})}var Zy=["Network security adjudicator, your job is to determine if an IP address should be banned.","The IP address in question created the following logs on our server today:","```nginx.log\n"].join(`
|
|
82
|
+
`;await $.execute(y`CREATE SCHEMA IF NOT EXISTS ${y.identifier(M)}`),await $.execute(F);let W=(await $.all(y`select id, hash, created_at from ${y.identifier(M)}.${y.identifier(f)} order by created_at desc limit 1`))[0];await $.transaction(async(A)=>{for await(let w of T)if(!W||Number(W.created_at)<w.folderMillis){for(let X of w.sql)await A.execute(y.raw(X));await A.execute(y`insert into ${y.identifier(M)}.${y.identifier(f)} ("hash", "created_at") values(${w.hash}, ${w.folderMillis})`)}})}escapeName(T){return`"${T}"`}escapeParam(T){return`$${T+1}`}escapeString(T){return`'${T.replace(/'/g,"''")}'`}buildWithCTE(T){if(!T?.length)return;let $=[y`with `];for(let[S,f]of T.entries())if($.push(y`${y.identifier(f._.alias)} as (${f._.sql})`),S<T.length-1)$.push(y`, `);return $.push(y` `),y.join($)}buildDeleteQuery({table:T,where:$,returning:S,withList:f}){let M=this.buildWithCTE(f),F=S?y` returning ${this.buildSelection(S,{isSingleTable:!0})}`:void 0,J=$?y` where ${$}`:void 0;return y`${M}delete from ${T}${J}${F}`}buildUpdateSet(T,$){let S=T[P.Symbol.Columns],f=Object.keys(S).filter((F)=>$[F]!==void 0||S[F]?.onUpdateFn!==void 0),M=f.length;return y.join(f.flatMap((F,J)=>{let W=S[F],A=$[F]??y.param(W.onUpdateFn(),W),w=y`${y.identifier(this.casing.getColumnCasing(W))} = ${A}`;if(J<M-1)return[w,y.raw(", ")];return[w]}))}buildUpdateQuery({table:T,set:$,where:S,returning:f,withList:M,from:F,joins:J}){let W=this.buildWithCTE(M),A=T[J$.Symbol.Name],w=T[J$.Symbol.Schema],X=T[J$.Symbol.OriginalName],Y=A===X?void 0:A,k=y`${w?y`${y.identifier(w)}.`:void 0}${y.identifier(X)}${Y&&y` ${y.identifier(Y)}`}`,R=this.buildUpdateSet(T,$),z=F&&y.join([y.raw(" from "),this.buildFromTable(F)]),Q=this.buildJoins(J),D=f?y` returning ${this.buildSelection(f,{isSingleTable:!F})}`:void 0,N=S?y` where ${S}`:void 0;return y`${W}update ${k} set ${R}${z}${Q}${N}${D}`}buildSelection(T,{isSingleTable:$=!1}={}){let S=T.length,f=T.flatMap(({field:M},F)=>{let J=[];if(U(M,c.Aliased)&&M.isSelectionField)J.push(y.identifier(M.fieldAlias));else if(U(M,c.Aliased)||U(M,c)){let W=U(M,c.Aliased)?M.sql:M;if($)J.push(new c(W.queryChunks.map((A)=>{if(U(A,b))return y.identifier(this.casing.getColumnCasing(A));return A})));else J.push(W);if(U(M,c.Aliased))J.push(y` as ${y.identifier(M.fieldAlias)}`)}else if(U(M,ET))if($)J.push(y.identifier(this.casing.getColumnCasing(M)));else J.push(M);if(F<S-1)J.push(y`, `);return J});return y.join(f)}buildJoins(T){if(!T||T.length===0)return;let $=[];for(let[S,f]of T.entries()){if(S===0)$.push(y` `);let M=f.table,F=f.lateral?y` lateral`:void 0;if(U(M,J$)){let J=M[J$.Symbol.Name],W=M[J$.Symbol.Schema],A=M[J$.Symbol.OriginalName],w=J===A?void 0:f.alias;$.push(y`${y.raw(f.joinType)} join${F} ${W?y`${y.identifier(W)}.`:void 0}${y.identifier(A)}${w&&y` ${y.identifier(w)}`} on ${f.on}`)}else if(U(M,B$)){let J=M[LT].name,W=M[LT].schema,A=M[LT].originalName,w=J===A?void 0:f.alias;$.push(y`${y.raw(f.joinType)} join${F} ${W?y`${y.identifier(W)}.`:void 0}${y.identifier(A)}${w&&y` ${y.identifier(w)}`} on ${f.on}`)}else $.push(y`${y.raw(f.joinType)} join${F} ${M} on ${f.on}`);if(S<T.length-1)$.push(y` `)}return y.join($)}buildFromTable(T){if(U(T,P)&&T[P.Symbol.OriginalName]!==T[P.Symbol.Name]){let $=y`${y.identifier(T[P.Symbol.OriginalName])}`;if(T[P.Symbol.Schema])$=y`${y.identifier(T[P.Symbol.Schema])}.${$}`;return y`${$} ${y.identifier(T[P.Symbol.Name])}`}return T}buildSelectQuery({withList:T,fields:$,fieldsFlat:S,where:f,having:M,table:F,joins:J,orderBy:W,groupBy:A,limit:w,offset:X,lockingClause:Y,distinct:k,setOperators:R}){let z=S??g$($);for(let u of z)if(U(u.field,ET)&&$$(u.field.table)!==(U(F,sT)?F._.alias:U(F,tF)?F[LT].name:U(F,c)?void 0:$$(F))&&!((yT)=>J?.some(({alias:zT})=>zT===(yT[P.Symbol.IsAlias]?$$(yT):yT[P.Symbol.BaseName])))(u.field.table)){let yT=$$(u.field.table);throw new Error(`Your "${u.path.join("->")}" field references a column "${yT}"."${u.field.name}", but the table "${yT}" is not part of the query! Did you forget to join it?`)}let Q=!J||J.length===0,D=this.buildWithCTE(T),N;if(k)N=k===!0?y` distinct`:y` distinct on (${y.join(k.on,y`, `)})`;let V=this.buildSelection(z,{isSingleTable:Q}),L=this.buildFromTable(F),Z=this.buildJoins(J),_=f?y` where ${f}`:void 0,E=M?y` having ${M}`:void 0,B;if(W&&W.length>0)B=y` order by ${y.join(W,y`, `)}`;let q;if(A&&A.length>0)q=y` group by ${y.join(A,y`, `)}`;let v=typeof w==="object"||typeof w==="number"&&w>=0?y` limit ${w}`:void 0,G=X?y` offset ${X}`:void 0,o=y.empty();if(Y){let u=y` for ${y.raw(Y.strength)}`;if(Y.config.of)u.append(y` of ${y.join(Array.isArray(Y.config.of)?Y.config.of:[Y.config.of],y`, `)}`);if(Y.config.noWait)u.append(y` no wait`);else if(Y.config.skipLocked)u.append(y` skip locked`);o.append(u)}let n=y`${D}select${N} ${V} from ${L}${Z}${_}${q}${E}${B}${v}${G}${o}`;if(R.length>0)return this.buildSetOperations(n,R);return n}buildSetOperations(T,$){let[S,...f]=$;if(!S)throw new Error("Cannot pass undefined values to any set operator");if(f.length===0)return this.buildSetOperationQuery({leftSelect:T,setOperator:S});return this.buildSetOperations(this.buildSetOperationQuery({leftSelect:T,setOperator:S}),f)}buildSetOperationQuery({leftSelect:T,setOperator:{type:$,isAll:S,rightSelect:f,limit:M,orderBy:F,offset:J}}){let W=y`(${T.getSQL()}) `,A=y`(${f.getSQL()})`,w;if(F&&F.length>0){let R=[];for(let z of F)if(U(z,b))R.push(y.identifier(z.name));else if(U(z,c)){for(let Q=0;Q<z.queryChunks.length;Q++){let D=z.queryChunks[Q];if(U(D,b))z.queryChunks[Q]=y.identifier(D.name)}R.push(y`${z}`)}else R.push(y`${z}`);w=y` order by ${y.join(R,y`, `)} `}let X=typeof M==="object"||typeof M==="number"&&M>=0?y` limit ${M}`:void 0,Y=y.raw(`${$} ${S?"all ":""}`),k=J?y` offset ${J}`:void 0;return y`${W}${Y}${A}${w}${X}${k}`}buildInsertQuery({table:T,values:$,onConflict:S,returning:f,withList:M,select:F,overridingSystemValue_:J}){let W=[],A=T[P.Symbol.Columns],w=Object.entries(A).filter(([D,N])=>!N.shouldDisableInsert()),X=w.map(([,D])=>y.identifier(this.casing.getColumnCasing(D)));if(F){let D=$;if(U(D,c))W.push(D);else W.push(D.getSQL())}else{let D=$;W.push(y.raw("values "));for(let[N,V]of D.entries()){let L=[];for(let[Z,_]of w){let E=V[Z];if(E===void 0||U(E,q$)&&E.value===void 0)if(_.defaultFn!==void 0){let B=_.defaultFn(),q=U(B,c)?B:y.param(B,_);L.push(q)}else if(!_.default&&_.onUpdateFn!==void 0){let B=_.onUpdateFn(),q=U(B,c)?B:y.param(B,_);L.push(q)}else L.push(y`default`);else L.push(E)}if(W.push(L),N<D.length-1)W.push(y`, `)}}let Y=this.buildWithCTE(M),k=y.join(W),R=f?y` returning ${this.buildSelection(f,{isSingleTable:!0})}`:void 0,z=S?y` on conflict ${S}`:void 0,Q=J===!0?y`overriding system value `:void 0;return y`${Y}insert into ${T} ${X} ${Q}${k}${z}${R}`}buildRefreshMaterializedViewQuery({view:T,concurrently:$,withNoData:S}){let f=$?y` concurrently`:void 0,M=S?y` with no data`:void 0;return y`refresh materialized view${f} ${T}${M}`}prepareTyping(T){if(U(T,KW)||U(T,kW))return"json";else if(U(T,OW))return"decimal";else if(U(T,yW))return"time";else if(U(T,GW)||U(T,RW))return"timestamp";else if(U(T,wW)||U(T,XW))return"date";else if(U(T,zW))return"uuid";else return"none"}sqlToQuery(T,$){return T.toQuery({casing:this.casing,escapeName:this.escapeName,escapeParam:this.escapeParam,escapeString:this.escapeString,prepareTyping:this.prepareTyping,invokeSource:$})}buildRelationalQueryWithoutPK({fullSchema:T,schema:$,tableNamesMap:S,table:f,tableConfig:M,queryConfig:F,tableAlias:J,nestedQueryRelation:W,joinOn:A}){let w=[],X,Y,k=[],R,z=[];if(F===!0)w=Object.entries(M.columns).map(([N,V])=>({dbKey:V.name,tsKey:N,field:OS(V,J),relationTableTsKey:void 0,isJson:!1,selection:[]}));else{let D=Object.fromEntries(Object.entries(M.columns).map(([E,B])=>[E,OS(B,J)]));if(F.where){let E=typeof F.where==="function"?F.where(D,i4()):F.where;R=E&&ZF(E,J)}let N=[],V=[];if(F.columns){let E=!1;for(let[B,q]of Object.entries(F.columns)){if(q===void 0)continue;if(B in M.columns){if(!E&&q===!0)E=!0;V.push(B)}}if(V.length>0)V=E?V.filter((B)=>F.columns?.[B]===!0):Object.keys(M.columns).filter((B)=>!V.includes(B))}else V=Object.keys(M.columns);for(let E of V){let B=M.columns[E];N.push({tsKey:E,value:B})}let L=[];if(F.with)L=Object.entries(F.with).filter((E)=>!!E[1]).map(([E,B])=>({tsKey:E,queryConfig:B,relation:M.relations[E]}));let Z;if(F.extras){Z=typeof F.extras==="function"?F.extras(D,{sql:y}):F.extras;for(let[E,B]of Object.entries(Z))N.push({tsKey:E,value:L1(B,J)})}for(let{tsKey:E,value:B}of N)w.push({dbKey:U(B,c.Aliased)?B.fieldAlias:M.columns[E].name,tsKey:E,field:U(B,ET)?OS(B,J):B,relationTableTsKey:void 0,isJson:!1,selection:[]});let _=typeof F.orderBy==="function"?F.orderBy(D,u4()):F.orderBy??[];if(!Array.isArray(_))_=[_];k=_.map((E)=>{if(U(E,ET))return OS(E,J);return ZF(E,J)}),X=F.limit,Y=F.offset;for(let{tsKey:E,queryConfig:B,relation:q}of L){let v=l4($,S,q),G=Ef(q.referencedTable),o=S[G],n=`${J}_${E}`,u=bF(...v.fields.map((E$,GS)=>JW(OS(v.references[GS],n),OS(E$,J)))),yT=this.buildRelationalQueryWithoutPK({fullSchema:T,schema:$,tableNamesMap:S,table:T[o],tableConfig:$[o],queryConfig:U(q,sS)?B===!0?{limit:1}:{...B,limit:1}:B,tableAlias:n,joinOn:u,nestedQueryRelation:q}),zT=y`${y.identifier(n)}.${y.identifier("data")}`.as(E);z.push({on:y`true`,table:new sT(yT.sql,{},n),alias:n,joinType:"left",lateral:!0}),w.push({dbKey:E,tsKey:E,field:zT,relationTableTsKey:o,isJson:!0,selection:yT.selection})}}if(w.length===0)throw new FW({message:`No fields selected for table "${M.tsName}" ("${J}")`});let Q;if(R=bF(A,R),W){let D=y`json_build_array(${y.join(w.map(({field:L,tsKey:Z,isJson:_})=>_?y`${y.identifier(`${J}_${Z}`)}.${y.identifier("data")}`:U(L,c.Aliased)?L.sql:L),y`, `)})`;if(U(W,vF))D=y`coalesce(json_agg(${D}${k.length>0?y` order by ${y.join(k,y`, `)}`:void 0}), '[]'::json)`;let N=[{dbKey:"data",tsKey:"data",field:D.as("data"),isJson:!0,relationTableTsKey:M.tsName,selection:w}];if(X!==void 0||Y!==void 0||k.length>0)Q=this.buildSelectQuery({table:MW(f,J),fields:{},fieldsFlat:[{path:[],field:y.raw("*")}],where:R,limit:X,offset:Y,orderBy:k,setOperators:[]}),R=void 0,X=void 0,Y=void 0,k=[];else Q=MW(f,J);Q=this.buildSelectQuery({table:U(Q,J$)?Q:new sT(Q,{},J),fields:{},fieldsFlat:N.map(({field:L})=>({path:[],field:U(L,ET)?OS(L,J):L})),joins:z,where:R,limit:X,offset:Y,orderBy:k,setOperators:[]})}else Q=this.buildSelectQuery({table:MW(f,J),fields:{},fieldsFlat:w.map(({field:D})=>({path:[],field:U(D,ET)?OS(D,J):D})),joins:z,where:R,limit:X,offset:Y,orderBy:k,setOperators:[]});return{tableTsKey:M.tsName,sql:Q,selection:w}}}class e1{static[O]="TypedQueryBuilder";getSelectedFields(){return this._.selectedFields}}class _${static[O]="PgSelectBuilder";fields;session;dialect;withList=[];distinct;constructor(T){if(this.fields=T.fields,this.session=T.session,this.dialect=T.dialect,T.withList)this.withList=T.withList;this.distinct=T.distinct}authToken;setToken(T){return this.authToken=T,this}from(T){let $=!!this.fields,S=T,f;if(this.fields)f=this.fields;else if(U(S,sT))f=Object.fromEntries(Object.keys(S._.selectedFields).map((M)=>[M,S[M]]));else if(U(S,tF))f=S[LT].selectedFields;else if(U(S,c))f={};else f=rX(S);return new TA({table:S,fields:f,isPartialSelect:$,session:this.session,dialect:this.dialect,withList:this.withList,distinct:this.distinct}).setToken(this.authToken)}}class RY extends e1{static[O]="PgSelectQueryBuilder";_;config;joinsNotNullableMap;tableName;isPartialSelect;session;dialect;constructor({table:T,fields:$,isPartialSelect:S,session:f,dialect:M,withList:F,distinct:J}){super();this.config={withList:F,table:T,fields:{...$},distinct:J,setOperators:[]},this.isPartialSelect=S,this.session=f,this.dialect=M,this._={selectedFields:$},this.tableName=xS(T),this.joinsNotNullableMap=typeof this.tableName==="string"?{[this.tableName]:!0}:{}}createJoin(T){return($,S)=>{let f=this.tableName,M=xS($);if(typeof M==="string"&&this.config.joins?.some((F)=>F.alias===M))throw new Error(`Alias "${M}" is already used in this query`);if(!this.isPartialSelect){if(Object.keys(this.joinsNotNullableMap).length===1&&typeof f==="string")this.config.fields={[f]:this.config.fields};if(typeof M==="string"&&!U($,c)){let F=U($,sT)?$._.selectedFields:U($,B$)?$[LT].selectedFields:$[P.Symbol.Columns];this.config.fields[M]=F}}if(typeof S==="function")S=S(new Proxy(this.config.fields,new nT({sqlAliasedBehavior:"sql",sqlBehavior:"sql"})));if(!this.config.joins)this.config.joins=[];if(this.config.joins.push({on:S,table:$,joinType:T,alias:M}),typeof M==="string")switch(T){case"left":{this.joinsNotNullableMap[M]=!1;break}case"right":{this.joinsNotNullableMap=Object.fromEntries(Object.entries(this.joinsNotNullableMap).map(([F])=>[F,!1])),this.joinsNotNullableMap[M]=!0;break}case"inner":{this.joinsNotNullableMap[M]=!0;break}case"full":{this.joinsNotNullableMap=Object.fromEntries(Object.entries(this.joinsNotNullableMap).map(([F])=>[F,!1])),this.joinsNotNullableMap[M]=!1;break}}return this}}leftJoin=this.createJoin("left");rightJoin=this.createJoin("right");innerJoin=this.createJoin("inner");fullJoin=this.createJoin("full");createSetOperator(T,$){return(S)=>{let f=typeof S==="function"?S(Oy()):S;if(!qF(this.getSelectedFields(),f.getSelectedFields()))throw new Error("Set operator error (union / intersect / except): selected fields are not the same or are in a different order");return this.config.setOperators.push({type:T,isAll:$,rightSelect:f}),this}}union=this.createSetOperator("union",!1);unionAll=this.createSetOperator("union",!0);intersect=this.createSetOperator("intersect",!1);intersectAll=this.createSetOperator("intersect",!0);except=this.createSetOperator("except",!1);exceptAll=this.createSetOperator("except",!0);addSetOperators(T){return this.config.setOperators.push(...T),this}where(T){if(typeof T==="function")T=T(new Proxy(this.config.fields,new nT({sqlAliasedBehavior:"sql",sqlBehavior:"sql"})));return this.config.where=T,this}having(T){if(typeof T==="function")T=T(new Proxy(this.config.fields,new nT({sqlAliasedBehavior:"sql",sqlBehavior:"sql"})));return this.config.having=T,this}groupBy(...T){if(typeof T[0]==="function"){let $=T[0](new Proxy(this.config.fields,new nT({sqlAliasedBehavior:"alias",sqlBehavior:"sql"})));this.config.groupBy=Array.isArray($)?$:[$]}else this.config.groupBy=T;return this}orderBy(...T){if(typeof T[0]==="function"){let $=T[0](new Proxy(this.config.fields,new nT({sqlAliasedBehavior:"alias",sqlBehavior:"sql"}))),S=Array.isArray($)?$:[$];if(this.config.setOperators.length>0)this.config.setOperators.at(-1).orderBy=S;else this.config.orderBy=S}else{let $=T;if(this.config.setOperators.length>0)this.config.setOperators.at(-1).orderBy=$;else this.config.orderBy=$}return this}limit(T){if(this.config.setOperators.length>0)this.config.setOperators.at(-1).limit=T;else this.config.limit=T;return this}offset(T){if(this.config.setOperators.length>0)this.config.setOperators.at(-1).offset=T;else this.config.offset=T;return this}for(T,$={}){return this.config.lockingClause={strength:T,config:$},this}getSQL(){return this.dialect.buildSelectQuery(this.config)}toSQL(){let{typings:T,...$}=this.dialect.sqlToQuery(this.getSQL());return $}as(T){return new Proxy(new sT(this.getSQL(),this.config.fields,T),new nT({alias:T,sqlAliasedBehavior:"alias",sqlBehavior:"error"}))}getSelectedFields(){return new Proxy(this.config.fields,new nT({alias:this.tableName,sqlAliasedBehavior:"alias",sqlBehavior:"error"}))}$dynamic(){return this}}class TA extends RY{static[O]="PgSelect";_prepare(T){let{session:$,config:S,dialect:f,joinsNotNullableMap:M,authToken:F}=this;if(!$)throw new Error("Cannot execute a query on a query builder. Please use a database instance instead.");return QT.startActiveSpan("drizzle.prepareQuery",()=>{let J=g$(S.fields),W=$.prepareQuery(f.sqlToQuery(this.getSQL()),J,T,!0);return W.joinsNotNullableMap=M,W.setToken(F)})}prepare(T){return this._prepare(T)}authToken;setToken(T){return this.authToken=T,this}execute=(T)=>{return QT.startActiveSpan("drizzle.operation",()=>{return this._prepare().execute(T,this.authToken)})}}lX(TA,[D$]);function VM(T,$){return(S,f,...M)=>{let F=[f,...M].map((J)=>({type:T,isAll:$,rightSelect:J}));for(let J of F)if(!qF(S.getSelectedFields(),J.rightSelect.getSelectedFields()))throw new Error("Set operator error (union / intersect / except): selected fields are not the same or are in a different order");return S.addSetOperators(F)}}var Oy=()=>({union:yy,unionAll:Gy,intersect:Ry,intersectAll:zy,except:Hy,exceptAll:Dy}),yy=VM("union",!1),Gy=VM("union",!0),Ry=VM("intersect",!1),zy=VM("intersect",!0),Hy=VM("except",!1),Dy=VM("except",!0);class pF{static[O]="PgQueryBuilder";dialect;dialectConfig;constructor(T){this.dialect=U(T,Lf)?T:void 0,this.dialectConfig=U(T,Lf)?void 0:T}$with=(T,$)=>{let S=this;return{as:(M)=>{if(typeof M==="function")M=M(S);return new Proxy(new IF(M.getSQL(),$??("getSelectedFields"in M?M.getSelectedFields()??{}:{}),T,!0),new nT({alias:T,sqlAliasedBehavior:"alias",sqlBehavior:"error"}))}}};with(...T){let $=this;function S(F){return new _$({fields:F??void 0,session:void 0,dialect:$.getDialect(),withList:T})}function f(F){return new _$({fields:F??void 0,session:void 0,dialect:$.getDialect(),distinct:!0})}function M(F,J){return new _$({fields:J??void 0,session:void 0,dialect:$.getDialect(),distinct:{on:F}})}return{select:S,selectDistinct:f,selectDistinctOn:M}}select(T){return new _$({fields:T??void 0,session:void 0,dialect:this.getDialect()})}selectDistinct(T){return new _$({fields:T??void 0,session:void 0,dialect:this.getDialect(),distinct:!0})}selectDistinctOn(T,$){return new _$({fields:$??void 0,session:void 0,dialect:this.getDialect(),distinct:{on:T}})}getDialect(){if(!this.dialect)this.dialect=new Lf(this.dialectConfig);return this.dialect}}class xW{constructor(T,$,S,f,M){this.table=T,this.session=$,this.dialect=S,this.withList=f,this.overridingSystemValue_=M}static[O]="PgInsertBuilder";authToken;setToken(T){return this.authToken=T,this}overridingSystemValue(){return this.overridingSystemValue_=!0,this}values(T){if(T=Array.isArray(T)?T:[T],T.length===0)throw new Error("values() must be called with at least one value");let $=T.map((S)=>{let f={},M=this.table[P.Symbol.Columns];for(let F of Object.keys(S)){let J=S[F];f[F]=U(J,c)?J:new q$(J,M[F])}return f});return new $A(this.table,$,this.session,this.dialect,this.withList,!1,this.overridingSystemValue_).setToken(this.authToken)}select(T){let $=typeof T==="function"?T(new pF):T;if(!U($,c)&&!qF(this.table[SW],$._.selectedFields))throw new Error("Insert select error: selected fields are not the same or are in a different order compared to the table definition");return new $A(this.table,$,this.session,this.dialect,this.withList,!0)}}class $A extends D${constructor(T,$,S,f,M,F,J){super();this.session=S,this.dialect=f,this.config={table:T,values:$,withList:M,select:F,overridingSystemValue_:J}}static[O]="PgInsert";config;returning(T=this.config.table[P.Symbol.Columns]){return this.config.returningFields=T,this.config.returning=g$(T),this}onConflictDoNothing(T={}){if(T.target===void 0)this.config.onConflict=y`do nothing`;else{let $="";$=Array.isArray(T.target)?T.target.map((f)=>this.dialect.escapeName(this.dialect.casing.getColumnCasing(f))).join(","):this.dialect.escapeName(this.dialect.casing.getColumnCasing(T.target));let S=T.where?y` where ${T.where}`:void 0;this.config.onConflict=y`(${y.raw($)})${S} do nothing`}return this}onConflictDoUpdate(T){if(T.where&&(T.targetWhere||T.setWhere))throw new Error('You cannot use both "where" and "targetWhere"/"setWhere" at the same time - "where" is deprecated, use "targetWhere" or "setWhere" instead.');let $=T.where?y` where ${T.where}`:void 0,S=T.targetWhere?y` where ${T.targetWhere}`:void 0,f=T.setWhere?y` where ${T.setWhere}`:void 0,M=this.dialect.buildUpdateSet(this.config.table,AW(this.config.table,T.set)),F="";return F=Array.isArray(T.target)?T.target.map((J)=>this.dialect.escapeName(this.dialect.casing.getColumnCasing(J))).join(","):this.dialect.escapeName(this.dialect.casing.getColumnCasing(T.target)),this.config.onConflict=y`(${y.raw(F)})${S} do update set ${M}${$}${f}`,this}getSQL(){return this.dialect.buildInsertQuery(this.config)}toSQL(){let{typings:T,...$}=this.dialect.sqlToQuery(this.getSQL());return $}_prepare(T){return QT.startActiveSpan("drizzle.prepareQuery",()=>{return this.session.prepareQuery(this.dialect.sqlToQuery(this.getSQL()),this.config.returning,T,!0)})}prepare(T){return this._prepare(T)}authToken;setToken(T){return this.authToken=T,this}execute=(T)=>{return QT.startActiveSpan("drizzle.operation",()=>{return this._prepare().execute(T,this.authToken)})};getSelectedFields(){return this.config.returningFields?new Proxy(this.config.returningFields,new nT({alias:$$(this.config.table),sqlAliasedBehavior:"alias",sqlBehavior:"error"})):void 0}$dynamic(){return this}}class SA extends D${constructor(T,$,S){super();this.session=$,this.dialect=S,this.config={view:T}}static[O]="PgRefreshMaterializedView";config;concurrently(){if(this.config.withNoData!==void 0)throw new Error("Cannot use concurrently and withNoData together");return this.config.concurrently=!0,this}withNoData(){if(this.config.concurrently!==void 0)throw new Error("Cannot use concurrently and withNoData together");return this.config.withNoData=!0,this}getSQL(){return this.dialect.buildRefreshMaterializedViewQuery(this.config)}toSQL(){let{typings:T,...$}=this.dialect.sqlToQuery(this.getSQL());return $}_prepare(T){return QT.startActiveSpan("drizzle.prepareQuery",()=>{return this.session.prepareQuery(this.dialect.sqlToQuery(this.getSQL()),void 0,T,!0)})}prepare(T){return this._prepare(T)}authToken;setToken(T){return this.authToken=T,this}execute=(T)=>{return QT.startActiveSpan("drizzle.operation",()=>{return this._prepare().execute(T,this.authToken)})}}class ZW{constructor(T,$,S,f){this.table=T,this.session=$,this.dialect=S,this.withList=f}static[O]="PgUpdateBuilder";authToken;setToken(T){return this.authToken=T,this}set(T){return new zY(this.table,AW(this.table,T),this.session,this.dialect,this.withList).setToken(this.authToken)}}class zY extends D${constructor(T,$,S,f,M){super();this.session=S,this.dialect=f,this.config={set:$,table:T,withList:M,joins:[]},this.tableName=xS(T),this.joinsNotNullableMap=typeof this.tableName==="string"?{[this.tableName]:!0}:{}}static[O]="PgUpdate";config;tableName;joinsNotNullableMap;from(T){let $=T,S=xS($);if(typeof S==="string")this.joinsNotNullableMap[S]=!0;return this.config.from=$,this}getTableLikeFields(T){if(U(T,J$))return T[P.Symbol.Columns];else if(U(T,sT))return T._.selectedFields;return T[LT].selectedFields}createJoin(T){return($,S)=>{let f=xS($);if(typeof f==="string"&&this.config.joins.some((M)=>M.alias===f))throw new Error(`Alias "${f}" is already used in this query`);if(typeof S==="function"){let M=this.config.from&&!U(this.config.from,c)?this.getTableLikeFields(this.config.from):void 0;S=S(new Proxy(this.config.table[P.Symbol.Columns],new nT({sqlAliasedBehavior:"sql",sqlBehavior:"sql"})),M&&new Proxy(M,new nT({sqlAliasedBehavior:"sql",sqlBehavior:"sql"})))}if(this.config.joins.push({on:S,table:$,joinType:T,alias:f}),typeof f==="string")switch(T){case"left":{this.joinsNotNullableMap[f]=!1;break}case"right":{this.joinsNotNullableMap=Object.fromEntries(Object.entries(this.joinsNotNullableMap).map(([M])=>[M,!1])),this.joinsNotNullableMap[f]=!0;break}case"inner":{this.joinsNotNullableMap[f]=!0;break}case"full":{this.joinsNotNullableMap=Object.fromEntries(Object.entries(this.joinsNotNullableMap).map(([M])=>[M,!1])),this.joinsNotNullableMap[f]=!1;break}}return this}}leftJoin=this.createJoin("left");rightJoin=this.createJoin("right");innerJoin=this.createJoin("inner");fullJoin=this.createJoin("full");where(T){return this.config.where=T,this}returning(T){if(!T){if(T=Object.assign({},this.config.table[P.Symbol.Columns]),this.config.from){let $=xS(this.config.from);if(typeof $==="string"&&this.config.from&&!U(this.config.from,c)){let S=this.getTableLikeFields(this.config.from);T[$]=S}for(let S of this.config.joins){let f=xS(S.table);if(typeof f==="string"&&!U(S.table,c)){let M=this.getTableLikeFields(S.table);T[f]=M}}}}return this.config.returningFields=T,this.config.returning=g$(T),this}getSQL(){return this.dialect.buildUpdateQuery(this.config)}toSQL(){let{typings:T,...$}=this.dialect.sqlToQuery(this.getSQL());return $}_prepare(T){let $=this.session.prepareQuery(this.dialect.sqlToQuery(this.getSQL()),this.config.returning,T,!0);return $.joinsNotNullableMap=this.joinsNotNullableMap,$}prepare(T){return this._prepare(T)}authToken;setToken(T){return this.authToken=T,this}execute=(T)=>{return this._prepare().execute(T,this.authToken)};getSelectedFields(){return this.config.returningFields?new Proxy(this.config.returningFields,new nT({alias:$$(this.config.table),sqlAliasedBehavior:"alias",sqlBehavior:"error"})):void 0}$dynamic(){return this}}class iF extends c{constructor(T){super(iF.buildEmbeddedCount(T.source,T.filters).queryChunks);this.params=T,this.mapWith(Number),this.session=T.session,this.sql=iF.buildCount(T.source,T.filters)}sql;token;static[O]="PgCountBuilder";[Symbol.toStringTag]="PgCountBuilder";session;static buildEmbeddedCount(T,$){return y`(select count(*) from ${T}${y.raw(" where ").if($)}${$})`}static buildCount(T,$){return y`select count(*) as count from ${T}${y.raw(" where ").if($)}${$};`}setToken(T){return this.token=T,this}then(T,$){return Promise.resolve(this.session.count(this.sql,this.token)).then(T,$)}catch(T){return this.then(void 0,T)}finally(T){return this.then(($)=>{return T?.(),$},($)=>{throw T?.(),$})}}class MA{constructor(T,$,S,f,M,F,J){this.fullSchema=T,this.schema=$,this.tableNamesMap=S,this.table=f,this.tableConfig=M,this.dialect=F,this.session=J}static[O]="PgRelationalQueryBuilder";findMany(T){return new fA(this.fullSchema,this.schema,this.tableNamesMap,this.table,this.tableConfig,this.dialect,this.session,T?T:{},"many")}findFirst(T){return new fA(this.fullSchema,this.schema,this.tableNamesMap,this.table,this.tableConfig,this.dialect,this.session,T?{...T,limit:1}:{limit:1},"first")}}class fA extends D${constructor(T,$,S,f,M,F,J,W,A){super();this.fullSchema=T,this.schema=$,this.tableNamesMap=S,this.table=f,this.tableConfig=M,this.dialect=F,this.session=J,this.config=W,this.mode=A}static[O]="PgRelationalQuery";_prepare(T){return QT.startActiveSpan("drizzle.prepareQuery",()=>{let{query:$,builtQuery:S}=this._toSQL();return this.session.prepareQuery(S,void 0,T,!0,(f,M)=>{let F=f.map((J)=>HW(this.schema,this.tableConfig,J,$.selection,M));if(this.mode==="first")return F[0];return F})})}prepare(T){return this._prepare(T)}_getQuery(){return this.dialect.buildRelationalQueryWithoutPK({fullSchema:this.fullSchema,schema:this.schema,tableNamesMap:this.tableNamesMap,table:this.table,tableConfig:this.tableConfig,queryConfig:this.config,tableAlias:this.tableConfig.tsName})}getSQL(){return this._getQuery().sql}_toSQL(){let T=this._getQuery(),$=this.dialect.sqlToQuery(T.sql);return{query:T,builtQuery:$}}toSQL(){return this._toSQL().builtQuery}authToken;setToken(T){return this.authToken=T,this}execute(){return QT.startActiveSpan("drizzle.operation",()=>{return this._prepare().execute(void 0,this.authToken)})}}class FA extends D${constructor(T,$,S,f){super();this.execute=T,this.sql=$,this.query=S,this.mapBatchResult=f}static[O]="PgRaw";getSQL(){return this.sql}getQuery(){return this.query}mapResult(T,$){return $?this.mapBatchResult(T):T}_prepare(){return this}isResponseInArrayMode(){return!1}}class uF{constructor(T,$,S){if(this.dialect=T,this.session=$,this._=S?{schema:S.schema,fullSchema:S.fullSchema,tableNamesMap:S.tableNamesMap,session:$}:{schema:void 0,fullSchema:{},tableNamesMap:{},session:$},this.query={},this._.schema)for(let[f,M]of Object.entries(this._.schema))this.query[f]=new MA(S.fullSchema,this._.schema,this._.tableNamesMap,S.fullSchema[f],M,T,$)}static[O]="PgDatabase";query;$with=(T,$)=>{let S=this;return{as:(M)=>{if(typeof M==="function")M=M(new pF(S.dialect));return new Proxy(new IF(M.getSQL(),$??("getSelectedFields"in M?M.getSelectedFields()??{}:{}),T,!0),new nT({alias:T,sqlAliasedBehavior:"alias",sqlBehavior:"error"}))}}};$count(T,$){return new iF({source:T,filters:$,session:this.session})}with(...T){let $=this;function S(A){return new _$({fields:A??void 0,session:$.session,dialect:$.dialect,withList:T})}function f(A){return new _$({fields:A??void 0,session:$.session,dialect:$.dialect,withList:T,distinct:!0})}function M(A,w){return new _$({fields:w??void 0,session:$.session,dialect:$.dialect,withList:T,distinct:{on:A}})}function F(A){return new ZW(A,$.session,$.dialect,T)}function J(A){return new xW(A,$.session,$.dialect,T)}function W(A){return new jW(A,$.session,$.dialect,T)}return{select:S,selectDistinct:f,selectDistinctOn:M,update:F,insert:J,delete:W}}select(T){return new _$({fields:T??void 0,session:this.session,dialect:this.dialect})}selectDistinct(T){return new _$({fields:T??void 0,session:this.session,dialect:this.dialect,distinct:!0})}selectDistinctOn(T,$){return new _$({fields:$??void 0,session:this.session,dialect:this.dialect,distinct:{on:T}})}update(T){return new ZW(T,this.session,this.dialect)}insert(T){return new xW(T,this.session,this.dialect)}delete(T){return new jW(T,this.session,this.dialect)}refreshMaterializedView(T){return new SA(T,this.session,this.dialect)}authToken;execute(T){let $=typeof T==="string"?y.raw(T):T.getSQL(),S=this.dialect.sqlToQuery($),f=this.session.prepareQuery(S,void 0,void 0,!1);return new FA(()=>f.execute(void 0,this.authToken),$,S,(M)=>f.mapResult(M,!0))}transaction(T,$){return this.session.transaction(T,$)}}class HY{constructor(T,$){this.unique=T,this.name=$}static[O]="PgIndexBuilderOn";on(...T){return new bW(T.map(($)=>{if(U($,c))return $;$=$;let S=new CF($.name,!!$.keyAsName,$.columnType,$.indexConfig);return $.indexConfig=JSON.parse(JSON.stringify($.defaultConfig)),S}),this.unique,!1,this.name)}onOnly(...T){return new bW(T.map(($)=>{if(U($,c))return $;$=$;let S=new CF($.name,!!$.keyAsName,$.columnType,$.indexConfig);return $.indexConfig=$.defaultConfig,S}),this.unique,!0,this.name)}using(T,...$){return new bW($.map((S)=>{if(U(S,c))return S;S=S;let f=new CF(S.name,!!S.keyAsName,S.columnType,S.indexConfig);return S.indexConfig=JSON.parse(JSON.stringify(S.defaultConfig)),f}),this.unique,!0,this.name,T)}}class bW{static[O]="PgIndexBuilder";config;constructor(T,$,S,f,M="btree"){this.config={name:f,columns:T,unique:$,only:S,method:M}}concurrently(){return this.config.concurrently=!0,this}with(T){return this.config.with=T,this}where(T){return this.config.where=T,this}build(T){return new DY(this.config,T)}}class DY{static[O]="PgIndex";config;constructor(T,$){this.config={...T,table:$}}}function JA(T){return new HY(!0,T)}class WA{constructor(T){this.query=T}authToken;getQuery(){return this.query}mapResult(T,$){return T}setToken(T){return this.authToken=T,this}static[O]="PgPreparedQuery";joinsNotNullableMap}class AA{constructor(T){this.dialect=T}static[O]="PgSession";execute(T,$){return QT.startActiveSpan("drizzle.operation",()=>{return QT.startActiveSpan("drizzle.prepareQuery",()=>{return this.prepareQuery(this.dialect.sqlToQuery(T),void 0,void 0,!1)}).setToken($).execute(void 0,$)})}all(T){return this.prepareQuery(this.dialect.sqlToQuery(T),void 0,void 0,!1).all()}async count(T,$){let S=await this.execute(T,$);return Number(S[0].count)}}class wA extends uF{constructor(T,$,S,f=0){super(T,$,S);this.schema=S,this.nestedIndex=f}static[O]="PgTransaction";rollback(){throw new N1}getTransactionConfigSQL(T){let $=[];if(T.isolationLevel)$.push(`isolation level ${T.isolationLevel}`);if(T.accessMode)$.push(T.accessMode);if(typeof T.deferrable==="boolean")$.push(T.deferrable?"deferrable":"not deferrable");return y.raw($.join(" "))}setTransaction(T){return this.session.execute(y`set transaction ${this.getTransactionConfigSQL(T)}`)}}class _Y extends WA{constructor(T,$,S,f,M,F,J){super({sql:$,params:S});this.client=T,this.queryString=$,this.params=S,this.logger=f,this.fields=M,this._isResponseInArrayMode=F,this.customResultMapper=J}static[O]="PostgresJsPreparedQuery";async execute(T={}){return QT.startActiveSpan("drizzle.execute",async($)=>{let S=B1(this.params,T);$?.setAttributes({"drizzle.query.text":this.queryString,"drizzle.query.params":JSON.stringify(S)}),this.logger.logQuery(this.queryString,S);let{fields:f,queryString:M,client:F,joinsNotNullableMap:J,customResultMapper:W}=this;if(!f&&!W)return QT.startActiveSpan("drizzle.driver.execute",()=>{return F.unsafe(M,S)});let A=await QT.startActiveSpan("drizzle.driver.execute",()=>{return $?.setAttributes({"drizzle.query.text":M,"drizzle.query.params":JSON.stringify(S)}),F.unsafe(M,S).values()});return QT.startActiveSpan("drizzle.mapResponse",()=>{return W?W(A):A.map((w)=>dX(f,w,J))})})}all(T={}){return QT.startActiveSpan("drizzle.execute",async($)=>{let S=B1(this.params,T);return $?.setAttributes({"drizzle.query.text":this.queryString,"drizzle.query.params":JSON.stringify(S)}),this.logger.logQuery(this.queryString,S),QT.startActiveSpan("drizzle.driver.execute",()=>{return $?.setAttributes({"drizzle.query.text":this.queryString,"drizzle.query.params":JSON.stringify(S)}),this.client.unsafe(this.queryString,S)})})}isResponseInArrayMode(){return this._isResponseInArrayMode}}class dF extends AA{constructor(T,$,S,f={}){super($);this.client=T,this.schema=S,this.options=f,this.logger=f.logger??new I1}static[O]="PostgresJsSession";logger;prepareQuery(T,$,S,f,M){return new _Y(this.client,T.sql,T.params,this.logger,$,f,M)}query(T,$){return this.logger.logQuery(T,$),this.client.unsafe(T,$).values()}queryObjects(T,$){return this.client.unsafe(T,$)}transaction(T,$){return this.client.begin(async(S)=>{let f=new dF(S,this.dialect,this.schema,this.options),M=new XA(this.dialect,f,this.schema);if($)await M.setTransaction($);return T(M)})}}class XA extends wA{constructor(T,$,S,f=0){super(T,$,S,f);this.session=$}static[O]="PostgresJsTransaction";transaction(T){return this.session.client.savepoint(($)=>{let S=new dF($,this.dialect,this.schema,this.session.options),f=new XA(this.dialect,S,this.schema);return T(f)})}}class EY extends uF{static[O]="PostgresJsDatabase"}function BM(T,$={}){let S=(A)=>A;for(let A of["1184","1082","1083","1114"])T.options.parsers[A]=S,T.options.serializers[A]=S;T.options.serializers["114"]=S,T.options.serializers["3802"]=S;let f=new Lf({casing:$.casing}),M;if($.logger===!0)M=new C1;else if($.logger!==!1)M=$.logger;let F;if($.schema){let A=d4($.schema,r4);F={fullSchema:$.schema,schema:A.tables,tableNamesMap:A.tableNamesMap}}let J=new dF(T,f,F,{logger:M}),W=new EY(f,J,F);return W.$client=T,W}function qW(...T){if(typeof T[0]==="string"){let $=UM(T[0]);return BM($,T[1])}if(aX(T[0])){let{connection:$,client:S,...f}=T[0];if(S)return BM(S,f);if(typeof $==="object"&&$.url!==void 0){let{url:F,...J}=$,W=UM(F,J);return BM(W,f)}let M=UM($);return BM(M,f)}return BM(T[0],T[1])}((T)=>{function $(S){return BM({options:{parsers:{},serializers:{}}},S)}T.mock=$})(qW||(qW={}));function _y(T,$){let S={},f=[];for(let M in T){let F=T[M],J=$[M],W=F["~standard"].validate(J);if(W instanceof Promise)throw new Error(`Validation must be synchronous, but ${M} returned a Promise.`);if(W.issues){f.push(...W.issues.map((A)=>({...A,path:[M,...A.path??[]]})));continue}S[M]=W.value}if(f.length)return{issues:f};return{value:S}}function QY(T){let $=T.runtimeEnvStrict??T.runtimeEnv??process.env;if(T.emptyStringAsUndefined??!1){for(let[V,L]of Object.entries($))if(L==="")delete $[V]}if(!!T.skipValidation)return $;let M=typeof T.client==="object"?T.client:{},F=typeof T.server==="object"?T.server:{},J=typeof T.shared==="object"?T.shared:{},W=T.isServer??(typeof window==="undefined"||("Deno"in window)),A=W?{...F,...J,...M}:{...M,...J},w=_y(A,$),X=T.onValidationError??((V)=>{throw console.error("\u274C Invalid environment variables:",V),new Error("Invalid environment variables")}),Y=T.onInvalidAccess??(()=>{throw new Error("\u274C Attempted to access a server-side environment variable on the client")});if(w.issues)return X(w.issues);let k=(V)=>{if(!T.clientPrefix)return!0;return!V.startsWith(T.clientPrefix)&&!(V in J)},R=(V)=>{return W||!k(V)},z=(V)=>{return V==="__esModule"||V==="$$typeof"},Q=(T.extends??[]).reduce((V,L)=>{return Object.assign(V,L)},{}),D=Object.assign(w.value,Q);return new Proxy(D,{get(V,L){if(typeof L!=="string")return;if(z(L))return;if(!R(L))return Y(L);return Reflect.get(V,L)}})}var Ey="__vite_start_time"in globalThis,Qy=typeof window!=="undefined",dm="vitest"in globalThis,bS=QY({isServer:!Ey&&!Qy,server:{CI:_T.string().transform((T)=>!0).optional(),POSTGRES_USER:_T.string(),POSTGRES_PASSWORD:_T.string(),POSTGRES_DATABASE:_T.string(),POSTGRES_HOST:_T.string(),POSTGRES_PORT:_T.string().transform((T)=>Number.parseInt(T,10)),BACKEND_PORT:_T.string().transform((T)=>Number.parseInt(T,10)),RUN_WORKERS_FROM_SOURCE:_T.union([_T.literal("true"),_T.literal("false")]).optional().transform((T)=>T==="true"),FRONTEND_PORT:_T.string().transform((T)=>Number.parseInt(T,10)),FRONTEND_ORIGINS:_T.string().transform((T)=>JSON.parse(T)).pipe(_T.array(_T.string())),OPENAI_API_KEY:_T.string().optional()},clientPrefix:"VITE_",client:{VITE_BACKEND_ORIGIN:_T.string(),VITE_USE_SELF_SIGNED_CERTIFICATE:_T.union([_T.literal("true"),_T.literal("false")]).optional().transform((T)=>T==="true")},runtimeEnv:import.meta.env,emptyStringAsUndefined:!0});var kA={};bk(kA,{users:()=>Nf,userChanges:()=>Vy,untrackedUserColumnNames:()=>Uy,twoFactorMethod:()=>NY,trackedUserColumnName:()=>LY,trackableUserColumnNames:()=>BY,role:()=>VY,players:()=>YA,passwordResetAttempts:()=>Ly,loginHistory:()=>By,games:()=>mW,banishedIps:()=>hW});function UY(T){return y`lower(${T})`}var VY=TW("role",["admin","user"]),Nf=aS("users",{id:m$().primaryKey().defaultRandom(),username:F$({length:16}).notNull(),email:F$({length:254}).notNull(),hash:F$({length:64}).notNull(),salt:F$({length:36}).notNull(),createdAt:FS({withTimezone:!0}).notNull().defaultNow(),createdIp:F$({length:45}).notNull(),isActive:mF().notNull().default(!1),verifiedAt:FS({withTimezone:!0}),userRole:VY().default("user")},(T)=>[JA("usernameUniqueIndex").on(UY(T.username)),JA("emailUniqueIndex").on(UY(T.email))]),Uy=["id","createdAt","createdIp","isActive","salt","verifiedAt"],BY=["username","email","hash","userRole"],LY=TW("trackedUserColumnName",BY),Vy=aS("userChanges",{id:m$().primaryKey().defaultRandom(),userId:m$().notNull().references(()=>Nf.id),changedAt:FS({withTimezone:!0}).notNull().defaultNow(),changedIp:F$({length:45}).notNull(),changedColumn:LY().notNull(),oldValue:F$({length:255}),newValue:F$({length:255})}),mW=aS("games",{id:m$().primaryKey().defaultRandom()}),YA=aS("players",{userId:m$().notNull().references(()=>Nf.id),gameId:m$().notNull().references(()=>mW.id),score:YW().notNull()},(T)=>[g4({name:"players_userId_gameId_pk",columns:[T.userId,T.gameId]})]),By=aS("loginHistory",{id:m$().primaryKey().defaultRandom(),userId:m$().references(()=>Nf.id),loginTime:FS({withTimezone:!0}).notNull().defaultNow(),ipAddress:F$({length:45}).notNull(),userAgent:F$({length:1024}),successful:mF().notNull().default(!1)}),NY=TW("twoFactorMethod",["email","phone"]),Ly=aS("passwordResetAttempts",{id:m$().primaryKey().defaultRandom(),userId:m$().notNull().references(()=>Nf.id),requestedIp:F$({length:45}).notNull(),requestedAt:FS({withTimezone:!0}).notNull().defaultNow(),succeededIp:F$({length:45}),succeededAt:FS({withTimezone:!0}),verificationMethod:NY().notNull()}),hW=aS("banishedIps",{ip:F$({length:45}).primaryKey(),reason:F$({length:2048}).notNull(),banishedAt:FS({withTimezone:!0}).notNull().defaultNow(),banishedUntil:FS({withTimezone:!0})});var __dirname="/home/runner/work/wayforge/wayforge/apps/tempest.games/src/database";class KA{options;sql;drizzle;observers=new Map;async setupTriggersAndNotifications(){await this.sql.file(Ny.resolve(__dirname,"notify_update.sql"));let T=[$$(Nf),$$(mW),$$(YA)];await this.sql`SELECT create_notify_triggers(${this.sql.array(T)})`,await this.sql.listen("table_update",($)=>{let S=$.split(","),f=S[0],M=S[1],F=`${f}("${M}")`;if(this.observers.has(F))this.observers.get(F).next(F)})}constructor(T=!1,$={host:bS.POSTGRES_HOST,port:bS.POSTGRES_PORT,user:bS.POSTGRES_USER,password:bS.POSTGRES_PASSWORD,database:bS.POSTGRES_DATABASE}){this.options=$,this.sql=UM($),this.drizzle=qW(this.sql,{schema:kA,logger:T})}observe(T,$){if(!this.observers.has(T))this.observers.set(T,new fT);this.observers.get(T).subscribe("SINGLETON",$)}}import{resolve as jy}from"path";import{existsSync as OA,mkdirSync as CY,readdirSync as IY,readFileSync as Cy,rmSync as jY,statSync as xY,writeFileSync as Iy}from"fs";import{resolve as yA}from"path";class GA{rootDir;get initialized(){return OA(this.rootDir)}initialize(){if(!this.initialized)CY(this.rootDir,{recursive:!0})}constructor(T){if(this.rootDir=T.path,T.eagerInit)this.initialize()}getItem(T){let $=yA(this.rootDir,T);if(OA($))return Cy($,"utf-8");return null}setItem(T,$){this.initialize();let S=yA(this.rootDir,T);Iy(S,$)}removeItem(T){let $=yA(this.rootDir,T);if(OA($))this.initialize(),jY($)}key(T){return IY(this.rootDir).sort((f,M)=>{let F=xY(f);return xY(M).ctimeMs-F.ctimeMs})[T]??null}clear(){jY(this.rootDir,{recursive:!0}),CY(this.rootDir,{recursive:!0})}get length(){return IY(this.rootDir).length}}var RA=new GA({path:jy(process.cwd(),"storage")});import*as vW from"fs";import*as ZY from"readline";function xy(T){let S=T.replace(":","T").replace(" ","").replace(/(\d{2})\/(\w{3})\/(\d{4})T(.+)/,(f,M,F,J,W)=>{let w={Jan:"01",Feb:"02",Mar:"03",Apr:"04",May:"05",Jun:"06",Jul:"07",Aug:"08",Sep:"09",Oct:"10",Nov:"11",Dec:"12"}[F];return`${J}-${w}-${M}T${W}`});return new Date(S)}async function bY(T,$="/var/log/nginx/access.log",S=new Date){let f=new Map;if(!vW.existsSync($))return T.error(`Log file not found: ${$}`),f;let M=vW.createReadStream($),F=ZY.createInterface({input:M,crlfDelay:Number.POSITIVE_INFINITY}),J=new Date(S.getTime()-3600000);return F.on("line",(W)=>{let A=/^(?<ip>\S+) \S+ \S+ \[(?<dateTime>.*?)\]/,w=W.match(A);if(w?.groups){let X=w.groups.ip,Y=w.groups.dateTime,k=xy(Y);if(!Number.isNaN(k.getTime())){if(k>=J&&k<=S){let R=f.get(X);if(!R)R=[],f.set(X,R);R.push(W)}}else T.error(`Failed to parse date: ${Y}`)}}),new Promise((W,A)=>{F.on("error",(w)=>{A(w)}),F.on("close",()=>{W(f)})})}var Zy=["Network security adjudicator, your job is to determine if an IP address should be banned.","The IP address in question created the following logs on our server today:","```nginx.log\n"].join(`
|
|
83
83
|
`);function qY(T){return Zy+T.join(`
|
|
84
84
|
|
|
85
85
|
`)}var mY={schema:_T.union([_T.object({shouldBanIp:_T.literal(!1)}),_T.object({shouldBanIp:_T.literal(!0),veryConciseReason:_T.string()})]),fallback:{shouldBanIp:!1}};var qy=[".env","php"];async function hY({generator:T,logFilePath:$,logger:S,now:f=new Date}){let M=T.usdBudget,F=new KA({logQuery(L,Z){S.info("\uD83D\uDCDD query",L,Z)}}),J=await bY(S,$,f),W=[],A=T.from(mY),w=0,X=0;for(let[L,Z]of J){S.info(`\uD83D\uDD0D ruling on ${L}. logs:`),S.info(Z.map((E)=>` ${E}`).join(`
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tempest.games",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.29",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"zod": "3.24.1",
|
|
39
39
|
"zod-to-json-schema": "3.24.1",
|
|
40
40
|
"atom.io": "0.30.7",
|
|
41
|
-
"safedeposit": "0.0
|
|
41
|
+
"safedeposit": "0.1.0",
|
|
42
42
|
"treetrunks": "0.0.4"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
@@ -60,12 +60,12 @@
|
|
|
60
60
|
"sass-embedded": "1.83.4",
|
|
61
61
|
"tsx": "4.19.2",
|
|
62
62
|
"typescript": "5.7.3",
|
|
63
|
-
"typescript-eslint": "8.
|
|
63
|
+
"typescript-eslint": "8.23.0",
|
|
64
64
|
"vite": "6.0.11",
|
|
65
65
|
"vite-tsconfig-paths": "5.1.4",
|
|
66
|
-
"vitest": "3.0.
|
|
67
|
-
"flightdeck": "0.2.
|
|
68
|
-
"varmint": "0.3.
|
|
66
|
+
"vitest": "3.0.5",
|
|
67
|
+
"flightdeck": "0.2.12",
|
|
68
|
+
"varmint": "0.3.9"
|
|
69
69
|
},
|
|
70
70
|
"scripts": {
|
|
71
71
|
"dev": "bun run env:dev && concurrently \"bun:dev:*\"",
|