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.
Files changed (78) hide show
  1. package/README.md +14 -10
  2. package/dist/cjs/fetch-result-factory.js +1 -0
  3. package/dist/cjs/fetch-result-factory.js.map +1 -0
  4. package/dist/cjs/fetch-result.d.ts +11 -8
  5. package/dist/cjs/fetch-result.js +5 -0
  6. package/dist/cjs/fetch-result.js.map +1 -0
  7. package/dist/cjs/fk-gather-result-factory.d.ts +69 -0
  8. package/dist/cjs/fk-gather-result-factory.js +111 -0
  9. package/dist/cjs/fk-gather-result-factory.js.map +1 -0
  10. package/dist/cjs/fk-gather-result.d.ts +115 -0
  11. package/dist/cjs/fk-gather-result.js +127 -0
  12. package/dist/cjs/fk-gather-result.js.map +1 -0
  13. package/dist/cjs/fks.d.ts +111 -0
  14. package/dist/cjs/fks.js +101 -0
  15. package/dist/cjs/fks.js.map +1 -0
  16. package/dist/cjs/index.d.ts +10 -4
  17. package/dist/cjs/index.js +17 -1
  18. package/dist/cjs/index.js.map +1 -0
  19. package/dist/cjs/kysely-rizzolver-builder.d.ts +17 -0
  20. package/dist/cjs/kysely-rizzolver-builder.js +23 -0
  21. package/dist/cjs/kysely-rizzolver-builder.js.map +1 -0
  22. package/dist/cjs/kysely-rizzolver-fk-builder.d.ts +20 -0
  23. package/dist/cjs/kysely-rizzolver-fk-builder.js +23 -0
  24. package/dist/cjs/kysely-rizzolver-fk-builder.js.map +1 -0
  25. package/dist/cjs/kysely-rizzolver.d.ts +64 -85
  26. package/dist/cjs/kysely-rizzolver.js +47 -90
  27. package/dist/cjs/kysely-rizzolver.js.map +1 -0
  28. package/dist/cjs/model-collection.d.ts +5 -1
  29. package/dist/cjs/model-collection.js +24 -2
  30. package/dist/cjs/model-collection.js.map +1 -0
  31. package/dist/cjs/query-builder.d.ts +14 -12
  32. package/dist/cjs/query-builder.js +10 -4
  33. package/dist/cjs/query-builder.js.map +1 -0
  34. package/dist/cjs/selector.d.ts +71 -7
  35. package/dist/cjs/selector.js +2 -1
  36. package/dist/cjs/selector.js.map +1 -0
  37. package/dist/cjs/type-helpers.d.ts +20 -0
  38. package/dist/cjs/type-helpers.js +1 -0
  39. package/dist/cjs/type-helpers.js.map +1 -0
  40. package/dist/esm/fetch-result-factory.js +1 -0
  41. package/dist/esm/fetch-result-factory.js.map +1 -0
  42. package/dist/esm/fetch-result.js +5 -0
  43. package/dist/esm/fetch-result.js.map +1 -0
  44. package/dist/esm/fk-gather-result-factory.js +108 -0
  45. package/dist/esm/fk-gather-result-factory.js.map +1 -0
  46. package/dist/esm/fk-gather-result.js +115 -0
  47. package/dist/esm/fk-gather-result.js.map +1 -0
  48. package/dist/esm/fks.js +96 -0
  49. package/dist/esm/fks.js.map +1 -0
  50. package/dist/esm/index.js +4 -1
  51. package/dist/esm/index.js.map +1 -0
  52. package/dist/esm/kysely-rizzolver-builder.js +20 -0
  53. package/dist/esm/kysely-rizzolver-builder.js.map +1 -0
  54. package/dist/esm/kysely-rizzolver-fk-builder.js +20 -0
  55. package/dist/esm/kysely-rizzolver-fk-builder.js.map +1 -0
  56. package/dist/esm/kysely-rizzolver.js +47 -90
  57. package/dist/esm/kysely-rizzolver.js.map +1 -0
  58. package/dist/esm/model-collection.js +24 -2
  59. package/dist/esm/model-collection.js.map +1 -0
  60. package/dist/esm/query-builder.js +10 -4
  61. package/dist/esm/query-builder.js.map +1 -0
  62. package/dist/esm/selector.js +2 -1
  63. package/dist/esm/selector.js.map +1 -0
  64. package/dist/esm/type-helpers.js +1 -0
  65. package/dist/esm/type-helpers.js.map +1 -0
  66. package/dist/types/fetch-result.d.ts +11 -8
  67. package/dist/types/fk-gather-result-factory.d.ts +69 -0
  68. package/dist/types/fk-gather-result.d.ts +115 -0
  69. package/dist/types/fks.d.ts +111 -0
  70. package/dist/types/index.d.ts +10 -4
  71. package/dist/types/kysely-rizzolver-builder.d.ts +17 -0
  72. package/dist/types/kysely-rizzolver-fk-builder.d.ts +20 -0
  73. package/dist/types/kysely-rizzolver.d.ts +64 -85
  74. package/dist/types/model-collection.d.ts +5 -1
  75. package/dist/types/query-builder.d.ts +14 -12
  76. package/dist/types/selector.d.ts +71 -7
  77. package/dist/types/type-helpers.d.ts +20 -0
  78. 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 {};
