@nlabs/metropolisjs 0.1.2 → 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 (329) 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 +1123 -112
  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/i18n-import-examples.ts +86 -0
  19. package/examples/i18n-namespace-usage.ts +118 -0
  20. package/examples/i18next-singleton-demo.ts +187 -0
  21. package/examples/permission-system-usage.tsx +415 -0
  22. package/examples/project-details.tsx +397 -0
  23. package/examples/shared-i18n-usage.tsx +203 -0
  24. package/examples/signup-error-handling.ts +100 -0
  25. package/examples/translation-types.ts +86 -0
  26. package/examples/translation-usage.tsx +336 -0
  27. package/index.js +1 -0
  28. package/jest.config.mjs +28 -0
  29. package/lex.config.mjs +11 -2
  30. package/lib/__tests__/e2e/helpers/testGraphQLServer.d.ts +22 -0
  31. package/lib/__tests__/e2e/helpers/testGraphQLServer.d.ts.map +1 -0
  32. package/lib/__tests__/e2e/helpers/testGraphQLServer.js +197 -0
  33. package/lib/__tests__/e2e/helpers/testGraphQLServerSimple.d.ts +3 -0
  34. package/lib/__tests__/e2e/helpers/testGraphQLServerSimple.d.ts.map +1 -0
  35. package/lib/__tests__/e2e/helpers/testGraphQLServerSimple.js +52 -0
  36. package/lib/actions/appActions/appActions.d.ts +29 -0
  37. package/lib/actions/appActions/appActions.d.ts.map +1 -0
  38. package/lib/actions/appActions/appActions.js +159 -0
  39. package/lib/actions/connectionActions/connectionActions.d.ts +19 -0
  40. package/lib/actions/connectionActions/connectionActions.d.ts.map +1 -0
  41. package/lib/actions/connectionActions/connectionActions.js +131 -0
  42. package/lib/actions/contentActions/contentActions.d.ts +34 -0
  43. package/lib/actions/contentActions/contentActions.d.ts.map +1 -0
  44. package/lib/actions/contentActions/contentActions.js +314 -0
  45. package/lib/actions/conversationActions/conversationActions.d.ts +30 -0
  46. package/lib/actions/conversationActions/conversationActions.d.ts.map +1 -0
  47. package/lib/actions/conversationActions/conversationActions.js +225 -0
  48. package/lib/actions/eventActions/eventActions.d.ts +27 -7
  49. package/lib/actions/eventActions/eventActions.d.ts.map +1 -0
  50. package/lib/actions/eventActions/eventActions.js +436 -2
  51. package/lib/actions/groupActions/groupActions.d.ts +30 -0
  52. package/lib/actions/groupActions/groupActions.d.ts.map +1 -0
  53. package/lib/actions/groupActions/groupActions.js +229 -0
  54. package/lib/actions/imageActions/imageActions.d.ts +16 -10
  55. package/lib/actions/imageActions/imageActions.d.ts.map +1 -0
  56. package/lib/actions/imageActions/imageActions.js +593 -2
  57. package/lib/actions/index.d.ts +21 -9
  58. package/lib/actions/index.d.ts.map +1 -0
  59. package/lib/actions/index.js +22 -2
  60. package/lib/actions/locationActions/locationActions.d.ts +11 -9
  61. package/lib/actions/locationActions/locationActions.d.ts.map +1 -0
  62. package/lib/actions/locationActions/locationActions.js +388 -2
  63. package/lib/actions/messageActions/messageActions.d.ts +16 -32
  64. package/lib/actions/messageActions/messageActions.d.ts.map +1 -0
  65. package/lib/actions/messageActions/messageActions.js +235 -2
  66. package/lib/actions/permissionActions/permissionActions.d.ts +34 -0
  67. package/lib/actions/permissionActions/permissionActions.d.ts.map +1 -0
  68. package/lib/actions/permissionActions/permissionActions.js +330 -0
  69. package/lib/actions/personaActions/personaActions.d.ts +65 -0
  70. package/lib/actions/personaActions/personaActions.d.ts.map +1 -0
  71. package/lib/actions/personaActions/personaActions.js +572 -0
  72. package/lib/actions/postActions/postActions.d.ts +12 -32
  73. package/lib/actions/postActions/postActions.d.ts.map +1 -0
  74. package/lib/actions/postActions/postActions.js +447 -2
  75. package/lib/actions/reactionActions/reactionActions.d.ts +13 -27
  76. package/lib/actions/reactionActions/reactionActions.d.ts.map +1 -0
  77. package/lib/actions/reactionActions/reactionActions.js +413 -2
  78. package/lib/actions/sseActions/sseActions.d.ts +1 -0
  79. package/lib/actions/sseActions/sseActions.d.ts.map +1 -0
  80. package/lib/actions/sseActions/sseActions.js +148 -2
  81. package/lib/actions/subscriptionActions/subscriptionActions.d.ts +24 -0
  82. package/lib/actions/subscriptionActions/subscriptionActions.d.ts.map +1 -0
  83. package/lib/actions/subscriptionActions/subscriptionActions.js +329 -0
  84. package/lib/actions/tagActions/tagActions.d.ts +13 -31
  85. package/lib/actions/tagActions/tagActions.d.ts.map +1 -0
  86. package/lib/actions/tagActions/tagActions.js +347 -2
  87. package/lib/actions/translationActions/translationActions.d.ts +38 -0
  88. package/lib/actions/translationActions/translationActions.d.ts.map +1 -0
  89. package/lib/actions/translationActions/translationActions.js +189 -0
  90. package/lib/actions/userActions/userActions.d.ts +42 -95
  91. package/lib/actions/userActions/userActions.d.ts.map +1 -0
  92. package/lib/actions/userActions/userActions.js +844 -2
  93. package/lib/actions/videoActions/videoActions.d.ts +41 -0
  94. package/lib/actions/videoActions/videoActions.d.ts.map +1 -0
  95. package/lib/actions/videoActions/videoActions.js +532 -0
  96. package/lib/actions/websocketActions/websocketActions.d.ts +20 -21
  97. package/lib/actions/websocketActions/websocketActions.d.ts.map +1 -0
  98. package/lib/actions/websocketActions/websocketActions.js +377 -2
  99. package/lib/adapters/appAdapter/appAdapter.d.ts +8 -0
  100. package/lib/adapters/appAdapter/appAdapter.d.ts.map +1 -0
  101. package/lib/adapters/appAdapter/appAdapter.js +90 -0
  102. package/lib/adapters/arangoAdapter/arangoAdapter.d.ts +3 -2
  103. package/lib/adapters/arangoAdapter/arangoAdapter.d.ts.map +1 -0
  104. package/lib/adapters/arangoAdapter/arangoAdapter.js +75 -2
  105. package/lib/adapters/contentAdapter/contentAdapter.d.ts +3 -2
  106. package/lib/adapters/contentAdapter/contentAdapter.d.ts.map +1 -0
  107. package/lib/adapters/contentAdapter/contentAdapter.js +107 -2
  108. package/lib/adapters/conversationAdapter/conversationAdapter.d.ts +3 -2
  109. package/lib/adapters/conversationAdapter/conversationAdapter.d.ts.map +1 -0
  110. package/lib/adapters/conversationAdapter/conversationAdapter.js +75 -2
  111. package/lib/adapters/eventAdapter/eventAdapter.d.ts +5 -2
  112. package/lib/adapters/eventAdapter/eventAdapter.d.ts.map +1 -0
  113. package/lib/adapters/eventAdapter/eventAdapter.js +162 -2
  114. package/lib/adapters/fileAdapter/fileAdapter.d.ts +3 -2
  115. package/lib/adapters/fileAdapter/fileAdapter.d.ts.map +1 -0
  116. package/lib/adapters/fileAdapter/fileAdapter.js +118 -2
  117. package/lib/adapters/groupAdapter/groupAdapter.d.ts +28 -0
  118. package/lib/adapters/groupAdapter/groupAdapter.d.ts.map +1 -0
  119. package/lib/adapters/groupAdapter/groupAdapter.js +66 -0
  120. package/lib/adapters/imageAdapter/imageAdapter.d.ts +9 -2
  121. package/lib/adapters/imageAdapter/imageAdapter.d.ts.map +1 -0
  122. package/lib/adapters/imageAdapter/imageAdapter.js +134 -2
  123. package/lib/adapters/index.d.ts +34 -16
  124. package/lib/adapters/index.d.ts.map +1 -0
  125. package/lib/adapters/index.js +19 -2
  126. package/lib/adapters/locationAdapter/locationAdapter.d.ts +3 -2
  127. package/lib/adapters/locationAdapter/locationAdapter.d.ts.map +1 -0
  128. package/lib/adapters/locationAdapter/locationAdapter.js +95 -2
  129. package/lib/adapters/messageAdapter/messageAdapter.d.ts +23 -19
  130. package/lib/adapters/messageAdapter/messageAdapter.d.ts.map +1 -0
  131. package/lib/adapters/messageAdapter/messageAdapter.js +82 -2
  132. package/lib/adapters/permissionAdapter/permissionAdapter.d.ts +41 -0
  133. package/lib/adapters/permissionAdapter/permissionAdapter.d.ts.map +1 -0
  134. package/lib/adapters/permissionAdapter/permissionAdapter.js +120 -0
  135. package/lib/adapters/personaAdapter/personaAdapter.d.ts +28 -2
  136. package/lib/adapters/personaAdapter/personaAdapter.d.ts.map +1 -0
  137. package/lib/adapters/personaAdapter/personaAdapter.js +161 -2
  138. package/lib/adapters/postAdapter/postAdapter.d.ts +3 -2
  139. package/lib/adapters/postAdapter/postAdapter.d.ts.map +1 -0
  140. package/lib/adapters/postAdapter/postAdapter.js +115 -2
  141. package/lib/adapters/reactionAdapter/reactionAdapter.d.ts +5 -2
  142. package/lib/adapters/reactionAdapter/reactionAdapter.d.ts.map +1 -0
  143. package/lib/adapters/reactionAdapter/reactionAdapter.js +81 -2
  144. package/lib/adapters/reaktorAdapter/reaktorAdapter.d.ts +3 -2
  145. package/lib/adapters/reaktorAdapter/reaktorAdapter.d.ts.map +1 -0
  146. package/lib/adapters/reaktorAdapter/reaktorAdapter.js +58 -2
  147. package/lib/adapters/sessionAdapter/sessionAdapter.d.ts +3 -2
  148. package/lib/adapters/sessionAdapter/sessionAdapter.d.ts.map +1 -0
  149. package/lib/adapters/sessionAdapter/sessionAdapter.js +80 -2
  150. package/lib/adapters/tagAdapter/tagAdapter.d.ts +3 -2
  151. package/lib/adapters/tagAdapter/tagAdapter.d.ts.map +1 -0
  152. package/lib/adapters/tagAdapter/tagAdapter.js +98 -2
  153. package/lib/adapters/translationAdapter/translationAdapter.d.ts +21 -0
  154. package/lib/adapters/translationAdapter/translationAdapter.d.ts.map +1 -0
  155. package/lib/adapters/translationAdapter/translationAdapter.js +55 -0
  156. package/lib/adapters/userAdapter/userAdapter.d.ts +18 -6
  157. package/lib/adapters/userAdapter/userAdapter.d.ts.map +1 -0
  158. package/lib/adapters/userAdapter/userAdapter.js +302 -2
  159. package/lib/adapters/videoAdapter/videoAdapter.d.ts +8 -0
  160. package/lib/adapters/videoAdapter/videoAdapter.d.ts.map +1 -0
  161. package/lib/adapters/videoAdapter/videoAdapter.js +194 -0
  162. package/lib/config/index.d.ts +19 -6
  163. package/lib/config/index.d.ts.map +1 -0
  164. package/lib/config/index.js +97 -2
  165. package/lib/constants/Collections.d.ts +44 -0
  166. package/lib/constants/Collections.d.ts.map +1 -0
  167. package/lib/constants/Collections.js +40 -0
  168. package/lib/constants/MetropolisConstants.d.ts +1 -0
  169. package/lib/constants/MetropolisConstants.d.ts.map +1 -0
  170. package/lib/constants/MetropolisConstants.js +15 -2
  171. package/lib/graphql/message.d.ts +1 -0
  172. package/lib/graphql/message.d.ts.map +1 -0
  173. package/lib/graphql/message.js +6 -4
  174. package/lib/graphql/notification.d.ts +1 -0
  175. package/lib/graphql/notification.d.ts.map +1 -0
  176. package/lib/graphql/notification.js +6 -4
  177. package/lib/graphql/session.d.ts +1 -0
  178. package/lib/graphql/session.d.ts.map +1 -0
  179. package/lib/graphql/session.js +4 -3
  180. package/lib/index.d.ts +45 -22
  181. package/lib/index.d.ts.map +1 -0
  182. package/lib/index.js +248 -2
  183. package/lib/stores/appStore.d.ts +1 -0
  184. package/lib/stores/appStore.d.ts.map +1 -0
  185. package/lib/stores/appStore.js +23 -2
  186. package/lib/stores/contentStore.d.ts +36 -0
  187. package/lib/stores/contentStore.d.ts.map +1 -0
  188. package/lib/stores/contentStore.js +139 -0
  189. package/lib/stores/conversationStore.d.ts +38 -0
  190. package/lib/stores/conversationStore.d.ts.map +1 -0
  191. package/lib/stores/conversationStore.js +117 -0
  192. package/lib/stores/eventStore.d.ts +4 -1
  193. package/lib/stores/eventStore.d.ts.map +1 -0
  194. package/lib/stores/eventStore.js +47 -2
  195. package/lib/stores/groupStore.d.ts +37 -0
  196. package/lib/stores/groupStore.d.ts.map +1 -0
  197. package/lib/stores/groupStore.js +68 -0
  198. package/lib/stores/imageStore.d.ts +6 -1
  199. package/lib/stores/imageStore.d.ts.map +1 -0
  200. package/lib/stores/imageStore.js +53 -2
  201. package/lib/stores/index.d.ts +20 -11
  202. package/lib/stores/index.d.ts.map +1 -0
  203. package/lib/stores/index.js +24 -2
  204. package/lib/stores/locationStore.d.ts +2 -1
  205. package/lib/stores/locationStore.d.ts.map +1 -0
  206. package/lib/stores/locationStore.js +42 -2
  207. package/lib/stores/messageStore.d.ts +19 -4
  208. package/lib/stores/messageStore.d.ts.map +1 -0
  209. package/lib/stores/messageStore.js +137 -2
  210. package/lib/stores/notificationStore.d.ts +33 -0
  211. package/lib/stores/notificationStore.d.ts.map +1 -0
  212. package/lib/stores/notificationStore.js +55 -0
  213. package/lib/stores/permissionStore.d.ts +37 -0
  214. package/lib/stores/permissionStore.d.ts.map +1 -0
  215. package/lib/stores/permissionStore.js +117 -0
  216. package/lib/stores/personaStore.d.ts +26 -0
  217. package/lib/stores/personaStore.d.ts.map +1 -0
  218. package/lib/stores/personaStore.js +118 -0
  219. package/lib/stores/postStore.d.ts +2 -1
  220. package/lib/stores/postStore.d.ts.map +1 -0
  221. package/lib/stores/postStore.js +53 -2
  222. package/lib/stores/reactionStore.d.ts +1 -0
  223. package/lib/stores/reactionStore.d.ts.map +1 -0
  224. package/lib/stores/reactionStore.js +28 -2
  225. package/lib/stores/subscriptionStore.d.ts +41 -0
  226. package/lib/stores/subscriptionStore.d.ts.map +1 -0
  227. package/lib/stores/subscriptionStore.js +85 -0
  228. package/lib/stores/tagStore.d.ts +8 -5
  229. package/lib/stores/tagStore.d.ts.map +1 -0
  230. package/lib/stores/tagStore.js +87 -2
  231. package/lib/stores/translationStore.d.ts +42 -0
  232. package/lib/stores/translationStore.d.ts.map +1 -0
  233. package/lib/stores/translationStore.js +122 -0
  234. package/lib/stores/userStore.d.ts +5 -4
  235. package/lib/stores/userStore.d.ts.map +1 -0
  236. package/lib/stores/userStore.js +319 -2
  237. package/lib/stores/videoStore.d.ts +39 -0
  238. package/lib/stores/videoStore.d.ts.map +1 -0
  239. package/lib/stores/videoStore.js +132 -0
  240. package/lib/stores/websocketStore.d.ts +1 -0
  241. package/lib/stores/websocketStore.d.ts.map +1 -0
  242. package/lib/stores/websocketStore.js +51 -2
  243. package/lib/types/apps.types.d.ts +17 -0
  244. package/lib/types/apps.types.d.ts.map +1 -0
  245. package/lib/types/apps.types.js +6 -0
  246. package/lib/types/common.types.d.ts +31 -0
  247. package/lib/types/common.types.d.ts.map +1 -0
  248. package/lib/types/common.types.js +6 -0
  249. package/lib/types/conversations.types.d.ts +17 -0
  250. package/lib/types/conversations.types.d.ts.map +1 -0
  251. package/lib/types/conversations.types.js +6 -0
  252. package/lib/types/edges.types.d.ts +38 -0
  253. package/lib/types/edges.types.d.ts.map +1 -0
  254. package/lib/types/edges.types.js +6 -0
  255. package/lib/types/groups.types.d.ts +19 -0
  256. package/lib/types/groups.types.d.ts.map +1 -0
  257. package/lib/types/groups.types.js +6 -0
  258. package/lib/types/index.d.ts +12 -0
  259. package/lib/types/index.d.ts.map +1 -0
  260. package/lib/types/index.js +12 -0
  261. package/lib/types/subscriptions.types.d.ts +32 -0
  262. package/lib/types/subscriptions.types.d.ts.map +1 -0
  263. package/lib/types/subscriptions.types.js +6 -0
  264. package/lib/types/videos.types.d.ts +61 -0
  265. package/lib/types/videos.types.d.ts.map +1 -0
  266. package/lib/types/videos.types.js +6 -0
  267. package/lib/utils/MetropolisProvider.d.ts +39 -15
  268. package/lib/utils/MetropolisProvider.d.ts.map +1 -0
  269. package/lib/utils/MetropolisProvider.js +31 -2
  270. package/lib/utils/actionFactory.d.ts +21 -19
  271. package/lib/utils/actionFactory.d.ts.map +1 -0
  272. package/lib/utils/actionFactory.js +95 -2
  273. package/lib/utils/api.d.ts +5 -4
  274. package/lib/utils/api.d.ts.map +1 -0
  275. package/lib/utils/api.js +252 -6
  276. package/lib/utils/app.d.ts +1 -0
  277. package/lib/utils/app.d.ts.map +1 -0
  278. package/lib/utils/app.js +15 -2
  279. package/lib/utils/baseActionFactory.d.ts +5 -23
  280. package/lib/utils/baseActionFactory.d.ts.map +1 -0
  281. package/lib/utils/baseActionFactory.js +72 -2
  282. package/lib/utils/configUtils.d.ts +11 -0
  283. package/lib/utils/configUtils.d.ts.map +1 -0
  284. package/lib/utils/configUtils.js +20 -0
  285. package/lib/utils/dateUtils.d.ts +1 -0
  286. package/lib/utils/dateUtils.d.ts.map +1 -0
  287. package/lib/utils/dateUtils.js +11 -2
  288. package/lib/utils/file.d.ts +3 -1
  289. package/lib/utils/file.d.ts.map +1 -0
  290. package/lib/utils/file.js +156 -2
  291. package/lib/utils/i18n.d.ts +7 -0
  292. package/lib/utils/i18n.d.ts.map +1 -0
  293. package/lib/utils/i18n.js +96 -0
  294. package/lib/utils/index.d.ts +20 -0
  295. package/lib/utils/index.d.ts.map +1 -0
  296. package/lib/utils/index.js +26 -0
  297. package/lib/utils/location.d.ts +4 -3
  298. package/lib/utils/location.d.ts.map +1 -0
  299. package/lib/utils/location.js +82 -2
  300. package/lib/utils/permissionUtils.d.ts +22 -0
  301. package/lib/utils/permissionUtils.d.ts.map +1 -0
  302. package/lib/utils/permissionUtils.js +72 -0
  303. package/lib/utils/requestCache.d.ts +8 -0
  304. package/lib/utils/requestCache.d.ts.map +1 -0
  305. package/lib/utils/requestCache.js +53 -0
  306. package/lib/utils/session.d.ts +14 -0
  307. package/lib/utils/session.d.ts.map +1 -0
  308. package/lib/utils/session.js +107 -0
  309. package/lib/utils/useConversationTyping.d.ts +26 -0
  310. package/lib/utils/useConversationTyping.d.ts.map +1 -0
  311. package/lib/utils/useConversationTyping.js +117 -0
  312. package/lib/utils/useMetropolis.d.ts +67 -12
  313. package/lib/utils/useMetropolis.d.ts.map +1 -0
  314. package/lib/utils/useMetropolis.js +311 -2
  315. package/lib/utils/useTranslations.d.ts +16 -0
  316. package/lib/utils/useTranslations.d.ts.map +1 -0
  317. package/lib/utils/useTranslations.js +105 -0
  318. package/lib/utils/validatorFactory.d.ts +3 -2
  319. package/lib/utils/validatorFactory.d.ts.map +1 -0
  320. package/lib/utils/validatorFactory.js +95 -2
  321. package/package.json +58 -17
  322. package/temp_signin.ts +73 -0
  323. package/lib/actions/profileActions/profileActions.d.ts +0 -50
  324. package/lib/actions/profileActions/profileActions.js +0 -2
  325. package/lib/adapters/profileAdapter/profileAdapter.d.ts +0 -32
  326. package/lib/adapters/profileAdapter/profileAdapter.js +0 -2
  327. package/lib/stores/profileStore.d.ts +0 -24
  328. package/lib/stores/profileStore.js +0 -2
  329. /package/{FACTORY_PATTERN_GUIDE.md → factoryPatternGuide.md} +0 -0
