@coderich/autograph 0.13.25 → 0.13.26

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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@coderich/autograph",
3
3
  "main": "index.js",
4
- "version": "0.13.25",
4
+ "version": "0.13.26",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -6,9 +6,11 @@ const { hashObject } = require('../service/AppService');
6
6
  module.exports = class Loader {
7
7
  #model;
8
8
  #loader;
9
+ #resolver;
9
10
 
10
- constructor(model) {
11
+ constructor(model, resolver) {
11
12
  this.#model = model;
13
+ this.#resolver = resolver;
12
14
  model.loader.cacheKeyFn ??= (query => hashObject(query.toCacheKey()));
13
15
  this.#loader = new DataLoader(keys => this.#resolve(keys), model.loader);
14
16
  }
@@ -28,8 +30,8 @@ module.exports = class Loader {
28
30
 
29
31
  return this.#model.source.client.resolve($query).then((data) => {
30
32
  if (data == null) return null; // Explicit return null;
31
- if ($query.isCursorPaging && Array.isArray(data)) return Loader.#paginateResults(data, query.toObject());
32
- return data;
33
+ if ($query.isCursorPaging && Array.isArray(data)) data = Loader.#paginateResults(data, query.toObject());
34
+ return this.#resolver.toResultSet(this.#model, data);
33
35
  });
34
36
  }));
35
37
  }
@@ -190,11 +190,13 @@ module.exports = class Resolver {
190
190
  */
191
191
  async resolve(query) {
192
192
  let thunk;
193
- const { model, doc, crud, isMutation, flags } = query.toObject();
193
+ const { model, crud, isMutation, flags } = query.toObject();
194
194
  const currSession = this.#sessions.slice(-1).pop();
195
195
 
196
196
  if (isMutation) {
197
197
  thunk = tquery => this.#schema.models[model].source.client.resolve(tquery.toDriver().toObject()).then((results) => {
198
+ const { doc, input } = tquery.toObject();
199
+
198
200
  // We clear the cache immediately (regardless if we're in transaction or not)
199
201
  this.clear(model);
200
202
 
@@ -202,7 +204,9 @@ module.exports = class Resolver {
202
204
  currSession?.thunks.push(...this.#sessions.map(s => () => s.parent.clear(model)));
203
205
 
204
206
  // Return results
205
- return crud === 'delete' ? doc : results;
207
+ if (crud === 'delete') return doc;
208
+ if (crud === 'update') return input;
209
+ return this.toResultSet(model, results);
206
210
  });
207
211
  } else {
208
212
  thunk = tquery => this.#dataLoaders[model].resolve(tquery);
@@ -211,7 +215,7 @@ module.exports = class Resolver {
211
215
  return this.#createSystemEvent(query, (tquery) => {
212
216
  return thunk(tquery).then((result) => {
213
217
  if (flags?.required && (result == null || result?.length === 0)) throw Boom.notFound();
214
- return crud === 'delete' ? result : this.toResultSet(model, result);
218
+ return result;
215
219
  });
216
220
  });
217
221
  }
@@ -224,8 +228,8 @@ module.exports = class Resolver {
224
228
  // Transform result to domain model
225
229
  const $doc = this.#schema.models[model].walk(doc, (node) => {
226
230
  if (node.value === undefined) return undefined;
231
+ if (node.value != null && node.field.isArray) node.value = Util.ensureArray(node.value);
227
232
  node.key = node.field.name;
228
- node.value = Pipeline.$cast(node);
229
233
  return node;
230
234
  }, { key: 'key' });
231
235
 
@@ -271,7 +275,7 @@ module.exports = class Resolver {
271
275
  return Object.entries(this.#schema.models).filter(([key, value]) => {
272
276
  return value.loader && value.isEntity;
273
277
  }).reduce((prev, [key, value]) => {
274
- return Object.assign(prev, { [key]: new DataLoader(value) });
278
+ return Object.assign(prev, { [key]: new DataLoader(value, this) });
275
279
  }, {});
276
280
  }
277
281
 
@@ -292,11 +296,12 @@ module.exports = class Resolver {
292
296
  // if (query.crud === 'update' && Util.isEqual({ added: {}, updated: {}, deleted: {} }, Util.changeset(query.doc, query.input))) return query.doc;
293
297
  const tquery = await $query.transform();
294
298
  // await Emitter.emit('validate', event); // We need to re-connect tquery to event
295
- return thunk(tquery).then((result) => {
296
- event.result = result; // backwards compat
297
- query.result = result;
298
- return Emitter.emit(`post${type}`, event);
299
- });
299
+ return thunk(tquery);
300
+ }).then((result) => {
301
+ event.doc ??= result; // Case of create
302
+ event.result = result; // backwards compat
303
+ query.result = result;
304
+ return Emitter.emit(`post${type}`, event);
300
305
  }).then((result = query.result) => result).catch((e) => {
301
306
  const { data = {} } = e;
302
307
  throw Boom.boomify(e, { data: { ...event, ...data } });