@carbonorm/carbonnode 6.0.2 → 6.0.4

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 (68) hide show
  1. package/dist/executors/SqlExecutor.d.ts +2 -15
  2. package/dist/index.cjs.js +78 -17
  3. package/dist/index.cjs.js.map +1 -1
  4. package/dist/index.esm.js +78 -17
  5. package/dist/index.esm.js.map +1 -1
  6. package/dist/types/ormInterfaces.d.ts +16 -4
  7. package/package.json +2 -2
  8. package/src/__tests__/sakila-db/C6.js +1 -1
  9. package/src/__tests__/sakila-db/C6.mysqldump.json +1 -1
  10. package/src/__tests__/sakila-db/C6.mysqldump.sql +1 -1
  11. package/src/__tests__/sakila-db/C6.ts +1 -1
  12. package/src/__tests__/sakila-db/sqlResponses/C6.actor.delete.json +1 -0
  13. package/src/__tests__/sakila-db/sqlResponses/C6.actor.post.json +4 -3
  14. package/src/__tests__/sakila-db/sqlResponses/C6.actor.post.latest.json +3 -3
  15. package/src/__tests__/sakila-db/sqlResponses/C6.actor.put.json +2 -1
  16. package/src/__tests__/sakila-db/sqlResponses/C6.actor.put.lookup.json +3 -3
  17. package/src/__tests__/sakila-db/sqlResponses/C6.address.delete.json +1 -0
  18. package/src/__tests__/sakila-db/sqlResponses/C6.address.post.json +6 -5
  19. package/src/__tests__/sakila-db/sqlResponses/C6.address.post.latest.json +5 -5
  20. package/src/__tests__/sakila-db/sqlResponses/C6.address.put.json +2 -1
  21. package/src/__tests__/sakila-db/sqlResponses/C6.address.put.lookup.json +5 -5
  22. package/src/__tests__/sakila-db/sqlResponses/C6.category.delete.json +1 -0
  23. package/src/__tests__/sakila-db/sqlResponses/C6.category.post.json +3 -2
  24. package/src/__tests__/sakila-db/sqlResponses/C6.category.post.latest.json +2 -2
  25. package/src/__tests__/sakila-db/sqlResponses/C6.category.put.json +2 -1
  26. package/src/__tests__/sakila-db/sqlResponses/C6.category.put.lookup.json +2 -2
  27. package/src/__tests__/sakila-db/sqlResponses/C6.city.delete.json +1 -0
  28. package/src/__tests__/sakila-db/sqlResponses/C6.city.post.json +3 -2
  29. package/src/__tests__/sakila-db/sqlResponses/C6.city.post.latest.json +2 -2
  30. package/src/__tests__/sakila-db/sqlResponses/C6.city.put.json +2 -1
  31. package/src/__tests__/sakila-db/sqlResponses/C6.city.put.lookup.json +2 -2
  32. package/src/__tests__/sakila-db/sqlResponses/C6.country.delete.json +1 -0
  33. package/src/__tests__/sakila-db/sqlResponses/C6.country.post.json +3 -2
  34. package/src/__tests__/sakila-db/sqlResponses/C6.country.post.latest.json +2 -2
  35. package/src/__tests__/sakila-db/sqlResponses/C6.country.put.json +2 -1
  36. package/src/__tests__/sakila-db/sqlResponses/C6.country.put.lookup.json +2 -2
  37. package/src/__tests__/sakila-db/sqlResponses/C6.customer.delete.json +1 -0
  38. package/src/__tests__/sakila-db/sqlResponses/C6.customer.post.json +6 -5
  39. package/src/__tests__/sakila-db/sqlResponses/C6.customer.post.latest.json +5 -5
  40. package/src/__tests__/sakila-db/sqlResponses/C6.customer.put.json +2 -1
  41. package/src/__tests__/sakila-db/sqlResponses/C6.customer.put.lookup.json +5 -5
  42. package/src/__tests__/sakila-db/sqlResponses/C6.film.delete.json +1 -0
  43. package/src/__tests__/sakila-db/sqlResponses/C6.film.post.json +3 -2
  44. package/src/__tests__/sakila-db/sqlResponses/C6.film.post.latest.json +2 -2
  45. package/src/__tests__/sakila-db/sqlResponses/C6.film.put.json +2 -1
  46. package/src/__tests__/sakila-db/sqlResponses/C6.film.put.lookup.json +2 -2
  47. package/src/__tests__/sakila-db/sqlResponses/C6.inventory.delete.json +1 -0
  48. package/src/__tests__/sakila-db/sqlResponses/C6.inventory.post.json +2 -1
  49. package/src/__tests__/sakila-db/sqlResponses/C6.inventory.post.latest.json +1 -1
  50. package/src/__tests__/sakila-db/sqlResponses/C6.inventory.put.json +2 -1
  51. package/src/__tests__/sakila-db/sqlResponses/C6.inventory.put.lookup.json +1 -1
  52. package/src/__tests__/sakila-db/sqlResponses/C6.language.delete.json +1 -0
  53. package/src/__tests__/sakila-db/sqlResponses/C6.language.post.json +3 -2
  54. package/src/__tests__/sakila-db/sqlResponses/C6.language.post.latest.json +2 -2
  55. package/src/__tests__/sakila-db/sqlResponses/C6.language.put.json +2 -1
  56. package/src/__tests__/sakila-db/sqlResponses/C6.language.put.lookup.json +2 -2
  57. package/src/__tests__/sakila-db/sqlResponses/C6.payment.delete.json +1 -0
  58. package/src/__tests__/sakila-db/sqlResponses/C6.payment.post.json +3 -2
  59. package/src/__tests__/sakila-db/sqlResponses/C6.payment.post.latest.json +2 -2
  60. package/src/__tests__/sakila-db/sqlResponses/C6.payment.put.json +1 -0
  61. package/src/__tests__/sakila-db/sqlResponses/C6.payment.put.lookup.json +2 -2
  62. package/src/__tests__/sakila-db/sqlResponses/C6.rental.delete.json +1 -0
  63. package/src/__tests__/sakila-db/sqlResponses/C6.rental.post.json +4 -3
  64. package/src/__tests__/sakila-db/sqlResponses/C6.rental.post.latest.json +3 -3
  65. package/src/__tests__/sakila-db/sqlResponses/C6.rental.put.json +2 -1
  66. package/src/__tests__/sakila-db/sqlResponses/C6.rental.put.lookup.json +3 -3
  67. package/src/executors/SqlExecutor.ts +98 -21
  68. package/src/types/ormInterfaces.ts +16 -6
