@restura/core 0.1.0-alpha.26 → 0.1.0-alpha.27

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/dist/index.d.mts CHANGED
@@ -158,9 +158,9 @@ type QueryMetadata = RequesterDetails & {
158
158
  };
159
159
  declare class EventManager {
160
160
  private actionHandlers;
161
- addRowInsertHandler<T extends DynamicObject>(onInsert: (data: ActionRowInsertData<T>, queryMetadata: QueryMetadata) => Promise<void>, filter?: ActionRowInsertFilter): void;
162
- addColumnChangeHandler<T extends DynamicObject>(onUpdate: (data: ActionColumnChangeData<T>, queryMetadata: QueryMetadata) => Promise<void>, filter: ActionColumnChangeFilter): void;
163
- addRowDeleteHandler<T extends DynamicObject>(onDelete: (data: ActionRowDeleteData<T>, queryMetadata: QueryMetadata) => Promise<void>, filter?: ActionRowDeleteFilter): void;
161
+ addRowInsertHandler<T>(onInsert: (data: ActionRowInsertData<T>, queryMetadata: QueryMetadata) => Promise<void>, filter?: ActionRowInsertFilter): void;
162
+ addColumnChangeHandler<T>(onUpdate: (data: ActionColumnChangeData<T>, queryMetadata: QueryMetadata) => Promise<void>, filter: ActionColumnChangeFilter): void;
163
+ addRowDeleteHandler<T>(onDelete: (data: ActionRowDeleteData<T>, queryMetadata: QueryMetadata) => Promise<void>, filter?: ActionRowDeleteFilter): void;
164
164
  fireActionFromDbTrigger(sqlMutationData: SqlMutationData, result: TriggerResult): Promise<void>;
165
165
  private fireInsertActions;
166
166
  private fireDeleteActions;
@@ -2529,6 +2529,7 @@ declare class PsqlEngine extends SqlEngine {
2529
2529
  private triggerClient;
2530
2530
  constructor(psqlConnectionPool: PsqlPool, shouldListenForDbTriggers?: boolean);
2531
2531
  close(): Promise<void>;
2532
+ private setupPgReturnTypes;
2532
2533
  private listenForDbTriggers;
2533
2534
  private handleTrigger;
2534
2535
  createDatabaseFromSchema(schema: ResturaSchema, connection: PsqlPool): Promise<string>;
@@ -2547,6 +2548,7 @@ declare class PsqlEngine extends SqlEngine {
2547
2548
  private createUpdateTrigger;
2548
2549
  private createDeleteTrigger;
2549
2550
  private createInsertTriggers;
2551
+ private schemaToPsqlType;
2550
2552
  }
2551
2553
 
2552
2554
  declare class PsqlTransaction extends PsqlConnection {
package/dist/index.d.ts CHANGED
@@ -158,9 +158,9 @@ type QueryMetadata = RequesterDetails & {
158
158
  };
159
159
  declare class EventManager {
160
160
  private actionHandlers;
161
- addRowInsertHandler<T extends DynamicObject>(onInsert: (data: ActionRowInsertData<T>, queryMetadata: QueryMetadata) => Promise<void>, filter?: ActionRowInsertFilter): void;
162
- addColumnChangeHandler<T extends DynamicObject>(onUpdate: (data: ActionColumnChangeData<T>, queryMetadata: QueryMetadata) => Promise<void>, filter: ActionColumnChangeFilter): void;
163
- addRowDeleteHandler<T extends DynamicObject>(onDelete: (data: ActionRowDeleteData<T>, queryMetadata: QueryMetadata) => Promise<void>, filter?: ActionRowDeleteFilter): void;
161
+ addRowInsertHandler<T>(onInsert: (data: ActionRowInsertData<T>, queryMetadata: QueryMetadata) => Promise<void>, filter?: ActionRowInsertFilter): void;
162
+ addColumnChangeHandler<T>(onUpdate: (data: ActionColumnChangeData<T>, queryMetadata: QueryMetadata) => Promise<void>, filter: ActionColumnChangeFilter): void;
163
+ addRowDeleteHandler<T>(onDelete: (data: ActionRowDeleteData<T>, queryMetadata: QueryMetadata) => Promise<void>, filter?: ActionRowDeleteFilter): void;
164
164
  fireActionFromDbTrigger(sqlMutationData: SqlMutationData, result: TriggerResult): Promise<void>;
165
165
  private fireInsertActions;
166
166
  private fireDeleteActions;
@@ -2529,6 +2529,7 @@ declare class PsqlEngine extends SqlEngine {
2529
2529
  private triggerClient;
2530
2530
  constructor(psqlConnectionPool: PsqlPool, shouldListenForDbTriggers?: boolean);
2531
2531
  close(): Promise<void>;
2532
+ private setupPgReturnTypes;
2532
2533
  private listenForDbTriggers;
2533
2534
  private handleTrigger;
2534
2535
  createDatabaseFromSchema(schema: ResturaSchema, connection: PsqlPool): Promise<string>;
@@ -2547,6 +2548,7 @@ declare class PsqlEngine extends SqlEngine {
2547
2548
  private createUpdateTrigger;
2548
2549
  private createDeleteTrigger;
2549
2550
  private createInsertTriggers;
2551
+ private schemaToPsqlType;
2550
2552
  }
2551
2553
 
2552
2554
  declare class PsqlTransaction extends PsqlConnection {
package/dist/index.js CHANGED
@@ -315,7 +315,6 @@ var import_cookie_parser = __toESM(require("cookie-parser"));
315
315
  var express = __toESM(require("express"));
316
316
  var import_fs4 = __toESM(require("fs"));
317
317
  var import_path5 = __toESM(require("path"));
318
- var import_pg3 = __toESM(require("pg"));
319
318
  var prettier3 = __toESM(require("prettier"));
320
319
 
321
320
  // src/restura/RsError.ts
@@ -474,10 +473,10 @@ var compareSchema = new CompareSchema();
474
473
  var compareSchema_default = compareSchema;
475
474
 
476
475
  // src/restura/customApiFactory.ts
477
- var import_internal2 = require("@restura/internal");
478
476
  var import_bluebird2 = __toESM(require("bluebird"));
479
477
  var import_fs = __toESM(require("fs"));
480
478
  var import_path = __toESM(require("path"));
479
+ var import_internal2 = require("@restura/internal");
481
480
  var CustomApiFactory = class {
482
481
  constructor() {
483
482
  this.customApis = {};
@@ -486,7 +485,7 @@ var CustomApiFactory = class {
486
485
  const apiVersions = ["v1"];
487
486
  for (const apiVersion of apiVersions) {
488
487
  const apiVersionFolderPath = import_path.default.join(baseFolderPath, apiVersion);
489
- const directoryExists = await import_internal2.fileUtils.existDir(apiVersionFolderPath);
488
+ const directoryExists = await import_internal2.FileUtils.existDir(apiVersionFolderPath);
490
489
  if (!directoryExists) continue;
491
490
  await this.addDirectory(apiVersionFolderPath, apiVersion);
492
491
  }
@@ -1329,7 +1328,7 @@ var import_core_utils3 = require("@redskytech/core-utils");
1329
1328
  var import_jsonschema = __toESM(require("jsonschema"));
1330
1329
  var import_zod4 = require("zod");
1331
1330
 
1332
- // src/restura/utils/addQuotesToStrings.ts
1331
+ // src/restura/utils/utils.ts
1333
1332
  function addQuotesToStrings(variable) {
1334
1333
  if (typeof variable === "string") {
1335
1334
  return `'${variable}'`;
@@ -1340,6 +1339,17 @@ function addQuotesToStrings(variable) {
1340
1339
  return variable;
1341
1340
  }
1342
1341
  }
1342
+ function sortObjectKeysAlphabetically(obj) {
1343
+ if (Array.isArray(obj)) {
1344
+ return obj.map(sortObjectKeysAlphabetically);
1345
+ } else if (obj !== null && typeof obj === "object") {
1346
+ return Object.keys(obj).sort().reduce((sorted, key) => {
1347
+ sorted[key] = sortObjectKeysAlphabetically(obj[key]);
1348
+ return sorted;
1349
+ }, {});
1350
+ }
1351
+ return obj;
1352
+ }
1343
1353
 
1344
1354
  // src/restura/validators/requestValidator.ts
1345
1355
  function requestValidator(req, routeData, validationSchema) {
@@ -1899,7 +1909,7 @@ var filterPsqlParser = import_pegjs.default.generate(filterSqlGrammar, {
1899
1909
  var filterPsqlParser_default = filterPsqlParser;
1900
1910
 
1901
1911
  // src/restura/sql/PsqlEngine.ts
1902
- var { Client } = import_pg2.default;
1912
+ var { Client, types } = import_pg2.default;
1903
1913
  var systemUser = {
1904
1914
  role: "",
1905
1915
  host: "",
@@ -1910,6 +1920,7 @@ var PsqlEngine = class extends SqlEngine {
1910
1920
  constructor(psqlConnectionPool, shouldListenForDbTriggers = false) {
1911
1921
  super();
1912
1922
  this.psqlConnectionPool = psqlConnectionPool;
1923
+ this.setupPgReturnTypes();
1913
1924
  if (shouldListenForDbTriggers) {
1914
1925
  this.setupTriggerListeners = this.listenForDbTriggers();
1915
1926
  }
@@ -1919,6 +1930,16 @@ var PsqlEngine = class extends SqlEngine {
1919
1930
  await this.triggerClient.end();
1920
1931
  }
1921
1932
  }
1933
+ setupPgReturnTypes() {
1934
+ const TIMESTAMPTZ_OID = 1184;
1935
+ types.setTypeParser(TIMESTAMPTZ_OID, (val) => {
1936
+ return val === null ? null : new Date(val).toISOString();
1937
+ });
1938
+ const BIGINT_OID = 20;
1939
+ types.setTypeParser(BIGINT_OID, (val) => {
1940
+ return val === null ? null : Number(val);
1941
+ });
1942
+ }
1922
1943
  async listenForDbTriggers() {
1923
1944
  this.triggerClient = new Client({
1924
1945
  user: this.psqlConnectionPool.poolConfig.user,
@@ -1972,7 +1993,7 @@ var PsqlEngine = class extends SqlEngine {
1972
1993
  const tableColumns = [];
1973
1994
  for (const column of table.columns) {
1974
1995
  let columnSql = "";
1975
- columnSql += ` "${column.name}" ${schemaToPsqlType(column)}`;
1996
+ columnSql += ` "${column.name}" ${this.schemaToPsqlType(column)}`;
1976
1997
  let value = column.value;
1977
1998
  if (column.type === "JSON") value = "";
1978
1999
  if (column.type === "JSONB") value = "";
@@ -2441,10 +2462,14 @@ CREATE TRIGGER "${tableName}_insert"
2441
2462
  EXECUTE FUNCTION notify_${tableName}_insert();
2442
2463
  `;
2443
2464
  }
2465
+ schemaToPsqlType(column) {
2466
+ if (column.hasAutoIncrement) return "BIGSERIAL";
2467
+ if (column.type === "ENUM") return `TEXT`;
2468
+ if (column.type === "DATETIME") return "TIMESTAMPTZ";
2469
+ if (column.type === "MEDIUMINT") return "INT";
2470
+ return column.type;
2471
+ }
2444
2472
  };
2445
- __decorateClass([
2446
- boundMethod
2447
- ], PsqlEngine.prototype, "handleTrigger", 1);
2448
2473
  __decorateClass([
2449
2474
  boundMethod
2450
2475
  ], PsqlEngine.prototype, "createUpdateTrigger", 1);
@@ -2454,26 +2479,19 @@ __decorateClass([
2454
2479
  __decorateClass([
2455
2480
  boundMethod
2456
2481
  ], PsqlEngine.prototype, "createInsertTriggers", 1);
2457
- function schemaToPsqlType(column) {
2458
- if (column.hasAutoIncrement) return "BIGSERIAL";
2459
- if (column.type === "ENUM") return `TEXT`;
2460
- if (column.type === "DATETIME") return "TIMESTAMPTZ";
2461
- if (column.type === "MEDIUMINT") return "INT";
2462
- return column.type;
2463
- }
2464
2482
 
2465
2483
  // src/restura/utils/TempCache.ts
2466
2484
  var import_fs3 = __toESM(require("fs"));
2467
2485
  var import_path4 = __toESM(require("path"));
2468
2486
  var import_core_utils6 = require("@redskytech/core-utils");
2487
+ var import_internal3 = require("@restura/internal");
2469
2488
  var import_bluebird3 = __toESM(require("bluebird"));
2470
2489
  var os2 = __toESM(require("os"));
2471
- var import_internal3 = require("@restura/internal");
2472
2490
  var TempCache = class {
2473
2491
  constructor(location) {
2474
2492
  this.maxDurationDays = 7;
2475
2493
  this.location = location || os2.tmpdir();
2476
- import_internal3.fileUtils.ensureDir(this.location).catch((e) => {
2494
+ import_internal3.FileUtils.ensureDir(this.location).catch((e) => {
2477
2495
  throw e;
2478
2496
  });
2479
2497
  }
@@ -2495,7 +2513,6 @@ var TempCache = class {
2495
2513
  };
2496
2514
 
2497
2515
  // src/restura/restura.ts
2498
- var { types } = import_pg3.default;
2499
2516
  var ResturaEngine = class {
2500
2517
  constructor() {
2501
2518
  this.publicEndpoints = {
@@ -2518,7 +2535,6 @@ var ResturaEngine = class {
2518
2535
  new TempCache(this.resturaConfig.fileTempCachePath);
2519
2536
  this.psqlConnectionPool = psqlConnectionPool;
2520
2537
  this.psqlEngine = new PsqlEngine(this.psqlConnectionPool, true);
2521
- setupPgReturnTypes();
2522
2538
  await customApiFactory_default.loadApiFiles(this.resturaConfig.customApiFolderPath);
2523
2539
  this.authenticationHandler = authenticationHandler;
2524
2540
  app.use((0, import_compression.default)());
@@ -2669,7 +2685,7 @@ var ResturaEngine = class {
2669
2685
  }
2670
2686
  async updateSchema(req, res) {
2671
2687
  try {
2672
- this.schema = req.data;
2688
+ this.schema = sortObjectKeysAlphabetically(req.data);
2673
2689
  await this.storeFileSystemSchema();
2674
2690
  await this.reloadEndpoints();
2675
2691
  await this.updateTypes();
@@ -2831,22 +2847,11 @@ __decorateClass([
2831
2847
  __decorateClass([
2832
2848
  boundMethod
2833
2849
  ], ResturaEngine.prototype, "runCustomRouteLogic", 1);
2834
- function setupPgReturnTypes() {
2835
- const TIMESTAMPTZ_OID = 1184;
2836
- types.setTypeParser(TIMESTAMPTZ_OID, (val) => {
2837
- return val === null ? null : new Date(val).toISOString();
2838
- });
2839
- const BIGINT_OID = 20;
2840
- types.setTypeParser(BIGINT_OID, (val) => {
2841
- return val === null ? null : Number(val);
2842
- });
2843
- }
2844
- setupPgReturnTypes();
2845
2850
  var restura = new ResturaEngine();
2846
2851
 
2847
2852
  // src/restura/sql/PsqlTransaction.ts
2848
- var import_pg4 = __toESM(require("pg"));
2849
- var { Client: Client2 } = import_pg4.default;
2853
+ var import_pg3 = __toESM(require("pg"));
2854
+ var { Client: Client2 } = import_pg3.default;
2850
2855
  var PsqlTransaction = class extends PsqlConnection {
2851
2856
  constructor(clientConfig) {
2852
2857
  super();