@m1212e/rumble 0.3.14 → 0.4.0

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/index.d.ts CHANGED
@@ -95,9 +95,15 @@ declare const rumble: <UserContext extends Record<string, any>, DB extends Gener
95
95
  limit: any;
96
96
  }> | undefined;
97
97
  } | undefined) => {
98
- where: drizzle_orm.SQL<unknown> | undefined;
99
- columns: Record<string, any> | undefined;
100
- limit: any;
98
+ single: {
99
+ where: drizzle_orm.SQL<unknown> | undefined;
100
+ columns: Record<string, any> | undefined;
101
+ };
102
+ many: {
103
+ where: drizzle_orm.SQL<unknown> | undefined;
104
+ columns: Record<string, any> | undefined;
105
+ limit: any;
106
+ };
101
107
  };
102
108
  }; } : never;
103
109
  };
@@ -114,9 +120,15 @@ declare const rumble: <UserContext extends Record<string, any>, DB extends Gener
114
120
  limit: any;
115
121
  }> | undefined;
116
122
  } | undefined) => {
117
- where: drizzle_orm.SQL<unknown> | undefined;
118
- columns: Record<string, any> | undefined;
119
- limit: any;
123
+ single: {
124
+ where: drizzle_orm.SQL<unknown> | undefined;
125
+ columns: Record<string, any> | undefined;
126
+ };
127
+ many: {
128
+ where: drizzle_orm.SQL<unknown> | undefined;
129
+ columns: Record<string, any> | undefined;
130
+ limit: any;
131
+ };
120
132
  };
121
133
  }; } : never;
122
134
  }>;
@@ -167,9 +179,15 @@ declare const rumble: <UserContext extends Record<string, any>, DB extends Gener
167
179
  limit: any;
168
180
  }> | undefined;
169
181
  } | undefined) => {
170
- where: drizzle_orm.SQL<unknown> | undefined;
171
- columns: Record<string, any> | undefined;
172
- limit: any;
182
+ single: {
183
+ where: drizzle_orm.SQL<unknown> | undefined;
184
+ columns: Record<string, any> | undefined;
185
+ };
186
+ many: {
187
+ where: drizzle_orm.SQL<unknown> | undefined;
188
+ columns: Record<string, any> | undefined;
189
+ limit: any;
190
+ };
173
191
  };
174
192
  }; } : never;
175
193
  }>;
@@ -207,9 +225,15 @@ declare const rumble: <UserContext extends Record<string, any>, DB extends Gener
207
225
  limit: any;
208
226
  }> | undefined;
209
227
  } | undefined) => {
210
- where: drizzle_orm.SQL<unknown> | undefined;
211
- columns: Record<string, any> | undefined;
212
- limit: any;
228
+ single: {
229
+ where: drizzle_orm.SQL<unknown> | undefined;
230
+ columns: Record<string, any> | undefined;
231
+ };
232
+ many: {
233
+ where: drizzle_orm.SQL<unknown> | undefined;
234
+ columns: Record<string, any> | undefined;
235
+ limit: any;
236
+ };
213
237
  };
214
238
  }; } : never;
215
239
  }>;
@@ -287,9 +311,15 @@ declare const rumble: <UserContext extends Record<string, any>, DB extends Gener
287
311
  limit: any;
288
312
  }> | undefined;
289
313
  } | undefined) => {
290
- where: drizzle_orm.SQL<unknown> | undefined;
291
- columns: Record<string, any> | undefined;
292
- limit: any;
314
+ single: {
315
+ where: drizzle_orm.SQL<unknown> | undefined;
316
+ columns: Record<string, any> | undefined;
317
+ };
318
+ many: {
319
+ where: drizzle_orm.SQL<unknown> | undefined;
320
+ columns: Record<string, any> | undefined;
321
+ limit: any;
322
+ };
293
323
  };
294
324
  }; } : never;
295
325
  }>;
@@ -330,7 +360,7 @@ declare const rumble: <UserContext extends Record<string, any>, DB extends Gener
330
360
  db.query.users
331
361
  .findFirst({
332
362
  ...query,
333
- where: ctx.abilities.users.filter("read").where,
363
+ where: ctx.abilities.users.filter("read").single.where,
334
364
  })
335
365
  // note that we need to manually raise an error if the value is not found
336
366
  .then(assertFindFirstExists)
@@ -369,7 +399,7 @@ declare const assertFindFirstExists: <T>(value: T | undefined) => T;
369
399
  .where(
370
400
  and(
371
401
  eq(schema.users.id, args.userId),
372
- ctx.abilities.users.filter("update").where
402
+ ctx.abilities.users.filter("update").single.where
373
403
  )
374
404
  )
375
405
  .returning({ id: schema.users.id, name: schema.users.name })
