whistle.mock-plugins 1.0.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.
Files changed (68) hide show
  1. package/API.md +247 -0
  2. package/README.md +91 -0
  3. package/app/cgi-bin/features.js +285 -0
  4. package/app/cgi-bin/index.js +31 -0
  5. package/app/cgi-bin/interfaces.js +409 -0
  6. package/app/cgi-bin/logs.js +151 -0
  7. package/app/cgi-bin/test-interface.js +152 -0
  8. package/app/public/index.html +1 -0
  9. package/app/public/js/index.js +2 -0
  10. package/app/public/js/index.js.LICENSE.txt +150 -0
  11. package/app/util/index.js +24 -0
  12. package/index.html +52 -0
  13. package/initialize.js +32 -0
  14. package/lib/dataManager.js +500 -0
  15. package/lib/index.js +3 -0
  16. package/lib/models.js +64 -0
  17. package/lib/routes/features.js +213 -0
  18. package/lib/routes/interfaces.js +304 -0
  19. package/lib/routes/proxy.js +239 -0
  20. package/lib/ruleManager.js +551 -0
  21. package/lib/rules-server.js +267 -0
  22. package/lib/server.js +805 -0
  23. package/lib/storage.js +16 -0
  24. package/lib/ui-server.js +68 -0
  25. package/package.json +51 -0
  26. package/public/bundle.js +2 -0
  27. package/public/bundle.js.LICENSE.txt +38 -0
  28. package/public/index.html +1 -0
  29. package/public/plugin.mock-plugin.html +14 -0
  30. package/rules.txt +22 -0
  31. package/test/rulesServer.test.js +120 -0
  32. package/ui/src/App.css +173 -0
  33. package/ui/src/App.js +24 -0
  34. package/ui/src/components/AppLayout.js +149 -0
  35. package/ui/src/components/FeatureCard.js +53 -0
  36. package/ui/src/components/Layout.js +94 -0
  37. package/ui/src/components/MainNav.js +42 -0
  38. package/ui/src/components/PageContainer.js +16 -0
  39. package/ui/src/index.html +11 -0
  40. package/ui/src/index.js +43 -0
  41. package/ui/src/pages/FileProxy.js +235 -0
  42. package/ui/src/pages/FilesPage.js +292 -0
  43. package/ui/src/pages/Home.js +128 -0
  44. package/ui/src/pages/HomePage.js +195 -0
  45. package/ui/src/pages/InterfaceManagement.js +829 -0
  46. package/ui/src/pages/InterfacePage.js +342 -0
  47. package/ui/src/pages/MockData.js +472 -0
  48. package/ui/src/pages/Settings.js +192 -0
  49. package/ui/src/pages/SettingsPage.js +165 -0
  50. package/ui/src/pages/UrlRedirect.js +225 -0
  51. package/ui/src/pages/Welcome.js +155 -0
  52. package/ui/src/services/api.js +186 -0
  53. package/ui/src/styles/app-layout.css +337 -0
  54. package/ui/src/styles/feature-card.css +172 -0
  55. package/ui/src/styles/file-proxy.css +301 -0
  56. package/ui/src/styles/global.css +224 -0
  57. package/ui/src/styles/home.css +123 -0
  58. package/ui/src/styles/index.css +419 -0
  59. package/ui/src/styles/interface-management.css +694 -0
  60. package/ui/src/styles/layout.css +159 -0
  61. package/ui/src/styles/logs-page.css +427 -0
  62. package/ui/src/styles/main-nav.css +52 -0
  63. package/ui/src/styles/mock-data.css +850 -0
  64. package/ui/src/styles/page-container.css +11 -0
  65. package/ui/src/styles/settings.css +208 -0
  66. package/ui/src/styles/url-redirect.css +279 -0
  67. package/ui/src/styles/welcome.css +282 -0
  68. package/webpack.config.js +49 -0
