@m1212e/rumble 0.3.13 → 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.cts CHANGED
@@ -7,6 +7,7 @@ import * as graphql_yoga from 'graphql-yoga';
7
7
  import { createPubSub, YogaServerOptions } from 'graphql-yoga';
8
8
  import * as drizzle_orm from 'drizzle-orm';
9
9
  import SchemaBuilder from '@pothos/core';
10
+ import { GraphQLError } from 'graphql';
10
11
 
11
12
  type QueryConditionObject = Partial<{
12
13
  where: any;
@@ -94,9 +95,15 @@ declare const rumble: <UserContext extends Record<string, any>, DB extends Gener
94
95
  limit: any;
95
96
  }> | undefined;
96
97
  } | undefined) => {
97
- where: drizzle_orm.SQL<unknown> | undefined;
98
- columns: Record<string, any> | undefined;
99
- 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
+ };
100
107
  };
101
108
  }; } : never;
102
109
  };
@@ -113,9 +120,15 @@ declare const rumble: <UserContext extends Record<string, any>, DB extends Gener
113
120
  limit: any;
114
121
  }> | undefined;
115
122
  } | undefined) => {
116
- where: drizzle_orm.SQL<unknown> | undefined;
117
- columns: Record<string, any> | undefined;
118
- 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
+ };
119
132
  };
120
133
  }; } : never;
121
134
  }>;
@@ -166,9 +179,15 @@ declare const rumble: <UserContext extends Record<string, any>, DB extends Gener
166
179
  limit: any;
167
180
  }> | undefined;
168
181
  } | undefined) => {
169
- where: drizzle_orm.SQL<unknown> | undefined;
170
- columns: Record<string, any> | undefined;
171
- 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
+ };
172
191
  };
173
192
  }; } : never;
174
193
  }>;
@@ -206,9 +225,15 @@ declare const rumble: <UserContext extends Record<string, any>, DB extends Gener
206
225
  limit: any;
207
226
  }> | undefined;
208
227
  } | undefined) => {
209
- where: drizzle_orm.SQL<unknown> | undefined;
210
- columns: Record<string, any> | undefined;
211
- 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
+ };
212
237
  };
213
238
  }; } : never;
214
239
  }>;
@@ -286,9 +311,15 @@ declare const rumble: <UserContext extends Record<string, any>, DB extends Gener
286
311
  limit: any;
287
312
  }> | undefined;
288
313
  } | undefined) => {
289
- where: drizzle_orm.SQL<unknown> | undefined;
290
- columns: Record<string, any> | undefined;
291
- 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
+ };
292
323
  };
293
324
  }; } : never;
294
325
  }>;
@@ -329,7 +360,7 @@ declare const rumble: <UserContext extends Record<string, any>, DB extends Gener
329
360
  db.query.users
330
361
  .findFirst({
331
362
  ...query,
332
- where: ctx.abilities.users.filter("read").where,
363
+ where: ctx.abilities.users.filter("read").single.where,
333
364
  })
334
365
  // note that we need to manually raise an error if the value is not found
335
366
  .then(assertFindFirstExists)
@@ -368,7 +399,7 @@ declare const assertFindFirstExists: <T>(value: T | undefined) => T;
368
399
  .where(
369
400
  and(
370
401
  eq(schema.users.id, args.userId),
371
- ctx.abilities.users.filter("update").where
402
+ ctx.abilities.users.filter("update").single.where
372
403
  )
373
404
  )
374
405
  .returning({ id: schema.users.id, name: schema.users.name })
@@ -382,8 +413,19 @@ declare const assertFindFirstExists: <T>(value: T | undefined) => T;
382
413
  */
383
414
  declare const assertFirstEntryExists: <T>(value: T[]) => T;
384
415
 
416
+ /**
417
+ * An error that gets raised by rumble whenever something does not go according to plan.
418
+ * Mostly internals, configuration errors or other unexpected things.
419
+ */
385
420
  declare class RumbleError extends Error {
386
421
  constructor(message: string);
387
422
  }
423
+ /**
424
+ * An error that gets raised by rumble whenever an error occurs in a resolver, containing
425
+ * information safely exposeable to the user.
426
+ * E.g. the assert helpers issue these.
427
+ */
428
+ declare class RumbleErrorSafe extends GraphQLError {
429
+ }
388
430
 
