prostgles-server 3.0.38 → 3.0.40
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/DBSchemaBuilder.d.ts.map +1 -1
- package/dist/DBSchemaBuilder.js.map +1 -1
- package/dist/DboBuilder/QueryBuilder/QueryBuilder.d.ts +2 -1
- package/dist/DboBuilder/QueryBuilder/QueryBuilder.d.ts.map +1 -1
- package/dist/DboBuilder/QueryBuilder/QueryBuilder.js +47 -2
- package/dist/DboBuilder/QueryBuilder/QueryBuilder.js.map +1 -1
- package/dist/DboBuilder/QueryBuilder/makeSelectQuery.d.ts +1 -1
- package/dist/DboBuilder/QueryBuilder/makeSelectQuery.d.ts.map +1 -1
- package/dist/DboBuilder/QueryBuilder/makeSelectQuery.js.map +1 -1
- package/dist/DboBuilder/TableHandler.d.ts +62 -0
- package/dist/DboBuilder/TableHandler.d.ts.map +1 -0
- package/dist/DboBuilder/TableHandler.js +304 -0
- package/dist/DboBuilder/TableHandler.js.map +1 -0
- package/dist/DboBuilder/ViewHandler.d.ts +137 -0
- package/dist/DboBuilder/ViewHandler.d.ts.map +1 -0
- package/dist/DboBuilder/ViewHandler.js +1292 -0
- package/dist/DboBuilder/ViewHandler.js.map +1 -0
- package/dist/DboBuilder/delete.d.ts +2 -1
- package/dist/DboBuilder/delete.d.ts.map +1 -1
- package/dist/DboBuilder/delete.js.map +1 -1
- package/dist/DboBuilder/getColumns.d.ts +12 -0
- package/dist/DboBuilder/getColumns.d.ts.map +1 -0
- package/dist/DboBuilder/getColumns.js +95 -0
- package/dist/DboBuilder/getColumns.js.map +1 -0
- package/dist/DboBuilder/insert.d.ts +2 -1
- package/dist/DboBuilder/insert.d.ts.map +1 -1
- package/dist/DboBuilder/insert.js +1 -1
- package/dist/DboBuilder/insert.js.map +1 -1
- package/dist/DboBuilder/insertDataParse.d.ts +2 -1
- package/dist/DboBuilder/insertDataParse.d.ts.map +1 -1
- package/dist/DboBuilder/insertDataParse.js +2 -3
- package/dist/DboBuilder/insertDataParse.js.map +1 -1
- package/dist/DboBuilder/parseUpdateRules.d.ts +18 -0
- package/dist/DboBuilder/parseUpdateRules.d.ts.map +1 -0
- package/dist/DboBuilder/parseUpdateRules.js +119 -0
- package/dist/DboBuilder/parseUpdateRules.js.map +1 -0
- package/dist/DboBuilder/update.d.ts +2 -1
- package/dist/DboBuilder/update.d.ts.map +1 -1
- package/dist/DboBuilder/update.js.map +1 -1
- package/dist/DboBuilder/uploadFile.d.ts +2 -1
- package/dist/DboBuilder/uploadFile.d.ts.map +1 -1
- package/dist/DboBuilder/uploadFile.js.map +1 -1
- package/dist/DboBuilder.d.ts +5 -185
- package/dist/DboBuilder.d.ts.map +1 -1
- package/dist/DboBuilder.js +7 -1773
- package/dist/DboBuilder.js.map +1 -1
- package/dist/FileManager.d.ts.map +1 -1
- package/dist/FileManager.js +4 -4
- package/dist/FileManager.js.map +1 -1
- package/dist/PubSubManager.d.ts.map +1 -1
- package/dist/PubSubManager.js +4 -0
- package/dist/PubSubManager.js.map +1 -1
- package/dist/PublishParser.d.ts.map +1 -1
- package/dist/PublishParser.js.map +1 -1
- package/dist/index.js +0 -38
- package/dist/index.js.map +1 -1
- package/lib/DBSchemaBuilder.d.ts.map +1 -1
- package/lib/DBSchemaBuilder.ts +1 -1
- package/lib/DboBuilder/QueryBuilder/QueryBuilder.d.ts +2 -1
- package/lib/DboBuilder/QueryBuilder/QueryBuilder.d.ts.map +1 -1
- package/lib/DboBuilder/QueryBuilder/QueryBuilder.js +47 -2
- package/lib/DboBuilder/QueryBuilder/QueryBuilder.ts +55 -2
- package/lib/DboBuilder/QueryBuilder/makeSelectQuery.d.ts +1 -1
- package/lib/DboBuilder/QueryBuilder/makeSelectQuery.d.ts.map +1 -1
- package/lib/DboBuilder/QueryBuilder/makeSelectQuery.ts +2 -1
- package/lib/DboBuilder/TableHandler.d.ts +54 -0
- package/lib/DboBuilder/TableHandler.d.ts.map +1 -0
- package/lib/DboBuilder/TableHandler.js +303 -0
- package/lib/DboBuilder/TableHandler.ts +365 -0
- package/lib/DboBuilder/ViewHandler.d.ts +133 -0
- package/lib/DboBuilder/ViewHandler.d.ts.map +1 -0
- package/lib/DboBuilder/ViewHandler.js +1291 -0
- package/lib/DboBuilder/ViewHandler.ts +1542 -0
- package/lib/DboBuilder/delete.d.ts +2 -1
- package/lib/DboBuilder/delete.d.ts.map +1 -1
- package/lib/DboBuilder/delete.ts +2 -1
- package/lib/DboBuilder/getColumns.d.ts +12 -0
- package/lib/DboBuilder/getColumns.d.ts.map +1 -0
- package/lib/DboBuilder/getColumns.js +94 -0
- package/lib/DboBuilder/getColumns.ts +133 -0
- package/lib/DboBuilder/insert.d.ts +2 -1
- package/lib/DboBuilder/insert.d.ts.map +1 -1
- package/lib/DboBuilder/insert.js +1 -1
- package/lib/DboBuilder/insert.ts +3 -2
- package/lib/DboBuilder/insertDataParse.d.ts +2 -1
- package/lib/DboBuilder/insertDataParse.d.ts.map +1 -1
- package/lib/DboBuilder/insertDataParse.js +2 -3
- package/lib/DboBuilder/insertDataParse.ts +6 -5
- package/lib/DboBuilder/parseUpdateRules.d.ts +18 -0
- package/lib/DboBuilder/parseUpdateRules.d.ts.map +1 -0
- package/lib/DboBuilder/parseUpdateRules.js +118 -0
- package/lib/DboBuilder/parseUpdateRules.ts +156 -0
- package/lib/DboBuilder/update.d.ts +2 -1
- package/lib/DboBuilder/update.d.ts.map +1 -1
- package/lib/DboBuilder/update.ts +2 -1
- package/lib/DboBuilder/uploadFile.d.ts +2 -1
- package/lib/DboBuilder/uploadFile.d.ts.map +1 -1
- package/lib/DboBuilder/uploadFile.ts +2 -1
- package/lib/DboBuilder.d.ts +5 -185
- package/lib/DboBuilder.d.ts.map +1 -1
- package/lib/DboBuilder.js +7 -1773
- package/lib/DboBuilder.ts +170 -2296
- package/lib/FileManager.d.ts.map +1 -1
- package/lib/FileManager.js +4 -4
- package/lib/FileManager.ts +3 -1
- package/lib/PubSubManager.d.ts.map +1 -1
- package/lib/PubSubManager.js +4 -0
- package/lib/PubSubManager.ts +6 -1
- package/lib/PublishParser.d.ts.map +1 -1
- package/lib/PublishParser.ts +3 -1
- package/lib/SyncReplication.ts +1 -1
- package/lib/index.js +0 -38
- package/lib/index.ts +1 -53
- package/package.json +2 -2
- package/tests/client/PID.txt +1 -1
- package/tests/client_only_queries.ts +1 -1
- package/tests/server/package-lock.json +409 -250
- package/tests/server/package.json +1 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { DeleteParams } from "prostgles-types";
|
|
2
|
-
import { Filter, LocalParams
|
|
2
|
+
import { Filter, LocalParams } from "../DboBuilder";
|
|
3
3
|
import { TableRule } from "../PublishParser";
|
|
4
|
+
import { TableHandler } from "./TableHandler";
|
|
4
5
|
export declare function _delete(this: TableHandler, filter?: Filter, params?: DeleteParams, param3_unused?: undefined, table_rules?: TableRule, localParams?: LocalParams): Promise<any>;
|
|
5
6
|
//# sourceMappingURL=delete.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["delete.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,YAAY,EAAe,MAAM,iBAAiB,CAAC;AAC/E,OAAO,EAAE,MAAM,EAAE,WAAW,EAAuB,
|
|
1
|
+
{"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["delete.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,YAAY,EAAe,MAAM,iBAAiB,CAAC;AAC/E,OAAO,EAAE,MAAM,EAAE,WAAW,EAAuB,MAAM,eAAe,CAAC;AACzE,OAAO,EAAc,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAEzD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,wBAAsB,OAAO,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,YAAY,EAAE,aAAa,CAAC,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CA6HrL"}
|
package/lib/DboBuilder/delete.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import pgPromise from "pg-promise";
|
|
2
2
|
import { AnyObject, asName, DeleteParams, FieldFilter } from "prostgles-types";
|
|
3
|
-
import { Filter, LocalParams, makeErr, parseError
|
|
3
|
+
import { Filter, LocalParams, makeErr, parseError } from "../DboBuilder";
|
|
4
4
|
import { DeleteRule, TableRule } from "../PublishParser";
|
|
5
5
|
import { pickKeys } from "../PubSubManager";
|
|
6
|
+
import { TableHandler } from "./TableHandler";
|
|
6
7
|
|
|
7
8
|
export async function _delete(this: TableHandler, filter?: Filter, params?: DeleteParams, param3_unused?: undefined, table_rules?: TableRule, localParams?: LocalParams): Promise<any> {
|
|
8
9
|
try {
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { AnyObject, ValidatedColumnInfo } from "prostgles-types";
|
|
2
|
+
import { LocalParams } from "../DboBuilder";
|
|
3
|
+
import { TableRule } from "../PublishParser";
|
|
4
|
+
import { TableHandler } from "./TableHandler";
|
|
5
|
+
import { ViewHandler } from "./ViewHandler";
|
|
6
|
+
export declare const isTableHandler: (v: any) => v is TableHandler;
|
|
7
|
+
export declare function getColumns(this: ViewHandler, lang?: string, params?: {
|
|
8
|
+
rule: "update";
|
|
9
|
+
filter: AnyObject;
|
|
10
|
+
data: AnyObject;
|
|
11
|
+
}, _param3?: undefined, tableRules?: TableRule, localParams?: LocalParams): Promise<ValidatedColumnInfo[]>;
|
|
12
|
+
//# sourceMappingURL=getColumns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getColumns.d.ts","sourceRoot":"","sources":["getColumns.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,mBAAmB,EACpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAiB,WAAW,EAAgC,MAAM,eAAe,CAAC;AACzF,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,eAAO,MAAM,cAAc,MAAO,GAAG,sBAA+C,CAAC;AAErF,wBAAsB,UAAU,CAC9B,IAAI,EAAE,WAAW,EACjB,IAAI,CAAC,EAAE,MAAM,EACb,MAAM,CAAC,EAAE;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,SAAS,CAAA;CAAE,EAC/D,OAAO,CAAC,EAAE,SAAS,EACnB,UAAU,CAAC,EAAE,SAAS,EACtB,WAAW,CAAC,EAAE,WAAW,GACxB,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAuGhC"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getColumns = exports.isTableHandler = void 0;
|
|
4
|
+
const prostgles_types_1 = require("prostgles-types");
|
|
5
|
+
const DboBuilder_1 = require("../DboBuilder");
|
|
6
|
+
const isTableHandler = (v) => "parseUpdateRules" in v;
|
|
7
|
+
exports.isTableHandler = isTableHandler;
|
|
8
|
+
async function getColumns(lang, params, _param3, tableRules, localParams) {
|
|
9
|
+
try {
|
|
10
|
+
const p = this.getValidatedRules(tableRules, localParams);
|
|
11
|
+
if (!p.getColumns)
|
|
12
|
+
throw "Not allowed";
|
|
13
|
+
// console.log("getColumns", this.name, this.columns.map(c => c.name))
|
|
14
|
+
let dynamicUpdateFields;
|
|
15
|
+
if (params && tableRules && (0, exports.isTableHandler)(this)) {
|
|
16
|
+
if (!(0, DboBuilder_1.isPlainObject)(params) ||
|
|
17
|
+
(params.data && !(0, DboBuilder_1.isPlainObject)(params.data)) ||
|
|
18
|
+
!(0, DboBuilder_1.isPlainObject)(params.filter) ||
|
|
19
|
+
params.rule !== "update") {
|
|
20
|
+
throw "params must be { rule: 'update', filter: object, data?: object } but got: " + JSON.stringify(params);
|
|
21
|
+
}
|
|
22
|
+
if (!tableRules?.update) {
|
|
23
|
+
dynamicUpdateFields = [];
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
const { data, filter } = params;
|
|
27
|
+
const updateRules = await this.parseUpdateRules(filter, data, undefined, tableRules, { ...localParams, testRule: true });
|
|
28
|
+
dynamicUpdateFields = updateRules.fields;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
let columns = this.columns
|
|
32
|
+
.filter(c => {
|
|
33
|
+
const { insert, select, update } = p || {};
|
|
34
|
+
return [
|
|
35
|
+
...(insert?.fields || []),
|
|
36
|
+
...(select?.fields || []),
|
|
37
|
+
...(update?.fields || []),
|
|
38
|
+
].includes(c.name);
|
|
39
|
+
})
|
|
40
|
+
.map(_c => {
|
|
41
|
+
let c = { ..._c };
|
|
42
|
+
let label = c.comment || capitalizeFirstLetter(c.name, " ");
|
|
43
|
+
let select = c.privileges.some(p => p.privilege_type === "SELECT"), insert = c.privileges.some(p => p.privilege_type === "INSERT"), update = c.privileges.some(p => p.privilege_type === "UPDATE"), _delete = this.tableOrViewInfo.privileges.delete; // c.privileges.some(p => p.privilege_type === "DELETE");
|
|
44
|
+
delete c.privileges;
|
|
45
|
+
const prostgles = this.dboBuilder?.prostgles;
|
|
46
|
+
const fileConfig = prostgles.fileManager?.getColInfo({ colName: c.name, tableName: this.name });
|
|
47
|
+
/** Do not allow updates to file table unless it's to delete fields */
|
|
48
|
+
if (prostgles.fileManager?.config && prostgles.fileManager.tableName === this.name) {
|
|
49
|
+
update = false;
|
|
50
|
+
}
|
|
51
|
+
const nonOrderableUD_Types = [...prostgles_types_1._PG_geometric, "xml"];
|
|
52
|
+
let result = {
|
|
53
|
+
...c,
|
|
54
|
+
label,
|
|
55
|
+
tsDataType: (0, DboBuilder_1.postgresToTsType)(c.udt_name),
|
|
56
|
+
insert: insert && Boolean(p.insert?.fields?.includes(c.name)) && tableRules?.insert?.forcedData?.[c.name] === undefined,
|
|
57
|
+
select: select && Boolean(p.select?.fields?.includes(c.name)),
|
|
58
|
+
orderBy: select && Boolean(p.select?.fields && p.select.orderByFields.includes(c.name)) && !nonOrderableUD_Types.includes(c.udt_name),
|
|
59
|
+
filter: Boolean(p.select?.filterFields?.includes(c.name)),
|
|
60
|
+
update: update && Boolean(p.update?.fields?.includes(c.name)) && tableRules?.update?.forcedData?.[c.name] === undefined,
|
|
61
|
+
delete: _delete && Boolean(p.delete && p.delete.filterFields && p.delete.filterFields.includes(c.name)),
|
|
62
|
+
...(prostgles?.tableConfigurator?.getColInfo({ table: this.name, col: c.name, lang }) || {}),
|
|
63
|
+
...(fileConfig && { file: fileConfig })
|
|
64
|
+
};
|
|
65
|
+
if (dynamicUpdateFields) {
|
|
66
|
+
result.update = dynamicUpdateFields.includes(c.name);
|
|
67
|
+
}
|
|
68
|
+
return result;
|
|
69
|
+
}).filter(c => c.select || c.update || c.delete || c.insert);
|
|
70
|
+
//.sort((a, b) => a.ordinal_position - b.ordinal_position);
|
|
71
|
+
// const tblInfo = await this.getInfo();
|
|
72
|
+
// if(tblInfo && tblInfo.media_table_name && tblInfo.has_media){
|
|
73
|
+
// const mediaRules = this.dboBuilder.dbo[tblInfo.media_table_name]?.
|
|
74
|
+
// return columns.concat({
|
|
75
|
+
// comment: "",
|
|
76
|
+
// data_type: "file",
|
|
77
|
+
// delete: false,
|
|
78
|
+
// });
|
|
79
|
+
// }
|
|
80
|
+
return columns;
|
|
81
|
+
}
|
|
82
|
+
catch (e) {
|
|
83
|
+
throw (0, DboBuilder_1.parseError)(e, `db.${this.name}.getColumns()`);
|
|
84
|
+
// throw "Something went wrong in " + `db.${this.name}.getColumns()`;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
exports.getColumns = getColumns;
|
|
88
|
+
function replaceNonAlphaNumeric(string, replacement = "_") {
|
|
89
|
+
return string.replace(/[\W_]+/g, replacement);
|
|
90
|
+
}
|
|
91
|
+
function capitalizeFirstLetter(string, nonalpha_replacement) {
|
|
92
|
+
const str = replaceNonAlphaNumeric(string, nonalpha_replacement);
|
|
93
|
+
return str.charAt(0).toUpperCase() + str.slice(1);
|
|
94
|
+
}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AnyObject, PG_COLUMN_UDT_DATA_TYPE,
|
|
3
|
+
ValidatedColumnInfo, _PG_geometric
|
|
4
|
+
} from "prostgles-types";
|
|
5
|
+
import { isPlainObject, LocalParams, parseError, postgresToTsType } from "../DboBuilder";
|
|
6
|
+
import { TableRule } from "../PublishParser";
|
|
7
|
+
import { TableHandler } from "./TableHandler";
|
|
8
|
+
import { ViewHandler } from "./ViewHandler";
|
|
9
|
+
|
|
10
|
+
export const isTableHandler = (v: any): v is TableHandler => "parseUpdateRules" in v;
|
|
11
|
+
|
|
12
|
+
export async function getColumns(
|
|
13
|
+
this: ViewHandler,
|
|
14
|
+
lang?: string,
|
|
15
|
+
params?: { rule: "update", filter: AnyObject, data: AnyObject },
|
|
16
|
+
_param3?: undefined,
|
|
17
|
+
tableRules?: TableRule,
|
|
18
|
+
localParams?: LocalParams
|
|
19
|
+
): Promise<ValidatedColumnInfo[]> {
|
|
20
|
+
|
|
21
|
+
try {
|
|
22
|
+
const p = this.getValidatedRules(tableRules, localParams);
|
|
23
|
+
|
|
24
|
+
if (!p.getColumns) throw "Not allowed";
|
|
25
|
+
|
|
26
|
+
// console.log("getColumns", this.name, this.columns.map(c => c.name))
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
let dynamicUpdateFields: string[] | undefined;
|
|
30
|
+
|
|
31
|
+
if (params && tableRules && isTableHandler(this)) {
|
|
32
|
+
if (
|
|
33
|
+
!isPlainObject(params) ||
|
|
34
|
+
(params.data && !isPlainObject(params.data)) ||
|
|
35
|
+
!isPlainObject(params.filter) ||
|
|
36
|
+
params.rule !== "update"
|
|
37
|
+
) {
|
|
38
|
+
throw "params must be { rule: 'update', filter: object, data?: object } but got: " + JSON.stringify(params);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if (!tableRules?.update) {
|
|
42
|
+
dynamicUpdateFields = [];
|
|
43
|
+
} else {
|
|
44
|
+
const { data, filter } = params;
|
|
45
|
+
const updateRules = await this.parseUpdateRules(filter, data, undefined, tableRules, { ...localParams, testRule: true });
|
|
46
|
+
dynamicUpdateFields = updateRules.fields;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const columns = this.columns
|
|
51
|
+
.filter(c => {
|
|
52
|
+
const { insert, select, update } = p || {};
|
|
53
|
+
|
|
54
|
+
return [
|
|
55
|
+
...(insert?.fields || []),
|
|
56
|
+
...(select?.fields || []),
|
|
57
|
+
...(update?.fields || []),
|
|
58
|
+
].includes(c.name)
|
|
59
|
+
})
|
|
60
|
+
.map(_c => {
|
|
61
|
+
let c = { ..._c };
|
|
62
|
+
|
|
63
|
+
let label = c.comment || capitalizeFirstLetter(c.name, " ");
|
|
64
|
+
|
|
65
|
+
let select = c.privileges.some(p => p.privilege_type === "SELECT"),
|
|
66
|
+
insert = c.privileges.some(p => p.privilege_type === "INSERT"),
|
|
67
|
+
update = c.privileges.some(p => p.privilege_type === "UPDATE"),
|
|
68
|
+
_delete = this.tableOrViewInfo.privileges.delete;// c.privileges.some(p => p.privilege_type === "DELETE");
|
|
69
|
+
|
|
70
|
+
delete (c as any).privileges;
|
|
71
|
+
|
|
72
|
+
const prostgles = this.dboBuilder?.prostgles;
|
|
73
|
+
const fileConfig = prostgles.fileManager?.getColInfo({ colName: c.name, tableName: this.name });
|
|
74
|
+
|
|
75
|
+
/** Do not allow updates to file table unless it's to delete fields */
|
|
76
|
+
if (prostgles.fileManager?.config && prostgles.fileManager.tableName === this.name) {
|
|
77
|
+
update = false;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const nonOrderableUD_Types: PG_COLUMN_UDT_DATA_TYPE[] = [..._PG_geometric, "xml" as any];
|
|
81
|
+
|
|
82
|
+
let result: ValidatedColumnInfo = {
|
|
83
|
+
...c,
|
|
84
|
+
label,
|
|
85
|
+
tsDataType: postgresToTsType(c.udt_name),
|
|
86
|
+
insert: insert && Boolean(p.insert?.fields?.includes(c.name)) && tableRules?.insert?.forcedData?.[c.name] === undefined,
|
|
87
|
+
select: select && Boolean(p.select?.fields?.includes(c.name)),
|
|
88
|
+
orderBy: select && Boolean(p.select?.fields && p.select.orderByFields.includes(c.name)) && !nonOrderableUD_Types.includes(c.udt_name),
|
|
89
|
+
filter: Boolean(p.select?.filterFields?.includes(c.name)),
|
|
90
|
+
update: update && Boolean(p.update?.fields?.includes(c.name)) && tableRules?.update?.forcedData?.[c.name] === undefined,
|
|
91
|
+
delete: _delete && Boolean(p.delete && p.delete.filterFields && p.delete.filterFields.includes(c.name)),
|
|
92
|
+
...(prostgles?.tableConfigurator?.getColInfo({ table: this.name, col: c.name, lang }) || {}),
|
|
93
|
+
...(fileConfig && { file: fileConfig })
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
if (dynamicUpdateFields) {
|
|
97
|
+
result.update = dynamicUpdateFields.includes(c.name);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return result;
|
|
101
|
+
}).filter(c => c.select || c.update || c.delete || c.insert)
|
|
102
|
+
|
|
103
|
+
//.sort((a, b) => a.ordinal_position - b.ordinal_position);
|
|
104
|
+
|
|
105
|
+
// const tblInfo = await this.getInfo();
|
|
106
|
+
|
|
107
|
+
// if(tblInfo && tblInfo.media_table_name && tblInfo.has_media){
|
|
108
|
+
// const mediaRules = this.dboBuilder.dbo[tblInfo.media_table_name]?.
|
|
109
|
+
// return columns.concat({
|
|
110
|
+
// comment: "",
|
|
111
|
+
// data_type: "file",
|
|
112
|
+
// delete: false,
|
|
113
|
+
// });
|
|
114
|
+
// }
|
|
115
|
+
|
|
116
|
+
return columns;
|
|
117
|
+
|
|
118
|
+
} catch (e) {
|
|
119
|
+
throw parseError(e, `db.${this.name}.getColumns()`);
|
|
120
|
+
// throw "Something went wrong in " + `db.${this.name}.getColumns()`;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
function replaceNonAlphaNumeric(string: string, replacement = "_"): string {
|
|
128
|
+
return string.replace(/[\W_]+/g, replacement);
|
|
129
|
+
}
|
|
130
|
+
function capitalizeFirstLetter(string: string, nonalpha_replacement?: string) : string {
|
|
131
|
+
const str = replaceNonAlphaNumeric(string, nonalpha_replacement);
|
|
132
|
+
return str.charAt(0).toUpperCase() + str.slice(1);
|
|
133
|
+
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { AnyObject, InsertParams } from "prostgles-types";
|
|
2
|
-
import { LocalParams
|
|
2
|
+
import { LocalParams } from "../DboBuilder";
|
|
3
3
|
import { TableRule } from "../PublishParser";
|
|
4
|
+
import { TableHandler } from "./TableHandler";
|
|
4
5
|
export declare function insert(this: TableHandler, rowOrRows: (AnyObject | AnyObject[]), param2?: InsertParams, param3_unused?: undefined, tableRules?: TableRule, localParams?: LocalParams): Promise<any | any[] | boolean>;
|
|
5
6
|
//# sourceMappingURL=insert.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"insert.d.ts","sourceRoot":"","sources":["insert.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAqC,YAAY,EAAY,MAAM,iBAAiB,CAAC;AACvG,OAAO,
|
|
1
|
+
{"version":3,"file":"insert.d.ts","sourceRoot":"","sources":["insert.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAqC,YAAY,EAAY,MAAM,iBAAiB,CAAC;AACvG,OAAO,EAAiB,WAAW,EAA4B,MAAM,eAAe,CAAC;AACrF,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,wBAAsB,MAAM,CAAC,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,SAAS,GAAG,SAAS,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,YAAY,EAAE,aAAa,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,OAAO,CAAC,CAiL1N"}
|
package/lib/DboBuilder/insert.js
CHANGED
|
@@ -79,7 +79,7 @@ async function insert(rowOrRows, param2, param3_unused, tableRules, localParams)
|
|
|
79
79
|
let returningSelect = this.makeReturnQuery(finalSelect);
|
|
80
80
|
const makeQuery = async (_row, isOne = false) => {
|
|
81
81
|
let row = { ..._row };
|
|
82
|
-
if (!(0,
|
|
82
|
+
if (!(0, prostgles_types_1.isObject)(row)) {
|
|
83
83
|
console.trace(row);
|
|
84
84
|
throw "\ninvalid insert data provided -> " + JSON.stringify(row);
|
|
85
85
|
}
|
package/lib/DboBuilder/insert.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import pgPromise from "pg-promise";
|
|
2
2
|
import { AnyObject, asName, FieldFilter, get, getKeys, InsertParams, isObject } from "prostgles-types";
|
|
3
|
-
import { isPlainObject,
|
|
3
|
+
import { isPlainObject, LocalParams, makeErr, parseError, pgp } from "../DboBuilder";
|
|
4
4
|
import { TableRule } from "../PublishParser";
|
|
5
5
|
import { asValue, omitKeys, pickKeys } from "../PubSubManager";
|
|
6
|
+
import { TableHandler } from "./TableHandler";
|
|
6
7
|
|
|
7
8
|
export async function insert(this: TableHandler, rowOrRows: (AnyObject | AnyObject[]), param2?: InsertParams, param3_unused?: undefined, tableRules?: TableRule, localParams?: LocalParams): Promise<any | any[] | boolean> {
|
|
8
9
|
// const localParams = _localParams || {};
|
|
@@ -93,7 +94,7 @@ export async function insert(this: TableHandler, rowOrRows: (AnyObject | AnyObje
|
|
|
93
94
|
const makeQuery = async (_row: AnyObject | undefined, isOne = false) => {
|
|
94
95
|
let row = { ..._row };
|
|
95
96
|
|
|
96
|
-
if (!
|
|
97
|
+
if (!isObject(row)) {
|
|
97
98
|
console.trace(row)
|
|
98
99
|
throw "\ninvalid insert data provided -> " + JSON.stringify(row);
|
|
99
100
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { AnyObject, InsertParams } from "prostgles-types";
|
|
2
|
-
import { LocalParams
|
|
2
|
+
import { LocalParams } from "../DboBuilder";
|
|
3
3
|
import { TableRule } from "../PublishParser";
|
|
4
|
+
import { TableHandler } from "./TableHandler";
|
|
4
5
|
/**
|
|
5
6
|
* Used for doing referenced inserts within a single transaction
|
|
6
7
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"insertDataParse.d.ts","sourceRoot":"","sources":["insertDataParse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"insertDataParse.d.ts","sourceRoot":"","sources":["insertDataParse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAW,YAAY,EAAgD,MAAM,iBAAiB,CAAC;AACjH,OAAO,EAAE,WAAW,EAAiB,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C;;GAEG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE,CAAC,SAAS,GAAG,SAAS,EAAE,CAAC,EAC/B,MAAM,CAAC,EAAE,YAAY,EACrB,aAAa,CAAC,EAAE,SAAS,EACzB,UAAU,CAAC,EAAE,SAAS,EACtB,YAAY,CAAC,EAAE,WAAW,GACzB,OAAO,CAAC;IACT,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,EAAE,CAAC;IAC/B,YAAY,CAAC,EAAE,SAAS,GAAG,SAAS,EAAE,CAAC;CACxC,CAAC,CAoQD"}
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.insertDataParse = void 0;
|
|
4
4
|
const prostgles_types_1 = require("prostgles-types");
|
|
5
|
-
const DboBuilder_1 = require("../DboBuilder");
|
|
6
5
|
const PubSubManager_1 = require("../PubSubManager");
|
|
7
6
|
const uploadFile_1 = require("./uploadFile");
|
|
8
7
|
/**
|
|
@@ -18,7 +17,7 @@ async function insertDataParse(data, param2, param3_unused, tableRules, _localPa
|
|
|
18
17
|
return !this.column_names.concat(MEDIA_COL_NAMES).includes(k);
|
|
19
18
|
}
|
|
20
19
|
else if (!this.columns.find(c => c.name === k)) {
|
|
21
|
-
if (!(0,
|
|
20
|
+
if (!(0, prostgles_types_1.isObject)(d[k]) && !Array.isArray(d[k])) {
|
|
22
21
|
throw new Error("Invalid/Dissalowed field in data: " + k);
|
|
23
22
|
}
|
|
24
23
|
else if (!this.dboBuilder.dbo[k]) {
|
|
@@ -30,7 +29,7 @@ async function insertDataParse(data, param2, param3_unused, tableRules, _localPa
|
|
|
30
29
|
});
|
|
31
30
|
const ALLOWED_COL_TYPES = ["int2", "int4", "int8", "numeric", "uuid", "text", "varchar", "char"];
|
|
32
31
|
const getColumnInserts = (d) => (0, prostgles_types_1.getKeys)(d)
|
|
33
|
-
.filter(k => d[k] && (0,
|
|
32
|
+
.filter(k => d[k] && (0, prostgles_types_1.isObject)(d[k]))
|
|
34
33
|
.map(k => {
|
|
35
34
|
const insertedCol = this.columns.find(c => c.name === k &&
|
|
36
35
|
ALLOWED_COL_TYPES.includes(c.udt_name));
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { AnyObject,
|
|
2
|
-
import {
|
|
1
|
+
import { AnyObject, getKeys, InsertParams, isDefined, isObject, PG_COLUMN_UDT_DATA_TYPE } from "prostgles-types";
|
|
2
|
+
import { LocalParams, TableHandlers } from "../DboBuilder";
|
|
3
3
|
import { TableRule } from "../PublishParser";
|
|
4
4
|
import { omitKeys } from "../PubSubManager";
|
|
5
|
-
import {
|
|
5
|
+
import { TableHandler } from "./TableHandler";
|
|
6
|
+
import { uploadFile } from "./uploadFile";
|
|
6
7
|
|
|
7
8
|
/**
|
|
8
9
|
* Used for doing referenced inserts within a single transaction
|
|
@@ -27,7 +28,7 @@ export async function insertDataParse(
|
|
|
27
28
|
if(this.is_media){
|
|
28
29
|
return !this.column_names.concat(MEDIA_COL_NAMES).includes(k)
|
|
29
30
|
} else if(!this.columns.find(c => c.name === k)){
|
|
30
|
-
if(!
|
|
31
|
+
if(!isObject(d[k]) && !Array.isArray(d[k])){
|
|
31
32
|
throw new Error("Invalid/Dissalowed field in data: " + k)
|
|
32
33
|
} else if(!this.dboBuilder.dbo[k]){
|
|
33
34
|
throw new Error("Invalid/Dissalowed nested insert table name in data: " + k)
|
|
@@ -38,7 +39,7 @@ export async function insertDataParse(
|
|
|
38
39
|
});
|
|
39
40
|
const ALLOWED_COL_TYPES: PG_COLUMN_UDT_DATA_TYPE[] = ["int2", "int4", "int8", "numeric", "uuid", "text", "varchar", "char"];
|
|
40
41
|
const getColumnInserts = (d: AnyObject) => getKeys(d)
|
|
41
|
-
.filter(k => d[k] &&
|
|
42
|
+
.filter(k => d[k] && isObject(d[k]))
|
|
42
43
|
.map(k => {
|
|
43
44
|
const insertedCol = this.columns.find(c =>
|
|
44
45
|
c.name === k &&
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { AnyObject, FieldFilter, UpdateParams } from "prostgles-types";
|
|
2
|
+
import { Filter, LocalParams } from "../DboBuilder";
|
|
3
|
+
import { TableRule, ValidateRow } from "../PublishParser";
|
|
4
|
+
import { TableHandler } from "./TableHandler";
|
|
5
|
+
/**
|
|
6
|
+
* 1) Check if publish is valid
|
|
7
|
+
* 2) Retrieve allowed update cols for a specific request
|
|
8
|
+
*/
|
|
9
|
+
export declare function parseUpdateRules(this: TableHandler, filter: Filter, newData: AnyObject, params?: UpdateParams, tableRules?: TableRule, localParams?: LocalParams): Promise<{
|
|
10
|
+
fields: string[];
|
|
11
|
+
validateRow?: ValidateRow;
|
|
12
|
+
finalUpdateFilter: AnyObject;
|
|
13
|
+
forcedData?: AnyObject;
|
|
14
|
+
forcedFilter?: AnyObject;
|
|
15
|
+
returningFields: FieldFilter;
|
|
16
|
+
filterFields?: FieldFilter;
|
|
17
|
+
}>;
|
|
18
|
+
//# sourceMappingURL=parseUpdateRules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseUpdateRules.d.ts","sourceRoot":"","sources":["parseUpdateRules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAa,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAClF,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,SAAS,EAAc,WAAW,EAAqB,MAAM,kBAAkB,CAAC;AACzF,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,YAAY,EAClB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,SAAS,EAClB,MAAM,CAAC,EAAE,YAAY,EACrB,UAAU,CAAC,EAAE,SAAS,EACtB,WAAW,CAAC,EAAE,WAAW,GACxB,OAAO,CAAC;IACT,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,iBAAiB,EAAE,SAAS,CAAC;IAC7B,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,eAAe,EAAE,WAAW,CAAC;IAC7B,YAAY,CAAC,EAAE,WAAW,CAAC;CAC5B,CAAC,CAmID"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseUpdateRules = void 0;
|
|
4
|
+
const prostgles_types_1 = require("prostgles-types");
|
|
5
|
+
/**
|
|
6
|
+
* 1) Check if publish is valid
|
|
7
|
+
* 2) Retrieve allowed update cols for a specific request
|
|
8
|
+
*/
|
|
9
|
+
async function parseUpdateRules(filter, newData, params, tableRules, localParams) {
|
|
10
|
+
const { testRule = false } = localParams ?? {};
|
|
11
|
+
if (!testRule) {
|
|
12
|
+
if (!newData || !Object.keys(newData).length) {
|
|
13
|
+
throw "no update data provided\nEXPECTING db.table.update(filter, updateData, options)";
|
|
14
|
+
}
|
|
15
|
+
this.checkFilter(filter);
|
|
16
|
+
}
|
|
17
|
+
let forcedFilter = {}, forcedData = {}, validate, returningFields = "*", filterFields = "*", fields = "*";
|
|
18
|
+
let finalUpdateFilter = { ...filter };
|
|
19
|
+
if (tableRules) {
|
|
20
|
+
if (!tableRules.update)
|
|
21
|
+
throw "update rules missing for " + this.name;
|
|
22
|
+
({ forcedFilter, forcedData, fields, filterFields, validate } = tableRules.update);
|
|
23
|
+
returningFields = tableRules.update.returningFields ?? tableRules?.select?.fields ?? "";
|
|
24
|
+
if (!returningFields && params?.returning) {
|
|
25
|
+
throw "You are not allowed to return any fields from the update";
|
|
26
|
+
}
|
|
27
|
+
if (!fields) {
|
|
28
|
+
throw ` Invalid update rule fo r ${this.name}. fields missing `;
|
|
29
|
+
}
|
|
30
|
+
finalUpdateFilter = (await this.prepareWhere({ filter, forcedFilter, filterFields, localParams, tableRule: tableRules })).filter;
|
|
31
|
+
if (forcedFilter) {
|
|
32
|
+
const match = await this.findOne(finalUpdateFilter);
|
|
33
|
+
if (!match) {
|
|
34
|
+
fields = [];
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (tableRules.update.dynamicFields?.length) {
|
|
38
|
+
/**
|
|
39
|
+
* dynamicFields.fields used to allow a custom list of fields for specific records
|
|
40
|
+
* dynamicFields.filter cannot overlap each other
|
|
41
|
+
* updates must target records from a specific dynamicFields.filter or not match any dynamicFields.filter
|
|
42
|
+
*/
|
|
43
|
+
if (testRule) {
|
|
44
|
+
for await (const [dfIndex, dfRule] of tableRules.update.dynamicFields.entries()) {
|
|
45
|
+
const condition = await this.getCondition({ allowed_colnames: this.column_names, filter: dfRule.filter });
|
|
46
|
+
if (!condition)
|
|
47
|
+
throw "dynamicFields.filter cannot be empty: " + JSON.stringify(dfRule);
|
|
48
|
+
await this.find(dfRule.filter, { limit: 0 });
|
|
49
|
+
/** Ensure dynamicFields filters do not overlap */
|
|
50
|
+
for await (const [_dfIndex, _dfRule] of tableRules.update.dynamicFields.entries()) {
|
|
51
|
+
if (dfIndex !== _dfIndex) {
|
|
52
|
+
if (await this.findOne({ $and: [dfRule.filter, _dfRule.filter] }, { select: "" })) {
|
|
53
|
+
throw `dynamicFields.filter cannot overlap each other. \n
|
|
54
|
+
Overlapping dynamicFields rules:
|
|
55
|
+
${JSON.stringify(dfRule)}
|
|
56
|
+
AND
|
|
57
|
+
${JSON.stringify(_dfRule)}
|
|
58
|
+
`;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/** Pick dynamicFields.fields if matching filter */
|
|
65
|
+
let matchedRule;
|
|
66
|
+
for await (const dfRule of tableRules.update.dynamicFields) {
|
|
67
|
+
const match = await this.findOne({ $and: [finalUpdateFilter, dfRule.filter].filter(prostgles_types_1.isDefined) });
|
|
68
|
+
if (match) {
|
|
69
|
+
/** Ensure it doesn't overlap with other dynamicFields.filter */
|
|
70
|
+
if (matchedRule) {
|
|
71
|
+
throw "Your update is targeting multiple tableRules.update.dynamicFields. Restrict update filter to only target one rule";
|
|
72
|
+
}
|
|
73
|
+
matchedRule = dfRule;
|
|
74
|
+
fields = dfRule.fields;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/* Safely test publish rules */
|
|
79
|
+
if (testRule) {
|
|
80
|
+
await this.validateViewRules({ fields, filterFields, returningFields, forcedFilter, dynamicFields: tableRules.update.dynamicFields, rule: "update" });
|
|
81
|
+
if (forcedData) {
|
|
82
|
+
try {
|
|
83
|
+
const { data, allowedCols } = this.validateNewData({ row: forcedData, forcedData: undefined, allowedFields: "*", tableRules, fixIssues: false });
|
|
84
|
+
const updateQ = await this.colSet.getUpdateQuery(data, allowedCols, this.dbTX || this.dboBuilder.dbo, validate ? ((row) => validate({ update: row, filter: {} }, this.dbTX || this.dboBuilder.dbo)) : undefined); //pgp.helpers.update(data, columnSet)
|
|
85
|
+
let query = updateQ + " WHERE FALSE ";
|
|
86
|
+
await this.db.any("EXPLAIN " + query);
|
|
87
|
+
}
|
|
88
|
+
catch (e) {
|
|
89
|
+
throw " issue with forcedData: \nVALUE: " + JSON.stringify(forcedData, null, 2) + "\nERROR: " + e;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/* Update all allowed fields (fields) except the forcedFilter (so that the user cannot change the forced filter values) */
|
|
96
|
+
let _fields = this.parseFieldFilter(fields);
|
|
97
|
+
/**
|
|
98
|
+
* A forced filter must be basic
|
|
99
|
+
*/
|
|
100
|
+
if (forcedFilter) {
|
|
101
|
+
const _forcedFilterKeys = Object.keys(forcedFilter);
|
|
102
|
+
const nonFields = _forcedFilterKeys.filter(key => !this.column_names.includes(key));
|
|
103
|
+
if (nonFields.length)
|
|
104
|
+
throw "forcedFilter must be a basic filter ( { col_name: 'value' } ). Invalid filter keys: " + nonFields;
|
|
105
|
+
// const clashingFields = _forcedFilterKeys.filter(key => _fields.includes(key));
|
|
106
|
+
}
|
|
107
|
+
const validateRow = validate ? (row) => validate({ update: row, filter: finalUpdateFilter }, this.dbTX || this.dboBuilder.dbo) : undefined;
|
|
108
|
+
return {
|
|
109
|
+
fields: _fields,
|
|
110
|
+
validateRow,
|
|
111
|
+
finalUpdateFilter,
|
|
112
|
+
forcedData,
|
|
113
|
+
forcedFilter,
|
|
114
|
+
returningFields,
|
|
115
|
+
filterFields,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
exports.parseUpdateRules = parseUpdateRules;
|