@sima-land/isomorph 9.0.7 → 11.0.0-alpha.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 (530) hide show
  1. package/LICENSE +201 -0
  2. package/dist/cache/types.d.ts +7 -0
  3. package/dist/cache/types.js +3 -0
  4. package/dist/cache/types.js.map +1 -0
  5. package/dist/config/browser.d.ts +6 -0
  6. package/dist/config/browser.js +13 -0
  7. package/dist/config/browser.js.map +1 -0
  8. package/dist/config/index.d.ts +7 -0
  9. package/dist/config/index.js +20 -0
  10. package/dist/config/index.js.map +1 -0
  11. package/dist/config/node.d.ts +6 -0
  12. package/dist/config/node.js +19 -0
  13. package/dist/config/node.js.map +1 -0
  14. package/dist/config/types.d.ts +7 -0
  15. package/dist/config/types.js +3 -0
  16. package/dist/config/types.js.map +1 -0
  17. package/dist/config/utils.d.ts +5 -0
  18. package/dist/config/utils.js +12 -0
  19. package/dist/config/utils.js.map +1 -0
  20. package/dist/container/application.d.ts +25 -0
  21. package/dist/container/application.js +63 -0
  22. package/dist/container/application.js.map +1 -0
  23. package/dist/container/index.d.ts +18 -0
  24. package/dist/container/index.js +74 -0
  25. package/dist/container/index.js.map +1 -0
  26. package/dist/container/types.d.ts +14 -0
  27. package/dist/container/types.js +3 -0
  28. package/dist/container/types.js.map +1 -0
  29. package/dist/error-tracker/browser.d.ts +8 -0
  30. package/dist/error-tracker/browser.js +40 -0
  31. package/dist/error-tracker/browser.js.map +1 -0
  32. package/dist/error-tracker/node.d.ts +8 -0
  33. package/dist/error-tracker/node.js +40 -0
  34. package/dist/error-tracker/node.js.map +1 -0
  35. package/dist/error-tracker/types.d.ts +18 -0
  36. package/dist/error-tracker/types.js +3 -0
  37. package/dist/error-tracker/types.js.map +1 -0
  38. package/dist/error-tracker/utils.d.ts +12 -0
  39. package/dist/error-tracker/utils.js +19 -0
  40. package/dist/error-tracker/utils.js.map +1 -0
  41. package/dist/http-client/middleware/cookie.d.ts +19 -0
  42. package/dist/http-client/middleware/cookie.js +62 -0
  43. package/dist/http-client/middleware/cookie.js.map +1 -0
  44. package/dist/http-client/middleware/tracing.d.ts +32 -0
  45. package/dist/http-client/middleware/tracing.js +67 -0
  46. package/dist/http-client/middleware/tracing.js.map +1 -0
  47. package/dist/http-client/types.d.ts +6 -0
  48. package/dist/http-client/types.js +3 -0
  49. package/dist/http-client/types.js.map +1 -0
  50. package/dist/http-client/utils.d.ts +36 -0
  51. package/dist/http-client/utils.js +49 -0
  52. package/dist/http-client/utils.js.map +1 -0
  53. package/dist/http-server/constants.d.ts +4 -0
  54. package/dist/http-server/constants.js +8 -0
  55. package/dist/http-server/constants.js.map +1 -0
  56. package/dist/http-server/handler/health-check.d.ts +6 -0
  57. package/dist/http-server/handler/health-check.js +15 -0
  58. package/dist/http-server/handler/health-check.js.map +1 -0
  59. package/dist/http-server/middleware/logging.d.ts +10 -0
  60. package/dist/http-server/middleware/logging.js +31 -0
  61. package/dist/http-server/middleware/logging.js.map +1 -0
  62. package/dist/http-server/middleware/metrics.d.ts +23 -0
  63. package/dist/http-server/middleware/metrics.js +60 -0
  64. package/dist/http-server/middleware/metrics.js.map +1 -0
  65. package/dist/http-server/middleware/tracing.d.ts +8 -0
  66. package/dist/http-server/middleware/tracing.js +32 -0
  67. package/dist/http-server/middleware/tracing.js.map +1 -0
  68. package/dist/http-server/types.d.ts +25 -0
  69. package/dist/http-server/types.js +3 -0
  70. package/dist/http-server/types.js.map +1 -0
  71. package/dist/http-server/utils.d.ts +26 -0
  72. package/dist/http-server/utils.js +88 -0
  73. package/dist/http-server/utils.js.map +1 -0
  74. package/dist/logger/handler/console.d.ts +8 -0
  75. package/dist/logger/handler/console.js +36 -0
  76. package/dist/logger/handler/console.js.map +1 -0
  77. package/dist/logger/handler/sentry.d.ts +8 -0
  78. package/dist/logger/handler/sentry.js +36 -0
  79. package/dist/logger/handler/sentry.js.map +1 -0
  80. package/dist/logger/index.d.ts +6 -0
  81. package/dist/logger/index.js +31 -0
  82. package/dist/logger/index.js.map +1 -0
  83. package/dist/logger/types.d.ts +24 -0
  84. package/dist/logger/types.js +3 -0
  85. package/dist/logger/types.js.map +1 -0
  86. package/dist/metrics/constants.d.ts +4 -0
  87. package/dist/metrics/constants.js +8 -0
  88. package/dist/metrics/constants.js.map +1 -0
  89. package/dist/metrics/node.d.ts +18 -0
  90. package/dist/metrics/node.js +74 -0
  91. package/dist/metrics/node.js.map +1 -0
  92. package/dist/preset/index.d.ts +7 -0
  93. package/dist/preset/index.js +23 -0
  94. package/dist/preset/index.js.map +1 -0
  95. package/dist/preset/node/index.d.ts +15 -0
  96. package/dist/preset/node/index.js +90 -0
  97. package/dist/preset/node/index.js.map +1 -0
  98. package/dist/preset/node/response.d.ts +12 -0
  99. package/dist/preset/node/response.js +52 -0
  100. package/dist/preset/node/response.js.map +1 -0
  101. package/dist/preset/types.d.ts +7 -0
  102. package/dist/preset/types.js +3 -0
  103. package/dist/preset/types.js.map +1 -0
  104. package/dist/saga-runner/index.d.ts +8 -0
  105. package/dist/saga-runner/index.js +77 -0
  106. package/dist/saga-runner/index.js.map +1 -0
  107. package/dist/saga-runner/types.d.ts +10 -0
  108. package/dist/saga-runner/types.js +3 -0
  109. package/dist/saga-runner/types.js.map +1 -0
  110. package/dist/tokens.d.ts +40 -0
  111. package/dist/tokens.js +43 -0
  112. package/dist/tokens.js.map +1 -0
  113. package/dist/tracer/node.d.ts +10 -0
  114. package/dist/tracer/node.js +38 -0
  115. package/dist/tracer/node.js.map +1 -0
  116. package/dist/tracer/types.d.ts +2 -0
  117. package/dist/tracer/types.js +3 -0
  118. package/dist/tracer/types.js.map +1 -0
  119. package/dist/utils/browser/analytics/data-layer.d.ts +5 -0
  120. package/dist/utils/browser/analytics/data-layer.js +15 -0
  121. package/dist/utils/browser/analytics/data-layer.js.map +1 -0
  122. package/{helpers/analytics/index.d.ts → dist/utils/browser/analytics/oko.d.ts} +1 -6
  123. package/{helpers/analytics/index.js → dist/utils/browser/analytics/oko.js} +11 -20
  124. package/dist/utils/browser/analytics/oko.js.map +1 -0
  125. package/dist/utils/browser/storage/index.d.ts +4 -0
  126. package/dist/utils/browser/storage/index.js +63 -0
  127. package/dist/utils/browser/storage/index.js.map +1 -0
  128. package/dist/utils/number.d.ts +6 -0
  129. package/dist/utils/number.js +13 -0
  130. package/dist/utils/number.js.map +1 -0
  131. package/dist/utils/react/error-handlers/index.d.ts +38 -0
  132. package/dist/utils/react/error-handlers/index.js +47 -0
  133. package/dist/utils/react/error-handlers/index.js.map +1 -0
  134. package/dist/utils/redux/remote-data.d.ts +23 -0
  135. package/dist/utils/redux/remote-data.js +28 -0
  136. package/dist/utils/redux/remote-data.js.map +1 -0
  137. package/dist/utils/redux-saga/take-chain.d.ts +24 -0
  138. package/dist/utils/redux-saga/take-chain.js +56 -0
  139. package/dist/utils/redux-saga/take-chain.js.map +1 -0
  140. package/dist/utils/webpack/module-federation/index.d.ts +21 -0
  141. package/dist/utils/webpack/module-federation/index.js +74 -0
  142. package/dist/utils/webpack/module-federation/index.js.map +1 -0
  143. package/dist/utils/webpack/module-federation/types.d.ts +26 -0
  144. package/dist/utils/webpack/module-federation/types.js +3 -0
  145. package/dist/utils/webpack/module-federation/types.js.map +1 -0
  146. package/dist/utils/webpack/module-federation/utils.d.ts +15 -0
  147. package/dist/utils/webpack/module-federation/utils.js +36 -0
  148. package/dist/utils/webpack/module-federation/utils.js.map +1 -0
  149. package/package.json +50 -68
  150. package/readme.md +23 -0
  151. package/src/cache/types.ts +7 -0
  152. package/src/config/browser.ts +10 -0
  153. package/src/config/index.ts +18 -0
  154. package/src/config/node.ts +18 -0
  155. package/src/config/types.ts +9 -0
  156. package/src/config/utils.ts +7 -0
  157. package/src/container/application.ts +91 -0
  158. package/src/container/index.ts +79 -0
  159. package/src/container/types.ts +17 -0
  160. package/src/error-tracker/browser.ts +14 -0
  161. package/src/error-tracker/node.ts +14 -0
  162. package/src/error-tracker/types.ts +22 -0
  163. package/src/error-tracker/utils.ts +18 -0
  164. package/src/http-client/middleware/cookie.ts +73 -0
  165. package/src/{helpers/api/middlewares/trace-request-middleware.ts → http-client/middleware/tracing.ts} +28 -35
  166. package/src/http-client/types.ts +8 -0
  167. package/src/http-client/utils.ts +76 -0
  168. package/src/http-server/constants.ts +4 -0
  169. package/src/http-server/handler/health-check.ts +13 -0
  170. package/src/http-server/middleware/logging.ts +34 -0
  171. package/src/http-server/middleware/metrics.ts +87 -0
  172. package/src/http-server/middleware/tracing.ts +35 -0
  173. package/src/http-server/types.ts +29 -0
  174. package/src/http-server/utils.ts +105 -0
  175. package/src/logger/handler/console.ts +35 -0
  176. package/src/logger/handler/sentry.ts +38 -0
  177. package/src/logger/index.ts +31 -0
  178. package/src/logger/types.ts +28 -0
  179. package/src/metrics/constants.ts +4 -0
  180. package/src/metrics/node.ts +54 -0
  181. package/src/preset/index.ts +24 -0
  182. package/src/preset/node/index.ts +101 -0
  183. package/src/preset/node/response.ts +57 -0
  184. package/src/preset/types.ts +9 -0
  185. package/src/saga-runner/index.ts +59 -0
  186. package/src/saga-runner/types.ts +13 -0
  187. package/src/tokens.ts +54 -0
  188. package/src/tracer/node.ts +40 -0
  189. package/src/tracer/types.ts +3 -0
  190. package/src/utils/browser/analytics/__test__/data-layer.test.ts +50 -0
  191. package/src/utils/browser/analytics/__test__/oko.test.tsx +143 -0
  192. package/src/utils/browser/analytics/data-layer.ts +12 -0
  193. package/src/{helpers/analytics/index.ts → utils/browser/analytics/oko.ts} +10 -15
  194. package/src/utils/browser/storage/index.ts +75 -0
  195. package/src/utils/number.ts +8 -0
  196. package/src/utils/react/error-handlers/__test__/__snapshots__/index.test.tsx.snap +27 -0
  197. package/src/utils/react/error-handlers/__test__/index.test.tsx +64 -0
  198. package/src/utils/react/error-handlers/index.tsx +62 -0
  199. package/src/utils/redux/__test__/remote-data.test.ts +50 -0
  200. package/src/utils/redux/remote-data.ts +34 -0
  201. package/src/utils/redux-saga/__test__/take-chain.test.ts +141 -0
  202. package/src/utils/redux-saga/take-chain.ts +65 -0
  203. package/src/utils/webpack/module-federation/__test__/index.test.ts +246 -0
  204. package/src/utils/webpack/module-federation/index.ts +92 -0
  205. package/src/utils/webpack/module-federation/types.ts +44 -0
  206. package/src/utils/webpack/module-federation/utils.ts +43 -0
  207. package/cache/helpers.d.ts +0 -4
  208. package/cache/helpers.js +0 -39
  209. package/cache/helpers.js.map +0 -1
  210. package/cache/local-storage.d.ts +0 -34
  211. package/cache/local-storage.js +0 -90
  212. package/cache/local-storage.js.map +0 -1
  213. package/cache/redis.d.ts +0 -10
  214. package/cache/redis.js +0 -54
  215. package/cache/redis.js.map +0 -1
  216. package/cache/wrap-in-trace.d.ts +0 -8
  217. package/cache/wrap-in-trace.js +0 -68
  218. package/cache/wrap-in-trace.js.map +0 -1
  219. package/config/create.d.ts +0 -8
  220. package/config/create.js +0 -32
  221. package/config/create.js.map +0 -1
  222. package/config/helpers.d.ts +0 -11
  223. package/config/helpers.js +0 -71
  224. package/config/helpers.js.map +0 -1
  225. package/config/validate.d.ts +0 -18
  226. package/config/validate.js +0 -107
  227. package/config/validate.js.map +0 -1
  228. package/container/create-inject.d.ts +0 -7
  229. package/container/create-inject.js +0 -36
  230. package/container/create-inject.js.map +0 -1
  231. package/container/get-dependencies.d.ts +0 -13
  232. package/container/get-dependencies.js +0 -54
  233. package/container/get-dependencies.js.map +0 -1
  234. package/container/index.d.ts +0 -15
  235. package/container/index.js +0 -175
  236. package/container/index.js.map +0 -1
  237. package/container/is-container.d.ts +0 -7
  238. package/container/is-container.js +0 -17
  239. package/container/is-container.js.map +0 -1
  240. package/container/service-not-found-error.d.ts +0 -10
  241. package/container/service-not-found-error.js +0 -18
  242. package/container/service-not-found-error.js.map +0 -1
  243. package/create-proxy/create-proxy-middleware/index.d.ts +0 -16
  244. package/create-proxy/create-proxy-middleware/index.js +0 -47
  245. package/create-proxy/create-proxy-middleware/index.js.map +0 -1
  246. package/create-proxy/index.d.ts +0 -12
  247. package/create-proxy/index.js +0 -25
  248. package/create-proxy/index.js.map +0 -1
  249. package/create-response-sender/index.d.ts +0 -8
  250. package/create-response-sender/index.js +0 -42
  251. package/create-response-sender/index.js.map +0 -1
  252. package/get-dynamic-data/index.d.ts +0 -8
  253. package/get-dynamic-data/index.js +0 -23
  254. package/get-dynamic-data/index.js.map +0 -1
  255. package/graceful-shutdown/index.d.ts +0 -26
  256. package/graceful-shutdown/index.js +0 -87
  257. package/graceful-shutdown/index.js.map +0 -1
  258. package/helpers/add-error-handling/index.d.ts +0 -1
  259. package/helpers/add-error-handling/index.js +0 -42
  260. package/helpers/add-error-handling/index.js.map +0 -1
  261. package/helpers/analytics/index.js.map +0 -1
  262. package/helpers/api/create-enhancer.d.ts +0 -12
  263. package/helpers/api/create-enhancer.js +0 -52
  264. package/helpers/api/create-enhancer.js.map +0 -1
  265. package/helpers/api/create-instance.d.ts +0 -11
  266. package/helpers/api/create-instance.js +0 -39
  267. package/helpers/api/create-instance.js.map +0 -1
  268. package/helpers/api/middlewares/collect-cookie-middleware.d.ts +0 -10
  269. package/helpers/api/middlewares/collect-cookie-middleware.js +0 -39
  270. package/helpers/api/middlewares/collect-cookie-middleware.js.map +0 -1
  271. package/helpers/api/middlewares/count-api-response-time.d.ts +0 -12
  272. package/helpers/api/middlewares/count-api-response-time.js +0 -39
  273. package/helpers/api/middlewares/count-api-response-time.js.map +0 -1
  274. package/helpers/api/middlewares/error-handlers-middlewares.d.ts +0 -5
  275. package/helpers/api/middlewares/error-handlers-middlewares.js +0 -114
  276. package/helpers/api/middlewares/error-handlers-middlewares.js.map +0 -1
  277. package/helpers/api/middlewares/helpers.d.ts +0 -11
  278. package/helpers/api/middlewares/helpers.js +0 -27
  279. package/helpers/api/middlewares/helpers.js.map +0 -1
  280. package/helpers/api/middlewares/pass-headers-middleware.d.ts +0 -3
  281. package/helpers/api/middlewares/pass-headers-middleware.js +0 -27
  282. package/helpers/api/middlewares/pass-headers-middleware.js.map +0 -1
  283. package/helpers/api/middlewares/prepare-request-headers.d.ts +0 -5
  284. package/helpers/api/middlewares/prepare-request-headers.js +0 -20
  285. package/helpers/api/middlewares/prepare-request-headers.js.map +0 -1
  286. package/helpers/api/middlewares/set-http-agents-middleware.d.ts +0 -15
  287. package/helpers/api/middlewares/set-http-agents-middleware.js +0 -34
  288. package/helpers/api/middlewares/set-http-agents-middleware.js.map +0 -1
  289. package/helpers/api/middlewares/stages-trace-middleware.d.ts +0 -17
  290. package/helpers/api/middlewares/stages-trace-middleware.js +0 -57
  291. package/helpers/api/middlewares/stages-trace-middleware.js.map +0 -1
  292. package/helpers/api/middlewares/trace-request-middleware.d.ts +0 -24
  293. package/helpers/api/middlewares/trace-request-middleware.js +0 -69
  294. package/helpers/api/middlewares/trace-request-middleware.js.map +0 -1
  295. package/helpers/api/server-adapter/__fixtures__/fake-keys.d.ts +0 -10
  296. package/helpers/api/server-adapter/__fixtures__/fake-keys.js +0 -61
  297. package/helpers/api/server-adapter/__fixtures__/fake-keys.js.map +0 -1
  298. package/helpers/api/server-adapter/constants.d.ts +0 -5
  299. package/helpers/api/server-adapter/constants.js +0 -16
  300. package/helpers/api/server-adapter/constants.js.map +0 -1
  301. package/helpers/api/server-adapter/helpers.d.ts +0 -26
  302. package/helpers/api/server-adapter/helpers.js +0 -208
  303. package/helpers/api/server-adapter/helpers.js.map +0 -1
  304. package/helpers/api/server-adapter/index.d.ts +0 -10
  305. package/helpers/api/server-adapter/index.js +0 -118
  306. package/helpers/api/server-adapter/index.js.map +0 -1
  307. package/helpers/development/use-dot-env.d.ts +0 -6
  308. package/helpers/development/use-dot-env.js +0 -11
  309. package/helpers/development/use-dot-env.js.map +0 -1
  310. package/helpers/get-params/index.d.ts +0 -4
  311. package/helpers/get-params/index.js +0 -51
  312. package/helpers/get-params/index.js.map +0 -1
  313. package/helpers/http/request-getters.d.ts +0 -5
  314. package/helpers/http/request-getters.js +0 -49
  315. package/helpers/http/request-getters.js.map +0 -1
  316. package/helpers/http/statuses-validator.d.ts +0 -3
  317. package/helpers/http/statuses-validator.js +0 -25
  318. package/helpers/http/statuses-validator.js.map +0 -1
  319. package/helpers/logger/create-pino-instance/index.d.ts +0 -6
  320. package/helpers/logger/create-pino-instance/index.js +0 -39
  321. package/helpers/logger/create-pino-instance/index.js.map +0 -1
  322. package/helpers/logger/format-time/index.d.ts +0 -6
  323. package/helpers/logger/format-time/index.js +0 -9
  324. package/helpers/logger/format-time/index.js.map +0 -1
  325. package/helpers/metrics/index.d.ts +0 -23
  326. package/helpers/metrics/index.js +0 -42
  327. package/helpers/metrics/index.js.map +0 -1
  328. package/helpers/prometheus/index.d.ts +0 -4
  329. package/helpers/prometheus/index.js +0 -13
  330. package/helpers/prometheus/index.js.map +0 -1
  331. package/helpers/prometheus/measure-middleware.d.ts +0 -5
  332. package/helpers/prometheus/measure-middleware.js +0 -69
  333. package/helpers/prometheus/measure-middleware.js.map +0 -1
  334. package/helpers/prometheus/metric-adapter.d.ts +0 -36
  335. package/helpers/prometheus/metric-adapter.js +0 -98
  336. package/helpers/prometheus/metric-adapter.js.map +0 -1
  337. package/helpers/react/error-handlers/index.d.ts +0 -40
  338. package/helpers/react/error-handlers/index.js +0 -52
  339. package/helpers/react/error-handlers/index.js.map +0 -1
  340. package/helpers/redux/constants.d.ts +0 -5
  341. package/helpers/redux/constants.js +0 -14
  342. package/helpers/redux/constants.js.map +0 -1
  343. package/helpers/redux/create-compose-middleware.d.ts +0 -15
  344. package/helpers/redux/create-compose-middleware.js +0 -23
  345. package/helpers/redux/create-compose-middleware.js.map +0 -1
  346. package/helpers/redux/get-dev-compose-creator.d.ts +0 -6
  347. package/helpers/redux/get-dev-compose-creator.js +0 -13
  348. package/helpers/redux/get-dev-compose-creator.js.map +0 -1
  349. package/helpers/redux/prepare-on-ready.d.ts +0 -9
  350. package/helpers/redux/prepare-on-ready.js +0 -16
  351. package/helpers/redux/prepare-on-ready.js.map +0 -1
  352. package/helpers/redux/remote-data.d.ts +0 -40
  353. package/helpers/redux/remote-data.js +0 -91
  354. package/helpers/redux/remote-data.js.map +0 -1
  355. package/helpers/redux/selector/statuses.d.ts +0 -23
  356. package/helpers/redux/selector/statuses.js +0 -34
  357. package/helpers/redux/selector/statuses.js.map +0 -1
  358. package/helpers/redux/wait-on-store-readiness.d.ts +0 -11
  359. package/helpers/redux/wait-on-store-readiness.js +0 -29
  360. package/helpers/redux/wait-on-store-readiness.js.map +0 -1
  361. package/helpers/render/get-react-markup-data.d.ts +0 -14
  362. package/helpers/render/get-react-markup-data.js +0 -20
  363. package/helpers/render/get-react-markup-data.js.map +0 -1
  364. package/helpers/render/index.d.ts +0 -21
  365. package/helpers/render/index.js +0 -72
  366. package/helpers/render/index.js.map +0 -1
  367. package/helpers/render/render-app.d.ts +0 -12
  368. package/helpers/render/render-app.js +0 -12
  369. package/helpers/render/render-app.js.map +0 -1
  370. package/helpers/saga/__fixtures__/do-safe-request.d.ts +0 -43
  371. package/helpers/saga/__fixtures__/do-safe-request.js +0 -50
  372. package/helpers/saga/__fixtures__/do-safe-request.js.map +0 -1
  373. package/helpers/saga/cache-result.d.ts +0 -46
  374. package/helpers/saga/cache-result.js +0 -71
  375. package/helpers/saga/cache-result.js.map +0 -1
  376. package/helpers/saga/create-store.d.ts +0 -20
  377. package/helpers/saga/create-store.js +0 -106
  378. package/helpers/saga/create-store.js.map +0 -1
  379. package/helpers/saga/do-safe-request.d.ts +0 -38
  380. package/helpers/saga/do-safe-request.js +0 -45
  381. package/helpers/saga/do-safe-request.js.map +0 -1
  382. package/helpers/saga/safe-request.d.ts +0 -7
  383. package/helpers/saga/safe-request.js +0 -15
  384. package/helpers/saga/safe-request.js.map +0 -1
  385. package/helpers/saga/take-chain.d.ts +0 -20
  386. package/helpers/saga/take-chain.js +0 -56
  387. package/helpers/saga/take-chain.js.map +0 -1
  388. package/helpers/tracer/create-child-tracing-middleware.d.ts +0 -7
  389. package/helpers/tracer/create-child-tracing-middleware.js +0 -40
  390. package/helpers/tracer/create-child-tracing-middleware.js.map +0 -1
  391. package/helpers/tracer/index.d.ts +0 -24
  392. package/helpers/tracer/index.js +0 -144
  393. package/helpers/tracer/index.js.map +0 -1
  394. package/helpers/utils/check-feature-by-segment.d.ts +0 -2
  395. package/helpers/utils/check-feature-by-segment.js +0 -31
  396. package/helpers/utils/check-feature-by-segment.js.map +0 -1
  397. package/helpers/utils/format-object-keys.d.ts +0 -6
  398. package/helpers/utils/format-object-keys.js +0 -27
  399. package/helpers/utils/format-object-keys.js.map +0 -1
  400. package/helpers/utils/get-ms-from-hrt.d.ts +0 -2
  401. package/helpers/utils/get-ms-from-hrt.js +0 -22
  402. package/helpers/utils/get-ms-from-hrt.js.map +0 -1
  403. package/helpers/utils/is-match-pattern-list.d.ts +0 -8
  404. package/helpers/utils/is-match-pattern-list.js +0 -16
  405. package/helpers/utils/is-match-pattern-list.js.map +0 -1
  406. package/helpers/utils/is-not-empty-array.d.ts +0 -2
  407. package/helpers/utils/is-not-empty-array.js +0 -12
  408. package/helpers/utils/is-not-empty-array.js.map +0 -1
  409. package/helpers/utils/is-not-empty-string.d.ts +0 -2
  410. package/helpers/utils/is-not-empty-string.js +0 -15
  411. package/helpers/utils/is-not-empty-string.js.map +0 -1
  412. package/helpers/utils/is-numeric.d.ts +0 -7
  413. package/helpers/utils/is-numeric.js +0 -16
  414. package/helpers/utils/is-numeric.js.map +0 -1
  415. package/helpers/utils/wrap-in-measure-event.d.ts +0 -9
  416. package/helpers/utils/wrap-in-measure-event.js +0 -50
  417. package/helpers/utils/wrap-in-measure-event.js.map +0 -1
  418. package/logger/create-logger-middleware/index.d.ts +0 -14
  419. package/logger/create-logger-middleware/index.js +0 -41
  420. package/logger/create-logger-middleware/index.js.map +0 -1
  421. package/logger/create-sentry-instance/index.d.ts +0 -29
  422. package/logger/create-sentry-instance/index.js +0 -63
  423. package/logger/create-sentry-instance/index.js.map +0 -1
  424. package/logger/create-sentry-middleware/index.d.ts +0 -14
  425. package/logger/create-sentry-middleware/index.js +0 -19
  426. package/logger/create-sentry-middleware/index.js.map +0 -1
  427. package/logger/handler-creators/index.d.ts +0 -5
  428. package/logger/handler-creators/index.js +0 -41
  429. package/logger/handler-creators/index.js.map +0 -1
  430. package/logger/initialize-sentry-creator/index.d.ts +0 -17
  431. package/logger/initialize-sentry-creator/index.js +0 -35
  432. package/logger/initialize-sentry-creator/index.js.map +0 -1
  433. package/logger/sentry-logger/index.d.ts +0 -9
  434. package/logger/sentry-logger/index.js +0 -36
  435. package/logger/sentry-logger/index.js.map +0 -1
  436. package/module-federation/__example__/webpack-config.example.d.ts +0 -366
  437. package/module-federation/__example__/webpack-config.example.js +0 -51
  438. package/module-federation/__example__/webpack-config.example.js.map +0 -1
  439. package/module-federation/enhanced-module-federation-plugin.d.ts +0 -46
  440. package/module-federation/enhanced-module-federation-plugin.js +0 -72
  441. package/module-federation/enhanced-module-federation-plugin.js.map +0 -1
  442. package/module-federation/utils/index.d.ts +0 -8
  443. package/module-federation/utils/index.js +0 -28
  444. package/module-federation/utils/index.js.map +0 -1
  445. package/observe-middleware/index.d.ts +0 -9
  446. package/observe-middleware/index.js +0 -67
  447. package/observe-middleware/index.js.map +0 -1
  448. package/set-header-middleware/create.d.ts +0 -10
  449. package/set-header-middleware/create.js +0 -16
  450. package/set-header-middleware/create.js.map +0 -1
  451. package/src/cache/helpers.js +0 -32
  452. package/src/cache/local-storage.ts +0 -92
  453. package/src/cache/redis.js +0 -79
  454. package/src/cache/wrap-in-trace.js +0 -57
  455. package/src/config/create.js +0 -33
  456. package/src/config/helpers.js +0 -71
  457. package/src/config/validate.js +0 -114
  458. package/src/container/create-inject.js +0 -32
  459. package/src/container/get-dependencies.js +0 -46
  460. package/src/container/index.js +0 -188
  461. package/src/container/is-container.js +0 -14
  462. package/src/container/service-not-found-error.js +0 -14
  463. package/src/create-proxy/create-proxy-middleware/index.js +0 -47
  464. package/src/create-proxy/index.js +0 -27
  465. package/src/create-response-sender/index.js +0 -48
  466. package/src/get-dynamic-data/index.js +0 -26
  467. package/src/graceful-shutdown/index.js +0 -97
  468. package/src/helpers/add-error-handling/index.js +0 -24
  469. package/src/helpers/api/create-enhancer.js +0 -52
  470. package/src/helpers/api/create-instance.js +0 -42
  471. package/src/helpers/api/middlewares/collect-cookie-middleware.js +0 -27
  472. package/src/helpers/api/middlewares/count-api-response-time.js +0 -31
  473. package/src/helpers/api/middlewares/error-handlers-middlewares.js +0 -124
  474. package/src/helpers/api/middlewares/helpers.js +0 -26
  475. package/src/helpers/api/middlewares/pass-headers-middleware.js +0 -19
  476. package/src/helpers/api/middlewares/prepare-request-headers.js +0 -18
  477. package/src/helpers/api/middlewares/set-http-agents-middleware.js +0 -22
  478. package/src/helpers/api/middlewares/stages-trace-middleware.js +0 -46
  479. package/src/helpers/api/server-adapter/__fixtures__/fake-keys.js +0 -58
  480. package/src/helpers/api/server-adapter/constants.js +0 -12
  481. package/src/helpers/api/server-adapter/helpers.js +0 -244
  482. package/src/helpers/api/server-adapter/index.js +0 -155
  483. package/src/helpers/development/use-dot-env.js +0 -9
  484. package/src/helpers/get-params/index.js +0 -59
  485. package/src/helpers/http/request-getters.js +0 -42
  486. package/src/helpers/http/statuses-validator.js +0 -20
  487. package/src/helpers/logger/create-pino-instance/index.js +0 -41
  488. package/src/helpers/logger/format-time/index.js +0 -6
  489. package/src/helpers/metrics/index.js +0 -40
  490. package/src/helpers/prometheus/index.js +0 -9
  491. package/src/helpers/prometheus/measure-middleware.js +0 -73
  492. package/src/helpers/prometheus/metric-adapter.js +0 -99
  493. package/src/helpers/react/error-handlers/index.tsx +0 -68
  494. package/src/helpers/redux/constants.js +0 -10
  495. package/src/helpers/redux/create-compose-middleware.js +0 -24
  496. package/src/helpers/redux/get-dev-compose-creator.js +0 -9
  497. package/src/helpers/redux/prepare-on-ready.js +0 -16
  498. package/src/helpers/redux/remote-data.js +0 -124
  499. package/src/helpers/redux/selector/statuses.js +0 -30
  500. package/src/helpers/redux/wait-on-store-readiness.js +0 -40
  501. package/src/helpers/render/get-react-markup-data.js +0 -18
  502. package/src/helpers/render/index.js +0 -69
  503. package/src/helpers/render/render-app.js +0 -15
  504. package/src/helpers/saga/__fixtures__/do-safe-request.js +0 -49
  505. package/src/helpers/saga/cache-result.js +0 -77
  506. package/src/helpers/saga/create-store.js +0 -102
  507. package/src/helpers/saga/do-safe-request.js +0 -47
  508. package/src/helpers/saga/safe-request.js +0 -11
  509. package/src/helpers/saga/take-chain.js +0 -53
  510. package/src/helpers/tracer/create-child-tracing-middleware.js +0 -42
  511. package/src/helpers/tracer/index.js +0 -171
  512. package/src/helpers/utils/check-feature-by-segment.js +0 -32
  513. package/src/helpers/utils/format-object-keys.js +0 -23
  514. package/src/helpers/utils/get-ms-from-hrt.js +0 -16
  515. package/src/helpers/utils/is-match-pattern-list.js +0 -13
  516. package/src/helpers/utils/is-not-empty-array.js +0 -8
  517. package/src/helpers/utils/is-not-empty-string.js +0 -11
  518. package/src/helpers/utils/is-numeric.ts +0 -12
  519. package/src/helpers/utils/wrap-in-measure-event.js +0 -35
  520. package/src/logger/create-logger-middleware/index.js +0 -46
  521. package/src/logger/create-sentry-instance/index.js +0 -74
  522. package/src/logger/create-sentry-middleware/index.js +0 -16
  523. package/src/logger/handler-creators/index.js +0 -38
  524. package/src/logger/initialize-sentry-creator/index.js +0 -43
  525. package/src/logger/sentry-logger/index.js +0 -33
  526. package/src/module-federation/__example__/webpack-config.example.js +0 -57
  527. package/src/module-federation/enhanced-module-federation-plugin.js +0 -92
  528. package/src/module-federation/utils/index.js +0 -32
  529. package/src/observe-middleware/index.js +0 -70
  530. package/src/set-header-middleware/create.js +0 -17
