@jazim/test 2.0.4 → 2.0.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/dist/index.js CHANGED
@@ -3,19 +3,19 @@
3
3
  var betterAuth = require('better-auth');
4
4
  var adapters = require('better-auth/adapters');
5
5
  var typeorm = require('typeorm');
6
- var Handlebars = require('handlebars');
7
- var fs = require('fs/promises');
6
+ var ejs = require('ejs');
7
+ var path = require('path');
8
+ var fs2 = require('fs/promises');
9
+ var url = require('url');
8
10
 
11
+ var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
9
12
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
10
13
 
11
- var Handlebars__default = /*#__PURE__*/_interopDefault(Handlebars);
12
- var fs__default = /*#__PURE__*/_interopDefault(fs);
14
+ var ejs__default = /*#__PURE__*/_interopDefault(ejs);
15
+ var path__default = /*#__PURE__*/_interopDefault(path);
16
+ var fs2__default = /*#__PURE__*/_interopDefault(fs2);
13
17
 
14
18
  // src/adapter.ts
15
- Handlebars__default.default.registerHelper("upper", (str) => str.toUpperCase());
16
- Handlebars__default.default.registerHelper("quoteJoin", function(array) {
17
- return array.map((item) => `"${item}"`).join(", ");
18
- });
19
19
 
20
20
  // src/helpers.ts
