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
@@ -2,9 +2,12 @@
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
3
|
exports.KyselyRizzolver = void 0;
|
4
4
|
const fetch_result_factory_js_1 = require("./fetch-result-factory.js");
|
5
|
+
const fk_gather_result_factory_js_1 = require("./fk-gather-result-factory.js");
|
6
|
+
const fks_js_1 = require("./fks.js");
|
7
|
+
const kysely_rizzolver_builder_js_1 = require("./kysely-rizzolver-builder.js");
|
8
|
+
const model_collection_js_1 = require("./model-collection.js");
|
5
9
|
const query_builder_js_1 = require("./query-builder.js");
|
6
10
|
const selector_js_1 = require("./selector.js");
|
7
|
-
const model_collection_js_1 = require("./model-collection.js");
|
8
11
|
/**
|
9
12
|
* A {@link KyselyRizzolver} is a class that is used to define the structure of
|
10
13
|
* a database schema.
|
@@ -17,11 +20,19 @@ const model_collection_js_1 = require("./model-collection.js");
|
|
17
20
|
* {@link KyselyRizzolver.builderNoSchema|.builderNoSchema()}.
|
18
21
|
*/
|
19
22
|
class KyselyRizzolver {
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
23
|
+
_types;
|
24
|
+
fetchObjs;
|
25
|
+
gatherObjs;
|
26
|
+
defaultGatherDepth;
|
27
|
+
constructor(fields, fks, defaultGatherDepth) {
|
28
|
+
this._types = Object.freeze({
|
29
|
+
fields,
|
30
|
+
fkDefs: fks,
|
31
|
+
dbfk: null
|
32
|
+
});
|
33
|
+
this.fetchObjs = (0, fetch_result_factory_js_1.newFetchResultFactory)();
|
34
|
+
this.gatherObjs = (0, fk_gather_result_factory_js_1.newFkGatherResultFactory)();
|
35
|
+
this.defaultGatherDepth = defaultGatherDepth ?? fks_js_1.MAX_FK_GATHER_DEPTH;
|
25
36
|
}
|
26
37
|
/**
|
27
38
|
* Intantiates a new {@link Selector} for the given table.
|
@@ -41,19 +52,43 @@ class KyselyRizzolver {
|
|
41
52
|
newModelCollection() {
|
42
53
|
return (0, model_collection_js_1.newModelCollection)();
|
43
54
|
}
|
55
|
+
async gatherOne(db, table, where, opts) {
|
56
|
+
const depth = opts?.depth ?? this.defaultGatherDepth;
|
57
|
+
const modelCollection = opts?.modelCollection ?? this.newModelCollection();
|
58
|
+
const gather = await (0, fks_js_1.gatherModelFks)(this, db, table, where, opts);
|
59
|
+
const result = gather[0] ?? undefined;
|
60
|
+
return this.gatherObjs.newGatherOne(table, depth, result, modelCollection);
|
61
|
+
}
|
62
|
+
async gatherOneX(db, table, where, opts) {
|
63
|
+
const depth = opts?.depth ?? this.defaultGatherDepth;
|
64
|
+
const modelCollection = opts?.modelCollection ?? this.newModelCollection();
|
65
|
+
const gather = await (0, fks_js_1.gatherModelFks)(this, db, table, where, opts);
|
66
|
+
const result = gather[0] ?? undefined;
|
67
|
+
return this.gatherObjs.newGatherOneX(table, depth, result, modelCollection);
|
68
|
+
}
|
69
|
+
async gatherSome(db, table, where, opts) {
|
70
|
+
const depth = opts?.depth ?? this.defaultGatherDepth;
|
71
|
+
const modelCollection = opts?.modelCollection ?? this.newModelCollection();
|
72
|
+
const gather = await (0, fks_js_1.gatherModelFks)(this, db, table, where, opts);
|
73
|
+
const result = gather.filter((r) => !!r);
|
74
|
+
if (result.length < gather.length) {
|
75
|
+
throw new Error('Expected no nulls in fkGatherSome result');
|
76
|
+
}
|
77
|
+
return this.gatherObjs.newGatherSome(table, depth, result, modelCollection);
|
78
|
+
}
|
44
79
|
/**
|
45
80
|
* Starts building a new {@link KyselyRizzolver} using a builder pattern for
|
46
81
|
* a schema.
|
47
82
|
*
|
48
|
-
* Call {@link
|
83
|
+
* Call {@link KyselyRizzolverBuilder.table|.table()} for each
|
49
84
|
* table that exists on the `DB` type parameter with all of their column
|
50
85
|
* names as a const array. After all tables have been added, call
|
51
|
-
* {@link
|
86
|
+
* {@link KyselyRizzolverBuilder.build|.build()} to get a new
|
52
87
|
* {@link KyselyRizzolver} instance.
|
53
88
|
*
|
54
89
|
* Example:
|
55
90
|
* ```
|
56
|
-
* const rizzolver = KyselyRizzolver.
|
91
|
+
* const rizzolver = KyselyRizzolver.builder<DB>()
|
57
92
|
* .table('user', ['id', 'name', 'email'] as const)
|
58
93
|
* .table('post', ['id', 'title', 'content', 'authorId'] as const)
|
59
94
|
* .build();
|
@@ -61,87 +96,9 @@ class KyselyRizzolver {
|
|
61
96
|
*
|
62
97
|
* Note: The `as const` assertion is necessary for correct type inference.
|
63
98
|
*/
|
64
|
-
static
|
65
|
-
return
|
66
|
-
}
|
67
|
-
/**
|
68
|
-
* Starts building a new {@link KyselyRizzolver} using a builder pattern
|
69
|
-
* without a schema.
|
70
|
-
*
|
71
|
-
* Call {@link KyselyRizzolverBuilderNoSchema.table|.table()} for each
|
72
|
-
* table with all of their column names as a const array.
|
73
|
-
*
|
74
|
-
* Example:
|
75
|
-
* ```
|
76
|
-
* const rizzolver = KyselyRizzolver.builder()
|
77
|
-
* .table('user', ['id', 'name', 'email'] as const) // note `as const` is necessary
|
78
|
-
* .table('post', ['id', 'title', 'content', 'authorId'] as const)
|
79
|
-
* .build();
|
80
|
-
* ```
|
81
|
-
*
|
82
|
-
* Since this version of builder is schemaless, it cannot infer the value
|
83
|
-
* types for the columns. The `user` type will be `{ id: unknown, name:
|
84
|
-
* unknown, email: unknown }`.
|
85
|
-
*
|
86
|
-
* You may call
|
87
|
-
* {@link KyselyRizzolverBuilderNoSchema.asModel|.asModel\<M\>()}
|
88
|
-
* immediately after the .table() call to provide the types, where `M` is an
|
89
|
-
* type like `{ column1: type1, column2: type2, ... }`.
|
90
|
-
*
|
91
|
-
* Example:
|
92
|
-
* ```
|
93
|
-
* const rizzolver = KyselyRizzolver.builder()
|
94
|
-
* .table('user', ['id', 'name', 'email'] as const)
|
95
|
-
* .asModel<{id: number, name: string, email: string}>()
|
96
|
-
* .table('post', ['id', 'title', 'content', 'authorId'] as const)
|
97
|
-
* .asModel<{id: number, title: string, content: string, authorId: number}>()
|
98
|
-
* .build();
|
99
|
-
* ```
|
100
|
-
*
|
101
|
-
* p.s. if your .table() and .asModel() columns differ, it will let you know
|
102
|
-
* at compile time ;)
|
103
|
-
*
|
104
|
-
* Once all tables have been added, call
|
105
|
-
* {@link KyselyRizzolverBuilderNoSchema.build|.build()} to get a new
|
106
|
-
* {@link KyselyRizzolver} instance.
|
107
|
-
*/
|
108
|
-
static builderNoSchema() {
|
109
|
-
return _newKyselyRizzolverBuilderNoSchema({}, null);
|
99
|
+
static builder() {
|
100
|
+
return (0, kysely_rizzolver_builder_js_1.newKyselyRizzolverBuilder)({});
|
110
101
|
}
|
111
102
|
}
|
112
103
|
exports.KyselyRizzolver = KyselyRizzolver;
|
113
|
-
|
114
|
-
return {
|
115
|
-
table(tableName, tableFields) {
|
116
|
-
return _newKyselyRizzolverBuilderForSchema({
|
117
|
-
...fields,
|
118
|
-
[tableName]: tableFields
|
119
|
-
});
|
120
|
-
},
|
121
|
-
build() {
|
122
|
-
return new KyselyRizzolver(fields);
|
123
|
-
}
|
124
|
-
};
|
125
|
-
}
|
126
|
-
function _newKyselyRizzolverBuilderNoSchema(fields, last) {
|
127
|
-
return {
|
128
|
-
table(tableName, tableFields) {
|
129
|
-
return _newKyselyRizzolverBuilderNoSchema({
|
130
|
-
...fields,
|
131
|
-
[tableName]: {
|
132
|
-
model: null,
|
133
|
-
columns: tableFields
|
134
|
-
}
|
135
|
-
}, tableName);
|
136
|
-
},
|
137
|
-
asModel() {
|
138
|
-
if (!last) {
|
139
|
-
throw new Error('asModel() must be called after table()');
|
140
|
-
}
|
141
|
-
return _newKyselyRizzolverBuilderNoSchema(fields, null);
|
142
|
-
},
|
143
|
-
build() {
|
144
|
-
return new KyselyRizzolver(Object.fromEntries(Object.entries(fields).map((entry) => [entry[0], entry[1].columns])));
|
145
|
-
}
|
146
|
-
};
|
147
|
-
}
|
104
|
+
//# sourceMappingURL=kysely-rizzolver.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"kysely-rizzolver.js","sourceRoot":"","sources":["../../src/kysely-rizzolver.ts"],"names":[],"mappings":"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"}
|
@@ -17,7 +17,11 @@ import type { Selectable } from 'kysely';
|
|
17
17
|
*/
|
18
18
|
export type ModelCollection<DB> = {
|
19
19
|
add<Table extends keyof DB & string>(table: Table, selectable?: Selectable<DB[Table]>): ModelCollection<DB>;
|
20
|
-
|
20
|
+
addCollection(collection: ModelCollection<DB>): ModelCollection<DB>;
|
21
|
+
get(): Data<DB>;
|
22
|
+
get<Table extends keyof DB & string>(table: Table): Record<number, Selectable<DB[Table]>>;
|
23
|
+
get<Table extends keyof DB & string>(table: Table, id: number): Selectable<DB[Table]> | undefined;
|
24
|
+
getX<Table extends keyof DB & string>(table: Table, id: number): Record<number, Selectable<DB[Table]>>;
|
21
25
|
};
|
22
26
|
export declare function newModelCollection<DB>(init?: Data<DB>): ModelCollection<DB>;
|
23
27
|
type Data<DB> = {
|
@@ -17,8 +17,30 @@ function newModelCollection(init = {}) {
|
|
17
17
|
collection[table][selectable.id] = selectable;
|
18
18
|
return this;
|
19
19
|
},
|
20
|
-
|
21
|
-
|
20
|
+
addCollection(collection) {
|
21
|
+
for (const [table, entries] of Object.entries(collection.get())) {
|
22
|
+
for (const [id, model] of Object.entries(entries)) {
|
23
|
+
this.add(table, model);
|
24
|
+
}
|
25
|
+
}
|
26
|
+
return this;
|
27
|
+
},
|
28
|
+
get(table, id) {
|
29
|
+
if (!table) {
|
30
|
+
return collection;
|
31
|
+
}
|
32
|
+
if (!id) {
|
33
|
+
return collection[table] ?? {};
|
34
|
+
}
|
35
|
+
return collection[table]?.[id];
|
36
|
+
},
|
37
|
+
getX(table, id) {
|
38
|
+
const result = this.get(table, id);
|
39
|
+
if (!result) {
|
40
|
+
throw new Error(`Model not found in ModelCollection for table ${table} with id ${id}`);
|
41
|
+
}
|
42
|
+
return result;
|
22
43
|
}
|
23
44
|
};
|
24
45
|
}
|
46
|
+
//# sourceMappingURL=model-collection.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"model-collection.js","sourceRoot":"","sources":["../../src/model-collection.ts"],"names":[],"mappings":";;AAkCA,gDAmDC;AAnDD,SAAgB,kBAAkB,CAAK,OAAiB,EAAE;IACzD,MAAM,UAAU,GAAa,EAAE,GAAG,IAAI,EAAE,CAAC;IAEzC,OAAO;QACN,GAAG,CAAkC,KAAY,EAAE,UAAkC;YACpF,IACC,CAAC,UAAU;gBACX,CAAC,CAAC,IAAI,IAAI,UAAU,CAAC;gBACrB,CAAC,UAAU,CAAC,EAAE;gBACd,OAAO,UAAU,CAAC,EAAE,KAAK,QAAQ,EAChC,CAAC;gBACF,OAAO,IAAI,CAAC;YACb,CAAC;YAED,IAAI,CAAC,CAAC,KAAK,IAAI,UAAU,CAAC,EAAE,CAAC;gBAC5B,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;YACxB,CAAC;YAED,UAAU,CAAC,KAAK,CAAE,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC;YAC/C,OAAO,IAAI,CAAC;QACb,CAAC;QAED,aAAa,CAAC,UAA+B;YAC5C,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;gBACjE,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAc,CAAC,EAAE,CAAC;oBAC1D,IAAI,CAAC,GAAG,CAAC,KAAY,EAAE,KAAY,CAAC,CAAC;gBACtC,CAAC;YACF,CAAC;YACD,OAAO,IAAI,CAAC;QACb,CAAC;QAED,GAAG,CAAkC,KAAa,EAAE,EAAW;YAC9D,IAAI,CAAC,KAAK,EAAE,CAAC;gBACZ,OAAO,UAAU,CAAC;YACnB,CAAC;YAED,IAAI,CAAC,EAAE,EAAE,CAAC;gBACT,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAChC,CAAC;YAED,OAAO,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAChC,CAAC;QAED,IAAI,CAAkC,KAAY,EAAE,EAAU;YAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACnC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CAAC,gDAAgD,KAAK,YAAY,EAAE,EAAE,CAAC,CAAC;YACxF,CAAC;YACD,OAAO,MAAM,CAAC;QACf,CAAC;KACsB,CAAC;AAC1B,CAAC"}
|
@@ -1,6 +1,6 @@
|
|
1
1
|
import { type FetchOneResult, type FetchOneXResult, type FetchSomeResult } from './fetch-result.js';
|
2
|
-
import type {
|
3
|
-
import { type Selector, type SelectorResult } from './selector.js';
|
2
|
+
import type { KyAllTableFields, KyAnyTableField, KyDB, KyselyRizzolverBase, KyTableName } from './kysely-rizzolver.js';
|
3
|
+
import { type Selector, type SelectorResult, AnySelector } from './selector.js';
|
4
4
|
import { type ModelCollection } from './model-collection.js';
|
5
5
|
import type { UnionToTuple } from './type-helpers.js';
|
6
6
|
/**
|
@@ -12,11 +12,12 @@ import type { UnionToTuple } from './type-helpers.js';
|
|
12
12
|
* method, followed by a call to {@link QueryBuilder.run} to parse the results
|
13
13
|
* of the query using a simple builder pattern.
|
14
14
|
*/
|
15
|
-
export interface QueryBuilder<KY extends KyselyRizzolverBase<any, any>, T extends Data<KY>> {
|
15
|
+
export interface QueryBuilder<KY extends KyselyRizzolverBase<any, any, any>, T extends Data<KY>> {
|
16
16
|
/**
|
17
17
|
* The record of {@link Selector} this query builder has, keyed by their alias.
|
18
18
|
*/
|
19
19
|
selectors: T;
|
20
|
+
numSelectors: UnionToTuple<keyof T>['length'];
|
20
21
|
/**
|
21
22
|
* Given a {@link Selector} alias `k`, Gets a `"table as alias"` expression
|
22
23
|
* for that selector.
|
@@ -37,7 +38,7 @@ export interface QueryBuilder<KY extends KyselyRizzolverBase<any, any>, T extend
|
|
37
38
|
* Gets a const array of all the fields of all the {@link Selector}s this
|
38
39
|
* query builder has. The order is arbitrary and should not be relied upon.
|
39
40
|
*/
|
40
|
-
allFields: FieldsOf<T, keyof T>;
|
41
|
+
allFields(): FieldsOf<T, keyof T>;
|
41
42
|
/**
|
42
43
|
* Given one of more {@link Selector} aliases, gets an array of
|
43
44
|
* `"table.field as alias"` expressions for all of their fields.
|
@@ -66,11 +67,11 @@ export interface QueryBuilder<KY extends KyselyRizzolverBase<any, any>, T extend
|
|
66
67
|
/**
|
67
68
|
* Adds a new {@link Selector} to the query builder.
|
68
69
|
*/
|
69
|
-
add<Table extends
|
70
|
+
add<Table extends KyTableName<KY>, Alias extends string, Keys extends readonly KyAnyTableField<KY, Table>[] = KyAllTableFields<KY, Table>>(selector: Selector<KY, Table, Alias, Keys>): MoreData<KY, T, Table, Alias, Keys>;
|
70
71
|
/**
|
71
72
|
* Adds a new {@link Selector} to the query builder.
|
72
73
|
*/
|
73
|
-
add<Table extends
|
74
|
+
add<Table extends KyTableName<KY>, Alias extends string, Keys extends readonly KyAnyTableField<KY, Table>[] = KyAllTableFields<KY, Table>>(table: Table, alias: Alias, keys?: Keys): MoreData<KY, T, Table, Alias, Keys>;
|
74
75
|
/**
|
75
76
|
* Parses the results of a query into the {@link Selectable} instances
|
76
77
|
* defined by the {@link Selector}s this query builder has.
|
@@ -85,7 +86,7 @@ export interface QueryBuilder<KY extends KyselyRizzolverBase<any, any>, T extend
|
|
85
86
|
* db
|
86
87
|
* .selectFrom(qb.table('u'))
|
87
88
|
* .leftJoin(qb.table('a'), (join) => join.onRef('u.address_id', '=', 'a.id'))
|
88
|
-
* .select(qb.allFields)
|
89
|
+
* .select(qb.allFields())
|
89
90
|
* .execute()
|
90
91
|
* );
|
91
92
|
*
|
@@ -122,19 +123,20 @@ export interface QueryBuilder<KY extends KyselyRizzolverBase<any, any>, T extend
|
|
122
123
|
run<Row extends Record<string, unknown>>(rows: Row[]): DeferredResult<KY, T, Row>;
|
123
124
|
run<Row extends Record<string, unknown>>(callback: (qb: this) => Promise<Row[]>): DeferredResult<KY, T, Row>;
|
124
125
|
}
|
125
|
-
export
|
126
|
-
|
126
|
+
export type AnyQueryBuilder = QueryBuilder<KyselyRizzolverBase<any, any, any>, Record<string, AnySelector<any, string, string, string[]>>>;
|
127
|
+
export declare function newQueryBuilder<KY extends KyselyRizzolverBase<any, any, any>>(rizzolver: KY): QueryBuilder<KY, {}>;
|
128
|
+
type Data<KY extends KyselyRizzolverBase<any, any, any>> = {
|
127
129
|
[alias: string]: Selector<KY, any, string, any>;
|
128
130
|
};
|
129
|
-
type MoreData<KY extends KyselyRizzolverBase<any, any>, T extends Data<KY>, Table extends
|
131
|
+
type MoreData<KY extends KyselyRizzolverBase<any, any, any>, T extends Data<KY>, Table extends KyTableName<KY>, A extends string, K extends readonly KyAnyTableField<KY, Table>[] = KyAllTableFields<KY, Table>> = QueryBuilder<KY, T & {
|
130
132
|
[k in A]: Selector<KY, Table, A, K>;
|
131
133
|
}>;
|
132
|
-
interface DeferredResult<KY extends KyselyRizzolverBase<any, any>, T extends Data<KY>, Row extends Record<string, unknown>> extends Promise<Result<KY, T, Row>> {
|
134
|
+
interface DeferredResult<KY extends KyselyRizzolverBase<any, any, any>, T extends Data<KY>, Row extends Record<string, unknown>> extends Promise<Result<KY, T, Row>> {
|
133
135
|
newFetchOneResult<K extends keyof T>(selectorAlias: K): Promise<FetchOneResult<KyDB<KY>, T[K]['input']['table'], SelectorResult<KY, any, T[K]['input']['table'], T[K]['input']['tableFields']>[number]['model'] & {}>>;
|
134
136
|
newFetchOneXResult<K extends keyof T>(selectorAlias: K): Promise<FetchOneXResult<KyDB<KY>, T[K]['input']['table'], SelectorResult<KY, any, T[K]['input']['table'], T[K]['input']['tableFields']>[number]['model'] & {}>>;
|
135
137
|
newFetchSomeResult<K extends keyof T>(selectorAlias: K): Promise<FetchSomeResult<KyDB<KY>, T[K]['input']['table'], SelectorResult<KY, any, T[K]['input']['table'], T[K]['input']['tableFields']>[number]['model'] & {}>>;
|
136
138
|
}
|
137
|
-
type Result<KY extends KyselyRizzolverBase<any, any>, T extends Data<KY>, Row extends Record<string, unknown>> = {
|
139
|
+
type Result<KY extends KyselyRizzolverBase<any, any, any>, T extends Data<KY>, Row extends Record<string, unknown>> = {
|
138
140
|
first: {
|
139
141
|
row: Row;
|
140
142
|
selectors: {
|
@@ -8,12 +8,17 @@ function newQueryBuilder(rizzolver) {
|
|
8
8
|
const selectors = {};
|
9
9
|
return {
|
10
10
|
selectors,
|
11
|
+
get numSelectors() {
|
12
|
+
return Object.keys(selectors).length;
|
13
|
+
},
|
11
14
|
table(tableAlias) {
|
12
15
|
return selectors[tableAlias].selectTable;
|
13
16
|
},
|
14
|
-
allFields
|
15
|
-
.
|
16
|
-
|
17
|
+
allFields() {
|
18
|
+
return Object.values(selectors)
|
19
|
+
.map((selector) => selector.selectFields)
|
20
|
+
.flat();
|
21
|
+
},
|
17
22
|
fieldsOf(...tableAliases) {
|
18
23
|
return tableAliases.map((alias) => selectors[alias].selectFields).flat();
|
19
24
|
},
|
@@ -33,7 +38,7 @@ function newQueryBuilder(rizzolver) {
|
|
33
38
|
if (!alias) {
|
34
39
|
throw new Error('Must provide an alias when calling QueryBuilder.add with a table name');
|
35
40
|
}
|
36
|
-
selector = (0, selector_js_1.newSelector)(rizzolver, selectorOrTable, alias, (keys ?? rizzolver.fields[selectorOrTable]));
|
41
|
+
selector = (0, selector_js_1.newSelector)(rizzolver, selectorOrTable, alias, (keys ?? rizzolver._types.fields[selectorOrTable]));
|
37
42
|
}
|
38
43
|
else {
|
39
44
|
if (alias || keys) {
|
@@ -90,3 +95,4 @@ function newQueryBuilder(rizzolver) {
|
|
90
95
|
}
|
91
96
|
};
|
92
97
|
}
|
98
|
+
//# sourceMappingURL=query-builder.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"query-builder.js","sourceRoot":"","sources":["../../src/query-builder.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/selector.d.ts
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
import type { Selectable } from 'kysely';
|
2
|
-
import type { AllTableFields, AnyTableField, KyDB, KyselyRizzolverBase, TableName } from './kysely-rizzolver.js';
|
2
|
+
import type { AllTableFields, AnyTableField, KyAllTableFields, KyAnyTableField, KyDB, KyselyRizzolverBase, KyTableName, TableName } from './kysely-rizzolver.js';
|
3
3
|
/**
|
4
4
|
* A {@link Selector} makes it easier to build select expressions for a
|
5
5
|
* table in a type-safe way. It can process the results of queries into
|
@@ -8,7 +8,7 @@ import type { AllTableFields, AnyTableField, KyDB, KyselyRizzolverBase, TableNam
|
|
8
8
|
* {@link Selector} is a low level utility that is used by
|
9
9
|
* {@link QueryBuilder} to work with multiple selectors.
|
10
10
|
*/
|
11
|
-
export type
|
11
|
+
export type AnySelector<DB, Table extends TableName<DB>, Alias extends string, TableFields extends AnyTableField<DB, Table>[] = AllTableFields<DB, Table>> = {
|
12
12
|
input: {
|
13
13
|
/**
|
14
14
|
* The table name that's being selected from.
|
@@ -29,7 +29,66 @@ export type Selector<KY extends KyselyRizzolverBase<any, any>, Table extends Tab
|
|
29
29
|
/**
|
30
30
|
* A `"table as alias"` expression for using in select expressions.
|
31
31
|
*/
|
32
|
-
selectTable: TableAlias<
|
32
|
+
selectTable: TableAlias<DB, Table, Alias>;
|
33
|
+
/**
|
34
|
+
* An array of `"table.field as alias"` expressions for using in select expressions.
|
35
|
+
*/
|
36
|
+
selectFields: FieldsAsAliases<Alias, TableFields>;
|
37
|
+
/**
|
38
|
+
* A utility method that allows you to reference a specific field.
|
39
|
+
*/
|
40
|
+
field<Field extends TableFields[number]>(field: Field): {
|
41
|
+
str: `_${Alias}_${Field}`;
|
42
|
+
/**
|
43
|
+
* A utility method that allows you to reference the field from a different table alias.
|
44
|
+
*
|
45
|
+
* This is useful if you need to reference the field from a subquery for example.
|
46
|
+
*/
|
47
|
+
from<A extends string>(alias: A): `${A}.${FieldAlias<Alias, Field>}`;
|
48
|
+
};
|
49
|
+
/**
|
50
|
+
* Parses the results of a query into the model defined by this selector for each row.
|
51
|
+
*
|
52
|
+
* Example:
|
53
|
+
* ```
|
54
|
+
* const selector = newSelector('user', 'u');
|
55
|
+
* const data = await db.selectFrom(selector.tableAlias).selectAll().execute();
|
56
|
+
* const parsed = selector.select(data);
|
57
|
+
* // => type would be { row: Row, model: Selectable<User> | undefined }[]
|
58
|
+
* ```
|
59
|
+
*/
|
60
|
+
select<Row extends Record<string, unknown>>(rows: Row[]): AnySelectorResult<DB, Row, Table, TableFields>;
|
61
|
+
};
|
62
|
+
/**
|
63
|
+
* A {@link Selector} makes it easier to build select expressions for a
|
64
|
+
* table in a type-safe way. It can process the results of queries into
|
65
|
+
* Kysely's {@link Selectable} instances.
|
66
|
+
*
|
67
|
+
* {@link Selector} is a low level utility that is used by
|
68
|
+
* {@link QueryBuilder} to work with multiple selectors.
|
69
|
+
*/
|
70
|
+
export type Selector<KY extends KyselyRizzolverBase<any, any, any>, Table extends KyTableName<KY>, Alias extends string, TableFields extends readonly KyAnyTableField<KY, Table>[] = KyAllTableFields<KY, Table>> = {
|
71
|
+
input: {
|
72
|
+
/**
|
73
|
+
* The table name that's being selected from.
|
74
|
+
*/
|
75
|
+
table: Table;
|
76
|
+
/**
|
77
|
+
* The alias for the table.
|
78
|
+
*/
|
79
|
+
alias: Alias;
|
80
|
+
/**
|
81
|
+
* An array of the fields to be selected from the table.
|
82
|
+
*
|
83
|
+
* This can be omitted, in which case it will default to all the fields of
|
84
|
+
* the table.
|
85
|
+
*/
|
86
|
+
tableFields: TableFields;
|
87
|
+
};
|
88
|
+
/**
|
89
|
+
* A `"table as alias"` expression for using in select expressions.
|
90
|
+
*/
|
91
|
+
selectTable: KyTableAlias<KY, Table, Alias>;
|
33
92
|
/**
|
34
93
|
* An array of `"table.field as alias"` expressions for using in select expressions.
|
35
94
|
*/
|
@@ -59,13 +118,18 @@ export type Selector<KY extends KyselyRizzolverBase<any, any>, Table extends Tab
|
|
59
118
|
*/
|
60
119
|
select<Row extends Record<string, unknown>>(rows: Row[]): SelectorResult<KY, Row, Table, TableFields>;
|
61
120
|
};
|
62
|
-
export declare function newSelector<KY extends KyselyRizzolverBase<any, any>, Table extends
|
63
|
-
export declare function newSelector<KY extends KyselyRizzolverBase<any, any>, Table extends
|
64
|
-
export type SelectorResult<KY extends KyselyRizzolverBase<any, any>, Row extends Record<string, unknown>, Table extends
|
121
|
+
export declare function newSelector<KY extends KyselyRizzolverBase<any, any, any>, Table extends KyTableName<KY>, Alias extends string>(rizzolver: KY, tableName: Table, alias: Alias): Selector<KY, Table, Alias, KyAllTableFields<KY, Table>>;
|
122
|
+
export declare function newSelector<KY extends KyselyRizzolverBase<any, any, any>, Table extends KyTableName<KY>, Alias extends string, Keys extends readonly KyAnyTableField<KY, Table>[]>(rizzolver: KY, tableName: Table, alias: Alias, keys?: Keys): Selector<KY, Table, Alias, Keys>;
|
123
|
+
export type SelectorResult<KY extends KyselyRizzolverBase<any, any, any>, Row extends Record<string, unknown>, Table extends KyTableName<KY>, TableFields extends readonly KyAnyTableField<KY, Table>[] = KyAllTableFields<KY, Table>> = {
|
65
124
|
row: Row;
|
66
125
|
model: Selectable<Pick<KyDB<KY>[Table], TableFields[number]>> | undefined;
|
67
126
|
}[];
|
68
|
-
type
|
127
|
+
export type AnySelectorResult<DB, Row extends Record<string, unknown>, Table extends TableName<DB>, TableFields extends readonly AnyTableField<DB, Table>[] = AllTableFields<DB, Table>> = {
|
128
|
+
row: Row;
|
129
|
+
model: Selectable<Pick<DB[Table], TableFields[number]>> | undefined;
|
130
|
+
}[];
|
131
|
+
type KyTableAlias<KY extends KyselyRizzolverBase<any, any, any>, Table extends KyTableName<KY>, Alias extends string> = `${Table} as ${Alias}`;
|
132
|
+
type TableAlias<DB, Table extends TableName<DB>, Alias extends string> = `${Table} as ${Alias}`;
|
69
133
|
type FieldAlias<TableAlias extends string, TableField extends string> = `_${TableAlias}_${TableField}`;
|
70
134
|
type FieldAsAlias<TableAlias extends string, TableField extends string> = `${TableAlias}.${TableField} as ${FieldAlias<TableAlias, TableField>}`;
|
71
135
|
type FieldsAsAliases<TableAlias extends string, TableFields extends readonly string[]> = TableFields extends readonly [infer TableField extends string, ...infer Tail extends string[]] ? [FieldAsAlias<TableAlias, TableField>, ...FieldsAsAliases<TableAlias, Tail>] : [];
|
package/dist/cjs/selector.js
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
3
|
exports.newSelector = newSelector;
|
4
4
|
function newSelector(rizzolver, tableName, alias, keys) {
|
5
|
-
const effectiveKeys = (keys ?? rizzolver.fields[tableName]);
|
5
|
+
const effectiveKeys = (keys ?? rizzolver._types.fields[tableName]);
|
6
6
|
const tableAlias = `${tableName} as ${alias}`;
|
7
7
|
const fields = effectiveKeys.map((field) => `${alias}.${field} as _${alias}_${field}`);
|
8
8
|
function _rowToModel(result) {
|
@@ -43,3 +43,4 @@ function newSelector(rizzolver, tableName, alias, keys) {
|
|
43
43
|
};
|
44
44
|
return selector;
|
45
45
|
}
|
46
|
+
//# sourceMappingURL=selector.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"selector.js","sourceRoot":"","sources":["../../src/selector.ts"],"names":[],"mappings":";;AAsKA,kCAyDC;AAzDD,SAAgB,WAAW,CAKzB,SAAa,EAAE,SAAgB,EAAE,KAAY,EAAE,IAAW;IAC3D,MAAM,aAAa,GAAG,CAAC,IAAI,IAAI,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAS,CAAC;IAG3E,MAAM,UAAU,GAAG,GAAG,SAAS,OAAO,KAAK,EAAW,CAAC;IACvD,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAC/B,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,IAAI,KAAK,QAAQ,KAAK,IAAI,KAAK,EAAW,CAC7B,CAAC;IAElC,SAAS,WAAW,CAAC,MAA2C;QAC/D,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YACxC,OAAO,SAAS,CAAC;QAClB,CAAC;QAED,MAAM,KAAK,GAAG,EAAS,CAAC;QACxB,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;YACnC,MAAM,YAAY,GAAG,IAAI,KAAK,IAAI,KAAK,EAAW,CAAC;YACnD,KAAK,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,SAAS,CAAC;QAClD,CAAC;QACD,OAAO,KAAK,CAAC;IACd,CAAC;IAED,MAAM,QAAQ,GAAqC;QAClD,KAAK,EAAE;YACN,KAAK,EAAE,SAAS;YAChB,KAAK;YACL,WAAW,EAAE,aAAa;SAC1B;QACD,WAAW,EAAE,UAAU;QACvB,YAAY,EAAE,MAAM;QACpB,KAAK,CAA6B,KAAY;YAC7C,OAAO;gBACN,GAAG,EAAE,IAAI,KAAK,IAAI,KAAK,EAAE;gBACzB,IAAI,CAAmB,KAAQ;oBAC9B,OAAO,GAAG,KAAK,KAAK,KAAK,IAAI,KAAK,EAAE,CAAC;gBACtC,CAAC;aACQ,CAAC;QACZ,CAAC;QAED,MAAM,CAAsC,IAAW;YACtD,MAAM,IAAI,GAAoD,EAAE,CAAC;YAEjE,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACxB,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;gBAC/B,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;YAC3B,CAAC;YAED,OAAO,IAAI,CAAC;QACb,CAAC;KACQ,CAAC;IAEX,OAAO,QAAQ,CAAC;AACjB,CAAC"}
|
@@ -1,3 +1,4 @@
|
|
1
|
+
import type { Generated } from 'kysely';
|
1
2
|
/**
|
2
3
|
* I can't explain this.
|
3
4
|
*
|
@@ -8,4 +9,23 @@ type LastInUnion<U> = (U extends any ? () => U : never) extends infer F ? (F ext
|
|
8
9
|
* Recursively converts a union type to a tuple by splitting it into its head and tail.
|
9
10
|
*/
|
10
11
|
export type UnionToTuple<U, Last = LastInUnion<U>> = [U] extends [never] ? [] : [...UnionToTuple<Exclude<U, Last>>, Last];
|
12
|
+
/**
|
13
|
+
* Omit properties of `T` that are of type `never`.
|
14
|
+
*/
|
15
|
+
export type OmitNever<T> = {
|
16
|
+
[K in keyof T as T[K] extends never ? never : K]: T[K];
|
17
|
+
};
|
18
|
+
/**
|
19
|
+
* Omit properties of `T` that are of type `ValueType`.
|
20
|
+
*/
|
21
|
+
export type OmitByValue<T, ValueType> = OmitNever<{
|
22
|
+
[K in keyof T]: T[K] extends ValueType ? never : T[K];
|
23
|
+
}>;
|
24
|
+
export type WithMandatory<T, K extends keyof T> = T & {
|
25
|
+
[P in K]-?: T[P];
|
26
|
+
};
|
27
|
+
type IsNumericField<T> = T extends Generated<number> ? true : number & T extends never ? never : T extends number ? true : never;
|
28
|
+
export type NumericFields<T> = {
|
29
|
+
[K in keyof T]: [IsNumericField<T[K]>] extends [never] ? never : K;
|
30
|
+
}[keyof T];
|
11
31
|
export {};
|
package/dist/cjs/type-helpers.js
CHANGED
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"type-helpers.js","sourceRoot":"","sources":["../../src/type-helpers.ts"],"names":[],"mappings":""}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"fetch-result-factory.js","sourceRoot":"","sources":["../../src/fetch-result-factory.ts"],"names":[],"mappings":"AACA,OAAO,EACN,sBAAsB,EACtB,uBAAuB,EACvB,uBAAuB,EAIvB,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAwB,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAUjF,MAAM,UAAU,qBAAqB;IACpC,OAAO;QACN;;WAEG;QACH,WAAW,CACV,KAAQ,EACR,MAAqC,EACrC,MAA4B;YAE5B,MAAM,KAAK,kBAAkB,EAAM,CAAC;YACpC,IAAI,MAAM,EAAE,CAAC;gBACZ,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAC3B,CAAC;YAED,OAAO,iBAAiB,CAA2B,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAC3E,CAAC;QAED;;;;;;WAMG;QACH,YAAY,CACX,KAAQ,EACR,MAAqC,EACrC,MAA4B;YAE5B,MAAM,KAAK,kBAAkB,EAAM,CAAC;YACpC,IAAI,MAAM,EAAE,CAAC;gBACZ,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAC3B,CAAC;YAED,OAAO,kBAAkB,CAA2B,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAC5E,CAAC;QAED;;WAEG;QACH,YAAY,CACX,KAAQ,EACR,MAA2B,EAC3B,MAA4B;YAE5B,MAAM,KAAK,kBAAkB,EAAM,CAAC;YACpC,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;gBAC3B,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACzB,CAAC;YAED,OAAO,kBAAkB,CAA2B,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAC5E,CAAC;QAED;;WAEG;QACH,UAAU,CACT,KAAQ,EACR,MAAe;YAEf,OAAO,gBAAgB,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC;QAC3D,CAAC;QAED;;WAEG;QACH,WAAW,CACV,KAAQ,EACR,MAAe;YAEf,OAAO,iBAAiB,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC;QAC5D,CAAC;QAED;;WAEG;QACH,WAAW,CACV,KAAQ,EACR,MAAe;YAEf,OAAO,iBAAiB,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC;QAC5D,CAAC;QAED;;WAEG;QACH,gBAAgB,CACf,KAAQ,EACR,MAAe;YAEf,sBAAsB,CAAC,MAAM,CAAC,CAAC;YAE/B,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;gBAC5B,MAAM,IAAI,KAAK,CAAC,wCAAwC,KAAK,EAAE,CAAC,CAAC;YAClE,CAAC;QACF,CAAC;QAED;;WAEG;QACH,iBAAiB,CAChB,KAAQ,EACR,MAAe;YAEf,uBAAuB,CAAC,MAAM,CAAC,CAAC;YAEhC,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;gBAC5B,MAAM,IAAI,KAAK,CAAC,4DAA4D,KAAK,EAAE,CAAC,CAAC;YACtF,CAAC;QACF,CAAC;QAED;;WAEG;QACH,iBAAiB,CAChB,KAAQ,EACR,MAAe;YAEf,uBAAuB,CAAC,MAAM,CAAC,CAAC;YAEhC,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;gBAC5B,MAAM,IAAI,KAAK,CAAC,yCAAyC,KAAK,EAAE,CAAC,CAAC;YACnE,CAAC;QACF,CAAC;KACD,CAAC;AACH,CAAC"}
|
package/dist/esm/fetch-result.js
CHANGED
@@ -1,8 +1,10 @@
|
|
1
|
+
import { newModelCollection } from './model-collection.js';
|
1
2
|
/**
|
2
3
|
* Creates a new {@link FetchOneResult} instance.
|
3
4
|
*/
|
4
5
|
export function newFetchOneResult(table, result, models) {
|
5
6
|
const ref = { value: null };
|
7
|
+
models ??= newModelCollection();
|
6
8
|
const me = {
|
7
9
|
fetchType: 'fetchOne',
|
8
10
|
table,
|
@@ -29,6 +31,7 @@ export function newFetchOneXResult(table, result, models) {
|
|
29
31
|
if (!result) {
|
30
32
|
throw new Error('Expected a fetchOneX result');
|
31
33
|
}
|
34
|
+
models ??= newModelCollection();
|
32
35
|
const ref = { value: null };
|
33
36
|
const me = {
|
34
37
|
fetchType: 'fetchOne',
|
@@ -46,6 +49,7 @@ export function newFetchOneXResult(table, result, models) {
|
|
46
49
|
* Creates a new {@link FetchSomeResult} instance.
|
47
50
|
*/
|
48
51
|
export function newFetchSomeResult(table, result, models) {
|
52
|
+
models ??= newModelCollection();
|
49
53
|
return {
|
50
54
|
fetchType: 'fetchSome',
|
51
55
|
table,
|
@@ -103,3 +107,4 @@ export function assertIsFetchSomeResult(value) {
|
|
103
107
|
throw new Error('Expected a fetchSome result');
|
104
108
|
}
|
105
109
|
}
|
110
|
+
//# sourceMappingURL=fetch-result.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"fetch-result.js","sourceRoot":"","sources":["../../src/fetch-result.ts"],"names":[],"mappings":"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"}
|