@nlabs/metropolisjs 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (326) hide show
  1. package/.github/copilot-instructions.md +167 -0
  2. package/AGENTS.md +13 -0
  3. package/CHANGELOG.md +112 -0
  4. package/GRAPHQL_VALIDATION_RESULTS.md +158 -0
  5. package/PERMISSION_GRAPHQL_INTEGRATION.md +293 -0
  6. package/PERMISSION_IMPLEMENTATION_SUMMARY.md +243 -0
  7. package/README.md +1343 -0
  8. package/SIGNIN_GRAPHQL_VALIDATION.md +125 -0
  9. package/VAULT_GRAPHQL_API_FINDINGS.md +312 -0
  10. package/docs/ACTIONS.md +63 -0
  11. package/docs/COLLECTIONS.md +1038 -0
  12. package/docs/CONNECTIONS.md +1367 -0
  13. package/docs/CRUD_INTEGRATION.md +702 -0
  14. package/examples/connections-usage.tsx +909 -0
  15. package/examples/content-actions-usage.ts +144 -0
  16. package/examples/crud-usage.tsx +847 -0
  17. package/examples/extensibility-usage.tsx +889 -0
  18. package/examples/factory-pattern-usage.ts +283 -0
  19. package/examples/i18n-import-examples.ts +86 -0
  20. package/examples/i18n-namespace-usage.ts +118 -0
  21. package/examples/i18next-singleton-demo.ts +187 -0
  22. package/examples/permission-system-usage.tsx +415 -0
  23. package/examples/project-details.tsx +397 -0
  24. package/examples/shared-i18n-usage.tsx +203 -0
  25. package/examples/signup-error-handling.ts +100 -0
  26. package/examples/translation-types.ts +86 -0
  27. package/examples/translation-usage.tsx +336 -0
  28. package/factoryPatternGuide.md +244 -0
  29. package/index.js +1 -0
  30. package/jest.config.mjs +28 -0
  31. package/lex.config.mjs +26 -0
  32. package/lib/__tests__/e2e/helpers/testGraphQLServer.d.ts +22 -0
  33. package/lib/__tests__/e2e/helpers/testGraphQLServer.d.ts.map +1 -0
  34. package/lib/__tests__/e2e/helpers/testGraphQLServer.js +197 -0
  35. package/lib/__tests__/e2e/helpers/testGraphQLServerSimple.d.ts +3 -0
  36. package/lib/__tests__/e2e/helpers/testGraphQLServerSimple.d.ts.map +1 -0
  37. package/lib/__tests__/e2e/helpers/testGraphQLServerSimple.js +52 -0
  38. package/lib/actions/appActions/appActions.d.ts +29 -0
  39. package/lib/actions/appActions/appActions.d.ts.map +1 -0
  40. package/lib/actions/appActions/appActions.js +159 -0
  41. package/lib/actions/connectionActions/connectionActions.d.ts +19 -0
  42. package/lib/actions/connectionActions/connectionActions.d.ts.map +1 -0
  43. package/lib/actions/connectionActions/connectionActions.js +131 -0
  44. package/lib/actions/contentActions/contentActions.d.ts +34 -0
  45. package/lib/actions/contentActions/contentActions.d.ts.map +1 -0
  46. package/lib/actions/contentActions/contentActions.js +314 -0
  47. package/lib/actions/conversationActions/conversationActions.d.ts +30 -0
  48. package/lib/actions/conversationActions/conversationActions.d.ts.map +1 -0
  49. package/lib/actions/conversationActions/conversationActions.js +225 -0
  50. package/lib/actions/eventActions/eventActions.d.ts +65 -0
  51. package/lib/actions/eventActions/eventActions.d.ts.map +1 -0
  52. package/lib/actions/eventActions/eventActions.js +436 -0
  53. package/lib/actions/groupActions/groupActions.d.ts +30 -0
  54. package/lib/actions/groupActions/groupActions.d.ts.map +1 -0
  55. package/lib/actions/groupActions/groupActions.js +229 -0
  56. package/lib/actions/imageActions/imageActions.d.ts +62 -0
  57. package/lib/actions/imageActions/imageActions.d.ts.map +1 -0
  58. package/lib/actions/imageActions/imageActions.js +593 -0
  59. package/lib/actions/index.d.ts +21 -0
  60. package/lib/actions/index.d.ts.map +1 -0
  61. package/lib/actions/index.js +22 -0
  62. package/lib/actions/locationActions/locationActions.d.ts +60 -0
  63. package/lib/actions/locationActions/locationActions.d.ts.map +1 -0
  64. package/lib/actions/locationActions/locationActions.js +388 -0
  65. package/lib/actions/messageActions/messageActions.d.ts +38 -0
  66. package/lib/actions/messageActions/messageActions.d.ts.map +1 -0
  67. package/lib/actions/messageActions/messageActions.js +235 -0
  68. package/lib/actions/permissionActions/permissionActions.d.ts +34 -0
  69. package/lib/actions/permissionActions/permissionActions.d.ts.map +1 -0
  70. package/lib/actions/permissionActions/permissionActions.js +330 -0
  71. package/lib/actions/personaActions/personaActions.d.ts +65 -0
  72. package/lib/actions/personaActions/personaActions.d.ts.map +1 -0
  73. package/lib/actions/personaActions/personaActions.js +572 -0
  74. package/lib/actions/postActions/postActions.d.ts +36 -0
  75. package/lib/actions/postActions/postActions.d.ts.map +1 -0
  76. package/lib/actions/postActions/postActions.js +447 -0
  77. package/lib/actions/reactionActions/reactionActions.d.ts +38 -0
  78. package/lib/actions/reactionActions/reactionActions.d.ts.map +1 -0
  79. package/lib/actions/reactionActions/reactionActions.js +413 -0
  80. package/lib/actions/sseActions/sseActions.d.ts +38 -0
  81. package/lib/actions/sseActions/sseActions.d.ts.map +1 -0
  82. package/lib/actions/sseActions/sseActions.js +148 -0
  83. package/lib/actions/subscriptionActions/subscriptionActions.d.ts +24 -0
  84. package/lib/actions/subscriptionActions/subscriptionActions.d.ts.map +1 -0
  85. package/lib/actions/subscriptionActions/subscriptionActions.js +329 -0
  86. package/lib/actions/tagActions/tagActions.d.ts +37 -0
  87. package/lib/actions/tagActions/tagActions.d.ts.map +1 -0
  88. package/lib/actions/tagActions/tagActions.js +347 -0
  89. package/lib/actions/translationActions/translationActions.d.ts +38 -0
  90. package/lib/actions/translationActions/translationActions.d.ts.map +1 -0
  91. package/lib/actions/translationActions/translationActions.js +189 -0
  92. package/lib/actions/userActions/userActions.d.ts +78 -0
  93. package/lib/actions/userActions/userActions.d.ts.map +1 -0
  94. package/lib/actions/userActions/userActions.js +844 -0
  95. package/lib/actions/videoActions/videoActions.d.ts +41 -0
  96. package/lib/actions/videoActions/videoActions.d.ts.map +1 -0
  97. package/lib/actions/videoActions/videoActions.js +532 -0
  98. package/lib/actions/websocketActions/websocketActions.d.ts +30 -0
  99. package/lib/actions/websocketActions/websocketActions.d.ts.map +1 -0
  100. package/lib/actions/websocketActions/websocketActions.js +377 -0
  101. package/lib/adapters/appAdapter/appAdapter.d.ts +8 -0
  102. package/lib/adapters/appAdapter/appAdapter.d.ts.map +1 -0
  103. package/lib/adapters/appAdapter/appAdapter.js +90 -0
  104. package/lib/adapters/arangoAdapter/arangoAdapter.d.ts +21 -0
  105. package/lib/adapters/arangoAdapter/arangoAdapter.d.ts.map +1 -0
  106. package/lib/adapters/arangoAdapter/arangoAdapter.js +75 -0
  107. package/lib/adapters/contentAdapter/contentAdapter.d.ts +32 -0
  108. package/lib/adapters/contentAdapter/contentAdapter.d.ts.map +1 -0
  109. package/lib/adapters/contentAdapter/contentAdapter.js +107 -0
  110. package/lib/adapters/conversationAdapter/conversationAdapter.d.ts +24 -0
  111. package/lib/adapters/conversationAdapter/conversationAdapter.d.ts.map +1 -0
  112. package/lib/adapters/conversationAdapter/conversationAdapter.js +75 -0
  113. package/lib/adapters/eventAdapter/eventAdapter.d.ts +46 -0
  114. package/lib/adapters/eventAdapter/eventAdapter.d.ts.map +1 -0
  115. package/lib/adapters/eventAdapter/eventAdapter.js +162 -0
  116. package/lib/adapters/fileAdapter/fileAdapter.d.ts +30 -0
  117. package/lib/adapters/fileAdapter/fileAdapter.d.ts.map +1 -0
  118. package/lib/adapters/fileAdapter/fileAdapter.js +118 -0
  119. package/lib/adapters/groupAdapter/groupAdapter.d.ts +28 -0
  120. package/lib/adapters/groupAdapter/groupAdapter.d.ts.map +1 -0
  121. package/lib/adapters/groupAdapter/groupAdapter.js +66 -0
  122. package/lib/adapters/imageAdapter/imageAdapter.d.ts +38 -0
  123. package/lib/adapters/imageAdapter/imageAdapter.d.ts.map +1 -0
  124. package/lib/adapters/imageAdapter/imageAdapter.js +134 -0
  125. package/lib/adapters/index.d.ts +34 -0
  126. package/lib/adapters/index.d.ts.map +1 -0
  127. package/lib/adapters/index.js +19 -0
  128. package/lib/adapters/locationAdapter/locationAdapter.d.ts +28 -0
  129. package/lib/adapters/locationAdapter/locationAdapter.d.ts.map +1 -0
  130. package/lib/adapters/locationAdapter/locationAdapter.js +95 -0
  131. package/lib/adapters/messageAdapter/messageAdapter.d.ts +31 -0
  132. package/lib/adapters/messageAdapter/messageAdapter.d.ts.map +1 -0
  133. package/lib/adapters/messageAdapter/messageAdapter.js +82 -0
  134. package/lib/adapters/permissionAdapter/permissionAdapter.d.ts +41 -0
  135. package/lib/adapters/permissionAdapter/permissionAdapter.d.ts.map +1 -0
  136. package/lib/adapters/permissionAdapter/permissionAdapter.js +120 -0
  137. package/lib/adapters/personaAdapter/personaAdapter.d.ts +44 -0
  138. package/lib/adapters/personaAdapter/personaAdapter.d.ts.map +1 -0
  139. package/lib/adapters/personaAdapter/personaAdapter.js +161 -0
  140. package/lib/adapters/postAdapter/postAdapter.d.ts +33 -0
  141. package/lib/adapters/postAdapter/postAdapter.d.ts.map +1 -0
  142. package/lib/adapters/postAdapter/postAdapter.js +115 -0
  143. package/lib/adapters/reactionAdapter/reactionAdapter.d.ts +23 -0
  144. package/lib/adapters/reactionAdapter/reactionAdapter.d.ts.map +1 -0
  145. package/lib/adapters/reactionAdapter/reactionAdapter.js +81 -0
  146. package/lib/adapters/reaktorAdapter/reaktorAdapter.d.ts +17 -0
  147. package/lib/adapters/reaktorAdapter/reaktorAdapter.d.ts.map +1 -0
  148. package/lib/adapters/reaktorAdapter/reaktorAdapter.js +58 -0
  149. package/lib/adapters/sessionAdapter/sessionAdapter.d.ts +24 -0
  150. package/lib/adapters/sessionAdapter/sessionAdapter.d.ts.map +1 -0
  151. package/lib/adapters/sessionAdapter/sessionAdapter.js +80 -0
  152. package/lib/adapters/tagAdapter/tagAdapter.d.ts +21 -0
  153. package/lib/adapters/tagAdapter/tagAdapter.d.ts.map +1 -0
  154. package/lib/adapters/tagAdapter/tagAdapter.js +98 -0
  155. package/lib/adapters/translationAdapter/translationAdapter.d.ts +21 -0
  156. package/lib/adapters/translationAdapter/translationAdapter.d.ts.map +1 -0
  157. package/lib/adapters/translationAdapter/translationAdapter.js +55 -0
  158. package/lib/adapters/userAdapter/userAdapter.d.ts +67 -0
  159. package/lib/adapters/userAdapter/userAdapter.d.ts.map +1 -0
  160. package/lib/adapters/userAdapter/userAdapter.js +302 -0
  161. package/lib/adapters/videoAdapter/videoAdapter.d.ts +8 -0
  162. package/lib/adapters/videoAdapter/videoAdapter.d.ts.map +1 -0
  163. package/lib/adapters/videoAdapter/videoAdapter.js +194 -0
  164. package/lib/config/index.d.ts +44 -0
  165. package/lib/config/index.d.ts.map +1 -0
  166. package/lib/config/index.js +97 -0
  167. package/lib/constants/Collections.d.ts +44 -0
  168. package/lib/constants/Collections.d.ts.map +1 -0
  169. package/lib/constants/Collections.js +40 -0
  170. package/lib/constants/MetropolisConstants.d.ts +15 -0
  171. package/lib/constants/MetropolisConstants.d.ts.map +1 -0
  172. package/lib/constants/MetropolisConstants.js +15 -0
  173. package/lib/graphql/message.d.ts +3 -0
  174. package/lib/graphql/message.d.ts.map +1 -0
  175. package/lib/graphql/message.js +20 -0
  176. package/lib/graphql/notification.d.ts +3 -0
  177. package/lib/graphql/notification.d.ts.map +1 -0
  178. package/lib/graphql/notification.js +20 -0
  179. package/lib/graphql/session.d.ts +2 -0
  180. package/lib/graphql/session.d.ts.map +1 -0
  181. package/lib/graphql/session.js +17 -0
  182. package/lib/index.d.ts +52 -0
  183. package/lib/index.d.ts.map +1 -0
  184. package/lib/index.js +248 -0
  185. package/lib/stores/appStore.d.ts +23 -0
  186. package/lib/stores/appStore.d.ts.map +1 -0
  187. package/lib/stores/appStore.js +23 -0
  188. package/lib/stores/contentStore.d.ts +36 -0
  189. package/lib/stores/contentStore.d.ts.map +1 -0
  190. package/lib/stores/contentStore.js +139 -0
  191. package/lib/stores/conversationStore.d.ts +38 -0
  192. package/lib/stores/conversationStore.d.ts.map +1 -0
  193. package/lib/stores/conversationStore.js +117 -0
  194. package/lib/stores/eventStore.d.ts +37 -0
  195. package/lib/stores/eventStore.d.ts.map +1 -0
  196. package/lib/stores/eventStore.js +47 -0
  197. package/lib/stores/groupStore.d.ts +37 -0
  198. package/lib/stores/groupStore.d.ts.map +1 -0
  199. package/lib/stores/groupStore.js +68 -0
  200. package/lib/stores/imageStore.d.ts +40 -0
  201. package/lib/stores/imageStore.d.ts.map +1 -0
  202. package/lib/stores/imageStore.js +53 -0
  203. package/lib/stores/index.d.ts +24 -0
  204. package/lib/stores/index.d.ts.map +1 -0
  205. package/lib/stores/index.js +24 -0
  206. package/lib/stores/locationStore.d.ts +34 -0
  207. package/lib/stores/locationStore.d.ts.map +1 -0
  208. package/lib/stores/locationStore.js +42 -0
  209. package/lib/stores/messageStore.d.ts +51 -0
  210. package/lib/stores/messageStore.d.ts.map +1 -0
  211. package/lib/stores/messageStore.js +137 -0
  212. package/lib/stores/notificationStore.d.ts +33 -0
  213. package/lib/stores/notificationStore.d.ts.map +1 -0
  214. package/lib/stores/notificationStore.js +55 -0
  215. package/lib/stores/permissionStore.d.ts +37 -0
  216. package/lib/stores/permissionStore.d.ts.map +1 -0
  217. package/lib/stores/permissionStore.js +117 -0
  218. package/lib/stores/personaStore.d.ts +26 -0
  219. package/lib/stores/personaStore.d.ts.map +1 -0
  220. package/lib/stores/personaStore.js +118 -0
  221. package/lib/stores/postStore.d.ts +34 -0
  222. package/lib/stores/postStore.d.ts.map +1 -0
  223. package/lib/stores/postStore.js +53 -0
  224. package/lib/stores/reactionStore.d.ts +25 -0
  225. package/lib/stores/reactionStore.d.ts.map +1 -0
  226. package/lib/stores/reactionStore.js +28 -0
  227. package/lib/stores/subscriptionStore.d.ts +41 -0
  228. package/lib/stores/subscriptionStore.d.ts.map +1 -0
  229. package/lib/stores/subscriptionStore.js +85 -0
  230. package/lib/stores/tagStore.d.ts +34 -0
  231. package/lib/stores/tagStore.d.ts.map +1 -0
  232. package/lib/stores/tagStore.js +87 -0
  233. package/lib/stores/translationStore.d.ts +42 -0
  234. package/lib/stores/translationStore.d.ts.map +1 -0
  235. package/lib/stores/translationStore.js +122 -0
  236. package/lib/stores/userStore.d.ts +74 -0
  237. package/lib/stores/userStore.d.ts.map +1 -0
  238. package/lib/stores/userStore.js +319 -0
  239. package/lib/stores/videoStore.d.ts +39 -0
  240. package/lib/stores/videoStore.d.ts.map +1 -0
  241. package/lib/stores/videoStore.js +132 -0
  242. package/lib/stores/websocketStore.d.ts +24 -0
  243. package/lib/stores/websocketStore.d.ts.map +1 -0
  244. package/lib/stores/websocketStore.js +51 -0
  245. package/lib/types/apps.types.d.ts +17 -0
  246. package/lib/types/apps.types.d.ts.map +1 -0
  247. package/lib/types/apps.types.js +6 -0
  248. package/lib/types/common.types.d.ts +31 -0
  249. package/lib/types/common.types.d.ts.map +1 -0
  250. package/lib/types/common.types.js +6 -0
  251. package/lib/types/conversations.types.d.ts +17 -0
  252. package/lib/types/conversations.types.d.ts.map +1 -0
  253. package/lib/types/conversations.types.js +6 -0
  254. package/lib/types/edges.types.d.ts +38 -0
  255. package/lib/types/edges.types.d.ts.map +1 -0
  256. package/lib/types/edges.types.js +6 -0
  257. package/lib/types/groups.types.d.ts +19 -0
  258. package/lib/types/groups.types.d.ts.map +1 -0
  259. package/lib/types/groups.types.js +6 -0
  260. package/lib/types/index.d.ts +12 -0
  261. package/lib/types/index.d.ts.map +1 -0
  262. package/lib/types/index.js +12 -0
  263. package/lib/types/subscriptions.types.d.ts +32 -0
  264. package/lib/types/subscriptions.types.d.ts.map +1 -0
  265. package/lib/types/subscriptions.types.js +6 -0
  266. package/lib/types/videos.types.d.ts +61 -0
  267. package/lib/types/videos.types.d.ts.map +1 -0
  268. package/lib/types/videos.types.js +6 -0
  269. package/lib/utils/MetropolisProvider.d.ts +58 -0
  270. package/lib/utils/MetropolisProvider.d.ts.map +1 -0
  271. package/lib/utils/MetropolisProvider.js +31 -0
  272. package/lib/utils/actionFactory.d.ts +24 -0
  273. package/lib/utils/actionFactory.d.ts.map +1 -0
  274. package/lib/utils/actionFactory.js +95 -0
  275. package/lib/utils/api.d.ts +44 -0
  276. package/lib/utils/api.d.ts.map +1 -0
  277. package/lib/utils/api.js +253 -0
  278. package/lib/utils/app.d.ts +7 -0
  279. package/lib/utils/app.d.ts.map +1 -0
  280. package/lib/utils/app.js +15 -0
  281. package/lib/utils/baseActionFactory.d.ts +16 -0
  282. package/lib/utils/baseActionFactory.d.ts.map +1 -0
  283. package/lib/utils/baseActionFactory.js +72 -0
  284. package/lib/utils/configUtils.d.ts +11 -0
  285. package/lib/utils/configUtils.d.ts.map +1 -0
  286. package/lib/utils/configUtils.js +20 -0
  287. package/lib/utils/dateUtils.d.ts +3 -0
  288. package/lib/utils/dateUtils.d.ts.map +1 -0
  289. package/lib/utils/dateUtils.js +11 -0
  290. package/lib/utils/file.d.ts +3 -0
  291. package/lib/utils/file.d.ts.map +1 -0
  292. package/lib/utils/file.js +156 -0
  293. package/lib/utils/i18n.d.ts +7 -0
  294. package/lib/utils/i18n.d.ts.map +1 -0
  295. package/lib/utils/i18n.js +96 -0
  296. package/lib/utils/index.d.ts +20 -0
  297. package/lib/utils/index.d.ts.map +1 -0
  298. package/lib/utils/index.js +26 -0
  299. package/lib/utils/location.d.ts +10 -0
  300. package/lib/utils/location.d.ts.map +1 -0
  301. package/lib/utils/location.js +82 -0
  302. package/lib/utils/permissionUtils.d.ts +22 -0
  303. package/lib/utils/permissionUtils.d.ts.map +1 -0
  304. package/lib/utils/permissionUtils.js +72 -0
  305. package/lib/utils/requestCache.d.ts +8 -0
  306. package/lib/utils/requestCache.d.ts.map +1 -0
  307. package/lib/utils/requestCache.js +53 -0
  308. package/lib/utils/session.d.ts +14 -0
  309. package/lib/utils/session.d.ts.map +1 -0
  310. package/lib/utils/session.js +107 -0
  311. package/lib/utils/useConversationTyping.d.ts +26 -0
  312. package/lib/utils/useConversationTyping.d.ts.map +1 -0
  313. package/lib/utils/useConversationTyping.js +117 -0
  314. package/lib/utils/useMetropolis.d.ts +67 -0
  315. package/lib/utils/useMetropolis.d.ts.map +1 -0
  316. package/lib/utils/useMetropolis.js +311 -0
  317. package/lib/utils/useTranslations.d.ts +16 -0
  318. package/lib/utils/useTranslations.d.ts.map +1 -0
  319. package/lib/utils/useTranslations.js +105 -0
  320. package/lib/utils/validatorFactory.d.ts +49 -0
  321. package/lib/utils/validatorFactory.d.ts.map +1 -0
  322. package/lib/utils/validatorFactory.js +95 -0
  323. package/package.json +75 -28
  324. package/temp_signin.ts +73 -0
  325. package/tsconfig.lint.json +25 -0
  326. package/tsconfig.test.json +14 -0
