@sima-land/isomorph 11.0.0-alpha.35 → 11.0.0-alpha.37

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 (576) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +25 -0
  3. package/dist/cjs/cache/index.js +6 -0
  4. package/dist/cjs/cache/index.js.map +1 -0
  5. package/dist/cjs/cache/types.js +6 -0
  6. package/dist/cjs/cache/types.js.map +1 -0
  7. package/dist/cjs/config/base.js +22 -0
  8. package/dist/cjs/config/base.js.map +1 -0
  9. package/dist/cjs/config/index.js +20 -0
  10. package/dist/cjs/config/index.js.map +1 -0
  11. package/dist/cjs/config/source.js +25 -0
  12. package/dist/cjs/config/source.js.map +1 -0
  13. package/dist/cjs/config/types.js +6 -0
  14. package/dist/cjs/config/types.js.map +1 -0
  15. package/dist/cjs/di/application.js +106 -0
  16. package/dist/cjs/di/application.js.map +1 -0
  17. package/dist/cjs/di/container.js +55 -0
  18. package/dist/cjs/di/container.js.map +1 -0
  19. package/dist/cjs/di/errors.js +65 -0
  20. package/dist/cjs/di/errors.js.map +1 -0
  21. package/dist/cjs/di/index.js +59 -0
  22. package/dist/cjs/di/index.js.map +1 -0
  23. package/dist/cjs/di/preset.js +32 -0
  24. package/dist/cjs/di/preset.js.map +1 -0
  25. package/dist/cjs/di/token.js +44 -0
  26. package/dist/cjs/di/token.js.map +1 -0
  27. package/dist/cjs/di/types.js +6 -0
  28. package/dist/cjs/di/types.js.map +1 -0
  29. package/dist/cjs/http/errors.js +47 -0
  30. package/dist/cjs/http/errors.js.map +1 -0
  31. package/dist/cjs/http/index.js +63 -0
  32. package/dist/cjs/http/index.js.map +1 -0
  33. package/dist/cjs/http/types.js +6 -0
  34. package/dist/cjs/http/types.js.map +1 -0
  35. package/dist/cjs/log/errors.js +35 -0
  36. package/dist/cjs/log/errors.js.map +1 -0
  37. package/dist/cjs/log/handler/pino.js +31 -0
  38. package/dist/cjs/log/handler/pino.js.map +1 -0
  39. package/dist/cjs/log/handler/sentry.js +57 -0
  40. package/dist/cjs/log/handler/sentry.js.map +1 -0
  41. package/dist/cjs/log/index.js +26 -0
  42. package/dist/cjs/log/index.js.map +1 -0
  43. package/dist/cjs/log/logger.js +35 -0
  44. package/dist/cjs/log/logger.js.map +1 -0
  45. package/dist/cjs/log/types.js +6 -0
  46. package/dist/cjs/log/types.js.map +1 -0
  47. package/dist/cjs/package.json +1 -0
  48. package/dist/cjs/preset/isomorphic/constants.js +14 -0
  49. package/dist/cjs/preset/isomorphic/constants.js.map +1 -0
  50. package/dist/cjs/preset/isomorphic/providers/index.js +42 -0
  51. package/dist/cjs/preset/isomorphic/providers/index.js.map +1 -0
  52. package/dist/cjs/preset/isomorphic/types.js +6 -0
  53. package/dist/cjs/preset/isomorphic/types.js.map +1 -0
  54. package/dist/cjs/preset/isomorphic/utils/index.js +322 -0
  55. package/dist/cjs/preset/isomorphic/utils/index.js.map +1 -0
  56. package/dist/cjs/preset/node/handler/index.js +52 -0
  57. package/dist/cjs/preset/node/handler/index.js.map +1 -0
  58. package/dist/cjs/preset/node/handler/providers/index.js +212 -0
  59. package/dist/cjs/preset/node/handler/providers/index.js.map +1 -0
  60. package/dist/cjs/preset/node/handler/utils/index.js +132 -0
  61. package/dist/cjs/preset/node/handler/utils/index.js.map +1 -0
  62. package/dist/cjs/preset/node/index.js +26 -0
  63. package/dist/cjs/preset/node/index.js.map +1 -0
  64. package/dist/cjs/preset/node/node/index.js +61 -0
  65. package/dist/cjs/preset/node/node/index.js.map +1 -0
  66. package/dist/cjs/preset/node/node/providers/index.js +403 -0
  67. package/dist/cjs/preset/node/node/providers/index.js.map +1 -0
  68. package/dist/cjs/preset/node/node/utils/http-client/index.js +122 -0
  69. package/dist/cjs/preset/node/node/utils/http-client/index.js.map +1 -0
  70. package/dist/cjs/preset/node/node/utils/http-server/index.js +18 -0
  71. package/dist/cjs/preset/node/node/utils/http-server/index.js.map +1 -0
  72. package/dist/cjs/preset/node/node/utils/index.js +20 -0
  73. package/dist/cjs/preset/node/node/utils/index.js.map +1 -0
  74. package/dist/cjs/preset/web/index.js +34 -0
  75. package/dist/cjs/preset/web/index.js.map +1 -0
  76. package/dist/cjs/preset/web/providers/index.js +94 -0
  77. package/dist/cjs/preset/web/providers/index.js.map +1 -0
  78. package/dist/cjs/tokens.js +86 -0
  79. package/dist/cjs/tokens.js.map +1 -0
  80. package/dist/cjs/utils/axios/index.js +40 -0
  81. package/dist/cjs/utils/axios/index.js.map +1 -0
  82. package/dist/cjs/utils/axios/middleware/cookie.js +28 -0
  83. package/dist/cjs/utils/axios/middleware/cookie.js.map +1 -0
  84. package/dist/cjs/utils/axios/middleware/log.js +37 -0
  85. package/dist/cjs/utils/axios/middleware/log.js.map +1 -0
  86. package/dist/cjs/utils/axios/sauce/index.js +57 -0
  87. package/dist/cjs/utils/axios/sauce/index.js.map +1 -0
  88. package/dist/cjs/utils/axios/utils/index.js +30 -0
  89. package/dist/cjs/utils/axios/utils/index.js.map +1 -0
  90. package/{http-server → dist/cjs/utils/express}/handler/health-check.js +11 -7
  91. package/dist/cjs/utils/express/handler/health-check.js.map +1 -0
  92. package/dist/cjs/utils/express/index.js +20 -0
  93. package/dist/cjs/utils/express/index.js.map +1 -0
  94. package/dist/cjs/utils/express/utils/index.js +22 -0
  95. package/dist/cjs/utils/express/utils/index.js.map +1 -0
  96. package/dist/cjs/utils/function.js +44 -0
  97. package/dist/cjs/utils/function.js.map +1 -0
  98. package/dist/cjs/utils/index.js +20 -0
  99. package/dist/cjs/utils/index.js.map +1 -0
  100. package/{utils/number.js → dist/cjs/utils/math.js} +7 -5
  101. package/dist/cjs/utils/math.js.map +1 -0
  102. package/dist/cjs/utils/react/error-handlers/index.js +80 -0
  103. package/dist/cjs/utils/react/error-handlers/index.js.map +1 -0
  104. package/dist/cjs/utils/react/index.js +19 -0
  105. package/dist/cjs/utils/react/index.js.map +1 -0
  106. package/dist/cjs/utils/redux/index.js +19 -0
  107. package/dist/cjs/utils/redux/index.js.map +1 -0
  108. package/dist/cjs/utils/redux/remote-data.js +118 -0
  109. package/dist/cjs/utils/redux/remote-data.js.map +1 -0
  110. package/dist/cjs/utils/redux-saga/index.js +20 -0
  111. package/dist/cjs/utils/redux-saga/index.js.map +1 -0
  112. package/dist/cjs/utils/redux-saga/middleware.js +149 -0
  113. package/dist/cjs/utils/redux-saga/middleware.js.map +1 -0
  114. package/dist/cjs/utils/redux-saga/take-chain.js +66 -0
  115. package/dist/cjs/utils/redux-saga/take-chain.js.map +1 -0
  116. package/dist/cjs/utils/redux-saga/types.js +6 -0
  117. package/dist/cjs/utils/redux-saga/types.js.map +1 -0
  118. package/dist/cjs/utils/ssr/index.js +73 -0
  119. package/dist/cjs/utils/ssr/index.js.map +1 -0
  120. package/{utils/browser → dist/cjs/utils/web}/analytics/data-layer.js +11 -5
  121. package/dist/cjs/utils/web/analytics/data-layer.js.map +1 -0
  122. package/dist/cjs/utils/web/analytics/index.js +20 -0
  123. package/dist/cjs/utils/web/analytics/index.js.map +1 -0
  124. package/dist/cjs/utils/web/analytics/oko.js +20 -0
  125. package/dist/cjs/utils/web/analytics/oko.js.map +1 -0
  126. package/dist/cjs/utils/web/storage/index.js +75 -0
  127. package/dist/cjs/utils/web/storage/index.js.map +1 -0
  128. package/dist/cjs/utils/webpack/env/index.js +96 -0
  129. package/dist/cjs/utils/webpack/env/index.js.map +1 -0
  130. package/dist/cjs/utils/webpack/env/types.js +6 -0
  131. package/dist/cjs/utils/webpack/env/types.js.map +1 -0
  132. package/dist/cjs/utils/webpack/env/utils.js +55 -0
  133. package/dist/cjs/utils/webpack/env/utils.js.map +1 -0
  134. package/dist/cjs/utils/webpack/index.js +20 -0
  135. package/dist/cjs/utils/webpack/index.js.map +1 -0
  136. package/dist/cjs/utils/webpack/module-federation/index.js +110 -0
  137. package/dist/cjs/utils/webpack/module-federation/index.js.map +1 -0
  138. package/dist/cjs/utils/webpack/module-federation/types.js +6 -0
  139. package/dist/cjs/utils/webpack/module-federation/types.js.map +1 -0
  140. package/{utils → dist/cjs/utils}/webpack/module-federation/utils.js +26 -31
  141. package/dist/cjs/utils/webpack/module-federation/utils.js.map +1 -0
  142. package/dist/esm/cache/index.js +2 -0
  143. package/dist/esm/cache/index.js.map +1 -0
  144. package/dist/esm/cache/types.js +2 -0
  145. package/dist/esm/cache/types.js.map +1 -0
  146. package/dist/esm/config/base.js +16 -0
  147. package/dist/esm/config/base.js.map +1 -0
  148. package/dist/esm/config/index.js +3 -0
  149. package/dist/esm/config/index.js.map +1 -0
  150. package/dist/esm/config/source.js +19 -0
  151. package/dist/esm/config/source.js.map +1 -0
  152. package/dist/esm/config/types.js +2 -0
  153. package/dist/esm/config/types.js.map +1 -0
  154. package/dist/esm/di/application.js +100 -0
  155. package/dist/esm/di/application.js.map +1 -0
  156. package/dist/esm/di/container.js +49 -0
  157. package/dist/esm/di/container.js.map +1 -0
  158. package/dist/esm/di/errors.js +56 -0
  159. package/dist/esm/di/errors.js.map +1 -0
  160. package/dist/esm/di/index.js +6 -0
  161. package/dist/esm/di/index.js.map +1 -0
  162. package/dist/esm/di/preset.js +26 -0
  163. package/dist/esm/di/preset.js.map +1 -0
  164. package/dist/esm/di/token.js +38 -0
  165. package/dist/esm/di/token.js.map +1 -0
  166. package/dist/esm/di/types.js +2 -0
  167. package/dist/esm/di/types.js.map +1 -0
  168. package/dist/esm/http/errors.js +39 -0
  169. package/dist/esm/http/errors.js.map +1 -0
  170. package/dist/esm/http/index.js +4 -0
  171. package/dist/esm/http/index.js.map +1 -0
  172. package/dist/esm/http/types.js +2 -0
  173. package/dist/esm/http/types.js.map +1 -0
  174. package/dist/esm/log/errors.js +27 -0
  175. package/dist/esm/log/errors.js.map +1 -0
  176. package/dist/esm/log/handler/pino.js +25 -0
  177. package/dist/esm/log/handler/pino.js.map +1 -0
  178. package/dist/esm/log/handler/sentry.js +52 -0
  179. package/dist/esm/log/handler/sentry.js.map +1 -0
  180. package/dist/esm/log/index.js +3 -0
  181. package/dist/esm/log/index.js.map +1 -0
  182. package/dist/esm/log/logger.js +29 -0
  183. package/dist/esm/log/logger.js.map +1 -0
  184. package/dist/esm/log/types.js +2 -0
  185. package/dist/esm/log/types.js.map +1 -0
  186. package/dist/esm/package.json +1 -0
  187. package/dist/esm/preset/isomorphic/constants.js +8 -0
  188. package/dist/esm/preset/isomorphic/constants.js.map +1 -0
  189. package/dist/esm/preset/isomorphic/providers/index.js +35 -0
  190. package/dist/esm/preset/isomorphic/providers/index.js.map +1 -0
  191. package/dist/esm/preset/isomorphic/types.js +2 -0
  192. package/dist/esm/preset/isomorphic/types.js.map +1 -0
  193. package/dist/esm/preset/isomorphic/utils/index.js +309 -0
  194. package/dist/esm/preset/isomorphic/utils/index.js.map +1 -0
  195. package/dist/esm/preset/node/handler/index.js +42 -0
  196. package/dist/esm/preset/node/handler/index.js.map +1 -0
  197. package/dist/esm/preset/node/handler/providers/index.js +194 -0
  198. package/dist/esm/preset/node/handler/providers/index.js.map +1 -0
  199. package/dist/esm/preset/node/handler/utils/index.js +113 -0
  200. package/dist/esm/preset/node/handler/utils/index.js.map +1 -0
  201. package/dist/esm/preset/node/index.js +3 -0
  202. package/dist/esm/preset/node/index.js.map +1 -0
  203. package/dist/esm/preset/node/node/index.js +56 -0
  204. package/dist/esm/preset/node/node/index.js.map +1 -0
  205. package/dist/esm/preset/node/node/providers/index.js +378 -0
  206. package/dist/esm/preset/node/node/providers/index.js.map +1 -0
  207. package/dist/esm/preset/node/node/utils/http-client/index.js +114 -0
  208. package/dist/esm/preset/node/node/utils/http-client/index.js.map +1 -0
  209. package/dist/esm/preset/node/node/utils/http-server/index.js +12 -0
  210. package/dist/esm/preset/node/node/utils/http-server/index.js.map +1 -0
  211. package/dist/esm/preset/node/node/utils/index.js +3 -0
  212. package/dist/esm/preset/node/node/utils/index.js.map +1 -0
  213. package/dist/esm/preset/web/index.js +29 -0
  214. package/dist/esm/preset/web/index.js.map +1 -0
  215. package/dist/esm/preset/web/providers/index.js +85 -0
  216. package/dist/esm/preset/web/providers/index.js.map +1 -0
  217. package/dist/esm/tokens.js +81 -0
  218. package/dist/esm/tokens.js.map +1 -0
  219. package/dist/esm/utils/axios/index.js +5 -0
  220. package/dist/esm/utils/axios/index.js.map +1 -0
  221. package/dist/esm/utils/axios/middleware/cookie.js +22 -0
  222. package/dist/esm/utils/axios/middleware/cookie.js.map +1 -0
  223. package/dist/esm/utils/axios/middleware/log.js +31 -0
  224. package/dist/esm/utils/axios/middleware/log.js.map +1 -0
  225. package/dist/esm/utils/axios/sauce/index.js +50 -0
  226. package/dist/esm/utils/axios/sauce/index.js.map +1 -0
  227. package/dist/esm/utils/axios/utils/index.js +24 -0
  228. package/dist/esm/utils/axios/utils/index.js.map +1 -0
  229. package/dist/esm/utils/express/handler/health-check.js +13 -0
  230. package/dist/esm/utils/express/handler/health-check.js.map +1 -0
  231. package/dist/esm/utils/express/index.js +3 -0
  232. package/dist/esm/utils/express/index.js.map +1 -0
  233. package/dist/esm/utils/express/utils/index.js +16 -0
  234. package/dist/esm/utils/express/utils/index.js.map +1 -0
  235. package/dist/esm/utils/function.js +38 -0
  236. package/dist/esm/utils/function.js.map +1 -0
  237. package/dist/esm/utils/index.js +3 -0
  238. package/dist/esm/utils/index.js.map +1 -0
  239. package/dist/esm/utils/math.js +9 -0
  240. package/dist/esm/utils/math.js.map +1 -0
  241. package/dist/esm/utils/react/error-handlers/index.js +69 -0
  242. package/dist/esm/utils/react/error-handlers/index.js.map +1 -0
  243. package/dist/esm/utils/react/index.js +3 -0
  244. package/dist/esm/utils/react/index.js.map +1 -0
  245. package/dist/esm/utils/redux/index.js +3 -0
  246. package/dist/esm/utils/redux/index.js.map +1 -0
  247. package/dist/esm/utils/redux/remote-data.js +108 -0
  248. package/dist/esm/utils/redux/remote-data.js.map +1 -0
  249. package/dist/esm/utils/redux-saga/index.js +3 -0
  250. package/dist/esm/utils/redux-saga/index.js.map +1 -0
  251. package/dist/esm/utils/redux-saga/middleware.js +143 -0
  252. package/dist/esm/utils/redux-saga/middleware.js.map +1 -0
  253. package/dist/esm/utils/redux-saga/take-chain.js +59 -0
  254. package/dist/esm/utils/redux-saga/take-chain.js.map +1 -0
  255. package/dist/esm/utils/redux-saga/types.js +2 -0
  256. package/dist/esm/utils/redux-saga/types.js.map +1 -0
  257. package/dist/esm/utils/ssr/index.js +66 -0
  258. package/dist/esm/utils/ssr/index.js.map +1 -0
  259. package/dist/esm/utils/web/analytics/data-layer.js +14 -0
  260. package/dist/esm/utils/web/analytics/data-layer.js.map +1 -0
  261. package/dist/esm/utils/web/analytics/index.js +3 -0
  262. package/dist/esm/utils/web/analytics/index.js.map +1 -0
  263. package/dist/esm/utils/web/analytics/oko.js +14 -0
  264. package/dist/esm/utils/web/analytics/oko.js.map +1 -0
  265. package/dist/esm/utils/web/storage/index.js +69 -0
  266. package/dist/esm/utils/web/storage/index.js.map +1 -0
  267. package/dist/esm/utils/webpack/env/index.js +89 -0
  268. package/dist/esm/utils/webpack/env/index.js.map +1 -0
  269. package/dist/esm/utils/webpack/env/types.js +2 -0
  270. package/dist/esm/utils/webpack/env/types.js.map +1 -0
  271. package/dist/esm/utils/webpack/env/utils.js +48 -0
  272. package/dist/esm/utils/webpack/env/utils.js.map +1 -0
  273. package/dist/esm/utils/webpack/index.js +4 -0
  274. package/dist/esm/utils/webpack/index.js.map +1 -0
  275. package/dist/esm/utils/webpack/module-federation/index.js +96 -0
  276. package/dist/esm/utils/webpack/module-federation/index.js.map +1 -0
  277. package/dist/esm/utils/webpack/module-federation/types.js +2 -0
  278. package/dist/esm/utils/webpack/module-federation/types.js.map +1 -0
  279. package/dist/esm/utils/webpack/module-federation/utils.js +80 -0
  280. package/dist/esm/utils/webpack/module-federation/utils.js.map +1 -0
  281. package/dist/types/cache/index.d.ts +1 -0
  282. package/{http → dist/types/http}/errors.d.ts +12 -0
  283. package/{http → dist/types/http}/index.d.ts +2 -2
  284. package/dist/types/log/index.d.ts +3 -0
  285. package/dist/types/preset/isomorphic/constants.d.ts +7 -0
  286. package/dist/types/preset/isomorphic/providers/index.d.ts +22 -0
  287. package/dist/types/preset/isomorphic/types.d.ts +44 -0
  288. package/{preset/parts/utils.d.ts → dist/types/preset/isomorphic/utils/index.d.ts} +14 -6
  289. package/dist/types/preset/node/handler/index.d.ts +10 -0
  290. package/dist/types/preset/node/handler/providers/index.d.ts +35 -0
  291. package/dist/types/preset/node/handler/utils/index.d.ts +46 -0
  292. package/dist/types/preset/node/index.d.ts +2 -0
  293. package/dist/types/preset/node/node/index.d.ts +8 -0
  294. package/dist/types/preset/node/node/providers/index.d.ts +112 -0
  295. package/{http-client/middleware/tracing.d.ts → dist/types/preset/node/node/utils/http-client/index.d.ts} +9 -0
  296. package/dist/types/preset/node/node/utils/http-server/index.d.ts +7 -0
  297. package/dist/types/preset/node/node/utils/index.d.ts +2 -0
  298. package/dist/types/preset/web/index.d.ts +8 -0
  299. package/dist/types/preset/web/providers/index.d.ts +35 -0
  300. package/{tokens.d.ts → dist/types/tokens.d.ts} +11 -11
  301. package/dist/types/utils/axios/index.d.ts +4 -0
  302. package/dist/types/utils/axios/middleware/cookie.d.ts +8 -0
  303. package/{http-client → dist/types/utils/axios}/sauce/index.d.ts +1 -1
  304. package/{http-client/utils.d.ts → dist/types/utils/axios/utils/index.d.ts} +0 -7
  305. package/dist/types/utils/express/index.d.ts +2 -0
  306. package/dist/types/utils/express/utils/index.d.ts +7 -0
  307. package/dist/types/utils/index.d.ts +2 -0
  308. package/{utils → dist/types/utils}/react/error-handlers/index.d.ts +1 -1
  309. package/{utils → dist/types/utils}/redux/remote-data.d.ts +8 -8
  310. package/{utils → dist/types/utils}/ssr/index.d.ts +1 -0
  311. package/dist/types/utils/web/analytics/index.d.ts +2 -0
  312. package/dist/types/utils/web/analytics/oko.d.ts +6 -0
  313. package/{utils/browser → dist/types/utils/web}/storage/index.d.ts +1 -0
  314. package/{utils → dist/types/utils}/webpack/module-federation/index.d.ts +2 -2
  315. package/package.json +173 -14
  316. package/src/cache/index.ts +1 -0
  317. package/src/cache/types.ts +34 -0
  318. package/src/config/base.ts +18 -0
  319. package/src/config/index.ts +3 -0
  320. package/src/config/source.ts +23 -0
  321. package/src/config/types.ts +25 -0
  322. package/src/di/__test__/application.test.ts +258 -0
  323. package/src/di/__test__/container.test.ts +103 -0
  324. package/src/di/__test__/errors.test.ts +56 -0
  325. package/src/di/__test__/preset.test.ts +23 -0
  326. package/src/di/__test__/token.test.ts +25 -0
  327. package/src/di/application.ts +126 -0
  328. package/src/di/container.ts +60 -0
  329. package/src/di/errors.ts +59 -0
  330. package/src/di/index.ts +6 -0
  331. package/src/di/preset.ts +32 -0
  332. package/src/di/token.ts +41 -0
  333. package/src/di/types.ts +105 -0
  334. package/src/http/__test__/errors.test.ts +35 -0
  335. package/src/http/errors.ts +42 -0
  336. package/src/http/index.ts +14 -0
  337. package/src/http/types.ts +8 -0
  338. package/src/log/__test__/errors.test.ts +13 -0
  339. package/src/log/__test__/logger.test.ts +24 -0
  340. package/src/log/errors.ts +33 -0
  341. package/src/log/handler/pino.ts +27 -0
  342. package/src/log/handler/sentry.ts +57 -0
  343. package/src/log/index.ts +12 -0
  344. package/src/log/logger.ts +30 -0
  345. package/src/log/types.ts +76 -0
  346. package/src/preset/isomorphic/constants.ts +7 -0
  347. package/src/preset/isomorphic/providers/index.ts +40 -0
  348. package/src/preset/isomorphic/types.ts +48 -0
  349. package/src/preset/isomorphic/utils/__test__/index.test.ts +541 -0
  350. package/src/preset/isomorphic/utils/index.ts +349 -0
  351. package/src/preset/node/handler/index.ts +46 -0
  352. package/src/preset/node/handler/providers/index.tsx +214 -0
  353. package/src/preset/node/handler/utils/index.tsx +110 -0
  354. package/src/preset/node/index.ts +2 -0
  355. package/src/preset/node/node/index.ts +73 -0
  356. package/src/preset/node/node/providers/index.ts +434 -0
  357. package/src/preset/node/node/utils/http-client/__test__/index.test.ts +232 -0
  358. package/src/preset/node/node/utils/http-client/index.ts +129 -0
  359. package/src/preset/node/node/utils/http-server/index.ts +17 -0
  360. package/src/preset/node/node/utils/index.ts +2 -0
  361. package/src/preset/web/index.ts +40 -0
  362. package/src/preset/web/providers/index.ts +108 -0
  363. package/src/tokens.ts +112 -0
  364. package/src/utils/axios/index.ts +12 -0
  365. package/src/utils/axios/middleware/__test__/cookie.test.ts +94 -0
  366. package/src/utils/axios/middleware/__test__/log.test.ts +121 -0
  367. package/src/utils/axios/middleware/cookie.ts +26 -0
  368. package/src/utils/axios/middleware/log.ts +52 -0
  369. package/src/utils/axios/sauce/index.ts +76 -0
  370. package/src/utils/axios/utils/__test__/index.test.ts +89 -0
  371. package/src/utils/axios/utils/index.ts +26 -0
  372. package/src/utils/express/handler/health-check.ts +13 -0
  373. package/src/utils/express/index.ts +2 -0
  374. package/src/utils/express/utils/index.ts +18 -0
  375. package/src/utils/function.ts +57 -0
  376. package/src/utils/index.ts +2 -0
  377. package/src/utils/math.ts +8 -0
  378. package/src/utils/react/error-handlers/__test__/__snapshots__/index.test.tsx.snap +27 -0
  379. package/src/utils/react/error-handlers/__test__/index.test.tsx +63 -0
  380. package/src/utils/react/error-handlers/index.tsx +68 -0
  381. package/src/utils/react/index.ts +3 -0
  382. package/src/utils/redux/__test__/remote-data.test.ts +172 -0
  383. package/src/utils/redux/index.ts +4 -0
  384. package/src/utils/redux/remote-data.ts +138 -0
  385. package/src/utils/redux-saga/__test__/take-chain.test.ts +141 -0
  386. package/src/utils/redux-saga/index.ts +3 -0
  387. package/src/utils/redux-saga/middleware.ts +168 -0
  388. package/src/utils/redux-saga/take-chain.ts +67 -0
  389. package/src/utils/redux-saga/types.ts +43 -0
  390. package/src/utils/ssr/index.tsx +78 -0
  391. package/src/utils/web/analytics/__test__/data-layer.test.ts +50 -0
  392. package/src/utils/web/analytics/__test__/oko.test.ts +50 -0
  393. package/src/utils/web/analytics/data-layer.ts +12 -0
  394. package/src/utils/web/analytics/index.ts +2 -0
  395. package/src/utils/web/analytics/oko.ts +14 -0
  396. package/src/utils/web/storage/index.ts +84 -0
  397. package/src/utils/webpack/env/index.ts +91 -0
  398. package/src/utils/webpack/env/types.ts +14 -0
  399. package/src/utils/webpack/env/utils.ts +53 -0
  400. package/src/utils/webpack/index.ts +7 -0
  401. package/src/utils/webpack/module-federation/__test__/__snapshots__/utils.test.ts.snap +124 -0
  402. package/src/utils/webpack/module-federation/__test__/index.test.ts +311 -0
  403. package/src/utils/webpack/module-federation/__test__/utils.test.ts +28 -0
  404. package/src/utils/webpack/module-federation/index.ts +102 -0
  405. package/src/utils/webpack/module-federation/types.ts +54 -0
  406. package/src/utils/webpack/module-federation/utils.ts +104 -0
  407. package/cache/types.js +0 -3
  408. package/cache/types.js.map +0 -1
  409. package/config/base.js +0 -20
  410. package/config/base.js.map +0 -1
  411. package/config/index.js +0 -8
  412. package/config/index.js.map +0 -1
  413. package/config/source.js +0 -21
  414. package/config/source.js.map +0 -1
  415. package/config/types.js +0 -3
  416. package/config/types.js.map +0 -1
  417. package/di/application.js +0 -88
  418. package/di/application.js.map +0 -1
  419. package/di/container.js +0 -52
  420. package/di/container.js.map +0 -1
  421. package/di/errors.js +0 -59
  422. package/di/errors.js.map +0 -1
  423. package/di/index.js +0 -17
  424. package/di/index.js.map +0 -1
  425. package/di/preset.js +0 -27
  426. package/di/preset.js.map +0 -1
  427. package/di/token.js +0 -39
  428. package/di/token.js.map +0 -1
  429. package/di/types.js +0 -3
  430. package/di/types.js.map +0 -1
  431. package/http/errors.js +0 -26
  432. package/http/errors.js.map +0 -1
  433. package/http/index.js +0 -14
  434. package/http/index.js.map +0 -1
  435. package/http/types.js +0 -3
  436. package/http/types.js.map +0 -1
  437. package/http-client/middleware/cookie.d.ts +0 -20
  438. package/http-client/middleware/cookie.js +0 -64
  439. package/http-client/middleware/cookie.js.map +0 -1
  440. package/http-client/middleware/headers.d.ts +0 -13
  441. package/http-client/middleware/headers.js +0 -25
  442. package/http-client/middleware/headers.js.map +0 -1
  443. package/http-client/middleware/log.js +0 -26
  444. package/http-client/middleware/log.js.map +0 -1
  445. package/http-client/middleware/tracing.js +0 -80
  446. package/http-client/middleware/tracing.js.map +0 -1
  447. package/http-client/sauce/index.js +0 -50
  448. package/http-client/sauce/index.js.map +0 -1
  449. package/http-client/types.d.ts +0 -6
  450. package/http-client/types.js +0 -3
  451. package/http-client/types.js.map +0 -1
  452. package/http-client/utils.js +0 -51
  453. package/http-client/utils.js.map +0 -1
  454. package/http-server/constants.d.ts +0 -4
  455. package/http-server/constants.js +0 -8
  456. package/http-server/constants.js.map +0 -1
  457. package/http-server/errors.d.ts +0 -11
  458. package/http-server/errors.js +0 -18
  459. package/http-server/errors.js.map +0 -1
  460. package/http-server/handler/health-check.js.map +0 -1
  461. package/http-server/middleware/tracing.d.ts +0 -14
  462. package/http-server/middleware/tracing.js +0 -51
  463. package/http-server/middleware/tracing.js.map +0 -1
  464. package/http-server/types.d.ts +0 -20
  465. package/http-server/types.js +0 -3
  466. package/http-server/types.js.map +0 -1
  467. package/http-server/utils.d.ts +0 -43
  468. package/http-server/utils.js +0 -134
  469. package/http-server/utils.js.map +0 -1
  470. package/log/errors.js +0 -31
  471. package/log/errors.js.map +0 -1
  472. package/log/handler/pino.js +0 -29
  473. package/log/handler/pino.js.map +0 -1
  474. package/log/handler/sentry.js +0 -50
  475. package/log/handler/sentry.js.map +0 -1
  476. package/log/index.d.ts +0 -3
  477. package/log/index.js +0 -9
  478. package/log/index.js.map +0 -1
  479. package/log/logger.js +0 -29
  480. package/log/logger.js.map +0 -1
  481. package/log/types.js +0 -3
  482. package/log/types.js.map +0 -1
  483. package/preset/browser/index.d.ts +0 -17
  484. package/preset/browser/index.js +0 -88
  485. package/preset/browser/index.js.map +0 -1
  486. package/preset/node/handler.d.ts +0 -20
  487. package/preset/node/handler.js +0 -208
  488. package/preset/node/handler.js.map +0 -1
  489. package/preset/node/index.d.ts +0 -29
  490. package/preset/node/index.js +0 -292
  491. package/preset/node/index.js.map +0 -1
  492. package/preset/parts/providers.d.ts +0 -7
  493. package/preset/parts/providers.js +0 -26
  494. package/preset/parts/providers.js.map +0 -1
  495. package/preset/parts/types.d.ts +0 -14
  496. package/preset/parts/types.js +0 -3
  497. package/preset/parts/types.js.map +0 -1
  498. package/preset/parts/utils.js +0 -263
  499. package/preset/parts/utils.js.map +0 -1
  500. package/tokens.js +0 -82
  501. package/tokens.js.map +0 -1
  502. package/utils/browser/analytics/data-layer.js.map +0 -1
  503. package/utils/browser/analytics/oko.d.ts +0 -13
  504. package/utils/browser/analytics/oko.js +0 -40
  505. package/utils/browser/analytics/oko.js.map +0 -1
  506. package/utils/browser/storage/index.js +0 -68
  507. package/utils/browser/storage/index.js.map +0 -1
  508. package/utils/function.js +0 -23
  509. package/utils/function.js.map +0 -1
  510. package/utils/number.js.map +0 -1
  511. package/utils/react/error-handlers/index.js +0 -47
  512. package/utils/react/error-handlers/index.js.map +0 -1
  513. package/utils/react/index.js +0 -7
  514. package/utils/react/index.js.map +0 -1
  515. package/utils/redux/index.js +0 -7
  516. package/utils/redux/index.js.map +0 -1
  517. package/utils/redux/remote-data.js +0 -91
  518. package/utils/redux/remote-data.js.map +0 -1
  519. package/utils/redux-saga/index.js +0 -8
  520. package/utils/redux-saga/index.js.map +0 -1
  521. package/utils/redux-saga/middleware.js +0 -142
  522. package/utils/redux-saga/middleware.js.map +0 -1
  523. package/utils/redux-saga/take-chain.js +0 -58
  524. package/utils/redux-saga/take-chain.js.map +0 -1
  525. package/utils/redux-saga/types.js +0 -3
  526. package/utils/redux-saga/types.js.map +0 -1
  527. package/utils/ssr/index.js +0 -54
  528. package/utils/ssr/index.js.map +0 -1
  529. package/utils/webpack/env/index.js +0 -76
  530. package/utils/webpack/env/index.js.map +0 -1
  531. package/utils/webpack/env/types.js +0 -3
  532. package/utils/webpack/env/types.js.map +0 -1
  533. package/utils/webpack/env/utils.js +0 -52
  534. package/utils/webpack/env/utils.js.map +0 -1
  535. package/utils/webpack/index.js +0 -8
  536. package/utils/webpack/index.js.map +0 -1
  537. package/utils/webpack/module-federation/index.js +0 -81
  538. package/utils/webpack/module-federation/index.js.map +0 -1
  539. package/utils/webpack/module-federation/types.js +0 -3
  540. package/utils/webpack/module-federation/types.js.map +0 -1
  541. package/utils/webpack/module-federation/utils.js.map +0 -1
  542. /package/{cache → dist/types/cache}/types.d.ts +0 -0
  543. /package/{config → dist/types/config}/base.d.ts +0 -0
  544. /package/{config → dist/types/config}/index.d.ts +0 -0
  545. /package/{config → dist/types/config}/source.d.ts +0 -0
  546. /package/{config → dist/types/config}/types.d.ts +0 -0
  547. /package/{di → dist/types/di}/application.d.ts +0 -0
  548. /package/{di → dist/types/di}/container.d.ts +0 -0
  549. /package/{di → dist/types/di}/errors.d.ts +0 -0
  550. /package/{di → dist/types/di}/index.d.ts +0 -0
  551. /package/{di → dist/types/di}/preset.d.ts +0 -0
  552. /package/{di → dist/types/di}/token.d.ts +0 -0
  553. /package/{di → dist/types/di}/types.d.ts +0 -0
  554. /package/{http → dist/types/http}/types.d.ts +0 -0
  555. /package/{log → dist/types/log}/errors.d.ts +0 -0
  556. /package/{log → dist/types/log}/handler/pino.d.ts +0 -0
  557. /package/{log → dist/types/log}/handler/sentry.d.ts +0 -0
  558. /package/{log → dist/types/log}/logger.d.ts +0 -0
  559. /package/{log → dist/types/log}/types.d.ts +0 -0
  560. /package/{http-client → dist/types/utils/axios}/middleware/log.d.ts +0 -0
  561. /package/{http-server → dist/types/utils/express}/handler/health-check.d.ts +0 -0
  562. /package/{utils → dist/types/utils}/function.d.ts +0 -0
  563. /package/{utils/number.d.ts → dist/types/utils/math.d.ts} +0 -0
  564. /package/{utils → dist/types/utils}/react/index.d.ts +0 -0
  565. /package/{utils → dist/types/utils}/redux/index.d.ts +0 -0
  566. /package/{utils → dist/types/utils}/redux-saga/index.d.ts +0 -0
  567. /package/{utils → dist/types/utils}/redux-saga/middleware.d.ts +0 -0
  568. /package/{utils → dist/types/utils}/redux-saga/take-chain.d.ts +0 -0
  569. /package/{utils → dist/types/utils}/redux-saga/types.d.ts +0 -0
  570. /package/{utils/browser → dist/types/utils/web}/analytics/data-layer.d.ts +0 -0
  571. /package/{utils → dist/types/utils}/webpack/env/index.d.ts +0 -0
  572. /package/{utils → dist/types/utils}/webpack/env/types.d.ts +0 -0
  573. /package/{utils → dist/types/utils}/webpack/env/utils.d.ts +0 -0
  574. /package/{utils → dist/types/utils}/webpack/index.d.ts +0 -0
  575. /package/{utils → dist/types/utils}/webpack/module-federation/types.d.ts +0 -0
  576. /package/{utils → dist/types/utils}/webpack/module-federation/utils.d.ts +0 -0
