@kamod-ch/otok-kysely 1.0.0
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/LICENSE +21 -0
- package/README.md +86 -0
- package/dist/cli/index.d.ts +12 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +66 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/context.d.ts +5 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +17 -0
- package/dist/context.js.map +1 -0
- package/dist/dialects/index.d.ts +2 -0
- package/dist/dialects/index.d.ts.map +1 -0
- package/dist/dialects/index.js +2 -0
- package/dist/dialects/index.js.map +1 -0
- package/dist/dialects/mysql.d.ts +13 -0
- package/dist/dialects/mysql.d.ts.map +1 -0
- package/dist/dialects/mysql.js +38 -0
- package/dist/dialects/mysql.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/kysely.test-d.d.ts +2 -0
- package/dist/kysely.test-d.d.ts.map +1 -0
- package/dist/kysely.test-d.js +9 -0
- package/dist/kysely.test-d.js.map +1 -0
- package/dist/loader.d.ts +26 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +34 -0
- package/dist/loader.js.map +1 -0
- package/dist/migrations/index.d.ts +3 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +2 -0
- package/dist/migrations/index.js.map +1 -0
- package/dist/migrations/runner.d.ts +10 -0
- package/dist/migrations/runner.d.ts.map +1 -0
- package/dist/migrations/runner.js +106 -0
- package/dist/migrations/runner.js.map +1 -0
- package/dist/plugin.d.ts +7 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +76 -0
- package/dist/plugin.js.map +1 -0
- package/dist/pool.d.ts +8 -0
- package/dist/pool.d.ts.map +1 -0
- package/dist/pool.js +55 -0
- package/dist/pool.js.map +1 -0
- package/dist/registry.d.ts +7 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +18 -0
- package/dist/registry.js.map +1 -0
- package/dist/seeds/index.d.ts +2 -0
- package/dist/seeds/index.d.ts.map +1 -0
- package/dist/seeds/index.js +2 -0
- package/dist/seeds/index.js.map +1 -0
- package/dist/seeds/runner.d.ts +7 -0
- package/dist/seeds/runner.d.ts.map +1 -0
- package/dist/seeds/runner.js +40 -0
- package/dist/seeds/runner.js.map +1 -0
- package/dist/setup.d.ts +3 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +56 -0
- package/dist/setup.js.map +1 -0
- package/dist/test/index.d.ts +19 -0
- package/dist/test/index.d.ts.map +1 -0
- package/dist/test/index.js +28 -0
- package/dist/test/index.js.map +1 -0
- package/dist/transaction.d.ts +7 -0
- package/dist/transaction.d.ts.map +1 -0
- package/dist/transaction.js +8 -0
- package/dist/transaction.js.map +1 -0
- package/dist/types.d.ts +67 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +106 -0
package/dist/plugin.js
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { definePlugin } from "@kamod-ch/otok";
|
|
2
|
+
import { createKyselyInstance, destroyKyselyInstance, isEdgeCapable, resolveConnectionString } from "./pool.js";
|
|
3
|
+
import { registerKyselyRuntime } from "./registry.js";
|
|
4
|
+
function resolveMigrationsConfig(options) {
|
|
5
|
+
return {
|
|
6
|
+
directory: options.migrations?.directory ?? "migrations",
|
|
7
|
+
tableName: options.migrations?.tableName ?? "otok_migrations",
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
function resolveSeedsConfig(options) {
|
|
11
|
+
return {
|
|
12
|
+
directory: options.seeds?.directory ?? "seeds",
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export async function configureKyselyApp(app, options) {
|
|
16
|
+
const connectionString = resolveConnectionString(options.connectionString);
|
|
17
|
+
const contextKey = options.contextKey ?? "db";
|
|
18
|
+
const db = await createKyselyInstance(options.dialect, connectionString, options.pool);
|
|
19
|
+
const runtime = {
|
|
20
|
+
db: db,
|
|
21
|
+
contextKey,
|
|
22
|
+
dialect: options.dialect,
|
|
23
|
+
connectionString,
|
|
24
|
+
migrations: resolveMigrationsConfig(options),
|
|
25
|
+
seeds: resolveSeedsConfig(options),
|
|
26
|
+
edgeCapable: isEdgeCapable(options.dialect),
|
|
27
|
+
};
|
|
28
|
+
registerKyselyRuntime(runtime);
|
|
29
|
+
app.use("*", async (c, next) => {
|
|
30
|
+
c.set(contextKey, db);
|
|
31
|
+
await next();
|
|
32
|
+
});
|
|
33
|
+
return runtime;
|
|
34
|
+
}
|
|
35
|
+
const kyselyPluginFactory = definePlugin({
|
|
36
|
+
name: "@kamod-ch/otok-kysely",
|
|
37
|
+
version: "1.0.0",
|
|
38
|
+
schema: {
|
|
39
|
+
parse(input) {
|
|
40
|
+
if (!input || typeof input !== "object") {
|
|
41
|
+
throw new Error("kysely() options must be an object");
|
|
42
|
+
}
|
|
43
|
+
const record = input;
|
|
44
|
+
if (!record.dialect) {
|
|
45
|
+
throw new Error("kysely() requires a dialect (postgres, sqlite, or DialectAdapter)");
|
|
46
|
+
}
|
|
47
|
+
return input;
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
envSchema: {
|
|
51
|
+
parse(input) {
|
|
52
|
+
const url = input.DATABASE_URL;
|
|
53
|
+
if (url !== undefined && !url) {
|
|
54
|
+
throw new Error("otok-kysely: DATABASE_URL must not be empty when set");
|
|
55
|
+
}
|
|
56
|
+
return { databaseUrl: url };
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
/** Otok plugin factory — register in otok.config.ts plugins array. */
|
|
61
|
+
export default function kysely(options) {
|
|
62
|
+
const plugin = kyselyPluginFactory(options);
|
|
63
|
+
let runtime = null;
|
|
64
|
+
plugin.configureApp = async ({ app }) => {
|
|
65
|
+
runtime = await configureKyselyApp(app, options);
|
|
66
|
+
};
|
|
67
|
+
plugin.buildEnd = async () => {
|
|
68
|
+
if (runtime) {
|
|
69
|
+
await destroyKyselyInstance(runtime.db);
|
|
70
|
+
runtime = null;
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
return plugin;
|
|
74
|
+
}
|
|
75
|
+
export { dbFromHono, getDb } from "./context.js";
|
|
76
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
|
package/dist/pool.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Kysely } from "kysely";
|
|
2
|
+
import type { BuiltInDialect, DialectAdapter, PoolOptions } from "./types.js";
|
|
3
|
+
export declare function resolveConnectionString(explicit?: string): string;
|
|
4
|
+
export declare function isDialectAdapter(dialect: BuiltInDialect | DialectAdapter): dialect is DialectAdapter;
|
|
5
|
+
export declare function isEdgeCapable(dialect: BuiltInDialect | DialectAdapter): boolean;
|
|
6
|
+
export declare function createKyselyInstance<DB>(dialect: BuiltInDialect | DialectAdapter, connectionString: string, pool?: PoolOptions): Promise<Kysely<DB>>;
|
|
7
|
+
export declare function destroyKyselyInstance(db: Kysely<any>): Promise<void>;
|
|
8
|
+
//# sourceMappingURL=pool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pool.d.ts","sourceRoot":"","sources":["../src/pool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAyB,WAAW,EAAE,MAAM,YAAY,CAAC;AAErG,wBAAgB,uBAAuB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAMjE;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,cAAc,GAAG,cAAc,GAAG,OAAO,IAAI,cAAc,CAEpG;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,cAAc,GAAG,OAAO,CAK/E;AAED,wBAAsB,oBAAoB,CAAC,EAAE,EAC3C,OAAO,EAAE,cAAc,GAAG,cAAc,EACxC,gBAAgB,EAAE,MAAM,EACxB,IAAI,CAAC,EAAE,WAAW,GACjB,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAkCrB;AAED,wBAAsB,qBAAqB,CAAC,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAE1E"}
|
package/dist/pool.js
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { Kysely } from "kysely";
|
|
2
|
+
export function resolveConnectionString(explicit) {
|
|
3
|
+
const value = explicit ?? process.env.DATABASE_URL;
|
|
4
|
+
if (!value) {
|
|
5
|
+
throw new Error("otok-kysely: provide connectionString or set DATABASE_URL environment variable.");
|
|
6
|
+
}
|
|
7
|
+
return value;
|
|
8
|
+
}
|
|
9
|
+
export function isDialectAdapter(dialect) {
|
|
10
|
+
return typeof dialect === "object" && dialect !== null && "createDialect" in dialect;
|
|
11
|
+
}
|
|
12
|
+
export function isEdgeCapable(dialect) {
|
|
13
|
+
if (isDialectAdapter(dialect)) {
|
|
14
|
+
return dialect.edgeCapable ?? false;
|
|
15
|
+
}
|
|
16
|
+
return dialect === "sqlite";
|
|
17
|
+
}
|
|
18
|
+
export async function createKyselyInstance(dialect, connectionString, pool) {
|
|
19
|
+
const options = { connectionString, pool };
|
|
20
|
+
if (isDialectAdapter(dialect)) {
|
|
21
|
+
const kyselyDialect = await dialect.createDialect(options);
|
|
22
|
+
return new Kysely({ dialect: kyselyDialect });
|
|
23
|
+
}
|
|
24
|
+
switch (dialect) {
|
|
25
|
+
case "postgres": {
|
|
26
|
+
const { PostgresDialect } = await import("kysely");
|
|
27
|
+
let Pool;
|
|
28
|
+
try {
|
|
29
|
+
({ Pool } = await import("pg"));
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
throw new Error("otok-kysely: install `pg` to use the postgres dialect.");
|
|
33
|
+
}
|
|
34
|
+
const pgPool = new Pool({
|
|
35
|
+
connectionString,
|
|
36
|
+
min: pool?.min,
|
|
37
|
+
max: pool?.max ?? 10,
|
|
38
|
+
});
|
|
39
|
+
return new Kysely({ dialect: new PostgresDialect({ pool: pgPool }) });
|
|
40
|
+
}
|
|
41
|
+
case "sqlite": {
|
|
42
|
+
const { SqliteDialect } = await import("kysely");
|
|
43
|
+
const Database = (await import("better-sqlite3")).default;
|
|
44
|
+
const filename = connectionString.replace(/^sqlite:\/\//, "");
|
|
45
|
+
const sqlite = new Database(filename);
|
|
46
|
+
return new Kysely({ dialect: new SqliteDialect({ database: sqlite }) });
|
|
47
|
+
}
|
|
48
|
+
default:
|
|
49
|
+
throw new Error(`otok-kysely: unsupported dialect "${String(dialect)}".`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
export async function destroyKyselyInstance(db) {
|
|
53
|
+
await db.destroy();
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=pool.js.map
|
package/dist/pool.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pool.js","sourceRoot":"","sources":["../src/pool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGhC,MAAM,UAAU,uBAAuB,CAAC,QAAiB;IACvD,MAAM,KAAK,GAAG,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IACnD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,iFAAiF,CAAC,CAAC;IACrG,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAwC;IACvE,OAAO,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,IAAI,eAAe,IAAI,OAAO,CAAC;AACvF,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAwC;IACpE,IAAI,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9B,OAAO,OAAO,CAAC,WAAW,IAAI,KAAK,CAAC;IACtC,CAAC;IACD,OAAO,OAAO,KAAK,QAAQ,CAAC;AAC9B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,OAAwC,EACxC,gBAAwB,EACxB,IAAkB;IAElB,MAAM,OAAO,GAA0B,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC;IAElE,IAAI,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9B,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC3D,OAAO,IAAI,MAAM,CAAK,EAAE,OAAO,EAAE,aAAsB,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;YACnD,IAAI,IAA8B,CAAC;YACnC,IAAI,CAAC;gBACH,CAAC,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;YAClC,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;YAC5E,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC;gBACtB,gBAAgB;gBAChB,GAAG,EAAE,IAAI,EAAE,GAAG;gBACd,GAAG,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE;aACrB,CAAC,CAAC;YACH,OAAO,IAAI,MAAM,CAAK,EAAE,OAAO,EAAE,IAAI,eAAe,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QAC5E,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;YACjD,MAAM,QAAQ,GAAG,CAAC,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC;YAC1D,MAAM,QAAQ,GAAG,gBAAgB,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;YAC9D,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACtC,OAAO,IAAI,MAAM,CAAK,EAAE,OAAO,EAAE,IAAI,aAAa,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9E,CAAC;QACD;YACE,MAAM,IAAI,KAAK,CAAC,qCAAqC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9E,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,EAAe;IACzD,MAAM,EAAE,CAAC,OAAO,EAAE,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { KyselyRuntime } from "./types.js";
|
|
2
|
+
/** @internal Test helper */
|
|
3
|
+
export declare function resetKyselyRuntimeForTests(): void;
|
|
4
|
+
export declare function registerKyselyRuntime<DB>(value: KyselyRuntime<DB>): void;
|
|
5
|
+
export declare function getKyselyRuntime<DB = unknown>(): KyselyRuntime<DB>;
|
|
6
|
+
export declare function tryGetKyselyRuntime<DB = unknown>(): KyselyRuntime<DB> | null;
|
|
7
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAIhD,4BAA4B;AAC5B,wBAAgB,0BAA0B,IAAI,IAAI,CAEjD;AAED,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,KAAK,EAAE,aAAa,CAAC,EAAE,CAAC,GAAG,IAAI,CAExE;AAED,wBAAgB,gBAAgB,CAAC,EAAE,GAAG,OAAO,KAAK,aAAa,CAAC,EAAE,CAAC,CAKlE;AAED,wBAAgB,mBAAmB,CAAC,EAAE,GAAG,OAAO,KAAK,aAAa,CAAC,EAAE,CAAC,GAAG,IAAI,CAE5E"}
|
package/dist/registry.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
let runtime = null;
|
|
2
|
+
/** @internal Test helper */
|
|
3
|
+
export function resetKyselyRuntimeForTests() {
|
|
4
|
+
runtime = null;
|
|
5
|
+
}
|
|
6
|
+
export function registerKyselyRuntime(value) {
|
|
7
|
+
runtime = value;
|
|
8
|
+
}
|
|
9
|
+
export function getKyselyRuntime() {
|
|
10
|
+
if (!runtime) {
|
|
11
|
+
throw new Error("otok-kysely: no database runtime registered. Add kysely() to otok.config.ts plugins.");
|
|
12
|
+
}
|
|
13
|
+
return runtime;
|
|
14
|
+
}
|
|
15
|
+
export function tryGetKyselyRuntime() {
|
|
16
|
+
return runtime;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAEA,IAAI,OAAO,GAAyB,IAAI,CAAC;AAEzC,4BAA4B;AAC5B,MAAM,UAAU,0BAA0B;IACxC,OAAO,GAAG,IAAI,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAK,KAAwB;IAChE,OAAO,GAAG,KAAsB,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,sFAAsF,CAAC,CAAC;IAC1G,CAAC;IACD,OAAO,OAA4B,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO,OAAmC,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/seeds/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/seeds/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Kysely } from "kysely";
|
|
2
|
+
export declare function loadSeedModules(directory: string): Promise<Array<{
|
|
3
|
+
name: string;
|
|
4
|
+
run: (db: Kysely<unknown>) => Promise<void>;
|
|
5
|
+
}>>;
|
|
6
|
+
export declare function runSeeds(db: Kysely<unknown>, directory: string): Promise<string[]>;
|
|
7
|
+
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/seeds/runner.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGrC,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAAC,CAAC,CA4B/E;AAED,wBAAsB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAUxF"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { readdir } from "node:fs/promises";
|
|
2
|
+
import { join, extname } from "node:path";
|
|
3
|
+
import { pathToFileURL } from "node:url";
|
|
4
|
+
export async function loadSeedModules(directory) {
|
|
5
|
+
let entries;
|
|
6
|
+
try {
|
|
7
|
+
entries = await readdir(directory);
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return [];
|
|
11
|
+
}
|
|
12
|
+
const seeds = [];
|
|
13
|
+
for (const entry of entries.sort()) {
|
|
14
|
+
const ext = extname(entry);
|
|
15
|
+
if (ext !== ".ts" && ext !== ".js" && ext !== ".mts" && ext !== ".mjs")
|
|
16
|
+
continue;
|
|
17
|
+
const modulePath = pathToFileURL(join(directory, entry)).href;
|
|
18
|
+
const mod = (await import(modulePath));
|
|
19
|
+
const handler = mod.default ?? mod.seed;
|
|
20
|
+
if (typeof handler !== "function")
|
|
21
|
+
continue;
|
|
22
|
+
seeds.push({
|
|
23
|
+
name: entry.replace(/\.(ts|js|mts|mjs)$/, ""),
|
|
24
|
+
run: async (db) => {
|
|
25
|
+
await handler(db);
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
return seeds;
|
|
30
|
+
}
|
|
31
|
+
export async function runSeeds(db, directory) {
|
|
32
|
+
const seeds = await loadSeedModules(directory);
|
|
33
|
+
const ran = [];
|
|
34
|
+
for (const seed of seeds) {
|
|
35
|
+
await seed.run(db);
|
|
36
|
+
ran.push(seed.name);
|
|
37
|
+
}
|
|
38
|
+
return ran;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/seeds/runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAIzC,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,SAAiB;IAEjB,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,KAAK,GAAyE,EAAE,CAAC;IAEvF,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QAC3B,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,MAAM;YAAE,SAAS;QAEjF,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QAC9D,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,UAAU,CAAC,CAAe,CAAC;QACrD,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC;QACxC,IAAI,OAAO,OAAO,KAAK,UAAU;YAAE,SAAS;QAE5C,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC;YAC7C,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;gBAChB,MAAM,OAAO,CAAC,EAAE,CAAC,CAAC;YACpB,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,EAAmB,EAAE,SAAiB;IACnE,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,SAAS,CAAC,CAAC;IAC/C,MAAM,GAAG,GAAa,EAAE,CAAC;IAEzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
|
package/dist/setup.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":";AAeA,wBAgDG"}
|
package/dist/setup.js
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { defineSetup } from "@kamod-ch/otok";
|
|
2
|
+
import { mkdir, access } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { constants } from "node:fs";
|
|
5
|
+
const INITIAL_MIGRATION_UP = `-- otok-kysely initial migration
|
|
6
|
+
CREATE TABLE IF NOT EXISTS otok_migrations (
|
|
7
|
+
name TEXT PRIMARY KEY,
|
|
8
|
+
applied_at TEXT NOT NULL
|
|
9
|
+
);
|
|
10
|
+
`;
|
|
11
|
+
const INITIAL_MIGRATION_DOWN = `DROP TABLE IF EXISTS otok_migrations;
|
|
12
|
+
`;
|
|
13
|
+
export default defineSetup(async ({ root, dryRun }) => {
|
|
14
|
+
const migrationsDir = join(root, "migrations");
|
|
15
|
+
const seedsDir = join(root, "seeds");
|
|
16
|
+
const changes = [];
|
|
17
|
+
if (!dryRun) {
|
|
18
|
+
await mkdir(migrationsDir, { recursive: true });
|
|
19
|
+
await mkdir(seedsDir, { recursive: true });
|
|
20
|
+
}
|
|
21
|
+
const initialUp = join(migrationsDir, "20260101000000_initial.up.sql");
|
|
22
|
+
const _initialDown = join(migrationsDir, "20260101000000_initial.down.sql");
|
|
23
|
+
let needsInitial = true;
|
|
24
|
+
if (!dryRun) {
|
|
25
|
+
try {
|
|
26
|
+
await access(initialUp, constants.F_OK);
|
|
27
|
+
needsInitial = false;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
// create initial migration
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (needsInitial) {
|
|
34
|
+
changes.push({
|
|
35
|
+
kind: "create-file",
|
|
36
|
+
path: "migrations/20260101000000_initial.up.sql",
|
|
37
|
+
content: INITIAL_MIGRATION_UP,
|
|
38
|
+
});
|
|
39
|
+
changes.push({
|
|
40
|
+
kind: "create-file",
|
|
41
|
+
path: "migrations/20260101000000_initial.down.sql",
|
|
42
|
+
content: INITIAL_MIGRATION_DOWN,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
changes.push({
|
|
46
|
+
kind: "mkdir",
|
|
47
|
+
path: "seeds",
|
|
48
|
+
});
|
|
49
|
+
changes.push({
|
|
50
|
+
kind: "append-file",
|
|
51
|
+
path: ".env.example",
|
|
52
|
+
content: "\n# Database connection (server-only — never expose to client)\nDATABASE_URL=sqlite://./data/app.db\n",
|
|
53
|
+
});
|
|
54
|
+
return { changes };
|
|
55
|
+
});
|
|
56
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA2B,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEpC,MAAM,oBAAoB,GAAG;;;;;CAK5B,CAAC;AAEF,MAAM,sBAAsB,GAAG;CAC9B,CAAC;AAEF,eAAe,WAAW,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAsB,EAAE,EAAE;IACxE,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACrC,MAAM,OAAO,GAAG,EAAE,CAAC;IAEnB,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,KAAK,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE,+BAA+B,CAAC,CAAC;IACvE,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,EAAE,iCAAiC,CAAC,CAAC;IAE5E,IAAI,YAAY,GAAG,IAAI,CAAC;IACxB,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;YACxC,YAAY,GAAG,KAAK,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC;YACP,2BAA2B;QAC7B,CAAC;IACH,CAAC;IAED,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,aAAsB;YAC5B,IAAI,EAAE,0CAA0C;YAChD,OAAO,EAAE,oBAAoB;SAC9B,CAAC,CAAC;QACH,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,aAAsB;YAC5B,IAAI,EAAE,4CAA4C;YAClD,OAAO,EAAE,sBAAsB;SAChC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CAAC,IAAI,CAAC;QACX,IAAI,EAAE,OAAgB;QACtB,IAAI,EAAE,OAAO;KACd,CAAC,CAAC;IAEH,OAAO,CAAC,IAAI,CAAC;QACX,IAAI,EAAE,aAAsB;QAC5B,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,uGAAuG;KACjH,CAAC,CAAC;IAEH,OAAO,EAAE,OAAO,EAAE,CAAC;AACrB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Kysely } from "kysely";
|
|
2
|
+
import type { BuiltInDialect, DialectAdapter } from "../types.js";
|
|
3
|
+
export interface TestDatabaseOptions {
|
|
4
|
+
dialect?: BuiltInDialect | DialectAdapter;
|
|
5
|
+
migrationsDirectory?: string;
|
|
6
|
+
migrationsTableName?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface TestDatabase<DB = unknown> {
|
|
9
|
+
db: Kysely<DB>;
|
|
10
|
+
connectionString: string;
|
|
11
|
+
cleanup: () => Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Create an isolated test database with optional migrations applied.
|
|
15
|
+
* Uses a temporary SQLite file by default.
|
|
16
|
+
*/
|
|
17
|
+
export declare function createTestDatabase<DB = unknown>(options?: TestDatabaseOptions): Promise<TestDatabase<DB>>;
|
|
18
|
+
export { createTestDatabase as default };
|
|
19
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGrC,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElE,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,cAAc,GAAG,cAAc,CAAC;IAC1C,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,YAAY,CAAC,EAAE,GAAG,OAAO;IACxC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,EAAE,GAAG,OAAO,EAAE,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAsBnH;AAED,OAAO,EAAE,kBAAkB,IAAI,OAAO,EAAE,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { mkdtemp, rm } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { createKyselyInstance, destroyKyselyInstance } from "../pool.js";
|
|
5
|
+
import { migrateUp } from "../migrations/runner.js";
|
|
6
|
+
/**
|
|
7
|
+
* Create an isolated test database with optional migrations applied.
|
|
8
|
+
* Uses a temporary SQLite file by default.
|
|
9
|
+
*/
|
|
10
|
+
export async function createTestDatabase(options = {}) {
|
|
11
|
+
const dialect = options.dialect ?? "sqlite";
|
|
12
|
+
const dir = await mkdtemp(join(tmpdir(), "otok-kysely-test-"));
|
|
13
|
+
const connectionString = `sqlite://${join(dir, "test.db")}`;
|
|
14
|
+
const db = await createKyselyInstance(dialect, connectionString);
|
|
15
|
+
if (options.migrationsDirectory) {
|
|
16
|
+
await migrateUp(db, options.migrationsDirectory, options.migrationsTableName ?? "otok_migrations");
|
|
17
|
+
}
|
|
18
|
+
return {
|
|
19
|
+
db,
|
|
20
|
+
connectionString,
|
|
21
|
+
cleanup: async () => {
|
|
22
|
+
await destroyKyselyInstance(db);
|
|
23
|
+
await rm(dir, { recursive: true, force: true });
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export { createTestDatabase as default };
|
|
28
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/test/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAepD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAe,UAA+B,EAAE;IACtF,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,QAAQ,CAAC;IAC5C,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAC/D,MAAM,gBAAgB,GAAG,YAAY,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,CAAC;IAC5D,MAAM,EAAE,GAAG,MAAM,oBAAoB,CAAK,OAAO,EAAE,gBAAgB,CAAC,CAAC;IAErE,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;QAChC,MAAM,SAAS,CACb,EAAqB,EACrB,OAAO,CAAC,mBAAmB,EAC3B,OAAO,CAAC,mBAAmB,IAAI,iBAAiB,CACjD,CAAC;IACJ,CAAC;IAED,OAAO;QACL,EAAE;QACF,gBAAgB;QAChB,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,qBAAqB,CAAC,EAAE,CAAC,CAAC;YAChC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,CAAC;KACF,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,kBAAkB,IAAI,OAAO,EAAE,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Kysely, Transaction } from "kysely";
|
|
2
|
+
/**
|
|
3
|
+
* Run a callback inside a database transaction.
|
|
4
|
+
* Rolls back automatically when the callback throws.
|
|
5
|
+
*/
|
|
6
|
+
export declare function withTransaction<DB, T>(db: Kysely<DB>, callback: (trx: Transaction<DB>) => Promise<T>): Promise<T>;
|
|
7
|
+
//# sourceMappingURL=transaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../src/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAElD;;;GAGG;AACH,wBAAsB,eAAe,CAAC,EAAE,EAAE,CAAC,EACzC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,EACd,QAAQ,EAAE,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GAC7C,OAAO,CAAC,CAAC,CAAC,CAEZ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transaction.js","sourceRoot":"","sources":["../src/transaction.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,EAAc,EACd,QAA8C;IAE9C,OAAO,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AAC5C,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type { Kysely } from "kysely";
|
|
2
|
+
/** Built-in dialect identifiers. Use `DialectAdapter` for custom drivers (e.g. MySQL variants). */
|
|
3
|
+
export type BuiltInDialect = "postgres" | "sqlite";
|
|
4
|
+
export interface DialectAdapter {
|
|
5
|
+
/** Create a Kysely-compatible dialect instance. */
|
|
6
|
+
createDialect(options: DialectConnectOptions): unknown | Promise<unknown>;
|
|
7
|
+
/** Whether this dialect can run in edge/worker runtimes. */
|
|
8
|
+
edgeCapable?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface DialectConnectOptions {
|
|
11
|
+
connectionString: string;
|
|
12
|
+
pool?: PoolOptions;
|
|
13
|
+
}
|
|
14
|
+
export interface PoolOptions {
|
|
15
|
+
min?: number;
|
|
16
|
+
max?: number;
|
|
17
|
+
}
|
|
18
|
+
export interface MigrationsConfig {
|
|
19
|
+
/** Project-relative migrations directory. Default: `migrations/`. */
|
|
20
|
+
directory?: string;
|
|
21
|
+
/** Table tracking applied migrations. Default: `otok_migrations`. */
|
|
22
|
+
tableName?: string;
|
|
23
|
+
}
|
|
24
|
+
export interface SeedsConfig {
|
|
25
|
+
/** Project-relative seeds directory. Default: `seeds/`. */
|
|
26
|
+
directory?: string;
|
|
27
|
+
}
|
|
28
|
+
export interface KyselyPluginOptions<_DB = unknown> {
|
|
29
|
+
/** Built-in dialect name or custom adapter. MySQL: pass a `DialectAdapter` from `./dialects/mysql`. */
|
|
30
|
+
dialect: BuiltInDialect | DialectAdapter;
|
|
31
|
+
/** Connection string. Prefer env.DATABASE_URL via envSchema. */
|
|
32
|
+
connectionString?: string;
|
|
33
|
+
migrations?: MigrationsConfig;
|
|
34
|
+
seeds?: SeedsConfig;
|
|
35
|
+
pool?: PoolOptions;
|
|
36
|
+
/** Hono context key for the db instance. Default: `db`. */
|
|
37
|
+
contextKey?: string;
|
|
38
|
+
}
|
|
39
|
+
export interface KyselyRuntime<DB = unknown> {
|
|
40
|
+
db: Kysely<DB>;
|
|
41
|
+
contextKey: string;
|
|
42
|
+
dialect: BuiltInDialect | DialectAdapter;
|
|
43
|
+
connectionString: string;
|
|
44
|
+
migrations: Required<MigrationsConfig>;
|
|
45
|
+
seeds: Required<SeedsConfig>;
|
|
46
|
+
edgeCapable: boolean;
|
|
47
|
+
}
|
|
48
|
+
export interface MigrationRecord {
|
|
49
|
+
name: string;
|
|
50
|
+
appliedAt: Date;
|
|
51
|
+
}
|
|
52
|
+
export interface MigrationFile {
|
|
53
|
+
name: string;
|
|
54
|
+
up: string;
|
|
55
|
+
down: string;
|
|
56
|
+
}
|
|
57
|
+
export interface MigrationStatus {
|
|
58
|
+
name: string;
|
|
59
|
+
applied: boolean;
|
|
60
|
+
appliedAt?: Date;
|
|
61
|
+
}
|
|
62
|
+
export interface SeedModule {
|
|
63
|
+
default?: (db: Kysely<unknown>) => void | Promise<void>;
|
|
64
|
+
seed?: (db: Kysely<unknown>) => void | Promise<void>;
|
|
65
|
+
}
|
|
66
|
+
export type { Kysely };
|
|
67
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAErC,mGAAmG;AACnG,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,QAAQ,CAAC;AAEnD,MAAM,WAAW,cAAc;IAC7B,mDAAmD;IACnD,aAAa,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1E,4DAA4D;IAC5D,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,qBAAqB;IACpC,gBAAgB,EAAE,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,qEAAqE;IACrE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB,CAAC,GAAG,GAAG,OAAO;IAChD,uGAAuG;IACvG,OAAO,EAAE,cAAc,GAAG,cAAc,CAAC;IACzC,gEAAgE;IAChE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,2DAA2D;IAC3D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa,CAAC,EAAE,GAAG,OAAO;IACzC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,cAAc,GAAG,cAAc,CAAC;IACzC,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IACvC,KAAK,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC7B,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,IAAI,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtD;AAED,YAAY,EAAE,MAAM,EAAE,CAAC"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@kamod-ch/otok-kysely",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Kysely database integration for Otok — typed db context, migrations, seeds, and CLI.",
|
|
5
|
+
"homepage": "https://github.com/kamod-ch/otok/tree/main/packages/otok-kysely#readme",
|
|
6
|
+
"bugs": {
|
|
7
|
+
"url": "https://github.com/kamod-ch/otok/issues"
|
|
8
|
+
},
|
|
9
|
+
"license": "MIT",
|
|
10
|
+
"repository": {
|
|
11
|
+
"type": "git",
|
|
12
|
+
"url": "git+https://github.com/kamod-ch/otok.git",
|
|
13
|
+
"directory": "packages/otok-kysely"
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist",
|
|
17
|
+
"README.md"
|
|
18
|
+
],
|
|
19
|
+
"type": "module",
|
|
20
|
+
"exports": {
|
|
21
|
+
".": {
|
|
22
|
+
"types": "./dist/index.d.ts",
|
|
23
|
+
"default": "./dist/index.js"
|
|
24
|
+
},
|
|
25
|
+
"./plugin": {
|
|
26
|
+
"types": "./dist/plugin.d.ts",
|
|
27
|
+
"default": "./dist/plugin.js"
|
|
28
|
+
},
|
|
29
|
+
"./loader": {
|
|
30
|
+
"types": "./dist/loader.d.ts",
|
|
31
|
+
"default": "./dist/loader.js"
|
|
32
|
+
},
|
|
33
|
+
"./registry": {
|
|
34
|
+
"types": "./dist/registry.d.ts",
|
|
35
|
+
"default": "./dist/registry.js"
|
|
36
|
+
},
|
|
37
|
+
"./migrations": {
|
|
38
|
+
"types": "./dist/migrations/index.d.ts",
|
|
39
|
+
"default": "./dist/migrations/index.js"
|
|
40
|
+
},
|
|
41
|
+
"./seeds": {
|
|
42
|
+
"types": "./dist/seeds/index.d.ts",
|
|
43
|
+
"default": "./dist/seeds/index.js"
|
|
44
|
+
},
|
|
45
|
+
"./transaction": {
|
|
46
|
+
"types": "./dist/transaction.d.ts",
|
|
47
|
+
"default": "./dist/transaction.js"
|
|
48
|
+
},
|
|
49
|
+
"./test": {
|
|
50
|
+
"types": "./dist/test/index.d.ts",
|
|
51
|
+
"default": "./dist/test/index.js"
|
|
52
|
+
},
|
|
53
|
+
"./cli": {
|
|
54
|
+
"types": "./dist/cli/index.d.ts",
|
|
55
|
+
"default": "./dist/cli/index.js"
|
|
56
|
+
},
|
|
57
|
+
"./dialects": {
|
|
58
|
+
"types": "./dist/dialects/index.d.ts",
|
|
59
|
+
"default": "./dist/dialects/index.js"
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
"publishConfig": {
|
|
63
|
+
"access": "public"
|
|
64
|
+
},
|
|
65
|
+
"devDependencies": {
|
|
66
|
+
"@kamod-ch/otok": "1.0.0",
|
|
67
|
+
"@kamod-ch/otok-test": "1.0.0",
|
|
68
|
+
"@types/better-sqlite3": "^7.6.13",
|
|
69
|
+
"@types/node": "^24.12.2",
|
|
70
|
+
"@types/pg": "^8.15.5",
|
|
71
|
+
"better-sqlite3": "^11.10.0",
|
|
72
|
+
"hono": "^4.13.8",
|
|
73
|
+
"kysely": "^0.29.2",
|
|
74
|
+
"pg": "^8.16.3",
|
|
75
|
+
"preact": "^10.28.2",
|
|
76
|
+
"typescript": "~6.0.2",
|
|
77
|
+
"vitest": "^4.1.2"
|
|
78
|
+
},
|
|
79
|
+
"peerDependencies": {
|
|
80
|
+
"@kamod-ch/otok": ">=0.6.1",
|
|
81
|
+
"hono": ">=4",
|
|
82
|
+
"kysely": ">=0.27.0"
|
|
83
|
+
},
|
|
84
|
+
"peerDependenciesMeta": {
|
|
85
|
+
"pg": {
|
|
86
|
+
"optional": true
|
|
87
|
+
},
|
|
88
|
+
"better-sqlite3": {
|
|
89
|
+
"optional": true
|
|
90
|
+
},
|
|
91
|
+
"mysql2": {
|
|
92
|
+
"optional": true
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
"engines": {
|
|
96
|
+
"node": ">=20"
|
|
97
|
+
},
|
|
98
|
+
"otok": {
|
|
99
|
+
"setup": "./dist/setup.js"
|
|
100
|
+
},
|
|
101
|
+
"scripts": {
|
|
102
|
+
"build": "rm -rf dist && tsc -p tsconfig.build.json",
|
|
103
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
104
|
+
"test": "vitest run"
|
|
105
|
+
}
|
|
106
|
+
}
|