@m1212e/rumble 0.5.2 → 0.5.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.d.ts CHANGED
@@ -3,10 +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 SchemaBuilder from '@pothos/core';
7
+ import SchemaBuilder__default, { SchemaTypes, BasePlugin, PothosOutputFieldConfig } from '@pothos/core';
6
8
  import * as graphql_yoga from 'graphql-yoga';
7
9
  import { createPubSub, YogaServerOptions } from 'graphql-yoga';
8
10
  import * as drizzle_orm from 'drizzle-orm';
9
- import SchemaBuilder, { SchemaTypes, BasePlugin, PothosOutputFieldConfig } from '@pothos/core';
10
11
  import { GraphQLFieldResolver, GraphQLError } from 'graphql';
11
12
 
12
13
  declare const pluginName = "ManualFiltersPlugin";
@@ -46,7 +47,7 @@ type GenericDrizzleDbTypeConstraints = {
46
47
  };
47
48
  } & DrizzleClient;
48
49
 
49
- type CustomRumblePothosConfig = Omit<ConstructorParameters<typeof SchemaBuilder>[0], "smartSubscriptions" | "drizzle">;
50
+ type CustomRumblePothosConfig = Omit<ConstructorParameters<typeof SchemaBuilder__default>[0], "smartSubscriptions" | "drizzle">;
50
51
  type RumbleInput<UserContext extends Record<string, any>, DB extends GenericDrizzleDbTypeConstraints, RequestEvent extends Record<string, any>, Action extends string, PothosConfig extends CustomRumblePothosConfig> = {
51
52
  /**
52
53
  * Your drizzle database instance
@@ -199,10 +200,11 @@ declare const rumble: <UserContext extends Record<string, any>, DB extends Gener
199
200
  /**
200
201
  * A function for creating default objects for your schema
201
202
  */
202
- object: <ExplicitTableName extends keyof NonNullable<DB["_"]["schema"]>, RefName extends string>({ tableName, name, readAction, }: {
203
+ object: <ExplicitTableName extends keyof NonNullable<DB["_"]["schema"]>, RefName extends string, Extender extends ((t: any) => SchemaBuilder.FieldMap) | undefined>({ tableName, name, readAction, extend, }: {
203
204
  tableName: ExplicitTableName;
204
205
  name?: RefName | undefined;
205
206
  readAction?: Action | undefined;
207
+ extend?: Extender | undefined;
206
208
  }) => _pothos_plugin_drizzle.DrizzleObjectRef<PothosSchemaTypes.ExtendDefaultTypes<{
207
209
  Context: Awaited<UserContext & {
208
210
  abilities: keyof DB["query"] extends infer T_4 extends keyof DB["query"] ? { [key_5 in T_4]: {
package/index.js CHANGED
@@ -1,9 +1,9 @@
1
- import {createYoga,createPubSub}from'graphql-yoga';import {One,or,and,eq}from'drizzle-orm';import {toCamelCase}from'drizzle-orm/casing';import xe,{BasePlugin}from'@pothos/core';import Re from'@pothos/plugin-drizzle';import De,{subscribeOptionsFromIterator}from'@pothos/plugin-smart-subscriptions';import {JSONResolver,DateResolver,DateTimeISOResolver}from'graphql-scalars';function Q(e){return typeof e=="object"&&e!==null}function k(e,t){throw new Error("Unexpected invariant triggered.")}var ie=/\r\n|[\n\r]/g;function N(e,t){let l=0,p=1;for(let n of e.body.matchAll(ie)){if(typeof n.index=="number"||k(),n.index>=t)break;l=n.index+n[0].length,p+=1;}return {line:p,column:t+1-l}}function j(e){return q(e.source,N(e.source,e.start))}function q(e,t){let l=e.locationOffset.column-1,p="".padStart(l)+e.body,n=t.line-1,d=e.locationOffset.line-1,i=t.line+d,y=t.line===1?l:0,r=t.column+y,s=`${e.name}:${i}:${r}
2
- `,o=p.split(/\r\n|[\n\r]/g),f=o[n];if(f.length>120){let a=Math.floor(r/80),c=r%80,m=[];for(let x=0;x<f.length;x+=80)m.push(f.slice(x,x+80));return s+G([[`${i} |`,m[0]],...m.slice(1,a+1).map(x=>["|",x]),["|","^".padStart(c)],["|",m[a+1]]])}return s+G([[`${i-1} |`,o[n-1]],[`${i} |`,f],["|","^".padStart(r)],[`${i+1} |`,o[n+1]]])}function G(e){let t=e.filter(([p,n])=>n!==void 0),l=Math.max(...t.map(([p])=>p.length));return t.map(([p,n])=>p.padStart(l)+(n?" "+n:"")).join(`
3
- `)}function se(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,...l){var p,n,d;let{nodes:i,source:y,positions:r,path:s,originalError:o,extensions:f}=se(l);super(t),this.name="GraphQLError",this.path=s??void 0,this.originalError=o??void 0,this.nodes=_(Array.isArray(i)?i:i?[i]:void 0);let a=_((p=this.nodes)===null||p===void 0?void 0:p.map(m=>m.loc).filter(m=>m!=null));this.source=y??(a==null||(n=a[0])===null||n===void 0?void 0:n.source),this.positions=r??a?.map(m=>m.start),this.locations=r&&y?r.map(m=>N(y,m)):a?.map(m=>N(m.source,m.start));let c=Q(o?.extensions)?o?.extensions:void 0;this.extensions=(d=f??c)!==null&&d!==void 0?d: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}}),o!=null&&o.stack?Object.defineProperty(this,"stack",{value:o.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 l of this.nodes)l.loc&&(t+=`
1
+ import {createYoga,createPubSub}from'graphql-yoga';import {One,or,and,eq}from'drizzle-orm';import {toCamelCase}from'drizzle-orm/casing';import Ce,{BasePlugin}from'@pothos/core';import Ee from'@pothos/plugin-drizzle';import Pe,{subscribeOptionsFromIterator}from'@pothos/plugin-smart-subscriptions';import {JSONResolver,DateResolver,DateTimeISOResolver}from'graphql-scalars';function k(e){return typeof e=="object"&&e!==null}function G(e,t){throw new Error("Unexpected invariant triggered.")}var ae=/\r\n|[\n\r]/g;function v(e,t){let p=0,m=1;for(let n of e.body.matchAll(ae)){if(typeof n.index=="number"||G(),n.index>=t)break;p=n.index+n[0].length,m+=1;}return {line:m,column:t+1-p}}function _(e){return q(e.source,v(e.source,e.start))}function q(e,t){let p=e.locationOffset.column-1,m="".padStart(p)+e.body,n=t.line-1,d=e.locationOffset.line-1,i=t.line+d,y=t.line===1?p:0,r=t.column+y,a=`${e.name}:${i}:${r}
2
+ `,o=m.split(/\r\n|[\n\r]/g),h=o[n];if(h.length>120){let f=Math.floor(r/80),s=r%80,u=[];for(let b=0;b<h.length;b+=80)u.push(h.slice(b,b+80));return a+j([[`${i} |`,u[0]],...u.slice(1,f+1).map(b=>["|",b]),["|","^".padStart(s)],["|",u[f+1]]])}return a+j([[`${i-1} |`,o[n-1]],[`${i} |`,h],["|","^".padStart(r)],[`${i+1} |`,o[n+1]]])}function j(e){let t=e.filter(([m,n])=>n!==void 0),p=Math.max(...t.map(([m])=>m.length));return t.map(([m,n])=>m.padStart(p)+(n?" "+n:"")).join(`
3
+ `)}function ue(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,...p){var m,n,d;let{nodes:i,source:y,positions:r,path:a,originalError:o,extensions:h}=ue(p);super(t),this.name="GraphQLError",this.path=a??void 0,this.originalError=o??void 0,this.nodes=K(Array.isArray(i)?i:i?[i]:void 0);let f=K((m=this.nodes)===null||m===void 0?void 0:m.map(u=>u.loc).filter(u=>u!=null));this.source=y??(f==null||(n=f[0])===null||n===void 0?void 0:n.source),this.positions=r??f?.map(u=>u.start),this.locations=r&&y?r.map(u=>v(y,u)):f?.map(u=>v(u.source,u.start));let s=k(o?.extensions)?o?.extensions:void 0;this.extensions=(d=h??s)!==null&&d!==void 0?d: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}}),o!=null&&o.stack?Object.defineProperty(this,"stack",{value:o.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 p of this.nodes)p.loc&&(t+=`
4
4
 
5
- `+j(l.loc));else if(this.source&&this.locations)for(let l of this.locations)t+=`
5
+ `+_(p.loc));else if(this.source&&this.locations)for(let p of this.locations)t+=`
6
6
 
7
- `+q(this.source,l);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 _(e){return e===void 0||e.length===0?void 0:e}var R=class extends Error{constructor(t){super(t),this.name="RumbleError";}},A=class extends B{};var L=(e,t)=>new R(`RumbleError: Unknown SQL type '${e}'. Please open an issue (https://github.com/m1212e/rumble/issues) so it can be added. (${t})`);function K(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 L(e,"Distinct")}function pe(e){return typeof e!="function"}function me(e){return typeof e=="function"&&e.constructor.name!=="AsyncFunction"}var M=({db:e,actions:t,defaultLimit:l})=>{let p=e._.schema,n={},d={},i={},y=r=>{for(let s of t)i[r]||(i[r]={}),i[r][s]||(i[r][s]=[]);return {allow:s=>{let o=d[r];o||(o={},d[r]=o);let f=Array.isArray(s)?s:[s];for(let a of f){let c=o[a];c||(c="wildcard",o[a]=c);}return {when:a=>{for(let c of f)o[c]==="wildcard"&&(o[c]=[]),o[c].push(a);}}},filter:s=>{let o=Array.isArray(s)?s:[s];return {by:f=>{for(let a of o)i[r][a].push(f);}}}}};for(let r of Object.keys(e.query))n[r]=y(r);return {...n,registeredConditions:d,registeredFilters:i,buildWithUserContext:r=>{let s={},o=f=>({filter:(a,c)=>{let m=d[f];m||(m={});let x=m[a];if(x==="wildcard")return {single:{where:c?.inject?.where,columns:c?.inject?.columns},many:{where:c?.inject?.where,columns:c?.inject?.columns,limit:c?.inject?.limit??l??void 0}};let C=()=>{let b=p[f].primaryKey.at(0);if(!b)throw new R(`No primary key found for entity ${f.toString()}`);let O=K(b.getSQLType());return {where:and(eq(b,O.value1),eq(b,O.value2))}};(!m||!x)&&(x=[C()]);let T=x.filter(pe),u=x.filter(me).map(b=>b(r)),g=u.some(b=>b==="allow"),h=[...T,...u];h.filter(b=>b!==void 0).length===0&&h.push(C());let S;for(let b of h)b!=="allow"&&b?.limit&&(S===void 0||b.limit>S)&&(S=b.limit);c?.inject?.limit&&S&&S<c.inject.limit&&(S=c.inject.limit);let D;for(let b of [...h,c?.inject??{}])b!=="allow"&&b?.columns&&(D===void 0?D=b.columns:D={...D,...b.columns});let I=g?[]:h.filter(b=>b!=="allow"&&b?.where).map(b=>b?.where),P=I.length>0?or(...I):void 0;return c?.inject?.where&&(P=P?and(P,c.inject.where):c.inject.where),{single:{where:P,columns:D},many:{where:P,columns:D,limit:S??l??void 0}}},explicitFilters:a=>i[f][a]});for(let f of Object.keys(e.query))s[f]=o(f);return s}}};var W=({context:e,abilityBuilder:t})=>async l=>{let p=e?await e(l):{};return {...p,abilities:t.buildWithUserContext(p)}};function E(e){return String(e).charAt(0).toUpperCase()+String(e).slice(1)}function F(e){let t=v(e);return t.enumValues!==void 0&&t.enumName!==void 0&&typeof t.enumName=="string"&&Array.isArray(t.enumValues)}function v(e){return e.enum??e}var J=({db:e,schemaBuilder:t})=>{let l=new Map;return ({enumVariableName:n,name:d,enumName:i})=>{let y=e._.fullSchema,r;if(n?r=y[n]:i&&(r=Object.values(y).filter(F).map(v).find(a=>a.enumName===i)),!r)throw new R(`Could not determine enum structure! (${String(n)}, ${enumValuesParam}, ${i})`);let s=d??`${E(toCamelCase(r.enumName.toString()))}Enum`,o=l.get(s);return o||(o=t.enumType(s,{values:r.enumValues}),l.set(s,o),o)}};function U(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 L(e,"SQL to GQL")}var ye="RUMBLE_SUBSCRIPTION_NOTIFICATION",de="REMOVED",fe="UPDATED",he="CREATED",H=({subscriptions:e,db:t})=>{let l=e?createPubSub(...e):createPubSub();return {pubsub:l,makePubSubInstance:({tableName:n})=>{function d({action:i,tableName:y,primaryKeyValue:r}){let s;switch(i){case "created":s=he;break;case "removed":s=de;break;case "updated":s=fe;break;default:throw new Error(`Unknown action: ${i}`)}return `${ye}/${y}${r?`/${r}`:""}/${s}`}return {registerOnInstance({instance:i,action:y,primaryKeyValue:r}){let s=d({tableName:n.toString(),action:y,primaryKeyValue:r});i.register(s);},created(){let i=d({tableName:n.toString(),action:"created"});return l.publish(i)},removed(i){let y=d({tableName:n.toString(),action:"removed"});return l.publish(y)},updated(i){let r=(Array.isArray(i)?i:[i]).map(o=>d({tableName:n.toString(),action:"updated",primaryKeyValue:o})),s=Array.from(new Set(r));for(let o of s)l.publish(o);}}}}};var X=({db:e,schemaBuilder:t,makePubSubInstance:l,argImplementer:p,enumImplementer:n,abilityBuilder:d})=>({tableName:i,name:y,readAction:r="read"})=>{let s=e._.schema[i];if(!s)throw new R(`Could not find schema for ${i.toString()} (object)`);let o=s.primaryKey.at(0)?.name;o||console.warn(`Could not find primary key for ${i.toString()}. Cannot register subscriptions!`);let{registerOnInstance:f}=l({tableName:i});return t.drizzleObject(i,{name:y??E(i.toString()),subscribe:(a,c,m)=>{if(!o)return;let x=c[o];if(!x){console.warn(`Could not find primary key value for ${JSON.stringify(c)}. Cannot register subscription!`);return}f({instance:a,action:"updated",primaryKeyValue:x});},applyFilters:d?.registeredFilters?.[i]?.[r],fields:a=>{let c=(C,T,u)=>{let g=U(C);switch(g){case "Int":return a.exposeInt(T,{nullable:u});case "String":return a.exposeString(T,{nullable:u});case "Boolean":return a.exposeBoolean(T,{nullable:u});case "Date":return a.field({type:"Date",resolve:h=>h[T],nullable:u});case "DateTime":return a.field({type:"DateTime",resolve:h=>h[T],nullable:u});case "Float":return a.exposeFloat(T,{nullable:u});case "ID":return a.exposeID(T,{nullable:u});case "JSON":return a.field({type:"JSON",resolve:h=>h[T],nullable:u});default:throw new R(`Unsupported object type ${g} for column ${T}`)}},m=Object.entries(s.columns).reduce((C,[T,u])=>{if(F(u)){let g=v(u),h=n({enumName:g.enumName});C[T]=a.field({type:h,resolve:S=>S[T],nullable:!u.notNull});}else C[T]=c(u.getSQLType(),T,!u.notNull);return C},{}),x=Object.entries(s.relations).reduce((C,[T,u])=>{let {inputType:g,transformArgumentToQueryCondition:h}=p({tableName:u.referencedTableName,nativeTableName:u.referencedTableName}),S=false,I="many";return u instanceof One&&(S=!u.isNullable,I="single"),C[T]=a.relation(T,{args:{where:a.arg({type:g,required:false})},nullable:S,query:(P,b)=>b.abilities[u.referencedTableName].filter(r,{inject:{where:h(P.where)}})[I]}),C},{});return {...m,...x}}})};var w=e=>{if(!e)throw new A("Value not found but required (findFirst)");return e},be=e=>{let t=e.at(0);if(!t)throw new A("Value not found but required (firstEntry)");return t},Z=async({filters:e,entities:t,context:l})=>(await Promise.all(e.map(p=>p({context:l,entities:t})))).reduce((p,n)=>(p.push(...n),p),[]);var ee=({db:e,schemaBuilder:t,argImplementer:l,makePubSubInstance:p})=>({tableName:n,readAction:d="read",listAction:i="read"})=>{let y=e._.schema[n];if(!y)throw new R(`Could not find schema for ${n.toString()} (query)`);y.primaryKey.at(0)?.name||console.warn(`Could not find primary key for ${n.toString()}. Cannot register subscriptions!`);let{inputType:s,transformArgumentToQueryCondition:o}=l({tableName:n}),{registerOnInstance:f}=p({tableName:n});return t.queryFields(a=>({[`findMany${E(n.toString())}`]:a.drizzleField({type:[n],nullable:false,smartSubscription:true,subscribe:(c,m,x,C,T)=>{f({instance:c,action:"created"}),f({instance:c,action:"removed"});},args:{where:a.arg({type:s,required:false})},resolve:(c,m,x,C,T)=>{let u=C.abilities[n].filter(i,{inject:{where:o(x.where)}}).many,g=c(u);return u.columns&&(g.columns=u.columns),e.query[n].findMany(g)}}),[`findFirst${E(n.toString())}`]:a.drizzleField({type:n,nullable:false,smartSubscription:true,args:{where:a.arg({type:s,required:false})},resolve:(c,m,x,C,T)=>{let u=C.abilities[n].filter(d,{inject:{where:o(x.where)}}).single,g=c(u);return u.columns&&(g.columns=u.columns),e.query[n].findFirst(g).then(w)}})}))};var te="ManualFiltersPlugin",ne=te,Ce="applyFilters",z=class extends BasePlugin{wrapResolve(t,l){return async(p,n,d,i)=>{let y=(l?.type).type?.ref.currentConfig.pothosOptions[Ce];if(!y||!Array.isArray(y)||y.length===0)return t(p,n,d,i);let r=await t(p,n,d,i),s=Array.isArray(r)?r:[r],o=Array.isArray(y)?y:[y],f=await Z({filters:o,entities:s,context:d});return Array.isArray(r)?f:f[0]??null}}};xe.registerPlugin(te,z);var re=({db:e,disableDefaultObjects:t,pubsub:l,pothosConfig:p})=>{let n=new xe({plugins:[ne,Re,De,...p?.plugins??[]],...p,drizzle:{client:e},smartSubscriptions:{...subscribeOptionsFromIterator((d,i)=>l.subscribe(d))}});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 Fe=e=>`${E(toCamelCase(e.toString()))}WhereInputArgument`,oe=({db:e,schemaBuilder:t,enumImplementer:l})=>{let p=new Map,n=({tableName:d,name:i,nativeTableName:y})=>{let r=e._.schema[d];if(y){let a=Object.values(e._.schema).find(c=>c.dbName===y);a&&(r=a);}if(!r)throw new R(`Could not find schema for ${d.toString()} (whereArg)`);let s=i??Fe(r.dbName),o=p.get(s);return o||(o={inputType:t.inputType(s,{fields:m=>{let x=u=>{let g=U(u);switch(g){case "Int":return m.int({required:false});case "String":return m.string({required:false});case "Boolean":return m.boolean({required:false});case "Date":return m.field({type:"Date",required:false});case "DateTime":return m.field({type:"DateTime",required:false});case "Float":return m.float({required:false});case "ID":return m.id({required:false});case "JSON":return m.field({type:"JSON",required:false});default:throw new R(`Unsupported argument type ${g} for column ${u}`)}},C=Object.entries(r.columns).reduce((u,[g,h])=>{if(F(h)){let S=v(h),D=l({enumName:S.enumName});u[g]=m.field({type:D,required:false});}else u[g]=x(h.getSQLType());return u},{}),T=Object.entries(r.relations).reduce((u,[g,h])=>{let S=n({tableName:h.referencedTableName,nativeTableName:h.referencedTableName});return u[g]=m.field({type:S.inputType,required:false}),u},{});return {...C,...T}}}),transformArgumentToQueryCondition:m=>{if(!m)return;let x=u=>{let g=r.columns[u],h=m[u];if(h)return eq(g,h)},C=u=>{let g=r.relations[u],h=m[u];if(!h)return;let S=n({tableName:g.referencedTableName,nativeTableName:g.referencedTableName}).transformArgumentToQueryCondition;return S(h)},T=[...Object.keys(r.columns).map(x),...Object.keys(r.relations).map(C)];return and(...T)}},p.set(s,o),o)};return n};var Ue=e=>{e.actions||(e.actions=["read","update","delete"]),e.defaultLimit===void 0&&(e.defaultLimit=100);let t=M(e),l=W({...e,abilityBuilder:t}),{makePubSubInstance:p,pubsub:n}=H({...e}),{schemaBuilder:d}=re({...e,pubsub:n}),i=J({...e,schemaBuilder:d}),y=oe({...e,schemaBuilder:d,enumImplementer:i}),r=X({...e,schemaBuilder:d,makePubSubInstance:p,argImplementer:y,enumImplementer:i,abilityBuilder:t}),s=ee({...e,schemaBuilder:d,argImplementer:y,makePubSubInstance:p});return {abilityBuilder:t,schemaBuilder:d,createYoga:f=>createYoga({...f,schema:d.toSchema(),context:l}),object:r,arg:y,query:s,pubsub:p,enum_:i}};
8
- export{R as RumbleError,A as RumbleErrorSafe,w as assertFindFirstExists,be as assertFirstEntryExists,Ue as rumble};//# sourceMappingURL=index.js.map
7
+ `+q(this.source,p);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 C=class extends Error{constructor(t){super(t),this.name="RumbleError";}},A=class extends B{};var U=(e,t)=>new C(`RumbleError: Unknown SQL type '${e}'. Please open an issue (https://github.com/m1212e/rumble/issues) so it can be added. (${t})`);function V(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 U(e,"Distinct")}function ce(e){return typeof e!="function"}function ye(e){return typeof e=="function"&&e.constructor.name!=="AsyncFunction"}var W=({db:e,actions:t,defaultLimit:p})=>{let m=e._.schema,n={},d={},i={},y=r=>{for(let a of t)i[r]||(i[r]={}),i[r][a]||(i[r][a]=[]);return {allow:a=>{let o=d[r];o||(o={},d[r]=o);let h=Array.isArray(a)?a:[a];for(let f of h){let s=o[f];s||(s="wildcard",o[f]=s);}return {when:f=>{for(let s of h)o[s]==="wildcard"&&(o[s]=[]),o[s].push(f);}}},filter:a=>{let o=Array.isArray(a)?a:[a];return {by:h=>{for(let f of o)i[r][f].push(h);}}}}};for(let r of Object.keys(e.query))n[r]=y(r);return {...n,registeredConditions:d,registeredFilters:i,buildWithUserContext:r=>{let a={},o=h=>({filter:(f,s)=>{let u=d[h];u||(u={});let b=u[f];if(b==="wildcard")return {single:{where:s?.inject?.where,columns:s?.inject?.columns},many:{where:s?.inject?.where,columns:s?.inject?.columns,limit:s?.inject?.limit??p??void 0}};let S=()=>{let g=m[h].primaryKey.at(0);if(!g)throw new C(`No primary key found for entity ${h.toString()}`);let L=V(g.getSQLType());return {where:and(eq(g,L.value1),eq(g,L.value2))}};(!u||!b)&&(b=[S()]);let R=b.filter(ce),l=b.filter(ye).map(g=>g(r)),c=l.some(g=>g==="allow"),x=[...R,...l];x.filter(g=>g!==void 0).length===0&&x.push(S());let T;for(let g of x)g!=="allow"&&g?.limit&&(T===void 0||g.limit>T)&&(T=g.limit);s?.inject?.limit&&T&&T<s.inject.limit&&(T=s.inject.limit);let D;for(let g of [...x,s?.inject??{}])g!=="allow"&&g?.columns&&(D===void 0?D=g.columns:D={...D,...g.columns});let F=c?[]:x.filter(g=>g!=="allow"&&g?.where).map(g=>g?.where),P=F.length>0?or(...F):void 0;return s?.inject?.where&&(P=P?and(P,s.inject.where):s.inject.where),{single:{where:P,columns:D},many:{where:P,columns:D,limit:T??p??void 0}}},explicitFilters:f=>i[h][f]});for(let h of Object.keys(e.query))a[h]=o(h);return a}}};var J=({context:e,abilityBuilder:t})=>async p=>{let m=e?await e(p):{};return {...m,abilities:t.buildWithUserContext(m)}};function E(e){return String(e).charAt(0).toUpperCase()+String(e).slice(1)}function N(e){let t=I(e);return t.enumValues!==void 0&&t.enumName!==void 0&&typeof t.enumName=="string"&&Array.isArray(t.enumValues)}function I(e){return e.enum??e}var Y=({db:e,schemaBuilder:t})=>{let p=new Map;return ({enumVariableName:n,name:d,enumName:i})=>{let y=e._.fullSchema,r;if(n?r=y[n]:i&&(r=Object.values(y).filter(N).map(I).find(f=>f.enumName===i)),!r)throw new C(`Could not determine enum structure! (${String(n)}, ${enumValuesParam}, ${i})`);let a=d??`${E(toCamelCase(r.enumName.toString()))}Enum`,o=p.get(a);return o||(o=t.enumType(a,{values:r.enumValues}),p.set(a,o),o)}};function w(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 U(e,"SQL to GQL")}var fe="RUMBLE_SUBSCRIPTION_NOTIFICATION",he="REMOVED",ge="UPDATED",be="CREATED",X=({subscriptions:e,db:t})=>{let p=e?createPubSub(...e):createPubSub();return {pubsub:p,makePubSubInstance:({tableName:n})=>{function d({action:i,tableName:y,primaryKeyValue:r}){let a;switch(i){case "created":a=be;break;case "removed":a=he;break;case "updated":a=ge;break;default:throw new Error(`Unknown action: ${i}`)}return `${fe}/${y}${r?`/${r}`:""}/${a}`}return {registerOnInstance({instance:i,action:y,primaryKeyValue:r}){let a=d({tableName:n.toString(),action:y,primaryKeyValue:r});i.register(a);},created(){let i=d({tableName:n.toString(),action:"created"});return p.publish(i)},removed(i){let y=d({tableName:n.toString(),action:"removed"});return p.publish(y)},updated(i){let r=(Array.isArray(i)?i:[i]).map(o=>d({tableName:n.toString(),action:"updated",primaryKeyValue:o})),a=Array.from(new Set(r));for(let o of a)p.publish(o);}}}}};var Z=({db:e,schemaBuilder:t,makePubSubInstance:p,argImplementer:m,enumImplementer:n,abilityBuilder:d})=>({tableName:i,name:y,readAction:r="read",extend:a})=>{let o=e._.schema[i];if(!o)throw new C(`Could not find schema for ${i.toString()} (object)`);let h=o.primaryKey.at(0)?.name;h||console.warn(`Could not find primary key for ${i.toString()}. Cannot register subscriptions!`);let{registerOnInstance:f}=p({tableName:i});return t.drizzleObject(i,{name:y??E(i.toString()),subscribe:(s,u,b)=>{if(!h)return;let S=u[h];if(!S){console.warn(`Could not find primary key value for ${JSON.stringify(u)}. Cannot register subscription!`);return}f({instance:s,action:"updated",primaryKeyValue:S});},applyFilters:d?.registeredFilters?.[i]?.[r],fields:s=>{let u=(R,l,c)=>{let x=w(R);switch(x){case "Int":return s.exposeInt(l,{nullable:c});case "String":return s.exposeString(l,{nullable:c});case "Boolean":return s.exposeBoolean(l,{nullable:c});case "Date":return s.field({type:"Date",resolve:T=>T[l],nullable:c});case "DateTime":return s.field({type:"DateTime",resolve:T=>T[l],nullable:c});case "Float":return s.exposeFloat(l,{nullable:c});case "ID":return s.exposeID(l,{nullable:c});case "JSON":return s.field({type:"JSON",resolve:T=>T[l],nullable:c});default:throw new C(`Unsupported object type ${x} for column ${l}`)}},b=Object.entries(o.columns).reduce((R,[l,c])=>{if(N(c)){let x=I(c),T=n({enumName:x.enumName});R[l]=s.field({type:T,resolve:D=>D[l],nullable:!c.notNull});}else R[l]=u(c.getSQLType(),l,!c.notNull);return R},{}),S=Object.entries(o.relations).reduce((R,[l,c])=>{let {inputType:x,transformArgumentToQueryCondition:T}=m({tableName:c.referencedTableName,nativeTableName:c.referencedTableName}),D=false,P="many";return c instanceof One&&(D=!c.isNullable,P="single"),R[l]=s.relation(l,{args:{where:s.arg({type:x,required:false})},nullable:D,query:(g,L)=>{let Q=Object.entries(e._.schema).find(([Oe,se])=>se.dbName===c.referencedTableName)?.at(0);if(!Q)throw new C(`Could not find table ${c.referencedTableName} in schema object`);return L.abilities[Q].filter(r,{inject:{where:T(g.where)}})[P]}}),R},{});return a?{...b,...S,...a(s)??{}}:{...b,...S}}})};var O=e=>{if(!e)throw new A("Value not found but required (findFirst)");return e},Te=e=>{let t=e.at(0);if(!t)throw new A("Value not found but required (firstEntry)");return t},ee=async({filters:e,entities:t,context:p})=>(await Promise.all(e.map(m=>m({context:p,entities:t})))).reduce((m,n)=>(m.push(...n),m),[]);var te=({db:e,schemaBuilder:t,argImplementer:p,makePubSubInstance:m})=>({tableName:n,readAction:d="read",listAction:i="read"})=>{let y=e._.schema[n];if(!y)throw new C(`Could not find schema for ${n.toString()} (query)`);y.primaryKey.at(0)?.name||console.warn(`Could not find primary key for ${n.toString()}. Cannot register subscriptions!`);let{inputType:a,transformArgumentToQueryCondition:o}=p({tableName:n}),{registerOnInstance:h}=m({tableName:n});return t.queryFields(f=>({[`findMany${E(n.toString())}`]:f.drizzleField({type:[n],nullable:false,smartSubscription:true,subscribe:(s,u,b,S,R)=>{h({instance:s,action:"created"}),h({instance:s,action:"removed"});},args:{where:f.arg({type:a,required:false})},resolve:(s,u,b,S,R)=>{let l=S.abilities[n].filter(i,{inject:{where:o(b.where)}}).many,c=s(l);return l.columns&&(c.columns=l.columns),e.query[n].findMany(c)}}),[`findFirst${E(n.toString())}`]:f.drizzleField({type:n,nullable:false,smartSubscription:true,args:{where:f.arg({type:a,required:false})},resolve:(s,u,b,S,R)=>{let l=S.abilities[n].filter(d,{inject:{where:o(b.where)}}).single,c=s(l);return l.columns&&(c.columns=l.columns),e.query[n].findFirst(c).then(O)}})}))};var ne="ManualFiltersPlugin",re=ne,Re="applyFilters",z=class extends BasePlugin{wrapResolve(t,p){return async(m,n,d,i)=>{let y=(p?.type).type?.ref.currentConfig.pothosOptions[Re];if(!y||!Array.isArray(y)||y.length===0)return t(m,n,d,i);let r=await t(m,n,d,i),a=Array.isArray(r)?r:[r],o=Array.isArray(y)?y:[y],h=await ee({filters:o,entities:a,context:d});return Array.isArray(r)?h:h[0]??null}}};Ce.registerPlugin(ne,z);var oe=({db:e,disableDefaultObjects:t,pubsub:p,pothosConfig:m})=>{let n=new Ce({plugins:[re,Ee,Pe,...m?.plugins??[]],...m,drizzle:{client:e},smartSubscriptions:{...subscribeOptionsFromIterator((d,i)=>p.subscribe(d))}});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 Ue=e=>`${E(toCamelCase(e.toString()))}WhereInputArgument`,ie=({db:e,schemaBuilder:t,enumImplementer:p})=>{let m=new Map,n=({tableName:d,name:i,nativeTableName:y})=>{let r=e._.schema[d];if(y){let f=Object.values(e._.schema).find(s=>s.dbName===y);f&&(r=f);}if(!r)throw new C(`Could not find schema for ${d.toString()} (whereArg)`);let a=i??Ue(r.dbName),o=m.get(a);return o||(o={inputType:t.inputType(a,{fields:u=>{let b=l=>{let c=w(l);switch(c){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 C(`Unsupported argument type ${c} for column ${l}`)}},S=Object.entries(r.columns).reduce((l,[c,x])=>{if(N(x)){let T=I(x),D=p({enumName:T.enumName});l[c]=u.field({type:D,required:false});}else l[c]=b(x.getSQLType());return l},{}),R=Object.entries(r.relations).reduce((l,[c,x])=>{let T=n({tableName:x.referencedTableName,nativeTableName:x.referencedTableName});return l[c]=u.field({type:T.inputType,required:false}),l},{});return {...S,...R}}}),transformArgumentToQueryCondition:u=>{if(!u)return;let b=l=>{let c=r.columns[l],x=u[l];if(x)return eq(c,x)},S=l=>{let c=r.relations[l],x=u[l];if(!x)return;let T=n({tableName:c.referencedTableName,nativeTableName:c.referencedTableName}).transformArgumentToQueryCondition;return T(x)},R=[...Object.keys(r.columns).map(b),...Object.keys(r.relations).map(S)];return and(...R)}},m.set(a,o),o)};return n};var qe=e=>{e.actions||(e.actions=["read","update","delete"]),e.defaultLimit===void 0&&(e.defaultLimit=100);let t=W(e),p=J({...e,abilityBuilder:t}),{makePubSubInstance:m,pubsub:n}=X({...e}),{schemaBuilder:d}=oe({...e,pubsub:n}),i=Y({...e,schemaBuilder:d}),y=ie({...e,schemaBuilder:d,enumImplementer:i}),r=Z({...e,schemaBuilder:d,makePubSubInstance:m,argImplementer:y,enumImplementer:i,abilityBuilder:t}),a=te({...e,schemaBuilder:d,argImplementer:y,makePubSubInstance:m});return {abilityBuilder:t,schemaBuilder:d,createYoga:h=>createYoga({...h,schema:d.toSchema(),context:p}),object:r,arg:y,query:a,pubsub:m,enum_:i}};
8
+ export{C as RumbleError,A as RumbleErrorSafe,O as assertFindFirstExists,Te as assertFirstEntryExists,qe as rumble};//# sourceMappingURL=index.js.map
9
9
  //# sourceMappingURL=index.js.map