mockaton 8.16.2 → 8.16.4

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
@@ -29,9 +29,9 @@ Nonetheless, there’s a programmatic API, which is handy
29
29
  for setting up tests (see **Commander API** section).
30
30
 
31
31
  <picture>
32
- <source media="(prefers-color-scheme: light)" srcset="pixaton-tests/macos/pic-for-readme.vp840x800.light.gold.png">
33
- <source media="(prefers-color-scheme: dark)" srcset="pixaton-tests/macos/pic-for-readme.vp840x800.dark.gold.png">
34
- <img alt="Mockaton Dashboard" src="pixaton-tests/macos/pic-for-readme.vp840x800.light.gold.png">
32
+ <source media="(prefers-color-scheme: light)" srcset="pixaton-tests/macos/pic-for-readme.vp962x800.light.gold.png">
33
+ <source media="(prefers-color-scheme: dark)" srcset="pixaton-tests/macos/pic-for-readme.vp962x800.dark.gold.png">
34
+ <img alt="Mockaton Dashboard" src="pixaton-tests/macos/pic-for-readme.vp962x800.light.gold.png">
35
35
  </picture>
36
36
 
37
37
 
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.4",
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);
3
2
  --radius: 4px;
4
- --radiusSmall: 4px;
3
+ --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);
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;
@@ -27,10 +27,11 @@
27
27
  :root {
28
28
  --color4xxBackground: #403630;
29
29
  --colorAccent: #2495ff;
30
- --colorBackground: #161616;
30
+ --colorBackground: #181818;
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,38 +96,41 @@ 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;
102
113
  }
103
114
  }
104
115
 
