evaengine 1.0.14 → 3.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 (202) hide show
  1. package/README.md +15 -7
  2. package/bin/engine +2 -31
  3. package/dist/bin.d.ts +1 -0
  4. package/dist/bin.js +32 -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 +131 -0
  22. package/dist/di.js +197 -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 +466 -0
  32. package/dist/exceptions/index.js.map +1 -0
  33. package/dist/index.d.ts +41 -0
  34. package/dist/index.js +43 -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 +5 -0
  52. package/dist/middlewares/session.js +46 -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 +68 -0
  64. package/dist/services/cache.js +206 -0
  65. package/dist/services/cache.js.map +1 -0
  66. package/dist/services/config.d.ts +17 -0
  67. package/dist/services/config.js +67 -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 +30 -0
  73. package/dist/services/event_manager.js +74 -0
  74. package/dist/services/event_manager.js.map +1 -0
  75. package/dist/services/http_client.d.ts +67 -0
  76. package/dist/services/http_client.js +61 -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 +25 -0
  88. package/dist/services/jwt_token.js +76 -0
  89. package/dist/services/jwt_token.js.map +1 -0
  90. package/dist/services/jwt_token_kong.d.ts +26 -0
  91. package/dist/services/jwt_token_kong.js +64 -0
  92. package/dist/services/jwt_token_kong.js.map +1 -0
  93. package/dist/services/logger.d.ts +31 -0
  94. package/dist/services/logger.js +125 -0
  95. package/dist/services/logger.js.map +1 -0
  96. package/dist/services/namespace.d.ts +62 -0
  97. package/dist/services/namespace.js +171 -0
  98. package/dist/services/namespace.js.map +1 -0
  99. package/dist/services/now.d.ts +15 -0
  100. package/dist/services/now.js +42 -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 +19 -0
  106. package/dist/services/redis.js +52 -0
  107. package/dist/services/redis.js.map +1 -0
  108. package/dist/services/rest_client.d.ts +49 -0
  109. package/dist/services/rest_client.js +95 -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 +30 -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/jwt.d.ts +16 -0
  138. package/dist/utils/jwt.js +93 -0
  139. package/dist/utils/jwt.js.map +1 -0
  140. package/dist/utils/pagination.d.ts +150 -0
  141. package/dist/utils/pagination.js +242 -0
  142. package/dist/utils/pagination.js.map +1 -0
  143. package/dist/utils/random.d.ts +3 -0
  144. package/dist/utils/random.js +18 -0
  145. package/dist/utils/random.js.map +1 -0
  146. package/dist/utils/request_client.d.ts +33 -0
  147. package/dist/utils/request_client.js +153 -0
  148. package/dist/utils/request_client.js.map +1 -0
  149. package/dist/utils/smart_query.d.ts +144 -0
  150. package/dist/utils/smart_query.js +310 -0
  151. package/dist/utils/smart_query.js.map +1 -0
  152. package/dist/utils/test.d.ts +14 -0
  153. package/dist/utils/test.js +37 -0
  154. package/dist/utils/test.js.map +1 -0
  155. package/dist/utils/wrapper.d.ts +3 -0
  156. package/dist/utils/wrapper.js +5 -0
  157. package/dist/utils/wrapper.js.map +1 -0
  158. package/package.json +22 -15
  159. package/index.js +0 -2
  160. package/src/commands/interface.js +0 -45
  161. package/src/commands/make_entity.js +0 -490
  162. package/src/commands/tramp.js +0 -34
  163. package/src/config/index.js +0 -95
  164. package/src/di.js +0 -96
  165. package/src/engine.js +0 -556
  166. package/src/entities/index.js +0 -272
  167. package/src/exceptions/index.js +0 -501
  168. package/src/index.js +0 -55
  169. package/src/middlewares/auth.js +0 -67
  170. package/src/middlewares/auth_kong.js +0 -28
  171. package/src/middlewares/debug.js +0 -88
  172. package/src/middlewares/providers.js +0 -73
  173. package/src/middlewares/session.js +0 -63
  174. package/src/middlewares/trace.js +0 -254
  175. package/src/middlewares/validator.js +0 -50
  176. package/src/middlewares/view_cache.js +0 -127
  177. package/src/services/cache.js +0 -223
  178. package/src/services/config.js +0 -115
  179. package/src/services/env.js +0 -28
  180. package/src/services/event_manager.js +0 -84
  181. package/src/services/http_client.js +0 -69
  182. package/src/services/jwt_token.js +0 -89
  183. package/src/services/jwt_token_kong.js +0 -75
  184. package/src/services/logger.js +0 -150
  185. package/src/services/namespace.js +0 -176
  186. package/src/services/now.js +0 -49
  187. package/src/services/providers.js +0 -158
  188. package/src/services/redis.js +0 -63
  189. package/src/services/rest_client.js +0 -112
  190. package/src/swagger/index.js +0 -665
  191. package/src/utils/api_scaffold.js +0 -240
  192. package/src/utils/case_converter.js +0 -33
  193. package/src/utils/crc32.js +0 -44
  194. package/src/utils/cron.js +0 -208
  195. package/src/utils/datetime.js +0 -13
  196. package/src/utils/host.js +0 -39
  197. package/src/utils/pagination.js +0 -260
  198. package/src/utils/random.js +0 -23
  199. package/src/utils/request_client.js +0 -179
  200. package/src/utils/smart_query.js +0 -352
  201. package/src/utils/test.js +0 -48
  202. package/src/utils/wrapper.js +0 -8
