@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 +5 -3
- package/dist/index.d.ts +5 -3
- package/dist/index.js +39 -34
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +39 -34
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
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
|
|
162
|
-
addColumnChangeHandler<T
|
|
163
|
-
addRowDeleteHandler<T
|
|
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
|
|
162
|
-
addColumnChangeHandler<T
|
|
163
|
-
addRowDeleteHandler<T
|
|
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.
|
|
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/
|
|
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.
|
|
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
|
|
2849
|
-
var { Client: Client2 } =
|
|
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();
|