package/src/tokens.ts ADDED
@@ -0,0 +1,54 @@
1
+ import { createToken } from './container';
2
+ import type { Application } from 'express';
3
+ import type { DefaultMiddleware, PageAssets, ResponseContext } from './http-server/types';
4
+ import type { SagaRunner } from './saga-runner/types';
5
+ import type { Logger } from './logger/types';
6
+ import type { HttpClientFactory } from './http-client/types';
7
+ import type { ConfigSource, BaseConfig } from './config/types';
8
+ import type { Tracer } from './tracer/types';
9
+ import type { Cache } from './cache/types';
10
+
11
+ export const KnownToken = {
12
+ // config
13
+ Config: {
14
+ source: createToken<ConfigSource>('config.source'),
15
+ base: createToken<BaseConfig>('config.base'),
16
+ },
17
+
18
+ // cache
19
+ cache: createToken<Cache>('cache'),
20
+
21
+ // logging
22
+ logger: createToken<Logger>('logger'),
23
+
24
+ // tracing
25
+ tracer: createToken<Tracer>('tracer'),
26
+
27
+ // metrics
28
+ Metrics: {
29
+ httpApp: createToken<Application>('metrics.http-app'),
30
+ },
31
+
32
+ // http
33
+ Http: {
34
+ Client: {
35
+ factory: createToken<HttpClientFactory>('http.client.factory'),
36
+ },
37
+ Server: {
38
+ factory: createToken<() => Application>('http.server.factory'),
39
+ Defaults: {
40
+ middleware: createToken<DefaultMiddleware>('http.server.defaults.middleware'),
41
+ },
42
+ },
43
+ },
44
+
45
+ // scope: page response
46
+ Response: {
47
+ context: createToken<ResponseContext>('response/context'),
48
+ assets: createToken<PageAssets>('response/assets'),
49
+ prepare: createToken<() => JSX.Element | Promise<JSX.Element>>('response/prepare'),
50
+ render: createToken<(element: JSX.Element) => string | Promise<string>>('response/render'),
51
+ main: createToken<() => void>('response/main'),
52
+ sagaRunner: createToken<SagaRunner>('response/saga-runner'),
53
+ },
54
+ } as const;
@@ -0,0 +1,40 @@
1
+ import type { Tracer } from './types';
2
+ import type { BaseConfig } from '../config/types';
3
+ import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node';
4
+ import { BatchSpanProcessor, SpanExporter } from '@opentelemetry/tracing';
5
+ import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions';
6
+ import { registerInstrumentations } from '@opentelemetry/instrumentation';
7
+ import { ExpressInstrumentation } from '@opentelemetry/instrumentation-express';
8
+ import { HttpInstrumentation } from '@opentelemetry/instrumentation-http';
9
+ import { Resource } from '@opentelemetry/resources';
10
+ import { JaegerPropagator } from '@opentelemetry/propagator-jaeger';
11
+
12
+ /**
13
+ * Возвращает новый tracer - объект для трассировки стадий различных процессов.
14
+ * @param config Конфиг.
15
+ * @param exporter Экспортер данных трассировки.
16
+ * @return Tracer.
17
+ */
18
+ export function createTracer(config: BaseConfig, exporter: SpanExporter): Tracer {
19
+ // @todo доделать по инструкции: https://selvaganesh93.medium.com/tracing-node-js-application-with-opentelemetry-jaeger-ui-9523c0ac8453
20
+ const provider = new NodeTracerProvider({
21
+ resource: new Resource({
22
+ [SemanticResourceAttributes.SERVICE_NAME]: config.appName,
23
+ [SemanticResourceAttributes.SERVICE_VERSION]: config.appVersion,
24
+ [SemanticResourceAttributes.DEPLOYMENT_ENVIRONMENT]: config.env,
25
+ }),
26
+ });
27
+
28
+ // @todo выяснить, почему не сходятся типы и приходится оставлять as any
29
+ provider.addSpanProcessor(new BatchSpanProcessor(exporter) as any);
30
+
31
+ provider.register({
32
+ propagator: new JaegerPropagator(),
33
+ });
34
+
35
+ registerInstrumentations({
36
+ instrumentations: [new ExpressInstrumentation(), new HttpInstrumentation()],
37
+ });
38
+
39
+ return provider.getTracer(config.appName, config.appVersion);
40
+ }
@@ -0,0 +1,3 @@
1
+ import type { Tracer } from '@opentelemetry/api';
2
+
3
+ export type { Tracer };
@@ -0,0 +1,50 @@
1
+ import { dataLayerPush } from '../data-layer';
2
+
3
+ describe('dataLayerPush', () => {
4
+ beforeAll(() => {
5
+ (window as any).dataLayer = {
6
+ checkContext: () => 123,
7
+
8
+ push: jest.fn(function (this: any, data) {
9
+ // имитируем реальную работу window.dataLayer.push: в процессе удаляет data.n
10
+ delete data.n;
11
+
12
+ // имитируем реальную работу window.dataLayer.push: в процессе вызывает другие методы с this
13
+ this.checkContext();
14
+ }),
15
+ };
16
+ });
17
+
18
+ afterAll(() => {
19
+ delete (window as any).dataLayer;
20
+ });
21
+
22
+ it('should handle window.dataLayer.push mutates object argument', () => {
23
+ const testData = {
24
+ n: 'test-event',
25
+ prop1: 1,
26
+ prop2: 2,
27
+ };
28
+
29
+ expect((window as any).dataLayer.push).toBeCalledTimes(0);
30
+
31
+ dataLayerPush(testData);
32
+
33
+ expect((window as any).dataLayer.push).toBeCalledTimes(1);
34
+ expect((window as any).dataLayer.push.mock.calls[0][0]).toEqual({
35
+ prop1: 1,
36
+ prop2: 2,
37
+ });
38
+ expect(testData).toEqual({
39
+ n: 'test-event',
40
+ prop1: 1,
41
+ prop2: 2,
42
+ });
43
+ });
44
+
45
+ it('should handle window.dataLayer.push absence', () => {
46
+ delete (window as any).dataLayer;
47
+
48
+ expect(() => dataLayerPush({ n: 'test-123' })).not.toThrow();
49
+ });
50
+ });
@@ -0,0 +1,143 @@
1
+ import React, { createElement } from 'react';
2
+ import { render } from 'react-dom';
3
+ import { act, Simulate } from 'react-dom/test-utils';
4
+ import { okoPush, useOkoPush } from '../oko';
5
+
6
+ describe('useOkoPush', () => {
7
+ const TestComponent = ({ prop }: any) => {
8
+ const fn = useOkoPush({
9
+ n: 'test-event',
10
+ prop,
11
+ });
12
+
13
+ return createElement('div', { 'data-testid': 'test-block', onClick: fn });
14
+ };
15
+
16
+ beforeAll(() => {
17
+ (window as any).oko = {
18
+ push: jest.fn(),
19
+ };
20
+ });
21
+
22
+ afterAll(() => {
23
+ delete (window as any).oko;
24
+ });
25
+
26
+ it('should call', () => {
27
+ const container = document.createElement('div');
28
+
29
+ document.body.append(container);
30
+
31
+ render(<TestComponent prop={123} />, container);
32
+
33
+ expect((window as any).oko.push).toHaveBeenCalledTimes(0);
34
+
35
+ act(() => {
36
+ Simulate.click(container.querySelector('[data-testid="test-block"]') as HTMLElement);
37
+ });
38
+
39
+ expect((window as any).oko.push).toHaveBeenCalledTimes(1);
40
+ expect((window as any).oko.push).toHaveBeenCalledWith({
41
+ n: 'test-event',
42
+ prop: 123,
43
+ });
44
+ });
45
+
46
+ it('should throw error', async () => {
47
+ const container = document.createElement('div');
48
+
49
+ document.body.append(container);
50
+
51
+ render(<TestComponent prop={1} />, container);
52
+
53
+ const renderWithError = () => {
54
+ render(<TestComponent prop={2} />, container);
55
+ };
56
+
57
+ expect(renderWithError).toThrow(
58
+ Error(
59
+ [
60
+ 'useAnalytics: Данные для аналитики изменились.',
61
+ 'Если необходимо использовать динамические данные, вынесите логику из React-компонента.',
62
+ ].join('\n'),
63
+ ),
64
+ );
65
+ });
66
+
67
+ it('should do not throw for complex object structure', () => {
68
+ const ComplexTest = () => {
69
+ const fn = useOkoPush({
70
+ n: 'custom',
71
+ category: 'balance_goods',
72
+ custom_str: ['minus'],
73
+ });
74
+
75
+ return <div data-testid='test-block' onClick={fn} />;
76
+ };
77
+
78
+ const container = document.createElement('div');
79
+
80
+ document.body.append(container);
81
+
82
+ act(() => {
83
+ render(<ComplexTest />, container);
84
+ });
85
+
86
+ const secondRender = () => {
87
+ act(() => {
88
+ render(<ComplexTest />, container);
89
+ });
90
+ };
91
+
92
+ expect(secondRender).not.toThrow();
93
+ });
94
+ });
95
+
96
+ describe('okoPush', () => {
97
+ beforeAll(() => {
98
+ (window as any).oko = {
99
+ checkContext: () => 123,
100
+
101
+ push: jest.fn(function (this: any, data) {
102
+ // имитируем реальную работу window.oko.push: в процессе удаляет data.n
103
+ delete data.n;
104
+
105
+ // имитируем реальную работу window.oko.push: в процессе вызывает другие методы с this
106
+ this.checkContext();
107
+ }),
108
+ };
109
+ });
110
+
111
+ afterAll(() => {
112
+ delete (window as any).oko;
113
+ });
114
+
115
+ it('should handle window.oko.push mutates object argument', () => {
116
+ const testData = {
117
+ n: 'test-event',
118
+ prop1: 1,
119
+ prop2: 2,
120
+ };
121
+
122
+ expect((window as any).oko.push).toBeCalledTimes(0);
123
+
124
+ okoPush(testData);
125
+
126
+ expect((window as any).oko.push).toBeCalledTimes(1);
127
+ expect((window as any).oko.push.mock.calls[0][0]).toEqual({
128
+ prop1: 1,
129
+ prop2: 2,
130
+ });
131
+ expect(testData).toEqual({
132
+ n: 'test-event',
133
+ prop1: 1,
134
+ prop2: 2,
135
+ });
136
+ });
137
+
138
+ it('should handle window.oko.push absence', () => {
139
+ delete (window as any).oko;
140
+
141
+ expect(() => okoPush({ n: 'test-123' })).not.toThrow();
142
+ });
143
+ });
@@ -0,0 +1,12 @@
1
+ import { isFunction } from 'lodash';
2
+
3
+ /**
4
+ * Отправка аналитики в око.
5
+ * @param eventData Данные события для отправки.
6
+ */
7
+ export const dataLayerPush = (eventData: Record<string, any>) => {
8
+ const win: any = window;
9
+
10
+ // копируем объект так как window.dataLayer.push может менять аргумент в процессе работы
11
+ isFunction(win.dataLayer?.push) && win.dataLayer.push({ ...eventData });
12
+ };
@@ -1,5 +1,4 @@
1
1
  import { useRef } from 'react';
