@jazim/test 2.0.3 → 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/README.md +424 -79
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +141 -268
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +137 -266
- package/dist/index.mjs.map +1 -1
- package/package.json +9 -10
- package/templates/entity.ejs +19 -0
- package/templates/migration.ejs +49 -0
package/dist/index.mjs
CHANGED
|
@@ -1,31 +1,91 @@
|
|
|
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
|
|
5
|
-
import
|
|
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
|
-
var
|
|
15
|
-
|
|
16
|
-
|
|
12
|
+
var generateTableDefinitions = (authDbSchema, provider, isGeneratePK = true) => {
|
|
13
|
+
const tableDefinitions = [];
|
|
14
|
+
for (const [tableName, tableSchema] of Object.entries(authDbSchema)) {
|
|
15
|
+
const name = tableSchema.modelName || tableName;
|
|
16
|
+
const tableInfo = {
|
|
17
|
+
name,
|
|
18
|
+
columns: [],
|
|
19
|
+
indices: [],
|
|
20
|
+
fkConstraints: []
|
|
21
|
+
};
|
|
22
|
+
if (isGeneratePK) {
|
|
23
|
+
tableInfo.columns.push({ name: "id", type: "varchar", isPrimary: true });
|
|
24
|
+
}
|
|
25
|
+
for (const [fieldName, fieldConfig] of Object.entries(tableSchema.fields)) {
|
|
26
|
+
generateColumn(fieldName, fieldConfig, tableInfo, provider);
|
|
27
|
+
}
|
|
28
|
+
tableDefinitions.push(tableInfo);
|
|
29
|
+
}
|
|
30
|
+
return tableDefinitions;
|
|
31
|
+
};
|
|
32
|
+
var generateColumn = (defaultFieldName, betterAuthField, tableInfo, provider) => {
|
|
33
|
+
const column = {};
|
|
34
|
+
column.name = betterAuthField.fieldName || defaultFieldName;
|
|
35
|
+
column.type = mapBetterAuthTypeToDBType(betterAuthField, provider);
|
|
36
|
+
if (betterAuthField.references?.field) {
|
|
37
|
+
column.type = "varchar";
|
|
38
|
+
}
|
|
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;
|
|
48
|
+
}
|
|
49
|
+
if (betterAuthField.unique && !betterAuthField.references?.field) {
|
|
50
|
+
column.isUnique = true;
|
|
51
|
+
}
|
|
52
|
+
if (!betterAuthField.required) {
|
|
53
|
+
column.isNullable = true;
|
|
54
|
+
}
|
|
55
|
+
if (betterAuthField.defaultValue !== void 0 && typeof betterAuthField.defaultValue !== "function") {
|
|
56
|
+
column.default = betterAuthField.defaultValue;
|
|
57
|
+
}
|
|
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
|
+
}
|
|
65
|
+
if (betterAuthField.references) {
|
|
66
|
+
tableInfo.fkConstraints.push({
|
|
67
|
+
columnNames: [column.name],
|
|
68
|
+
referencedTableName: betterAuthField.references.model,
|
|
69
|
+
referencedColumnNames: [betterAuthField.references.field],
|
|
70
|
+
onDelete: betterAuthField.references.onDelete || "no action"
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
var mapBetterAuthTypeToDBType = (betterAuthField, provider) => {
|
|
75
|
+
if (Array.isArray(betterAuthField.type)) {
|
|
76
|
+
return betterAuthField.type[0] || "varchar";
|
|
17
77
|
}
|
|
18
78
|
let dbType = "";
|
|
19
|
-
switch (
|
|
79
|
+
switch (betterAuthField.type) {
|
|
20
80
|
case "string":
|
|
21
|
-
dbType = "
|
|
81
|
+
dbType = "text";
|
|
22
82
|
break;
|
|
23
83
|
case "boolean":
|
|
24
84
|
dbType = "boolean";
|
|
25
85
|
break;
|
|
26
86
|
case "number":
|
|
27
87
|
dbType = provider === "sqlite" ? "integer" : "int";
|
|
28
|
-
dbType =
|
|
88
|
+
dbType = betterAuthField.bigint && provider === "sqlite" ? dbType : "bigint";
|
|
29
89
|
break;
|
|
30
90
|
case "date":
|
|
31
91
|
dbType = provider === "postgres" ? "timestamp" : "datetime";
|
|
@@ -34,266 +94,81 @@ var mapBetterAuthTypeToDBType = (betterAuthType, provider, isBigInt = false) =>
|
|
|
34
94
|
dbType = provider === "sqlite" ? "text" : "json";
|
|
35
95
|
break;
|
|
36
96
|
default:
|
|
37
|
-
dbType = "
|
|
97
|
+
dbType = "text";
|
|
38
98
|
break;
|
|
39
99
|
}
|
|
40
100
|
return dbType;
|
|
41
101
|
};
|
|
42
102
|
|
|
43
103
|
// src/generate-migration.ts
|
|
44
|
-
var
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
};
|
|
58
|
-
this.generatePrimaryKeyColumn(tableInfo);
|
|
59
|
-
for (const [fieldName, fieldConfig] of Object.entries(tableSchema.fields)) {
|
|
60
|
-
this.generateColumn(fieldName, fieldConfig, tableInfo);
|
|
61
|
-
}
|
|
62
|
-
tableDefinitions.push(tableInfo);
|
|
63
|
-
}
|
|
64
|
-
const template = Handlebars.compile(migrationTemplate);
|
|
65
|
-
const migrationCode = template({
|
|
66
|
-
timestamp,
|
|
67
|
-
tables: tableDefinitions,
|
|
68
|
-
tablesReversed: [...tableDefinitions].reverse()
|
|
69
|
-
});
|
|
70
|
-
return { code: migrationCode, migrationFileName: `${timestamp}-BetterAuthMigration.ts` };
|
|
71
|
-
}
|
|
72
|
-
generatePrimaryKeyColumn(tableInfo) {
|
|
73
|
-
const column = {
|
|
74
|
-
name: "id",
|
|
75
|
-
type: this.provider === "postgres" ? "uuid" : "varchar",
|
|
76
|
-
isPrimary: true,
|
|
77
|
-
isGenerated: true,
|
|
78
|
-
generationStrategy: "uuid"
|
|
79
|
-
};
|
|
80
|
-
tableInfo.columns.push(column);
|
|
81
|
-
}
|
|
82
|
-
generateColumn(defaultFieldName, betterAuthField, tableInfo) {
|
|
83
|
-
const column = {};
|
|
84
|
-
column.name = betterAuthField.fieldName || defaultFieldName;
|
|
85
|
-
column.type = mapBetterAuthTypeToDBType(
|
|
86
|
-
betterAuthField.type,
|
|
87
|
-
this.provider,
|
|
88
|
-
betterAuthField.bigint
|
|
89
|
-
);
|
|
90
|
-
if (!betterAuthField.required) {
|
|
91
|
-
column.isNullable = true;
|
|
92
|
-
}
|
|
93
|
-
if (betterAuthField.unique) {
|
|
94
|
-
column.isUnique = true;
|
|
95
|
-
}
|
|
96
|
-
if (betterAuthField.defaultValue) {
|
|
97
|
-
column.default = betterAuthField.defaultValue;
|
|
98
|
-
}
|
|
99
|
-
tableInfo.columns.push(column);
|
|
100
|
-
if (betterAuthField.references) {
|
|
101
|
-
tableInfo.fkConstraints.push({
|
|
102
|
-
columnNames: [column.name],
|
|
103
|
-
referencedTableName: betterAuthField.references.model,
|
|
104
|
-
referencedColumnNames: [betterAuthField.references.field],
|
|
105
|
-
onDelete: betterAuthField.references.onDelete || "no action"
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
}
|
|
104
|
+
var __filename$1 = fileURLToPath(import.meta.url);
|
|
105
|
+
var __dirname$1 = path.dirname(__filename$1);
|
|
106
|
+
var generateMigration = async (authDbSchema, provider) => {
|
|
107
|
+
const timestamp = Date.now();
|
|
108
|
+
const tableDefinitions = generateTableDefinitions(authDbSchema, provider);
|
|
109
|
+
const migrationTemplatePath = path.resolve(__dirname$1, "../templates/migration.ejs");
|
|
110
|
+
const migrationTemplate = await fs2.readFile(migrationTemplatePath, "utf8");
|
|
111
|
+
const migrationCode = ejs.render(migrationTemplate, {
|
|
112
|
+
timestamp,
|
|
113
|
+
tables: tableDefinitions,
|
|
114
|
+
tablesReversed: [...tableDefinitions].reverse()
|
|
115
|
+
});
|
|
116
|
+
return { code: migrationCode, migrationFileName: `${timestamp}-better-auth.ts` };
|
|
109
117
|
};
|
|
110
|
-
var
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
{{#if isPrimary}}
|
|
124
|
-
isPrimary: true,
|
|
125
|
-
isGenerated: true,
|
|
126
|
-
generationStrategy: "{{generationStrategy}}",
|
|
127
|
-
{{/if}}
|
|
128
|
-
{{#if isNullable}}
|
|
129
|
-
isNullable: {{isNullable}},
|
|
130
|
-
{{/if}}
|
|
131
|
-
{{#if isUnique}}
|
|
132
|
-
isUnique: true,
|
|
133
|
-
{{/if}}
|
|
134
|
-
},
|
|
135
|
-
{{/each}}
|
|
136
|
-
],
|
|
137
|
-
{{#if fkConstraints.length}}
|
|
138
|
-
foreignKeys: [
|
|
139
|
-
{{#each fkConstraints}}
|
|
140
|
-
{
|
|
141
|
-
columnNames: [{{{quoteJoin columnNames}}}],
|
|
142
|
-
referencedTableName: "{{referencedTableName}}",
|
|
143
|
-
referencedColumnNames: [{{{quoteJoin referencedColumnNames}}}],
|
|
144
|
-
onDelete: "{{onDelete}}",
|
|
145
|
-
},
|
|
146
|
-
{{/each}}
|
|
147
|
-
],
|
|
148
|
-
{{/if}}
|
|
149
|
-
})
|
|
150
|
-
);
|
|
151
|
-
{{/each}}
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
155
|
-
{{#each tablesReversed}}
|
|
156
|
-
await queryRunner.dropTable("{{name}}");
|
|
157
|
-
{{/each}}
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
`;
|
|
161
|
-
var EntityGenerator = class {
|
|
162
|
-
constructor(provider) {
|
|
163
|
-
this.provider = provider;
|
|
164
|
-
}
|
|
165
|
-
async generate(authDbSchema, entitiesPath, mappedEntities) {
|
|
166
|
-
const tableDefinitions = [];
|
|
167
|
-
for (const [tableName, tableSchema] of Object.entries(authDbSchema)) {
|
|
168
|
-
const name = tableSchema.modelName || tableName;
|
|
169
|
-
const entityName = mappedEntities ? mappedEntities[name] : void 0;
|
|
170
|
-
const tableInfo = {
|
|
171
|
-
name,
|
|
172
|
-
entityName,
|
|
173
|
-
columns: [],
|
|
174
|
-
fkConstraints: []
|
|
175
|
-
};
|
|
176
|
-
for (const [fieldName, fieldConfig] of Object.entries(tableSchema.fields)) {
|
|
177
|
-
this.generateColumn(fieldName, fieldConfig, tableInfo);
|
|
178
|
-
}
|
|
179
|
-
tableDefinitions.push(tableInfo);
|
|
180
|
-
}
|
|
181
|
-
const template = Handlebars.compile(entityTemplate);
|
|
182
|
-
const entityCode = template({
|
|
183
|
-
tables: tableDefinitions.map((table) => ({
|
|
184
|
-
...table,
|
|
185
|
-
columns: table.columns.map((column) => ({
|
|
186
|
-
...column,
|
|
187
|
-
tsType: this.mapDBTypeToTSType(column.type, column.isNullable)
|
|
188
|
-
})),
|
|
189
|
-
fkConstraints: table.fkConstraints.map((fk) => ({
|
|
190
|
-
...fk,
|
|
191
|
-
referencedTable: fk.referencedTableName,
|
|
192
|
-
referencedEntity: mappedEntities ? mappedEntities[fk.referencedTableName] : fk.referencedTableName,
|
|
193
|
-
columnName: fk.columnNames[0]
|
|
194
|
-
}))
|
|
118
|
+
var __filename2 = fileURLToPath(import.meta.url);
|
|
119
|
+
var __dirname2 = path.dirname(__filename2);
|
|
120
|
+
var generateEntities = async (authDbSchema, provider, mappedEntities, entitiesPath) => {
|
|
121
|
+
const tableDefinitions = generateTableDefinitions(authDbSchema, provider, false);
|
|
122
|
+
const entityTemplatePath = path.resolve(__dirname2, "../templates/entity.ejs");
|
|
123
|
+
const entityTemplate = await fs2.readFile(entityTemplatePath, "utf8");
|
|
124
|
+
const entityCode = ejs.render(entityTemplate, {
|
|
125
|
+
tables: tableDefinitions.map((table) => ({
|
|
126
|
+
...table,
|
|
127
|
+
entityName: mappedEntities ? mappedEntities[table.name] : table.name,
|
|
128
|
+
columns: table.columns.map((column) => ({
|
|
129
|
+
...column,
|
|
130
|
+
tsType: mapDBTypeToTSType(column.type, column.isNullable)
|
|
195
131
|
}))
|
|
196
|
-
})
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
}
|
|
204
|
-
return entityCode;
|
|
132
|
+
}))
|
|
133
|
+
});
|
|
134
|
+
try {
|
|
135
|
+
await fs2.access(entitiesPath);
|
|
136
|
+
} catch {
|
|
137
|
+
await fs2.mkdir(entitiesPath, { recursive: true });
|
|
138
|
+
} finally {
|
|
139
|
+
await fs2.writeFile(`${entitiesPath}/auth.ts`, entityCode);
|
|
205
140
|
}
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
}
|
|
141
|
+
return entityCode;
|
|
142
|
+
};
|
|
143
|
+
var mapDBTypeToTSType = (dbType, isNullable) => {
|
|
144
|
+
let tsType;
|
|
145
|
+
switch (dbType) {
|
|
146
|
+
case "varchar":
|
|
147
|
+
case "text":
|
|
148
|
+
case "json":
|
|
149
|
+
tsType = "string";
|
|
150
|
+
break;
|
|
151
|
+
case "boolean":
|
|
152
|
+
tsType = "boolean";
|
|
153
|
+
break;
|
|
154
|
+
case "int":
|
|
155
|
+
case "integer":
|
|
156
|
+
case "bigint":
|
|
157
|
+
tsType = "number";
|
|
158
|
+
break;
|
|
159
|
+
case "datetime":
|
|
160
|
+
case "timestamp":
|
|
161
|
+
tsType = "Date";
|
|
162
|
+
break;
|
|
163
|
+
default:
|
|
164
|
+
tsType = "any";
|
|
165
|
+
break;
|
|
232
166
|
}
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
switch (dbType) {
|
|
236
|
-
case "varchar":
|
|
237
|
-
case "text":
|
|
238
|
-
case "json":
|
|
239
|
-
tsType = "string";
|
|
240
|
-
break;
|
|
241
|
-
case "boolean":
|
|
242
|
-
tsType = "boolean";
|
|
243
|
-
break;
|
|
244
|
-
case "int":
|
|
245
|
-
case "integer":
|
|
246
|
-
case "bigint":
|
|
247
|
-
tsType = "number";
|
|
248
|
-
break;
|
|
249
|
-
case "datetime":
|
|
250
|
-
case "timestamp":
|
|
251
|
-
tsType = "Date";
|
|
252
|
-
break;
|
|
253
|
-
default:
|
|
254
|
-
tsType = "any";
|
|
255
|
-
break;
|
|
256
|
-
}
|
|
257
|
-
if (isNullable) {
|
|
258
|
-
tsType += " | null";
|
|
259
|
-
}
|
|
260
|
-
return tsType;
|
|
167
|
+
if (isNullable) {
|
|
168
|
+
tsType += " | null";
|
|
261
169
|
}
|
|
170
|
+
return tsType;
|
|
262
171
|
};
|
|
263
|
-
var entityTemplate = `import { Entity, PrimaryGeneratedColumn, Column, ManyToOne } from "typeorm";
|
|
264
|
-
|
|
265
|
-
{{#each tables}}
|
|
266
|
-
@Entity("{{name}}")
|
|
267
|
-
export class {{entityName}} {
|
|
268
|
-
@PrimaryGeneratedColumn("uuid")
|
|
269
|
-
id!: string;
|
|
270
|
-
|
|
271
|
-
{{#each columns}}
|
|
272
|
-
{{#if isNullable}}
|
|
273
|
-
{{#if isUnique}}
|
|
274
|
-
@Column("{{type}}", { nullable: true, unique: true })
|
|
275
|
-
{{else}}
|
|
276
|
-
@Column("{{type}}", { nullable: true })
|
|
277
|
-
{{/if}}
|
|
278
|
-
{{else}}
|
|
279
|
-
{{#if isUnique}}
|
|
280
|
-
@Column("{{type}}", { unique: true })
|
|
281
|
-
{{else}}
|
|
282
|
-
@Column("{{type}}")
|
|
283
|
-
{{/if}}
|
|
284
|
-
{{/if}}
|
|
285
|
-
{{name}}{{#if isNullable}}?: {{tsType}}{{else}}!: {{tsType}}{{/if}};
|
|
286
|
-
|
|
287
|
-
{{/each}}
|
|
288
|
-
|
|
289
|
-
{{#each fkConstraints}}
|
|
290
|
-
@ManyToOne(() => {{referencedEntity}}{{#if onDelete}}, { onDelete: "{{upper onDelete }}" }{{/if}})
|
|
291
|
-
{{referencedTable}}: {{referencedEntity}};
|
|
292
|
-
{{/each}}
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
{{/each}}
|
|
296
|
-
`;
|
|
297
172
|
|
|
298
173
|
// src/adapter.ts
|
|
299
174
|
var DEFAULT_ENTITIES = {
|
|
@@ -487,17 +362,14 @@ var typeormAdapter = (dataSource, config = {}) => {
|
|
|
487
362
|
}
|
|
488
363
|
},
|
|
489
364
|
async createSchema({ tables }) {
|
|
490
|
-
console.log("Creating database schema...");
|
|
491
365
|
if (config.generateEntities) {
|
|
492
366
|
const mappedEntities = getMappedEntities();
|
|
493
|
-
|
|
494
|
-
await entityGenerator.generate(tables, config.entitiesPath, mappedEntities);
|
|
367
|
+
await generateEntities(tables, config.provider, mappedEntities, config.entitiesPath);
|
|
495
368
|
}
|
|
496
369
|
if (!config.generateMigrations) {
|
|
497
370
|
return { code: "", path: "" };
|
|
498
371
|
}
|
|
499
|
-
const
|
|
500
|
-
const { code, migrationFileName } = await migrationGenerator.generate(tables);
|
|
372
|
+
const { code, migrationFileName } = await generateMigration(tables, config.provider);
|
|
501
373
|
return { code, path: `${config.migrationsPath}/${migrationFileName}` };
|
|
502
374
|
},
|
|
503
375
|
options: config
|
|
@@ -508,7 +380,6 @@ var typeormAdapter = (dataSource, config = {}) => {
|
|
|
508
380
|
config: {
|
|
509
381
|
adapterId: "typeorm",
|
|
510
382
|
adapterName: "TypeORM Adapter",
|
|
511
|
-
usePlural: config?.usePlural ?? false,
|
|
512
383
|
debugLogs: config?.debugLogs ?? false,
|
|
513
384
|
supportsUUIDs: config.provider === "postgres" ? true : false,
|
|
514
385
|
supportsJSON: config.provider === "postgres" ? true : false,
|
package/dist/index.mjs.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":["dataSource","adapter"],"mappings":";;;;;;;AAEA,UAAA,CAAW,eAAe,OAAA,EAAS,CAAC,GAAA,KAAgB,GAAA,CAAI,aAAa,CAAA;AAErE,UAAA,CAAW,cAAA,CAAe,WAAA,EAAa,SAAU,KAAA,EAAiB;AAChE,EAAA,OAAO,KAAA,CAAM,IAAI,CAAC,IAAA,KAAS,IAAI,IAAI,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AACnD,CAAC,CAAA;;;ACHM,IAAM,yBAAA,GAA4B,CACvC,cAAA,EACA,QAAA,EACA,WAAoB,KAAA,KACT;AACX,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,cAAc,CAAA,EAAG;AACjC,IAAA,OAAO,cAAA,CAAe,CAAC,CAAA,IAAK,SAAA;AAAA,EAC9B;AAEA,EAAA,IAAI,MAAA,GAAS,EAAA;AAEb,EAAA,QAAQ,cAAA;AAAgB,IACtB,KAAK,QAAA;AACH,MAAA,MAAA,GAAS,SAAA;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,QAAA,IAAY,QAAA,KAAa,QAAA,GAAW,MAAA,GAAS,QAAA;AACtD,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,SAAA;AACT,MAAA;AAAA;AAGJ,EAAA,OAAO,MAAA;AACT,CAAA;;;AChCO,IAAM,qBAAN,MAAyB;AAAA,EAG9B,YAAY,QAAA,EAAoB;AAC9B,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAAA,EAClB;AAAA,EAEA,MAAM,SAAS,YAAA,EAAkC;AAC/C,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,MAAM,mBAAsC,EAAC;AAE7C,IAAA,KAAA,MAAW,CAAC,SAAA,EAAW,WAAW,KAAK,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAA,EAAG;AACnE,MAAA,MAAM,IAAA,GAAO,YAAY,SAAA,IAAa,SAAA;AACtC,MAAA,MAAM,SAAA,GAA6B;AAAA,QACjC,IAAA;AAAA,QACA,SAAS,EAAC;AAAA,QACV,eAAe;AAAC,OAClB;AAEA,MAAA,IAAA,CAAK,yBAAyB,SAAS,CAAA;AACvC,MAAA,KAAA,MAAW,CAAC,WAAW,WAAW,CAAA,IAAK,OAAO,OAAA,CAAQ,WAAA,CAAY,MAAM,CAAA,EAAG;AACzE,QAAA,IAAA,CAAK,cAAA,CAAe,SAAA,EAAW,WAAA,EAAa,SAAS,CAAA;AAAA,MACvD;AAEA,MAAA,gBAAA,CAAiB,KAAK,SAAS,CAAA;AAAA,IACjC;AAEA,IAAA,MAAM,QAAA,GAAW,UAAA,CAAW,OAAA,CAAQ,iBAAiB,CAAA;AAErD,IAAA,MAAM,gBAAgB,QAAA,CAAS;AAAA,MAC7B,SAAA;AAAA,MACA,MAAA,EAAQ,gBAAA;AAAA,MACR,cAAA,EAAgB,CAAC,GAAG,gBAAgB,EAAE,OAAA;AAAQ,KAC/C,CAAA;AAED,IAAA,OAAO,EAAE,IAAA,EAAM,aAAA,EAAe,iBAAA,EAAmB,CAAA,EAAG,SAAS,CAAA,uBAAA,CAAA,EAA0B;AAAA,EACzF;AAAA,EAEQ,yBAAyB,SAAA,EAA4B;AAC3D,IAAA,MAAM,MAAA,GAAS;AAAA,MACb,IAAA,EAAM,IAAA;AAAA,MACN,IAAA,EAAM,IAAA,CAAK,QAAA,KAAa,UAAA,GAAa,MAAA,GAAS,SAAA;AAAA,MAC9C,SAAA,EAAW,IAAA;AAAA,MACX,WAAA,EAAa,IAAA;AAAA,MACb,kBAAA,EAAoB;AAAA,KACtB;AAEA,IAAA,SAAA,CAAU,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA,EAC/B;AAAA,EAEQ,cAAA,CACN,gBAAA,EACA,eAAA,EACA,SAAA,EACA;AACA,IAAA,MAAM,SAAS,EAAC;AAChB,IAAA,MAAA,CAAO,IAAA,GAAO,gBAAgB,SAAA,IAAa,gBAAA;AAC3C,IAAA,MAAA,CAAO,IAAA,GAAO,yBAAA;AAAA,MACZ,eAAA,CAAgB,IAAA;AAAA,MAChB,IAAA,CAAK,QAAA;AAAA,MACL,eAAA,CAAgB;AAAA,KAClB;AAEA,IAAA,IAAI,CAAC,gBAAgB,QAAA,EAAU;AAC7B,MAAA,MAAA,CAAO,UAAA,GAAa,IAAA;AAAA,IACtB;AAEA,IAAA,IAAI,gBAAgB,MAAA,EAAQ;AAC1B,MAAA,MAAA,CAAO,QAAA,GAAW,IAAA;AAAA,IACpB;AAEA,IAAA,IAAI,gBAAgB,YAAA,EAAc;AAChC,MAAA,MAAA,CAAO,UAAU,eAAA,CAAgB,YAAA;AAAA,IACnC;AAEA,IAAA,SAAA,CAAU,OAAA,CAAQ,KAAK,MAAM,CAAA;AAE7B,IAAA,IAAI,gBAAgB,UAAA,EAAY;AAC9B,MAAA,SAAA,CAAU,cAAc,IAAA,CAAK;AAAA,QAC3B,WAAA,EAAa,CAAC,MAAA,CAAO,IAAI,CAAA;AAAA,QACzB,mBAAA,EAAqB,gBAAgB,UAAA,CAAW,KAAA;AAAA,QAChD,qBAAA,EAAuB,CAAC,eAAA,CAAgB,UAAA,CAAW,KAAK,CAAA;AAAA,QACxD,QAAA,EAAU,eAAA,CAAgB,UAAA,CAAW,QAAA,IAAY;AAAA,OAClD,CAAA;AAAA,IACH;AAAA,EACF;AACF,CAAA;AAuBA,IAAM,iBAAA,GAAoB,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AC3GnB,IAAM,kBAAN,MAAsB;AAAA,EAG3B,YAAY,QAAA,EAAoB;AAC9B,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAAA,EAClB;AAAA,EAEA,MAAM,QAAA,CACJ,YAAA,EACA,YAAA,EACA,cAAA,EACA;AACA,IAAA,MAAM,mBAAsC,EAAC;AAE7C,IAAA,KAAA,MAAW,CAAC,SAAA,EAAW,WAAW,KAAK,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAA,EAAG;AACnE,MAAA,MAAM,IAAA,GAAO,YAAY,SAAA,IAAa,SAAA;AACtC,MAAA,MAAM,UAAA,GAAa,cAAA,GAAiB,cAAA,CAAe,IAAI,CAAA,GAAI,MAAA;AAC3D,MAAA,MAAM,SAAA,GAA6B;AAAA,QACjC,IAAA;AAAA,QACA,UAAA;AAAA,QACA,SAAS,EAAC;AAAA,QACV,eAAe;AAAC,OAClB;AAEA,MAAA,KAAA,MAAW,CAAC,WAAW,WAAW,CAAA,IAAK,OAAO,OAAA,CAAQ,WAAA,CAAY,MAAM,CAAA,EAAG;AACzE,QAAA,IAAA,CAAK,cAAA,CAAe,SAAA,EAAW,WAAA,EAAa,SAAS,CAAA;AAAA,MACvD;AAEA,MAAA,gBAAA,CAAiB,KAAK,SAAS,CAAA;AAAA,IACjC;AAEA,IAAA,MAAM,QAAA,GAAW,UAAA,CAAW,OAAA,CAAQ,cAAc,CAAA;AAElD,IAAA,MAAM,aAAa,QAAA,CAAS;AAAA,MAC1B,MAAA,EAAQ,gBAAA,CAAiB,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,QACvC,GAAG,KAAA;AAAA,QACH,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,MAAY;AAAA,UACtC,GAAG,MAAA;AAAA,UACH,QAAQ,IAAA,CAAK,iBAAA,CAAkB,MAAA,CAAO,IAAA,EAAM,OAAO,UAAU;AAAA,SAC/D,CAAE,CAAA;AAAA,QACF,aAAA,EAAe,KAAA,CAAM,aAAA,CAAc,GAAA,CAAI,CAAC,EAAA,MAAQ;AAAA,UAC9C,GAAG,EAAA;AAAA,UACH,iBAAiB,EAAA,CAAG,mBAAA;AAAA,UACpB,kBAAkB,cAAA,GACd,cAAA,CAAe,EAAA,CAAG,mBAAmB,IACrC,EAAA,CAAG,mBAAA;AAAA,UACP,UAAA,EAAY,EAAA,CAAG,WAAA,CAAY,CAAC;AAAA,SAC9B,CAAE;AAAA,OACJ,CAAE;AAAA,KACH,CAAA;AAGD,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,CAAG,OAAO,YAAY,CAAA;AAAA,IAC9B,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,GAAG,KAAA,CAAM,YAAA,EAAc,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,IAClD,CAAA,SAAE;AACA,MAAA,MAAM,EAAA,CAAG,SAAA,CAAU,CAAA,EAAG,YAAY,YAAY,UAAU,CAAA;AAAA,IAC1D;AAEA,IAAA,OAAO,UAAA;AAAA,EACT;AAAA,EAEQ,cAAA,CACN,gBAAA,EACA,eAAA,EACA,SAAA,EACA;AACA,IAAA,MAAM,SAAS,EAAC;AAChB,IAAA,MAAA,CAAO,IAAA,GAAO,gBAAgB,SAAA,IAAa,gBAAA;AAC3C,IAAA,MAAA,CAAO,IAAA,GAAO,yBAAA;AAAA,MACZ,eAAA,CAAgB,IAAA;AAAA,MAChB,IAAA,CAAK,QAAA;AAAA,MACL,eAAA,CAAgB;AAAA,KAClB;AAEA,IAAA,IAAI,CAAC,gBAAgB,QAAA,EAAU;AAC7B,MAAA,MAAA,CAAO,UAAA,GAAa,IAAA;AAAA,IACtB;AAEA,IAAA,IAAI,gBAAgB,MAAA,EAAQ;AAC1B,MAAA,MAAA,CAAO,QAAA,GAAW,IAAA;AAAA,IACpB;AAEA,IAAA,IAAI,gBAAgB,YAAA,EAAc;AAChC,MAAA,MAAA,CAAO,UAAU,eAAA,CAAgB,YAAA;AAAA,IACnC;AAEA,IAAA,SAAA,CAAU,OAAA,CAAQ,KAAK,MAAM,CAAA;AAE7B,IAAA,IAAI,gBAAgB,UAAA,EAAY;AAC9B,MAAA,SAAA,CAAU,cAAc,IAAA,CAAK;AAAA,QAC3B,WAAA,EAAa,CAAC,MAAA,CAAO,IAAI,CAAA;AAAA,QACzB,mBAAA,EAAqB,gBAAgB,UAAA,CAAW,KAAA;AAAA,QAChD,qBAAA,EAAuB,CAAC,eAAA,CAAgB,UAAA,CAAW,KAAK,CAAA;AAAA,QACxD,QAAA,EAAU,eAAA,CAAgB,UAAA,CAAW,QAAA,IAAY;AAAA,OAClD,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,iBAAA,CAAkB,QAAgB,UAAA,EAA8B;AACtE,IAAA,IAAI,MAAA;AAEJ,IAAA,QAAQ,MAAA;AAAQ,MACd,KAAK,SAAA;AAAA,MACL,KAAK,MAAA;AAAA,MACL,KAAK,MAAA;AACH,QAAA,MAAA,GAAS,QAAA;AACT,QAAA;AAAA,MACF,KAAK,SAAA;AACH,QAAA,MAAA,GAAS,SAAA;AACT,QAAA;AAAA,MACF,KAAK,KAAA;AAAA,MACL,KAAK,SAAA;AAAA,MACL,KAAK,QAAA;AACH,QAAA,MAAA,GAAS,QAAA;AACT,QAAA;AAAA,MACF,KAAK,UAAA;AAAA,MACL,KAAK,WAAA;AACH,QAAA,MAAA,GAAS,MAAA;AACT,QAAA;AAAA,MACF;AACE,QAAA,MAAA,GAAS,KAAA;AACT,QAAA;AAAA;AAGJ,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAA,IAAU,SAAA;AAAA,IACZ;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AACF,CAAA;AAEA,IAAM,cAAA,GAAiB,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,CAAA;;;ACrHvB,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,CAACA,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,OAAA,CAAQ,IAAI,6BAA6B,CAAA;AAEzC,QAAA,IAAI,OAAO,gBAAA,EAAkB;AAC3B,UAAA,MAAM,iBAAiB,iBAAA,EAAkB;AACzC,UAAA,MAAM,eAAA,GAAkB,IAAI,eAAA,CAAgB,MAAA,CAAO,QAAS,CAAA;AAC5D,UAAA,MAAM,eAAA,CAAgB,QAAA,CAAS,MAAA,EAAQ,MAAA,CAAO,cAAe,cAAc,CAAA;AAAA,QAC7E;AAEA,QAAA,IAAI,CAAC,OAAO,kBAAA,EAAoB;AAC9B,UAAA,OAAO,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,EAAA,EAAG;AAAA,QAC9B;AAEA,QAAA,MAAM,kBAAA,GAAqB,IAAI,kBAAA,CAAmB,MAAA,CAAO,QAAS,CAAA;AAClE,QAAA,MAAM,EAAE,IAAA,EAAM,iBAAA,KAAsB,MAAM,kBAAA,CAAmB,SAAS,MAAM,CAAA;AAE5E,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,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 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 { DBFieldAttribute } from \"better-auth\";\nimport { Provider } from \"./types\";\n\nexport const 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","import { BetterAuthDBSchema, DBFieldAttribute } from \"better-auth\";\nimport { Provider } from \"./types\";\nimport { Handlebars } from \"./lib/handlerbar\";\nimport { mapBetterAuthTypeToDBType } from \"./helpers\";\n\nexport class MigrationGenerator {\n private provider: Provider;\n\n constructor(provider: Provider) {\n this.provider = provider;\n }\n\n async generate(authDbSchema: BetterAuthDBSchema) {\n const timestamp = Date.now();\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 this.generatePrimaryKeyColumn(tableInfo);\n for (const [fieldName, fieldConfig] of Object.entries(tableSchema.fields)) {\n this.generateColumn(fieldName, fieldConfig, tableInfo);\n }\n\n tableDefinitions.push(tableInfo);\n }\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}-BetterAuthMigration.ts` };\n }\n\n private generatePrimaryKeyColumn(tableInfo: TableDefinition) {\n const column = {\n name: \"id\",\n type: this.provider === \"postgres\" ? \"uuid\" : \"varchar\",\n isPrimary: true,\n isGenerated: true,\n generationStrategy: \"uuid\",\n } as TableDefinition[\"columns\"][0];\n\n tableInfo.columns.push(column);\n }\n\n private generateColumn(\n defaultFieldName: string,\n betterAuthField: DBFieldAttribute,\n tableInfo: TableDefinition\n ) {\n const column = {} as TableDefinition[\"columns\"][0];\n column.name = betterAuthField.fieldName || defaultFieldName;\n column.type = mapBetterAuthTypeToDBType(\n betterAuthField.type,\n this.provider,\n betterAuthField.bigint\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}\n\nexport interface 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\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, DBFieldAttribute } from \"better-auth\";\nimport { Provider } from \"./types\";\nimport { Handlebars } from \"./lib/handlerbar\";\nimport { TableDefinition } from \"./generate-migration\";\nimport { mapBetterAuthTypeToDBType } from \"./helpers\";\n\nexport class EntityGenerator {\n private provider: Provider;\n\n constructor(provider: Provider) {\n this.provider = provider;\n }\n\n async generate(\n authDbSchema: BetterAuthDBSchema,\n entitiesPath: string,\n mappedEntities?: Record<string, any>\n ) {\n const tableDefinitions: TableDefinition[] = [];\n\n for (const [tableName, tableSchema] of Object.entries(authDbSchema)) {\n const name = tableSchema.modelName || tableName;\n const entityName = mappedEntities ? mappedEntities[name] : undefined;\n const tableInfo: TableDefinition = {\n name: name,\n entityName: entityName,\n columns: [],\n fkConstraints: [],\n };\n\n for (const [fieldName, fieldConfig] of Object.entries(tableSchema.fields)) {\n this.generateColumn(fieldName, fieldConfig, tableInfo);\n }\n\n tableDefinitions.push(tableInfo);\n }\n\n const template = Handlebars.compile(entityTemplate);\n\n const entityCode = template({\n tables: tableDefinitions.map((table) => ({\n ...table,\n columns: table.columns.map((column) => ({\n ...column,\n tsType: this.mapDBTypeToTSType(column.type, column.isNullable),\n })),\n fkConstraints: table.fkConstraints.map((fk) => ({\n ...fk,\n referencedTable: fk.referencedTableName,\n referencedEntity: mappedEntities\n ? mappedEntities[fk.referencedTableName]\n : fk.referencedTableName,\n columnName: fk.columnNames[0],\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\n private generateColumn(\n defaultFieldName: string,\n betterAuthField: DBFieldAttribute,\n tableInfo: TableDefinition\n ) {\n const column = {} as TableDefinition[\"columns\"][0];\n column.name = betterAuthField.fieldName || defaultFieldName;\n column.type = mapBetterAuthTypeToDBType(\n betterAuthField.type,\n this.provider,\n betterAuthField.bigint\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\n private 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}\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 {{#each fkConstraints}}\n @ManyToOne(() => {{referencedEntity}}{{#if onDelete}}, { onDelete: \"{{upper onDelete }}\" }{{/if}})\n {{referencedTable}}: {{referencedEntity}};\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 { MigrationGenerator } from \"./generate-migration\";\nimport { TypeOrmAdapterConfig } from \"./types\";\nimport { EntityGenerator } 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 console.log(\"Creating database schema...\");\n\n if (config.generateEntities) {\n const mappedEntities = getMappedEntities();\n const entityGenerator = new EntityGenerator(config.provider!);\n await entityGenerator.generate(tables, config.entitiesPath!, mappedEntities);\n }\n\n if (!config.generateMigrations) {\n return { code: \"\", path: \"\" };\n }\n\n const migrationGenerator = new MigrationGenerator(config.provider!);\n const { code, migrationFileName } = await migrationGenerator.generate(tables);\n\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 usePlural: config?.usePlural ?? false,\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":"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","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"]}
|