@@ -0,0 +1,311 @@
1
+ import { useFlux } from '@nlabs/arkhamjs-utils-react';
2
+ import { useContext, useMemo } from 'react';
3
+ import { createActions, createAllActions } from '../utils/actionFactory.js';
4
+ import { MetropolisContext } from './MetropolisProvider.js';
5
+ /**
6
+ * Builds action options from adapters in a type-safe way.
7
+ */ const buildActionOptions = (adapters)=>{
8
+ if (!adapters) {
9
+ return {};
10
+ }
11
+ const options = {};
12
+ if (adapters.Content) {
13
+ options.content = {
14
+ contentAdapter: adapters.Content
15
+ };
16
+ }
17
+ if (adapters.Event) {
18
+ options.event = {
19
+ eventAdapter: adapters.Event
20
+ };
21
+ }
22
+ if (adapters.Image) {
23
+ options.image = {
24
+ imageAdapter: adapters.Image
25
+ };
26
+ }
27
+ if (adapters.Location) {
28
+ options.location = {
29
+ locationAdapter: adapters.Location
30
+ };
31
+ }
32
+ if (adapters.Message) {
33
+ options.message = {
34
+ messageAdapter: adapters.Message
35
+ };
36
+ }
37
+ if (adapters.Permission) {
38
+ options.permission = {
39
+ permissionAdapter: adapters.Permission
40
+ };
41
+ }
42
+ if (adapters.Post) {
43
+ options.post = {
44
+ postAdapter: adapters.Post
45
+ };
46
+ }
47
+ if (adapters.Persona) {
48
+ options.persona = {
49
+ personaAdapter: adapters.Persona
50
+ };
51
+ }
52
+ if (adapters.Reaction) {
53
+ options.reaction = {
54
+ reactionAdapter: adapters.Reaction
55
+ };
56
+ }
57
+ if (adapters.Tag) {
58
+ options.tag = {
59
+ tagAdapter: adapters.Tag
60
+ };
61
+ }
62
+ if (adapters.Translation) {
63
+ options.translation = {
64
+ translationAdapter: adapters.Translation
65
+ };
66
+ }
67
+ if (adapters.User) {
68
+ options.user = {
69
+ userAdapter: adapters.User
70
+ };
71
+ }
72
+ if (adapters.Video) {
73
+ options.video = {
74
+ videoAdapter: adapters.Video
75
+ };
76
+ }
77
+ return options;
78
+ };
79
+ /**
80
+ * Maps action type keys to their action names for return object.
81
+ */ const mapActionsToReturnKeys = (actions)=>{
82
+ const mapped = {};
83
+ if (actions.content) {
84
+ mapped.contentActions = actions.content;
85
+ }
86
+ if (actions.event) {
87
+ mapped.eventActions = actions.event;
88
+ }
89
+ if (actions.group) {
90
+ mapped.groupActions = actions.group;
91
+ }
92
+ if (actions.image) {
93
+ mapped.imageActions = actions.image;
94
+ }
95
+ if (actions.location) {
96
+ mapped.locationActions = actions.location;
97
+ }
98
+ if (actions.message) {
99
+ mapped.messageActions = actions.message;
100
+ }
101
+ if (actions.permission) {
102
+ mapped.permissionActions = actions.permission;
103
+ }
104
+ if (actions.post) {
105
+ mapped.postActions = actions.post;
106
+ }
107
+ if (actions.persona) {
108
+ mapped.personaActions = actions.persona;
109
+ }
110
+ if (actions.reaction) {
111
+ mapped.reactionActions = actions.reaction;
112
+ }
113
+ if (actions.subscription) {
114
+ mapped.subscriptionActions = actions.subscription;
115
+ }
116
+ if (actions.tag) {
117
+ mapped.tagActions = actions.tag;
118
+ }
119
+ if (actions.translation) {
120
+ mapped.translationActions = actions.translation;
121
+ }
122
+ if (actions.user) {
123
+ mapped.userActions = actions.user;
124
+ }
125
+ if (actions.video) {
126
+ mapped.videoActions = actions.video;
127
+ }
128
+ if (actions.websocket) {
129
+ mapped.websocketActions = actions.websocket;
130
+ }
131
+ return mapped;
132
+ };
133
+ /**
134
+ * Main hook to access Metropolis actions.
135
+ *
136
+ * @param actionTypes - Optional array of action types to create. If not provided, creates all actions.
137
+ * @returns Object containing the requested actions
138
+ *
139
+ * @example
140
+ * ```tsx
141
+ * // Get all actions (default behavior)
142
+ * const {userActions, postActions} = useMetropolis();
143
+ *
144
+ * // Get only specific actions (more performant)
145
+ * const {userActions} = useMetropolis(['user']);
146
+ * const {userActions, postActions} = useMetropolis(['user', 'post']);
147
+ * ```
148
+ */ export const useMetropolis = (actionTypes)=>{
149
+ const context = useContext(MetropolisContext);
150
+ // Use flux from context if available, otherwise fall back to useFlux() for backward compatibility
151
+ const contextFlux = context?.flux;
152
+ const hookFlux = useFlux();
153
+ const flux = contextFlux || hookFlux;
154
+ const { adapters } = context;
155
+ const actionOptions = useMemo(()=>buildActionOptions(adapters), [
156
+ adapters
157
+ ]);
158
+ return useMemo(()=>{
159
+ let actions;
160
+ if (actionTypes && actionTypes.length > 0) {
161
+ // Create only requested actions
162
+ actions = createActions(actionTypes, flux, actionOptions);
163
+ } else {
164
+ // Create all actions (default behavior for backward compatibility)
165
+ const allActions = createAllActions(flux, actionOptions);
166
+ actions = allActions;
167
+ }
168
+ // Map to return keys (contentActions, userActions, etc.)
169
+ return mapActionsToReturnKeys(actions);
170
+ }, [
171
+ flux,
172
+ actionOptions,
173
+ actionTypes?.join(',')
174
+ ]);
175
+ };
176
+ /**
177
+ * Hook to access the Metropolis configuration from context.
178
+ *
179
+ * @returns The resolved environment-specific configuration
180
+ * @throws Error if used outside of Metropolis component
181
+ *
182
+ * @example
183
+ * ```tsx
184
+ * const config = useMetropolisConfig();
185
+ * const apiUrl = config.app?.api?.url;
186
+ * ```
187
+ */ export const useMetropolisConfig = ()=>{
188
+ const context = useContext(MetropolisContext);
189
+ if (!context?.config) {
190
+ throw new Error('useMetropolisConfig must be used within a Metropolis component. ' + 'Make sure your component is wrapped with <Metropolis> provider.');
191
+ }
192
+ return context.config;
193
+ };
194
+ /**
195
+ * Hook to access the Flux framework instance from context.
196
+ *
197
+ * @returns The Flux framework instance
198
+ * @throws Error if used outside of Metropolis component and no Flux available
199
+ *
200
+ * @example
201
+ * ```tsx
202
+ * const flux = useMetropolisFlux();
203
+ * const state = flux.getState('user.session');
204
+ * ```
205
+ */ export const useMetropolisFlux = ()=>{
206
+ const context = useContext(MetropolisContext);
207
+ const hookFlux = useFlux();
208
+ // Use flux from context if available, otherwise fall back to useFlux() for backward compatibility
209
+ return context?.flux || hookFlux;
210
+ };
211
+ /**
212
+ * Specialized hooks for individual action types.
213
+ * These hooks only create the specific action type, improving performance.
214
+ */ export const useContentActions = ()=>{
215
+ const { contentActions } = useMetropolis([
216
+ 'content'
217
+ ]);
218
+ return contentActions;
219
+ };
220
+ export const useEventActions = ()=>{
221
+ const { eventActions } = useMetropolis([
222
+ 'event'
223
+ ]);
224
+ return eventActions;
225
+ };
226
+ export const useGroupActions = ()=>{
227
+ const { groupActions } = useMetropolis([
228
+ 'group'
229
+ ]);
230
+ return groupActions;
231
+ };
232
+ export const useImageActions = ()=>{
233
+ const { imageActions } = useMetropolis([
234
+ 'image'
235
+ ]);
236
+ return imageActions;
237
+ };
238
+ export const useLocationActions = ()=>{
239
+ const { locationActions } = useMetropolis([
240
+ 'location'
241
+ ]);
242
+ return locationActions;
243
+ };
244
+ export const useMessageActions = ()=>{
245
+ const { messageActions } = useMetropolis([
246
+ 'message'
247
+ ]);
248
+ return messageActions;
249
+ };
250
+ export const useSubscriptionActions = ()=>{
251
+ const { subscriptionActions } = useMetropolis([
252
+ 'subscription'
253
+ ]);
254
+ return subscriptionActions;
255
+ };
256
+ export const usePermissionActions = ()=>{
257
+ const { permissionActions } = useMetropolis([
258
+ 'permission'
259
+ ]);
260
+ return permissionActions;
261
+ };
262
+ export const usePostActions = ()=>{
263
+ const { postActions } = useMetropolis([
264
+ 'post'
265
+ ]);
266
+ return postActions;
267
+ };
268
+ export const usePersonaActions = ()=>{
269
+ const { personaActions } = useMetropolis([
270
+ 'persona'
271
+ ]);
272
+ return personaActions;
273
+ };
274
+ export const useReactionActions = ()=>{
275
+ const { reactionActions } = useMetropolis([
276
+ 'reaction'
277
+ ]);
278
+ return reactionActions;
279
+ };
280
+ export const useTagActions = ()=>{
281
+ const { tagActions } = useMetropolis([
282
+ 'tag'
283
+ ]);
284
+ return tagActions;
285
+ };
286
+ export const useVideoActions = ()=>{
287
+ const { videoActions } = useMetropolis([
288
+ 'video'
289
+ ]);
290
+ return videoActions;
291
+ };
292
+ export const useTranslationActions = ()=>{
293
+ const { translationActions } = useMetropolis([
294
+ 'translation'
295
+ ]);
296
+ return translationActions;
297
+ };
298
+ export const useUserActions = ()=>{
299
+ const { userActions } = useMetropolis([
300
+ 'user'
301
+ ]);
302
+ return userActions;
303
+ };
304
+ export const useWebsocketActions = ()=>{
305
+ const { websocketActions } = useMetropolis([
306
+ 'websocket'
307
+ ]);
308
+ return websocketActions;
309
+ };
310
+
311
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L21ldHJvcG9saXNqcy9zcmMvdXRpbHMvdXNlTWV0cm9wb2xpcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge3VzZUZsdXh9IGZyb20gJ0BubGFicy9hcmtoYW1qcy11dGlscy1yZWFjdCc7XG5pbXBvcnQge3VzZUNvbnRleHQsIHVzZU1lbW99IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHR5cGUge0ZsdXhGcmFtZXdvcmt9IGZyb20gJ0BubGFicy9hcmtoYW1qcyc7XG5pbXBvcnQgdHlwZSB7TWV0cm9wb2xpc0Vudmlyb25tZW50Q29uZmlndXJhdGlvbn0gZnJvbSAnLi4vY29uZmlnL2luZGV4LmpzJztcbmltcG9ydCB7Y3JlYXRlQWN0aW9ucywgY3JlYXRlQWxsQWN0aW9uc30gZnJvbSAnLi4vdXRpbHMvYWN0aW9uRmFjdG9yeS5qcyc7XG5pbXBvcnQgdHlwZSB7TWV0cm9wb2xpc0FkYXB0ZXJzfSBmcm9tICcuL01ldHJvcG9saXNQcm92aWRlci5qcyc7XG5pbXBvcnQge01ldHJvcG9saXNDb250ZXh0fSBmcm9tICcuL01ldHJvcG9saXNQcm92aWRlci5qcyc7XG5pbXBvcnQgdHlwZSB7QWN0aW9uT3B0aW9ucywgQWN0aW9uVHlwZX0gZnJvbSAnLi4vdXRpbHMvYWN0aW9uRmFjdG9yeS5qcyc7XG5cbi8qKlxuICogQnVpbGRzIGFjdGlvbiBvcHRpb25zIGZyb20gYWRhcHRlcnMgaW4gYSB0eXBlLXNhZmUgd2F5LlxuICovXG5jb25zdCBidWlsZEFjdGlvbk9wdGlvbnMgPSAoXG4gIGFkYXB0ZXJzPzogTWV0cm9wb2xpc0FkYXB0ZXJzXG4pOiBQYXJ0aWFsPFJlY29yZDxBY3Rpb25UeXBlLCBBY3Rpb25PcHRpb25zPj4gPT4ge1xuICBpZiAoIWFkYXB0ZXJzKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgY29uc3Qgb3B0aW9uczogUGFydGlhbDxSZWNvcmQ8QWN0aW9uVHlwZSwgQWN0aW9uT3B0aW9ucz4+ID0ge307XG5cbiAgaWYgKGFkYXB0ZXJzLkNvbnRlbnQpIHtcbiAgICBvcHRpb25zLmNvbnRlbnQgPSB7Y29udGVudEFkYXB0ZXI6IGFkYXB0ZXJzLkNvbnRlbnR9O1xuICB9XG4gIGlmIChhZGFwdGVycy5FdmVudCkge1xuICAgIG9wdGlvbnMuZXZlbnQgPSB7ZXZlbnRBZGFwdGVyOiBhZGFwdGVycy5FdmVudH07XG4gIH1cbiAgaWYgKGFkYXB0ZXJzLkltYWdlKSB7XG4gICAgb3B0aW9ucy5pbWFnZSA9IHtpbWFnZUFkYXB0ZXI6IGFkYXB0ZXJzLkltYWdlfTtcbiAgfVxuICBpZiAoYWRhcHRlcnMuTG9jYXRpb24pIHtcbiAgICBvcHRpb25zLmxvY2F0aW9uID0ge2xvY2F0aW9uQWRhcHRlcjogYWRhcHRlcnMuTG9jYXRpb259O1xuICB9XG4gIGlmIChhZGFwdGVycy5NZXNzYWdlKSB7XG4gICAgb3B0aW9ucy5tZXNzYWdlID0ge21lc3NhZ2VBZGFwdGVyOiBhZGFwdGVycy5NZXNzYWdlfTtcbiAgfVxuICBpZiAoYWRhcHRlcnMuUGVybWlzc2lvbikge1xuICAgIG9wdGlvbnMucGVybWlzc2lvbiA9IHtwZXJtaXNzaW9uQWRhcHRlcjogYWRhcHRlcnMuUGVybWlzc2lvbn07XG4gIH1cbiAgaWYgKGFkYXB0ZXJzLlBvc3QpIHtcbiAgICBvcHRpb25zLnBvc3QgPSB7cG9zdEFkYXB0ZXI6IGFkYXB0ZXJzLlBvc3R9O1xuICB9XG4gIGlmIChhZGFwdGVycy5QZXJzb25hKSB7XG4gICAgb3B0aW9ucy5wZXJzb25hID0ge3BlcnNvbmFBZGFwdGVyOiBhZGFwdGVycy5QZXJzb25hfTtcbiAgfVxuICBpZiAoYWRhcHRlcnMuUmVhY3Rpb24pIHtcbiAgICBvcHRpb25zLnJlYWN0aW9uID0ge3JlYWN0aW9uQWRhcHRlcjogYWRhcHRlcnMuUmVhY3Rpb259O1xuICB9XG4gIGlmIChhZGFwdGVycy5UYWcpIHtcbiAgICBvcHRpb25zLnRhZyA9IHt0YWdBZGFwdGVyOiBhZGFwdGVycy5UYWd9O1xuICB9XG4gIGlmIChhZGFwdGVycy5UcmFuc2xhdGlvbikge1xuICAgIG9wdGlvbnMudHJhbnNsYXRpb24gPSB7dHJhbnNsYXRpb25BZGFwdGVyOiBhZGFwdGVycy5UcmFuc2xhdGlvbn07XG4gIH1cbiAgaWYgKGFkYXB0ZXJzLlVzZXIpIHtcbiAgICBvcHRpb25zLnVzZXIgPSB7dXNlckFkYXB0ZXI6IGFkYXB0ZXJzLlVzZXJ9O1xuICB9XG4gIGlmIChhZGFwdGVycy5WaWRlbykge1xuICAgIG9wdGlvbnMudmlkZW8gPSB7dmlkZW9BZGFwdGVyOiBhZGFwdGVycy5WaWRlb307XG4gIH1cblxuICByZXR1cm4gb3B0aW9ucztcbn07XG5cbi8qKlxuICogTWFwcyBhY3Rpb24gdHlwZSBrZXlzIHRvIHRoZWlyIGFjdGlvbiBuYW1lcyBmb3IgcmV0dXJuIG9iamVjdC5cbiAqL1xuY29uc3QgbWFwQWN0aW9uc1RvUmV0dXJuS2V5cyA9IChhY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogUmVjb3JkPHN0cmluZywgYW55PiA9PiB7XG4gIGNvbnN0IG1hcHBlZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXG4gIGlmIChhY3Rpb25zLmNvbnRlbnQpIHtcbiAgICBtYXBwZWQuY29udGVudEFjdGlvbnMgPSBhY3Rpb25zLmNvbnRlbnQ7XG4gIH1cbiAgaWYgKGFjdGlvbnMuZXZlbnQpIHtcbiAgICBtYXBwZWQuZXZlbnRBY3Rpb25zID0gYWN0aW9ucy5ldmVudDtcbiAgfVxuICBpZiAoYWN0aW9ucy5ncm91cCkge1xuICAgIG1hcHBlZC5ncm91cEFjdGlvbnMgPSBhY3Rpb25zLmdyb3VwO1xuICB9XG4gIGlmIChhY3Rpb25zLmltYWdlKSB7XG4gICAgbWFwcGVkLmltYWdlQWN0aW9ucyA9IGFjdGlvbnMuaW1hZ2U7XG4gIH1cbiAgaWYgKGFjdGlvbnMubG9jYXRpb24pIHtcbiAgICBtYXBwZWQubG9jYXRpb25BY3Rpb25zID0gYWN0aW9ucy5sb2NhdGlvbjtcbiAgfVxuICBpZiAoYWN0aW9ucy5tZXNzYWdlKSB7XG4gICAgbWFwcGVkLm1lc3NhZ2VBY3Rpb25zID0gYWN0aW9ucy5tZXNzYWdlO1xuICB9XG4gIGlmIChhY3Rpb25zLnBlcm1pc3Npb24pIHtcbiAgICBtYXBwZWQucGVybWlzc2lvbkFjdGlvbnMgPSBhY3Rpb25zLnBlcm1pc3Npb247XG4gIH1cbiAgaWYgKGFjdGlvbnMucG9zdCkge1xuICAgIG1hcHBlZC5wb3N0QWN0aW9ucyA9IGFjdGlvbnMucG9zdDtcbiAgfVxuICBpZiAoYWN0aW9ucy5wZXJzb25hKSB7XG4gICAgbWFwcGVkLnBlcnNvbmFBY3Rpb25zID0gYWN0aW9ucy5wZXJzb25hO1xuICB9XG4gIGlmIChhY3Rpb25zLnJlYWN0aW9uKSB7XG4gICAgbWFwcGVkLnJlYWN0aW9uQWN0aW9ucyA9IGFjdGlvbnMucmVhY3Rpb247XG4gIH1cbiAgaWYgKGFjdGlvbnMuc3Vic2NyaXB0aW9uKSB7XG4gICAgbWFwcGVkLnN1YnNjcmlwdGlvbkFjdGlvbnMgPSBhY3Rpb25zLnN1YnNjcmlwdGlvbjtcbiAgfVxuICBpZiAoYWN0aW9ucy50YWcpIHtcbiAgICBtYXBwZWQudGFnQWN0aW9ucyA9IGFjdGlvbnMudGFnO1xuICB9XG4gIGlmIChhY3Rpb25zLnRyYW5zbGF0aW9uKSB7XG4gICAgbWFwcGVkLnRyYW5zbGF0aW9uQWN0aW9ucyA9IGFjdGlvbnMudHJhbnNsYXRpb247XG4gIH1cbiAgaWYgKGFjdGlvbnMudXNlcikge1xuICAgIG1hcHBlZC51c2VyQWN0aW9ucyA9IGFjdGlvbnMudXNlcjtcbiAgfVxuICBpZiAoYWN0aW9ucy52aWRlbykge1xuICAgIG1hcHBlZC52aWRlb0FjdGlvbnMgPSBhY3Rpb25zLnZpZGVvO1xuICB9XG4gIGlmIChhY3Rpb25zLndlYnNvY2tldCkge1xuICAgIG1hcHBlZC53ZWJzb2NrZXRBY3Rpb25zID0gYWN0aW9ucy53ZWJzb2NrZXQ7XG4gIH1cblxuICByZXR1cm4gbWFwcGVkO1xufTtcblxuLyoqXG4gKiBNYWluIGhvb2sgdG8gYWNjZXNzIE1ldHJvcG9saXMgYWN0aW9ucy5cbiAqXG4gKiBAcGFyYW0gYWN0aW9uVHlwZXMgLSBPcHRpb25hbCBhcnJheSBvZiBhY3Rpb24gdHlwZXMgdG8gY3JlYXRlLiBJZiBub3QgcHJvdmlkZWQsIGNyZWF0ZXMgYWxsIGFjdGlvbnMuXG4gKiBAcmV0dXJucyBPYmplY3QgY29udGFpbmluZyB0aGUgcmVxdWVzdGVkIGFjdGlvbnNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiAvLyBHZXQgYWxsIGFjdGlvbnMgKGRlZmF1bHQgYmVoYXZpb3IpXG4gKiBjb25zdCB7dXNlckFjdGlvbnMsIHBvc3RBY3Rpb25zfSA9IHVzZU1ldHJvcG9saXMoKTtcbiAqXG4gKiAvLyBHZXQgb25seSBzcGVjaWZpYyBhY3Rpb25zIChtb3JlIHBlcmZvcm1hbnQpXG4gKiBjb25zdCB7dXNlckFjdGlvbnN9ID0gdXNlTWV0cm9wb2xpcyhbJ3VzZXInXSk7XG4gKiBjb25zdCB7dXNlckFjdGlvbnMsIHBvc3RBY3Rpb25zfSA9IHVzZU1ldHJvcG9saXMoWyd1c2VyJywgJ3Bvc3QnXSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IHVzZU1ldHJvcG9saXMgPSA8VCBleHRlbmRzIEFjdGlvblR5cGVbXSA9IEFjdGlvblR5cGVbXT4oXG4gIGFjdGlvblR5cGVzPzogVFxuKSA9PiB7XG4gIGNvbnN0IGNvbnRleHQgPSB1c2VDb250ZXh0KE1ldHJvcG9saXNDb250ZXh0KTtcbiAgLy8gVXNlIGZsdXggZnJvbSBjb250ZXh0IGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhbGwgYmFjayB0byB1c2VGbHV4KCkgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgY29uc3QgY29udGV4dEZsdXggPSBjb250ZXh0Py5mbHV4O1xuICBjb25zdCBob29rRmx1eCA9IHVzZUZsdXgoKTtcbiAgY29uc3QgZmx1eCA9IGNvbnRleHRGbHV4IHx8IGhvb2tGbHV4O1xuXG4gIGNvbnN0IHthZGFwdGVyc30gPSBjb250ZXh0O1xuICBjb25zdCBhY3Rpb25PcHRpb25zID0gdXNlTWVtbygoKSA9PiBidWlsZEFjdGlvbk9wdGlvbnMoYWRhcHRlcnMpLCBbYWRhcHRlcnNdKTtcblxuICByZXR1cm4gdXNlTWVtbygoKSA9PiB7XG4gICAgbGV0IGFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT47XG5cbiAgICBpZiAoYWN0aW9uVHlwZXMgJiYgYWN0aW9uVHlwZXMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gQ3JlYXRlIG9ubHkgcmVxdWVzdGVkIGFjdGlvbnNcbiAgICAgIGFjdGlvbnMgPSBjcmVhdGVBY3Rpb25zKGFjdGlvblR5cGVzLCBmbHV4LCBhY3Rpb25PcHRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ3JlYXRlIGFsbCBhY3Rpb25zIChkZWZhdWx0IGJlaGF2aW9yIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KVxuICAgICAgY29uc3QgYWxsQWN0aW9ucyA9IGNyZWF0ZUFsbEFjdGlvbnMoZmx1eCwgYWN0aW9uT3B0aW9ucyk7XG4gICAgICBhY3Rpb25zID0gYWxsQWN0aW9ucztcbiAgICB9XG5cbiAgICAvLyBNYXAgdG8gcmV0dXJuIGtleXMgKGNvbnRlbnRBY3Rpb25zLCB1c2VyQWN0aW9ucywgZXRjLilcbiAgICByZXR1cm4gbWFwQWN0aW9uc1RvUmV0dXJuS2V5cyhhY3Rpb25zKTtcbiAgfSwgW2ZsdXgsIGFjdGlvbk9wdGlvbnMsIGFjdGlvblR5cGVzPy5qb2luKCcsJyldKTtcbn07XG5cbi8qKlxuICogSG9vayB0byBhY2Nlc3MgdGhlIE1ldHJvcG9saXMgY29uZmlndXJhdGlvbiBmcm9tIGNvbnRleHQuXG4gKlxuICogQHJldHVybnMgVGhlIHJlc29sdmVkIGVudmlyb25tZW50LXNwZWNpZmljIGNvbmZpZ3VyYXRpb25cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdXNlZCBvdXRzaWRlIG9mIE1ldHJvcG9saXMgY29tcG9uZW50XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogY29uc3QgY29uZmlnID0gdXNlTWV0cm9wb2xpc0NvbmZpZygpO1xuICogY29uc3QgYXBpVXJsID0gY29uZmlnLmFwcD8uYXBpPy51cmw7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IHVzZU1ldHJvcG9saXNDb25maWcgPSAoKTogTWV0cm9wb2xpc0Vudmlyb25tZW50Q29uZmlndXJhdGlvbiA9PiB7XG4gIGNvbnN0IGNvbnRleHQgPSB1c2VDb250ZXh0KE1ldHJvcG9saXNDb250ZXh0KTtcblxuICBpZiAoIWNvbnRleHQ/LmNvbmZpZykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICd1c2VNZXRyb3BvbGlzQ29uZmlnIG11c3QgYmUgdXNlZCB3aXRoaW4gYSBNZXRyb3BvbGlzIGNvbXBvbmVudC4gJyArXG4gICAgICAnTWFrZSBzdXJlIHlvdXIgY29tcG9uZW50IGlzIHdyYXBwZWQgd2l0aCA8TWV0cm9wb2xpcz4gcHJvdmlkZXIuJ1xuICAgICk7XG4gIH1cblxuICByZXR1cm4gY29udGV4dC5jb25maWc7XG59O1xuXG4vKipcbiAqIEhvb2sgdG8gYWNjZXNzIHRoZSBGbHV4IGZyYW1ld29yayBpbnN0YW5jZSBmcm9tIGNvbnRleHQuXG4gKlxuICogQHJldHVybnMgVGhlIEZsdXggZnJhbWV3b3JrIGluc3RhbmNlXG4gKiBAdGhyb3dzIEVycm9yIGlmIHVzZWQgb3V0c2lkZSBvZiBNZXRyb3BvbGlzIGNvbXBvbmVudCBhbmQgbm8gRmx1eCBhdmFpbGFibGVcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBjb25zdCBmbHV4ID0gdXNlTWV0cm9wb2xpc0ZsdXgoKTtcbiAqIGNvbnN0IHN0YXRlID0gZmx1eC5nZXRTdGF0ZSgndXNlci5zZXNzaW9uJyk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IHVzZU1ldHJvcG9saXNGbHV4ID0gKCk6IEZsdXhGcmFtZXdvcmsgPT4ge1xuICBjb25zdCBjb250ZXh0ID0gdXNlQ29udGV4dChNZXRyb3BvbGlzQ29udGV4dCk7XG4gIGNvbnN0IGhvb2tGbHV4ID0gdXNlRmx1eCgpO1xuXG4gIC8vIFVzZSBmbHV4IGZyb20gY29udGV4dCBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gdXNlRmx1eCgpIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gIHJldHVybiBjb250ZXh0Py5mbHV4IHx8IGhvb2tGbHV4O1xufTtcblxuLyoqXG4gKiBTcGVjaWFsaXplZCBob29rcyBmb3IgaW5kaXZpZHVhbCBhY3Rpb24gdHlwZXMuXG4gKiBUaGVzZSBob29rcyBvbmx5IGNyZWF0ZSB0aGUgc3BlY2lmaWMgYWN0aW9uIHR5cGUsIGltcHJvdmluZyBwZXJmb3JtYW5jZS5cbiAqL1xuXG5leHBvcnQgY29uc3QgdXNlQ29udGVudEFjdGlvbnMgPSAoKSA9PiB7XG4gIGNvbnN0IHtjb250ZW50QWN0aW9uc30gPSB1c2VNZXRyb3BvbGlzKFsnY29udGVudCddKTtcbiAgcmV0dXJuIGNvbnRlbnRBY3Rpb25zO1xufTtcblxuZXhwb3J0IGNvbnN0IHVzZUV2ZW50QWN0aW9ucyA9ICgpID0+IHtcbiAgY29uc3Qge2V2ZW50QWN0aW9uc30gPSB1c2VNZXRyb3BvbGlzKFsnZXZlbnQnXSk7XG4gIHJldHVybiBldmVudEFjdGlvbnM7XG59O1xuXG5leHBvcnQgY29uc3QgdXNlR3JvdXBBY3Rpb25zID0gKCkgPT4ge1xuICBjb25zdCB7Z3JvdXBBY3Rpb25zfSA9IHVzZU1ldHJvcG9saXMoWydncm91cCddKTtcbiAgcmV0dXJuIGdyb3VwQWN0aW9ucztcbn07XG5cbmV4cG9ydCBjb25zdCB1c2VJbWFnZUFjdGlvbnMgPSAoKSA9PiB7XG4gIGNvbnN0IHtpbWFnZUFjdGlvbnN9ID0gdXNlTWV0cm9wb2xpcyhbJ2ltYWdlJ10pO1xuICByZXR1cm4gaW1hZ2VBY3Rpb25zO1xufTtcblxuZXhwb3J0IGNvbnN0IHVzZUxvY2F0aW9uQWN0aW9ucyA9ICgpID0+IHtcbiAgY29uc3Qge2xvY2F0aW9uQWN0aW9uc30gPSB1c2VNZXRyb3BvbGlzKFsnbG9jYXRpb24nXSk7XG4gIHJldHVybiBsb2NhdGlvbkFjdGlvbnM7XG59O1xuXG5leHBvcnQgY29uc3QgdXNlTWVzc2FnZUFjdGlvbnMgPSAoKSA9PiB7XG4gIGNvbnN0IHttZXNzYWdlQWN0aW9uc30gPSB1c2VNZXRyb3BvbGlzKFsnbWVzc2FnZSddKTtcbiAgcmV0dXJuIG1lc3NhZ2VBY3Rpb25zO1xufTtcblxuZXhwb3J0IGNvbnN0IHVzZVN1YnNjcmlwdGlvbkFjdGlvbnMgPSAoKSA9PiB7XG4gIGNvbnN0IHtzdWJzY3JpcHRpb25BY3Rpb25zfSA9IHVzZU1ldHJvcG9saXMoWydzdWJzY3JpcHRpb24nXSk7XG4gIHJldHVybiBzdWJzY3JpcHRpb25BY3Rpb25zO1xufTtcblxuZXhwb3J0IGNvbnN0IHVzZVBlcm1pc3Npb25BY3Rpb25zID0gKCkgPT4ge1xuICBjb25zdCB7cGVybWlzc2lvbkFjdGlvbnN9ID0gdXNlTWV0cm9wb2xpcyhbJ3Blcm1pc3Npb24nXSk7XG4gIHJldHVybiBwZXJtaXNzaW9uQWN0aW9ucztcbn07XG5cbmV4cG9ydCBjb25zdCB1c2VQb3N0QWN0aW9ucyA9ICgpID0+IHtcbiAgY29uc3Qge3Bvc3RBY3Rpb25zfSA9IHVzZU1ldHJvcG9saXMoWydwb3N0J10pO1xuICByZXR1cm4gcG9zdEFjdGlvbnM7XG59O1xuXG5leHBvcnQgY29uc3QgdXNlUGVyc29uYUFjdGlvbnMgPSAoKSA9PiB7XG4gIGNvbnN0IHtwZXJzb25hQWN0aW9uc30gPSB1c2VNZXRyb3BvbGlzKFsncGVyc29uYSddKTtcbiAgcmV0dXJuIHBlcnNvbmFBY3Rpb25zO1xufTtcblxuZXhwb3J0IGNvbnN0IHVzZVJlYWN0aW9uQWN0aW9ucyA9ICgpID0+IHtcbiAgY29uc3Qge3JlYWN0aW9uQWN0aW9uc30gPSB1c2VNZXRyb3BvbGlzKFsncmVhY3Rpb24nXSk7XG4gIHJldHVybiByZWFjdGlvbkFjdGlvbnM7XG59O1xuXG5leHBvcnQgY29uc3QgdXNlVGFnQWN0aW9ucyA9ICgpID0+IHtcbiAgY29uc3Qge3RhZ0FjdGlvbnN9ID0gdXNlTWV0cm9wb2xpcyhbJ3RhZyddKTtcbiAgcmV0dXJuIHRhZ0FjdGlvbnM7XG59O1xuXG5leHBvcnQgY29uc3QgdXNlVmlkZW9BY3Rpb25zID0gKCkgPT4ge1xuICBjb25zdCB7dmlkZW9BY3Rpb25zfSA9IHVzZU1ldHJvcG9saXMoWyd2aWRlbyddKTtcbiAgcmV0dXJuIHZpZGVvQWN0aW9ucztcbn07XG5cbmV4cG9ydCBjb25zdCB1c2VUcmFuc2xhdGlvbkFjdGlvbnMgPSAoKSA9PiB7XG4gIGNvbnN0IHt0cmFuc2xhdGlvbkFjdGlvbnN9ID0gdXNlTWV0cm9wb2xpcyhbJ3RyYW5zbGF0aW9uJ10pO1xuICByZXR1cm4gdHJhbnNsYXRpb25BY3Rpb25zO1xufTtcblxuZXhwb3J0IGNvbnN0IHVzZVVzZXJBY3Rpb25zID0gKCkgPT4ge1xuICBjb25zdCB7dXNlckFjdGlvbnN9ID0gdXNlTWV0cm9wb2xpcyhbJ3VzZXInXSk7XG4gIHJldHVybiB1c2VyQWN0aW9ucztcbn07XG5cbmV4cG9ydCBjb25zdCB1c2VXZWJzb2NrZXRBY3Rpb25zID0gKCkgPT4ge1xuICBjb25zdCB7d2Vic29ja2V0QWN0aW9uc30gPSB1c2VNZXRyb3BvbGlzKFsnd2Vic29ja2V0J10pO1xuICByZXR1cm4gd2Vic29ja2V0QWN0aW9ucztcbn07XG4iXSwibmFtZXMiOlsidXNlRmx1eCIsInVzZUNvbnRleHQiLCJ1c2VNZW1vIiwiY3JlYXRlQWN0aW9ucyIsImNyZWF0ZUFsbEFjdGlvbnMiLCJNZXRyb3BvbGlzQ29udGV4dCIsImJ1aWxkQWN0aW9uT3B0aW9ucyIsImFkYXB0ZXJzIiwib3B0aW9ucyIsIkNvbnRlbnQiLCJjb250ZW50IiwiY29udGVudEFkYXB0ZXIiLCJFdmVudCIsImV2ZW50IiwiZXZlbnRBZGFwdGVyIiwiSW1hZ2UiLCJpbWFnZSIsImltYWdlQWRhcHRlciIsIkxvY2F0aW9uIiwibG9jYXRpb24iLCJsb2NhdGlvbkFkYXB0ZXIiLCJNZXNzYWdlIiwibWVzc2FnZSIsIm1lc3NhZ2VBZGFwdGVyIiwiUGVybWlzc2lvbiIsInBlcm1pc3Npb24iLCJwZXJtaXNzaW9uQWRhcHRlciIsIlBvc3QiLCJwb3N0IiwicG9zdEFkYXB0ZXIiLCJQZXJzb25hIiwicGVyc29uYSIsInBlcnNvbmFBZGFwdGVyIiwiUmVhY3Rpb24iLCJyZWFjdGlvbiIsInJlYWN0aW9uQWRhcHRlciIsIlRhZyIsInRhZyIsInRhZ0FkYXB0ZXIiLCJUcmFuc2xhdGlvbiIsInRyYW5zbGF0aW9uIiwidHJhbnNsYXRpb25BZGFwdGVyIiwiVXNlciIsInVzZXIiLCJ1c2VyQWRhcHRlciIsIlZpZGVvIiwidmlkZW8iLCJ2aWRlb0FkYXB0ZXIiLCJtYXBBY3Rpb25zVG9SZXR1cm5LZXlzIiwiYWN0aW9ucyIsIm1hcHBlZCIsImNvbnRlbnRBY3Rpb25zIiwiZXZlbnRBY3Rpb25zIiwiZ3JvdXAiLCJncm91cEFjdGlvbnMiLCJpbWFnZUFjdGlvbnMiLCJsb2NhdGlvbkFjdGlvbnMiLCJtZXNzYWdlQWN0aW9ucyIsInBlcm1pc3Npb25BY3Rpb25zIiwicG9zdEFjdGlvbnMiLCJwZXJzb25hQWN0aW9ucyIsInJlYWN0aW9uQWN0aW9ucyIsInN1YnNjcmlwdGlvbiIsInN1YnNjcmlwdGlvbkFjdGlvbnMiLCJ0YWdBY3Rpb25zIiwidHJhbnNsYXRpb25BY3Rpb25zIiwidXNlckFjdGlvbnMiLCJ2aWRlb0FjdGlvbnMiLCJ3ZWJzb2NrZXQiLCJ3ZWJzb2NrZXRBY3Rpb25zIiwidXNlTWV0cm9wb2xpcyIsImFjdGlvblR5cGVzIiwiY29udGV4dCIsImNvbnRleHRGbHV4IiwiZmx1eCIsImhvb2tGbHV4IiwiYWN0aW9uT3B0aW9ucyIsImxlbmd0aCIsImFsbEFjdGlvbnMiLCJqb2luIiwidXNlTWV0cm9wb2xpc0NvbmZpZyIsImNvbmZpZyIsIkVycm9yIiwidXNlTWV0cm9wb2xpc0ZsdXgiLCJ1c2VDb250ZW50QWN0aW9ucyIsInVzZUV2ZW50QWN0aW9ucyIsInVzZUdyb3VwQWN0aW9ucyIsInVzZUltYWdlQWN0aW9ucyIsInVzZUxvY2F0aW9uQWN0aW9ucyIsInVzZU1lc3NhZ2VBY3Rpb25zIiwidXNlU3Vic2NyaXB0aW9uQWN0aW9ucyIsInVzZVBlcm1pc3Npb25BY3Rpb25zIiwidXNlUG9zdEFjdGlvbnMiLCJ1c2VQZXJzb25hQWN0aW9ucyIsInVzZVJlYWN0aW9uQWN0aW9ucyIsInVzZVRhZ0FjdGlvbnMiLCJ1c2VWaWRlb0FjdGlvbnMiLCJ1c2VUcmFuc2xhdGlvbkFjdGlvbnMiLCJ1c2VVc2VyQWN0aW9ucyIsInVzZVdlYnNvY2tldEFjdGlvbnMiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVFBLE9BQU8sUUFBTyw4QkFBOEI7QUFDcEQsU0FBUUMsVUFBVSxFQUFFQyxPQUFPLFFBQU8sUUFBUTtBQUkxQyxTQUFRQyxhQUFhLEVBQUVDLGdCQUFnQixRQUFPLDRCQUE0QjtBQUUxRSxTQUFRQyxpQkFBaUIsUUFBTywwQkFBMEI7QUFHMUQ7O0NBRUMsR0FDRCxNQUFNQyxxQkFBcUIsQ0FDekJDO0lBRUEsSUFBSSxDQUFDQSxVQUFVO1FBQ2IsT0FBTyxDQUFDO0lBQ1Y7SUFFQSxNQUFNQyxVQUFzRCxDQUFDO0lBRTdELElBQUlELFNBQVNFLE9BQU8sRUFBRTtRQUNwQkQsUUFBUUUsT0FBTyxHQUFHO1lBQUNDLGdCQUFnQkosU0FBU0UsT0FBTztRQUFBO0lBQ3JEO0lBQ0EsSUFBSUYsU0FBU0ssS0FBSyxFQUFFO1FBQ2xCSixRQUFRSyxLQUFLLEdBQUc7WUFBQ0MsY0FBY1AsU0FBU0ssS0FBSztRQUFBO0lBQy9DO0lBQ0EsSUFBSUwsU0FBU1EsS0FBSyxFQUFFO1FBQ2xCUCxRQUFRUSxLQUFLLEdBQUc7WUFBQ0MsY0FBY1YsU0FBU1EsS0FBSztRQUFBO0lBQy9DO0lBQ0EsSUFBSVIsU0FBU1csUUFBUSxFQUFFO1FBQ3JCVixRQUFRVyxRQUFRLEdBQUc7WUFBQ0MsaUJBQWlCYixTQUFTVyxRQUFRO1FBQUE7SUFDeEQ7SUFDQSxJQUFJWCxTQUFTYyxPQUFPLEVBQUU7UUFDcEJiLFFBQVFjLE9BQU8sR0FBRztZQUFDQyxnQkFBZ0JoQixTQUFTYyxPQUFPO1FBQUE7SUFDckQ7SUFDQSxJQUFJZCxTQUFTaUIs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
@@ -0,0 +1,16 @@
1
+ export interface UseTranslationsOptions {
2
+ readonly locale?: string;
3
+ readonly namespace?: string;
4
+ readonly autoProcess?: boolean;
5
+ readonly processInterval?: number;
6
+ }
7
+ export interface UseTranslationsReturn {
8
+ readonly t: (key: string, fallback?: string) => string;
9
+ readonly hasTranslation: (key: string) => boolean;
10
+ readonly queueTranslation: (key: string) => void;
11
+ readonly processPending: () => Promise<void>;
12
+ readonly isLoading: boolean;
13
+ readonly error: Error | null;
14
+ }
15
+ export declare const useTranslations: (options?: UseTranslationsOptions) => UseTranslationsReturn;
16
+ //# sourceMappingURL=useTranslations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTranslations.d.ts","sourceRoot":"","sources":["../../src/utils/useTranslations.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACvD,QAAQ,CAAC,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IAClD,QAAQ,CAAC,gBAAgB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,QAAQ,CAAC,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CAC9B;AAED,eAAO,MAAM,eAAe,GAAI,UAAS,sBAA2B,KAAG,qBA+FtE,CAAC"}
@@ -0,0 +1,105 @@
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 { useCallback, useEffect, useMemo, useRef } from 'react';
5
+ import { useMetropolis } from './useMetropolis.js';
6
+ export const useTranslations = (options = {})=>{
7
+ const { locale = 'en', namespace, autoProcess = true, processInterval = 1000 } = options;
8
+ const { translationActions } = useMetropolis();
9
+ const processTimeoutRef = useRef(null);
10
+ const lastProcessRef = useRef(0);
11
+ const t = useCallback((key, fallback)=>{
12
+ if (!translationActions) {
13
+ return fallback || key;
14
+ }
15
+ const translation = translationActions.getTranslation(key, locale, namespace);
16
+ if (translation) {
17
+ return translation;
18
+ }
19
+ if (autoProcess && !translationActions.hasTranslation(key, locale, namespace)) {
20
+ translationActions.queueTranslationKey(key, locale, namespace);
21
+ }
22
+ return fallback || key;
23
+ }, [
24
+ translationActions,
25
+ locale,
26
+ namespace,
27
+ autoProcess
28
+ ]);
29
+ const hasTranslation = useCallback((key)=>{
30
+ if (!translationActions) {
31
+ return false;
32
+ }
33
+ return translationActions.hasTranslation(key, locale, namespace);
34
+ }, [
35
+ translationActions,
36
+ locale,
37
+ namespace
38
+ ]);
39
+ const queueTranslation = useCallback((key)=>{
40
+ if (!translationActions) return;
41
+ translationActions.queueTranslationKey(key, locale, namespace);
42
+ }, [
43
+ translationActions,
44
+ locale,
45
+ namespace
46
+ ]);
47
+ const processPending = useCallback(async ()=>{
48
+ if (!translationActions) return;
49
+ const now = Date.now();
50
+ if (now - lastProcessRef.current < processInterval) {
51
+ return;
52
+ }
53
+ lastProcessRef.current = now;
54
+ await translationActions.processPendingTranslations(locale, namespace);
55
+ }, [
56
+ translationActions,
57
+ locale,
58
+ namespace,
59
+ processInterval
60
+ ]);
61
+ useEffect(()=>{
62
+ if (!autoProcess || !translationActions) return;
63
+ const processQueued = ()=>{
64
+ processPending();
65
+ };
66
+ if (processTimeoutRef.current) {
67
+ clearTimeout(processTimeoutRef.current);
68
+ }
69
+ processTimeoutRef.current = setTimeout(processQueued, processInterval);
70
+ return ()=>{
71
+ if (processTimeoutRef.current) {
72
+ clearTimeout(processTimeoutRef.current);
73
+ }
74
+ };
75
+ }, [
76
+ autoProcess,
77
+ translationActions,
78
+ processPending,
79
+ processInterval
80
+ ]);
81
+ const isLoading = useMemo(()=>{
82
+ if (!translationActions) return false;
83
+ const state = translationActions.flux?.getState('translations');
84
+ return state?.isQueueing || false;
85
+ }, [
86
+ translationActions
87
+ ]);
88
+ const error = useMemo(()=>{
89
+ if (!translationActions) return null;
90
+ const state = translationActions.flux?.getState('translations');
91
+ return state?.error || null;
92
+ }, [
93
+ translationActions
94
+ ]);
95
+ return {
96
+ t,
97
+ hasTranslation,
98
+ queueTranslation,
99
+ processPending,
100
+ isLoading,
101
+ error
102
+ };
103
+ };
104
+
105
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L21ldHJvcG9saXNqcy9zcmMvdXRpbHMvdXNlVHJhbnNsYXRpb25zLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDI1LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VNZW1vLCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCB7IHVzZU1ldHJvcG9saXMgfSBmcm9tICcuL3VzZU1ldHJvcG9saXMuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVzZVRyYW5zbGF0aW9uc09wdGlvbnMge1xuICByZWFkb25seSBsb2NhbGU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG5hbWVzcGFjZT86IHN0cmluZztcbiAgcmVhZG9ubHkgYXV0b1Byb2Nlc3M/OiBib29sZWFuO1xuICByZWFkb25seSBwcm9jZXNzSW50ZXJ2YWw/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlVHJhbnNsYXRpb25zUmV0dXJuIHtcbiAgcmVhZG9ubHkgdDogKGtleTogc3RyaW5nLCBmYWxsYmFjaz86IHN0cmluZykgPT4gc3RyaW5nO1xuICByZWFkb25seSBoYXNUcmFuc2xhdGlvbjogKGtleTogc3RyaW5nKSA9PiBib29sZWFuO1xuICByZWFkb25seSBxdWV1ZVRyYW5zbGF0aW9uOiAoa2V5OiBzdHJpbmcpID0+IHZvaWQ7XG4gIHJlYWRvbmx5IHByb2Nlc3NQZW5kaW5nOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICByZWFkb25seSBpc0xvYWRpbmc6IGJvb2xlYW47XG4gIHJlYWRvbmx5IGVycm9yOiBFcnJvciB8IG51bGw7XG59XG5cbmV4cG9ydCBjb25zdCB1c2VUcmFuc2xhdGlvbnMgPSAob3B0aW9uczogVXNlVHJhbnNsYXRpb25zT3B0aW9ucyA9IHt9KTogVXNlVHJhbnNsYXRpb25zUmV0dXJuID0+IHtcbiAgY29uc3Qge1xuICAgIGxvY2FsZSA9ICdlbicsXG4gICAgbmFtZXNwYWNlLFxuICAgIGF1dG9Qcm9jZXNzID0gdHJ1ZSxcbiAgICBwcm9jZXNzSW50ZXJ2YWwgPSAxMDAwXG4gIH0gPSBvcHRpb25zO1xuXG4gIGNvbnN0IHt0cmFuc2xhdGlvbkFjdGlvbnN9ID0gdXNlTWV0cm9wb2xpcygpO1xuICBjb25zdCBwcm9jZXNzVGltZW91dFJlZiA9IHVzZVJlZjxOb2RlSlMuVGltZW91dCB8IG51bGw+KG51bGwpO1xuICBjb25zdCBsYXN0UHJvY2Vzc1JlZiA9IHVzZVJlZjxudW1iZXI+KDApO1xuXG4gIGNvbnN0IHQgPSB1c2VDYWxsYmFjaygoa2V5OiBzdHJpbmcsIGZhbGxiYWNrPzogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICBpZiAoIXRyYW5zbGF0aW9uQWN0aW9ucykge1xuICAgICAgcmV0dXJuIGZhbGxiYWNrIHx8IGtleTtcbiAgICB9XG5cbiAgICBjb25zdCB0cmFuc2xhdGlvbiA9IHRyYW5zbGF0aW9uQWN0aW9ucy5nZXRUcmFuc2xhdGlvbihrZXksIGxvY2FsZSwgbmFtZXNwYWNlKTtcblxuICAgIGlmICh0cmFuc2xhdGlvbikge1xuICAgICAgcmV0dXJuIHRyYW5zbGF0aW9uO1xuICAgIH1cblxuICAgIGlmIChhdXRvUHJvY2VzcyAmJiAhdHJhbnNsYXRpb25BY3Rpb25zLmhhc1RyYW5zbGF0aW9uKGtleSwgbG9jYWxlLCBuYW1lc3BhY2UpKSB7XG4gICAgICB0cmFuc2xhdGlvbkFjdGlvbnMucXVldWVUcmFuc2xhdGlvbktleShrZXksIGxvY2FsZSwgbmFtZXNwYWNlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsbGJhY2sgfHwga2V5O1xuICB9LCBbdHJhbnNsYXRpb25BY3Rpb25zLCBsb2NhbGUsIG5hbWVzcGFjZSwgYXV0b1Byb2Nlc3NdKTtcblxuICBjb25zdCBoYXNUcmFuc2xhdGlvbiA9IHVzZUNhbGxiYWNrKChrZXk6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICAgIGlmICghdHJhbnNsYXRpb25BY3Rpb25zKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyYW5zbGF0aW9uQWN0aW9ucy5oYXNUcmFuc2xhdGlvbihrZXksIGxvY2FsZSwgbmFtZXNwYWNlKTtcbiAgfSwgW3RyYW5zbGF0aW9uQWN0aW9ucywgbG9jYWxlLCBuYW1lc3BhY2VdKTtcblxuICBjb25zdCBxdWV1ZVRyYW5zbGF0aW9uID0gdXNlQ2FsbGJhY2soKGtleTogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgaWYgKCF0cmFuc2xhdGlvbkFjdGlvbnMpIHJldHVybjtcbiAgICB0cmFuc2xhdGlvbkFjdGlvbnMucXVldWVUcmFuc2xhdGlvbktleShrZXksIGxvY2FsZSwgbmFtZXNwYWNlKTtcbiAgfSwgW3RyYW5zbGF0aW9uQWN0aW9ucywgbG9jYWxlLCBuYW1lc3BhY2VdKTtcblxuICBjb25zdCBwcm9jZXNzUGVuZGluZyA9IHVzZUNhbGxiYWNrKGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAoIXRyYW5zbGF0aW9uQWN0aW9ucykgcmV0dXJuO1xuXG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBpZiAobm93IC0gbGFzdFByb2Nlc3NSZWYuY3VycmVudCA8IHByb2Nlc3NJbnRlcnZhbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxhc3RQcm9jZXNzUmVmLmN1cnJlbnQgPSBub3c7XG4gICAgYXdhaXQgdHJhbnNsYXRpb25BY3Rpb25zLnByb2Nlc3NQZW5kaW5nVHJhbnNsYXRpb25zKGxvY2FsZSwgbmFtZXNwYWNlKTtcbiAgfSwgW3RyYW5zbGF0aW9uQWN0aW9ucywgbG9jYWxlLCBuYW1lc3BhY2UsIHByb2Nlc3NJbnRlcnZhbF0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFhdXRvUHJvY2VzcyB8fCAhdHJhbnNsYXRpb25BY3Rpb25zKSByZXR1cm47XG5cbiAgICBjb25zdCBwcm9jZXNzUXVldWVkID0gKCkgPT4ge1xuICAgICAgcHJvY2Vzc1BlbmRpbmcoKTtcbiAgICB9O1xuXG4gICAgaWYgKHByb2Nlc3NUaW1lb3V0UmVmLmN1cnJlbnQpIHtcbiAgICAgIGNsZWFyVGltZW91dChwcm9jZXNzVGltZW91dFJlZi5jdXJyZW50KTtcbiAgICB9XG5cbiAgICBwcm9jZXNzVGltZW91dFJlZi5jdXJyZW50ID0gc2V0VGltZW91dChwcm9jZXNzUXVldWVkLCBwcm9jZXNzSW50ZXJ2YWwpO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGlmIChwcm9jZXNzVGltZW91dFJlZi5jdXJyZW50KSB7XG4gICAgICAgIGNsZWFyVGltZW91dChwcm9jZXNzVGltZW91dFJlZi5jdXJyZW50KTtcbiAgICAgIH1cbiAgICB9O1xuICB9LCBbYXV0b1Byb2Nlc3MsIHRyYW5zbGF0aW9uQWN0aW9ucywgcHJvY2Vzc1BlbmRpbmcsIHByb2Nlc3NJbnRlcnZhbF0pO1xuXG4gIGNvbnN0IGlzTG9hZGluZyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmICghdHJhbnNsYXRpb25BY3Rpb25zKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3Qgc3RhdGUgPSAodHJhbnNsYXRpb25BY3Rpb25zIGFzIGFueSkuZmx1eD8uZ2V0U3RhdGUoJ3RyYW5zbGF0aW9ucycpO1xuICAgIHJldHVybiBzdGF0ZT8uaXNRdWV1ZWluZyB8fCBmYWxzZTtcbiAgfSwgW3RyYW5zbGF0aW9uQWN0aW9uc10pO1xuXG4gIGNvbnN0IGVycm9yID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKCF0cmFuc2xhdGlvbkFjdGlvbnMpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHN0YXRlID0gKHRyYW5zbGF0aW9uQWN0aW9ucyBhcyBhbnkpLmZsdXg/LmdldFN0YXRlKCd0cmFuc2xhdGlvbnMnKTtcbiAgICByZXR1cm4gc3RhdGU/LmVycm9yIHx8IG51bGw7XG4gIH0sIFt0cmFuc2xhdGlvbkFjdGlvbnNdKTtcblxuICByZXR1cm4ge1xuICAgIHQsXG4gICAgaGFzVHJhbnNsYXRpb24sXG4gICAgcXVldWVUcmFuc2xhdGlvbixcbiAgICBwcm9jZXNzUGVuZGluZyxcbiAgICBpc0xvYWRpbmcsXG4gICAgZXJyb3JcbiAgfTtcbn07Il0sIm5hbWVzIjpbInVzZUNhbGxiYWNrIiwidXNlRWZmZWN0IiwidXNlTWVtbyIsInVzZVJlZiIsInVzZU1ldHJvcG9saXMiLCJ1c2VUcmFuc2xhdGlvbnMiLCJvcHRpb25zIiwibG9jYWxlIiwibmFtZXNwYWNlIiwiYXV0b1Byb2Nlc3MiLCJwcm9jZXNzSW50ZXJ2YWwiLCJ0cmFuc2xhdGlvbkFjdGlvbnMiLCJwcm9jZXNzVGltZW91dFJlZiIsImxhc3RQcm9jZXNzUmVmIiwidCIsImtleSIsImZhbGxiYWNrIiwidHJhbnNsYXRpb24iLCJnZXRUcmFuc2xhdGlvbiIsImhhc1RyYW5zbGF0aW9uIiwicXVldWVUcmFuc2xhdGlvbktleSIsInF1ZXVlVHJhbnNsYXRpb24iLCJwcm9jZXNzUGVuZGluZyIsIm5vdyIsIkRhdGUiLCJjdXJyZW50IiwicHJvY2Vzc1BlbmRpbmdUcmFuc2xhdGlvbnMiLCJwcm9jZXNzUXVldWVkIiwiY2xlYXJUaW1lb3V0Iiwic2V0VGltZW91dCIsImlzTG9hZGluZyIsInN0YXRlIiwiZmx1eCIsImdldFN0YXRlIiwiaXNRdWV1ZWluZyIsImVycm9yIl0sIm1hcHBpbmdzIjoiQUFBQTs7O0NBR0MsR0FDRCxTQUFTQSxXQUFXLEVBQUVDLFNBQVMsRUFBRUMsT0FBTyxFQUFFQyxNQUFNLFFBQVEsUUFBUTtBQUVoRSxTQUFTQyxhQUFhLFFBQVEscUJBQXFCO0FBa0JuRCxPQUFPLE1BQU1DLGtCQUFrQixDQUFDQyxVQUFrQyxDQUFDLENBQUM7SUFDbEUsTUFBTSxFQUNKQyxTQUFTLElBQUksRUFDYkMsU0FBUyxFQUNUQyxjQUFjLElBQUksRUFDbEJDLGtCQUFrQixJQUFJLEVBQ3ZCLEdBQUdKO0lBRUosTUFBTSxFQUFDSyxrQkFBa0IsRUFBQyxHQUFHUDtJQUM3QixNQUFNUSxvQkFBb0JULE9BQThCO0lBQ3hELE1BQU1VLGlCQUFpQlYsT0FBZTtJQUV0QyxNQUFNVyxJQUFJZCxZQUFZLENBQUNlLEtBQWFDO1FBQ2xDLElBQUksQ0FBQ0wsb0JBQW9CO1lBQ3ZCLE9BQU9LLFlBQVlEO1FBQ3JCO1FBRUEsTUFBTUUsY0FBY04sbUJBQW1CTyxjQUFjLENBQUNILEtBQUtSLFFBQVFDO1FBRW5FLElBQUlTLGFBQWE7WUFDZixPQUFPQTtRQUNUO1FBRUEsSUFBSVIsZUFBZSxDQUFDRSxtQkFBbUJRLGNBQWMsQ0FBQ0osS0FBS1IsUUFBUUMsWUFBWTtZQUM3RUcsbUJBQW1CUyxtQkFBbUIsQ0FBQ0wsS0FBS1IsUUFBUUM7UUFDdEQ7UUFFQSxPQUFPUSxZQUFZRDtJQUNyQixHQUFHO1FBQUNKO1FBQW9CSjtRQUFRQztRQUFXQztLQUFZO0lBRXZELE1BQU1VLGlCQUFpQm5CLFlBQVksQ0FBQ2U7UUFDbEMsSUFBSSxDQUFDSixvQkFBb0I7WUFDdkIsT0FBTztRQUNUO1FBRUEsT0FBT0EsbUJBQW1CUSxjQUFjLENBQUNKLEtBQUtSLFFBQVFDO0lBQ3hELEdBQUc7UUFBQ0c7UUFBb0JKO1FBQVFDO0tBQVU7SUFFMUMsTUFBTWEsbUJBQW1CckIsWUFBWSxDQUFDZTtRQUNwQyxJQUFJLENBQUNKLG9CQUFvQjtRQUN6QkEsbUJBQW1CUyxtQkFBbUIsQ0FBQ0wsS0FBS1IsUUFBUUM7SUFDdEQsR0FBRztRQUFDRztRQUFvQko7UUFBUUM7S0FBVTtJQUUxQyxNQUFNYyxpQkFBaUJ0QixZQUFZO1FBQ2pDLElBQUksQ0FBQ1csb0JBQW9CO1FBRXpCLE1BQU1ZLE1BQU1DLEtBQUtELEdBQUc7UUFDcEIsSUFBSUEsTUFBTVYsZUFBZVksT0FBTyxHQUFHZixpQkFBaUI7WUFDbEQ7UUFDRjtRQUVBRyxlQUFlWSxPQUFPLEdBQUdGO1FBQ3pCLE1BQU1aLG1CQUFtQmUsMEJBQTBCLENBQUNuQixRQUFRQztJQUM5RCxHQUFHO1FBQUNHO1FBQW9CSjtRQUFRQztRQUFXRTtLQUFnQjtJQUUzRFQsVUFBVTtRQUNSLElBQUksQ0FBQ1EsZUFBZSxDQUFDRSxvQkFBb0I7UUFFekMsTUFBTWdCLGdCQUFnQjtZQUNwQkw7UUFDRjtRQUVBLElBQUlWLGtCQUFrQmEsT0FBTyxFQUFFO1lBQzdCRyxhQUFhaEIsa0JBQWtCYSxPQUFPO1FBQ3hDO1FBRUFiLGtCQUFrQmEsT0FBTyxHQUFHSSxXQUFXRixlQUFlakI7UUFFdEQsT0FBTztZQUNMLElBQUlFLGtCQUFrQmEsT0FBTyxFQUFFO2dCQUM3QkcsYUFBYWhCLGtCQUFrQmEsT0FBTztZQUN4QztRQUNGO0lBQ0YsR0FBRztRQUFDaEI7UUFBYUU7UUFBb0JXO1FBQWdCWjtLQUFnQjtJQUVyRSxNQUFNb0IsWUFBWTVCLFFBQVE7UUFDeEIsSUFBSSxDQUFDUyxvQkFBb0IsT0FBTztRQUNoQyxNQUFNb0IsUUFBUSxBQUFDcEIsbUJBQTJCcUIsSUFBSSxFQUFFQyxTQUFTO1FBQ3pELE9BQU9GLE9BQU9HLGNBQWM7SUFDOUIsR0FBRztRQUFDdkI7S0FBbUI7SUFFdkIsTUFBTXdCLFFBQVFqQyxRQUFRO1FBQ3BCLElBQUksQ0FBQ1Msb0JBQW9CLE9BQU87UUFDaEMsTUFBTW9CLFFBQVEsQUFBQ3BCLG1CQUEyQnFCLElBQUksRUFBRUMsU0FBUztRQUN6RCxPQUFPRixPQUFPSSxTQUFTO0lBQ3pCLEdBQUc7UUFBQ3hCO0tBQW1CO0lBRXZCLE9BQU87UUFDTEc7UUFDQUs7UUFDQUU7UUFDQUM7UUFDQVE7UUFDQUs7SUFDRjtBQUNGLEVBQUUifQ==
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Copyright (c) 2019-Present, Nitrogen Labs, Inc.
3
+ * Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
4
+ */
5
+ export interface BaseAdapterOptions {
6
+ strict?: boolean;
7
+ allowPartial?: boolean;
8
+ environment?: 'development' | 'production' | 'test';
9
+ customValidation?: (input: unknown) => unknown;
10
+ }
11
+ /**
12
+ * Creates a validator factory that merges custom adapters with default behavior.
13
+ * This eliminates code duplication across all action files.
14
+ *
15
+ * @param defaultValidator - The default validation function
16
+ * @param customAdapter - Optional custom adapter function
17
+ * @param options - Adapter options
18
+ * @returns A validator function that applies default + custom validation
19
+ *
20
+ * @example
21
+ * const validateUser = createValidatorFactory(
22
+ * defaultUserValidator,
23
+ * customUserAdapter,
24
+ * userAdapterOptions
25
+ * );
26
+ */
27
+ export declare const createValidatorFactory: <T extends BaseAdapterOptions>(defaultValidator: (input: unknown, options?: T) => any, customAdapter?: (input: unknown, options?: T) => any, options?: T) => (input: unknown, validatorOptions?: T) => any;
28
+ /**
29
+ * Creates a validator manager that handles adapter updates and recreation.
30
+ * This centralizes the update logic that's duplicated across action files.
31
+ *
32
+ * @param defaultValidator - The default validation function
33
+ * @param initialOptions - Initial adapter options
34
+ * @returns An object with validator and update functions
35
+ *
36
+ * @example
37
+ * const { validator, updateAdapter, updateOptions } = createValidatorManager(
38
+ * defaultUserValidator,
39
+ * userAdapterOptions
40
+ * );
41
+ */
42
+ export declare const createValidatorManager: <T extends BaseAdapterOptions>(defaultValidator: (input: unknown, options?: T) => any, initialOptions?: T) => {
43
+ getCustomAdapter: () => (input: unknown, options?: T) => any;
44
+ getOptions: () => T;
45
+ updateAdapter: (adapter: (input: unknown, options?: T) => any) => void;
46
+ updateOptions: (options: T) => void;
47
+ validator: (input: unknown, validatorOptions?: T) => any;
48
+ };
49
+ //# sourceMappingURL=validatorFactory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validatorFactory.d.ts","sourceRoot":"","sources":["../../src/utils/validatorFactory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,aAAa,GAAG,YAAY,GAAG,MAAM,CAAC;IACpD,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;CAChD;AAED;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,sBAAsB,GAAI,CAAC,SAAS,kBAAkB,EACjE,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC,KAAK,GAAG,EACtD,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC,KAAK,GAAG,EACpD,UAAU,CAAC,MACP,OAAO,OAAO,EAAE,mBAAmB,CAAC,QAczC,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,sBAAsB,GAAI,CAAC,SAAS,kBAAkB,EACjE,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC,KAAK,GAAG,EAEtD,iBAAgB,CAAW;oCAMC,OAAO,YAAY,CAAC,KAAK,GAAG;;6BAExB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC,KAAK,GAAG,KAAG,IAAI;6BAI3C,CAAC,KAAG,IAAI;uBAMd,OAAO,qBAAqB,CAAC;CAuBxD,CAAC"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Copyright (c) 2019-Present, Nitrogen Labs, Inc.
3
+ * Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
4
+ */ /**
5
+ * Creates a validator factory that merges custom adapters with default behavior.
6
+ * This eliminates code duplication across all action files.
7
+ *
8
+ * @param defaultValidator - The default validation function
9
+ * @param customAdapter - Optional custom adapter function
10
+ * @param options - Adapter options
11
+ * @returns A validator function that applies default + custom validation
12
+ *
13
+ * @example
14
+ * const validateUser = createValidatorFactory(
15
+ * defaultUserValidator,
16
+ * customUserAdapter,
17
+ * userAdapterOptions
18
+ * );
19
+ */ export const createValidatorFactory = (defaultValidator, customAdapter, options)=>(input, validatorOptions)=>{
20
+ const mergedOptions = {
21
+ ...options,
22
+ ...validatorOptions
23
+ };
24
+ let validated = defaultValidator(input, mergedOptions);
25
+ if (customAdapter) {
26
+ validated = customAdapter(validated, mergedOptions);
27
+ }
28
+ if (mergedOptions?.customValidation) {
29
+ validated = mergedOptions.customValidation(validated);
30
+ }
31
+ return validated;
32
+ };
33
+ /**
34
+ * Creates a validator manager that handles adapter updates and recreation.
35
+ * This centralizes the update logic that's duplicated across action files.
36
+ *
37
+ * @param defaultValidator - The default validation function
38
+ * @param initialOptions - Initial adapter options
39
+ * @returns An object with validator and update functions
40
+ *
41
+ * @example
42
+ * const { validator, updateAdapter, updateOptions } = createValidatorManager(
43
+ * defaultUserValidator,
44
+ * userAdapterOptions
45
+ * );
46
+ */ export const createValidatorManager = (defaultValidator, // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
47
+ initialOptions = {})=>{
48
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
49
+ const defaultOptions = {};
50
+ let adapterOptions = {
51
+ ...defaultOptions,
52
+ ...initialOptions
53
+ };
54
+ let customAdapter;
55
+ const updateAdapter = (adapter)=>{
56
+ customAdapter = adapter;
57
+ };
58
+ const updateOptions = (options)=>{
59
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
60
+ adapterOptions = {
61
+ ...adapterOptions,
62
+ ...options
63
+ };
64
+ };
65
+ // Create validator function that always uses current customAdapter and adapterOptions
66
+ const validator = (input, validatorOptions)=>{
67
+ const mergedOptions = {
68
+ ...adapterOptions,
69
+ ...validatorOptions
70
+ };
71
+ let validated = defaultValidator(input, mergedOptions);
72
+ if (customAdapter) {
73
+ validated = customAdapter(validated, mergedOptions);
74
+ }
75
+ if (mergedOptions?.customValidation) {
76
+ validated = mergedOptions.customValidation(validated);
77
+ }
78
+ return validated;
79
+ };
80
+ return {
81
+ getCustomAdapter: ()=>customAdapter,
82
+ getOptions: ()=>{
83
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
84
+ const options = {
85
+ ...adapterOptions
86
+ };
87
+ return options;
88
+ },
89
+ updateAdapter,
90
+ updateOptions,
91
+ validator
92
+ };
93
+ };
94
+
95
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L21ldHJvcG9saXNqcy9zcmMvdXRpbHMvdmFsaWRhdG9yRmFjdG9yeS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOS1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VBZGFwdGVyT3B0aW9ucyB7XG4gIHN0cmljdD86IGJvb2xlYW47XG4gIGFsbG93UGFydGlhbD86IGJvb2xlYW47XG4gIGVudmlyb25tZW50PzogJ2RldmVsb3BtZW50JyB8ICdwcm9kdWN0aW9uJyB8ICd0ZXN0JztcbiAgY3VzdG9tVmFsaWRhdGlvbj86IChpbnB1dDogdW5rbm93bikgPT4gdW5rbm93bjtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdmFsaWRhdG9yIGZhY3RvcnkgdGhhdCBtZXJnZXMgY3VzdG9tIGFkYXB0ZXJzIHdpdGggZGVmYXVsdCBiZWhhdmlvci5cbiAqIFRoaXMgZWxpbWluYXRlcyBjb2RlIGR1cGxpY2F0aW9uIGFjcm9zcyBhbGwgYWN0aW9uIGZpbGVzLlxuICpcbiAqIEBwYXJhbSBkZWZhdWx0VmFsaWRhdG9yIC0gVGhlIGRlZmF1bHQgdmFsaWRhdGlvbiBmdW5jdGlvblxuICogQHBhcmFtIGN1c3RvbUFkYXB0ZXIgLSBPcHRpb25hbCBjdXN0b20gYWRhcHRlciBmdW5jdGlvblxuICogQHBhcmFtIG9wdGlvbnMgLSBBZGFwdGVyIG9wdGlvbnNcbiAqIEByZXR1cm5zIEEgdmFsaWRhdG9yIGZ1bmN0aW9uIHRoYXQgYXBwbGllcyBkZWZhdWx0ICsgY3VzdG9tIHZhbGlkYXRpb25cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgdmFsaWRhdGVVc2VyID0gY3JlYXRlVmFsaWRhdG9yRmFjdG9yeShcbiAqICAgZGVmYXVsdFVzZXJWYWxpZGF0b3IsXG4gKiAgIGN1c3RvbVVzZXJBZGFwdGVyLFxuICogICB1c2VyQWRhcHRlck9wdGlvbnNcbiAqICk7XG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVWYWxpZGF0b3JGYWN0b3J5ID0gPFQgZXh0ZW5kcyBCYXNlQWRhcHRlck9wdGlvbnM+KFxuICBkZWZhdWx0VmFsaWRhdG9yOiAoaW5wdXQ6IHVua25vd24sIG9wdGlvbnM/OiBUKSA9PiBhbnksXG4gIGN1c3RvbUFkYXB0ZXI/OiAoaW5wdXQ6IHVua25vd24sIG9wdGlvbnM/OiBUKSA9PiBhbnksXG4gIG9wdGlvbnM/OiBUXG4pID0+IChpbnB1dDogdW5rbm93biwgdmFsaWRhdG9yT3B0aW9ucz86IFQpID0+IHtcbiAgY29uc3QgbWVyZ2VkT3B0aW9ucyA9IHsuLi5vcHRpb25zLCAuLi52YWxpZGF0b3JPcHRpb25zfTtcblxuICBsZXQgdmFsaWRhdGVkID0gZGVmYXVsdFZhbGlkYXRvcihpbnB1dCwgbWVyZ2VkT3B0aW9ucyBhcyBUKTtcblxuICBpZihjdXN0b21BZGFwdGVyKSB7XG4gICAgdmFsaWRhdGVkID0gY3VzdG9tQWRhcHRlcih2YWxpZGF0ZWQsIG1lcmdlZE9wdGlvbnMgYXMgVCk7XG4gIH1cblxuICBpZihtZXJnZWRPcHRpb25zPy5jdXN0b21WYWxpZGF0aW9uKSB7XG4gICAgdmFsaWRhdGVkID0gbWVyZ2VkT3B0aW9ucy5jdXN0b21WYWxpZGF0aW9uKHZhbGlkYXRlZCk7XG4gIH1cblxuICByZXR1cm4gdmFsaWRhdGVkO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgdmFsaWRhdG9yIG1hbmFnZXIgdGhhdCBoYW5kbGVzIGFkYXB0ZXIgdXBkYXRlcyBhbmQgcmVjcmVhdGlvbi5cbiAqIFRoaXMgY2VudHJhbGl6ZXMgdGhlIHVwZGF0ZSBsb2dpYyB0aGF0J3MgZHVwbGljYXRlZCBhY3Jvc3MgYWN0aW9uIGZpbGVzLlxuICpcbiAqIEBwYXJhbSBkZWZhdWx0VmFsaWRhdG9yIC0gVGhlIGRlZmF1bHQgdmFsaWRhdGlvbiBmdW5jdGlvblxuICogQHBhcmFtIGluaXRpYWxPcHRpb25zIC0gSW5pdGlhbCBhZGFwdGVyIG9wdGlvbnNcbiAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIHZhbGlkYXRvciBhbmQgdXBkYXRlIGZ1bmN0aW9uc1xuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCB7IHZhbGlkYXRvciwgdXBkYXRlQWRhcHRlciwgdXBkYXRlT3B0aW9ucyB9ID0gY3JlYXRlVmFsaWRhdG9yTWFuYWdlcihcbiAqICAgZGVmYXVsdFVzZXJWYWxpZGF0b3IsXG4gKiAgIHVzZXJBZGFwdGVyT3B0aW9uc1xuICogKTtcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZVZhbGlkYXRvck1hbmFnZXIgPSA8VCBleHRlbmRzIEJhc2VBZGFwdGVyT3B0aW9ucz4oXG4gIGRlZmF1bHRWYWxpZGF0b3I6IChpbnB1dDogdW5rbm93biwgb3B0aW9ucz86IFQpID0+IGFueSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9jb25zaXN0ZW50LXR5cGUtYXNzZXJ0aW9uc1xuICBpbml0aWFsT3B0aW9uczogVCA9IHt9IGFzIFRcbikgPT4ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2NvbnNpc3RlbnQtdHlwZS1hc3NlcnRpb25zXG4gIGNvbnN0IGRlZmF1bHRPcHRpb25zOiBUID0ge30gYXMgVDtcblxuICBsZXQgYWRhcHRlck9wdGlvbnM6IFQgPSB7Li4uZGVmYXVsdE9wdGlvbnMsIC4uLmluaXRpYWxPcHRpb25zfTtcbiAgbGV0IGN1c3RvbUFkYXB0ZXI6ICgoaW5wdXQ6IHVua25vd24sIG9wdGlvbnM/OiBUKSA9PiBhbnkpIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHVwZGF0ZUFkYXB0ZXIgPSAoYWRhcHRlcjogKGlucHV0OiB1bmtub3duLCBvcHRpb25zPzogVCkgPT4gYW55KTogdm9pZCA9PiB7XG4gICAgY3VzdG9tQWRhcHRlciA9IGFkYXB0ZXI7XG4gIH07XG5cbiAgY29uc3QgdXBkYXRlT3B0aW9ucyA9IChvcHRpb25zOiBUKTogdm9pZCA9PiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9jb25zaXN0ZW50LXR5cGUtYXNzZXJ0aW9uc1xuICAgIGFkYXB0ZXJPcHRpb25zID0gey4uLmFkYXB0ZXJPcHRpb25zLCAuLi5vcHRpb25zfSBhcyBUO1xuICB9O1xuXG4gIC8vIENyZWF0ZSB2YWxpZGF0b3IgZnVuY3Rpb24gdGhhdCBhbHdheXMgdXNlcyBjdXJyZW50IGN1c3RvbUFkYXB0ZXIgYW5kIGFkYXB0ZXJPcHRpb25zXG4gIGNvbnN0IHZhbGlkYXRvciA9IChpbnB1dDogdW5rbm93biwgdmFsaWRhdG9yT3B0aW9ucz86IFQpID0+IHtcbiAgICBjb25zdCBtZXJnZWRPcHRpb25zID0gey4uLmFkYXB0ZXJPcHRpb25zLCAuLi52YWxpZGF0b3JPcHRpb25zfTtcbiAgICBsZXQgdmFsaWRhdGVkID0gZGVmYXVsdFZhbGlkYXRvcihpbnB1dCwgbWVyZ2VkT3B0aW9ucyBhcyBUKTtcbiAgICBpZihjdXN0b21BZGFwdGVyKSB7XG4gICAgICB2YWxpZGF0ZWQgPSBjdXN0b21BZGFwdGVyKHZhbGlkYXRlZCwgbWVyZ2VkT3B0aW9ucyBhcyBUKTtcbiAgICB9XG4gICAgaWYobWVyZ2VkT3B0aW9ucz8uY3VzdG9tVmFsaWRhdGlvbikge1xuICAgICAgdmFsaWRhdGVkID0gbWVyZ2VkT3B0aW9ucy5jdXN0b21WYWxpZGF0aW9uKHZhbGlkYXRlZCk7XG4gICAgfVxuICAgIHJldHVybiB2YWxpZGF0ZWQ7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBnZXRDdXN0b21BZGFwdGVyOiAoKSA9PiBjdXN0b21BZGFwdGVyLFxuICAgIGdldE9wdGlvbnM6ICgpID0+IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvY29uc2lzdGVudC10eXBlLWFzc2VydGlvbnNcbiAgICAgIGNvbnN0IG9wdGlvbnM6IFQgPSB7Li4uYWRhcHRlck9wdGlvbnN9IGFzIFQ7XG4gICAgICByZXR1cm4gb3B0aW9ucztcbiAgICB9LFxuICAgIHVwZGF0ZUFkYXB0ZXIsXG4gICAgdXBkYXRlT3B0aW9ucyxcbiAgICB2YWxpZGF0b3JcbiAgfTtcbn07Il0sIm5hbWVzIjpbImNyZWF0ZVZhbGlkYXRvckZhY3RvcnkiLCJkZWZhdWx0VmFsaWRhdG9yIiwiY3VzdG9tQWRhcHRlciIsIm9wdGlvbnMiLCJpbnB1dCIsInZhbGlkYXRvck9wdGlvbnMiLCJtZXJnZWRPcHRpb25zIiwidmFsaWRhdGVkIiwiY3VzdG9tVmFsaWRhdGlvbiIsImNyZWF0ZVZhbGlkYXRvck1hbmFnZXIiLCJpbml0aWFsT3B0aW9ucyIsImRlZmF1bHRPcHRpb25zIiwiYWRhcHRlck9wdGlvbnMiLCJ1cGRhdGVBZGFwdGVyIiwiYWRhcHRlciIsInVwZGF0ZU9wdGlvbnMiLCJ2YWxpZGF0b3IiLCJnZXRDdXN0b21BZGFwdGVyIiwiZ2V0T3B0aW9ucyJdLCJtYXBwaW5ncyI6IkFBQUE7OztDQUdDLEdBU0Q7Ozs7Ozs7Ozs7Ozs7OztDQWVDLEdBQ0QsT0FBTyxNQUFNQSx5QkFBeUIsQ0FDcENDLGtCQUNBQyxlQUNBQyxVQUNHLENBQUNDLE9BQWdCQztRQUNwQixNQUFNQyxnQkFBZ0I7WUFBQyxHQUFHSCxPQUFPO1lBQUUsR0FBR0UsZ0JBQWdCO1FBQUE7UUFFdEQsSUFBSUUsWUFBWU4saUJBQWlCRyxPQUFPRTtRQUV4QyxJQUFHSixlQUFlO1lBQ2hCSyxZQUFZTCxjQUFjSyxXQUFXRDtRQUN2QztRQUVBLElBQUdBLGVBQWVFLGtCQUFrQjtZQUNsQ0QsWUFBWUQsY0FBY0UsZ0JBQWdCLENBQUNEO1FBQzdDO1FBRUEsT0FBT0E7SUFDVCxFQUFFO0FBRUY7Ozs7Ozs7Ozs7Ozs7Q0FhQyxHQUNELE9BQU8sTUFBTUUseUJBQXlCLENBQ3BDUixrQkFDQSx5RUFBeUU7QUFDekVTLGlCQUFvQixDQUFDLENBQU07SUFFM0IseUVBQXlFO0lBQ3pFLE1BQU1DLGlCQUFvQixDQUFDO0lBRTNCLElBQUlDLGlCQUFvQjtRQUFDLEdBQUdELGNBQWM7UUFBRSxHQUFHRCxjQUFjO0lBQUE7SUFDN0QsSUFBSVI7SUFFSixNQUFNVyxnQkFBZ0IsQ0FBQ0M7UUFDckJaLGdCQUFnQlk7SUFDbEI7SUFFQSxNQUFNQyxnQkFBZ0IsQ0FBQ1o7UUFDckIseUVBQXlFO1FBQ3pFUyxpQkFBaUI7WUFBQyxHQUFHQSxjQUFjO1lBQUUsR0FBR1QsT0FBTztRQUFBO0lBQ2pEO0lBRUEsc0ZBQXNGO0lBQ3RGLE1BQU1hLFlBQVksQ0FBQ1osT0FBZ0JDO1FBQ2pDLE1BQU1DLGdCQUFnQjtZQUFDLEdBQUdNLGNBQWM7WUFBRSxHQUFHUCxnQkFBZ0I7UUFBQTtRQUM3RCxJQUFJRSxZQUFZTixpQkFBaUJHLE9BQU9FO1FBQ3hDLElBQUdKLGVBQWU7WUFDaEJLLFlBQVlMLGNBQWNLLFdBQVdEO1FBQ3ZDO1FBQ0EsSUFBR0EsZUFBZUUsa0JBQWtCO1lBQ2xDRCxZQUFZRCxjQUFjRSxnQkFBZ0IsQ0FBQ0Q7UUFDN0M7UUFDQSxPQUFPQTtJQUNUO0lBRUEsT0FBTztRQUNMVSxrQkFBa0IsSUFBTWY7UUFDeEJnQixZQUFZO1lBQ1YseUVBQXlFO1lBQ3pFLE1BQU1mLFVBQWE7Z0JBQUMsR0FBR1MsY0FBYztZQUFBO1lBQ3JDLE9BQU9UO1FBQ1Q7UUFDQVU7UUFDQUU7UUFDQUM7SUFDRjtBQUNGLEVBQUUifQ==