@nlabs/reaktor 0.10.0 → 0.10.2

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 (448) hide show
  1. package/.env +1 -0
  2. package/.env.example +1 -0
  3. package/DATABASE_I18N_GUIDE.md +434 -0
  4. package/TEST_UTILITIES_GUIDE.md +360 -0
  5. package/coverage/actions/index.html +21 -36
  6. package/coverage/actions/notifications.ts.html +223 -0
  7. package/coverage/actions/posts.ts.html +2356 -0
  8. package/coverage/adapters/arangoAdapter.ts.html +170 -20
  9. package/coverage/adapters/fileAdapter.ts.html +445 -0
  10. package/coverage/adapters/index.html +72 -42
  11. package/coverage/adapters/postAdapter.ts.html +436 -0
  12. package/coverage/adapters/reaktorAdapter.ts.html +201 -18
  13. package/coverage/adapters/tagAdapter.ts.html +274 -25
  14. package/coverage/adapters/userAdapter.ts.html +829 -0
  15. package/coverage/analyticsUtils.ts.html +286 -0
  16. package/coverage/config.ts.html +766 -0
  17. package/coverage/index.html +77 -77
  18. package/coverage/mocks/group.ts.html +5 -5
  19. package/coverage/mocks/image.ts.html +18 -12
  20. package/coverage/mocks/index.html +37 -7
  21. package/coverage/mocks/post.ts.html +8 -8
  22. package/coverage/mocks/tag.ts.html +2 -2
  23. package/coverage/mocks/user.ts.html +18 -15
  24. package/coverage/testUtils.ts.html +1309 -0
  25. package/coverage/translationQueue.ts.html +592 -0
  26. package/coverage/types/error.types.ts.html +148 -0
  27. package/coverage/types/index.html +2 -2
  28. package/coverage/utils/adapterUtils.ts.html +39 -27
  29. package/coverage/utils/analyticsUtils.ts.html +35 -41
  30. package/coverage/utils/authUtils.ts.html +328 -0
  31. package/coverage/utils/dbI18n.ts.html +280 -0
  32. package/coverage/utils/googleTranslate.ts.html +385 -0
  33. package/coverage/utils/index.html +29 -44
  34. package/coverage/utils/localeUtils.ts.html +193 -0
  35. package/coverage/utils/sessionUtils.ts.html +211 -0
  36. package/coverage/utils/testUtils.ts.html +1309 -0
  37. package/index.js +1 -1
  38. package/lex.config.mjs +34 -0
  39. package/lib/actions/apps.d.ts +4 -4
  40. package/lib/actions/apps.js +17 -239
  41. package/lib/actions/connections.d.ts +2 -1
  42. package/lib/actions/connections.js +6 -89
  43. package/lib/actions/content.d.ts +13 -0
  44. package/lib/actions/content.js +17 -0
  45. package/lib/actions/conversations.d.ts +4 -2
  46. package/lib/actions/conversations.js +19 -336
  47. package/lib/actions/dynamodb.d.ts +4 -0
  48. package/lib/actions/dynamodb.js +2 -150
  49. package/lib/actions/email.d.ts +5 -2
  50. package/lib/actions/email.js +2 -152
  51. package/lib/actions/files.d.ts +3 -3
  52. package/lib/actions/files.js +5 -283
  53. package/lib/actions/groups.d.ts +4 -5
  54. package/lib/actions/groups.js +19 -259
  55. package/lib/actions/images.d.ts +8 -1
  56. package/lib/actions/images.js +31 -700
  57. package/lib/actions/index.d.ts +27 -23
  58. package/lib/actions/index.js +2 -66
  59. package/lib/actions/ios.d.ts +3 -3
  60. package/lib/actions/ios.js +9 -162
  61. package/lib/actions/locations.d.ts +3 -3
  62. package/lib/actions/locations.js +7 -122
  63. package/lib/actions/messages.d.ts +3 -4
  64. package/lib/actions/messages.js +21 -196
  65. package/lib/actions/notifications.d.ts +5 -1
  66. package/lib/actions/notifications.js +2 -59
  67. package/lib/actions/payments.d.ts +3 -1
  68. package/lib/actions/payments.js +11 -464
  69. package/lib/actions/posts.d.ts +7 -4
  70. package/lib/actions/posts.js +75 -527
  71. package/lib/actions/profiles.d.ts +4 -0
  72. package/lib/actions/profiles.js +8 -0
  73. package/lib/actions/reactions.d.ts +3 -1
  74. package/lib/actions/reactions.js +25 -312
  75. package/lib/actions/s3.d.ts +4 -0
  76. package/lib/actions/s3.js +2 -133
  77. package/lib/actions/search.d.ts +2 -2
  78. package/lib/actions/search.js +5 -90
  79. package/lib/actions/sms.d.ts +2 -9
  80. package/lib/actions/sms.js +2 -108
  81. package/lib/actions/statistics.d.ts +2 -1
  82. package/lib/actions/statistics.js +6 -60
  83. package/lib/actions/{subscription.d.ts → subscriptions.d.ts} +2 -2
  84. package/lib/actions/subscriptions.js +12 -0
  85. package/lib/actions/tags.d.ts +3 -3
  86. package/lib/actions/tags.js +19 -287
  87. package/lib/actions/users.d.ts +13 -12
  88. package/lib/actions/users.js +66 -763
  89. package/lib/actions/websockets.d.ts +2 -2
  90. package/lib/actions/websockets.js +14 -158
  91. package/lib/adapters/arangoAdapter.d.ts +7 -1
  92. package/lib/adapters/arangoAdapter.js +2 -46
  93. package/lib/adapters/contentAdapter.d.ts +8 -0
  94. package/lib/adapters/contentAdapter.js +2 -0
  95. package/lib/adapters/fileAdapter.d.ts +8 -2
  96. package/lib/adapters/fileAdapter.js +2 -76
  97. package/lib/adapters/imageAdapter.d.ts +7 -1
  98. package/lib/adapters/imageAdapter.js +2 -40
  99. package/lib/adapters/index.d.ts +9 -0
  100. package/lib/adapters/index.js +2 -0
  101. package/lib/adapters/messageAdapter.d.ts +7 -1
  102. package/lib/adapters/messageAdapter.js +2 -49
  103. package/lib/adapters/postAdapter.d.ts +7 -1
  104. package/lib/adapters/postAdapter.js +2 -70
  105. package/lib/adapters/reaktorAdapter.d.ts +16 -6
  106. package/lib/adapters/reaktorAdapter.js +2 -44
  107. package/lib/adapters/tagAdapter.d.ts +8 -1
  108. package/lib/adapters/tagAdapter.js +2 -50
  109. package/lib/adapters/userAdapter.d.ts +12 -1
  110. package/lib/adapters/userAdapter.js +2 -115
  111. package/lib/config.d.ts +43 -6
  112. package/lib/config.js +2 -125
  113. package/lib/handlers/graphqlHandler.d.ts +4 -0
  114. package/lib/handlers/graphqlHandler.js +2 -0
  115. package/lib/index.d.ts +17 -10
  116. package/lib/index.js +2 -66
  117. package/lib/lambdas/actions/websockets.d.ts +3 -3
  118. package/lib/lambdas/actions/websockets.js +14 -116
  119. package/lib/lambdas/authorizer.js +2 -67
  120. package/lib/lambdas/connection.js +2 -91
  121. package/lib/lambdas/utils/message.js +2 -42
  122. package/lib/lambdas/utils/websocket.js +2 -105
  123. package/lib/mocks/conversation.js +2 -35
  124. package/lib/mocks/file.js +2 -38
  125. package/lib/mocks/group.js +2 -47
  126. package/lib/mocks/image.d.ts +1 -1
  127. package/lib/mocks/image.js +2 -44
  128. package/lib/mocks/post.js +2 -55
  129. package/lib/mocks/tag.d.ts +1 -1
  130. package/lib/mocks/tag.js +2 -37
  131. package/lib/mocks/user.d.ts +1 -1
  132. package/lib/mocks/user.js +2 -88
  133. package/lib/mutations/content.d.ts +2 -0
  134. package/lib/mutations/content.js +2 -0
  135. package/lib/mutations/index.d.ts +11 -3
  136. package/lib/mutations/index.js +2 -26
  137. package/lib/mutations/locations.d.ts +1 -1
  138. package/lib/mutations/locations.js +2 -44
  139. package/lib/mutations/messages.d.ts +1 -1
  140. package/lib/mutations/messages.js +2 -86
  141. package/lib/mutations/posts.d.ts +1 -1
  142. package/lib/mutations/posts.js +2 -53
  143. package/lib/mutations/profiles.d.ts +2 -0
  144. package/lib/mutations/profiles.js +2 -0
  145. package/lib/mutations/reactions.d.ts +1 -1
  146. package/lib/mutations/reactions.js +2 -51
  147. package/lib/mutations/statistics.d.ts +1 -1
  148. package/lib/mutations/statistics.js +2 -39
  149. package/lib/mutations/subscriptions.d.ts +1 -1
  150. package/lib/mutations/subscriptions.js +2 -56
  151. package/lib/mutations/tags.d.ts +1 -1
  152. package/lib/mutations/tags.js +2 -120
  153. package/lib/mutations/users.js +2 -116
  154. package/lib/objectTypes/app.js +2 -173
  155. package/lib/objectTypes/bankAccount.js +2 -76
  156. package/lib/objectTypes/connection.js +2 -48
  157. package/lib/objectTypes/content.d.ts +2 -0
  158. package/lib/objectTypes/content.js +2 -0
  159. package/lib/objectTypes/conversation.js +2 -77
  160. package/lib/objectTypes/creditCard.js +2 -86
  161. package/lib/objectTypes/document.js +2 -46
  162. package/lib/objectTypes/error.js +2 -46
  163. package/lib/objectTypes/external.js +2 -74
  164. package/lib/objectTypes/file.js +2 -100
  165. package/lib/objectTypes/filter.js +2 -43
  166. package/lib/objectTypes/group.js +2 -123
  167. package/lib/objectTypes/iapSubscription.js +2 -40
  168. package/lib/objectTypes/image.d.ts +4 -0
  169. package/lib/objectTypes/image.js +2 -129
  170. package/lib/objectTypes/index.d.ts +26 -24
  171. package/lib/objectTypes/index.js +2 -68
  172. package/lib/objectTypes/location.js +2 -109
  173. package/lib/objectTypes/message.js +2 -96
  174. package/lib/objectTypes/passcode.js +2 -42
  175. package/lib/objectTypes/plan.js +2 -95
  176. package/lib/objectTypes/post.js +2 -125
  177. package/lib/objectTypes/profile.d.ts +3 -0
  178. package/lib/objectTypes/profile.js +2 -0
  179. package/lib/objectTypes/reaction.js +2 -61
  180. package/lib/objectTypes/relation.js +2 -49
  181. package/lib/objectTypes/search.js +2 -72
  182. package/lib/objectTypes/statistics.js +2 -39
  183. package/lib/objectTypes/subscription.js +2 -117
  184. package/lib/objectTypes/tag.js +2 -65
  185. package/lib/objectTypes/user.js +2 -144
  186. package/lib/queries/content.d.ts +2 -0
  187. package/lib/queries/content.js +2 -0
  188. package/lib/queries/index.d.ts +10 -3
  189. package/lib/queries/index.js +2 -33
  190. package/lib/queries/locations.d.ts +1 -1
  191. package/lib/queries/locations.js +2 -45
  192. package/lib/queries/messages.d.ts +1 -1
  193. package/lib/queries/messages.js +2 -52
  194. package/lib/queries/posts.d.ts +1 -1
  195. package/lib/queries/posts.js +2 -154
  196. package/lib/queries/reactions.d.ts +1 -1
  197. package/lib/queries/reactions.js +2 -56
  198. package/lib/queries/statistics.d.ts +1 -1
  199. package/lib/queries/statistics.js +2 -39
  200. package/lib/queries/subscriptions.d.ts +1 -1
  201. package/lib/queries/subscriptions.js +2 -44
  202. package/lib/queries/tags.d.ts +1 -1
  203. package/lib/queries/tags.js +2 -75
  204. package/lib/queries/users.js +2 -64
  205. package/lib/templates/email/layout.js +3 -25
  206. package/lib/templates/email/passwordForgot.js +3 -25
  207. package/lib/templates/email/passwordRecovery.js +3 -25
  208. package/lib/templates/email/verifyEmail.js +3 -25
  209. package/lib/templates/email/welcome.js +3 -25
  210. package/lib/templates/sms/passwordForgot.js +2 -24
  211. package/lib/templates/sms/passwordRecovery.js +2 -24
  212. package/lib/templates/sms/verifyEmail.js +2 -24
  213. package/lib/templates/sms/verifyPhone.js +2 -24
  214. package/lib/templates/sms/welcome.js +2 -24
  215. package/lib/types/apps.types.d.ts +6 -2
  216. package/lib/types/apps.types.js +2 -32
  217. package/lib/types/arangodb.types.d.ts +8 -4
  218. package/lib/types/arangodb.types.js +1 -16
  219. package/lib/types/auth.types.d.ts +11 -5
  220. package/lib/types/auth.types.js +1 -16
  221. package/lib/types/connections.types.d.ts +5 -1
  222. package/lib/types/connections.types.js +1 -16
  223. package/lib/types/content.types.d.ts +31 -0
  224. package/lib/types/content.types.js +1 -0
  225. package/lib/types/conversations.types.d.ts +6 -2
  226. package/lib/types/conversations.types.js +1 -16
  227. package/lib/types/email.types.d.ts +9 -5
  228. package/lib/types/email.types.js +1 -16
  229. package/lib/types/error.types.d.ts +1 -0
  230. package/lib/types/error.types.js +2 -44
  231. package/lib/types/files.types.d.ts +5 -1
  232. package/lib/types/files.types.js +1 -16
  233. package/lib/types/google.types.d.ts +4 -0
  234. package/lib/types/google.types.js +1 -16
  235. package/lib/types/groups.types.d.ts +5 -1
  236. package/lib/types/groups.types.js +1 -16
  237. package/lib/types/images.types.d.ts +6 -2
  238. package/lib/types/images.types.js +1 -16
  239. package/lib/types/index.d.ts +26 -20
  240. package/lib/types/index.js +2 -60
  241. package/lib/types/locations.types.d.ts +5 -1
  242. package/lib/types/locations.types.js +1 -16
  243. package/lib/types/messages.types.d.ts +7 -3
  244. package/lib/types/messages.types.js +1 -16
  245. package/lib/types/notifications.types.d.ts +9 -5
  246. package/lib/types/notifications.types.js +1 -16
  247. package/lib/types/payments.types.d.ts +5 -1
  248. package/lib/types/payments.types.js +1 -16
  249. package/lib/types/posts.types.d.ts +7 -3
  250. package/lib/types/posts.types.js +1 -16
  251. package/lib/types/{personas.types.d.ts → profiles.types.d.ts} +3 -15
  252. package/lib/types/profiles.types.js +1 -0
  253. package/lib/types/statistics.types.js +1 -16
  254. package/lib/types/tags.types.d.ts +5 -1
  255. package/lib/types/tags.types.js +1 -16
  256. package/lib/types/users.types.d.ts +41 -10
  257. package/lib/types/users.types.js +1 -16
  258. package/lib/types/websockets.types.d.ts +5 -1
  259. package/lib/types/websockets.types.js +1 -16
  260. package/lib/utils/adapterUtils.d.ts +4 -0
  261. package/lib/utils/adapterUtils.js +2 -45
  262. package/lib/utils/analyticsUtils.d.ts +5 -1
  263. package/lib/utils/analyticsUtils.js +2 -72
  264. package/lib/utils/arangodbUtils.d.ts +6 -2
  265. package/lib/utils/arangodbUtils.js +5 -163
  266. package/lib/utils/{auth.d.ts → authUtils.d.ts} +3 -1
  267. package/lib/utils/authUtils.js +2 -0
  268. package/lib/utils/contextUtils.d.ts +3 -0
  269. package/lib/utils/contextUtils.js +2 -0
  270. package/lib/utils/dbI18n.d.ts +10 -0
  271. package/lib/utils/dbI18n.example.d.ts +20 -0
  272. package/lib/utils/dbI18n.example.js +6 -0
  273. package/lib/utils/dbI18n.js +2 -0
  274. package/lib/utils/googleTranslate.d.ts +6 -0
  275. package/lib/utils/googleTranslate.js +2 -0
  276. package/lib/utils/graphqlUtils.d.ts +10 -0
  277. package/lib/utils/graphqlUtils.js +2 -0
  278. package/lib/utils/index.d.ts +18 -5
  279. package/lib/utils/index.js +2 -30
  280. package/lib/utils/languageDetection.d.ts +8 -0
  281. package/lib/utils/languageDetection.js +2 -0
  282. package/lib/utils/localeUtils.d.ts +11 -0
  283. package/lib/utils/localeUtils.example.d.ts +5 -0
  284. package/lib/utils/localeUtils.example.js +2 -0
  285. package/lib/utils/localeUtils.js +2 -0
  286. package/lib/utils/middlewareUtils.d.ts +2 -0
  287. package/lib/utils/middlewareUtils.js +2 -0
  288. package/lib/utils/{session.d.ts → sessionUtils.d.ts} +1 -1
  289. package/lib/utils/sessionUtils.js +2 -0
  290. package/lib/utils/stripeUtils.d.ts +7 -3
  291. package/lib/utils/stripeUtils.js +2 -43
  292. package/lib/utils/templateUtils.d.ts +3 -0
  293. package/lib/utils/templateUtils.js +2 -0
  294. package/lib/utils/testUtils.d.ts +95 -0
  295. package/lib/utils/testUtils.js +2 -0
  296. package/lib/utils/translationQueue.d.ts +29 -0
  297. package/lib/utils/translationQueue.example.d.ts +33 -0
  298. package/lib/utils/translationQueue.example.js +2 -0
  299. package/lib/utils/translationQueue.js +2 -0
  300. package/package.json +32 -28
  301. package/tsconfig.build.json +21 -0
  302. package/tsconfig.lint.json +33 -0
  303. package/tsconfig.test.json +31 -0
  304. package/.prettierrc.js +0 -4
  305. package/dist/actions/apps.js +0 -242
  306. package/dist/actions/connections.js +0 -90
  307. package/dist/actions/conversations.js +0 -350
  308. package/dist/actions/dynamodb.js +0 -150
  309. package/dist/actions/email.js +0 -152
  310. package/dist/actions/files.js +0 -283
  311. package/dist/actions/groups.js +0 -292
  312. package/dist/actions/images.js +0 -735
  313. package/dist/actions/index.js +0 -66
  314. package/dist/actions/ios.js +0 -164
  315. package/dist/actions/locations.js +0 -122
  316. package/dist/actions/messages.js +0 -208
  317. package/dist/actions/notifications.js +0 -59
  318. package/dist/actions/payments.js +0 -497
  319. package/dist/actions/personas.js +0 -110
  320. package/dist/actions/posts.js +0 -595
  321. package/dist/actions/reactions.js +0 -322
  322. package/dist/actions/s3.js +0 -133
  323. package/dist/actions/search.js +0 -90
  324. package/dist/actions/sms.js +0 -108
  325. package/dist/actions/statistics.js +0 -62
  326. package/dist/actions/subscription.js +0 -220
  327. package/dist/actions/tags.js +0 -292
  328. package/dist/actions/users.js +0 -784
  329. package/dist/actions/websockets.js +0 -174
  330. package/dist/adapters/arangoAdapter.js +0 -46
  331. package/dist/adapters/fileAdapter.js +0 -76
  332. package/dist/adapters/imageAdapter.js +0 -40
  333. package/dist/adapters/messageAdapter.js +0 -49
  334. package/dist/adapters/postAdapter.js +0 -70
  335. package/dist/adapters/reaktorAdapter.js +0 -44
  336. package/dist/adapters/tagAdapter.js +0 -50
  337. package/dist/adapters/userAdapter.js +0 -115
  338. package/dist/config.js +0 -125
  339. package/dist/index.js +0 -66
  340. package/dist/lambdas/actions/websockets.js +0 -132
  341. package/dist/lambdas/authorizer.js +0 -67
  342. package/dist/lambdas/connection.js +0 -91
  343. package/dist/lambdas/utils/message.js +0 -42
  344. package/dist/lambdas/utils/websocket.js +0 -105
  345. package/dist/mocks/conversation.js +0 -35
  346. package/dist/mocks/file.js +0 -38
  347. package/dist/mocks/group.js +0 -47
  348. package/dist/mocks/image.js +0 -44
  349. package/dist/mocks/nlabs.png +0 -0
  350. package/dist/mocks/post.js +0 -55
  351. package/dist/mocks/tag.js +0 -37
  352. package/dist/mocks/user.js +0 -88
  353. package/dist/mutations/index.js +0 -26
  354. package/dist/mutations/locations.js +0 -44
  355. package/dist/mutations/messages.js +0 -86
  356. package/dist/mutations/personas.js +0 -100
  357. package/dist/mutations/posts.js +0 -53
  358. package/dist/mutations/reactions.js +0 -51
  359. package/dist/mutations/statistics.js +0 -39
  360. package/dist/mutations/subscriptions.js +0 -56
  361. package/dist/mutations/tags.js +0 -120
  362. package/dist/mutations/users.js +0 -116
  363. package/dist/objectTypes/app.js +0 -173
  364. package/dist/objectTypes/bankAccount.js +0 -76
  365. package/dist/objectTypes/connection.js +0 -48
  366. package/dist/objectTypes/conversation.js +0 -77
  367. package/dist/objectTypes/creditCard.js +0 -86
  368. package/dist/objectTypes/document.js +0 -46
  369. package/dist/objectTypes/error.js +0 -46
  370. package/dist/objectTypes/external.js +0 -74
  371. package/dist/objectTypes/file.js +0 -100
  372. package/dist/objectTypes/filter.js +0 -43
  373. package/dist/objectTypes/group.js +0 -123
  374. package/dist/objectTypes/iapSubscription.js +0 -40
  375. package/dist/objectTypes/image.js +0 -129
  376. package/dist/objectTypes/index.js +0 -68
  377. package/dist/objectTypes/location.js +0 -109
  378. package/dist/objectTypes/message.js +0 -96
  379. package/dist/objectTypes/passcode.js +0 -42
  380. package/dist/objectTypes/persona.js +0 -87
  381. package/dist/objectTypes/plan.js +0 -95
  382. package/dist/objectTypes/post.js +0 -125
  383. package/dist/objectTypes/reaction.js +0 -61
  384. package/dist/objectTypes/relation.js +0 -49
  385. package/dist/objectTypes/search.js +0 -72
  386. package/dist/objectTypes/statistics.js +0 -39
  387. package/dist/objectTypes/subscription.js +0 -117
  388. package/dist/objectTypes/tag.js +0 -65
  389. package/dist/objectTypes/user.js +0 -144
  390. package/dist/queries/index.js +0 -33
  391. package/dist/queries/locations.js +0 -45
  392. package/dist/queries/messages.js +0 -52
  393. package/dist/queries/posts.js +0 -154
  394. package/dist/queries/reactions.js +0 -56
  395. package/dist/queries/statistics.js +0 -39
  396. package/dist/queries/subscriptions.js +0 -44
  397. package/dist/queries/tags.js +0 -75
  398. package/dist/queries/users.js +0 -64
  399. package/dist/templates/email/layout.js +0 -302
  400. package/dist/templates/email/passwordForgot.js +0 -38
  401. package/dist/templates/email/passwordRecovery.js +0 -35
  402. package/dist/templates/email/verifyEmail.js +0 -38
  403. package/dist/templates/email/welcome.js +0 -38
  404. package/dist/templates/sms/passwordForgot.js +0 -24
  405. package/dist/templates/sms/passwordRecovery.js +0 -24
  406. package/dist/templates/sms/verifyEmail.js +0 -24
  407. package/dist/templates/sms/verifyPhone.js +0 -24
  408. package/dist/templates/sms/welcome.js +0 -24
  409. package/dist/types/apps.js +0 -32
  410. package/dist/types/arangodb.js +0 -16
  411. package/dist/types/auth.js +0 -16
  412. package/dist/types/connections.js +0 -16
  413. package/dist/types/conversations.js +0 -16
  414. package/dist/types/email.js +0 -16
  415. package/dist/types/error.js +0 -44
  416. package/dist/types/files.js +0 -16
  417. package/dist/types/google.js +0 -16
  418. package/dist/types/groups.js +0 -16
  419. package/dist/types/images.js +0 -16
  420. package/dist/types/index.js +0 -60
  421. package/dist/types/locations.js +0 -16
  422. package/dist/types/messages.js +0 -16
  423. package/dist/types/notifications.js +0 -16
  424. package/dist/types/payments.js +0 -16
  425. package/dist/types/personas.js +0 -16
  426. package/dist/types/posts.js +0 -16
  427. package/dist/types/statistics.js +0 -16
  428. package/dist/types/tags.js +0 -16
  429. package/dist/types/users.js +0 -16
  430. package/dist/types/websockets.js +0 -16
  431. package/dist/utils/adapterUtils.js +0 -45
  432. package/dist/utils/analyticsUtils.js +0 -72
  433. package/dist/utils/arangodbUtils.js +0 -165
  434. package/dist/utils/auth.js +0 -57
  435. package/dist/utils/index.js +0 -30
  436. package/dist/utils/session.js +0 -60
  437. package/jest.setup.js +0 -0
  438. package/lex.config.cjs +0 -13
  439. package/lib/actions/personas.d.ts +0 -3
  440. package/lib/actions/personas.js +0 -110
  441. package/lib/actions/subscription.js +0 -208
  442. package/lib/mutations/personas.d.ts +0 -2
  443. package/lib/mutations/personas.js +0 -100
  444. package/lib/objectTypes/persona.d.ts +0 -3
  445. package/lib/objectTypes/persona.js +0 -87
  446. package/lib/types/personas.types.js +0 -16
  447. package/lib/utils/auth.js +0 -57
  448. package/lib/utils/session.js +0 -60
