@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
@@ -1,5 +1,14 @@
1
1
  # 更新日志
2
2
 
3
+ ## 1.13.12 (2023-08-24)
4
+
5
+ - fix: 降低级 prettier
6
+
7
+ ## 1.13.11 (2023-08-10)
8
+
9
+ - feat: mock 支持 `path-to-regexp` 规则
10
+ - fix: 修复 mock 导致 proxy 失效
11
+
3
12
  ## 1.13.10 (2023-08-10)
4
13
 
5
14
  - fix: 清理 mock 的 console.log,优化提示效果
@@ -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
- mockCache = { ...mockCache, ...mock };
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 = `${method.toUpperCase()} ${path}`;
34
- const mock = mockCache[key];
35
- if (mock) {
36
- console.log(chalk.green(`Mock: ${key}`));
37
- if (typeof mock === "function") {
38
- mock(req, res, next);
39
- } else {
40
- res.json(mock);
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.10",
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": "^3.0.0",
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
- mockCache = { ...mockCache, ...mock }
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 = `${method.toUpperCase()} ${path}`
46
- const mock = mockCache[key]
47
- if (mock) {
48
- console.log(chalk.green(`Mock: ${key}`))
49
- if (typeof mock === 'function') {
50
- mock(req, res, next)
51
- } else {
52
- res.json(mock)
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,
@@ -9,7 +9,7 @@ export type BabelImportPlugin = [
9
9
  camel2DashComponentName?: boolean
10
10
  style?: boolean | 'css' | ((name: string) => string)
11
11
  },
12
- string,
12
+ string
13
13
  ]
14
14
  export type BabelConfig = {
15
15
  presets: any[]