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
package/lib/storage.js ADDED
@@ -0,0 +1,16 @@
1
+ const path = require('path');
2
+ const os = require('os');
3
+
4
+ /**
5
+ * 存储路径配置
6
+ */
7
+ module.exports = {
8
+ // 数据存储目录
9
+ DATA_DIR: path.join(os.homedir(), '.whistle-mock-plugin', 'data'),
10
+
11
+ // 文件存储目录
12
+ FILES_DIR: path.join(os.homedir(), '.whistle-mock-plugin', 'files'),
13
+
14
+ // 日志存储目录
15
+ LOGS_DIR: path.join(os.homedir(), '.whistle-mock-plugin', 'logs')
16
+ };
@@ -0,0 +1,68 @@
1
+ const express = require('express');
2
+ const path = require('path');
3
+ const bodyParser = require('body-parser');
4
+ const app = express();
5
+ const fs = require('fs-extra');
6
+ const storage = require('./storage');
7
+
8
+ // 引入工具函数
9
+ const util = require('../app/util');
10
+
11
+ // 设置app路径
12
+ const APP_ROOT = util.formatPath(path.join(__dirname, '../app'));
13
+ const APP_CGI_ROOT = util.formatPath(path.join(APP_ROOT, 'cgi-bin'));
14
+ // 加载CGI模块
15
+ const CGI_MODULES = util.loadModulesSync(APP_CGI_ROOT);
16
+
17
+ // 数据存储目录
18
+ const DATA_DIR = storage.DATA_DIR;
19
+
20
+ // 确保数据目录存在
21
+ fs.ensureDirSync(DATA_DIR);
22
+
23
+ // 处理请求和响应错误
24
+ app.use(function(req, res, next) {
25
+ req.on('error', util.noop);
26
+ res.on('error', util.noop);
27
+ next();
28
+ });
29
+
30
+ // 解析请求体
31
+ app.use(bodyParser.urlencoded({ extended: true, limit: '100mb'}));
32
+ app.use(bodyParser.json({ limit: '100mb' }));
33
+
34
+ // 处理CGI请求
35
+ app.all('/cgi-bin/*', function(req, res) {
36
+ if (req.headers.origin) {
37
+ res.setHeader('Access-Control-Allow-Origin', req.headers.origin);
38
+ res.setHeader('Access-Control-Allow-Credentials', true);
39
+ }
40
+
41
+ const controller = CGI_MODULES[APP_ROOT + req.url.replace(/\?.*$/, '')];
42
+ if (!controller) {
43
+ res.status(404).end('Not found');
44
+ return;
45
+ }
46
+
47
+ try {
48
+ // 提供数据目录给CGI处理程序
49
+ controller.call({ dataDir: DATA_DIR }, req, res);
50
+ } catch(e) {
51
+ res.status(500).end(e.stack);
52
+ }
53
+ });
54
+
55
+ // 静态文件服务
56
+ app.use(express.static(path.join(__dirname, '../app/public')));
57
+
58
+ // 单页应用支持:所有非API请求返回index.html
59
+ app.get('*', (req, res) => {
60
+ if (!req.path.startsWith('/cgi-bin/')) {
61
+ res.sendFile(path.join(__dirname, '../app/public/index.html'));
62
+ }
63
+ });
64
+
65
+ // 导出启动UI服务器的函数
66
+ module.exports = function startUIServer(server, options) {
67
+ server.on('request', app);
68
+ };
package/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "whistle.mock-plugins",
3
+ "version": "1.0.0",
4
+ "description": "Whistle 插件,用于快速创建 API 模拟数据",
5
+ "main": "lib/index.js",
6
+ "scripts": {
7
+ "dev": "cross-env NODE_ENV=development webpack serve",
8
+ "build": "cross-env NODE_ENV=production webpack",
9
+ "start": "whistle run",
10
+ "test": "jest"
11
+ },
12
+ "keywords": [
13
+ "whistle",
14
+ "plugin",
15
+ "mock",
16
+ "api"
17
+ ],
18
+ "author": "",
19
+ "license": "MIT",
20
+ "dependencies": {
21
+ "axios": "^1.6.5",
22
+ "body-parser": "^1.20.2",
23
+ "express": "^4.18.2",
24
+ "fs-extra": "^11.1.1",
25
+ "mockjs": "^1.1.0",
26
+ "path-to-regexp": "^6.2.1",
27
+ "react-router-dom": "^5.3.0",
28
+ "uuid": "^9.0.0"
29
+ },
30
+ "devDependencies": {
31
+ "@babel/core": "^7.21.4",
32
+ "@babel/preset-env": "^7.21.4",
33
+ "@babel/preset-react": "^7.18.6",
34
+ "antd": "^5.4.2",
35
+ "babel-loader": "^9.1.2",
36
+ "cross-env": "^7.0.3",
37
+ "css-loader": "^6.7.3",
38
+ "html-webpack-plugin": "^5.5.0",
39
+ "jest": "^29.7.0",
40
+ "react": "^18.2.0",
41
+ "react-dom": "^18.2.0",
42
+ "style-loader": "^3.3.2",
43
+ "webpack": "^5.79.0",
44
+ "webpack-cli": "^5.0.1",
45
+ "webpack-dev-server": "^4.13.2"
46
+ },
47
+ "whistleConfig": {
48
+ "homepage": "https://github.com/yourusername/whistle.mock-plugin",
49
+ "name": "mock-plugin"
50
+ }
51
+ }