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