pecunia-root 0.0.3
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/adapters/drizzle/index.d.mts +47 -0
- package/dist/adapters/drizzle/index.mjs +218 -0
- package/dist/adapters/drizzle/index.mjs.map +1 -0
- package/dist/adapters/get-adapter.d.mts +7 -0
- package/dist/adapters/get-adapter.mjs +31 -0
- package/dist/adapters/get-adapter.mjs.map +1 -0
- package/dist/adapters/internal/index.mjs +11 -0
- package/dist/adapters/internal/index.mjs.map +1 -0
- package/dist/adapters/kysely/bun-sqlite-dialect.mjs +156 -0
- package/dist/adapters/kysely/bun-sqlite-dialect.mjs.map +1 -0
- package/dist/adapters/kysely/dialect.mjs +83 -0
- package/dist/adapters/kysely/dialect.mjs.map +1 -0
- package/dist/adapters/kysely/index.d.mts +34 -0
- package/dist/adapters/kysely/index.mjs +183 -0
- package/dist/adapters/kysely/index.mjs.map +1 -0
- package/dist/adapters/kysely/node-sqlite-dialect.mjs +156 -0
- package/dist/adapters/kysely/node-sqlite-dialect.mjs.map +1 -0
- package/dist/adapters/mongodb/index.d.mts +35 -0
- package/dist/adapters/mongodb/index.mjs +313 -0
- package/dist/adapters/mongodb/index.mjs.map +1 -0
- package/dist/adapters/prisma/index.d.mts +34 -0
- package/dist/adapters/prisma/index.mjs +213 -0
- package/dist/adapters/prisma/index.mjs.map +1 -0
- package/dist/api/index.d.mts +23 -0
- package/dist/api/index.mjs +126 -0
- package/dist/api/index.mjs.map +1 -0
- package/dist/context/index.mjs +77 -0
- package/dist/context/index.mjs.map +1 -0
- package/dist/db/index.d.mts +3 -0
- package/dist/db/index.mjs +4 -0
- package/dist/db/migrations/index.d.mts +21 -0
- package/dist/db/migrations/index.mjs +327 -0
- package/dist/db/migrations/index.mjs.map +1 -0
- package/dist/db/schema/get-schema.d.mts +10 -0
- package/dist/db/schema/get-schema.mjs +39 -0
- package/dist/db/schema/get-schema.mjs.map +1 -0
- package/dist/index.d.mts +9 -0
- package/dist/index.mjs +7 -0
- package/dist/payment/base.mjs +38 -0
- package/dist/payment/base.mjs.map +1 -0
- package/dist/payment/index.d.mts +21 -0
- package/dist/payment/index.mjs +23 -0
- package/dist/payment/index.mjs.map +1 -0
- package/dist/types/payment.d.mts +11 -0
- package/dist/types/payment.mjs +1 -0
- package/dist/utils/is-promise.mjs +8 -0
- package/dist/utils/is-promise.mjs.map +1 -0
- package/dist/utils/url.mjs +77 -0
- package/dist/utils/url.mjs.map +1 -0
- package/package.json +183 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dialect.mjs","names":["dialect: Dialect | undefined","DatabaseSync: typeof import(\"node:sqlite\").DatabaseSync | undefined","nodeSqlite: string","error: unknown"],"sources":["../../../src/adapters/kysely/dialect.ts"],"sourcesContent":["import type { PecuniaOptions } from \"pecunia-core\";\nimport type { Dialect, SqliteDatabase } from \"kysely\";\nimport {\n Kysely,\n MssqlDialect,\n MysqlDialect,\n PostgresDialect,\n SqliteDialect,\n} from \"kysely\";\nimport type { Database as BunSqliteDatabase } from \"bun:sqlite\";\nimport type { KyselyDatabaseDialectType } from \"pecunia-core\";\nfunction isSqliteDatabase(x: unknown): x is SqliteDatabase {\n return typeof x === \"object\" && x !== null && \"prepare\" in x;\n}\n\nfunction isSqliteDatabaseFactory(\n x: unknown,\n): x is () => Promise<SqliteDatabase> {\n return typeof x === \"function\";\n}\n\nfunction isBunSqliteDatabase(x: unknown): x is BunSqliteDatabase {\n return typeof x === \"object\" && x !== null && \"fileControl\" in x;\n}\n\nexport function getKyselyDatabaseType(\n db: PecuniaOptions[\"database\"],\n): KyselyDatabaseDialectType | null {\n if (!db) {\n return null;\n }\n if (\"dialect\" in db) {\n return getKyselyDatabaseType(db.dialect as Dialect);\n }\n if (\"createDriver\" in db) {\n if (db instanceof SqliteDialect) {\n return \"sqlite\";\n }\n if (db instanceof MysqlDialect) {\n return \"mysql\";\n }\n if (db instanceof PostgresDialect) {\n return \"postgres\";\n }\n if (db instanceof MssqlDialect) {\n return \"mssql\";\n }\n }\n if (\"aggregate\" in db) {\n return \"sqlite\";\n }\n\n if (\"getConnection\" in db) {\n return \"mysql\";\n }\n if (\"connect\" in db) {\n return \"postgres\";\n }\n if (\"fileControl\" in db) {\n return \"sqlite\";\n }\n if (\"open\" in db && \"close\" in db && \"prepare\" in db) {\n return \"sqlite\";\n }\n return null;\n}\n\nexport const createKyselyAdapter = async (config: PecuniaOptions) => {\n const db = config.database;\n\n if (!db) {\n return {\n kysely: null,\n databaseType: null,\n transaction: undefined,\n };\n }\n\n if (\"db\" in db) {\n return {\n kysely: db.db,\n databaseType: db.type,\n transaction: db.transaction,\n };\n }\n\n if (\"dialect\" in db) {\n return {\n kysely: new Kysely<any>({ dialect: db.dialect }),\n databaseType: db.type,\n transaction: db.transaction,\n };\n }\n\n let dialect: Dialect | undefined = undefined;\n\n const databaseType = getKyselyDatabaseType(db);\n\n if (\"createDriver\" in db) {\n dialect = db;\n }\n\n if (\"aggregate\" in db) {\n if (isSqliteDatabase(db) || isSqliteDatabaseFactory(db)) {\n dialect = new SqliteDialect({ database: db });\n } else {\n throw new Error(\n \"db matched 'aggregate' check, but is not a Kysely SqliteDatabase\",\n );\n }\n }\n\n if (\"getConnection\" in db) {\n // @ts-expect-error - mysql2/promise\n dialect = new MysqlDialect(db);\n }\n\n if (\"connect\" in db) {\n dialect = new PostgresDialect({\n pool: db,\n });\n }\n\n if (isBunSqliteDatabase(db)) {\n const { BunSqliteDialect } = await import(\"./bun-sqlite-dialect\");\n dialect = new BunSqliteDialect({\n database: db,\n });\n }\n\n if (\"createSession\" in db && typeof window === \"undefined\") {\n let DatabaseSync: typeof import(\"node:sqlite\").DatabaseSync | undefined =\n undefined;\n try {\n let nodeSqlite: string = \"node:sqlite\";\n // Ignore both Vite and Webpack for dynamic import as they both try to pre-bundle 'node:sqlite' which might fail\n // It's okay because we are in a try-catch block\n ({ DatabaseSync } = await import(\n /* @vite-ignore */\n /* webpackIgnore: true */\n nodeSqlite\n ));\n } catch (error: unknown) {\n if (\n error !== null &&\n typeof error === \"object\" &&\n \"code\" in error &&\n error.code !== \"ERR_UNKNOWN_BUILTIN_MODULE\"\n ) {\n throw error;\n }\n }\n if (DatabaseSync && db instanceof DatabaseSync) {\n const { NodeSqliteDialect } = await import(\"./node-sqlite-dialect\");\n dialect = new NodeSqliteDialect({\n database: db,\n });\n }\n }\n\n return {\n kysely: dialect ? new Kysely<any>({ dialect }) : null,\n databaseType,\n transaction: undefined,\n };\n};\n"],"mappings":";;;AAWA,SAAS,iBAAiB,GAAiC;AACzD,QAAO,OAAO,MAAM,YAAY,MAAM,QAAQ,aAAa;;AAG7D,SAAS,wBACP,GACoC;AACpC,QAAO,OAAO,MAAM;;AAGtB,SAAS,oBAAoB,GAAoC;AAC/D,QAAO,OAAO,MAAM,YAAY,MAAM,QAAQ,iBAAiB;;AAGjE,SAAgB,sBACd,IACkC;AAClC,KAAI,CAAC,GACH,QAAO;AAET,KAAI,aAAa,GACf,QAAO,sBAAsB,GAAG,QAAmB;AAErD,KAAI,kBAAkB,IAAI;AACxB,MAAI,cAAc,cAChB,QAAO;AAET,MAAI,cAAc,aAChB,QAAO;AAET,MAAI,cAAc,gBAChB,QAAO;AAET,MAAI,cAAc,aAChB,QAAO;;AAGX,KAAI,eAAe,GACjB,QAAO;AAGT,KAAI,mBAAmB,GACrB,QAAO;AAET,KAAI,aAAa,GACf,QAAO;AAET,KAAI,iBAAiB,GACnB,QAAO;AAET,KAAI,UAAU,MAAM,WAAW,MAAM,aAAa,GAChD,QAAO;AAET,QAAO;;AAGT,MAAa,sBAAsB,OAAO,WAA2B;CACnE,MAAM,KAAK,OAAO;AAElB,KAAI,CAAC,GACH,QAAO;EACL,QAAQ;EACR,cAAc;EACd,aAAa;EACd;AAGH,KAAI,QAAQ,GACV,QAAO;EACL,QAAQ,GAAG;EACX,cAAc,GAAG;EACjB,aAAa,GAAG;EACjB;AAGH,KAAI,aAAa,GACf,QAAO;EACL,QAAQ,IAAI,OAAY,EAAE,SAAS,GAAG,SAAS,CAAC;EAChD,cAAc,GAAG;EACjB,aAAa,GAAG;EACjB;CAGH,IAAIA,UAA+B;CAEnC,MAAM,eAAe,sBAAsB,GAAG;AAE9C,KAAI,kBAAkB,GACpB,WAAU;AAGZ,KAAI,eAAe,GACjB,KAAI,iBAAiB,GAAG,IAAI,wBAAwB,GAAG,CACrD,WAAU,IAAI,cAAc,EAAE,UAAU,IAAI,CAAC;KAE7C,OAAM,IAAI,MACR,mEACD;AAIL,KAAI,mBAAmB,GAErB,WAAU,IAAI,aAAa,GAAG;AAGhC,KAAI,aAAa,GACf,WAAU,IAAI,gBAAgB,EAC5B,MAAM,IACP,CAAC;AAGJ,KAAI,oBAAoB,GAAG,EAAE;EAC3B,MAAM,EAAE,qBAAqB,MAAM,OAAO;AAC1C,YAAU,IAAI,iBAAiB,EAC7B,UAAU,IACX,CAAC;;AAGJ,KAAI,mBAAmB,MAAM,OAAO,WAAW,aAAa;EAC1D,IAAIC,eACF;AACF,MAAI;GACF,IAAIC,aAAqB;AAGzB,IAAC,CAAE,gBAAiB,MAAM;;;IAGxB;;WAEKC,OAAgB;AACvB,OACE,UAAU,QACV,OAAO,UAAU,YACjB,UAAU,SACV,MAAM,SAAS,6BAEf,OAAM;;AAGV,MAAI,gBAAgB,cAAc,cAAc;GAC9C,MAAM,EAAE,sBAAsB,MAAM,OAAO;AAC3C,aAAU,IAAI,kBAAkB,EAC9B,UAAU,IACX,CAAC;;;AAIN,QAAO;EACL,QAAQ,UAAU,IAAI,OAAY,EAAE,SAAS,CAAC,GAAG;EACjD;EACA,aAAa;EACd"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { DBAdapter, DBAdapterDebugLogOption, KyselyDatabaseDialectType, PecuniaOptions } from "pecunia-core";
|
|
2
|
+
import { Kysely } from "kysely";
|
|
3
|
+
|
|
4
|
+
//#region src/adapters/kysely/index.d.ts
|
|
5
|
+
interface KyselyAdapterConfig {
|
|
6
|
+
/**
|
|
7
|
+
* Database type.
|
|
8
|
+
*/
|
|
9
|
+
type?: KyselyDatabaseDialectType | undefined;
|
|
10
|
+
/**
|
|
11
|
+
* Enable debug logs for the adapter
|
|
12
|
+
*
|
|
13
|
+
* @default false
|
|
14
|
+
*/
|
|
15
|
+
debugLogs?: DBAdapterDebugLogOption | undefined;
|
|
16
|
+
/**
|
|
17
|
+
* Use plural for table names.
|
|
18
|
+
*
|
|
19
|
+
* @default false
|
|
20
|
+
*/
|
|
21
|
+
usePlural?: boolean | undefined;
|
|
22
|
+
/**
|
|
23
|
+
* Whether to execute multiple operations in a transaction.
|
|
24
|
+
*
|
|
25
|
+
* If the database doesn't support transactions,
|
|
26
|
+
* set this to `false` and operations will be executed sequentially.
|
|
27
|
+
* @default false
|
|
28
|
+
*/
|
|
29
|
+
transaction?: boolean | undefined;
|
|
30
|
+
}
|
|
31
|
+
declare const kyselyAdapter: (db: Kysely<any>, config?: KyselyAdapterConfig | undefined) => (options: PecuniaOptions) => DBAdapter<PecuniaOptions>;
|
|
32
|
+
//#endregion
|
|
33
|
+
export { kyselyAdapter };
|
|
34
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { createAdapterFactory } from "pecunia-core";
|
|
2
|
+
|
|
3
|
+
//#region src/adapters/kysely/index.ts
|
|
4
|
+
const kyselyAdapter = (db, config) => {
|
|
5
|
+
let lazyOptions = null;
|
|
6
|
+
const createCustomAdapter = (db$1) => {
|
|
7
|
+
return ({ getFieldName, getDefaultFieldName, getDefaultModelName, schema }) => {
|
|
8
|
+
const withReturning = async (values, builder, model, where) => {
|
|
9
|
+
let res;
|
|
10
|
+
if (config?.type === "mysql") {
|
|
11
|
+
await builder.execute();
|
|
12
|
+
const field = values.id ? "id" : where.length > 0 && where[0]?.field ? where[0].field : "id";
|
|
13
|
+
if (!values.id && where.length === 0) {
|
|
14
|
+
res = await db$1.selectFrom(model).selectAll().orderBy(getFieldName({
|
|
15
|
+
model,
|
|
16
|
+
field
|
|
17
|
+
}), "desc").limit(1).executeTakeFirst();
|
|
18
|
+
return res;
|
|
19
|
+
}
|
|
20
|
+
const value = values[field] || where[0]?.value;
|
|
21
|
+
res = await db$1.selectFrom(model).selectAll().orderBy(getFieldName({
|
|
22
|
+
model,
|
|
23
|
+
field
|
|
24
|
+
}), "desc").where(getFieldName({
|
|
25
|
+
model,
|
|
26
|
+
field
|
|
27
|
+
}), "=", value).limit(1).executeTakeFirst();
|
|
28
|
+
return res;
|
|
29
|
+
}
|
|
30
|
+
if (config?.type === "mssql") {
|
|
31
|
+
res = await builder.outputAll("inserted").executeTakeFirst();
|
|
32
|
+
return res;
|
|
33
|
+
}
|
|
34
|
+
res = await builder.returningAll().executeTakeFirst();
|
|
35
|
+
return res;
|
|
36
|
+
};
|
|
37
|
+
function convertWhereClause(model, w) {
|
|
38
|
+
if (!w) return {
|
|
39
|
+
and: null,
|
|
40
|
+
or: null
|
|
41
|
+
};
|
|
42
|
+
const conditions = {
|
|
43
|
+
and: [],
|
|
44
|
+
or: []
|
|
45
|
+
};
|
|
46
|
+
w.forEach((condition) => {
|
|
47
|
+
let { field: _field, value: _value, operator = "=", connector = "AND" } = condition;
|
|
48
|
+
const value = _value;
|
|
49
|
+
const field = getFieldName({
|
|
50
|
+
model,
|
|
51
|
+
field: _field
|
|
52
|
+
});
|
|
53
|
+
const expr = (eb) => {
|
|
54
|
+
const f = `${model}.${field}`;
|
|
55
|
+
if (operator.toLowerCase() === "in") return eb(f, "in", Array.isArray(value) ? value : [value]);
|
|
56
|
+
if (operator.toLowerCase() === "not_in") return eb(f, "not in", Array.isArray(value) ? value : [value]);
|
|
57
|
+
if (operator === "contains") return eb(f, "like", `%${value}%`);
|
|
58
|
+
if (operator === "starts_with") return eb(f, "like", `${value}%`);
|
|
59
|
+
if (operator === "ends_with") return eb(f, "like", `%${value}`);
|
|
60
|
+
if (operator === "eq") return eb(f, "=", value);
|
|
61
|
+
if (operator === "ne") return eb(f, "<>", value);
|
|
62
|
+
if (operator === "gt") return eb(f, ">", value);
|
|
63
|
+
if (operator === "gte") return eb(f, ">=", value);
|
|
64
|
+
if (operator === "lt") return eb(f, "<", value);
|
|
65
|
+
if (operator === "lte") return eb(f, "<=", value);
|
|
66
|
+
return eb(f, operator, value);
|
|
67
|
+
};
|
|
68
|
+
if (connector === "OR") conditions.or.push(expr);
|
|
69
|
+
else conditions.and.push(expr);
|
|
70
|
+
});
|
|
71
|
+
return {
|
|
72
|
+
and: conditions.and.length ? conditions.and : null,
|
|
73
|
+
or: conditions.or.length ? conditions.or : null
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
return {
|
|
77
|
+
async create({ data, model }) {
|
|
78
|
+
return await withReturning(data, db$1.insertInto(model).values(data), model, []);
|
|
79
|
+
},
|
|
80
|
+
async findOne({ model, where }) {
|
|
81
|
+
const { and, or } = convertWhereClause(model, where);
|
|
82
|
+
let query = db$1.selectFrom(model).selectAll();
|
|
83
|
+
if (and) query = query.where((eb) => eb.and(and.map((expr) => expr(eb))));
|
|
84
|
+
if (or) query = query.where((eb) => eb.or(or.map((expr) => expr(eb))));
|
|
85
|
+
return await query.executeTakeFirst() ?? null;
|
|
86
|
+
},
|
|
87
|
+
async findMany({ model, where, limit, offset, sortBy }) {
|
|
88
|
+
const { and, or } = convertWhereClause(model, where);
|
|
89
|
+
let query = db$1.selectFrom(model).selectAll();
|
|
90
|
+
if (config?.type === "mssql") {
|
|
91
|
+
if (offset !== void 0) {
|
|
92
|
+
if (!sortBy) query = query.orderBy(getFieldName({
|
|
93
|
+
model,
|
|
94
|
+
field: "id"
|
|
95
|
+
}));
|
|
96
|
+
query = query.offset(offset).fetch(limit || 100);
|
|
97
|
+
} else if (limit !== void 0) query = query.top(limit);
|
|
98
|
+
} else {
|
|
99
|
+
if (limit !== void 0) query = query.limit(limit);
|
|
100
|
+
if (offset !== void 0) query = query.offset(offset);
|
|
101
|
+
}
|
|
102
|
+
if (sortBy?.field) query = query.orderBy(`${getFieldName({
|
|
103
|
+
model,
|
|
104
|
+
field: sortBy.field
|
|
105
|
+
})}`, sortBy.direction);
|
|
106
|
+
if (and) query = query.where((eb) => eb.and(and.map((expr) => expr(eb))));
|
|
107
|
+
if (or) query = query.where((eb) => eb.or(or.map((expr) => expr(eb))));
|
|
108
|
+
return await query.execute() ?? [];
|
|
109
|
+
},
|
|
110
|
+
async update({ model, where, update: values }) {
|
|
111
|
+
const { and, or } = convertWhereClause(model, where);
|
|
112
|
+
let query = db$1.updateTable(model).set(values);
|
|
113
|
+
if (and) query = query.where((eb) => eb.and(and.map((expr) => expr(eb))));
|
|
114
|
+
if (or) query = query.where((eb) => eb.or(or.map((expr) => expr(eb))));
|
|
115
|
+
return await withReturning(values, query, model, where);
|
|
116
|
+
},
|
|
117
|
+
async updateMany({ model, where, update: values }) {
|
|
118
|
+
const { and, or } = convertWhereClause(model, where);
|
|
119
|
+
let query = db$1.updateTable(model).set(values);
|
|
120
|
+
if (and) query = query.where((eb) => eb.and(and.map((expr) => expr(eb))));
|
|
121
|
+
if (or) query = query.where((eb) => eb.or(or.map((expr) => expr(eb))));
|
|
122
|
+
const res = (await query.executeTakeFirst()).numUpdatedRows;
|
|
123
|
+
return res > Number.MAX_SAFE_INTEGER ? Number.MAX_SAFE_INTEGER : Number(res);
|
|
124
|
+
},
|
|
125
|
+
async count({ model, where }) {
|
|
126
|
+
const { and, or } = convertWhereClause(model, where);
|
|
127
|
+
let query = db$1.selectFrom(model).select(db$1.fn.count("id").as("count"));
|
|
128
|
+
if (and) query = query.where((eb) => eb.and(and.map((expr) => expr(eb))));
|
|
129
|
+
if (or) query = query.where((eb) => eb.or(or.map((expr) => expr(eb))));
|
|
130
|
+
const res = await query.execute();
|
|
131
|
+
if (typeof res[0].count === "number") return res[0].count;
|
|
132
|
+
if (typeof res[0].count === "bigint") return Number(res[0].count);
|
|
133
|
+
return parseInt(res[0].count);
|
|
134
|
+
},
|
|
135
|
+
async delete({ model, where }) {
|
|
136
|
+
const { and, or } = convertWhereClause(model, where);
|
|
137
|
+
let query = db$1.deleteFrom(model);
|
|
138
|
+
if (and) query = query.where((eb) => eb.and(and.map((expr) => expr(eb))));
|
|
139
|
+
if (or) query = query.where((eb) => eb.or(or.map((expr) => expr(eb))));
|
|
140
|
+
await query.execute();
|
|
141
|
+
},
|
|
142
|
+
async deleteMany({ model, where }) {
|
|
143
|
+
const { and, or } = convertWhereClause(model, where);
|
|
144
|
+
let query = db$1.deleteFrom(model);
|
|
145
|
+
if (and) query = query.where((eb) => eb.and(and.map((expr) => expr(eb))));
|
|
146
|
+
if (or) query = query.where((eb) => eb.or(or.map((expr) => expr(eb))));
|
|
147
|
+
const res = (await query.executeTakeFirst()).numDeletedRows;
|
|
148
|
+
return res > Number.MAX_SAFE_INTEGER ? Number.MAX_SAFE_INTEGER : Number(res);
|
|
149
|
+
},
|
|
150
|
+
options: config
|
|
151
|
+
};
|
|
152
|
+
};
|
|
153
|
+
};
|
|
154
|
+
let adapterOptions = null;
|
|
155
|
+
adapterOptions = {
|
|
156
|
+
config: {
|
|
157
|
+
adapterId: "kysely",
|
|
158
|
+
adapterName: "Kysely Adapter",
|
|
159
|
+
usePlural: config?.usePlural,
|
|
160
|
+
supportsBooleans: config?.type === "sqlite" || config?.type === "mssql" || config?.type === "mysql" || !config?.type ? false : true,
|
|
161
|
+
supportsDates: config?.type === "sqlite" || config?.type === "mssql" || !config?.type ? false : true,
|
|
162
|
+
supportsJSON: config?.type === "postgres" ? true : false,
|
|
163
|
+
supportsArrays: false,
|
|
164
|
+
supportsUUIDs: config?.type === "postgres" ? true : false,
|
|
165
|
+
transaction: config?.transaction ? (cb) => db.transaction().execute((trx) => {
|
|
166
|
+
return cb(createAdapterFactory({
|
|
167
|
+
config: adapterOptions.config,
|
|
168
|
+
adapter: createCustomAdapter(trx)
|
|
169
|
+
})(lazyOptions));
|
|
170
|
+
}) : false
|
|
171
|
+
},
|
|
172
|
+
adapter: createCustomAdapter(db)
|
|
173
|
+
};
|
|
174
|
+
const adapter = createAdapterFactory(adapterOptions);
|
|
175
|
+
return (options) => {
|
|
176
|
+
lazyOptions = options;
|
|
177
|
+
return adapter(options);
|
|
178
|
+
};
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
//#endregion
|
|
182
|
+
export { kyselyAdapter };
|
|
183
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["lazyOptions: PecuniaOptions | null","res: any","db","value: any","field: string | any","query: any","adapterOptions: AdapterFactoryOptions | null"],"sources":["../../../src/adapters/kysely/index.ts"],"sourcesContent":["import type { PecuniaOptions } from \"pecunia-core\";\nimport type {\n AdapterFactoryCreator,\n AdapterFactoryOptions,\n DBAdapter,\n DBAdapterDebugLogOption,\n Where,\n} from \"pecunia-core\";\nimport { createAdapterFactory } from \"pecunia-core\";\nimport type { InsertQueryBuilder, Kysely, UpdateQueryBuilder } from \"kysely\";\n\ninterface KyselyAdapterConfig {\n /**\n * Database type.\n */\n type?: KyselyDatabaseDialectType | undefined;\n /**\n * Enable debug logs for the adapter\n *\n * @default false\n */\n debugLogs?: DBAdapterDebugLogOption | undefined;\n /**\n * Use plural for table names.\n *\n * @default false\n */\n usePlural?: boolean | undefined;\n /**\n * Whether to execute multiple operations in a transaction.\n *\n * If the database doesn't support transactions,\n * set this to `false` and operations will be executed sequentially.\n * @default false\n */\n transaction?: boolean | undefined;\n}\n\nimport type { KyselyDatabaseDialectType } from \"pecunia-core\";\n\nexport const kyselyAdapter = (\n db: Kysely<any>,\n config?: KyselyAdapterConfig | undefined,\n) => {\n let lazyOptions: PecuniaOptions | null = null;\n\n const createCustomAdapter = (db: Kysely<any>): AdapterFactoryCreator => {\n return ({\n getFieldName,\n getDefaultFieldName,\n getDefaultModelName,\n schema,\n }) => {\n const withReturning = async (\n values: Record<string, any>,\n builder:\n | InsertQueryBuilder<any, any, any>\n | UpdateQueryBuilder<any, string, string, any>,\n model: string,\n where: Where[],\n ) => {\n let res: any;\n\n if (config?.type === \"mysql\") {\n // Kysely doesn't support returning() in MySQL.\n await builder.execute();\n\n const field = values.id\n ? \"id\"\n : where.length > 0 && where[0]?.field\n ? where[0].field\n : \"id\";\n\n if (!values.id && where.length === 0) {\n res = await db\n .selectFrom(model)\n .selectAll()\n .orderBy(getFieldName({ model, field }), \"desc\")\n .limit(1)\n .executeTakeFirst();\n return res;\n }\n\n const value = values[field] || where[0]?.value;\n\n res = await db\n .selectFrom(model)\n .selectAll()\n .orderBy(getFieldName({ model, field }), \"desc\")\n .where(getFieldName({ model, field }), \"=\", value)\n .limit(1)\n .executeTakeFirst();\n\n return res;\n }\n\n if (config?.type === \"mssql\") {\n res = await builder.outputAll(\"inserted\").executeTakeFirst();\n return res;\n }\n\n res = await builder.returningAll().executeTakeFirst();\n return res;\n };\n\n function convertWhereClause(model: string, w?: Where[] | undefined) {\n if (!w) {\n return {\n and: null,\n or: null,\n };\n }\n\n const conditions = {\n and: [] as any[],\n or: [] as any[],\n };\n\n w.forEach((condition) => {\n let {\n field: _field,\n value: _value,\n operator = \"=\",\n connector = \"AND\",\n } = condition;\n\n const value: any = _value;\n\n const field: string | any = getFieldName({\n model,\n field: _field,\n });\n\n const expr = (eb: any) => {\n const f = `${model}.${field}`;\n\n if (operator.toLowerCase() === \"in\") {\n return eb(f, \"in\", Array.isArray(value) ? value : [value]);\n }\n\n if (operator.toLowerCase() === \"not_in\") {\n return eb(f, \"not in\", Array.isArray(value) ? value : [value]);\n }\n\n if (operator === \"contains\") {\n return eb(f, \"like\", `%${value}%`);\n }\n\n if (operator === \"starts_with\") {\n return eb(f, \"like\", `${value}%`);\n }\n\n if (operator === \"ends_with\") {\n return eb(f, \"like\", `%${value}`);\n }\n\n if (operator === \"eq\") {\n return eb(f, \"=\", value);\n }\n\n if (operator === \"ne\") {\n return eb(f, \"<>\", value);\n }\n\n if (operator === \"gt\") {\n return eb(f, \">\", value);\n }\n\n if (operator === \"gte\") {\n return eb(f, \">=\", value);\n }\n\n if (operator === \"lt\") {\n return eb(f, \"<\", value);\n }\n\n if (operator === \"lte\") {\n return eb(f, \"<=\", value);\n }\n\n return eb(f, operator, value);\n };\n\n if (connector === \"OR\") {\n conditions.or.push(expr);\n } else {\n conditions.and.push(expr);\n }\n });\n\n return {\n and: conditions.and.length ? conditions.and : null,\n or: conditions.or.length ? conditions.or : null,\n };\n }\n\n return {\n async create({ data, model }) {\n const builder = db.insertInto(model).values(data);\n const returned = await withReturning(data, builder, model, []);\n return returned;\n },\n\n async findOne({ model, where }) {\n const { and, or } = convertWhereClause(model, where);\n\n let query: any = db.selectFrom(model).selectAll();\n\n if (and) {\n query = query.where((eb: any) =>\n eb.and(and.map((expr: any) => expr(eb))),\n );\n }\n\n if (or) {\n query = query.where((eb: any) =>\n eb.or(or.map((expr: any) => expr(eb))),\n );\n }\n\n const row = await query.executeTakeFirst();\n return row ?? null;\n },\n\n async findMany({ model, where, limit, offset, sortBy }) {\n const { and, or } = convertWhereClause(model, where);\n\n let query: any = db.selectFrom(model).selectAll();\n\n if (config?.type === \"mssql\") {\n if (offset !== undefined) {\n if (!sortBy) {\n query = query.orderBy(getFieldName({ model, field: \"id\" }));\n }\n query = query.offset(offset).fetch(limit || 100);\n } else if (limit !== undefined) {\n query = query.top(limit);\n }\n } else {\n if (limit !== undefined) {\n query = query.limit(limit);\n }\n if (offset !== undefined) {\n query = query.offset(offset);\n }\n }\n\n if (sortBy?.field) {\n query = query.orderBy(\n `${getFieldName({ model, field: sortBy.field })}`,\n sortBy.direction,\n );\n }\n\n if (and) {\n query = query.where((eb: any) =>\n eb.and(and.map((expr: any) => expr(eb))),\n );\n }\n\n if (or) {\n query = query.where((eb: any) =>\n eb.or(or.map((expr: any) => expr(eb))),\n );\n }\n\n const res = await query.execute();\n return res ?? [];\n },\n\n async update({ model, where, update: values }) {\n const { and, or } = convertWhereClause(model, where);\n\n let query = db.updateTable(model).set(values as any);\n\n if (and) {\n query = query.where((eb) => eb.and(and.map((expr) => expr(eb))));\n }\n\n if (or) {\n query = query.where((eb) => eb.or(or.map((expr) => expr(eb))));\n }\n\n return await withReturning(values as any, query, model, where);\n },\n\n async updateMany({ model, where, update: values }) {\n const { and, or } = convertWhereClause(model, where);\n\n let query = db.updateTable(model).set(values as any);\n\n if (and) {\n query = query.where((eb) => eb.and(and.map((expr) => expr(eb))));\n }\n\n if (or) {\n query = query.where((eb) => eb.or(or.map((expr) => expr(eb))));\n }\n\n const res = (await query.executeTakeFirst()).numUpdatedRows;\n\n return res > Number.MAX_SAFE_INTEGER\n ? Number.MAX_SAFE_INTEGER\n : Number(res);\n },\n\n async count({ model, where }) {\n const { and, or } = convertWhereClause(model, where);\n\n let query = db\n .selectFrom(model)\n .select(db.fn.count(\"id\").as(\"count\"));\n\n if (and) {\n query = query.where((eb) => eb.and(and.map((expr) => expr(eb))));\n }\n\n if (or) {\n query = query.where((eb) => eb.or(or.map((expr) => expr(eb))));\n }\n\n const res = await query.execute();\n\n if (typeof res[0]!.count === \"number\") return res[0]!.count;\n if (typeof res[0]!.count === \"bigint\") return Number(res[0]!.count);\n\n return parseInt(res[0]!.count);\n },\n\n async delete({ model, where }) {\n const { and, or } = convertWhereClause(model, where);\n\n let query = db.deleteFrom(model);\n\n if (and) {\n query = query.where((eb) => eb.and(and.map((expr) => expr(eb))));\n }\n\n if (or) {\n query = query.where((eb) => eb.or(or.map((expr) => expr(eb))));\n }\n\n await query.execute();\n },\n\n async deleteMany({ model, where }) {\n const { and, or } = convertWhereClause(model, where);\n\n let query = db.deleteFrom(model);\n\n if (and) {\n query = query.where((eb) => eb.and(and.map((expr) => expr(eb))));\n }\n\n if (or) {\n query = query.where((eb) => eb.or(or.map((expr) => expr(eb))));\n }\n\n const res = (await query.executeTakeFirst()).numDeletedRows;\n\n return res > Number.MAX_SAFE_INTEGER\n ? Number.MAX_SAFE_INTEGER\n : Number(res);\n },\n\n options: config,\n };\n };\n };\n\n let adapterOptions: AdapterFactoryOptions | null = null;\n\n adapterOptions = {\n config: {\n adapterId: \"kysely\",\n adapterName: \"Kysely Adapter\",\n usePlural: config?.usePlural,\n supportsBooleans:\n config?.type === \"sqlite\" ||\n config?.type === \"mssql\" ||\n config?.type === \"mysql\" ||\n !config?.type\n ? false\n : true,\n supportsDates:\n config?.type === \"sqlite\" || config?.type === \"mssql\" || !config?.type\n ? false\n : true,\n supportsJSON: config?.type === \"postgres\" ? true : false,\n supportsArrays: false,\n supportsUUIDs: config?.type === \"postgres\" ? true : false,\n transaction: config?.transaction\n ? (cb) =>\n db.transaction().execute((trx) => {\n const adapter = createAdapterFactory({\n config: adapterOptions!.config,\n adapter: createCustomAdapter(trx),\n })(lazyOptions!);\n\n return cb(adapter);\n })\n : false,\n },\n adapter: createCustomAdapter(db),\n };\n\n const adapter = createAdapterFactory(adapterOptions);\n\n return (options: PecuniaOptions): DBAdapter<PecuniaOptions> => {\n lazyOptions = options;\n return adapter(options);\n };\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { CompiledQuery, DEFAULT_MIGRATION_LOCK_TABLE, DEFAULT_MIGRATION_TABLE, DefaultQueryCompiler, sql } from "kysely";
|
|
2
|
+
|
|
3
|
+
//#region src/adapters/kysely/node-sqlite-dialect.ts
|
|
4
|
+
var NodeSqliteAdapter = class {
|
|
5
|
+
get supportsCreateIfNotExists() {
|
|
6
|
+
return true;
|
|
7
|
+
}
|
|
8
|
+
get supportsTransactionalDdl() {
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
get supportsReturning() {
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
async acquireMigrationLock() {}
|
|
15
|
+
async releaseMigrationLock() {}
|
|
16
|
+
get supportsOutput() {
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
var NodeSqliteDriver = class {
|
|
21
|
+
#config;
|
|
22
|
+
#connectionMutex = new ConnectionMutex();
|
|
23
|
+
#db;
|
|
24
|
+
#connection;
|
|
25
|
+
constructor(config) {
|
|
26
|
+
this.#config = { ...config };
|
|
27
|
+
}
|
|
28
|
+
async init() {
|
|
29
|
+
this.#db = this.#config.database;
|
|
30
|
+
this.#connection = new NodeSqliteConnection(this.#db);
|
|
31
|
+
if (this.#config.onCreateConnection) await this.#config.onCreateConnection(this.#connection);
|
|
32
|
+
}
|
|
33
|
+
async acquireConnection() {
|
|
34
|
+
await this.#connectionMutex.lock();
|
|
35
|
+
return this.#connection;
|
|
36
|
+
}
|
|
37
|
+
async beginTransaction(connection) {
|
|
38
|
+
await connection.executeQuery(CompiledQuery.raw("begin"));
|
|
39
|
+
}
|
|
40
|
+
async commitTransaction(connection) {
|
|
41
|
+
await connection.executeQuery(CompiledQuery.raw("commit"));
|
|
42
|
+
}
|
|
43
|
+
async rollbackTransaction(connection) {
|
|
44
|
+
await connection.executeQuery(CompiledQuery.raw("rollback"));
|
|
45
|
+
}
|
|
46
|
+
async releaseConnection() {
|
|
47
|
+
this.#connectionMutex.unlock();
|
|
48
|
+
}
|
|
49
|
+
async destroy() {
|
|
50
|
+
this.#db?.close();
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
var NodeSqliteConnection = class {
|
|
54
|
+
#db;
|
|
55
|
+
constructor(db) {
|
|
56
|
+
this.#db = db;
|
|
57
|
+
}
|
|
58
|
+
executeQuery(compiledQuery) {
|
|
59
|
+
const { sql: sql$1, parameters } = compiledQuery;
|
|
60
|
+
const rows = this.#db.prepare(sql$1).all(...parameters);
|
|
61
|
+
return Promise.resolve({ rows });
|
|
62
|
+
}
|
|
63
|
+
async *streamQuery() {
|
|
64
|
+
throw new Error("Streaming query is not supported by SQLite driver.");
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
var ConnectionMutex = class {
|
|
68
|
+
#promise;
|
|
69
|
+
#resolve;
|
|
70
|
+
async lock() {
|
|
71
|
+
while (this.#promise) await this.#promise;
|
|
72
|
+
this.#promise = new Promise((resolve) => {
|
|
73
|
+
this.#resolve = resolve;
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
unlock() {
|
|
77
|
+
const resolve = this.#resolve;
|
|
78
|
+
this.#promise = void 0;
|
|
79
|
+
this.#resolve = void 0;
|
|
80
|
+
resolve?.();
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
var NodeSqliteIntrospector = class {
|
|
84
|
+
#db;
|
|
85
|
+
constructor(db) {
|
|
86
|
+
this.#db = db;
|
|
87
|
+
}
|
|
88
|
+
async getSchemas() {
|
|
89
|
+
return [];
|
|
90
|
+
}
|
|
91
|
+
async getTables(options = { withInternalKyselyTables: false }) {
|
|
92
|
+
let query = this.#db.selectFrom("sqlite_schema").where("type", "=", "table").where("name", "not like", "sqlite_%").select("name").$castTo();
|
|
93
|
+
if (!options.withInternalKyselyTables) query = query.where("name", "!=", DEFAULT_MIGRATION_TABLE).where("name", "!=", DEFAULT_MIGRATION_LOCK_TABLE);
|
|
94
|
+
const tables = await query.execute();
|
|
95
|
+
return Promise.all(tables.map(({ name }) => this.#getTableMetadata(name)));
|
|
96
|
+
}
|
|
97
|
+
async getMetadata(options) {
|
|
98
|
+
return { tables: await this.getTables(options) };
|
|
99
|
+
}
|
|
100
|
+
async #getTableMetadata(table) {
|
|
101
|
+
const db = this.#db;
|
|
102
|
+
const autoIncrementCol = (await db.selectFrom("sqlite_master").where("name", "=", table).select("sql").$castTo().execute())[0]?.sql?.split(/[\(\),]/)?.find((it) => it.toLowerCase().includes("autoincrement"))?.split(/\s+/)?.[0]?.replace(/["`]/g, "");
|
|
103
|
+
return {
|
|
104
|
+
name: table,
|
|
105
|
+
columns: (await db.selectFrom(sql`pragma_table_info(${table})`.as("table_info")).select([
|
|
106
|
+
"name",
|
|
107
|
+
"type",
|
|
108
|
+
"notnull",
|
|
109
|
+
"dflt_value"
|
|
110
|
+
]).execute()).map((col) => ({
|
|
111
|
+
name: col.name,
|
|
112
|
+
dataType: col.type,
|
|
113
|
+
isNullable: !col.notnull,
|
|
114
|
+
isAutoIncrementing: col.name === autoIncrementCol,
|
|
115
|
+
hasDefaultValue: col.dflt_value != null
|
|
116
|
+
})),
|
|
117
|
+
isView: true
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
var NodeSqliteQueryCompiler = class extends DefaultQueryCompiler {
|
|
122
|
+
getCurrentParameterPlaceholder() {
|
|
123
|
+
return "?";
|
|
124
|
+
}
|
|
125
|
+
getLeftIdentifierWrapper() {
|
|
126
|
+
return "\"";
|
|
127
|
+
}
|
|
128
|
+
getRightIdentifierWrapper() {
|
|
129
|
+
return "\"";
|
|
130
|
+
}
|
|
131
|
+
getAutoIncrement() {
|
|
132
|
+
return "autoincrement";
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
var NodeSqliteDialect = class {
|
|
136
|
+
#config;
|
|
137
|
+
constructor(config) {
|
|
138
|
+
this.#config = { ...config };
|
|
139
|
+
}
|
|
140
|
+
createDriver() {
|
|
141
|
+
return new NodeSqliteDriver(this.#config);
|
|
142
|
+
}
|
|
143
|
+
createQueryCompiler() {
|
|
144
|
+
return new NodeSqliteQueryCompiler();
|
|
145
|
+
}
|
|
146
|
+
createAdapter() {
|
|
147
|
+
return new NodeSqliteAdapter();
|
|
148
|
+
}
|
|
149
|
+
createIntrospector(db) {
|
|
150
|
+
return new NodeSqliteIntrospector(db);
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
//#endregion
|
|
155
|
+
export { NodeSqliteDialect };
|
|
156
|
+
//# sourceMappingURL=node-sqlite-dialect.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-sqlite-dialect.mjs","names":["#config","#connectionMutex","#db","#connection","sql","#promise","#resolve","#getTableMetadata"],"sources":["../../../src/adapters/kysely/node-sqlite-dialect.ts"],"sourcesContent":["/**\n * @see {@link https://nodejs.org/api/sqlite.html} - Node.js SQLite API documentation\n */\n\nimport type { DatabaseSync } from \"node:sqlite\";\nimport type {\n DatabaseConnection,\n DatabaseIntrospector,\n DatabaseMetadata,\n DatabaseMetadataOptions,\n Dialect,\n DialectAdapter,\n DialectAdapterBase,\n Driver,\n Kysely,\n QueryCompiler,\n QueryResult,\n SchemaMetadata,\n TableMetadata,\n} from \"kysely\";\nimport {\n CompiledQuery,\n DEFAULT_MIGRATION_LOCK_TABLE,\n DEFAULT_MIGRATION_TABLE,\n DefaultQueryCompiler,\n sql,\n} from \"kysely\";\n\nclass NodeSqliteAdapter implements DialectAdapterBase {\n get supportsCreateIfNotExists(): boolean {\n return true;\n }\n\n get supportsTransactionalDdl(): boolean {\n return false;\n }\n\n get supportsReturning(): boolean {\n return true;\n }\n\n async acquireMigrationLock(): Promise<void> {\n // SQLite only has one connection that's reserved by the migration system\n // for the whole time between acquireMigrationLock and releaseMigrationLock.\n // We don't need to do anything here.\n }\n\n async releaseMigrationLock(): Promise<void> {\n // SQLite only has one connection that's reserved by the migration system\n // for the whole time between acquireMigrationLock and releaseMigrationLock.\n // We don't need to do anything here.\n }\n get supportsOutput(): boolean {\n return true;\n }\n}\n\n/**\n * Config for the SQLite dialect.\n */\nexport interface NodeSqliteDialectConfig {\n /**\n * A sqlite DatabaseSync instance or a function that returns one.\n */\n database: DatabaseSync;\n\n /**\n * Called once when the first query is executed.\n */\n onCreateConnection?:\n | ((connection: DatabaseConnection) => Promise<void>)\n | undefined;\n}\n\nclass NodeSqliteDriver implements Driver {\n readonly #config: NodeSqliteDialectConfig;\n readonly #connectionMutex = new ConnectionMutex();\n\n #db?: DatabaseSync;\n #connection?: DatabaseConnection;\n\n constructor(config: NodeSqliteDialectConfig) {\n this.#config = { ...config };\n }\n\n async init(): Promise<void> {\n this.#db = this.#config.database;\n\n this.#connection = new NodeSqliteConnection(this.#db);\n\n if (this.#config.onCreateConnection) {\n await this.#config.onCreateConnection(this.#connection);\n }\n }\n\n async acquireConnection(): Promise<DatabaseConnection> {\n // SQLite only has one single connection. We use a mutex here to wait\n // until the single connection has been released.\n await this.#connectionMutex.lock();\n return this.#connection!;\n }\n\n async beginTransaction(connection: DatabaseConnection): Promise<void> {\n await connection.executeQuery(CompiledQuery.raw(\"begin\"));\n }\n\n async commitTransaction(connection: DatabaseConnection): Promise<void> {\n await connection.executeQuery(CompiledQuery.raw(\"commit\"));\n }\n\n async rollbackTransaction(connection: DatabaseConnection): Promise<void> {\n await connection.executeQuery(CompiledQuery.raw(\"rollback\"));\n }\n\n async releaseConnection(): Promise<void> {\n this.#connectionMutex.unlock();\n }\n\n async destroy(): Promise<void> {\n this.#db?.close();\n }\n}\n\nclass NodeSqliteConnection implements DatabaseConnection {\n readonly #db: DatabaseSync;\n\n constructor(db: DatabaseSync) {\n this.#db = db;\n }\n\n executeQuery<O>(compiledQuery: CompiledQuery): Promise<QueryResult<O>> {\n const { sql, parameters } = compiledQuery;\n const stmt = this.#db.prepare(sql);\n\n const rows = stmt.all(...(parameters as any[])) as O[];\n\n return Promise.resolve({\n rows,\n });\n }\n\n async *streamQuery() {\n throw new Error(\"Streaming query is not supported by SQLite driver.\");\n }\n}\n\nclass ConnectionMutex {\n #promise?: Promise<void>;\n #resolve?: () => void;\n\n async lock(): Promise<void> {\n while (this.#promise) {\n await this.#promise;\n }\n\n this.#promise = new Promise((resolve) => {\n this.#resolve = resolve;\n });\n }\n\n unlock(): void {\n const resolve = this.#resolve;\n\n this.#promise = undefined;\n this.#resolve = undefined;\n\n resolve?.();\n }\n}\n\nclass NodeSqliteIntrospector implements DatabaseIntrospector {\n readonly #db: Kysely<unknown>;\n\n constructor(db: Kysely<unknown>) {\n this.#db = db;\n }\n\n async getSchemas(): Promise<SchemaMetadata[]> {\n // Sqlite doesn't support schemas.\n return [];\n }\n\n async getTables(\n options: DatabaseMetadataOptions = { withInternalKyselyTables: false },\n ): Promise<TableMetadata[]> {\n let query = this.#db\n // @ts-expect-error\n .selectFrom(\"sqlite_schema\")\n // @ts-expect-error\n .where(\"type\", \"=\", \"table\")\n // @ts-expect-error\n .where(\"name\", \"not like\", \"sqlite_%\")\n .select(\"name\")\n .$castTo<{ name: string }>();\n\n if (!options.withInternalKyselyTables) {\n query = query\n // @ts-expect-error\n .where(\"name\", \"!=\", DEFAULT_MIGRATION_TABLE)\n // @ts-expect-error\n .where(\"name\", \"!=\", DEFAULT_MIGRATION_LOCK_TABLE);\n }\n\n const tables = await query.execute();\n return Promise.all(tables.map(({ name }) => this.#getTableMetadata(name)));\n }\n\n async getMetadata(\n options?: DatabaseMetadataOptions | undefined,\n ): Promise<DatabaseMetadata> {\n return {\n tables: await this.getTables(options),\n };\n }\n\n async #getTableMetadata(table: string): Promise<TableMetadata> {\n const db = this.#db;\n\n // Get the SQL that was used to create the table.\n const createSql = await db\n // @ts-expect-error\n .selectFrom(\"sqlite_master\")\n // @ts-expect-error\n .where(\"name\", \"=\", table)\n .select(\"sql\")\n .$castTo<{ sql: string | undefined }>()\n .execute();\n\n // Try to find the name of the column that has `autoincrement` >&\n const autoIncrementCol = createSql[0]?.sql\n ?.split(/[\\(\\),]/)\n ?.find((it) => it.toLowerCase().includes(\"autoincrement\"))\n ?.split(/\\s+/)?.[0]\n ?.replace(/[\"`]/g, \"\");\n\n const columns = await db\n .selectFrom(\n sql<{\n name: string;\n type: string;\n notnull: 0 | 1;\n dflt_value: any;\n }>`pragma_table_info(${table})`.as(\"table_info\"),\n )\n .select([\"name\", \"type\", \"notnull\", \"dflt_value\"])\n .execute();\n\n return {\n name: table,\n columns: columns.map((col) => ({\n name: col.name,\n dataType: col.type,\n isNullable: !col.notnull,\n isAutoIncrementing: col.name === autoIncrementCol,\n hasDefaultValue: col.dflt_value != null,\n })),\n isView: true,\n };\n }\n}\n\nclass NodeSqliteQueryCompiler extends DefaultQueryCompiler {\n protected override getCurrentParameterPlaceholder() {\n return \"?\";\n }\n\n protected override getLeftIdentifierWrapper(): string {\n return '\"';\n }\n\n protected override getRightIdentifierWrapper(): string {\n return '\"';\n }\n\n protected override getAutoIncrement() {\n return \"autoincrement\";\n }\n}\n\nexport class NodeSqliteDialect implements Dialect {\n readonly #config: NodeSqliteDialectConfig;\n\n constructor(config: NodeSqliteDialectConfig) {\n this.#config = { ...config };\n }\n\n createDriver(): Driver {\n return new NodeSqliteDriver(this.#config);\n }\n\n createQueryCompiler(): QueryCompiler {\n return new NodeSqliteQueryCompiler();\n }\n\n createAdapter(): DialectAdapter {\n return new NodeSqliteAdapter();\n }\n\n createIntrospector(db: Kysely<any>): DatabaseIntrospector {\n return new NodeSqliteIntrospector(db);\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { DBAdapter, DBAdapterDebugLogOption, PecuniaOptions } from "pecunia-core";
|
|
2
|
+
import { Db, MongoClient } from "mongodb";
|
|
3
|
+
|
|
4
|
+
//#region src/adapters/mongodb/index.d.ts
|
|
5
|
+
interface MongoDBAdapterConfig {
|
|
6
|
+
/**
|
|
7
|
+
* MongoDB client instance
|
|
8
|
+
* If not provided, Database transactions won't be enabled.
|
|
9
|
+
*/
|
|
10
|
+
client?: MongoClient | undefined;
|
|
11
|
+
/**
|
|
12
|
+
* Enable debug logs for the adapter
|
|
13
|
+
*
|
|
14
|
+
* @default false
|
|
15
|
+
*/
|
|
16
|
+
debugLogs?: DBAdapterDebugLogOption | undefined;
|
|
17
|
+
/**
|
|
18
|
+
* Use plural table names
|
|
19
|
+
*
|
|
20
|
+
* @default false
|
|
21
|
+
*/
|
|
22
|
+
usePlural?: boolean | undefined;
|
|
23
|
+
/**
|
|
24
|
+
* Whether to execute multiple operations in a transaction.
|
|
25
|
+
*
|
|
26
|
+
* If the database doesn't support transactions,
|
|
27
|
+
* set this to `false` and operations will be executed sequentially.
|
|
28
|
+
* @default false
|
|
29
|
+
*/
|
|
30
|
+
transaction?: boolean | undefined;
|
|
31
|
+
}
|
|
32
|
+
declare const mongodbAdapter: (db: Db, config?: MongoDBAdapterConfig | undefined) => (options: PecuniaOptions) => DBAdapter<PecuniaOptions>;
|
|
33
|
+
//#endregion
|
|
34
|
+
export { MongoDBAdapterConfig, mongodbAdapter };
|
|
35
|
+
//# sourceMappingURL=index.d.mts.map
|