package/index.js CHANGED
@@ -1,9 +1,9 @@
1
- import {createYoga,createPubSub}from'graphql-yoga';import {One,or,and,eq}from'drizzle-orm';import {toCamelCase}from'drizzle-orm/casing';import de from'@pothos/core';import ye from'@pothos/plugin-drizzle';import fe,{subscribeOptionsFromIterator}from'@pothos/plugin-smart-subscriptions';import {JSONResolver,DateResolver,DateTimeISOResolver}from'graphql-scalars';function O(e){return typeof e=="object"&&e!==null}function Q(e,t){throw new Error("Unexpected invariant triggered.")}var Z=/\r\n|[\n\r]/g;function v(e,t){let m=0,o=1;for(let n of e.body.matchAll(Z)){if(typeof n.index=="number"||Q(),n.index>=t)break;m=n.index+n[0].length,o+=1;}return {line:o,column:t+1-m}}function k(e){return L(e.source,v(e.source,e.start))}function L(e,t){let m=e.locationOffset.column-1,o="".padStart(m)+e.body,n=t.line-1,i=e.locationOffset.line-1,p=t.line+i,l=t.line===1?m:0,s=t.column+l,y=`${e.name}:${p}:${s}
2
- `,r=o.split(/\r\n|[\n\r]/g),a=r[n];if(a.length>120){let f=Math.floor(s/80),C=s%80,u=[];for(let g=0;g<a.length;g+=80)u.push(a.slice(g,g+80));return y+w([[`${p} |`,u[0]],...u.slice(1,f+1).map(g=>["|",g]),["|","^".padStart(C)],["|",u[f+1]]])}return y+w([[`${p-1} |`,r[n-1]],[`${p} |`,a],["|","^".padStart(s)],[`${p+1} |`,r[n+1]]])}function w(e){let t=e.filter(([o,n])=>n!==void 0),m=Math.max(...t.map(([o])=>o.length));return t.map(([o,n])=>o.padStart(m)+(n?" "+n:"")).join(`
3
- `)}function ee(e){let t=e[0];return t==null||"kind"in t||"length"in t?{nodes:t,source:e[1],positions:e[2],path:e[3],originalError:e[4],extensions:e[5]}:t}var B=class e extends Error{constructor(t,...m){var o,n,i;let{nodes:p,source:l,positions:s,path:y,originalError:r,extensions:a}=ee(m);super(t),this.name="GraphQLError",this.path=y??void 0,this.originalError=r??void 0,this.nodes=F(Array.isArray(p)?p:p?[p]:void 0);let f=F((o=this.nodes)===null||o===void 0?void 0:o.map(u=>u.loc).filter(u=>u!=null));this.source=l??(f==null||(n=f[0])===null||n===void 0?void 0:n.source),this.positions=s??f?.map(u=>u.start),this.locations=s&&l?s.map(u=>v(l,u)):f?.map(u=>v(u.source,u.start));let C=O(r?.extensions)?r?.extensions:void 0;this.extensions=(i=a??C)!==null&&i!==void 0?i:Object.create(null),Object.defineProperties(this,{message:{writable:true,enumerable:true},name:{enumerable:false},nodes:{enumerable:false},source:{enumerable:false},positions:{enumerable:false},originalError:{enumerable:false}}),r!=null&&r.stack?Object.defineProperty(this,"stack",{value:r.stack,writable:true,configurable:true}):Error.captureStackTrace?Error.captureStackTrace(this,e):Object.defineProperty(this,"stack",{value:Error().stack,writable:true,configurable:true});}get[Symbol.toStringTag](){return "GraphQLError"}toString(){let t=this.message;if(this.nodes)for(let m of this.nodes)m.loc&&(t+=`
1
+ import {createYoga,createPubSub}from'graphql-yoga';import {One,or,and,eq}from'drizzle-orm';import {toCamelCase}from'drizzle-orm/casing';import ye from'@pothos/core';import fe from'@pothos/plugin-drizzle';import he,{subscribeOptionsFromIterator}from'@pothos/plugin-smart-subscriptions';import {JSONResolver,DateResolver,DateTimeISOResolver}from'graphql-scalars';function z(e){return typeof e=="object"&&e!==null}function O(e,t){throw new Error("Unexpected invariant triggered.")}var ee=/\r\n|[\n\r]/g;function v(e,t){let m=0,o=1;for(let n of e.body.matchAll(ee)){if(typeof n.index=="number"||O(),n.index>=t)break;m=n.index+n[0].length,o+=1;}return {line:o,column:t+1-m}}function Q(e){return L(e.source,v(e.source,e.start))}function L(e,t){let m=e.locationOffset.column-1,o="".padStart(m)+e.body,n=t.line-1,i=e.locationOffset.line-1,p=t.line+i,c=t.line===1?m:0,s=t.column+c,y=`${e.name}:${p}:${s}
2
+ `,r=o.split(/\r\n|[\n\r]/g),a=r[n];if(a.length>120){let f=Math.floor(s/80),C=s%80,u=[];for(let x=0;x<a.length;x+=80)u.push(a.slice(x,x+80));return y+w([[`${p} |`,u[0]],...u.slice(1,f+1).map(x=>["|",x]),["|","^".padStart(C)],["|",u[f+1]]])}return y+w([[`${p-1} |`,r[n-1]],[`${p} |`,a],["|","^".padStart(s)],[`${p+1} |`,r[n+1]]])}function w(e){let t=e.filter(([o,n])=>n!==void 0),m=Math.max(...t.map(([o])=>o.length));return t.map(([o,n])=>o.padStart(m)+(n?" "+n:"")).join(`
3
+ `)}function te(e){let t=e[0];return t==null||"kind"in t||"length"in t?{nodes:t,source:e[1],positions:e[2],path:e[3],originalError:e[4],extensions:e[5]}:t}var B=class e extends Error{constructor(t,...m){var o,n,i;let{nodes:p,source:c,positions:s,path:y,originalError:r,extensions:a}=te(m);super(t),this.name="GraphQLError",this.path=y??void 0,this.originalError=r??void 0,this.nodes=k(Array.isArray(p)?p:p?[p]:void 0);let f=k((o=this.nodes)===null||o===void 0?void 0:o.map(u=>u.loc).filter(u=>u!=null));this.source=c??(f==null||(n=f[0])===null||n===void 0?void 0:n.source),this.positions=s??f?.map(u=>u.start),this.locations=s&&c?s.map(u=>v(c,u)):f?.map(u=>v(u.source,u.start));let C=z(r?.extensions)?r?.extensions:void 0;this.extensions=(i=a??C)!==null&&i!==void 0?i:Object.create(null),Object.defineProperties(this,{message:{writable:true,enumerable:true},name:{enumerable:false},nodes:{enumerable:false},source:{enumerable:false},positions:{enumerable:false},originalError:{enumerable:false}}),r!=null&&r.stack?Object.defineProperty(this,"stack",{value:r.stack,writable:true,configurable:true}):Error.captureStackTrace?Error.captureStackTrace(this,e):Object.defineProperty(this,"stack",{value:Error().stack,writable:true,configurable:true});}get[Symbol.toStringTag](){return "GraphQLError"}toString(){let t=this.message;if(this.nodes)for(let m of this.nodes)m.loc&&(t+=`
4
4
 
5
- `+k(m.loc));else if(this.source&&this.locations)for(let m of this.locations)t+=`
5
+ `+Q(m.loc));else if(this.source&&this.locations)for(let m of this.locations)t+=`
6
6
 
7
- `+L(this.source,m);return t}toJSON(){let t={message:this.message};return this.locations!=null&&(t.locations=this.locations),this.path!=null&&(t.path=this.path),this.extensions!=null&&Object.keys(this.extensions).length>0&&(t.extensions=this.extensions),t}};function F(e){return e===void 0||e.length===0?void 0:e}var S=class extends Error{constructor(t){super(t),this.name="RumbleError";}},P=class extends B{};var A=(e,t)=>new S(`RumbleError: Unknown SQL type '${e}'. Please open an issue (https://github.com/m1212e/rumble/issues) so it can be added. (${t})`);function j(e){if(["serial","int","integer","tinyint","smallint","mediumint"].includes(e))return {value1:1,value2:2};if(["real","decimal","double","float"].includes(e))return {value1:1.1,value2:2.2};if(["string","text","varchar","char","text(256)"].includes(e))return {value1:"a",value2:"b"};if(["uuid"].includes(e))return {value1:"fba31870-5528-42d7-b27e-2e5ee657aea5",value2:"fc65db81-c2d1-483d-8a25-a30e2cf6e02d"};if(["boolean"].includes(e))return {value1:true,value2:false};if(["timestamp","datetime"].includes(e))return {value1:new Date(2022,1,1),value2:new Date(2022,1,2)};if(["date"].includes(e))return {value1:new Date(2022,1,1),value2:new Date(2022,1,2)};if(["json"].includes(e))return {value1:{a:1},value2:{b:2}};throw A(e,"Distinct")}function oe(e){return typeof e!="function"}function ie(e){return typeof e=="function"&&e.constructor.name!=="AsyncFunction"}var V=({db:e})=>{let t=e._.schema,m={},o={},n=i=>({allow:p=>{let l=o[i];l||(l={},o[i]=l);let s=Array.isArray(p)?p:[p];for(let y of s){let r=l[y];r||(r="wildcard",l[y]=r);}return {when:y=>{for(let r of s)l[r]==="wildcard"&&(l[r]=[]),l[r].push(y);}}}});for(let i of Object.keys(e.query))m[i]=n(i);return {...m,registeredConditions:o,buildWithUserContext:i=>{let p={},l=s=>({filter:(y,r)=>{let a=o[s];a||(a={});let f=a[y];if(f==="wildcard")return {where:r?.inject?.where,columns:r?.inject?.columns,limit:r?.inject?.limit};let C=()=>{let x=t[s].primaryKey.at(0);if(!x)throw new S(`No primary key found for entity ${s.toString()}`);let z=j(x.getSQLType());return {where:and(eq(x,z.value1),eq(x,z.value2))}};(!a||!f)&&(f=[C()]);let u=f.filter(oe),g=f.filter(ie).map(x=>x(i)),h=[...u,...g];h.filter(x=>x!==void 0).length===0&&h.push(C());let d;for(let x of h)x?.limit&&(d===void 0||x.limit>d)&&(d=x.limit);r?.inject?.limit&&d<r.inject.limit&&(d=r.inject.limit);let c;for(let x of [...h,r?.inject??{}])x?.columns&&(c===void 0?c=x.columns:c={...c,...x.columns});let b=h.filter(x=>x?.where).map(x=>x?.where),T=b.length>0?or(...b):void 0;return r?.inject?.where&&(T=T?and(T,r.inject.where):r.inject.where),{where:T,columns:c,limit:d}}});for(let s of Object.keys(e.query))p[s]=l(s);return p}}};var $=({context:e,abilityBuilder:t})=>async m=>{let o=e?await e(m):{};return {...o,abilities:t.buildWithUserContext(o)}};function R(e){return String(e).charAt(0).toUpperCase()+String(e).slice(1)}function I(e){let t=E(e);return t.enumValues!==void 0&&t.enumName!==void 0&&typeof t.enumName=="string"&&Array.isArray(t.enumValues)}function E(e){return e.enum??e}var K=({db:e,schemaBuilder:t})=>{let m=new Map;return ({enumVariableName:n,name:i,enumValues:p,enumName:l})=>{let s=e._.fullSchema,y;if(n?y=s[n]:p?y=Object.values(s).filter(I).map(E).find(C=>C.enumValues===p):l&&(y=Object.values(s).filter(I).map(E).find(C=>C.enumName===l)),!y)throw new S(`Could not determine enum structure! (${String(n)}, ${p}, ${l})`);let r=i??`${R(toCamelCase(y.enumName.toString()))}Enum`,a=m.get(r);return a||(a=t.enumType(r,{values:y.enumValues}),m.set(r,a),a)}};function N(e){let t;if(["serial","int","integer","tinyint","smallint","mediumint"].includes(e)&&(t="Int"),["real","decimal","double","float"].includes(e)&&(t="Float"),["string","text","varchar","char","text(256)"].includes(e)&&(t="String"),["uuid"].includes(e)&&(t="ID"),["boolean"].includes(e)&&(t="Boolean"),["timestamp","datetime"].includes(e)&&(t="DateTime"),["date"].includes(e)&&(t="Date"),["json"].includes(e)&&(t="JSON"),t!==void 0)return t;throw A(e,"SQL to GQL")}var ae="RUMBLE_SUBSCRIPTION_NOTIFICATION",ue="REMOVED",me="UPDATED",le="CREATED";function U({action:e,tableName:t,primaryKeyValue:m}){let o;switch(e){case "created":o=le;break;case "removed":o=ue;break;case "updated":o=me;break;default:throw new Error(`Unknown action: ${e}`)}return `${ae}/${t}${m?`/${m}`:""}/${o}`}var W=({subscriptions:e})=>{let t=e?createPubSub(...e):createPubSub();return {pubsub:t,makePubSubInstance:({tableName:o})=>({registerOnInstance({instance:n,action:i,primaryKeyValue:p}){let l=U({tableName:o.toString(),action:i,primaryKeyValue:p});n.register(l);},created(){let n=U({tableName:o.toString(),action:"created"});return t.publish(n)},removed(n){let i=U({tableName:o.toString(),action:"removed"});return t.publish(i)},updated(n){let i=U({tableName:o.toString(),action:"updated",primaryKeyValue:n});return t.publish(i)}})}};var J=({db:e,schemaBuilder:t,makePubSubInstance:m,argImplementer:o,enumImplementer:n})=>({tableName:i,name:p,readAction:l="read"})=>{let s=e._.schema[i];if(!s)throw new S(`Could not find schema for ${i.toString()} (object)`);let y=s.primaryKey.at(0)?.name;y||console.warn(`Could not find primary key for ${i.toString()}. Cannot register subscriptions!`);let{registerOnInstance:r}=m({tableName:i});return t.drizzleObject(i,{name:p??R(i.toString()),subscribe:(a,f,C)=>{if(!y)return;let u=f[y];if(!u){console.warn(`Could not find primary key value for ${JSON.stringify(f)}. Cannot register subscription!`);return}r({instance:a,action:"updated",primaryKeyValue:u});},fields:a=>{let f=(g,h,d)=>{let c=N(g);switch(c){case "Int":return a.exposeInt(h,{nullable:d});case "String":return a.exposeString(h,{nullable:d});case "Boolean":return a.exposeBoolean(h,{nullable:d});case "Date":return a.field({type:"Date",resolve:b=>b[h],nullable:d});case "DateTime":return a.field({type:"DateTime",resolve:b=>b[h],nullable:d});case "Float":return a.exposeFloat(h,{nullable:d});case "ID":return a.exposeID(h,{nullable:d});case "JSON":return a.field({type:"JSON",resolve:b=>b[h],nullable:d});default:throw new S(`Unsupported object type ${c} for column ${h}`)}},C=Object.entries(s.columns).reduce((g,[h,d])=>{if(I(d)){let c=E(d),b=n({enumName:c.enumName});g[h]=a.field({type:b,resolve:T=>T[h],nullable:!d.notNull});}else g[h]=f(d.getSQLType(),h,!d.notNull);return g},{}),u=Object.entries(s.relations).reduce((g,[h,d])=>{let{inputType:c,transformArgumentToQueryCondition:b}=o({tableName:d.referencedTableName,nativeTableName:d.referencedTableName}),T=false;return d instanceof One&&(T=!d.isNullable),g[h]=a.relation(h,{args:{where:a.arg({type:c,required:false})},nullable:T,query:(D,x)=>x.abilities[d.referencedTableName].filter(l,{inject:{where:b(D.where)}})}),g},{});return {...C,...u}}})};var q=e=>{if(!e)throw new P("Value not found but required (findFirst)");return e},pe=e=>{let t=e.at(0);if(!t)throw new P("Value not found but required (firstEntry)");return t};var Y=({db:e,schemaBuilder:t,argImplementer:m,makePubSubInstance:o})=>({tableName:n,readAction:i="read",listAction:p="read"})=>{let l=e._.schema[n];if(!l)throw new S(`Could not find schema for ${n.toString()} (query)`);l.primaryKey.at(0)?.name||console.warn(`Could not find primary key for ${n.toString()}. Cannot register subscriptions!`);let{inputType:y,transformArgumentToQueryCondition:r}=m({tableName:n}),{registerOnInstance:a}=o({tableName:n});return t.queryFields(f=>({[`findMany${R(n.toString())}`]:f.drizzleField({type:[n],nullable:false,smartSubscription:true,subscribe:(C,u,g,h,d)=>{a({instance:C,action:"created"}),a({instance:C,action:"removed"});},args:{where:f.arg({type:y,required:false})},resolve:(C,u,g,h,d)=>{let c=h.abilities[n].filter(p,{inject:{where:r(g.where)}}),b=C(c);return c.columns&&(b.columns=c.columns),e.query[n].findMany(b)}}),[`findFirst${R(n.toString())}`]:f.drizzleField({type:n,nullable:false,smartSubscription:true,args:{where:f.arg({type:y,required:false})},resolve:(C,u,g,h,d)=>{let c=h.abilities[n].filter(i,{inject:{where:r(g.where)}}),b=C(c);return c.columns&&(b.columns=c.columns),e.query[n].findFirst(b).then(q)}})}))};var H=({db:e,disableDefaultObjects:t,pubsub:m,pothosConfig:o})=>{let n=new de({plugins:[ye,fe,...o?.plugins??[]],...o,drizzle:{client:e},smartSubscriptions:{...subscribeOptionsFromIterator((i,p)=>m.subscribe(i))}});return n.addScalarType("JSON",JSONResolver),n.addScalarType("Date",DateResolver),n.addScalarType("DateTime",DateTimeISOResolver),t?.query||n.queryType({}),t?.subscription||n.subscriptionType({}),t?.mutation||n.mutationType({}),{schemaBuilder:n}};var Re=e=>`${R(toCamelCase(e.toString()))}WhereInputArgument`,X=({db:e,schemaBuilder:t,enumImplementer:m})=>{let o=new Map,n=({tableName:i,name:p,nativeTableName:l})=>{let s=e._.schema[i];if(l){let f=Object.values(e._.schema).find(C=>C.dbName===l);f&&(s=f);}if(!s)throw new S(`Could not find schema for ${i.toString()} (whereArg)`);let y=p??Re(s.dbName),r=o.get(y);return r||(r={inputType:t.inputType(y,{fields:u=>{let g=c=>{let b=N(c);switch(b){case "Int":return u.int({required:false});case "String":return u.string({required:false});case "Boolean":return u.boolean({required:false});case "Date":return u.field({type:"Date",required:false});case "DateTime":return u.field({type:"DateTime",required:false});case "Float":return u.float({required:false});case "ID":return u.id({required:false});case "JSON":return u.field({type:"JSON",required:false});default:throw new S(`Unsupported argument type ${b} for column ${c}`)}},h=Object.entries(s.columns).reduce((c,[b,T])=>{if(I(T)){let D=E(T),x=m({enumName:D.enumName});c[b]=u.field({type:x,required:false});}else c[b]=g(T.getSQLType());return c},{}),d=Object.entries(s.relations).reduce((c,[b,T])=>{let D=n({tableName:T.referencedTableName,nativeTableName:T.referencedTableName});return c[b]=u.field({type:D.inputType,required:false}),c},{});return {...h,...d}}}),transformArgumentToQueryCondition:u=>{if(!u)return;let g=c=>{let b=s.columns[c],T=u[c];if(T)return eq(b,T)},h=c=>{let b=s.relations[c],T=u[c];if(!T)return;let D=n({tableName:b.referencedTableName,nativeTableName:b.referencedTableName}).transformArgumentToQueryCondition;return D(T)},d=[...Object.keys(s.columns).map(g),...Object.keys(s.relations).map(h)];return and(...d)}},o.set(y,r),r)};return n};var Ee=e=>{let t=V(e),m=$({...e,abilityBuilder:t}),{makePubSubInstance:o,pubsub:n}=W({...e}),{schemaBuilder:i}=H({...e,pubsub:n}),p=K({...e,schemaBuilder:i}),l=X({...e,schemaBuilder:i,enumImplementer:p}),s=J({...e,schemaBuilder:i,makePubSubInstance:o,argImplementer:l,enumImplementer:p}),y=Y({...e,schemaBuilder:i,argImplementer:l,makePubSubInstance:o});return {abilityBuilder:t,schemaBuilder:i,createYoga:a=>createYoga({...a,schema:i.toSchema(),context:m}),object:s,arg:l,query:y,pubsub:o,enum_:p}};
8
- export{S as RumbleError,P as RumbleErrorSafe,q as assertFindFirstExists,pe as assertFirstEntryExists,Ee as rumble};//# sourceMappingURL=index.js.map
7
+ `+L(this.source,m);return t}toJSON(){let t={message:this.message};return this.locations!=null&&(t.locations=this.locations),this.path!=null&&(t.path=this.path),this.extensions!=null&&Object.keys(this.extensions).length>0&&(t.extensions=this.extensions),t}};function k(e){return e===void 0||e.length===0?void 0:e}var S=class extends Error{constructor(t){super(t),this.name="RumbleError";}},P=class extends B{};var A=(e,t)=>new S(`RumbleError: Unknown SQL type '${e}'. Please open an issue (https://github.com/m1212e/rumble/issues) so it can be added. (${t})`);function F(e){if(["serial","int","integer","tinyint","smallint","mediumint"].includes(e))return {value1:1,value2:2};if(["real","decimal","double","float"].includes(e))return {value1:1.1,value2:2.2};if(["string","text","varchar","char","text(256)"].includes(e))return {value1:"a",value2:"b"};if(["uuid"].includes(e))return {value1:"fba31870-5528-42d7-b27e-2e5ee657aea5",value2:"fc65db81-c2d1-483d-8a25-a30e2cf6e02d"};if(["boolean"].includes(e))return {value1:true,value2:false};if(["timestamp","datetime"].includes(e))return {value1:new Date(2022,1,1),value2:new Date(2022,1,2)};if(["date"].includes(e))return {value1:new Date(2022,1,1),value2:new Date(2022,1,2)};if(["json"].includes(e))return {value1:{a:1},value2:{b:2}};throw A(e,"Distinct")}function ie(e){return typeof e!="function"}function se(e){return typeof e=="function"&&e.constructor.name!=="AsyncFunction"}var _=({db:e})=>{let t=e._.schema,m={},o={},n=i=>({allow:p=>{let c=o[i];c||(c={},o[i]=c);let s=Array.isArray(p)?p:[p];for(let y of s){let r=c[y];r||(r="wildcard",c[y]=r);}return {when:y=>{for(let r of s)c[r]==="wildcard"&&(c[r]=[]),c[r].push(y);}}}});for(let i of Object.keys(e.query))m[i]=n(i);return {...m,registeredConditions:o,buildWithUserContext:i=>{let p={},c=s=>({filter:(y,r)=>{let a=o[s];a||(a={});let f=a[y];if(f==="wildcard")return {single:{where:r?.inject?.where,columns:r?.inject?.columns},many:{where:r?.inject?.where,columns:r?.inject?.columns,limit:r?.inject?.limit}};let C=()=>{let b=t[s].primaryKey.at(0);if(!b)throw new S(`No primary key found for entity ${s.toString()}`);let D=F(b.getSQLType());return {where:and(eq(b,D.value1),eq(b,D.value2))}};(!a||!f)&&(f=[C()]);let u=f.filter(ie),x=f.filter(se).map(b=>b(i)),h=[...u,...x];h.filter(b=>b!==void 0).length===0&&h.push(C());let d;for(let b of h)b?.limit&&(d===void 0||b.limit>d)&&(d=b.limit);r?.inject?.limit&&d<r.inject.limit&&(d=r.inject.limit);let l;for(let b of [...h,r?.inject??{}])b?.columns&&(l===void 0?l=b.columns:l={...l,...b.columns});let g=h.filter(b=>b?.where).map(b=>b?.where),T=g.length>0?or(...g):void 0;return r?.inject?.where&&(T=T?and(T,r.inject.where):r.inject.where),{single:{where:T,columns:l},many:{where:T,columns:l,limit:d}}}});for(let s of Object.keys(e.query))p[s]=c(s);return p}}};var V=({context:e,abilityBuilder:t})=>async m=>{let o=e?await e(m):{};return {...o,abilities:t.buildWithUserContext(o)}};function R(e){return String(e).charAt(0).toUpperCase()+String(e).slice(1)}function I(e){let t=E(e);return t.enumValues!==void 0&&t.enumName!==void 0&&typeof t.enumName=="string"&&Array.isArray(t.enumValues)}function E(e){return e.enum??e}var $=({db:e,schemaBuilder:t})=>{let m=new Map;return ({enumVariableName:n,name:i,enumValues:p,enumName:c})=>{let s=e._.fullSchema,y;if(n?y=s[n]:p?y=Object.values(s).filter(I).map(E).find(C=>C.enumValues===p):c&&(y=Object.values(s).filter(I).map(E).find(C=>C.enumName===c)),!y)throw new S(`Could not determine enum structure! (${String(n)}, ${p}, ${c})`);let r=i??`${R(toCamelCase(y.enumName.toString()))}Enum`,a=m.get(r);return a||(a=t.enumType(r,{values:y.enumValues}),m.set(r,a),a)}};function N(e){let t;if(["serial","int","integer","tinyint","smallint","mediumint"].includes(e)&&(t="Int"),["real","decimal","double","float"].includes(e)&&(t="Float"),["string","text","varchar","char","text(256)"].includes(e)&&(t="String"),["uuid"].includes(e)&&(t="ID"),["boolean"].includes(e)&&(t="Boolean"),["timestamp","datetime"].includes(e)&&(t="DateTime"),["date"].includes(e)&&(t="Date"),["json"].includes(e)&&(t="JSON"),t!==void 0)return t;throw A(e,"SQL to GQL")}var ue="RUMBLE_SUBSCRIPTION_NOTIFICATION",me="REMOVED",le="UPDATED",ce="CREATED";function U({action:e,tableName:t,primaryKeyValue:m}){let o;switch(e){case "created":o=ce;break;case "removed":o=me;break;case "updated":o=le;break;default:throw new Error(`Unknown action: ${e}`)}return `${ue}/${t}${m?`/${m}`:""}/${o}`}var M=({subscriptions:e})=>{let t=e?createPubSub(...e):createPubSub();return {pubsub:t,makePubSubInstance:({tableName:o})=>({registerOnInstance({instance:n,action:i,primaryKeyValue:p}){let c=U({tableName:o.toString(),action:i,primaryKeyValue:p});n.register(c);},created(){let n=U({tableName:o.toString(),action:"created"});return t.publish(n)},removed(n){let i=U({tableName:o.toString(),action:"removed"});return t.publish(i)},updated(n){let i=U({tableName:o.toString(),action:"updated",primaryKeyValue:n});return t.publish(i)}})}};var W=({db:e,schemaBuilder:t,makePubSubInstance:m,argImplementer:o,enumImplementer:n})=>({tableName:i,name:p,readAction:c="read"})=>{let s=e._.schema[i];if(!s)throw new S(`Could not find schema for ${i.toString()} (object)`);let y=s.primaryKey.at(0)?.name;y||console.warn(`Could not find primary key for ${i.toString()}. Cannot register subscriptions!`);let{registerOnInstance:r}=m({tableName:i});return t.drizzleObject(i,{name:p??R(i.toString()),subscribe:(a,f,C)=>{if(!y)return;let u=f[y];if(!u){console.warn(`Could not find primary key value for ${JSON.stringify(f)}. Cannot register subscription!`);return}r({instance:a,action:"updated",primaryKeyValue:u});},fields:a=>{let f=(x,h,d)=>{let l=N(x);switch(l){case "Int":return a.exposeInt(h,{nullable:d});case "String":return a.exposeString(h,{nullable:d});case "Boolean":return a.exposeBoolean(h,{nullable:d});case "Date":return a.field({type:"Date",resolve:g=>g[h],nullable:d});case "DateTime":return a.field({type:"DateTime",resolve:g=>g[h],nullable:d});case "Float":return a.exposeFloat(h,{nullable:d});case "ID":return a.exposeID(h,{nullable:d});case "JSON":return a.field({type:"JSON",resolve:g=>g[h],nullable:d});default:throw new S(`Unsupported object type ${l} for column ${h}`)}},C=Object.entries(s.columns).reduce((x,[h,d])=>{if(I(d)){let l=E(d),g=n({enumName:l.enumName});x[h]=a.field({type:g,resolve:T=>T[h],nullable:!d.notNull});}else x[h]=f(d.getSQLType(),h,!d.notNull);return x},{}),u=Object.entries(s.relations).reduce((x,[h,d])=>{let {inputType:l,transformArgumentToQueryCondition:g}=o({tableName:d.referencedTableName,nativeTableName:d.referencedTableName}),T=false,D="many";return d instanceof One&&(T=!d.isNullable,D="single"),x[h]=a.relation(h,{args:{where:a.arg({type:l,required:false})},nullable:T,query:(X,Z)=>Z.abilities[d.referencedTableName].filter(c,{inject:{where:g(X.where)}})[D]}),x},{});return {...C,...u}}})};var q=e=>{if(!e)throw new P("Value not found but required (findFirst)");return e},de=e=>{let t=e.at(0);if(!t)throw new P("Value not found but required (firstEntry)");return t};var J=({db:e,schemaBuilder:t,argImplementer:m,makePubSubInstance:o})=>({tableName:n,readAction:i="read",listAction:p="read"})=>{let c=e._.schema[n];if(!c)throw new S(`Could not find schema for ${n.toString()} (query)`);c.primaryKey.at(0)?.name||console.warn(`Could not find primary key for ${n.toString()}. Cannot register subscriptions!`);let{inputType:y,transformArgumentToQueryCondition:r}=m({tableName:n}),{registerOnInstance:a}=o({tableName:n});return t.queryFields(f=>({[`findMany${R(n.toString())}`]:f.drizzleField({type:[n],nullable:false,smartSubscription:true,subscribe:(C,u,x,h,d)=>{a({instance:C,action:"created"}),a({instance:C,action:"removed"});},args:{where:f.arg({type:y,required:false})},resolve:(C,u,x,h,d)=>{let l=h.abilities[n].filter(p,{inject:{where:r(x.where)}}).many,g=C(l);return l.columns&&(g.columns=l.columns),e.query[n].findMany(g)}}),[`findFirst${R(n.toString())}`]:f.drizzleField({type:n,nullable:false,smartSubscription:true,args:{where:f.arg({type:y,required:false})},resolve:(C,u,x,h,d)=>{let l=h.abilities[n].filter(i,{inject:{where:r(x.where)}}).single,g=C(l);return l.columns&&(g.columns=l.columns),e.query[n].findFirst(g).then(q)}})}))};var Y=({db:e,disableDefaultObjects:t,pubsub:m,pothosConfig:o})=>{let n=new ye({plugins:[fe,he,...o?.plugins??[]],...o,drizzle:{client:e},smartSubscriptions:{...subscribeOptionsFromIterator((i,p)=>m.subscribe(i))}});return n.addScalarType("JSON",JSONResolver),n.addScalarType("Date",DateResolver),n.addScalarType("DateTime",DateTimeISOResolver),t?.query||n.queryType({}),t?.subscription||n.subscriptionType({}),t?.mutation||n.mutationType({}),{schemaBuilder:n}};var De=e=>`${R(toCamelCase(e.toString()))}WhereInputArgument`,H=({db:e,schemaBuilder:t,enumImplementer:m})=>{let o=new Map,n=({tableName:i,name:p,nativeTableName:c})=>{let s=e._.schema[i];if(c){let f=Object.values(e._.schema).find(C=>C.dbName===c);f&&(s=f);}if(!s)throw new S(`Could not find schema for ${i.toString()} (whereArg)`);let y=p??De(s.dbName),r=o.get(y);return r||(r={inputType:t.inputType(y,{fields:u=>{let x=l=>{let g=N(l);switch(g){case "Int":return u.int({required:false});case "String":return u.string({required:false});case "Boolean":return u.boolean({required:false});case "Date":return u.field({type:"Date",required:false});case "DateTime":return u.field({type:"DateTime",required:false});case "Float":return u.float({required:false});case "ID":return u.id({required:false});case "JSON":return u.field({type:"JSON",required:false});default:throw new S(`Unsupported argument type ${g} for column ${l}`)}},h=Object.entries(s.columns).reduce((l,[g,T])=>{if(I(T)){let b=E(T),D=m({enumName:b.enumName});l[g]=u.field({type:D,required:false});}else l[g]=x(T.getSQLType());return l},{}),d=Object.entries(s.relations).reduce((l,[g,T])=>{let b=n({tableName:T.referencedTableName,nativeTableName:T.referencedTableName});return l[g]=u.field({type:b.inputType,required:false}),l},{});return {...h,...d}}}),transformArgumentToQueryCondition:u=>{if(!u)return;let x=l=>{let g=s.columns[l],T=u[l];if(T)return eq(g,T)},h=l=>{let g=s.relations[l],T=u[l];if(!T)return;let b=n({tableName:g.referencedTableName,nativeTableName:g.referencedTableName}).transformArgumentToQueryCondition;return b(T)},d=[...Object.keys(s.columns).map(x),...Object.keys(s.relations).map(h)];return and(...d)}},o.set(y,r),r)};return n};var Be=e=>{let t=_(e),m=V({...e,abilityBuilder:t}),{makePubSubInstance:o,pubsub:n}=M({...e}),{schemaBuilder:i}=Y({...e,pubsub:n}),p=$({...e,schemaBuilder:i}),c=H({...e,schemaBuilder:i,enumImplementer:p}),s=W({...e,schemaBuilder:i,makePubSubInstance:o,argImplementer:c,enumImplementer:p}),y=J({...e,schemaBuilder:i,argImplementer:c,makePubSubInstance:o});return {abilityBuilder:t,schemaBuilder:i,createYoga:a=>createYoga({...a,schema:i.toSchema(),context:m}),object:s,arg:c,query:y,pubsub:o,enum_:p}};
8
+ export{S as RumbleError,P as RumbleErrorSafe,q as assertFindFirstExists,de as assertFirstEntryExists,Be as rumble};//# sourceMappingURL=index.js.map
9
9
  //# sourceMappingURL=index.js.map