evaengine 1.0.13 → 2.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 (199) hide show
  1. package/README.md +15 -1
  2. package/bin/engine +2 -31
  3. package/dist/bin.d.ts +1 -0
  4. package/dist/bin.js +40 -0
  5. package/dist/bin.js.map +1 -0
  6. package/{src/commands/index.js → dist/commands/index.d.ts} +1 -8
  7. package/dist/commands/index.js +6 -0
  8. package/dist/commands/index.js.map +1 -0
  9. package/dist/commands/interface.d.ts +18 -0
  10. package/dist/commands/interface.js +40 -0
  11. package/dist/commands/interface.js.map +1 -0
  12. package/dist/commands/make_entity.d.ts +47 -0
  13. package/dist/commands/make_entity.js +410 -0
  14. package/dist/commands/make_entity.js.map +1 -0
  15. package/dist/commands/tramp.d.ts +7 -0
  16. package/dist/commands/tramp.js +29 -0
  17. package/dist/commands/tramp.js.map +1 -0
  18. package/dist/config/index.d.ts +92 -0
  19. package/dist/config/index.js +96 -0
  20. package/dist/config/index.js.map +1 -0
  21. package/dist/di.d.ts +73 -0
  22. package/dist/di.js +76 -0
  23. package/dist/di.js.map +1 -0
  24. package/dist/engine.d.ts +85 -0
  25. package/dist/engine.js +404 -0
  26. package/dist/engine.js.map +1 -0
  27. package/dist/entities/index.d.ts +54 -0
  28. package/dist/entities/index.js +228 -0
  29. package/dist/entities/index.js.map +1 -0
  30. package/dist/exceptions/index.d.ts +153 -0
  31. package/dist/exceptions/index.js +439 -0
  32. package/dist/exceptions/index.js.map +1 -0
  33. package/dist/index.d.ts +45 -0
  34. package/dist/index.js +45 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/middlewares/auth.d.ts +5 -0
  37. package/dist/middlewares/auth.js +63 -0
  38. package/dist/middlewares/auth.js.map +1 -0
  39. package/dist/middlewares/auth_kong.d.ts +2 -0
  40. package/dist/middlewares/auth_kong.js +24 -0
  41. package/dist/middlewares/auth_kong.js.map +1 -0
  42. package/dist/middlewares/debug.d.ts +3 -0
  43. package/dist/middlewares/debug.js +50 -0
  44. package/dist/middlewares/debug.js.map +1 -0
  45. package/{src/middlewares/index.js → dist/middlewares/index.d.ts} +1 -11
  46. package/dist/middlewares/index.js +9 -0
  47. package/dist/middlewares/index.js.map +1 -0
  48. package/dist/middlewares/providers.d.ts +25 -0
  49. package/dist/middlewares/providers.js +63 -0
  50. package/dist/middlewares/providers.js.map +1 -0
  51. package/dist/middlewares/session.d.ts +6 -0
  52. package/dist/middlewares/session.js +51 -0
  53. package/dist/middlewares/session.js.map +1 -0
  54. package/dist/middlewares/trace.d.ts +52 -0
  55. package/dist/middlewares/trace.js +225 -0
  56. package/dist/middlewares/trace.js.map +1 -0
  57. package/dist/middlewares/validator.d.ts +10 -0
  58. package/dist/middlewares/validator.js +43 -0
  59. package/dist/middlewares/validator.js.map +1 -0
  60. package/dist/middlewares/view_cache.d.ts +14 -0
  61. package/dist/middlewares/view_cache.js +102 -0
  62. package/dist/middlewares/view_cache.js.map +1 -0
  63. package/dist/services/cache.d.ts +66 -0
  64. package/dist/services/cache.js +207 -0
  65. package/dist/services/cache.js.map +1 -0
  66. package/dist/services/config.d.ts +25 -0
  67. package/dist/services/config.js +88 -0
  68. package/dist/services/config.js.map +1 -0
  69. package/dist/services/env.d.ts +12 -0
  70. package/dist/services/env.js +24 -0
  71. package/dist/services/env.js.map +1 -0
  72. package/dist/services/event_manager.d.ts +29 -0
  73. package/dist/services/event_manager.js +75 -0
  74. package/dist/services/event_manager.js.map +1 -0
  75. package/dist/services/http_client.d.ts +66 -0
  76. package/dist/services/http_client.js +62 -0
  77. package/dist/services/http_client.js.map +1 -0
  78. package/{src/services/index.js → dist/services/index.d.ts} +1 -15
  79. package/dist/services/index.js +14 -0
  80. package/dist/services/index.js.map +1 -0
  81. package/{src/services/interface.js → dist/services/interface.d.ts} +1 -3
  82. package/dist/services/interface.js +6 -0
  83. package/dist/services/interface.js.map +1 -0
  84. package/{src/services/joi.js → dist/services/joi.d.ts} +2 -9
  85. package/dist/services/joi.js +11 -0
  86. package/dist/services/joi.js.map +1 -0
  87. package/dist/services/jwt_token.d.ts +24 -0
  88. package/dist/services/jwt_token.js +77 -0
  89. package/dist/services/jwt_token.js.map +1 -0
  90. package/dist/services/jwt_token_kong.d.ts +25 -0
  91. package/dist/services/jwt_token_kong.js +65 -0
  92. package/dist/services/jwt_token_kong.js.map +1 -0
  93. package/dist/services/logger.d.ts +30 -0
  94. package/dist/services/logger.js +126 -0
  95. package/dist/services/logger.js.map +1 -0
  96. package/dist/services/namespace.d.ts +55 -0
  97. package/dist/services/namespace.js +157 -0
  98. package/dist/services/namespace.js.map +1 -0
  99. package/dist/services/now.d.ts +14 -0
  100. package/dist/services/now.js +43 -0
  101. package/dist/services/now.js.map +1 -0
  102. package/dist/services/providers.d.ts +55 -0
  103. package/dist/services/providers.js +134 -0
  104. package/dist/services/providers.js.map +1 -0
  105. package/dist/services/redis.d.ts +18 -0
  106. package/dist/services/redis.js +53 -0
  107. package/dist/services/redis.js.map +1 -0
  108. package/dist/services/rest_client.d.ts +48 -0
  109. package/dist/services/rest_client.js +96 -0
  110. package/dist/services/rest_client.js.map +1 -0
  111. package/dist/swagger/index.d.ts +223 -0
  112. package/dist/swagger/index.js +564 -0
  113. package/dist/swagger/index.js.map +1 -0
  114. package/dist/types/express.d.ts +14 -0
  115. package/dist/types/vendor.d.ts +102 -0
  116. package/dist/utils/api_scaffold.d.ts +74 -0
  117. package/dist/utils/api_scaffold.js +220 -0
  118. package/dist/utils/api_scaffold.js.map +1 -0
  119. package/dist/utils/case_converter.d.ts +7 -0
  120. package/dist/utils/case_converter.js +29 -0
  121. package/dist/utils/case_converter.js.map +1 -0
  122. package/dist/utils/crc32.d.ts +2 -0
  123. package/dist/utils/crc32.js +43 -0
  124. package/dist/utils/crc32.js.map +1 -0
  125. package/dist/utils/cron.d.ts +27 -0
  126. package/dist/utils/cron.js +186 -0
  127. package/dist/utils/cron.js.map +1 -0
  128. package/dist/utils/datetime.d.ts +4 -0
  129. package/dist/utils/datetime.js +6 -0
  130. package/dist/utils/datetime.js.map +1 -0
  131. package/dist/utils/host.d.ts +18 -0
  132. package/dist/utils/host.js +33 -0
  133. package/dist/utils/host.js.map +1 -0
  134. package/{src/utils/index.js → dist/utils/index.d.ts} +2 -26
  135. package/dist/utils/index.js +12 -0
  136. package/dist/utils/index.js.map +1 -0
  137. package/dist/utils/pagination.d.ts +150 -0
  138. package/dist/utils/pagination.js +242 -0
  139. package/dist/utils/pagination.js.map +1 -0
  140. package/dist/utils/random.d.ts +3 -0
  141. package/dist/utils/random.js +18 -0
  142. package/dist/utils/random.js.map +1 -0
  143. package/dist/utils/request_client.d.ts +33 -0
  144. package/dist/utils/request_client.js +153 -0
  145. package/dist/utils/request_client.js.map +1 -0
  146. package/dist/utils/smart_query.d.ts +144 -0
  147. package/dist/utils/smart_query.js +310 -0
  148. package/dist/utils/smart_query.js.map +1 -0
  149. package/dist/utils/test.d.ts +14 -0
  150. package/dist/utils/test.js +37 -0
  151. package/dist/utils/test.js.map +1 -0
  152. package/dist/utils/wrapper.d.ts +3 -0
  153. package/dist/utils/wrapper.js +5 -0
  154. package/dist/utils/wrapper.js.map +1 -0
  155. package/package.json +27 -11
  156. package/index.js +0 -2
  157. package/src/commands/interface.js +0 -45
  158. package/src/commands/make_entity.js +0 -490
  159. package/src/commands/tramp.js +0 -34
  160. package/src/config/index.js +0 -95
  161. package/src/di.js +0 -96
  162. package/src/engine.js +0 -556
  163. package/src/entities/index.js +0 -272
  164. package/src/exceptions/index.js +0 -501
  165. package/src/index.js +0 -55
  166. package/src/middlewares/auth.js +0 -67
  167. package/src/middlewares/auth_kong.js +0 -28
  168. package/src/middlewares/debug.js +0 -88
  169. package/src/middlewares/providers.js +0 -73
  170. package/src/middlewares/session.js +0 -63
  171. package/src/middlewares/trace.js +0 -254
  172. package/src/middlewares/validator.js +0 -50
  173. package/src/middlewares/view_cache.js +0 -127
  174. package/src/services/cache.js +0 -223
  175. package/src/services/config.js +0 -115
  176. package/src/services/env.js +0 -28
  177. package/src/services/event_manager.js +0 -84
  178. package/src/services/http_client.js +0 -69
  179. package/src/services/jwt_token.js +0 -89
  180. package/src/services/jwt_token_kong.js +0 -75
  181. package/src/services/logger.js +0 -150
  182. package/src/services/namespace.js +0 -176
  183. package/src/services/now.js +0 -49
  184. package/src/services/providers.js +0 -158
  185. package/src/services/redis.js +0 -63
  186. package/src/services/rest_client.js +0 -112
  187. package/src/swagger/index.js +0 -665
  188. package/src/utils/api_scaffold.js +0 -240
  189. package/src/utils/case_converter.js +0 -33
  190. package/src/utils/crc32.js +0 -44
  191. package/src/utils/cron.js +0 -208
  192. package/src/utils/datetime.js +0 -13
  193. package/src/utils/host.js +0 -39
  194. package/src/utils/pagination.js +0 -260
  195. package/src/utils/random.js +0 -23
  196. package/src/utils/request_client.js +0 -179
  197. package/src/utils/smart_query.js +0 -352
  198. package/src/utils/test.js +0 -48
  199. package/src/utils/wrapper.js +0 -8
