@m1212e/rumble 0.7.9 → 0.7.11
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.cjs +6 -6
- package/index.cjs.map +1 -1
- package/index.js +6 -6
- package/index.js.map +1 -1
- package/package.json +1 -1
package/index.js
CHANGED
@@ -1,9 +1,9 @@
|
|
1
|
-
import {createYoga,createPubSub}from'graphql-yoga';import {One,relationsFilterToSQL}from'drizzle-orm';import {toCamelCase}from'drizzle-orm/casing';import {PgEnumColumn}from'drizzle-orm/pg-core';import Ie,{BasePlugin}from'@pothos/core';import Ne from'@pothos/plugin-drizzle';import ze,{subscribeOptionsFromIterator}from'@pothos/plugin-smart-subscriptions';import {JSONResolver,DateResolver,DateTimeISOResolver}from'graphql-scalars';function
|
2
|
-
`,
|
3
|
-
`)}function ye(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
|
1
|
+
import {createYoga,createPubSub}from'graphql-yoga';import {One,relationsFilterToSQL}from'drizzle-orm';import {toCamelCase}from'drizzle-orm/casing';import {PgEnumColumn}from'drizzle-orm/pg-core';import Ie,{BasePlugin}from'@pothos/core';import Ne from'@pothos/plugin-drizzle';import ze,{subscribeOptionsFromIterator}from'@pothos/plugin-smart-subscriptions';import {JSONResolver,DateResolver,DateTimeISOResolver}from'graphql-scalars';function U(e){let t,i=false;return ()=>(i||(t=e(),i=true),t)}function $(e){return typeof e=="object"&&e!==null}function W(e,t){throw new Error("Unexpected invariant triggered.")}var ce=/\r\n|[\n\r]/g;function Q(e,t){let i=0,c=1;for(let n of e.body.matchAll(ce)){if(typeof n.index=="number"||W(),n.index>=t)break;i=n.index+n[0].length,c+=1;}return {line:c,column:t+1-i}}function J(e){return K(e.source,Q(e.source,e.start))}function K(e,t){let i=e.locationOffset.column-1,c="".padStart(i)+e.body,n=t.line-1,l=e.locationOffset.line-1,s=t.line+l,u=t.line===1?i:0,a=t.column+u,m=`${e.name}:${s}:${a}
|
2
|
+
`,o=c.split(/\r\n|[\n\r]/g),b=o[n];if(b.length>120){let r=Math.floor(a/80),y=a%80,d=[];for(let T=0;T<b.length;T+=80)d.push(b.slice(T,T+80));return m+H([[`${s} |`,d[0]],...d.slice(1,r+1).map(T=>["|",T]),["|","^".padStart(y)],["|",d[r+1]]])}return m+H([[`${s-1} |`,o[n-1]],[`${s} |`,b],["|","^".padStart(a)],[`${s+1} |`,o[n+1]]])}function H(e){let t=e.filter(([c,n])=>n!==void 0),i=Math.max(...t.map(([c])=>c.length));return t.map(([c,n])=>c.padStart(i)+(n?" "+n:"")).join(`
|
3
|
+
`)}function ye(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 q=class e extends Error{constructor(t,...i){var c,n,l;let{nodes:s,source:u,positions:a,path:m,originalError:o,extensions:b}=ye(i);super(t),this.name="GraphQLError",this.path=m??void 0,this.originalError=o??void 0,this.nodes=Y(Array.isArray(s)?s:s?[s]:void 0);let r=Y((c=this.nodes)===null||c===void 0?void 0:c.map(d=>d.loc).filter(d=>d!=null));this.source=u??(r==null||(n=r[0])===null||n===void 0?void 0:n.source),this.positions=a??r?.map(d=>d.start),this.locations=a&&u?a.map(d=>Q(u,d)):r?.map(d=>Q(d.source,d.start));let y=$(o?.extensions)?o?.extensions:void 0;this.extensions=(l=b??y)!==null&&l!==void 0?l: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 i of this.nodes)i.loc&&(t+=`
|
4
4
|
|
5
|
-
`+J(
|
5
|
+
`+J(i.loc));else if(this.source&&this.locations)for(let i of this.locations)t+=`
|
6
6
|
|
7
|
-
`+K(this.source,
|
8
|
-
Please ensure that you use the enum at least once as a column of a table!`);a=
|
7
|
+
`+K(this.source,i);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 Y(e){return e===void 0||e.length===0?void 0:e}var R=class extends Error{constructor(t){super(t),this.name="RumbleError";}},w=class extends q{};var j=(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 X(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 j(e,"Distinct")}var _=Symbol.for("drizzle:Name"),Z=Symbol.for("drizzle:Columns");function I({dbName:e,tsName:t,table:i,db:c}){let n=i;if(t&&(n=c._.relations.schema[t]),e&&(n=Object.values(c._.relations.schema).find(l=>l[_]===e)),!n)throw new R(`Could not find schema for ${JSON.stringify({tsName:t,dbName:e,table:i?.[_]}).toString()}`);return {tableSchema:n,columns:n[Z],get primaryColumns(){return Object.entries(n[Z]).filter(([l,s])=>s.primary).reduce((l,[s,u])=>(l[s]=u,l),{})},relations:c._.relations.config[t],dbName:n[_],get tsName(){return Object.entries(c._.relations.schema).find(([l,s])=>s===n).at(0)}}}function Te(e){return typeof e!="function"}function ge(e){return typeof e=="function"&&e.constructor.name!=="AsyncFunction"}var ee=({db:e,actions:t,defaultLimit:i})=>{let c={},n={},l={},s=u=>{for(let a of t)l[u]||(l[u]={}),l[u][a]||(l[u][a]=[]);return {allow:a=>{let m=n[u];m||(m={},n[u]=m);let o=Array.isArray(a)?a:[a];for(let b of o){let r=m[b];r||(r="unspecified",m[b]=r);}return {when:b=>{for(let r of o)m[r]==="unspecified"&&(m[r]=[]),m[r].push(b);}}},filter:a=>{let m=Array.isArray(a)?a:[a];return {by:o=>{for(let b of m)l[u][b].push(o);}}}}};for(let u of Object.keys(e.query))c[u]=s(u);return {...c,registeredQueryFilters:n,registeredFilters:l,buildWithUserContext:u=>{let a={},m=o=>({filter:(b,r)=>{let y=p=>{let B=U(()=>{if(!(!p?.where&&!r?.inject?.where)){if(r?.inject?.where&&p?.where)return {AND:[p?.where,r?.inject?.where]};if(r?.inject?.where&&!p?.where)return r?.inject?.where;if(!r?.inject?.where&&p?.where)return p?.where;!r?.inject?.where&&p?.where;}}),v=U(()=>{let C=B();if(!C)return;let O=I({tsName:o,db:e});return relationsFilterToSQL(O.tableSchema,C)}),L=U(()=>{let C=p?.limit??i;return r?.inject?.limit&&(!C||C>r.inject.limit)&&(C=r.inject.limit),p?.limit&&(!C||p.limit>C)&&(C=p.limit),C??void 0}),F=U(()=>{if(!(!p?.columns&&!r?.inject?.columns))return {...p?.columns,...r?.inject?.columns}}),N={query:{single:{get where(){return B()},columns:F()},many:{get where(){return B()},columns:F(),get limit(){return L()}}},sql:{get where(){return v()},columns:F(),get limit(){return L()}}};return F()||(delete N.sql.columns,delete N.query.many.columns,delete N.query.single.columns),N},d=()=>{let p=I({db:e,tsName:o});if(Object.keys(p.primaryColumns).length===0)throw new R(`No primary key found for entity ${o.toString()}`);let B=Object.values(p.primaryColumns)[0],v=X(B.getSQLType());return {where:{AND:[{[B.name]:v.value1},{[B.name]:v.value2}]}}},T=n?.[o]?.[b];if(T==="unspecified")return y();T||(T=[d()]);let h=T.filter(Te),D=T.filter(ge).map(p=>p(u)),E=D.some(p=>p==="allow"),P=[...h,...D].filter(p=>p!==void 0).filter(p=>p!=="allow");!E&&P.length===0&&(P=[d()]);let x;for(let p of P)p?.limit&&(x===void 0||p.limit>x)&&(x=p.limit);let f;for(let p of [...P,r?.inject])p?.columns&&(f===void 0?f=p.columns:f={...f,...p.columns});let g=E?[]:P.filter(p=>p?.where).map(p=>p.where),S=g.length>0?{OR:g}:void 0;return y({where:S,columns:f,limit:x})},explicitFilters:b=>l[o][b]});for(let o of Object.keys(e.query))a[o]=m(o);return a}}};var te=({context:e,abilityBuilder:t})=>async i=>{let c=e?await e(i):{};return {...c,abilities:t.buildWithUserContext(c)}};function A(e){return String(e).charAt(0).toUpperCase()+String(e).slice(1)}function k(e){return e instanceof PgEnumColumn}var ne=({db:e,schemaBuilder:t})=>{let i=new Map;return ({tsName:n,enumColumn:l,refName:s})=>{let u,a;if(n){let r=e._.relations.schema[n];u=n.toString();let y=Object.values(e._.relations.schema).filter(d=>typeof d=="object").map(d=>Object.values(d[Symbol.for("drizzle:Columns")])).flat(2).find(d=>d.config?.enum===r);if(!y)throw new R(`Could not find applied enum column for ${n.toString()}.
|
8
|
+
Please ensure that you use the enum at least once as a column of a table!`);a=y.enumValues;}else if(l){let r=Object.entries(e._.relations.schema).find(([y,d])=>d===l.config.enum);if(!r)throw new R(`Could not find enum in schema for ${l.name}!`);u=r[0],a=l.enumValues;}if(!u||!a)throw new R("Could not determine enum structure!");let m=s??`${A(toCamelCase(u))}Enum`,o=i.get(m);return o||(o=t.enumType(m,{values:a}),i.set(m,o),o)}};function G({sqlType:e,fieldName:t}){let i;if(["serial","int","integer","tinyint","smallint","mediumint"].includes(e)&&(i="Int"),["real","decimal","double","float"].includes(e)&&(i="Float"),["string","text","varchar","char","text(256)"].includes(e)&&(t&&(t.toLowerCase().endsWith("_id")||t.toLowerCase().endsWith("id"))?i="ID":i="String"),["uuid"].includes(e)&&(i="ID"),["boolean"].includes(e)&&(i="Boolean"),["timestamp","datetime"].includes(e)&&(i="DateTime"),["date"].includes(e)&&(i="Date"),["json"].includes(e)&&(i="JSON"),i!==void 0)return i;throw j(e,"SQL to GQL")}var De=e=>typeof e!="object"?false:!!Object.keys(e).some(t=>["args","nullable","query","subscribe","description","type","resolve"].find(i=>i===t)),re=({db:e,schemaBuilder:t,makePubSubInstance:i,argImplementer:c,enumImplementer:n,abilityBuilder:l})=>({table:s,refName:u,readAction:a="read",adjust:m})=>{let o=I({db:e,tsName:s});Object.keys(o.primaryColumns).length===0&&console.warn(`Could not find primary key for ${s.toString()}. Cannot register subscriptions!`);let b=Object.values(o.primaryColumns)[0],{registerOnInstance:r}=i({table:s});return t.drizzleObject(s,{name:u??A(s.toString()),subscribe:(y,d,T)=>{if(!b)return;let h=d[b.name];if(!h){console.warn(`Could not find primary key value for ${JSON.stringify(d)}. Cannot register subscription!`);return}r({instance:y,action:"updated",primaryKeyValue:h});},applyFilters:l?.registeredFilters?.[s]?.[a],fields:y=>{let d=o.columns,T=(x,f,g)=>{let S=G({sqlType:x,fieldName:f});switch(S){case "Int":return y.exposeInt(f,{nullable:g});case "String":return y.exposeString(f,{nullable:g});case "Boolean":return y.exposeBoolean(f,{nullable:g});case "Date":return y.field({type:"Date",resolve:p=>p[f],nullable:g});case "DateTime":return y.field({type:"DateTime",resolve:p=>p[f],nullable:g});case "Float":return y.exposeFloat(f,{nullable:g});case "ID":return y.exposeID(f,{nullable:g});case "JSON":return y.field({type:"JSON",resolve:p=>p[f],nullable:g});default:throw new R(`Unsupported object type ${S} for column ${f}`)}},h=new Map,D=m?.(new Proxy(y,{get:(x,f)=>typeof x[f]=="function"?(...g)=>{let S=x[f](...g),p=g.find(De);if(!p)throw new R("Expected config object to be passed to adjust field");return h.set(S,{params:g,creatorFunction:x[f],configObject:p}),S}:x[f]}))??{},E=Object.entries(d).reduce((x,[f,g])=>{if(D[f]){let{params:S,creatorFunction:p,configObject:B}=h.get(D[f]);return typeof B.nullable!="boolean"&&(B.nullable=!g.notNull),D[f]=p.bind(y)(...S),x}if(k(g)){let S=n({enumColumn:g});x[f]=y.field({type:S,resolve:p=>p[f],nullable:!g.notNull});}else x[f]=T(g.getSQLType(),f,!g.notNull);return x},{}),P=Object.entries(o.relations??{}).reduce((x,[f,g])=>{let S=I({db:e,table:g.targetTable}),p=c({dbName:S.dbName}),B=i({table:S.tsName}),v=false,L=true,F="many";g instanceof One&&(L=false,v=g.optional,F="single");let N=(C,O)=>{B.registerOnInstance({instance:C,action:"created"}),B.registerOnInstance({instance:C,action:"removed"});};if(D[f]){let{params:C,creatorFunction:O,configObject:z}=h.get(D[f]);return typeof z.nullable!="boolean"&&(z.nullable=v),typeof z.subscribe!="function"&&(z.subscribe=N),D[f]=O.bind(y)(...C),x}return x[f]=y.relation(f,{args:{where:y.arg({type:p,required:false}),...L?{offset:y.arg.int({required:false}),limit:y.arg.int({required:false})}:{}},subscribe:N,nullable:v,query:(C,O)=>{let z=O.abilities[S.tsName].filter(a,{inject:{where:C.where,limit:C.limit}}).query[F];return C.offset&&(z.offset=C.offset),z}}),x},{});return {...E,...P,...D}}})};var Re="RUMBLE_SUBSCRIPTION_NOTIFICATION",Se="REMOVED",Ee="UPDATED",Be="CREATED",oe=({subscriptions:e,db:t})=>{let i=e?createPubSub(...e):createPubSub();return {pubsub:i,makePubSubInstance:({table:n})=>{function l({action:s,tableName:u,primaryKeyValue:a}){let m;switch(s){case "created":m=Be;break;case "removed":m=Se;break;case "updated":m=Ee;break;default:throw new Error(`Unknown action: ${s}`)}return `${Re}/${u}${a?`/${a}`:""}/${m}`}return {registerOnInstance({instance:s,action:u,primaryKeyValue:a}){let m=l({tableName:n.toString(),action:u,primaryKeyValue:a});s.register(m);},created(){let s=l({tableName:n.toString(),action:"created"});return i.publish(s)},removed(s){let u=l({tableName:n.toString(),action:"removed"});return i.publish(u)},updated(s){let a=(Array.isArray(s)?s:[s]).map(o=>l({tableName:n.toString(),action:"updated",primaryKeyValue:o})),m=Array.from(new Set(a));for(let o of m)i.publish(o);}}}}};var V=e=>{if(!e)throw new w("Value not found but required (findFirst)");return e},Pe=e=>{let t=e.at(0);if(!t)throw new w("Value not found but required (firstEntry)");return t},se=async({filters:e,entities:t,context:i})=>(await Promise.all(e.map(c=>c({context:i,entities:t})))).reduce((c,n)=>(c.push(...n),c),[]);var ae=({db:e,schemaBuilder:t,argImplementer:i,makePubSubInstance:c})=>({table:n,readAction:l="read",listAction:s="read"})=>{let u=i({table:n}),{registerOnInstance:a}=c({table:n});return t.queryFields(m=>({[`findMany${A(n.toString())}`]:m.drizzleField({type:[n],nullable:false,smartSubscription:true,subscribe:(o,b,r,y,d)=>{a({instance:o,action:"created"}),a({instance:o,action:"removed"});},args:{where:m.arg({type:u,required:false}),limit:m.arg.int({required:false}),offset:m.arg.int({required:false})},resolve:(o,b,r,y,d)=>{let T=y.abilities[n].filter(s,r.where||r.limit||r.offset?{inject:{where:r.where,limit:r.limit}}:void 0).query.many;r.offset&&(T.offset=r.offset);let h=o(T);return T.columns&&(h.columns=T.columns),e.query[n].findMany(h)}}),[`findFirst${A(n.toString())}`]:m.drizzleField({type:n,nullable:false,smartSubscription:true,args:{where:m.arg({type:u,required:false})},resolve:(o,b,r,y,d)=>{let T=y.abilities[n].filter(l,r.where?{inject:{where:r.where}}:void 0).query.single,h=o(T);return T.columns&&(h.columns=T.columns),e.query[n].findFirst(h).then(V)}})}))};var le="ManualFiltersPlugin",ue=le,ve="applyFilters",M=class extends BasePlugin{wrapResolve(t,i){return async(c,n,l,s)=>{let u=(i?.type).type?.ref.currentConfig.pothosOptions[ve];if(!u||!Array.isArray(u)||u.length===0)return t(c,n,l,s);let a=await t(c,n,l,s),m=Array.isArray(a)?a:[a],o=Array.isArray(u)?u:[u],b=await se({filters:o,entities:m,context:l});return Array.isArray(a)?b:b[0]??null}}};Ie.registerPlugin(le,M);var pe=({db:e,disableDefaultObjects:t,pubsub:i,pothosConfig:c})=>{let n=new Ie({...c,plugins:[ue,Ne,ze,...c?.plugins??[]],drizzle:{client:e,relations:e._.relations,getTableConfig(l){return {columns:Object.values(l[Symbol.for("drizzle:Columns")]),primaryKeys:Object.values(l[Symbol.for("drizzle:Columns")]).filter(s=>s.primary)}}},smartSubscriptions:{...subscribeOptionsFromIterator((l,s)=>i.subscribe(l))}});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 Qe=e=>`${A(toCamelCase(e.toString()))}WhereInputArgument`,me=({db:e,schemaBuilder:t,enumImplementer:i})=>{let c=new Map,n=({table:l,refName:s,dbName:u})=>{let a=I({db:e,dbName:u,tsName:l}),m=s??Qe(a.tsName),o=c.get(m);return o||(o=t.inputType(m,{fields:r=>{let y=(h,D)=>{let E=G({sqlType:h,fieldName:D});switch(E){case "Int":return r.int({required:false});case "String":return r.string({required:false});case "Boolean":return r.boolean({required:false});case "Date":return r.field({type:"Date",required:false});case "DateTime":return r.field({type:"DateTime",required:false});case "Float":return r.float({required:false});case "ID":return r.id({required:false});case "JSON":return r.field({type:"JSON",required:false});default:throw new R(`Unsupported argument type ${E} for column ${h}`)}},d=Object.entries(a.columns).reduce((h,[D,E])=>{if(k(E)){let P=i({enumColumn:E});h[D]=r.field({type:P,required:false});}else h[D]=y(E.getSQLType(),D);return h},{}),T=Object.entries(a.relations??{}).reduce((h,[D,E])=>{let P=I({db:e,table:E.targetTable}),x=n({dbName:P.dbName});return h[D]=r.field({type:x,required:false}),h},{});return {...d,...T}}}),c.set(m,o),o)};return n};var ke=e=>{e.actions||(e.actions=["read","update","delete"]),e.defaultLimit===void 0&&(e.defaultLimit=100);let t=ee(e),i=te({...e,abilityBuilder:t}),{makePubSubInstance:c,pubsub:n}=oe({...e}),{schemaBuilder:l}=pe({...e,pubsub:n}),s=ne({...e,schemaBuilder:l}),u=me({...e,schemaBuilder:l,enumImplementer:s}),a=re({...e,schemaBuilder:l,makePubSubInstance:c,argImplementer:u,enumImplementer:s,abilityBuilder:t}),m=ae({...e,schemaBuilder:l,argImplementer:u,makePubSubInstance:c});return {abilityBuilder:t,schemaBuilder:l,createYoga:b=>createYoga({...b,schema:l.toSchema(),context:i}),object:a,arg:u,query:m,pubsub:c,enum_:s}};export{R as RumbleError,w as RumbleErrorSafe,V as assertFindFirstExists,Pe as assertFirstEntryExists,ke as rumble};//# sourceMappingURL=index.js.map
|
9
9
|
//# sourceMappingURL=index.js.map
|