@@ -15,21 +15,8 @@ export declare class SqlExecutor<G extends OrmGenerics> extends Executor<G> {
15
15
  private normalizeRequestPayload;
16
16
  private extractRequestBody;
17
17
  private extractPrimaryKeyValues;
18
+ private extractPrimaryKeyValuesFromData;
18
19
  private broadcastWebsocketIfConfigured;
19
- runQuery(): Promise<{
20
- rest: any;
21
- sql: {
22
- sql: any;
23
- values: any;
24
- };
25
- affected?: undefined;
26
- } | {
27
- affected: any;
28
- rest: never[];
29
- sql: {
30
- sql: any;
31
- values: any;
32
- };
33
- }>;
20
+ runQuery(): Promise<DetermineResponseDataType<G['RequestMethod'], G['RestTableInterface']>>;
34
21
  private validateSqlAllowList;
35
22
  }
package/dist/index.cjs.js CHANGED
@@ -584,7 +584,6 @@ exports.eFetchDependencies = void 0;
584
584
  eFetchDependencies[eFetchDependencies["RECURSIVE"] = 8] = "RECURSIVE";
585
585
  })(exports.eFetchDependencies || (exports.eFetchDependencies = {}));
586
586
 
587
- // Refined TypeScript types for CarbonORM
588
587
  var POST = 'POST';
589
588
  var PUT = 'PUT';
590
589
  var GET = 'GET';