@@ -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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"}
@@ -1,10 +1,16 @@
1
1
  export { KyselyRizzolver } from './kysely-rizzolver.js';
2
- export type { AllTableFields, AnyTableField, KyselyRizzolverBuilderForSchema, KyselyRizzolverBuilderNoSchema, KyDB as RizzolverDB, TableName } from './kysely-rizzolver.js';
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 { type ModelCollection } from './model-collection.js';
5
- export interface KyselyRizzolverBase<DB, T extends Record<keyof DB & string, readonly string[]>> {
6
- readonly fields: T;
7
- readonly fetches: FetchResultFactory<DB>;
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[]>> implements KyselyRizzolverBase<DB, T> {
21
- readonly fields: T;
22
- readonly fetches: FetchResultFactory<DB>;
23
- constructor(fields: T);
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, AllTableFields<this, Table>>;
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 KyselyRizzolverBuilderForSchema.table|.table()} for each
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 KyselyRizzolverBuilderForSchema.build|.build()} to get a new
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.builderForSchema<DB>()
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 builderForSchema<DB>(): KyselyRizzolverBuilderForSchema<DB, {}>;
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
- export type KyselyRizzolverBuilderForSchema<DB, T extends Partial<Record<keyof DB & string, readonly string[]>>> = {
101
- table<K extends Exclude<keyof DB & string, keyof T>, 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]>}`)): KyselyRizzolverBuilderForSchema<DB, T & {
102
- [key in K]: U;
103
- }>;
104
- build(): T extends Record<keyof DB & string, readonly string[]> ? KyselyRizzolver<DB, T> : never;
105
- };
106
- export type KyselyRizzolverBuilderNoSchema<T extends Record<string, {
107
- model: any;
108
- columns: readonly string[];
109
- }>, Last extends keyof T | null> = {
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
- }, never> : `column '${Exclude<T[Last]['columns'][number], keyof M & string>}' defined in table() but missing from asModel()` : `column '${Exclude<keyof M & string, T[Last]['columns'][number]>}' defined in asModel() but missing from table()` : `asModel() must be called after table()`;
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
- export type KyDB<KY extends KyselyRizzolverBase<any, any>> = KY extends KyselyRizzolverBase<infer DB, any> ? DB : never;
129
- export type TableName<T extends KyselyRizzolverBase<any, any>> = keyof KyDB<T> & string;
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<KY extends KyselyRizzolverBase<any, any>, Table extends TableName<KY>> = keyof KyDB<KY>[Table] & string;
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<KY extends KyselyRizzolverBase<any, any>, Table extends TableName<KY>> = KY extends KyselyRizzolverBase<any, infer T> ? T[Table] extends infer U ? U extends readonly AnyTableField<KY, Table>[] ? U : never : never : never;
117
+ export type AllTableFields<DB, Table extends TableName<DB>> = AnyTableField<DB, Table>[];