@cargolift-cdi/lib-payload 0.1.7 → 0.1.9
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/cjs/index.js +4 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/payload-condition/payload-condition.interface.js +3 -0
- package/dist/cjs/payload-condition/payload-condition.interface.js.map +1 -0
- package/dist/cjs/payload-condition/payload-condition.js +50 -0
- package/dist/cjs/payload-condition/payload-condition.js.map +1 -0
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/cjs/util/payload-comparator.util.js +65 -0
- package/dist/cjs/util/payload-comparator.util.js.map +1 -0
- package/dist/cjs/util/payload-path.util.js +25 -0
- package/dist/cjs/util/payload-path.util.js.map +1 -0
- package/dist/cjs/util/util.js.map +1 -1
- package/dist/esm/index.js +4 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/payload-condition/payload-condition.interface.js +2 -0
- package/dist/esm/payload-condition/payload-condition.interface.js.map +1 -0
- package/dist/esm/payload-condition/payload-condition.js +46 -0
- package/dist/esm/payload-condition/payload-condition.js.map +1 -0
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/esm/util/payload-comparator.util.js +61 -0
- package/dist/esm/util/payload-comparator.util.js.map +1 -0
- package/dist/esm/util/payload-path.util.js +21 -0
- package/dist/esm/util/payload-path.util.js.map +1 -0
- package/dist/esm/util/util.js.map +1 -1
- package/dist/types/index.d.ts +4 -0
- package/dist/types/payload-condition/payload-condition.d.ts +8 -0
- package/dist/types/payload-condition/payload-condition.interface.d.ts +17 -0
- package/dist/types/util/payload-comparator.util.d.ts +6 -0
- package/dist/types/util/payload-path.util.d.ts +4 -0
- package/package.json +2 -2
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PayloadComparator = void 0;
|
|
4
|
+
class PayloadComparator {
|
|
5
|
+
static compare(left, operator, right) {
|
|
6
|
+
switch (operator) {
|
|
7
|
+
case "=":
|
|
8
|
+
return left === right || left == right;
|
|
9
|
+
case "!=":
|
|
10
|
+
return left !== right && left != right;
|
|
11
|
+
case ">":
|
|
12
|
+
return left > right;
|
|
13
|
+
case ">=":
|
|
14
|
+
return left >= right;
|
|
15
|
+
case "<":
|
|
16
|
+
return left < right;
|
|
17
|
+
case "<=":
|
|
18
|
+
return left <= right;
|
|
19
|
+
case "in":
|
|
20
|
+
return Array.isArray(right) && right.includes(left);
|
|
21
|
+
case "not_in":
|
|
22
|
+
return Array.isArray(right) && !right.includes(left);
|
|
23
|
+
case "contains":
|
|
24
|
+
return this.contains(left, right);
|
|
25
|
+
case "not_contains":
|
|
26
|
+
return !this.contains(left, right);
|
|
27
|
+
case "starts_with":
|
|
28
|
+
return typeof left === "string" && typeof right === "string" && left.startsWith(right);
|
|
29
|
+
case "ends_with":
|
|
30
|
+
return typeof left === "string" && typeof right === "string" && left.endsWith(right);
|
|
31
|
+
case "regex":
|
|
32
|
+
return typeof left === "string" && new RegExp(String(right)).test(left);
|
|
33
|
+
case "exists":
|
|
34
|
+
return right ? left !== undefined && left !== null : left === undefined || left === null;
|
|
35
|
+
case "not_exists":
|
|
36
|
+
return right ? left === undefined || left === null : left !== undefined && left !== null;
|
|
37
|
+
case "empty":
|
|
38
|
+
return !!right === this.isEmpty(left);
|
|
39
|
+
case "not_empty":
|
|
40
|
+
return !!right === !this.isEmpty(left);
|
|
41
|
+
default:
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
static contains(container, value) {
|
|
46
|
+
if (Array.isArray(container))
|
|
47
|
+
return container.includes(value);
|
|
48
|
+
if (typeof container === "string")
|
|
49
|
+
return container.includes(String(value));
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
static isEmpty(value) {
|
|
53
|
+
if (value === undefined || value === null)
|
|
54
|
+
return true;
|
|
55
|
+
if (typeof value === "string")
|
|
56
|
+
return value.length === 0;
|
|
57
|
+
if (Array.isArray(value))
|
|
58
|
+
return value.length === 0;
|
|
59
|
+
if (typeof value === "object")
|
|
60
|
+
return Object.keys(value).length === 0;
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
exports.PayloadComparator = PayloadComparator;
|
|
65
|
+
//# sourceMappingURL=payload-comparator.util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payload-comparator.util.js","sourceRoot":"","sources":["../../../src/util/payload-comparator.util.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PayloadPath = void 0;
|
|
4
|
+
class PayloadPath {
|
|
5
|
+
static get(payload, path) {
|
|
6
|
+
if (!path || path === "/")
|
|
7
|
+
return payload;
|
|
8
|
+
const segments = path.split("/").filter(Boolean);
|
|
9
|
+
let current = payload;
|
|
10
|
+
for (const segment of segments) {
|
|
11
|
+
if (current === undefined || current === null)
|
|
12
|
+
return undefined;
|
|
13
|
+
const key = this.toKey(segment);
|
|
14
|
+
current = current[key];
|
|
15
|
+
}
|
|
16
|
+
return current;
|
|
17
|
+
}
|
|
18
|
+
static toKey(segment) {
|
|
19
|
+
if (/^\d+$/.test(segment))
|
|
20
|
+
return Number(segment);
|
|
21
|
+
return segment;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
exports.PayloadPath = PayloadPath;
|
|
25
|
+
//# sourceMappingURL=payload-path.util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payload-path.util.js","sourceRoot":"","sources":["../../../src/util/payload-path.util.ts"],"names":[],"mappings":";;;AAAA,MAAa,WAAW;IAKf,MAAM,CAAC,GAAG,CAAC,OAAgB,EAAE,IAAY;QAC9C,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,GAAG;YAAE,OAAO,OAAkB,CAAC;QAErD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACjD,IAAI,OAAO,GAAQ,OAAc,CAAC;QAElC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,IAAI;gBAAE,OAAO,SAAS,CAAC;YAEhE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAChC,OAAO,GAAG,OAAO,CAAC,GAA2B,CAAC,CAAC;QACjD,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,MAAM,CAAC,KAAK,CAAC,OAAe;QAClC,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC;QAClD,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AAzBD,kCAyBC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../../src/util/util.ts"],"names":[],"mappings":";;;AAAA,MAAa,WAAW;IACf,MAAM,CAAC,SAAS,CAAC,OAAgB;QACtC,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC9C,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,OAAO,OAA0C,CAAC;QACpD,CAAC;QACD,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,IAAI,CAAC;gBACH,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC7B,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../../src/util/util.ts"],"names":[],"mappings":";;;AAAA,MAAa,WAAW;IACf,MAAM,CAAC,SAAS,CAAC,OAAgB;QACtC,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC9C,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,OAAO,OAA0C,CAAC;QACpD,CAAC;QACD,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,IAAI,CAAC;gBACH,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC7B,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;CACF;AAjBD,kCAiBC"}
|
package/dist/esm/index.js
CHANGED
|
@@ -3,4 +3,8 @@ export * from "./payload-validation/payload-validation.interface.js";
|
|
|
3
3
|
export * from "./payload-response-interpreter/payload-response-interpreter.js";
|
|
4
4
|
export * from "./payload-transformation/payload-transformation.js";
|
|
5
5
|
export * from "./util/util.js";
|
|
6
|
+
export * from "./payload-condition/payload-condition.js";
|
|
7
|
+
export * from "./payload-condition/payload-condition.interface.js";
|
|
8
|
+
export * from "./util/payload-path.util.js";
|
|
9
|
+
export * from "./util/payload-comparator.util.js";
|
|
6
10
|
//# sourceMappingURL=index.js.map
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,4CAA4C,CAAC;AAC3D,cAAc,sDAAsD,CAAC;AACrE,cAAc,gEAAgE,CAAC;AAC/E,cAAc,oDAAoD,CAAC;AAEnE,cAAc,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,4CAA4C,CAAC;AAC3D,cAAc,sDAAsD,CAAC;AACrE,cAAc,gEAAgE,CAAC;AAC/E,cAAc,oDAAoD,CAAC;AAEnE,cAAc,gBAAgB,CAAC;AAC/B,cAAc,0CAA0C,CAAC;AACzD,cAAc,oDAAoD,CAAC;AACnE,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mCAAmC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payload-condition.interface.js","sourceRoot":"","sources":["../../../src/payload-condition/payload-condition.interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { PayloadUtil } from "../util/util.js";
|
|
2
|
+
import { PayloadPath } from "../util/payload-path.util.js";
|
|
3
|
+
import { PayloadComparator } from "../util/payload-comparator.util.js";
|
|
4
|
+
export class PayloadCondition {
|
|
5
|
+
static async check(conditions, payload) {
|
|
6
|
+
if (conditions?.conditions === undefined || conditions.conditions === null) {
|
|
7
|
+
return { success: true };
|
|
8
|
+
}
|
|
9
|
+
try {
|
|
10
|
+
const normalizedPayload = PayloadUtil.normalize(payload);
|
|
11
|
+
if (normalizedPayload === undefined) {
|
|
12
|
+
return { success: false, error: "Payload invalido para avaliacao de condicoes" };
|
|
13
|
+
}
|
|
14
|
+
const success = ConditionEvaluator.evaluate(conditions.conditions, normalizedPayload);
|
|
15
|
+
return { success };
|
|
16
|
+
}
|
|
17
|
+
catch (err) {
|
|
18
|
+
return { success: false, error: "Erro ao verificar condicoes: " + err.message };
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
class ConditionEvaluator {
|
|
23
|
+
static evaluate(condition, payload) {
|
|
24
|
+
if (Array.isArray(condition)) {
|
|
25
|
+
return condition.every((c) => this.evaluate(c, payload));
|
|
26
|
+
}
|
|
27
|
+
if (this.isAll(condition)) {
|
|
28
|
+
return condition.all.every((c) => this.evaluate(c, payload));
|
|
29
|
+
}
|
|
30
|
+
if (this.isAny(condition)) {
|
|
31
|
+
return condition.any.some((c) => this.evaluate(c, payload));
|
|
32
|
+
}
|
|
33
|
+
return this.evaluateBase(condition, payload);
|
|
34
|
+
}
|
|
35
|
+
static evaluateBase(condition, payload) {
|
|
36
|
+
const leftValue = PayloadPath.get(payload, condition.left);
|
|
37
|
+
return PayloadComparator.compare(leftValue, condition.operator, condition.right);
|
|
38
|
+
}
|
|
39
|
+
static isAll(condition) {
|
|
40
|
+
return condition.all !== undefined;
|
|
41
|
+
}
|
|
42
|
+
static isAny(condition) {
|
|
43
|
+
return condition.any !== undefined;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=payload-condition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payload-condition.js","sourceRoot":"","sources":["../../../src/payload-condition/payload-condition.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAOvE,MAAM,OAAO,gBAAgB;IAC3B,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,UAA6B,EAAE,OAAY;QAC5D,IAAI,UAAU,EAAE,UAAU,KAAK,SAAS,IAAI,UAAU,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;YAC3E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAED,IAAI,CAAC;YACH,MAAM,iBAAiB,GAAG,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YACzD,IAAI,iBAAiB,KAAK,SAAS,EAAE,CAAC;gBACpC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,8CAA8C,EAAE,CAAC;YACnF,CAAC;YAED,MAAM,OAAO,GAAG,kBAAkB,CAAC,QAAQ,CAAC,UAAU,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;YACtF,OAAO,EAAE,OAAO,EAAE,CAAC;QACrB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,+BAA+B,GAAI,GAAa,CAAC,OAAO,EAAE,CAAC;QAC7F,CAAC;IACH,CAAC;CACF;AAED,MAAM,kBAAkB;IACtB,MAAM,CAAC,QAAQ,CAAC,SAAkC,EAAE,OAAgB;QAClE,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QAC3D,CAAC;QAED,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1B,OAAO,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QAC/D,CAAC;QAED,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1B,OAAO,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QAC9D,CAAC;QAED,OAAO,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;IAEO,MAAM,CAAC,YAAY,CAAC,SAAwB,EAAE,OAAgB;QACpE,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QAC3D,OAAO,iBAAiB,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;IACnF,CAAC;IAEO,MAAM,CAAC,KAAK,CAAC,SAAoB;QACvC,OAAQ,SAA0B,CAAC,GAAG,KAAK,SAAS,CAAC;IACvD,CAAC;IAEO,MAAM,CAAC,KAAK,CAAC,SAAoB;QACvC,OAAQ,SAA0B,CAAC,GAAG,KAAK,SAAS,CAAC;IACvD,CAAC;CACF"}
|