@stuntman/server 0.1.8 → 0.1.10

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 CHANGED
@@ -1,4 +1,13 @@
1
- # Stuntman
1
+ # Stuntman server
2
+
3
+ [![npm](https://img.shields.io/npm/v/@stuntman/server.svg)][npmjs]
4
+ [![Build Status](https://img.shields.io/github/actions/workflow/status/andrzej-woof/stuntman/ci.yaml)][build]
5
+ [![Coverage Status](https://coveralls.io/repos/github/andrzej-woof/stuntman/badge.svg)][coverage]
6
+ ![License](https://img.shields.io/github/license/andrzej-woof/stuntman)
7
+
8
+ [npmjs]: https://www.npmjs.com/package/@stuntman/server
9
+ [build]: https://github.com/andrzej-woof/stuntman/actions/workflows/ci.yaml
10
+ [coverage]: https://coveralls.io/github/andrzej-woof/stuntman
2
11
 
3
12
  Stuntman is a proxy/mock server that can be deployed remotely together with your application under test, working as either pass-through proxy allowing you to inspect traffic or proxy/mock which can intercept requests/responses and modify them or stub with predefined ones.
4
13
 
@@ -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,IAmGhF,CAAC;AAEF,eAAO,MAAM,wBAAwB,qBAAsB,SAAS,IAAI,SA2BvE,CAAC"}
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"}
@@ -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
- if (typeof rule.id !== 'string') {
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' || !('remoteFn' in rule.matches) || typeof rule.matches.remoteFn !== 'string') {
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 && typeof rule.actions.mockResponse.remoteFn !== 'string') {
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
- else if ('status' in rule.actions.mockResponse) {
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 || rule.ttlSeconds < shared_1.MIN_RULE_TTL_SECONDS || rule.ttlSeconds > shared_1.MAX_RULE_TTL_SECONDS) {
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":"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"}
1
+ {"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/api/validators.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stuntman/server",
3
- "version": "0.1.8",
3
+ "version": "0.1.10",
4
4
  "description": "Stuntman - HTTP proxy / mock server with API",
5
5
  "main": "dist/index.js",
6
6
  "repository": {
@@ -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
- if (typeof rule.id !== 'string') {
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 (typeof rule.matches !== 'object' || !('remoteFn' in rule.matches) || typeof rule.matches.remoteFn !== 'string') {
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 ('remoteFn' in rule.actions.mockResponse && typeof rule.actions.mockResponse.remoteFn !== 'string') {
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
- } else if ('status' in rule.actions.mockResponse) {
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 (!rule.ttlSeconds || rule.ttlSeconds < MIN_RULE_TTL_SECONDS || rule.ttlSeconds > MAX_RULE_TTL_SECONDS) {
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}`,