@@ -0,0 +1,86 @@
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
+
6
+ // This file demonstrates different ways to import i18next functions
7
+ // for consistency across MetropolisJS and GothamJS
8
+
9
+ // Method 1: Direct import (original i18next way)
10
+ import { t } from 'i18next';
11
+
12
+ // Method 2: Aliased import for consistency (recommended)
13
+ import { t as i18n } from 'i18next';
14
+
15
+ // Method 3: Multiple imports with aliases
16
+ import { t as translate } from 'i18next';
17
+
18
+ // Example usage showing the difference:
19
+
20
+ // Using the original 't' function
21
+ const originalWay = () => {
22
+ const welcome = t('welcome');
23
+ const greeting = t('hello_user', {name: 'John'});
24
+ return {welcome, greeting};
25
+ };
26
+
27
+ // Using the aliased 'i18n' function (same as MetropolisJS)
28
+ const consistentWay = () => {
29
+ const welcome = i18n('welcome');
30
+ const greeting = i18n('hello_user', {name: 'John'});
31
+ return {welcome, greeting};
32
+ };
33
+
34
+ // Using the 'translate' alias
35
+ const alternativeWay = () => {
36
+ const welcome = translate('welcome');
37
+ const greeting = translate('hello_user', {name: 'John'});
38
+ return {welcome, greeting};
39
+ };
40
+
41
+ // Real-world example: GothamJS component
42
+ const GothamJSComponent = () => {
43
+ // In GothamJS, you would use:
44
+ // import {t as i18n} from 'i18next';
45
+
46
+ // This gives you the same function name as MetropolisJS
47
+ const title = i18n('gotham_title');
48
+ const description = i18n('gotham_description');
49
+ const buttonText = i18n('gotham_button');
50
+
51
+ return {
52
+ title,
53
+ description,
54
+ buttonText
55
+ };
56
+ };
57
+
58
+ // MetropolisJS component (for comparison)
59
+ const MetropolisJSComponent = () => {
60
+ // In MetropolisJS, you would use:
61
+ // import {i18n} from './utils/i18n';
62
+ // (which internally uses i18next)
63
+
64
+ const title = i18n('metropolis_title');
65
+ const description = i18n('metropolis_description');
66
+ const buttonText = i18n('metropolis_button');
67
+
68
+ return {
69
+ title,
70
+ description,
71
+ buttonText
72
+ };
73
+ };
74
+
75
+ // Benefits of using {t as i18n}:
76
+ const benefits = {
77
+ consistency: 'Same function name across libraries',
78
+ familiarity: 'Developers know what i18n() does',
79
+ maintainability: 'Easier to switch between libraries',
80
+ clarity: 'Clear that it\'s for internationalization'
81
+ };
82
+
83
+ export {
84
+ alternativeWay, benefits, consistentWay, GothamJSComponent,
85
+ MetropolisJSComponent, originalWay
86
+ };
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Copyright (c) 2025-Present, Nitrogen Labs, Inc.
3
+ * Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
4
+ */
5
+ import { i18n, initI18n, updateI18nResources } from '../src/utils/i18n';
6
+
7
+ const translations = {
8
+ 'welcome:en': {
9
+ key: 'welcome',
10
+ locale: 'en',
11
+ value: 'Welcome {{name}}!',
12
+ namespace: 'common'
13
+ },
14
+ 'save:en': {
15
+ key: 'save',
16
+ locale: 'en',
17
+ value: 'Save',
18
+ namespace: 'buttons'
19
+ },
20
+ 'cancel:en': {
21
+ key: 'cancel',
22
+ locale: 'en',
23
+ value: 'Cancel',
24
+ namespace: 'buttons'
25
+ },
26
+ 'login:en': {
27
+ key: 'login',
28
+ locale: 'en',
29
+ value: 'Login to your account',
30
+ namespace: 'auth'
31
+ },
32
+ 'welcome:es': {
33
+ key: 'welcome',
34
+ locale: 'es',
35
+ value: '”Bienvenido {{name}}!',
36
+ namespace: 'common'
37
+ },
38
+ 'save:es': {
39
+ key: 'save',
40
+ locale: 'es',
41
+ value: 'Guardar',
42
+ namespace: 'buttons'
43
+ }
44
+ };
45
+
46
+ const initializeTranslations = () => {
47
+ initI18n(translations);
48
+ console.log('i18n initialized with namespaces');
49
+ };
50
+
51
+ const demonstrateNamespaceUsage = () => {
52
+ console.log('\n=== Namespace Usage Examples ===');
53
+
54
+ console.log('Default namespace (translations):');
55
+ console.log(i18n('welcome', {name: 'World'}));
56
+ console.log(i18n('welcome', {name: 'World'}, 'en'));
57
+
58
+ console.log('\nCommon namespace:');
59
+ console.log(i18n('welcome', {name: 'World'}, 'en', 'common'));
60
+ console.log(i18n('welcome', {name: 'Mundo'}, 'es', 'common'));
61
+
62
+ console.log('\nButtons namespace:');
63
+ console.log(i18n('save', {}, 'en', 'buttons'));
64
+ console.log(i18n('cancel', {}, 'en', 'buttons'));
65
+ console.log(i18n('save', {}, 'es', 'buttons'));
66
+
67
+ console.log('\nAuth namespace:');
68
+ console.log(i18n('login', {}, 'en', 'auth'));
69
+ };
70
+
71
+ const demonstrateDynamicUpdates = () => {
72
+ console.log('\n=== Dynamic Updates ===');
73
+
74
+ const newTranslations = {
75
+ 'delete:en': {
76
+ key: 'delete',
77
+ locale: 'en',
78
+ value: 'Delete',
79
+ namespace: 'buttons'
80
+ },
81
+ 'edit:en': {
82
+ key: 'edit',
83
+ locale: 'en',
84
+ value: 'Edit {{item}}',
85
+ namespace: 'actions'
86
+ }
87
+ };
88
+
89
+ updateI18nResources(newTranslations);
90
+
91
+ console.log('New button translation:');
92
+ console.log(i18n('delete', {}, 'en', 'buttons'));
93
+
94
+ console.log('New action translation:');
95
+ console.log(i18n('edit', {item: 'profile'}, 'en', 'actions'));
96
+ };
97
+
98
+ const demonstrateFallbacks = () => {
99
+ console.log('\n=== Fallback Behavior ===');
100
+
101
+ console.log('Missing key (returns key):');
102
+ console.log(i18n('missing-key', {}, 'en', 'common'));
103
+
104
+ console.log('Missing namespace (uses default):');
105
+ console.log(i18n('welcome', {name: 'World'}, 'en', 'missing-ns'));
106
+
107
+ console.log('Missing language (uses fallback):');
108
+ console.log(i18n('welcome', {name: 'World'}, 'fr', 'common'));
109
+ };
110
+
111
+ const runExamples = () => {
112
+ initializeTranslations();
113
+ demonstrateNamespaceUsage();
114
+ demonstrateDynamicUpdates();
115
+ demonstrateFallbacks();
116
+ };
117
+
118
+ export { demonstrateNamespaceUsage, initializeTranslations, runExamples };
@@ -0,0 +1,187 @@
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
+
6
+ // This file demonstrates how i18next works as a singleton
7
+ // and how GothamJS can share the same instance as MetropolisJS
8
+
9
+ import { changeLanguage, init, t } from 'i18next';
10
+
11
+ // Step 1: MetropolisJS initializes i18next (this happens in Metropolis component)
12
+ const initializeMetropolisI18n = () => {
13
+ console.log('šŸ”µ MetropolisJS: Initializing i18next...');
14
+
15
+ init({
16
+ resources: {
17
+ en: {
18
+ translations: {
19
+ 'welcome': 'Welcome to MetropolisJS!',
20
+ 'save': 'Save',
21
+ 'cancel': 'Cancel',
22
+ 'shared_text': 'This text is shared between libraries',
23
+ 'hello_user': 'Hello {{name}}!'
24
+ }
25
+ },
26
+ es: {
27
+ translations: {
28
+ 'welcome': '”Bienvenido a MetropolisJS!',
29
+ 'save': 'Guardar',
30
+ 'cancel': 'Cancelar',
31
+ 'shared_text': 'Este texto se comparte entre bibliotecas',
32
+ 'hello_user': '”Hola {{name}}!'
33
+ }
34
+ }
35
+ },
36
+ lng: 'en',
37
+ fallbackLng: 'en',
38
+ interpolation: {
39
+ escapeValue: false
40
+ }
41
+ });
42
+
43
+ console.log('šŸ”µ MetropolisJS: i18next initialized successfully');
44
+ };
45
+
46
+ // Step 2: GothamJS can use the same i18next instance
47
+ const gothamJSComponent = () => {
48
+ console.log('🟢 GothamJS: Using the same i18next instance');
49
+
50
+ // GothamJS can import {t as i18n} from 'i18next' for consistency
51
+ // This gives the same function name as MetropolisJS uses
52
+ // import {t as i18n} from 'i18next';
53
+
54
+ const gothamTitle = t('gotham_title', 'GothamJS Component'); // with fallback
55
+ const sharedText = t('shared_text'); // uses the same translation
56
+ const helloUser = t('hello_user', {name: 'Gotham User'}); // with interpolation
57
+
58
+ console.log('🟢 GothamJS translations:', {
59
+ gothamTitle,
60
+ sharedText,
61
+ helloUser
62
+ });
63
+
64
+ return {
65
+ title: gothamTitle,
66
+ description: sharedText,
67
+ greeting: helloUser
68
+ };
69
+ };
70
+
71
+ // Step 3: Demonstrate language switching affects both libraries
72
+ const demonstrateLanguageSwitching = async () => {
73
+ console.log('\nšŸŒ Demonstrating language switching...');
74
+
75
+ // Both MetropolisJS and GothamJS will see this change
76
+ await changeLanguage('es');
77
+
78
+ console.log('šŸ”„ Language changed to Spanish');
79
+
80
+ // MetropolisJS component
81
+ const metropolisText = t('welcome');
82
+ console.log('šŸ”µ MetropolisJS (Spanish):', metropolisText);
83
+
84
+ // GothamJS component - automatically uses Spanish now
85
+ const gothamText = t('shared_text');
86
+ console.log('🟢 GothamJS (Spanish):', gothamText);
87
+
88
+ // Switch back to English
89
+ await changeLanguage('en');
90
+ console.log('šŸ”„ Language changed back to English');
91
+
92
+ console.log('šŸ”µ MetropolisJS (English):', t('welcome'));
93
+ console.log('🟢 GothamJS (English):', t('shared_text'));
94
+ };
95
+
96
+ // Step 4: Show how namespaces work across libraries
97
+ const demonstrateNamespaces = () => {
98
+ console.log('\nšŸ“š Demonstrating namespaces...');
99
+
100
+ // MetropolisJS might use 'metropolis' namespace
101
+ const metropolisText = t('dashboard_title', {ns: 'metropolis'});
102
+
103
+ // GothamJS might use 'gotham' namespace
104
+ const gothamText = t('widget_title', {ns: 'gotham'});
105
+
106
+ // Both can use 'common' namespace for shared translations
107
+ const commonText = t('shared_button', {ns: 'common'});
108
+
109
+ console.log('šŸ”µ MetropolisJS namespace:', metropolisText);
110
+ console.log('🟢 GothamJS namespace:', gothamText);
111
+ console.log('🟔 Common namespace:', commonText);
112
+ };
113
+
114
+ // Step 5: Real-world usage example
115
+ const realWorldExample = () => {
116
+ console.log('\nšŸ—ļø Real-world usage example:');
117
+
118
+ // In a real React app:
119
+
120
+ // MetropolisJS component
121
+ const MetropolisComponent = () => {
122
+ // This would be in a MetropolisJS component
123
+ const title = t('dashboard_title');
124
+ const saveButton = t('save');
125
+
126
+ console.log('šŸ”µ MetropolisJS component:', {title, saveButton});
127
+
128
+ return {title, saveButton};
129
+ };
130
+
131
+ // GothamJS component
132
+ const GothamComponent = () => {
133
+ // This would be in a GothamJS component
134
+ // import {t} from 'i18next'; // Same i18next instance!
135
+
136
+ const widgetTitle = t('widget_title');
137
+ const sharedButton = t('shared_button');
138
+
139
+ console.log('🟢 GothamJS component:', {widgetTitle, sharedButton});
140
+
141
+ return {widgetTitle, sharedButton};
142
+ };
143
+
144
+ const metropolis = MetropolisComponent();
145
+ const gotham = GothamComponent();
146
+
147
+ console.log('āœ… Both components use the same i18next instance!');
148
+ console.log('āœ… Language changes affect both components!');
149
+ console.log('āœ… Namespaces keep translations organized!');
150
+
151
+ return {metropolis, gotham};
152
+ };
153
+
154
+ // Run the demonstration
155
+ const runDemo = () => {
156
+ console.log('šŸš€ i18next Singleton Demonstration');
157
+ console.log('=====================================\n');
158
+
159
+ // Initialize i18next (MetropolisJS does this)
160
+ initializeMetropolisI18n();
161
+
162
+ // GothamJS uses the same instance
163
+ const gothamResult = gothamJSComponent();
164
+
165
+ // Demonstrate language switching
166
+ demonstrateLanguageSwitching();
167
+
168
+ // Demonstrate namespaces
169
+ demonstrateNamespaces();
170
+
171
+ // Real-world example
172
+ const realWorld = realWorldExample();
173
+
174
+ console.log('\nāœ… Demonstration complete!');
175
+ console.log('āœ… GothamJS can fully share i18next with MetropolisJS');
176
+ console.log('āœ… Both libraries benefit from the same translation system');
177
+
178
+ return {
179
+ gothamResult,
180
+ realWorld
181
+ };
182
+ };
183
+
184
+ export {
185
+ demonstrateLanguageSwitching,
186
+ demonstrateNamespaces, gothamJSComponent, initializeMetropolisI18n, realWorldExample, runDemo
187
+ };