@pothos/plugin-drizzle 0.18.1 → 0.19.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +357 -0
- package/README.md +1199 -563
- package/dts/connection-helpers.d.ts +18 -8
- package/dts/connection-helpers.d.ts.map +1 -1
- package/dts/drizzle-field-builder.d.ts +4 -11
- package/dts/drizzle-field-builder.d.ts.map +1 -1
- package/dts/global-types.d.ts.map +1 -1
- package/dts/index.d.ts.map +1 -1
- package/dts/model-loader.d.ts +18 -17
- package/dts/model-loader.d.ts.map +1 -1
- package/dts/types.d.ts +82 -22
- package/dts/types.d.ts.map +1 -1
- package/dts/utils/adapter.d.ts +39 -0
- package/dts/utils/adapter.d.ts.map +1 -0
- package/dts/utils/await-selections.d.ts +12 -0
- package/dts/utils/await-selections.d.ts.map +1 -0
- package/dts/utils/config.d.ts +23 -3
- package/dts/utils/config.d.ts.map +1 -1
- package/dts/utils/cursors.d.ts +6 -6
- package/dts/utils/cursors.d.ts.map +1 -1
- package/dts/utils/map-query.d.ts +22 -21
- package/dts/utils/map-query.d.ts.map +1 -1
- package/dts/utils/path-info.d.ts +13 -0
- package/dts/utils/path-info.d.ts.map +1 -0
- package/dts/utils/relation-filter.d.ts +48 -0
- package/dts/utils/relation-filter.d.ts.map +1 -0
- package/dts/utils/selections.d.ts +2 -21
- package/dts/utils/selections.d.ts.map +1 -1
- package/esm/connection-helpers.d.ts +18 -8
- package/esm/connection-helpers.d.ts.map +1 -1
- package/esm/connection-helpers.js +52 -19
- package/esm/connection-helpers.js.map +1 -1
- package/esm/drizzle-field-builder.d.ts +4 -11
- package/esm/drizzle-field-builder.d.ts.map +1 -1
- package/esm/drizzle-field-builder.js +138 -96
- package/esm/drizzle-field-builder.js.map +1 -1
- package/esm/field-builder.js +61 -47
- package/esm/field-builder.js.map +1 -1
- package/esm/global-types.d.ts.map +1 -1
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +37 -61
- package/esm/index.js.map +1 -1
- package/esm/model-loader.d.ts +18 -17
- package/esm/model-loader.d.ts.map +1 -1
- package/esm/model-loader.js +76 -45
- package/esm/model-loader.js.map +1 -1
- package/esm/schema-builder.js +40 -149
- package/esm/schema-builder.js.map +1 -1
- package/esm/types.d.ts +82 -22
- package/esm/types.d.ts.map +1 -1
- package/esm/types.js.map +1 -1
- package/esm/utils/adapter.d.ts +39 -0
- package/esm/utils/adapter.d.ts.map +1 -0
- package/esm/utils/adapter.js +137 -0
- package/esm/utils/adapter.js.map +1 -0
- package/esm/utils/await-selections.d.ts +12 -0
- package/esm/utils/await-selections.d.ts.map +1 -0
- package/esm/utils/await-selections.js +19 -0
- package/esm/utils/await-selections.js.map +1 -0
- package/esm/utils/config.d.ts +23 -3
- package/esm/utils/config.d.ts.map +1 -1
- package/esm/utils/config.js +1 -4
- package/esm/utils/config.js.map +1 -1
- package/esm/utils/cursors.d.ts +6 -6
- package/esm/utils/cursors.d.ts.map +1 -1
- package/esm/utils/cursors.js +75 -92
- package/esm/utils/cursors.js.map +1 -1
- package/esm/utils/map-query.d.ts +22 -21
- package/esm/utils/map-query.d.ts.map +1 -1
- package/esm/utils/map-query.js +40 -354
- package/esm/utils/map-query.js.map +1 -1
- package/esm/utils/path-info.d.ts +13 -0
- package/esm/utils/path-info.d.ts.map +1 -0
- package/esm/utils/path-info.js +37 -0
- package/esm/utils/path-info.js.map +1 -0
- package/esm/utils/relation-filter.d.ts +48 -0
- package/esm/utils/relation-filter.d.ts.map +1 -0
- package/esm/utils/relation-filter.js +92 -0
- package/esm/utils/relation-filter.js.map +1 -0
- package/esm/utils/selections.d.ts +2 -21
- package/esm/utils/selections.d.ts.map +1 -1
- package/esm/utils/selections.js +1 -133
- package/esm/utils/selections.js.map +1 -1
- package/lib/connection-helpers.js +51 -18
- package/lib/connection-helpers.js.map +1 -1
- package/lib/drizzle-field-builder.js +136 -94
- package/lib/drizzle-field-builder.js.map +1 -1
- package/lib/field-builder.js +58 -44
- package/lib/field-builder.js.map +1 -1
- package/lib/index.js +36 -60
- package/lib/index.js.map +1 -1
- package/lib/model-loader.js +76 -45
- package/lib/model-loader.js.map +1 -1
- package/lib/schema-builder.js +40 -149
- package/lib/schema-builder.js.map +1 -1
- package/lib/types.js.map +1 -1
- package/lib/utils/adapter.js +147 -0
- package/lib/utils/adapter.js.map +1 -0
- package/lib/utils/await-selections.js +20 -0
- package/lib/utils/await-selections.js.map +1 -0
- package/lib/utils/config.js +1 -4
- package/lib/utils/config.js.map +1 -1
- package/lib/utils/cursors.js +67 -90
- package/lib/utils/cursors.js.map +1 -1
- package/lib/utils/map-query.js +28 -359
- package/lib/utils/map-query.js.map +1 -1
- package/lib/utils/path-info.js +39 -0
- package/lib/utils/path-info.js.map +1 -0
- package/lib/utils/relation-filter.js +91 -0
- package/lib/utils/relation-filter.js.map +1 -0
- package/lib/utils/selections.js +3 -158
- package/lib/utils/selections.js.map +1 -1
- package/package.json +10 -8
- package/src/connection-helpers.ts +168 -54
- package/src/drizzle-field-builder.ts +296 -176
- package/src/field-builder.ts +110 -77
- package/src/global-types.ts +0 -32
- package/src/index.ts +42 -68
- package/src/model-loader.ts +110 -71
- package/src/schema-builder.ts +76 -169
- package/src/types.ts +178 -46
- package/src/utils/adapter.ts +197 -0
- package/src/utils/await-selections.ts +31 -0
- package/src/utils/config.ts +1 -5
- package/src/utils/cursors.ts +84 -83
- package/src/utils/map-query.ts +51 -734
- package/src/utils/path-info.ts +40 -0
- package/src/utils/relation-filter.ts +185 -0
- package/src/utils/selections.ts +2 -207
- package/dts/utils/deep-equal.d.ts +0 -2
- package/dts/utils/deep-equal.d.ts.map +0 -1
- package/dts/utils/drizzle-graphql.d.ts +0 -2
- package/dts/utils/drizzle-graphql.d.ts.map +0 -1
- package/dts/utils/loader-map.d.ts +0 -11
- package/dts/utils/loader-map.d.ts.map +0 -1
- package/dts/utils/usage.d.ts +0 -5
- package/dts/utils/usage.d.ts.map +0 -1
- package/esm/utils/deep-equal.d.ts +0 -2
- package/esm/utils/deep-equal.d.ts.map +0 -1
- package/esm/utils/deep-equal.js +0 -45
- package/esm/utils/deep-equal.js.map +0 -1
- package/esm/utils/drizzle-graphql.d.ts +0 -2
- package/esm/utils/drizzle-graphql.d.ts.map +0 -1
- package/esm/utils/drizzle-graphql.js +0 -232
- package/esm/utils/drizzle-graphql.js.map +0 -1
- package/esm/utils/loader-map.d.ts +0 -11
- package/esm/utils/loader-map.d.ts.map +0 -1
- package/esm/utils/loader-map.js +0 -35
- package/esm/utils/loader-map.js.map +0 -1
- package/esm/utils/usage.d.ts +0 -5
- package/esm/utils/usage.d.ts.map +0 -1
- package/esm/utils/usage.js +0 -59
- package/esm/utils/usage.js.map +0 -1
- package/lib/utils/deep-equal.js +0 -55
- package/lib/utils/deep-equal.js.map +0 -1
- package/lib/utils/drizzle-graphql.js +0 -236
- package/lib/utils/drizzle-graphql.js.map +0 -1
- package/lib/utils/loader-map.js +0 -56
- package/lib/utils/loader-map.js.map +0 -1
- package/lib/utils/usage.js +0 -83
- package/lib/utils/usage.js.map +0 -1
- package/src/utils/deep-equal.ts +0 -57
- package/src/utils/drizzle-graphql.ts +0 -274
- package/src/utils/loader-map.ts +0 -49
- package/src/utils/usage.ts +0 -62
package/lib/index.js
CHANGED
|
@@ -32,7 +32,7 @@ require("./global-types.js");
|
|
|
32
32
|
require("./field-builder.js");
|
|
33
33
|
require("./schema-builder.js");
|
|
34
34
|
const _core = /*#__PURE__*/ _interop_require_wildcard(require("@pothos/core"));
|
|
35
|
-
const
|
|
35
|
+
const _selectionmapper = require("@pothos/selection-mapper");
|
|
36
36
|
const _connectionhelpers = require("./connection-helpers.js");
|
|
37
37
|
const _drizzlefieldbuilder = require("./drizzle-field-builder.js");
|
|
38
38
|
const _types = _export_star(require("./types.js"), exports);
|
|
@@ -94,88 +94,49 @@ function _interop_require_wildcard(obj, nodeInterop) {
|
|
|
94
94
|
const pluginName = 'drizzle';
|
|
95
95
|
const _default = pluginName;
|
|
96
96
|
class PothosDrizzlePlugin extends _core.BasePlugin {
|
|
97
|
-
// private mappingCache = new Map<
|
|
98
|
-
// string,
|
|
99
|
-
// InputTypeFieldsMapping<Types, DrizzleGraphQLInputExtensions>
|
|
100
|
-
// >();
|
|
101
97
|
onTypeConfig(typeConfig) {
|
|
102
|
-
var _typeConfig_extensions;
|
|
98
|
+
var _typeConfig_extensions, _typeConfig_extensions1;
|
|
103
99
|
if (typeConfig.kind !== 'Object' && typeConfig.kind !== 'Interface') {
|
|
104
100
|
return typeConfig;
|
|
105
101
|
}
|
|
106
102
|
let model = (_typeConfig_extensions = typeConfig.extensions) === null || _typeConfig_extensions === void 0 ? void 0 : _typeConfig_extensions.pothosDrizzleModel;
|
|
103
|
+
let table = (_typeConfig_extensions1 = typeConfig.extensions) === null || _typeConfig_extensions1 === void 0 ? void 0 : _typeConfig_extensions1.pothosDrizzleTable;
|
|
107
104
|
for (const iface of typeConfig.interfaces){
|
|
108
|
-
var
|
|
109
|
-
const
|
|
105
|
+
var _interfaceConfig_extensions;
|
|
106
|
+
const interfaceConfig = this.buildCache.getTypeConfig(iface, 'Interface');
|
|
107
|
+
const interfaceModel = (_interfaceConfig_extensions = interfaceConfig.extensions) === null || _interfaceConfig_extensions === void 0 ? void 0 : _interfaceConfig_extensions.pothosDrizzleModel;
|
|
110
108
|
if (interfaceModel) {
|
|
109
|
+
var _interfaceConfig_extensions1;
|
|
111
110
|
if (model && model !== interfaceModel) {
|
|
112
|
-
throw new _core.PothosSchemaError(`DrizzleObjects must be based on the same
|
|
111
|
+
throw new _core.PothosSchemaError(`DrizzleObjects must be based on the same drizzle table as any DrizzleInterfaces they extend. ${typeConfig.name} uses ${model} and ${iface.name} uses ${interfaceModel}`);
|
|
113
112
|
}
|
|
114
113
|
model = interfaceModel;
|
|
114
|
+
// A plain object type implementing a drizzle interface is walked with the interface's
|
|
115
|
+
// table, so fragments on it plan the relations it inherits.
|
|
116
|
+
table !== null && table !== void 0 ? table : table = (_interfaceConfig_extensions1 = interfaceConfig.extensions) === null || _interfaceConfig_extensions1 === void 0 ? void 0 : _interfaceConfig_extensions1.pothosDrizzleTable;
|
|
115
117
|
}
|
|
116
118
|
}
|
|
117
119
|
return {
|
|
118
120
|
...typeConfig,
|
|
119
121
|
extensions: {
|
|
120
122
|
...typeConfig.extensions,
|
|
121
|
-
pothosDrizzleModel: model
|
|
123
|
+
pothosDrizzleModel: model,
|
|
124
|
+
pothosDrizzleTable: table
|
|
122
125
|
}
|
|
123
126
|
};
|
|
124
127
|
}
|
|
125
128
|
onOutputFieldConfig(fieldConfig) {
|
|
126
129
|
var _fieldConfig_extensions;
|
|
127
|
-
// const argMappings = mapInputFields<Types, DrizzleGraphQLInputExtensions>(
|
|
128
|
-
// fieldConfig.args,
|
|
129
|
-
// this.buildCache,
|
|
130
|
-
// (inputField) => {
|
|
131
|
-
// if (inputField.type.kind === 'InputObject') {
|
|
132
|
-
// const config = this.buildCache.getTypeConfig(inputField.type.ref);
|
|
133
|
-
// return (config.extensions?.drizzleGraphQL as DrizzleGraphQLInputExtensions) ?? null;
|
|
134
|
-
// }
|
|
135
|
-
// return null;
|
|
136
|
-
// },
|
|
137
|
-
// this.mappingCache,
|
|
138
|
-
// );
|
|
139
|
-
// const argMapper = argMappings
|
|
140
|
-
// ? createInputValueMapper(argMappings, (input, mappings) => {
|
|
141
|
-
// if (!mappings.value) {
|
|
142
|
-
// return input;
|
|
143
|
-
// }
|
|
144
|
-
// const { table, tableConfig, inputType } = mappings.value;
|
|
145
|
-
// switch (inputType) {
|
|
146
|
-
// case 'orderBy':
|
|
147
|
-
// return extractOrderBy(tableConfig, input as never);
|
|
148
|
-
// case 'filters':
|
|
149
|
-
// return extractFilters(tableConfig, table, input as never);
|
|
150
|
-
// case 'insert':
|
|
151
|
-
// return remapFromGraphQLSingleInput(input as never, tableConfig);
|
|
152
|
-
// case 'update':
|
|
153
|
-
// return remapFromGraphQLSingleInput(input as never, tableConfig);
|
|
154
|
-
// default:
|
|
155
|
-
// throw new Error(`Unknown drizzle input type: ${inputType}`);
|
|
156
|
-
// }
|
|
157
|
-
// })
|
|
158
|
-
// : null;
|
|
159
|
-
// const argMappers: typeof fieldConfig.argMappers = argMapper
|
|
160
|
-
// ? [...(fieldConfig.argMappers ?? []), (args) => argMapper(args, undefined)]
|
|
161
|
-
// : fieldConfig.argMappers;
|
|
162
130
|
if (fieldConfig.kind === 'DrizzleObject' && fieldConfig.pothosOptions.select && !((_fieldConfig_extensions = fieldConfig.extensions) === null || _fieldConfig_extensions === void 0 ? void 0 : _fieldConfig_extensions.pothosDrizzleSelect)) {
|
|
163
131
|
const { select } = fieldConfig.pothosOptions;
|
|
164
132
|
return {
|
|
165
133
|
...fieldConfig,
|
|
166
|
-
// argMappers,
|
|
167
134
|
extensions: {
|
|
168
135
|
...fieldConfig.extensions,
|
|
169
136
|
pothosDrizzleSelect: typeof select === 'function' ? (args, ctx, nestedQuery, _resolveSelection, pathInfo)=>{
|
|
170
|
-
//
|
|
171
|
-
const nestedQueryWithPath = Object.assign(nestedQuery,
|
|
172
|
-
|
|
173
|
-
segments: pathInfo.segments
|
|
174
|
-
});
|
|
175
|
-
return {
|
|
176
|
-
columns: {},
|
|
177
|
-
...select(args, ctx, nestedQueryWithPath)
|
|
178
|
-
};
|
|
137
|
+
// A field's select also reads its metadata from the nested selection function.
|
|
138
|
+
const nestedQueryWithPath = Object.assign(nestedQuery, pathInfo);
|
|
139
|
+
return (0, _core.completeValue)(select(args, ctx, nestedQueryWithPath), wrapSelect);
|
|
179
140
|
} : {
|
|
180
141
|
columns: {},
|
|
181
142
|
...select
|
|
@@ -188,11 +149,15 @@ class PothosDrizzlePlugin extends _core.BasePlugin {
|
|
|
188
149
|
};
|
|
189
150
|
}
|
|
190
151
|
wrapResolve(resolver, fieldConfig) {
|
|
191
|
-
var _fieldConfig_extensions, _parentConfig_extensions;
|
|
152
|
+
var _fieldConfig_extensions, _fieldConfig_extensions1, _parentConfig_extensions;
|
|
192
153
|
if (fieldConfig.kind !== 'DrizzleObject' || !((_fieldConfig_extensions = fieldConfig.extensions) === null || _fieldConfig_extensions === void 0 ? void 0 : _fieldConfig_extensions.pothosDrizzleSelect)) {
|
|
193
154
|
return resolver;
|
|
194
155
|
}
|
|
195
156
|
const parentConfig = this.buildCache.getTypeConfig(fieldConfig.parentType);
|
|
157
|
+
// A field can declare how to tell whether its data is already on the parent row. When the
|
|
158
|
+
// row was not loaded from the planned query (a resolver returned a row it fetched itself),
|
|
159
|
+
// the mapping alone is not proof, and the field falls back to the model loader.
|
|
160
|
+
const loadedCheck = (_fieldConfig_extensions1 = fieldConfig.extensions) === null || _fieldConfig_extensions1 === void 0 ? void 0 : _fieldConfig_extensions1.pothosDrizzleLoaded;
|
|
196
161
|
const parentTypes = new Set([
|
|
197
162
|
fieldConfig.parentType
|
|
198
163
|
]);
|
|
@@ -210,23 +175,34 @@ class PothosDrizzlePlugin extends _core.BasePlugin {
|
|
|
210
175
|
throw new Error(`ModelLoader not found for type ${parentConfig.name}`);
|
|
211
176
|
}
|
|
212
177
|
return (parent, args, context, info)=>{
|
|
213
|
-
|
|
178
|
+
// Asked of the row: a mapping recorded for this row wins over the plan's, which answers
|
|
179
|
+
// for the rows the planned query loaded.
|
|
180
|
+
let mapping = (0, _selectionmapper.getLoaderMapping)(context, info.path, info.parentType.name, parent);
|
|
214
181
|
if (!mapping) {
|
|
215
182
|
for (const parentType of parentTypes){
|
|
216
|
-
mapping = (0,
|
|
183
|
+
mapping = (0, _selectionmapper.getLoaderMapping)(context, info.path, parentType, parent);
|
|
217
184
|
if (mapping) {
|
|
218
185
|
break;
|
|
219
186
|
}
|
|
220
187
|
}
|
|
221
188
|
}
|
|
222
|
-
if (mapping) {
|
|
223
|
-
|
|
189
|
+
if ((!loadedCheck || loadedCheck(parent, info, context)) && mapping) {
|
|
190
|
+
// Recorded under the field's own parent type as well, so its resolver finds the pathInfo
|
|
191
|
+
// it was planned with, whichever same-model type the plan was made for. Against the row
|
|
192
|
+
// it resolves with: a sibling row of the same list may have been loaded by another plan.
|
|
193
|
+
(0, _selectionmapper.setFieldMapping)(context, info, mapping, parent);
|
|
224
194
|
return resolver(parent, args, context, info);
|
|
225
195
|
}
|
|
226
196
|
return modelLoader(context).loadSelection(info, parent).then((result)=>resolver(result, args, context, info));
|
|
227
197
|
};
|
|
228
198
|
}
|
|
229
199
|
}
|
|
200
|
+
/** A falsy selection means the field selects nothing from the parent row. */ function wrapSelect(selected) {
|
|
201
|
+
return selected ? {
|
|
202
|
+
columns: {},
|
|
203
|
+
...selected
|
|
204
|
+
} : null;
|
|
205
|
+
}
|
|
230
206
|
_core.default.registerPlugin(pluginName, PothosDrizzlePlugin, {});
|
|
231
207
|
|
|
232
208
|
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"names":["DrizzleObjectFieldBuilder","PothosDrizzlePlugin","drizzleClientCache","drizzleConnectionHelpers","drizzleTableName","pluginName","BasePlugin","onTypeConfig","typeConfig","kind","model","extensions","pothosDrizzleModel","iface","interfaces","
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":["DrizzleObjectFieldBuilder","PothosDrizzlePlugin","drizzleClientCache","drizzleConnectionHelpers","drizzleTableName","pluginName","BasePlugin","onTypeConfig","typeConfig","kind","model","extensions","pothosDrizzleModel","table","pothosDrizzleTable","iface","interfaces","interfaceConfig","buildCache","getTypeConfig","interfaceModel","PothosSchemaError","name","onOutputFieldConfig","fieldConfig","pothosOptions","select","pothosDrizzleSelect","args","ctx","nestedQuery","_resolveSelection","pathInfo","nestedQueryWithPath","Object","assign","completeValue","wrapSelect","columns","wrapResolve","resolver","parentConfig","parentType","loadedCheck","pothosDrizzleLoaded","parentTypes","Set","add","modelLoader","pothosDrizzleLoader","Error","parent","context","info","mapping","getLoaderMapping","path","setFieldMapping","loadSelection","then","result","selected","SchemaBuilder","registerPlugin"],"mappings":"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"}
|
package/lib/model-loader.js
CHANGED
|
@@ -9,11 +9,11 @@ Object.defineProperty(exports, "ModelLoader", {
|
|
|
9
9
|
}
|
|
10
10
|
});
|
|
11
11
|
const _core = require("@pothos/core");
|
|
12
|
+
const _selectionmapper = require("@pothos/selection-mapper");
|
|
12
13
|
const _drizzleorm = require("drizzle-orm");
|
|
14
|
+
const _adapter = require("./utils/adapter.js");
|
|
13
15
|
const _config = require("./utils/config.js");
|
|
14
|
-
const _loadermap = require("./utils/loader-map.js");
|
|
15
16
|
const _mapquery = require("./utils/map-query.js");
|
|
16
|
-
const _selections = require("./utils/selections.js");
|
|
17
17
|
function _define_property(obj, key, value) {
|
|
18
18
|
if (key in obj) {
|
|
19
19
|
Object.defineProperty(obj, key, {
|
|
@@ -42,67 +42,82 @@ class ModelLoader {
|
|
|
42
42
|
return this.columns.length > 1 ? values : values[0];
|
|
43
43
|
}
|
|
44
44
|
getSelection(info) {
|
|
45
|
-
const key = (0,
|
|
46
|
-
if (!this.
|
|
47
|
-
|
|
48
|
-
this.queryCache.set(key, {
|
|
49
|
-
selection,
|
|
50
|
-
query: (0, _selections.selectionToQuery)(this.config, selection)
|
|
51
|
-
});
|
|
45
|
+
const key = (0, _selectionmapper.cacheKey)(info.parentType.name, info.path);
|
|
46
|
+
if (!this.rowCache.has(key)) {
|
|
47
|
+
this.rowCache.set(key, _selectionmapper.Plan.forParentRow((0, _adapter.drizzleAdapter)(this.config), this.context, info));
|
|
52
48
|
}
|
|
53
|
-
return this.
|
|
49
|
+
return this.rowCache.get(key);
|
|
54
50
|
}
|
|
55
51
|
getSelectionForField(info, typeName) {
|
|
56
|
-
const key = (0,
|
|
57
|
-
if (!this.
|
|
58
|
-
|
|
52
|
+
const key = (0, _selectionmapper.cacheKey)(typeName, info.path);
|
|
53
|
+
if (!this.planCache.has(key)) {
|
|
54
|
+
this.planCache.set(key, // Walked without paths, so there is always a plan.
|
|
55
|
+
(0, _mapquery.planFromInfo)({
|
|
59
56
|
config: this.config,
|
|
60
57
|
context: this.context,
|
|
61
58
|
info,
|
|
62
59
|
typeName
|
|
63
|
-
});
|
|
64
|
-
this.queryCache.set(key, {
|
|
65
|
-
selection,
|
|
66
|
-
query: (0, _selections.selectionToQuery)(this.config, selection)
|
|
67
|
-
});
|
|
60
|
+
}));
|
|
68
61
|
}
|
|
69
|
-
return this.
|
|
62
|
+
return this.planCache.get(key);
|
|
70
63
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
64
|
+
/**
|
|
65
|
+
* `model` reloaded with the selection of the field `info` resolves. A synchronous selection
|
|
66
|
+
* stages synchronously, so every row resolved in a tick joins the same batch; only a selection
|
|
67
|
+
* with an async select beneath the field waits for it.
|
|
68
|
+
*/ loadSelection(info, model) {
|
|
69
|
+
const selection = this.getSelection(info);
|
|
70
|
+
return (0, _core.isThenable)(selection) ? selection.then((settled)=>this.loadWith(settled, info, model)) : this.loadWith(selection, info, model);
|
|
71
|
+
}
|
|
72
|
+
loadWith(played, info, model) {
|
|
73
|
+
return this.stageQuery(played, model).then((result)=>{
|
|
74
|
+
if (result) {
|
|
75
|
+
const mapping = played.mappings[`${info.parentType.name}@${info.path.key}`];
|
|
76
|
+
if (mapping) {
|
|
77
|
+
// Recorded for the field itself too, so its resolver finds the pathInfo it was planned
|
|
78
|
+
// with, along with the mappings of the fields beneath it. Against `result` alone: this
|
|
79
|
+
// load fetched one row, so the field's own mapping is not the whole field's to claim.
|
|
80
|
+
// A sibling row that falls back on a later tick would otherwise read it as proof of
|
|
81
|
+
// having been loaded and resolve against a row that never carried the data.
|
|
82
|
+
(0, _selectionmapper.setRowFieldMapping)(this.context, info, mapping, result);
|
|
83
|
+
}
|
|
78
84
|
}
|
|
79
|
-
|
|
80
|
-
|
|
85
|
+
return result;
|
|
86
|
+
});
|
|
81
87
|
}
|
|
82
|
-
|
|
83
|
-
const
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
88
|
+
/** A node loaded by id with the selection beneath the field `info` resolves, as `returnType`. */ loadSelectionForField(info, model, returnType) {
|
|
89
|
+
const selection = this.getSelectionForField(info, returnType);
|
|
90
|
+
return (0, _core.isThenable)(selection) ? selection.then((settled)=>this.loadFieldWith(settled.play(), info, model)) : this.loadFieldWith(selection.play(), info, model);
|
|
91
|
+
}
|
|
92
|
+
loadFieldWith(played, info, model) {
|
|
93
|
+
return this.stageQuery(played, model).then((result)=>{
|
|
94
|
+
if (result) {
|
|
95
|
+
// Relay nodes of different types share this field path. Each node plan contributes
|
|
96
|
+
// its type-qualified mappings, as a queryFromInfo plan would.
|
|
97
|
+
(0, _selectionmapper.setLoaderMappings)(this.context, info, played.mappings);
|
|
98
|
+
}
|
|
99
|
+
return result;
|
|
100
|
+
});
|
|
89
101
|
}
|
|
90
|
-
stageQuery(
|
|
102
|
+
stageQuery(played, model) {
|
|
91
103
|
for (const entry of this.staged){
|
|
92
|
-
|
|
93
|
-
|
|
104
|
+
// Node to node: the batch takes the field's play whole, never through a query.
|
|
105
|
+
if (this.adapter.canMergeNode(entry.root, played.root)) {
|
|
106
|
+
this.adapter.mergeNode(entry.root, played.root);
|
|
94
107
|
if (!entry.models.has(model)) {
|
|
95
108
|
entry.models.set(model, createResolvablePromise());
|
|
96
109
|
}
|
|
97
110
|
return entry.models.get(model).promise;
|
|
98
111
|
}
|
|
99
112
|
}
|
|
100
|
-
return this.initLoad(
|
|
113
|
+
return this.initLoad(played, model);
|
|
101
114
|
}
|
|
102
|
-
initLoad(
|
|
115
|
+
initLoad(played, model) {
|
|
103
116
|
const promise = createResolvablePromise();
|
|
117
|
+
const root = this.adapter.createNode(played.root.model);
|
|
118
|
+
this.adapter.mergeNode(root, played.root);
|
|
104
119
|
const entry = {
|
|
105
|
-
|
|
120
|
+
root,
|
|
106
121
|
models: new Map([
|
|
107
122
|
[
|
|
108
123
|
model,
|
|
@@ -117,7 +132,7 @@ class ModelLoader {
|
|
|
117
132
|
this.staged.delete(entry);
|
|
118
133
|
const api = client.query[this.modelName];
|
|
119
134
|
const query = api.findMany({
|
|
120
|
-
...
|
|
135
|
+
...this.adapter.toQuery(entry.root),
|
|
121
136
|
where: {
|
|
122
137
|
RAW: (table)=>(0, _drizzleorm.inArray)(this.selectSQL(table), [
|
|
123
138
|
...entry.models.keys()
|
|
@@ -126,9 +141,17 @@ class ModelLoader {
|
|
|
126
141
|
});
|
|
127
142
|
query.then((results)=>{
|
|
128
143
|
for (const [model, promise] of entry.models.entries()){
|
|
129
|
-
|
|
144
|
+
// Matched on the columns the batch was keyed by, which are the columns a row of
|
|
145
|
+
// `entry.models` carries: a node loaded by a column other than the primary key
|
|
146
|
+
// has only that one.
|
|
147
|
+
const result = results.find((row)=>this.columns.every((key)=>{
|
|
148
|
+
const name = this.config.columnToTsName(key);
|
|
149
|
+
const actual = row[name];
|
|
150
|
+
const expected = model[name];
|
|
151
|
+
return actual === expected || actual instanceof Date && expected instanceof Date && actual.getTime() === expected.getTime();
|
|
152
|
+
}));
|
|
130
153
|
if (result) {
|
|
131
|
-
promise.resolve(result
|
|
154
|
+
promise.resolve(result);
|
|
132
155
|
} else {
|
|
133
156
|
promise.reject(new Error(`Model ${this.modelName}(${this.sqlForModel(model)}) not found`));
|
|
134
157
|
}
|
|
@@ -150,9 +173,16 @@ class ModelLoader {
|
|
|
150
173
|
_define_property(this, "context", void 0);
|
|
151
174
|
_define_property(this, "builder", void 0);
|
|
152
175
|
_define_property(this, "modelName", void 0);
|
|
153
|
-
|
|
176
|
+
// One plan per `Type@path`, a promise while a select beneath the field is async. A parent-row
|
|
177
|
+
// plan is played where it is made, since it is never played behind another selection; a field's
|
|
178
|
+
// plan is played per load, so no two loads share a node.
|
|
179
|
+
_define_property(this, "rowCache", new Map());
|
|
180
|
+
_define_property(this, "planCache", new Map());
|
|
181
|
+
// Each batch owns the node it accumulates into, so nothing a cached plan or play holds is
|
|
182
|
+
// changed by a row joining the batch.
|
|
154
183
|
_define_property(this, "staged", new Set());
|
|
155
184
|
_define_property(this, "config", void 0);
|
|
185
|
+
_define_property(this, "adapter", void 0);
|
|
156
186
|
_define_property(this, "table", void 0);
|
|
157
187
|
_define_property(this, "columns", void 0);
|
|
158
188
|
_define_property(this, "primaryKey", void 0);
|
|
@@ -161,6 +191,7 @@ class ModelLoader {
|
|
|
161
191
|
this.builder = builder;
|
|
162
192
|
this.modelName = modelName;
|
|
163
193
|
this.config = (0, _config.getSchemaConfig)(builder);
|
|
194
|
+
this.adapter = (0, _adapter.drizzleAdapter)(this.config);
|
|
164
195
|
this.table = this.config.relations[modelName];
|
|
165
196
|
this.primaryKey = this.config.getPrimaryKey(modelName);
|
|
166
197
|
this.columns = columns !== null && columns !== void 0 ? columns : this.primaryKey;
|
package/lib/model-loader.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/model-loader.ts"],"names":["ModelLoader","forModel","modelName","builder","columns","createContextCache","model","sqlForModel","values","map","key","columnName","config","columnToTsName","Error","length","getSelection","info","cacheKey","parentType","name","path","
|
|
1
|
+
{"version":3,"sources":["../src/model-loader.ts"],"names":["ModelLoader","forModel","modelName","builder","columns","createContextCache","model","sqlForModel","values","map","key","columnName","config","columnToTsName","Error","length","getSelection","info","cacheKey","parentType","name","path","rowCache","has","set","Plan","forParentRow","drizzleAdapter","context","get","getSelectionForField","typeName","planCache","planFromInfo","loadSelection","selection","isThenable","then","settled","loadWith","played","stageQuery","result","mapping","mappings","setRowFieldMapping","loadSelectionForField","returnType","loadFieldWith","play","setLoaderMappings","entry","staged","adapter","canMergeNode","root","mergeNode","models","createResolvablePromise","promise","initLoad","createNode","Map","add","nextTick","client","getClient","delete","api","query","findMany","toQuery","where","RAW","table","inArray","selectSQL","keys","results","entries","find","row","every","actual","expected","Date","getTime","resolve","reject","err","catch","setTimeout","Set","primaryKey","getSchemaConfig","relations","getPrimaryKey","column","Object","getColumns","tblColumn","sql","join","getSQL","resolveFn","rejectFn","Promise"],"mappings":"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"}
|