@nlabs/reaktor 0.10.2 → 0.10.6

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 (472) hide show
  1. package/coverage/block-navigation.js +1 -1
  2. package/coverage/index.html +23 -23
  3. package/coverage/sorter.js +21 -7
  4. package/lib/actions/apps.d.ts +1 -0
  5. package/lib/actions/apps.d.ts.map +1 -0
  6. package/lib/actions/apps.js +218 -17
  7. package/lib/actions/connections.d.ts +1 -0
  8. package/lib/actions/connections.d.ts.map +1 -0
  9. package/lib/actions/connections.js +61 -6
  10. package/lib/actions/content.d.ts +1 -0
  11. package/lib/actions/content.d.ts.map +1 -0
  12. package/lib/actions/content.js +232 -9
  13. package/lib/actions/conversations.d.ts +1 -0
  14. package/lib/actions/conversations.d.ts.map +1 -0
  15. package/lib/actions/conversations.js +321 -19
  16. package/lib/actions/dynamodb.d.ts +1 -0
  17. package/lib/actions/dynamodb.d.ts.map +1 -0
  18. package/lib/actions/dynamodb.js +119 -2
  19. package/lib/actions/email.d.ts +1 -0
  20. package/lib/actions/email.d.ts.map +1 -0
  21. package/lib/actions/email.js +56 -2
  22. package/lib/actions/files.d.ts +1 -0
  23. package/lib/actions/files.d.ts.map +1 -0
  24. package/lib/actions/files.js +226 -5
  25. package/lib/actions/groups.d.ts +1 -0
  26. package/lib/actions/groups.d.ts.map +1 -0
  27. package/lib/actions/groups.js +234 -19
  28. package/lib/actions/images.d.ts +1 -0
  29. package/lib/actions/images.d.ts.map +1 -0
  30. package/lib/actions/images.js +688 -31
  31. package/lib/actions/index.d.ts +2 -0
  32. package/lib/actions/index.d.ts.map +1 -0
  33. package/lib/actions/index.js +29 -2
  34. package/lib/actions/ios.d.ts +1 -0
  35. package/lib/actions/ios.d.ts.map +1 -0
  36. package/lib/actions/ios.js +228 -9
  37. package/lib/actions/locations.d.ts +1 -0
  38. package/lib/actions/locations.d.ts.map +1 -0
  39. package/lib/actions/locations.js +111 -7
  40. package/lib/actions/messages.d.ts +1 -0
  41. package/lib/actions/messages.d.ts.map +1 -0
  42. package/lib/actions/messages.js +155 -21
  43. package/lib/actions/notifications.d.ts +1 -0
  44. package/lib/actions/notifications.d.ts.map +1 -0
  45. package/lib/actions/notifications.js +37 -2
  46. package/lib/actions/payments.d.ts +1 -0
  47. package/lib/actions/payments.d.ts.map +1 -0
  48. package/lib/actions/payments.js +428 -11
  49. package/lib/actions/posts.d.ts +1 -0
  50. package/lib/actions/posts.d.ts.map +1 -0
  51. package/lib/actions/posts.js +540 -75
  52. package/lib/actions/profiles.d.ts +1 -0
  53. package/lib/actions/profiles.d.ts.map +1 -0
  54. package/lib/actions/profiles.js +58 -8
  55. package/lib/actions/reactions.d.ts +1 -0
  56. package/lib/actions/reactions.d.ts.map +1 -0
  57. package/lib/actions/reactions.js +276 -25
  58. package/lib/actions/s3.d.ts +1 -0
  59. package/lib/actions/s3.d.ts.map +1 -0
  60. package/lib/actions/s3.js +102 -2
  61. package/lib/actions/search.d.ts +1 -0
  62. package/lib/actions/search.d.ts.map +1 -0
  63. package/lib/actions/search.js +81 -5
  64. package/lib/actions/sms.d.ts +1 -0
  65. package/lib/actions/sms.d.ts.map +1 -0
  66. package/lib/actions/sms.js +52 -2
  67. package/lib/actions/statistics.d.ts +1 -0
  68. package/lib/actions/statistics.d.ts.map +1 -0
  69. package/lib/actions/statistics.js +41 -6
  70. package/lib/actions/subscriptions.d.ts +1 -0
  71. package/lib/actions/subscriptions.d.ts.map +1 -0
  72. package/lib/actions/subscriptions.js +196 -6
  73. package/lib/actions/tags.d.ts +1 -0
  74. package/lib/actions/tags.d.ts.map +1 -0
  75. package/lib/actions/tags.js +258 -19
  76. package/lib/actions/users.d.ts +1 -0
  77. package/lib/actions/users.d.ts.map +1 -0
  78. package/lib/actions/users.js +781 -66
  79. package/lib/actions/videos.d.ts +26 -0
  80. package/lib/actions/videos.d.ts.map +1 -0
  81. package/lib/actions/videos.js +423 -0
  82. package/lib/actions/websockets.d.ts +1 -0
  83. package/lib/actions/websockets.d.ts.map +1 -0
  84. package/lib/actions/websockets.js +148 -14
  85. package/lib/adapters/arangoAdapter.d.ts +1 -0
  86. package/lib/adapters/arangoAdapter.d.ts.map +1 -0
  87. package/lib/adapters/arangoAdapter.js +70 -2
  88. package/lib/adapters/contentAdapter.d.ts +1 -0
  89. package/lib/adapters/contentAdapter.d.ts.map +1 -0
  90. package/lib/adapters/contentAdapter.js +108 -2
  91. package/lib/adapters/fileAdapter.d.ts +1 -0
  92. package/lib/adapters/fileAdapter.d.ts.map +1 -0
  93. package/lib/adapters/fileAdapter.js +119 -2
  94. package/lib/adapters/imageAdapter.d.ts +1 -0
  95. package/lib/adapters/imageAdapter.d.ts.map +1 -0
  96. package/lib/adapters/imageAdapter.js +112 -2
  97. package/lib/adapters/index.d.ts +1 -0
  98. package/lib/adapters/index.d.ts.map +1 -0
  99. package/lib/adapters/index.js +11 -2
  100. package/lib/adapters/messageAdapter.d.ts +1 -0
  101. package/lib/adapters/messageAdapter.d.ts.map +1 -0
  102. package/lib/adapters/messageAdapter.js +82 -2
  103. package/lib/adapters/postAdapter.d.ts +1 -0
  104. package/lib/adapters/postAdapter.d.ts.map +1 -0
  105. package/lib/adapters/postAdapter.js +117 -2
  106. package/lib/adapters/reaktorAdapter.d.ts +1 -0
  107. package/lib/adapters/reaktorAdapter.d.ts.map +1 -0
  108. package/lib/adapters/reaktorAdapter.js +59 -2
  109. package/lib/adapters/tagAdapter.d.ts +1 -0
  110. package/lib/adapters/tagAdapter.d.ts.map +1 -0
  111. package/lib/adapters/tagAdapter.js +99 -2
  112. package/lib/adapters/userAdapter.d.ts +1 -0
  113. package/lib/adapters/userAdapter.d.ts.map +1 -0
  114. package/lib/adapters/userAdapter.js +264 -2
  115. package/lib/config.d.ts +1 -0
  116. package/lib/config.d.ts.map +1 -0
  117. package/lib/config.js +161 -2
  118. package/lib/handlers/graphqlHandler.d.ts +1 -0
  119. package/lib/handlers/graphqlHandler.d.ts.map +1 -0
  120. package/lib/handlers/graphqlHandler.js +118 -2
  121. package/lib/index.d.ts +1 -0
  122. package/lib/index.d.ts.map +1 -0
  123. package/lib/index.js +18 -2
  124. package/lib/lambdas/actions/websockets.d.ts +1 -0
  125. package/lib/lambdas/actions/websockets.d.ts.map +1 -0
  126. package/lib/lambdas/actions/websockets.js +89 -14
  127. package/lib/lambdas/authorizer.d.ts +1 -0
  128. package/lib/lambdas/authorizer.d.ts.map +1 -0
  129. package/lib/lambdas/authorizer.js +41 -2
  130. package/lib/lambdas/connection.d.ts +1 -0
  131. package/lib/lambdas/connection.d.ts.map +1 -0
  132. package/lib/lambdas/connection.js +85 -2
  133. package/lib/lambdas/utils/message.d.ts +1 -0
  134. package/lib/lambdas/utils/message.d.ts.map +1 -0
  135. package/lib/lambdas/utils/message.js +20 -2
  136. package/lib/lambdas/utils/websocket.d.ts +1 -0
  137. package/lib/lambdas/utils/websocket.d.ts.map +1 -0
  138. package/lib/lambdas/utils/websocket.js +78 -2
  139. package/lib/mocks/conversation.d.ts +1 -0
  140. package/lib/mocks/conversation.d.ts.map +1 -0
  141. package/lib/mocks/conversation.js +10 -2
  142. package/lib/mocks/file.d.ts +1 -0
  143. package/lib/mocks/file.d.ts.map +1 -0
  144. package/lib/mocks/file.js +13 -2
  145. package/lib/mocks/group.d.ts +1 -0
  146. package/lib/mocks/group.d.ts.map +1 -0
  147. package/lib/mocks/group.js +20 -2
  148. package/lib/mocks/image.d.ts +1 -0
  149. package/lib/mocks/image.d.ts.map +1 -0
  150. package/lib/mocks/image.js +17 -2
  151. package/lib/mocks/post.d.ts +1 -0
  152. package/lib/mocks/post.d.ts.map +1 -0
  153. package/lib/mocks/post.js +28 -2
  154. package/lib/mocks/tag.d.ts +1 -0
  155. package/lib/mocks/tag.d.ts.map +1 -0
  156. package/lib/mocks/tag.js +12 -2
  157. package/lib/mocks/user.d.ts +1 -0
  158. package/lib/mocks/user.d.ts.map +1 -0
  159. package/lib/mocks/user.js +61 -2
  160. package/lib/mocks/video.d.ts +4 -0
  161. package/lib/mocks/video.d.ts.map +1 -0
  162. package/lib/mocks/video.js +17 -0
  163. package/lib/mutations/content.d.ts +1 -0
  164. package/lib/mutations/content.d.ts.map +1 -0
  165. package/lib/mutations/content.js +27 -2
  166. package/lib/mutations/index.d.ts +1 -0
  167. package/lib/mutations/index.d.ts.map +1 -0
  168. package/lib/mutations/index.js +29 -2
  169. package/lib/mutations/locations.d.ts +1 -0
  170. package/lib/mutations/locations.d.ts.map +1 -0
  171. package/lib/mutations/locations.js +22 -2
  172. package/lib/mutations/messages.d.ts +1 -0
  173. package/lib/mutations/messages.d.ts.map +1 -0
  174. package/lib/mutations/messages.js +75 -2
  175. package/lib/mutations/posts.d.ts +1 -0
  176. package/lib/mutations/posts.d.ts.map +1 -0
  177. package/lib/mutations/posts.js +31 -2
  178. package/lib/mutations/profiles.d.ts +1 -0
  179. package/lib/mutations/profiles.d.ts.map +1 -0
  180. package/lib/mutations/profiles.js +78 -2
  181. package/lib/mutations/reactions.d.ts +1 -0
  182. package/lib/mutations/reactions.d.ts.map +1 -0
  183. package/lib/mutations/reactions.js +29 -2
  184. package/lib/mutations/statistics.d.ts +1 -0
  185. package/lib/mutations/statistics.d.ts.map +1 -0
  186. package/lib/mutations/statistics.js +17 -2
  187. package/lib/mutations/subscriptions.d.ts +1 -0
  188. package/lib/mutations/subscriptions.d.ts.map +1 -0
  189. package/lib/mutations/subscriptions.js +38 -2
  190. package/lib/mutations/tags.d.ts +1 -0
  191. package/lib/mutations/tags.d.ts.map +1 -0
  192. package/lib/mutations/tags.js +109 -2
  193. package/lib/mutations/users.d.ts +1 -0
  194. package/lib/mutations/users.d.ts.map +1 -0
  195. package/lib/mutations/users.js +129 -2
  196. package/lib/objectTypes/app.d.ts +1 -0
  197. package/lib/objectTypes/app.d.ts.map +1 -0
  198. package/lib/objectTypes/app.js +147 -2
  199. package/lib/objectTypes/bankAccount.d.ts +1 -0
  200. package/lib/objectTypes/bankAccount.d.ts.map +1 -0
  201. package/lib/objectTypes/bankAccount.js +54 -2
  202. package/lib/objectTypes/connection.d.ts +1 -0
  203. package/lib/objectTypes/connection.d.ts.map +1 -0
  204. package/lib/objectTypes/connection.js +26 -2
  205. package/lib/objectTypes/content.d.ts +1 -0
  206. package/lib/objectTypes/content.d.ts.map +1 -0
  207. package/lib/objectTypes/content.js +79 -2
  208. package/lib/objectTypes/conversation.d.ts +1 -0
  209. package/lib/objectTypes/conversation.d.ts.map +1 -0
  210. package/lib/objectTypes/conversation.js +53 -2
  211. package/lib/objectTypes/creditCard.d.ts +1 -0
  212. package/lib/objectTypes/creditCard.d.ts.map +1 -0
  213. package/lib/objectTypes/creditCard.js +64 -2
  214. package/lib/objectTypes/document.d.ts +1 -0
  215. package/lib/objectTypes/document.d.ts.map +1 -0
  216. package/lib/objectTypes/document.js +21 -2
  217. package/lib/objectTypes/error.d.ts +1 -0
  218. package/lib/objectTypes/error.d.ts.map +1 -0
  219. package/lib/objectTypes/error.js +24 -2
  220. package/lib/objectTypes/external.d.ts +1 -0
  221. package/lib/objectTypes/external.d.ts.map +1 -0
  222. package/lib/objectTypes/external.js +52 -2
  223. package/lib/objectTypes/file.d.ts +1 -0
  224. package/lib/objectTypes/file.d.ts.map +1 -0
  225. package/lib/objectTypes/file.js +76 -2
  226. package/lib/objectTypes/filter.d.ts +1 -0
  227. package/lib/objectTypes/filter.d.ts.map +1 -0
  228. package/lib/objectTypes/filter.js +21 -2
  229. package/lib/objectTypes/group.d.ts +1 -0
  230. package/lib/objectTypes/group.d.ts.map +1 -0
  231. package/lib/objectTypes/group.js +97 -2
  232. package/lib/objectTypes/iapSubscription.d.ts +1 -0
  233. package/lib/objectTypes/iapSubscription.d.ts.map +1 -0
  234. package/lib/objectTypes/iapSubscription.js +18 -2
  235. package/lib/objectTypes/image.d.ts +1 -0
  236. package/lib/objectTypes/image.d.ts.map +1 -0
  237. package/lib/objectTypes/image.js +105 -2
  238. package/lib/objectTypes/index.d.ts +1 -0
  239. package/lib/objectTypes/index.d.ts.map +1 -0
  240. package/lib/objectTypes/index.js +28 -2
  241. package/lib/objectTypes/location.d.ts +1 -0
  242. package/lib/objectTypes/location.d.ts.map +1 -0
  243. package/lib/objectTypes/location.js +85 -2
  244. package/lib/objectTypes/message.d.ts +1 -0
  245. package/lib/objectTypes/message.d.ts.map +1 -0
  246. package/lib/objectTypes/message.js +72 -2
  247. package/lib/objectTypes/passcode.d.ts +1 -0
  248. package/lib/objectTypes/passcode.d.ts.map +1 -0
  249. package/lib/objectTypes/passcode.js +20 -2
  250. package/lib/objectTypes/plan.d.ts +1 -0
  251. package/lib/objectTypes/plan.d.ts.map +1 -0
  252. package/lib/objectTypes/plan.js +71 -2
  253. package/lib/objectTypes/post.d.ts +1 -0
  254. package/lib/objectTypes/post.d.ts.map +1 -0
  255. package/lib/objectTypes/post.js +101 -2
  256. package/lib/objectTypes/profile.d.ts +1 -0
  257. package/lib/objectTypes/profile.d.ts.map +1 -0
  258. package/lib/objectTypes/profile.js +68 -2
  259. package/lib/objectTypes/reaction.d.ts +1 -0
  260. package/lib/objectTypes/reaction.d.ts.map +1 -0
  261. package/lib/objectTypes/reaction.js +37 -2
  262. package/lib/objectTypes/relation.d.ts +1 -0
  263. package/lib/objectTypes/relation.d.ts.map +1 -0
  264. package/lib/objectTypes/relation.js +27 -2
  265. package/lib/objectTypes/search.d.ts +1 -0
  266. package/lib/objectTypes/search.d.ts.map +1 -0
  267. package/lib/objectTypes/search.js +50 -2
  268. package/lib/objectTypes/statistics.d.ts +1 -0
  269. package/lib/objectTypes/statistics.d.ts.map +1 -0
  270. package/lib/objectTypes/statistics.js +17 -2
  271. package/lib/objectTypes/subscription.d.ts +1 -0
  272. package/lib/objectTypes/subscription.d.ts.map +1 -0
  273. package/lib/objectTypes/subscription.js +102 -2
  274. package/lib/objectTypes/tag.d.ts +1 -0
  275. package/lib/objectTypes/tag.d.ts.map +1 -0
  276. package/lib/objectTypes/tag.js +41 -2
  277. package/lib/objectTypes/user.d.ts +1 -0
  278. package/lib/objectTypes/user.d.ts.map +1 -0
  279. package/lib/objectTypes/user.js +111 -2
  280. package/lib/queries/content.d.ts +1 -0
  281. package/lib/queries/content.d.ts.map +1 -0
  282. package/lib/queries/content.js +50 -2
  283. package/lib/queries/index.d.ts +1 -0
  284. package/lib/queries/index.d.ts.map +1 -0
  285. package/lib/queries/index.js +27 -2
  286. package/lib/queries/locations.d.ts +1 -0
  287. package/lib/queries/locations.d.ts.map +1 -0
  288. package/lib/queries/locations.js +23 -2
  289. package/lib/queries/messages.d.ts +1 -0
  290. package/lib/queries/messages.d.ts.map +1 -0
  291. package/lib/queries/messages.js +35 -2
  292. package/lib/queries/posts.d.ts +1 -0
  293. package/lib/queries/posts.d.ts.map +1 -0
  294. package/lib/queries/posts.js +154 -2
  295. package/lib/queries/reactions.d.ts +1 -0
  296. package/lib/queries/reactions.d.ts.map +1 -0
  297. package/lib/queries/reactions.js +34 -2
  298. package/lib/queries/statistics.d.ts +1 -0
  299. package/lib/queries/statistics.d.ts.map +1 -0
  300. package/lib/queries/statistics.js +17 -2
  301. package/lib/queries/subscriptions.d.ts +1 -0
  302. package/lib/queries/subscriptions.d.ts.map +1 -0
  303. package/lib/queries/subscriptions.js +21 -2
  304. package/lib/queries/tags.d.ts +1 -0
  305. package/lib/queries/tags.d.ts.map +1 -0
  306. package/lib/queries/tags.js +56 -2
  307. package/lib/queries/users.d.ts +1 -0
  308. package/lib/queries/users.d.ts.map +1 -0
  309. package/lib/queries/users.js +39 -2
  310. package/lib/templates/email/layout.d.ts +1 -0
  311. package/lib/templates/email/layout.d.ts.map +1 -0
  312. package/lib/templates/email/layout.js +4 -3
  313. package/lib/templates/email/passwordForgot.d.ts +1 -0
  314. package/lib/templates/email/passwordForgot.d.ts.map +1 -0
  315. package/lib/templates/email/passwordForgot.js +4 -3
  316. package/lib/templates/email/passwordRecovery.d.ts +1 -0
  317. package/lib/templates/email/passwordRecovery.d.ts.map +1 -0
  318. package/lib/templates/email/passwordRecovery.js +4 -3
  319. package/lib/templates/email/verifyEmail.d.ts +1 -0
  320. package/lib/templates/email/verifyEmail.d.ts.map +1 -0
  321. package/lib/templates/email/verifyEmail.js +4 -3
  322. package/lib/templates/email/welcome.d.ts +1 -0
  323. package/lib/templates/email/welcome.d.ts.map +1 -0
  324. package/lib/templates/email/welcome.js +4 -3
  325. package/lib/templates/sms/passwordForgot.d.ts +1 -0
  326. package/lib/templates/sms/passwordForgot.d.ts.map +1 -0
  327. package/lib/templates/sms/passwordForgot.js +3 -2
  328. package/lib/templates/sms/passwordRecovery.d.ts +1 -0
  329. package/lib/templates/sms/passwordRecovery.d.ts.map +1 -0
  330. package/lib/templates/sms/passwordRecovery.js +3 -2
  331. package/lib/templates/sms/verifyEmail.d.ts +1 -0
  332. package/lib/templates/sms/verifyEmail.d.ts.map +1 -0
  333. package/lib/templates/sms/verifyEmail.js +3 -2
  334. package/lib/templates/sms/verifyPhone.d.ts +1 -0
  335. package/lib/templates/sms/verifyPhone.d.ts.map +1 -0
  336. package/lib/templates/sms/verifyPhone.js +3 -2
  337. package/lib/templates/sms/welcome.d.ts +1 -0
  338. package/lib/templates/sms/welcome.d.ts.map +1 -0
  339. package/lib/templates/sms/welcome.js +3 -2
  340. package/lib/types/apps.types.d.ts +1 -0
  341. package/lib/types/apps.types.d.ts.map +1 -0
  342. package/lib/types/apps.types.js +10 -2
  343. package/lib/types/arangodb.types.d.ts +2 -1
  344. package/lib/types/arangodb.types.d.ts.map +1 -0
  345. package/lib/types/arangodb.types.js +6 -1
  346. package/lib/types/auth.types.d.ts +1 -0
  347. package/lib/types/auth.types.d.ts.map +1 -0
  348. package/lib/types/auth.types.js +6 -1
  349. package/lib/types/connections.types.d.ts +1 -0
  350. package/lib/types/connections.types.d.ts.map +1 -0
  351. package/lib/types/connections.types.js +6 -1
  352. package/lib/types/content.types.d.ts +1 -0
  353. package/lib/types/content.types.d.ts.map +1 -0
  354. package/lib/types/content.types.js +6 -1
  355. package/lib/types/conversations.types.d.ts +1 -0
  356. package/lib/types/conversations.types.d.ts.map +1 -0
  357. package/lib/types/conversations.types.js +6 -1
  358. package/lib/types/email.types.d.ts +1 -0
  359. package/lib/types/email.types.d.ts.map +1 -0
  360. package/lib/types/email.types.js +6 -1
  361. package/lib/types/error.types.d.ts +1 -0
  362. package/lib/types/error.types.d.ts.map +1 -0
  363. package/lib/types/error.types.js +20 -2
  364. package/lib/types/files.types.d.ts +1 -0
  365. package/lib/types/files.types.d.ts.map +1 -0
  366. package/lib/types/files.types.js +6 -1
  367. package/lib/types/google.types.d.ts +1 -0
  368. package/lib/types/google.types.d.ts.map +1 -0
  369. package/lib/types/google.types.js +6 -1
  370. package/lib/types/groups.types.d.ts +1 -0
  371. package/lib/types/groups.types.d.ts.map +1 -0
  372. package/lib/types/groups.types.js +6 -1
  373. package/lib/types/images.types.d.ts +1 -0
  374. package/lib/types/images.types.d.ts.map +1 -0
  375. package/lib/types/images.types.js +6 -1
  376. package/lib/types/index.d.ts +2 -0
  377. package/lib/types/index.d.ts.map +1 -0
  378. package/lib/types/index.js +28 -2
  379. package/lib/types/locations.types.d.ts +1 -0
  380. package/lib/types/locations.types.d.ts.map +1 -0
  381. package/lib/types/locations.types.js +6 -1
  382. package/lib/types/messages.types.d.ts +1 -0
  383. package/lib/types/messages.types.d.ts.map +1 -0
  384. package/lib/types/messages.types.js +6 -1
  385. package/lib/types/notifications.types.d.ts +1 -0
  386. package/lib/types/notifications.types.d.ts.map +1 -0
  387. package/lib/types/notifications.types.js +6 -1
  388. package/lib/types/payments.types.d.ts +1 -0
  389. package/lib/types/payments.types.d.ts.map +1 -0
  390. package/lib/types/payments.types.js +6 -1
  391. package/lib/types/posts.types.d.ts +1 -0
  392. package/lib/types/posts.types.d.ts.map +1 -0
  393. package/lib/types/posts.types.js +6 -1
  394. package/lib/types/profiles.types.d.ts +1 -0
  395. package/lib/types/profiles.types.d.ts.map +1 -0
  396. package/lib/types/profiles.types.js +3 -1
  397. package/lib/types/statistics.types.d.ts +1 -0
  398. package/lib/types/statistics.types.d.ts.map +1 -0
  399. package/lib/types/statistics.types.js +3 -1
  400. package/lib/types/tags.types.d.ts +1 -0
  401. package/lib/types/tags.types.d.ts.map +1 -0
  402. package/lib/types/tags.types.js +6 -1
  403. package/lib/types/users.types.d.ts +1 -0
  404. package/lib/types/users.types.d.ts.map +1 -0
  405. package/lib/types/users.types.js +6 -1
  406. package/lib/types/videos.types.d.ts +47 -0
  407. package/lib/types/videos.types.d.ts.map +1 -0
  408. package/lib/types/videos.types.js +6 -0
  409. package/lib/types/websockets.types.d.ts +1 -0
  410. package/lib/types/websockets.types.d.ts.map +1 -0
  411. package/lib/types/websockets.types.js +6 -1
  412. package/lib/utils/adapterUtils.d.ts +1 -0
  413. package/lib/utils/adapterUtils.d.ts.map +1 -0
  414. package/lib/utils/adapterUtils.js +23 -2
  415. package/lib/utils/analyticsUtils.d.ts +1 -0
  416. package/lib/utils/analyticsUtils.d.ts.map +1 -0
  417. package/lib/utils/analyticsUtils.js +45 -2
  418. package/lib/utils/arangodbUtils.d.ts +1 -0
  419. package/lib/utils/arangodbUtils.d.ts.map +1 -0
  420. package/lib/utils/arangodbUtils.js +128 -5
  421. package/lib/utils/authUtils.d.ts +1 -0
  422. package/lib/utils/authUtils.d.ts.map +1 -0
  423. package/lib/utils/authUtils.js +54 -2
  424. package/lib/utils/contextUtils.d.ts +1 -0
  425. package/lib/utils/contextUtils.d.ts.map +1 -0
  426. package/lib/utils/contextUtils.js +10 -2
  427. package/lib/utils/dbI18n.d.ts +1 -0
  428. package/lib/utils/dbI18n.d.ts.map +1 -0
  429. package/lib/utils/dbI18n.example.d.ts +1 -0
  430. package/lib/utils/dbI18n.example.d.ts.map +1 -0
  431. package/lib/utils/dbI18n.example.js +92 -5
  432. package/lib/utils/dbI18n.js +28 -2
  433. package/lib/utils/googleTranslate.d.ts +1 -0
  434. package/lib/utils/googleTranslate.d.ts.map +1 -0
  435. package/lib/utils/googleTranslate.js +70 -2
  436. package/lib/utils/graphqlUtils.d.ts +1 -0
  437. package/lib/utils/graphqlUtils.d.ts.map +1 -0
  438. package/lib/utils/graphqlUtils.js +11 -2
  439. package/lib/utils/index.d.ts +1 -0
  440. package/lib/utils/index.d.ts.map +1 -0
  441. package/lib/utils/index.js +19 -2
  442. package/lib/utils/languageDetection.d.ts +1 -0
  443. package/lib/utils/languageDetection.d.ts.map +1 -0
  444. package/lib/utils/languageDetection.js +120 -2
  445. package/lib/utils/localeUtils.d.ts +1 -0
  446. package/lib/utils/localeUtils.d.ts.map +1 -0
  447. package/lib/utils/localeUtils.example.d.ts +1 -0
  448. package/lib/utils/localeUtils.example.d.ts.map +1 -0
  449. package/lib/utils/localeUtils.example.js +124 -2
  450. package/lib/utils/localeUtils.js +71 -2
  451. package/lib/utils/middlewareUtils.d.ts +1 -0
  452. package/lib/utils/middlewareUtils.d.ts.map +1 -0
  453. package/lib/utils/middlewareUtils.js +10 -2
  454. package/lib/utils/sessionUtils.d.ts +1 -0
  455. package/lib/utils/sessionUtils.d.ts.map +1 -0
  456. package/lib/utils/sessionUtils.js +26 -2
  457. package/lib/utils/stripeUtils.d.ts +2 -1
  458. package/lib/utils/stripeUtils.d.ts.map +1 -0
  459. package/lib/utils/stripeUtils.js +12 -2
  460. package/lib/utils/templateUtils.d.ts +1 -0
  461. package/lib/utils/templateUtils.d.ts.map +1 -0
  462. package/lib/utils/templateUtils.js +11 -2
  463. package/lib/utils/testUtils.d.ts +1 -0
  464. package/lib/utils/testUtils.d.ts.map +1 -0
  465. package/lib/utils/testUtils.js +292 -2
  466. package/lib/utils/translationQueue.d.ts +1 -0
  467. package/lib/utils/translationQueue.d.ts.map +1 -0
  468. package/lib/utils/translationQueue.example.d.ts +1 -0
  469. package/lib/utils/translationQueue.example.d.ts.map +1 -0
  470. package/lib/utils/translationQueue.example.js +340 -2
  471. package/lib/utils/translationQueue.js +113 -2
  472. package/package.json +47 -29
