mockaton 8.16.2 → 8.16.3

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/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "mockaton",
3
3
  "description": "HTTP Mock Server",
4
4
  "type": "module",
5
- "version": "8.16.2",
5
+ "version": "8.16.3",
6
6
  "main": "index.js",
7
7
  "types": "index.d.ts",
8
8
  "license": "MIT",
package/src/Dashboard.css CHANGED
@@ -1,7 +1,6 @@
1
1
  :root {
2
- --boxShadow1: 0 2px 1px -1px rgba(0, 0, 0, 0.15), 0 1px 1px 0 rgba(0, 0, 0, 0.15), 0 1px 3px 0 rgba(0, 0, 0, 0.1);
2
+ --boxShadow1: 0 3px 1px -1px rgba(0, 0, 0, 0.04), 0 1px 1px 0 rgba(0, 0, 0, 0.1), 0 1px 3px 0 rgba(0, 0, 0, 0.1);
3
3
  --radius: 4px;
4
- --radiusSmall: 4px;
5
4
  }
6
5
 
7
6
  @media (prefers-color-scheme: light) {
@@ -12,9 +11,10 @@
12
11
  --colorBackground: #fff;
13
12
  --colorComboBoxHeaderBackground: #fff;
14
13
  --colorComboBoxBackground: #eee;
15
- --colorHeaderBackground: #eee;
16
- --colorSecondaryButtonBackground: #eee;
17
- --colorSecondaryAction: #555;
14
+ --colorHeaderBackground: #f0f0f0;
15
+ --colorSecondaryButtonBackground: #fcfcfc;
16
+ --colorSecondaryActionBorder: #ddd;
17
+ --colorSecondaryAction: #666;
18
18
  --colorDisabledMockSelector: #444;
19
19
  --colorHover: #dfefff;
20
20
  --colorLabel: #444;
@@ -31,6 +31,7 @@
31
31
  --colorHeaderBackground: #111;
32
32
  --colorComboBoxBackground: #2a2a2a;
33
33
  --colorSecondaryButtonBackground: #2a2a2a;
34
+ --colorSecondaryActionBorder: #333;
34
35
  --colorSecondaryAction: #999;
35
36
  --colorComboBoxHeaderBackground: #222;
36
37
  --colorDisabledMockSelector: #b9b9b9;
@@ -42,15 +43,22 @@
42
43
  }
43
44
  }
44
45
 