21
21
  var generateTableDefinitions = (authDbSchema, provider, isGeneratePK = true) => {
@@ -25,10 +25,11 @@ var generateTableDefinitions = (authDbSchema, provider, isGeneratePK = true) =>
25
25
  const tableInfo = {
26
26
  name,
27
27
  columns: [],
28
+ indices: [],
28
29
  fkConstraints: []
29
30
  };
30
31
  if (isGeneratePK) {
31
- generatePrimaryKeyColumn(tableInfo, provider);
32
+ tableInfo.columns.push({ name: "id", type: "varchar", isPrimary: true });
32
33
  }
33
34
  for (const [fieldName, fieldConfig] of Object.entries(tableSchema.fields)) {
34
35
  generateColumn(fieldName, fieldConfig, tableInfo, provider);
@@ -40,20 +41,36 @@ var generateTableDefinitions = (authDbSchema, provider, isGeneratePK = true) =>
40
41
  var generateColumn = (defaultFieldName, betterAuthField, tableInfo, provider) => {
41
42
  const column = {};
42
43
  column.name = betterAuthField.fieldName || defaultFieldName;
43
- column.type = mapBetterAuthTypeToDBType(betterAuthField.type, provider, betterAuthField.bigint);
44
+ column.type = mapBetterAuthTypeToDBType(betterAuthField, provider);
44
45
  if (betterAuthField.references?.field) {
45
- column.type = getIDType(provider);
46
+ column.type = "varchar";
46
47
  }
47
- if (!betterAuthField.required) {
48
- column.isNullable = true;
48
+ if (betterAuthField.sortable || betterAuthField.unique || betterAuthField.index) {
49
+ column.length = "512";
50
+ column.type = "varchar";
51
+ }
52
+ if (betterAuthField.references?.field) {
53
+ column.length = void 0;
54
+ }
55
+ if (betterAuthField.index && !betterAuthField.references?.field) {
56
+ column.isIndexed = true;
49
57
  }
50
- if (betterAuthField.unique) {
58
+ if (betterAuthField.unique && !betterAuthField.references?.field) {
51
59
  column.isUnique = true;
52
60
  }
53
- if (betterAuthField.defaultValue) {
61
+ if (!betterAuthField.required) {
62
+ column.isNullable = true;
63
+ }
64
+ if (betterAuthField.defaultValue !== void 0 && typeof betterAuthField.defaultValue !== "function") {
54
65
  column.default = betterAuthField.defaultValue;
55
66
  }
56
67
  tableInfo.columns.push(column);
68
+ if ((betterAuthField.index || betterAuthField.unique) && !betterAuthField.references) {
69
+ tableInfo.indices.push({
70
+ columnNames: [column.name],
71
+ isUnique: betterAuthField.unique || false
72
+ });
73
+ }
57
74
  if (betterAuthField.references) {
58
75
  tableInfo.fkConstraints.push({
59
76
  columnNames: [column.name],
@@ -63,31 +80,21 @@ var generateColumn = (defaultFieldName, betterAuthField, tableInfo, provider) =>
63
80
  });
64
81
  }
65
82
  };
66
- var generatePrimaryKeyColumn = (tableInfo, provider) => {
67
- const column = {
68
- name: "id",
69
- type: getIDType(provider),
70
- isPrimary: true,
71
- isGenerated: true,
72
- generationStrategy: "uuid"
73
- };
74
- tableInfo.columns.push(column);
75
- };
76
- var mapBetterAuthTypeToDBType = (betterAuthType, provider, isBigInt = false) => {
77
- if (Array.isArray(betterAuthType)) {
78
- return betterAuthType[0] || "varchar";
83
+ var mapBetterAuthTypeToDBType = (betterAuthField, provider) => {
84
+ if (Array.isArray(betterAuthField.type)) {
85
+ return betterAuthField.type[0] || "varchar";
79
86
  }
80
87
  let dbType = "";
81
- switch (betterAuthType) {
88
+ switch (betterAuthField.type) {
82
89
  case "string":
83
- dbType = "varchar";
90
+ dbType = "text";
84
91
  break;
85
92
  case "boolean":
86
93
  dbType = "boolean";
87
94
  break;
88
95
  case "number":
89
96
  dbType = provider === "sqlite" ? "integer" : "int";
90
- dbType = isBigInt && provider === "sqlite" ? dbType : "bigint";
97
+ dbType = betterAuthField.bigint && provider === "sqlite" ? dbType : "bigint";
91
98
  break;
92
99
  case "date":
93
100
  dbType = provider === "postgres" ? "timestamp" : "datetime";
@@ -96,82 +103,34 @@ var mapBetterAuthTypeToDBType = (betterAuthType, provider, isBigInt = false) =>
96
103
  dbType = provider === "sqlite" ? "text" : "json";
97
104
  break;
98
105
  default:
99
- dbType = "varchar";
106
+ dbType = "text";
100
107
  break;
101
108
  }
102
109
  return dbType;
103
110
  };
104
- var getIDType = (provider) => {
105
- return provider === "postgres" ? "uuid" : "varchar";
106
- };
107
111
 
108
112
  // src/generate-migration.ts
113
+ var __filename$1 = url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.js', document.baseURI).href)));
114
+ var __dirname$1 = path__default.default.dirname(__filename$1);
109
115
  var generateMigration = async (authDbSchema, provider) => {
110
116
  const timestamp = Date.now();
111
117
  const tableDefinitions = generateTableDefinitions(authDbSchema, provider);
112
- const template = Handlebars__default.default.compile(migrationTemplate);
113
- const migrationCode = template({
118
+ const migrationTemplatePath = path__default.default.resolve(__dirname$1, "../templates/migration.ejs");
119
+ const migrationTemplate = await fs2__default.default.readFile(migrationTemplatePath, "utf8");
120
+ const migrationCode = ejs__default.default.render(migrationTemplate, {
114
121
  timestamp,
115
122
  tables: tableDefinitions,
116
123
  tablesReversed: [...tableDefinitions].reverse()
117
124
  });
118
125
  return { code: migrationCode, migrationFileName: `${timestamp}-better-auth.ts` };
119
126
  };
120
- var migrationTemplate = `import { MigrationInterface, QueryRunner, Table } from "typeorm";
121
-
122
- export class BetterAuthMigration{{timestamp}} implements MigrationInterface {
123
- public async up(queryRunner: QueryRunner): Promise<void> {
124
- {{#each tables}}
125
- await queryRunner.createTable(
126
- new Table({
127
- name: "{{name}}",
128
- columns: [
129
- {{#each columns}}
130
- {
131
- name: "{{name}}",
132
- type: "{{type}}",
133
- {{#if isPrimary}}
134
- isPrimary: true,
135
- isGenerated: true,
136
- generationStrategy: "{{generationStrategy}}",
137
- {{/if}}
138
- {{#if isNullable}}
139
- isNullable: {{isNullable}},
140
- {{/if}}
141
- {{#if isUnique}}
142
- isUnique: true,
143
- {{/if}}
144
- },
145
- {{/each}}
146
- ],
147
- {{#if fkConstraints.length}}
148
- foreignKeys: [
149
- {{#each fkConstraints}}
150
- {
151
- columnNames: [{{{quoteJoin columnNames}}}],
152
- referencedTableName: "{{referencedTableName}}",
153
- referencedColumnNames: [{{{quoteJoin referencedColumnNames}}}],
154
- onDelete: "{{onDelete}}",
155
- },
156
- {{/each}}
157
- ],
158
- {{/if}}
159
- })
160
- );
161
- {{/each}}
162
- }
163
-
164
- public async down(queryRunner: QueryRunner): Promise<void> {
165
- {{#each tablesReversed}}
166
- await queryRunner.dropTable("{{name}}");
167
- {{/each}}
168
- }
169
- }
170
- `;
127
+ var __filename2 = url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.js', document.baseURI).href)));
128
+ var __dirname2 = path__default.default.dirname(__filename2);
171
129
  var generateEntities = async (authDbSchema, provider, mappedEntities, entitiesPath) => {
172
130
  const tableDefinitions = generateTableDefinitions(authDbSchema, provider, false);
173
- const template = Handlebars__default.default.compile(entityTemplate);
174
- const entityCode = template({
131
+ const entityTemplatePath = path__default.default.resolve(__dirname2, "../templates/entity.ejs");
132
+ const entityTemplate = await fs2__default.default.readFile(entityTemplatePath, "utf8");
133
+ const entityCode = ejs__default.default.render(entityTemplate, {
175
134
  tables: tableDefinitions.map((table) => ({
176
135
  ...table,
177
136
  entityName: mappedEntities ? mappedEntities[table.name] : table.name,
@@ -182,11 +141,11 @@ var generateEntities = async (authDbSchema, provider, mappedEntities, entitiesPa
182
141
  }))
183
142
  });
184
143
  try {
185
- await fs__default.default.access(entitiesPath);
144
+ await fs2__default.default.access(entitiesPath);
186
145
  } catch {
187
- await fs__default.default.mkdir(entitiesPath, { recursive: true });
146
+ await fs2__default.default.mkdir(entitiesPath, { recursive: true });
188
147
  } finally {
189
- await fs__default.default.writeFile(`${entitiesPath}/auth.ts`, entityCode);
148
+ await fs2__default.default.writeFile(`${entitiesPath}/auth.ts`, entityCode);
190
149
  }
191
150
  return entityCode;
192
151
  };
@@ -219,35 +178,6 @@ var mapDBTypeToTSType = (dbType, isNullable) => {
219
178
  }
220
179
  return tsType;
221
180
  };
222
- var entityTemplate = `import { Entity, PrimaryGeneratedColumn, Column, ManyToOne } from "typeorm";
223
-
224
- {{#each tables}}
225
- @Entity("{{name}}")
226
- export class {{entityName}} {
227
- @PrimaryGeneratedColumn("uuid")
228
- id!: string;
229
-
230
- {{#each columns}}
231
- {{#if isNullable}}
232
- {{#if isUnique}}
233
- @Column("{{type}}", { nullable: true, unique: true })
234
- {{else}}
235
- @Column("{{type}}", { nullable: true })
236
- {{/if}}
237
- {{else}}
238
- {{#if isUnique}}
239
- @Column("{{type}}", { unique: true })
240
- {{else}}
241
- @Column("{{type}}")
242
- {{/if}}
243
- {{/if}}
244
- {{name}}{{#if isNullable}}?: {{tsType}}{{else}}!: {{tsType}}{{/if}};
245
-
246
- {{/each}}
247
- }
248
-
249
- {{/each}}
250
- `;
251
181
 
252
182
  // src/adapter.ts
253
183
  var DEFAULT_ENTITIES = {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/handlerbar.ts","../src/helpers.ts","../src/generate-migration.ts","../src/generate-entity.ts","../src/adapter.ts"],"names":["Handlebars","fs","Equal","Not","LessThan","LessThanOrEqual","MoreThan","MoreThanOrEqual","In","Like","dataSource","BetterAuthError","adapter","createAdapterFactory"],"mappings":"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","file":"index.js","sourcesContent":["import Handlebars from \"handlebars\";\n\nHandlebars.registerHelper(\"upper\", (str: string) => str.toUpperCase());\n\nHandlebars.registerHelper(\"quoteJoin\", function (array: string[]) {\n return array.map((item) => `\"${item}\"`).join(\", \");\n});\n\nexport { Handlebars };\n","import { BetterAuthDBSchema, DBFieldAttribute } from \"better-auth\";\nimport { Provider } from \"./types\";\n\ninterface TableDefinition {\n name: string;\n entityName?: string;\n columns: {\n name: string;\n type: string;\n isNullable?: boolean;\n isUnique?: boolean;\n default?: any;\n isPrimary?: boolean;\n isGenerated?: boolean;\n generationStrategy?: \"uuid\" | \"increment\";\n }[];\n fkConstraints: {\n columnNames: string[];\n referencedColumnNames: string[];\n referencedTableName: string;\n onDelete: string;\n }[];\n}\n\nexport const generateTableDefinitions = (\n authDbSchema: BetterAuthDBSchema,\n provider: Provider,\n isGeneratePK: boolean = true\n) => {\n const tableDefinitions: TableDefinition[] = [];\n\n for (const [tableName, tableSchema] of Object.entries(authDbSchema)) {\n const name = tableSchema.modelName || tableName;\n const tableInfo: TableDefinition = {\n name: name,\n columns: [],\n fkConstraints: [],\n };\n\n if (isGeneratePK) {\n generatePrimaryKeyColumn(tableInfo, provider);\n }\n for (const [fieldName, fieldConfig] of Object.entries(tableSchema.fields)) {\n generateColumn(fieldName, fieldConfig, tableInfo, provider);\n }\n\n tableDefinitions.push(tableInfo);\n }\n\n return tableDefinitions;\n};\n\nconst generateColumn = (\n defaultFieldName: string,\n betterAuthField: DBFieldAttribute,\n tableInfo: TableDefinition,\n provider: Provider\n) => {\n const column = {} as TableDefinition[\"columns\"][0];\n column.name = betterAuthField.fieldName || defaultFieldName;\n\n column.type = mapBetterAuthTypeToDBType(betterAuthField.type, provider, betterAuthField.bigint);\n if (betterAuthField.references?.field) {\n column.type = getIDType(provider);\n }\n\n if (!betterAuthField.required) {\n column.isNullable = true;\n }\n\n if (betterAuthField.unique) {\n column.isUnique = true;\n }\n\n if (betterAuthField.defaultValue) {\n column.default = betterAuthField.defaultValue;\n }\n\n tableInfo.columns.push(column);\n\n if (betterAuthField.references) {\n tableInfo.fkConstraints.push({\n columnNames: [column.name],\n referencedTableName: betterAuthField.references.model,\n referencedColumnNames: [betterAuthField.references.field],\n onDelete: betterAuthField.references.onDelete || \"no action\",\n });\n }\n};\n\nconst generatePrimaryKeyColumn = (tableInfo: TableDefinition, provider: Provider) => {\n const column = {\n name: \"id\",\n type: getIDType(provider),\n isPrimary: true,\n isGenerated: true,\n generationStrategy: \"uuid\",\n } as TableDefinition[\"columns\"][0];\n\n tableInfo.columns.push(column);\n};\n\nconst mapBetterAuthTypeToDBType = (\n betterAuthType: DBFieldAttribute[\"type\"],\n provider: Provider,\n isBigInt: boolean = false\n): string => {\n if (Array.isArray(betterAuthType)) {\n return betterAuthType[0] || \"varchar\";\n }\n\n let dbType = \"\";\n\n switch (betterAuthType) {\n case \"string\":\n dbType = \"varchar\";\n break;\n case \"boolean\":\n dbType = \"boolean\";\n break;\n case \"number\":\n dbType = provider === \"sqlite\" ? \"integer\" : \"int\";\n dbType = isBigInt && provider === \"sqlite\" ? dbType : \"bigint\";\n break;\n case \"date\":\n dbType = provider === \"postgres\" ? \"timestamp\" : \"datetime\";\n break;\n case \"json\":\n dbType = provider === \"sqlite\" ? \"text\" : \"json\";\n break;\n default:\n dbType = \"varchar\";\n break;\n }\n\n return dbType;\n};\n\nconst getIDType = (provider: Provider): string => {\n return provider === \"postgres\" ? \"uuid\" : \"varchar\";\n};\n","import { BetterAuthDBSchema } from \"better-auth\";\nimport { Provider } from \"./types\";\nimport { Handlebars } from \"./lib/handlerbar\";\nimport { generateTableDefinitions } from \"./helpers\";\n\nexport const generateMigration = async (authDbSchema: BetterAuthDBSchema, provider: Provider) => {\n const timestamp = Date.now();\n const tableDefinitions = generateTableDefinitions(authDbSchema, provider);\n\n const template = Handlebars.compile(migrationTemplate);\n\n const migrationCode = template({\n timestamp,\n tables: tableDefinitions,\n tablesReversed: [...tableDefinitions].reverse(),\n });\n\n return { code: migrationCode, migrationFileName: `${timestamp}-better-auth.ts` };\n};\n\nconst migrationTemplate = `import { MigrationInterface, QueryRunner, Table } from \"typeorm\";\n\nexport class BetterAuthMigration{{timestamp}} implements MigrationInterface {\n public async up(queryRunner: QueryRunner): Promise<void> {\n{{#each tables}}\n await queryRunner.createTable(\n new Table({\n name: \"{{name}}\",\n columns: [\n{{#each columns}}\n {\n name: \"{{name}}\",\n type: \"{{type}}\",\n{{#if isPrimary}}\n isPrimary: true,\n isGenerated: true,\n generationStrategy: \"{{generationStrategy}}\",\n{{/if}}\n{{#if isNullable}}\n isNullable: {{isNullable}},\n{{/if}}\n{{#if isUnique}}\n isUnique: true,\n{{/if}}\n },\n{{/each}}\n ],\n{{#if fkConstraints.length}}\n foreignKeys: [\n{{#each fkConstraints}}\n {\n columnNames: [{{{quoteJoin columnNames}}}],\n referencedTableName: \"{{referencedTableName}}\",\n referencedColumnNames: [{{{quoteJoin referencedColumnNames}}}],\n onDelete: \"{{onDelete}}\",\n },\n{{/each}}\n ],\n{{/if}}\n })\n );\n{{/each}}\n }\n\n public async down(queryRunner: QueryRunner): Promise<void> {\n{{#each tablesReversed}}\n await queryRunner.dropTable(\"{{name}}\");\n{{/each}}\n }\n}\n`;\n","import fs from \"fs/promises\";\nimport { BetterAuthDBSchema } from \"better-auth\";\nimport { Provider } from \"./types\";\nimport { Handlebars } from \"./lib/handlerbar\";\nimport { generateTableDefinitions } from \"./helpers\";\n\nexport const generateEntities = async (\n authDbSchema: BetterAuthDBSchema,\n provider: Provider,\n mappedEntities: Record<string, any>,\n entitiesPath: string\n) => {\n const tableDefinitions = generateTableDefinitions(authDbSchema, provider, false);\n\n const template = Handlebars.compile(entityTemplate);\n\n const entityCode = template({\n tables: tableDefinitions.map((table) => ({\n ...table,\n entityName: mappedEntities ? mappedEntities[table.name] : table.name,\n columns: table.columns.map((column) => ({\n ...column,\n tsType: mapDBTypeToTSType(column.type, column.isNullable),\n })),\n })),\n });\n\n // check if entitiesPath exists, if not create it\n try {\n await fs.access(entitiesPath);\n } catch {\n await fs.mkdir(entitiesPath, { recursive: true });\n } finally {\n await fs.writeFile(`${entitiesPath}/auth.ts`, entityCode);\n }\n\n return entityCode;\n};\n\nconst mapDBTypeToTSType = (dbType: string, isNullable?: boolean): string => {\n let tsType: string;\n\n switch (dbType) {\n case \"varchar\":\n case \"text\":\n case \"json\":\n tsType = \"string\";\n break;\n case \"boolean\":\n tsType = \"boolean\";\n break;\n case \"int\":\n case \"integer\":\n case \"bigint\":\n tsType = \"number\";\n break;\n case \"datetime\":\n case \"timestamp\":\n tsType = \"Date\";\n break;\n default:\n tsType = \"any\";\n break;\n }\n\n if (isNullable) {\n tsType += \" | null\";\n }\n\n return tsType;\n};\n\nconst entityTemplate = `import { Entity, PrimaryGeneratedColumn, Column, ManyToOne } from \"typeorm\";\n\n{{#each tables}}\n@Entity(\"{{name}}\")\nexport class {{entityName}} {\n @PrimaryGeneratedColumn(\"uuid\")\n id!: string;\n\n {{#each columns}}\n {{#if isNullable}}\n {{#if isUnique}}\n @Column(\"{{type}}\", { nullable: true, unique: true })\n {{else}}\n @Column(\"{{type}}\", { nullable: true })\n {{/if}}\n {{else}}\n {{#if isUnique}}\n @Column(\"{{type}}\", { unique: true })\n {{else}}\n @Column(\"{{type}}\")\n {{/if}}\n {{/if}}\n {{name}}{{#if isNullable}}?: {{tsType}}{{else}}!: {{tsType}}{{/if}};\\n\n {{/each}}\n}\\n\n{{/each}}\n`;\n","import { BetterAuthError, BetterAuthOptions } from \"better-auth\";\nimport {\n AdapterFactoryOptions,\n createAdapterFactory,\n Where,\n type AdapterFactoryCustomizeAdapterCreator,\n} from \"better-auth/adapters\";\nimport {\n DataSource,\n Equal,\n FindOptionsWhere,\n In,\n LessThan,\n LessThanOrEqual,\n Like,\n MoreThan,\n MoreThanOrEqual,\n Not,\n ObjectLiteral,\n} from \"typeorm\";\nimport { generateMigration } from \"./generate-migration\";\nimport { TypeOrmAdapterConfig } from \"./types\";\nimport { generateEntities } from \"./generate-entity\";\n\nconst DEFAULT_ENTITIES = {\n user: \"User\",\n account: \"Account\",\n session: \"Session\",\n verification: \"Verification\",\n} as const;\n\nexport const typeormAdapter = (dataSource: DataSource, config: TypeOrmAdapterConfig = {}) => {\n config = {\n entitiesPath: \"./entities\",\n migrationsPath: \"./migrations\",\n provider: \"postgres\",\n generateEntities: true,\n generateMigrations: true,\n ...(config || {}),\n entities: {\n ...DEFAULT_ENTITIES,\n ...(config?.entities || {}),\n },\n };\n\n let lazyOptions: BetterAuthOptions | null = null;\n\n const convertOperatorToTypeORM = (operator: Where[\"operator\"], value: unknown) => {\n switch (operator) {\n case \"eq\":\n return Equal(value);\n case \"ne\":\n return Not(value);\n case \"lt\":\n return LessThan(value);\n case \"lte\":\n return LessThanOrEqual(value);\n case \"gt\":\n return MoreThan(value);\n case \"gte\":\n return MoreThanOrEqual(value);\n case \"in\":\n return In(value as unknown[]);\n case \"not_in\":\n return Not(In(value as unknown[]));\n case \"contains\":\n return Like(`%${value}%`);\n case \"starts_with\":\n return Like(`${value}%`);\n case \"ends_with\":\n return Like(`%${value}`);\n default:\n return value;\n }\n };\n\n const convertWhereToFindOptions = (where: Where[]): FindOptionsWhere<ObjectLiteral> => {\n if (!where || where.length === 0) return {};\n\n const findOptions: FindOptionsWhere<ObjectLiteral> = {};\n\n for (const w of where) {\n if (!w.operator) {\n findOptions[w.field] = w.value;\n } else {\n findOptions[w.field] = convertOperatorToTypeORM(w.operator, w.value);\n }\n }\n\n return findOptions;\n };\n\n const createCustomAdapter =\n (dataSource: DataSource): AdapterFactoryCustomizeAdapterCreator =>\n ({ getDefaultModelName, getFieldName, transformOutput }) => {\n const getRepositoryName = (model: string) => {\n const modelName = getDefaultModelName(model);\n const repositoryName =\n config.entities?.[modelName as keyof typeof config.entities] || modelName;\n return dataSource.getRepository(repositoryName);\n };\n\n const getMappedEntities = () => {\n const mappedEntities = { ...DEFAULT_ENTITIES };\n for (const key of Object.keys(lazyOptions as any)) {\n if (!(lazyOptions as any)[key].modelName) {\n continue;\n }\n const entity = DEFAULT_ENTITIES[key as keyof typeof DEFAULT_ENTITIES];\n const modelName = (lazyOptions as any)[key].modelName;\n (mappedEntities as any)[modelName] = entity;\n }\n return mappedEntities;\n };\n\n return {\n async create({ data, model }) {\n try {\n const repository = getRepositoryName(model);\n const entity = repository.create(data);\n const saved = await repository.save(entity);\n return saved as any;\n } catch (error: any) {\n throw new BetterAuthError(\n `Failed to create ${model}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n async update({ model, where, update }) {\n try {\n const repository = getRepositoryName(model);\n const conditions = convertWhereToFindOptions(where);\n\n await repository.update(conditions, update as Record<string, any>);\n const updated = await repository.findOne({ where: conditions });\n\n if (!updated) return null;\n return updated as any;\n } catch (error: any) {\n throw new BetterAuthError(\n `Failed to update ${model}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n async updateMany({ model, where, update }) {\n try {\n const repository = getRepositoryName(model);\n const conditions = convertWhereToFindOptions(where);\n\n const result = await repository.update(conditions, update as Record<string, any>);\n return result.affected || 0;\n } catch (error: any) {\n throw new BetterAuthError(\n `Failed to updateMany ${model}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n async delete({ model, where }) {\n try {\n const repository = getRepositoryName(model);\n const conditions = convertWhereToFindOptions(where);\n await repository.delete(conditions);\n } catch (error: any) {\n throw new BetterAuthError(\n `Failed to delete ${model}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n async deleteMany({ model, where }) {\n try {\n const repository = getRepositoryName(model);\n const conditions = convertWhereToFindOptions(where);\n const result = await repository.delete(conditions);\n return result.affected || 0;\n } catch (error: any) {\n throw new BetterAuthError(\n `Failed to deleteMany ${model}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n async findOne({ model, where, select }) {\n try {\n const repository = getRepositoryName(model);\n const defaultModelName = getDefaultModelName(model);\n const conditions = convertWhereToFindOptions(where);\n const result = await repository.findOne({ where: conditions, select });\n\n if (!result) return null;\n\n const output = await transformOutput(result, defaultModelName, select);\n return output as any;\n } catch (error: any) {\n throw new BetterAuthError(\n `Failed to findOne ${model}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n async findMany({ model, where, limit, sortBy, offset }) {\n try {\n const defaultModelName = getDefaultModelName(model);\n const repository = getRepositoryName(model);\n const conditions = convertWhereToFindOptions(where ?? []);\n const result = await repository.find({\n where: conditions,\n take: limit,\n skip: offset,\n order: sortBy\n ? {\n [getFieldName({ model, field: sortBy.field })]:\n sortBy.direction.toUpperCase() as \"ASC\" | \"DESC\",\n }\n : undefined,\n });\n\n // Transform all results from database fields to logical fields\n const transformed = await Promise.all(\n result.map((r) => transformOutput(r, defaultModelName))\n );\n return transformed as any;\n } catch (error: any) {\n throw new BetterAuthError(\n `Failed to findMany ${model}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n async count({ model, where }) {\n try {\n const repository = getRepositoryName(model);\n const conditions = convertWhereToFindOptions(where ?? []);\n const count = await repository.count({ where: conditions });\n return count;\n } catch (error: any) {\n throw new BetterAuthError(\n `Failed to count ${model}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n async createSchema({ tables }) {\n if (config.generateEntities) {\n const mappedEntities = getMappedEntities();\n await generateEntities(tables, config.provider!, mappedEntities, config.entitiesPath!);\n }\n\n if (!config.generateMigrations) {\n return { code: \"\", path: \"\" };\n }\n\n const { code, migrationFileName } = await generateMigration(tables, config.provider!);\n return { code, path: `${config.migrationsPath}/${migrationFileName}` };\n },\n options: config,\n };\n };\n\n let adapterOptions: AdapterFactoryOptions | null = null;\n adapterOptions = {\n config: {\n adapterId: \"typeorm\",\n adapterName: \"TypeORM Adapter\",\n debugLogs: config?.debugLogs ?? false,\n supportsUUIDs: config.provider === \"postgres\" ? true : false,\n supportsJSON: config.provider === \"postgres\" ? true : false, // even though mysql also supports it, mysql requires to pass stringified json anyway.\n supportsArrays: config.provider === \"postgres\" ? true : false,\n transaction: config.transaction\n ? (cb) =>\n dataSource.transaction(async (entityManager) => {\n const adapter = createAdapterFactory({\n config: adapterOptions!.config,\n adapter: createCustomAdapter(entityManager as any),\n })(lazyOptions!);\n\n return cb(adapter);\n })\n : undefined,\n },\n adapter: (options) => {\n return createCustomAdapter(dataSource)(options);\n },\n };\n\n const adapter = createAdapterFactory(adapterOptions!);\n return (options: BetterAuthOptions) => {\n lazyOptions = options;\n return adapter(options);\n };\n};\n"]}
1
+ {"version":3,"sources":["../src/helpers.ts","../src/generate-migration.ts","../src/generate-entity.ts","../src/adapter.ts"],"names":["__filename","fileURLToPath","__dirname","path","fs","ejs","Equal","Not","LessThan","LessThanOrEqual","MoreThan","MoreThanOrEqual","In","Like","dataSource","BetterAuthError","adapter","createAdapterFactory"],"mappings":"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","file":"index.js","sourcesContent":["import { BetterAuthDBSchema, DBFieldAttribute } from \"better-auth\";\nimport { Provider } from \"./types\";\n\ninterface TableDefinition {\n name: string;\n entityName?: string;\n columns: {\n name: string;\n type: string;\n isNullable?: boolean;\n isUnique?: boolean;\n default?: any;\n isPrimary?: boolean;\n isIndexed?: boolean;\n length?: string;\n }[];\n indices: {\n columnNames: string[];\n isUnique: boolean;\n }[];\n fkConstraints: {\n columnNames: string[];\n referencedColumnNames: string[];\n referencedTableName: string;\n onDelete: string;\n }[];\n}\n\nexport const generateTableDefinitions = (\n authDbSchema: BetterAuthDBSchema,\n provider: Provider,\n isGeneratePK: boolean = true\n) => {\n const tableDefinitions: TableDefinition[] = [];\n\n for (const [tableName, tableSchema] of Object.entries(authDbSchema)) {\n const name = tableSchema.modelName || tableName;\n const tableInfo: TableDefinition = {\n name: name,\n columns: [],\n indices: [],\n fkConstraints: [],\n };\n\n if (isGeneratePK) {\n tableInfo.columns.push({ name: \"id\", type: \"varchar\", isPrimary: true });\n }\n for (const [fieldName, fieldConfig] of Object.entries(tableSchema.fields)) {\n generateColumn(fieldName, fieldConfig, tableInfo, provider);\n }\n\n tableDefinitions.push(tableInfo);\n }\n\n return tableDefinitions;\n};\n\nconst generateColumn = (\n defaultFieldName: string,\n betterAuthField: DBFieldAttribute,\n tableInfo: TableDefinition,\n provider: Provider\n) => {\n const column = {} as TableDefinition[\"columns\"][0];\n column.name = betterAuthField.fieldName || defaultFieldName;\n\n column.type = mapBetterAuthTypeToDBType(betterAuthField, provider);\n if (betterAuthField.references?.field) {\n column.type = \"varchar\";\n }\n\n if (betterAuthField.sortable || betterAuthField.unique || betterAuthField.index) {\n column.length = \"512\";\n column.type = \"varchar\";\n }\n if (betterAuthField.references?.field) {\n column.length = undefined;\n }\n\n if (betterAuthField.index && !betterAuthField.references?.field) {\n column.isIndexed = true;\n }\n\n if (betterAuthField.unique && !betterAuthField.references?.field) {\n column.isUnique = true;\n }\n\n if (!betterAuthField.required) {\n column.isNullable = true;\n }\n\n if (\n betterAuthField.defaultValue !== undefined &&\n typeof betterAuthField.defaultValue !== \"function\"\n ) {\n column.default = betterAuthField.defaultValue;\n }\n\n tableInfo.columns.push(column);\n\n if ((betterAuthField.index || betterAuthField.unique) && !betterAuthField.references) {\n tableInfo.indices.push({\n columnNames: [column.name],\n isUnique: betterAuthField.unique || false,\n });\n }\n\n if (betterAuthField.references) {\n tableInfo.fkConstraints.push({\n columnNames: [column.name],\n referencedTableName: betterAuthField.references.model,\n referencedColumnNames: [betterAuthField.references.field],\n onDelete: betterAuthField.references.onDelete || \"no action\",\n });\n }\n};\n\nconst mapBetterAuthTypeToDBType = (\n betterAuthField: DBFieldAttribute,\n provider: Provider\n): string => {\n if (Array.isArray(betterAuthField.type)) {\n return betterAuthField.type[0] || \"varchar\";\n }\n\n let dbType = \"\";\n\n switch (betterAuthField.type) {\n case \"string\":\n dbType = \"text\";\n break;\n case \"boolean\":\n dbType = \"boolean\";\n break;\n case \"number\":\n dbType = provider === \"sqlite\" ? \"integer\" : \"int\";\n dbType = betterAuthField.bigint && provider === \"sqlite\" ? dbType : \"bigint\";\n break;\n case \"date\":\n dbType = provider === \"postgres\" ? \"timestamp\" : \"datetime\";\n break;\n case \"json\":\n dbType = provider === \"sqlite\" ? \"text\" : \"json\";\n break;\n default:\n dbType = \"text\";\n break;\n }\n\n return dbType;\n};\n","import ejs from \"ejs\";\nimport path from \"path\";\nimport fs from \"fs/promises\";\nimport { fileURLToPath } from \"url\";\nimport { BetterAuthDBSchema } from \"better-auth\";\nimport { Provider } from \"./types\";\nimport { generateTableDefinitions } from \"./helpers\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nexport const generateMigration = async (authDbSchema: BetterAuthDBSchema, provider: Provider) => {\n const timestamp = Date.now();\n const tableDefinitions = generateTableDefinitions(authDbSchema, provider);\n\n const migrationTemplatePath = path.resolve(__dirname, \"../templates/migration.ejs\");\n const migrationTemplate = await fs.readFile(migrationTemplatePath, \"utf8\");\n const migrationCode = ejs.render(migrationTemplate, {\n timestamp,\n tables: tableDefinitions,\n tablesReversed: [...tableDefinitions].reverse(),\n });\n\n return { code: migrationCode, migrationFileName: `${timestamp}-better-auth.ts` };\n};\n","import ejs from \"ejs\";\nimport path from \"path\";\nimport fs from \"fs/promises\";\nimport { fileURLToPath } from \"url\";\nimport { BetterAuthDBSchema } from \"better-auth\";\nimport { Provider } from \"./types\";\nimport { generateTableDefinitions } from \"./helpers\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nexport const generateEntities = async (\n authDbSchema: BetterAuthDBSchema,\n provider: Provider,\n mappedEntities: Record<string, any>,\n entitiesPath: string\n) => {\n const tableDefinitions = generateTableDefinitions(authDbSchema, provider, false);\n\n const entityTemplatePath = path.resolve(__dirname, \"../templates/entity.ejs\");\n const entityTemplate = await fs.readFile(entityTemplatePath, \"utf8\");\n const entityCode = ejs.render(entityTemplate, {\n tables: tableDefinitions.map((table) => ({\n ...table,\n entityName: mappedEntities ? mappedEntities[table.name] : table.name,\n columns: table.columns.map((column) => ({\n ...column,\n tsType: mapDBTypeToTSType(column.type, column.isNullable),\n })),\n })),\n });\n\n // check if entitiesPath exists, if not create it\n try {\n await fs.access(entitiesPath);\n } catch {\n await fs.mkdir(entitiesPath, { recursive: true });\n } finally {\n await fs.writeFile(`${entitiesPath}/auth.ts`, entityCode);\n }\n\n return entityCode;\n};\n\nconst mapDBTypeToTSType = (dbType: string, isNullable?: boolean): string => {\n let tsType: string;\n\n switch (dbType) {\n case \"varchar\":\n case \"text\":\n case \"json\":\n tsType = \"string\";\n break;\n case \"boolean\":\n tsType = \"boolean\";\n break;\n case \"int\":\n case \"integer\":\n case \"bigint\":\n tsType = \"number\";\n break;\n case \"datetime\":\n case \"timestamp\":\n tsType = \"Date\";\n break;\n default:\n tsType = \"any\";\n break;\n }\n\n if (isNullable) {\n tsType += \" | null\";\n }\n\n return tsType;\n};\n","import { BetterAuthError, BetterAuthOptions } from \"better-auth\";\nimport {\n AdapterFactoryOptions,\n createAdapterFactory,\n Where,\n type AdapterFactoryCustomizeAdapterCreator,\n} from \"better-auth/adapters\";\nimport {\n DataSource,\n Equal,\n FindOptionsWhere,\n In,\n LessThan,\n LessThanOrEqual,\n Like,\n MoreThan,\n MoreThanOrEqual,\n Not,\n ObjectLiteral,\n} from \"typeorm\";\nimport { generateMigration } from \"./generate-migration\";\nimport { TypeOrmAdapterConfig } from \"./types\";\nimport { generateEntities } from \"./generate-entity\";\n\nconst DEFAULT_ENTITIES = {\n user: \"User\",\n account: \"Account\",\n session: \"Session\",\n verification: \"Verification\",\n} as const;\n\nexport const typeormAdapter = (dataSource: DataSource, config: TypeOrmAdapterConfig = {}) => {\n config = {\n entitiesPath: \"./entities\",\n migrationsPath: \"./migrations\",\n provider: \"postgres\",\n generateEntities: true,\n generateMigrations: true,\n ...(config || {}),\n entities: {\n ...DEFAULT_ENTITIES,\n ...(config?.entities || {}),\n },\n };\n\n let lazyOptions: BetterAuthOptions | null = null;\n\n const convertOperatorToTypeORM = (operator: Where[\"operator\"], value: unknown) => {\n switch (operator) {\n case \"eq\":\n return Equal(value);\n case \"ne\":\n return Not(value);\n case \"lt\":\n return LessThan(value);\n case \"lte\":\n return LessThanOrEqual(value);\n case \"gt\":\n return MoreThan(value);\n case \"gte\":\n return MoreThanOrEqual(value);\n case \"in\":\n return In(value as unknown[]);\n case \"not_in\":\n return Not(In(value as unknown[]));\n case \"contains\":\n return Like(`%${value}%`);\n case \"starts_with\":\n return Like(`${value}%`);\n case \"ends_with\":\n return Like(`%${value}`);\n default:\n return value;\n }\n };\n\n const convertWhereToFindOptions = (where: Where[]): FindOptionsWhere<ObjectLiteral> => {\n if (!where || where.length === 0) return {};\n\n const findOptions: FindOptionsWhere<ObjectLiteral> = {};\n\n for (const w of where) {\n if (!w.operator) {\n findOptions[w.field] = w.value;\n } else {\n findOptions[w.field] = convertOperatorToTypeORM(w.operator, w.value);\n }\n }\n\n return findOptions;\n };\n\n const createCustomAdapter =\n (dataSource: DataSource): AdapterFactoryCustomizeAdapterCreator =>\n ({ getDefaultModelName, getFieldName, transformOutput }) => {\n const getRepositoryName = (model: string) => {\n const modelName = getDefaultModelName(model);\n const repositoryName =\n config.entities?.[modelName as keyof typeof config.entities] || modelName;\n return dataSource.getRepository(repositoryName);\n };\n\n const getMappedEntities = () => {\n const mappedEntities = { ...DEFAULT_ENTITIES };\n for (const key of Object.keys(lazyOptions as any)) {\n if (!(lazyOptions as any)[key].modelName) {\n continue;\n }\n const entity = DEFAULT_ENTITIES[key as keyof typeof DEFAULT_ENTITIES];\n const modelName = (lazyOptions as any)[key].modelName;\n (mappedEntities as any)[modelName] = entity;\n }\n return mappedEntities;\n };\n\n return {\n async create({ data, model }) {\n try {\n const repository = getRepositoryName(model);\n const entity = repository.create(data);\n const saved = await repository.save(entity);\n return saved as any;\n } catch (error: any) {\n throw new BetterAuthError(\n `Failed to create ${model}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n async update({ model, where, update }) {\n try {\n const repository = getRepositoryName(model);\n const conditions = convertWhereToFindOptions(where);\n\n await repository.update(conditions, update as Record<string, any>);\n const updated = await repository.findOne({ where: conditions });\n\n if (!updated) return null;\n return updated as any;\n } catch (error: any) {\n throw new BetterAuthError(\n `Failed to update ${model}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n async updateMany({ model, where, update }) {\n try {\n const repository = getRepositoryName(model);\n const conditions = convertWhereToFindOptions(where);\n\n const result = await repository.update(conditions, update as Record<string, any>);\n return result.affected || 0;\n } catch (error: any) {\n throw new BetterAuthError(\n `Failed to updateMany ${model}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n async delete({ model, where }) {\n try {\n const repository = getRepositoryName(model);\n const conditions = convertWhereToFindOptions(where);\n await repository.delete(conditions);\n } catch (error: any) {\n throw new BetterAuthError(\n `Failed to delete ${model}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n async deleteMany({ model, where }) {\n try {\n const repository = getRepositoryName(model);\n const conditions = convertWhereToFindOptions(where);\n const result = await repository.delete(conditions);\n return result.affected || 0;\n } catch (error: any) {\n throw new BetterAuthError(\n `Failed to deleteMany ${model}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n async findOne({ model, where, select }) {\n try {\n const repository = getRepositoryName(model);\n const defaultModelName = getDefaultModelName(model);\n const conditions = convertWhereToFindOptions(where);\n const result = await repository.findOne({ where: conditions, select });\n\n if (!result) return null;\n\n const output = await transformOutput(result, defaultModelName, select);\n return output as any;\n } catch (error: any) {\n throw new BetterAuthError(\n `Failed to findOne ${model}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n async findMany({ model, where, limit, sortBy, offset }) {\n try {\n const defaultModelName = getDefaultModelName(model);\n const repository = getRepositoryName(model);\n const conditions = convertWhereToFindOptions(where ?? []);\n const result = await repository.find({\n where: conditions,\n take: limit,\n skip: offset,\n order: sortBy\n ? {\n [getFieldName({ model, field: sortBy.field })]:\n sortBy.direction.toUpperCase() as \"ASC\" | \"DESC\",\n }\n : undefined,\n });\n\n // Transform all results from database fields to logical fields\n const transformed = await Promise.all(\n result.map((r) => transformOutput(r, defaultModelName))\n );\n return transformed as any;\n } catch (error: any) {\n throw new BetterAuthError(\n `Failed to findMany ${model}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n async count({ model, where }) {\n try {\n const repository = getRepositoryName(model);\n const conditions = convertWhereToFindOptions(where ?? []);\n const count = await repository.count({ where: conditions });\n return count;\n } catch (error: any) {\n throw new BetterAuthError(\n `Failed to count ${model}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n async createSchema({ tables }) {\n if (config.generateEntities) {\n const mappedEntities = getMappedEntities();\n await generateEntities(tables, config.provider!, mappedEntities, config.entitiesPath!);\n }\n\n if (!config.generateMigrations) {\n return { code: \"\", path: \"\" };\n }\n\n const { code, migrationFileName } = await generateMigration(tables, config.provider!);\n return { code, path: `${config.migrationsPath}/${migrationFileName}` };\n },\n options: config,\n };\n };\n\n let adapterOptions: AdapterFactoryOptions | null = null;\n adapterOptions = {\n config: {\n adapterId: \"typeorm\",\n adapterName: \"TypeORM Adapter\",\n debugLogs: config?.debugLogs ?? false,\n supportsUUIDs: config.provider === \"postgres\" ? true : false,\n supportsJSON: config.provider === \"postgres\" ? true : false, // even though mysql also supports it, mysql requires to pass stringified json anyway.\n supportsArrays: config.provider === \"postgres\" ? true : false,\n transaction: config.transaction\n ? (cb) =>\n dataSource.transaction(async (entityManager) => {\n const adapter = createAdapterFactory({\n config: adapterOptions!.config,\n adapter: createCustomAdapter(entityManager as any),\n })(lazyOptions!);\n\n return cb(adapter);\n })\n : undefined,\n },\n adapter: (options) => {\n return createCustomAdapter(dataSource)(options);\n },\n };\n\n const adapter = createAdapterFactory(adapterOptions!);\n return (options: BetterAuthOptions) => {\n lazyOptions = options;\n return adapter(options);\n };\n};\n"]}
package/dist/index.mjs CHANGED
@@ -1,14 +1,12 @@
1
1
  import { BetterAuthError } from 'better-auth';
2
2
  import { createAdapterFactory } from 'better-auth/adapters';
3
3
  import { Like, Not, In, MoreThanOrEqual, MoreThan, LessThanOrEqual, LessThan, Equal } from 'typeorm';
4
- import Handlebars from 'handlebars';
5
- import fs from 'fs/promises';
4
+ import ejs from 'ejs';
5
+ import path from 'path';
6
+ import fs2 from 'fs/promises';
7
+ import { fileURLToPath } from 'url';
6
8
 
7
9
  // src/adapter.ts
8
- Handlebars.registerHelper("upper", (str) => str.toUpperCase());
9
- Handlebars.registerHelper("quoteJoin", function(array) {
10
- return array.map((item) => `"${item}"`).join(", ");
11
- });
12
10
 
13
11
  // src/helpers.ts
14
12
  var generateTableDefinitions = (authDbSchema, provider, isGeneratePK = true) => {
@@ -18,10 +16,11 @@ var generateTableDefinitions = (authDbSchema, provider, isGeneratePK = true) =>
18
16
  const tableInfo = {
19
17
  name,
20
18
  columns: [],
19
+ indices: [],
21
20
  fkConstraints: []
22
21
  };
23
22
  if (isGeneratePK) {
24
- generatePrimaryKeyColumn(tableInfo, provider);
23
+ tableInfo.columns.push({ name: "id", type: "varchar", isPrimary: true });
25
24
  }
26
25
  for (const [fieldName, fieldConfig] of Object.entries(tableSchema.fields)) {
27
26
  generateColumn(fieldName, fieldConfig, tableInfo, provider);
@@ -33,20 +32,36 @@ var generateTableDefinitions = (authDbSchema, provider, isGeneratePK = true) =>
33
32
  var generateColumn = (defaultFieldName, betterAuthField, tableInfo, provider) => {
34
33
  const column = {};
35
34
  column.name = betterAuthField.fieldName || defaultFieldName;
36
- column.type = mapBetterAuthTypeToDBType(betterAuthField.type, provider, betterAuthField.bigint);
35
+ column.type = mapBetterAuthTypeToDBType(betterAuthField, provider);
37
36
  if (betterAuthField.references?.field) {
38
- column.type = getIDType(provider);
37
+ column.type = "varchar";
39
38
  }
40
- if (!betterAuthField.required) {
41
- column.isNullable = true;
39
+ if (betterAuthField.sortable || betterAuthField.unique || betterAuthField.index) {
40
+ column.length = "512";
41
+ column.type = "varchar";
42
+ }
43
+ if (betterAuthField.references?.field) {
44
+ column.length = void 0;
45
+ }
46
+ if (betterAuthField.index && !betterAuthField.references?.field) {
47
+ column.isIndexed = true;
42
48
  }
43
- if (betterAuthField.unique) {
49
+ if (betterAuthField.unique && !betterAuthField.references?.field) {
44
50
  column.isUnique = true;
45
51
  }
46
- if (betterAuthField.defaultValue) {
52
+ if (!betterAuthField.required) {
53
+ column.isNullable = true;
54
+ }
55
+ if (betterAuthField.defaultValue !== void 0 && typeof betterAuthField.defaultValue !== "function") {
47
56
  column.default = betterAuthField.defaultValue;
48
57
  }
49
58
  tableInfo.columns.push(column);
59
+ if ((betterAuthField.index || betterAuthField.unique) && !betterAuthField.references) {
60
+ tableInfo.indices.push({
61
+ columnNames: [column.name],
62
+ isUnique: betterAuthField.unique || false
63
+ });
64
+ }
50
65
  if (betterAuthField.references) {
51
66
  tableInfo.fkConstraints.push({
52
67
  columnNames: [column.name],
@@ -56,31 +71,21 @@ var generateColumn = (defaultFieldName, betterAuthField, tableInfo, provider) =>
56
71
  });
57
72
  }
58
73
  };
59
- var generatePrimaryKeyColumn = (tableInfo, provider) => {
60
- const column = {
61
- name: "id",
62
- type: getIDType(provider),
63
- isPrimary: true,
64
- isGenerated: true,
65
- generationStrategy: "uuid"
66
- };
67
- tableInfo.columns.push(column);
68
- };
69
- var mapBetterAuthTypeToDBType = (betterAuthType, provider, isBigInt = false) => {
70
- if (Array.isArray(betterAuthType)) {
71
- return betterAuthType[0] || "varchar";
74
+ var mapBetterAuthTypeToDBType = (betterAuthField, provider) => {
75
+ if (Array.isArray(betterAuthField.type)) {
76
+ return betterAuthField.type[0] || "varchar";
72
77
  }
73
78
  let dbType = "";
74
- switch (betterAuthType) {
79
+ switch (betterAuthField.type) {
75
80
  case "string":
76
- dbType = "varchar";
81
+ dbType = "text";
77
82
  break;
78
83
  case "boolean":
79
84
  dbType = "boolean";
80
85
  break;
81
86
  case "number":
82
87
  dbType = provider === "sqlite" ? "integer" : "int";
83
- dbType = isBigInt && provider === "sqlite" ? dbType : "bigint";
88
+ dbType = betterAuthField.bigint && provider === "sqlite" ? dbType : "bigint";
84
89
  break;
85
90
  case "date":
86
91
  dbType = provider === "postgres" ? "timestamp" : "datetime";
@@ -89,82 +94,34 @@ var mapBetterAuthTypeToDBType = (betterAuthType, provider, isBigInt = false) =>
89
94
  dbType = provider === "sqlite" ? "text" : "json";
90
95
  break;
91
96
  default:
92
- dbType = "varchar";
97
+ dbType = "text";
93
98
  break;
94
99
  }
95
100
  return dbType;
96
101
  };
97
- var getIDType = (provider) => {
98
- return provider === "postgres" ? "uuid" : "varchar";
99
- };
100
102
 
101
103
  // src/generate-migration.ts
104
+ var __filename$1 = fileURLToPath(import.meta.url);
105
+ var __dirname$1 = path.dirname(__filename$1);
102
106
  var generateMigration = async (authDbSchema, provider) => {
103
107
  const timestamp = Date.now();
104
108
  const tableDefinitions = generateTableDefinitions(authDbSchema, provider);
105
- const template = Handlebars.compile(migrationTemplate);
106
- const migrationCode = template({
109
+ const migrationTemplatePath = path.resolve(__dirname$1, "../templates/migration.ejs");
110
+ const migrationTemplate = await fs2.readFile(migrationTemplatePath, "utf8");
111
+ const migrationCode = ejs.render(migrationTemplate, {
107
112
  timestamp,
108
113
  tables: tableDefinitions,
109
114
  tablesReversed: [...tableDefinitions].reverse()
110
115
  });
111
116
  return { code: migrationCode, migrationFileName: `${timestamp}-better-auth.ts` };
112
117
  };
113
- var migrationTemplate = `import { MigrationInterface, QueryRunner, Table } from "typeorm";
114
-
115
- export class BetterAuthMigration{{timestamp}} implements MigrationInterface {
116
- public async up(queryRunner: QueryRunner): Promise<void> {
117
- {{#each tables}}
118
- await queryRunner.createTable(
119
- new Table({
120
- name: "{{name}}",
121
- columns: [
122
- {{#each columns}}
123
- {
124
- name: "{{name}}",
125
- type: "{{type}}",
126
- {{#if isPrimary}}
127
- isPrimary: true,
128
- isGenerated: true,
129
- generationStrategy: "{{generationStrategy}}",
130
- {{/if}}
131
- {{#if isNullable}}
132
- isNullable: {{isNullable}},
133
- {{/if}}
134
- {{#if isUnique}}
135
- isUnique: true,
136
- {{/if}}
137
- },
138
- {{/each}}
139
- ],
140
- {{#if fkConstraints.length}}
141
- foreignKeys: [
142
- {{#each fkConstraints}}
143
- {
144
- columnNames: [{{{quoteJoin columnNames}}}],
145
- referencedTableName: "{{referencedTableName}}",
146
- referencedColumnNames: [{{{quoteJoin referencedColumnNames}}}],
147
- onDelete: "{{onDelete}}",
148
- },
149
- {{/each}}
150
- ],
151
- {{/if}}
152
- })
153
- );
154
- {{/each}}
155
- }
156
-
157
- public async down(queryRunner: QueryRunner): Promise<void> {
158
- {{#each tablesReversed}}
159
- await queryRunner.dropTable("{{name}}");
160
- {{/each}}
161
- }
162
- }
163
- `;
118
+ var __filename2 = fileURLToPath(import.meta.url);
119
+ var __dirname2 = path.dirname(__filename2);
164
120
  var generateEntities = async (authDbSchema, provider, mappedEntities, entitiesPath) => {
165
121
  const tableDefinitions = generateTableDefinitions(authDbSchema, provider, false);
166
- const template = Handlebars.compile(entityTemplate);
167
- const entityCode = template({
122
+ const entityTemplatePath = path.resolve(__dirname2, "../templates/entity.ejs");
123
+ const entityTemplate = await fs2.readFile(entityTemplatePath, "utf8");
124
+ const entityCode = ejs.render(entityTemplate, {
168
125
  tables: tableDefinitions.map((table) => ({
169
126
  ...table,
170
127
  entityName: mappedEntities ? mappedEntities[table.name] : table.name,
@@ -175,11 +132,11 @@ var generateEntities = async (authDbSchema, provider, mappedEntities, entitiesPa
175
132
  }))
176
133
  });
177
134
  try {
178
- await fs.access(entitiesPath);
135
+ await fs2.access(entitiesPath);
179
136
  } catch {
180
- await fs.mkdir(entitiesPath, { recursive: true });
137
+ await fs2.mkdir(entitiesPath, { recursive: true });
181
138
  } finally {
182
- await fs.writeFile(`${entitiesPath}/auth.ts`, entityCode);
139
+ await fs2.writeFile(`${entitiesPath}/auth.ts`, entityCode);
183
140
  }
184
141
  return entityCode;
185
142
  };
@@ -212,35 +169,6 @@ var mapDBTypeToTSType = (dbType, isNullable) => {
212
169
  }
213
170
  return tsType;
214
171
  };
215
- var entityTemplate = `import { Entity, PrimaryGeneratedColumn, Column, ManyToOne } from "typeorm";
216
-
217
- {{#each tables}}
218
- @Entity("{{name}}")
219
- export class {{entityName}} {
220
- @PrimaryGeneratedColumn("uuid")
221
- id!: string;
222
-
223
- {{#each columns}}
224
- {{#if isNullable}}
225
- {{#if isUnique}}
226
- @Column("{{type}}", { nullable: true, unique: true })
227
- {{else}}
228
- @Column("{{type}}", { nullable: true })
229
- {{/if}}
230
- {{else}}
231
- {{#if isUnique}}
232
- @Column("{{type}}", { unique: true })
233
- {{else}}
234
- @Column("{{type}}")
235
- {{/if}}
236
- {{/if}}
237
- {{name}}{{#if isNullable}}?: {{tsType}}{{else}}!: {{tsType}}{{/if}};
238
-
239
- {{/each}}
240
- }
241
-
242
- {{/each}}
243
- `;
244
172
 
245
173
  // src/adapter.ts
246
174
  var DEFAULT_ENTITIES = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/handlerbar.ts","../src/helpers.ts","../src/generate-migration.ts","../src/generate-entity.ts","../src/adapter.ts"],"names":["dataSource","adapter"],"mappings":"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","file":"index.mjs","sourcesContent":["import Handlebars from \"handlebars\";\n\nHandlebars.registerHelper(\"upper\", (str: string) => str.toUpperCase());\n\nHandlebars.registerHelper(\"quoteJoin\", function (array: string[]) {\n return array.map((item) => `\"${item}\"`).join(\", \");\n});\n\nexport { Handlebars };\n","import { BetterAuthDBSchema, DBFieldAttribute } from \"better-auth\";\nimport { Provider } from \"./types\";\n\ninterface TableDefinition {\n name: string;\n entityName?: string;\n columns: {\n name: string;\n type: string;\n isNullable?: boolean;\n isUnique?: boolean;\n default?: any;\n isPrimary?: boolean;\n isGenerated?: boolean;\n generationStrategy?: \"uuid\" | \"increment\";\n }[];\n fkConstraints: {\n columnNames: string[];\n referencedColumnNames: string[];\n referencedTableName: string;\n onDelete: string;\n }[];\n}\n\nexport const generateTableDefinitions = (\n authDbSchema: BetterAuthDBSchema,\n provider: Provider,\n isGeneratePK: boolean = true\n) => {\n const tableDefinitions: TableDefinition[] = [];\n\n for (const [tableName, tableSchema] of Object.entries(authDbSchema)) {\n const name = tableSchema.modelName || tableName;\n const tableInfo: TableDefinition = {\n name: name,\n columns: [],\n fkConstraints: [],\n };\n\n if (isGeneratePK) {\n generatePrimaryKeyColumn(tableInfo, provider);\n }\n for (const [fieldName, fieldConfig] of Object.entries(tableSchema.fields)) {\n generateColumn(fieldName, fieldConfig, tableInfo, provider);\n }\n\n tableDefinitions.push(tableInfo);\n }\n\n return tableDefinitions;\n};\n\nconst generateColumn = (\n defaultFieldName: string,\n betterAuthField: DBFieldAttribute,\n tableInfo: TableDefinition,\n provider: Provider\n) => {\n const column = {} as TableDefinition[\"columns\"][0];\n column.name = betterAuthField.fieldName || defaultFieldName;\n\n column.type = mapBetterAuthTypeToDBType(betterAuthField.type, provider, betterAuthField.bigint);\n if (betterAuthField.references?.field) {\n column.type = getIDType(provider);\n }\n\n if (!betterAuthField.required) {\n column.isNullable = true;\n }\n\n if (betterAuthField.unique) {\n column.isUnique = true;\n }\n\n if (betterAuthField.defaultValue) {\n column.default = betterAuthField.defaultValue;\n }\n\n tableInfo.columns.push(column);\n\n if (betterAuthField.references) {\n tableInfo.fkConstraints.push({\n columnNames: [column.name],\n referencedTableName: betterAuthField.references.model,\n referencedColumnNames: [betterAuthField.references.field],\n onDelete: betterAuthField.references.onDelete || \"no action\",\n });\n }\n};\n\nconst generatePrimaryKeyColumn = (tableInfo: TableDefinition, provider: Provider) => {\n const column = {\n name: \"id\",\n type: getIDType(provider),\n isPrimary: true,\n isGenerated: true,\n generationStrategy: \"uuid\",\n } as TableDefinition[\"columns\"][0];\n\n tableInfo.columns.push(column);\n};\n\nconst mapBetterAuthTypeToDBType = (\n betterAuthType: DBFieldAttribute[\"type\"],\n provider: Provider,\n isBigInt: boolean = false\n): string => {\n if (Array.isArray(betterAuthType)) {\n return betterAuthType[0] || \"varchar\";\n }\n\n let dbType = \"\";\n\n switch (betterAuthType) {\n case \"string\":\n dbType = \"varchar\";\n break;\n case \"boolean\":\n dbType = \"boolean\";\n break;\n case \"number\":\n dbType = provider === \"sqlite\" ? \"integer\" : \"int\";\n dbType = isBigInt && provider === \"sqlite\" ? dbType : \"bigint\";\n break;\n case \"date\":\n dbType = provider === \"postgres\" ? \"timestamp\" : \"datetime\";\n break;\n case \"json\":\n dbType = provider === \"sqlite\" ? \"text\" : \"json\";\n break;\n default:\n dbType = \"varchar\";\n break;\n }\n\n return dbType;\n};\n\nconst getIDType = (provider: Provider): string => {\n return provider === \"postgres\" ? \"uuid\" : \"varchar\";\n};\n","import { BetterAuthDBSchema } from \"better-auth\";\nimport { Provider } from \"./types\";\nimport { Handlebars } from \"./lib/handlerbar\";\nimport { generateTableDefinitions } from \"./helpers\";\n\nexport const generateMigration = async (authDbSchema: BetterAuthDBSchema, provider: Provider) => {\n const timestamp = Date.now();\n const tableDefinitions = generateTableDefinitions(authDbSchema, provider);\n\n const template = Handlebars.compile(migrationTemplate);\n\n const migrationCode = template({\n timestamp,\n tables: tableDefinitions,\n tablesReversed: [...tableDefinitions].reverse(),\n });\n\n return { code: migrationCode, migrationFileName: `${timestamp}-better-auth.ts` };\n};\n\nconst migrationTemplate = `import { MigrationInterface, QueryRunner, Table } from \"typeorm\";\n\nexport class BetterAuthMigration{{timestamp}} implements MigrationInterface {\n public async up(queryRunner: QueryRunner): Promise<void> {\n{{#each tables}}\n await queryRunner.createTable(\n new Table({\n name: \"{{name}}\",\n columns: [\n{{#each columns}}\n {\n name: \"{{name}}\",\n type: \"{{type}}\",\n{{#if isPrimary}}\n isPrimary: true,\n isGenerated: true,\n generationStrategy: \"{{generationStrategy}}\",\n{{/if}}\n{{#if isNullable}}\n isNullable: {{isNullable}},\n{{/if}}\n{{#if isUnique}}\n isUnique: true,\n{{/if}}\n },\n{{/each}}\n ],\n{{#if fkConstraints.length}}\n foreignKeys: [\n{{#each fkConstraints}}\n {\n columnNames: [{{{quoteJoin columnNames}}}],\n referencedTableName: \"{{referencedTableName}}\",\n referencedColumnNames: [{{{quoteJoin referencedColumnNames}}}],\n onDelete: \"{{onDelete}}\",\n },\n{{/each}}\n ],\n{{/if}}\n })\n );\n{{/each}}\n }\n\n public async down(queryRunner: QueryRunner): Promise<void> {\n{{#each tablesReversed}}\n await queryRunner.dropTable(\"{{name}}\");\n{{/each}}\n }\n}\n`;\n","import fs from \"fs/promises\";\nimport { BetterAuthDBSchema } from \"better-auth\";\nimport { Provider } from \"./types\";\nimport { Handlebars } from \"./lib/handlerbar\";\nimport { generateTableDefinitions } from \"./helpers\";\n\nexport const generateEntities = async (\n authDbSchema: BetterAuthDBSchema,\n provider: Provider,\n mappedEntities: Record<string, any>,\n entitiesPath: string\n) => {\n const tableDefinitions = generateTableDefinitions(authDbSchema, provider, false);\n\n const template = Handlebars.compile(entityTemplate);\n\n const entityCode = template({\n tables: tableDefinitions.map((table) => ({\n ...table,\n entityName: mappedEntities ? mappedEntities[table.name] : table.name,\n columns: table.columns.map((column) => ({\n ...column,\n tsType: mapDBTypeToTSType(column.type, column.isNullable),\n })),\n })),\n });\n\n // check if entitiesPath exists, if not create it\n try {\n await fs.access(entitiesPath);\n } catch {\n await fs.mkdir(entitiesPath, { recursive: true });\n } finally {\n await fs.writeFile(`${entitiesPath}/auth.ts`, entityCode);\n }\n\n return entityCode;\n};\n\nconst mapDBTypeToTSType = (dbType: string, isNullable?: boolean): string => {\n let tsType: string;\n\n switch (dbType) {\n case \"varchar\":\n case \"text\":\n case \"json\":\n tsType = \"string\";\n break;\n case \"boolean\":\n tsType = \"boolean\";\n break;\n case \"int\":\n case \"integer\":\n case \"bigint\":\n tsType = \"number\";\n break;\n case \"datetime\":\n case \"timestamp\":\n tsType = \"Date\";\n break;\n default:\n tsType = \"any\";\n break;\n }\n\n if (isNullable) {\n tsType += \" | null\";\n }\n\n return tsType;\n};\n\nconst entityTemplate = `import { Entity, PrimaryGeneratedColumn, Column, ManyToOne } from \"typeorm\";\n\n{{#each tables}}\n@Entity(\"{{name}}\")\nexport class {{entityName}} {\n @PrimaryGeneratedColumn(\"uuid\")\n id!: string;\n\n {{#each columns}}\n {{#if isNullable}}\n {{#if isUnique}}\n @Column(\"{{type}}\", { nullable: true, unique: true })\n {{else}}\n @Column(\"{{type}}\", { nullable: true })\n {{/if}}\n {{else}}\n {{#if isUnique}}\n @Column(\"{{type}}\", { unique: true })\n {{else}}\n @Column(\"{{type}}\")\n {{/if}}\n {{/if}}\n {{name}}{{#if isNullable}}?: {{tsType}}{{else}}!: {{tsType}}{{/if}};\\n\n {{/each}}\n}\\n\n{{/each}}\n`;\n","import { BetterAuthError, BetterAuthOptions } from \"better-auth\";\nimport {\n AdapterFactoryOptions,\n createAdapterFactory,\n Where,\n type AdapterFactoryCustomizeAdapterCreator,\n} from \"better-auth/adapters\";\nimport {\n DataSource,\n Equal,\n FindOptionsWhere,\n In,\n LessThan,\n LessThanOrEqual,\n Like,\n MoreThan,\n MoreThanOrEqual,\n Not,\n ObjectLiteral,\n} from \"typeorm\";\nimport { generateMigration } from \"./generate-migration\";\nimport { TypeOrmAdapterConfig } from \"./types\";\nimport { generateEntities } from \"./generate-entity\";\n\nconst DEFAULT_ENTITIES = {\n user: \"User\",\n account: \"Account\",\n session: \"Session\",\n verification: \"Verification\",\n} as const;\n\nexport const typeormAdapter = (dataSource: DataSource, config: TypeOrmAdapterConfig = {}) => {\n config = {\n entitiesPath: \"./entities\",\n migrationsPath: \"./migrations\",\n provider: \"postgres\",\n generateEntities: true,\n generateMigrations: true,\n ...(config || {}),\n entities: {\n ...DEFAULT_ENTITIES,\n ...(config?.entities || {}),\n },\n };\n\n let lazyOptions: BetterAuthOptions | null = null;\n\n const convertOperatorToTypeORM = (operator: Where[\"operator\"], value: unknown) => {\n switch (operator) {\n case \"eq\":\n return Equal(value);\n case \"ne\":\n return Not(value);\n case \"lt\":\n return LessThan(value);\n case \"lte\":\n return LessThanOrEqual(value);\n case \"gt\":\n return MoreThan(value);\n case \"gte\":\n return MoreThanOrEqual(value);\n case \"in\":\n return In(value as unknown[]);\n case \"not_in\":\n return Not(In(value as unknown[]));\n case \"contains\":\n return Like(`%${value}%`);\n case \"starts_with\":\n return Like(`${value}%`);\n case \"ends_with\":\n return Like(`%${value}`);\n default:\n return value;\n }\n };\n\n const convertWhereToFindOptions = (where: Where[]): FindOptionsWhere<ObjectLiteral> => {\n if (!where || where.length === 0) return {};\n\n const findOptions: FindOptionsWhere<ObjectLiteral> = {};\n\n for (const w of where) {\n if (!w.operator) {\n findOptions[w.field] = w.value;\n } else {\n findOptions[w.field] = convertOperatorToTypeORM(w.operator, w.value);\n }\n }\n\n return findOptions;\n };\n\n const createCustomAdapter =\n (dataSource: DataSource): AdapterFactoryCustomizeAdapterCreator =>\n ({ getDefaultModelName, getFieldName, transformOutput }) => {\n const getRepositoryName = (model: string) => {\n const modelName = getDefaultModelName(model);\n const repositoryName =\n config.entities?.[modelName as keyof typeof config.entities] || modelName;\n return dataSource.getRepository(repositoryName);\n };\n\n const getMappedEntities = () => {\n const mappedEntities = { ...DEFAULT_ENTITIES };\n for (const key of Object.keys(lazyOptions as any)) {\n if (!(lazyOptions as any)[key].modelName) {\n continue;\n }\n const entity = DEFAULT_ENTITIES[key as keyof typeof DEFAULT_ENTITIES];\n const modelName = (lazyOptions as any)[key].modelName;\n (mappedEntities as any)[modelName] = entity;\n }\n return mappedEntities;\n };\n\n return {\n async create({ data, model }) {\n try {\n const repository = getRepositoryName(model);\n const entity = repository.create(data);\n const saved = await repository.save(entity);\n return saved as any;\n } catch (error: any) {\n throw new BetterAuthError(\n `Failed to create ${model}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n async update({ model, where, update }) {\n try {\n const repository = getRepositoryName(model);\n const conditions = convertWhereToFindOptions(where);\n\n await repository.update(conditions, update as Record<string, any>);\n const updated = await repository.findOne({ where: conditions });\n\n if (!updated) return null;\n return updated as any;\n } catch (error: any) {\n throw new BetterAuthError(\n `Failed to update ${model}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n async updateMany({ model, where, update }) {\n try {\n const repository = getRepositoryName(model);\n const conditions = convertWhereToFindOptions(where);\n\n const result = await repository.update(conditions, update as Record<string, any>);\n return result.affected || 0;\n } catch (error: any) {\n throw new BetterAuthError(\n `Failed to updateMany ${model}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n async delete({ model, where }) {\n try {\n const repository = getRepositoryName(model);\n const conditions = convertWhereToFindOptions(where);\n await repository.delete(conditions);\n } catch (error: any) {\n throw new BetterAuthError(\n `Failed to delete ${model}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n async deleteMany({ model, where }) {\n try {\n const repository = getRepositoryName(model);\n const conditions = convertWhereToFindOptions(where);\n const result = await repository.delete(conditions);\n return result.affected || 0;\n } catch (error: any) {\n throw new BetterAuthError(\n `Failed to deleteMany ${model}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n async findOne({ model, where, select }) {\n try {\n const repository = getRepositoryName(model);\n const defaultModelName = getDefaultModelName(model);\n const conditions = convertWhereToFindOptions(where);\n const result = await repository.findOne({ where: conditions, select });\n\n if (!result) return null;\n\n const output = await transformOutput(result, defaultModelName, select);\n return output as any;\n } catch (error: any) {\n throw new BetterAuthError(\n `Failed to findOne ${model}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n async findMany({ model, where, limit, sortBy, offset }) {\n try {\n const defaultModelName = getDefaultModelName(model);\n const repository = getRepositoryName(model);\n const conditions = convertWhereToFindOptions(where ?? []);\n const result = await repository.find({\n where: conditions,\n take: limit,\n skip: offset,\n order: sortBy\n ? {\n [getFieldName({ model, field: sortBy.field })]:\n sortBy.direction.toUpperCase() as \"ASC\" | \"DESC\",\n }\n : undefined,\n });\n\n // Transform all results from database fields to logical fields\n const transformed = await Promise.all(\n result.map((r) => transformOutput(r, defaultModelName))\n );\n return transformed as any;\n } catch (error: any) {\n throw new BetterAuthError(\n `Failed to findMany ${model}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n async count({ model, where }) {\n try {\n const repository = getRepositoryName(model);\n const conditions = convertWhereToFindOptions(where ?? []);\n const count = await repository.count({ where: conditions });\n return count;\n } catch (error: any) {\n throw new BetterAuthError(\n `Failed to count ${model}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n async createSchema({ tables }) {\n if (config.generateEntities) {\n const mappedEntities = getMappedEntities();\n await generateEntities(tables, config.provider!, mappedEntities, config.entitiesPath!);\n }\n\n if (!config.generateMigrations) {\n return { code: \"\", path: \"\" };\n }\n\n const { code, migrationFileName } = await generateMigration(tables, config.provider!);\n return { code, path: `${config.migrationsPath}/${migrationFileName}` };\n },\n options: config,\n };\n };\n\n let adapterOptions: AdapterFactoryOptions | null = null;\n adapterOptions = {\n config: {\n adapterId: \"typeorm\",\n adapterName: \"TypeORM Adapter\",\n debugLogs: config?.debugLogs ?? false,\n supportsUUIDs: config.provider === \"postgres\" ? true : false,\n supportsJSON: config.provider === \"postgres\" ? true : false, // even though mysql also supports it, mysql requires to pass stringified json anyway.\n supportsArrays: config.provider === \"postgres\" ? true : false,\n transaction: config.transaction\n ? (cb) =>\n dataSource.transaction(async (entityManager) => {\n const adapter = createAdapterFactory({\n config: adapterOptions!.config,\n adapter: createCustomAdapter(entityManager as any),\n })(lazyOptions!);\n\n return cb(adapter);\n })\n : undefined,\n },\n adapter: (options) => {\n return createCustomAdapter(dataSource)(options);\n },\n };\n\n const adapter = createAdapterFactory(adapterOptions!);\n return (options: BetterAuthOptions) => {\n lazyOptions = options;\n return adapter(options);\n };\n};\n"]}
1
+ {"version":3,"sources":["../src/helpers.ts","../src/generate-migration.ts","../src/generate-entity.ts","../src/adapter.ts"],"names":["__filename","__dirname","fs","fileURLToPath","path","ejs","dataSource","adapter"],"mappings":";;;;;;;;;;;AA4BO,IAAM,wBAAA,GAA2B,CACtC,YAAA,EACA,QAAA,EACA,eAAwB,IAAA,KACrB;AACH,EAAA,MAAM,mBAAsC,EAAC;AAE7C,EAAA,KAAA,MAAW,CAAC,SAAA,EAAW,WAAW,KAAK,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAA,EAAG;AACnE,IAAA,MAAM,IAAA,GAAO,YAAY,SAAA,IAAa,SAAA;AACtC,IAAA,MAAM,SAAA,GAA6B;AAAA,MACjC,IAAA;AAAA,MACA,SAAS,EAAC;AAAA,MACV,SAAS,EAAC;AAAA,MACV,eAAe;AAAC,KAClB;AAEA,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,SAAA,CAAU,OAAA,CAAQ,KAAK,EAAE,IAAA,EAAM,MAAM,IAAA,EAAM,SAAA,EAAW,SAAA,EAAW,IAAA,EAAM,CAAA;AAAA,IACzE;AACA,IAAA,KAAA,MAAW,CAAC,WAAW,WAAW,CAAA,IAAK,OAAO,OAAA,CAAQ,WAAA,CAAY,MAAM,CAAA,EAAG;AACzE,MAAA,cAAA,CAAe,SAAA,EAAW,WAAA,EAAa,SAAA,EAAW,QAAQ,CAAA;AAAA,IAC5D;AAEA,IAAA,gBAAA,CAAiB,KAAK,SAAS,CAAA;AAAA,EACjC;AAEA,EAAA,OAAO,gBAAA;AACT,CAAA;AAEA,IAAM,cAAA,GAAiB,CACrB,gBAAA,EACA,eAAA,EACA,WACA,QAAA,KACG;AACH,EAAA,MAAM,SAAS,EAAC;AAChB,EAAA,MAAA,CAAO,IAAA,GAAO,gBAAgB,SAAA,IAAa,gBAAA;AAE3C,EAAA,MAAA,CAAO,IAAA,GAAO,yBAAA,CAA0B,eAAA,EAAiB,QAAQ,CAAA;AACjE,EAAA,IAAI,eAAA,CAAgB,YAAY,KAAA,EAAO;AACrC,IAAA,MAAA,CAAO,IAAA,GAAO,SAAA;AAAA,EAChB;AAEA,EAAA,IAAI,eAAA,CAAgB,QAAA,IAAY,eAAA,CAAgB,MAAA,IAAU,gBAAgB,KAAA,EAAO;AAC/E,IAAA,MAAA,CAAO,MAAA,GAAS,KAAA;AAChB,IAAA,MAAA,CAAO,IAAA,GAAO,SAAA;AAAA,EAChB;AACA,EAAA,IAAI,eAAA,CAAgB,YAAY,KAAA,EAAO;AACrC,IAAA,MAAA,CAAO,MAAA,GAAS,MAAA;AAAA,EAClB;AAEA,EAAA,IAAI,eAAA,CAAgB,KAAA,IAAS,CAAC,eAAA,CAAgB,YAAY,KAAA,EAAO;AAC/D,IAAA,MAAA,CAAO,SAAA,GAAY,IAAA;AAAA,EACrB;AAEA,EAAA,IAAI,eAAA,CAAgB,MAAA,IAAU,CAAC,eAAA,CAAgB,YAAY,KAAA,EAAO;AAChE,IAAA,MAAA,CAAO,QAAA,GAAW,IAAA;AAAA,EACpB;AAEA,EAAA,IAAI,CAAC,gBAAgB,QAAA,EAAU;AAC7B,IAAA,MAAA,CAAO,UAAA,GAAa,IAAA;AAAA,EACtB;AAEA,EAAA,IACE,gBAAgB,YAAA,KAAiB,MAAA,IACjC,OAAO,eAAA,CAAgB,iBAAiB,UAAA,EACxC;AACA,IAAA,MAAA,CAAO,UAAU,eAAA,CAAgB,YAAA;AAAA,EACnC;AAEA,EAAA,SAAA,CAAU,OAAA,CAAQ,KAAK,MAAM,CAAA;AAE7B,EAAA,IAAA,CAAK,gBAAgB,KAAA,IAAS,eAAA,CAAgB,MAAA,KAAW,CAAC,gBAAgB,UAAA,EAAY;AACpF,IAAA,SAAA,CAAU,QAAQ,IAAA,CAAK;AAAA,MACrB,WAAA,EAAa,CAAC,MAAA,CAAO,IAAI,CAAA;AAAA,MACzB,QAAA,EAAU,gBAAgB,MAAA,IAAU;AAAA,KACrC,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,gBAAgB,UAAA,EAAY;AAC9B,IAAA,SAAA,CAAU,cAAc,IAAA,CAAK;AAAA,MAC3B,WAAA,EAAa,CAAC,MAAA,CAAO,IAAI,CAAA;AAAA,MACzB,mBAAA,EAAqB,gBAAgB,UAAA,CAAW,KAAA;AAAA,MAChD,qBAAA,EAAuB,CAAC,eAAA,CAAgB,UAAA,CAAW,KAAK,CAAA;AAAA,MACxD,QAAA,EAAU,eAAA,CAAgB,UAAA,CAAW,QAAA,IAAY;AAAA,KAClD,CAAA;AAAA,EACH;AACF,CAAA;AAEA,IAAM,yBAAA,GAA4B,CAChC,eAAA,EACA,QAAA,KACW;AACX,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,eAAA,CAAgB,IAAI,CAAA,EAAG;AACvC,IAAA,OAAO,eAAA,CAAgB,IAAA,CAAK,CAAC,CAAA,IAAK,SAAA;AAAA,EACpC;AAEA,EAAA,IAAI,MAAA,GAAS,EAAA;AAEb,EAAA,QAAQ,gBAAgB,IAAA;AAAM,IAC5B,KAAK,QAAA;AACH,MAAA,MAAA,GAAS,MAAA;AACT,MAAA;AAAA,IACF,KAAK,SAAA;AACH,MAAA,MAAA,GAAS,SAAA;AACT,MAAA;AAAA,IACF,KAAK,QAAA;AACH,MAAA,MAAA,GAAS,QAAA,KAAa,WAAW,SAAA,GAAY,KAAA;AAC7C,MAAA,MAAA,GAAS,eAAA,CAAgB,MAAA,IAAU,QAAA,KAAa,QAAA,GAAW,MAAA,GAAS,QAAA;AACpE,MAAA;AAAA,IACF,KAAK,MAAA;AACH,MAAA,MAAA,GAAS,QAAA,KAAa,aAAa,WAAA,GAAc,UAAA;AACjD,MAAA;AAAA,IACF,KAAK,MAAA;AACH,MAAA,MAAA,GAAS,QAAA,KAAa,WAAW,MAAA,GAAS,MAAA;AAC1C,MAAA;AAAA,IACF;AACE,MAAA,MAAA,GAAS,MAAA;AACT,MAAA;AAAA;AAGJ,EAAA,OAAO,MAAA;AACT,CAAA;;;AC9IA,IAAMA,YAAA,GAAa,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA;AAChD,IAAMC,WAAA,GAAY,IAAA,CAAK,OAAA,CAAQD,YAAU,CAAA;AAElC,IAAM,iBAAA,GAAoB,OAAO,YAAA,EAAkC,QAAA,KAAuB;AAC/F,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,EAAA,MAAM,gBAAA,GAAmB,wBAAA,CAAyB,YAAA,EAAc,QAAQ,CAAA;AAExE,EAAA,MAAM,qBAAA,GAAwB,IAAA,CAAK,OAAA,CAAQC,WAAA,EAAW,4BAA4B,CAAA;AAClF,EAAA,MAAM,iBAAA,GAAoB,MAAMC,GAAA,CAAG,QAAA,CAAS,uBAAuB,MAAM,CAAA;AACzE,EAAA,MAAM,aAAA,GAAgB,GAAA,CAAI,MAAA,CAAO,iBAAA,EAAmB;AAAA,IAClD,SAAA;AAAA,IACA,MAAA,EAAQ,gBAAA;AAAA,IACR,cAAA,EAAgB,CAAC,GAAG,gBAAgB,EAAE,OAAA;AAAQ,GAC/C,CAAA;AAED,EAAA,OAAO,EAAE,IAAA,EAAM,aAAA,EAAe,iBAAA,EAAmB,CAAA,EAAG,SAAS,CAAA,eAAA,CAAA,EAAkB;AACjF,CAAA;AChBA,IAAMF,WAAAA,GAAaG,aAAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA;AAChD,IAAMF,UAAAA,GAAYG,IAAAA,CAAK,OAAA,CAAQJ,WAAU,CAAA;AAElC,IAAM,gBAAA,GAAmB,OAC9B,YAAA,EACA,QAAA,EACA,gBACA,YAAA,KACG;AACH,EAAA,MAAM,gBAAA,GAAmB,wBAAA,CAAyB,YAAA,EAAc,QAAA,EAAU,KAAK,CAAA;AAE/E,EAAA,MAAM,kBAAA,GAAqBI,IAAAA,CAAK,OAAA,CAAQH,UAAAA,EAAW,yBAAyB,CAAA;AAC5E,EAAA,MAAM,cAAA,GAAiB,MAAMC,GAAAA,CAAG,QAAA,CAAS,oBAAoB,MAAM,CAAA;AACnE,EAAA,MAAM,UAAA,GAAaG,GAAAA,CAAI,MAAA,CAAO,cAAA,EAAgB;AAAA,IAC5C,MAAA,EAAQ,gBAAA,CAAiB,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,MACvC,GAAG,KAAA;AAAA,MACH,YAAY,cAAA,GAAiB,cAAA,CAAe,KAAA,CAAM,IAAI,IAAI,KAAA,CAAM,IAAA;AAAA,MAChE,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,MAAY;AAAA,QACtC,GAAG,MAAA;AAAA,QACH,MAAA,EAAQ,iBAAA,CAAkB,MAAA,CAAO,IAAA,EAAM,OAAO,UAAU;AAAA,OAC1D,CAAE;AAAA,KACJ,CAAE;AAAA,GACH,CAAA;AAGD,EAAA,IAAI;AACF,IAAA,MAAMH,GAAAA,CAAG,OAAO,YAAY,CAAA;AAAA,EAC9B,CAAA,CAAA,MAAQ;AACN,IAAA,MAAMA,IAAG,KAAA,CAAM,YAAA,EAAc,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,EAClD,CAAA,SAAE;AACA,IAAA,MAAMA,GAAAA,CAAG,SAAA,CAAU,CAAA,EAAG,YAAY,YAAY,UAAU,CAAA;AAAA,EAC1D;AAEA,EAAA,OAAO,UAAA;AACT,CAAA;AAEA,IAAM,iBAAA,GAAoB,CAAC,MAAA,EAAgB,UAAA,KAAiC;AAC1E,EAAA,IAAI,MAAA;AAEJ,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,SAAA;AAAA,IACL,KAAK,MAAA;AAAA,IACL,KAAK,MAAA;AACH,MAAA,MAAA,GAAS,QAAA;AACT,MAAA;AAAA,IACF,KAAK,SAAA;AACH,MAAA,MAAA,GAAS,SAAA;AACT,MAAA;AAAA,IACF,KAAK,KAAA;AAAA,IACL,KAAK,SAAA;AAAA,IACL,KAAK,QAAA;AACH,MAAA,MAAA,GAAS,QAAA;AACT,MAAA;AAAA,IACF,KAAK,UAAA;AAAA,IACL,KAAK,WAAA;AACH,MAAA,MAAA,GAAS,MAAA;AACT,MAAA;AAAA,IACF;AACE,MAAA,MAAA,GAAS,KAAA;AACT,MAAA;AAAA;AAGJ,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAA,IAAU,SAAA;AAAA,EACZ;AAEA,EAAA,OAAO,MAAA;AACT,CAAA;;;ACnDA,IAAM,gBAAA,GAAmB;AAAA,EACvB,IAAA,EAAM,MAAA;AAAA,EACN,OAAA,EAAS,SAAA;AAAA,EACT,OAAA,EAAS,SAAA;AAAA,EACT,YAAA,EAAc;AAChB,CAAA;AAEO,IAAM,cAAA,GAAiB,CAAC,UAAA,EAAwB,MAAA,GAA+B,EAAC,KAAM;AAC3F,EAAA,MAAA,GAAS;AAAA,IACP,YAAA,EAAc,YAAA;AAAA,IACd,cAAA,EAAgB,cAAA;AAAA,IAChB,QAAA,EAAU,UAAA;AAAA,IACV,gBAAA,EAAkB,IAAA;AAAA,IAClB,kBAAA,EAAoB,IAAA;AAAA,IACpB,GAAI,UAAU,EAAC;AAAA,IACf,QAAA,EAAU;AAAA,MACR,GAAG,gBAAA;AAAA,MACH,GAAI,MAAA,EAAQ,QAAA,IAAY;AAAC;AAC3B,GACF;AAEA,EAAA,IAAI,WAAA,GAAwC,IAAA;AAE5C,EAAA,MAAM,wBAAA,GAA2B,CAAC,QAAA,EAA6B,KAAA,KAAmB;AAChF,IAAA,QAAQ,QAAA;AAAU,MAChB,KAAK,IAAA;AACH,QAAA,OAAO,MAAM,KAAK,CAAA;AAAA,MACpB,KAAK,IAAA;AACH,QAAA,OAAO,IAAI,KAAK,CAAA;AAAA,MAClB,KAAK,IAAA;AACH,QAAA,OAAO,SAAS,KAAK,CAAA;AAAA,MACvB,KAAK,KAAA;AACH,QAAA,OAAO,gBAAgB,KAAK,CAAA;AAAA,MAC9B,KAAK,IAAA;AACH,QAAA,OAAO,SAAS,KAAK,CAAA;AAAA,MACvB,KAAK,KAAA;AACH,QAAA,OAAO,gBAAgB,KAAK,CAAA;AAAA,MAC9B,KAAK,IAAA;AACH,QAAA,OAAO,GAAG,KAAkB,CAAA;AAAA,MAC9B,KAAK,QAAA;AACH,QAAA,OAAO,GAAA,CAAI,EAAA,CAAG,KAAkB,CAAC,CAAA;AAAA,MACnC,KAAK,UAAA;AACH,QAAA,OAAO,IAAA,CAAK,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,MAC1B,KAAK,aAAA;AACH,QAAA,OAAO,IAAA,CAAK,CAAA,EAAG,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,MACzB,KAAK,WAAA;AACH,QAAA,OAAO,IAAA,CAAK,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,CAAA;AAAA,MACzB;AACE,QAAA,OAAO,KAAA;AAAA;AACX,EACF,CAAA;AAEA,EAAA,MAAM,yBAAA,GAA4B,CAAC,KAAA,KAAoD;AACrF,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,KAAW,CAAA,SAAU,EAAC;AAE1C,IAAA,MAAM,cAA+C,EAAC;AAEtD,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,MAAA,IAAI,CAAC,EAAE,QAAA,EAAU;AACf,QAAA,WAAA,CAAY,CAAA,CAAE,KAAK,CAAA,GAAI,CAAA,CAAE,KAAA;AAAA,MAC3B,CAAA,MAAO;AACL,QAAA,WAAA,CAAY,EAAE,KAAK,CAAA,GAAI,yBAAyB,CAAA,CAAE,QAAA,EAAU,EAAE,KAAK,CAAA;AAAA,MACrE;AAAA,IACF;AAEA,IAAA,OAAO,WAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,mBAAA,GACJ,CAACI,WAAAA,KACD,CAAC,EAAE,mBAAA,EAAqB,YAAA,EAAc,iBAAgB,KAAM;AAC1D,IAAA,MAAM,iBAAA,GAAoB,CAAC,KAAA,KAAkB;AAC3C,MAAA,MAAM,SAAA,GAAY,oBAAoB,KAAK,CAAA;AAC3C,MAAA,MAAM,cAAA,GACJ,MAAA,CAAO,QAAA,GAAW,SAAyC,CAAA,IAAK,SAAA;AAClE,MAAA,OAAOA,WAAAA,CAAW,cAAc,cAAc,CAAA;AAAA,IAChD,CAAA;AAEA,IAAA,MAAM,oBAAoB,MAAM;AAC9B,MAAA,MAAM,cAAA,GAAiB,EAAE,GAAG,gBAAA,EAAiB;AAC7C,MAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,WAAkB,CAAA,EAAG;AACjD,QAAA,IAAI,CAAE,WAAA,CAAoB,GAAG,CAAA,CAAE,SAAA,EAAW;AACxC,UAAA;AAAA,QACF;AACA,QAAA,MAAM,MAAA,GAAS,iBAAiB,GAAoC,CAAA;AACpE,QAAA,MAAM,SAAA,GAAa,WAAA,CAAoB,GAAG,CAAA,CAAE,SAAA;AAC5C,QAAC,cAAA,CAAuB,SAAS,CAAA,GAAI,MAAA;AAAA,MACvC;AACA,MAAA,OAAO,cAAA;AAAA,IACT,CAAA;AAEA,IAAA,OAAO;AAAA,MACL,MAAM,MAAA,CAAO,EAAE,IAAA,EAAM,OAAM,EAAG;AAC5B,QAAA,IAAI;AACF,UAAA,MAAM,UAAA,GAAa,kBAAkB,KAAK,CAAA;AAC1C,UAAA,MAAM,MAAA,GAAS,UAAA,CAAW,MAAA,CAAO,IAAI,CAAA;AACrC,UAAA,MAAM,KAAA,GAAQ,MAAM,UAAA,CAAW,IAAA,CAAK,MAAM,CAAA;AAC1C,UAAA,OAAO,KAAA;AAAA,QACT,SAAS,KAAA,EAAY;AACnB,UAAA,MAAM,IAAI,eAAA;AAAA,YACR,CAAA,iBAAA,EAAoB,KAAK,CAAA,EAAA,EAAK,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,WACtF;AAAA,QACF;AAAA,MACF,CAAA;AAAA,MACA,MAAM,MAAA,CAAO,EAAE,KAAA,EAAO,KAAA,EAAO,QAAO,EAAG;AACrC,QAAA,IAAI;AACF,UAAA,MAAM,UAAA,GAAa,kBAAkB,KAAK,CAAA;AAC1C,UAAA,MAAM,UAAA,GAAa,0BAA0B,KAAK,CAAA;AAElD,UAAA,MAAM,UAAA,CAAW,MAAA,CAAO,UAAA,EAAY,MAA6B,CAAA;AACjE,UAAA,MAAM,UAAU,MAAM,UAAA,CAAW,QAAQ,EAAE,KAAA,EAAO,YAAY,CAAA;AAE9D,UAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,UAAA,OAAO,OAAA;AAAA,QACT,SAAS,KAAA,EAAY;AACnB,UAAA,MAAM,IAAI,eAAA;AAAA,YACR,CAAA,iBAAA,EAAoB,KAAK,CAAA,EAAA,EAAK,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,WACtF;AAAA,QACF;AAAA,MACF,CAAA;AAAA,MACA,MAAM,UAAA,CAAW,EAAE,KAAA,EAAO,KAAA,EAAO,QAAO,EAAG;AACzC,QAAA,IAAI;AACF,UAAA,MAAM,UAAA,GAAa,kBAAkB,KAAK,CAAA;AAC1C,UAAA,MAAM,UAAA,GAAa,0BAA0B,KAAK,CAAA;AAElD,UAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,MAAA,CAAO,YAAY,MAA6B,CAAA;AAChF,UAAA,OAAO,OAAO,QAAA,IAAY,CAAA;AAAA,QAC5B,SAAS,KAAA,EAAY;AACnB,UAAA,MAAM,IAAI,eAAA;AAAA,YACR,CAAA,qBAAA,EAAwB,KAAK,CAAA,EAAA,EAAK,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,WAC1F;AAAA,QACF;AAAA,MACF,CAAA;AAAA,MACA,MAAM,MAAA,CAAO,EAAE,KAAA,EAAO,OAAM,EAAG;AAC7B,QAAA,IAAI;AACF,UAAA,MAAM,UAAA,GAAa,kBAAkB,KAAK,CAAA;AAC1C,UAAA,MAAM,UAAA,GAAa,0BAA0B,KAAK,CAAA;AAClD,UAAA,MAAM,UAAA,CAAW,OAAO,UAAU,CAAA;AAAA,QACpC,SAAS,KAAA,EAAY;AACnB,UAAA,MAAM,IAAI,eAAA;AAAA,YACR,CAAA,iBAAA,EAAoB,KAAK,CAAA,EAAA,EAAK,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,WACtF;AAAA,QACF;AAAA,MACF,CAAA;AAAA,MACA,MAAM,UAAA,CAAW,EAAE,KAAA,EAAO,OAAM,EAAG;AACjC,QAAA,IAAI;AACF,UAAA,MAAM,UAAA,GAAa,kBAAkB,KAAK,CAAA;AAC1C,UAAA,MAAM,UAAA,GAAa,0BAA0B,KAAK,CAAA;AAClD,UAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,MAAA,CAAO,UAAU,CAAA;AACjD,UAAA,OAAO,OAAO,QAAA,IAAY,CAAA;AAAA,QAC5B,SAAS,KAAA,EAAY;AACnB,UAAA,MAAM,IAAI,eAAA;AAAA,YACR,CAAA,qBAAA,EAAwB,KAAK,CAAA,EAAA,EAAK,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,WAC1F;AAAA,QACF;AAAA,MACF,CAAA;AAAA,MACA,MAAM,OAAA,CAAQ,EAAE,KAAA,EAAO,KAAA,EAAO,QAAO,EAAG;AACtC,QAAA,IAAI;AACF,UAAA,MAAM,UAAA,GAAa,kBAAkB,KAAK,CAAA;AAC1C,UAAA,MAAM,gBAAA,GAAmB,oBAAoB,KAAK,CAAA;AAClD,UAAA,MAAM,UAAA,GAAa,0BAA0B,KAAK,CAAA;AAClD,UAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,OAAA,CAAQ,EAAE,KAAA,EAAO,UAAA,EAAY,QAAQ,CAAA;AAErE,UAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,UAAA,MAAM,MAAA,GAAS,MAAM,eAAA,CAAgB,MAAA,EAAQ,kBAAkB,MAAM,CAAA;AACrE,UAAA,OAAO,MAAA;AAAA,QACT,SAAS,KAAA,EAAY;AACnB,UAAA,MAAM,IAAI,eAAA;AAAA,YACR,CAAA,kBAAA,EAAqB,KAAK,CAAA,EAAA,EAAK,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,WACvF;AAAA,QACF;AAAA,MACF,CAAA;AAAA,MACA,MAAM,SAAS,EAAE,KAAA,EAAO,OAAO,KAAA,EAAO,MAAA,EAAQ,QAAO,EAAG;AACtD,QAAA,IAAI;AACF,UAAA,MAAM,gBAAA,GAAmB,oBAAoB,KAAK,CAAA;AAClD,UAAA,MAAM,UAAA,GAAa,kBAAkB,KAAK,CAAA;AAC1C,UAAA,MAAM,UAAA,GAAa,yBAAA,CAA0B,KAAA,IAAS,EAAE,CAAA;AACxD,UAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,IAAA,CAAK;AAAA,YACnC,KAAA,EAAO,UAAA;AAAA,YACP,IAAA,EAAM,KAAA;AAAA,YACN,IAAA,EAAM,MAAA;AAAA,YACN,OAAO,MAAA,GACH;AAAA,cACE,CAAC,YAAA,CAAa,EAAE,KAAA,EAAO,KAAA,EAAO,MAAA,CAAO,KAAA,EAAO,CAAC,GAC3C,MAAA,CAAO,SAAA,CAAU,WAAA;AAAY,aACjC,GACA,KAAA;AAAA,WACL,CAAA;AAGD,UAAA,MAAM,WAAA,GAAc,MAAM,OAAA,CAAQ,GAAA;AAAA,YAChC,OAAO,GAAA,CAAI,CAAC,MAAM,eAAA,CAAgB,CAAA,EAAG,gBAAgB,CAAC;AAAA,WACxD;AACA,UAAA,OAAO,WAAA;AAAA,QACT,SAAS,KAAA,EAAY;AACnB,UAAA,MAAM,IAAI,eAAA;AAAA,YACR,CAAA,mBAAA,EAAsB,KAAK,CAAA,EAAA,EAAK,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,WACxF;AAAA,QACF;AAAA,MACF,CAAA;AAAA,MACA,MAAM,KAAA,CAAM,EAAE,KAAA,EAAO,OAAM,EAAG;AAC5B,QAAA,IAAI;AACF,UAAA,MAAM,UAAA,GAAa,kBAAkB,KAAK,CAAA;AAC1C,UAAA,MAAM,UAAA,GAAa,yBAAA,CAA0B,KAAA,IAAS,EAAE,CAAA;AACxD,UAAA,MAAM,QAAQ,MAAM,UAAA,CAAW,MAAM,EAAE,KAAA,EAAO,YAAY,CAAA;AAC1D,UAAA,OAAO,KAAA;AAAA,QACT,SAAS,KAAA,EAAY;AACnB,UAAA,MAAM,IAAI,eAAA;AAAA,YACR,CAAA,gBAAA,EAAmB,KAAK,CAAA,EAAA,EAAK,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,WACrF;AAAA,QACF;AAAA,MACF,CAAA;AAAA,MACA,MAAM,YAAA,CAAa,EAAE,MAAA,EAAO,EAAG;AAC7B,QAAA,IAAI,OAAO,gBAAA,EAAkB;AAC3B,UAAA,MAAM,iBAAiB,iBAAA,EAAkB;AACzC,UAAA,MAAM,iBAAiB,MAAA,EAAQ,MAAA,CAAO,QAAA,EAAW,cAAA,EAAgB,OAAO,YAAa,CAAA;AAAA,QACvF;AAEA,QAAA,IAAI,CAAC,OAAO,kBAAA,EAAoB;AAC9B,UAAA,OAAO,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,EAAA,EAAG;AAAA,QAC9B;AAEA,QAAA,MAAM,EAAE,MAAM,iBAAA,EAAkB,GAAI,MAAM,iBAAA,CAAkB,MAAA,EAAQ,OAAO,QAAS,CAAA;AACpF,QAAA,OAAO,EAAE,MAAM,IAAA,EAAM,CAAA,EAAG,OAAO,cAAc,CAAA,CAAA,EAAI,iBAAiB,CAAA,CAAA,EAAG;AAAA,MACvE,CAAA;AAAA,MACA,OAAA,EAAS;AAAA,KACX;AAAA,EACF,CAAA;AAEF,EAAA,IAAI,cAAA,GAA+C,IAAA;AACnD,EAAA,cAAA,GAAiB;AAAA,IACf,MAAA,EAAQ;AAAA,MACN,SAAA,EAAW,SAAA;AAAA,MACX,WAAA,EAAa,iBAAA;AAAA,MACb,SAAA,EAAW,QAAQ,SAAA,IAAa,KAAA;AAAA,MAChC,aAAA,EAAe,MAAA,CAAO,QAAA,KAAa,UAAA,GAAa,IAAA,GAAO,KAAA;AAAA,MACvD,YAAA,EAAc,MAAA,CAAO,QAAA,KAAa,UAAA,GAAa,IAAA,GAAO,KAAA;AAAA;AAAA,MACtD,cAAA,EAAgB,MAAA,CAAO,QAAA,KAAa,UAAA,GAAa,IAAA,GAAO,KAAA;AAAA,MACxD,WAAA,EAAa,OAAO,WAAA,GAChB,CAAC,OACC,UAAA,CAAW,WAAA,CAAY,OAAO,aAAA,KAAkB;AAC9C,QAAA,MAAMC,WAAU,oBAAA,CAAqB;AAAA,UACnC,QAAQ,cAAA,CAAgB,MAAA;AAAA,UACxB,OAAA,EAAS,oBAAoB,aAAoB;AAAA,SAClD,EAAE,WAAY,CAAA;AAEf,QAAA,OAAO,GAAGA,QAAO,CAAA;AAAA,MACnB,CAAC,CAAA,GACH;AAAA,KACN;AAAA,IACA,OAAA,EAAS,CAAC,OAAA,KAAY;AACpB,MAAA,OAAO,mBAAA,CAAoB,UAAU,CAAA,CAAE,OAAO,CAAA;AAAA,IAChD;AAAA,GACF;AAEA,EAAA,MAAM,OAAA,GAAU,qBAAqB,cAAe,CAAA;AACpD,EAAA,OAAO,CAAC,OAAA,KAA+B;AACrC,IAAA,WAAA,GAAc,OAAA;AACd,IAAA,OAAO,QAAQ,OAAO,CAAA;AAAA,EACxB,CAAA;AACF","file":"index.mjs","sourcesContent":["import { BetterAuthDBSchema, DBFieldAttribute } from \"better-auth\";\nimport { Provider } from \"./types\";\n\ninterface TableDefinition {\n name: string;\n entityName?: string;\n columns: {\n name: string;\n type: string;\n isNullable?: boolean;\n isUnique?: boolean;\n default?: any;\n isPrimary?: boolean;\n isIndexed?: boolean;\n length?: string;\n }[];\n indices: {\n columnNames: string[];\n isUnique: boolean;\n }[];\n fkConstraints: {\n columnNames: string[];\n referencedColumnNames: string[];\n referencedTableName: string;\n onDelete: string;\n }[];\n}\n\nexport const generateTableDefinitions = (\n authDbSchema: BetterAuthDBSchema,\n provider: Provider,\n isGeneratePK: boolean = true\n) => {\n const tableDefinitions: TableDefinition[] = [];\n\n for (const [tableName, tableSchema] of Object.entries(authDbSchema)) {\n const name = tableSchema.modelName || tableName;\n const tableInfo: TableDefinition = {\n name: name,\n columns: [],\n indices: [],\n fkConstraints: [],\n };\n\n if (isGeneratePK) {\n tableInfo.columns.push({ name: \"id\", type: \"varchar\", isPrimary: true });\n }\n for (const [fieldName, fieldConfig] of Object.entries(tableSchema.fields)) {\n generateColumn(fieldName, fieldConfig, tableInfo, provider);\n }\n\n tableDefinitions.push(tableInfo);\n }\n\n return tableDefinitions;\n};\n\nconst generateColumn = (\n defaultFieldName: string,\n betterAuthField: DBFieldAttribute,\n tableInfo: TableDefinition,\n provider: Provider\n) => {\n const column = {} as TableDefinition[\"columns\"][0];\n column.name = betterAuthField.fieldName || defaultFieldName;\n\n column.type = mapBetterAuthTypeToDBType(betterAuthField, provider);\n if (betterAuthField.references?.field) {\n column.type = \"varchar\";\n }\n\n if (betterAuthField.sortable || betterAuthField.unique || betterAuthField.index) {\n column.length = \"512\";\n column.type = \"varchar\";\n }\n if (betterAuthField.references?.field) {\n column.length = undefined;\n }\n\n if (betterAuthField.index && !betterAuthField.references?.field) {\n column.isIndexed = true;\n }\n\n if (betterAuthField.unique && !betterAuthField.references?.field) {\n column.isUnique = true;\n }\n\n if (!betterAuthField.required) {\n column.isNullable = true;\n }\n\n if (\n betterAuthField.defaultValue !== undefined &&\n typeof betterAuthField.defaultValue !== \"function\"\n ) {\n column.default = betterAuthField.defaultValue;\n }\n\n tableInfo.columns.push(column);\n\n if ((betterAuthField.index || betterAuthField.unique) && !betterAuthField.references) {\n tableInfo.indices.push({\n columnNames: [column.name],\n isUnique: betterAuthField.unique || false,\n });\n }\n\n if (betterAuthField.references) {\n tableInfo.fkConstraints.push({\n columnNames: [column.name],\n referencedTableName: betterAuthField.references.model,\n referencedColumnNames: [betterAuthField.references.field],\n onDelete: betterAuthField.references.onDelete || \"no action\",\n });\n }\n};\n\nconst mapBetterAuthTypeToDBType = (\n betterAuthField: DBFieldAttribute,\n provider: Provider\n): string => {\n if (Array.isArray(betterAuthField.type)) {\n return betterAuthField.type[0] || \"varchar\";\n }\n\n let dbType = \"\";\n\n switch (betterAuthField.type) {\n case \"string\":\n dbType = \"text\";\n break;\n case \"boolean\":\n dbType = \"boolean\";\n break;\n case \"number\":\n dbType = provider === \"sqlite\" ? \"integer\" : \"int\";\n dbType = betterAuthField.bigint && provider === \"sqlite\" ? dbType : \"bigint\";\n break;\n case \"date\":\n dbType = provider === \"postgres\" ? \"timestamp\" : \"datetime\";\n break;\n case \"json\":\n dbType = provider === \"sqlite\" ? \"text\" : \"json\";\n break;\n default:\n dbType = \"text\";\n break;\n }\n\n return dbType;\n};\n","import ejs from \"ejs\";\nimport path from \"path\";\nimport fs from \"fs/promises\";\nimport { fileURLToPath } from \"url\";\nimport { BetterAuthDBSchema } from \"better-auth\";\nimport { Provider } from \"./types\";\nimport { generateTableDefinitions } from \"./helpers\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nexport const generateMigration = async (authDbSchema: BetterAuthDBSchema, provider: Provider) => {\n const timestamp = Date.now();\n const tableDefinitions = generateTableDefinitions(authDbSchema, provider);\n\n const migrationTemplatePath = path.resolve(__dirname, \"../templates/migration.ejs\");\n const migrationTemplate = await fs.readFile(migrationTemplatePath, \"utf8\");\n const migrationCode = ejs.render(migrationTemplate, {\n timestamp,\n tables: tableDefinitions,\n tablesReversed: [...tableDefinitions].reverse(),\n });\n\n return { code: migrationCode, migrationFileName: `${timestamp}-better-auth.ts` };\n};\n","import ejs from \"ejs\";\nimport path from \"path\";\nimport fs from \"fs/promises\";\nimport { fileURLToPath } from \"url\";\nimport { BetterAuthDBSchema } from \"better-auth\";\nimport { Provider } from \"./types\";\nimport { generateTableDefinitions } from \"./helpers\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nexport const generateEntities = async (\n authDbSchema: BetterAuthDBSchema,\n provider: Provider,\n mappedEntities: Record<string, any>,\n entitiesPath: string\n) => {\n const tableDefinitions = generateTableDefinitions(authDbSchema, provider, false);\n\n const entityTemplatePath = path.resolve(__dirname, \"../templates/entity.ejs\");\n const entityTemplate = await fs.readFile(entityTemplatePath, \"utf8\");\n const entityCode = ejs.render(entityTemplate, {\n tables: tableDefinitions.map((table) => ({\n ...table,\n entityName: mappedEntities ? mappedEntities[table.name] : table.name,\n columns: table.columns.map((column) => ({\n ...column,\n tsType: mapDBTypeToTSType(column.type, column.isNullable),\n })),\n })),\n });\n\n // check if entitiesPath exists, if not create it\n try {\n await fs.access(entitiesPath);\n } catch {\n await fs.mkdir(entitiesPath, { recursive: true });\n } finally {\n await fs.writeFile(`${entitiesPath}/auth.ts`, entityCode);\n }\n\n return entityCode;\n};\n\nconst mapDBTypeToTSType = (dbType: string, isNullable?: boolean): string => {\n let tsType: string;\n\n switch (dbType) {\n case \"varchar\":\n case \"text\":\n case \"json\":\n tsType = \"string\";\n break;\n case \"boolean\":\n tsType = \"boolean\";\n break;\n case \"int\":\n case \"integer\":\n case \"bigint\":\n tsType = \"number\";\n break;\n case \"datetime\":\n case \"timestamp\":\n tsType = \"Date\";\n break;\n default:\n tsType = \"any\";\n break;\n }\n\n if (isNullable) {\n tsType += \" | null\";\n }\n\n return tsType;\n};\n","import { BetterAuthError, BetterAuthOptions } from \"better-auth\";\nimport {\n AdapterFactoryOptions,\n createAdapterFactory,\n Where,\n type AdapterFactoryCustomizeAdapterCreator,\n} from \"better-auth/adapters\";\nimport {\n DataSource,\n Equal,\n FindOptionsWhere,\n In,\n LessThan,\n LessThanOrEqual,\n Like,\n MoreThan,\n MoreThanOrEqual,\n Not,\n ObjectLiteral,\n} from \"typeorm\";\nimport { generateMigration } from \"./generate-migration\";\nimport { TypeOrmAdapterConfig } from \"./types\";\nimport { generateEntities } from \"./generate-entity\";\n\nconst DEFAULT_ENTITIES = {\n user: \"User\",\n account: \"Account\",\n session: \"Session\",\n verification: \"Verification\",\n} as const;\n\nexport const typeormAdapter = (dataSource: DataSource, config: TypeOrmAdapterConfig = {}) => {\n config = {\n entitiesPath: \"./entities\",\n migrationsPath: \"./migrations\",\n provider: \"postgres\",\n generateEntities: true,\n generateMigrations: true,\n ...(config || {}),\n entities: {\n ...DEFAULT_ENTITIES,\n ...(config?.entities || {}),\n },\n };\n\n let lazyOptions: BetterAuthOptions | null = null;\n\n const convertOperatorToTypeORM = (operator: Where[\"operator\"], value: unknown) => {\n switch (operator) {\n case \"eq\":\n return Equal(value);\n case \"ne\":\n return Not(value);\n case \"lt\":\n return LessThan(value);\n case \"lte\":\n return LessThanOrEqual(value);\n case \"gt\":\n return MoreThan(value);\n case \"gte\":\n return MoreThanOrEqual(value);\n case \"in\":\n return In(value as unknown[]);\n case \"not_in\":\n return Not(In(value as unknown[]));\n case \"contains\":\n return Like(`%${value}%`);\n case \"starts_with\":\n return Like(`${value}%`);\n case \"ends_with\":\n return Like(`%${value}`);\n default:\n return value;\n }\n };\n\n const convertWhereToFindOptions = (where: Where[]): FindOptionsWhere<ObjectLiteral> => {\n if (!where || where.length === 0) return {};\n\n const findOptions: FindOptionsWhere<ObjectLiteral> = {};\n\n for (const w of where) {\n if (!w.operator) {\n findOptions[w.field] = w.value;\n } else {\n findOptions[w.field] = convertOperatorToTypeORM(w.operator, w.value);\n }\n }\n\n return findOptions;\n };\n\n const createCustomAdapter =\n (dataSource: DataSource): AdapterFactoryCustomizeAdapterCreator =>\n ({ getDefaultModelName, getFieldName, transformOutput }) => {\n const getRepositoryName = (model: string) => {\n const modelName = getDefaultModelName(model);\n const repositoryName =\n config.entities?.[modelName as keyof typeof config.entities] || modelName;\n return dataSource.getRepository(repositoryName);\n };\n\n const getMappedEntities = () => {\n const mappedEntities = { ...DEFAULT_ENTITIES };\n for (const key of Object.keys(lazyOptions as any)) {\n if (!(lazyOptions as any)[key].modelName) {\n continue;\n }\n const entity = DEFAULT_ENTITIES[key as keyof typeof DEFAULT_ENTITIES];\n const modelName = (lazyOptions as any)[key].modelName;\n (mappedEntities as any)[modelName] = entity;\n }\n return mappedEntities;\n };\n\n return {\n async create({ data, model }) {\n try {\n const repository = getRepositoryName(model);\n const entity = repository.create(data);\n const saved = await repository.save(entity);\n return saved as any;\n } catch (error: any) {\n throw new BetterAuthError(\n `Failed to create ${model}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n async update({ model, where, update }) {\n try {\n const repository = getRepositoryName(model);\n const conditions = convertWhereToFindOptions(where);\n\n await repository.update(conditions, update as Record<string, any>);\n const updated = await repository.findOne({ where: conditions });\n\n if (!updated) return null;\n return updated as any;\n } catch (error: any) {\n throw new BetterAuthError(\n `Failed to update ${model}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n async updateMany({ model, where, update }) {\n try {\n const repository = getRepositoryName(model);\n const conditions = convertWhereToFindOptions(where);\n\n const result = await repository.update(conditions, update as Record<string, any>);\n return result.affected || 0;\n } catch (error: any) {\n throw new BetterAuthError(\n `Failed to updateMany ${model}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n async delete({ model, where }) {\n try {\n const repository = getRepositoryName(model);\n const conditions = convertWhereToFindOptions(where);\n await repository.delete(conditions);\n } catch (error: any) {\n throw new BetterAuthError(\n `Failed to delete ${model}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n async deleteMany({ model, where }) {\n try {\n const repository = getRepositoryName(model);\n const conditions = convertWhereToFindOptions(where);\n const result = await repository.delete(conditions);\n return result.affected || 0;\n } catch (error: any) {\n throw new BetterAuthError(\n `Failed to deleteMany ${model}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n async findOne({ model, where, select }) {\n try {\n const repository = getRepositoryName(model);\n const defaultModelName = getDefaultModelName(model);\n const conditions = convertWhereToFindOptions(where);\n const result = await repository.findOne({ where: conditions, select });\n\n if (!result) return null;\n\n const output = await transformOutput(result, defaultModelName, select);\n return output as any;\n } catch (error: any) {\n throw new BetterAuthError(\n `Failed to findOne ${model}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n async findMany({ model, where, limit, sortBy, offset }) {\n try {\n const defaultModelName = getDefaultModelName(model);\n const repository = getRepositoryName(model);\n const conditions = convertWhereToFindOptions(where ?? []);\n const result = await repository.find({\n where: conditions,\n take: limit,\n skip: offset,\n order: sortBy\n ? {\n [getFieldName({ model, field: sortBy.field })]:\n sortBy.direction.toUpperCase() as \"ASC\" | \"DESC\",\n }\n : undefined,\n });\n\n // Transform all results from database fields to logical fields\n const transformed = await Promise.all(\n result.map((r) => transformOutput(r, defaultModelName))\n );\n return transformed as any;\n } catch (error: any) {\n throw new BetterAuthError(\n `Failed to findMany ${model}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n async count({ model, where }) {\n try {\n const repository = getRepositoryName(model);\n const conditions = convertWhereToFindOptions(where ?? []);\n const count = await repository.count({ where: conditions });\n return count;\n } catch (error: any) {\n throw new BetterAuthError(\n `Failed to count ${model}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n async createSchema({ tables }) {\n if (config.generateEntities) {\n const mappedEntities = getMappedEntities();\n await generateEntities(tables, config.provider!, mappedEntities, config.entitiesPath!);\n }\n\n if (!config.generateMigrations) {\n return { code: \"\", path: \"\" };\n }\n\n const { code, migrationFileName } = await generateMigration(tables, config.provider!);\n return { code, path: `${config.migrationsPath}/${migrationFileName}` };\n },\n options: config,\n };\n };\n\n let adapterOptions: AdapterFactoryOptions | null = null;\n adapterOptions = {\n config: {\n adapterId: \"typeorm\",\n adapterName: \"TypeORM Adapter\",\n debugLogs: config?.debugLogs ?? false,\n supportsUUIDs: config.provider === \"postgres\" ? true : false,\n supportsJSON: config.provider === \"postgres\" ? true : false, // even though mysql also supports it, mysql requires to pass stringified json anyway.\n supportsArrays: config.provider === \"postgres\" ? true : false,\n transaction: config.transaction\n ? (cb) =>\n dataSource.transaction(async (entityManager) => {\n const adapter = createAdapterFactory({\n config: adapterOptions!.config,\n adapter: createCustomAdapter(entityManager as any),\n })(lazyOptions!);\n\n return cb(adapter);\n })\n : undefined,\n },\n adapter: (options) => {\n return createCustomAdapter(dataSource)(options);\n },\n };\n\n const adapter = createAdapterFactory(adapterOptions!);\n return (options: BetterAuthOptions) => {\n lazyOptions = options;\n return adapter(options);\n };\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jazim/test",
3
- "version": "2.0.4",
3
+ "version": "2.0.5",
4
4
  "description": "TypeORM adapter for Better-Auth",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -13,7 +13,8 @@
13
13
  }
14
14
  },
15
15
  "files": [
16
- "dist"
16
+ "dist",
17
+ "templates"
17
18
  ],
18
19
  "scripts": {
19
20
  "build": "tsup",
@@ -36,6 +37,7 @@
36
37
  "typeorm": ">=0.3.2"
37
38
  },
38
39
  "devDependencies": {
40
+ "@types/ejs": "^3.1.5",
39
41
  "@types/node": "^25.0.3",
40
42
  "better-sqlite3": "^12.5.0",
41
43
  "env-cmd": "^11.0.0",
@@ -47,6 +49,7 @@
47
49
  "vitest": "^4.0.16"
48
50
  },
49
51
  "dependencies": {
52
+ "ejs": "^3.1.9",
50
53
  "handlebars": "^4.7.8"
51
54
  }
52
55
  }
@@ -0,0 +1,19 @@
1
+ import { Entity, PrimaryGeneratedColumn, Column, Index } from "typeorm";
2
+
3
+ <% tables.forEach(function(table){ %>
4
+ @Entity("<%= table.name %>")
5
+ export class <%= table.entityName %> {
6
+ @PrimaryGeneratedColumn("uuid")
7
+ id!: string;
8
+ <% table.columns.forEach(function(column){ %>
9
+ <% if (column.isUnique) { %>
10
+ @Index({ unique: true })
11
+ <% } else if (column.isIndexed) { %>
12
+ @Index()
13
+ <% } %>
14
+ @Column("<%= column.type %>"<% if (column.isNullable) { %>, { nullable: true }<% } %>)
15
+ <%= column.name %><% if (column.isNullable) { %>?: <%= column.tsType %><% } else { %>!: <%= column.tsType %><% } %>;
16
+ <% }) %>
17
+ }
18
+
19
+ <% }) %>
@@ -0,0 +1,49 @@
1
+ import { MigrationInterface, QueryRunner, Table } from "typeorm";
2
+
3
+ export class BetterAuthMigration<%= timestamp %> implements MigrationInterface {
4
+ public async up(queryRunner: QueryRunner): Promise<void> {
5
+ <% tables.forEach(function(table){ %>
6
+ await queryRunner.createTable(
7
+ new Table({
8
+ name: "<%= table.name %>",
9
+ columns: [
10
+ <% (table.columns || []).forEach(function(col){ %>
11
+ {
12
+ name: "<%= col.name %>",
13
+ type: "<%= col.isPrimary ? 'varchar' : col.type %>",
14
+ <% if (col.isPrimary) { %>isPrimary: true,<% } %>
15
+ <% if (typeof col.isNullable !== 'undefined' && col.isNullable !== null) { %>isNullable: <%= col.isNullable %>,<% } %>
16
+ <% if (col.length) { %>length: "<%= col.length %>",<% } %>
17
+ <% if (col.default !== undefined) { %>default: <%= col.default %>,<% } %>
18
+ },
19
+ <% }) %>
20
+ ]<% if (table.indices && table.indices.length) { %>,
21
+ indices: [
22
+ <% table.indices.forEach(function(index){ %>
23
+ {
24
+ columnNames: [<%- index.columnNames.map(function(n){ return '"'+n+'"'; }).join(', ') %>],
25
+ isUnique: <%= index.isUnique %>
26
+ },
27
+ <% }) %>
28
+ ]<% } %><% if (table.fkConstraints && table.fkConstraints.length) { %>,
29
+ foreignKeys: [
30
+ <% table.fkConstraints.forEach(function(fk){ %>
31
+ {
32
+ columnNames: [<%- fk.columnNames.map(function(n){ return '"'+n+'"'; }).join(', ') %>],
33
+ referencedTableName: "<%= fk.referencedTableName %>",
34
+ referencedColumnNames: [<%- fk.referencedColumnNames.map(function(n){ return '"'+n+'"'; }).join(', ') %>],
35
+ onDelete: "<%= fk.onDelete %>"
36
+ },
37
+ <% }) %>
38
+ ]<% } %>
39
+ })
40
+ );
41
+ <% }) %>
42
+ }
43
+
44
+ public async down(queryRunner: QueryRunner): Promise<void> {
45
+ <% tablesReversed.forEach(function(table){ %>
46
+ await queryRunner.dropTable("<%= table.name %>");
47
+ <% }) %>
48
+ }
49
+ }