@@ -1,2 +1,340 @@
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=
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
+ */ import { flush, i18n } from './translationQueue.js';
10
+ // Example 1: Basic translations - will use database or translate as needed
11
+ export async function getWelcomeMessages(context, locale = 'en') {
12
+ const translations = [
13
+ {
14
+ key: 'welcome.title',
15
+ fallback: 'Welcome to TorchOne!'
16
+ },
17
+ {
18
+ key: 'welcome.subtitle',
19
+ fallback: 'Your personal AI assistant'
20
+ },
21
+ {
22
+ key: 'welcome.description',
23
+ fallback: 'Get started by exploring our features'
24
+ }
25
+ ];
26
+ // This will:
27
+ // 1. Check database for existing translations
28
+ // 2. If not found and locale is default (en), save fallback to DB
29
+ // 3. If not found and locale is different, translate from default locale
30
+ // 4. Save translated content to DB for future use
31
+ const result = await i18n(context, translations, locale);
32
+ return result;
33
+ // Returns: {
34
+ // 'welcome.title': 'Welcome to TorchOne!' (or translated version),
35
+ // 'welcome.subtitle': 'Your personal AI assistant' (or translated version),
36
+ // 'welcome.description': 'Get started by exploring our features' (or translated version)
37
+ // }
38
+ }
39
+ // Example 2: Translations with interpolation
40
+ export async function getPersonalizedMessages(context, username, locale = 'en') {
41
+ const translations = [
42
+ {
43
+ key: 'user.welcome',
44
+ fallback: 'Welcome back, {{username}}!',
45
+ params: {
46
+ username
47
+ }
48
+ },
49
+ {
50
+ key: 'user.notifications',
51
+ fallback: 'You have {{count}} new notifications',
52
+ params: {
53
+ count: 5
54
+ }
55
+ },
56
+ {
57
+ key: 'user.lastLogin',
58
+ fallback: 'Last login: {{date}}',
59
+ params: {
60
+ date: new Date().toLocaleDateString()
61
+ }
62
+ }
63
+ ];
64
+ const result = await i18n(context, translations, locale);
65
+ return result;
66
+ // Returns: {
67
+ // 'user.welcome': 'Welcome back, Alice!' (or translated with interpolation),
68
+ // 'user.notifications': 'You have 5 new notifications' (or translated with interpolation),
69
+ // 'user.lastLogin': 'Last login: 1/15/2025' (or translated with interpolation)
70
+ // }
71
+ }
72
+ // Example 3: Multi-language support
73
+ export async function getMultiLanguageContent(context) {
74
+ // Get content in multiple languages
75
+ const languages = [
76
+ 'en',
77
+ 'es',
78
+ 'fr'
79
+ ];
80
+ const results = {};
81
+ for (const locale of languages){
82
+ const translations = [
83
+ {
84
+ key: 'app.name',
85
+ fallback: 'TorchOne'
86
+ },
87
+ {
88
+ key: 'app.tagline',
89
+ fallback: 'Your AI Assistant'
90
+ }
91
+ ];
92
+ results[locale] = await i18n(context, translations, locale);
93
+ }
94
+ return results;
95
+ // Returns: {
96
+ // en: { 'app.name': 'TorchOne', 'app.tagline': 'Your AI Assistant' },
97
+ // es: { 'app.name': 'TorchOne', 'app.tagline': 'Tu Asistente de IA' },
98
+ // fr: { 'app.name': 'TorchOne', 'app.tagline': 'Votre Assistant IA' }
99
+ // }
100
+ }
101
+ // Example 4: Error handling and fallbacks
102
+ export async function getRobustTranslations(context, locale = 'en') {
103
+ const translations = [
104
+ {
105
+ key: 'error.notFound',
106
+ fallback: 'Content not found'
107
+ },
108
+ {
109
+ key: 'error.serverError',
110
+ fallback: 'Server error occurred'
111
+ },
112
+ {
113
+ key: 'success.saved',
114
+ fallback: 'Content saved successfully'
115
+ }
116
+ ];
117
+ try {
118
+ const result = await i18n(context, translations, locale);
119
+ return result;
120
+ } catch (error) {
121
+ console.error('Translation error:', error);
122
+ // Return fallbacks if translation fails
123
+ return translations.reduce((acc, t)=>{
124
+ acc[t.key] = t.fallback || '';
125
+ return acc;
126
+ }, {});
127
+ }
128
+ }
129
+ // Example 5: Batch processing with flush
130
+ export async function processLargeTranslationBatch(context, locale = 'en') {
131
+ // Create a large batch of translations
132
+ const translations = [];
133
+ for(let i = 1; i <= 100; i++){
134
+ translations.push({
135
+ key: `item.${i}.title`,
136
+ fallback: `Item ${i} Title`,
137
+ params: {
138
+ number: i
139
+ }
140
+ });
141
+ }
142
+ // Process the batch
143
+ const result = await i18n(context, translations, locale);
144
+ // Ensure all pending translations are processed
145
+ await flush();
146
+ return result;
147
+ }
148
+ // Example 6: Error handling with fallbacks
149
+ export async function getErrorMessages(context, errorCode, locale = 'en') {
150
+ const translations = [
151
+ {
152
+ key: `error.${errorCode}`,
153
+ fallback: `An error occurred: ${errorCode}`,
154
+ params: {
155
+ errorCode
156
+ }
157
+ },
158
+ {
159
+ key: 'error.contactSupport',
160
+ fallback: 'Please contact support if this problem persists.',
161
+ params: {}
162
+ }
163
+ ];
164
+ const result = await i18n(context, translations, locale);
165
+ // If database is unavailable, will return fallbacks:
166
+ // {
167
+ // 'error.INVALID_EMAIL': 'An error occurred: INVALID_EMAIL',
168
+ // 'error.contactSupport': 'Please contact support if this problem persists.'
169
+ // }
170
+ return result;
171
+ }
172
+ // Example 7: Complex email template with multiple interpolations
173
+ export async function generateEmailTemplate(context, userData, locale = 'en') {
174
+ const translations = [
175
+ {
176
+ key: 'email.orderConfirmation.subject',
177
+ fallback: 'Order {{orderId}} Confirmed',
178
+ params: {
179
+ orderId: userData.orderId
180
+ }
181
+ },
182
+ {
183
+ key: 'email.orderConfirmation.greeting',
184
+ fallback: 'Hello {{name}},',
185
+ params: {
186
+ name: userData.name
187
+ }
188
+ },
189
+ {
190
+ key: 'email.orderConfirmation.body',
191
+ fallback: 'Your order {{orderId}} has been confirmed. Total: ${{total}} for {{items}} items.',
192
+ params: {
193
+ orderId: userData.orderId,
194
+ total: userData.total,
195
+ items: userData.items
196
+ }
197
+ },
198
+ {
199
+ key: 'email.orderConfirmation.footer',
200
+ fallback: 'Thank you for your purchase!'
201
+ }
202
+ ];
203
+ const result = await i18n(context, translations, locale);
204
+ return {
205
+ subject: result['email.orderConfirmation.subject'],
206
+ greeting: result['email.orderConfirmation.greeting'],
207
+ body: result['email.orderConfirmation.body'],
208
+ footer: result['email.orderConfirmation.footer']
209
+ };
210
+ }
211
+ // Example 8: Notification messages for different scenarios
212
+ export async function getNotificationMessages(context, locale = 'en') {
213
+ const translations = [
214
+ {
215
+ key: 'notification.welcome',
216
+ fallback: 'Welcome to TorchOne!'
217
+ },
218
+ {
219
+ key: 'notification.verification',
220
+ fallback: 'Please verify your account.'
221
+ },
222
+ {
223
+ key: 'notification.passwordReset',
224
+ fallback: 'Your password has been reset.'
225
+ },
226
+ {
227
+ key: 'notification.profileUpdate',
228
+ fallback: 'Your profile has been updated.'
229
+ },
230
+ {
231
+ key: 'notification.newMessage',
232
+ fallback: 'You have a new message from {{sender}}.',
233
+ params: {
234
+ sender: 'John Doe'
235
+ }
236
+ }
237
+ ];
238
+ const result = await i18n(context, translations, locale);
239
+ return result;
240
+ }
241
+ // Example 9: Performance comparison
242
+ export async function performanceComparison(context) {
243
+ const keys = [
244
+ 'welcome',
245
+ 'verification',
246
+ 'passwordReset',
247
+ 'profileUpdate',
248
+ 'email.subject',
249
+ 'email.body',
250
+ 'sms.welcome',
251
+ 'sms.verification'
252
+ ];
253
+ const translations = keys.map((key)=>({
254
+ key,
255
+ fallback: `Fallback for ${key}`
256
+ }));
257
+ console.time('Batch translation');
258
+ const batchResults = await i18n(context, translations, 'en');
259
+ console.timeEnd('Batch translation');
260
+ return batchResults;
261
+ }
262
+ // Example 10: Dynamic content based on user preferences
263
+ export async function getUserGreeting(context, userLocale, username) {
264
+ const locale = userLocale || 'en';
265
+ const translations = [
266
+ {
267
+ key: 'greeting.morning',
268
+ fallback: 'Good morning!',
269
+ params: username ? {
270
+ username
271
+ } : {}
272
+ },
273
+ {
274
+ key: 'greeting.afternoon',
275
+ fallback: 'Good afternoon!',
276
+ params: username ? {
277
+ username
278
+ } : {}
279
+ },
280
+ {
281
+ key: 'greeting.evening',
282
+ fallback: 'Good evening!',
283
+ params: username ? {
284
+ username
285
+ } : {}
286
+ }
287
+ ];
288
+ const result = await i18n(context, translations, locale);
289
+ // Return appropriate greeting based on time of day
290
+ const hour = new Date().getHours();
291
+ if (hour < 12) {
292
+ return result['greeting.morning'];
293
+ }
294
+ if (hour < 18) {
295
+ return result['greeting.afternoon'];
296
+ }
297
+ return result['greeting.evening'];
298
+ }
299
+ // Example 11: Force flush pending translations
300
+ export async function ensureAllTranslationsProcessed() {
301
+ // Force process any pending translation batches
302
+ await flush();
303
+ console.log('All translation batches processed');
304
+ } // Usage examples:
305
+ // const context = { databaseName: 'torchone-dev', session: { userId: 'user123' } };
306
+ //
307
+ // // Basic usage
308
+ // const welcomeMessages = await getWelcomeMessages(context, 'en');
309
+ //
310
+ // // With interpolation
311
+ // const personalizedMessages = await getPersonalizedMessages(context, 'John', 'es');
312
+ //
313
+ // // Multi-language content
314
+ // const multiLanguageContent = await getMultiLanguageContent(context);
315
+ //
316
+ // // Error handling
317
+ // const errorMessages = await getRobustTranslations(context, 'de');
318
+ //
319
+ // // Complex template
320
+ // const emailTemplate = await generateEmailTemplate(context, {
321
+ // name: 'Maria',
322
+ // email: 'maria@example.com',
323
+ // orderId: 'ORD-123',
324
+ // total: 99.99,
325
+ // items: 3
326
+ // }, 'pt');
327
+ //
328
+ // // Notifications
329
+ // const notifications = await getNotificationMessages(context, 'fr');
330
+ //
331
+ // // Performance test
332
+ // const perf = await performanceComparison(context);
333
+ //
334
+ // // Dynamic greeting
335
+ // const greeting = await getUserGreeting(context, 'en', 'John');
336
+ //
337
+ // // Force flush
338
+ // await ensureAllTranslationsProcessed();
339
+
340
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3Ivc3JjL3V0aWxzL3RyYW5zbGF0aW9uUXVldWUuZXhhbXBsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAyNS1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqXG4gKiBFeGFtcGxlIHVzYWdlIG9mIHRoZSB0cmFuc2xhdGlvbiBxdWV1ZSBzeXN0ZW0gd2l0aCBHb29nbGUgVHJhbnNsYXRlIGludGVncmF0aW9uXG4gKlxuICogVGhpcyBkZW1vbnN0cmF0ZXMgaG93IHRvIHVzZSB0aGUgbmV3IHRyYW5zbGF0aW9uIHF1ZXVlIHRoYXQgYXV0b21hdGljYWxseVxuICogdHJhbnNsYXRlcyBjb250ZW50IHVzaW5nIEdvb2dsZSBUcmFuc2xhdGUgQVBJIHdoZW4gbmVlZGVkLlxuICovXG5cbmltcG9ydCB7Zmx1c2gsIGkxOG4sIHR5cGUgVHJhbnNsYXRpb25PYmplY3R9IGZyb20gJy4vdHJhbnNsYXRpb25RdWV1ZS5qcyc7XG5cbmltcG9ydCB0eXBlIHtBcGlDb250ZXh0fSBmcm9tICcuLi90eXBlcy9hdXRoLnR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtMb2NhbGV9IGZyb20gJy4uL3R5cGVzL2NvbnRlbnQudHlwZXMuanMnO1xuXG4vLyBFeGFtcGxlIDE6IEJhc2ljIHRyYW5zbGF0aW9ucyAtIHdpbGwgdXNlIGRhdGFiYXNlIG9yIHRyYW5zbGF0ZSBhcyBuZWVkZWRcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRXZWxjb21lTWVzc2FnZXMoY29udGV4dDogQXBpQ29udGV4dCwgbG9jYWxlOiBMb2NhbGUgPSAnZW4nKSB7XG4gIGNvbnN0IHRyYW5zbGF0aW9uczogVHJhbnNsYXRpb25PYmplY3RbXSA9IFtcbiAgICB7XG4gICAgICBrZXk6ICd3ZWxjb21lLnRpdGxlJyxcbiAgICAgIGZhbGxiYWNrOiAnV2VsY29tZSB0byBUb3JjaE9uZSEnXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICd3ZWxjb21lLnN1YnRpdGxlJyxcbiAgICAgIGZhbGxiYWNrOiAnWW91ciBwZXJzb25hbCBBSSBhc3Npc3RhbnQnXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICd3ZWxjb21lLmRlc2NyaXB0aW9uJyxcbiAgICAgIGZhbGxiYWNrOiAnR2V0IHN0YXJ0ZWQgYnkgZXhwbG9yaW5nIG91ciBmZWF0dXJlcydcbiAgICB9XG4gIF07XG5cbiAgLy8gVGhpcyB3aWxsOlxuICAvLyAxLiBDaGVjayBkYXRhYmFzZSBmb3IgZXhpc3RpbmcgdHJhbnNsYXRpb25zXG4gIC8vIDIuIElmIG5vdCBmb3VuZCBhbmQgbG9jYWxlIGlzIGRlZmF1bHQgKGVuKSwgc2F2ZSBmYWxsYmFjayB0byBEQlxuICAvLyAzLiBJZiBub3QgZm91bmQgYW5kIGxvY2FsZSBpcyBkaWZmZXJlbnQsIHRyYW5zbGF0ZSBmcm9tIGRlZmF1bHQgbG9jYWxlXG4gIC8vIDQuIFNhdmUgdHJhbnNsYXRlZCBjb250ZW50IHRvIERCIGZvciBmdXR1cmUgdXNlXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGkxOG4gKGNvbnRleHQsIHRyYW5zbGF0aW9ucywgbG9jYWxlKTtcblxuICByZXR1cm4gcmVzdWx0O1xuICAvLyBSZXR1cm5zOiB7XG4gIC8vICAgJ3dlbGNvbWUudGl0bGUnOiAnV2VsY29tZSB0byBUb3JjaE9uZSEnIChvciB0cmFuc2xhdGVkIHZlcnNpb24pLFxuICAvLyAgICd3ZWxjb21lLnN1YnRpdGxlJzogJ1lvdXIgcGVyc29uYWwgQUkgYXNzaXN0YW50JyAob3IgdHJhbnNsYXRlZCB2ZXJzaW9uKSxcbiAgLy8gICAnd2VsY29tZS5kZXNjcmlwdGlvbic6ICdHZXQgc3RhcnRlZCBieSBleHBsb3Jpbmcgb3VyIGZlYXR1cmVzJyAob3IgdHJhbnNsYXRlZCB2ZXJzaW9uKVxuICAvLyB9XG59XG5cbi8vIEV4YW1wbGUgMjogVHJhbnNsYXRpb25zIHdpdGggaW50ZXJwb2xhdGlvblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFBlcnNvbmFsaXplZE1lc3NhZ2VzKGNvbnRleHQ6IEFwaUNvbnRleHQsIHVzZXJuYW1lOiBzdHJpbmcsIGxvY2FsZTogTG9jYWxlID0gJ2VuJykge1xuICBjb25zdCB0cmFuc2xhdGlvbnM6IFRyYW5zbGF0aW9uT2JqZWN0W10gPSBbXG4gICAge1xuICAgICAga2V5OiAndXNlci53ZWxjb21lJyxcbiAgICAgIGZhbGxiYWNrOiAnV2VsY29tZSBiYWNrLCB7e3VzZXJuYW1lfX0hJyxcbiAgICAgIHBhcmFtczoge3VzZXJuYW1lfVxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAndXNlci5ub3RpZmljYXRpb25zJyxcbiAgICAgIGZhbGxiYWNrOiAnWW91IGhhdmUge3tjb3VudH19IG5ldyBub3RpZmljYXRpb25zJyxcbiAgICAgIHBhcmFtczoge2NvdW50OiA1fVxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAndXNlci5sYXN0TG9naW4nLFxuICAgICAgZmFsbGJhY2s6ICdMYXN0IGxvZ2luOiB7e2RhdGV9fScsXG4gICAgICBwYXJhbXM6IHtkYXRlOiBuZXcgRGF0ZSgpLnRvTG9jYWxlRGF0ZVN0cmluZygpfVxuICAgIH1cbiAgXTtcblxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBpMThuKGNvbnRleHQsIHRyYW5zbGF0aW9ucywgbG9jYWxlKTtcblxuICByZXR1cm4gcmVzdWx0O1xuICAvLyBSZXR1cm5zOiB7XG4gIC8vICAgJ3VzZXIud2VsY29tZSc6ICdXZWxjb21lIGJhY2ssIEFsaWNlIScgKG9yIHRyYW5zbGF0ZWQgd2l0aCBpbnRlcnBvbGF0aW9uKSxcbiAgLy8gICAndXNlci5ub3RpZmljYXRpb25zJzogJ1lvdSBoYXZlIDUgbmV3IG5vdGlmaWNhdGlvbnMnIChvciB0cmFuc2xhdGVkIHdpdGggaW50ZXJwb2xhdGlvbiksXG4gIC8vICAgJ3VzZXIubGFzdExvZ2luJzogJ0xhc3QgbG9naW46IDEvMTUvMjAyNScgKG9yIHRyYW5zbGF0ZWQgd2l0aCBpbnRlcnBvbGF0aW9uKVxuICAvLyB9XG59XG5cbi8vIEV4YW1wbGUgMzogTXVsdGktbGFuZ3VhZ2Ugc3VwcG9ydFxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE11bHRpTGFuZ3VhZ2VDb250ZW50KGNvbnRleHQ6IEFwaUNvbnRleHQpIHtcbiAgLy8gR2V0IGNvbnRlbnQgaW4gbXVsdGlwbGUgbGFuZ3VhZ2VzXG4gIGNvbnN0IGxhbmd1YWdlczogTG9jYWxlW10gPSBbJ2VuJywgJ2VzJywgJ2ZyJ107XG4gIGNvbnN0IHJlc3VsdHM6IFJlY29yZDxMb2NhbGUsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+ID0ge30gYXMgYW55O1xuXG4gIGZvcihjb25zdCBsb2NhbGUgb2YgbGFuZ3VhZ2VzKSB7XG4gICAgY29uc3QgdHJhbnNsYXRpb25zOiBUcmFuc2xhdGlvbk9iamVjdFtdID0gW1xuICAgICAge1xuICAgICAgICBrZXk6ICdhcHAubmFtZScsXG4gICAgICAgIGZhbGxiYWNrOiAnVG9yY2hPbmUnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdhcHAudGFnbGluZScsXG4gICAgICAgIGZhbGxiYWNrOiAnWW91ciBBSSBBc3Npc3RhbnQnXG4gICAgICB9XG4gICAgXTtcblxuICAgIHJlc3VsdHNbbG9jYWxlXSA9IGF3YWl0IGkxOG4oY29udGV4dCwgdHJhbnNsYXRpb25zLCBsb2NhbGUpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdHM7XG4gIC8vIFJldHVybnM6IHtcbiAgLy8gICBlbjogeyAnYXBwLm5hbWUnOiAnVG9yY2hPbmUnLCAnYXBwLnRhZ2xpbmUnOiAnWW91ciBBSSBBc3Npc3RhbnQnIH0sXG4gIC8vICAgZXM6IHsgJ2FwcC5uYW1lJzogJ1RvcmNoT25lJywgJ2FwcC50YWdsaW5lJzogJ1R1IEFzaXN0ZW50ZSBkZSBJQScgfSxcbiAgLy8gICBmcjogeyAnYXBwLm5hbWUnOiAnVG9yY2hPbmUnLCAnYXBwLnRhZ2xpbmUnOiAnVm90cmUgQXNzaXN0YW50IElBJyB9XG4gIC8vIH1cbn1cblxuLy8gRXhhbXBsZSA0OiBFcnJvciBoYW5kbGluZyBhbmQgZmFsbGJhY2tzXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Um9idXN0VHJhbnNsYXRpb25zKGNvbnRleHQ6IEFwaUNvbnRleHQsIGxvY2FsZTogTG9jYWxlID0gJ2VuJykge1xuICBjb25zdCB0cmFuc2xhdGlvbnM6IFRyYW5zbGF0aW9uT2JqZWN0W10gPSBbXG4gICAge1xuICAgICAga2V5OiAnZXJyb3Iubm90Rm91bmQnLFxuICAgICAgZmFsbGJhY2s6ICdDb250ZW50IG5vdCBmb3VuZCdcbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ2Vycm9yLnNlcnZlckVycm9yJyxcbiAgICAgIGZhbGxiYWNrOiAnU2VydmVyIGVycm9yIG9jY3VycmVkJ1xuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnc3VjY2Vzcy5zYXZlZCcsXG4gICAgICBmYWxsYmFjazogJ0NvbnRlbnQgc2F2ZWQgc3VjY2Vzc2Z1bGx5J1xuICAgIH1cbiAgXTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGkxOG4oY29udGV4dCwgdHJhbnNsYXRpb25zLCBsb2NhbGUpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKCdUcmFuc2xhdGlvbiBlcnJvcjonLCBlcnJvcik7XG4gICAgLy8gUmV0dXJuIGZhbGxiYWNrcyBpZiB0cmFuc2xhdGlvbiBmYWlsc1xuICAgIHJldHVybiB0cmFuc2xhdGlvbnMucmVkdWNlKChhY2MsIHQpID0+IHtcbiAgICAgIGFjY1t0LmtleV0gPSB0LmZhbGxiYWNrIHx8ICcnO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTtcbiAgfVxufVxuXG4vLyBFeGFtcGxlIDU6IEJhdGNoIHByb2Nlc3Npbmcgd2l0aCBmbHVzaFxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NMYXJnZVRyYW5zbGF0aW9uQmF0Y2goY29udGV4dDogQXBpQ29udGV4dCwgbG9jYWxlOiBMb2NhbGUgPSAnZW4nKSB7XG4gIC8vIENyZWF0ZSBhIGxhcmdlIGJhdGNoIG9mIHRyYW5zbGF0aW9uc1xuICBjb25zdCB0cmFuc2xhdGlvbnM6IFRyYW5zbGF0aW9uT2JqZWN0W10gPSBbXTtcblxuICBmb3IobGV0IGkgPSAxOyBpIDw9IDEwMDsgaSsrKSB7XG4gICAgdHJhbnNsYXRpb25zLnB1c2goe1xuICAgICAga2V5OiBgaXRlbS4ke2l9LnRpdGxlYCxcbiAgICAgIGZhbGxiYWNrOiBgSXRlbSAke2l9IFRpdGxlYCxcbiAgICAgIHBhcmFtczoge251bWJlcjogaX1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIFByb2Nlc3MgdGhlIGJhdGNoXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGkxOG4oY29udGV4dCwgdHJhbnNsYXRpb25zLCBsb2NhbGUpO1xuXG4gIC8vIEVuc3VyZSBhbGwgcGVuZGluZyB0cmFuc2xhdGlvbnMgYXJlIHByb2Nlc3NlZFxuICBhd2FpdCBmbHVzaCgpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8vIEV4YW1wbGUgNjogRXJyb3IgaGFuZGxpbmcgd2l0aCBmYWxsYmFja3NcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRFcnJvck1lc3NhZ2VzKGNvbnRleHQ6IEFwaUNvbnRleHQsIGVycm9yQ29kZTogc3RyaW5nLCBsb2NhbGU6IExvY2FsZSA9ICdlbicpIHtcbiAgY29uc3QgdHJhbnNsYXRpb25zOiBUcmFuc2xhdGlvbk9iamVjdFtdID0gW1xuICAgIHtcbiAgICAgIGtleTogYGVycm9yLiR7ZXJyb3JDb2RlfWAsXG4gICAgICBmYWxsYmFjazogYEFuIGVycm9yIG9jY3VycmVkOiAke2Vycm9yQ29kZX1gLFxuICAgICAgcGFyYW1zOiB7ZXJyb3JDb2RlfVxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnZXJyb3IuY29udGFjdFN1cHBvcnQnLFxuICAgICAgZmFsbGJhY2s6ICdQbGVhc2UgY29udGFjdCBzdXBwb3J0IGlmIHRoaXMgcHJvYmxlbSBwZXJzaXN0cy4nLFxuICAgICAgcGFyYW1zOiB7fVxuICAgIH1cbiAgXTtcblxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBpMThuKGNvbnRleHQsIHRyYW5zbGF0aW9ucywgbG9jYWxlKTtcblxuICAvLyBJZiBkYXRhYmFzZSBpcyB1bmF2YWlsYWJsZSwgd2lsbCByZXR1cm4gZmFsbGJhY2tzOlxuICAvLyB7XG4gIC8vICAgJ2Vycm9yLklOVkFMSURfRU1BSUwnOiAnQW4gZXJyb3Igb2NjdXJyZWQ6IElOVkFMSURfRU1BSUwnLFxuICAvLyAgICdlcnJvci5jb250YWN0U3VwcG9ydCc6ICdQbGVhc2UgY29udGFjdCBzdXBwb3J0IGlmIHRoaXMgcHJvYmxlbSBwZXJzaXN0cy4nXG4gIC8vIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vLyBFeGFtcGxlIDc6IENvbXBsZXggZW1haWwgdGVtcGxhdGUgd2l0aCBtdWx0aXBsZSBpbnRlcnBvbGF0aW9uc1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRW1haWxUZW1wbGF0ZShcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgdXNlckRhdGE6IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZW1haWw6IHN0cmluZztcbiAgICBvcmRlcklkOiBzdHJpbmc7XG4gICAgdG90YWw6IG51bWJlcjtcbiAgICBpdGVtczogbnVtYmVyO1xuICB9LFxuICBsb2NhbGU6IExvY2FsZSA9ICdlbidcbikge1xuICBjb25zdCB0cmFuc2xhdGlvbnM6IFRyYW5zbGF0aW9uT2JqZWN0W10gPSBbXG4gICAge1xuICAgICAga2V5OiAnZW1haWwub3JkZXJDb25maXJtYXRpb24uc3ViamVjdCcsXG4gICAgICBmYWxsYmFjazogJ09yZGVyIHt7b3JkZXJJZH19IENvbmZpcm1lZCcsXG4gICAgICBwYXJhbXM6IHtvcmRlcklkOiB1c2VyRGF0YS5vcmRlcklkfVxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnZW1haWwub3JkZXJDb25maXJtYXRpb24uZ3JlZXRpbmcnLFxuICAgICAgZmFsbGJhY2s6ICdIZWxsbyB7e25hbWV9fSwnLFxuICAgICAgcGFyYW1zOiB7bmFtZTogdXNlckRhdGEubmFtZX1cbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ2VtYWlsLm9yZGVyQ29uZmlybWF0aW9uLmJvZHknLFxuICAgICAgZmFsbGJhY2s6ICdZb3VyIG9yZGVyIHt7b3JkZXJJZH19IGhhcyBiZWVuIGNvbmZpcm1lZC4gVG90YWw6ICR7e3RvdGFsfX0gZm9yIHt7aXRlbXN9fSBpdGVtcy4nLFxuICAgICAgcGFyYW1zOiB7XG4gICAgICAgIG9yZGVySWQ6IHVzZXJEYXRhLm9yZGVySWQsXG4gICAgICAgIHRvdGFsOiB1c2VyRGF0YS50b3RhbCxcbiAgICAgICAgaXRlbXM6IHVzZXJEYXRhLml0ZW1zXG4gICAgICB9XG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdlbWFpbC5vcmRlckNvbmZpcm1hdGlvbi5mb290ZXInLFxuICAgICAgZmFsbGJhY2s6ICdUaGFuayB5b3UgZm9yIHlvdXIgcHVyY2hhc2UhJ1xuICAgIH1cbiAgXTtcblxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBpMThuKGNvbnRleHQsIHRyYW5zbGF0aW9ucywgbG9jYWxlKTtcblxuICByZXR1cm4ge1xuICAgIHN1YmplY3Q6IHJlc3VsdFsnZW1haWwub3JkZXJDb25maXJtYXRpb24uc3ViamVjdCddLFxuICAgIGdyZWV0aW5nOiByZXN1bHRbJ2VtYWlsLm9yZGVyQ29uZmlybWF0aW9uLmdyZWV0aW5nJ10sXG4gICAgYm9keTogcmVzdWx0WydlbWFpbC5vcmRlckNvbmZpcm1hdGlvbi5ib2R5J10sXG4gICAgZm9vdGVyOiByZXN1bHRbJ2VtYWlsLm9yZGVyQ29uZmlybWF0aW9uLmZvb3RlciddXG4gIH07XG59XG5cbi8vIEV4YW1wbGUgODogTm90aWZpY2F0aW9uIG1lc3NhZ2VzIGZvciBkaWZmZXJlbnQgc2NlbmFyaW9zXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Tm90aWZpY2F0aW9uTWVzc2FnZXMoY29udGV4dDogQXBpQ29udGV4dCwgbG9jYWxlOiBMb2NhbGUgPSAnZW4nKSB7XG4gIGNvbnN0IHRyYW5zbGF0aW9uczogVHJhbnNsYXRpb25PYmplY3RbXSA9IFtcbiAgICB7XG4gICAgICBrZXk6ICdub3RpZmljYXRpb24ud2VsY29tZScsXG4gICAgICBmYWxsYmFjazogJ1dlbGNvbWUgdG8gVG9yY2hPbmUhJ1xuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnbm90aWZpY2F0aW9uLnZlcmlmaWNhdGlvbicsXG4gICAgICBmYWxsYmFjazogJ1BsZWFzZSB2ZXJpZnkgeW91ciBhY2NvdW50LidcbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ25vdGlmaWNhdGlvbi5wYXNzd29yZFJlc2V0JyxcbiAgICAgIGZhbGxiYWNrOiAnWW91ciBwYXNzd29yZCBoYXMgYmVlbiByZXNldC4nXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdub3RpZmljYXRpb24ucHJvZmlsZVVwZGF0ZScsXG4gICAgICBmYWxsYmFjazogJ1lvdXIgcHJvZmlsZSBoYXMgYmVlbiB1cGRhdGVkLidcbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ25vdGlmaWNhdGlvbi5uZXdNZXNzYWdlJyxcbiAgICAgIGZhbGxiYWNrOiAnWW91IGhhdmUgYSBuZXcgbWVzc2FnZSBmcm9tIHt7c2VuZGVyfX0uJyxcbiAgICAgIHBhcmFtczoge3NlbmRlcjogJ0pvaG4gRG9lJ31cbiAgICB9XG4gIF07XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaTE4bihjb250ZXh0LCB0cmFuc2xhdGlvbnMsIGxvY2FsZSk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLy8gRXhhbXBsZSA5OiBQZXJmb3JtYW5jZSBjb21wYXJpc29uXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGVyZm9ybWFuY2VDb21wYXJpc29uKGNvbnRleHQ6IEFwaUNvbnRleHQpIHtcbiAgY29uc3Qga2V5cyA9IFtcbiAgICAnd2VsY29tZScsICd2ZXJpZmljYXRpb24nLCAncGFzc3dvcmRSZXNldCcsICdwcm9maWxlVXBkYXRlJyxcbiAgICAnZW1haWwuc3ViamVjdCcsICdlbWFpbC5ib2R5JywgJ3Ntcy53ZWxjb21lJywgJ3Ntcy52ZXJpZmljYXRpb24nXG4gIF07XG5cbiAgY29uc3QgdHJhbnNsYXRpb25zOiBUcmFuc2xhdGlvbk9iamVjdFtdID0ga2V5cy5tYXAoKGtleSkgPT4gKHtcbiAgICBrZXksXG4gICAgZmFsbGJhY2s6IGBGYWxsYmFjayBmb3IgJHtrZXl9YFxuICB9KSk7XG5cbiAgY29uc29sZS50aW1lKCdCYXRjaCB0cmFuc2xhdGlvbicpO1xuICBjb25zdCBiYXRjaFJlc3VsdHMgPSBhd2FpdCBpMThuKGNvbnRleHQsIHRyYW5zbGF0aW9ucywgJ2VuJyk7XG4gIGNvbnNvbGUudGltZUVuZCgnQmF0Y2ggdHJhbnNsYXRpb24nKTtcblxuICByZXR1cm4gYmF0Y2hSZXN1bHRzO1xufVxuXG4vLyBFeGFtcGxlIDEwOiBEeW5hbWljIGNvbnRlbnQgYmFzZWQgb24gdXNlciBwcmVmZXJlbmNlc1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFVzZXJHcmVldGluZyhcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgdXNlckxvY2FsZT86IHN0cmluZyxcbiAgdXNlcm5hbWU/OiBzdHJpbmdcbikge1xuICBjb25zdCBsb2NhbGU6IExvY2FsZSA9ICh1c2VyTG9jYWxlIGFzIExvY2FsZSkgfHwgJ2VuJztcblxuICBjb25zdCB0cmFuc2xhdGlvbnM6IFRyYW5zbGF0aW9uT2JqZWN0W10gPSBbXG4gICAge1xuICAgICAga2V5OiAnZ3JlZXRpbmcubW9ybmluZycsXG4gICAgICBmYWxsYmFjazogJ0dvb2QgbW9ybmluZyEnLFxuICAgICAgcGFyYW1zOiB1c2VybmFtZSA/IHt1c2VybmFtZX0gOiB7fVxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnZ3JlZXRpbmcuYWZ0ZXJub29uJyxcbiAgICAgIGZhbGxiYWNrOiAnR29vZCBhZnRlcm5vb24hJyxcbiAgICAgIHBhcmFtczogdXNlcm5hbWUgPyB7dXNlcm5hbWV9IDoge31cbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ2dyZWV0aW5nLmV2ZW5pbmcnLFxuICAgICAgZmFsbGJhY2s6ICdHb29kIGV2ZW5pbmchJyxcbiAgICAgIHBhcmFtczogdXNlcm5hbWUgPyB7dXNlcm5hbWV9IDoge31cbiAgICB9XG4gIF07XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaTE4bihjb250ZXh0LCB0cmFuc2xhdGlvbnMsIGxvY2FsZSk7XG5cbiAgLy8gUmV0dXJuIGFwcHJvcHJpYXRlIGdyZWV0aW5nIGJhc2VkIG9uIHRpbWUgb2YgZGF5XG4gIGNvbnN0IGhvdXIgPSBuZXcgRGF0ZSgpLmdldEhvdXJzKCk7XG4gIGlmKGhvdXIgPCAxMikge1xuICAgIHJldHVybiByZXN1bHRbJ2dyZWV0aW5nLm1vcm5pbmcnXTtcbiAgfVxuICBpZihob3VyIDwgMTgpIHtcbiAgICByZXR1cm4gcmVzdWx0WydncmVldGluZy5hZnRlcm5vb24nXTtcbiAgfVxuICByZXR1cm4gcmVzdWx0WydncmVldGluZy5ldmVuaW5nJ107XG59XG5cbi8vIEV4YW1wbGUgMTE6IEZvcmNlIGZsdXNoIHBlbmRpbmcgdHJhbnNsYXRpb25zXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5zdXJlQWxsVHJhbnNsYXRpb25zUHJvY2Vzc2VkKCkge1xuICAvLyBGb3JjZSBwcm9jZXNzIGFueSBwZW5kaW5nIHRyYW5zbGF0aW9uIGJhdGNoZXNcbiAgYXdhaXQgZmx1c2goKTtcbiAgY29uc29sZS5sb2coJ0FsbCB0cmFuc2xhdGlvbiBiYXRjaGVzIHByb2Nlc3NlZCcpO1xufVxuXG4vLyBVc2FnZSBleGFtcGxlczpcbi8vIGNvbnN0IGNvbnRleHQgPSB7IGRhdGFiYXNlTmFtZTogJ3RvcmNob25lLWRldicsIHNlc3Npb246IHsgdXNlcklkOiAndXNlcjEyMycgfSB9O1xuLy9cbi8vIC8vIEJhc2ljIHVzYWdlXG4vLyBjb25zdCB3ZWxjb21lTWVzc2FnZXMgPSBhd2FpdCBnZXRXZWxjb21lTWVzc2FnZXMoY29udGV4dCwgJ2VuJyk7XG4vL1xuLy8gLy8gV2l0aCBpbnRlcnBvbGF0aW9uXG4vLyBjb25zdCBwZXJzb25hbGl6ZWRNZXNzYWdlcyA9IGF3YWl0IGdldFBlcnNvbmFsaXplZE1lc3NhZ2VzKGNvbnRleHQsICdKb2huJywgJ2VzJyk7XG4vL1xuLy8gLy8gTXVsdGktbGFuZ3VhZ2UgY29udGVudFxuLy8gY29uc3QgbXVsdGlMYW5ndWFnZUNvbnRlbnQgPSBhd2FpdCBnZXRNdWx0aUxhbmd1YWdlQ29udGVudChjb250ZXh0KTtcbi8vXG4vLyAvLyBFcnJvciBoYW5kbGluZ1xuLy8gY29uc3QgZXJyb3JNZXNzYWdlcyA9IGF3YWl0IGdldFJvYnVzdFRyYW5zbGF0aW9ucyhjb250ZXh0LCAnZGUnKTtcbi8vXG4vLyAvLyBDb21wbGV4IHRlbXBsYXRlXG4vLyBjb25zdCBlbWFpbFRlbXBsYXRlID0gYXdhaXQgZ2VuZXJhdGVFbWFpbFRlbXBsYXRlKGNvbnRleHQsIHtcbi8vICAgbmFtZTogJ01hcmlhJyxcbi8vICAgZW1haWw6ICdtYXJpYUBleGFtcGxlLmNvbScsXG4vLyAgIG9yZGVySWQ6ICdPUkQtMTIzJyxcbi8vICAgdG90YWw6IDk5Ljk5LFxuLy8gICBpdGVtczogM1xuLy8gfSwgJ3B0Jyk7XG4vL1xuLy8gLy8gTm90aWZpY2F0aW9uc1xuLy8gY29uc3Qgbm90aWZpY2F0aW9ucyA9IGF3YWl0IGdldE5vdGlmaWNhdGlvbk1lc3NhZ2VzKGNvbnRleHQsICdmcicpO1xuLy9cbi8vIC8vIFBlcmZvcm1hbmNlIHRlc3Rcbi8vIGNvbnN0IHBlcmYgPSBhd2FpdCBwZXJmb3JtYW5jZUNvbXBhcmlzb24oY29udGV4dCk7XG4vL1xuLy8gLy8gRHluYW1pYyBncmVldGluZ1xuLy8gY29uc3QgZ3JlZXRpbmcgPSBhd2FpdCBnZXRVc2VyR3JlZXRpbmcoY29udGV4dCwgJ2VuJywgJ0pvaG4nKTtcbi8vXG4vLyAvLyBGb3JjZSBmbHVzaFxuLy8gYXdhaXQgZW5zdXJlQWxsVHJhbnNsYXRpb25zUHJvY2Vzc2VkKCk7Il0sIm5hbWVzIjpbImZsdXNoIiwiaTE4biIsImdldFdlbGNvbWVNZXNzYWdlcyIsImNvbnRleHQiLCJsb2NhbGUiLCJ0cmFuc2xhdGlvbnMiLCJrZXkiLCJmYWxsYmFjayIsInJlc3VsdCIsImdldFBlcnNvbmFsaXplZE1lc3NhZ2VzIiwidXNlcm5hbWUiLCJwYXJhbXMiLCJjb3VudCIsImRhdGUiLCJEYXRlIiwidG9Mb2NhbGVEYXRlU3RyaW5nIiwiZ2V0TXVsdGlMYW5ndWFnZUNvbnRlbnQiLCJsYW5ndWFnZXMiLCJyZXN1bHRzIiwiZ2V0Um9idXN0VHJhbnNsYXRpb25zIiwiZXJyb3IiLCJjb25zb2xlIiwicmVkdWNlIiwiYWNjIiwidCIsInByb2Nlc3NMYXJnZVRyYW5zbGF0aW9uQmF0Y2giLCJpIiwicHVzaCIsIm51bWJlciIsImdldEVycm9yTWVzc2FnZXMiLCJlcnJvckNvZGUiLCJnZW5lcmF0ZUVtYWlsVGVtcGxhdGUiLCJ1c2VyRGF0YSIsIm9yZGVySWQiLCJuYW1lIiwidG90YWwiLCJpdGVtcyIsInN1YmplY3QiLCJncmVldGluZyIsImJvZHkiLCJmb290ZXIiLCJnZXROb3RpZmljYXRpb25NZXNzYWdlcyIsInNlbmRlciIsInBlcmZvcm1hbmNlQ29tcGFyaXNvbiIsImtleXMiLCJtYXAiLCJ0aW1lIiwiYmF0Y2hSZXN1bHRzIiwidGltZUVuZCIsImdldFVzZXJHcmVldGluZyIsInVzZXJMb2NhbGUiLCJob3VyIiwiZ2V0SG91cnMiLCJlbnN1cmVBbGxUcmFuc2xhdGlvbnNQcm9jZXNzZWQiLCJsb2ciXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztDQVFDLEdBRUQsU0FBUUEsS0FBSyxFQUFFQyxJQUFJLFFBQStCLHdCQUF3QjtBQUsxRSwyRUFBMkU7QUFDM0UsT0FB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
@@ -1,2 +1,113 @@
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
1
+ /**
2
+ * Copyright (c) 2025-Present, Nitrogen Labs, Inc.
3
+ * Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
4
+ */ import { getContentWithFallback } from '../actions/content.js';
5
+ class TranslationQueue {
6
+ batches = new Map();
7
+ batchTimeout = 50;
8
+ maxBatchSize = 20;
9
+ async translate(context, translations, locale = 'en') {
10
+ if (translations.length === 0) {
11
+ return {};
12
+ }
13
+ const promises = translations.map(({ key, fallback = '', params = {} })=>this.getTranslation(context, key, fallback, params, locale));
14
+ const results = await Promise.all(promises);
15
+ const resultMap = {};
16
+ translations.forEach(({ key }, index)=>{
17
+ resultMap[key] = results[index];
18
+ });
19
+ return resultMap;
20
+ }
21
+ async getTranslation(context, key, fallback, params = {}, locale = 'en') {
22
+ return new Promise((resolve, reject)=>{
23
+ const batchKey = this.getBatchKey(context, locale);
24
+ const request = {
25
+ key,
26
+ fallback,
27
+ params,
28
+ locale,
29
+ resolve,
30
+ reject
31
+ };
32
+ if (!this.batches.has(batchKey)) {
33
+ const timeout = setTimeout(()=>{
34
+ this.processBatch(batchKey);
35
+ }, this.batchTimeout);
36
+ this.batches.set(batchKey, {
37
+ context,
38
+ requests: [
39
+ request
40
+ ],
41
+ timeout
42
+ });
43
+ } else {
44
+ const batch = this.batches.get(batchKey);
45
+ batch.requests.push(request);
46
+ if (batch.requests.length >= this.maxBatchSize) {
47
+ clearTimeout(batch.timeout);
48
+ this.processBatch(batchKey);
49
+ }
50
+ }
51
+ });
52
+ }
53
+ async flush() {
54
+ const batchKeys = Array.from(this.batches.keys());
55
+ await Promise.all(batchKeys.map((key)=>this.processBatch(key)));
56
+ }
57
+ clear() {
58
+ this.batches.forEach((batch)=>{
59
+ clearTimeout(batch.timeout);
60
+ batch.requests.forEach((request)=>{
61
+ request.reject(new Error('Translation queue cleared'));
62
+ });
63
+ });
64
+ this.batches.clear();
65
+ }
66
+ getBatchKey(context, locale) {
67
+ return `${context.databaseName}:${locale}`;
68
+ }
69
+ async processBatch(batchKey) {
70
+ const batch = this.batches.get(batchKey);
71
+ if (!batch) {
72
+ return;
73
+ }
74
+ this.batches.delete(batchKey);
75
+ clearTimeout(batch.timeout);
76
+ const promises = batch.requests.map(async (request)=>{
77
+ try {
78
+ const content = await getContentWithFallback(batch.context, request.key, request.fallback, request.locale);
79
+ const interpolatedContent = this.interpolate(content, request.params);
80
+ return {
81
+ request,
82
+ result: interpolatedContent
83
+ };
84
+ } catch (error) {
85
+ const interpolatedFallback = this.interpolate(request.fallback, request.params);
86
+ return {
87
+ request,
88
+ result: interpolatedFallback
89
+ };
90
+ }
91
+ });
92
+ const results = await Promise.allSettled(promises);
93
+ results.forEach((result)=>{
94
+ if (result.status === 'fulfilled') {
95
+ result.value.request.resolve(result.value.result);
96
+ } else {
97
+ const { request } = result.reason;
98
+ const interpolatedFallback = this.interpolate(request.fallback, request.params);
99
+ request.resolve(interpolatedFallback);
100
+ }
101
+ });
102
+ }
103
+ interpolate(content, params = {}) {
104
+ return content.replace(/\{\{(\w+)\}\}/g, (match, key)=>params[key] !== undefined ? String(params[key]) : match);
105
+ }
106
+ }
107
+ const translationQueue = new TranslationQueue();
108
+ export const i18n = (context, translations, locale)=>translationQueue.translate(context, translations, locale);
109
+ export const flush = ()=>translationQueue.flush();
110
+ export const clear = ()=>translationQueue.clear();
111
+ export { translationQueue };
112
+
113
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3Ivc3JjL3V0aWxzL3RyYW5zbGF0aW9uUXVldWUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjUtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cblxuaW1wb3J0IHtnZXRDb250ZW50V2l0aEZhbGxiYWNrfSBmcm9tICcuLi9hY3Rpb25zL2NvbnRlbnQuanMnO1xuXG5pbXBvcnQgdHlwZSB7QXBpQ29udGV4dH0gZnJvbSAnLi4vdHlwZXMvYXV0aC50eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7TG9jYWxlfSBmcm9tICcuLi90eXBlcy9jb250ZW50LnR5cGVzLmpzJztcblxuaW50ZXJmYWNlIFRyYW5zbGF0aW9uUmVxdWVzdCB7XG4gIGtleTogc3RyaW5nO1xuICBmYWxsYmFjazogc3RyaW5nO1xuICBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICBsb2NhbGU6IExvY2FsZTtcbiAgcmVzb2x2ZTogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHJlamVjdDogKGVycm9yOiBFcnJvcikgPT4gdm9pZDtcbn1cblxuaW50ZXJmYWNlIFRyYW5zbGF0aW9uQmF0Y2gge1xuICBjb250ZXh0OiBBcGlDb250ZXh0O1xuICByZXF1ZXN0czogVHJhbnNsYXRpb25SZXF1ZXN0W107XG4gIHRpbWVvdXQ6IE5vZGVKUy5UaW1lb3V0O1xufVxuXG5pbnRlcmZhY2UgVHJhbnNsYXRpb25PYmplY3Qge1xuICBrZXk6IHN0cmluZztcbiAgZmFsbGJhY2s/OiBzdHJpbmc7XG4gIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIGFueT47XG59XG5cbmNsYXNzIFRyYW5zbGF0aW9uUXVldWUge1xuICBwcml2YXRlIGJhdGNoZXM6IE1hcDxzdHJpbmcsIFRyYW5zbGF0aW9uQmF0Y2g+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIGJhdGNoVGltZW91dCA9IDUwO1xuICBwcml2YXRlIG1heEJhdGNoU2l6ZSA9IDIwO1xuXG4gIGFzeW5jIHRyYW5zbGF0ZShcbiAgICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICAgIHRyYW5zbGF0aW9uczogVHJhbnNsYXRpb25PYmplY3RbXSxcbiAgICBsb2NhbGU6IExvY2FsZSA9ICdlbidcbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiB7XG4gICAgaWYodHJhbnNsYXRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIGNvbnN0IHByb21pc2VzID0gdHJhbnNsYXRpb25zLm1hcCgoe2tleSwgZmFsbGJhY2sgPSAnJywgcGFyYW1zID0ge319KSA9PlxuICAgICAgdGhpcy5nZXRUcmFuc2xhdGlvbihjb250ZXh0LCBrZXksIGZhbGxiYWNrLCBwYXJhbXMsIGxvY2FsZSlcbiAgICApO1xuXG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcblxuICAgIGNvbnN0IHJlc3VsdE1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgIHRyYW5zbGF0aW9ucy5mb3JFYWNoKCh7a2V5fSwgaW5kZXgpID0+IHtcbiAgICAgIHJlc3VsdE1hcFtrZXldID0gcmVzdWx0c1tpbmRleF07XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0TWFwO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRUcmFuc2xhdGlvbihcbiAgICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICAgIGtleTogc3RyaW5nLFxuICAgIGZhbGxiYWNrOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30sXG4gICAgbG9jYWxlOiBMb2NhbGUgPSAnZW4nXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGJhdGNoS2V5ID0gdGhpcy5nZXRCYXRjaEtleShjb250ZXh0LCBsb2NhbGUpO1xuICAgICAgY29uc3QgcmVxdWVzdDogVHJhbnNsYXRpb25SZXF1ZXN0ID0ge2tleSwgZmFsbGJhY2ssIHBhcmFtcywgbG9jYWxlLCByZXNvbHZlLCByZWplY3R9O1xuXG4gICAgICBpZighdGhpcy5iYXRjaGVzLmhhcyhiYXRjaEtleSkpIHtcbiAgICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMucHJvY2Vzc0JhdGNoKGJhdGNoS2V5KTtcbiAgICAgICAgfSwgdGhpcy5iYXRjaFRpbWVvdXQpO1xuXG4gICAgICAgIHRoaXMuYmF0Y2hlcy5zZXQoYmF0Y2hLZXksIHtcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgIHJlcXVlc3RzOiBbcmVxdWVzdF0sXG4gICAgICAgICAgdGltZW91dFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGJhdGNoID0gdGhpcy5iYXRjaGVzLmdldChiYXRjaEtleSkhO1xuICAgICAgICBiYXRjaC5yZXF1ZXN0cy5wdXNoKHJlcXVlc3QpO1xuXG4gICAgICAgIGlmKGJhdGNoLnJlcXVlc3RzLmxlbmd0aCA+PSB0aGlzLm1heEJhdGNoU2l6ZSkge1xuICAgICAgICAgIGNsZWFyVGltZW91dChiYXRjaC50aW1lb3V0KTtcbiAgICAgICAgICB0aGlzLnByb2Nlc3NCYXRjaChiYXRjaEtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGZsdXNoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGJhdGNoS2V5cyA9IEFycmF5LmZyb20odGhpcy5iYXRjaGVzLmtleXMoKSk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoYmF0Y2hLZXlzLm1hcCgoa2V5KSA9PiB0aGlzLnByb2Nlc3NCYXRjaChrZXkpKSk7XG4gIH1cblxuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLmJhdGNoZXMuZm9yRWFjaCgoYmF0Y2gpID0+IHtcbiAgICAgIGNsZWFyVGltZW91dChiYXRjaC50aW1lb3V0KTtcbiAgICAgIGJhdGNoLnJlcXVlc3RzLmZvckVhY2goKHJlcXVlc3QpID0+IHtcbiAgICAgICAgcmVxdWVzdC5yZWplY3QobmV3IEVycm9yKCdUcmFuc2xhdGlvbiBxdWV1ZSBjbGVhcmVkJykpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgdGhpcy5iYXRjaGVzLmNsZWFyKCk7XG4gIH1cblxuICBwcml2YXRlIGdldEJhdGNoS2V5KGNvbnRleHQ6IEFwaUNvbnRleHQsIGxvY2FsZTogTG9jYWxlKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7Y29udGV4dC5kYXRhYmFzZU5hbWV9OiR7bG9jYWxlfWA7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHByb2Nlc3NCYXRjaChiYXRjaEtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYmF0Y2ggPSB0aGlzLmJhdGNoZXMuZ2V0KGJhdGNoS2V5KTtcbiAgICBpZighYmF0Y2gpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmJhdGNoZXMuZGVsZXRlKGJhdGNoS2V5KTtcbiAgICBjbGVhclRpbWVvdXQoYmF0Y2gudGltZW91dCk7XG5cbiAgICBjb25zdCBwcm9taXNlcyA9IGJhdGNoLnJlcXVlc3RzLm1hcChhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGdldENvbnRlbnRXaXRoRmFsbGJhY2soXG4gICAgICAgICAgYmF0Y2guY29udGV4dCxcbiAgICAgICAgICByZXF1ZXN0LmtleSxcbiAgICAgICAgICByZXF1ZXN0LmZhbGxiYWNrLFxuICAgICAgICAgIHJlcXVlc3QubG9jYWxlXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgaW50ZXJwb2xhdGVkQ29udGVudCA9IHRoaXMuaW50ZXJwb2xhdGUoY29udGVudCwgcmVxdWVzdC5wYXJhbXMpO1xuICAgICAgICByZXR1cm4ge3JlcXVlc3QsIHJlc3VsdDogaW50ZXJwb2xhdGVkQ29udGVudH07XG4gICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGludGVycG9sYXRlZEZhbGxiYWNrID0gdGhpcy5pbnRlcnBvbGF0ZShyZXF1ZXN0LmZhbGxiYWNrLCByZXF1ZXN0LnBhcmFtcyk7XG4gICAgICAgIHJldHVybiB7cmVxdWVzdCwgcmVzdWx0OiBpbnRlcnBvbGF0ZWRGYWxsYmFja307XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKHByb21pc2VzKTtcblxuICAgIHJlc3VsdHMuZm9yRWFjaCgocmVzdWx0KSA9PiB7XG4gICAgICBpZihyZXN1bHQuc3RhdHVzID09PSAnZnVsZmlsbGVkJykge1xuICAgICAgICByZXN1bHQudmFsdWUucmVxdWVzdC5yZXNvbHZlKHJlc3VsdC52YWx1ZS5yZXN1bHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qge3JlcXVlc3R9ID0gcmVzdWx0LnJlYXNvbjtcbiAgICAgICAgY29uc3QgaW50ZXJwb2xhdGVkRmFsbGJhY2sgPSB0aGlzLmludGVycG9sYXRlKHJlcXVlc3QuZmFsbGJhY2ssIHJlcXVlc3QucGFyYW1zKTtcbiAgICAgICAgcmVxdWVzdC5yZXNvbHZlKGludGVycG9sYXRlZEZhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaW50ZXJwb2xhdGUoY29udGVudDogc3RyaW5nLCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZSgvXFx7XFx7KFxcdyspXFx9XFx9L2csIChtYXRjaCwga2V5KSA9PiAocGFyYW1zW2tleV0gIT09IHVuZGVmaW5lZCA/IFN0cmluZyhwYXJhbXNba2V5XSkgOiBtYXRjaCkpO1xuICB9XG59XG5cbmNvbnN0IHRyYW5zbGF0aW9uUXVldWUgPSBuZXcgVHJhbnNsYXRpb25RdWV1ZSgpO1xuXG5leHBvcnQgY29uc3QgaTE4biA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgdHJhbnNsYXRpb25zOiBUcmFuc2xhdGlvbk9iamVjdFtdLFxuICBsb2NhbGU/OiBMb2NhbGVcbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4gPT4gdHJhbnNsYXRpb25RdWV1ZS50cmFuc2xhdGUoY29udGV4dCwgdHJhbnNsYXRpb25zLCBsb2NhbGUpO1xuXG5leHBvcnQgY29uc3QgZmx1c2ggPSAoKTogUHJvbWlzZTx2b2lkPiA9PiB0cmFuc2xhdGlvblF1ZXVlLmZsdXNoKCk7XG5leHBvcnQgY29uc3QgY2xlYXIgPSAoKTogdm9pZCA9PiB0cmFuc2xhdGlvblF1ZXVlLmNsZWFyKCk7XG5cbmV4cG9ydCB0eXBlIHtUcmFuc2xhdGlvbk9iamVjdH07XG5cbiAgZXhwb3J0IHt0cmFuc2xhdGlvblF1ZXVlfTtcbiJdLCJuYW1lcyI6WyJnZXRDb250ZW50V2l0aEZhbGxiYWNrIiwiVHJhbnNsYXRpb25RdWV1ZSIsImJhdGNoZXMiLCJNYXAiLCJiYXRjaFRpbWVvdXQiLCJtYXhCYXRjaFNpemUiLCJ0cmFuc2xhdGUiLCJjb250ZXh0IiwidHJhbnNsYXRpb25zIiwibG9jYWxlIiwibGVuZ3RoIiwicHJvbWlzZXMiLCJtYXAiLCJrZXkiLCJmYWxsYmFjayIsInBhcmFtcyIsImdldFRyYW5zbGF0aW9uIiwicmVzdWx0cyIsIlByb21pc2UiLCJhbGwiLCJyZXN1bHRNYXAiLCJmb3JFYWNoIiwiaW5kZXgiLCJyZXNvbHZlIiwicmVqZWN0IiwiYmF0Y2hLZXkiLCJnZXRCYXRjaEtleSIsInJlcXVlc3QiLCJoYXMiLCJ0aW1lb3V0Iiwic2V0VGltZW91dCIsInByb2Nlc3NCYXRjaCIsInNldCIsInJlcXVlc3RzIiwiYmF0Y2giLCJnZXQiLCJwdXNoIiwiY2xlYXJUaW1lb3V0IiwiZmx1c2giLCJiYXRjaEtleXMiLCJBcnJheSIsImZyb20iLCJrZXlzIiwiY2xlYXIiLCJFcnJvciIsImRhdGFiYXNlTmFtZSIsImRlbGV0ZSIsImNvbnRlbnQiLCJpbnRlcnBvbGF0ZWRDb250ZW50IiwiaW50ZXJwb2xhdGUiLCJyZXN1bHQiLCJlcnJvciIsImludGVycG9sYXRlZEZhbGxiYWNrIiwiYWxsU2V0dGxlZCIsInN0YXR1cyIsInZhbHVlIiwicmVhc29uIiwicmVwbGFjZSIsIm1hdGNoIiwidW5kZWZpbmVkIiwiU3RyaW5nIiwidHJhbnNsYXRpb25RdWV1ZSIsImkxOG4iXSwibWFwcGluZ3MiOiJBQUFBOzs7Q0FHQyxHQUVELFNBQVFBLHNCQUFzQixRQUFPLHdCQUF3QjtBQTBCN0QsTUFBTUM7SUFDSUMsVUFBeUMsSUFBSUMsTUFBTTtJQUNuREMsZUFBZSxHQUFHO0lBQ2xCQyxlQUFlLEdBQUc7SUFFMUIsTUFBTUMsVUFDSkMsT0FBbUIsRUFDbkJDLFlBQWlDLEVBQ2pDQyxTQUFpQixJQUFJLEVBQ1k7UUFDakMsSUFBR0QsYUFBYUUsTUFBTSxLQUFLLEdBQUc7WUFDNUIsT0FBTyxDQUFDO1FBQ1Y7UUFFQSxNQUFNQyxXQUFXSCxhQUFhSSxHQUFHLENBQUMsQ0FBQyxFQUFDQyxHQUFHLEVBQUVDLFdBQVcsRUFBRSxFQUFFQyxTQUFTLENBQUMsQ0FBQyxFQUFDLEdBQ2xFLElBQUksQ0FBQ0MsY0FBYyxDQUFDVCxTQUFTTSxLQUFLQyxVQUFVQyxRQUFRTjtRQUd0RCxNQUFNUSxVQUFVLE1BQU1DLFFBQVFDLEdBQUcsQ0FBQ1I7UUFFbEMsTUFBTVMsWUFBb0MsQ0FBQztRQUMzQ1osYUFBYWEsT0FBTyxDQUFDLENBQUMsRUFBQ1IsR0FBRyxFQUFDLEVBQUVTO1lBQzNCRixTQUFTLENBQUNQLElBQUksR0FBR0ksT0FBTyxDQUFDSyxNQUFNO1FBQ2pDO1FBRUEsT0FBT0Y7SUFDVDtJQUVBLE1BQWNKLGVB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