@fragno-dev/db 0.0.1 → 0.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/.turbo/turbo-build.log +137 -13
- package/.turbo/turbo-test.log +36 -0
- package/CHANGELOG.md +7 -0
- package/dist/adapters/adapters.d.ts +18 -0
- package/dist/adapters/adapters.d.ts.map +1 -0
- package/dist/adapters/drizzle/drizzle-adapter.d.ts +21 -0
- package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +1 -0
- package/dist/adapters/drizzle/drizzle-adapter.js +62 -0
- package/dist/adapters/drizzle/drizzle-adapter.js.map +1 -0
- package/dist/adapters/drizzle/drizzle-query.d.ts +17 -0
- package/dist/adapters/drizzle/drizzle-query.d.ts.map +1 -0
- package/dist/adapters/drizzle/drizzle-query.js +139 -0
- package/dist/adapters/drizzle/drizzle-query.js.map +1 -0
- package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts +9 -0
- package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts.map +1 -0
- package/dist/adapters/drizzle/drizzle-uow-compiler.js +300 -0
- package/dist/adapters/drizzle/drizzle-uow-compiler.js.map +1 -0
- package/dist/adapters/drizzle/drizzle-uow-decoder.js +82 -0
- package/dist/adapters/drizzle/drizzle-uow-decoder.js.map +1 -0
- package/dist/adapters/drizzle/drizzle-uow-executor.js +125 -0
- package/dist/adapters/drizzle/drizzle-uow-executor.js.map +1 -0
- package/dist/adapters/drizzle/generate.js +273 -0
- package/dist/adapters/drizzle/generate.js.map +1 -0
- package/dist/adapters/drizzle/join-column-utils.js +28 -0
- package/dist/adapters/drizzle/join-column-utils.js.map +1 -0
- package/dist/adapters/drizzle/shared.js +11 -0
- package/dist/adapters/drizzle/shared.js.map +1 -0
- package/dist/adapters/kysely/kysely-adapter.d.ts +23 -0
- package/dist/adapters/kysely/kysely-adapter.d.ts.map +1 -0
- package/dist/adapters/kysely/kysely-adapter.js +119 -0
- package/dist/adapters/kysely/kysely-adapter.js.map +1 -0
- package/dist/adapters/kysely/kysely-query-builder.js +306 -0
- package/dist/adapters/kysely/kysely-query-builder.js.map +1 -0
- package/dist/adapters/kysely/kysely-query-compiler.js +67 -0
- package/dist/adapters/kysely/kysely-query-compiler.js.map +1 -0
- package/dist/adapters/kysely/kysely-query.js +158 -0
- package/dist/adapters/kysely/kysely-query.js.map +1 -0
- package/dist/adapters/kysely/kysely-uow-compiler.js +139 -0
- package/dist/adapters/kysely/kysely-uow-compiler.js.map +1 -0
- package/dist/adapters/kysely/kysely-uow-executor.js +89 -0
- package/dist/adapters/kysely/kysely-uow-executor.js.map +1 -0
- package/dist/adapters/kysely/migration/execute.js +176 -0
- package/dist/adapters/kysely/migration/execute.js.map +1 -0
- package/dist/fragment.d.ts +54 -0
- package/dist/fragment.d.ts.map +1 -0
- package/dist/fragment.js +92 -0
- package/dist/fragment.js.map +1 -0
- package/dist/id.d.ts +2 -0
- package/dist/migration-engine/auto-from-schema.js +116 -0
- package/dist/migration-engine/auto-from-schema.js.map +1 -0
- package/dist/migration-engine/create.d.ts +41 -0
- package/dist/migration-engine/create.d.ts.map +1 -0
- package/dist/migration-engine/create.js +58 -0
- package/dist/migration-engine/create.js.map +1 -0
- package/dist/migration-engine/shared.d.ts +90 -0
- package/dist/migration-engine/shared.d.ts.map +1 -0
- package/dist/migration-engine/shared.js +8 -0
- package/dist/migration-engine/shared.js.map +1 -0
- package/dist/mod.d.ts +55 -2
- package/dist/mod.d.ts.map +1 -1
- package/dist/mod.js +111 -2
- package/dist/mod.js.map +1 -1
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/column-builder.js +108 -0
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/column-builder.js.map +1 -0
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/column.js +55 -0
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/column.js.map +1 -0
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/entity.js +18 -0
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/entity.js.map +1 -0
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/columns/common.js +183 -0
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/columns/common.js.map +1 -0
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/columns/enum.js +58 -0
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/columns/enum.js.map +1 -0
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/foreign-keys.js +68 -0
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/foreign-keys.js.map +1 -0
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/unique-constraint.js +56 -0
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/unique-constraint.js.map +1 -0
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/utils/array.js +65 -0
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/utils/array.js.map +1 -0
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/expressions/conditions.js +81 -0
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/expressions/conditions.js.map +1 -0
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/expressions/select.js +13 -0
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/expressions/select.js.map +1 -0
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/functions/aggregate.js +10 -0
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/functions/aggregate.js.map +1 -0
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/sql.js +372 -0
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/sql.js.map +1 -0
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/subquery.js +23 -0
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/subquery.js.map +1 -0
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/table.js +62 -0
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/table.js.map +1 -0
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/table.utils.js +6 -0
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/table.utils.js.map +1 -0
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/tracing-utils.js +8 -0
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/tracing-utils.js.map +1 -0
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/tracing.js +8 -0
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/tracing.js.map +1 -0
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/view-common.js +6 -0
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/view-common.js.map +1 -0
- package/dist/query/condition-builder.d.ts +41 -0
- package/dist/query/condition-builder.d.ts.map +1 -0
- package/dist/query/condition-builder.js +93 -0
- package/dist/query/condition-builder.js.map +1 -0
- package/dist/query/cursor.d.ts +88 -0
- package/dist/query/cursor.d.ts.map +1 -0
- package/dist/query/cursor.js +103 -0
- package/dist/query/cursor.js.map +1 -0
- package/dist/query/orm/orm.d.ts +18 -0
- package/dist/query/orm/orm.d.ts.map +1 -0
- package/dist/query/orm/orm.js +48 -0
- package/dist/query/orm/orm.js.map +1 -0
- package/dist/query/query.d.ts +79 -0
- package/dist/query/query.d.ts.map +1 -0
- package/dist/query/query.js +1 -0
- package/dist/query/result-transform.js +155 -0
- package/dist/query/result-transform.js.map +1 -0
- package/dist/query/unit-of-work.d.ts +435 -0
- package/dist/query/unit-of-work.d.ts.map +1 -0
- package/dist/query/unit-of-work.js +549 -0
- package/dist/query/unit-of-work.js.map +1 -0
- package/dist/schema/create.d.ts +273 -116
- package/dist/schema/create.d.ts.map +1 -1
- package/dist/schema/create.js +410 -222
- package/dist/schema/create.js.map +1 -1
- package/dist/schema/serialize.js +101 -0
- package/dist/schema/serialize.js.map +1 -0
- package/dist/schema-generator/schema-generator.d.ts +15 -0
- package/dist/schema-generator/schema-generator.d.ts.map +1 -0
- package/dist/shared/providers.d.ts +6 -0
- package/dist/shared/providers.d.ts.map +1 -0
- package/dist/util/import-generator.js +26 -0
- package/dist/util/import-generator.js.map +1 -0
- package/dist/util/parse.js +15 -0
- package/dist/util/parse.js.map +1 -0
- package/dist/util/types.d.ts +8 -0
- package/dist/util/types.d.ts.map +1 -0
- package/package.json +63 -2
- package/src/adapters/adapters.ts +22 -0
- package/src/adapters/drizzle/drizzle-adapter-pglite.test.ts +433 -0
- package/src/adapters/drizzle/drizzle-adapter.test.ts +122 -0
- package/src/adapters/drizzle/drizzle-adapter.ts +118 -0
- package/src/adapters/drizzle/drizzle-query.ts +234 -0
- package/src/adapters/drizzle/drizzle-uow-compiler.test.ts +1084 -0
- package/src/adapters/drizzle/drizzle-uow-compiler.ts +546 -0
- package/src/adapters/drizzle/drizzle-uow-decoder.ts +165 -0
- package/src/adapters/drizzle/drizzle-uow-executor.ts +213 -0
- package/src/adapters/drizzle/generate.test.ts +643 -0
- package/src/adapters/drizzle/generate.ts +481 -0
- package/src/adapters/drizzle/join-column-utils.test.ts +79 -0
- package/src/adapters/drizzle/join-column-utils.ts +39 -0
- package/src/adapters/drizzle/migrate-drizzle.test.ts +226 -0
- package/src/adapters/drizzle/shared.ts +22 -0
- package/src/adapters/drizzle/test-utils.ts +56 -0
- package/src/adapters/kysely/kysely-adapter-pglite.test.ts +789 -0
- package/src/adapters/kysely/kysely-adapter.ts +196 -0
- package/src/adapters/kysely/kysely-query-builder.test.ts +1344 -0
- package/src/adapters/kysely/kysely-query-builder.ts +611 -0
- package/src/adapters/kysely/kysely-query-compiler.ts +124 -0
- package/src/adapters/kysely/kysely-query.ts +254 -0
- package/src/adapters/kysely/kysely-uow-compiler.test.ts +916 -0
- package/src/adapters/kysely/kysely-uow-compiler.ts +271 -0
- package/src/adapters/kysely/kysely-uow-executor.ts +149 -0
- package/src/adapters/kysely/kysely-uow-joins.test.ts +811 -0
- package/src/adapters/kysely/migration/execute-mysql.test.ts +1173 -0
- package/src/adapters/kysely/migration/execute-postgres.test.ts +2657 -0
- package/src/adapters/kysely/migration/execute.ts +382 -0
- package/src/adapters/kysely/migration/kysely-migrator.test.ts +197 -0
- package/src/fragment.test.ts +287 -0
- package/src/fragment.ts +198 -0
- package/src/migration-engine/auto-from-schema.test.ts +118 -58
- package/src/migration-engine/auto-from-schema.ts +103 -32
- package/src/migration-engine/create.test.ts +34 -46
- package/src/migration-engine/create.ts +41 -26
- package/src/migration-engine/shared.ts +26 -6
- package/src/mod.ts +197 -1
- package/src/query/condition-builder.test.ts +379 -0
- package/src/query/condition-builder.ts +294 -0
- package/src/query/cursor.test.ts +296 -0
- package/src/query/cursor.ts +147 -0
- package/src/query/orm/orm.ts +92 -0
- package/src/query/query-type.test.ts +429 -0
- package/src/query/query.ts +200 -0
- package/src/query/result-transform.test.ts +795 -0
- package/src/query/result-transform.ts +247 -0
- package/src/query/unit-of-work-types.test.ts +192 -0
- package/src/query/unit-of-work.test.ts +947 -0
- package/src/query/unit-of-work.ts +1199 -0
- package/src/schema/create.test.ts +653 -110
- package/src/schema/create.ts +708 -337
- package/src/schema/serialize.test.ts +559 -0
- package/src/schema/serialize.ts +359 -0
- package/src/schema-generator/schema-generator.ts +12 -0
- package/src/shared/config.ts +0 -8
- package/src/util/import-generator.ts +28 -0
- package/src/util/parse.ts +16 -0
- package/src/util/types.ts +4 -0
- package/tsconfig.json +1 -1
- package/tsdown.config.ts +11 -1
- package/vitest.config.ts +3 -0
- /package/dist/{cuid.js → id.js} +0 -0
- /package/src/{cuid.ts → id.ts} +0 -0
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { AnySchema, AnyTable, FragnoId, IdColumn, Relation } from "../schema/create.js";
|
|
2
|
+
import { Condition, ConditionBuilder } from "./condition-builder.js";
|
|
3
|
+
import { DeleteBuilder, FindBuilder, UnitOfWork, UpdateBuilder, UpdateManyBuilder } from "./unit-of-work.js";
|
|
4
|
+
import { Prettify } from "../util/types.js";
|
|
5
|
+
|
|
6
|
+
//#region src/query/query.d.ts
|
|
7
|
+
type AnySelectClause = SelectClause<AnyTable>;
|
|
8
|
+
type SelectClause<T extends AnyTable> = true | (keyof T["columns"])[];
|
|
9
|
+
type RawColumnValues<T extends AnyTable> = { [K in keyof T["columns"] as string extends K ? never : K]: T["columns"][K]["$out"] };
|
|
10
|
+
type TableToColumnValues<T extends AnyTable> = RawColumnValues<T>;
|
|
11
|
+
type PickNullable<T> = { [P in keyof T as null extends T[P] ? P : never]: T[P] };
|
|
12
|
+
type PickNotNullable<T> = { [P in keyof T as null extends T[P] ? never : P]: T[P] };
|
|
13
|
+
type RawInsertValues<T extends AnyTable> = { [K in keyof T["columns"] as string extends K ? never : K]: T["columns"][K]["$in"] };
|
|
14
|
+
type TableToInsertValues<T extends AnyTable> = Prettify<Partial<PickNullable<RawInsertValues<T>>> & PickNotNullable<RawInsertValues<T>>>;
|
|
15
|
+
type TableToUpdateValues<T extends AnyTable> = { [K in keyof T["columns"] as string extends K ? never : K]?: T["columns"][K] extends IdColumn ? never : T["columns"][K]["$in"] };
|
|
16
|
+
type MainSelectResult<S extends SelectClause<T>, T extends AnyTable> = S extends true ? TableToColumnValues<T> : S extends (keyof T["columns"])[] ? { [K in S[number] as string extends K ? never : K]: K extends keyof T["columns"] ? T["columns"][K]["$out"] : never } : never;
|
|
17
|
+
type SelectResult<T extends AnyTable, JoinOut$1, Select$1 extends SelectClause<T>> = MainSelectResult<Select$1, T> & JoinOut$1;
|
|
18
|
+
interface MapRelationType<Type$1> {
|
|
19
|
+
one: Type$1 | null;
|
|
20
|
+
many: Type$1[];
|
|
21
|
+
}
|
|
22
|
+
type JoinBuilder<T extends AnyTable, Out = {}> = { [K in keyof T["relations"]]: T["relations"][K] extends Relation<infer Type, infer Target> ? <Select extends SelectClause<Target> = true, JoinOut = {}>(options?: FindManyOptions<Target, Select, JoinOut, false>) => JoinBuilder<T, Out & { [$K in K]: MapRelationType<SelectResult<Target, JoinOut, Select>>[Type] }> : never };
|
|
23
|
+
type OrderBy<Column = string> = [columnName: Column, "asc" | "desc"];
|
|
24
|
+
type FindFirstOptions<T extends AnyTable = AnyTable, Select$1 extends SelectClause<T> = SelectClause<T>, JoinOut$1 = {}, IsRoot extends boolean = true> = Omit<FindManyOptions<T, Select$1, JoinOut$1, IsRoot>, IsRoot extends true ? "limit" : "limit" | "offset" | "orderBy">;
|
|
25
|
+
type FindManyOptions<T extends AnyTable = AnyTable, Select$1 extends SelectClause<T> = SelectClause<T>, _JoinOut = {}, IsRoot extends boolean = true> = {
|
|
26
|
+
select?: Select$1;
|
|
27
|
+
where?: (eb: ConditionBuilder<T["columns"]>) => Condition | boolean;
|
|
28
|
+
limit?: number;
|
|
29
|
+
orderBy?: OrderBy<keyof T["columns"]> | OrderBy<keyof T["columns"]>[];
|
|
30
|
+
join?: (jb: JoinBuilder<T>) => void;
|
|
31
|
+
} & (IsRoot extends true ? {
|
|
32
|
+
offset?: number;
|
|
33
|
+
} : {});
|
|
34
|
+
interface AbstractQuery<TSchema extends AnySchema, TUOWConfig = void> {
|
|
35
|
+
/**
|
|
36
|
+
* Find multiple records using a builder pattern
|
|
37
|
+
*/
|
|
38
|
+
find: <TableName extends keyof TSchema["tables"] & string, Select extends SelectClause<TSchema["tables"][TableName]> = true, JoinOut = {}>(table: TableName, builderFn?: (builder: Omit<FindBuilder<TSchema["tables"][TableName]>, "build">) => Omit<FindBuilder<TSchema["tables"][TableName], Select, JoinOut>, "build">) => Promise<SelectResult<TSchema["tables"][TableName], JoinOut, Select>[]>;
|
|
39
|
+
/**
|
|
40
|
+
* Find the first record matching the criteria
|
|
41
|
+
* Implemented as a wrapper around find() with pageSize(1)
|
|
42
|
+
*/
|
|
43
|
+
findFirst: <TableName extends keyof TSchema["tables"] & string, Select extends SelectClause<TSchema["tables"][TableName]> = true, JoinOut = {}>(table: TableName, builderFn?: (builder: Omit<FindBuilder<TSchema["tables"][TableName]>, "build">) => Omit<FindBuilder<TSchema["tables"][TableName], Select, JoinOut>, "build">) => Promise<SelectResult<TSchema["tables"][TableName], JoinOut, Select> | null>;
|
|
44
|
+
/**
|
|
45
|
+
* Create a single record
|
|
46
|
+
* @returns The ID of the created record
|
|
47
|
+
*/
|
|
48
|
+
create: <TableName extends keyof TSchema["tables"] & string>(table: TableName, values: TableToInsertValues<TSchema["tables"][TableName]>) => Promise<FragnoId>;
|
|
49
|
+
/**
|
|
50
|
+
* Create multiple records
|
|
51
|
+
* @returns Array of IDs of the created records
|
|
52
|
+
*/
|
|
53
|
+
createMany: <TableName extends keyof TSchema["tables"] & string>(table: TableName, values: TableToInsertValues<TSchema["tables"][TableName]>[]) => Promise<FragnoId[]>;
|
|
54
|
+
/**
|
|
55
|
+
* Update a single record by ID
|
|
56
|
+
* Note: you cannot update the id of a row, some databases don't support that (including MongoDB).
|
|
57
|
+
*/
|
|
58
|
+
update: <TableName extends keyof TSchema["tables"] & string>(table: TableName, id: FragnoId | string, builderFn: (builder: Omit<UpdateBuilder<TSchema["tables"][TableName]>, "build" | "check">) => Omit<UpdateBuilder<TSchema["tables"][TableName]>, "build">) => Promise<void>;
|
|
59
|
+
/**
|
|
60
|
+
* Update multiple records matching a where clause
|
|
61
|
+
* Note: you cannot update the id of a row, some databases don't support that (including MongoDB).
|
|
62
|
+
*/
|
|
63
|
+
updateMany: <TableName extends keyof TSchema["tables"] & string>(table: TableName, builderFn: (builder: UpdateManyBuilder<TSchema["tables"][TableName]>) => void) => Promise<void>;
|
|
64
|
+
/**
|
|
65
|
+
* Delete a single record by ID
|
|
66
|
+
*/
|
|
67
|
+
delete: <TableName extends keyof TSchema["tables"] & string>(table: TableName, id: FragnoId | string, builderFn?: (builder: Omit<DeleteBuilder, "build">) => Omit<DeleteBuilder, "build" | "check">) => Promise<void>;
|
|
68
|
+
/**
|
|
69
|
+
* Delete multiple records matching a where clause
|
|
70
|
+
*/
|
|
71
|
+
deleteMany: <TableName extends keyof TSchema["tables"] & string>(table: TableName, builderFn: (builder: Omit<FindBuilder<TSchema["tables"][TableName]>, "build" | "check">) => void) => Promise<void>;
|
|
72
|
+
/**
|
|
73
|
+
* Create a Unit of Work bound to this query engine
|
|
74
|
+
*/
|
|
75
|
+
createUnitOfWork: (name?: string, config?: TUOWConfig) => UnitOfWork<TSchema, []>;
|
|
76
|
+
}
|
|
77
|
+
//#endregion
|
|
78
|
+
export { AbstractQuery, AnySelectClause, FindFirstOptions, FindManyOptions, JoinBuilder, OrderBy, RawColumnValues, SelectClause, SelectResult, TableToColumnValues, TableToInsertValues, TableToUpdateValues };
|
|
79
|
+
//# sourceMappingURL=query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.d.ts","names":[],"sources":["../../src/query/query.ts"],"sourcesContent":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { createId } from "../id.js";
|
|
2
|
+
import { FragnoId, FragnoReference } from "../schema/create.js";
|
|
3
|
+
import { deserialize, serialize } from "../schema/serialize.js";
|
|
4
|
+
|
|
5
|
+
//#region src/query/result-transform.ts
|
|
6
|
+
/**
|
|
7
|
+
* Marker class for reference column values that need subquery resolution.
|
|
8
|
+
* When a reference column receives a string (external ID), this marker tells
|
|
9
|
+
* the query builder to generate a subquery to look up the internal ID.
|
|
10
|
+
* @internal
|
|
11
|
+
*/
|
|
12
|
+
var ReferenceSubquery = class {
|
|
13
|
+
#referencedTable;
|
|
14
|
+
#externalIdValue;
|
|
15
|
+
constructor(referencedTable, externalIdValue) {
|
|
16
|
+
this.#referencedTable = referencedTable;
|
|
17
|
+
this.#externalIdValue = externalIdValue;
|
|
18
|
+
}
|
|
19
|
+
get referencedTable() {
|
|
20
|
+
return this.#referencedTable;
|
|
21
|
+
}
|
|
22
|
+
get externalIdValue() {
|
|
23
|
+
return this.#externalIdValue;
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Generate a runtime default value for a column that has defaultTo$()
|
|
28
|
+
*
|
|
29
|
+
* Only generates values for runtime defaults (defaultTo$), NOT static defaults (defaultTo).
|
|
30
|
+
* Static defaults should be handled by the database via DEFAULT constraints.
|
|
31
|
+
*
|
|
32
|
+
* @param column - The column with a default value configuration
|
|
33
|
+
* @returns The generated default value, or undefined if the column has no runtime default
|
|
34
|
+
*
|
|
35
|
+
* @internal
|
|
36
|
+
*/
|
|
37
|
+
function generateRuntimeDefault(column) {
|
|
38
|
+
if (!column.default) return;
|
|
39
|
+
if ("value" in column.default) return;
|
|
40
|
+
const runtime = column.default.runtime;
|
|
41
|
+
if (runtime === "auto") return createId();
|
|
42
|
+
if (runtime === "now") return /* @__PURE__ */ new Date();
|
|
43
|
+
if (typeof runtime === "function") return runtime();
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Encodes a record of values from the application format to database format.
|
|
47
|
+
*
|
|
48
|
+
* This function transforms object keys to match SQL column names and serializes
|
|
49
|
+
* values according to the database provider's requirements (e.g., converting
|
|
50
|
+
* JavaScript Date objects to numbers for SQLite).
|
|
51
|
+
*
|
|
52
|
+
* @param values - The record of values to encode in application format
|
|
53
|
+
* @param table - The table schema definition containing column information
|
|
54
|
+
* @param generateDefault - Whether to generate default values for undefined columns
|
|
55
|
+
* @param provider - The SQL provider (sqlite, postgresql, mysql, etc.)
|
|
56
|
+
* @returns A record with database-compatible column names and serialized values
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* ```ts
|
|
60
|
+
* const encoded = encodeValues(
|
|
61
|
+
* { userId: 123, createdAt: new Date() },
|
|
62
|
+
* userTable,
|
|
63
|
+
* true,
|
|
64
|
+
* 'sqlite'
|
|
65
|
+
* );
|
|
66
|
+
* // Returns: { user_id: 123, created_at: 1234567890 }
|
|
67
|
+
* ```
|
|
68
|
+
*/
|
|
69
|
+
function encodeValues(values, table, generateDefault, provider) {
|
|
70
|
+
const result = {};
|
|
71
|
+
for (const k in table.columns) {
|
|
72
|
+
const col = table.columns[k];
|
|
73
|
+
if (col.role === "internal-id") continue;
|
|
74
|
+
let value = values[k];
|
|
75
|
+
if (generateDefault && value === void 0) value = generateRuntimeDefault(col);
|
|
76
|
+
if (value !== void 0) {
|
|
77
|
+
if (col.role === "reference" && typeof value === "string") {
|
|
78
|
+
const relation = Object.values(table.relations).find((rel) => rel.on.some(([localCol]) => localCol === k));
|
|
79
|
+
if (relation) {
|
|
80
|
+
result[col.name] = new ReferenceSubquery(relation.table, value);
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
throw new Error(`Reference column ${k} not found in table ${table.name}`);
|
|
84
|
+
}
|
|
85
|
+
result[col.name] = serialize(value, col, provider);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return result;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Decodes a database result record to application format.
|
|
92
|
+
*
|
|
93
|
+
* This function transforms database column names back to application property names
|
|
94
|
+
* and deserializes values according to the database provider's format (e.g., converting
|
|
95
|
+
* SQLite integers back to JavaScript Date objects).
|
|
96
|
+
*
|
|
97
|
+
* Supports relation data encoded with the pattern `relationName:columnName`.
|
|
98
|
+
*
|
|
99
|
+
* @param result - The raw database result record
|
|
100
|
+
* @param table - The table schema definition containing column and relation information
|
|
101
|
+
* @param provider - The SQL provider (sqlite, postgresql, mysql, etc.)
|
|
102
|
+
* @returns A record in application format with deserialized values
|
|
103
|
+
*
|
|
104
|
+
* @example
|
|
105
|
+
* ```ts
|
|
106
|
+
* const decoded = decodeResult(
|
|
107
|
+
* { user_id: 123, created_at: 1234567890, 'posts:title': 'Hello' },
|
|
108
|
+
* userTable,
|
|
109
|
+
* 'sqlite'
|
|
110
|
+
* );
|
|
111
|
+
* // Returns: { userId: 123, createdAt: Date, posts: { title: 'Hello' } }
|
|
112
|
+
* ```
|
|
113
|
+
*/
|
|
114
|
+
function decodeResult(result, table, provider) {
|
|
115
|
+
const output = {};
|
|
116
|
+
const columnValues = {};
|
|
117
|
+
const relationData = {};
|
|
118
|
+
for (const k in result) {
|
|
119
|
+
const colonIndex = k.indexOf(":");
|
|
120
|
+
const value = result[k];
|
|
121
|
+
if (colonIndex === -1) {
|
|
122
|
+
const col = table.columns[k];
|
|
123
|
+
if (!col) continue;
|
|
124
|
+
columnValues[k] = deserialize(value, col, provider);
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
const relationName = k.slice(0, colonIndex);
|
|
128
|
+
const remainder = k.slice(colonIndex + 1);
|
|
129
|
+
if (table.relations[relationName] === void 0) continue;
|
|
130
|
+
relationData[relationName] ??= {};
|
|
131
|
+
relationData[relationName][remainder] = value;
|
|
132
|
+
}
|
|
133
|
+
for (const relationName in relationData) {
|
|
134
|
+
const relation = table.relations[relationName];
|
|
135
|
+
if (!relation) continue;
|
|
136
|
+
output[relationName] = decodeResult(relationData[relationName], relation.table, provider);
|
|
137
|
+
}
|
|
138
|
+
for (const k in columnValues) {
|
|
139
|
+
const col = table.columns[k];
|
|
140
|
+
if (!col) continue;
|
|
141
|
+
if (col.isHidden) continue;
|
|
142
|
+
if (col.role === "external-id" && columnValues["_internalId"] !== void 0) output[k] = new FragnoId({
|
|
143
|
+
externalId: columnValues[k],
|
|
144
|
+
internalId: columnValues["_internalId"],
|
|
145
|
+
version: columnValues["_version"]
|
|
146
|
+
});
|
|
147
|
+
else if (col.role === "reference") output[k] = FragnoReference.fromInternal(columnValues[k]);
|
|
148
|
+
else output[k] = columnValues[k];
|
|
149
|
+
}
|
|
150
|
+
return output;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
//#endregion
|
|
154
|
+
export { ReferenceSubquery, decodeResult, encodeValues };
|
|
155
|
+
//# sourceMappingURL=result-transform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result-transform.js","names":["#referencedTable","#externalIdValue","result: Record<string, unknown>","output: Record<string, unknown>","columnValues: Record<string, unknown>","relationData: Record<string, Record<string, unknown>>"],"sources":["../../src/query/result-transform.ts"],"sourcesContent":["import type { AnyColumn, AnyTable } from \"../schema/create\";\nimport type { SQLProvider } from \"../shared/providers\";\nimport { deserialize, serialize } from \"../schema/serialize\";\nimport { FragnoId, FragnoReference } from \"../schema/create\";\nimport { createId } from \"../id\";\n\n/**\n * Marker class for reference column values that need subquery resolution.\n * When a reference column receives a string (external ID), this marker tells\n * the query builder to generate a subquery to look up the internal ID.\n * @internal\n */\nexport class ReferenceSubquery {\n #referencedTable: AnyTable;\n #externalIdValue: string;\n\n constructor(referencedTable: AnyTable, externalIdValue: string) {\n this.#referencedTable = referencedTable;\n this.#externalIdValue = externalIdValue;\n }\n\n get referencedTable() {\n return this.#referencedTable;\n }\n\n get externalIdValue() {\n return this.#externalIdValue;\n }\n}\n\n/**\n * Generate a runtime default value for a column that has defaultTo$()\n *\n * Only generates values for runtime defaults (defaultTo$), NOT static defaults (defaultTo).\n * Static defaults should be handled by the database via DEFAULT constraints.\n *\n * @param column - The column with a default value configuration\n * @returns The generated default value, or undefined if the column has no runtime default\n *\n * @internal\n */\nexport function generateRuntimeDefault(column: AnyColumn): unknown {\n // Check if column has a default value configuration\n if (!column.default) {\n return undefined;\n }\n\n // If it's a static default value (defaultTo), return undefined\n // as the database should handle this via DEFAULT constraint\n if (\"value\" in column.default) {\n return undefined;\n }\n\n // Handle runtime defaults (defaultTo$)\n const runtime = column.default.runtime;\n\n if (runtime === \"auto\") {\n return createId();\n }\n\n if (runtime === \"now\") {\n return new Date();\n }\n\n if (typeof runtime === \"function\") {\n return runtime();\n }\n\n return undefined;\n}\n\n/**\n * Encodes a record of values from the application format to database format.\n *\n * This function transforms object keys to match SQL column names and serializes\n * values according to the database provider's requirements (e.g., converting\n * JavaScript Date objects to numbers for SQLite).\n *\n * @param values - The record of values to encode in application format\n * @param table - The table schema definition containing column information\n * @param generateDefault - Whether to generate default values for undefined columns\n * @param provider - The SQL provider (sqlite, postgresql, mysql, etc.)\n * @returns A record with database-compatible column names and serialized values\n *\n * @example\n * ```ts\n * const encoded = encodeValues(\n * { userId: 123, createdAt: new Date() },\n * userTable,\n * true,\n * 'sqlite'\n * );\n * // Returns: { user_id: 123, created_at: 1234567890 }\n * ```\n */\nexport function encodeValues(\n values: Record<string, unknown>,\n table: AnyTable,\n generateDefault: boolean,\n provider: SQLProvider,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const k in table.columns) {\n const col = table.columns[k];\n\n // Skip internal ID - never provided by user, auto-generated by database\n if (col.role === \"internal-id\") {\n continue;\n }\n let value = values[k];\n\n if (generateDefault && value === undefined) {\n // Only generate runtime defaults (defaultTo$), not static defaults (defaultTo).\n // Static defaults should be handled by the database via DEFAULT constraints.\n value = generateRuntimeDefault(col);\n }\n\n if (value !== undefined) {\n // Handle string references - convert external ID to internal ID via subquery\n if (col.role === \"reference\" && typeof value === \"string\") {\n // Find relation that uses this column\n const relation = Object.values(table.relations).find((rel) =>\n rel.on.some(([localCol]) => localCol === k),\n );\n if (relation) {\n result[col.name] = new ReferenceSubquery(relation.table, value);\n continue;\n }\n\n throw new Error(`Reference column ${k} not found in table ${table.name}`);\n }\n\n result[col.name] = serialize(value, col, provider);\n }\n }\n\n return result;\n}\n\n/**\n * Decodes a database result record to application format.\n *\n * This function transforms database column names back to application property names\n * and deserializes values according to the database provider's format (e.g., converting\n * SQLite integers back to JavaScript Date objects).\n *\n * Supports relation data encoded with the pattern `relationName:columnName`.\n *\n * @param result - The raw database result record\n * @param table - The table schema definition containing column and relation information\n * @param provider - The SQL provider (sqlite, postgresql, mysql, etc.)\n * @returns A record in application format with deserialized values\n *\n * @example\n * ```ts\n * const decoded = decodeResult(\n * { user_id: 123, created_at: 1234567890, 'posts:title': 'Hello' },\n * userTable,\n * 'sqlite'\n * );\n * // Returns: { userId: 123, createdAt: Date, posts: { title: 'Hello' } }\n * ```\n */\nexport function decodeResult(\n result: Record<string, unknown>,\n table: AnyTable,\n provider: SQLProvider,\n): Record<string, unknown> {\n const output: Record<string, unknown> = {};\n // First pass: collect all column values\n const columnValues: Record<string, unknown> = {};\n\n // Collect all relation data (including nested) keyed by relation name\n const relationData: Record<string, Record<string, unknown>> = {};\n\n for (const k in result) {\n const colonIndex = k.indexOf(\":\");\n const value = result[k];\n\n // Direct column (no colon)\n if (colonIndex === -1) {\n const col = table.columns[k];\n if (!col) {\n continue;\n }\n\n // Store all column values (including hidden ones for FragnoId creation)\n columnValues[k] = deserialize(value, col, provider);\n continue;\n }\n\n // Relation column (has colon)\n const relationName = k.slice(0, colonIndex);\n const remainder = k.slice(colonIndex + 1);\n\n const relation = table.relations[relationName];\n if (relation === undefined) {\n continue;\n }\n\n // Collect relation data with the remaining key path\n relationData[relationName] ??= {};\n relationData[relationName][remainder] = value;\n }\n\n // Process each relation's data recursively\n for (const relationName in relationData) {\n const relation = table.relations[relationName];\n if (!relation) {\n continue;\n }\n\n // Recursively decode the relation data\n output[relationName] = decodeResult(relationData[relationName], relation.table, provider);\n }\n\n // Second pass: create output with FragnoId objects where appropriate\n for (const k in columnValues) {\n const col = table.columns[k];\n if (!col) {\n continue;\n }\n\n // Filter out hidden columns (like _internalId, _version) from results\n if (col.isHidden) {\n continue;\n }\n\n // For external ID columns, create FragnoId if we have both external and internal IDs\n if (col.role === \"external-id\" && columnValues[\"_internalId\"] !== undefined) {\n output[k] = new FragnoId({\n externalId: columnValues[k] as string,\n internalId: columnValues[\"_internalId\"] as bigint,\n // _version is always selected as a hidden column, so it should always be present\n version: columnValues[\"_version\"] as number,\n });\n } else if (col.role === \"reference\") {\n // For reference columns, create FragnoReference with internal ID\n output[k] = FragnoReference.fromInternal(columnValues[k] as bigint);\n } else {\n output[k] = columnValues[k];\n }\n }\n\n return output;\n}\n"],"mappings":";;;;;;;;;;;AAYA,IAAa,oBAAb,MAA+B;CAC7B;CACA;CAEA,YAAY,iBAA2B,iBAAyB;AAC9D,QAAKA,kBAAmB;AACxB,QAAKC,kBAAmB;;CAG1B,IAAI,kBAAkB;AACpB,SAAO,MAAKD;;CAGd,IAAI,kBAAkB;AACpB,SAAO,MAAKC;;;;;;;;;;;;;;AAehB,SAAgB,uBAAuB,QAA4B;AAEjE,KAAI,CAAC,OAAO,QACV;AAKF,KAAI,WAAW,OAAO,QACpB;CAIF,MAAM,UAAU,OAAO,QAAQ;AAE/B,KAAI,YAAY,OACd,QAAO,UAAU;AAGnB,KAAI,YAAY,MACd,wBAAO,IAAI,MAAM;AAGnB,KAAI,OAAO,YAAY,WACrB,QAAO,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BpB,SAAgB,aACd,QACA,OACA,iBACA,UACyB;CACzB,MAAMC,SAAkC,EAAE;AAE1C,MAAK,MAAM,KAAK,MAAM,SAAS;EAC7B,MAAM,MAAM,MAAM,QAAQ;AAG1B,MAAI,IAAI,SAAS,cACf;EAEF,IAAI,QAAQ,OAAO;AAEnB,MAAI,mBAAmB,UAAU,OAG/B,SAAQ,uBAAuB,IAAI;AAGrC,MAAI,UAAU,QAAW;AAEvB,OAAI,IAAI,SAAS,eAAe,OAAO,UAAU,UAAU;IAEzD,MAAM,WAAW,OAAO,OAAO,MAAM,UAAU,CAAC,MAAM,QACpD,IAAI,GAAG,MAAM,CAAC,cAAc,aAAa,EAAE,CAC5C;AACD,QAAI,UAAU;AACZ,YAAO,IAAI,QAAQ,IAAI,kBAAkB,SAAS,OAAO,MAAM;AAC/D;;AAGF,UAAM,IAAI,MAAM,oBAAoB,EAAE,sBAAsB,MAAM,OAAO;;AAG3E,UAAO,IAAI,QAAQ,UAAU,OAAO,KAAK,SAAS;;;AAItD,QAAO;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BT,SAAgB,aACd,QACA,OACA,UACyB;CACzB,MAAMC,SAAkC,EAAE;CAE1C,MAAMC,eAAwC,EAAE;CAGhD,MAAMC,eAAwD,EAAE;AAEhE,MAAK,MAAM,KAAK,QAAQ;EACtB,MAAM,aAAa,EAAE,QAAQ,IAAI;EACjC,MAAM,QAAQ,OAAO;AAGrB,MAAI,eAAe,IAAI;GACrB,MAAM,MAAM,MAAM,QAAQ;AAC1B,OAAI,CAAC,IACH;AAIF,gBAAa,KAAK,YAAY,OAAO,KAAK,SAAS;AACnD;;EAIF,MAAM,eAAe,EAAE,MAAM,GAAG,WAAW;EAC3C,MAAM,YAAY,EAAE,MAAM,aAAa,EAAE;AAGzC,MADiB,MAAM,UAAU,kBAChB,OACf;AAIF,eAAa,kBAAkB,EAAE;AACjC,eAAa,cAAc,aAAa;;AAI1C,MAAK,MAAM,gBAAgB,cAAc;EACvC,MAAM,WAAW,MAAM,UAAU;AACjC,MAAI,CAAC,SACH;AAIF,SAAO,gBAAgB,aAAa,aAAa,eAAe,SAAS,OAAO,SAAS;;AAI3F,MAAK,MAAM,KAAK,cAAc;EAC5B,MAAM,MAAM,MAAM,QAAQ;AAC1B,MAAI,CAAC,IACH;AAIF,MAAI,IAAI,SACN;AAIF,MAAI,IAAI,SAAS,iBAAiB,aAAa,mBAAmB,OAChE,QAAO,KAAK,IAAI,SAAS;GACvB,YAAY,aAAa;GACzB,YAAY,aAAa;GAEzB,SAAS,aAAa;GACvB,CAAC;WACO,IAAI,SAAS,YAEtB,QAAO,KAAK,gBAAgB,aAAa,aAAa,GAAa;MAEnE,QAAO,KAAK,aAAa;;AAI7B,QAAO"}
|