@foul11/awesome-db 1.1.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/CHANGELOG.md +11 -0
- package/dist/BitFields.d.ts +29 -0
- package/dist/BitFields.d.ts.map +1 -0
- package/dist/Error.d.ts +21 -0
- package/dist/Error.d.ts.map +1 -0
- package/dist/ORM.d.ts +14 -0
- package/dist/ORM.d.ts.map +1 -0
- package/dist/SQLParser.d.ts +1394 -0
- package/dist/SQLParser.d.ts.map +1 -0
- package/dist/WebpackFileProvider.d.ts +12 -0
- package/dist/WebpackFileProvider.d.ts.map +1 -0
- package/dist/alter/column_add.d.ts +7 -0
- package/dist/alter/column_add.d.ts.map +1 -0
- package/dist/alter/column_drop.d.ts +6 -0
- package/dist/alter/column_drop.d.ts.map +1 -0
- package/dist/alter/column_rename.d.ts +6 -0
- package/dist/alter/column_rename.d.ts.map +1 -0
- package/dist/alter/column_update.d.ts +7 -0
- package/dist/alter/column_update.d.ts.map +1 -0
- package/dist/alter/columns_order.d.ts +6 -0
- package/dist/alter/columns_order.d.ts.map +1 -0
- package/dist/alter/index.d.ts +7 -0
- package/dist/alter/index.d.ts.map +1 -0
- package/dist/alter/pragma.d.ts +4 -0
- package/dist/alter/pragma.d.ts.map +1 -0
- package/dist/alter/utils.d.ts +6 -0
- package/dist/alter/utils.d.ts.map +1 -0
- package/dist/defaults.d.ts +2 -0
- package/dist/defaults.d.ts.map +1 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.mjs +1540 -0
- package/dist/index.mjs.map +1 -0
- package/dist/indexer.d.ts +12 -0
- package/dist/indexer.d.ts.map +1 -0
- package/dist/log/access_log.d.ts +7 -0
- package/dist/log/access_log.d.ts.map +1 -0
- package/dist/log/db.d.ts +6 -0
- package/dist/log/db.d.ts.map +1 -0
- package/dist/log/index.d.ts +3 -0
- package/dist/log/index.d.ts.map +1 -0
- package/dist/tables/AccessLog/index.d.ts +79 -0
- package/dist/tables/AccessLog/index.d.ts.map +1 -0
- package/dist/tables/AccessLog/schema.d.ts +17 -0
- package/dist/tables/AccessLog/schema.d.ts.map +1 -0
- package/dist/tables/Permission/index.d.ts +43 -0
- package/dist/tables/Permission/index.d.ts.map +1 -0
- package/dist/tables/Permission/schema.d.ts +12 -0
- package/dist/tables/Permission/schema.d.ts.map +1 -0
- package/dist/tables/SetString/index.d.ts +10 -0
- package/dist/tables/SetString/index.d.ts.map +1 -0
- package/dist/tables/SetString/schema.d.ts +7 -0
- package/dist/tables/SetString/schema.d.ts.map +1 -0
- package/dist/tables/Settings/index.d.ts +42 -0
- package/dist/tables/Settings/index.d.ts.map +1 -0
- package/dist/tables/Settings/schema.d.ts +8 -0
- package/dist/tables/Settings/schema.d.ts.map +1 -0
- package/dist/tables/Transaction/index.d.ts +90 -0
- package/dist/tables/Transaction/index.d.ts.map +1 -0
- package/dist/tables/Transaction/schema.d.ts +16 -0
- package/dist/tables/Transaction/schema.d.ts.map +1 -0
- package/dist/types/index.d.ts +12 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/utils.d.ts +42 -0
- package/dist/utils.d.ts.map +1 -0
- package/eslint.config.js +7 -0
- package/package.json +54 -0
- package/src/BitFields.ts +160 -0
- package/src/Error.ts +13 -0
- package/src/ORM.ts +49 -0
- package/src/SQLParser.js +1204 -0
- package/src/WebpackFileProvider.ts +63 -0
- package/src/alter/column_add.ts +79 -0
- package/src/alter/column_drop.ts +54 -0
- package/src/alter/column_rename.ts +55 -0
- package/src/alter/column_update.ts +92 -0
- package/src/alter/columns_order.ts +60 -0
- package/src/alter/index.ts +6 -0
- package/src/alter/pragma.ts +10 -0
- package/src/alter/utils.ts +70 -0
- package/src/defaults.ts +3 -0
- package/src/index.ts +227 -0
- package/src/indexer.ts +75 -0
- package/src/log/access_log.ts +29 -0
- package/src/log/db.ts +28 -0
- package/src/log/index.ts +2 -0
- package/src/tables/AccessLog/index.ts +252 -0
- package/src/tables/AccessLog/schema.ts +20 -0
- package/src/tables/Permission/index.ts +220 -0
- package/src/tables/Permission/schema.ts +13 -0
- package/src/tables/SetString/index.ts +45 -0
- package/src/tables/SetString/schema.ts +7 -0
- package/src/tables/Settings/index.ts +135 -0
- package/src/tables/Settings/schema.ts +8 -0
- package/src/tables/Transaction/index.ts +343 -0
- package/src/tables/Transaction/schema.ts +20 -0
- package/src/types/index.ts +33 -0
- package/src/utils.ts +48 -0
- package/test/sqliteExtExpert.test.ts +39 -0
- package/tsconfig.build.json +17 -0
- package/tsconfig.json +16 -0
package/dist/utils.d.ts
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { Kysely } from 'kysely';
|
|
2
|
+
export declare function table_info<DB>(db: Kysely<DB>, table: Extract<keyof DB, string>): Promise<{
|
|
3
|
+
cid: number;
|
|
4
|
+
name: string;
|
|
5
|
+
type: "INTEGER" | "REAL" | "TEXT" | "BLOB" | "NUMERIC";
|
|
6
|
+
notnull: boolean;
|
|
7
|
+
dflt_value: string | null;
|
|
8
|
+
pk: boolean;
|
|
9
|
+
}[]>;
|
|
10
|
+
export declare function master_table(db: Kysely<any>): Promise<{
|
|
11
|
+
type: "index" | "table";
|
|
12
|
+
name: string;
|
|
13
|
+
tbl_name: string;
|
|
14
|
+
rootpage: number;
|
|
15
|
+
sql: string;
|
|
16
|
+
}[]>;
|
|
17
|
+
export declare function get_table_schema<DB>(db: Kysely<DB>, table: Extract<keyof DB, string>): Promise<false | {
|
|
18
|
+
type: "CREATE_TABLE";
|
|
19
|
+
table: {
|
|
20
|
+
scheme_parts: string[];
|
|
21
|
+
name: string;
|
|
22
|
+
};
|
|
23
|
+
if_not_exists: boolean;
|
|
24
|
+
columns: {
|
|
25
|
+
name: string;
|
|
26
|
+
type: "TEXT" | "INTEGER" | "REAL" | "BLOB" | "DATETIME";
|
|
27
|
+
primary: boolean;
|
|
28
|
+
auto_increment: boolean;
|
|
29
|
+
not_null: boolean;
|
|
30
|
+
unique: boolean;
|
|
31
|
+
default: string | number | null;
|
|
32
|
+
references: {
|
|
33
|
+
table: {
|
|
34
|
+
scheme_parts: string[];
|
|
35
|
+
name: string;
|
|
36
|
+
};
|
|
37
|
+
columns: string[];
|
|
38
|
+
constraints: string | null;
|
|
39
|
+
} | null;
|
|
40
|
+
}[];
|
|
41
|
+
}>;
|
|
42
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAErC,wBAAsB,UAAU,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC;SAKxE,MAAM;UACL,MAAM;UACN,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS;aAC7C,OAAO;gBACJ,MAAM,GAAG,IAAI;QACrB,OAAO;KAElB;AAED,wBAAsB,YAAY,CAAC,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC;UAQpC,OAAO,GAAG,OAAO;UACjB,MAAM;cACF,MAAM;cACN,MAAM;SACX,MAAM;KAElB;AAED,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;GAY1F"}
|
package/eslint.config.js
ADDED
package/package.json
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@foul11/awesome-db",
|
|
3
|
+
"version": "1.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "dist/index.mjs",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"test": "jest",
|
|
9
|
+
"build": "awesome-tools webpack -t lib",
|
|
10
|
+
"watch": "awesome-tools webpack -t lib -w",
|
|
11
|
+
"eslint": "eslint . --max-warnings=0",
|
|
12
|
+
"clean": "rm -rf dist"
|
|
13
|
+
},
|
|
14
|
+
"devDependencies": {
|
|
15
|
+
"@foul11/awesome-eslint-config": "1.1.0",
|
|
16
|
+
"@foul11/awesome-log": "1.1.0",
|
|
17
|
+
"@types/better-sqlite3": "^7.6.13",
|
|
18
|
+
"@types/bindings": "^1.5.5",
|
|
19
|
+
"better-sqlite3": "^12.9.0",
|
|
20
|
+
"kysely": "^0.29.0"
|
|
21
|
+
},
|
|
22
|
+
"publishConfig": {
|
|
23
|
+
"access": "public"
|
|
24
|
+
},
|
|
25
|
+
"keywords": [],
|
|
26
|
+
"author": "foul11",
|
|
27
|
+
"license": "MIT",
|
|
28
|
+
"packageManager": "pnpm@10.32.1",
|
|
29
|
+
"jest": {
|
|
30
|
+
"preset": "ts-jest",
|
|
31
|
+
"testEnvironment": "node",
|
|
32
|
+
"passWithNoTests": true
|
|
33
|
+
},
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"@foul11/awesome": "1.1.0",
|
|
36
|
+
"@foul11/sql-formatter": "^15.7.3",
|
|
37
|
+
"better-sqlite3-expert": "^1.0.2",
|
|
38
|
+
"bindings": "^1.5.0",
|
|
39
|
+
"deepmerge": "^4.3.1",
|
|
40
|
+
"type-fest": "^5.6.0",
|
|
41
|
+
"uuid": "^14.0.0"
|
|
42
|
+
},
|
|
43
|
+
"peerDependencies": {
|
|
44
|
+
"@foul11/awesome-log": "workspace:*",
|
|
45
|
+
"better-sqlite3": "^12.9.0",
|
|
46
|
+
"kysely": "^0.29.0"
|
|
47
|
+
},
|
|
48
|
+
"peerDependenciesMeta": {
|
|
49
|
+
"@foul11/awesome-log": {
|
|
50
|
+
"optional": true
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
"gitHead": "44ef083589e3ffaaa148f4ba485ef000dc09d9d7"
|
|
54
|
+
}
|
package/src/BitFields.ts
ADDED
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-use-before-define */
|
|
2
|
+
import { ErrorFlagPack, ErrorFlagUnpack } from './Error';
|
|
3
|
+
|
|
4
|
+
import type { DrainOuterGeneric } from 'kysely';
|
|
5
|
+
import type { IntRange } from 'type-fest';
|
|
6
|
+
|
|
7
|
+
type RecursiveChangeType<T, T_FROM, T_TO> = DrainOuterGeneric<{
|
|
8
|
+
[K in keyof T]: T[K] extends T_FROM
|
|
9
|
+
? T_TO
|
|
10
|
+
: (
|
|
11
|
+
T[K] extends Record<string, any>
|
|
12
|
+
? RecursiveChangeType<T[K], T_FROM, T_TO>
|
|
13
|
+
: never
|
|
14
|
+
);
|
|
15
|
+
}>;
|
|
16
|
+
|
|
17
|
+
type RecursiveObject<T, FIELD_TYPE> = DrainOuterGeneric<{
|
|
18
|
+
[K in keyof T]:
|
|
19
|
+
| RecursiveObject<T[K], FIELD_TYPE>
|
|
20
|
+
| FIELD_TYPE;
|
|
21
|
+
}>;
|
|
22
|
+
|
|
23
|
+
type RecursiveUndefinedToOptional<T> = DrainOuterGeneric<{
|
|
24
|
+
[K in keyof T]?: RecursiveUndefinedToOptional<T[K]>;
|
|
25
|
+
}>;
|
|
26
|
+
|
|
27
|
+
type Guarded<F> =
|
|
28
|
+
F extends (x: any) => x is infer T ? T : never;
|
|
29
|
+
|
|
30
|
+
export type BitFieldsScheme<
|
|
31
|
+
Range extends IntRange<0, 52> = Guarded<typeof BitFields['isValidField']>,
|
|
32
|
+
> = RecursiveObject<
|
|
33
|
+
{ [key: string]: any },
|
|
34
|
+
Range
|
|
35
|
+
>;
|
|
36
|
+
|
|
37
|
+
export type BitFieldsUnpack<T extends BitFieldsScheme> = (
|
|
38
|
+
RecursiveUndefinedToOptional<
|
|
39
|
+
RecursiveChangeType<T, number, boolean | undefined>
|
|
40
|
+
>
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
function unpack<
|
|
44
|
+
BIT_SCHEME extends BitFieldsScheme,
|
|
45
|
+
BIT_UNPACK,
|
|
46
|
+
>(flags: number, from: BIT_SCHEME): BIT_UNPACK {
|
|
47
|
+
const to: any = {};
|
|
48
|
+
|
|
49
|
+
for (const [ key, val ] of Object.entries(from)) {
|
|
50
|
+
switch (true) {
|
|
51
|
+
case typeof val == 'number':
|
|
52
|
+
if (!BitFields.isValidField(val))
|
|
53
|
+
throw new ErrorFlagUnpack(`Out of range: pos {${val as any}}`);
|
|
54
|
+
to[key] = BitFields.getBit(flags, val);
|
|
55
|
+
break;
|
|
56
|
+
|
|
57
|
+
case typeof val == 'object':
|
|
58
|
+
to[key] = unpack(flags, val as any);
|
|
59
|
+
break;
|
|
60
|
+
|
|
61
|
+
default:
|
|
62
|
+
throw new ErrorFlagUnpack(`Invalid type {${typeof val}}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return to;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function pack<
|
|
70
|
+
BIT_SCHEME extends BitFieldsScheme,
|
|
71
|
+
BIT_UNPACK extends BitFieldsUnpack<BIT_SCHEME>,
|
|
72
|
+
>(flags: Partial<BIT_UNPACK>, to: number, from: BIT_SCHEME): number {
|
|
73
|
+
for (const [ key, val ] of Object.entries(from)) {
|
|
74
|
+
switch (true) {
|
|
75
|
+
case typeof val == 'number':
|
|
76
|
+
if (flags && key in flags) {
|
|
77
|
+
if (!BitFields.isValidField(val))
|
|
78
|
+
throw new ErrorFlagUnpack(`Out of range: pos {${val as any}}`);
|
|
79
|
+
to = BitFields.setBit((flags as any)[key], val, to);
|
|
80
|
+
}
|
|
81
|
+
break;
|
|
82
|
+
|
|
83
|
+
case typeof val == 'object':
|
|
84
|
+
if (flags && key in flags) {
|
|
85
|
+
to = pack((flags as any)[key], to, val as any);
|
|
86
|
+
}
|
|
87
|
+
break;
|
|
88
|
+
|
|
89
|
+
default:
|
|
90
|
+
throw new ErrorFlagPack(`Invalid type {${typeof val}}`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return to;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
function toFlat<
|
|
99
|
+
BIT_SCHEME extends BitFieldsScheme,
|
|
100
|
+
INPUT extends (
|
|
101
|
+
| BIT_SCHEME
|
|
102
|
+
| BitFieldsUnpack<BIT_SCHEME>
|
|
103
|
+
),
|
|
104
|
+
>(flags: INPUT, paths: string[] = []): string[] {
|
|
105
|
+
const out: string[] = [];
|
|
106
|
+
|
|
107
|
+
for (const [ key, val ] of Object.entries(flags)) {
|
|
108
|
+
switch (true) {
|
|
109
|
+
case typeof val == 'object':
|
|
110
|
+
out.push(...toFlat(val, [ ...paths, key ]));
|
|
111
|
+
break;
|
|
112
|
+
|
|
113
|
+
case typeof val == 'number':
|
|
114
|
+
case typeof val == 'boolean' && val:
|
|
115
|
+
out.push([ ...paths, key ].join('.'));
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return out;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
export class BitFields<
|
|
124
|
+
BIT_SCHEME extends BitFieldsScheme,
|
|
125
|
+
BIT_UNPACK extends BitFieldsUnpack<BIT_SCHEME> = BitFieldsUnpack<BIT_SCHEME>,
|
|
126
|
+
> {
|
|
127
|
+
bitScheme: BIT_SCHEME;
|
|
128
|
+
|
|
129
|
+
constructor(flag_bits: BIT_SCHEME) {
|
|
130
|
+
this.bitScheme = flag_bits;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
static getBit(input: number, pos: number): boolean {
|
|
134
|
+
return !!((input >> pos) & 0x01);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
static setBit(bit: boolean, pos: number, input = 0): number {
|
|
138
|
+
return bit ? (input | (1 << pos)) : (input & ~(1 << pos));
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
static isValidField(input: number): input is IntRange<0, 52> {
|
|
142
|
+
return typeof input == 'number' && input >= 0 && input < 52;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
unpack(flags: number): BIT_UNPACK {
|
|
146
|
+
return unpack<BIT_SCHEME, BIT_UNPACK>(flags, this.bitScheme);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
pack(flags: BIT_UNPACK, to = 0): number {
|
|
150
|
+
return pack<BIT_SCHEME, BIT_UNPACK>(flags, to, this.bitScheme);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
list(): string[] {
|
|
154
|
+
return toFlat<BIT_SCHEME, BIT_SCHEME>(this.bitScheme);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
unpackToList(flags: number): string[] {
|
|
158
|
+
return toFlat<BIT_SCHEME, BIT_UNPACK>(this.unpack(flags));
|
|
159
|
+
}
|
|
160
|
+
}
|
package/src/Error.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export class ErrorModule extends Error {}
|
|
2
|
+
|
|
3
|
+
export class ErrorDB extends ErrorModule {}
|
|
4
|
+
|
|
5
|
+
export class ErrorMigration extends ErrorDB {}
|
|
6
|
+
export class ErrorSchema extends ErrorDB {}
|
|
7
|
+
export class ErrorQuery extends ErrorDB {}
|
|
8
|
+
export class ErrorUnknown extends ErrorDB {}
|
|
9
|
+
|
|
10
|
+
export class ErrorFlag extends ErrorUnknown {}
|
|
11
|
+
export class ErrorFlagPack extends ErrorFlag {}
|
|
12
|
+
export class ErrorFlagUnpack extends ErrorFlag {}
|
|
13
|
+
export class ErrorFlagInvalid extends ErrorFlag {}
|
package/src/ORM.ts
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { ErrorUnknown } from './Error';
|
|
2
|
+
|
|
3
|
+
import type { AnyColumn, Kysely, SelectType, UpdateKeys } from 'kysely';
|
|
4
|
+
|
|
5
|
+
type KeysMatching<T, V> = {
|
|
6
|
+
[K in keyof T]-?: T[K] extends V ? K : never
|
|
7
|
+
}[keyof T];
|
|
8
|
+
|
|
9
|
+
export class ORM {
|
|
10
|
+
static async getWhereId<
|
|
11
|
+
DB,
|
|
12
|
+
TB extends KeysMatching<DB, { id: any }>,
|
|
13
|
+
CN extends AnyColumn<DB, TB>,
|
|
14
|
+
>(
|
|
15
|
+
id: number,
|
|
16
|
+
table: TB,
|
|
17
|
+
column: CN,
|
|
18
|
+
db_builder: Kysely<DB>,
|
|
19
|
+
): Promise<SelectType<DB[TB][CN]>> {
|
|
20
|
+
const res = await (db_builder as any)
|
|
21
|
+
.selectFrom(table)
|
|
22
|
+
.select(column as any)
|
|
23
|
+
.where('id', '=', id as any)
|
|
24
|
+
.executeTakeFirst();
|
|
25
|
+
|
|
26
|
+
if (!res)
|
|
27
|
+
throw new ErrorUnknown(`Failed to get column ${String(column)} from ${String(table)}`);
|
|
28
|
+
|
|
29
|
+
return (res as any)[column];
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
static async setWhereId<
|
|
33
|
+
DB,
|
|
34
|
+
TB extends KeysMatching<DB, { id: any }>,
|
|
35
|
+
UCN extends UpdateKeys<DB[TB]>,
|
|
36
|
+
>(
|
|
37
|
+
id: number,
|
|
38
|
+
table: TB,
|
|
39
|
+
value: UCN,
|
|
40
|
+
db_builder: Kysely<DB>,
|
|
41
|
+
): Promise<boolean> {
|
|
42
|
+
const result = await (db_builder as any)
|
|
43
|
+
.updateTable(table as any)
|
|
44
|
+
.set(value)
|
|
45
|
+
.where('id', '=', id as any)
|
|
46
|
+
.executeTakeFirst();
|
|
47
|
+
return result.numUpdatedRows == 1n;
|
|
48
|
+
}
|
|
49
|
+
}
|