45
- html, body {
46
+ html,
47
+ body {
48
+ overflow: hidden;
49
+ height: 100%;
50
+ padding: 0;
46
51
  margin: 0;
52
+ background: var(--colorHeaderBackground);
47
53
  font-size: 12px;
48
54
  }
49
55
  body {
50
- padding: 16px;
56
+ display: grid;
57
+ grid-template-rows: auto 1fr;
51
58
  background: var(--colorBackground);
52
59
  color: var(--colorText);
53
60
  }
61
+
54
62
  * {
55
63
  box-sizing: border-box;
56
64
  padding: 0;
@@ -59,6 +67,7 @@ body {
59
67
  font-family: system-ui, sans-serif;
60
68
  font-size: 100%;
61
69
  outline: 0;
70
+ scrollbar-width: thin;
62
71
  }
63
72
 
64
73
  select, a, input, button, summary {
@@ -79,6 +88,7 @@ input[type=checkbox] ~ svg {
79
88
  }
80
89
 
81
90
  select {
91
+ border: 1px solid transparent;
82
92
  font-size: 100%;
83
93
  color: var(--colorText);
84
94
  cursor: pointer;
@@ -86,16 +96,17 @@ select {
86
96
  border-radius: var(--radius);
87
97
  appearance: none;
88
98
  background: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23888888'><path d='M16.59 8.59 12 13.17 7.41 8.59 6 10l6 6 6-6z'/></svg>") no-repeat;
89
- background-color: var(--colorComboBoxBackground);
90
99
  background-size: 16px;
91
100
  background-position: 100% center;
92
101
 
93
102
  &:enabled {
94
- box-shadow: var(--boxShadow1);
95
- }
96
- &:enabled:hover {
97
- cursor: pointer;
98
- background-color: var(--colorHover);
103
+ border-color: var(--colorSecondaryActionBorder);
104
+ background-color: var(--colorSecondaryButtonBackground);
105
+ &:hover {
106
+ border-color: var(--colorHover);
107
+ cursor: pointer;
108
+ background-color: var(--colorHover);
109
+ }
99
110
  }
100
111
  &:disabled {
101
112
  cursor: not-allowed;
@@ -106,18 +117,19 @@ select {
106
117
  color: var(--colorRed);
107
118
  }
108
119
 
109
- .Header {
110
- position: fixed;
111
- z-index: 100;
112
- top: 0;
113
- left: 0;
120
+ header {
114
121
  display: flex;
115
122
  width: 100%;
116
- align-items: flex-end;
117
123
  padding: 16px;
118
124
  background: var(--colorHeaderBackground);
119
125
  box-shadow: var(--boxShadow1);
120
- gap: 10px;
126
+
127
+ > div {
128
+ display: flex;
129
+ flex-wrap: wrap;
130
+ align-items: flex-end;
131
+ gap: 10px;
132
+ }
121
133
 
122
134
  img {
123
135
  width: 130px;
@@ -151,11 +163,11 @@ select {
151
163
  width: 100%;
152
164
  height: 28px;
153
165
  padding: 4px 8px;
166
+ border: 0;
154
167
  border-right: 3px solid transparent;
155
168
  margin-top: 4px;
156
169
  color: var(--colorText);
157
170
  font-size: 11px;
158
- box-shadow: var(--boxShadow1);
159
171
  background-color: var(--colorComboBoxHeaderBackground);
160
172
  border-radius: var(--radius);
161
173
  }
@@ -219,56 +231,61 @@ select {
219
231
  &:hover {
220
232
  background: var(--colorRed);
221
233
  color: white;
222
- box-shadow: var(--boxShadow1);
223
234
  }
224
235
  }
225
236
  }
226
237
 
227
238
 
228
- .Main {
229
- display: flex;
239
+ main {
240
+ display: grid;
241
+ min-height: 0;
242
+ grid-template-columns: 50% 50%;
243
+
244
+ @media (max-width: 960px) {
245
+ grid-template-columns: 100%;
246
+ grid-template-rows: 50% 50%;
247
+ gap: 32px;
248
+ }
249
+
250
+ .leftSide {
251
+ padding: 16px;
252
+ padding-bottom: 0;
253
+ overflow-y: auto;
254
+ }
255
+
256
+ .rightSide {
257
+ padding-top: 16px;
258
+ padding-left: 16px;
259
+ overflow-y: auto;
260
+ }
230
261
  }
231
262
 
232
263
  table {
233
264
  border-collapse: collapse;
234
265
 
235
266
  th {
236
- padding-top: 20px;
237
267
  padding-bottom: 2px;
238
- padding-left: 99px;
268
+ padding-left: 110px;
239
269
  text-align: left;
240
270
  }
241
271
 
242
- tr {
243
- border-top: 2px solid transparent;
272
+ tbody {
273
+ border-bottom: 20px solid transparent;
244
274
  }
245
275
  }
246
276
 
247
- .MockList {
248
- display: flex;
249
- align-items: flex-start;
250
- margin-top: 64px;
251
-
252
- &.empty {
253
- margin-top: 80px;
254
- }
277
+ .empty {
278
+ margin-top: 80px;
255
279
  }
256
280
 
257
281
 
258
282
  .PayloadViewer {
259
- position: sticky;
260
- top: 62px;
261
- width: 50%;
262
- margin-top: 62px;
263
- margin-left: 20px;
264
-
265
- h2 {
266
- padding-top: 20px;
267
- }
268
-
283
+ /*h2 {*/
284
+ /* top: 0;*/
285
+ /* position: sticky;*/
286
+ /* background: var(--colorBackground);*/
287
+ /*}*/
269
288
  pre {
270
- overflow: auto;
271
- max-height: calc(100vh - 72px);
272
289
  padding-top: 12px;
273
290
 
274
291
  code {
@@ -285,20 +302,16 @@ table {
285
302
 
286
303
  .PreviewLink {
287
304
  position: relative;
288
- left: -6px;
305
+ left: -8px;
289
306
  display: inline-block;
290
- width: 272px;
291
- padding: 8px 6px;
307
+ width: 240px;
308
+ padding: 8px;
309
+ margin-left: 4px;
292
310
  border-radius: var(--radius);
293
311
  color: var(--colorAccent);
294
312
  text-decoration: none;
295
313
  word-break: break-word;
296
314
 
297
- span {
298
- opacity: 0.6;
299
- filter: saturate(0);
300
- }
301
-
302
315
  &:hover {
303
316
  background: var(--colorHover);
304
317
  }
@@ -309,11 +322,10 @@ table {
309
322
  }
310
323
 
311
324
  .MockSelector {
312
- width: 260px;
313
- height: 30px;
325
+ width: 100%;
326
+ height: 26px;
314
327
  padding-right: 5px;
315
328
  padding-left: 16px;
316
- border: 0;
317
329
  text-align: right;
318
330
  direction: rtl;
319
331
  text-overflow: ellipsis;
@@ -329,6 +341,7 @@ table {
329
341
  }
330
342
  &:disabled {
331
343
  padding-right: 4px;
344
+ border-color: transparent;
332
345
  appearance: none;
333
346
  background: transparent;
334
347
  cursor: default;
@@ -363,33 +376,32 @@ table {
363
376
  margin-left: 8px;
364
377
  > input {
365
378
  &:checked ~ svg {
379
+ border-color: var(--colorAccent);
366
380
  fill: var(--colorAccent);
367
381
  background: var(--colorAccent);
368
382
  stroke: var(--colorBackground);
369
383
  }
370
384
 
371
385
  &:enabled:hover:not(:checked) ~ svg {
372
- border-color: var(--colorText);
386
+ border-color: var(--colorHover);
373
387
  background: var(--colorHover);
374
388
  stroke: var(--colorText);
375
389
  }
376
390
  }
377
391
 
378
392
  > svg {
379
- width: 19px;
380
- height: 19px;
393
+ width: 22px;
394
+ height: 22px;
395
+ border: 1px solid var(--colorSecondaryActionBorder);
381
396
  stroke-width: 2.5px;
382
397
  border-radius: 50%;
383
- background: var(--colorSecondaryButtonBackground);
384
- box-shadow: var(--boxShadow1);
385
398
  }
386
399
  }
387
400
 
388
401
  .ProxyToggler {
389
402
  padding: 1px 3px;
390
- background: var(--colorSecondaryButtonBackground);
391
- border-radius: var(--radiusSmall);
392
- box-shadow: var(--boxShadow1);
403
+ border: 1px solid var(--colorSecondaryActionBorder);
404
+ border-radius: var(--radius);
393
405
 
394
406
  &:has(input:checked),
395
407
  &:has(input:disabled) {
@@ -414,7 +426,7 @@ table {
414
426
  }
415
427
 
416
428
  &:disabled ~ svg {
417
- stroke-opacity: 0.5;
429
+ stroke-opacity: 0.4;
418
430
  cursor: not-allowed;
419
431
  box-shadow: none;
420
432
  fill: transparent;
@@ -430,7 +442,7 @@ table {
430
442
  width: 18px;
431
443
  height: 18px;
432
444
  stroke-width: 2px;
433
- border-radius: var(--radiusSmall);
445
+ border-radius: var(--radius);
434
446
  }
435
447
  }
436
448
 
@@ -452,6 +464,7 @@ table {
452
464
  }
453
465
 
454
466
  &:checked ~ span {
467
+ border-color: var(--colorRed);
455
468
  color: white;
456
469
  background: var(--colorRed);
457
470
  }
@@ -459,14 +472,14 @@ table {
459
472
 
460
473
  > span {
461
474
  padding: 4px;
475
+ border: 1px solid var(--colorSecondaryActionBorder);
462
476
  font-size: 10px;
463
477
  font-weight: bold;
464
478
  color: var(--colorSecondaryAction);
465
- border-radius: var(--radiusSmall);
466
- background: var(--colorSecondaryButtonBackground);
467
- box-shadow: var(--boxShadow1);
479
+ border-radius: var(--radius);
468
480
 
469
481
  &:hover {
482
+ border-color: var(--colorLightRed);
470
483
  background: var(--colorLightRed);
471
484
  color: var(--colorRed);
472
485
  }
@@ -501,7 +514,6 @@ table {
501
514
 
502
515
 
503
516
  .StaticFilesList {
504
- margin-top: 8px;
505
517
 
506
518
  a {
507
519
  display: inline-block;
@@ -513,14 +525,14 @@ table {
513
525
  &:hover {
514
526
  text-decoration: underline;
515
527
  }
516
-
517
- span {
518
- opacity: 0.6;
519
- filter: saturate(0);
520
- }
521
528
  }
522
529
  }
523
530
 
531
+ .dittoDir {
532
+ opacity: 0.9;
533
+ filter: saturate(0);
534
+ }
535
+
524
536
 
525
537
  /*
526
538
  * Prism
package/src/Dashboard.js CHANGED
@@ -24,15 +24,16 @@ const Strings = {
24
24
  fallback_server_placeholder: 'Type Server Address',
25
25
  got: 'Got',
26
26
  internal_server_error: 'Internal Server Error',
27
- mock: 'Mock',
28
27
  no_mocks_found: 'No mocks found',
29
28
  not_found: 'Not Found',
30
29
  pick_comment: 'Pick Comment…',
30
+ preview: 'Preview',
31
31
  proxied: 'Proxied',
32
32
  proxy_toggler: 'Proxy Toggler',
33
33
  reset: 'Reset',
34
34
  save_proxied: 'Save Mocks',
35
- static_get: 'Static GET'
35
+ static_get: 'Static GET',
36
+ title: 'Mockaton'
36
37
  }
37
38
 
38
39
  const CSS = {
@@ -41,9 +42,9 @@ const CSS = {
41
42
  FallbackBackend: 'FallbackBackend',
42
43
  Field: 'Field',
43
44
  GlobalDelayField: 'GlobalDelayField',
44
- Header: 'Header',
45
45
  InternalServerErrorToggler: 'InternalServerErrorToggler',
46
- Main: 'Main',
46
+ MainLeftSide: 'leftSide',
47
+ MainRightSide: 'rightSide',
47
48
  MockList: 'MockList',
48
49
  MockSelector: 'MockSelector',
49
50
  NotFoundToggler: 'NotFoundToggler',
@@ -57,11 +58,12 @@ const CSS = {
57
58
  SpinnerClockMinuteHand: 'MinuteHand',
58
59
  StaticFilesList: 'StaticFilesList',
59
60
 
60
- red: 'red',
61
- empty: 'empty',
62
61
  chosen: 'chosen',
63
- status4xx: 'status4xx',
64
- nonDefault: 'nonDefault'
62
+ dittoDir: 'dittoDir',
63
+ empty: 'empty',
64
+ nonDefault: 'nonDefault',
65
+ red: 'red',
66
+ status4xx: 'status4xx'
65
67
  }
66
68
 
67
69
  const r = createElement
@@ -83,20 +85,20 @@ function init() {
83
85
  mockaton.getProxyFallback(),
84
86
  mockaton.listStaticFiles()
85
87
  ].map(api => api.then(response => response.ok && response.json())))
86
- .then(data => document.body.replaceChildren(App(data)))
88
+ .then(data => document.body.replaceChildren(...App(data)))
87
89
  .catch(onError)
88
90
  }
89
91
 
90
92
  function App([brokersByMethod, cookies, comments, delay, collectProxied, fallbackAddress, staticBrokers]) {
91
93
  globalDelay = delay
92
- return (
93
- r('div', null,
94
- r(Header, { cookies, comments, delay, fallbackAddress, collectProxied }),
95
- r('main', { className: CSS.Main },
96
- r('div', null,
97
- r(MockList, { brokersByMethod, canProxy: Boolean(fallbackAddress) }),
98
- r(StaticFilesList, { brokers: staticBrokers })),
99
- r(PayloadViewer))))
94
+ return [
95
+ r(Header, { cookies, comments, delay, fallbackAddress, collectProxied }),
96
+ r('main', null,
97
+ r('div', { className: CSS.MainLeftSide },
98
+ r(MockList, { brokersByMethod, canProxy: Boolean(fallbackAddress) }),
99
+ r(StaticFilesList, { brokers: staticBrokers })),
100
+ r('div', { className: CSS.MainRightSide },
101
+ r(PayloadViewer)))]
100
102
  }
101
103
 
102
104
 
@@ -104,13 +106,14 @@ function App([brokersByMethod, cookies, comments, delay, collectProxied, fallbac
104
106
 
105
107
  function Header({ cookies, comments, delay, fallbackAddress, collectProxied }) {
106
108
  return (
107
- r('menu', { className: CSS.Header },
109
+ r('header', null,
108
110
  r(Logo),
109
- r(CookieSelector, { cookies }),
110
- r(BulkSelector, { comments }),
111
- r(GlobalDelayField, { delay }),
112
- r(ProxyFallbackField, { fallbackAddress, collectProxied }),
113
- r(ResetButton)))
111
+ r('div', null,
112
+ r(CookieSelector, { cookies }),
113
+ r(BulkSelector, { comments }),
114
+ r(GlobalDelayField, { delay }),
115
+ r(ProxyFallbackField, { fallbackAddress, collectProxied }),
116
+ r(ResetButton))))
114
117
  }
115
118
 
116
119
  function Logo() {
@@ -249,10 +252,10 @@ function MockList({ brokersByMethod, canProxy }) {
249
252
  const hasMocks = Object.keys(brokersByMethod).length
250
253
  if (!hasMocks)
251
254
  return (
252
- r('div', { className: cssClass(CSS.MockList, CSS.empty) },
255
+ r('div', { className: CSS.empty },
253
256
  Strings.no_mocks_found))
254
257
  return (
255
- r('div', { className: CSS.MockList },
258
+ r('div', null,
256
259
  r('table', null, Object.entries(brokersByMethod).map(([method, brokers]) =>
257
260
  r(SectionByMethod, { method, brokers, canProxy })))))
258
261
  }
@@ -296,7 +299,7 @@ function PreviewLink({ method, urlMask, urlMaskDittoed }) {
296
299
  href: urlMask,
297
300
  onClick
298
301
  }, ditto
299
- ? [r('span', null, ditto), tail]
302
+ ? [r('span', { className: CSS.dittoDir }, ditto), tail]
300
303
  : tail))
301
304
  }
302
305
 
@@ -414,7 +417,7 @@ function StaticFilesList({ brokers }) {
414
417
  if (!Object.keys(brokers).length)
415
418
  return null
416
419
  const dp = dittoSplitPaths(Object.keys(brokers)).map(([ditto, tail]) => ditto
417
- ? [r('span', null, ditto), tail]
420
+ ? [r('span', { className: CSS.dittoDir }, ditto), tail]
418
421
  : tail)
419
422
  return (
420
423
  r('table', { className: CSS.StaticFilesList },
@@ -493,7 +496,7 @@ const payloadViewerRef = useRef()
493
496
  function PayloadViewer() {
494
497
  return (
495
498
  r('div', { className: CSS.PayloadViewer },
496
- r('h2', { ref: payloadViewerTitleRef }, Strings.mock),
499
+ r('h2', { ref: payloadViewerTitleRef }, Strings.preview),
497
500
  r('pre', null,
498
501
  r('code', { ref: payloadViewerRef }, Strings.click_link_to_preview))))
499
502
  }