389
- export { RumbleError, assertFindFirstExists, assertFirstEntryExists, rumble };
431
+ export { RumbleError, RumbleErrorSafe, assertFindFirstExists, assertFirstEntryExists, rumble };
package/index.d.ts CHANGED
@@ -7,6 +7,7 @@ import * as graphql_yoga from 'graphql-yoga';
7
7
  import { createPubSub, YogaServerOptions } from 'graphql-yoga';
8
8
  import * as drizzle_orm from 'drizzle-orm';
9
9
  import SchemaBuilder from '@pothos/core';
10
+ import { GraphQLError } from 'graphql';
10
11
 
11
12
  type QueryConditionObject = Partial<{
12
13
  where: any;
@@ -94,9 +95,15 @@ declare const rumble: <UserContext extends Record<string, any>, DB extends Gener
94
95
  limit: any;
95
96
  }> | undefined;
96
97
  } | undefined) => {
97
- where: drizzle_orm.SQL<unknown> | undefined;
98
- columns: Record<string, any> | undefined;
99
- 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
+ };
100
107
  };
101
108
  }; } : never;
102
109
  };
@@ -113,9 +120,15 @@ declare const rumble: <UserContext extends Record<string, any>, DB extends Gener
113
120
  limit: any;
114
121
  }> | undefined;
115
122
  } | undefined) => {
116
- where: drizzle_orm.SQL<unknown> | undefined;
117
- columns: Record<string, any> | undefined;
118
- 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
+ };
119
132
  };
120
133
  }; } : never;
121
134
  }>;
@@ -166,9 +179,15 @@ declare const rumble: <UserContext extends Record<string, any>, DB extends Gener
166
179
  limit: any;
167
180
  }> | undefined;
168
181
  } | undefined) => {
169
- where: drizzle_orm.SQL<unknown> | undefined;
170
- columns: Record<string, any> | undefined;
171
- 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
+ };
172
191
  };
173
192
  }; } : never;
174
193
  }>;
@@ -206,9 +225,15 @@ declare const rumble: <UserContext extends Record<string, any>, DB extends Gener
206
225
  limit: any;
207
226
  }> | undefined;
208
227
  } | undefined) => {
209
- where: drizzle_orm.SQL<unknown> | undefined;
210
- columns: Record<string, any> | undefined;
211
- 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
+ };
212
237
  };
213
238
  }; } : never;
214
239
  }>;
@@ -286,9 +311,15 @@ declare const rumble: <UserContext extends Record<string, any>, DB extends Gener
286
311
  limit: any;
287
312
  }> | undefined;
288
313
  } | undefined) => {
289
- where: drizzle_orm.SQL<unknown> | undefined;
290
- columns: Record<string, any> | undefined;
291
- 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
+ };
292
323
  };
293
324
  }; } : never;
294
325
  }>;
@@ -329,7 +360,7 @@ declare const rumble: <UserContext extends Record<string, any>, DB extends Gener
329
360
  db.query.users
330
361
  .findFirst({
331
362
  ...query,
332
- where: ctx.abilities.users.filter("read").where,
363
+ where: ctx.abilities.users.filter("read").single.where,
333
364
  })
334
365
  // note that we need to manually raise an error if the value is not found
335
366
  .then(assertFindFirstExists)
@@ -368,7 +399,7 @@ declare const assertFindFirstExists: <T>(value: T | undefined) => T;
368
399
  .where(
369
400
  and(
370
401
  eq(schema.users.id, args.userId),
371
- ctx.abilities.users.filter("update").where
402
+ ctx.abilities.users.filter("update").single.where
372
403
  )
373
404
  )
374
405
  .returning({ id: schema.users.id, name: schema.users.name })
@@ -382,8 +413,19 @@ declare const assertFindFirstExists: <T>(value: T | undefined) => T;
382
413
  */
383
414
  declare const assertFirstEntryExists: <T>(value: T[]) => T;
384
415
 
416
+ /**
417
+ * An error that gets raised by rumble whenever something does not go according to plan.
418
+ * Mostly internals, configuration errors or other unexpected things.
419
+ */
385
420
  declare class RumbleError extends Error {
386
421
  constructor(message: string);
387
422
  }