@@ -0,0 +1,242 @@
1
+ import snakeCase from 'lodash/snakeCase.js';
2
+ import transform from 'lodash/transform.js';
3
+ import nodePath from 'path';
4
+ const toUrl = (scheme, host, path, query = {}) => {
5
+ let queryString = Object.keys(query)
6
+ .map(key => `${key}=${query[key]}`)
7
+ .join('&');
8
+ queryString = queryString === '' ? '' : `?${queryString}`;
9
+ return `${scheme}://${host}${path}${queryString}`;
10
+ };
11
+ const toPaginationUrl = (query, req) => {
12
+ // 与原实现一致:host 缺失时由 split 直接抛 TypeError
13
+ const hostInfo = req.get('host').split(':');
14
+ let scheme = req.protocol;
15
+ let host = hostInfo[0];
16
+ let port = hostInfo[1];
17
+ if (!port) {
18
+ port = req.protocol === 'https' ? 443 : 80;
19
+ }
20
+ let requestPath = req.baseUrl;
21
+ if (req.get('x-forwarded-port')) {
22
+ port = req.get('x-forwarded-port');
23
+ }
24
+ if (req.get('x-forwarded-host')) {
25
+ host = req.get('x-forwarded-host');
26
+ }
27
+ if (req.get('x-forwarded-proto')) {
28
+ scheme = req.get('x-forwarded-proto');
29
+ }
30
+ if (req.get('x-forwarded-prefix')) {
31
+ requestPath = nodePath.join(req.get('x-forwarded-prefix'), requestPath, req.path);
32
+ }
33
+ if ((scheme === 'http' && String(port) !== '80')
34
+ || (scheme === 'https' && String(port) !== '443')) {
35
+ host = `${host}:${port}`;
36
+ }
37
+ return toUrl(scheme, host, requestPath, Object.assign({}, req.query, query));
38
+ };
39
+ const toPositiveInteger = (number) => {
40
+ // 入参可能为任意运行时类型,parseInt 的隐式转字符串行为保持不变
41
+ const integer = parseInt(number, 10);
42
+ return integer >= 0 ? integer : 0;
43
+ };
44
+ const transferProperties = (obj, useSnake = false) => {
45
+ if (useSnake === true) {
46
+ return transform(obj, (result, value, key) => {
47
+ result[snakeCase(key)] = value;
48
+ });
49
+ }
50
+ return obj;
51
+ };
52
+ //@formatter:off
53
+ /**
54
+ @swagger
55
+ PaginationSnake:
56
+ type: object
57
+ properties:
58
+ total:
59
+ type: integer
60
+ description: 总数据量
61
+ offset:
62
+ type: integer
63
+ description: 偏移量
64
+ limit:
65
+ type: integer
66
+ description: 单页数据量
67
+ prev:
68
+ type: integer
69
+ description: 上页偏移量
70
+ next:
71
+ type: integer
72
+ description: 下页偏移量
73
+ prev_uri:
74
+ type: string
75
+ description: 上页Uri
76
+ next_uri:
77
+ type: string
78
+ description: 下页Uri
79
+ is_first:
80
+ type: boolean
81
+ description: 是否为首页
82
+ is_last:
83
+ type: boolean
84
+ description: 是否为末页
85
+ first_uri:
86
+ type: string
87
+ description: 首页Uri
88
+ last_uri:
89
+ type: string
90
+ description: 末页Uri
91
+ required:
92
+ - total
93
+ - offset
94
+ - limit
95
+ - prev
96
+ - next
97
+ - prev_uri
98
+ - next_uri
99
+ - is_first
100
+ - is_last
101
+ - first_uri
102
+ - last_uri
103
+ example:
104
+ total: 100
105
+ offset: 30
106
+ limit: 15
107
+ prev: 15
108
+ next: 45
109
+ prev_uri: http://localhost/v1/posts?offset=15&limit=15
110
+ next_uri: http://localhost/v1/posts?offset=30&limit=15
111
+ is_first: false
112
+ is_last: false
113
+ first_uri: http://localhost/v1/posts?offset=0&limit=15
114
+ last_uri: http://localhost/v1/posts?offset=90&limit=15
115
+ @swagger
116
+ Pagination:
117
+ type: object
118
+ properties:
119
+ total:
120
+ type: integer
121
+ description: 总数据量
122
+ offset:
123
+ type: integer
124
+ description: 偏移量
125
+ limit:
126
+ type: integer
127
+ description: 单页数据量
128
+ prev:
129
+ type: integer
130
+ description: 上页偏移量
131
+ next:
132
+ type: integer
133
+ description: 下页偏移量
134
+ prevUri:
135
+ type: string
136
+ description: 上页Uri
137
+ nextUri:
138
+ type: string
139
+ description: 下页Uri
140
+ isFirst:
141
+ type: boolean
142
+ description: 是否为首页
143
+ isLast:
144
+ type: boolean
145
+ description: 是否为末页
146
+ firstUri:
147
+ type: string
148
+ description: 首页Uri
149
+ lastUri:
150
+ type: string
151
+ description: 末页Uri
152
+ required:
153
+ - total
154
+ - offset
155
+ - limit
156
+ - prev
157
+ - next
158
+ - prevUri
159
+ - nextUri
160
+ - isFirst
161
+ - isLast
162
+ - firstUri
163
+ - lastUri
164
+ example:
165
+ total: 100
166
+ offset: 30
167
+ limit: 15
168
+ prev: 15
169
+ next: 45
170
+ prevUri: http://localhost/v1/posts?offset=15&limit=15
171
+ nextUri: http://localhost/v1/posts?offset=30&limit=15
172
+ isFirst: false
173
+ isLast: false
174
+ firstUri: http://localhost/v1/posts?offset=0&limit=15
175
+ lastUri: http://localhost/v1/posts?offset=90&limit=15
176
+ */
177
+ //@formatter:on
178
+ export const pagination = ({ total, limit, offset, req, snakeCase: useSnake }) => {
179
+ const totalNumber = toPositiveInteger(total);
180
+ let offsetNumber = parseInt(offset, 10);
181
+ offsetNumber = Number.isNaN(offsetNumber) ? 0 : offsetNumber;
182
+ let limitNumber = toPositiveInteger(limit);
183
+ limitNumber = limitNumber < 1 ? 1 : limitNumber;
184
+ const prev = offsetNumber - limitNumber;
185
+ const next = offsetNumber + limitNumber;
186
+ let prevUri = '';
187
+ let nextUri = '';
188
+ let firstUri = '';
189
+ let lastUri = '';
190
+ // total/limit/offset 运行时可能为任意类型;比较与减法沿用 JS 的数值强制转换语义
191
+ if (Number(total) < 1) {
192
+ return transferProperties({
193
+ total: totalNumber,
194
+ offset: offsetNumber,
195
+ limit: limitNumber,
196
+ isFirst: true,
197
+ isLast: true,
198
+ prev,
199
+ next,
200
+ prevUri,
201
+ nextUri,
202
+ firstUri,
203
+ lastUri
204
+ }, useSnake);
205
+ }
206
+ const isFirst = Number(offset) <= 0;
207
+ // 加法保留原始 JS 语义(字符串入参时会拼接),仅用类型断言满足编译
208
+ const isLast = offset + limit >= total;
209
+ const lastOffset = (total - offset) % limit;
210
+ const last = lastOffset === 0 ? total - limit : total - lastOffset;
211
+ prevUri = isFirst ? prevUri : toPaginationUrl({ offset: prev, limit: limitNumber }, req);
212
+ nextUri = isLast ? nextUri : toPaginationUrl({ offset: next, limit: limitNumber }, req);
213
+ firstUri = toPaginationUrl({ offset: 0, limit: limitNumber }, req);
214
+ lastUri = toPaginationUrl({ offset: last, limit: limitNumber }, req);
215
+ return transferProperties({
216
+ total: totalNumber,
217
+ offset: offsetNumber,
218
+ limit: limitNumber,
219
+ prev,
220
+ next,
221
+ isFirst,
222
+ isLast,
223
+ prevUri,
224
+ nextUri,
225
+ firstUri,
226
+ lastUri
227
+ }, useSnake);
228
+ };
229
+ export const paginationFilter = ({ offset, limit }, defaultLimit = 15, maxLimit = 100) => {
230
+ //Solve offset is negative
231
+ let offsetNumber = Number.parseInt(offset, 10);
232
+ offsetNumber = Number.isNaN(offsetNumber) ? 0 : offsetNumber;
233
+ let limitNumber = toPositiveInteger(limit);
234
+ limitNumber = limitNumber < 1 ? defaultLimit : limitNumber;
235
+ if (offsetNumber < 0) {
236
+ limitNumber += (offsetNumber % limitNumber);
237
+ offsetNumber = 0;
238
+ }
239
+ limitNumber = maxLimit > 0 && limitNumber > maxLimit ? maxLimit : limitNumber;
240
+ return { offset: offsetNumber, limit: limitNumber };
241
+ };
242
+ //# sourceMappingURL=pagination.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../src/utils/pagination.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ declare const randomString: (len?: number) => string;
2
+ declare const randomNumber: (min: number, max?: number) => number;
3
+ export { randomNumber, randomString };
@@ -0,0 +1,18 @@
1
+ import random from 'lodash/random.js';
2
+ const randomString = (len = 16) => {
3
+ const digits = '0123456789abcdefghijklmnopqrstuvwxyz';
4
+ let str = '';
5
+ for (let i = 0; i < len; i += 1) {
6
+ const rand = random(0, digits.length - 1);
7
+ str += digits[rand];
8
+ }
9
+ return str;
10
+ };
11
+ const randomNumber = (min, max) => {
12
+ if (max) {
13
+ return parseInt(String((Math.random() * ((max - min) + 1)) + min), 10);
14
+ }
15
+ return parseInt(String((Math.random() * min) + 1), 10);
16
+ };
17
+ export { randomNumber, randomString };
18
+ //# sourceMappingURL=random.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"random.js","sourceRoot":"","sources":["../../src/utils/random.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,kBAAkB,CAAC;AAEtC,MAAM,YAAY,GAAG,CAAC,GAAG,GAAG,EAAE,EAAU,EAAE;IACxC,MAAM,MAAM,GAAG,sCAAsC,CAAC;IACtD,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC1C,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,GAAW,EAAE,GAAY,EAAU,EAAE;IACzD,IAAI,GAAG,EAAE,CAAC;QACR,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACzD,CAAC,CAAC;AAEF,OAAO,EACL,YAAY,EACZ,YAAY,EACb,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * A request-promise-native compatible HTTP client built on the global fetch.
3
+ *
4
+ * Keeps the option object and error shape used by the legacy `request`
5
+ * ecosystem so callers of HttpClient/RestClient see no interface change:
6
+ * - resolves with the response body (or the full response with
7
+ * `resolveWithFullResponse`)
8
+ * - rejects with an error carrying `.name` (`StatusCodeError`/`RequestError`),
9
+ * `.statusCode`, `.response` and `.request`
10
+ * - supports `url`, `method`, `headers`, `body`, `json`, `qs`, `form`,
11
+ * `formData`, `simple`, `resolveWithFullResponse` and `timeout`
12
+ */
13
+ type RequestClientParams = {
14
+ url?: string;
15
+ method?: string;
16
+ headers?: Record<string, unknown>;
17
+ body?: unknown;
18
+ json?: unknown;
19
+ qs?: Record<string, unknown> | string;
20
+ form?: Record<string, unknown>;
21
+ formData?: Record<string, unknown>;
22
+ simple?: boolean;
23
+ resolveWithFullResponse?: boolean;
24
+ timeout?: number;
25
+ };
26
+ /**
27
+ * Create a request-promise-native compatible callable client.
28
+ * @param [logger] when given, verbose request/response logs are emitted
29
+ */
30
+ export declare const createRequestClient: (logger?: {
31
+ verbose: (message: string, ...args: unknown[]) => void;
32
+ } | null) => (params?: RequestClientParams) => Promise<unknown>;
33
+ export {};
@@ -0,0 +1,153 @@
1
+ /**
2
+ * A request-promise-native compatible HTTP client built on the global fetch.
3
+ *
4
+ * Keeps the option object and error shape used by the legacy `request`
5
+ * ecosystem so callers of HttpClient/RestClient see no interface change:
6
+ * - resolves with the response body (or the full response with
7
+ * `resolveWithFullResponse`)
8
+ * - rejects with an error carrying `.name` (`StatusCodeError`/`RequestError`),
9
+ * `.statusCode`, `.response` and `.request`
10
+ * - supports `url`, `method`, `headers`, `body`, `json`, `qs`, `form`,
11
+ * `formData`, `simple`, `resolveWithFullResponse` and `timeout`
12
+ */
13
+ const MAX_BODY_LENGTH = parseInt(process.env.MAX_REQUEST_DEBUG_BODY, 10) || 3000;
14
+ const TOO_LONG_BODY = '____TLDR____';
15
+ let debugId = 0;
16
+ const toPlainHeaders = (headers = {}) => {
17
+ const result = {};
18
+ Object.entries(headers).forEach(([key, value]) => {
19
+ result[key] = String(value);
20
+ });
21
+ return result;
22
+ };
23
+ const buildQueryString = (qs) => {
24
+ if (qs === undefined || qs === null) {
25
+ return '';
26
+ }
27
+ if (typeof qs === 'string') {
28
+ return qs.startsWith('?') ? qs : `?${qs}`;
29
+ }
30
+ return `?${new URLSearchParams(qs).toString()}`;
31
+ };
32
+ const buildBody = (params) => {
33
+ if (params.formData) {
34
+ const form = new FormData();
35
+ Object.entries(params.formData).forEach(([key, value]) => {
36
+ // FormData.append 运行时按 WebIDL 语义转换非字符串值,断言仅满足编译
37
+ form.append(key, value);
38
+ });
39
+ return { body: form, contentType: null };
40
+ }
41
+ if (params.form) {
42
+ return {
43
+ body: new URLSearchParams(params.form).toString(),
44
+ contentType: 'application/x-www-form-urlencoded'
45
+ };
46
+ }
47
+ //The legacy `json` option also accepts a value used as the JSON body
48
+ if (params.json !== undefined && params.json !== false && params.json !== true) {
49
+ return { body: JSON.stringify(params.json), contentType: 'application/json' };
50
+ }
51
+ if (params.json === true && params.body !== undefined) {
52
+ return { body: JSON.stringify(params.body), contentType: 'application/json' };
53
+ }
54
+ return { body: params.body, contentType: null };
55
+ };
56
+ const truncateBody = (body) => {
57
+ if (typeof body !== 'string') {
58
+ return body ? String(body) : '';
59
+ }
60
+ return body.length > MAX_BODY_LENGTH ? TOO_LONG_BODY : body;
61
+ };
62
+ /**
63
+ * Create a request-promise-native compatible callable client.
64
+ * @param [logger] when given, verbose request/response logs are emitted
65
+ */
66
+ export const createRequestClient = (logger) => {
67
+ const request = (params = {}) => new Promise((resolve, reject) => {
68
+ const { url, method: rawMethod = 'GET', headers = {}, resolveWithFullResponse = false, simple = true, timeout = 0, qs } = params;
69
+ const method = String(rawMethod).toUpperCase();
70
+ const targetUrl = `${url}${buildQueryString(qs)}`;
71
+ const { body, contentType } = buildBody(params);
72
+ const requestHeaders = toPlainHeaders(headers);
73
+ if (contentType
74
+ && !Object.keys(requestHeaders).some(key => key.toLowerCase() === 'content-type')) {
75
+ requestHeaders['Content-Type'] = contentType;
76
+ }
77
+ const abortController = new AbortController();
78
+ const timer = timeout > 0
79
+ ? setTimeout(() => abortController.abort(new Error('Request timed out')), timeout)
80
+ : null;
81
+ const requestForDump = {
82
+ method,
83
+ uri: {
84
+ protocol: new URL(targetUrl).protocol,
85
+ href: targetUrl
86
+ },
87
+ headers: requestHeaders,
88
+ req: {},
89
+ _json: params.json !== undefined && params.json !== false
90
+ ? true : body !== undefined,
91
+ formData: params.formData || null,
92
+ body: params.formData
93
+ ? new URLSearchParams(params.formData).toString()
94
+ : body
95
+ };
96
+ const id = ++debugId;
97
+ if (logger) {
98
+ logger.verbose('[HTTP_REQUEST_%s] [%s %s] [REQ_HEADERS: %s] [REQ_BODY: %s]', id, method, targetUrl, JSON.stringify(requestHeaders), truncateBody(body));
99
+ }
100
+ fetch(targetUrl, {
101
+ method,
102
+ headers: requestHeaders,
103
+ body,
104
+ signal: abortController.signal,
105
+ redirect: 'follow'
106
+ }).then(async (response) => {
107
+ if (timer) {
108
+ clearTimeout(timer);
109
+ }
110
+ const rawBody = await response.text();
111
+ let parsedBody = rawBody;
112
+ if (params.json !== undefined && params.json !== false) {
113
+ try {
114
+ parsedBody = JSON.parse(rawBody);
115
+ }
116
+ catch {
117
+ parsedBody = rawBody;
118
+ }
119
+ }
120
+ const responseForDump = {
121
+ statusCode: response.status,
122
+ statusMessage: response.statusText,
123
+ headers: toPlainHeaders(Object.fromEntries(response.headers.entries())),
124
+ body: parsedBody,
125
+ request: requestForDump
126
+ };
127
+ if (logger) {
128
+ logger.verbose('[HTTP_RESPONSE_%s] [%s %s] [%s] [RES_HEADERS: %s] [RES_BODY: %s]', id, method, targetUrl, response.status, JSON.stringify(responseForDump.headers), truncateBody(parsedBody));
129
+ }
130
+ if (response.status >= 400 && simple) {
131
+ const error = new Error(`Response status ${response.status}`);
132
+ error.name = 'StatusCodeError';
133
+ error.statusCode = response.status;
134
+ error.response = responseForDump;
135
+ error.request = requestForDump;
136
+ reject(error);
137
+ return;
138
+ }
139
+ resolve(resolveWithFullResponse ? responseForDump : parsedBody);
140
+ }).catch((err) => {
141
+ if (timer) {
142
+ clearTimeout(timer);
143
+ }
144
+ // 与原实现一致:非 Error 值时 err.message 为 undefined,new Error(undefined) 的语义保持不变
145
+ const error = new Error(err.message);
146
+ error.name = 'RequestError';
147
+ error.request = requestForDump;
148
+ reject(error);
149
+ });
150
+ });
151
+ return request;
152
+ };
153
+ //# sourceMappingURL=request_client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request_client.js","sourceRoot":"","sources":["../../src/utils/request_client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAgDH,MAAM,eAAe,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAgC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC;AAC3F,MAAM,aAAa,GAAG,cAAc,CAAC;AAErC,IAAI,OAAO,GAAG,CAAC,CAAC;AAEhB,MAAM,cAAc,GAAG,CAAC,UAAmC,EAAE,EAA0B,EAAE;IACvF,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QAC/C,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,EAAqC,EAAU,EAAE;IAAI,IAAI,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;QACjH,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,OAAO,EAAE,KAAK,QAAQ,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;IAC5C,CAAC;IACD,OAAO,IAAI,IAAI,eAAe,CAAC,EAA4B,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;AAC5E,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,MAA2B,EAA8D,EAAE;IAC5G,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,MAAM,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC5B,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;YACvD,gDAAgD;YAChD,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,KAAsB,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QACH,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IAC3C,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,OAAO;YACL,IAAI,EAAE,IAAI,eAAe,CAAC,MAAM,CAAC,IAA8B,CAAC,CAAC,QAAQ,EAAE;YAC3E,WAAW,EAAE,mCAAmC;SACjD,CAAC;IACJ,CAAC;IACD,qEAAqE;IACrE,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QAC/E,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC;IAChF,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACtD,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC;IAChF,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAA4B,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AAC1E,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,IAAa,EAAU,EAAE;IAC7C,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAClC,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9D,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,MAA0E,EAAE,EAAE;IAChH,MAAM,OAAO,GAAG,CAAC,SAA8B,EAAE,EAAoB,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACtG,MAAM,EACJ,GAAG,EACH,MAAM,EAAE,SAAS,GAAG,KAAK,EACzB,OAAO,GAAG,EAAE,EACZ,uBAAuB,GAAG,KAAK,EAC/B,MAAM,GAAG,IAAI,EACb,OAAO,GAAG,CAAC,EACX,EAAE,EACH,GAAG,MAAM,CAAC;QAEX,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;QAC/C,MAAM,SAAS,GAAG,GAAG,GAAG,GAAG,gBAAgB,CAAC,EAAE,CAAC,EAAE,CAAC;QAClD,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;QAEhD,MAAM,cAAc,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;QAC/C,IAAI,WAAW;eACV,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,cAAc,CAAC,EAAE,CAAC;YACpF,cAAc,CAAC,cAAc,CAAC,GAAG,WAAW,CAAC;QAC/C,CAAC;QAED,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;QAC9C,MAAM,KAAK,GAAG,OAAO,GAAG,CAAC;YACvB,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,EAAE,OAAO,CAAC;YAClF,CAAC,CAAC,IAAI,CAAC;QAET,MAAM,cAAc,GAAmB;YACrC,MAAM;YACN,GAAG,EAAE;gBACH,QAAQ,EAAE,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,QAAQ;gBACrC,IAAI,EAAE,SAAS;aAChB;YACD,OAAO,EAAE,cAAc;YACvB,GAAG,EAAE,EAAE;YACP,KAAK,EAAE,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK;gBACvD,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS;YAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,IAAI;YACjC,IAAI,EAAE,MAAM,CAAC,QAAQ;gBACnB,CAAC,CAAC,IAAI,eAAe,CAAC,MAAM,CAAC,QAAkC,CAAC,CAAC,QAAQ,EAAE;gBAC3E,CAAC,CAAC,IAAI;SACT,CAAC;QAEF,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC;QACrB,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,OAAO,CAAC,4DAA4D,EAAE,EAAE,EAC7E,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3E,CAAC;QAED,KAAK,CAAC,SAAS,EAAE;YACf,MAAM;YACN,OAAO,EAAE,cAAc;YACvB,IAAI;YACJ,MAAM,EAAE,eAAe,CAAC,MAAM;YAC9B,QAAQ,EAAE,QAAQ;SACnB,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;YACzB,IAAI,KAAK,EAAE,CAAC;gBACV,YAAY,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACtC,IAAI,UAAU,GAAY,OAAO,CAAC;YAClC,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;gBACvD,IAAI,CAAC;oBACH,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACnC,CAAC;gBAAC,MAAM,CAAC;oBACP,UAAU,GAAG,OAAO,CAAC;gBACvB,CAAC;YACH,CAAC;YAED,MAAM,eAAe,GAAoB;gBACvC,UAAU,EAAE,QAAQ,CAAC,MAAM;gBAC3B,aAAa,EAAE,QAAQ,CAAC,UAAU;gBAClC,OAAO,EAAE,cAAc,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;gBACvE,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,cAAc;aACxB,CAAC;YAEF,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,CAAC,OAAO,CAAC,kEAAkE,EAAE,EAAE,EACnF,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,OAAO,CAAC,EAC3E,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC;YAC9B,CAAC;YAED,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,MAAM,EAAE,CAAC;gBACrC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,mBAAmB,QAAQ,CAAC,MAAM,EAAE,CAAuB,CAAC;gBACpF,KAAK,CAAC,IAAI,GAAG,iBAAiB,CAAC;gBAC/B,KAAK,CAAC,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC;gBACnC,KAAK,CAAC,QAAQ,GAAG,eAAe,CAAC;gBACjC,KAAK,CAAC,OAAO,GAAG,cAAc,CAAC;gBAC/B,MAAM,CAAC,KAAK,CAAC,CAAC;gBACd,OAAO;YACT,CAAC;YAED,OAAO,CAAC,uBAAuB,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;YACxB,IAAI,KAAK,EAAE,CAAC;gBACV,YAAY,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC;YACD,yEAAyE;YACzE,MAAM,KAAK,GAAG,IAAI,KAAK,CAAE,GAAa,CAAC,OAAO,CAAuB,CAAC;YACtE,KAAK,CAAC,IAAI,GAAG,cAAc,CAAC;YAC5B,KAAK,CAAC,OAAO,GAAG,cAAc,CAAC;YAC/B,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC"}
@@ -0,0 +1,144 @@
1
+ type SmartQueryWhere = Record<string, Record<PropertyKey, unknown>>;
2
+ type SmartQueryCriteria = {
3
+ order?: unknown[];
4
+ where?: SmartQueryWhere;
5
+ };
6
+ /**
7
+ * 自动根据 req.query 生成 sequelize 查询条件, 自动判断参数清单中是否有值
8
+ */
9
+ export default class SmartQuery {
10
+ query: Record<string, unknown>;
11
+ /** WHERE 查询条件 */
12
+ where: SmartQueryWhere;
13
+ /**
14
+ * 排序列表
15
+ */
16
+ order: unknown[];
17
+ constructor(query: Record<string, unknown>);
18
+ /**
19
+ * 当 query 中包含名为 paramName 的属性时,为 fieldName 添加全等查询条件
20
+ * @param paramName query 中的参数名称
21
+ * @param fieldName 对应的数据库字段名称,默认与 paramName 一致
22
+ * @param defaultValue 当 query 中不包含 paramName 或为空时,使用该值
23
+ */
24
+ equal(paramName: string, fieldName?: string, defaultValue?: unknown): this;
25
+ /**
26
+ * 当 query 中包含名为 paramName 的属性时,为 fieldName 添加 in 查询条件, 值可以为 `delimiter` 分割的字符串或者数组
27
+ * @param paramName query 中的参数名称
28
+ * @param [fieldName=paramName] 对应的数据库字段名称,默认与 paramName 一致
29
+ * @param [defaultValue=null] 当 query 中不包含 paramName 或为空时,使用该值
30
+ * @param [delimiter=,] 当值为字符串时的分隔符,默认为 ,
31
+ */
32
+ in(paramName: string, fieldName?: string, defaultValue?: unknown, delimiter?: string): this;
33
+ /**
34
+ * 当 query 中包含名为 paramName 的属性时,为 fieldName 添加 not in 查询条件, 值可以为 `delimiter` 分割的字符串或者数组
35
+ * @param paramName query 中的参数名称
36
+ * @param [fieldName=paramName] 对应的数据库字段名称,默认与 paramName 一致
37
+ * @param [defaultValue=null] 当 query 中不包含 paramName 或为空时,使用该值
38
+ * @param [delimiter=,] 当值为字符串时的分隔符,默认为 ,
39
+ */
40
+ notIn(paramName: string, fieldName?: string, defaultValue?: unknown, delimiter?: string): this;
41
+ /**
42
+ * 当 query 中包含名为 paramName 的属性时,为 fieldName 添加 LIKE 查询条件,并自动在值的头尾添加 %
43
+ * @param paramName query 中的参数名称
44
+ * @param fieldName 对应的数据库字段名称,默认与 paramName 一致
45
+ * @param defaultValue 当 query 中不包含 paramName 或为空时,使用该值
46
+ */
47
+ like(paramName: string, fieldName?: string, defaultValue?: unknown): this;
48
+ /**
49
+ * 当 query 中包含名为 paramName 的属性时,为 fieldName 添加 LIKE 查询条件,并自动在值的尾部添加 %
50
+ * @param paramName query 中的参数名称
51
+ * @param fieldName 对应的数据库字段名称,默认与 paramName 一致
52
+ * @param defaultValue 当 query 中不包含 paramName 或为空时,使用该值
53
+ */
54
+ startsWith(paramName: string, fieldName?: string, defaultValue?: unknown): this;
55
+ /**
56
+ * 当 query 中包含名为 paramName 的属性时,为 fieldName 添加 LIKE 查询条件,并自动在值的头部添加 %
57
+ * @param paramName query 中的参数名称
58
+ * @param fieldName 对应的数据库字段名称,默认与 paramName 一致
59
+ * @param defaultValue 当 query 中不包含 paramName 或为空时,使用该值
60
+ */
61
+ endsWith(paramName: string, fieldName?: string, defaultValue?: unknown): this;
62
+ /**
63
+ * 当 query 中包含名为 paramName 的属性时,为 fieldName 添加 >= 查询条件
64
+ * @param paramName query 中的参数名称
65
+ * @param fieldName 对应的数据库字段名称,默认与 paramName 一致
66
+ * @param defaultValue 当 query 中不包含 paramName 或为空时,使用该值
67
+ */
68
+ gte(paramName: string, fieldName?: string, defaultValue?: unknown): this;
69
+ /**
70
+ * 当 query 中包含名为 paramName 的属性时,为 fieldName 添加 <= 查询条件
71
+ * @param paramName query 中的参数名称
72
+ * @param fieldName 对应的数据库字段名称,默认与 paramName 一致
73
+ * @param defaultValue 当 query 中不包含 paramName 或为空时,使用该值
74
+ */
75
+ lte(paramName: string, fieldName?: string, defaultValue?: unknown): this;
76
+ /**
77
+ * 当 query 中包含名为 minParamName 的属性时,为 fieldName 添加 >= 查询条件,
78
+ * 当 query 中包含名为 maxParamName 的属性时,为 fieldName 添加 <= 查询条件
79
+ * @param minParamName query 中的最小值参数名称
80
+ * @param maxParamName query 中的最大值参数名称
81
+ * @param fieldName 对应的数据库字段名称
82
+ * @param minDefault 当 query 中不包含 minParamName 或为空时,使用该值作为默认值
83
+ * @param maxDefault 当 query 中不包含 maxParamName 或为空时,使用该值作为默认值
84
+ */
85
+ range(minParamName: string, maxParamName: string, fieldName: string, minDefault?: unknown, maxDefault?: unknown): this;
86
+ /**
87
+ * 当 query 中包含名为 minParamName 的属性时,为 fieldName 添加 >= 查询条件并将时分秒设为0格式化到 targetFormat ,
88
+ * 当 query 中包含名为 maxParamName 的属性时,为 fieldName 添加 <= 查询条件并将时分秒分别设为 23:59:59 后格式化到 targetFormat
89
+ * @param minParamName query 中的最小值参数名称
90
+ * @param maxParamName query 中的最大值参数名称
91
+ * @param fieldName 对应的数据库字段名称
92
+ * @param [minDefault=null] 当 query 中不包含 minParamName 或为空时,使用该值作为默认值
93
+ * @param [maxDefault=null] 当 query 中不包含 maxParamName 或为空时,使用该值作为默认值
94
+ * @param [sourceFormat='YYYY-MM-DD'] 原值时间格式
95
+ * @param [targetFormat='X'] 数据库时间格式
96
+ */
97
+ dateRange(minParamName: string, maxParamName: string, fieldName: string, minDefault?: string | null, maxDefault?: string | null, sourceFormat?: string, targetFormat?: string): this;
98
+ /**
99
+ * 当 query 中包含名为 minParamName 的属性时,为 fieldName 添加 >= 查询条件并格式化到 targetFormat ,
100
+ * 当 query 中包含名为 maxParamName 的属性时,为 fieldName 添加 <= 查询条件并并格式化到 targetFormat
101
+ * @param minParamName query 中的最小值参数名称
102
+ * @param maxParamName query 中的最大值参数名称
103
+ * @param fieldName 对应的数据库字段名称
104
+ * @param [minDefault=null] 当 query 中不包含 minParamName 或为空时,使用该值作为默认值
105
+ * @param [maxDefault=null] 当 query 中不包含 maxParamName 或为空时,使用该值作为默认值
106
+ * @param [sourceFormat='YYYY-MM-DD HH:mm:ss'] 原值时间格式
107
+ * @param [targetFormat='X'] 数据库时间格式
108
+ */
109
+ dateTimeRange(minParamName: string, maxParamName: string, fieldName: string, minDefault?: string | null, maxDefault?: string | null, sourceFormat?: string, targetFormat?: string): this;
110
+ /**
111
+ * 处理用户的排序请求
112
+ * @param [autoMapping=[]] 根据字段名自动排序,数组成员为字段名,每个字段名自动生成正反序,
113
+ * 如 `created_at` 生成 `created_at` 正序和 `-created_at` 倒序
114
+ * @param [manualMapping={}]
115
+ * @param [defaultOrder=null] 默认排序,当 query 中不包含 `paramName` 属性时使用。如不设置则为 `autoMapping` 的第一个字段的倒序
116
+ * @param [paramName='order'] 参数名称
117
+ */
118
+ orderable(autoMapping?: string[], manualMapping?: Record<string, unknown>, defaultOrder?: unknown, paramName?: string): this;
119
+ /**
120
+ * 获取完整的有效查询参数
121
+ */
122
+ getCriteria(): SmartQueryCriteria;
123
+ /**
124
+ * 当 query 中包含名为 paramName 的属性时,为 fieldName 添加 in 或 not in 查询条件, 值可以为 `delimiter` 分割的字符串或者数组
125
+ * @protected
126
+ * @param paramName query 中的参数名称
127
+ * @param fieldName 对应的数据库字段名称
128
+ * @param [defaultValue=null] 当 query 中不包含 paramName 或为空时,使用该值
129
+ * @param [delimiter=,] 当值为字符串时的分隔符,默认为 ,
130
+ * @param [negation=false] 是否取反,为 true 时使用 $notIn
131
+ */
132
+ applyIn(paramName: string, fieldName: string, defaultValue?: unknown, delimiter?: string, negation?: boolean): this;
133
+ /**
134
+ * 添加 where
135
+ *
136
+ * @protected
137
+ */
138
+ applyWhere(filedName: string, predicate: string, value: unknown): void;
139
+ /**
140
+ * 判定指定名称的参数是否有效
141
+ */
142
+ determineParam(paramName: string): boolean;
143
+ }
144
+ export {};