@modern-js/bff-core 1.22.2-beta.0 → 1.22.3
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 +26 -130
- package/dist/js/modern/api.js +34 -49
- package/dist/js/modern/client/generate-client.js +34 -52
- package/dist/js/modern/client/index.js +1 -1
- package/dist/js/modern/client/result.js +8 -10
- package/dist/js/modern/errors/http.js +14 -8
- package/dist/js/modern/index.js +3 -19
- package/dist/js/modern/operators/http.js +116 -139
- package/dist/js/modern/router/constants.js +13 -31
- package/dist/js/modern/router/index.js +131 -68
- package/dist/js/modern/router/types.js +1 -0
- package/dist/js/modern/router/utils.js +54 -36
- package/dist/js/modern/types.js +47 -45
- package/dist/js/modern/utils/alias.js +50 -35
- package/dist/js/modern/utils/debug.js +2 -5
- package/dist/js/modern/utils/index.js +2 -5
- package/dist/js/modern/utils/meta.js +4 -8
- package/dist/js/modern/utils/storage.js +14 -8
- package/dist/js/modern/utils/validate.js +29 -23
- package/dist/js/node/api.js +46 -78
- package/dist/js/node/client/generate-client.js +55 -85
- package/dist/js/node/client/index.js +18 -17
- package/dist/js/node/client/result.js +18 -32
- package/dist/js/node/errors/http.js +22 -28
- package/dist/js/node/index.js +122 -45
- package/dist/js/node/operators/http.js +169 -184
- package/dist/js/node/router/constants.js +28 -60
- package/dist/js/node/router/index.js +201 -112
- package/dist/js/node/router/types.js +5 -15
- package/dist/js/node/router/utils.js +78 -71
- package/dist/js/node/types.js +57 -71
- package/dist/js/node/utils/alias.js +73 -65
- package/dist/js/node/utils/debug.js +10 -27
- package/dist/js/node/utils/index.js +68 -28
- package/dist/js/node/utils/meta.js +12 -30
- package/dist/js/node/utils/storage.js +24 -36
- package/dist/js/node/utils/validate.js +44 -50
- package/package.json +40 -12
|
@@ -1,102 +1,147 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
var
|
|
7
|
-
|
|
8
|
-
for (var name in all)
|
|
9
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
-
};
|
|
11
|
-
var __copyProps = (to, from, except, desc) => {
|
|
12
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
-
for (let key of __getOwnPropNames(from))
|
|
14
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
-
}
|
|
17
|
-
return to;
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
var _exportNames = {
|
|
7
|
+
ApiRouter: true
|
|
18
8
|
};
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
)
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
9
|
+
exports.ApiRouter = void 0;
|
|
10
|
+
|
|
11
|
+
var _path = _interopRequireDefault(require("path"));
|
|
12
|
+
|
|
13
|
+
var _utils = require("@modern-js/utils");
|
|
14
|
+
|
|
15
|
+
require("reflect-metadata");
|
|
16
|
+
|
|
17
|
+
var _types = require("../types");
|
|
18
|
+
|
|
19
|
+
var _utils2 = require("../utils");
|
|
20
|
+
|
|
21
|
+
var _constants = require("./constants");
|
|
22
|
+
|
|
23
|
+
Object.keys(_constants).forEach(function (key) {
|
|
24
|
+
if (key === "default" || key === "__esModule") return;
|
|
25
|
+
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
26
|
+
if (key in exports && exports[key] === _constants[key]) return;
|
|
27
|
+
Object.defineProperty(exports, key, {
|
|
28
|
+
enumerable: true,
|
|
29
|
+
get: function () {
|
|
30
|
+
return _constants[key];
|
|
31
|
+
}
|
|
32
|
+
});
|
|
28
33
|
});
|
|
29
|
-
|
|
30
|
-
var
|
|
31
|
-
|
|
32
|
-
var
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
34
|
+
|
|
35
|
+
var _utils3 = require("./utils");
|
|
36
|
+
|
|
37
|
+
var _types2 = require("./types");
|
|
38
|
+
|
|
39
|
+
Object.keys(_types2).forEach(function (key) {
|
|
40
|
+
if (key === "default" || key === "__esModule") return;
|
|
41
|
+
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
42
|
+
if (key in exports && exports[key] === _types2[key]) return;
|
|
43
|
+
Object.defineProperty(exports, key, {
|
|
44
|
+
enumerable: true,
|
|
45
|
+
get: function () {
|
|
46
|
+
return _types2[key];
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
52
|
+
|
|
53
|
+
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
54
|
+
|
|
39
55
|
class ApiRouter {
|
|
56
|
+
// lambdaDir is the dir which equal to the apiDir in function mode, and equal to the api/lambda dir in framework mode
|
|
40
57
|
constructor({
|
|
41
|
-
apiDir,
|
|
42
|
-
lambdaDir,
|
|
58
|
+
apiDir: _apiDir,
|
|
59
|
+
lambdaDir: _lambdaDir,
|
|
43
60
|
prefix
|
|
44
61
|
}) {
|
|
45
|
-
this
|
|
46
|
-
|
|
62
|
+
_defineProperty(this, "apiMode", void 0);
|
|
63
|
+
|
|
64
|
+
_defineProperty(this, "apiDir", void 0);
|
|
65
|
+
|
|
66
|
+
_defineProperty(this, "existLambdaDir", void 0);
|
|
67
|
+
|
|
68
|
+
_defineProperty(this, "lambdaDir", void 0);
|
|
69
|
+
|
|
70
|
+
_defineProperty(this, "prefix", void 0);
|
|
71
|
+
|
|
72
|
+
_defineProperty(this, "apiFiles", []);
|
|
73
|
+
|
|
74
|
+
_defineProperty(this, "getExactApiMode", apiDir => {
|
|
47
75
|
const exist = this.createExistChecker(apiDir);
|
|
48
|
-
const existLambdaDir = exist(
|
|
49
|
-
const existAppDir = exist(
|
|
50
|
-
const existAppFile = exist(
|
|
76
|
+
const existLambdaDir = exist(_constants.FRAMEWORK_MODE_LAMBDA_DIR);
|
|
77
|
+
const existAppDir = exist(_constants.FRAMEWORK_MODE_APP_DIR);
|
|
78
|
+
const existAppFile = exist('app.ts') || exist('app.js');
|
|
79
|
+
|
|
51
80
|
if (existLambdaDir || existAppDir || existAppFile) {
|
|
52
|
-
return
|
|
81
|
+
return _constants.APIMode.FARMEWORK;
|
|
53
82
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
83
|
+
|
|
84
|
+
return _constants.APIMode.FUNCTION;
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
_defineProperty(this, "createExistChecker", base => target => _utils.fs.pathExistsSync(_path.default.resolve(base, target)));
|
|
88
|
+
|
|
89
|
+
_defineProperty(this, "getExactLambdaDir", apiDir => {
|
|
58
90
|
if (this.lambdaDir) {
|
|
59
91
|
return this.lambdaDir;
|
|
60
92
|
}
|
|
61
|
-
|
|
93
|
+
|
|
94
|
+
const lambdaDir = this.apiMode === _constants.APIMode.FARMEWORK ? _path.default.join(apiDir, _constants.FRAMEWORK_MODE_LAMBDA_DIR) : apiDir;
|
|
62
95
|
return lambdaDir;
|
|
63
|
-
};
|
|
64
|
-
|
|
65
|
-
this.validateAbsolute(
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
this.validateAbsolute(_apiDir, 'apiDir');
|
|
99
|
+
this.validateAbsolute(_lambdaDir, 'lambdaDir');
|
|
66
100
|
this.prefix = this.initPrefix(prefix);
|
|
67
|
-
this.apiDir =
|
|
68
|
-
this.apiMode = this.getExactApiMode(
|
|
69
|
-
this.lambdaDir =
|
|
70
|
-
this.existLambdaDir =
|
|
101
|
+
this.apiDir = _apiDir;
|
|
102
|
+
this.apiMode = this.getExactApiMode(_apiDir);
|
|
103
|
+
this.lambdaDir = _lambdaDir || this.getExactLambdaDir(this.apiDir);
|
|
104
|
+
this.existLambdaDir = _utils.fs.existsSync(this.lambdaDir);
|
|
71
105
|
}
|
|
106
|
+
|
|
72
107
|
isExistLambda() {
|
|
73
108
|
return this.existLambdaDir;
|
|
74
109
|
}
|
|
110
|
+
|
|
75
111
|
getApiMode() {
|
|
76
112
|
return this.apiMode;
|
|
77
113
|
}
|
|
114
|
+
|
|
78
115
|
getLambdaDir() {
|
|
79
116
|
return this.lambdaDir;
|
|
80
117
|
}
|
|
118
|
+
|
|
81
119
|
isApiFile(filename) {
|
|
82
120
|
if (this.existLambdaDir) {
|
|
83
121
|
return false;
|
|
84
122
|
}
|
|
123
|
+
|
|
85
124
|
if (!this.apiFiles.includes(filename)) {
|
|
86
125
|
return false;
|
|
87
126
|
}
|
|
127
|
+
|
|
88
128
|
return true;
|
|
89
129
|
}
|
|
130
|
+
|
|
90
131
|
getSingleModuleHandlers(filename) {
|
|
91
132
|
const moduleInfo = this.getModuleInfo(filename);
|
|
133
|
+
|
|
92
134
|
if (moduleInfo) {
|
|
93
135
|
return this.getModuleHandlerInfos(moduleInfo);
|
|
94
136
|
}
|
|
137
|
+
|
|
95
138
|
return null;
|
|
96
139
|
}
|
|
140
|
+
|
|
97
141
|
getHandlerInfo(filename, originFuncName, handler) {
|
|
98
142
|
const httpMethod = this.getHttpMethod(originFuncName, handler);
|
|
99
143
|
const routeName = this.getRouteName(filename, handler);
|
|
144
|
+
|
|
100
145
|
if (httpMethod && routeName) {
|
|
101
146
|
return {
|
|
102
147
|
handler,
|
|
@@ -107,110 +152,145 @@ class ApiRouter {
|
|
|
107
152
|
routePath: this.getRoutePath(this.prefix, routeName)
|
|
108
153
|
};
|
|
109
154
|
}
|
|
155
|
+
|
|
110
156
|
return null;
|
|
111
|
-
}
|
|
157
|
+
} // TODO: 性能提升,开发环境,判断下 lambda 目录修改时间
|
|
158
|
+
|
|
159
|
+
|
|
112
160
|
getSafeRoutePath(filename, handler) {
|
|
113
161
|
this.loadApiFiles();
|
|
114
162
|
this.validateValidApifile(filename);
|
|
115
163
|
return this.getRouteName(filename, handler);
|
|
116
164
|
}
|
|
165
|
+
|
|
117
166
|
getRouteName(filename, handler) {
|
|
118
167
|
if (handler) {
|
|
119
|
-
const trigger = Reflect.getMetadata(
|
|
120
|
-
|
|
168
|
+
const trigger = Reflect.getMetadata(_types.OperatorType.Trigger, handler);
|
|
169
|
+
|
|
170
|
+
if (trigger && trigger.type === _types.TriggerType.Http) {
|
|
121
171
|
if (!trigger.path) {
|
|
122
|
-
throw new Error(
|
|
123
|
-
`The http trigger ${trigger.name} needs to specify a path`
|
|
124
|
-
);
|
|
172
|
+
throw new Error(`The http trigger ${trigger.name} needs to specify a path`);
|
|
125
173
|
}
|
|
174
|
+
|
|
126
175
|
return trigger.path;
|
|
127
176
|
}
|
|
128
177
|
}
|
|
129
|
-
|
|
178
|
+
|
|
179
|
+
const routePath = (0, _utils3.getPathFromFilename)(this.lambdaDir, filename);
|
|
130
180
|
return routePath;
|
|
131
181
|
}
|
|
182
|
+
|
|
132
183
|
getHttpMethod(originHandlerName, handler) {
|
|
133
184
|
if (handler) {
|
|
134
|
-
const trigger = Reflect.getMetadata(
|
|
135
|
-
|
|
185
|
+
const trigger = Reflect.getMetadata(_types.OperatorType.Trigger, handler);
|
|
186
|
+
|
|
187
|
+
if (trigger && _types.httpMethods.includes(trigger.method)) {
|
|
136
188
|
return trigger.method;
|
|
137
189
|
}
|
|
138
190
|
}
|
|
191
|
+
|
|
139
192
|
const upperName = originHandlerName.toUpperCase();
|
|
193
|
+
|
|
140
194
|
switch (upperName) {
|
|
141
|
-
case
|
|
142
|
-
return
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
case
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
case
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
case
|
|
155
|
-
return
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
195
|
+
case 'GET':
|
|
196
|
+
return _types.HttpMethod.Get;
|
|
197
|
+
|
|
198
|
+
case 'POST':
|
|
199
|
+
return _types.HttpMethod.Post;
|
|
200
|
+
|
|
201
|
+
case 'PUT':
|
|
202
|
+
return _types.HttpMethod.Put;
|
|
203
|
+
|
|
204
|
+
case 'DELETE':
|
|
205
|
+
case 'DEL':
|
|
206
|
+
return _types.HttpMethod.Delete;
|
|
207
|
+
|
|
208
|
+
case 'CONNECT':
|
|
209
|
+
return _types.HttpMethod.Connect;
|
|
210
|
+
|
|
211
|
+
case 'TRACE':
|
|
212
|
+
return _types.HttpMethod.Trace;
|
|
213
|
+
|
|
214
|
+
case 'PATCH':
|
|
215
|
+
return _types.HttpMethod.Patch;
|
|
216
|
+
|
|
217
|
+
case 'OPTION':
|
|
218
|
+
return _types.HttpMethod.Option;
|
|
219
|
+
|
|
220
|
+
case 'DEFAULT':
|
|
221
|
+
{
|
|
222
|
+
return _types.HttpMethod.Get;
|
|
223
|
+
}
|
|
224
|
+
|
|
161
225
|
default:
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
);
|
|
226
|
+
_utils.logger.warn(`Only api handlers are allowd to be exported, please remove the function ${originHandlerName} from exports`);
|
|
227
|
+
|
|
165
228
|
return null;
|
|
166
229
|
}
|
|
167
230
|
}
|
|
231
|
+
|
|
168
232
|
loadApiFiles() {
|
|
169
233
|
if (!this.existLambdaDir) {
|
|
170
234
|
return [];
|
|
171
|
-
}
|
|
172
|
-
|
|
235
|
+
} // eslint-disable-next-line no-multi-assign
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
const apiFiles = this.apiFiles = (0, _utils3.getFiles)(this.lambdaDir, _constants.API_FILE_RULES);
|
|
173
239
|
return apiFiles;
|
|
174
240
|
}
|
|
241
|
+
|
|
175
242
|
getApiFiles() {
|
|
176
243
|
if (!this.existLambdaDir) {
|
|
177
244
|
return [];
|
|
178
245
|
}
|
|
246
|
+
|
|
179
247
|
if (this.apiFiles.length > 0) {
|
|
180
248
|
return this.apiFiles;
|
|
181
249
|
}
|
|
250
|
+
|
|
182
251
|
return this.loadApiFiles();
|
|
183
252
|
}
|
|
253
|
+
|
|
184
254
|
getApiHandlers() {
|
|
185
255
|
const filenames = this.getApiFiles();
|
|
186
256
|
const moduleInfos = this.getModuleInfos(filenames);
|
|
187
257
|
const apiHandlers = this.getHandlerInfos(moduleInfos);
|
|
188
|
-
(0,
|
|
258
|
+
(0, _utils2.debug)('apiHandlers', apiHandlers.length, apiHandlers);
|
|
189
259
|
return apiHandlers;
|
|
190
260
|
}
|
|
261
|
+
/**
|
|
262
|
+
* 如果用户未传入或传入空串,默认为 /api
|
|
263
|
+
* 如果传入 /,则 prefix 为 /
|
|
264
|
+
*/
|
|
265
|
+
|
|
266
|
+
|
|
191
267
|
initPrefix(prefix) {
|
|
192
|
-
if (prefix ===
|
|
193
|
-
return
|
|
268
|
+
if (prefix === '/') {
|
|
269
|
+
return '';
|
|
194
270
|
}
|
|
195
|
-
|
|
271
|
+
|
|
272
|
+
return prefix || '/api';
|
|
196
273
|
}
|
|
274
|
+
|
|
197
275
|
validateAbsolute(filename, paramsName) {
|
|
198
|
-
if (typeof filename ===
|
|
276
|
+
if (typeof filename === 'string' && !_path.default.isAbsolute(filename)) {
|
|
199
277
|
throw new Error(`The ${paramsName} ${filename} is not a abolute path`);
|
|
200
278
|
}
|
|
201
279
|
}
|
|
280
|
+
|
|
202
281
|
getModuleInfos(filenames) {
|
|
203
|
-
return filenames.map(
|
|
282
|
+
return filenames.map(filename => this.getModuleInfo(filename)).filter(moduleInfo => Boolean(moduleInfo));
|
|
204
283
|
}
|
|
284
|
+
|
|
205
285
|
getModuleInfo(filename) {
|
|
206
286
|
try {
|
|
207
|
-
const
|
|
287
|
+
const module = (0, _utils3.requireHandlerModule)(filename);
|
|
208
288
|
return {
|
|
209
289
|
filename,
|
|
210
|
-
module
|
|
290
|
+
module
|
|
211
291
|
};
|
|
212
292
|
} catch (err) {
|
|
213
|
-
if (process.env.NODE_ENV ===
|
|
293
|
+
if (process.env.NODE_ENV === 'production') {
|
|
214
294
|
throw err;
|
|
215
295
|
} else {
|
|
216
296
|
console.error(err);
|
|
@@ -218,39 +298,48 @@ class ApiRouter {
|
|
|
218
298
|
}
|
|
219
299
|
}
|
|
220
300
|
}
|
|
301
|
+
|
|
221
302
|
getHandlerInfos(moduleInfos) {
|
|
222
303
|
let apiHandlers = [];
|
|
223
|
-
moduleInfos.forEach(
|
|
304
|
+
moduleInfos.forEach(moduleInfo => {
|
|
224
305
|
const handlerInfos = this.getModuleHandlerInfos(moduleInfo);
|
|
306
|
+
|
|
225
307
|
if (handlerInfos) {
|
|
226
308
|
apiHandlers = apiHandlers.concat(handlerInfos);
|
|
227
309
|
}
|
|
228
310
|
});
|
|
229
|
-
const sortedHandlers = (0,
|
|
311
|
+
const sortedHandlers = (0, _utils3.sortRoutes)(apiHandlers);
|
|
230
312
|
return sortedHandlers;
|
|
231
313
|
}
|
|
314
|
+
|
|
232
315
|
getModuleHandlerInfos(moduleInfo) {
|
|
233
|
-
const {
|
|
234
|
-
|
|
235
|
-
|
|
316
|
+
const {
|
|
317
|
+
module,
|
|
318
|
+
filename
|
|
319
|
+
} = moduleInfo;
|
|
320
|
+
return Object.entries(module).filter(([, handler]) => typeof handler === 'function').map(([key]) => {
|
|
321
|
+
const handler = module[key];
|
|
236
322
|
const handlerInfo = this.getHandlerInfo(filename, key, handler);
|
|
237
323
|
return handlerInfo;
|
|
238
|
-
}).filter(
|
|
324
|
+
}).filter(handlerInfo => Boolean(handlerInfo));
|
|
239
325
|
}
|
|
326
|
+
|
|
240
327
|
validateValidApifile(filename) {
|
|
241
328
|
if (!this.apiFiles.includes(filename)) {
|
|
242
329
|
throw new Error(`The ${filename} is not a valid api file.`);
|
|
243
330
|
}
|
|
244
331
|
}
|
|
332
|
+
|
|
245
333
|
getRoutePath(prefix, routeName) {
|
|
246
|
-
const finalRouteName = routeName ===
|
|
247
|
-
|
|
248
|
-
|
|
334
|
+
const finalRouteName = routeName === '/' ? '' : routeName;
|
|
335
|
+
|
|
336
|
+
if (prefix === '' && finalRouteName === '') {
|
|
337
|
+
return '/';
|
|
249
338
|
}
|
|
339
|
+
|
|
250
340
|
return `${prefix}${finalRouteName}`;
|
|
251
341
|
}
|
|
342
|
+
|
|
252
343
|
}
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
ApiRouter
|
|
256
|
-
});
|
|
344
|
+
|
|
345
|
+
exports.ApiRouter = ApiRouter;
|
|
@@ -1,15 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
7
|
-
for (let key of __getOwnPropNames(from))
|
|
8
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
9
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
10
|
-
}
|
|
11
|
-
return to;
|
|
12
|
-
};
|
|
13
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
14
|
-
var types_exports = {};
|
|
15
|
-
module.exports = __toCommonJS(types_exports);
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
@@ -1,116 +1,123 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
-
var __export = (target, all) => {
|
|
8
|
-
for (var name in all)
|
|
9
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
-
};
|
|
11
|
-
var __copyProps = (to, from, except, desc) => {
|
|
12
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
-
for (let key of __getOwnPropNames(from))
|
|
14
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
-
}
|
|
17
|
-
return to;
|
|
18
|
-
};
|
|
19
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
20
|
-
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
21
|
-
mod
|
|
22
|
-
));
|
|
23
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
24
|
-
var utils_exports = {};
|
|
25
|
-
__export(utils_exports, {
|
|
26
|
-
getFiles: () => getFiles,
|
|
27
|
-
getPathFromFilename: () => getPathFromFilename,
|
|
28
|
-
isHandler: () => isHandler,
|
|
29
|
-
requireHandlerModule: () => requireHandlerModule,
|
|
30
|
-
sortRoutes: () => sortRoutes
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
31
5
|
});
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
var
|
|
35
|
-
|
|
36
|
-
|
|
6
|
+
exports.sortRoutes = exports.requireHandlerModule = exports.isHandler = exports.getPathFromFilename = exports.getFiles = void 0;
|
|
7
|
+
|
|
8
|
+
var _path = _interopRequireDefault(require("path"));
|
|
9
|
+
|
|
10
|
+
var _utils = require("@modern-js/utils");
|
|
11
|
+
|
|
12
|
+
var _constants = require("./constants");
|
|
13
|
+
|
|
14
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
15
|
+
|
|
16
|
+
const getFiles = (lambdaDir, rules) => _utils.globby.sync(rules, {
|
|
37
17
|
cwd: lambdaDir,
|
|
38
18
|
gitignore: true
|
|
39
|
-
}).map(
|
|
19
|
+
}).map(file => _path.default.resolve(lambdaDir, file));
|
|
20
|
+
|
|
21
|
+
exports.getFiles = getFiles;
|
|
22
|
+
|
|
40
23
|
const getPathFromFilename = (baseDir, filename) => {
|
|
41
24
|
const relativeName = filename.substring(baseDir.length);
|
|
42
|
-
const relativePath = relativeName.split(
|
|
43
|
-
const nameSplit = relativePath.split(
|
|
25
|
+
const relativePath = relativeName.split('.').slice(0, -1).join('.');
|
|
26
|
+
const nameSplit = relativePath.split(_path.default.sep).map(item => {
|
|
44
27
|
if (item.length > 2) {
|
|
45
|
-
if (item.startsWith(
|
|
28
|
+
if (item.startsWith('[') && item.endsWith(']')) {
|
|
46
29
|
return `:${item.substring(1, item.length - 1)}`;
|
|
47
30
|
}
|
|
48
31
|
}
|
|
32
|
+
|
|
49
33
|
return item;
|
|
50
34
|
});
|
|
51
|
-
const name = nameSplit.join(
|
|
52
|
-
const finalName = name.endsWith(
|
|
35
|
+
const name = nameSplit.join('/');
|
|
36
|
+
const finalName = name.endsWith(_constants.INDEX_SUFFIX) ? name.substring(0, name.length - _constants.INDEX_SUFFIX.length) : name;
|
|
53
37
|
return clearRouteName(finalName);
|
|
54
38
|
};
|
|
55
|
-
|
|
39
|
+
|
|
40
|
+
exports.getPathFromFilename = getPathFromFilename;
|
|
41
|
+
|
|
42
|
+
const clearRouteName = routeName => {
|
|
56
43
|
let finalRouteName = routeName.trim();
|
|
57
|
-
|
|
44
|
+
|
|
45
|
+
if (!finalRouteName.startsWith('/')) {
|
|
58
46
|
finalRouteName = `/${finalRouteName}`;
|
|
59
47
|
}
|
|
60
|
-
|
|
48
|
+
|
|
49
|
+
if (finalRouteName.length > 1 && finalRouteName.endsWith('/')) {
|
|
61
50
|
finalRouteName = finalRouteName.substring(0, finalRouteName.length - 1);
|
|
62
51
|
}
|
|
52
|
+
|
|
63
53
|
return finalRouteName;
|
|
64
54
|
};
|
|
65
|
-
|
|
66
|
-
const
|
|
55
|
+
|
|
56
|
+
const isHandler = input => input && typeof input === 'function';
|
|
57
|
+
|
|
58
|
+
exports.isHandler = isHandler;
|
|
59
|
+
|
|
60
|
+
const enableRegister = requireFn => {
|
|
61
|
+
// esbuild-register 做 unRegister 时,不会删除 register 添加的 require.extensions,导致第二次调用时 require.extensions['.ts'] 是 nodejs 默认 loader
|
|
62
|
+
// 所以这里根据第一次调用时,require.extensions 有没有,来判断是否需要使用 esbuild-register
|
|
67
63
|
let existTsLoader = false;
|
|
68
64
|
let firstCall = true;
|
|
69
|
-
return
|
|
65
|
+
return modulePath => {
|
|
70
66
|
if (firstCall) {
|
|
71
|
-
|
|
67
|
+
// eslint-disable-next-line node/no-deprecated-api
|
|
68
|
+
existTsLoader = Boolean(require.extensions['.ts']);
|
|
72
69
|
firstCall = false;
|
|
73
70
|
}
|
|
71
|
+
|
|
74
72
|
if (!existTsLoader) {
|
|
75
73
|
const {
|
|
76
74
|
register
|
|
77
|
-
} = require(
|
|
78
|
-
|
|
79
|
-
|
|
75
|
+
} = require('esbuild-register/dist/node');
|
|
76
|
+
|
|
77
|
+
const {
|
|
78
|
+
unregister
|
|
79
|
+
} = register({
|
|
80
|
+
extensions: ['.ts']
|
|
80
81
|
});
|
|
81
|
-
const
|
|
82
|
+
const requiredModule = requireFn(modulePath);
|
|
82
83
|
unregister();
|
|
83
|
-
return
|
|
84
|
+
return requiredModule;
|
|
84
85
|
}
|
|
86
|
+
|
|
85
87
|
const requiredModule = requireFn(modulePath);
|
|
86
88
|
return requiredModule;
|
|
87
89
|
};
|
|
88
90
|
};
|
|
89
|
-
|
|
90
|
-
const
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
91
|
+
|
|
92
|
+
const isFunction = input => input && {}.toString.call(input) === '[object Function]';
|
|
93
|
+
|
|
94
|
+
const requireHandlerModule = enableRegister(modulePath => {
|
|
95
|
+
// 测试环境不走缓存,因为缓存的 h andler 文件,会被 mockAPI 函数进行 mock,升级 jest28,setupFilesAfterEnv 能做异步操作的话,可解此问题
|
|
96
|
+
const originRequire = process.env.NODE_ENV === 'test' ? jest.requireActual : require;
|
|
97
|
+
const module = originRequire(modulePath);
|
|
98
|
+
|
|
99
|
+
if (isFunction(module)) {
|
|
100
|
+
return {
|
|
101
|
+
default: module
|
|
102
|
+
};
|
|
95
103
|
}
|
|
96
|
-
|
|
104
|
+
|
|
105
|
+
return module;
|
|
97
106
|
});
|
|
98
|
-
|
|
99
|
-
|
|
107
|
+
exports.requireHandlerModule = requireHandlerModule;
|
|
108
|
+
|
|
109
|
+
const routeValue = routePath => {
|
|
110
|
+
if (routePath.includes(':')) {
|
|
100
111
|
return 11;
|
|
101
112
|
}
|
|
113
|
+
|
|
102
114
|
return 1;
|
|
103
115
|
};
|
|
104
|
-
|
|
116
|
+
|
|
117
|
+
const sortRoutes = apiHandlers => {
|
|
105
118
|
return apiHandlers.sort((handlerA, handlerB) => {
|
|
106
119
|
return routeValue(handlerA.routeName) - routeValue(handlerB.routeName);
|
|
107
120
|
});
|
|
108
121
|
};
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
getFiles,
|
|
112
|
-
getPathFromFilename,
|
|
113
|
-
isHandler,
|
|
114
|
-
requireHandlerModule,
|
|
115
|
-
sortRoutes
|
|
116
|
-
});
|
|
122
|
+
|
|
123
|
+
exports.sortRoutes = sortRoutes;
|