@@ -0,0 +1,18 @@
1
+ import type { Request } from 'express';
2
+ /**
3
+ * getHostFullUrl 只读取 protocol/originalUrl/headers.host/get;
4
+ * 用最小结构类型兼容真实 express Request 与测试用的 duck-typed mock
5
+ */
6
+ type HostUrlRequest = {
7
+ protocol: string;
8
+ originalUrl: string;
9
+ headers?: {
10
+ host?: string | undefined;
11
+ };
12
+ get(name: string): string | undefined;
13
+ };
14
+ export declare const getHostFullUrl: (req: HostUrlRequest, url?: string) => string;
15
+ export declare const getHostIp: () => string;
16
+ export declare const getHostPort: (req: Request) => number | string;
17
+ export declare const getClientIp: (req: Request) => string | undefined;
18
+ export {};
@@ -0,0 +1,33 @@
1
+ import os from 'os';
2
+ export const getHostFullUrl = (req, url) => {
3
+ const { protocol, originalUrl } = req;
4
+ const host = req.headers && req.headers.host ? req.headers.host : req.get('host');
5
+ return `${protocol}://${host}${url || originalUrl}`;
6
+ };
7
+ export const getHostIp = () => {
8
+ const ifaces = os.networkInterfaces();
9
+ const addresses = [];
10
+ Object.keys(ifaces).forEach((ifname) => {
11
+ ifaces[ifname].forEach((iface) => {
12
+ if (iface.family !== 'IPv4' || iface.internal !== false) {
13
+ // skip over internal (i.e. 127.0.0.1) and non-ipv4 addresses
14
+ return;
15
+ }
16
+ addresses.push(iface.address);
17
+ });
18
+ });
19
+ return addresses.length > 0 ? addresses[0] : '127.0.0.1';
20
+ };
21
+ export const getHostPort = (req) => {
22
+ if (!req.headers || !req.headers.host) {
23
+ return -1;
24
+ }
25
+ const [, port] = req.headers.host.split(':');
26
+ return port || -1;
27
+ };
28
+ export const getClientIp = (req) => req.headers['x-forwarded-for'] ||
29
+ req.connection.remoteAddress ||
30
+ req.socket.remoteAddress ||
31
+ // 原实现访问 connection.socket(Socket 上不存在该属性),不可达时按原样抛 TypeError,不做可选链
32
+ req.connection.socket.remoteAddress;
33
+ //# sourceMappingURL=host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/utils/host.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAcpB,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,GAAmB,EAAE,GAAY,EAAU,EAAE;IAC1E,MAAM,EACJ,QAAQ,EACR,WAAW,EACZ,GAAG,GAAG,CAAC;IACR,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAClF,OAAO,GAAG,QAAQ,MAAM,IAAI,GAAG,GAAG,IAAI,WAAW,EAAE,CAAC;AACtD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,GAAW,EAAE;IACpC,MAAM,MAAM,GAAG,EAAE,CAAC,iBAAiB,EAAE,CAAC;IACtC,MAAM,SAAS,GAAa,EAAE,CAAC;IAE/B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;QACrC,MAAM,CAAC,MAAM,CAAE,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YAChC,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,IAAI,KAAK,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;gBACxD,6DAA6D;gBAC7D,OAAO;YACT,CAAC;YACD,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,OAAO,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;AAC3D,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,GAAY,EAAmB,EAAE;IAC3D,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QACtC,OAAO,CAAC,CAAC,CAAC;IACZ,CAAC;IACD,MAAM,CAAC,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7C,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC;AACpB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,GAAY,EAAsB,EAAE,CAC/D,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAwB;IACtD,GAAG,CAAC,UAAU,CAAC,aAAa;IAC5B,GAAG,CAAC,MAAM,CAAC,aAAa;IACxB,mEAAmE;IAClE,GAAG,CAAC,UAAgE,CAAC,MAAM,CAAC,aAAa,CAAC"}
@@ -6,30 +6,6 @@ import crc32 from './crc32.js';
6
6
  import { randomNumber, randomString } from './random.js';