@@ -0,0 +1,94 @@
1
+ import { AxiosDefaults, InternalAxiosRequestConfig } from 'axios';
2
+ import { Next } from 'middleware-axios';
3
+ import { cookieMiddleware } from '../cookie';
4
+ import { createCookieStore } from '../../../../http';
5
+
6
+ describe('cookieMiddleware', () => {
7
+ it('should set cookie to config', async () => {
8
+ const store = createCookieStore('hello=world');
9
+
10
+ const middleware = cookieMiddleware(store);
11
+
12
+ const config: InternalAxiosRequestConfig = {
13
+ method: 'get',
14
+ url: '/test-cookie-middleware',
15
+ headers: { 'test-header': 'test-value' } as any,
16
+ };
17
+ const next: Next<unknown> = jest.fn(() =>
18
+ Promise.resolve({
19
+ data: null,
20
+ status: 200,
21
+ statusText: 'OK',
22
+ config,
23
+ headers: {},
24
+ }),
25
+ );
26
+ const defaults: AxiosDefaults = {
27
+ headers: {
28
+ get: {},
29
+ post: {},
30
+ put: {},
31
+ delete: {},
32
+ patch: {},
33
+ common: {},
34
+ head: {},
35
+ },
36
+ };
37
+
38
+ expect(next).toHaveBeenCalledTimes(0);
39
+ await middleware(config, next, defaults);
40
+ expect(next).toHaveBeenCalledTimes(1);
41
+
42
+ expect(next).toHaveBeenCalledWith({
43
+ method: 'get',
44
+ url: '/test-cookie-middleware',
45
+ headers: {
46
+ 'test-header': 'test-value',
47
+ Cookie: 'hello=world',
48
+ },
49
+ });
50
+ });
51
+
52
+ it('should handle set-cookie header', async () => {
53
+ const store = createCookieStore('hello=world');
54
+
55
+ const spy = jest.fn();
56
+ store.subscribe(spy);
57
+
58
+ const middleware = cookieMiddleware(store);
59
+
60
+ const config: InternalAxiosRequestConfig = {
61
+ method: 'get',
62
+ url: '/test-cookie-middleware',
63
+ headers: { 'test-header': 'test-value' } as any,
64
+ };
65
+ const next: Next<unknown> = jest.fn(() =>
66
+ Promise.resolve({
67
+ data: null,
68
+ status: 200,
69
+ statusText: 'OK',
70
+ config,
71
+ headers: {
72
+ 'set-cookie': ['foo=bar', 'baz=123'],
73
+ } as any,
74
+ }),
75
+ );
76
+ const defaults: AxiosDefaults = {
77
+ headers: {
78
+ get: {},
79
+ post: {},
80
+ put: {},
81
+ delete: {},
82
+ patch: {},
83
+ common: {},
84
+ head: {},
85
+ },
86
+ };
87
+
88
+ expect(next).toHaveBeenCalledTimes(0);
89
+ expect(spy).toHaveBeenCalledTimes(0);
90
+ await middleware(config, next, defaults);
91
+ expect(next).toHaveBeenCalledTimes(1);
92
+ expect(spy).toHaveBeenCalledTimes(2);
93
+ });
94
+ });
@@ -0,0 +1,121 @@
1
+ import { AxiosRequestConfig, AxiosDefaults, AxiosResponse } from 'axios';
2
+ import { Next } from 'middleware-axios';
3
+ import { logMiddleware, LogMiddlewareHandler } from '../log';
4
+
5
+ function getFakeHandler(): LogMiddlewareHandler {
6
+ return {
7
+ beforeRequest: jest.fn(),
8
+ afterResponse: jest.fn(),
9
+ onCatch: jest.fn(),
10
+ };
11
+ }
12
+
13
+ function handlerNotUsed(handler: LogMiddlewareHandler): boolean {
14
+ const methods = [handler.beforeRequest, handler.afterResponse, handler.onCatch];
15
+
16
+ const callCount = methods.reduce<number>(
17
+ (acc, item) => acc + (item as jest.Mock).mock.calls.length,
18
+ 0,
19
+ );
20
+
21
+ return callCount === 0;
22
+ }
23
+
24
+ describe('logMiddleware', () => {
25
+ let handler = getFakeHandler();
26
+
27
+ beforeEach(() => {
28
+ handler = getFakeHandler();
29
+ });
30
+
31
+ it('should works properly without error', async () => {
32
+ const config: AxiosRequestConfig<any> = {};
33
+
34
+ const defaults: AxiosDefaults<any> = {
35
+ headers: {} as any,
36
+ baseURL: 'https://sima.com/',
37
+ };
38
+
39
+ const response: AxiosResponse = {
40
+ status: 200,
41
+ statusText: '200',
42
+ data: {},
43
+ headers: {},
44
+ config: {} as any,
45
+ };
46
+
47
+ const next: Next<any> = jest.fn(() => Promise.resolve(response));
48
+
49
+ const middleware = logMiddleware(handler);
50
+
51
+ expect(handlerNotUsed(handler)).toBe(true);
52
+
53
+ await middleware(config, next, defaults);
54
+
55
+ expect(handler.beforeRequest).toBeCalledTimes(1);
56
+ expect(handler.beforeRequest).toBeCalledWith({ config, defaults });
57
+ expect(handler.afterResponse).toBeCalledTimes(1);
58
+ expect(handler.afterResponse).toBeCalledWith({ config, defaults, response });
59
+ expect(handler.onCatch).toBeCalledTimes(0);
60
+ });
61
+
62
+ it('should works properly with error', async () => {
63
+ const config: AxiosRequestConfig<any> = {};
64
+
65
+ const defaults: AxiosDefaults<any> = {
66
+ headers: {} as any,
67
+ baseURL: 'https://sima.com/',
68
+ };
69
+
70
+ const error = new Error('Some test error');
71
+
72
+ const next: Next<any> = jest.fn(() => Promise.reject(error));
73
+
74
+ const middleware = logMiddleware(handler);
75
+
76
+ expect(handlerNotUsed(handler)).toBe(true);
77
+
78
+ await middleware(config, next, defaults).catch(() => null);
79
+
80
+ expect(handler.beforeRequest).toBeCalledTimes(1);
81
+ expect(handler.beforeRequest).toBeCalledWith({ config, defaults });
82
+ expect(handler.afterResponse).toBeCalledTimes(0);
83
+ expect(handler.onCatch).toBeCalledTimes(1);
84
+ expect(handler.onCatch).toBeCalledWith({ config, defaults, error });
85
+ });
86
+
87
+ it('should handle handler factory', async () => {
88
+ const config: AxiosRequestConfig<any> = {};
89
+
90
+ const defaults: AxiosDefaults<any> = {
91
+ headers: {} as any,
92
+ baseURL: 'https://sima.com/',
93
+ };
94
+
95
+ const response: AxiosResponse = {
96
+ status: 200,
97
+ statusText: '200',
98
+ data: {},
99
+ headers: {},
100
+ config: {} as any,
101
+ };
102
+
103
+ const next: Next<any> = jest.fn(() => Promise.resolve(response));
104
+
105
+ const handlerFactory = jest.fn(() => handler);
106
+
107
+ const middleware = logMiddleware(handlerFactory);
108
+
109
+ expect(handlerNotUsed(handler)).toBe(true);
110
+
111
+ await middleware(config, next, defaults);
112
+
113
+ expect(handlerFactory).toBeCalledTimes(1);
114
+ expect(handlerFactory).toBeCalledWith({ config, defaults });
115
+ expect(handler.beforeRequest).toBeCalledTimes(1);
116
+ expect(handler.beforeRequest).toBeCalledWith({ config, defaults });
117
+ expect(handler.afterResponse).toBeCalledTimes(1);
118
+ expect(handler.afterResponse).toBeCalledWith({ config, defaults, response });
119
+ expect(handler.onCatch).toBeCalledTimes(0);
120
+ });
121
+ });
@@ -0,0 +1,26 @@
1
+ import type { Middleware } from 'middleware-axios';
2
+ import type { CookieStore } from '../../../http';
3
+
4
+ /**
5
+ * Возвращает новый middleware для работы с cookie на сервере.
6
+ * @param store Хранилище.
7
+ * @return Middleware.
8
+ */
9
+ export function cookieMiddleware(store: CookieStore): Middleware<any> {
10
+ return async (config, next) => {
11
+ const result = await next({
12
+ ...config,
13
+ headers: {
14
+ ...config.headers,
15
+
16
+ // @todo учитывать Domain, Path, Expires и тд
17
+ // @todo учитывать редиректы с куками
18
+ Cookie: store.getCookies(),
19
+ },
20
+ });
21
+
22
+ if (result.headers['set-cookie']) {
23
+ result.headers['set-cookie'].forEach(item => store.setCookie(item));
24
+ }
25
+ };
26
+ }
@@ -0,0 +1,52 @@
1
+ import { AxiosResponse, AxiosRequestConfig, AxiosDefaults } from 'axios';
2
+ import { Middleware } from 'middleware-axios';
3
+
4
+ export interface SharedData {
5
+ config: AxiosRequestConfig;
6
+ defaults: AxiosDefaults;
7
+ }
8
+
9
+ export interface DoneSharedData extends SharedData {
10
+ response: AxiosResponse<unknown, unknown>;
11
+ }
12
+
13
+ export interface FailSharedData extends SharedData {
14
+ error: unknown;
15
+ }
16
+
17
+ export interface LogMiddlewareHandler {
18
+ beforeRequest: (data: SharedData) => Promise<void> | void;
19
+ afterResponse: (data: DoneSharedData) => Promise<void> | void;
20
+ onCatch: (data: FailSharedData) => Promise<void> | void;
21
+ }
22
+
23
+ export interface LogMiddlewareHandlerFactory {
24
+ (data: SharedData): LogMiddlewareHandler;
25
+ }
26
+
27
+ export type LogMiddlewareHandlerInit = LogMiddlewareHandler | LogMiddlewareHandlerFactory;
28
+
29
+ /**
30
+ * Возвращает новый middleware для логирования запросов.
31
+ * @param handlerInit Обработчик.
32
+ * @return Middleware.
33
+ */
34
+ export function logMiddleware(handlerInit: LogMiddlewareHandlerInit): Middleware<any> {
35
+ return async function log(config, next, defaults) {
36
+ const shared: SharedData = { config, defaults };
37
+ const handler = typeof handlerInit === 'function' ? handlerInit(shared) : handlerInit;
38
+
39
+ try {
40
+ await handler.beforeRequest(shared);
41
+
42
+ const response = await next(config);
43
+
44
+ await handler.afterResponse({ ...shared, response });
45
+ } catch (error) {
46
+ await handler.onCatch({ ...shared, error });
47
+
48
+ // ВАЖНО: не скрываем ошибку, сообщаем остальному миру про нее
49
+ throw error;
50
+ }
51
+ };
52
+ }
@@ -0,0 +1,76 @@
1
+ import axios, { AxiosInstance, AxiosResponse } from 'axios';
2
+ import { safetyAsync, SafetyInfo } from '../..';
3
+ import type { AxiosInstanceWrapper, MethodName } from 'middleware-axios';
4
+
5
+ // @todo передавать заголовки ответа
6
+ export type SauceResponse<T = any> =
7
+ | {
8
+ ok: true;
9
+ status: number;
10
+ data: T;
11
+ }
12
+ | {
13
+ ok: false;
14
+ status?: unknown; // unknown так как не факт что упали именно по статусу, например может быть exception
15
+ data?: unknown; // иногда хочется узнать, что прислал сервер вместе с ошибкой (например 422)
16
+ error: any;
17
+ };
18
+
19
+ export interface SauceMethod<K extends MethodName | 'request'> {
20
+ <T>(...args: Parameters<(AxiosInstance | AxiosInstanceWrapper)[K]>): Promise<SauceResponse<T>>;
21
+ }
22
+
23
+ /**
24
+ * Обёртка над экземпляром axios.
25
+ * Все методы возвращают promise, который никогда переходят в состояние rejected.
26
+ */
27
+ export interface Sauce {
28
+ readonly request: SauceMethod<'request'>;
29
+ readonly get: SauceMethod<'get'>;
30
+ readonly delete: SauceMethod<'delete'>;
31
+ readonly head: SauceMethod<'head'>;
32
+ readonly options: SauceMethod<'options'>;
33
+ readonly post: SauceMethod<'post'>;
34
+ readonly put: SauceMethod<'put'>;
35
+ readonly patch: SauceMethod<'patch'>;
36
+ }
37
+
38
+ /**
39
+ * Оборачивает экземпляр axios. Все методы обертки возвращают promise, которые никогда не попадают в состояние rejected.
40
+ * @param instance Экземпляр axios или AxiosInstanceWrapper.
41
+ * @return Обертка.
42
+ */
43
+ export function sauce(instance: AxiosInstance | AxiosInstanceWrapper): Sauce {
44
+ return {
45
+ request: safetyAsync(instance.request, formatResultInfo),
46
+ get: safetyAsync(instance.get, formatResultInfo),
47
+ delete: safetyAsync(instance.delete, formatResultInfo),
48
+ head: safetyAsync(instance.head, formatResultInfo),
49
+ options: safetyAsync(instance.options, formatResultInfo),
50
+ post: safetyAsync(instance.post, formatResultInfo),
51
+ put: safetyAsync(instance.put, formatResultInfo),
52
+ patch: safetyAsync(instance.patch, formatResultInfo),
53
+ };
54
+ }
55
+
56
+ /**
57
+ * Функция форматирования результата, используемая в sauce.
58
+ * @param info Результат вызова метода экземпляра axios.
59
+ * @return Отформатированный ответ.
60
+ */
61
+ export function formatResultInfo<T>(info: SafetyInfo<AxiosResponse<T>>): SauceResponse<T> {
62
+ if (info.ok) {
63
+ return {
64
+ ok: true,
65
+ data: info.result.data,
66
+ status: info.result.status,
67
+ };
68
+ } else {
69
+ return {
70
+ ok: false,
71
+ data: axios.isAxiosError(info.error) ? info.error.response?.data : undefined,
72
+ status: axios.isAxiosError(info.error) ? info.error.response?.status : undefined,
73
+ error: info.error,
74
+ };
75
+ }
76
+ }
@@ -0,0 +1,89 @@
1
+ import { applyAxiosDefaults } from '..';
2
+
3
+ describe('applyAxiosDefaults', () => {
4
+ it('should merge config and defaults properly', () => {
5
+ const result = applyAxiosDefaults(
6
+ {
7
+ url: 'currency/',
8
+ },
9
+ {
10
+ baseURL: 'https://www.data.com/',
11
+ headers: {
12
+ common: {},
13
+ delete: {},
14
+ get: { bar: 'bar-value' },
15
+ head: {},
16
+ post: {},
17
+ put: {},
18
+ patch: {},
19
+ options: {},
20
+ purge: {},
21
+ link: {},
22
+ unlink: {},
23
+ },
24
+ },
25
+ );
26
+
27
+ expect(result.url).toBe('currency/');
28
+ expect(result.baseURL).toBe('https://www.data.com/');
29
+ });
30
+
31
+ it('should merge config and defaults properly when headers provided but method is not', () => {
32
+ const result = applyAxiosDefaults(
33
+ {
34
+ url: 'currency/',
35
+ headers: { foo: 'foo-value' },
36
+ },
37
+ {
38
+ baseURL: 'https://www.data.com/',
39
+ headers: {
40
+ common: {},
41
+ delete: {},
42
+ get: { bar: 'bar-value' },
43
+ head: {},
44
+ post: {},
45
+ put: {},
46
+ patch: {},
47
+ options: {},
48
+ purge: {},
49
+ link: {},
50
+ unlink: {},
51
+ },
52
+ },
53
+ );
54
+
55
+ expect(result.url).toBe('currency/');
56
+ expect(result.baseURL).toBe('https://www.data.com/');
57
+ expect(result.headers).toEqual({ foo: 'foo-value', bar: 'bar-value' });
58
+ });
59
+
60
+ it('should merge config and defaults properly when method provided', () => {
61
+ const result = applyAxiosDefaults(
62
+ {
63
+ method: 'post',
64
+ url: 'currency/',
65
+ headers: { foo: 'foo-value' },
66
+ },
67
+ {
68
+ baseURL: 'https://www.data.com/',
69
+ headers: {
70
+ common: {},
71
+ delete: {},
72
+ get: { bar: 'bar-value' },
73
+ head: {},
74
+ post: { baz: 'baz-value' },
75
+ put: {},
76
+ patch: {},
77
+ options: {},
78
+ purge: {},
79
+ link: {},
80
+ unlink: {},
81
+ },
82
+ },
83
+ );
84
+
85
+ expect(result.url).toBe('currency/');
86
+ expect(result.baseURL).toBe('https://www.data.com/');
87
+ expect(result.headers).toEqual({ foo: 'foo-value', baz: 'baz-value' });
88
+ });
89
+ });
@@ -0,0 +1,26 @@
1
+ import type { AxiosDefaults, AxiosRequestConfig } from 'axios';
2
+
3
+ /**
4
+ * Сливает в один объект конфиг и настройки по умолчанию.
5
+ * @param config Конфигурация запроса.
6
+ * @param defaults Настройки по умолчанию для экземпляра axios.
7
+ * @return Уточненная итоговая конфигурация.
8
+ * @todo Было бы круто заменить на axios/core/mergeConfig (https://github.com/axios/axios/blob/v1.x/lib/core/mergeConfig.js).
9
+ */
10
+ export function applyAxiosDefaults(
11
+ config: AxiosRequestConfig,
12
+ defaults: AxiosDefaults,
13
+ ): Omit<AxiosRequestConfig, 'method'> & Pick<Required<AxiosRequestConfig>, 'method'> {
14
+ const { headers: headersDefaults, ...restDefaults } = defaults;
15
+ const method = config.method || defaults.method || 'get';
16
+
17
+ return {
18
+ method,
19
+ ...restDefaults,
20
+ ...config,
21
+ headers: {
22
+ ...headersDefaults[method.toLowerCase() as keyof typeof defaults.headers],
23
+ ...config.headers,
24
+ },
25
+ };
26
+ }
@@ -0,0 +1,13 @@
1
+ import type { Handler } from 'express';
2
+
3
+ /**
4
+ * Возвращает обработчик, отвечающий данными о времени работы приложения.
5
+ * @return Обработчик http-запроса.
6
+ */
7
+ export function healthCheck(): Handler {
8
+ const startTime = Date.now();
9
+
10
+ return (req, res) => {
11
+ res.json({ uptime: Date.now() - startTime });
12
+ };
13
+ }
@@ -0,0 +1,2 @@
1
+ export { healthCheck } from './handler/health-check';
2
+ export { composeMiddleware } from './utils';
@@ -0,0 +1,18 @@
1
+ import type { Handler } from 'express';
2
+
3
+ /**
4
+ * Объединяет промежуточные слои в один.
5
+ * @param list Промежуточные слои.
6
+ * @return Промежуточный слой.
7
+ */
8
+ export function composeMiddleware(list: Handler[]) {
9
+ return list.reduce((a, b) => (req, res, next) => {
10
+ a(req, res, err => {
11
+ if (err) {
12
+ return next(err);
13
+ }
14
+
15
+ b(req, res, next);
16
+ });
17
+ });
18
+ }
@@ -0,0 +1,57 @@
1
+ interface SafetyDoneInfo<T> {
2
+ ok: true;
3
+ result: T;
4
+ }
5
+
6
+ interface SafetyFailInfo {
7
+ ok: false;
8
+ error: unknown;
9
+ }
10
+
11
+ export type SafetyInfo<T> = SafetyDoneInfo<T> | SafetyFailInfo;
12
+
13
+ interface SafetyFormatter<T, F> {
14
+ (info: SafetyInfo<T>): F | Promise<F>;
15
+ }
16
+
17
+ /**
18
+ * Возвращает функцию, результатом которой является promise, который никогда не переходит в состояние rejected.
19
+ * При перехвате исключения результат будет содержать ошибку.
20
+ * @param fn Оборачиваемая функция.
21
+ * @return Функция.
22
+ */
23
+ export function safetyAsync<T, P extends any[]>(
24
+ fn: (...args: P) => Promise<T>,
25
+ ): (...args: P) => Promise<SafetyInfo<T>>;
26
+
27
+ /**
28
+ * Возвращает функцию, результатом которой является promise, который никогда не переходит в состояние rejected.
29
+ * При перехвате исключения результат будет содержать ошибку.
30
+ * @param fn Оборачиваемая функция.
31
+ * @param format Получив базовую информацию об ответе должна вернуть отформатированную информацию.
32
+ * @return Функция.
33
+ */
34
+ export function safetyAsync<T, P extends any[], F>(
35
+ fn: (...args: P) => Promise<T>,
36
+ format: SafetyFormatter<T, F>,
37
+ ): (...args: P) => Promise<F>;
38
+
39
+ /**
40
+ * Возвращает функцию, результатом которой является promise, который никогда не переходит в состояние rejected.
41
+ * При перехвате исключения результат будет содержать ошибку.
42
+ * @param fn Оборачиваемая функция.
43
+ * @param format Получив базовую информацию об ответе должна вернуть отформатированную информацию.
44
+ * @return Функция.
45
+ */
46
+ export function safetyAsync<T, P extends any[], F>(
47
+ fn: (...args: P) => Promise<T>,
48
+ format: SafetyFormatter<T, F> = value => value as F,
49
+ ): (...args: P) => Promise<F> {
50
+ return async function safetyWrapper(...args: P) {
51
+ try {
52
+ return format({ ok: true, result: await fn(...args) });
53
+ } catch (error) {
54
+ return format({ ok: false, error });
55
+ }
56
+ };
57
+ }
@@ -0,0 +1,2 @@
1
+ export { safetyAsync, type SafetyInfo } from './function';
2
+ export { toMilliseconds } from './math';
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Переводит наносекунды в миллисекунды.
3
+ * @param nanoseconds Наносекунды.
4
+ * @return Миллисекунды.
5
+ */
6
+ export function toMilliseconds(nanoseconds: bigint): number {
7
+ return Number(nanoseconds / 1000000n);
8
+ }
@@ -0,0 +1,27 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`ErrorBoundary should call captureException 1`] = `<div />`;
4
+
5
+ exports[`ErrorBoundary should render children component 1`] = `
6
+ <div>
7
+ <div>
8
+ Normal component
9
+ </div>
10
+ </div>
11
+ `;
12
+
13
+ exports[`ErrorBoundary should render fallback component 1`] = `
14
+ <div>
15
+ <div>
16
+ Fallback
17
+ </div>
18
+ </div>
19
+ `;
20
+
21
+ exports[`SafeSuspense should render with props 1`] = `
22
+ <div>
23
+ <div>
24
+ Normal component
25
+ </div>
26
+ </div>
27
+ `;
@@ -0,0 +1,63 @@
1
+ import { render } from '@testing-library/react';
2
+ import { ErrorBoundary, SafeSuspense } from '..';
3
+
4
+ describe('ErrorBoundary', () => {
5
+ const error = new Error('Test error');
6
+
7
+ const FailedComponent = () => {
8
+ throw error;
9
+ };
10
+
11
+ it('should render children component', () => {
12
+ const { container } = render(
13
+ <ErrorBoundary fallback={null}>
14
+ <div>Normal component</div>
15
+ </ErrorBoundary>,
16
+ );
17
+
18
+ expect(container.textContent).toContain('Normal component');
19
+ expect(container).toMatchSnapshot();
20
+ });
21
+
22
+ it('should render fallback component', () => {
23
+ const { container } = render(
24
+ <ErrorBoundary fallback={<div>Fallback</div>}>
25
+ <>
26
+ <div>Normal component</div>
27
+ <FailedComponent />
28
+ </>
29
+ </ErrorBoundary>,
30
+ );
31
+
32
+ expect(container.textContent).toContain('Fallback');
33
+ expect(container).toMatchSnapshot();
34
+ });
35
+
36
+ it('should call captureException', () => {
37
+ const handlerException = jest.fn();
38
+
39
+ const { container } = render(
40
+ <ErrorBoundary fallback={null} onError={handlerException}>
41
+ <>
42
+ <div>Normal component</div>
43
+ <FailedComponent />
44
+ </>
45
+ </ErrorBoundary>,
46
+ );
47
+
48
+ expect(handlerException).toBeCalledWith(error, { componentStack: expect.any(String) });
49
+ expect(container).toMatchSnapshot();
50
+ });
51
+ });
52
+
53
+ describe('SafeSuspense', () => {
54
+ it('should render with props', () => {
55
+ const { container } = render(
56
+ <SafeSuspense fallback={<div>Fallback</div>} onError={jest.fn()}>
57
+ <div>Normal component</div>
58
+ </SafeSuspense>,
59
+ );
60
+
61
+ expect(container).toMatchSnapshot();
62
+ });
63
+ });