105
- .red {
106
- color: var(--colorRed);
107
- }
108
-
109
- .Header {
110
- position: fixed;
111
- z-index: 100;
112
- top: 0;
113
- left: 0;
116
+ header {
114
117
  display: flex;
115
118
  width: 100%;
116
- align-items: flex-end;
117
119
  padding: 16px;
118
120
  background: var(--colorHeaderBackground);
119
121
  box-shadow: var(--boxShadow1);
120
- gap: 10px;
122
+
123
+ > div {
124
+ display: flex;
125
+ flex-wrap: wrap;
126
+ align-items: flex-end;
127
+ gap: 10px;
128
+
129
+ @media (max-width: 860px) {
130
+ max-width: 500px;
131
+ }
132
+ }
133
+
121
134
 
122
135
  img {
123
136
  width: 130px;
@@ -151,11 +164,11 @@ select {
151
164
  width: 100%;
152
165
  height: 28px;
153
166
  padding: 4px 8px;
167
+ border: 0;
154
168
  border-right: 3px solid transparent;
155
169
  margin-top: 4px;
156
170
  color: var(--colorText);
157
171
  font-size: 11px;
158
- box-shadow: var(--boxShadow1);
159
172
  background-color: var(--colorComboBoxHeaderBackground);
160
173
  border-radius: var(--radius);
161
174
  }
@@ -215,90 +228,76 @@ select {
215
228
  color: var(--colorRed);
216
229
  border-radius: 50px;
217
230
 
218
-
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: min(820px) 1fr;
243
+
244
+ @media (max-width: 1160px) {
245
+ grid-template-columns: min(620px) 1fr;
246
+ }
247
+
248
+ @media (max-width: 960px) {
249
+ grid-template-columns: 100%;
250
+ grid-template-rows: 1fr 1fr;
251
+
252
+ .leftSide {
253
+ box-shadow: var(--boxShadow1);
254
+ }
255
+ }
256
+
257
+ .leftSide {
258
+ padding: 16px;
259
+ padding-bottom: 0;
260
+ overflow-y: auto;
261
+ }
262
+
263
+ .rightSide {
264
+ padding-top: 16px;
265
+ padding-left: 16px;
266
+ overflow-y: auto;
267
+ }
230
268
  }
231
269
 
232
270
  table {
233
271
  border-collapse: collapse;
234
272
 
235
273
  th {
236
- padding-top: 20px;
237
274
  padding-bottom: 2px;
238
- padding-left: 99px;
275
+ padding-left: 110px;
239
276
  text-align: left;
240
277
  }
241
278
 
242
- tr {
243
- border-top: 2px solid transparent;
279
+ tbody {
280
+ border-bottom: 20px solid transparent;
244
281
  }
245
282
  }
246
283
 
247
- .MockList {
248
- display: flex;
249
- align-items: flex-start;
250
- margin-top: 64px;
251
-
252
- &.empty {
253
- margin-top: 80px;
254
- }
284
+ .empty {
285
+ margin-top: 80px;
255
286
  }
256
287
 
257
288
 
258
- .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
-
269
- pre {
270
- overflow: auto;
271
- max-height: calc(100vh - 72px);
272
- padding-top: 12px;
273
-
274
- code {
275
- white-space: pre;
276
- tab-size: 2;
277
- font-family: monospace;
278
-
279
- * {
280
- font-family: monospace;
281
- }
282
- }
283
- }
284
- }
285
-
286
289
  .PreviewLink {
287
290
  position: relative;
288
- left: -6px;
291
+ left: -8px;
289
292
  display: inline-block;
290
- width: 272px;
291
- padding: 8px 6px;
293
+ width: 100%;
294
+ padding: 8px;
295
+ margin-left: 4px;
292
296
  border-radius: var(--radius);
293
297
  color: var(--colorAccent);
294
298
  text-decoration: none;
295
299
  word-break: break-word;
296
300
 
297
- span {
298
- opacity: 0.6;
299
- filter: saturate(0);
300
- }
301
-
302
301
  &:hover {
303
302
  background: var(--colorHover);
304
303
  }
@@ -309,11 +308,10 @@ table {
309
308
  }
310
309
 
311
310
  .MockSelector {
312
- width: 260px;
313
- height: 30px;
311
+ width: 100%;
312
+ height: 26px;
314
313
  padding-right: 5px;
315
314
  padding-left: 16px;
316
- border: 0;
317
315
  text-align: right;
318
316
  direction: rtl;
319
317
  text-overflow: ellipsis;
@@ -329,6 +327,7 @@ table {
329
327
  }
330
328
  &:disabled {
331
329
  padding-right: 4px;
330
+ border-color: transparent;
332
331
  appearance: none;
333
332
  background: transparent;
334
333
  cursor: default;
@@ -363,33 +362,32 @@ table {
363
362
  margin-left: 8px;
364
363
  > input {
365
364
  &:checked ~ svg {
365
+ border-color: var(--colorAccent);
366
366
  fill: var(--colorAccent);
367
367
  background: var(--colorAccent);
368
368
  stroke: var(--colorBackground);
369
369
  }
370
370
 
371
371
  &:enabled:hover:not(:checked) ~ svg {
372
- border-color: var(--colorText);
372
+ border-color: var(--colorHover);
373
373
  background: var(--colorHover);
374
374
  stroke: var(--colorText);
375
375
  }
376
376
  }
377
377
 
378
378
  > svg {
379
- width: 19px;
380
- height: 19px;
379
+ width: 22px;
380
+ height: 22px;
381
+ border: 1px solid var(--colorSecondaryActionBorder);
381
382
  stroke-width: 2.5px;
382
383
  border-radius: 50%;
383
- background: var(--colorSecondaryButtonBackground);
384
- box-shadow: var(--boxShadow1);
385
384
  }
386
385
  }
387
386
 
388
387
  .ProxyToggler {
389
388
  padding: 1px 3px;
390
- background: var(--colorSecondaryButtonBackground);
391
- border-radius: var(--radiusSmall);
392
- box-shadow: var(--boxShadow1);
389
+ border: 1px solid var(--colorSecondaryActionBorder);
390
+ border-radius: var(--radius);
393
391
 
394
392
  &:has(input:checked),
395
393
  &:has(input:disabled) {
@@ -414,7 +412,7 @@ table {
414
412
  }
415
413
 
416
414
  &:disabled ~ svg {
417
- stroke-opacity: 0.5;
415
+ stroke-opacity: 0.4;
418
416
  cursor: not-allowed;
419
417
  box-shadow: none;
420
418
  fill: transparent;
@@ -430,7 +428,7 @@ table {
430
428
  width: 18px;
431
429
  height: 18px;
432
430
  stroke-width: 2px;
433
- border-radius: var(--radiusSmall);
431
+ border-radius: var(--radius);
434
432
  }
435
433
  }
436
434
 
@@ -452,6 +450,7 @@ table {
452
450
  }
453
451
 
454
452
  &:checked ~ span {
453
+ border-color: var(--colorRed);
455
454
  color: white;
456
455
  background: var(--colorRed);
457
456
  }
@@ -459,20 +458,52 @@ table {
459
458
 
460
459
  > span {
461
460
  padding: 4px;
461
+ border: 1px solid var(--colorSecondaryActionBorder);
462
462
  font-size: 10px;
463
463
  font-weight: bold;
464
464
  color: var(--colorSecondaryAction);
465
- border-radius: var(--radiusSmall);
466
- background: var(--colorSecondaryButtonBackground);
467
- box-shadow: var(--boxShadow1);
465
+ border-radius: var(--radius);
468
466
 
469
467
  &:hover {
468
+ border-color: var(--colorLightRed);
470
469
  background: var(--colorLightRed);
471
470
  color: var(--colorRed);
472
471
  }
473
472
  }
474
473
  }
475
474
 
475
+
476
+ .StaticFilesList {
477
+ a {
478
+ display: inline-block;
479
+ padding: 6px 0;
480
+ border-radius: var(--radius);
481
+ color: var(--colorAccent);
482
+ text-decoration: none;
483
+
484
+ &:hover {
485
+ text-decoration: underline;
486
+ }
487
+ }
488
+ }
489
+
490
+
491
+ .PayloadViewer {
492
+ pre {
493
+ padding-top: 12px;
494
+
495
+ code {
496
+ white-space: pre;
497
+ tab-size: 2;
498
+ font-family: monospace;
499
+
500
+ * {
501
+ font-family: monospace;
502
+ }
503
+ }
504
+ }
505
+ }
506
+
476
507
  .SpinnerClock {
477
508
  display: flex;
478
509
  width: 36px;
@@ -499,26 +530,13 @@ table {
499
530
  }
500
531
  }
501
532
 
533
+ .red {
534
+ color: var(--colorRed);
535
+ }
502
536
 
503
- .StaticFilesList {
504
- margin-top: 8px;
505
-
506
- a {
507
- display: inline-block;
508
- padding: 6px 0;
509
- border-radius: var(--radius);
510
- color: var(--colorAccent);
511
- text-decoration: none;
512
-
513
- &:hover {
514
- text-decoration: underline;
515
- }
516
-
517
- span {
518
- opacity: 0.6;
519
- filter: saturate(0);
520
- }
521
- }
537
+ .dittoDir {
538
+ opacity: 0.9;
539
+ filter: saturate(0);
522
540
  }
523
541
 
524
542
 
@@ -526,7 +544,6 @@ table {
526
544
  * Prism
527
545
  */
528
546
 
529
-
530
547
  @media (prefers-color-scheme: dark) {
531
548
  .token.cdata, .token.comment, .token.doctype, .token.prolog {
532
549
  color: #8292a2
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
  }