@qse/edu-scripts 1.13.10 → 1.13.12
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/CHANGELOG.md
CHANGED
|
@@ -3,10 +3,13 @@ var paths = require("../../paths");
|
|
|
3
3
|
var globby = require("globby");
|
|
4
4
|
var chokidar = require("chokidar");
|
|
5
5
|
var debounce = require("lodash/debounce");
|
|
6
|
+
var memoize = require("lodash/memoize");
|
|
6
7
|
var chalk = require("chalk");
|
|
7
8
|
var fs = require("fs-extra");
|
|
8
9
|
var express = require("express");
|
|
9
10
|
var cookieParser = require("cookie-parser");
|
|
11
|
+
var multer = require("multer");
|
|
12
|
+
var { pathToRegexp } = require("path-to-regexp");
|
|
10
13
|
var mockCache = {};
|
|
11
14
|
var isSetup = false;
|
|
12
15
|
var setupMock = debounce(function setupMock2() {
|
|
@@ -22,26 +25,80 @@ var setupMock = debounce(function setupMock2() {
|
|
|
22
25
|
try {
|
|
23
26
|
let mock = require(file);
|
|
24
27
|
mock = mock.default || mock;
|
|
25
|
-
|
|
28
|
+
for (const key in mock) {
|
|
29
|
+
const [method, path] = key.split(" ");
|
|
30
|
+
mockCache[key] = { method, path, handler: mock[key] };
|
|
31
|
+
}
|
|
26
32
|
} catch (e) {
|
|
27
33
|
console.error(chalk.red(`Mock file ${file} error: ${e.message}`));
|
|
28
34
|
}
|
|
29
35
|
}
|
|
30
36
|
}, 100);
|
|
37
|
+
var getPathReAndKeys = memoize((path) => {
|
|
38
|
+
const keys = [];
|
|
39
|
+
const re = pathToRegexp(path, keys);
|
|
40
|
+
return { re, keys };
|
|
41
|
+
});
|
|
42
|
+
function decodeParam(val) {
|
|
43
|
+
if (typeof val !== "string" || val.length === 0) {
|
|
44
|
+
return val;
|
|
45
|
+
}
|
|
46
|
+
try {
|
|
47
|
+
return decodeURIComponent(val);
|
|
48
|
+
} catch (err) {
|
|
49
|
+
if (err instanceof URIError) {
|
|
50
|
+
err.message = `Failed to decode param ' ${val} '`;
|
|
51
|
+
err.status = 400;
|
|
52
|
+
err.statusCode = 400;
|
|
53
|
+
}
|
|
54
|
+
throw err;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
31
57
|
function mockMiddlewave(req, res, next) {
|
|
32
58
|
const { method, path } = req;
|
|
33
|
-
const key
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
59
|
+
for (const key in mockCache) {
|
|
60
|
+
const mock = mockCache[key];
|
|
61
|
+
if (mock.method !== method)
|
|
62
|
+
continue;
|
|
63
|
+
const { keys, re } = getPathReAndKeys(mock.path);
|
|
64
|
+
const m = re.exec(path);
|
|
65
|
+
if (m) {
|
|
66
|
+
console.log(chalk.green(`Mock: ${key}`));
|
|
67
|
+
res.setHeader("X-Mock", key);
|
|
68
|
+
if (typeof mock.handler === "function") {
|
|
69
|
+
const params = {};
|
|
70
|
+
for (let i = 1; i < m.length; i += 1) {
|
|
71
|
+
const key2 = keys[i - 1];
|
|
72
|
+
const prop = key2.name;
|
|
73
|
+
const val = decodeParam(m[i]);
|
|
74
|
+
if (val !== void 0) {
|
|
75
|
+
params[prop] = val;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
req.params = params;
|
|
79
|
+
const middelwaves = [
|
|
80
|
+
express.urlencoded({ limit: "5mb", extended: true }),
|
|
81
|
+
express.json({ limit: "5mb", strict: false }),
|
|
82
|
+
multer().any(),
|
|
83
|
+
cookieParser(),
|
|
84
|
+
mock.handler
|
|
85
|
+
];
|
|
86
|
+
const throwNext = () => {
|
|
87
|
+
console.log(chalk.red(`Mock: ${key} don't use next()`));
|
|
88
|
+
res.sendStatus(500);
|
|
89
|
+
};
|
|
90
|
+
const mwNext = () => {
|
|
91
|
+
const middelwave = middelwaves.shift();
|
|
92
|
+
middelwave(req, res, middelwaves.length ? mwNext : throwNext);
|
|
93
|
+
};
|
|
94
|
+
mwNext();
|
|
95
|
+
} else {
|
|
96
|
+
res.json(mock.handler);
|
|
97
|
+
}
|
|
98
|
+
return;
|
|
41
99
|
}
|
|
42
|
-
} else {
|
|
43
|
-
next();
|
|
44
100
|
}
|
|
101
|
+
next();
|
|
45
102
|
}
|
|
46
103
|
function setupMockServer(middelwaves, devServer) {
|
|
47
104
|
if (!fs.existsSync(paths.mock))
|
|
@@ -52,9 +109,6 @@ function setupMockServer(middelwaves, devServer) {
|
|
|
52
109
|
only: [/\/mock\//, /\/src\//],
|
|
53
110
|
extensions: [".js", ".ts"]
|
|
54
111
|
});
|
|
55
|
-
devServer.app.use(express.urlencoded({ extended: false }));
|
|
56
|
-
devServer.app.use(express.json());
|
|
57
|
-
devServer.app.use(cookieParser());
|
|
58
112
|
middelwaves.unshift({
|
|
59
113
|
name: "edu-scripts-mock-middelwave",
|
|
60
114
|
middleware: mockMiddlewave
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@qse/edu-scripts",
|
|
3
|
-
"version": "1.13.
|
|
3
|
+
"version": "1.13.12",
|
|
4
4
|
"author": "Kinoko",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"description": "教育工程化基础框架",
|
|
@@ -53,6 +53,7 @@
|
|
|
53
53
|
"cookie-parser": "^1.4.6",
|
|
54
54
|
"css-loader": "^6.8.1",
|
|
55
55
|
"cssnano": "^6.0.1",
|
|
56
|
+
"debug": "^4.3.4",
|
|
56
57
|
"esbuild-loader": "^2.21.0",
|
|
57
58
|
"express": "^4.18.2",
|
|
58
59
|
"filesize": "^8.0.7",
|
|
@@ -64,14 +65,16 @@
|
|
|
64
65
|
"less": "^3.13.1",
|
|
65
66
|
"less-loader": "^10.2.0",
|
|
66
67
|
"lodash": "^4.17.21",
|
|
68
|
+
"multer": "^1.4.5-lts.1",
|
|
67
69
|
"open": "^8.4.2",
|
|
70
|
+
"path-to-regexp": "^6.2.1",
|
|
68
71
|
"postcss": "^8.4.27",
|
|
69
72
|
"postcss-flexbugs-fixes": "^5.0.2",
|
|
70
73
|
"postcss-loader": "^7.3.3",
|
|
71
74
|
"postcss-momentum-scrolling": "^3.14.22",
|
|
72
75
|
"postcss-normalize": "^8.0.1",
|
|
73
76
|
"postcss-preset-env": "^9.1.0",
|
|
74
|
-
"prettier": "^
|
|
77
|
+
"prettier": "^2.8.8",
|
|
75
78
|
"prettier-plugin-tailwindcss": "^0.4.1",
|
|
76
79
|
"react-refresh": "^0.14.0",
|
|
77
80
|
"recursive-readdir": "^2.2.3",
|
|
@@ -2,10 +2,17 @@ const paths = require('../../paths')
|
|
|
2
2
|
const globby = require('globby')
|
|
3
3
|
const chokidar = require('chokidar')
|
|
4
4
|
const debounce = require('lodash/debounce')
|
|
5
|
+
const memoize = require('lodash/memoize')
|
|
5
6
|
const chalk = require('chalk')
|
|
6
7
|
const fs = require('fs-extra')
|
|
7
8
|
const express = require('express')
|
|
8
9
|
const cookieParser = require('cookie-parser')
|
|
10
|
+
const multer = require('multer')
|
|
11
|
+
const { pathToRegexp } = require('path-to-regexp')
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @type {Record<string,{handler:any;method:string;path:string}>}
|
|
15
|
+
*/
|
|
9
16
|
let mockCache = {}
|
|
10
17
|
let isSetup = false
|
|
11
18
|
|
|
@@ -30,30 +37,92 @@ const setupMock = debounce(function setupMock() {
|
|
|
30
37
|
try {
|
|
31
38
|
let mock = require(file)
|
|
32
39
|
mock = mock.default || mock
|
|
33
|
-
|
|
40
|
+
|
|
41
|
+
for (const key in mock) {
|
|
42
|
+
const [method, path] = key.split(' ')
|
|
43
|
+
mockCache[key] = { method, path, handler: mock[key] }
|
|
44
|
+
}
|
|
34
45
|
} catch (e) {
|
|
35
46
|
console.error(chalk.red(`Mock file ${file} error: ${e.message}`))
|
|
36
47
|
}
|
|
37
48
|
}
|
|
38
49
|
}, 100)
|
|
39
50
|
|
|
51
|
+
const getPathReAndKeys = memoize((path) => {
|
|
52
|
+
const keys = []
|
|
53
|
+
const re = pathToRegexp(path, keys)
|
|
54
|
+
return { re, keys }
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
function decodeParam(val) {
|
|
58
|
+
if (typeof val !== 'string' || val.length === 0) {
|
|
59
|
+
return val
|
|
60
|
+
}
|
|
61
|
+
try {
|
|
62
|
+
return decodeURIComponent(val)
|
|
63
|
+
} catch (err) {
|
|
64
|
+
if (err instanceof URIError) {
|
|
65
|
+
err.message = `Failed to decode param ' ${val} '`
|
|
66
|
+
// @ts-ignore
|
|
67
|
+
err.status = 400
|
|
68
|
+
// @ts-ignore
|
|
69
|
+
err.statusCode = 400
|
|
70
|
+
}
|
|
71
|
+
throw err
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
40
75
|
/**
|
|
41
76
|
* @type {import('express').RequestHandler}
|
|
42
77
|
*/
|
|
43
78
|
function mockMiddlewave(req, res, next) {
|
|
44
79
|
const { method, path } = req
|
|
45
|
-
const key
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
res.
|
|
80
|
+
for (const key in mockCache) {
|
|
81
|
+
const mock = mockCache[key]
|
|
82
|
+
if (mock.method !== method) continue
|
|
83
|
+
const { keys, re } = getPathReAndKeys(mock.path)
|
|
84
|
+
const m = re.exec(path)
|
|
85
|
+
if (m) {
|
|
86
|
+
console.log(chalk.green(`Mock: ${key}`))
|
|
87
|
+
res.setHeader('X-Mock', key)
|
|
88
|
+
|
|
89
|
+
if (typeof mock.handler === 'function') {
|
|
90
|
+
const params = {}
|
|
91
|
+
for (let i = 1; i < m.length; i += 1) {
|
|
92
|
+
const key = keys[i - 1]
|
|
93
|
+
const prop = key.name
|
|
94
|
+
const val = decodeParam(m[i])
|
|
95
|
+
if (val !== undefined) {
|
|
96
|
+
params[prop] = val
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
req.params = params
|
|
100
|
+
|
|
101
|
+
const middelwaves = [
|
|
102
|
+
express.urlencoded({ limit: '5mb', extended: true }),
|
|
103
|
+
express.json({ limit: '5mb', strict: false }),
|
|
104
|
+
multer().any(),
|
|
105
|
+
cookieParser(),
|
|
106
|
+
mock.handler,
|
|
107
|
+
]
|
|
108
|
+
|
|
109
|
+
const throwNext = () => {
|
|
110
|
+
console.log(chalk.red(`Mock: ${key} don't use next()`))
|
|
111
|
+
res.sendStatus(500)
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const mwNext = () => {
|
|
115
|
+
const middelwave = middelwaves.shift()
|
|
116
|
+
middelwave(req, res, middelwaves.length ? mwNext : throwNext)
|
|
117
|
+
}
|
|
118
|
+
mwNext()
|
|
119
|
+
} else {
|
|
120
|
+
res.json(mock.handler)
|
|
121
|
+
}
|
|
122
|
+
return
|
|
53
123
|
}
|
|
54
|
-
} else {
|
|
55
|
-
next()
|
|
56
124
|
}
|
|
125
|
+
next()
|
|
57
126
|
}
|
|
58
127
|
|
|
59
128
|
/**
|
|
@@ -70,10 +139,6 @@ function setupMockServer(middelwaves, devServer) {
|
|
|
70
139
|
extensions: ['.js', '.ts'],
|
|
71
140
|
})
|
|
72
141
|
|
|
73
|
-
devServer.app.use(express.urlencoded({ extended: false }))
|
|
74
|
-
devServer.app.use(express.json())
|
|
75
|
-
devServer.app.use(cookieParser())
|
|
76
|
-
|
|
77
142
|
middelwaves.unshift({
|
|
78
143
|
name: 'edu-scripts-mock-middelwave',
|
|
79
144
|
middleware: mockMiddlewave,
|