@@ -3132,21 +3131,21 @@ var SqlExecutor = /** @class */ (function (_super) {
3132
3131
  case 3: return [4 /*yield*/, this.runQuery()];
3133
3132
  case 4:
3134
3133
  result = _b.sent();
3135
- return [4 /*yield*/, this.broadcastWebsocketIfConfigured()];
3134
+ return [4 /*yield*/, this.broadcastWebsocketIfConfigured(result)];
3136
3135
  case 5:
3137
3136
  _b.sent();
3138
3137
  return [2 /*return*/, result];
3139
3138
  case 6: return [4 /*yield*/, this.runQuery()];
3140
3139
  case 7:
3141
3140
  result = _b.sent();
3142
- return [4 /*yield*/, this.broadcastWebsocketIfConfigured()];
3141
+ return [4 /*yield*/, this.broadcastWebsocketIfConfigured(result)];
3143
3142
  case 8:
3144
3143
  _b.sent();
3145
3144
  return [2 /*return*/, result];
3146
3145
  case 9: return [4 /*yield*/, this.runQuery()];
3147
3146
  case 10:
3148
3147
  result = _b.sent();
3149
- return [4 /*yield*/, this.broadcastWebsocketIfConfigured()];
3148
+ return [4 /*yield*/, this.broadcastWebsocketIfConfigured(result)];
3150
3149
  case 11:
3151
3150
  _b.sent();
3152
3151
  return [2 /*return*/, result];
@@ -3255,8 +3254,9 @@ var SqlExecutor = /** @class */ (function (_super) {
3255
3254
  var _a, _b;
3256
3255
  var request = this.request;
3257
3256
  if (this.config.requestMethod === C6Constants.POST) {
3258
- if (Array.isArray(request.dataInsertMultipleRows) && request.dataInsertMultipleRows.length > 0) {
3259
- return request.dataInsertMultipleRows[0];
3257
+ var insertRows = request.dataInsertMultipleRows;
3258
+ if (Array.isArray(insertRows) && insertRows.length > 0) {
3259
+ return insertRows[0];
3260
3260
  }
3261
3261
  if (C6Constants.INSERT in request) {
3262
3262
  return (_a = request[C6Constants.INSERT]) !== null && _a !== void 0 ? _a : {};
@@ -3317,34 +3317,94 @@ var SqlExecutor = /** @class */ (function (_super) {
3317
3317
  }
3318
3318
  return Object.keys(pkValues).length > 0 ? pkValues : null;
3319
3319
  };
3320
- SqlExecutor.prototype.broadcastWebsocketIfConfigured = function () {
3320
+ SqlExecutor.prototype.extractPrimaryKeyValuesFromData = function (data) {
3321
+ if (!data)
3322
+ return null;
3323
+ var row = Array.isArray(data) ? data[0] : data;
3324
+ if (!row || typeof row !== "object")
3325
+ return null;
3326
+ var pkShorts = this.config.restModel.PRIMARY_SHORT;
3327
+ var columns = this.config.restModel.COLUMNS;
3328
+ var pkValues = {};
3329
+ var _loop_2 = function (pk) {
3330
+ if (pk in row) {
3331
+ pkValues[pk] = row[pk];
3332
+ return "continue";
3333
+ }
3334
+ var fullKey = Object.keys(columns).find(function (key) { return columns[key] === pk; });
3335
+ if (fullKey && fullKey in row) {
3336
+ pkValues[pk] = row[fullKey];
3337
+ }
3338
+ };
3339
+ for (var _i = 0, pkShorts_1 = pkShorts; _i < pkShorts_1.length; _i++) {
3340
+ var pk = pkShorts_1[_i];
3341
+ _loop_2(pk);
3342
+ }
3343
+ if (pkShorts.length > 0 && Object.keys(pkValues).length < pkShorts.length) {
3344
+ return null;
3345
+ }
3346
+ return Object.keys(pkValues).length > 0 ? pkValues : null;
3347
+ };
3348
+ SqlExecutor.prototype.broadcastWebsocketIfConfigured = function (response) {
3321
3349
  return tslib.__awaiter(this, void 0, void 0, function () {
3322
- var broadcast, payload, error_1;
3350
+ var broadcast, normalizedRequest, pkShorts, columns, validColumns, responseRest, responsePrimaryKey, insertId, synthesizedRequest, now, synthesized, payload, error_1;
3323
3351
  var _a, _b;
3324
- return tslib.__generator(this, function (_c) {
3325
- switch (_c.label) {
3352
+ var _c, _d, _e;
3353
+ return tslib.__generator(this, function (_f) {
3354
+ switch (_f.label) {
3326
3355
  case 0:
3327
3356
  broadcast = this.config.websocketBroadcast;
3328
3357
  if (!broadcast || this.config.requestMethod === C6Constants.GET)
3329
3358
  return [2 /*return*/];
3359
+ normalizedRequest = this.normalizeRequestPayload(this.extractRequestBody());
3360
+ pkShorts = (_c = this.config.restModel.PRIMARY_SHORT) !== null && _c !== void 0 ? _c : [];
3361
+ columns = this.config.restModel.COLUMNS;
3362
+ validColumns = new Set(Object.values(columns));
3363
+ responseRest = response === null || response === void 0 ? void 0 : response.rest;
3364
+ responsePrimaryKey = this.extractPrimaryKeyValuesFromData(responseRest);
3365
+ if ((responseRest === null || (Array.isArray(responseRest) && responseRest.length === 0))
3366
+ && this.config.requestMethod === C6Constants.POST) {
3367
+ insertId = response === null || response === void 0 ? void 0 : response.insertId;
3368
+ if (insertId !== undefined && pkShorts.length === 1) {
3369
+ synthesizedRequest = tslib.__assign({}, normalizedRequest);
3370
+ now = new Date().toISOString();
3371
+ if (validColumns.has("changed_at") && synthesizedRequest.changed_at === undefined) {
3372
+ synthesizedRequest.changed_at = now;
3373
+ }
3374
+ if (validColumns.has("created_at") && synthesizedRequest.created_at === undefined) {
3375
+ synthesizedRequest.created_at = now;
3376
+ }
3377
+ if (validColumns.has("updated_at") && synthesizedRequest.updated_at === undefined) {
3378
+ synthesizedRequest.updated_at = now;
3379
+ }
3380
+ synthesized = tslib.__assign(tslib.__assign({}, synthesizedRequest), (_a = {}, _a[pkShorts[0]] = insertId, _a));
3381
+ // @ts-ignore - todo
3382
+ responseRest = [synthesized];
3383
+ responsePrimaryKey = (_b = {},
3384
+ _b[pkShorts[0]] = insertId,
3385
+ _b);
3386
+ }
3387
+ }
3330
3388
  payload = {
3331
3389
  REST: {
3332
3390
  TABLE_NAME: this.config.restModel.TABLE_NAME,
3333
- TABLE_PREFIX: (_b = (_a = this.config.C6) === null || _a === void 0 ? void 0 : _a.PREFIX) !== null && _b !== void 0 ? _b : "",
3391
+ TABLE_PREFIX: (_e = (_d = this.config.C6) === null || _d === void 0 ? void 0 : _d.PREFIX) !== null && _e !== void 0 ? _e : "",
3334
3392
  METHOD: this.config.requestMethod,
3335
- REQUEST: this.normalizeRequestPayload(this.extractRequestBody()),
3393
+ REQUEST: normalizedRequest,
3336
3394
  REQUEST_PRIMARY_KEY: this.extractPrimaryKeyValues(),
3395
+ RESPONSE: responseRest,
3396
+ RESPONSE_PRIMARY_KEY: responsePrimaryKey,
3337
3397
  },
3338
3398
  };
3339
- _c.label = 1;
3399
+ _f.label = 1;
3340
3400
  case 1:
3341
- _c.trys.push([1, 3, , 4]);
3401
+ _f.trys.push([1, 3, , 4]);
3342
3402
  return [4 /*yield*/, broadcast(payload)];
3343
3403
  case 2:
3344
- _c.sent();
3404
+ _f.sent();
3345
3405
  return [3 /*break*/, 4];
3346
3406
  case 3:
3347
- error_1 = _c.sent();
3407
+ error_1 = _f.sent();
3348
3408
  if (this.config.verbose) {
3349
3409
  console.error("[SQL EXECUTOR] websocketBroadcast failed", error_1);
3350
3410
  }
@@ -3405,7 +3465,8 @@ var SqlExecutor = /** @class */ (function (_super) {
3405
3465
  this.config.verbose && console.log("[SQL EXECUTOR] \u270F\uFE0F Rows affected:", result.affectedRows);
3406
3466
  return [2 /*return*/, {
3407
3467
  affected: result.affectedRows,
3408
- rest: [],
3468
+ insertId: result.insertId,
3469
+ rest: [], // TODO - remove rest empty array from non-GET responses?
3409
3470
  sql: { sql: sql, values: values }
3410
3471
  }];
3411
3472
  }