@@ -0,0 +1,2 @@
1
+ const n=(t,e)=>{let r=t;return Object.keys(e).forEach(s=>{const a=new RegExp(`\\[${s}\\]`,"g");r=r.replace(a,e[s])}),r},p=(t,e)=>n(t,e);export{p as createTemplate,n as parseTemplate};
2
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL3V0aWxzL3RlbXBsYXRlVXRpbHMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImV4cG9ydCB0eXBlIFRlbXBsYXRlUGFyYW1zID0gUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblxuZXhwb3J0IGNvbnN0IHBhcnNlVGVtcGxhdGUgPSAodGVtcGxhdGU6IHN0cmluZywgcGFyYW1zOiBUZW1wbGF0ZVBhcmFtcyk6IHN0cmluZyA9PiB7XG4gIGxldCByZXN1bHQgPSB0ZW1wbGF0ZTtcblxuICBPYmplY3Qua2V5cyhwYXJhbXMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChgXFxcXFske2tleX1cXFxcXWAsICdnJyk7XG4gICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UocmVnZXgsIHBhcmFtc1trZXldKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVUZW1wbGF0ZSA9IDxUIGV4dGVuZHMgVGVtcGxhdGVQYXJhbXM+KHRlbXBsYXRlU3RyaW5nOiBzdHJpbmcsIHBhcmFtczogVCk6IHN0cmluZyA9PlxuICBwYXJzZVRlbXBsYXRlKHRlbXBsYXRlU3RyaW5nLCBwYXJhbXMpOyJdLAogICJtYXBwaW5ncyI6ICJBQUVPLE1BQU1BLEVBQWdCLENBQUNDLEVBQWtCQyxJQUFtQyxDQUNqRixJQUFJQyxFQUFTRixFQUViLGNBQU8sS0FBS0MsQ0FBTSxFQUFFLFFBQVNFLEdBQVEsQ0FDbkMsTUFBTUMsRUFBUSxJQUFJLE9BQU8sTUFBTUQsQ0FBRyxNQUFPLEdBQUcsRUFDNUNELEVBQVNBLEVBQU8sUUFBUUUsRUFBT0gsRUFBT0UsQ0FBRyxDQUFDLENBQzVDLENBQUMsRUFFTUQsQ0FDVCxFQUVhRyxFQUFpQixDQUEyQkMsRUFBd0JMLElBQy9FRixFQUFjTyxFQUFnQkwsQ0FBTSIsCiAgIm5hbWVzIjogWyJwYXJzZVRlbXBsYXRlIiwgInRlbXBsYXRlIiwgInBhcmFtcyIsICJyZXN1bHQiLCAia2V5IiwgInJlZ2V4IiwgImNyZWF0ZVRlbXBsYXRlIiwgInRlbXBsYXRlU3RyaW5nIl0KfQo=
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Copyright (c) 2025-Present, Nitrogen Labs, Inc.
3
+ * Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
4
+ */
5
+ import { jest } from '@jest/globals';
6
+ import type { GraphQLResolveInfo } from 'graphql';
7
+ import type { ApiContext } from '../types/auth.types.js';
8
+ type MockOverrides = Partial<Record<string, unknown>>;
9
+ type TestContext = Partial<ApiContext> & {
10
+ session?: Partial<{
11
+ userId: string;
12
+ username: string;
13
+ userAccess: number;
14
+ }>;
15
+ };
16
+ type TestArgs = Record<string, unknown>;
17
+ type TestReturnValue = unknown;
18
+ export declare const createMockContext: (overrides?: MockOverrides) => ApiContext;
19
+ export declare const createMockResolveInfo: (fieldName?: string) => GraphQLResolveInfo;
20
+ export declare const mockActionsModule: (modulePath: string, mockActions: Record<string, jest.Mock>) => Promise<void>;
21
+ export declare const mockObjectType: (modulePath: string, typeName: string) => Promise<void>;
22
+ export declare const createQueryTestSuite: (name: string, actionsPath: string, testCases: Array<{
23
+ name: string;
24
+ actionName: string;
25
+ args: TestArgs;
26
+ expectedCall: (context: TestContext, args: TestArgs) => TestArgs;
27
+ mockReturnValue: TestReturnValue;
28
+ errorCase?: boolean;
29
+ }>) => void;
30
+ export declare const createMutationTestSuite: (name: string, actionsPath: string, testCases: Array<{
31
+ name: string;
32
+ actionName: string;
33
+ args: TestArgs;
34
+ expectedCall: (context: TestContext, args: TestArgs) => TestArgs;
35
+ mockReturnValue: TestReturnValue;
36
+ requiresAuth?: boolean;
37
+ authUserId?: string;
38
+ }>) => void;
39
+ export declare const createIntegrationTestSuite: (name: string, actionsPath: string, objectTypePath: string, typeName: string, testCases: Array<{
40
+ name: string;
41
+ actionName: string;
42
+ args: TestArgs;
43
+ expectedCall: (context: TestContext, args: TestArgs) => TestArgs;
44
+ successReturnValue: TestReturnValue;
45
+ errorReturnValue: TestReturnValue;
46
+ testErrorCase: boolean;
47
+ }>) => void;
48
+ export declare const createMockUser: (overrides?: MockOverrides) => {
49
+ email: string;
50
+ firstName: string;
51
+ lastName: string;
52
+ userId: string;
53
+ username: string;
54
+ };
55
+ export declare const createMockPost: (overrides?: MockOverrides) => {
56
+ content: string;
57
+ createdAt: string;
58
+ postId: string;
59
+ userId: string;
60
+ };
61
+ export declare const createMockMessage: (overrides?: MockOverrides) => {
62
+ content: string;
63
+ conversationId: string;
64
+ createdAt: string;
65
+ messageId: string;
66
+ userId: string;
67
+ };
68
+ export declare const createMockReaction: (overrides?: MockOverrides) => {
69
+ createdAt: string;
70
+ postId: string;
71
+ reactionId: string;
72
+ type: string;
73
+ userId: string;
74
+ };
75
+ export declare const createMockTag: (overrides?: MockOverrides) => {
76
+ description: string;
77
+ name: string;
78
+ tagId: string;
79
+ };
80
+ export declare const setupCommonMocks: () => Promise<void>;
81
+ export declare const clearAllMocks: () => void;
82
+ export declare const createActionTestSuite: (name: string, actionsPath: string, testCases: Array<{
83
+ name: string;
84
+ actionName: string;
85
+ args: TestArgs;
86
+ mockQuery: jest.Mock;
87
+ expectedResult: TestReturnValue;
88
+ }>) => void;
89
+ export declare const createAdapterTestSuite: (name: string, adapterPath: string, testCases: any[]) => void;
90
+ export declare const createUtilsTestSuite: (name: string, utilsPath: string, testCases: Array<{
91
+ name: string;
92
+ input: TestArgs;
93
+ expectedOutput: TestReturnValue;
94
+ }>) => void;
95
+ export {};
@@ -0,0 +1,2 @@
1
+ import{jest as t}from"@jest/globals";const y=(e={})=>{const r={userAccess:1,userId:"user1",username:"testuser"},n=e.session||{},s={databaseName:e.databaseName??"test",...e};return delete s.session,s.session={userAccess:n.userAccess!==void 0?n.userAccess:r.userAccess,userId:n.userId!==void 0?n.userId:r.userId,username:n.username!==void 0?n.username:r.username},s},x=(e="test")=>({fieldName:e,fieldNodes:[],fragments:{},operation:{},parentType:{},path:{key:e,prev:void 0,typename:"Test"},returnType:{},rootValue:{},schema:{},variableValues:{}}),A=async(e,r)=>{const n=Object.entries(r).reduce((s,[a,c])=>(s[a]=t.fn().mockImplementation(c),s),{});await t.isolateModulesAsync(async()=>{t.unstable_mockModule(e,()=>({__esModule:!0,...n,default:n}))})},I=async(e,r)=>{const n={__esModule:!0,[r]:{getField:t.fn(()=>({resolve:t.fn()})),getFields:t.fn(()=>({}))},default:{[r]:{getField:t.fn(()=>({resolve:t.fn()})),getFields:t.fn(()=>({}))}}};await t.isolateModulesAsync(async()=>{t.unstable_mockModule(e,()=>n)})},h=(e,r,n)=>{describe(`${e} Queries`,()=>{let s;const a=y();beforeAll(()=>{s={}}),n.forEach(({name:c,actionName:l,args:o,expectedCall:u,mockReturnValue:p,errorCase:d=!1})=>{it(`should call ${l} action with correct parameters`,async()=>{const i=t.fn().mockImplementation(()=>Promise.resolve(p));s[l]=i;const m=await i(a,o);expect(i).toHaveBeenCalledWith(a,u(a,o)),expect(m).toEqual(p)}),d&&it(`should handle ${l} when no data found`,async()=>{const i=t.fn().mockImplementation(()=>Promise.resolve(null));s[l]=i;const m=await i(a,o);expect(i).toHaveBeenCalledWith(a,u(a,o)),expect(m).toBeNull()})})})},M=(e,r,n)=>{describe(`${e} Mutations`,()=>{let s;beforeAll(()=>{s={}}),n.forEach(({actionName:a,args:c,expectedCall:l,mockReturnValue:o,requiresAuth:u=!1,authUserId:p})=>{it(`should call ${a} action with correct parameters`,async()=>{const d=y();u&&p&&(d.session.userId=p);const i=t.fn().mockImplementation(()=>Promise.resolve(o));s[a]=i;const m=await i(d,c);expect(i).toHaveBeenCalledWith(d,l(d,c)),expect(m).toEqual(o)})})})},b=(e,r,n,s,a)=>{describe(`${e} Integration`,()=>{let c;beforeAll(()=>{c={}}),a.forEach(({name:l,actionName:o,args:u,expectedCall:p,successReturnValue:d,errorReturnValue:i,testErrorCase:m})=>{describe(l,()=>{it(`should return data when ${o} succeeds`,async()=>{const g=y(),f=t.fn().mockImplementation(()=>Promise.resolve(d));c[o]=f;const T=await f(g,u);expect(f).toHaveBeenCalledWith(g,p(g,u)),expect(T).toEqual(d||{})}),m&&it(`should handle ${o} when no data found`,async()=>{const g=y(),f=t.fn().mockImplementation(()=>Promise.resolve(i));c[o]=f;const T=await f(g,u);expect(f).toHaveBeenCalledWith(g,p(g,u)),expect(T).toEqual(i)})})})})},v=(e={})=>({email:"test@example.com",firstName:"Test",lastName:"User",userId:"user1",username:"testuser",...e}),R=(e={})=>({content:"Test post content",createdAt:new Date().toISOString(),postId:"post1",userId:"user1",...e}),w=(e={})=>({content:"Test message",conversationId:"conv1",createdAt:new Date().toISOString(),messageId:"msg1",userId:"user1",...e}),C=(e={})=>({createdAt:new Date().toISOString(),postId:"post1",reactionId:"react1",type:"like",userId:"user1",...e}),E=(e={})=>({description:"Test tag description",name:"test-tag",tagId:"tag1",...e}),S=async()=>{const e={__esModule:!0,useDb:t.fn(),getLimit:t.fn(),getDocId:t.fn(),sortIds:t.fn(),getGqlFields:t.fn(),default:{useDb:t.fn(),getLimit:t.fn(),getDocId:t.fn(),sortIds:t.fn(),getGqlFields:t.fn()}};await t.isolateModulesAsync(async()=>{t.unstable_mockModule("./arangodbUtils.js",()=>e)})},V=()=>{t.clearAllMocks()},q=(e,r,n)=>{describe(`${e} actions`,()=>{let s;beforeAll(async()=>{s=await import(r)}),n.forEach(({name:a,actionName:c,args:l,mockQuery:o,expectedResult:u})=>{it(`should execute ${c}`,async()=>{const p=y(),d=t.fn().mockReturnValue({query:o}),i=t.requireActual("./arangodbUtils.js");t.doMock("./arangodbUtils.js",()=>({useDb:d,...i}));const m=await s[c](p,l);expect(m).toEqual(u)})})})},O=(e,r,n)=>{describe(e,()=>{let s;beforeAll(async()=>{s=await import(r)}),n.forEach(({name:a,input:c,expectedOutput:l})=>{it(`should ${a}`,()=>{const o=s.parseTag(c);expect(o).toEqual(l)})})})},P=(e,r,n)=>{describe(e,()=>{let s;beforeAll(async()=>{s=await import(r)}),n.forEach(({name:a,input:c,expectedOutput:l})=>{it(`should ${a}`,()=>{let o;if(s.logInfo)o=s.logInfo(c);else if(s.removeEmptyKeys)o=s.removeEmptyKeys(c);else throw new Error(`No suitable function found in ${r}`);expect(o).toEqual(l)})})})};export{V as clearAllMocks,q as createActionTestSuite,O as createAdapterTestSuite,b as createIntegrationTestSuite,y as createMockContext,w as createMockMessage,R as createMockPost,C as createMockReaction,x as createMockResolveInfo,E as createMockTag,v as createMockUser,M as createMutationTestSuite,h as createQueryTestSuite,P as createUtilsTestSuite,A as mockActionsModule,I as mockObjectType,S as setupCommonMocks};
2
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL3V0aWxzL3Rlc3RVdGlscy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjUtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7amVzdH0gZnJvbSAnQGplc3QvZ2xvYmFscyc7XG5pbXBvcnQgdHlwZSB7R3JhcGhRTFJlc29sdmVJbmZvfSBmcm9tICdncmFwaHFsJztcblxuXG5pbXBvcnQgdHlwZSB7QXBpQ29udGV4dH0gZnJvbSAnLi4vdHlwZXMvYXV0aC50eXBlcy5qcyc7XG5cbi8vIERlZmluZSBwcm9wZXIgdHlwZXMgZm9yIHRlc3QgdXRpbGl0aWVzXG50eXBlIE1vY2tPdmVycmlkZXMgPSBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcbnR5cGUgVGVzdENvbnRleHQgPSBQYXJ0aWFsPEFwaUNvbnRleHQ+ICYge3Nlc3Npb24/OiBQYXJ0aWFsPHt1c2VySWQ6IHN0cmluZzsgdXNlcm5hbWU6IHN0cmluZzsgdXNlckFjY2VzczogbnVtYmVyfT59O1xudHlwZSBUZXN0QXJncyA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xudHlwZSBUZXN0UmV0dXJuVmFsdWUgPSB1bmtub3duO1xuXG5leHBvcnQgY29uc3QgY3JlYXRlTW9ja0NvbnRleHQgPSAob3ZlcnJpZGVzOiBNb2NrT3ZlcnJpZGVzID0ge30pOiBBcGlDb250ZXh0ID0+IHtcbiAgY29uc3QgZGVmYXVsdFNlc3Npb24gPSB7XG4gICAgdXNlckFjY2VzczogMSxcbiAgICB1c2VySWQ6ICd1c2VyMScsXG4gICAgdXNlcm5hbWU6ICd0ZXN0dXNlcidcbiAgfTtcbiAgY29uc3Qgb3ZlcnJpZGVTZXNzaW9uOiBQYXJ0aWFsPHR5cGVvZiBkZWZhdWx0U2Vzc2lvbj4gPSBvdmVycmlkZXMuc2Vzc2lvbiB8fCB7fTtcbiAgY29uc3QgY29udGV4dDogVGVzdENvbnRleHQgPSB7XG4gICAgZGF0YWJhc2VOYW1lOiAob3ZlcnJpZGVzLmRhdGFiYXNlTmFtZSBhcyBzdHJpbmcpID8/ICd0ZXN0JyxcbiAgICAuLi5vdmVycmlkZXNcbiAgfTtcbiAgZGVsZXRlIGNvbnRleHQuc2Vzc2lvbjtcbiAgY29udGV4dC5zZXNzaW9uID0ge1xuICAgIHVzZXJBY2Nlc3M6IG92ZXJyaWRlU2Vzc2lvbi51c2VyQWNjZXNzICE9PSB1bmRlZmluZWQgPyBvdmVycmlkZVNlc3Npb24udXNlckFjY2VzcyA6IGRlZmF1bHRTZXNzaW9uLnVzZXJBY2Nlc3MsXG4gICAgdXNlcklkOiBvdmVycmlkZVNlc3Npb24udXNlcklkICE9PSB1bmRlZmluZWQgPyBvdmVycmlkZVNlc3Npb24udXNlcklkIDogZGVmYXVsdFNlc3Npb24udXNlcklkLFxuICAgIHVzZXJuYW1lOiBvdmVycmlkZVNlc3Npb24udXNlcm5hbWUgIT09IHVuZGVmaW5lZCA/IG92ZXJyaWRlU2Vzc2lvbi51c2VybmFtZSA6IGRlZmF1bHRTZXNzaW9uLnVzZXJuYW1lXG4gIH07XG4gIHJldHVybiBjb250ZXh0IGFzIEFwaUNvbnRleHQ7XG59O1xuXG4vLyBDb21tb24gbW9jayByZXNvbHZlIGluZm8gZm9yIEdyYXBoUUwgcmVzb2x2ZXJzXG5leHBvcnQgY29uc3QgY3JlYXRlTW9ja1Jlc29sdmVJbmZvID0gKGZpZWxkTmFtZTogc3RyaW5nID0gJ3Rlc3QnKTogR3JhcGhRTFJlc29sdmVJbmZvID0+IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9jb25zaXN0ZW50LXR5cGUtYXNzZXJ0aW9uc1xuICBjb25zdCBvcGVyYXRpb24gPSB7fSBhcyBHcmFwaFFMUmVzb2x2ZUluZm9bJ29wZXJhdGlvbiddO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2NvbnNpc3RlbnQtdHlwZS1hc3NlcnRpb25zXG4gIGNvbnN0IHBhcmVudFR5cGUgPSB7fSBhcyBHcmFwaFFMUmVzb2x2ZUluZm9bJ3BhcmVudFR5cGUnXTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9jb25zaXN0ZW50LXR5cGUtYXNzZXJ0aW9uc1xuICBjb25zdCByZXR1cm5UeXBlID0ge30gYXMgR3JhcGhRTFJlc29sdmVJbmZvWydyZXR1cm5UeXBlJ107XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvY29uc2lzdGVudC10eXBlLWFzc2VydGlvbnNcbiAgY29uc3Qgc2NoZW1hID0ge30gYXMgR3JhcGhRTFJlc29sdmVJbmZvWydzY2hlbWEnXTtcblxuICByZXR1cm4ge1xuICAgIGZpZWxkTmFtZSxcbiAgICBmaWVsZE5vZGVzOiBbXSxcbiAgICBmcmFnbWVudHM6IHt9LFxuICAgIG9wZXJhdGlvbixcbiAgICBwYXJlbnRUeXBlLFxuICAgIHBhdGg6IHtrZXk6IGZpZWxkTmFtZSwgcHJldjogdW5kZWZpbmVkLCB0eXBlbmFtZTogJ1Rlc3QnfSxcbiAgICByZXR1cm5UeXBlLFxuICAgIHJvb3RWYWx1ZToge30sXG4gICAgc2NoZW1hLFxuICAgIHZhcmlhYmxlVmFsdWVzOiB7fVxuICB9O1xufTtcblxuLy8gVXRpbGl0eSB0byBtb2NrIGFjdGlvbnMgbW9kdWxlXG5leHBvcnQgY29uc3QgbW9ja0FjdGlvbnNNb2R1bGUgPSBhc3luYyAobW9kdWxlUGF0aDogc3RyaW5nLCBtb2NrQWN0aW9uczogUmVjb3JkPHN0cmluZywgamVzdC5Nb2NrPikgPT4ge1xuICBjb25zdCBtb2NrcyA9IE9iamVjdC5lbnRyaWVzKG1vY2tBY3Rpb25zKS5yZWR1Y2UoKGFjYywgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgYWNjW2tleV0gPSBqZXN0LmZuKCkubW9ja0ltcGxlbWVudGF0aW9uKHZhbHVlKTtcbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBqZXN0Lk1vY2s+KTtcblxuICBhd2FpdCBqZXN0Lmlzb2xhdGVNb2R1bGVzQXN5bmMoYXN5bmMgKCkgPT4ge1xuICAgIGplc3QudW5zdGFibGVfbW9ja01vZHVsZShtb2R1bGVQYXRoLCAoKSA9PiAoe1xuICAgICAgX19lc01vZHVsZTogdHJ1ZSxcbiAgICAgIC4uLm1vY2tzLFxuICAgICAgZGVmYXVsdDogbW9ja3NcbiAgICB9KSk7XG4gIH0pO1xufTtcblxuLy8gVXRpbGl0eSB0byBtb2NrIG9iamVjdCB0eXBlc1xuZXhwb3J0IGNvbnN0IG1vY2tPYmplY3RUeXBlID0gYXN5bmMgKG1vZHVsZVBhdGg6IHN0cmluZywgdHlwZU5hbWU6IHN0cmluZykgPT4ge1xuICBjb25zdCBtb2NrID0ge1xuICAgIF9fZXNNb2R1bGU6IHRydWUsXG4gICAgW3R5cGVOYW1lXToge1xuICAgICAgZ2V0RmllbGQ6IGplc3QuZm4oKCkgPT4gKHtyZXNvbHZlOiBqZXN0LmZuKCl9KSksXG4gICAgICBnZXRGaWVsZHM6IGplc3QuZm4oKCkgPT4gKHt9KSlcbiAgICB9LFxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIFt0eXBlTmFtZV06IHtcbiAgICAgICAgZ2V0RmllbGQ6IGplc3QuZm4oKCkgPT4gKHtyZXNvbHZlOiBqZXN0LmZuKCl9KSksXG4gICAgICAgIGdldEZpZWxkczogamVzdC5mbigoKSA9PiAoe30pKVxuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgYXdhaXQgamVzdC5pc29sYXRlTW9kdWxlc0FzeW5jKGFzeW5jICgpID0+IHtcbiAgICBqZXN0LnVuc3RhYmxlX21vY2tNb2R1bGUobW9kdWxlUGF0aCwgKCkgPT4gbW9jayk7XG4gIH0pO1xufTtcblxuLy8gVXRpbGl0eSB0byBjcmVhdGUgYSB0ZXN0IHN1aXRlIGZvciBxdWVyeSByZXNvbHZlcnNcbmV4cG9ydCBjb25zdCBjcmVhdGVRdWVyeVRlc3RTdWl0ZSA9IChcbiAgbmFtZTogc3RyaW5nLFxuICBhY3Rpb25zUGF0aDogc3RyaW5nLFxuICB0ZXN0Q2FzZXM6IEFycmF5PHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgYWN0aW9uTmFtZTogc3RyaW5nO1xuICAgIGFyZ3M6IFRlc3RBcmdzO1xuICAgIGV4cGVjdGVkQ2FsbDogKGNvbnRleHQ6IFRlc3RDb250ZXh0LCBhcmdzOiBUZXN0QXJncykgPT4gVGVzdEFyZ3M7XG4gICAgbW9ja1JldHVyblZhbHVlOiBUZXN0UmV0dXJuVmFsdWU7XG4gICAgZXJyb3JDYXNlPzogYm9vbGVhbjtcbiAgfT5cbikgPT4ge1xuICBkZXNjcmliZShgJHtuYW1lfSBRdWVyaWVzYCwgKCkgPT4ge1xuICAgIGxldCBhY3Rpb25zOiBhbnk7XG4gICAgY29uc3QgbW9ja0NvbnRleHQgPSBjcmVhdGVNb2NrQ29udGV4dCgpO1xuXG4gICAgYmVmb3JlQWxsKCgpID0+IHtcbiAgICAgIGFjdGlvbnMgPSB7fTtcbiAgICB9KTtcblxuICAgIHRlc3RDYXNlcy5mb3JFYWNoKCh7bmFtZTogdGVzdE5hbWUsIGFjdGlvbk5hbWUsIGFyZ3MsIGV4cGVjdGVkQ2FsbCwgbW9ja1JldHVyblZhbHVlLCBlcnJvckNhc2UgPSBmYWxzZX0pID0+IHtcbiAgICAgIGl0KGBzaG91bGQgY2FsbCAke2FjdGlvbk5hbWV9IGFjdGlvbiB3aXRoIGNvcnJlY3QgcGFyYW1ldGVyc2AsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgbW9ja0ZuID0gamVzdC5mbigpLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiBQcm9taXNlLnJlc29sdmUobW9ja1JldHVyblZhbHVlKSk7XG4gICAgICAgIGFjdGlvbnNbYWN0aW9uTmFtZV0gPSBtb2NrRm47XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbW9ja0ZuKG1vY2tDb250ZXh0LCBhcmdzKTtcbiAgICAgICAgZXhwZWN0KG1vY2tGbikudG9IYXZlQmVlbkNhbGxlZFdpdGgobW9ja0NvbnRleHQsIGV4cGVjdGVkQ2FsbChtb2NrQ29udGV4dCwgYXJncykpO1xuICAgICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKG1vY2tSZXR1cm5WYWx1ZSk7XG4gICAgICB9KTtcblxuICAgICAgaWYoZXJyb3JDYXNlKSB7XG4gICAgICAgIGl0KGBzaG91bGQgaGFuZGxlICR7YWN0aW9uTmFtZX0gd2hlbiBubyBkYXRhIGZvdW5kYCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG1vY2tGbiA9IGplc3QuZm4oKS5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gUHJvbWlzZS5yZXNvbHZlKG51bGwpKTtcbiAgICAgICAgICBhY3Rpb25zW2FjdGlvbk5hbWVdID0gbW9ja0ZuO1xuXG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbW9ja0ZuKG1vY2tDb250ZXh0LCBhcmdzKTtcbiAgICAgICAgICBleHBlY3QobW9ja0ZuKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChtb2NrQ29udGV4dCwgZXhwZWN0ZWRDYWxsKG1vY2tDb250ZXh0LCBhcmdzKSk7XG4gICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZU51bGwoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufTtcblxuLy8gVXRpbGl0eSB0byBjcmVhdGUgYSB0ZXN0IHN1aXRlIGZvciBtdXRhdGlvbiByZXNvbHZlcnNcbmV4cG9ydCBjb25zdCBjcmVhdGVNdXRhdGlvblRlc3RTdWl0ZSA9IChcbiAgbmFtZTogc3RyaW5nLFxuICBhY3Rpb25zUGF0aDogc3RyaW5nLFxuICB0ZXN0Q2FzZXM6IEFycmF5PHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgYWN0aW9uTmFtZTogc3RyaW5nO1xuICAgIGFyZ3M6IFRlc3RBcmdzO1xuICAgIGV4cGVjdGVkQ2FsbDogKGNvbnRleHQ6IFRlc3RDb250ZXh0LCBhcmdzOiBUZXN0QXJncykgPT4gVGVzdEFyZ3M7XG4gICAgbW9ja1JldHVyblZhbHVlOiBUZXN0UmV0dXJuVmFsdWU7XG4gICAgcmVxdWlyZXNBdXRoPzogYm9vbGVhbjtcbiAgICBhdXRoVXNlcklkPzogc3RyaW5nO1xuICB9PlxuKSA9PiB7XG4gIGRlc2NyaWJlKGAke25hbWV9IE11dGF0aW9uc2AsICgpID0+IHtcbiAgICBsZXQgYWN0aW9uczogYW55O1xuXG4gICAgYmVmb3JlQWxsKCgpID0+IHtcbiAgICAgIGFjdGlvbnMgPSB7fTtcbiAgICB9KTtcblxuICAgIHRlc3RDYXNlcy5mb3JFYWNoKCh7XG4gICAgICBhY3Rpb25OYW1lLFxuICAgICAgYXJncyxcbiAgICAgIGV4cGVjdGVkQ2FsbCxcbiAgICAgIG1vY2tSZXR1cm5WYWx1ZSxcbiAgICAgIHJlcXVpcmVzQXV0aCA9IGZhbHNlLFxuICAgICAgYXV0aFVzZXJJZFxuICAgIH0pID0+IHtcbiAgICAgIGl0KGBzaG91bGQgY2FsbCAke2FjdGlvbk5hbWV9IGFjdGlvbiB3aXRoIGNvcnJlY3QgcGFyYW1ldGVyc2AsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgbW9ja0NvbnRleHQgPSBjcmVhdGVNb2NrQ29udGV4dCgpO1xuICAgICAgICBpZihyZXF1aXJlc0F1dGggJiYgYXV0aFVzZXJJZCkge1xuICAgICAgICAgIChtb2NrQ29udGV4dC5zZXNzaW9uIGFzIHt1c2VySWQ6IHN0cmluZ30pLnVzZXJJZCA9IGF1dGhVc2VySWQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtb2NrRm4gPSBqZXN0LmZuKCkubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IFByb21pc2UucmVzb2x2ZShtb2NrUmV0dXJuVmFsdWUpKTtcbiAgICAgICAgYWN0aW9uc1thY3Rpb25OYW1lXSA9IG1vY2tGbjtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBtb2NrRm4obW9ja0NvbnRleHQsIGFyZ3MpO1xuICAgICAgICBleHBlY3QobW9ja0ZuKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChtb2NrQ29udGV4dCwgZXhwZWN0ZWRDYWxsKG1vY2tDb250ZXh0LCBhcmdzKSk7XG4gICAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwobW9ja1JldHVyblZhbHVlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn07XG5cbi8vIFV0aWxpdHkgdG8gY3JlYXRlIGludGVncmF0aW9uIHRlc3Qgc3VpdGVcbmV4cG9ydCBjb25zdCBjcmVhdGVJbnRlZ3JhdGlvblRlc3RTdWl0ZSA9IChcbiAgbmFtZTogc3RyaW5nLFxuICBhY3Rpb25zUGF0aDogc3RyaW5nLFxuICBvYmplY3RUeXBlUGF0aDogc3RyaW5nLFxuICB0eXBlTmFtZTogc3RyaW5nLFxuICB0ZXN0Q2FzZXM6IEFycmF5PHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgYWN0aW9uTmFtZTogc3RyaW5nO1xuICAgIGFyZ3M6IFRlc3RBcmdzO1xuICAgIGV4cGVjdGVkQ2FsbDogKGNvbnRleHQ6IFRlc3RDb250ZXh0LCBhcmdzOiBUZXN0QXJncykgPT4gVGVzdEFyZ3M7XG4gICAgc3VjY2Vzc1JldHVyblZhbHVlOiBUZXN0UmV0dXJuVmFsdWU7XG4gICAgZXJyb3JSZXR1cm5WYWx1ZTogVGVzdFJldHVyblZhbHVlO1xuICAgIHRlc3RFcnJvckNhc2U6IGJvb2xlYW47XG4gIH0+XG4pID0+IHtcbiAgZGVzY3JpYmUoYCR7bmFtZX0gSW50ZWdyYXRpb25gLCAoKSA9PiB7XG4gICAgbGV0IGFjdGlvbnM6IGFueTtcblxuICAgIGJlZm9yZUFsbCgoKSA9PiB7XG4gICAgICBhY3Rpb25zID0ge307XG4gICAgfSk7XG5cbiAgICB0ZXN0Q2FzZXMuZm9yRWFjaCgoe1xuICAgICAgbmFtZTogdGVzdE5hbWUsXG4gICAgICBhY3Rpb25OYW1lLFxuICAgICAgYXJncyxcbiAgICAgIGV4cGVjdGVkQ2FsbCxcbiAgICAgIHN1Y2Nlc3NSZXR1cm5WYWx1ZSxcbiAgICAgIGVycm9yUmV0dXJuVmFsdWUsXG4gICAgICB0ZXN0RXJyb3JDYXNlXG4gICAgfSkgPT4ge1xuICAgICAgZGVzY3JpYmUodGVzdE5hbWUsICgpID0+IHtcbiAgICAgICAgaXQoYHNob3VsZCByZXR1cm4gZGF0YSB3aGVuICR7YWN0aW9uTmFtZX0gc3VjY2VlZHNgLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgbW9ja0NvbnRleHQgPSBjcmVhdGVNb2NrQ29udGV4dCgpO1xuICAgICAgICAgIGNvbnN0IG1vY2tGbiA9IGplc3QuZm4oKS5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gUHJvbWlzZS5yZXNvbHZlKHN1Y2Nlc3NSZXR1cm5WYWx1ZSkpO1xuICAgICAgICAgIGFjdGlvbnNbYWN0aW9uTmFtZV0gPSBtb2NrRm47XG5cbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBtb2NrRm4obW9ja0NvbnRleHQsIGFyZ3MpO1xuXG4gICAgICAgICAgZXhwZWN0KG1vY2tGbikudG9IYXZlQmVlbkNhbGxlZFdpdGgobW9ja0NvbnRleHQsIGV4cGVjdGVkQ2FsbChtb2NrQ29udGV4dCwgYXJncykpO1xuICAgICAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoc3VjY2Vzc1JldHVyblZhbHVlIHx8IHt9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYodGVzdEVycm9yQ2FzZSkge1xuICAgICAgICAgIGl0KGBzaG91bGQgaGFuZGxlICR7YWN0aW9uTmFtZX0gd2hlbiBubyBkYXRhIGZvdW5kYCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbW9ja0NvbnRleHQgPSBjcmVhdGVNb2NrQ29udGV4dCgpO1xuICAgICAgICAgICAgY29uc3QgbW9ja0ZuID0gamVzdC5mbigpLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiBQcm9taXNlLnJlc29sdmUoZXJyb3JSZXR1cm5WYWx1ZSkpO1xuICAgICAgICAgICAgYWN0aW9uc1thY3Rpb25OYW1lXSA9IG1vY2tGbjtcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbW9ja0ZuKG1vY2tDb250ZXh0LCBhcmdzKTtcblxuICAgICAgICAgICAgZXhwZWN0KG1vY2tGbikudG9IYXZlQmVlbkNhbGxlZFdpdGgobW9ja0NvbnRleHQsIGV4cGVjdGVkQ2FsbChtb2NrQ29udGV4dCwgYXJncykpO1xuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChlcnJvclJldHVyblZhbHVlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufTtcblxuLy8gQ29tbW9uIG1vY2sgZGF0YSBnZW5lcmF0b3JzXG5leHBvcnQgY29uc3QgY3JlYXRlTW9ja1VzZXIgPSAob3ZlcnJpZGVzOiBNb2NrT3ZlcnJpZGVzID0ge30pID0+ICh7XG4gIGVtYWlsOiAndGVzdEBleGFtcGxlLmNvbScsXG4gIGZpcnN0TmFtZTogJ1Rlc3QnLFxuICBsYXN0TmFtZTogJ1VzZXInLFxuICB1c2VySWQ6ICd1c2VyMScsXG4gIHVzZXJuYW1lOiAndGVzdHVzZXInLFxuICAuLi5vdmVycmlkZXNcbn0pO1xuXG5leHBvcnQgY29uc3QgY3JlYXRlTW9ja1Bvc3QgPSAob3ZlcnJpZGVzOiBNb2NrT3ZlcnJpZGVzID0ge30pID0+ICh7XG4gIGNvbnRlbnQ6ICdUZXN0IHBvc3QgY29udGVudCcsXG4gIGNyZWF0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICBwb3N0SWQ6ICdwb3N0MScsXG4gIHVzZXJJZDogJ3VzZXIxJyxcbiAgLi4ub3ZlcnJpZGVzXG59KTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZU1vY2tNZXNzYWdlID0gKG92ZXJyaWRlczogTW9ja092ZXJyaWRlcyA9IHt9KSA9PiAoe1xuICBjb250ZW50OiAnVGVzdCBtZXNzYWdlJyxcbiAgY29udmVyc2F0aW9uSWQ6ICdjb252MScsXG4gIGNyZWF0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICBtZXNzYWdlSWQ6ICdtc2cxJyxcbiAgdXNlcklkOiAndXNlcjEnLFxuICAuLi5vdmVycmlkZXNcbn0pO1xuXG5leHBvcnQgY29uc3QgY3JlYXRlTW9ja1JlYWN0aW9uID0gKG92ZXJyaWRlczogTW9ja092ZXJyaWRlcyA9IHt9KSA9PiAoe1xuICBjcmVhdGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgcG9zdElkOiAncG9zdDEnLFxuICByZWFjdGlvbklkOiAncmVhY3QxJyxcbiAgdHlwZTogJ2xpa2UnLFxuICB1c2VySWQ6ICd1c2VyMScsXG4gIC4uLm92ZXJyaWRlc1xufSk7XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVNb2NrVGFnID0gKG92ZXJyaWRlczogTW9ja092ZXJyaWRlcyA9IHt9KSA9PiAoe1xuICBkZXNjcmlwdGlvbjogJ1Rlc3QgdGFnIGRlc2NyaXB0aW9uJyxcbiAgbmFtZTogJ3Rlc3QtdGFnJyxcbiAgdGFnSWQ6ICd0YWcxJyxcbiAgLi4ub3ZlcnJpZGVzXG59KTtcblxuLy8gVXRpbGl0eSB0byBzZXQgdXAgY29tbW9uIG1vY2tzXG5leHBvcnQgY29uc3Qgc2V0dXBDb21tb25Nb2NrcyA9IGFzeW5jICgpID0+IHtcbiAgY29uc3QgbW9jayA9IHtcbiAgICBfX2VzTW9kdWxlOiB0cnVlLFxuICAgIHVzZURiOiBqZXN0LmZuKCksXG4gICAgZ2V0TGltaXQ6IGplc3QuZm4oKSxcbiAgICBnZXREb2NJZDogamVzdC5mbigpLFxuICAgIHNvcnRJZHM6IGplc3QuZm4oKSxcbiAgICBnZXRHcWxGaWVsZHM6IGplc3QuZm4oKSxcbiAgICBkZWZhdWx0OiB7XG4gICAgICB1c2VEYjogamVzdC5mbigpLFxuICAgICAgZ2V0TGltaXQ6IGplc3QuZm4oKSxcbiAgICAgIGdldERvY0lkOiBqZXN0LmZuKCksXG4gICAgICBzb3J0SWRzOiBqZXN0LmZuKCksXG4gICAgICBnZXRHcWxGaWVsZHM6IGplc3QuZm4oKVxuICAgIH1cbiAgfTtcbiAgYXdhaXQgamVzdC5pc29sYXRlTW9kdWxlc0FzeW5jKGFzeW5jICgpID0+IHtcbiAgICBqZXN0LnVuc3RhYmxlX21vY2tNb2R1bGUoJy4vYXJhbmdvZGJVdGlscy5qcycsICgpID0+IG1vY2spO1xuICB9KTtcbn07XG5cbi8vIFV0aWxpdHkgdG8gY2xlYXIgYWxsIG1vY2tzXG5leHBvcnQgY29uc3QgY2xlYXJBbGxNb2NrcyA9ICgpID0+IHtcbiAgamVzdC5jbGVhckFsbE1vY2tzKCk7XG59O1xuXG4vLyBVdGlsaXR5IHRvIGNyZWF0ZSBhIHRlc3Qgc3VpdGUgZm9yIGFjdGlvbiBmdW5jdGlvbnNcbmV4cG9ydCBjb25zdCBjcmVhdGVBY3Rpb25UZXN0U3VpdGUgPSAoXG4gIG5hbWU6IHN0cmluZyxcbiAgYWN0aW9uc1BhdGg6IHN0cmluZyxcbiAgdGVzdENhc2VzOiBBcnJheTx7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGFjdGlvbk5hbWU6IHN0cmluZztcbiAgICBhcmdzOiBUZXN0QXJncztcbiAgICBtb2NrUXVlcnk6IGplc3QuTW9jaztcbiAgICBleHBlY3RlZFJlc3VsdDogVGVzdFJldHVyblZhbHVlO1xuICB9PlxuKSA9PiB7XG4gIGRlc2NyaWJlKGAke25hbWV9IGFjdGlvbnNgLCAoKSA9PiB7XG4gICAgbGV0IGFjdGlvbnM6IGFueTtcblxuICAgIGJlZm9yZUFsbChhc3luYyAoKSA9PiB7XG4gICAgICBhY3Rpb25zID0gYXdhaXQgaW1wb3J0KGFjdGlvbnNQYXRoKTtcbiAgICB9KTtcblxuICAgIHRlc3RDYXNlcy5mb3JFYWNoKCh7bmFtZTogdGVzdE5hbWUsIGFjdGlvbk5hbWUsIGFyZ3MsIG1vY2tRdWVyeSwgZXhwZWN0ZWRSZXN1bHR9KSA9PiB7XG4gICAgICBpdChgc2hvdWxkIGV4ZWN1dGUgJHthY3Rpb25OYW1lfWAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgbW9ja0NvbnRleHQgPSBjcmVhdGVNb2NrQ29udGV4dCgpO1xuICAgICAgICBjb25zdCBtb2NrRGIgPSBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKHtcbiAgICAgICAgICBxdWVyeTogbW9ja1F1ZXJ5XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBhY3R1YWwgPSBqZXN0LnJlcXVpcmVBY3R1YWwoJy4vYXJhbmdvZGJVdGlscy5qcycpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICBqZXN0LmRvTW9jaygnLi9hcmFuZ29kYlV0aWxzLmpzJywgKCkgPT4gKHtcbiAgICAgICAgICB1c2VEYjogbW9ja0RiLFxuICAgICAgICAgIC4uLmFjdHVhbFxuICAgICAgICB9KSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgKGFjdGlvbnNbYWN0aW9uTmFtZV0gYXMgamVzdC5Nb2NrKShtb2NrQ29udGV4dCwgYXJncyk7XG4gICAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWRSZXN1bHQpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUFkYXB0ZXJUZXN0U3VpdGUgPSAoXG4gIG5hbWU6IHN0cmluZyxcbiAgYWRhcHRlclBhdGg6IHN0cmluZyxcbiAgdGVzdENhc2VzOiBhbnlbXVxuKSA9PiB7XG4gIGRlc2NyaWJlKG5hbWUsICgpID0+IHtcbiAgICBsZXQgYWRhcHRlcjogYW55O1xuXG4gICAgYmVmb3JlQWxsKGFzeW5jICgpID0+IHtcbiAgICAgIGFkYXB0ZXIgPSBhd2FpdCBpbXBvcnQoYWRhcHRlclBhdGgpO1xuICAgIH0pO1xuXG4gICAgdGVzdENhc2VzLmZvckVhY2goKHtuYW1lOiB0ZXN0TmFtZSwgaW5wdXQsIGV4cGVjdGVkT3V0cHV0fSkgPT4ge1xuICAgICAgaXQoYHNob3VsZCAke3Rlc3ROYW1lfWAsICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gKGFkYXB0ZXIgYXMge3BhcnNlVGFnOiAoaW5wdXQ6IFRlc3RBcmdzKSA9PiBUZXN0UmV0dXJuVmFsdWV9KS5wYXJzZVRhZyhpbnB1dCk7XG4gICAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWRPdXRwdXQpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVV0aWxzVGVzdFN1aXRlID0gKFxuICBuYW1lOiBzdHJpbmcsXG4gIHV0aWxzUGF0aDogc3RyaW5nLFxuICB0ZXN0Q2FzZXM6IEFycmF5PHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgaW5wdXQ6IFRlc3RBcmdzO1xuICAgIGV4cGVjdGVkT3V0cHV0OiBUZXN0UmV0dXJuVmFsdWU7XG4gIH0+XG4pID0+IHtcbiAgZGVzY3JpYmUobmFtZSwgKCkgPT4ge1xuICAgIGxldCB1dGlsczogYW55O1xuXG4gICAgYmVmb3JlQWxsKGFzeW5jICgpID0+IHtcbiAgICAgIHV0aWxzID0gYXdhaXQgaW1wb3J0KHV0aWxzUGF0aCk7XG4gICAgfSk7XG5cbiAgICB0ZXN0Q2FzZXMuZm9yRWFjaCgoe25hbWU6IHRlc3ROYW1lLCBpbnB1dCwgZXhwZWN0ZWRPdXRwdXR9KSA9PiB7XG4gICAgICBpdChgc2hvdWxkICR7dGVzdE5hbWV9YCwgKCkgPT4ge1xuICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICBpZigodXRpbHMgYXMge2xvZ0luZm8/OiAoaW5wdXQ6IFRlc3RBcmdzKSA9PiBUZXN0UmV0dXJuVmFsdWV9KS5sb2dJbmZvKSB7XG4gICAgICAgICAgcmVzdWx0ID0gKHV0aWxzIGFzIHtsb2dJbmZvOiAoaW5wdXQ6IFRlc3RBcmdzKSA9PiBUZXN0UmV0dXJuVmFsdWV9KS5sb2dJbmZvKGlucHV0KTtcbiAgICAgICAgfSBlbHNlIGlmKCh1dGlscyBhcyB7cmVtb3ZlRW1wdHlLZXlzPzogKGlucHV0OiBUZXN0QXJncykgPT4gVGVzdFJldHVyblZhbHVlfSkucmVtb3ZlRW1wdHlLZXlzKSB7XG4gICAgICAgICAgcmVzdWx0ID0gKHV0aWxzIGFzIHtyZW1vdmVFbXB0eUtleXM6IChpbnB1dDogVGVzdEFyZ3MpID0+IFRlc3RSZXR1cm5WYWx1ZX0pLnJlbW92ZUVtcHR5S2V5cyhpbnB1dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBzdWl0YWJsZSBmdW5jdGlvbiBmb3VuZCBpbiAke3V0aWxzUGF0aH1gKTtcbiAgICAgICAgfVxuICAgICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4cGVjdGVkT3V0cHV0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn07Il0sCiAgIm1hcHBpbmdzIjogIkFBSUEsT0FBUSxRQUFBQSxNQUFXLGdCQVlaLE1BQU1DLEVBQW9CLENBQUNDLEVBQTJCLENBQUMsSUFBa0IsQ0FDOUUsTUFBTUMsRUFBaUIsQ0FDckIsV0FBWSxFQUNaLE9BQVEsUUFDUixTQUFVLFVBQ1osRUFDTUMsRUFBa0RGLEVBQVUsU0FBVyxDQUFDLEVBQ3hFRyxFQUF1QixDQUMzQixhQUFlSCxFQUFVLGNBQTJCLE9BQ3BELEdBQUdBLENBQ0wsRUFDQSxjQUFPRyxFQUFRLFFBQ2ZBLEVBQVEsUUFBVSxDQUNoQixXQUFZRCxFQUFnQixhQUFlLE9BQVlBLEVBQWdCLFdBQWFELEVBQWUsV0FDbkcsT0FBUUMsRUFBZ0IsU0FBVyxPQUFZQSxFQUFnQixPQUFTRCxFQUFlLE9BQ3ZGLFNBQVVDLEVBQWdCLFdBQWEsT0FBWUEsRUFBZ0IsU0FBV0QsRUFBZSxRQUMvRixFQUNPRSxDQUNULEVBR2FDLEVBQXdCLENBQUNDLEVBQW9CLFVBVWpELENBQ0wsVUFBQUEsRUFDQSxXQUFZLENBQUMsRUFDYixVQUFXLENBQUMsRUFDWixVQVpnQixDQUFDLEVBYWpCLFdBWGlCLENBQUMsRUFZbEIsS0FBTSxDQUFDLElBQUtBLEVBQVcsS0FBTSxPQUFXLFNBQVUsTUFBTSxFQUN4RCxXQVhpQixDQUFDLEVBWWxCLFVBQVcsQ0FBQyxFQUNaLE9BWGEsQ0FBQyxFQVlkLGVBQWdCLENBQUMsQ0FDbkIsR0FJV0MsRUFBb0IsTUFBT0MsRUFBb0JDLElBQTJDLENBQ3JHLE1BQU1DLEVBQVEsT0FBTyxRQUFRRCxDQUFXLEVBQUUsT0FBTyxDQUFDRSxFQUFLLENBQUNDLEVBQUtDLENBQUssS0FDaEVGLEVBQUlDLENBQUcsRUFBSWIsRUFBSyxHQUFHLEVBQUUsbUJBQW1CYyxDQUFLLEVBQ3RDRixHQUNOLENBQUMsQ0FBOEIsRUFFbEMsTUFBTVosRUFBSyxvQkFBb0IsU0FBWSxDQUN6Q0EsRUFBSyxv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LElBQU0sQ0FDN0IsTUFBTU8sRUFBVXVCLEVBQTZELFNBQVNDLENBQUssRUFDM0YsT0FBT3hCLENBQU0sRUFBRSxRQUFReUIsQ0FBYyxDQUN2QyxDQUFDLENBQ0gsQ0FBQyxDQUNILENBQUMsQ0FDSCxFQUVhQyxFQUF1QixDQUNsQ3RDLEVBQ0F1QyxFQUNBckMsSUFLRyxDQUNILFNBQVNGLEVBQU0sSUFBTSxDQUNuQixJQUFJd0MsRUFFSixVQUFVLFNBQVksQ0FDcEJBLEVBQVEsTUFBTSxPQUFPRCxFQUN2QixDQUFDLEVBRURyQyxFQUFVLFFBQVEsQ0FBQyxDQUFDLEtBQU1HLEVBQVUsTUFBQStCLEVBQU8sZUFBQUMsQ0FBYyxJQUFNLENBQzdELEdBQUcsVUFBVWhDLENBQVEsR0FBSSxJQUFNLENBQzdCLElBQUlPLEVBQ0osR0FBSTRCLEVBQTJELFFBQzdENUIsRUFBVTRCLEVBQTBELFFBQVFKLENBQUssVUFDeEVJLEVBQW1FLGdCQUM1RTVCLEVBQVU0QixFQUFrRSxnQkFBZ0JKLENBQUssTUFFakcsT0FBTSxJQUFJLE1BQU0saUNBQWlDRyxDQUFTLEVBQUUsRUFFOUQsT0FBTzNCLENBQU0sRUFBRSxRQUFReUIsQ0FBYyxDQUN2QyxDQUFDLENBQ0gsQ0FBQyxDQUNILENBQUMsQ0FDSCIsCiAgIm5hbWVzIjogWyJqZXN0IiwgImNyZWF0ZU1vY2tDb250ZXh0IiwgIm92ZXJyaWRlcyIsICJkZWZhdWx0U2Vzc2lvbiIsICJvdmVycmlkZVNlc3Npb24iLCAiY29udGV4dCIsICJjcmVhdGVNb2NrUmVzb2x2ZUluZm8iLCAiZmllbGROYW1lIiwgIm1vY2tBY3Rpb25zTW9kdWxlIiwgIm1vZHVsZVBhdGgiLCAibW9ja0FjdGlvbnMiLCAibW9ja3MiLCAiYWNjIiwgImtleSIsICJ2YWx1ZSIsICJtb2NrT2JqZWN0VHlwZSIsICJ0eXBlTmFtZSIsICJtb2NrIiwgImNyZWF0ZVF1ZXJ5VGVzdFN1aXRlIiwgIm5hbWUiLCAiYWN0aW9uc1BhdGgiLCAidGVzdENhc2VzIiwgImFjdGlvbnMiLCAibW9ja0NvbnRleHQiLCAidGVzdE5hbWUiLCAiYWN0aW9uTmFtZSIsICJhcmdzIiwgImV4cGVjdGVkQ2FsbCIsICJtb2NrUmV0dXJuVmFsdWUiLCAiZXJyb3JDYXNlIiwgIm1vY2tGbiIsICJyZXN1bHQiLCAiY3JlYXRlTXV0YXRpb25UZXN0U3VpdGUiLCAicmVxdWlyZXNBdXRoIiwgImF1dGhVc2VySWQiLCAiY3JlYXRlSW50ZWdyYXRpb25UZXN0U3VpdGUiLCAib2JqZWN0VHlwZVBhdGgiLCAic3VjY2Vzc1JldHVyblZhbHVlIiwgImVycm9yUmV0dXJuVmFsdWUiLCAidGVzdEVycm9yQ2FzZSIsICJjcmVhdGVNb2NrVXNlciIsICJjcmVhdGVNb2NrUG9zdCIsICJjcmVhdGVNb2NrTWVzc2FnZSIsICJjcmVhdGVNb2NrUmVhY3Rpb24iLCAiY3JlYXRlTW9ja1RhZyIsICJzZXR1cENvbW1vbk1vY2tzIiwgImNsZWFyQWxsTW9ja3MiLCAiY3JlYXRlQWN0aW9uVGVzdFN1aXRlIiwgIm1vY2tRdWVyeSIsICJleHBlY3RlZFJlc3VsdCIsICJtb2NrRGIiLCAiYWN0dWFsIiwgImNyZWF0ZUFkYXB0ZXJUZXN0U3VpdGUiLCAiYWRhcHRlclBhdGgiLCAiYWRhcHRlciIsICJpbnB1dCIsICJleHBlY3RlZE91dHB1dCIsICJjcmVhdGVVdGlsc1Rlc3RTdWl0ZSIsICJ1dGlsc1BhdGgiLCAidXRpbHMiXQp9Cg==
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Copyright (c) 2025-Present, Nitrogen Labs, Inc.
3
+ * Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
4
+ */
5
+ import type { ApiContext } from '../types/auth.types.js';
6
+ import type { Locale } from '../types/content.types.js';
7
+ interface TranslationObject {
8
+ key: string;
9
+ fallback?: string;
10
+ params?: Record<string, any>;
11
+ }
12
+ declare class TranslationQueue {
13
+ private batches;
14
+ private batchTimeout;
15
+ private maxBatchSize;
16
+ translate(context: ApiContext, translations: TranslationObject[], locale?: Locale): Promise<Record<string, string>>;
17
+ private getTranslation;
18
+ flush(): Promise<void>;
19
+ clear(): void;
20
+ private getBatchKey;
21
+ private processBatch;
22
+ private interpolate;
23
+ }
24
+ declare const translationQueue: TranslationQueue;
25
+ export declare const i18n: (context: ApiContext, translations: TranslationObject[], locale?: Locale) => Promise<Record<string, string>>;
26
+ export declare const flush: () => Promise<void>;
27
+ export declare const clear: () => void;
28
+ export type { TranslationObject };
29
+ export { translationQueue };
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Copyright (c) 2025-Present, Nitrogen Labs, Inc.
3
+ * Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
4
+ *
5
+ * Example usage of the translation queue system with Google Translate integration
6
+ *
7
+ * This demonstrates how to use the new translation queue that automatically
8
+ * translates content using Google Translate API when needed.
9
+ */
10
+ import type { ApiContext } from '../types/auth.types.js';
11
+ import type { Locale } from '../types/content.types.js';
12
+ export declare function getWelcomeMessages(context: ApiContext, locale?: Locale): Promise<Record<string, string>>;
13
+ export declare function getPersonalizedMessages(context: ApiContext, username: string, locale?: Locale): Promise<Record<string, string>>;
14
+ export declare function getMultiLanguageContent(context: ApiContext): Promise<Record<Locale, Record<string, string>>>;
15
+ export declare function getRobustTranslations(context: ApiContext, locale?: Locale): Promise<Record<string, string>>;
16
+ export declare function processLargeTranslationBatch(context: ApiContext, locale?: Locale): Promise<Record<string, string>>;
17
+ export declare function getErrorMessages(context: ApiContext, errorCode: string, locale?: Locale): Promise<Record<string, string>>;
18
+ export declare function generateEmailTemplate(context: ApiContext, userData: {
19
+ name: string;
20
+ email: string;
21
+ orderId: string;
22
+ total: number;
23
+ items: number;
24
+ }, locale?: Locale): Promise<{
25
+ subject: string;
26
+ greeting: string;
27
+ body: string;
28
+ footer: string;
29
+ }>;
30
+ export declare function getNotificationMessages(context: ApiContext, locale?: Locale): Promise<Record<string, string>>;
31
+ export declare function performanceComparison(context: ApiContext): Promise<Record<string, string>>;
32
+ export declare function getUserGreeting(context: ApiContext, userLocale?: string, username?: string): Promise<string>;
33
+ export declare function ensureAllTranslationsProcessed(): Promise<void>;
@@ -0,0 +1,2 @@
1
+ import{flush as l,i18n as r}from"./translationQueue.js";async function f(o,t="en"){return await r(o,[{key:"welcome.title",fallback:"Welcome to TorchOne!"},{key:"welcome.subtitle",fallback:"Your personal AI assistant"},{key:"welcome.description",fallback:"Get started by exploring our features"}],t)}async function u(o,t,e="en"){const n=[{key:"user.welcome",fallback:"Welcome back, {{username}}!",params:{username:t}},{key:"user.notifications",fallback:"You have {{count}} new notifications",params:{count:5}},{key:"user.lastLogin",fallback:"Last login: {{date}}",params:{date:new Date().toLocaleDateString()}}];return await r(o,n,e)}async function m(o){const t=["en","es","fr"],e={};for(const n of t){const a=[{key:"app.name",fallback:"TorchOne"},{key:"app.tagline",fallback:"Your AI Assistant"}];e[n]=await r(o,a,n)}return e}async function p(o,t="en"){const e=[{key:"error.notFound",fallback:"Content not found"},{key:"error.serverError",fallback:"Server error occurred"},{key:"success.saved",fallback:"Content saved successfully"}];try{return await r(o,e,t)}catch{return e.reduce((a,s)=>(a[s.key]=s.fallback||"",a),{})}}async function b(o,t="en"){const e=[];for(let a=1;a<=100;a++)e.push({key:`item.${a}.title`,fallback:`Item ${a} Title`,params:{number:a}});const n=await r(o,e,t);return await l(),n}async function g(o,t,e="en"){const n=[{key:`error.${t}`,fallback:`An error occurred: ${t}`,params:{errorCode:t}},{key:"error.contactSupport",fallback:"Please contact support if this problem persists.",params:{}}];return await r(o,n,e)}async function k(o,t,e="en"){const n=[{key:"email.orderConfirmation.subject",fallback:"Order {{orderId}} Confirmed",params:{orderId:t.orderId}},{key:"email.orderConfirmation.greeting",fallback:"Hello {{name}},",params:{name:t.name}},{key:"email.orderConfirmation.body",fallback:"Your order {{orderId}} has been confirmed. Total: ${{total}} for {{items}} items.",params:{orderId:t.orderId,total:t.total,items:t.items}},{key:"email.orderConfirmation.footer",fallback:"Thank you for your purchase!"}],a=await r(o,n,e);return{subject:a["email.orderConfirmation.subject"],greeting:a["email.orderConfirmation.greeting"],body:a["email.orderConfirmation.body"],footer:a["email.orderConfirmation.footer"]}}async function d(o,t="en"){return await r(o,[{key:"notification.welcome",fallback:"Welcome to TorchOne!"},{key:"notification.verification",fallback:"Please verify your account."},{key:"notification.passwordReset",fallback:"Your password has been reset."},{key:"notification.profileUpdate",fallback:"Your profile has been updated."},{key:"notification.newMessage",fallback:"You have a new message from {{sender}}.",params:{sender:"John Doe"}}],t)}async function y(o){const e=["welcome","verification","passwordReset","profileUpdate","email.subject","email.body","sms.welcome","sms.verification"].map(a=>({key:a,fallback:`Fallback for ${a}`}));return await r(o,e,"en")}async function w(o,t,e){const s=await r(o,[{key:"greeting.morning",fallback:"Good morning!",params:e?{username:e}:{}},{key:"greeting.afternoon",fallback:"Good afternoon!",params:e?{username:e}:{}},{key:"greeting.evening",fallback:"Good evening!",params:e?{username:e}:{}}],t||"en"),i=new Date().getHours();return i<12?s["greeting.morning"]:i<18?s["greeting.afternoon"]:s["greeting.evening"]}async function h(){await l()}export{h as ensureAllTranslationsProcessed,k as generateEmailTemplate,g as getErrorMessages,m as getMultiLanguageContent,d as getNotificationMessages,u as getPersonalizedMessages,p as getRobustTranslations,w as getUserGreeting,f as getWelcomeMessages,y as performanceComparison,b as processLargeTranslationBatch};
2
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL3V0aWxzL3RyYW5zbGF0aW9uUXVldWUuZXhhbXBsZS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjUtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKlxuICogRXhhbXBsZSB1c2FnZSBvZiB0aGUgdHJhbnNsYXRpb24gcXVldWUgc3lzdGVtIHdpdGggR29vZ2xlIFRyYW5zbGF0ZSBpbnRlZ3JhdGlvblxuICpcbiAqIFRoaXMgZGVtb25zdHJhdGVzIGhvdyB0byB1c2UgdGhlIG5ldyB0cmFuc2xhdGlvbiBxdWV1ZSB0aGF0IGF1dG9tYXRpY2FsbHlcbiAqIHRyYW5zbGF0ZXMgY29udGVudCB1c2luZyBHb29nbGUgVHJhbnNsYXRlIEFQSSB3aGVuIG5lZWRlZC5cbiAqL1xuXG5pbXBvcnQge2ZsdXNoLCBpMThuLCB0eXBlIFRyYW5zbGF0aW9uT2JqZWN0fSBmcm9tICcuL3RyYW5zbGF0aW9uUXVldWUuanMnO1xuXG5pbXBvcnQgdHlwZSB7QXBpQ29udGV4dH0gZnJvbSAnLi4vdHlwZXMvYXV0aC50eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7TG9jYWxlfSBmcm9tICcuLi90eXBlcy9jb250ZW50LnR5cGVzLmpzJztcblxuLy8gRXhhbXBsZSAxOiBCYXNpYyB0cmFuc2xhdGlvbnMgLSB3aWxsIHVzZSBkYXRhYmFzZSBvciB0cmFuc2xhdGUgYXMgbmVlZGVkXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0V2VsY29tZU1lc3NhZ2VzKGNvbnRleHQ6IEFwaUNvbnRleHQsIGxvY2FsZTogTG9jYWxlID0gJ2VuJykge1xuICBjb25zdCB0cmFuc2xhdGlvbnM6IFRyYW5zbGF0aW9uT2JqZWN0W10gPSBbXG4gICAge1xuICAgICAga2V5OiAnd2VsY29tZS50aXRsZScsXG4gICAgICBmYWxsYmFjazogJ1dlbGNvbWUgdG8gVG9yY2hPbmUhJ1xuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnd2VsY29tZS5zdWJ0aXRsZScsXG4gICAgICBmYWxsYmFjazogJ1lvdXIgcGVyc29uYWwgQUkgYXNzaXN0YW50J1xuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnd2VsY29tZS5kZXNjcmlwdGlvbicsXG4gICAgICBmYWxsYmFjazogJ0dldCBzdGFydGVkIGJ5IGV4cGxvcmluZyBvdXIgZmVhdHVyZXMnXG4gICAgfVxuICBdO1xuXG4gIC8vIFRoaXMgd2lsbDpcbiAgLy8gMS4gQ2hlY2sgZGF0YWJhc2UgZm9yIGV4aXN0aW5nIHRyYW5zbGF0aW9uc1xuICAvLyAyLiBJZiBub3QgZm91bmQgYW5kIGxvY2FsZSBpcyBkZWZhdWx0IChlbiksIHNhdmUgZmFsbGJhY2sgdG8gREJcbiAgLy8gMy4gSWYgbm90IGZvdW5kIGFuZCBsb2NhbGUgaXMgZGlmZmVyZW50LCB0cmFuc2xhdGUgZnJvbSBkZWZhdWx0IGxvY2FsZVxuICAvLyA0LiBTYXZlIHRyYW5zbGF0ZWQgY29udGVudCB0byBEQiBmb3IgZnV0dXJlIHVzZVxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBpMThuIChjb250ZXh0LCB0cmFuc2xhdGlvbnMsIGxvY2FsZSk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbiAgLy8gUmV0dXJuczoge1xuICAvLyAgICd3ZWxjb21lLnRpdGxlJzogJ1dlbGNvbWUgdG8gVG9yY2hPbmUhJyAob3IgdHJhbnNsYXRlZCB2ZXJzaW9uKSxcbiAgLy8gICAnd2VsY29tZS5zdWJ0aXRsZSc6ICdZb3VyIHBlcnNvbmFsIEFJIGFzc2lzdGFudCcgKG9yIHRyYW5zbGF0ZWQgdmVyc2lvbiksXG4gIC8vICAgJ3dlbGNvbWUuZGVzY3JpcHRpb24nOiAnR2V0IHN0YXJ0ZWQgYnkgZXhwbG9yaW5nIG91ciBmZWF0dXJlcycgKG9yIHRyYW5zbGF0ZWQgdmVyc2lvbilcbiAgLy8gfVxufVxuXG4vLyBFeGFtcGxlIDI6IFRyYW5zbGF0aW9ucyB3aXRoIGludGVycG9sYXRpb25cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQZXJzb25hbGl6ZWRNZXNzYWdlcyhjb250ZXh0OiBBcGlDb250ZXh0LCB1c2VybmFtZTogc3RyaW5nLCBsb2NhbGU6IExvY2FsZSA9ICdlbicpIHtcbiAgY29uc3QgdHJhbnNsYXRpb25zOiBUcmFuc2xhdGlvbk9iamVjdFtdID0gW1xuICAgIHtcbiAgICAgIGtleTogJ3VzZXIud2VsY29tZScsXG4gICAgICBmYWxsYmFjazogJ1dlbGNvbWUgYmFjaywge3t1c2VybmFtZX19IScsXG4gICAgICBwYXJhbXM6IHt1c2VybmFtZX1cbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ3VzZXIubm90aWZpY2F0aW9ucycsXG4gICAgICBmYWxsYmFjazogJ1lvdSBoYXZlIHt7Y291bnR9fSBuZXcgbm90aWZpY2F0aW9ucycsXG4gICAgICBwYXJhbXM6IHtjb3VudDogNX1cbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ3VzZXIubGFzdExvZ2luJyxcbiAgICAgIGZhbGxiYWNrOiAnTGFzdCBsb2dpbjoge3tkYXRlfX0nLFxuICAgICAgcGFyYW1zOiB7ZGF0ZTogbmV3IERhdGUoKS50b0xvY2FsZURhdGVTdHJpbmcoKX1cbiAgICB9XG4gIF07XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaTE4bihjb250ZXh0LCB0cmFuc2xhdGlvbnMsIGxvY2FsZSk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbiAgLy8gUmV0dXJuczoge1xuICAvLyAgICd1c2VyLndlbGNvbWUnOiAnV2VsY29tZSBiYWNrLCBBbGljZSEnIChvciB0cmFuc2xhdGVkIHdpdGggaW50ZXJwb2xhdGlvbiksXG4gIC8vICAgJ3VzZXIubm90aWZpY2F0aW9ucyc6ICdZb3UgaGF2ZSA1IG5ldyBub3RpZmljYXRpb25zJyAob3IgdHJhbnNsYXRlZCB3aXRoIGludGVycG9sYXRpb24pLFxuICAvLyAgICd1c2VyLmxhc3RMb2dpbic6ICdMYXN0IGxvZ2luOiAxLzE1LzIwMjUnIChvciB0cmFuc2xhdGVkIHdpdGggaW50ZXJwb2xhdGlvbilcbiAgLy8gfVxufVxuXG4vLyBFeGFtcGxlIDM6IE11bHRpLWxhbmd1YWdlIHN1cHBvcnRcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRNdWx0aUxhbmd1YWdlQ29udGVudChjb250ZXh0OiBBcGlDb250ZXh0KSB7XG4gIC8vIEdldCBjb250ZW50IGluIG11bHRpcGxlIGxhbmd1YWdlc1xuICBjb25zdCBsYW5ndWFnZXM6IExvY2FsZVtdID0gWydlbicsICdlcycsICdmciddO1xuICBjb25zdCByZXN1bHRzOiBSZWNvcmQ8TG9jYWxlLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiA9IHt9IGFzIGFueTtcblxuICBmb3IoY29uc3QgbG9jYWxlIG9mIGxhbmd1YWdlcykge1xuICAgIGNvbnN0IHRyYW5zbGF0aW9uczogVHJhbnNsYXRpb25PYmplY3RbXSA9IFtcbiAgICAgIHtcbiAgICAgICAga2V5OiAnYXBwLm5hbWUnLFxuICAgICAgICBmYWxsYmFjazogJ1RvcmNoT25lJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnYXBwLnRhZ2xpbmUnLFxuICAgICAgICBmYWxsYmFjazogJ1lvdXIgQUkgQXNzaXN0YW50J1xuICAgICAgfVxuICAgIF07XG5cbiAgICByZXN1bHRzW2xvY2FsZV0gPSBhd2FpdCBpMThuKGNvbnRleHQsIHRyYW5zbGF0aW9ucywgbG9jYWxlKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHRzO1xuICAvLyBSZXR1cm5zOiB7XG4gIC8vICAgZW46IHsgJ2FwcC5uYW1lJzogJ1RvcmNoT25lJywgJ2FwcC50YWdsaW5lJzogJ1lvdXIgQUkgQXNzaXN0YW50JyB9LFxuICAvLyAgIGVzOiB7ICdhcHAubmFtZSc6ICdUb3JjaE9uZScsICdhcHAudGFnbGluZSc6ICdUdSBBc2lzdGVudGUgZGUgSUEnIH0sXG4gIC8vICAgZnI6IHsgJ2FwcC5uYW1lJzogJ1RvcmNoT25lJywgJ2FwcC50YWdsaW5lJzogJ1ZvdHJlIEFzc2lzdGFudCBJQScgfVxuICAvLyB9XG59XG5cbi8vIEV4YW1wbGUgNDogRXJyb3IgaGFuZGxpbmcgYW5kIGZhbGxiYWNrc1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFJvYnVzdFRyYW5zbGF0aW9ucyhjb250ZXh0OiBBcGlDb250ZXh0LCBsb2NhbGU6IExvY2FsZSA9ICdlbicpIHtcbiAgY29uc3QgdHJhbnNsYXRpb25zOiBUcmFuc2xhdGlvbk9iamVjdFtdID0gW1xuICAgIHtcbiAgICAgIGtleTogJ2Vycm9yLm5vdEZvdW5kJyxcbiAgICAgIGZhbGxiYWNrOiAnQ29udGVudCBub3QgZm91bmQnXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdlcnJvci5zZXJ2ZXJFcnJvcicsXG4gICAgICBmYWxsYmFjazogJ1NlcnZlciBlcnJvciBvY2N1cnJlZCdcbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ3N1Y2Nlc3Muc2F2ZWQnLFxuICAgICAgZmFsbGJhY2s6ICdDb250ZW50IHNhdmVkIHN1Y2Nlc3NmdWxseSdcbiAgICB9XG4gIF07XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBpMThuKGNvbnRleHQsIHRyYW5zbGF0aW9ucywgbG9jYWxlKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcignVHJhbnNsYXRpb24gZXJyb3I6JywgZXJyb3IpO1xuICAgIC8vIFJldHVybiBmYWxsYmFja3MgaWYgdHJhbnNsYXRpb24gZmFpbHNcbiAgICByZXR1cm4gdHJhbnNsYXRpb25zLnJlZHVjZSgoYWNjLCB0KSA9PiB7XG4gICAgICBhY2NbdC5rZXldID0gdC5mYWxsYmFjayB8fCAnJztcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPik7XG4gIH1cbn1cblxuLy8gRXhhbXBsZSA1OiBCYXRjaCBwcm9jZXNzaW5nIHdpdGggZmx1c2hcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9jZXNzTGFyZ2VUcmFuc2xhdGlvbkJhdGNoKGNvbnRleHQ6IEFwaUNvbnRleHQsIGxvY2FsZTogTG9jYWxlID0gJ2VuJykge1xuICAvLyBDcmVhdGUgYSBsYXJnZSBiYXRjaCBvZiB0cmFuc2xhdGlvbnNcbiAgY29uc3QgdHJhbnNsYXRpb25zOiBUcmFuc2xhdGlvbk9iamVjdFtdID0gW107XG5cbiAgZm9yKGxldCBpID0gMTsgaSA8PSAxMDA7IGkrKykge1xuICAgIHRyYW5zbGF0aW9ucy5wdXNoKHtcbiAgICAgIGtleTogYGl0ZW0uJHtpfS50aXRsZWAsXG4gICAgICBmYWxsYmFjazogYEl0ZW0gJHtpfSBUaXRsZWAsXG4gICAgICBwYXJhbXM6IHtudW1iZXI6IGl9XG4gICAgfSk7XG4gIH1cblxuICAvLyBQcm9jZXNzIHRoZSBiYXRjaFxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBpMThuKGNvbnRleHQsIHRyYW5zbGF0aW9ucywgbG9jYWxlKTtcblxuICAvLyBFbnN1cmUgYWxsIHBlbmRpbmcgdHJhbnNsYXRpb25zIGFyZSBwcm9jZXNzZWRcbiAgYXdhaXQgZmx1c2goKTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vLyBFeGFtcGxlIDY6IEVycm9yIGhhbmRsaW5nIHdpdGggZmFsbGJhY2tzXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RXJyb3JNZXNzYWdlcyhjb250ZXh0OiBBcGlDb250ZXh0LCBlcnJvckNvZGU6IHN0cmluZywgbG9jYWxlOiBMb2NhbGUgPSAnZW4nKSB7XG4gIGNvbnN0IHRyYW5zbGF0aW9uczogVHJhbnNsYXRpb25PYmplY3RbXSA9IFtcbiAgICB7XG4gICAgICBrZXk6IGBlcnJvci4ke2Vycm9yQ29kZX1gLFxuICAgICAgZmFsbGJhY2s6IGBBbiBlcnJvciBvY2N1cnJlZDogJHtlcnJvckNvZGV9YCxcbiAgICAgIHBhcmFtczoge2Vycm9yQ29kZX1cbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ2Vycm9yLmNvbnRhY3RTdXBwb3J0JyxcbiAgICAgIGZhbGxiYWNrOiAnUGxlYXNlIGNvbnRhY3Qgc3VwcG9ydCBpZiB0aGlzIHByb2JsZW0gcGVyc2lzdHMuJyxcbiAgICAgIHBhcmFtczoge31cbiAgICB9XG4gIF07XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaTE4bihjb250ZXh0LCB0cmFuc2xhdGlvbnMsIGxvY2FsZSk7XG5cbiAgLy8gSWYgZGF0YWJhc2UgaXMgdW5hdmFpbGFibGUsIHdpbGwgcmV0dXJuIGZhbGxiYWNrczpcbiAgLy8ge1xuICAvLyAgICdlcnJvci5JTlZBTElEX0VNQUlMJzogJ0FuIGVycm9yIG9jY3VycmVkOiBJTlZBTElEX0VNQUlMJyxcbiAgLy8gICAnZXJyb3IuY29udGFjdFN1cHBvcnQnOiAnUGxlYXNlIGNvbnRhY3Qgc3VwcG9ydCBpZiB0aGlzIHByb2JsZW0gcGVyc2lzdHMuJ1xuICAvLyB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLy8gRXhhbXBsZSA3OiBDb21wbGV4IGVtYWlsIHRlbXBsYXRlIHdpdGggbXVsdGlwbGUgaW50ZXJwb2xhdGlvbnNcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVtYWlsVGVtcGxhdGUoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHVzZXJEYXRhOiB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGVtYWlsOiBzdHJpbmc7XG4gICAgb3JkZXJJZDogc3RyaW5nO1xuICAgIHRvdGFsOiBudW1iZXI7XG4gICAgaXRlbXM6IG51bWJlcjtcbiAgfSxcbiAgbG9jYWxlOiBMb2NhbGUgPSAnZW4nXG4pIHtcbiAgY29uc3QgdHJhbnNsYXRpb25zOiBUcmFuc2xhdGlvbk9iamVjdFtdID0gW1xuICAgIHtcbiAgICAgIGtleTogJ2VtYWlsLm9yZGVyQ29uZmlybWF0aW9uLnN1YmplY3QnLFxuICAgICAgZmFsbGJhY2s6ICdPcmRlciB7e29yZGVySWR9fSBDb25maXJtZWQnLFxuICAgICAgcGFyYW1zOiB7b3JkZXJJZDogdXNlckRhdGEub3JkZXJJZH1cbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ2VtYWlsLm9yZGVyQ29uZmlybWF0aW9uLmdyZWV0aW5nJyxcbiAgICAgIGZhbGxiYWNrOiAnSGVsbG8ge3tuYW1lfX0sJyxcbiAgICAgIHBhcmFtczoge25hbWU6IHVzZXJEYXRhLm5hbWV9XG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdlbWFpbC5vcmRlckNvbmZpcm1hdGlvbi5ib2R5JyxcbiAgICAgIGZhbGxiYWNrOiAnWW91ciBvcmRlciB7e29yZGVySWR9fSBoYXMgYmVlbiBjb25maXJtZWQuIFRvdGFsOiAke3t0b3RhbH19IGZvciB7e2l0ZW1zfX0gaXRlbXMuJyxcbiAgICAgIHBhcmFtczoge1xuICAgICAgICBvcmRlcklkOiB1c2VyRGF0YS5vcmRlcklkLFxuICAgICAgICB0b3RhbDogdXNlckRhdGEudG90YWwsXG4gICAgICAgIGl0ZW1zOiB1c2VyRGF0YS5pdGVtc1xuICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnZW1haWwub3JkZXJDb25maXJtYXRpb24uZm9vdGVyJyxcbiAgICAgIGZhbGxiYWNrOiAnVGhhbmsgeW91IGZvciB5b3VyIHB1cmNoYXNlISdcbiAgICB9XG4gIF07XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaTE4bihjb250ZXh0LCB0cmFuc2xhdGlvbnMsIGxvY2FsZSk7XG5cbiAgcmV0dXJuIHtcbiAgICBzdWJqZWN0OiByZXN1bHRbJ2VtYWlsLm9yZGVyQ29uZmlybWF0aW9uLnN1YmplY3QnXSxcbiAgICBncmVldGluZzogcmVzdWx0WydlbWFpbC5vcmRlckNvbmZpcm1hdGlvbi5ncmVldGluZyddLFxuICAgIGJvZHk6IHJlc3VsdFsnZW1haWwub3JkZXJDb25maXJtYXRpb24uYm9keSddLFxuICAgIGZvb3RlcjogcmVzdWx0WydlbWFpbC5vcmRlckNvbmZpcm1hdGlvbi5mb290ZXInXVxuICB9O1xufVxuXG4vLyBFeGFtcGxlIDg6IE5vdGlmaWNhdGlvbiBtZXNzYWdlcyBmb3IgZGlmZmVyZW50IHNjZW5hcmlvc1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE5vdGlmaWNhdGlvbk1lc3NhZ2VzKGNvbnRleHQ6IEFwaUNvbnRleHQsIGxvY2FsZTogTG9jYWxlID0gJ2VuJykge1xuICBjb25zdCB0cmFuc2xhdGlvbnM6IFRyYW5zbGF0aW9uT2JqZWN0W10gPSBbXG4gICAge1xuICAgICAga2V5OiAnbm90aWZpY2F0aW9uLndlbGNvbWUnLFxuICAgICAgZmFsbGJhY2s6ICdXZWxjb21lIHRvIFRvcmNoT25lISdcbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ25vdGlmaWNhdGlvbi52ZXJpZmljYXRpb24nLFxuICAgICAgZmFsbGJhY2s6ICdQbGVhc2UgdmVyaWZ5IHlvdXIgYWNjb3VudC4nXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdub3RpZmljYXRpb24ucGFzc3dvcmRSZXNldCcsXG4gICAgICBmYWxsYmFjazogJ1lvdXIgcGFzc3dvcmQgaGFzIGJlZW4gcmVzZXQuJ1xuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnbm90aWZpY2F0aW9uLnByb2ZpbGVVcGRhdGUnLFxuICAgICAgZmFsbGJhY2s6ICdZb3VyIHByb2ZpbGUgaGFzIGJlZW4gdXBkYXRlZC4nXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdub3RpZmljYXRpb24ubmV3TWVzc2FnZScsXG4gICAgICBmYWxsYmFjazogJ1lvdSBoYXZlIGEgbmV3IG1lc3NhZ2UgZnJvbSB7e3NlbmRlcn19LicsXG4gICAgICBwYXJhbXM6IHtzZW5kZXI6ICdKb2huIERvZSd9XG4gICAgfVxuICBdO1xuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGkxOG4oY29udGV4dCwgdHJhbnNsYXRpb25zLCBsb2NhbGUpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8vIEV4YW1wbGUgOTogUGVyZm9ybWFuY2UgY29tcGFyaXNvblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBlcmZvcm1hbmNlQ29tcGFyaXNvbihjb250ZXh0OiBBcGlDb250ZXh0KSB7XG4gIGNvbnN0IGtleXMgPSBbXG4gICAgJ3dlbGNvbWUnLCAndmVyaWZpY2F0aW9uJywgJ3Bhc3N3b3JkUmVzZXQnLCAncHJvZmlsZVVwZGF0ZScsXG4gICAgJ2VtYWlsLnN1YmplY3QnLCAnZW1haWwuYm9keScsICdzbXMud2VsY29tZScsICdzbXMudmVyaWZpY2F0aW9uJ1xuICBdO1xuXG4gIGNvbnN0IHRyYW5zbGF0aW9uczogVHJhbnNsYXRpb25PYmplY3RbXSA9IGtleXMubWFwKChrZXkpID0+ICh7XG4gICAga2V5LFxuICAgIGZhbGxiYWNrOiBgRmFsbGJhY2sgZm9yICR7a2V5fWBcbiAgfSkpO1xuXG4gIGNvbnNvbGUudGltZSgnQmF0Y2ggdHJhbnNsYXRpb24nKTtcbiAgY29uc3QgYmF0Y2hSZXN1bHRzID0gYXdhaXQgaTE4bihjb250ZXh0LCB0cmFuc2xhdGlvbnMsICdlbicpO1xuICBjb25zb2xlLnRpbWVFbmQoJ0JhdGNoIHRyYW5zbGF0aW9uJyk7XG5cbiAgcmV0dXJuIGJhdGNoUmVzdWx0cztcbn1cblxuLy8gRXhhbXBsZSAxMDogRHluYW1pYyBjb250ZW50IGJhc2VkIG9uIHVzZXIgcHJlZmVyZW5jZXNcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRVc2VyR3JlZXRpbmcoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHVzZXJMb2NhbGU/OiBzdHJpbmcsXG4gIHVzZXJuYW1lPzogc3RyaW5nXG4pIHtcbiAgY29uc3QgbG9jYWxlOiBMb2NhbGUgPSAodXNlckxvY2FsZSBhcyBMb2NhbGUpIHx8ICdlbic7XG5cbiAgY29uc3QgdHJhbnNsYXRpb25zOiBUcmFuc2xhdGlvbk9iamVjdFtdID0gW1xuICAgIHtcbiAgICAgIGtleTogJ2dyZWV0aW5nLm1vcm5pbmcnLFxuICAgICAgZmFsbGJhY2s6ICdHb29kIG1vcm5pbmchJyxcbiAgICAgIHBhcmFtczogdXNlcm5hbWUgPyB7dXNlcm5hbWV9IDoge31cbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ2dyZWV0aW5nLmFmdGVybm9vbicsXG4gICAgICBmYWxsYmFjazogJ0dvb2QgYWZ0ZXJub29uIScsXG4gICAgICBwYXJhbXM6IHVzZXJuYW1lID8ge3VzZXJuYW1lfSA6IHt9XG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdncmVldGluZy5ldmVuaW5nJyxcbiAgICAgIGZhbGxiYWNrOiAnR29vZCBldmVuaW5nIScsXG4gICAgICBwYXJhbXM6IHVzZXJuYW1lID8ge3VzZXJuYW1lfSA6IHt9XG4gICAgfVxuICBdO1xuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGkxOG4oY29udGV4dCwgdHJhbnNsYXRpb25zLCBsb2NhbGUpO1xuXG4gIC8vIFJldHVybiBhcHByb3ByaWF0ZSBncmVldGluZyBiYXNlZCBvbiB0aW1lIG9mIGRheVxuICBjb25zdCBob3VyID0gbmV3IERhdGUoKS5nZXRIb3VycygpO1xuICBpZihob3VyIDwgMTIpIHtcbiAgICByZXR1cm4gcmVzdWx0WydncmVldGluZy5tb3JuaW5nJ107XG4gIH1cbiAgaWYoaG91ciA8IDE4KSB7XG4gICAgcmV0dXJuIHJlc3VsdFsnZ3JlZXRpbmcuYWZ0ZXJub29uJ107XG4gIH1cbiAgcmV0dXJuIHJlc3VsdFsnZ3JlZXRpbmcuZXZlbmluZyddO1xufVxuXG4vLyBFeGFtcGxlIDExOiBGb3JjZSBmbHVzaCBwZW5kaW5nIHRyYW5zbGF0aW9uc1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZUFsbFRyYW5zbGF0aW9uc1Byb2Nlc3NlZCgpIHtcbiAgLy8gRm9yY2UgcHJvY2VzcyBhbnkgcGVuZGluZyB0cmFuc2xhdGlvbiBiYXRjaGVzXG4gIGF3YWl0IGZsdXNoKCk7XG4gIGNvbnNvbGUubG9nKCdBbGwgdHJhbnNsYXRpb24gYmF0Y2hlcyBwcm9jZXNzZWQnKTtcbn1cblxuLy8gVXNhZ2UgZXhhbXBsZXM6XG4vLyBjb25zdCBjb250ZXh0ID0geyBkYXRhYmFzZU5hbWU6ICd0b3JjaG9uZS1kZXYnLCBzZXNzaW9uOiB7IHVzZXJJZDogJ3VzZXIxMjMnIH0gfTtcbi8vXG4vLyAvLyBCYXNpYyB1c2FnZVxuLy8gY29uc3Qgd2VsY29tZU1lc3NhZ2VzID0gYXdhaXQgZ2V0V2VsY29tZU1lc3NhZ2VzKGNvbnRleHQsICdlbicpO1xuLy9cbi8vIC8vIFdpdGggaW50ZXJwb2xhdGlvblxuLy8gY29uc3QgcGVyc29uYWxpemVkTWVzc2FnZXMgPSBhd2FpdCBnZXRQZXJzb25hbGl6ZWRNZXNzYWdlcyhjb250ZXh0LCAnSm9obicsICdlcycpO1xuLy9cbi8vIC8vIE11bHRpLWxhbmd1YWdlIGNvbnRlbnRcbi8vIGNvbnN0IG11bHRpTGFuZ3VhZ2VDb250ZW50ID0gYXdhaXQgZ2V0TXVsdGlMYW5ndWFnZUNvbnRlbnQoY29udGV4dCk7XG4vL1xuLy8gLy8gRXJyb3IgaGFuZGxpbmdcbi8vIGNvbnN0IGVycm9yTWVzc2FnZXMgPSBhd2FpdCBnZXRSb2J1c3RUcmFuc2xhdGlvbnMoY29udGV4dCwgJ2RlJyk7XG4vL1xuLy8gLy8gQ29tcGxleCB0ZW1wbGF0ZVxuLy8gY29uc3QgZW1haWxUZW1wbGF0ZSA9IGF3YWl0IGdlbmVyYXRlRW1haWxUZW1wbGF0ZShjb250ZXh0LCB7XG4vLyAgIG5hbWU6ICdNYXJpYScsXG4vLyAgIGVtYWlsOiAnbWFyaWFAZXhhbXBsZS5jb20nLFxuLy8gICBvcmRlcklkOiAnT1JELTEyMycsXG4vLyAgIHRvdGFsOiA5OS45OSxcbi8vICAgaXRlbXM6IDNcbi8vIH0sICdwdCcpO1xuLy9cbi8vIC8vIE5vdGlmaWNhdGlvbnNcbi8vIGNvbnN0IG5vdGlmaWNhdGlvbnMgPSBhd2FpdCBnZXROb3RpZmljYXRpb25NZXNzYWdlcyhjb250ZXh0LCAnZnInKTtcbi8vXG4vLyAvLyBQZXJmb3JtYW5jZSB0ZXN0XG4vLyBjb25zdCBwZXJmID0gYXdhaXQgcGVyZm9ybWFuY2VDb21wYXJpc29uKGNvbnRleHQpO1xuLy9cbi8vIC8vIER5bmFtaWMgZ3JlZXRpbmdcbi8vIGNvbnN0IGdyZWV0aW5nID0gYXdhaXQgZ2V0VXNlckdyZWV0aW5nKGNvbnRleHQsICdlbicsICdKb2huJyk7XG4vL1xuLy8gLy8gRm9yY2UgZmx1c2hcbi8vIGF3YWl0IGVuc3VyZUFsbFRyYW5zbGF0aW9uc1Byb2Nlc3NlZCgpOyJdLAogICJtYXBwaW5ncyI6ICJBQVVBLE9BQVEsU0FBQUEsRUFBTyxRQUFBQyxNQUFtQyx3QkFNbEQsZUFBc0JDLEVBQW1CQyxFQUFxQkMsRUFBaUIsS0FBTSxDQXVCbkYsT0FGZSxNQUFNSCxFQUFNRSxFQXBCZSxDQUN4QyxDQUNFLElBQUssZ0JBQ0wsU0FBVSxzQkFDWixFQUNBLENBQ0UsSUFBSyxtQkFDTCxTQUFVLDRCQUNaLEVBQ0EsQ0FDRSxJQUFLLHNCQUNMLFNBQVUsdUNBQ1osQ0FDRixFQU9rREMsQ0FBTSxDQVExRCxDQUdBLGVBQXNCQyxFQUF3QkYsRUFBcUJHLEVBQWtCRixFQUFpQixLQUFNLENBQzFHLE1BQU1HLEVBQW9DLENBQ3hDLENBQ0UsSUFBSyxlQUNMLFNBQVUsOEJBQ1YsT0FBUSxDQUFDLFNBQUFELENBQVEsQ0FDbkIsRUFDQSxDQUNFLElBQUsscUJBQ0wsU0FBVSx1Q0FDVixPQUFRLENBQUMsTUFBTyxDQUFDLENBQ25CLEVBQ0EsQ0FDRSxJQUFLLGlCQUNMLFNBQVUsdUJBQ1YsT0FBUSxDQUFDLEtBQU0sSUFBSSxLQUFLLEVBQUUsbUJBQW1CLENBQUMsQ0FDaEQsQ0FDRixFQUlBLE9BRmUsTUFBTUwsRUFBS0UsRUFBU0ksRUFBY0gsQ0FBTSxDQVF6RCxDQUdBLGVBQXNCSSxFQUF3QkwsRUFBcUIsQ0FFakUsTUFBTU0sRUFBc0IsQ0FBQyxLQUFNLEtBQU0sSUFBSSxFQUN2Q0MsRUFBa0QsQ0FBQyxFQUV6RCxVQUFVTixLQUFVSyxFQUFXLENBQzdCLE1BQU1GLEVBQW9DLENBQ3hDLENBQ0UsSUFBSyxXQUNMLFNBQVUsVUFDWixFQUNBLENBQ0UsSUFBSyxjQUNMLFNBQVUsbUJBQ1osQ0FDRixFQUVBRyxFQUFRTixDQUFNLEVBQUksTUFBTUgsRUFBS0UsRUFBU0ksRUFBY0gsQ0FBTSxDQUM1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RUFBU0ksRUFBYyxJQUFJLENBSTdELENBR0EsZUFBc0JpQixFQUNwQnJCLEVBQ0FzQixFQUNBbkIsRUFDQSxDQXFCQSxNQUFNVSxFQUFTLE1BQU1mLEVBQUtFLEVBbEJnQixDQUN4QyxDQUNFLElBQUssbUJBQ0wsU0FBVSxnQkFDVixPQUFRRyxFQUFXLENBQUMsU0FBQUEsQ0FBUSxFQUFJLENBQUMsQ0FDbkMsRUFDQSxDQUNFLElBQUsscUJBQ0wsU0FBVSxrQkFDVixPQUFRQSxFQUFXLENBQUMsU0FBQUEsQ0FBUSxFQUFJLENBQUMsQ0FDbkMsRUFDQSxDQUNFLElBQUssbUJBQ0wsU0FBVSxnQkFDVixPQUFRQSxFQUFXLENBQUMsU0FBQUEsQ0FBUSxFQUFJLENBQUMsQ0FDbkMsQ0FDRixFQWxCd0JtQixHQUF5QixJQW9CTSxFQUdqREMsRUFBTyxJQUFJLEtBQUssRUFBRSxTQUFTLEVBQ2pDLE9BQUdBLEVBQU8sR0FDRFYsRUFBTyxrQkFBa0IsRUFFL0JVLEVBQU8sR0FDRFYsRUFBTyxvQkFBb0IsRUFFN0JBLEVBQU8sa0JBQWtCLENBQ2xDLENBR0EsZUFBc0JXLEdBQWlDLENBRXJELE1BQU0zQixFQUFNLENBRWQiLAogICJuYW1lcyI6IFsiZmx1c2giLCAiaTE4biIsICJnZXRXZWxjb21lTWVzc2FnZXMiLCAiY29udGV4dCIsICJsb2NhbGUiLCAiZ2V0UGVyc29uYWxpemVkTWVzc2FnZXMiLCAidXNlcm5hbWUiLCAidHJhbnNsYXRpb25zIiwgImdldE11bHRpTGFuZ3VhZ2VDb250ZW50IiwgImxhbmd1YWdlcyIsICJyZXN1bHRzIiwgImdldFJvYnVzdFRyYW5zbGF0aW9ucyIsICJhY2MiLCAidCIsICJwcm9jZXNzTGFyZ2VUcmFuc2xhdGlvbkJhdGNoIiwgImkiLCAicmVzdWx0IiwgImdldEVycm9yTWVzc2FnZXMiLCAiZXJyb3JDb2RlIiwgImdlbmVyYXRlRW1haWxUZW1wbGF0ZSIsICJ1c2VyRGF0YSIsICJnZXROb3RpZmljYXRpb25NZXNzYWdlcyIsICJwZXJmb3JtYW5jZUNvbXBhcmlzb24iLCAia2V5IiwgImdldFVzZXJHcmVldGluZyIsICJ1c2VyTG9jYWxlIiwgImhvdXIiLCAiZW5zdXJlQWxsVHJhbnNsYXRpb25zUHJvY2Vzc2VkIl0KfQo=
@@ -0,0 +1,2 @@
1
+ import{getContentWithFallback as u}from"../actions/content.js";class m{batches=new Map;batchTimeout=50;maxBatchSize=20;async translate(e,t,n="en"){if(t.length===0)return{};const o=t.map(({key:r,fallback:i="",params:l={}})=>this.getTranslation(e,r,i,l,n)),s=await Promise.all(o),a={};return t.forEach(({key:r},i)=>{a[r]=s[i]}),a}async getTranslation(e,t,n,o={},s="en"){return new Promise((a,r)=>{const i=this.getBatchKey(e,s),l={key:t,fallback:n,params:o,locale:s,resolve:a,reject:r};if(this.batches.has(i)){const c=this.batches.get(i);c.requests.push(l),c.requests.length>=this.maxBatchSize&&(clearTimeout(c.timeout),this.processBatch(i))}else{const c=setTimeout(()=>{this.processBatch(i)},this.batchTimeout);this.batches.set(i,{context:e,requests:[l],timeout:c})}})}async flush(){const e=Array.from(this.batches.keys());await Promise.all(e.map(t=>this.processBatch(t)))}clear(){this.batches.forEach(e=>{clearTimeout(e.timeout),e.requests.forEach(t=>{t.reject(new Error("Translation queue cleared"))})}),this.batches.clear()}getBatchKey(e,t){return`${e.databaseName}:${t}`}async processBatch(e){const t=this.batches.get(e);if(!t)return;this.batches.delete(e),clearTimeout(t.timeout);const n=t.requests.map(async s=>{try{const a=await u(t.context,s.key,s.fallback,s.locale),r=this.interpolate(a,s.params);return{request:s,result:r}}catch{const r=this.interpolate(s.fallback,s.params);return{request:s,result:r}}});(await Promise.allSettled(n)).forEach(s=>{if(s.status==="fulfilled")s.value.request.resolve(s.value.result);else{const{request:a}=s.reason,r=this.interpolate(a.fallback,a.params);a.resolve(r)}})}interpolate(e,t={}){return e.replace(/\{\{(\w+)\}\}/g,(n,o)=>t[o]!==void 0?String(t[o]):n)}}const h=new m,f=(p,e,t)=>h.translate(p,e,t),b=()=>h.flush(),d=()=>h.clear();export{d as clear,b as flush,f as i18n,h as translationQueue};
2
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL3V0aWxzL3RyYW5zbGF0aW9uUXVldWUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDI1LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5cbmltcG9ydCB7Z2V0Q29udGVudFdpdGhGYWxsYmFja30gZnJvbSAnLi4vYWN0aW9ucy9jb250ZW50LmpzJztcblxuaW1wb3J0IHR5cGUge0FwaUNvbnRleHR9IGZyb20gJy4uL3R5cGVzL2F1dGgudHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge0xvY2FsZX0gZnJvbSAnLi4vdHlwZXMvY29udGVudC50eXBlcy5qcyc7XG5cbmludGVyZmFjZSBUcmFuc2xhdGlvblJlcXVlc3Qge1xuICBrZXk6IHN0cmluZztcbiAgZmFsbGJhY2s6IHN0cmluZztcbiAgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgbG9jYWxlOiBMb2NhbGU7XG4gIHJlc29sdmU6ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkO1xuICByZWplY3Q6IChlcnJvcjogRXJyb3IpID0+IHZvaWQ7XG59XG5cbmludGVyZmFjZSBUcmFuc2xhdGlvbkJhdGNoIHtcbiAgY29udGV4dDogQXBpQ29udGV4dDtcbiAgcmVxdWVzdHM6IFRyYW5zbGF0aW9uUmVxdWVzdFtdO1xuICB0aW1lb3V0OiBOb2RlSlMuVGltZW91dDtcbn1cblxuaW50ZXJmYWNlIFRyYW5zbGF0aW9uT2JqZWN0IHtcbiAga2V5OiBzdHJpbmc7XG4gIGZhbGxiYWNrPzogc3RyaW5nO1xuICBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufVxuXG5jbGFzcyBUcmFuc2xhdGlvblF1ZXVlIHtcbiAgcHJpdmF0ZSBiYXRjaGVzOiBNYXA8c3RyaW5nLCBUcmFuc2xhdGlvbkJhdGNoPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBiYXRjaFRpbWVvdXQgPSA1MDtcbiAgcHJpdmF0ZSBtYXhCYXRjaFNpemUgPSAyMDtcblxuICBhc3luYyB0cmFuc2xhdGUoXG4gICAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgICB0cmFuc2xhdGlvbnM6IFRyYW5zbGF0aW9uT2JqZWN0W10sXG4gICAgbG9jYWxlOiBMb2NhbGUgPSAnZW4nXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4ge1xuICAgIGlmKHRyYW5zbGF0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9taXNlcyA9IHRyYW5zbGF0aW9ucy5tYXAoKHtrZXksIGZhbGxiYWNrID0gJycsIHBhcmFtcyA9IHt9fSkgPT5cbiAgICAgIHRoaXMuZ2V0VHJhbnNsYXRpb24oY29udGV4dCwga2V5LCBmYWxsYmFjaywgcGFyYW1zLCBsb2NhbGUpXG4gICAgKTtcblxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG5cbiAgICBjb25zdCByZXN1bHRNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICB0cmFuc2xhdGlvbnMuZm9yRWFjaCgoe2tleX0sIGluZGV4KSA9PiB7XG4gICAgICByZXN1bHRNYXBba2V5XSA9IHJlc3VsdHNbaW5kZXhdO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3VsdE1hcDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0VHJhbnNsYXRpb24oXG4gICAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgICBrZXk6IHN0cmluZyxcbiAgICBmYWxsYmFjazogc3RyaW5nLFxuICAgIHBhcmFtczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LFxuICAgIGxvY2FsZTogTG9jYWxlID0gJ2VuJ1xuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBiYXRjaEtleSA9IHRoaXMuZ2V0QmF0Y2hLZXkoY29udGV4dCwgbG9jYWxlKTtcbiAgICAgIGNvbnN0IHJlcXVlc3Q6IFRyYW5zbGF0aW9uUmVxdWVzdCA9IHtrZXksIGZhbGxiYWNrLCBwYXJhbXMsIGxvY2FsZSwgcmVzb2x2ZSwgcmVqZWN0fTtcblxuICAgICAgaWYoIXRoaXMuYmF0Y2hlcy5oYXMoYmF0Y2hLZXkpKSB7XG4gICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLnByb2Nlc3NCYXRjaChiYXRjaEtleSk7XG4gICAgICAgIH0sIHRoaXMuYmF0Y2hUaW1lb3V0KTtcblxuICAgICAgICB0aGlzLmJhdGNoZXMuc2V0KGJhdGNoS2V5LCB7XG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICByZXF1ZXN0czogW3JlcXVlc3RdLFxuICAgICAgICAgIHRpbWVvdXRcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBiYXRjaCA9IHRoaXMuYmF0Y2hlcy5nZXQoYmF0Y2hLZXkpITtcbiAgICAgICAgYmF0Y2gucmVxdWVzdHMucHVzaChyZXF1ZXN0KTtcblxuICAgICAgICBpZihiYXRjaC5yZXF1ZXN0cy5sZW5ndGggPj0gdGhpcy5tYXhCYXRjaFNpemUpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQoYmF0Y2gudGltZW91dCk7XG4gICAgICAgICAgdGhpcy5wcm9jZXNzQmF0Y2goYmF0Y2hLZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBmbHVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBiYXRjaEtleXMgPSBBcnJheS5mcm9tKHRoaXMuYmF0Y2hlcy5rZXlzKCkpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKGJhdGNoS2V5cy5tYXAoKGtleSkgPT4gdGhpcy5wcm9jZXNzQmF0Y2goa2V5KSkpO1xuICB9XG5cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5iYXRjaGVzLmZvckVhY2goKGJhdGNoKSA9PiB7XG4gICAgICBjbGVhclRpbWVvdXQoYmF0Y2gudGltZW91dCk7XG4gICAgICBiYXRjaC5yZXF1ZXN0cy5mb3JFYWNoKChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIHJlcXVlc3QucmVqZWN0KG5ldyBFcnJvcignVHJhbnNsYXRpb24gcXVldWUgY2xlYXJlZCcpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHRoaXMuYmF0Y2hlcy5jbGVhcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRCYXRjaEtleShjb250ZXh0OiBBcGlDb250ZXh0LCBsb2NhbGU6IExvY2FsZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke2NvbnRleHQuZGF0YWJhc2VOYW1lfToke2xvY2FsZX1gO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwcm9jZXNzQmF0Y2goYmF0Y2hLZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGJhdGNoID0gdGhpcy5iYXRjaGVzLmdldChiYXRjaEtleSk7XG4gICAgaWYoIWJhdGNoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5iYXRjaGVzLmRlbGV0ZShiYXRjaEtleSk7XG4gICAgY2xlYXJUaW1lb3V0KGJhdGNoLnRpbWVvdXQpO1xuXG4gICAgY29uc3QgcHJvbWlzZXMgPSBiYXRjaC5yZXF1ZXN0cy5tYXAoYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBnZXRDb250ZW50V2l0aEZhbGxiYWNrKFxuICAgICAgICAgIGJhdGNoLmNvbnRleHQsXG4gICAgICAgICAgcmVxdWVzdC5rZXksXG4gICAgICAgICAgcmVxdWVzdC5mYWxsYmFjayxcbiAgICAgICAgICByZXF1ZXN0LmxvY2FsZVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGludGVycG9sYXRlZENvbnRlbnQgPSB0aGlzLmludGVycG9sYXRlKGNvbnRlbnQsIHJlcXVlc3QucGFyYW1zKTtcbiAgICAgICAgcmV0dXJuIHtyZXF1ZXN0LCByZXN1bHQ6IGludGVycG9sYXRlZENvbnRlbnR9O1xuICAgICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgICBjb25zdCBpbnRlcnBvbGF0ZWRGYWxsYmFjayA9IHRoaXMuaW50ZXJwb2xhdGUocmVxdWVzdC5mYWxsYmFjaywgcmVxdWVzdC5wYXJhbXMpO1xuICAgICAgICByZXR1cm4ge3JlcXVlc3QsIHJlc3VsdDogaW50ZXJwb2xhdGVkRmFsbGJhY2t9O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChwcm9taXNlcyk7XG5cbiAgICByZXN1bHRzLmZvckVhY2goKHJlc3VsdCkgPT4ge1xuICAgICAgaWYocmVzdWx0LnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcpIHtcbiAgICAgICAgcmVzdWx0LnZhbHVlLnJlcXVlc3QucmVzb2x2ZShyZXN1bHQudmFsdWUucmVzdWx0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHtyZXF1ZXN0fSA9IHJlc3VsdC5yZWFzb247XG4gICAgICAgIGNvbnN0IGludGVycG9sYXRlZEZhbGxiYWNrID0gdGhpcy5pbnRlcnBvbGF0ZShyZXF1ZXN0LmZhbGxiYWNrLCByZXF1ZXN0LnBhcmFtcyk7XG4gICAgICAgIHJlcXVlc3QucmVzb2x2ZShpbnRlcnBvbGF0ZWRGYWxsYmFjayk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGludGVycG9sYXRlKGNvbnRlbnQ6IHN0cmluZywgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30pOiBzdHJpbmcge1xuICAgIHJldHVybiBjb250ZW50LnJlcGxhY2UoL1xce1xceyhcXHcrKVxcfVxcfS9nLCAobWF0Y2gsIGtleSkgPT4gKHBhcmFtc1trZXldICE9PSB1bmRlZmluZWQgPyBTdHJpbmcocGFyYW1zW2tleV0pIDogbWF0Y2gpKTtcbiAgfVxufVxuXG5jb25zdCB0cmFuc2xhdGlvblF1ZXVlID0gbmV3IFRyYW5zbGF0aW9uUXVldWUoKTtcblxuZXhwb3J0IGNvbnN0IGkxOG4gPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHRyYW5zbGF0aW9uczogVHJhbnNsYXRpb25PYmplY3RbXSxcbiAgbG9jYWxlPzogTG9jYWxlXG4pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+ID0+IHRyYW5zbGF0aW9uUXVldWUudHJhbnNsYXRlKGNvbnRleHQsIHRyYW5zbGF0aW9ucywgbG9jYWxlKTtcblxuZXhwb3J0IGNvbnN0IGZsdXNoID0gKCk6IFByb21pc2U8dm9pZD4gPT4gdHJhbnNsYXRpb25RdWV1ZS5mbHVzaCgpO1xuZXhwb3J0IGNvbnN0IGNsZWFyID0gKCk6IHZvaWQgPT4gdHJhbnNsYXRpb25RdWV1ZS5jbGVhcigpO1xuXG5leHBvcnQgdHlwZSB7VHJhbnNsYXRpb25PYmplY3R9O1xuXG4gIGV4cG9ydCB7dHJhbnNsYXRpb25RdWV1ZX07XG4iXSwKICAibWFwcGluZ3MiOiAiQUFLQSxPQUFRLDBCQUFBQSxNQUE2Qix3QkEwQnJDLE1BQU1DLENBQWlCLENBQ2IsUUFBeUMsSUFBSSxJQUM3QyxhQUFlLEdBQ2YsYUFBZSxHQUV2QixNQUFNLFVBQ0pDLEVBQ0FDLEVBQ0FDLEVBQWlCLEtBQ2dCLENBQ2pDLEdBQUdELEVBQWEsU0FBVyxFQUN6QixNQUFPLENBQUMsRUFHVixNQUFNRSxFQUFXRixFQUFhLElBQUksQ0FBQyxDQUFDLElBQUFHLEVBQUssU0FBQUMsRUFBVyxHQUFJLE9BQUFDLEVBQVMsQ0FBQyxDQUFDLElBQ2pFLEtBQUssZUFBZU4sRUFBU0ksRUFBS0MsRUFBVUMsRUFBUUosQ0FBTSxDQUM1RCxFQUVNSyxFQUFVLE1BQU0sUUFBUSxJQUFJSixDQUFRLEVBRXBDSyxFQUFvQyxDQUFDLEVBQzNDLE9BQUFQLEVBQWEsUUFBUSxD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QixDQUFDSSxFQUFPakIsSUFBU0UsRUFBT0YsQ0FBRyxJQUFNLE9BQVksT0FBT0UsRUFBT0YsQ0FBRyxDQUFDLEVBQUlpQixDQUFNLENBQ3BILENBQ0YsQ0FFQSxNQUFNQyxFQUFtQixJQUFJdkIsRUFFaEJ3QixFQUFPLENBQ2xCdkIsRUFDQUMsRUFDQUMsSUFDb0NvQixFQUFpQixVQUFVdEIsRUFBU0MsRUFBY0MsQ0FBTSxFQUVqRnNCLEVBQVEsSUFBcUJGLEVBQWlCLE1BQU0sRUFDcERHLEVBQVEsSUFBWUgsRUFBaUIsTUFBTSIsCiAgIm5hbWVzIjogWyJnZXRDb250ZW50V2l0aEZhbGxiYWNrIiwgIlRyYW5zbGF0aW9uUXVldWUiLCAiY29udGV4dCIsICJ0cmFuc2xhdGlvbnMiLCAibG9jYWxlIiwgInByb21pc2VzIiwgImtleSIsICJmYWxsYmFjayIsICJwYXJhbXMiLCAicmVzdWx0cyIsICJyZXN1bHRNYXAiLCAiaW5kZXgiLCAicmVzb2x2ZSIsICJyZWplY3QiLCAiYmF0Y2hLZXkiLCAicmVxdWVzdCIsICJiYXRjaCIsICJ0aW1lb3V0IiwgImJhdGNoS2V5cyIsICJjb250ZW50IiwgImludGVycG9sYXRlZENvbnRlbnQiLCAiaW50ZXJwb2xhdGVkRmFsbGJhY2siLCAicmVzdWx0IiwgIm1hdGNoIiwgInRyYW5zbGF0aW9uUXVldWUiLCAiaTE4biIsICJmbHVzaCIsICJjbGVhciJdCn0K
package/package.json CHANGED
@@ -1,10 +1,11 @@
1
1
  {
2
2
  "name": "@nlabs/reaktor",
3
- "version": "0.10.0",
3
+ "version": "0.10.2",
4
4
  "description": "Reaktor",
5
+ "type": "module",
5
6
  "main": "./lib/index.js",
6
7
  "module": "./lib/index.js",
7
- "types": "./lib/index.d.js",
8
+ "types": "./lib/index.d.ts",
8
9
  "keywords": [
9
10
  "reaktor",
10
11
  "nitrogenlabs",
@@ -27,9 +28,11 @@
27
28
  },
28
29
  "scripts": {
29
30
  "build": "lex compile --remove",
31
+ "build:dev": "APP_ENV=dev NODE_ENV=development lex compile --remove",
32
+ "build:prod": "APP_ENV=prod NODE_ENV=production lex compile --remove",
30
33
  "clean": "lex clean",
31
- "lint": "lex lint",
32
- "prepublishOnly": "npm run build",
34
+ "lint": "lex lint --fix",
35
+ "prepublishOnly": "npm run build:prod",
33
36
  "publish:major": "npm version major && npm run publish:tags && npm publish",
34
37
  "publish:minor": "npm version minor && npm run publish:tags && npm publish",
35
38
  "publish:patch": "npm version patch && npm run publish:tags && npm publish",
@@ -40,53 +43,54 @@
40
43
  "watch": "lex compile --remove --watch"
41
44
  },
42
45
  "dependencies": {
43
- "@aws-sdk/client-apigatewaymanagementapi": "^3.835.0",
44
- "@aws-sdk/client-dynamodb": "^3.835.0",
45
- "@aws-sdk/client-s3": "^3.835.0",
46
- "@aws-sdk/client-ses": "^3.835.0",
47
- "@aws-sdk/client-sns": "^3.835.0",
48
- "@aws-sdk/s3-request-presigner": "^3.835.0",
49
- "@nlabs/arkhamjs": "^3.28.8",
50
- "@nlabs/rip-hunter": "^2.6.4",
51
- "@nlabs/utils": "^1.5.0",
46
+ "@aws-sdk/client-apigatewaymanagementapi": "^3.859.0",
47
+ "@aws-sdk/client-dynamodb": "^3.859.0",
48
+ "@aws-sdk/client-s3": "^3.859.0",
49
+ "@aws-sdk/client-ses": "^3.859.0",
50
+ "@aws-sdk/client-sns": "^3.859.0",
51
+ "@aws-sdk/s3-request-presigner": "^3.859.0",
52
+ "@nlabs/arkhamjs": "^3.31.7",
53
+ "@nlabs/rip-hunter": "^3.0.2",
54
+ "@nlabs/utils": "^2.8.4",
55
+ "@types/aws-lambda": "^8.10.152",
52
56
  "apn": "^2.2.0",
53
- "arangojs": "^10.1.1",
57
+ "arangojs": "^10.1.2",
54
58
  "aws-sdk": "^2.1692.0",
55
59
  "child_process": "^1.0.2",
56
- "core-js": "^3.43.0",
60
+ "core-js": "^3.45.0",
57
61
  "file-type": "^21.0.0",
58
62
  "gm": "^1.25.1",
59
63
  "google-libphonenumber": "^3.2.42",
60
- "googleapis": "150.0.1",
64
+ "googleapis": "155.0.0",
61
65
  "graphql": "^16.11.0",
62
66
  "graphql-compose": "^9.1.0",
63
67
  "graphql-fields": "^2.0.3",
68
+ "i18next": "^25.3.2",
64
69
  "jsonwebtoken": "^9.0.2",
65
- "lodash": "^4.17.21",
66
- "luxon": "^3.6.1",
70
+ "luxon": "^3.7.1",
67
71
  "mime-types": "^3.0.1",
68
72
  "net": "^1.0.2",
69
73
  "node-yelp": "^0.0.3",
70
74
  "numeral": "^2.0.6",
71
75
  "sanitize-html": "^2.17.0",
72
76
  "spawn-sync": "^2.0.0",
73
- "stripe": "^18.2.1",
77
+ "stripe": "^18.4.0",
74
78
  "tls": "0.0.1",
75
79
  "to": "^0.2.9",
76
80
  "typed-promisify": "^0.4.0",
77
- "universal-analytics": "^0.5.3"
81
+ "universal-analytics": "^0.5.3",
82
+ "zod": "^4.0.14"
78
83
  },
79
84
  "devDependencies": {
80
- "@nlabs/lex": "^1.47.0",
85
+ "@jest/globals": "^29.7.0",
86
+ "@nlabs/lex": "^1.49.3",
81
87
  "@types/history": "^5.0.0",
82
88
  "@types/jest": "^30.0.0",
83
- "@types/luxon": "^3.6.2",
84
- "@types/node": "^24.0.4",
89
+ "@types/luxon": "^3.7.1",
90
+ "@types/node": "^24.2.0",
85
91
  "@types/stripe": "^8.0.417",
86
92
  "@types/twilio": "^3.19.3",
87
- "graphql-tools": "^9.0.18",
88
- "typescript": "^5.8.3",
89
- "typescript-eslint": "^8.35.0"
90
- },
91
- "type": "module"
93
+ "graphql-tools": "^9.0.20",
94
+ "typescript": "^5.9.2"
95
+ }
92
96
  }
