UNPKG

@hedystia/better-auth-typeorm

Version:

<div align="center"> <p> <strong>📦 @hedystia/better-auth-typeorm</strong> </p>

83 lines (68 loc) • 11.3 kB
"use strict";var z=Object.create;var U=Object.defineProperty;var H=Object.getOwnPropertyDescriptor;var J=Object.getOwnPropertyNames;var K=Object.getPrototypeOf,V=Object.prototype.hasOwnProperty;var O=(a,l)=>U(a,"name",{value:l,configurable:!0});var Y=(a,l)=>{for(var f in l)U(a,f,{get:l[f],enumerable:!0})},Q=(a,l,f,m)=>{if(l&&typeof l=="object"||typeof l=="function")for(let c of J(l))!V.call(a,c)&&c!==f&&U(a,c,{get:()=>l[c],enumerable:!(m=H(l,c))||m.enumerable});return a};var L=(a,l,f)=>(f=a!=null?z(K(a)):{},Q(l||!a||!a.__esModule?U(f,"default",{value:a,enumerable:!0}):f,a)),Z=a=>Q(U({},"__esModule",{value:!0}),a);var ne={};Y(ne,{typeormAdapter:()=>te});module.exports=Z(ne);var C=require("typeorm"),q=require("better-auth"),G=require("better-auth/adapters"),g=L(require("fs"),1),N=L(require("path"),1);function v(a,l){switch(Array.isArray(a)?a[0]||"string":a){case"string":return{type:"text"};case"number":return{type:"integer"};case"boolean":return{type:"boolean"};case"date":return{type:"date"};default:return{type:"text"}}}O(v,"mapFieldTypeToTypeORM");function B(a,l){switch(a){case"ne":return(0,C.Not)(l);case"lt":return(0,C.LessThan)(l);case"lte":return(0,C.LessThanOrEqual)(l);case"gt":return(0,C.MoreThan)(l);case"gte":return(0,C.MoreThanOrEqual)(l);case"in":return(0,C.In)(l);case"not_in":return(0,C.Not)((0,C.In)(l));case"contains":return(0,C.Like)(`%${l}%`);case"starts_with":return(0,C.Like)(`${l}%`);case"ends_with":return(0,C.Like)(`%${l}`);default:return l}}O(B,"convertOperatorToTypeORM");function ee(a,l){let f=a.charAt(0).toUpperCase()+a.slice(1),m=l.modelName,c=`import { Column, Entity, PrimaryColumn } from 'typeorm'; `,h=`@Entity('${m}') export class ${f} { `;h+=` @PrimaryColumn('text') `,h+=` id!: string; `;for(let[$,u]of Object.entries(l.fields)){let n=u,t=n.fieldName||$,e=v(n.type,n),r=[];r.push(`name: '${t}'`),n.required||r.push("nullable: true"),(n.unique||t==="email"||t==="token")&&r.push("unique: true");let s=r.length>0?`, { ${r.join(", ")} }`:"";h+=` @Column('${e.type}'${s}) `;let o=n.type==="date"?"Date":n.type==="boolean"?"boolean":"string",i=n.required?"!":"",p=n.required?"":" | null";h+=` ${$}${i}: ${o}${p}; `}return h+="}",c+h}O(ee,"generateEntity");function W(a,l,f,m,c){let h=`${m.charAt(0).toUpperCase()+m.slice(1)}${a.charAt(0).toUpperCase()+a.slice(1)}${f}`,$=l.modelName,u=`import { type MigrationInterface, type QueryRunner, Table, TableIndex, TableColumn } from 'typeorm'; `;if(u+=`export class ${h} implements MigrationInterface { `,u+=` public async up(queryRunner: QueryRunner): Promise<void> { `,m==="create"){u+=` await queryRunner.createTable( `,u+=` new Table({ `,u+=` name: '${$}', `,u+=` columns: [ `;let n=[],t=[];n.push(` { name: 'id', type: 'text', isPrimary: true, }`);for(let[e,r]of Object.entries(l.fields)){let s=r,o=s.fieldName||e,i=v(s.type,s);if(e==="id"||o==="id")continue;let p=` { `;p+=` name: '${o}', `,p+=` type: '${i.type}', `,i.length&&(p+=` length: '${i.length}', `),s.required||(p+=` isNullable: true, `),p+=" }",n.push(p),(s.unique||o==="email")&&t.push(` await queryRunner.createIndex( '${$}', new TableIndex({ name: 'IDX_${$}_${o}', columnNames: ['${o}'], isUnique: true, }), );`)}u+=`${n.join(`, `)} `,u+=` ], `,u+=` }), `,u+=` ); `,t.length>0&&(u+=`${t.join(` `)} `)}else if(m==="alter"&&c){if(c.addColumns&&c.addColumns.length>0)for(let{name:n,field:t}of c.addColumns){let e=v(t.type,t);u+=` await queryRunner.addColumn('${$}', new TableColumn({ `,u+=` name: '${t.fieldName||n}', `,u+=` type: '${e.type}', `,u+=` isNullable: ${!t.required}, `,t.unique&&(u+=` isUnique: true, `),u+=` })); `}if(c.dropColumns&&c.dropColumns.length>0)for(let n of c.dropColumns)u+=` await queryRunner.dropColumn('${$}', '${n}'); `;if(c.modifyColumns&&c.modifyColumns.length>0)for(let{name:n,field:t}of c.modifyColumns){let e=v(t.type,t);u+=` await queryRunner.changeColumn('${$}', '${n}', new TableColumn({ `,u+=` name: '${t.fieldName||n}', `,u+=` type: '${e.type}', `,u+=` isNullable: ${!t.required}, `,t.unique&&(u+=` isUnique: true, `),u+=` })); `}}if(u+=` } `,u+=` public async down(queryRunner: QueryRunner): Promise<void> { `,m==="create")u+=` await queryRunner.dropTable('${$}'); `;else if(m==="alter"&&c){if(c.addColumns&&c.addColumns.length>0)for(let{name:n,field:t}of c.addColumns)u+=` await queryRunner.dropColumn('${$}', '${t.fieldName||n}'); `;if(c.dropColumns&&c.dropColumns.length>0)for(let n of c.dropColumns)u+=` await queryRunner.addColumn('${$}', new TableColumn({ name: '${n}', type: 'text', isNullable: true })); `}return u+=` } `,u+="}",u}O(W,"generateMigration");var te=O((a,l)=>(0,G.createAdapterFactory)({config:{adapterId:"typeorm",transaction:O(async f=>{let m=a.createQueryRunner();await m.connect(),await m.startTransaction();try{let c=m.manager,h=O(n=>{if(!n||n.length===0)return{};let t={};for(let e of n)!e.operator||e.operator==="eq"?t[e.field]=e.value:t[e.field]=B(e.operator,e.value);return t},"convertWhereToFindOptions"),$={id:"typeorm",async create(n){let{model:t,data:e}=n,r=c.getRepository(t),s=r.create(e);return await r.save(s)},async update(n){let{model:t,where:e,update:r}=n,s=c.getRepository(t),o=h(e);return e.length===1&&await s.findOne({where:o})?(await s.update(o,r),await s.findOne({where:o})):(await s.update(o,r),null)},async delete(n){let{model:t,where:e}=n,r=c.getRepository(t),s=h(e);await r.delete(s)},async findOne(n){let{model:t,where:e,select:r}=n,s=c.getRepository(t),o=h(e);return await s.findOne({where:o,select:r})},async findMany(n){let{model:t,where:e,limit:r,offset:s,sortBy:o}=n,i=c.getRepository(t),p=h(e||[]);return await i.find({where:p,take:r||100,skip:s||0,order:o?.field?{[o.field]:o.direction==="desc"?"DESC":"ASC"}:void 0})},async count(n){let{model:t,where:e}=n,r=c.getRepository(t),s=h(e||[]);return await r.count({where:s})},async updateMany(n){let{model:t,where:e,update:r}=n,s=c.getRepository(t),o=h(e);return(await s.update(o,r)).affected||0},async deleteMany(n){let{model:t,where:e}=n,r=c.getRepository(t),s=h(e);return(await r.delete(s)).affected||0},transaction:O(async n=>n($),"transaction")},u=await f($);return await m.commitTransaction(),u}catch(c){throw await m.rollbackTransaction(),c}finally{await m.release()}},"transaction")},adapter:O(({getModelName:f,getDefaultModelName:m,getFieldName:c,transformInput:h,transformOutput:$,transformWhereClause:u})=>{function n(t,e){if(!e||e.length===0)return{};let r=u({model:t,where:e}),s={};for(let o of r){let i=c({model:t,field:o.field});!o.operator||o.operator==="eq"?s[i]=o.value:s[i]=B(o.operator,o.value)}return s}return O(n,"convertWhereToFindOptions"),{async create(t){let{model:e,data:r,select:s}=t,o=m(e),i=await h(r,o,"create",t.forceAllowId),p=f(e),d=a.getRepository(p);try{let w=d.create(i),R=await d.save(w);return await $(R,o,s)}catch(w){throw new q.BetterAuthError(`Failed to create ${e}: ${w instanceof Error?w.message:String(w)}`)}},async update(t){let{model:e,where:r,update:s}=t,o=m(e),i=f(e),p=a.getRepository(i);try{let d=n(e,r),w=await h(s,o,"update");if(r.length===1&&await p.findOne({where:d})){await p.update(d,w);let y=await p.findOne({where:d});if(y)return await $(y,o)}return await p.update(d,w),null}catch(d){throw new q.BetterAuthError(`Failed to update ${e}: ${d instanceof Error?d.message:String(d)}`)}},async delete(t){let{model:e,where:r}=t,s=f(e),o=a.getRepository(s);try{let i=n(e,r);await o.delete(i)}catch(i){throw new q.BetterAuthError(`Failed to delete ${e}: ${i instanceof Error?i.message:String(i)}`)}},async findOne(t){let{model:e,where:r,select:s}=t,o=m(e),i=f(e),p=a.getRepository(i);try{let d=n(e,r),w=await p.findOne({where:d,select:s});return w?await $(w,o,s):null}catch(d){throw new q.BetterAuthError(`Failed to find ${e}: ${d instanceof Error?d.message:String(d)}`)}},async findMany(t){let{model:e,where:r,limit:s,offset:o,sortBy:i}=t,p=m(e),d=f(e),w=a.getRepository(d);try{let R=n(e,r),y=await w.find({where:R,take:s||100,skip:o||0,order:i?.field?{[c({model:e,field:i.field})]:i.direction==="desc"?"DESC":"ASC"}:void 0});return await Promise.all(y.map(I=>$(I,p)))}catch(R){throw new q.BetterAuthError(`Failed to find many ${e}: ${R instanceof Error?R.message:String(R)}`)}},async count(t){let{model:e,where:r}=t,s=f(e),o=a.getRepository(s);try{let i=n(e,r);return await o.count({where:i})}catch(i){throw new q.BetterAuthError(`Failed to count ${e}: ${i instanceof Error?i.message:String(i)}`)}},async updateMany(t){let{model:e,where:r,update:s}=t,o=m(e),i=f(e),p=a.getRepository(i);try{let d=n(e,r),w=await h(s,o,"update");return(await p.update(d,w)).affected||0}catch(d){throw new q.BetterAuthError(`Failed to update many ${e}: ${d instanceof Error?d.message:String(d)}`)}},async deleteMany(t){let{model:e,where:r}=t,s=f(e),o=a.getRepository(s);try{let i=n(e,r);return(await o.delete(i)).affected||0}catch(i){throw new q.BetterAuthError(`Failed to delete many ${e}: ${i instanceof Error?i.message:String(i)}`)}},async createSchema({tables:t,file:e}){try{let r=Date.now(),s=N.resolve(l?.outputDir??"./typeorm"),o=N.resolve(l?.migrationsDir??`${l?.outputDir??"./typeorm"}/migrations`),i=N.resolve(l?.entitiesDir??`${l?.outputDir??"./typeorm"}/entities`);g.existsSync(s)||g.mkdirSync(s,{recursive:!0}),g.existsSync(o)||g.mkdirSync(o,{recursive:!0}),g.existsSync(i)||g.mkdirSync(i,{recursive:!0});let p=a.createQueryRunner();await p.connect();let d=`# TypeORM Schema Changes - ${new Date().toISOString()} `,w=!1,R=Object.keys(t);for(let y of R){let T=t[y],I=T.modelName,X=await p.hasTable(I),E=ee(y,T),x=N.join(i,`${y.charAt(0).toUpperCase()+y.slice(1)}.ts`);if(X){let F=await p.getTable(I);if(!F)continue;let k=F.columns.map(b=>b.name),D=T.fields,S=[],A=[];for(let[b,M]of Object.entries(D)){let j=M.fieldName||b;k.includes(j)||S.push({name:b,field:M})}for(let b of k){if(b==="id")continue;Object.entries(D).some(([j,P])=>(P.fieldName||j)===b)||A.push(b)}if(S.length>0||A.length>0){let b=`${r}-alter-${y}.ts`,j=W(y,T,r,"alter",{addColumns:S,dropColumns:A,modifyColumns:[]}),P=N.join(o,b);g.writeFileSync(P,j),g.writeFileSync(x,E),d+=`- ALTER Migration: migrations/${b} `,d+=`- Updated Entity: entities/${y.charAt(0).toUpperCase()+y.slice(1)}.ts `,S.length>0&&(d+=` - Added columns: ${S.map(_=>_.field.fieldName||_.name).join(", ")} `),A.length>0&&(d+=` - Removed columns: ${A.join(", ")} `),d+=` `,w=!0}else g.existsSync(x)?g.readFileSync(x,"utf-8")!==E&&(g.writeFileSync(x,E),d+=`- Updated entity: entities/${y.charAt(0).toUpperCase()+y.slice(1)}.ts `,w=!0):(g.writeFileSync(x,E),d+=`- Generated missing entity: entities/${y.charAt(0).toUpperCase()+y.slice(1)}.ts `,w=!0)}else{let F=`${r}-create-${y}.ts`,k=W(y,T,r,"create"),D=N.join(o,F);g.writeFileSync(D,k),g.writeFileSync(x,E),d+=`- CREATE Migration: migrations/${F} `,d+=`- Entity: entities/${y.charAt(0).toUpperCase()+y.slice(1)}.ts `,w=!0}}return await p.release(),w||(d+=`Schema is up to date. No changes detected. `),{code:d,path:e??"typeorm/changelog.txt"}}catch(r){throw new q.BetterAuthError(`Failed to create schema: ${r instanceof Error?r.message:String(r)}`)}}}},"adapter")}),"typeormAdapter");0&&(module.exports={typeormAdapter});