7
7
  import { toCamelCase, toSnakeCase } from './case_converter.js';
8
8
  import { getHostFullUrl, getHostIp, getHostPort, getClientIp } from './host.js';
9
- import {
10
- getTimestamp, getMilliTimestamp,
11
- getMicroTimestamp, getDatabaseDatetime
12
- } from './datetime.js';
9
+ import { getTimestamp, getMilliTimestamp, getMicroTimestamp, getDatabaseDatetime } from './datetime.js';
13
10
  import * as apiScaffold from './api_scaffold.js';
14
-
15
- export {
16
- apiScaffold,
17
- crc32,
18
- getHostFullUrl,
19
- getHostIp,
20
- getHostPort,
21
- getClientIp,
22
- getTimestamp,
23
- getMilliTimestamp,
24
- getMicroTimestamp,
25
- getDatabaseDatetime,
26
- merge,
27
- pagination,
28
- paginationFilter,
29
- randomNumber,
30
- randomString,
31
- test,
32
- toCamelCase,
33
- toSnakeCase,
34
- wrapper
35
- };
11
+ export { apiScaffold, crc32, getHostFullUrl, getHostIp, getHostPort, getClientIp, getTimestamp, getMilliTimestamp, getMicroTimestamp, getDatabaseDatetime, merge, pagination, paginationFilter, randomNumber, randomString, test, toCamelCase, toSnakeCase, wrapper };
@@ -0,0 +1,12 @@
1
+ import merge from 'lodash/merge.js';
2
+ import wrapper from "./wrapper.js";
3
+ import * as test from "./test.js";
4
+ import { pagination, paginationFilter } from "./pagination.js";
5
+ import crc32 from "./crc32.js";
6
+ import { randomNumber, randomString } from "./random.js";
7
+ import { toCamelCase, toSnakeCase } from "./case_converter.js";
8
+ import { getHostFullUrl, getHostIp, getHostPort, getClientIp } from "./host.js";
9
+ import { getTimestamp, getMilliTimestamp, getMicroTimestamp, getDatabaseDatetime } from "./datetime.js";
10
+ import * as apiScaffold from "./api_scaffold.js";
11
+ export { apiScaffold, crc32, getHostFullUrl, getHostIp, getHostPort, getClientIp, getTimestamp, getMilliTimestamp, getMicroTimestamp, getDatabaseDatetime, merge, pagination, paginationFilter, randomNumber, randomString, test, toCamelCase, toSnakeCase, wrapper };
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,iBAAiB,CAAC;AACpC,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAChF,OAAO,EACL,YAAY,EAAE,iBAAiB,EAC/B,iBAAiB,EAAE,mBAAmB,EACvC,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,WAAW,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EACL,WAAW,EACX,KAAK,EACL,cAAc,EACd,SAAS,EACT,WAAW,EACX,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,KAAK,EACL,UAAU,EACV,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACZ,IAAI,EACJ,WAAW,EACX,WAAW,EACX,OAAO,EACR,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * jwt-simple 的内联替代:与 jwt-simple 0.5.6 保持相同的行为面,包括
3
+ * 由 token header 的 alg 决定验证算法、nbf/exp 秒级时间戳检查和错误消息;
4
+ * 唯一的差异是 HMAC 签名比较使用 timingSafeEqual(结果语义不变)。
5
+ * RS256 仅支持验证,与 jwt-simple 相同。
6
+ */
7
+ declare const algorithmMap: {
8
+ readonly HS256: "sha256";
9
+ readonly HS384: "sha384";
10
+ readonly HS512: "sha512";
11
+ readonly RS256: "RSA-SHA256";
12
+ };
13
+ type Algorithm = keyof typeof algorithmMap;
14
+ export declare function encode(payload: object, key: string, algorithm?: Algorithm): string;
15
+ export declare function decode(token: string, key: string): object;
16
+ export {};
@@ -0,0 +1,93 @@
1
+ import crypto from 'node:crypto';
2
+ /**
3
+ * jwt-simple 的内联替代:与 jwt-simple 0.5.6 保持相同的行为面,包括
4
+ * 由 token header 的 alg 决定验证算法、nbf/exp 秒级时间戳检查和错误消息;
5
+ * 唯一的差异是 HMAC 签名比较使用 timingSafeEqual(结果语义不变)。
6
+ * RS256 仅支持验证,与 jwt-simple 相同。
7
+ */
8
+ const algorithmMap = {
9
+ HS256: 'sha256',
10
+ HS384: 'sha384',
11
+ HS512: 'sha512',
12
+ RS256: 'RSA-SHA256'
13
+ };
14
+ const typeMap = {
15
+ HS256: 'hmac',
16
+ HS384: 'hmac',
17
+ HS512: 'hmac',
18
+ RS256: 'sign'
19
+ };
20
+ export function encode(payload, key, algorithm = 'HS256') {
21
+ if (!key) {
22
+ throw new Error('Require key');
23
+ }
24
+ const signingMethod = algorithmMap[algorithm];
25
+ const signingType = typeMap[algorithm];
26
+ if (!signingMethod || !signingType) {
27
+ throw new Error('Algorithm not supported');
28
+ }
29
+ // header 键序固定为 typ, alg,保证对相同 payload/key 生成的 token 与 jwt-simple 字节一致
30
+ const header = { typ: 'JWT', alg: algorithm };
31
+ const segments = [
32
+ base64urlEncode(JSON.stringify(header)),
33
+ base64urlEncode(JSON.stringify(payload))
34
+ ];
35
+ segments.push(sign(segments.join('.'), key, signingMethod, signingType));
36
+ return segments.join('.');
37
+ }
38
+ export function decode(token, key) {
39
+ // check token
40
+ if (!token) {
41
+ throw new Error('No token supplied');
42
+ }
43
+ // check segments
44
+ const segments = token.split('.');
45
+ if (segments.length !== 3) {
46
+ throw new Error('Not enough or too many segments');
47
+ }
48
+ const [headerSeg, payloadSeg, signatureSeg] = segments;
49
+ const header = JSON.parse(base64urlDecode(headerSeg));
50
+ const payload = JSON.parse(base64urlDecode(payloadSeg));
51
+ // 与 jwt-simple 一致:PEM 公钥按 RS256 验证,否则以 header.alg 决定验证算法
52
+ const algorithm = /BEGIN( RSA)? PUBLIC KEY/.test(String(key)) ? 'RS256' : header.alg;
53
+ const signingMethod = algorithm ? algorithmMap[algorithm] : undefined;
54
+ const signingType = algorithm ? typeMap[algorithm] : undefined;
55
+ if (!signingMethod || !signingType) {
56
+ throw new Error('Algorithm not supported');
57
+ }
58
+ // verify signature
59
+ const signingInput = `${headerSeg}.${payloadSeg}`;
60
+ if (!verify(signingInput, key, signingMethod, signingType, signatureSeg)) {
61
+ throw new Error('Signature verification failed');
62
+ }
63
+ // Support for nbf and exp claims.
64
+ // According to the RFC, they should be in seconds.
65
+ if (payload.nbf && Date.now() < payload.nbf * 1000) {
66
+ throw new Error('Token not yet active');
67
+ }
68
+ if (payload.exp && Date.now() > payload.exp * 1000) {
69
+ throw new Error('Token expired');
70
+ }
71
+ return payload;
72
+ }
73
+ function sign(input, key, method, type) {
74
+ if (type === 'hmac') {
75
+ return crypto.createHmac(method, key).update(input).digest('base64url');
76
+ }
77
+ return crypto.createSign(method).update(input).sign(key, 'base64url');
78
+ }
79
+ function verify(input, key, method, type, signature) {
80
+ if (type === 'hmac') {
81
+ const expected = Buffer.from(sign(input, key, method, type));
82
+ const provided = Buffer.from(signature);
83
+ return expected.length === provided.length && crypto.timingSafeEqual(expected, provided);
84
+ }
85
+ return crypto.createVerify(method).update(input).verify(key, signature, 'base64url');
86
+ }
87
+ function base64urlEncode(str) {
88
+ return Buffer.from(str, 'utf8').toString('base64url');
89
+ }
90
+ function base64urlDecode(str) {
91
+ return Buffer.from(str, 'base64url').toString('utf8');
92
+ }
93
+ //# sourceMappingURL=jwt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt.js","sourceRoot":"","sources":["../../src/utils/jwt.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC;;;;;GAKG;AAEH,MAAM,YAAY,GAAG;IACnB,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,YAAY;CACX,CAAC;AAEX,MAAM,OAAO,GAAG;IACd,KAAK,EAAE,MAAM;IACb,KAAK,EAAE,MAAM;IACb,KAAK,EAAE,MAAM;IACb,KAAK,EAAE,MAAM;CACL,CAAC;AAMX,MAAM,UAAU,MAAM,CAAC,OAAe,EAAE,GAAW,EAAE,YAAuB,OAAO;IACjF,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,aAAa,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IAC9C,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IACvC,IAAI,CAAC,aAAa,IAAI,CAAC,WAAW,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;IAED,sEAAsE;IACtE,MAAM,MAAM,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;IAC9C,MAAM,QAAQ,GAAG;QACf,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACvC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;KACzC,CAAC;IACF,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC;IAEzE,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,KAAa,EAAE,GAAW;IAC/C,cAAc;IACd,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACvC,CAAC;IACD,iBAAiB;IACjB,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,CAAC,SAAS,EAAE,UAAU,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC;IACvD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,SAAS,CAAC,CAAwB,CAAC;IAC7E,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,UAAU,CAAC,CAAmC,CAAC;IAE1F,yDAAyD;IACzD,MAAM,SAAS,GACb,yBAAyB,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;IACrE,MAAM,aAAa,GAAG,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACtE,MAAM,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/D,IAAI,CAAC,aAAa,IAAI,CAAC,WAAW,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;IAED,mBAAmB;IACnB,MAAM,YAAY,GAAG,GAAG,SAAS,IAAI,UAAU,EAAE,CAAC;IAClD,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,GAAG,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,CAAC,EAAE,CAAC;QACzE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACnD,CAAC;IAED,kCAAkC;IAClC,mDAAmD;IACnD,IAAI,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC;QACnD,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC;QACnD,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;IACnC,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,IAAI,CAAC,KAAa,EAAE,GAAW,EAAE,MAAqB,EAAE,IAAiB;IAChF,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,OAAO,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,MAAM,CAAC,KAAa,EAAE,GAAW,EAAE,MAAqB,EAAE,IAAiB,EAAE,SAAiB;IACrG,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;QAC7D,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACxC,OAAO,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,IAAI,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC3F,CAAC;IACD,OAAO,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;AACvF,CAAC;AAED,SAAS,eAAe,CAAC,GAAW;IAClC,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,eAAe,CAAC,GAAW;IAClC,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACxD,CAAC"}
@@ -0,0 +1,150 @@
1
+ /**
2
+ * pagination 的 req 只使用 protocol/baseUrl/path/query/get,
3
+ * 用最小结构类型同时兼容真实 express Request 与测试用的 duck-typed mock
4
+ */
5
+ type PaginationRequest = {
6
+ protocol: string;
7
+ baseUrl: string;
8
+ path: string;
9
+ query: Record<string, unknown>;
10
+ get(name: string): string | undefined;
11
+ };
12
+ /**
13
+ @swagger
14
+ PaginationSnake:
15
+ type: object
16
+ properties:
17
+ total:
18
+ type: integer
19
+ description: 总数据量
20
+ offset:
21
+ type: integer
22
+ description: 偏移量
23
+ limit:
24
+ type: integer
25
+ description: 单页数据量
26
+ prev:
27
+ type: integer
28
+ description: 上页偏移量
29
+ next:
30
+ type: integer
31
+ description: 下页偏移量
32
+ prev_uri:
33
+ type: string
34
+ description: 上页Uri
35
+ next_uri:
36
+ type: string
37
+ description: 下页Uri
38
+ is_first:
39
+ type: boolean
40
+ description: 是否为首页
41
+ is_last:
42
+ type: boolean
43
+ description: 是否为末页
44
+ first_uri:
45
+ type: string
46
+ description: 首页Uri
47
+ last_uri:
48
+ type: string
49
+ description: 末页Uri
50
+ required:
51
+ - total
52
+ - offset
53
+ - limit
54
+ - prev
55
+ - next
56
+ - prev_uri
57
+ - next_uri
58
+ - is_first
59
+ - is_last
60
+ - first_uri
61
+ - last_uri
62
+ example:
63
+ total: 100
64
+ offset: 30
65
+ limit: 15
66
+ prev: 15
67
+ next: 45
68
+ prev_uri: http://localhost/v1/posts?offset=15&limit=15
69
+ next_uri: http://localhost/v1/posts?offset=30&limit=15
70
+ is_first: false
71
+ is_last: false
72
+ first_uri: http://localhost/v1/posts?offset=0&limit=15
73
+ last_uri: http://localhost/v1/posts?offset=90&limit=15
74
+ @swagger
75
+ Pagination:
76
+ type: object
77
+ properties:
78
+ total:
79
+ type: integer
80
+ description: 总数据量
81
+ offset:
82
+ type: integer
83
+ description: 偏移量
84
+ limit:
85
+ type: integer
86
+ description: 单页数据量
87
+ prev:
88
+ type: integer
89
+ description: 上页偏移量
90
+ next:
91
+ type: integer
92
+ description: 下页偏移量
93
+ prevUri:
94
+ type: string
95
+ description: 上页Uri
96
+ nextUri:
97
+ type: string
98
+ description: 下页Uri
99
+ isFirst:
100
+ type: boolean
101
+ description: 是否为首页
102
+ isLast:
103
+ type: boolean
104
+ description: 是否为末页
105
+ firstUri:
106
+ type: string
107
+ description: 首页Uri
108
+ lastUri:
109
+ type: string
110
+ description: 末页Uri
111
+ required:
112
+ - total
113
+ - offset
114
+ - limit
115
+ - prev
116
+ - next
117
+ - prevUri
118
+ - nextUri
119
+ - isFirst
120
+ - isLast
121
+ - firstUri
122
+ - lastUri
123
+ example:
124
+ total: 100
125
+ offset: 30
126
+ limit: 15
127
+ prev: 15
128
+ next: 45
129
+ prevUri: http://localhost/v1/posts?offset=15&limit=15
130
+ nextUri: http://localhost/v1/posts?offset=30&limit=15
131
+ isFirst: false
132
+ isLast: false
133
+ firstUri: http://localhost/v1/posts?offset=0&limit=15
134
+ lastUri: http://localhost/v1/posts?offset=90&limit=15
135
+ */
136
+ export declare const pagination: ({ total, limit, offset, req, snakeCase: useSnake }: {
137
+ total: unknown;
138
+ limit: unknown;
139
+ offset: unknown;
140
+ req: PaginationRequest;
141
+ snakeCase?: boolean;
142
+ }) => Record<string, unknown>;
143
+ export declare const paginationFilter: ({ offset, limit }: {
144
+ offset?: unknown;
145
+ limit?: unknown;
146
+ }, defaultLimit?: number, maxLimit?: number) => {
147
+ offset: number;
148
+ limit: number;
149
+ };
150
+ export {};
@@ -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"}