@@ -0,0 +1,419 @@
1
+ /* 全局样式重置 */
2
+ * {
3
+ margin: 0;
4
+ padding: 0;
5
+ box-sizing: border-box;
6
+ }
7
+
8
+ body {
9
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
10
+ color: #333;
11
+ background-color: #f5f5f5;
12
+ line-height: 1.6;
13
+ }
14
+
15
+ /* 通用布局样式 */
16
+ .app-layout {
17
+ display: flex;
18
+ flex-direction: column;
19
+ min-height: 100vh;
20
+ }
21
+
22
+ .app-header {
23
+ display: flex;
24
+ align-items: center;
25
+ justify-content: space-between;
26
+ padding: 0 20px;
27
+ height: 60px;
28
+ background-color: #fff;
29
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
30
+ z-index: 10;
31
+ }
32
+
33
+ .app-logo {
34
+ display: flex;
35
+ align-items: center;
36
+ font-size: 1.5rem;
37
+ font-weight: bold;
38
+ color: #2c3e50;
39
+ }
40
+
41
+ .app-logo img {
42
+ height: 32px;
43
+ margin-right: 10px;
44
+ }
45
+
46
+ .search-bar {
47
+ flex: 1;
48
+ max-width: 400px;
49
+ margin: 0 20px;
50
+ position: relative;
51
+ }
52
+
53
+ .search-bar input {
54
+ width: 100%;
55
+ padding: 8px 12px;
56
+ padding-left: 35px;
57
+ border: 1px solid #ddd;
58
+ border-radius: 4px;
59
+ font-size: 14px;
60
+ }
61
+
62
+ .search-bar::before {
63
+ content: '🔍';
64
+ position: absolute;
65
+ left: 10px;
66
+ top: 8px;
67
+ color: #aaa;
68
+ }
69
+
70
+ .action-buttons {
71
+ display: flex;
72
+ gap: 10px;
73
+ }
74
+
75
+ .action-btn {
76
+ padding: 8px 12px;
77
+ background-color: #3498db;
78
+ color: white;
79
+ border: none;
80
+ border-radius: 4px;
81
+ cursor: pointer;
82
+ transition: background-color 0.2s;
83
+ }
84
+
85
+ .action-btn:hover {
86
+ background-color: #2980b9;
87
+ }
88
+
89
+ .app-main {
90
+ display: flex;
91
+ flex: 1;
92
+ }
93
+
94
+ .app-sidebar {
95
+ width: 240px;
96
+ background-color: #fff;
97
+ box-shadow: 2px 0 4px rgba(0, 0, 0, 0.05);
98
+ padding: 20px 0;
99
+ }
100
+
101
+ .sidebar-header {
102
+ padding: 0 20px 15px;
103
+ border-bottom: 1px solid #eee;
104
+ font-weight: bold;
105
+ font-size: 1.1rem;
106
+ }
107
+
108
+ .feature-list {
109
+ list-style: none;
110
+ margin-top: 15px;
111
+ }
112
+
113
+ .feature-item {
114
+ padding: 10px 20px;
115
+ display: flex;
116
+ justify-content: space-between;
117
+ align-items: center;
118
+ cursor: pointer;
119
+ transition: background-color 0.2s;
120
+ }
121
+
122
+ .feature-item:hover {
123
+ background-color: #f0f7ff;
124
+ }
125
+
126
+ .feature-item.active {
127
+ background-color: #e6f7ff;
128
+ border-right: 3px solid #1890ff;
129
+ }
130
+
131
+ .feature-name {
132
+ flex: 1;
133
+ }
134
+
135
+ .feature-count {
136
+ font-size: 12px;
137
+ padding: 2px 8px;
138
+ background-color: #eee;
139
+ border-radius: 10px;
140
+ }
141
+
142
+ .add-feature-btn {
143
+ margin: 20px;
144
+ padding: 8px 12px;
145
+ background-color: #f0f7ff;
146
+ color: #1890ff;
147
+ border: 1px dashed #1890ff;
148
+ border-radius: 4px;
149
+ width: calc(100% - 40px);
150
+ text-align: center;
151
+ cursor: pointer;
152
+ transition: all 0.2s;
153
+ }
154
+
155
+ .add-feature-btn:hover {
156
+ background-color: #e6f7ff;
157
+ }
158
+
159
+ .sidebar-footer {
160
+ margin-top: auto;
161
+ padding: 15px 20px;
162
+ font-size: 12px;
163
+ color: #999;
164
+ border-top: 1px solid #eee;
165
+ }
166
+
167
+ .app-content {
168
+ flex: 1;
169
+ padding: 20px;
170
+ overflow-y: auto;
171
+ }
172
+
173
+ .content-header {
174
+ margin-bottom: 20px;
175
+ display: flex;
176
+ justify-content: space-between;
177
+ align-items: center;
178
+ }
179
+
180
+ .content-title {
181
+ font-size: 1.5rem;
182
+ font-weight: bold;
183
+ color: #2c3e50;
184
+ }
185
+
186
+ .content-controls {
187
+ display: flex;
188
+ gap: 10px;
189
+ }
190
+
191
+ .view-toggle, .sort-select {
192
+ padding: 6px 12px;
193
+ border: 1px solid #ddd;
194
+ border-radius: 4px;
195
+ background-color: #fff;
196
+ cursor: pointer;
197
+ }
198
+
199
+ .view-toggle:hover,
200
+ .sort-select:hover {
201
+ border-color: #bbb;
202
+ }
203
+
204
+ /* 卡片和列表通用样式 */
205
+ .features-container {
206
+ margin-top: 20px;
207
+ }
208
+
209
+ .card-view {
210
+ display: grid;
211
+ grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
212
+ gap: 20px;
213
+ }
214
+
215
+ .list-view .feature-row {
216
+ display: flex;
217
+ justify-content: space-between;
218
+ align-items: center;
219
+ padding: 15px;
220
+ margin-bottom: 10px;
221
+ background-color: #fff;
222
+ border-radius: 4px;
223
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
224
+ }
225
+
226
+ .list-view .feature-info {
227
+ flex: 1;
228
+ }
229
+
230
+ .list-view .feature-actions {
231
+ display: flex;
232
+ gap: 10px;
233
+ }
234
+
235
+ /* 表单和表格通用样式 */
236
+ .config-form-container {
237
+ background-color: #fff;
238
+ border-radius: 4px;
239
+ padding: 20px;
240
+ margin-bottom: 20px;
241
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
242
+ }
243
+
244
+ .config-form {
245
+ display: flex;
246
+ flex-direction: column;
247
+ gap: 15px;
248
+ }
249
+
250
+ .form-group {
251
+ display: flex;
252
+ flex-direction: column;
253
+ gap: 5px;
254
+ }
255
+
256
+ .form-group label {
257
+ font-weight: 500;
258
+ }
259
+
260
+ .form-group input {
261
+ padding: 8px 12px;
262
+ border: 1px solid #ddd;
263
+ border-radius: 4px;
264
+ font-size: 14px;
265
+ }
266
+
267
+ .form-actions {
268
+ display: flex;
269
+ justify-content: flex-end;
270
+ margin-top: 10px;
271
+ }
272
+
273
+ .submit-btn {
274
+ padding: 8px 16px;
275
+ background-color: #3498db;
276
+ color: white;
277
+ border: none;
278
+ border-radius: 4px;
279
+ cursor: pointer;
280
+ transition: background-color 0.2s;
281
+ }
282
+
283
+ .submit-btn:hover {
284
+ background-color: #2980b9;
285
+ }
286
+
287
+ .config-list-container {
288
+ background-color: #fff;
289
+ border-radius: 4px;
290
+ padding: 20px;
291
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
292
+ }
293
+
294
+ .config-table {
295
+ width: 100%;
296
+ border-collapse: collapse;
297
+ margin-top: 10px;
298
+ }
299
+
300
+ .config-table th,
301
+ .config-table td {
302
+ padding: 12px;
303
+ text-align: left;
304
+ border-bottom: 1px solid #eee;
305
+ }
306
+
307
+ .config-table th {
308
+ font-weight: 500;
309
+ color: #666;
310
+ }
311
+
312
+ .config-table tr.inactive {
313
+ color: #999;
314
+ background-color: #f9f9f9;
315
+ }
316
+
317
+ .empty-list {
318
+ padding: 20px;
319
+ text-align: center;
320
+ color: #999;
321
+ }
322
+
323
+ /* 开关按钮样式 */
324
+ .toggle-switch {
325
+ position: relative;
326
+ display: inline-block;
327
+ width: 40px;
328
+ height: 20px;
329
+ }
330
+
331
+ .toggle-switch input {
332
+ opacity: 0;
333
+ width: 0;
334
+ height: 0;
335
+ }
336
+
337
+ .toggle-slider {
338
+ position: absolute;
339
+ cursor: pointer;
340
+ top: 0;
341
+ left: 0;
342
+ right: 0;
343
+ bottom: 0;
344
+ background-color: #ccc;
345
+ transition: .4s;
346
+ border-radius: 34px;
347
+ }
348
+
349
+ .toggle-slider:before {
350
+ position: absolute;
351
+ content: "";
352
+ height: 16px;
353
+ width: 16px;
354
+ left: 2px;
355
+ bottom: 2px;
356
+ background-color: white;
357
+ transition: .4s;
358
+ border-radius: 50%;
359
+ }
360
+
361
+ input:checked + .toggle-slider {
362
+ background-color: #2196F3;
363
+ }
364
+
365
+ input:checked + .toggle-slider:before {
366
+ transform: translateX(20px);
367
+ }
368
+
369
+ /* 操作按钮样式 */
370
+ .edit-btn, .delete-btn {
371
+ padding: 5px 10px;
372
+ border: none;
373
+ border-radius: 4px;
374
+ cursor: pointer;
375
+ font-size: 13px;
376
+ }
377
+
378
+ .edit-btn {
379
+ background-color: #f0f7ff;
380
+ color: #1890ff;
381
+ margin-right: 5px;
382
+ }
383
+
384
+ .delete-btn {
385
+ background-color: #fff0f0;
386
+ color: #ff4d4f;
387
+ }
388
+
389
+ .edit-btn:hover {
390
+ background-color: #e6f7ff;
391
+ }
392
+
393
+ .delete-btn:hover {
394
+ background-color: #ffd4d4;
395
+ }
396
+
397
+ /* 响应式布局 */
398
+ @media (max-width: 768px) {
399
+ .app-main {
400
+ flex-direction: column;
401
+ }
402
+
403
+ .app-sidebar {
404
+ width: 100%;
405
+ order: 2;
406
+ }
407
+
408
+ .app-content {
409
+ order: 1;
410
+ }
411
+
412
+ .card-view {
413
+ grid-template-columns: 1fr;
414
+ }
415
+
416
+ .search-bar {
417
+ display: none;
418
+ }
419
+ }