mockaton 8.1.6 → 8.2.0

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.
Binary file
Binary file
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "mockaton",
3
3
  "description": "A deterministic server-side for developing and testing frontend clients",
4
4
  "type": "module",
5
- "version": "8.1.6",
5
+ "version": "8.2.0",
6
6
  "main": "index.js",
7
7
  "types": "index.d.ts",
8
8
  "license": "MIT",
package/src/Api.js CHANGED
@@ -10,7 +10,7 @@ import { DF, API } from './ApiConstants.js'
10
10
  import { parseJSON } from './utils/http-request.js'
11
11
  import { listFilesRecursively } from './utils/fs.js'
12
12
  import * as mockBrokersCollection from './mockBrokersCollection.js'
13
- import { sendOK, sendBadRequest, sendJSON, sendFile } from './utils/http-response.js'
13
+ import { sendOK, sendBadRequest, sendJSON, sendFile, sendUnprocessableContent } from './utils/http-response.js'
14
14
 
15
15
 
16
16
  export const apiGetRequests = new Map([
@@ -24,6 +24,7 @@ export const apiGetRequests = new Map([
24
24
  [API.mocks, listMockBrokers],
25
25
  [API.cookies, listCookies],
26
26
  [API.comments, listComments],
27
+ [API.fallback, getProxyFallback],
27
28
  [API.cors, getIsCorsAllowed],
28
29
  [API.static, listStaticFiles]
29
30
  ])
@@ -44,6 +45,7 @@ function serveDashboardAsset(req, response) { sendFile(response, join(import.met
44
45
  function listCookies(_, response) { sendJSON(response, cookie.list()) }
45
46
  function listComments(_, response) { sendJSON(response, mockBrokersCollection.extractAllComments()) }
46
47
  function listMockBrokers(_, response) { sendJSON(response, mockBrokersCollection.getAll()) }
48
+ function getProxyFallback(_, response) { sendJSON(response, Config.proxyFallback) }
47
49
  function getIsCorsAllowed(_, response) { sendJSON(response, Config.corsAllowed) }
48
50
 
49
51
 
@@ -101,8 +103,13 @@ async function setRouteIsDelayed(req, response) {
101
103
 
102
104
  async function updateProxyFallback(req, response) {
103
105
  try {
104
- Config.proxyFallback = await parseJSON(req)
105
- sendOK(response)
106
+ const fallback = await parseJSON(req)
107
+ if (fallback && !URL.canParse(fallback)) // TESTME
108
+ sendUnprocessableContent(response)
109
+ else {
110
+ Config.proxyFallback = fallback
111
+ sendOK(response)
112
+ }
106
113
  }
107
114
  catch (error) {
108
115
  sendBadRequest(response, error)
package/src/Commander.js CHANGED
@@ -37,6 +37,9 @@ export class Commander {
37
37
  return this.#get(API.comments)
38
38
  }
39
39
 
40
+ getProxyFallback() {
41
+ return this.#get(API.fallback)
42
+ }
40
43
  setProxyFallback(proxyAddr) {
41
44
  return this.#patch(API.fallback, proxyAddr)
42
45
  }
package/src/Dashboard.css CHANGED
@@ -6,12 +6,12 @@
6
6
  :root {
7
7
  --color4xxBackground: #ffedd1;
8
8
  --colorAccent: #0072d6;
9
- --colorAccentAlt: #01873b;
9
+ --colorAccentAlt: #0e906c;
10
10
  --colorBackground: #fff;
11
- --colorHeaderBackground: #f4f4f4;
11
+ --colorHeaderBackground: #f7f7f7;
12
12
  --colorComboBoxBackground: #fafafa;
13
13
  --colorComboBoxHeaderBackground: #fff;
14
- --colorDisabled: #555;
14
+ --colorDisabled: #444;
15
15
  --colorHover: #dfefff;
16
16
  --colorLabel: #666;
17
17
  --colorLightRed: #ffe4ee;
@@ -61,7 +61,6 @@ select {
61
61
  background: var(--colorComboBoxBackground);
62
62
  color: var(--colorText);
63
63
  cursor: pointer;
64
- border-radius: 4px;
65
64
  outline: 0;
66
65
 
67
66
  &:enabled {
@@ -84,15 +83,16 @@ menu {
84
83
  display: flex;
85
84
  width: 100%;
86
85
  align-items: flex-end;
87
- padding: 20px 16px;
86
+ padding: 12px 16px;
88
87
  border-bottom: 1px solid rgba(127, 127, 127, 0.1);
89
88
  background: var(--colorHeaderBackground);
90
- gap: 16px;
89
+ box-shadow: var(--boxShadow1);
90
+ gap: 12px;
91
91
 
92
92
  img {
93
93
  width: 130px;
94
94
  align-self: center;
95
- margin-right: 85px;
95
+ margin-right: 18px;
96
96
  }
97
97
 
98
98
  label {
@@ -102,14 +102,23 @@ menu {
102
102
  font-size: 11px;
103
103
  }
104
104
 
105
+ input[type=url],
105
106
  select {
107
+ height: 24px;
106
108
  width: 150px;
107
- padding: 4px;
109
+ padding: 4px 2px;
108
110
  border-right: 3px solid transparent;
109
111
  margin-top: 2px;
110
112
  font-size: 11px;
111
113
  background: var(--colorComboBoxHeaderBackground);
112
114
  }
115
+
116
+ input[type=url] {
117
+ outline: 0;
118
+ padding: 0 6px;
119
+ box-shadow: var(--boxShadow1);
120
+ color: var(--colorText);
121
+ }
113
122
  }
114
123
 
115
124
  button {
@@ -139,7 +148,7 @@ menu {
139
148
  main {
140
149
  display: flex;
141
150
  align-items: flex-start;
142
- margin-top: 64px;
151
+ margin-top: 48px;
143
152
 
144
153
  > table {
145
154
  border-collapse: collapse;
@@ -159,7 +168,7 @@ main {
159
168
 
160
169
  .PayloadViewer {
161
170
  position: sticky;
162
- top: 72px;
171
+ top: 62px;
163
172
  width: 50%;
164
173
  margin-left: 20px;
165
174
 
@@ -190,7 +199,7 @@ main {
190
199
  display: inline-block;
191
200
  width: 280px;
192
201
  padding: 8px 6px;
193
- border-radius: 4px;
202
+ border-radius: 0;
194
203
  color: var(--colorAccent);
195
204
  text-decoration: none;
196
205
 
@@ -205,10 +214,11 @@ main {
205
214
 
206
215
  .MockSelector {
207
216
  width: 300px;
217
+ height: 30px;
208
218
  padding: 8px 1px;
209
219
  border: 0;
210
220
  border-left: 3px solid transparent;
211
- border-radius: 4px;
221
+ border-radius: 0;
212
222
  text-align: right;
213
223
  direction: rtl;
214
224
  text-overflow: ellipsis;
@@ -218,6 +228,7 @@ main {
218
228
  background: var(--color4xxBackground);
219
229
  }
220
230
  &:disabled {
231
+ padding-right: 4px;
221
232
  appearance: none;
222
233
  background: transparent;
223
234
  cursor: default;
@@ -258,7 +269,7 @@ main {
258
269
 
259
270
  .InternalServerErrorToggler {
260
271
  display: flex;
261
- margin-left: 6px;
272
+ margin-left: 8px;
262
273
  cursor: pointer;
263
274
 
264
275
  > input {
package/src/Dashboard.js CHANGED
@@ -12,6 +12,8 @@ const Strings = {
12
12
  cookie_disabled_title: 'No cookies specified in Config.cookies',
13
13
  delay: 'Delay',
14
14
  empty_response_body: '/* Empty Response Body */',
15
+ fallback_server: 'Fallback Server',
16
+ fallback_server_placeholder: 'Type Server Address',
15
17
  internal_server_error: 'Internal Server Error',
16
18
  mock: 'Mock',
17
19
  reset: 'Reset',
@@ -46,6 +48,7 @@ function init() {
46
48
  mockaton.listCookies(),
47
49
  mockaton.listComments(),
48
50
  mockaton.getCorsAllowed(),
51
+ mockaton.getProxyFallback(),
49
52
  mockaton.listStaticFiles()
50
53
  ].map(api => api.then(response => response.ok && response.json())))
51
54
  .then(App)
@@ -59,13 +62,14 @@ function App(apiResponses) {
59
62
  .render(DevPanel(apiResponses))
60
63
  }
61
64
 
62
- function DevPanel([brokersByMethod, cookies, comments, corsAllowed, staticFiles]) {
65
+ function DevPanel([brokersByMethod, cookies, comments, corsAllowed, fallbackAddress, staticFiles]) {
63
66
  return (
64
67
  r('div', null,
65
68
  r('menu', null,
66
69
  r('img', { src: '/mockaton-logo.svg', width: 160, alt: Strings.title }),
67
70
  r(CookieSelector, { list: cookies }),
68
71
  r(BulkSelector, { comments }),
72
+ r(ProxyFallbackField, { fallbackAddress }),
69
73
  r(CorsCheckbox, { corsAllowed }),
70
74
  r(ResetButton)),
71
75
  r('main', null,
@@ -124,6 +128,29 @@ function BulkSelector({ comments }) {
124
128
  }
125
129
 
126
130
 
131
+ function ProxyFallbackField({ fallbackAddress = '' }) {
132
+ function onChange(event) {
133
+ const input = event.currentTarget
134
+ if (!input.validity.valid)
135
+ input.reportValidity()
136
+ else
137
+ mockaton.setProxyFallback(input.value)
138
+ .catch(console.error)
139
+ }
140
+
141
+ return (
142
+ r('label', null,
143
+ r('span', null, Strings.fallback_server),
144
+ r('input', {
145
+ type: 'url',
146
+ autocomplete: 'none',
147
+ placeholder: Strings.fallback_server_placeholder,
148
+ value: fallbackAddress,
149
+ onChange
150
+ })))
151
+ }
152
+
153
+
127
154
  function CorsCheckbox({ corsAllowed }) {
128
155
  function onChange(event) {
129
156
  mockaton.setCorsAllowed(event.currentTarget.checked)
@@ -64,6 +64,12 @@ export function sendNotFound(response) {
64
64
  response.end()
65
65
  }
66
66
 
67
+ export function sendUnprocessableContent(response, error) {
68
+ console.error(error)
69
+ response.statusCode = 422
70
+ response.end(error)
71
+ }
72
+
67
73
  export function sendInternalServerError(response, error) {
68
74
  console.error(error)
69
75
  response.statusCode = 500