kysely-rizzolver 0.0.2 → 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/README.md +14 -10
- package/dist/cjs/fetch-result-factory.js +1 -0
- package/dist/cjs/fetch-result-factory.js.map +1 -0
- package/dist/cjs/fetch-result.d.ts +11 -8
- package/dist/cjs/fetch-result.js +5 -0
- package/dist/cjs/fetch-result.js.map +1 -0
- package/dist/cjs/fk-gather-result-factory.d.ts +69 -0
- package/dist/cjs/fk-gather-result-factory.js +111 -0
- package/dist/cjs/fk-gather-result-factory.js.map +1 -0
- package/dist/cjs/fk-gather-result.d.ts +115 -0
- package/dist/cjs/fk-gather-result.js +127 -0
- package/dist/cjs/fk-gather-result.js.map +1 -0
- package/dist/cjs/fks.d.ts +111 -0
- package/dist/cjs/fks.js +101 -0
- package/dist/cjs/fks.js.map +1 -0
- package/dist/cjs/index.d.ts +10 -4
- package/dist/cjs/index.js +17 -1
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/kysely-rizzolver-builder.d.ts +17 -0
- package/dist/cjs/kysely-rizzolver-builder.js +23 -0
- package/dist/cjs/kysely-rizzolver-builder.js.map +1 -0
- package/dist/cjs/kysely-rizzolver-fk-builder.d.ts +20 -0
- package/dist/cjs/kysely-rizzolver-fk-builder.js +23 -0
- package/dist/cjs/kysely-rizzolver-fk-builder.js.map +1 -0
- package/dist/cjs/kysely-rizzolver.d.ts +64 -85
- package/dist/cjs/kysely-rizzolver.js +47 -90
- package/dist/cjs/kysely-rizzolver.js.map +1 -0
- package/dist/cjs/model-collection.d.ts +5 -1
- package/dist/cjs/model-collection.js +24 -2
- package/dist/cjs/model-collection.js.map +1 -0
- package/dist/cjs/query-builder.d.ts +14 -12
- package/dist/cjs/query-builder.js +10 -4
- package/dist/cjs/query-builder.js.map +1 -0
- package/dist/cjs/selector.d.ts +71 -7
- package/dist/cjs/selector.js +2 -1
- package/dist/cjs/selector.js.map +1 -0
- package/dist/cjs/type-helpers.d.ts +20 -0
- package/dist/cjs/type-helpers.js +1 -0
- package/dist/cjs/type-helpers.js.map +1 -0
- package/dist/esm/fetch-result-factory.js +1 -0
- package/dist/esm/fetch-result-factory.js.map +1 -0
- package/dist/esm/fetch-result.js +5 -0
- package/dist/esm/fetch-result.js.map +1 -0
- package/dist/esm/fk-gather-result-factory.js +108 -0
- package/dist/esm/fk-gather-result-factory.js.map +1 -0
- package/dist/esm/fk-gather-result.js +115 -0
- package/dist/esm/fk-gather-result.js.map +1 -0
- package/dist/esm/fks.js +96 -0
- package/dist/esm/fks.js.map +1 -0
- package/dist/esm/index.js +4 -1
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/kysely-rizzolver-builder.js +20 -0
- package/dist/esm/kysely-rizzolver-builder.js.map +1 -0
- package/dist/esm/kysely-rizzolver-fk-builder.js +20 -0
- package/dist/esm/kysely-rizzolver-fk-builder.js.map +1 -0
- package/dist/esm/kysely-rizzolver.js +47 -90
- package/dist/esm/kysely-rizzolver.js.map +1 -0
- package/dist/esm/model-collection.js +24 -2
- package/dist/esm/model-collection.js.map +1 -0
- package/dist/esm/query-builder.js +10 -4
- package/dist/esm/query-builder.js.map +1 -0
- package/dist/esm/selector.js +2 -1
- package/dist/esm/selector.js.map +1 -0
- package/dist/esm/type-helpers.js +1 -0
- package/dist/esm/type-helpers.js.map +1 -0
- package/dist/types/fetch-result.d.ts +11 -8
- package/dist/types/fk-gather-result-factory.d.ts +69 -0
- package/dist/types/fk-gather-result.d.ts +115 -0
- package/dist/types/fks.d.ts +111 -0
- package/dist/types/index.d.ts +10 -4
- package/dist/types/kysely-rizzolver-builder.d.ts +17 -0
- package/dist/types/kysely-rizzolver-fk-builder.d.ts +20 -0
- package/dist/types/kysely-rizzolver.d.ts +64 -85
- package/dist/types/model-collection.d.ts +5 -1
- package/dist/types/query-builder.d.ts +14 -12
- package/dist/types/selector.d.ts +71 -7
- package/dist/types/type-helpers.d.ts +20 -0
- package/package.json +1 -1
@@ -0,0 +1,111 @@
|
|
1
|
+
import type { ExpressionBuilder, Kysely, OperandExpression, Selectable, SelectType } from 'kysely';
|
2
|
+
import type { FKDefsEntry } from './kysely-rizzolver-fk-builder.js';
|
3
|
+
import { type KyselyRizzolverBase, type KyselyRizzolverFKs } from './kysely-rizzolver.js';
|
4
|
+
import type { ModelCollection } from './model-collection.js';
|
5
|
+
import type { OmitByValue } from './type-helpers.js';
|
6
|
+
/**
|
7
|
+
* The maximum depth to gather FKs in a single gather operation.
|
8
|
+
*
|
9
|
+
* If you change this, you must also change {@link NextDepth}.
|
10
|
+
*/
|
11
|
+
export declare const MAX_FK_GATHER_DEPTH = 3;
|
12
|
+
/**
|
13
|
+
* For each supported gather depth, assigns the value depth - 1. This is used to recursively construct the types for {@link ModelFkInstance}.
|
14
|
+
*
|
15
|
+
* If you change this, you must also change {@link MAX_FK_GATHER_DEPTH}.
|
16
|
+
*/
|
17
|
+
type NextDepth = {
|
18
|
+
3: 2;
|
19
|
+
2: 1;
|
20
|
+
1: 0;
|
21
|
+
};
|
22
|
+
/**
|
23
|
+
* The depth at which FKs can be gathered.
|
24
|
+
*
|
25
|
+
* A depth of 0 = bare model only. This is equivalent to a fetch without gathers.
|
26
|
+
*/
|
27
|
+
export type ValidFkDepth = (keyof NextDepth & number) | 0;
|
28
|
+
type Fk<DB, Referencing extends keyof DB & string, Referenced extends keyof DB & string, IsNullable extends boolean> = {
|
29
|
+
myTable: Referencing;
|
30
|
+
myField: string;
|
31
|
+
otherTable: Referenced;
|
32
|
+
otherField: string;
|
33
|
+
isNullable: IsNullable;
|
34
|
+
};
|
35
|
+
/**
|
36
|
+
* Omit FK properties from `T`.
|
37
|
+
*/
|
38
|
+
export type OmitFks<T> = OmitByValue<T, Fk<any, any, any, any>>;
|
39
|
+
export declare class ModelFkGatherError extends Error {
|
40
|
+
constructor(table: string, id: number, reason: string);
|
41
|
+
}
|
42
|
+
/**
|
43
|
+
* A model whose FK fields have not been gathered.
|
44
|
+
*/
|
45
|
+
export type ModelFkBare<DBFk, Table extends keyof DBFk & string> = {
|
46
|
+
__fkDepth: 0;
|
47
|
+
__table: Table;
|
48
|
+
} & Selectable<OmitFks<DBFk[Table]>>;
|
49
|
+
/**
|
50
|
+
* A model whose FKs fields have been gathered up to a specific depth.
|
51
|
+
*/
|
52
|
+
export type ModelFkGathered<DBFk, Table extends keyof DBFk & string, Depth extends Exclude<ValidFkDepth, 0>> = {
|
53
|
+
__fkDepth: Depth;
|
54
|
+
__table: Table;
|
55
|
+
} & {
|
56
|
+
[k in keyof DBFk[Table]]: DBFk[Table][k] extends infer U ? U extends Fk<any, any, infer UU, infer NN> ? MaybeNullable<ModelFkInstance<DBFk, UU & keyof DBFk, NextDepth[Depth]>, NN> : SelectType<U> : never;
|
57
|
+
};
|
58
|
+
export type ModelFkInstance<DBFk, Table extends keyof DBFk & string, Depth extends ValidFkDepth> = Depth extends 0 ? ModelFkBare<DBFk, Table> : ModelFkGathered<DBFk, Table, Exclude<Depth, 0>>;
|
59
|
+
type MaybeNullable<T, Nullable extends boolean> = Nullable extends true ? T | null : T;
|
60
|
+
export type ModelFkExtractSelectable<DB, Model> = Model extends ModelFkInstance<any, infer Table, any> ? Table extends keyof DB & string ? Selectable<DB[Table]> : never : Model extends undefined ? undefined : Model extends null ? null : never;
|
61
|
+
/**
|
62
|
+
* A database schema `DB` with FK fields populated according to `FKDefs`.
|
63
|
+
*
|
64
|
+
* `FKDefs` is of type {@link KyselyRizzolverFKs}.
|
65
|
+
*/
|
66
|
+
export type DBWithFk<DB, FKDefs extends KyselyRizzolverFKs<DB>> = {
|
67
|
+
[K in keyof DB & string]: DB[K] & {
|
68
|
+
[F in keyof FKDefs[K] & string]: FKDefs[K][F] extends infer U ? U extends FKDefsEntry<DB, any, any, any, any> ? Fk<DB, K, U['otherTable'], U['isNullable']> : never : never;
|
69
|
+
};
|
70
|
+
};
|
71
|
+
/**
|
72
|
+
* Given a database schema with FKs `DBFK`, returns a database schema without
|
73
|
+
* FKs.
|
74
|
+
*/
|
75
|
+
export type DBWithoutFk<DBFK> = {
|
76
|
+
[k in keyof DBFK & string]: OmitFks<DBFK[k]>;
|
77
|
+
};
|
78
|
+
export type GatherOpts<DB, Depth extends ValidFkDepth> = {
|
79
|
+
/**
|
80
|
+
* The depth to gather FKs to. Default: {@link MAX_FK_GATHER_DEPTH}.
|
81
|
+
*/
|
82
|
+
depth?: Depth;
|
83
|
+
/**
|
84
|
+
* When an invalid model is found, the gather function can either:
|
85
|
+
* - `throw` - throws a {@link ModelFkGatherError}.
|
86
|
+
* - `omit` - omits the model from the result array.
|
87
|
+
* - `null` - puts `null` values in the result array. This is useful if you
|
88
|
+
* want to match the input array to the output array by index while still
|
89
|
+
* indicating that a model is invalid.
|
90
|
+
* - `keep` - keeps the invalid model in the result array.
|
91
|
+
*
|
92
|
+
* An invalid model is a model that has an FK field that is unexpectedly
|
93
|
+
* missing.
|
94
|
+
*
|
95
|
+
* For example, if the model has a `user_id` field whose value is 3 but
|
96
|
+
* there is no user with ID 3 in the database, the model is invalid.
|
97
|
+
*
|
98
|
+
* Default: `omit`
|
99
|
+
*/
|
100
|
+
onInvalidModel?: 'omit' | 'throw' | 'null' | 'keep';
|
101
|
+
/**
|
102
|
+
* If provided, will populate this collection with the gathered models.
|
103
|
+
*/
|
104
|
+
modelCollection?: ModelCollection<DB>;
|
105
|
+
};
|
106
|
+
export type NoNullGatherOpts<DB, Depth extends ValidFkDepth> = Omit<GatherOpts<DB, Depth>, 'onInvalidModel'> & {
|
107
|
+
onInvalidModel?: 'omit' | 'throw' | 'keep';
|
108
|
+
};
|
109
|
+
export type GatherWhereExpression<DB, Table extends keyof DB & string> = (eb: ExpressionBuilder<Pick<DB, Table>, Table>) => OperandExpression<any>;
|
110
|
+
export declare function gatherModelFks<DB, FKDefs extends KyselyRizzolverFKs<DB>, KY extends KyselyRizzolverBase<DB, Record<keyof DB & string, any>, FKDefs>, Table extends keyof DB & string, Depth extends ValidFkDepth = typeof MAX_FK_GATHER_DEPTH>(rizzolver: KY, dbInstance: Kysely<DB>, table: Table, where: GatherWhereExpression<DB, Table>, opts?: GatherOpts<DB, Depth>): Promise<(ModelFkInstance<DBWithFk<DB, FKDefs>, Table, Depth> | null)[]>;
|
111
|
+
export {};
|
package/dist/cjs/fks.js
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.ModelFkGatherError = exports.MAX_FK_GATHER_DEPTH = void 0;
|
4
|
+
exports.gatherModelFks = gatherModelFks;
|
5
|
+
/**
|
6
|
+
* The maximum depth to gather FKs in a single gather operation.
|
7
|
+
*
|
8
|
+
* If you change this, you must also change {@link NextDepth}.
|
9
|
+
*/
|
10
|
+
exports.MAX_FK_GATHER_DEPTH = 3;
|
11
|
+
class ModelFkGatherError extends Error {
|
12
|
+
constructor(table, id, reason) {
|
13
|
+
super(`Failed to gather model (table: '${table}', id: ${id}): ${reason}`);
|
14
|
+
}
|
15
|
+
}
|
16
|
+
exports.ModelFkGatherError = ModelFkGatherError;
|
17
|
+
async function gatherModelFks(rizzolver, dbInstance, table, where, opts = {}) {
|
18
|
+
const depth = opts.depth ?? exports.MAX_FK_GATHER_DEPTH;
|
19
|
+
const onInvalidModel = opts.onInvalidModel ?? 'omit';
|
20
|
+
const modelCollection = opts.modelCollection ?? null;
|
21
|
+
const fkDefs = rizzolver._types.fkDefs;
|
22
|
+
let qb = rizzolver
|
23
|
+
.newQueryBuilder()
|
24
|
+
.add(table, table, rizzolver._types.fields[table]);
|
25
|
+
const gatherItems = [];
|
26
|
+
qb = _collectGatherData(fkDefs, table, qb, depth, gatherItems);
|
27
|
+
let ky = dbInstance.selectFrom(table);
|
28
|
+
for (const gatherItem of gatherItems) {
|
29
|
+
ky = ky.leftJoin(gatherItem.tableAlias, gatherItem.join);
|
30
|
+
}
|
31
|
+
ky = ky.select(qb.allFields()).where((eb) => where(eb));
|
32
|
+
const rizzult = await qb.run(() => ky.execute());
|
33
|
+
const collection = rizzult.models;
|
34
|
+
modelCollection?.addCollection(collection);
|
35
|
+
const result = rizzult.rows.map((row) => {
|
36
|
+
const baseModel = row.selectors[table];
|
37
|
+
const gatheredModel = _baseToGatheredModel(fkDefs, table, baseModel, collection, exports.MAX_FK_GATHER_DEPTH, onInvalidModel);
|
38
|
+
return gatheredModel;
|
39
|
+
});
|
40
|
+
if (onInvalidModel === 'omit') {
|
41
|
+
return result.filter((model) => model !== null);
|
42
|
+
}
|
43
|
+
return result;
|
44
|
+
}
|
45
|
+
function _collectGatherData(fkDefs, table, qb, depthLeft, result) {
|
46
|
+
if (depthLeft <= 0) {
|
47
|
+
return qb;
|
48
|
+
}
|
49
|
+
const myAlias = qb.numSelectors == 1 ? table : `fk${qb.numSelectors - 1}`;
|
50
|
+
const myFkDefs = fkDefs[table] ?? {};
|
51
|
+
for (const fkDef of Object.values(myFkDefs)) {
|
52
|
+
const otherAlias = `fk${qb.numSelectors}`;
|
53
|
+
qb = qb.add(fkDef.otherTable, otherAlias);
|
54
|
+
const myField = `${myAlias}.${fkDef.myField}`; // qb.selectors[myAlias].field(fkDef.myField).str;
|
55
|
+
const otherField = `${otherAlias}.${fkDef.otherField}`; // qb.selectors[otherAlias].field(fkDef.otherField).str;
|
56
|
+
const join = (join) => join.onRef(myField, '=', otherField);
|
57
|
+
result.push({ tableAlias: qb.table(otherAlias), join });
|
58
|
+
qb = _collectGatherData(fkDefs, fkDef.otherTable, qb, (depthLeft - 1), result);
|
59
|
+
}
|
60
|
+
return qb;
|
61
|
+
}
|
62
|
+
function _baseToGatheredModel(fkDefs, table, baseModel, collection, depth, onInvalidModel) {
|
63
|
+
if (depth <= 0) {
|
64
|
+
return { __fkDepth: 0, __table: table, ...baseModel };
|
65
|
+
}
|
66
|
+
const myId = baseModel['id'];
|
67
|
+
if (!myId || typeof myId !== 'number') {
|
68
|
+
throw new Error('Expected model to have a valid id');
|
69
|
+
}
|
70
|
+
const gatheredModel = { __fkDepth: depth, __table: table, ...baseModel };
|
71
|
+
const myFkDefs = fkDefs[table] ?? {};
|
72
|
+
for (const [fkName, fkDef] of Object.entries(myFkDefs)) {
|
73
|
+
const fkValue = baseModel[fkDef.myField];
|
74
|
+
if (fkValue !== null && fkValue !== undefined && typeof fkValue !== 'number') {
|
75
|
+
throw new ModelFkGatherError(table, myId, `Invalid looking FK value for reference '${fkName}' (field: '${fkDef.myField}'). Expected positive number, got: '${JSON.stringify(fkValue)}'`);
|
76
|
+
}
|
77
|
+
const expectsOtherModel = fkValue !== null && fkValue !== undefined && fkValue !== 0;
|
78
|
+
const otherBaseModel = expectsOtherModel
|
79
|
+
? collection.get(fkDef.otherTable, fkValue) ?? null
|
80
|
+
: null;
|
81
|
+
const isValid = expectsOtherModel === !!otherBaseModel;
|
82
|
+
if (!isValid) {
|
83
|
+
switch (onInvalidModel) {
|
84
|
+
case 'omit':
|
85
|
+
case 'null':
|
86
|
+
return null;
|
87
|
+
case 'throw':
|
88
|
+
throw new ModelFkGatherError(table, myId, `Could not find model for FK reference '${fkName}' (field: '${fkDef.myField}') for id ${fkValue}`);
|
89
|
+
}
|
90
|
+
}
|
91
|
+
if (otherBaseModel) {
|
92
|
+
const otherGatheredModel = _baseToGatheredModel(fkDefs, fkDef.otherTable, otherBaseModel, collection, (depth - 1), onInvalidModel);
|
93
|
+
gatheredModel[fkName] = otherGatheredModel;
|
94
|
+
}
|
95
|
+
else {
|
96
|
+
gatheredModel[fkName] = undefined;
|
97
|
+
}
|
98
|
+
}
|
99
|
+
return gatheredModel;
|
100
|
+
}
|
101
|
+
//# sourceMappingURL=fks.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"fks.js","sourceRoot":"","sources":["../../src/fks.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/index.d.ts
CHANGED
@@ -1,10 +1,16 @@
|
|
1
1
|
export { KyselyRizzolver } from './kysely-rizzolver.js';
|
2
|
-
export type { AllTableFields,
|
3
|
-
export { assertIsFetchOneResult, assertIsFetchOneXResult, assertIsFetchSomeResult, isFetchOneResult, isFetchOneXResult, isFetchSomeResult, newFetchOneResult, newFetchOneXResult, newFetchSomeResult } from './fetch-result.js';
|
2
|
+
export type { KyAllTableFields as AllTableFields, KyAnyTableField as AnyTableField, KyDB as RizzolverDB, KyTableName as TableName } from './kysely-rizzolver.js';
|
3
|
+
export { assertIsFetchOneResult, assertIsFetchOneXResult, assertIsFetchSomeResult, isFetchOneResult, isFetchOneXResult, isFetchResult, isFetchSomeResult, newFetchOneResult, newFetchOneXResult, newFetchSomeResult } from './fetch-result.js';
|
4
4
|
export type { AsFetchOneResult, AsFetchOneXResult, AsFetchSomeResult, FetchOneResult, FetchOneXResult, FetchResult, FetchSomeResult } from './fetch-result.js';
|
5
|
+
export { assertIsGatherOneResult, assertIsGatherOneXResult, assertIsGatherSomeResult, isGatherOneResult, isGatherOneXResult, isGatherResult, isGatherSomeResult, newGatherOneResult, newGatherOneXResult, newGatherSomeResult } from './fk-gather-result.js';
|
6
|
+
export type { AsGatherOneResult, AsGatherOneXResult, AsGatherSomeResult, FkGatherOneResult, FkGatherOneXResult, FkGatherResult, FkGatherSomeResult } from './fk-gather-result.js';
|
7
|
+
export { MAX_FK_GATHER_DEPTH, ModelFkGatherError } from './fks.js';
|
8
|
+
export type { ModelFkBare, ModelFkGathered, ModelFkInstance, ValidFkDepth, GatherWhereExpression } from './fks.js';
|
9
|
+
export type { KyselyRizzolverBuilder } from './kysely-rizzolver-builder.js';
|
10
|
+
export type { KyselyRizzolverFkBuilder } from './kysely-rizzolver-fk-builder.js';
|
5
11
|
export { newSelector } from './selector.js';
|
6
|
-
export type { Selector } from './selector.js';
|
12
|
+
export type { AnySelector, Selector } from './selector.js';
|
7
13
|
export { newQueryBuilder } from './query-builder.js';
|
8
|
-
export type { QueryBuilder } from './query-builder.js';
|
14
|
+
export type { AnyQueryBuilder, QueryBuilder } from './query-builder.js';
|
9
15
|
export { newModelCollection } from './model-collection.js';
|
10
16
|
export type { ModelCollection } from './model-collection.js';
|
package/dist/cjs/index.js
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.newModelCollection = exports.newQueryBuilder = exports.newSelector = exports.newFetchSomeResult = exports.newFetchOneXResult = exports.newFetchOneResult = exports.isFetchSomeResult = exports.isFetchOneXResult = exports.isFetchOneResult = exports.assertIsFetchSomeResult = exports.assertIsFetchOneXResult = exports.assertIsFetchOneResult = exports.KyselyRizzolver = void 0;
|
3
|
+
exports.newModelCollection = exports.newQueryBuilder = exports.newSelector = exports.ModelFkGatherError = exports.MAX_FK_GATHER_DEPTH = exports.newGatherSomeResult = exports.newGatherOneXResult = exports.newGatherOneResult = exports.isGatherSomeResult = exports.isGatherResult = exports.isGatherOneXResult = exports.isGatherOneResult = exports.assertIsGatherSomeResult = exports.assertIsGatherOneXResult = exports.assertIsGatherOneResult = exports.newFetchSomeResult = exports.newFetchOneXResult = exports.newFetchOneResult = exports.isFetchSomeResult = exports.isFetchResult = exports.isFetchOneXResult = exports.isFetchOneResult = exports.assertIsFetchSomeResult = exports.assertIsFetchOneXResult = exports.assertIsFetchOneResult = exports.KyselyRizzolver = void 0;
|
4
4
|
var kysely_rizzolver_js_1 = require("./kysely-rizzolver.js");
|
5
5
|
Object.defineProperty(exports, "KyselyRizzolver", { enumerable: true, get: function () { return kysely_rizzolver_js_1.KyselyRizzolver; } });
|
6
6
|
var fetch_result_js_1 = require("./fetch-result.js");
|
@@ -9,13 +9,29 @@ Object.defineProperty(exports, "assertIsFetchOneXResult", { enumerable: true, ge
|
|
9
9
|
Object.defineProperty(exports, "assertIsFetchSomeResult", { enumerable: true, get: function () { return fetch_result_js_1.assertIsFetchSomeResult; } });
|
10
10
|
Object.defineProperty(exports, "isFetchOneResult", { enumerable: true, get: function () { return fetch_result_js_1.isFetchOneResult; } });
|
11
11
|
Object.defineProperty(exports, "isFetchOneXResult", { enumerable: true, get: function () { return fetch_result_js_1.isFetchOneXResult; } });
|
12
|
+
Object.defineProperty(exports, "isFetchResult", { enumerable: true, get: function () { return fetch_result_js_1.isFetchResult; } });
|
12
13
|
Object.defineProperty(exports, "isFetchSomeResult", { enumerable: true, get: function () { return fetch_result_js_1.isFetchSomeResult; } });
|
13
14
|
Object.defineProperty(exports, "newFetchOneResult", { enumerable: true, get: function () { return fetch_result_js_1.newFetchOneResult; } });
|
14
15
|
Object.defineProperty(exports, "newFetchOneXResult", { enumerable: true, get: function () { return fetch_result_js_1.newFetchOneXResult; } });
|
15
16
|
Object.defineProperty(exports, "newFetchSomeResult", { enumerable: true, get: function () { return fetch_result_js_1.newFetchSomeResult; } });
|
17
|
+
var fk_gather_result_js_1 = require("./fk-gather-result.js");
|
18
|
+
Object.defineProperty(exports, "assertIsGatherOneResult", { enumerable: true, get: function () { return fk_gather_result_js_1.assertIsGatherOneResult; } });
|
19
|
+
Object.defineProperty(exports, "assertIsGatherOneXResult", { enumerable: true, get: function () { return fk_gather_result_js_1.assertIsGatherOneXResult; } });
|
20
|
+
Object.defineProperty(exports, "assertIsGatherSomeResult", { enumerable: true, get: function () { return fk_gather_result_js_1.assertIsGatherSomeResult; } });
|
21
|
+
Object.defineProperty(exports, "isGatherOneResult", { enumerable: true, get: function () { return fk_gather_result_js_1.isGatherOneResult; } });
|
22
|
+
Object.defineProperty(exports, "isGatherOneXResult", { enumerable: true, get: function () { return fk_gather_result_js_1.isGatherOneXResult; } });
|
23
|
+
Object.defineProperty(exports, "isGatherResult", { enumerable: true, get: function () { return fk_gather_result_js_1.isGatherResult; } });
|
24
|
+
Object.defineProperty(exports, "isGatherSomeResult", { enumerable: true, get: function () { return fk_gather_result_js_1.isGatherSomeResult; } });
|
25
|
+
Object.defineProperty(exports, "newGatherOneResult", { enumerable: true, get: function () { return fk_gather_result_js_1.newGatherOneResult; } });
|
26
|
+
Object.defineProperty(exports, "newGatherOneXResult", { enumerable: true, get: function () { return fk_gather_result_js_1.newGatherOneXResult; } });
|
27
|
+
Object.defineProperty(exports, "newGatherSomeResult", { enumerable: true, get: function () { return fk_gather_result_js_1.newGatherSomeResult; } });
|
28
|
+
var fks_js_1 = require("./fks.js");
|
29
|
+
Object.defineProperty(exports, "MAX_FK_GATHER_DEPTH", { enumerable: true, get: function () { return fks_js_1.MAX_FK_GATHER_DEPTH; } });
|
30
|
+
Object.defineProperty(exports, "ModelFkGatherError", { enumerable: true, get: function () { return fks_js_1.ModelFkGatherError; } });
|
16
31
|
var selector_js_1 = require("./selector.js");
|
17
32
|
Object.defineProperty(exports, "newSelector", { enumerable: true, get: function () { return selector_js_1.newSelector; } });
|
18
33
|
var query_builder_js_1 = require("./query-builder.js");
|
19
34
|
Object.defineProperty(exports, "newQueryBuilder", { enumerable: true, get: function () { return query_builder_js_1.newQueryBuilder; } });
|
20
35
|
var model_collection_js_1 = require("./model-collection.js");
|
21
36
|
Object.defineProperty(exports, "newModelCollection", { enumerable: true, get: function () { return model_collection_js_1.newModelCollection; } });
|
37
|
+
//# sourceMappingURL=index.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,6DAAwD;AAA/C,sHAAA,eAAe,OAAA;AAQxB,qDAW2B;AAV1B,yHAAA,sBAAsB,OAAA;AACtB,0HAAA,uBAAuB,OAAA;AACvB,0HAAA,uBAAuB,OAAA;AACvB,mHAAA,gBAAgB,OAAA;AAChB,oHAAA,iBAAiB,OAAA;AACjB,gHAAA,aAAa,OAAA;AACb,oHAAA,iBAAiB,OAAA;AACjB,oHAAA,iBAAiB,OAAA;AACjB,qHAAA,kBAAkB,OAAA;AAClB,qHAAA,kBAAkB,OAAA;AAYnB,6DAW+B;AAV9B,8HAAA,uBAAuB,OAAA;AACvB,+HAAA,wBAAwB,OAAA;AACxB,+HAAA,wBAAwB,OAAA;AACxB,wHAAA,iBAAiB,OAAA;AACjB,yHAAA,kBAAkB,OAAA;AAClB,qHAAA,cAAc,OAAA;AACd,yHAAA,kBAAkB,OAAA;AAClB,yHAAA,kBAAkB,OAAA;AAClB,0HAAA,mBAAmB,OAAA;AACnB,0HAAA,mBAAmB,OAAA;AAYpB,mCAAmE;AAA1D,6GAAA,mBAAmB,OAAA;AAAE,4GAAA,kBAAkB,OAAA;AAYhD,6CAA4C;AAAnC,0GAAA,WAAW,OAAA;AAGpB,uDAAqD;AAA5C,mHAAA,eAAe,OAAA;AAGxB,6DAA2D;AAAlD,yHAAA,kBAAkB,OAAA"}
|
@@ -0,0 +1,17 @@
|
|
1
|
+
import type { Simplify } from 'kysely';
|
2
|
+
import { MAX_FK_GATHER_DEPTH, type ValidFkDepth } from './fks.js';
|
3
|
+
import { type FkDefsBuilderCallback } from './kysely-rizzolver-fk-builder.js';
|
4
|
+
import { KyselyRizzolver, type KyselyRizzolverFKs } from './kysely-rizzolver.js';
|
5
|
+
export type KyselyRizzolverBuilder<DB, T extends Partial<Record<keyof DB & string, readonly string[]>>, DefaultGatherDepth extends ValidFkDepth = typeof MAX_FK_GATHER_DEPTH> = T extends Record<keyof DB & string, readonly string[]> ? _KyselyRizzolverBuilder_Valid<DB, T, DefaultGatherDepth> : _KyselyRizzolverBuilder_InProgress<DB, T, DefaultGatherDepth>;
|
6
|
+
type _KyselyRizzolverBuilder_Valid<DB, T extends Record<keyof DB & string, readonly string[]>, DefaultGatherDepth extends ValidFkDepth = typeof MAX_FK_GATHER_DEPTH> = {
|
7
|
+
defaultGatherDepth<NewDepth extends ValidFkDepth>(depth: NewDepth): _KyselyRizzolverBuilder_Valid<DB, T, NewDepth>;
|
8
|
+
build<FKDefs extends KyselyRizzolverFKs<DB>>(fkBuilderCb: FkDefsBuilderCallback<DB, FKDefs>): KyselyRizzolver<DB, T, Simplify<FKDefs>, DefaultGatherDepth>;
|
9
|
+
build(): KyselyRizzolver<DB, T, {}, DefaultGatherDepth>;
|
10
|
+
};
|
11
|
+
type _KyselyRizzolverBuilder_InProgress<DB, T extends Partial<Record<keyof DB & string, readonly string[]>>, DefaultGatherDepth extends ValidFkDepth = typeof MAX_FK_GATHER_DEPTH> = {
|
12
|
+
table<K extends keyof DB & string, U extends readonly (keyof DB[K])[]>(name: K, fields: U & ([keyof DB[K]] extends [U[number]] ? unknown : `Missing key: ${Exclude<keyof DB[K] & string, U[number]>}`)): KyselyRizzolverBuilder<DB, T & {
|
13
|
+
[key in K]: U;
|
14
|
+
}, DefaultGatherDepth>;
|
15
|
+
};
|
16
|
+
export declare function newKyselyRizzolverBuilder<DB, T extends Partial<Record<keyof DB & string, readonly string[]>>, DefaultGatherDepth extends ValidFkDepth = typeof MAX_FK_GATHER_DEPTH>(fields: T, defaultGatherDepth?: DefaultGatherDepth): KyselyRizzolverBuilder<DB, T>;
|
17
|
+
export {};
|
@@ -0,0 +1,23 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.newKyselyRizzolverBuilder = newKyselyRizzolverBuilder;
|
4
|
+
const kysely_rizzolver_fk_builder_js_1 = require("./kysely-rizzolver-fk-builder.js");
|
5
|
+
const kysely_rizzolver_js_1 = require("./kysely-rizzolver.js");
|
6
|
+
function newKyselyRizzolverBuilder(fields, defaultGatherDepth) {
|
7
|
+
return {
|
8
|
+
table(tableName, tableFields) {
|
9
|
+
return newKyselyRizzolverBuilder({
|
10
|
+
...fields,
|
11
|
+
[tableName]: tableFields
|
12
|
+
});
|
13
|
+
},
|
14
|
+
defaultGatherDepth(depth) {
|
15
|
+
return newKyselyRizzolverBuilder(fields, depth);
|
16
|
+
},
|
17
|
+
build(cb) {
|
18
|
+
const defs = cb?.((0, kysely_rizzolver_fk_builder_js_1.newKyselyRizzolverFkBuilder)({}));
|
19
|
+
return new kysely_rizzolver_js_1.KyselyRizzolver(fields, defs ?? {}, defaultGatherDepth);
|
20
|
+
}
|
21
|
+
};
|
22
|
+
}
|
23
|
+
//# sourceMappingURL=kysely-rizzolver-builder.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"kysely-rizzolver-builder.js","sourceRoot":"","sources":["../../src/kysely-rizzolver-builder.ts"],"names":[],"mappings":";;AA4CA,8DA4BC;AAtED,qFAG0C;AAC1C,+DAAiF;AAsCjF,SAAgB,yBAAyB,CAIvC,MAAS,EAAE,kBAAuC;IACnD,OAAO;QACN,KAAK,CACJ,SAAY,EACZ,WAG+D;YAE/D,OAAO,yBAAyB,CAA6C;gBAC5E,GAAG,MAAM;gBACT,CAAC,SAAS,CAAC,EAAE,WAAW;aACxB,CAAQ,CAAC;QACX,CAAC;QAED,kBAAkB,CAAiC,KAAgB;YAClE,OAAO,yBAAyB,CAAmB,MAAM,EAAE,KAAK,CAAC,CAAC;QACnE,CAAC;QAED,KAAK,CAAwC,EAAsC;YAClF,MAAM,IAAI,GAAG,EAAE,EAAE,CAAC,IAAA,4DAA2B,EAAK,EAAE,CAAC,CAAC,CAAC;YACvD,OAAO,IAAI,qCAAe,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,EAAE,kBAAkB,CAAC,CAAC;QACpE,CAAC;KAC2C,CAAC;AAC/C,CAAC"}
|
@@ -0,0 +1,20 @@
|
|
1
|
+
import { KyselyRizzolverFKs } from './kysely-rizzolver.js';
|
2
|
+
import { NumericFields } from './type-helpers.js';
|
3
|
+
export type FkDefsBuilderCallback<DB, T> = (builder: KyselyRizzolverFkBuilder<DB, {}>) => T;
|
4
|
+
export type KyselyRizzolverFkBuilder<DB, FKDefs extends KyselyRizzolverFKs<DB> = {}> = {
|
5
|
+
add<FromTable extends keyof DB & string, FromField extends Exclude<NumericFields<DB[FromTable]> & string, 'id'>, ToTable extends keyof DB & string, ToField extends NumericFields<DB[ToTable]> & string, FkName extends string, Nullable extends boolean = false>(fromTable: FromTable, fromField: FromField, toTable: ToTable, toField: ToField, fkName: FkName, nullable?: Nullable): KyselyRizzolverFkBuilder<DB, FKDefsAddEntry<DB, FKDefs, FromTable, FromField, ToTable, ToField, FkName, Nullable>>;
|
6
|
+
build(): FKDefs;
|
7
|
+
};
|
8
|
+
type FKDefsAddEntry<DB, FKDefs extends KyselyRizzolverFKs<DB>, FromTable extends keyof DB & string, FromField extends string, ToTable extends keyof DB & string, ToField extends string, FkName extends string, Nullable extends boolean> = FKDefs & {
|
9
|
+
[K in FromTable]: {
|
10
|
+
[N in FkName]: FKDefsEntry<DB, FromField, ToTable, ToField, Nullable>;
|
11
|
+
};
|
12
|
+
};
|
13
|
+
export type FKDefsEntry<DB, FromField extends string, ToTable extends keyof DB & string, ToField extends string, Nullable extends boolean> = {
|
14
|
+
myField: FromField;
|
15
|
+
otherTable: ToTable;
|
16
|
+
otherField: ToField;
|
17
|
+
isNullable: Nullable;
|
18
|
+
};
|
19
|
+
export declare function newKyselyRizzolverFkBuilder<DB, FKDefs extends KyselyRizzolverFKs<DB> = {}>(fkDefs: FKDefs): KyselyRizzolverFkBuilder<DB, FKDefs>;
|
20
|
+
export {};
|
@@ -0,0 +1,23 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.newKyselyRizzolverFkBuilder = newKyselyRizzolverFkBuilder;
|
4
|
+
function newKyselyRizzolverFkBuilder(fkDefs) {
|
5
|
+
return {
|
6
|
+
add(fromTable, fromField, toTable, toField, fkName, nullable) {
|
7
|
+
const defsForTable = (fkDefs[fromTable] ?? {});
|
8
|
+
const fkEntry = {
|
9
|
+
myField: fromField,
|
10
|
+
otherTable: toTable,
|
11
|
+
otherField: toField,
|
12
|
+
isNullable: nullable ?? false
|
13
|
+
};
|
14
|
+
defsForTable[fkName] = fkEntry;
|
15
|
+
fkDefs[fromTable] = defsForTable;
|
16
|
+
return newKyselyRizzolverFkBuilder(fkDefs);
|
17
|
+
},
|
18
|
+
build() {
|
19
|
+
return fkDefs;
|
20
|
+
}
|
21
|
+
};
|
22
|
+
}
|
23
|
+
//# sourceMappingURL=kysely-rizzolver-fk-builder.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"kysely-rizzolver-fk-builder.js","sourceRoot":"","sources":["../../src/kysely-rizzolver-fk-builder.ts"],"names":[],"mappings":";;AAwDA,kEAqCC;AArCD,SAAgB,2BAA2B,CAC1C,MAAc;IAEd,OAAO;QACN,GAAG,CAQF,SAAoB,EACpB,SAAoB,EACpB,OAAgB,EAChB,OAAgB,EAChB,MAAc,EACd,QAAmB;YAEnB,MAAM,YAAY,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAmC,CAAC;YACjF,MAAM,OAAO,GAAG;gBACf,OAAO,EAAE,SAAS;gBAClB,UAAU,EAAE,OAAO;gBACnB,UAAU,EAAE,OAAO;gBACnB,UAAU,EAAE,QAAQ,IAAI,KAAK;aAC6B,CAAC;YAE5D,YAAY,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC;YAC/B,MAAM,CAAC,SAAS,CAAC,GAAG,YAAY,CAAC;YAEjC,OAAO,2BAA2B,CAAU,MAAM,CAAC,CAAC;QACrD,CAAC;QAED,KAAK;YACJ,OAAO,MAAM,CAAC;QACf,CAAC;KACD,CAAC;AACH,CAAC"}
|
@@ -1,10 +1,17 @@
|
|
1
|
+
import type { Kysely } from 'kysely';
|
1
2
|
import { type FetchResultFactory } from './fetch-result-factory.js';
|
3
|
+
import { FkGatherResultFactory } from './fk-gather-result-factory.js';
|
4
|
+
import { DBWithFk, GatherOpts, GatherWhereExpression, MAX_FK_GATHER_DEPTH, NoNullGatherOpts, ValidFkDepth } from './fks.js';
|
5
|
+
import { type ModelCollection } from './model-collection.js';
|
2
6
|
import { type QueryBuilder } from './query-builder.js';
|
3
7
|
import { type Selector } from './selector.js';
|
4
|
-
import {
|
5
|
-
export interface KyselyRizzolverBase<DB, T extends Record<keyof DB & string, readonly string[]>> {
|
6
|
-
readonly
|
7
|
-
|
8
|
+
import { WithMandatory } from './type-helpers.js';
|
9
|
+
export interface KyselyRizzolverBase<DB, T extends Record<keyof DB & string, readonly string[]>, FKDefs extends KyselyRizzolverFKs<DB>> {
|
10
|
+
readonly _types: Readonly<{
|
11
|
+
fields: T;
|
12
|
+
fkDefs: FKDefs;
|
13
|
+
dbfk: DBWithFk<DB, FKDefs>;
|
14
|
+
}>;
|
8
15
|
}
|
9
16
|
/**
|
10
17
|
* A {@link KyselyRizzolver} is a class that is used to define the structure of
|
@@ -17,14 +24,16 @@ export interface KyselyRizzolverBase<DB, T extends Record<keyof DB & string, rea
|
|
17
24
|
* {@link KyselyRizzolver.builder|.builderForSchema()} or
|
18
25
|
* {@link KyselyRizzolver.builderNoSchema|.builderNoSchema()}.
|
19
26
|
*/
|
20
|
-
export declare class KyselyRizzolver<DB, T extends Record<keyof DB & string, readonly string[]
|
21
|
-
readonly
|
22
|
-
readonly
|
23
|
-
|
27
|
+
export declare class KyselyRizzolver<DB, T extends Record<keyof DB & string, readonly string[]>, FKDefs extends KyselyRizzolverFKs<DB>, DefaultGatherDepth extends ValidFkDepth = typeof MAX_FK_GATHER_DEPTH> implements KyselyRizzolverBase<DB, T, FKDefs> {
|
28
|
+
readonly _types: KyselyRizzolverBase<DB, T, FKDefs>['_types'];
|
29
|
+
readonly fetchObjs: FetchResultFactory<DB>;
|
30
|
+
readonly gatherObjs: FkGatherResultFactory<DB, FKDefs>;
|
31
|
+
readonly defaultGatherDepth: DefaultGatherDepth;
|
32
|
+
constructor(fields: T, fks: FKDefs, defaultGatherDepth?: DefaultGatherDepth);
|
24
33
|
/**
|
25
34
|
* Intantiates a new {@link Selector} for the given table.
|
26
35
|
*/
|
27
|
-
newSelector<Table extends keyof DB & string, Alias extends string>(table: Table, alias: Alias): Selector<this, Table, Alias,
|
36
|
+
newSelector<Table extends keyof DB & string, Alias extends string>(table: Table, alias: Alias): Selector<this, Table, Alias, KyAllTableFields<this, Table>>;
|
28
37
|
/**
|
29
38
|
* Instantiates a new {@link QueryBuilder}.
|
30
39
|
*/
|
@@ -33,19 +42,25 @@ export declare class KyselyRizzolver<DB, T extends Record<keyof DB & string, rea
|
|
33
42
|
* Instantiates a new {@link ModelCollection}.
|
34
43
|
*/
|
35
44
|
newModelCollection(): ModelCollection<DB>;
|
45
|
+
gatherOne<Table extends keyof DB & string, Opts extends WithMandatory<GatherOpts<DB, ValidFkDepth>, 'depth'>>(db: Kysely<DB>, table: Table, where: GatherWhereExpression<DB, Table>, opts: Opts): Promise<ReturnType<typeof this.gatherObjs.newGatherOne<Table, Opts['depth']>>>;
|
46
|
+
gatherOne<Table extends keyof DB & string>(db: Kysely<DB>, table: Table, where: GatherWhereExpression<DB, Table>, opts?: Omit<GatherOpts<DB, any>, 'depth'>): Promise<ReturnType<typeof this.gatherObjs.newGatherOne<Table, DefaultGatherDepth>>>;
|
47
|
+
gatherOneX<Table extends keyof DB & string, Opts extends WithMandatory<GatherOpts<DB, ValidFkDepth>, 'depth'>>(db: Kysely<DB>, table: Table, where: GatherWhereExpression<DB, Table>, opts: Opts): Promise<ReturnType<typeof this.gatherObjs.newGatherOneX<Table, Opts['depth']>>>;
|
48
|
+
gatherOneX<Table extends keyof DB & string>(db: Kysely<DB>, table: Table, where: GatherWhereExpression<DB, Table>, opts?: Omit<GatherOpts<DB, any>, 'depth'>): Promise<ReturnType<typeof this.gatherObjs.newGatherOneX<Table, DefaultGatherDepth>>>;
|
49
|
+
gatherSome<Table extends keyof DB & string, Opts extends WithMandatory<NoNullGatherOpts<DB, ValidFkDepth>, 'depth'>>(db: Kysely<DB>, table: Table, where: GatherWhereExpression<DB, Table>, opts: Opts): Promise<ReturnType<typeof this.gatherObjs.newGatherSome<Table, Opts['depth']>>>;
|
50
|
+
gatherSome<Table extends keyof DB & string>(db: Kysely<DB>, table: Table, where: GatherWhereExpression<DB, Table>, opts?: Omit<NoNullGatherOpts<DB, any>, 'depth'>): Promise<ReturnType<typeof this.gatherObjs.newGatherSome<Table, DefaultGatherDepth>>>;
|
36
51
|
/**
|
37
52
|
* Starts building a new {@link KyselyRizzolver} using a builder pattern for
|
38
53
|
* a schema.
|
39
54
|
*
|
40
|
-
* Call {@link
|
55
|
+
* Call {@link KyselyRizzolverBuilder.table|.table()} for each
|
41
56
|
* table that exists on the `DB` type parameter with all of their column
|
42
57
|
* names as a const array. After all tables have been added, call
|
43
|
-
* {@link
|
58
|
+
* {@link KyselyRizzolverBuilder.build|.build()} to get a new
|
44
59
|
* {@link KyselyRizzolver} instance.
|
45
60
|
*
|
46
61
|
* Example:
|
47
62
|
* ```
|
48
|
-
* const rizzolver = KyselyRizzolver.
|
63
|
+
* const rizzolver = KyselyRizzolver.builder<DB>()
|
49
64
|
* .table('user', ['id', 'name', 'email'] as const)
|
50
65
|
* .table('post', ['id', 'title', 'content', 'authorId'] as const)
|
51
66
|
* .build();
|
@@ -53,86 +68,50 @@ export declare class KyselyRizzolver<DB, T extends Record<keyof DB & string, rea
|
|
53
68
|
*
|
54
69
|
* Note: The `as const` assertion is necessary for correct type inference.
|
55
70
|
*/
|
56
|
-
static
|
57
|
-
/**
|
58
|
-
* Starts building a new {@link KyselyRizzolver} using a builder pattern
|
59
|
-
* without a schema.
|
60
|
-
*
|
61
|
-
* Call {@link KyselyRizzolverBuilderNoSchema.table|.table()} for each
|
62
|
-
* table with all of their column names as a const array.
|
63
|
-
*
|
64
|
-
* Example:
|
65
|
-
* ```
|
66
|
-
* const rizzolver = KyselyRizzolver.builder()
|
67
|
-
* .table('user', ['id', 'name', 'email'] as const) // note `as const` is necessary
|
68
|
-
* .table('post', ['id', 'title', 'content', 'authorId'] as const)
|
69
|
-
* .build();
|
70
|
-
* ```
|
71
|
-
*
|
72
|
-
* Since this version of builder is schemaless, it cannot infer the value
|
73
|
-
* types for the columns. The `user` type will be `{ id: unknown, name:
|
74
|
-
* unknown, email: unknown }`.
|
75
|
-
*
|
76
|
-
* You may call
|
77
|
-
* {@link KyselyRizzolverBuilderNoSchema.asModel|.asModel\<M\>()}
|
78
|
-
* immediately after the .table() call to provide the types, where `M` is an
|
79
|
-
* type like `{ column1: type1, column2: type2, ... }`.
|
80
|
-
*
|
81
|
-
* Example:
|
82
|
-
* ```
|
83
|
-
* const rizzolver = KyselyRizzolver.builder()
|
84
|
-
* .table('user', ['id', 'name', 'email'] as const)
|
85
|
-
* .asModel<{id: number, name: string, email: string}>()
|
86
|
-
* .table('post', ['id', 'title', 'content', 'authorId'] as const)
|
87
|
-
* .asModel<{id: number, title: string, content: string, authorId: number}>()
|
88
|
-
* .build();
|
89
|
-
* ```
|
90
|
-
*
|
91
|
-
* p.s. if your .table() and .asModel() columns differ, it will let you know
|
92
|
-
* at compile time ;)
|
93
|
-
*
|
94
|
-
* Once all tables have been added, call
|
95
|
-
* {@link KyselyRizzolverBuilderNoSchema.build|.build()} to get a new
|
96
|
-
* {@link KyselyRizzolver} instance.
|
97
|
-
*/
|
98
|
-
static builderNoSchema(): KyselyRizzolverBuilderNoSchema<{}, null>;
|
71
|
+
static builder<DB>(): import("./kysely-rizzolver-builder.js").KyselyRizzolverBuilder<DB, {}, 3>;
|
99
72
|
}
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
table<K extends string, U extends readonly string[]>(name: K, fields: U): KyselyRizzolverBuilderNoSchema<T & {
|
111
|
-
[k in K]: {
|
112
|
-
model: Record<U[number], unknown>;
|
113
|
-
columns: U;
|
114
|
-
};
|
115
|
-
}, K>;
|
116
|
-
asModel<M>(): Last extends keyof T ? keyof M extends T[Last]['columns'][number] ? T[Last]['columns'][number] extends keyof M ? KyselyRizzolverBuilderNoSchema<T & {
|
117
|
-
[k in Last]: {
|
118
|
-
model: M;
|
119
|
-
columns: T[k]['columns'];
|
73
|
+
/**
|
74
|
+
* The shape of the foreign key definitions on a {@link KyselyRizzolverBase}.
|
75
|
+
*/
|
76
|
+
export type KyselyRizzolverFKs<DB> = {
|
77
|
+
[table in keyof DB & string]?: {
|
78
|
+
[fkName: string]: {
|
79
|
+
myField: string;
|
80
|
+
otherTable: keyof DB & string;
|
81
|
+
otherField: string;
|
82
|
+
isNullable: boolean;
|
120
83
|
};
|
121
|
-
}
|
122
|
-
build(): KyselyRizzolver<{
|
123
|
-
[k in keyof T]: T[k]['model'];
|
124
|
-
}, {
|
125
|
-
[k in keyof T]: T[k]['columns'];
|
126
|
-
}>;
|
84
|
+
};
|
127
85
|
};
|
128
|
-
|
129
|
-
|
86
|
+
/**
|
87
|
+
* Extracts the `DB` type from a {@link KyselyRizzolverBase}.
|
88
|
+
*/
|
89
|
+
export type KyDB<KY extends KyselyRizzolverBase<any, any, any>> = KY extends KyselyRizzolverBase<infer DB, any, any> ? DB : never;
|
90
|
+
/**
|
91
|
+
* Variant of {@link TableName} that takes a {@link KyselyRizzolverBase} instead
|
92
|
+
* of a `DB` type.
|
93
|
+
*/
|
94
|
+
export type KyTableName<T extends KyselyRizzolverBase<any, any, any>> = keyof KyDB<T> & string;
|
95
|
+
/**
|
96
|
+
* Variant of {@link AnyTableField} that takes a {@link KyselyRizzolverBase}
|
97
|
+
* instead of a `DB` type.
|
98
|
+
*/
|
99
|
+
export type KyAnyTableField<KY extends KyselyRizzolverBase<any, any, any>, Table extends KyTableName<KY>> = keyof KyDB<KY>[Table] & string;
|
100
|
+
/**
|
101
|
+
* Variant of {@link AllTableFields} that takes a {@link KyselyRizzolverBase}
|
102
|
+
* instead of a `DB` type.
|
103
|
+
*/
|
104
|
+
export type KyAllTableFields<KY extends KyselyRizzolverBase<any, any, any>, Table extends KyTableName<KY>> = KY extends KyselyRizzolverBase<any, infer T, any> ? T[Table] extends infer U ? U extends readonly KyAnyTableField<KY, Table>[] ? U : never : never : never;
|
105
|
+
/**
|
106
|
+
* A union of all the known table names of a database.
|
107
|
+
*/
|
108
|
+
export type TableName<DB> = keyof DB & string;
|
130
109
|
/**
|
131
110
|
* A union of all the known fields of a table.
|
132
111
|
*/
|
133
|
-
export type AnyTableField<
|
112
|
+
export type AnyTableField<DB, Table extends TableName<DB>> = keyof DB[Table] & string;
|
134
113
|
/**
|
135
114
|
* An array of all the known fields of a table, in a type that is compatible
|
136
115
|
* with that table's ${@link Selectable} type.
|
137
116
|
*/
|
138
|
-
export type AllTableFields<
|
117
|
+
export type AllTableFields<DB, Table extends TableName<DB>> = AnyTableField<DB, Table>[];
|