@@ -0,0 +1,21 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "include": [
4
+ "./src/**/*.ts",
5
+ "./src/**/*.tsx"
6
+ ],
7
+ "exclude": [
8
+ "lib",
9
+ "./node_modules",
10
+ "./src/**/*.test.ts",
11
+ "./src/**/*.test.tsx",
12
+ "./src/**/*.spec.ts",
13
+ "./src/**/*.spec.tsx",
14
+ "./src/**/*.integration.ts",
15
+ "./src/**/*.integration.tsx"
16
+ ],
17
+ "compilerOptions": {
18
+ "skipLibCheck": true,
19
+ "noEmitOnError": false
20
+ }
21
+ }
@@ -0,0 +1,33 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "compilerOptions": {
4
+ "noImplicitAny": false,
5
+ "noImplicitThis": false,
6
+ "noUncheckedIndexedAccess": false,
7
+ "noUnusedLocals": false,
8
+ "skipLibCheck": false,
9
+ "strict": false,
10
+ "strictFunctionTypes": false,
11
+ "strictNullChecks": false,
12
+ "isolatedModules": false,
13
+ "noImplicitReturns": false,
14
+ "types": [
15
+ "jest",
16
+ "node"
17
+ ],
18
+ },
19
+ "include": [
20
+ "./src/**/*.ts",
21
+ "./src/**/*.tsx",
22
+ "./src/**/*.test.ts",
23
+ "./src/**/*.test.tsx",
24
+ "./src/**/*.spec.ts",
25
+ "./src/**/*.spec.tsx"
26
+ ],
27
+ "exclude": [
28
+ "lib",
29
+ "./node_modules",
30
+ "./src/**/*.integration.ts",
31
+ "./src/**/*.integration.tsx"
32
+ ]
33
+ }
@@ -0,0 +1,31 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "include": [
4
+ "src/**/*.test.ts",
5
+ "src/**/*.test.tsx",
6
+ "src/**/*.spec.ts",
7
+ "src/**/*.spec.tsx",
8
+ "src/**/*.integration.ts"
9
+ ],
10
+ "compilerOptions": {
11
+ "types": [
12
+ "jest"
13
+ ],
14
+ "noImplicitReturns": false,
15
+ "strictNullChecks": false,
16
+ "noImplicitAny": false,
17
+ "strict": false,
18
+ "strictFunctionTypes": false,
19
+ "noUnusedLocals": false,
20
+ "noImplicitThis": false,
21
+ "isolatedModules": false,
22
+ "allowJs": true,
23
+ "esModuleInterop": true,
24
+ "module": "commonjs",
25
+ "moduleResolution": "node",
26
+ "resolveJsonModule": true,
27
+ "skipLibCheck": true,
28
+ "noStrictGenericChecks": true,
29
+ "useUnknownInCatchVariables": false
30
+ }
31
+ }
package/.prettierrc.js DELETED
@@ -1,4 +0,0 @@
1
-
2
- module.exports = {
3
- bracketSpacing: false
4
- }