@stuntman/server 0.1.9 → 0.1.11
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/README.md +1 -0
- package/dist/api/validators.d.ts.map +1 -1
- package/dist/api/validators.js +22 -7
- package/dist/api/validators.js.map +1 -1
- package/dist/ruleExecutor.d.ts.map +1 -1
- package/dist/ruleExecutor.js +11 -10
- package/dist/ruleExecutor.js.map +1 -1
- package/package.json +1 -1
- package/src/api/validators.ts +31 -7
- package/src/ruleExecutor.ts +12 -14
package/README.md
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
[][npmjs]
|
|
4
4
|
[][build]
|
|
5
5
|
[][coverage]
|
|
6
|
+

|
|
6
7
|
|
|
7
8
|
[npmjs]: https://www.npmjs.com/package/@stuntman/server
|
|
8
9
|
[build]: https://github.com/andrzej-woof/stuntman/actions/workflows/ci.yaml
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/api/validators.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAElD,eAAO,MAAM,gCAAgC,SAAU,SAAS,cAAc,KAAG,
|
|
1
|
+
{"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/api/validators.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAElD,eAAO,MAAM,gCAAgC,SAAU,SAAS,cAAc,KAAG,IA2HhF,CAAC;AAEF,eAAO,MAAM,wBAAwB,qBAAsB,SAAS,IAAI,SA2BvE,CAAC"}
|
package/dist/api/validators.js
CHANGED
|
@@ -6,13 +6,17 @@ const validateSerializedRuleProperties = (rule) => {
|
|
|
6
6
|
if (!rule) {
|
|
7
7
|
throw new shared_1.AppError({ httpCode: shared_1.HttpCode.BAD_REQUEST, message: 'invalid serialized rule' });
|
|
8
8
|
}
|
|
9
|
-
|
|
9
|
+
// TODO make a nice regex to limit rule names
|
|
10
|
+
if (typeof rule.id !== 'string' || !rule.id.trim()) {
|
|
10
11
|
throw new shared_1.AppError({ httpCode: shared_1.HttpCode.BAD_REQUEST, message: 'invalid rule.id' });
|
|
11
12
|
}
|
|
12
|
-
if (typeof rule.matches !== 'object' ||
|
|
13
|
+
if (typeof rule.matches !== 'object' ||
|
|
14
|
+
!('remoteFn' in rule.matches) ||
|
|
15
|
+
typeof rule.matches.remoteFn !== 'string' ||
|
|
16
|
+
!rule.matches.remoteFn.trim()) {
|
|
13
17
|
throw new shared_1.AppError({ httpCode: shared_1.HttpCode.BAD_REQUEST, message: 'invalid rule.matches' });
|
|
14
18
|
}
|
|
15
|
-
if (rule.priority && typeof rule.priority !== 'number') {
|
|
19
|
+
if (typeof rule.priority !== 'undefined' && (typeof rule.priority !== 'number' || rule.priority < 0)) {
|
|
16
20
|
throw new shared_1.AppError({ httpCode: shared_1.HttpCode.BAD_REQUEST, message: 'invalid rule.priority' });
|
|
17
21
|
}
|
|
18
22
|
if (typeof rule.actions !== 'object') {
|
|
@@ -28,13 +32,20 @@ const validateSerializedRuleProperties = (rule) => {
|
|
|
28
32
|
});
|
|
29
33
|
}
|
|
30
34
|
if (typeof rule.actions.mockResponse !== 'undefined') {
|
|
31
|
-
if (typeof rule.actions.mockResponse !== 'object') {
|
|
35
|
+
if (typeof rule.actions.mockResponse !== 'object' || Array.isArray(rule.actions.mockResponse)) {
|
|
32
36
|
throw new shared_1.AppError({ httpCode: shared_1.HttpCode.BAD_REQUEST, message: 'invalid rule.actions.mockResponse' });
|
|
33
37
|
}
|
|
34
|
-
if ('remoteFn' in rule.actions.mockResponse &&
|
|
38
|
+
if ('remoteFn' in rule.actions.mockResponse &&
|
|
39
|
+
('rawHeaders' in rule.actions.mockResponse ||
|
|
40
|
+
'status' in rule.actions.mockResponse ||
|
|
41
|
+
'body' in rule.actions.mockResponse)) {
|
|
35
42
|
throw new shared_1.AppError({ httpCode: shared_1.HttpCode.BAD_REQUEST, message: 'invalid rule.actions.mockResponse' });
|
|
36
43
|
}
|
|
37
|
-
|
|
44
|
+
if ('remoteFn' in rule.actions.mockResponse &&
|
|
45
|
+
(typeof rule.actions.mockResponse.remoteFn !== 'string' || !rule.actions.mockResponse.remoteFn.trim())) {
|
|
46
|
+
throw new shared_1.AppError({ httpCode: shared_1.HttpCode.BAD_REQUEST, message: 'invalid rule.actions.mockResponse' });
|
|
47
|
+
}
|
|
48
|
+
if (!('remoteFn' in rule.actions.mockResponse)) {
|
|
38
49
|
if (typeof rule.actions.mockResponse.status !== 'number') {
|
|
39
50
|
throw new shared_1.AppError({
|
|
40
51
|
httpCode: shared_1.HttpCode.BAD_REQUEST,
|
|
@@ -43,6 +54,7 @@ const validateSerializedRuleProperties = (rule) => {
|
|
|
43
54
|
}
|
|
44
55
|
if (typeof rule.actions.mockResponse.rawHeaders !== 'undefined' &&
|
|
45
56
|
(!Array.isArray(rule.actions.mockResponse.rawHeaders) ||
|
|
57
|
+
rule.actions.mockResponse.rawHeaders.length % 2 !== 0 ||
|
|
46
58
|
rule.actions.mockResponse.rawHeaders.some((header) => typeof header !== 'string'))) {
|
|
47
59
|
throw new shared_1.AppError({
|
|
48
60
|
httpCode: shared_1.HttpCode.BAD_REQUEST,
|
|
@@ -80,7 +92,10 @@ const validateSerializedRuleProperties = (rule) => {
|
|
|
80
92
|
message: 'rule.actions.mockResponse and rule.actions.modifyResponse are mutually exclusive',
|
|
81
93
|
});
|
|
82
94
|
}
|
|
83
|
-
if (!rule.ttlSeconds ||
|
|
95
|
+
if (!rule.ttlSeconds ||
|
|
96
|
+
typeof rule.ttlSeconds !== 'number' ||
|
|
97
|
+
rule.ttlSeconds < shared_1.MIN_RULE_TTL_SECONDS ||
|
|
98
|
+
rule.ttlSeconds > shared_1.MAX_RULE_TTL_SECONDS) {
|
|
84
99
|
throw new shared_1.AppError({
|
|
85
100
|
httpCode: shared_1.HttpCode.BAD_REQUEST,
|
|
86
101
|
message: `rule.ttlSeconds should be within ${shared_1.MIN_RULE_TTL_SECONDS} and ${shared_1.MAX_RULE_TTL_SECONDS}`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/api/validators.ts"],"names":[],"mappings":";;;AAAA,6CAAsH;AAG/G,MAAM,gCAAgC,GAAG,CAAC,IAA6B,EAAQ,EAAE;IACpF,IAAI,CAAC,IAAI,EAAE;QACP,MAAM,IAAI,iBAAQ,CAAC,EAAE,QAAQ,EAAE,iBAAQ,CAAC,WAAW,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC,CAAC;KAC9F;IACD,IAAI,OAAO,IAAI,CAAC,EAAE,KAAK,QAAQ,EAAE;
|
|
1
|
+
{"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/api/validators.ts"],"names":[],"mappings":";;;AAAA,6CAAsH;AAG/G,MAAM,gCAAgC,GAAG,CAAC,IAA6B,EAAQ,EAAE;IACpF,IAAI,CAAC,IAAI,EAAE;QACP,MAAM,IAAI,iBAAQ,CAAC,EAAE,QAAQ,EAAE,iBAAQ,CAAC,WAAW,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC,CAAC;KAC9F;IACD,6CAA6C;IAC7C,IAAI,OAAO,IAAI,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE;QAChD,MAAM,IAAI,iBAAQ,CAAC,EAAE,QAAQ,EAAE,iBAAQ,CAAC,WAAW,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC,CAAC;KACtF;IACD,IACI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ;QAChC,CAAC,CAAC,UAAU,IAAI,IAAI,CAAC,OAAO,CAAC;QAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,KAAK,QAAQ;QACzC,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,EAC/B;QACE,MAAM,IAAI,iBAAQ,CAAC,EAAE,QAAQ,EAAE,iBAAQ,CAAC,WAAW,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC,CAAC;KAC3F;IACD,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,WAAW,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE;QAClG,MAAM,IAAI,iBAAQ,CAAC,EAAE,QAAQ,EAAE,iBAAQ,CAAC,WAAW,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC,CAAC;KAC5F;IACD,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,EAAE;QAClC,MAAM,IAAI,iBAAQ,CAAC,EAAE,QAAQ,EAAE,iBAAQ,CAAC,WAAW,EAAE,OAAO,EAAE,sCAAsC,EAAE,CAAC,CAAC;KAC3G;IACD,IACI,IAAI,CAAC,OAAO,CAAC,SAAS,KAAK,IAAI;QAC/B,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,KAAK,QAAQ;QAC7C,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,KAAK,QAAQ;QAC9C,OAAO,IAAI,CAAC,OAAO,CAAC,cAAc,KAAK,QAAQ,EACjD;QACE,MAAM,IAAI,iBAAQ,CAAC;YACf,QAAQ,EAAE,iBAAQ,CAAC,WAAW;YAC9B,OAAO,EAAE,+FAA+F;SAC3G,CAAC,CAAC;KACN;IACD,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,KAAK,WAAW,EAAE;QAClD,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE;YAC3F,MAAM,IAAI,iBAAQ,CAAC,EAAE,QAAQ,EAAE,iBAAQ,CAAC,WAAW,EAAE,OAAO,EAAE,mCAAmC,EAAE,CAAC,CAAC;SACxG;QACD,IACI,UAAU,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY;YACvC,CAAC,YAAY,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY;gBACtC,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY;gBACrC,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAC1C;YACE,MAAM,IAAI,iBAAQ,CAAC,EAAE,QAAQ,EAAE,iBAAQ,CAAC,WAAW,EAAE,OAAO,EAAE,mCAAmC,EAAE,CAAC,CAAC;SACxG;QACD,IACI,UAAU,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY;YACvC,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,EACxG;YACE,MAAM,IAAI,iBAAQ,CAAC,EAAE,QAAQ,EAAE,iBAAQ,CAAC,WAAW,EAAE,OAAO,EAAE,mCAAmC,EAAE,CAAC,CAAC;SACxG;QACD,IAAI,CAAC,CAAC,UAAU,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE;YAC5C,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,KAAK,QAAQ,EAAE;gBACtD,MAAM,IAAI,iBAAQ,CAAC;oBACf,QAAQ,EAAE,iBAAQ,CAAC,WAAW;oBAC9B,OAAO,EAAE,0CAA0C;iBACtD,CAAC,CAAC;aACN;YACD,IACI,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,UAAU,KAAK,WAAW;gBAC3D,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC;oBACjD,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC;oBACrD,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,EACxF;gBACE,MAAM,IAAI,iBAAQ,CAAC;oBACf,QAAQ,EAAE,iBAAQ,CAAC,WAAW;oBAC9B,OAAO,EAAE,8CAA8C;iBAC1D,CAAC,CAAC;aACN;YACD,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,KAAK,WAAW,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,KAAK,QAAQ,EAAE;gBAC7G,MAAM,IAAI,iBAAQ,CAAC,EAAE,QAAQ,EAAE,iBAAQ,CAAC,WAAW,EAAE,OAAO,EAAE,wCAAwC,EAAE,CAAC,CAAC;aAC7G;SACJ;KACJ;IACD,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,KAAK,WAAW,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,QAAQ,KAAK,QAAQ,EAAE;QAC9G,MAAM,IAAI,iBAAQ,CAAC,EAAE,QAAQ,EAAE,iBAAQ,CAAC,WAAW,EAAE,OAAO,EAAE,oCAAoC,EAAE,CAAC,CAAC;KACzG;IACD,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,cAAc,KAAK,WAAW,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,QAAQ,KAAK,QAAQ,EAAE;QAChH,MAAM,IAAI,iBAAQ,CAAC,EAAE,QAAQ,EAAE,iBAAQ,CAAC,WAAW,EAAE,OAAO,EAAE,qCAAqC,EAAE,CAAC,CAAC;KAC1G;IACD,IACI,OAAO,IAAI,CAAC,eAAe,KAAK,WAAW;QAC3C,OAAO,IAAI,CAAC,eAAe,KAAK,SAAS;QACzC,CAAC,OAAO,IAAI,CAAC,eAAe,KAAK,QAAQ,IAAI,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC,EACxE;QACE,MAAM,IAAI,iBAAQ,CAAC,EAAE,QAAQ,EAAE,iBAAQ,CAAC,WAAW,EAAE,OAAO,EAAE,8BAA8B,EAAE,CAAC,CAAC;KACnG;IACD,IACI,OAAO,IAAI,CAAC,cAAc,KAAK,WAAW;QAC1C,OAAO,IAAI,CAAC,cAAc,KAAK,SAAS;QACxC,CAAC,OAAO,IAAI,CAAC,cAAc,KAAK,QAAQ,IAAI,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,EACtE;QACE,MAAM,IAAI,iBAAQ,CAAC,EAAE,QAAQ,EAAE,iBAAQ,CAAC,WAAW,EAAE,OAAO,EAAE,6BAA6B,EAAE,CAAC,CAAC;KAClG;IACD,IACI,OAAO,IAAI,CAAC,MAAM,KAAK,WAAW;QAClC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,EACzF;QACE,MAAM,IAAI,iBAAQ,CAAC,EAAE,QAAQ,EAAE,iBAAQ,CAAC,WAAW,EAAE,OAAO,EAAE,qBAAqB,EAAE,CAAC,CAAC;KAC1F;IACD,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE;QAC1D,MAAM,IAAI,iBAAQ,CAAC;YACf,QAAQ,EAAE,iBAAQ,CAAC,WAAW;YAC9B,OAAO,EAAE,kFAAkF;SAC9F,CAAC,CAAC;KACN;IACD,IACI,CAAC,IAAI,CAAC,UAAU;QAChB,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ;QACnC,IAAI,CAAC,UAAU,GAAG,6BAAoB;QACtC,IAAI,CAAC,UAAU,GAAG,6BAAoB,EACxC;QACE,MAAM,IAAI,iBAAQ,CAAC;YACf,QAAQ,EAAE,iBAAQ,CAAC,WAAW;YAC9B,OAAO,EAAE,oCAAoC,6BAAoB,QAAQ,6BAAoB,EAAE;SAClG,CAAC,CAAC;KACN;IACD,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,WAAW,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE;QAC9E,MAAM,IAAI,iBAAQ,CAAC,EAAE,QAAQ,EAAE,iBAAQ,CAAC,WAAW,EAAE,OAAO,EAAE,wBAAwB,EAAE,CAAC,CAAC;KAC7F;IACD,IAAI,OAAO,IAAI,CAAC,YAAY,KAAK,WAAW,IAAI,OAAO,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE;QACpF,MAAM,IAAI,iBAAQ,CAAC,EAAE,QAAQ,EAAE,iBAAQ,CAAC,WAAW,EAAE,OAAO,EAAE,2BAA2B,EAAE,CAAC,CAAC;KAChG;AACL,CAAC,CAAC;AA3HW,QAAA,gCAAgC,oCA2H3C;AAEK,MAAM,wBAAwB,GAAG,CAAC,gBAA+B,EAAE,EAAE;IACxE,kCAAkC;IAClC,IAAI,qBAA+C,CAAC;IACpD,IAAI;QACA,qBAAqB,GAAG,gBAAgB,CAAC,OAAO,CAAC;YAC7C,EAAE,EAAE,YAAY;YAChB,MAAM,EAAE,KAAK;YACb,UAAU,EAAE,IAAI,mBAAU,EAAE;YAC5B,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,GAAG,EAAE,uBAAuB;SAC/B,CAAC,CAAC;KACN;IAAC,OAAO,KAAU,EAAE;QACjB,eAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;QACrD,MAAM,IAAI,iBAAQ,CAAC;YACf,QAAQ,EAAE,iBAAQ,CAAC,oBAAoB;YACvC,OAAO,EAAE,+BAA+B;SAC3C,CAAC,CAAC;KACN;IACD,IACI,qBAAqB,KAAK,IAAI;QAC9B,qBAAqB,KAAK,KAAK;QAC/B,qBAAqB,CAAC,MAAM,KAAK,IAAI;QACrC,qBAAqB,CAAC,MAAM,KAAK,KAAK,EACxC;QACE,eAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,EAAE,qBAAqB,EAAE,EAAE,uCAAuC,CAAC,CAAC;QAC9G,MAAM,IAAI,iBAAQ,CAAC,EAAE,QAAQ,EAAE,iBAAQ,CAAC,oBAAoB,EAAE,OAAO,EAAE,uCAAuC,EAAE,CAAC,CAAC;KACrH;AACL,CAAC,CAAC;AA3BW,QAAA,wBAAwB,4BA2BnC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ruleExecutor.d.ts","sourceRoot":"","sources":["../src/ruleExecutor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAclD,cAAM,YAAa,YAAW,QAAQ,CAAC,qBAAqB;IAExD,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,SAAS,CAAmB;IAEpC,OAAO,KAAK,YAAY,GAQvB;gBAEW,KAAK,CAAC,EAAE,QAAQ,CAAC,IAAI,EAAE;IAInC,OAAO,CAAC,UAAU;YAKJ,cAAc;IAmBtB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAmBnF,OAAO,CAAC,WAAW;IAUb,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IACrC,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAWpD,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAC5B,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"ruleExecutor.d.ts","sourceRoot":"","sources":["../src/ruleExecutor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAclD,cAAM,YAAa,YAAW,QAAQ,CAAC,qBAAqB;IAExD,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,SAAS,CAAmB;IAEpC,OAAO,KAAK,YAAY,GAQvB;gBAEW,KAAK,CAAC,EAAE,QAAQ,CAAC,IAAI,EAAE;IAInC,OAAO,CAAC,UAAU;YAKJ,cAAc;IAmBtB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAmBnF,OAAO,CAAC,WAAW;IAUb,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IACrC,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAWpD,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAC5B,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI;IAYrC,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAC7B,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI;IAWhC,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC;IAkE9E,QAAQ,IAAI,OAAO,CAAC,SAAS,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAKjD,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,QAAQ,GAAG,SAAS,CAAC;CAIpE;AAED,eAAO,MAAM,eAAe,aAAc,MAAM,KAAG,YAOlD,CAAC"}
|
package/dist/ruleExecutor.js
CHANGED
|
@@ -20,11 +20,11 @@ const transformMockRuleToLive = (rule) => {
|
|
|
20
20
|
class RuleExecutor {
|
|
21
21
|
get enabledRules() {
|
|
22
22
|
if (!this._rules) {
|
|
23
|
-
|
|
23
|
+
this._rules = new Array();
|
|
24
24
|
}
|
|
25
25
|
const now = Date.now();
|
|
26
26
|
return this._rules
|
|
27
|
-
.filter((r) =>
|
|
27
|
+
.filter((r) => r.isEnabled && (!Number.isFinite(r.ttlSeconds) || r.createdTimestamp + r.ttlSeconds * 1000 > now))
|
|
28
28
|
.sort((a, b) => { var _a, _b; return ((_a = a.priority) !== null && _a !== void 0 ? _a : shared_1.DEFAULT_RULE_PRIORITY) - ((_b = b.priority) !== null && _b !== void 0 ? _b : shared_1.DEFAULT_RULE_PRIORITY); });
|
|
29
29
|
}
|
|
30
30
|
constructor(rules) {
|
|
@@ -93,8 +93,9 @@ class RuleExecutor {
|
|
|
93
93
|
}
|
|
94
94
|
}
|
|
95
95
|
enableRule(ruleOrId) {
|
|
96
|
+
const ruleId = typeof ruleOrId === 'string' ? ruleOrId : ruleOrId.id;
|
|
96
97
|
this._rules.forEach((r) => {
|
|
97
|
-
if (r.id ===
|
|
98
|
+
if (r.id === ruleId) {
|
|
98
99
|
r.counter = 0;
|
|
99
100
|
r.isEnabled = true;
|
|
100
101
|
shared_1.logger.debug({ ruleId: r.id }, 'rule enabled');
|
|
@@ -102,8 +103,9 @@ class RuleExecutor {
|
|
|
102
103
|
});
|
|
103
104
|
}
|
|
104
105
|
disableRule(ruleOrId) {
|
|
106
|
+
const ruleId = typeof ruleOrId === 'string' ? ruleOrId : ruleOrId.id;
|
|
105
107
|
this._rules.forEach((r) => {
|
|
106
|
-
if (r.id ===
|
|
108
|
+
if (r.id === ruleId) {
|
|
107
109
|
r.isEnabled = false;
|
|
108
110
|
shared_1.logger.debug({ ruleId: r.id }, 'rule disabled');
|
|
109
111
|
}
|
|
@@ -123,7 +125,7 @@ class RuleExecutor {
|
|
|
123
125
|
return matchResult.result;
|
|
124
126
|
}
|
|
125
127
|
catch (error) {
|
|
126
|
-
shared_1.logger.error({ ...logContext, ruleId: rule
|
|
128
|
+
shared_1.logger.error({ ...logContext, ruleId: rule.id, error }, 'error in rule match function');
|
|
127
129
|
}
|
|
128
130
|
return undefined;
|
|
129
131
|
});
|
|
@@ -141,15 +143,14 @@ class RuleExecutor {
|
|
|
141
143
|
matchingRule.counter = 0;
|
|
142
144
|
shared_1.logger.warn(logContext, "it's over 9000!!!");
|
|
143
145
|
}
|
|
144
|
-
// TODO check if that works
|
|
145
146
|
if (matchingRule.disableAfterUse) {
|
|
146
|
-
if (
|
|
147
|
+
if (matchingRule.disableAfterUse === true || matchingRule.disableAfterUse <= matchingRule.counter) {
|
|
147
148
|
shared_1.logger.debug(logContext, 'disabling rule for future requests');
|
|
148
|
-
|
|
149
|
+
matchingRule.isEnabled = false;
|
|
149
150
|
}
|
|
150
151
|
}
|
|
151
152
|
if (matchingRule.removeAfterUse) {
|
|
152
|
-
if (
|
|
153
|
+
if (matchingRule.removeAfterUse === true || matchingRule.removeAfterUse <= matchingRule.counter) {
|
|
153
154
|
shared_1.logger.debug(logContext, 'removing rule for future requests');
|
|
154
155
|
await this.removeRule(matchingRule);
|
|
155
156
|
}
|
|
@@ -162,7 +163,7 @@ class RuleExecutor {
|
|
|
162
163
|
}
|
|
163
164
|
}
|
|
164
165
|
if (matchResult.enableRuleIds && matchResult.enableRuleIds.length > 0) {
|
|
165
|
-
shared_1.logger.debug({ ...logContext, disableRuleIds: matchResult.
|
|
166
|
+
shared_1.logger.debug({ ...logContext, disableRuleIds: matchResult.enableRuleIds }, 'enabling rules based on matchResult');
|
|
166
167
|
for (const ruleId of matchResult.enableRuleIds) {
|
|
167
168
|
this.enableRule(ruleId);
|
|
168
169
|
}
|
package/dist/ruleExecutor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ruleExecutor.js","sourceRoot":"","sources":["../src/ruleExecutor.ts"],"names":[],"mappings":";;;;;;AAAA,4DAAmC;AACnC,6CAAqF;AAErF,mCAAsD;AAEtD,MAAM,aAAa,GAAiC,EAAE,CAAC;AAEvD,MAAM,uBAAuB,GAAG,CAAC,IAAmB,EAAqB,EAAE;;IACvE,OAAO;QACH,GAAG,IAAI;QACP,OAAO,EAAE,CAAC;QACV,SAAS,EAAE,MAAA,IAAI,CAAC,SAAS,mCAAI,IAAI;QACjC,gBAAgB,EAAE,IAAI,CAAC,GAAG,EAAE;KAC/B,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,YAAY;IAKd,IAAY,YAAY;QACpB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YACd,
|
|
1
|
+
{"version":3,"file":"ruleExecutor.js","sourceRoot":"","sources":["../src/ruleExecutor.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/api/validators.ts
CHANGED
|
@@ -5,13 +5,19 @@ export const validateSerializedRuleProperties = (rule: Stuntman.SerializedRule):
|
|
|
5
5
|
if (!rule) {
|
|
6
6
|
throw new AppError({ httpCode: HttpCode.BAD_REQUEST, message: 'invalid serialized rule' });
|
|
7
7
|
}
|
|
8
|
-
|
|
8
|
+
// TODO make a nice regex to limit rule names
|
|
9
|
+
if (typeof rule.id !== 'string' || !rule.id.trim()) {
|
|
9
10
|
throw new AppError({ httpCode: HttpCode.BAD_REQUEST, message: 'invalid rule.id' });
|
|
10
11
|
}
|
|
11
|
-
if (
|
|
12
|
+
if (
|
|
13
|
+
typeof rule.matches !== 'object' ||
|
|
14
|
+
!('remoteFn' in rule.matches) ||
|
|
15
|
+
typeof rule.matches.remoteFn !== 'string' ||
|
|
16
|
+
!rule.matches.remoteFn.trim()
|
|
17
|
+
) {
|
|
12
18
|
throw new AppError({ httpCode: HttpCode.BAD_REQUEST, message: 'invalid rule.matches' });
|
|
13
19
|
}
|
|
14
|
-
if (rule.priority && typeof rule.priority !== 'number') {
|
|
20
|
+
if (typeof rule.priority !== 'undefined' && (typeof rule.priority !== 'number' || rule.priority < 0)) {
|
|
15
21
|
throw new AppError({ httpCode: HttpCode.BAD_REQUEST, message: 'invalid rule.priority' });
|
|
16
22
|
}
|
|
17
23
|
if (typeof rule.actions !== 'object') {
|
|
@@ -29,12 +35,24 @@ export const validateSerializedRuleProperties = (rule: Stuntman.SerializedRule):
|
|
|
29
35
|
});
|
|
30
36
|
}
|
|
31
37
|
if (typeof rule.actions.mockResponse !== 'undefined') {
|
|
32
|
-
if (typeof rule.actions.mockResponse !== 'object') {
|
|
38
|
+
if (typeof rule.actions.mockResponse !== 'object' || Array.isArray(rule.actions.mockResponse)) {
|
|
39
|
+
throw new AppError({ httpCode: HttpCode.BAD_REQUEST, message: 'invalid rule.actions.mockResponse' });
|
|
40
|
+
}
|
|
41
|
+
if (
|
|
42
|
+
'remoteFn' in rule.actions.mockResponse &&
|
|
43
|
+
('rawHeaders' in rule.actions.mockResponse ||
|
|
44
|
+
'status' in rule.actions.mockResponse ||
|
|
45
|
+
'body' in rule.actions.mockResponse)
|
|
46
|
+
) {
|
|
33
47
|
throw new AppError({ httpCode: HttpCode.BAD_REQUEST, message: 'invalid rule.actions.mockResponse' });
|
|
34
48
|
}
|
|
35
|
-
if (
|
|
49
|
+
if (
|
|
50
|
+
'remoteFn' in rule.actions.mockResponse &&
|
|
51
|
+
(typeof rule.actions.mockResponse.remoteFn !== 'string' || !rule.actions.mockResponse.remoteFn.trim())
|
|
52
|
+
) {
|
|
36
53
|
throw new AppError({ httpCode: HttpCode.BAD_REQUEST, message: 'invalid rule.actions.mockResponse' });
|
|
37
|
-
}
|
|
54
|
+
}
|
|
55
|
+
if (!('remoteFn' in rule.actions.mockResponse)) {
|
|
38
56
|
if (typeof rule.actions.mockResponse.status !== 'number') {
|
|
39
57
|
throw new AppError({
|
|
40
58
|
httpCode: HttpCode.BAD_REQUEST,
|
|
@@ -44,6 +62,7 @@ export const validateSerializedRuleProperties = (rule: Stuntman.SerializedRule):
|
|
|
44
62
|
if (
|
|
45
63
|
typeof rule.actions.mockResponse.rawHeaders !== 'undefined' &&
|
|
46
64
|
(!Array.isArray(rule.actions.mockResponse.rawHeaders) ||
|
|
65
|
+
rule.actions.mockResponse.rawHeaders.length % 2 !== 0 ||
|
|
47
66
|
rule.actions.mockResponse.rawHeaders.some((header) => typeof header !== 'string'))
|
|
48
67
|
) {
|
|
49
68
|
throw new AppError({
|
|
@@ -88,7 +107,12 @@ export const validateSerializedRuleProperties = (rule: Stuntman.SerializedRule):
|
|
|
88
107
|
message: 'rule.actions.mockResponse and rule.actions.modifyResponse are mutually exclusive',
|
|
89
108
|
});
|
|
90
109
|
}
|
|
91
|
-
if (
|
|
110
|
+
if (
|
|
111
|
+
!rule.ttlSeconds ||
|
|
112
|
+
typeof rule.ttlSeconds !== 'number' ||
|
|
113
|
+
rule.ttlSeconds < MIN_RULE_TTL_SECONDS ||
|
|
114
|
+
rule.ttlSeconds > MAX_RULE_TTL_SECONDS
|
|
115
|
+
) {
|
|
92
116
|
throw new AppError({
|
|
93
117
|
httpCode: HttpCode.BAD_REQUEST,
|
|
94
118
|
message: `rule.ttlSeconds should be within ${MIN_RULE_TTL_SECONDS} and ${MAX_RULE_TTL_SECONDS}`,
|
package/src/ruleExecutor.ts
CHANGED
|
@@ -19,13 +19,13 @@ class RuleExecutor implements Stuntman.RuleExecutorInterface {
|
|
|
19
19
|
private _rules: Stuntman.LiveRule[];
|
|
20
20
|
private rulesLock = new AwaitLock();
|
|
21
21
|
|
|
22
|
-
private get enabledRules() {
|
|
22
|
+
private get enabledRules(): readonly Stuntman.LiveRule[] {
|
|
23
23
|
if (!this._rules) {
|
|
24
|
-
|
|
24
|
+
this._rules = new Array<Stuntman.LiveRule>();
|
|
25
25
|
}
|
|
26
26
|
const now = Date.now();
|
|
27
27
|
return this._rules
|
|
28
|
-
.filter((r) =>
|
|
28
|
+
.filter((r) => r.isEnabled && (!Number.isFinite(r.ttlSeconds) || r.createdTimestamp + r.ttlSeconds * 1000 > now))
|
|
29
29
|
.sort((a, b) => (a.priority ?? DEFAULT_RULE_PRIORITY) - (b.priority ?? DEFAULT_RULE_PRIORITY));
|
|
30
30
|
}
|
|
31
31
|
|
|
@@ -101,8 +101,9 @@ class RuleExecutor implements Stuntman.RuleExecutorInterface {
|
|
|
101
101
|
enableRule(id: string): void;
|
|
102
102
|
enableRule(rule: Stuntman.Rule): void;
|
|
103
103
|
enableRule(ruleOrId: string | Stuntman.Rule): void {
|
|
104
|
+
const ruleId = typeof ruleOrId === 'string' ? ruleOrId : ruleOrId.id;
|
|
104
105
|
this._rules.forEach((r) => {
|
|
105
|
-
if (r.id ===
|
|
106
|
+
if (r.id === ruleId) {
|
|
106
107
|
r.counter = 0;
|
|
107
108
|
r.isEnabled = true;
|
|
108
109
|
logger.debug({ ruleId: r.id }, 'rule enabled');
|
|
@@ -113,8 +114,9 @@ class RuleExecutor implements Stuntman.RuleExecutorInterface {
|
|
|
113
114
|
disableRule(id: string): void;
|
|
114
115
|
disableRule(rule: Stuntman.Rule): void;
|
|
115
116
|
disableRule(ruleOrId: string | Stuntman.Rule): void {
|
|
117
|
+
const ruleId = typeof ruleOrId === 'string' ? ruleOrId : ruleOrId.id;
|
|
116
118
|
this._rules.forEach((r) => {
|
|
117
|
-
if (r.id ===
|
|
119
|
+
if (r.id === ruleId) {
|
|
118
120
|
r.isEnabled = false;
|
|
119
121
|
logger.debug({ ruleId: r.id }, 'rule disabled');
|
|
120
122
|
}
|
|
@@ -134,7 +136,7 @@ class RuleExecutor implements Stuntman.RuleExecutorInterface {
|
|
|
134
136
|
}
|
|
135
137
|
return matchResult.result;
|
|
136
138
|
} catch (error) {
|
|
137
|
-
logger.error({ ...logContext, ruleId: rule
|
|
139
|
+
logger.error({ ...logContext, ruleId: rule.id, error }, 'error in rule match function');
|
|
138
140
|
}
|
|
139
141
|
return undefined;
|
|
140
142
|
});
|
|
@@ -155,15 +157,14 @@ class RuleExecutor implements Stuntman.RuleExecutorInterface {
|
|
|
155
157
|
matchingRule.counter = 0;
|
|
156
158
|
logger.warn(logContext, "it's over 9000!!!");
|
|
157
159
|
}
|
|
158
|
-
// TODO check if that works
|
|
159
160
|
if (matchingRule.disableAfterUse) {
|
|
160
|
-
if (
|
|
161
|
+
if (matchingRule.disableAfterUse === true || matchingRule.disableAfterUse <= matchingRule.counter) {
|
|
161
162
|
logger.debug(logContext, 'disabling rule for future requests');
|
|
162
|
-
|
|
163
|
+
matchingRule.isEnabled = false;
|
|
163
164
|
}
|
|
164
165
|
}
|
|
165
166
|
if (matchingRule.removeAfterUse) {
|
|
166
|
-
if (
|
|
167
|
+
if (matchingRule.removeAfterUse === true || matchingRule.removeAfterUse <= matchingRule.counter) {
|
|
167
168
|
logger.debug(logContext, 'removing rule for future requests');
|
|
168
169
|
await this.removeRule(matchingRule);
|
|
169
170
|
}
|
|
@@ -179,10 +180,7 @@ class RuleExecutor implements Stuntman.RuleExecutorInterface {
|
|
|
179
180
|
}
|
|
180
181
|
}
|
|
181
182
|
if (matchResult.enableRuleIds && matchResult.enableRuleIds.length > 0) {
|
|
182
|
-
logger.debug(
|
|
183
|
-
{ ...logContext, disableRuleIds: matchResult.disableRuleIds },
|
|
184
|
-
'enabling rules based on matchResult'
|
|
185
|
-
);
|
|
183
|
+
logger.debug({ ...logContext, disableRuleIds: matchResult.enableRuleIds }, 'enabling rules based on matchResult');
|
|
186
184
|
for (const ruleId of matchResult.enableRuleIds) {
|
|
187
185
|
this.enableRule(ruleId);
|
|
188
186
|
}
|