@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/README.md +3 -2
- package/index.cjs +8 -2
- package/index.cjs.map +1 -1
- package/index.d.cts +60 -18
- package/index.d.ts +60 -18
- package/index.js +8 -2
- package/index.js.map +1 -1
- package/package.json +1 -1
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
|
-
|
98
|
-
|
99
|
-
|
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
|
-
|
117
|
-
|
118
|
-
|
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
|
-
|
170
|
-
|
171
|
-
|
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
|
-
|
210
|
-
|
211
|
-
|
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
|
-
|
290
|
-
|
291
|
-
|
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
|
-
|
98
|
-
|
99
|
-
|
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
|
-
|
117
|
-
|
118
|
-
|
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
|
-
|
170
|
-
|
171
|
-
|
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
|
-
|
210
|
-
|
211
|
-
|
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
|
-
|
290
|
-
|
291
|
-
|
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
|
-
|
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
|