2
- import { call } from 'redux-saga/effects';
3
2
  import { isEqual, isFunction } from 'lodash';
4
3
 
5
4
  export type OkoEvent = Record<string, any>;
@@ -9,24 +8,18 @@ export type OkoEvent = Record<string, any>;
9
8
  * @param eventData Данные события для отправки.
10
9
  */
11
10
  export const okoPush = (eventData: OkoEvent) => {
11
+ const win: any = window;
12
+
12
13
  // копируем объект так как window.oko.push меняет свой аргумент в процессе выполнения
13
- isFunction((window as any).oko?.push) && (window as any).oko.push({ ...eventData });
14
+ isFunction(win.oko?.push) && win.oko.push({ ...eventData });
14
15
  };
15
16
 
16
- /**
17
- * Эффект для отправки события в ОКО.
18
- * @param data Данные события для отправки в ОКО.
19
- */
20
- export function * sendAnalytics (data: OkoEvent) {
21
- yield call(okoPush, data);
22
- }
23
-
24
17
  /**
25
18
  * Хук, возвращающий функцию, которая отправит аналитику в ОКО.
26
19
  * @param data Данные события для отправки в ОКО.
27
20
  * @return Функция.
28
21
  */
29
- export const useAnalytics = (data: OkoEvent) => {
22
+ export const useOkoPush = (data: OkoEvent) => {
30
23
  const dataRef = useRef<OkoEvent>();
31
24
  const fnRef = useRef<() => void>();
32
25
 
@@ -39,10 +32,12 @@ export const useAnalytics = (data: OkoEvent) => {
39
32
  }
40
33
 
41
34
  if (!isEqual(data, dataRef.current)) {
42
- throw Error([
43
- 'useAnalytics: Данные для аналитики изменились.',
44
- 'Если необходимо использовать динамические данные, вынесите логику из React-компонента.',
45
- ].join('\n'));
35
+ throw Error(
36
+ [
37
+ 'useAnalytics: Данные для аналитики изменились.',
38
+ 'Если необходимо использовать динамические данные, вынесите логику из React-компонента.',
39
+ ].join('\n'),
40
+ );
46
41
  }
47
42
 
48
43
  return fnRef.current;
@@ -0,0 +1,75 @@
1
+ /* eslint-disable require-jsdoc, jsdoc/require-jsdoc */
2
+
3
+ export interface StorageUtils
4
+ extends Pick<Storage, 'clear' | 'getItem' | 'key' | 'removeItem' | 'setItem' | 'length'> {
5
+ isAvailable: () => boolean;
6
+ }
7
+
8
+ export function createStorageUtils(getStorage: () => Storage): StorageUtils {
9
+ function isAvailable(): boolean {
10
+ try {
11
+ const testKey = `local_storage_test_key::${Date.now()}`;
12
+
13
+ getStorage().setItem(testKey, testKey);
14
+ getStorage().removeItem(testKey);
15
+
16
+ return true;
17
+ } catch {
18
+ return false;
19
+ }
20
+ }
21
+
22
+ function clear(): void {
23
+ if (isAvailable()) {
24
+ getStorage().clear();
25
+ }
26
+ }
27
+
28
+ function getItem(name: string): string | null {
29
+ if (isAvailable()) {
30
+ return getStorage().getItem(name);
31
+ }
32
+
33
+ return null;
34
+ }
35
+
36
+ function key(index: number): string | null {
37
+ if (isAvailable()) {
38
+ return getStorage().key(index);
39
+ }
40
+ return null;
41
+ }
42
+
43
+ function removeItem(name: string): void {
44
+ if (isAvailable()) {
45
+ getStorage().removeItem(name);
46
+ }
47
+ }
48
+
49
+ function setItem(name: string, value: string): void {
50
+ if (isAvailable()) {
51
+ getStorage().setItem(name, value);
52
+ }
53
+ }
54
+
55
+ function length(): number {
56
+ if (isAvailable()) {
57
+ return getStorage().length;
58
+ }
59
+
60
+ return 0;
61
+ }
62
+
63
+ return {
64
+ isAvailable,
65
+
66
+ clear,
67
+ getItem,
68
+ key,
69
+ removeItem,
70
+ setItem,
71
+ get length() {
72
+ return length();
73
+ },
74
+ };
75
+ }
@@ -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,64 @@
1
+ import React from 'react';
2
+ import { render } from '@testing-library/react';
3
+ import { ErrorBoundary, SafeSuspense } from '..';
4
+
5
+ describe('ErrorBoundary', () => {
6
+ const error = new Error('Test error');
7
+
8
+ const FailedComponent = () => {
9
+ throw error;
10
+ };
11
+
12
+ it('should render children component', () => {
13
+ const { container } = render(
14
+ <ErrorBoundary fallback={null}>
15
+ <div>Normal component</div>
16
+ </ErrorBoundary>,
17
+ );
18
+
19
+ expect(container.textContent).toContain('Normal component');
20
+ expect(container).toMatchSnapshot();
21
+ });
22
+
23
+ it('should render fallback component', () => {
24
+ const { container } = render(
25
+ <ErrorBoundary fallback={<div>Fallback</div>}>
26
+ <>
27
+ <div>Normal component</div>
28
+ <FailedComponent />
29
+ </>
30
+ </ErrorBoundary>,
31
+ );
32
+
33
+ expect(container.textContent).toContain('Fallback');
34
+ expect(container).toMatchSnapshot();
35
+ });
36
+
37
+ it('should call captureException', () => {
38
+ const handlerException = jest.fn();
39
+
40
+ const { container } = render(
41
+ <ErrorBoundary fallback={null} onError={handlerException}>
42
+ <>
43
+ <div>Normal component</div>
44
+ <FailedComponent />
45
+ </>
46
+ </ErrorBoundary>,
47
+ );
48
+
49
+ expect(handlerException).toBeCalledWith(error, { componentStack: expect.any(String) });
50
+ expect(container).toMatchSnapshot();
51
+ });
52
+ });
53
+
54
+ describe('SafeSuspense', () => {
55
+ it('should render with props', () => {
56
+ const { container } = render(
57
+ <SafeSuspense fallback={<div>Fallback</div>} onError={jest.fn()}>
58
+ <div>Normal component</div>
59
+ </SafeSuspense>,
60
+ );
61
+
62
+ expect(container).toMatchSnapshot();
63
+ });
64
+ });
@@ -0,0 +1,62 @@
1
+ import React from 'react';
2
+
3
+ export interface Props {
4
+ /** Дочерний компонент. */
5
+ children: NonNullable<React.ReactNode> | null;
6
+
7
+ /** Запасной элемент, если возникла ошибка. */
8
+ fallback: NonNullable<React.ReactNode> | null;
9
+
10
+ /** Функция для логирования ошибки. */
11
+ onError?: (error: Error, errorInfo: React.ErrorInfo) => void;
12
+ }
13
+
14
+ /**
15
+ * Обработчик ошибок в React-компонентах.
16
+ */
17
+ export class ErrorBoundary extends React.Component<Props, { hasError: boolean }> {
18
+ /**
19
+ * @param props Свойства.
20
+ */
21
+ constructor(props: Props) {
22
+ super(props);
23
+
24
+ this.state = { hasError: false };
25
+ }
26
+
27
+ /** @inheritdoc */
28
+ static getDerivedStateFromError() {
29
+ return { hasError: true };
30
+ }
31
+
32
+ /** @inheritdoc */
33
+ componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {
34
+ const { onError } = this.props;
35
+
36
+ onError?.(error, errorInfo);
37
+ }
38
+
39
+ /**
40
+ * Рендер.
41
+ * @return Дочерний элемент либо запасное значение.
42
+ */
43
+ render() {
44
+ const { children, fallback } = this.props;
45
+
46
+ return this.state.hasError ? fallback : children;
47
+ }
48
+ }
49
+
50
+ /**
51
+ * Обертка над Suspense c перехватом ошибок.
52
+ * @todo Возможно этот компонент не нужен...
53
+ * @param props Свойства.
54
+ * @return Элемент.
55
+ */
56
+ export const SafeSuspense = ({ children, fallback, onError }: Props) => (
57
+ <React.Suspense fallback={fallback}>
58
+ <ErrorBoundary fallback={fallback} onError={onError}>
59
+ {children}
60
+ </ErrorBoundary>
61
+ </React.Suspense>
62
+ );
@@ -0,0 +1,50 @@
1
+ import { createSlice } from '@reduxjs/toolkit';
2
+ import { createRemoteDataReducers, RemoteDataState, STATUS } from '../remote-data';
3
+
4
+ interface TestState extends RemoteDataState<number, string> {
5
+ foo: 'bar';
6
+ }
7
+
8
+ describe('createGenericSlice', () => {
9
+ const initialState: TestState = {
10
+ data: 0,
11
+ error: '',
12
+ status: STATUS.initial,
13
+ foo: 'bar',
14
+ };
15
+
16
+ const { reducer, actions } = createSlice({
17
+ name: 'user',
18
+ initialState,
19
+ reducers: createRemoteDataReducers<TestState>(),
20
+ });
21
+
22
+ it('should handle request action', () => {
23
+ const actual = reducer(initialState, actions.request());
24
+
25
+ expect(actual).toEqual({
26
+ ...initialState,
27
+ status: STATUS.fetching,
28
+ });
29
+ });
30
+
31
+ it('should handle success action', () => {
32
+ const actual = reducer(initialState, actions.success(234));
33
+
34
+ expect(actual).toEqual({
35
+ ...initialState,
36
+ data: 234,
37
+ status: STATUS.success,
38
+ });
39
+ });
40
+
41
+ it('should handle failure action', () => {
42
+ const actual = reducer(initialState, actions.failure('error message here'));
43
+
44
+ expect(actual).toEqual({
45
+ ...initialState,
46
+ error: 'error message here',
47
+ status: STATUS.failure,
48
+ });
49
+ });
50
+ });
@@ -0,0 +1,34 @@
1
+ import type { PayloadAction, Draft } from '@reduxjs/toolkit';
2
+
3
+ export type Status = 'initial' | 'fetching' | 'success' | 'failure';
4
+
5
+ export interface RemoteDataState<TData, TError> {
6
+ data: TData;
7
+ error: TError;
8
+ status: Status;
9
+ }
10
+
11
+ export const STATUS: Record<Status, Status> = {
12
+ initial: 'initial',
13
+ fetching: 'fetching',
14
+ success: 'success',
15
+ failure: 'failure',
16
+ };
17
+
18
+ /**
19
+ * Возвращает набор обработчиков для работы с удаленными данными.
20
+ * @return Набор.
21
+ */
22
+ export const createRemoteDataReducers = <S extends RemoteDataState<any, any>>() => ({
23
+ request: (state: Draft<S>) => {
24
+ state.status = STATUS.fetching;
25
+ },
26
+ success: (state: Draft<S>, action: PayloadAction<S['data']>) => {
27
+ state.data = action.payload;
28
+ state.status = STATUS.success;
29
+ },
30
+ failure: (state: Draft<S>, action: PayloadAction<S['error']>) => {
31
+ state.error = action.payload;
32
+ state.status = STATUS.failure;
33
+ },
34
+ });