423
+ /**
424
+ * An error that gets raised by rumble whenever an error occurs in a resolver, containing
425
+ * information safely exposeable to the user.
426
+ * E.g. the assert helpers issue these.
427
+ */
428
+ declare class RumbleErrorSafe extends GraphQLError {
429
+ }
388
430
 
389
- export { RumbleError, assertFindFirstExists, assertFirstEntryExists, rumble };
431
+ export { RumbleError, RumbleErrorSafe, assertFindFirstExists, assertFirstEntryExists, rumble };
package/index.js CHANGED
@@ -1,3 +1,9 @@
1
- import {createYoga,createPubSub}from'graphql-yoga';import {and,One,or,eq}from'drizzle-orm';import {toCamelCase}from'drizzle-orm/casing';import ee from'@pothos/core';import te from'@pothos/plugin-drizzle';import ne,{subscribeOptionsFromIterator}from'@pothos/plugin-smart-subscriptions';import {JSONResolver,DateResolver,DateTimeISOResolver}from'graphql-scalars';var h=class extends Error{constructor(t){super(t),this.name="RumbleError";}};var P=(e,t)=>new h(`RumbleError: Unknown SQL type '${e}'. Please open an issue (https://github.com/m1212e/rumble/issues) so it can be added. (${t})`);function U(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 P(e,"Distinct")}function K(e){return typeof e!="function"}function V(e){return typeof e=="function"&&e.constructor.name!=="AsyncFunction"}var N=({db:e})=>{let t=e._.schema,C={},s={},r=o=>({allow:d=>{let m=s[o];m||(m={},s[o]=m);let p=Array.isArray(d)?d:[d];for(let l of p){let i=m[l];i||(i="wildcard",m[l]=i);}return {when:l=>{for(let i of p)m[i]==="wildcard"&&(m[i]=[]),m[i].push(l);}}}});for(let o of Object.keys(e.query))C[o]=r(o);return {...C,registeredConditions:s,buildWithUserContext:o=>{let d={},m=p=>({filter:(l,i)=>{let u=s[p];u||(u={});let b=u[l];if(b==="wildcard")return {where:i?.inject?.where,columns:i?.inject?.columns,limit:i?.inject?.limit};let x=()=>{let g=t[p].primaryKey.at(0);if(!g)throw new h(`No primary key found for entity ${p.toString()}`);let z=U(g.getSQLType());return {where:and(eq(g,z.value1),eq(g,z.value2))}};(!u||!b)&&(b=[x()]);let f=b.filter(K),D=b.filter(V).map(g=>g(o)),a=[...f,...D];a.filter(g=>g!==void 0).length===0&&a.push(x());let n;for(let g of a)g?.limit&&(n===void 0||g.limit>n)&&(n=g.limit);i?.inject?.limit&&n<i.inject.limit&&(n=i.inject.limit);let c;for(let g of [...a,i?.inject??{}])g?.columns&&(c===void 0?c=g.columns:c={...c,...g.columns});let y=a.filter(g=>g?.where).map(g=>g?.where),R=y.length>0?or(...y):void 0;return i?.inject?.where&&(R=R?and(R,i.inject.where):i.inject.where),{where:R,columns:c,limit:n}}});for(let p of Object.keys(e.query))d[p]=m(p);return d}}};var Q=({context:e,abilityBuilder:t})=>async C=>{let s=e?await e(C):{};return {...s,abilities:t.buildWithUserContext(s)}};function T(e){return String(e).charAt(0).toUpperCase()+String(e).slice(1)}function B(e){let t=S(e);return t.enumValues!==void 0&&t.enumName!==void 0&&typeof t.enumName=="string"&&Array.isArray(t.enumValues)}function S(e){return e.enum??e}var O=({db:e,schemaBuilder:t})=>{let C=new Map;return ({enumVariableName:r,name:o,enumValues:d,enumName:m})=>{let p=e._.fullSchema,l;if(r?l=p[r]:d?l=Object.values(p).filter(B).map(S).find(x=>x.enumValues===d):m&&(l=Object.values(p).filter(B).map(S).find(x=>x.enumName===m)),!l)throw new h(`Could not determine enum structure! (${String(r)}, ${d}, ${m})`);let i=o??`${T(toCamelCase(l.enumName.toString()))}Enum`,u=C.get(i);return u||(u=t.enumType(i,{values:l.enumValues}),C.set(i,u),u)}};function I(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 P(e,"SQL to GQL")}var J="RUMBLE_SUBSCRIPTION_NOTIFICATION",W="REMOVED",Y="UPDATED",X="CREATED";function A({action:e,tableName:t,primaryKeyValue:C}){let s;switch(e){case "created":s=X;break;case "removed":s=W;break;case "updated":s=Y;break;default:throw new Error(`Unknown action: ${e}`)}return `${J}/${t}${C?`/${C}`:""}/${s}`}var F=({subscriptions:e})=>{let t=e?createPubSub(...e):createPubSub();return {pubsub:t,makePubSubInstance:({tableName:s})=>({registerOnInstance({instance:r,action:o,primaryKeyValue:d}){let m=A({tableName:s.toString(),action:o,primaryKeyValue:d});r.register(m);},created(){let r=A({tableName:s.toString(),action:"created"});return t.publish(r)},removed(r){let o=A({tableName:s.toString(),action:"removed"});return t.publish(o)},updated(r){let o=A({tableName:s.toString(),action:"updated",primaryKeyValue:r});return t.publish(o)}})}};var L=({db:e,schemaBuilder:t,makePubSubInstance:C,argImplementer:s,enumImplementer:r})=>({tableName:o,name:d,readAction:m="read"})=>{let p=e._.schema[o];if(!p)throw new h(`Could not find schema for ${o.toString()} (object)`);let l=p.primaryKey.at(0)?.name;l||console.warn(`Could not find primary key for ${o.toString()}. Cannot register subscriptions!`);let{registerOnInstance:i}=C({tableName:o});return t.drizzleObject(o,{name:d??T(o.toString()),subscribe:(u,b,x)=>{if(!l)return;let f=b[l];if(!f){console.warn(`Could not find primary key value for ${JSON.stringify(b)}. Cannot register subscription!`);return}i({instance:u,action:"updated",primaryKeyValue:f});},fields:u=>{let b=(D,a,n)=>{let c=I(D);switch(c){case "Int":return u.exposeInt(a,{nullable:n});case "String":return u.exposeString(a,{nullable:n});case "Boolean":return u.exposeBoolean(a,{nullable:n});case "Date":return u.field({type:"Date",resolve:y=>y[a],nullable:n});case "DateTime":return u.field({type:"DateTime",resolve:y=>y[a],nullable:n});case "Float":return u.exposeFloat(a,{nullable:n});case "ID":return u.exposeID(a,{nullable:n});case "JSON":return u.field({type:"JSON",resolve:y=>y[a],nullable:n});default:throw new h(`Unsupported object type ${c} for column ${a}`)}},x=Object.entries(p.columns).reduce((D,[a,n])=>{if(B(n)){let c=S(n),y=r({enumName:c.enumName});D[a]=u.field({type:y,resolve:R=>R[a],nullable:!n.notNull});}else D[a]=b(n.getSQLType(),a,!n.notNull);return D},{}),f=Object.entries(p.relations).reduce((D,[a,n])=>{let{inputType:c,transformArgumentToQueryCondition:y}=s({tableName:n.referencedTableName,nativeTableName:n.referencedTableName}),R=false;return n instanceof One&&(R=!n.isNullable),D[a]=u.relation(a,{args:{where:u.arg({type:c,required:false})},nullable:R,query:(E,g)=>g.abilities[n.referencedTableName].filter(m,{inject:{where:y(E.where)}})}),D},{});return {...x,...f}}})};var v=e=>{if(!e)throw new h("Value not found but required (findFirst)");return e},Z=e=>{let t=e.at(0);if(!t)throw new h("Value not found but required (firstEntry)");return t};var j=({db:e,schemaBuilder:t,argImplementer:C,makePubSubInstance:s})=>({tableName:r,readAction:o="read",listAction:d="read"})=>{let m=e._.schema[r];if(!m)throw new h(`Could not find schema for ${r.toString()} (query)`);m.primaryKey.at(0)?.name||console.warn(`Could not find primary key for ${r.toString()}. Cannot register subscriptions!`);let{inputType:l,transformArgumentToQueryCondition:i}=C({tableName:r}),{registerOnInstance:u}=s({tableName:r});return t.queryFields(b=>({[`findMany${T(r.toString())}`]:b.drizzleField({type:[r],nullable:false,smartSubscription:true,subscribe:(x,f,D,a,n)=>{u({instance:x,action:"created"}),u({instance:x,action:"removed"});},args:{where:b.arg({type:l,required:false})},resolve:(x,f,D,a,n)=>{let c=a.abilities[r].filter(d,{inject:{where:i(D.where)}}),y=x(c);return c.columns&&(y.columns=c.columns),e.query[r].findMany(y)}}),[`findFirst${T(r.toString())}`]:b.drizzleField({type:r,nullable:false,smartSubscription:true,args:{where:b.arg({type:l,required:false})},resolve:(x,f,D,a,n)=>{let c=a.abilities[r].filter(o,{inject:{where:i(D.where)}}),y=x(c);return c.columns&&(y.columns=c.columns),e.query[r].findFirst(y).then(v)}})}))};var G=({db:e,disableDefaultObjects:t,pubsub:C,pothosConfig:s})=>{let r=new ee({plugins:[te,ne,...s?.plugins??[]],...s,drizzle:{client:e},smartSubscriptions:{...subscribeOptionsFromIterator((o,d)=>C.subscribe(o))}});return r.addScalarType("JSON",JSONResolver),r.addScalarType("Date",DateResolver),r.addScalarType("DateTime",DateTimeISOResolver),t?.query||r.queryType({}),t?.subscription||r.subscriptionType({}),t?.mutation||r.mutationType({}),{schemaBuilder:r}};var _=({db:e,schemaBuilder:t,enumImplementer:C})=>{let s=new Map;return ({tableName:o,name:d,nativeTableName:m})=>{let p=e._.schema[o];if(m){let b=Object.values(e._.schema).find(x=>x.dbName===m);b&&(p=b);}if(!p)throw new h(`Could not find schema for ${o.toString()} (whereArg)`);let l=d??`${T(toCamelCase(o.toString()))}WhereInputArgument`,i=s.get(l);return i||(i={inputType:t.inputType(l,{fields:f=>{let D=n=>{let c=I(n);switch(c){case "Int":return f.int({required:false});case "String":return f.string({required:false});case "Boolean":return f.boolean({required:false});case "Date":return f.field({type:"Date",required:false});case "DateTime":return f.field({type:"DateTime",required:false});case "Float":return f.float({required:false});case "ID":return f.id({required:false});case "JSON":return f.field({type:"JSON",required:false});default:throw new h(`Unsupported argument type ${c} for column ${n}`)}};return {...Object.entries(p.columns).reduce((n,[c,y])=>{if(B(y)){let R=S(y),E=C({enumName:R.enumName});n[c]=f.field({type:E,required:false});}else n[c]=D(y.getSQLType());return n},{})}}}),transformArgumentToQueryCondition:f=>{if(!f)return;let D=n=>{let c=p.columns[n],y=f[n];if(y)return eq(c,y)},a=Object.keys(p.columns).map(D);return and(...a)}},s.set(l,i),i)}};var pe=e=>{let t=N(e),C=Q({...e,abilityBuilder:t}),{makePubSubInstance:s,pubsub:r}=F({...e}),{schemaBuilder:o}=G({...e,pubsub:r}),d=O({...e,schemaBuilder:o}),m=_({...e,schemaBuilder:o,enumImplementer:d}),p=L({...e,schemaBuilder:o,makePubSubInstance:s,argImplementer:m,enumImplementer:d}),l=j({...e,schemaBuilder:o,argImplementer:m,makePubSubInstance:s});return {abilityBuilder:t,schemaBuilder:o,createYoga:u=>createYoga({...u,schema:o.toSchema(),context:C}),object:p,arg:m,query:l,pubsub:s,enum_:d}};
2
- export{h as RumbleError,v as assertFindFirstExists,Z as assertFirstEntryExists,pe as rumble};//# sourceMappingURL=index.js.map
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
+
5
+ `+Q(m.loc));else if(this.source&&this.locations)for(let m of this.locations)t+=`
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 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
3
9
  //# sourceMappingURL=index.js.map