@m1212e/rumble 0.3.12 → 0.3.14
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 +52 -51
- package/index.cjs +8 -2
- package/index.cjs.map +1 -1
- package/index.d.cts +32 -14
- package/index.d.ts +32 -14
- package/index.js +8 -2
- package/index.js.map +1 -1
- package/package.json +1 -1
package/index.d.ts
CHANGED
@@ -3,9 +3,11 @@ import * as drizzle_orm_singlestore_core from 'drizzle-orm/singlestore-core';
|
|
3
3
|
import * as drizzle_orm_pg_core from 'drizzle-orm/pg-core';
|
4
4
|
import * as _pothos_plugin_drizzle from '@pothos/plugin-drizzle';
|
5
5
|
import { DrizzleClient } from '@pothos/plugin-drizzle';
|
6
|
-
import * as drizzle_orm from 'drizzle-orm';
|
7
6
|
import * as graphql_yoga from 'graphql-yoga';
|
8
7
|
import { createPubSub, YogaServerOptions } from 'graphql-yoga';
|
8
|
+
import * as drizzle_orm from 'drizzle-orm';
|
9
|
+
import SchemaBuilder from '@pothos/core';
|
10
|
+
import { GraphQLError } from 'graphql';
|
9
11
|
|
10
12
|
type QueryConditionObject = Partial<{
|
11
13
|
where: any;
|
@@ -21,7 +23,8 @@ type GenericDrizzleDbTypeConstraints = {
|
|
21
23
|
};
|
22
24
|
} & DrizzleClient;
|
23
25
|
|
24
|
-
type
|
26
|
+
type CustomRumblePothosConfig = Omit<ConstructorParameters<typeof SchemaBuilder>[0], "smartSubscriptions" | "drizzle">;
|
27
|
+
type RumbleInput<UserContext extends Record<string, any>, DB extends GenericDrizzleDbTypeConstraints, RequestEvent extends Record<string, any>, Action extends string, PothosConfig extends CustomRumblePothosConfig> = {
|
25
28
|
/**
|
26
29
|
* Your drizzle database instance
|
27
30
|
*/
|
@@ -47,9 +50,13 @@ type RumbleInput<UserContext extends Record<string, any>, DB extends GenericDriz
|
|
47
50
|
* Customization for subscriptions. See https://the-guild.dev/graphql/yoga-server/docs/features/subscriptions#distributed-pubsub-for-production
|
48
51
|
*/
|
49
52
|
subscriptions?: Parameters<typeof createPubSub>;
|
53
|
+
/**
|
54
|
+
* Options passed along to the pothos schema builder.
|
55
|
+
*/
|
56
|
+
pothosConfig?: PothosConfig;
|
50
57
|
};
|
51
58
|
|
52
|
-
declare const rumble: <UserContext extends Record<string, any>, DB extends GenericDrizzleDbTypeConstraints, RequestEvent extends Record<string, any>, Action extends string = "read" | "update" | "delete">(rumbleInput: RumbleInput<UserContext, DB, RequestEvent, Action>) => {
|
59
|
+
declare const rumble: <UserContext extends Record<string, any>, DB extends GenericDrizzleDbTypeConstraints, RequestEvent extends Record<string, any>, PothosConfig extends CustomRumblePothosConfig, Action extends string = "read" | "update" | "delete">(rumbleInput: RumbleInput<UserContext, DB, RequestEvent, Action, PothosConfig>) => {
|
53
60
|
/**
|
54
61
|
* The ability builder. Use it to declare whats allowed for each entity in your DB.
|
55
62
|
*
|
@@ -88,8 +95,8 @@ declare const rumble: <UserContext extends Record<string, any>, DB extends Gener
|
|
88
95
|
limit: any;
|
89
96
|
}> | undefined;
|
90
97
|
} | undefined) => {
|
91
|
-
where:
|
92
|
-
columns: any;
|
98
|
+
where: drizzle_orm.SQL<unknown> | undefined;
|
99
|
+
columns: Record<string, any> | undefined;
|
93
100
|
limit: any;
|
94
101
|
};
|
95
102
|
}; } : never;
|
@@ -107,8 +114,8 @@ declare const rumble: <UserContext extends Record<string, any>, DB extends Gener
|
|
107
114
|
limit: any;
|
108
115
|
}> | undefined;
|
109
116
|
} | undefined) => {
|
110
|
-
where:
|
111
|
-
columns: any;
|
117
|
+
where: drizzle_orm.SQL<unknown> | undefined;
|
118
|
+
columns: Record<string, any> | undefined;
|
112
119
|
limit: any;
|
113
120
|
};
|
114
121
|
}; } : never;
|
@@ -160,8 +167,8 @@ declare const rumble: <UserContext extends Record<string, any>, DB extends Gener
|
|
160
167
|
limit: any;
|
161
168
|
}> | undefined;
|
162
169
|
} | undefined) => {
|
163
|
-
where:
|
164
|
-
columns: any;
|
170
|
+
where: drizzle_orm.SQL<unknown> | undefined;
|
171
|
+
columns: Record<string, any> | undefined;
|
165
172
|
limit: any;
|
166
173
|
};
|
167
174
|
}; } : never;
|
@@ -200,8 +207,8 @@ declare const rumble: <UserContext extends Record<string, any>, DB extends Gener
|
|
200
207
|
limit: any;
|
201
208
|
}> | undefined;
|
202
209
|
} | undefined) => {
|
203
|
-
where:
|
204
|
-
columns: any;
|
210
|
+
where: drizzle_orm.SQL<unknown> | undefined;
|
211
|
+
columns: Record<string, any> | undefined;
|
205
212
|
limit: any;
|
206
213
|
};
|
207
214
|
}; } : never;
|
@@ -280,8 +287,8 @@ declare const rumble: <UserContext extends Record<string, any>, DB extends Gener
|
|
280
287
|
limit: any;
|
281
288
|
}> | undefined;
|
282
289
|
} | undefined) => {
|
283
|
-
where:
|
284
|
-
columns: any;
|
290
|
+
where: drizzle_orm.SQL<unknown> | undefined;
|
291
|
+
columns: Record<string, any> | undefined;
|
285
292
|
limit: any;
|
286
293
|
};
|
287
294
|
}; } : never;
|
@@ -376,8 +383,19 @@ declare const assertFindFirstExists: <T>(value: T | undefined) => T;
|
|
376
383
|
*/
|
377
384
|
declare const assertFirstEntryExists: <T>(value: T[]) => T;
|
378
385
|
|
386
|
+
/**
|
387
|
+
* An error that gets raised by rumble whenever something does not go according to plan.
|
388
|
+
* Mostly internals, configuration errors or other unexpected things.
|
389
|
+
*/
|
379
390
|
declare class RumbleError extends Error {
|
380
391
|
constructor(message: string);
|
381
392
|
}
|
393
|
+
/**
|
394
|
+
* An error that gets raised by rumble whenever an error occurs in a resolver, containing
|
395
|
+
* information safely exposeable to the user.
|
396
|
+
* E.g. the assert helpers issue these.
|
397
|
+
*/
|
398
|
+
declare class RumbleErrorSafe extends GraphQLError {
|
399
|
+
}
|
382
400
|
|
383
|
-
export { RumbleError, assertFindFirstExists, assertFirstEntryExists, rumble };
|
401
|
+
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 T=class extends Error{constructor(t){super(t),this.name="RumbleError";}};var I=(e,t)=>new T(`RumbleError: Unknown SQL type '${e}'. Please open an issue (https://github.com/m1212e/rumble/issues) so it can be added. (${t})`);function q(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 I(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,x={},r={},o=i=>({allow:d=>{let m=r[i];m||(m={},r[i]=m);let p=Array.isArray(d)?d:[d];for(let l of p){let s=m[l];s||(s="wildcard",m[l]=s);}return {when:l=>{for(let s of p)m[s]==="wildcard"&&(m[s]=[]),m[s].push(l);}}}});for(let i of Object.keys(e.query))x[i]=o(i);return {...x,registeredConditions:r,buildWithUserContext:i=>{let d={},m=p=>({filter:(l,s)=>{let a=r[p];a||(a={});let D=a[l];if(D==="wildcard")return {where:void 0,columns:void 0,limit:void 0,...s?.inject};let g=()=>{let b=t[p].primaryKey.at(0);if(!b)throw new T(`No primary key found for entity ${p.toString()}`);let U=q(b.getSQLType());return {where:and(eq(b,U.value1),eq(b,U.value2))}};(!a||!D)&&(D=[g()]);let f=D.filter(K),S=D.filter(V).map(b=>b(i)),u=[...f,...S];u.filter(b=>b!==void 0).length===0&&u.push(g());let n;for(let b of u)b?.limit&&(n===void 0||b.limit>n)&&(n=b.limit);s?.inject?.limit&&n<s.inject.limit&&(n=s.inject.limit);let c;for(let b of [...u,s?.inject??{}])b?.columns&&(c===void 0?c=b.columns:c={...c,...b.columns});let y=u.filter(b=>b?.where).map(b=>b?.where),R=y.length>0?or(...y):void 0;return s?.inject?.where&&(R=R?and(R,s.inject.where):s.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 x=>{let r=e?await e(x):{};return {...r,abilities:t.buildWithUserContext(r)}};function C(e){return String(e).charAt(0).toUpperCase()+String(e).slice(1)}function E(e){let t=B(e);return t.enumValues!==void 0&&t.enumName!==void 0&&typeof t.enumName=="string"&&Array.isArray(t.enumValues)}function B(e){return e.enum??e}var O=({db:e,schemaBuilder:t})=>{let x=new Map;return ({enumVariableName:o,name:i,enumValues:d,enumName:m})=>{let p=e._.fullSchema,l;if(o?l=p[o]:d?l=Object.values(p).filter(E).map(B).find(g=>g.enumValues===d):m&&(l=Object.values(p).filter(E).map(B).find(g=>g.enumName===m)),!l)throw new T(`Could not determine enum structure! (${String(o)}, ${d}, ${m})`);let s=i??`${C(toCamelCase(l.enumName.toString()))}Enum`,a=x.get(s);return a||(a=t.enumType(s,{values:l.enumValues}),x.set(s,a),a)}};function A(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 I(e,"SQL to GQL")}var J="RUMBLE_SUBSCRIPTION_NOTIFICATION",W="REMOVED",Y="UPDATED",X="CREATED";function v({action:e,tableName:t,primaryKeyValue:x}){let r;switch(e){case "created":r=X;break;case "removed":r=W;break;case "updated":r=Y;break;default:throw new Error(`Unknown action: ${e}`)}return `${J}/${t}${x?`/${x}`:""}/${r}`}var F=({subscriptions:e})=>{let t=e?createPubSub(...e):createPubSub();return {pubsub:t,makePubSubInstance:({tableName:r})=>({registerOnInstance({instance:o,action:i,primaryKeyValue:d}){let m=v({tableName:r.toString(),action:i,primaryKeyValue:d});o.register(m);},created(){let o=v({tableName:r.toString(),action:"created"});return t.publish(o)},removed(o){let i=v({tableName:r.toString(),action:"removed"});return t.publish(i)},updated(o){let i=v({tableName:r.toString(),action:"updated",primaryKeyValue:o});return t.publish(i)}})}};var L=({db:e,schemaBuilder:t,makePubSubInstance:x,argImplementer:r,enumImplementer:o})=>({tableName:i,name:d,readAction:m="read"})=>{let p=e._.schema[i];if(!p)throw new T(`Could not find schema for ${i.toString()} (object)`);let l=p.primaryKey.at(0)?.name;l||console.warn(`Could not find primary key for ${i.toString()}. Cannot register subscriptions!`);let{registerOnInstance:s}=x({tableName:i});return t.drizzleObject(i,{name:d??C(i.toString()),subscribe:(a,D,g)=>{if(!l)return;let f=D[l];if(!f){console.warn(`Could not find primary key value for ${JSON.stringify(D)}. Cannot register subscription!`);return}s({instance:a,action:"updated",primaryKeyValue:f});},fields:a=>{let D=(S,u,n)=>{let c=A(S);switch(c){case "Int":return a.exposeInt(u,{nullable:n});case "String":return a.exposeString(u,{nullable:n});case "Boolean":return a.exposeBoolean(u,{nullable:n});case "Date":return a.field({type:"Date",resolve:y=>y[u],nullable:n});case "DateTime":return a.field({type:"DateTime",resolve:y=>y[u],nullable:n});case "Float":return a.exposeFloat(u,{nullable:n});case "ID":return a.exposeID(u,{nullable:n});case "JSON":return a.field({type:"JSON",resolve:y=>y[u],nullable:n});default:throw new T(`Unsupported object type ${c} for column ${u}`)}},g=Object.entries(p.columns).reduce((S,[u,n])=>{if(E(n)){let c=B(n),y=o({enumName:c.enumName});S[u]=a.field({type:y,resolve:R=>R[u],nullable:!n.notNull});}else S[u]=D(n.getSQLType(),u,!n.notNull);return S},{}),f=Object.entries(p.relations).reduce((S,[u,n])=>{let{inputType:c,transformArgumentToQueryCondition:y}=r({tableName:n.referencedTableName,nativeTableName:n.referencedTableName}),R=false;return n instanceof One&&(R=!n.isNullable),S[u]=a.relation(u,{args:{where:a.arg({type:c,required:false})},nullable:R,query:(h,b)=>b.abilities[n.referencedTableName].filter(m,{inject:{where:y(h.where)}})}),S},{});return {...g,...f}}})};var z=e=>{if(!e)throw new T("Value not found but required (findFirst)");return e},Z=e=>{let t=e.at(0);if(!t)throw new T("Value not found but required (firstEntry)");return t};var j=({db:e,schemaBuilder:t,argImplementer:x,makePubSubInstance:r})=>({tableName:o,readAction:i="read",listAction:d="read"})=>{let m=e._.schema[o];if(!m)throw new T(`Could not find schema for ${o.toString()} (query)`);m.primaryKey.at(0)?.name||console.warn(`Could not find primary key for ${o.toString()}. Cannot register subscriptions!`);let{inputType:l,transformArgumentToQueryCondition:s}=x({tableName:o}),{registerOnInstance:a}=r({tableName:o});return t.queryFields(D=>({[`findMany${C(o.toString())}`]:D.drizzleField({type:[o],nullable:false,smartSubscription:true,subscribe:(g,f,S,u,n)=>{a({instance:g,action:"created"}),a({instance:g,action:"removed"});},args:{where:D.arg({type:l,required:false})},resolve:(g,f,S,u,n)=>{let c=u.abilities[o].filter(d,{inject:{where:s(S.where)}}),y=g(c);return c.columns&&(y.columns=c.columns),e.query[o].findMany(y)}}),[`findFirst${C(o.toString())}`]:D.drizzleField({type:o,nullable:false,smartSubscription:true,args:{where:D.arg({type:l,required:false})},resolve:(g,f,S,u,n)=>{let c=u.abilities[o].filter(i,{inject:{where:s(S.where)}}),y=g(c);return c.columns&&(y.columns=c.columns),e.query[o].findFirst(y).then(z)}})}))};var G=({db:e,disableDefaultObjects:t,pubsub:x})=>{let r=new ee({plugins:[te,ne],drizzle:{client:e},smartSubscriptions:{...subscribeOptionsFromIterator((o,i)=>x.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:x})=>{let r=new Map;return ({tableName:i,name:d,nativeTableName:m})=>{let p=e._.schema[i];if(m){let D=Object.values(e._.schema).find(g=>g.dbName===m);D&&(p=D);}if(!p)throw new T(`Could not find schema for ${i.toString()} (whereArg)`);let l=d??`${C(toCamelCase(i.toString()))}WhereInputArgument`,s=r.get(l);return s||(s={inputType:t.inputType(l,{fields:f=>{let S=n=>{let c=A(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 T(`Unsupported argument type ${c} for column ${n}`)}};return {...Object.entries(p.columns).reduce((n,[c,y])=>{if(E(y)){let R=B(y),h=x({enumName:R.enumName});n[c]=f.field({type:h,required:false});}else n[c]=S(y.getSQLType());return n},{})}}}),transformArgumentToQueryCondition:f=>{if(!f)return;let S=n=>{let c=p.columns[n],y=f[n];if(y)return eq(c,y)},u=Object.keys(p.columns).map(S);return and(...u)}},r.set(l,s),s)}};var pe=e=>{let t=N(e),x=Q({...e,abilityBuilder:t}),{makePubSubInstance:r,pubsub:o}=F({...e}),{schemaBuilder:i}=G({...e,pubsub:o}),d=O({...e,schemaBuilder:i}),m=_({...e,schemaBuilder:i,enumImplementer:d}),p=L({...e,schemaBuilder:i,makePubSubInstance:r,argImplementer:m,enumImplementer:d}),l=j({...e,schemaBuilder:i,argImplementer:m,makePubSubInstance:r});return {abilityBuilder:t,schemaBuilder:i,createYoga:a=>createYoga({...a,schema:i.toSchema(),context:x}),object:p,arg:m,query:l,pubsub:r,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 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+=`
|
4
|
+
|
5
|
+
`+k(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 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
|
3
9
|
//# sourceMappingURL=index.js.map
|