@infosel-sdk/widgets 1.0.1

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 (291) hide show
  1. package/CHANGELOG.md +167 -0
  2. package/README.md +966 -0
  3. package/package.json +39 -0
  4. package/src/__tests__/__mocks__/apis/charts-api.mock.d.ts +106 -0
  5. package/src/__tests__/__mocks__/apis/charts-api.mock.js +110 -0
  6. package/src/__tests__/__mocks__/apis/charts-api.mock.js.map +1 -0
  7. package/src/__tests__/__mocks__/apis/markets-api.mock.d.ts +148 -0
  8. package/src/__tests__/__mocks__/apis/markets-api.mock.js +121 -0
  9. package/src/__tests__/__mocks__/apis/markets-api.mock.js.map +1 -0
  10. package/src/__tests__/__mocks__/core/auth-provider.mock.d.ts +63 -0
  11. package/src/__tests__/__mocks__/core/auth-provider.mock.js +50 -0
  12. package/src/__tests__/__mocks__/core/auth-provider.mock.js.map +1 -0
  13. package/src/__tests__/__mocks__/core/graphql-client.mock.d.ts +36 -0
  14. package/src/__tests__/__mocks__/core/graphql-client.mock.js +60 -0
  15. package/src/__tests__/__mocks__/core/graphql-client.mock.js.map +1 -0
  16. package/src/__tests__/__mocks__/core/http-client.mock.d.ts +43 -0
  17. package/src/__tests__/__mocks__/core/http-client.mock.js +40 -0
  18. package/src/__tests__/__mocks__/core/http-client.mock.js.map +1 -0
  19. package/src/__tests__/__mocks__/core/sdk-manager.mock.d.ts +116 -0
  20. package/src/__tests__/__mocks__/core/sdk-manager.mock.js +58 -0
  21. package/src/__tests__/__mocks__/core/sdk-manager.mock.js.map +1 -0
  22. package/src/__tests__/__mocks__/core/storage.mock.d.ts +32 -0
  23. package/src/__tests__/__mocks__/core/storage.mock.js +35 -0
  24. package/src/__tests__/__mocks__/core/storage.mock.js.map +1 -0
  25. package/src/__tests__/setup.d.ts +16 -0
  26. package/src/__tests__/setup.js +34 -0
  27. package/src/__tests__/setup.js.map +1 -0
  28. package/src/__tests__/utils/mock-datasource.d.ts +5 -0
  29. package/src/__tests__/utils/mock-datasource.js +39 -0
  30. package/src/__tests__/utils/mock-datasource.js.map +1 -0
  31. package/src/__tests__/utils/mock-factories.d.ts +547 -0
  32. package/src/__tests__/utils/mock-factories.js +226 -0
  33. package/src/__tests__/utils/mock-factories.js.map +1 -0
  34. package/src/__tests__/utils/mock-repository.d.ts +22 -0
  35. package/src/__tests__/utils/mock-repository.js +73 -0
  36. package/src/__tests__/utils/mock-repository.js.map +1 -0
  37. package/src/__tests__/utils/test-helpers.d.ts +52 -0
  38. package/src/__tests__/utils/test-helpers.js +169 -0
  39. package/src/__tests__/utils/test-helpers.js.map +1 -0
  40. package/src/data/datasources/widgets_datasource_impl.d.ts +57 -0
  41. package/src/data/datasources/widgets_datasource_impl.js +997 -0
  42. package/src/data/datasources/widgets_datasource_impl.js.map +1 -0
  43. package/src/data/di/infosel_widgets_component.d.ts +68 -0
  44. package/src/data/di/infosel_widgets_component.js +170 -0
  45. package/src/data/di/infosel_widgets_component.js.map +1 -0
  46. package/src/data/di/infosel_widgets_module.d.ts +17 -0
  47. package/src/data/di/infosel_widgets_module.js +34 -0
  48. package/src/data/di/infosel_widgets_module.js.map +1 -0
  49. package/src/data/mappers/widgets_mapper.d.ts +52 -0
  50. package/src/data/mappers/widgets_mapper.js +294 -0
  51. package/src/data/mappers/widgets_mapper.js.map +1 -0
  52. package/src/data/models/delete_workspace_response_model.d.ts +5 -0
  53. package/src/data/models/delete_workspace_response_model.js +3 -0
  54. package/src/data/models/delete_workspace_response_model.js.map +1 -0
  55. package/src/data/models/get_user_workspaces_response_model.d.ts +15 -0
  56. package/src/data/models/get_user_workspaces_response_model.js +3 -0
  57. package/src/data/models/get_user_workspaces_response_model.js.map +1 -0
  58. package/src/data/models/instrument_fields_model.d.ts +84 -0
  59. package/src/data/models/instrument_fields_model.js +3 -0
  60. package/src/data/models/instrument_fields_model.js.map +1 -0
  61. package/src/data/models/instrument_model.d.ts +5 -0
  62. package/src/data/models/instrument_model.js +3 -0
  63. package/src/data/models/instrument_model.js.map +1 -0
  64. package/src/data/models/project_model.d.ts +12 -0
  65. package/src/data/models/project_model.js +3 -0
  66. package/src/data/models/project_model.js.map +1 -0
  67. package/src/data/models/project_widgets_response_model.d.ts +8 -0
  68. package/src/data/models/project_widgets_response_model.js +3 -0
  69. package/src/data/models/project_widgets_response_model.js.map +1 -0
  70. package/src/data/models/user_model.d.ts +7 -0
  71. package/src/data/models/user_model.js +3 -0
  72. package/src/data/models/user_model.js.map +1 -0
  73. package/src/data/models/user_widgets_response_model.d.ts +7 -0
  74. package/src/data/models/user_widgets_response_model.js +3 -0
  75. package/src/data/models/user_widgets_response_model.js.map +1 -0
  76. package/src/data/models/widget_brokerage_concentration_configuration.d.ts +4 -0
  77. package/src/data/models/widget_brokerage_concentration_configuration.js +3 -0
  78. package/src/data/models/widget_brokerage_concentration_configuration.js.map +1 -0
  79. package/src/data/models/widget_brokerage_participation_configuration.d.ts +10 -0
  80. package/src/data/models/widget_brokerage_participation_configuration.js +3 -0
  81. package/src/data/models/widget_brokerage_participation_configuration.js.map +1 -0
  82. package/src/data/models/widget_brokerage_trades_configuration.d.ts +11 -0
  83. package/src/data/models/widget_brokerage_trades_configuration.js +3 -0
  84. package/src/data/models/widget_brokerage_trades_configuration.js.map +1 -0
  85. package/src/data/models/widget_chart_configuration_model.d.ts +4 -0
  86. package/src/data/models/widget_chart_configuration_model.js +3 -0
  87. package/src/data/models/widget_chart_configuration_model.js.map +1 -0
  88. package/src/data/models/widget_decreed_search_configuration.d.ts +10 -0
  89. package/src/data/models/widget_decreed_search_configuration.js +3 -0
  90. package/src/data/models/widget_decreed_search_configuration.js.map +1 -0
  91. package/src/data/models/widget_dynamic_table_configuration.d.ts +14 -0
  92. package/src/data/models/widget_dynamic_table_configuration.js +3 -0
  93. package/src/data/models/widget_dynamic_table_configuration.js.map +1 -0
  94. package/src/data/models/widget_indices_components_configuration.d.ts +7 -0
  95. package/src/data/models/widget_indices_components_configuration.js +3 -0
  96. package/src/data/models/widget_indices_components_configuration.js.map +1 -0
  97. package/src/data/models/widget_layout_model.d.ts +6 -0
  98. package/src/data/models/widget_layout_model.js +3 -0
  99. package/src/data/models/widget_layout_model.js.map +1 -0
  100. package/src/data/models/widget_market_total_configuration.d.ts +4 -0
  101. package/src/data/models/widget_market_total_configuration.js +3 -0
  102. package/src/data/models/widget_market_total_configuration.js.map +1 -0
  103. package/src/data/models/widget_model.d.ts +33 -0
  104. package/src/data/models/widget_model.js +3 -0
  105. package/src/data/models/widget_model.js.map +1 -0
  106. package/src/data/models/widget_size_model.d.ts +14 -0
  107. package/src/data/models/widget_size_model.js +3 -0
  108. package/src/data/models/widget_size_model.js.map +1 -0
  109. package/src/data/models/widget_table_column_format_model.d.ts +6 -0
  110. package/src/data/models/widget_table_column_format_model.js +3 -0
  111. package/src/data/models/widget_table_column_format_model.js.map +1 -0
  112. package/src/data/models/widget_table_column_model.d.ts +8 -0
  113. package/src/data/models/widget_table_column_model.js +3 -0
  114. package/src/data/models/widget_table_column_model.js.map +1 -0
  115. package/src/data/models/widget_ticker_configuration.d.ts +7 -0
  116. package/src/data/models/widget_ticker_configuration.js +3 -0
  117. package/src/data/models/widget_ticker_configuration.js.map +1 -0
  118. package/src/data/models/widget_traded_packages_configuration.d.ts +4 -0
  119. package/src/data/models/widget_traded_packages_configuration.js +3 -0
  120. package/src/data/models/widget_traded_packages_configuration.js.map +1 -0
  121. package/src/data/models/workspace_model.d.ts +6 -0
  122. package/src/data/models/workspace_model.js +3 -0
  123. package/src/data/models/workspace_model.js.map +1 -0
  124. package/src/data/repositories/widgets_repository_impl.d.ts +46 -0
  125. package/src/data/repositories/widgets_repository_impl.js +66 -0
  126. package/src/data/repositories/widgets_repository_impl.js.map +1 -0
  127. package/src/domain/datasources/widgets_datasource.d.ts +41 -0
  128. package/src/domain/datasources/widgets_datasource.js +3 -0
  129. package/src/domain/datasources/widgets_datasource.js.map +1 -0
  130. package/src/domain/di/widgets_component.d.ts +42 -0
  131. package/src/domain/di/widgets_component.js +3 -0
  132. package/src/domain/di/widgets_component.js.map +1 -0
  133. package/src/domain/di/widgets_module.d.ts +8 -0
  134. package/src/domain/di/widgets_module.js +3 -0
  135. package/src/domain/di/widgets_module.js.map +1 -0
  136. package/src/domain/entities/chart_configuration.d.ts +5 -0
  137. package/src/domain/entities/chart_configuration.js +3 -0
  138. package/src/domain/entities/chart_configuration.js.map +1 -0
  139. package/src/domain/entities/create_instrument_request.d.ts +5 -0
  140. package/src/domain/entities/create_instrument_request.js +3 -0
  141. package/src/domain/entities/create_instrument_request.js.map +1 -0
  142. package/src/domain/entities/create_widget_request.d.ts +36 -0
  143. package/src/domain/entities/create_widget_request.js +3 -0
  144. package/src/domain/entities/create_widget_request.js.map +1 -0
  145. package/src/domain/entities/create_workspace_request.d.ts +5 -0
  146. package/src/domain/entities/create_workspace_request.js +3 -0
  147. package/src/domain/entities/create_workspace_request.js.map +1 -0
  148. package/src/domain/entities/delete_workspace_request.d.ts +3 -0
  149. package/src/domain/entities/delete_workspace_request.js +3 -0
  150. package/src/domain/entities/delete_workspace_request.js.map +1 -0
  151. package/src/domain/entities/duplicate_widget_request.d.ts +5 -0
  152. package/src/domain/entities/duplicate_widget_request.js +3 -0
  153. package/src/domain/entities/duplicate_widget_request.js.map +1 -0
  154. package/src/domain/entities/duplicate_workspace_request.d.ts +5 -0
  155. package/src/domain/entities/duplicate_workspace_request.js +3 -0
  156. package/src/domain/entities/duplicate_workspace_request.js.map +1 -0
  157. package/src/domain/entities/get_instruments_request.d.ts +12 -0
  158. package/src/domain/entities/get_instruments_request.js +3 -0
  159. package/src/domain/entities/get_instruments_request.js.map +1 -0
  160. package/src/domain/entities/get_project_widgets_request.d.ts +12 -0
  161. package/src/domain/entities/get_project_widgets_request.js +3 -0
  162. package/src/domain/entities/get_project_widgets_request.js.map +1 -0
  163. package/src/domain/entities/get_user_widgets_request.d.ts +3 -0
  164. package/src/domain/entities/get_user_widgets_request.js +3 -0
  165. package/src/domain/entities/get_user_widgets_request.js.map +1 -0
  166. package/src/domain/entities/get_user_workspaces_request.d.ts +4 -0
  167. package/src/domain/entities/get_user_workspaces_request.js +3 -0
  168. package/src/domain/entities/get_user_workspaces_request.js.map +1 -0
  169. package/src/domain/entities/get_workspace_request.d.ts +3 -0
  170. package/src/domain/entities/get_workspace_request.js +3 -0
  171. package/src/domain/entities/get_workspace_request.js.map +1 -0
  172. package/src/domain/entities/get_workspaces_by_user_request.d.ts +12 -0
  173. package/src/domain/entities/get_workspaces_by_user_request.js +3 -0
  174. package/src/domain/entities/get_workspaces_by_user_request.js.map +1 -0
  175. package/src/domain/entities/get_workspaces_request.d.ts +12 -0
  176. package/src/domain/entities/get_workspaces_request.js +3 -0
  177. package/src/domain/entities/get_workspaces_request.js.map +1 -0
  178. package/src/domain/entities/index.d.ts +30 -0
  179. package/src/domain/entities/index.js +34 -0
  180. package/src/domain/entities/index.js.map +1 -0
  181. package/src/domain/entities/instrument.d.ts +4 -0
  182. package/src/domain/entities/instrument.js +3 -0
  183. package/src/domain/entities/instrument.js.map +1 -0
  184. package/src/domain/entities/instrument_fields.d.ts +86 -0
  185. package/src/domain/entities/instrument_fields.js +3 -0
  186. package/src/domain/entities/instrument_fields.js.map +1 -0
  187. package/src/domain/entities/instruments_response.d.ts +6 -0
  188. package/src/domain/entities/instruments_response.js +3 -0
  189. package/src/domain/entities/instruments_response.js.map +1 -0
  190. package/src/domain/entities/news_configuration.d.ts +8 -0
  191. package/src/domain/entities/news_configuration.js +3 -0
  192. package/src/domain/entities/news_configuration.js.map +1 -0
  193. package/src/domain/entities/project_widgets_container.d.ts +8 -0
  194. package/src/domain/entities/project_widgets_container.js +3 -0
  195. package/src/domain/entities/project_widgets_container.js.map +1 -0
  196. package/src/domain/entities/update_widget_chart_request.d.ts +4 -0
  197. package/src/domain/entities/update_widget_chart_request.js +3 -0
  198. package/src/domain/entities/update_widget_chart_request.js.map +1 -0
  199. package/src/domain/entities/update_widget_instruments_reques.d.ts +11 -0
  200. package/src/domain/entities/update_widget_instruments_reques.js +3 -0
  201. package/src/domain/entities/update_widget_instruments_reques.js.map +1 -0
  202. package/src/domain/entities/update_workspace_request.d.ts +19 -0
  203. package/src/domain/entities/update_workspace_request.js +3 -0
  204. package/src/domain/entities/update_workspace_request.js.map +1 -0
  205. package/src/domain/entities/user_widgets.d.ts +5 -0
  206. package/src/domain/entities/user_widgets.js +3 -0
  207. package/src/domain/entities/user_widgets.js.map +1 -0
  208. package/src/domain/entities/user_workspaces.d.ts +8 -0
  209. package/src/domain/entities/user_workspaces.js +3 -0
  210. package/src/domain/entities/user_workspaces.js.map +1 -0
  211. package/src/domain/entities/widget.d.ts +129 -0
  212. package/src/domain/entities/widget.js +3 -0
  213. package/src/domain/entities/widget.js.map +1 -0
  214. package/src/domain/entities/widget_layout_config.d.ts +15 -0
  215. package/src/domain/entities/widget_layout_config.js +3 -0
  216. package/src/domain/entities/widget_layout_config.js.map +1 -0
  217. package/src/domain/entities/widget_size_config.d.ts +6 -0
  218. package/src/domain/entities/widget_size_config.js +3 -0
  219. package/src/domain/entities/widget_size_config.js.map +1 -0
  220. package/src/domain/entities/workspace.d.ts +13 -0
  221. package/src/domain/entities/workspace.js +3 -0
  222. package/src/domain/entities/workspace.js.map +1 -0
  223. package/src/domain/entities/workspace_widgets.d.ts +6 -0
  224. package/src/domain/entities/workspace_widgets.js +3 -0
  225. package/src/domain/entities/workspace_widgets.js.map +1 -0
  226. package/src/domain/entities/workspaces_container.d.ts +18 -0
  227. package/src/domain/entities/workspaces_container.js +3 -0
  228. package/src/domain/entities/workspaces_container.js.map +1 -0
  229. package/src/domain/repositories/widgets_repository.d.ts +42 -0
  230. package/src/domain/repositories/widgets_repository.js +3 -0
  231. package/src/domain/repositories/widgets_repository.js.map +1 -0
  232. package/src/domain/use_cases/create_instrument_use_case.d.ts +9 -0
  233. package/src/domain/use_cases/create_instrument_use_case.js +22 -0
  234. package/src/domain/use_cases/create_instrument_use_case.js.map +1 -0
  235. package/src/domain/use_cases/create_widget_use_case.d.ts +9 -0
  236. package/src/domain/use_cases/create_widget_use_case.js +32 -0
  237. package/src/domain/use_cases/create_widget_use_case.js.map +1 -0
  238. package/src/domain/use_cases/create_workspace_use_case.d.ts +9 -0
  239. package/src/domain/use_cases/create_workspace_use_case.js +22 -0
  240. package/src/domain/use_cases/create_workspace_use_case.js.map +1 -0
  241. package/src/domain/use_cases/delete_instrument_use_case.d.ts +7 -0
  242. package/src/domain/use_cases/delete_instrument_use_case.js +19 -0
  243. package/src/domain/use_cases/delete_instrument_use_case.js.map +1 -0
  244. package/src/domain/use_cases/delete_widget_use_case.d.ts +7 -0
  245. package/src/domain/use_cases/delete_widget_use_case.js +19 -0
  246. package/src/domain/use_cases/delete_widget_use_case.js.map +1 -0
  247. package/src/domain/use_cases/delete_workspace_use_case.d.ts +8 -0
  248. package/src/domain/use_cases/delete_workspace_use_case.js +22 -0
  249. package/src/domain/use_cases/delete_workspace_use_case.js.map +1 -0
  250. package/src/domain/use_cases/duplicate_widget_use_case.d.ts +8 -0
  251. package/src/domain/use_cases/duplicate_widget_use_case.js +15 -0
  252. package/src/domain/use_cases/duplicate_widget_use_case.js.map +1 -0
  253. package/src/domain/use_cases/duplicate_workspace_use_case.d.ts +8 -0
  254. package/src/domain/use_cases/duplicate_workspace_use_case.js +15 -0
  255. package/src/domain/use_cases/duplicate_workspace_use_case.js.map +1 -0
  256. package/src/domain/use_cases/get_instruments_use_case.d.ts +9 -0
  257. package/src/domain/use_cases/get_instruments_use_case.js +16 -0
  258. package/src/domain/use_cases/get_instruments_use_case.js.map +1 -0
  259. package/src/domain/use_cases/get_project_widgets_use_case.d.ts +9 -0
  260. package/src/domain/use_cases/get_project_widgets_use_case.js +19 -0
  261. package/src/domain/use_cases/get_project_widgets_use_case.js.map +1 -0
  262. package/src/domain/use_cases/get_user_widgets_use_case.d.ts +9 -0
  263. package/src/domain/use_cases/get_user_widgets_use_case.js +22 -0
  264. package/src/domain/use_cases/get_user_widgets_use_case.js.map +1 -0
  265. package/src/domain/use_cases/get_user_workspace_use_case.d.ts +9 -0
  266. package/src/domain/use_cases/get_user_workspace_use_case.js +22 -0
  267. package/src/domain/use_cases/get_user_workspace_use_case.js.map +1 -0
  268. package/src/domain/use_cases/get_workspace_use_case.d.ts +9 -0
  269. package/src/domain/use_cases/get_workspace_use_case.js +19 -0
  270. package/src/domain/use_cases/get_workspace_use_case.js.map +1 -0
  271. package/src/domain/use_cases/get_workspaces_by_project_id_use_case.d.ts +9 -0
  272. package/src/domain/use_cases/get_workspaces_by_project_id_use_case.js +19 -0
  273. package/src/domain/use_cases/get_workspaces_by_project_id_use_case.js.map +1 -0
  274. package/src/domain/use_cases/get_workspaces_by_user_use_case.d.ts +9 -0
  275. package/src/domain/use_cases/get_workspaces_by_user_use_case.js +19 -0
  276. package/src/domain/use_cases/get_workspaces_by_user_use_case.js.map +1 -0
  277. package/src/domain/use_cases/get_workspaces_use_case.d.ts +9 -0
  278. package/src/domain/use_cases/get_workspaces_use_case.js +19 -0
  279. package/src/domain/use_cases/get_workspaces_use_case.js.map +1 -0
  280. package/src/domain/use_cases/update_widget_chart_use_case.d.ts +7 -0
  281. package/src/domain/use_cases/update_widget_chart_use_case.js +15 -0
  282. package/src/domain/use_cases/update_widget_chart_use_case.js.map +1 -0
  283. package/src/domain/use_cases/update_widget_instruments_use_case.d.ts +9 -0
  284. package/src/domain/use_cases/update_widget_instruments_use_case.js +22 -0
  285. package/src/domain/use_cases/update_widget_instruments_use_case.js.map +1 -0
  286. package/src/domain/use_cases/update_workspace_use_case.d.ts +8 -0
  287. package/src/domain/use_cases/update_workspace_use_case.js +15 -0
  288. package/src/domain/use_cases/update_workspace_use_case.js.map +1 -0
  289. package/src/index.d.ts +6 -0
  290. package/src/index.js +10 -0
  291. package/src/index.js.map +1 -0
package/README.md ADDED
@@ -0,0 +1,966 @@
1
+ # @infosel-sdk/widgets
2
+
3
+ SDK de Widgets para la plataforma Infosel. Proporciona herramientas completas para crear, gestionar y configurar widgets, espacios de trabajo e instrumentos para aplicaciones financieras.
4
+
5
+ ## 🚀 Características
6
+
7
+ - **Gestión de Widgets**: Crear, actualizar, eliminar y duplicar widgets financieros personalizables
8
+ - **Gestión de Espacios de Trabajo**: Organizar y gestionar espacios de trabajo de usuarios
9
+ - **Gestión de Instrumentos**: Crear y gestionar instrumentos financieros personalizados
10
+ - **Configuración Avanzada**: Soporte para múltiples tipos de widgets (gráficos, tablas, noticias, etc.)
11
+ - **API GraphQL**: Comunicación eficiente mediante GraphQL
12
+
13
+ ## 📦 Instalación
14
+
15
+ ```bash
16
+ npm install @infosel-sdk/widgets
17
+ ```
18
+
19
+ ## 🚀 Inicio Rápido
20
+
21
+ ### ✨ Configuración Moderna (Recomendado)
22
+
23
+ La nueva API del core proporciona una configuración más limpia y validada:
24
+
25
+ ```typescript
26
+ import InfoselWidgets from '@infosel-sdk/widgets';
27
+ import { InfoselSdkManager, AuthConfigurationBuilder } from '@infosel-sdk/core';
28
+
29
+ // Configuración moderna con Builder Pattern
30
+ const authConfig = AuthConfigurationBuilder.keyCloak()
31
+ .withRealm('hub')
32
+ .withEnvironment('qa')
33
+ .withCredentials({
34
+ grant_type: 'client_credentials',
35
+ client_id: 'tu-client-id',
36
+ client_secret: 'tu-client-secret',
37
+ })
38
+ .build();
39
+
40
+ // Inicializar SDK Manager con configuración moderna
41
+ const sdkManager = InfoselSdkManager.initWithConfiguration({
42
+ authConfiguration: authConfig,
43
+ });
44
+
45
+ // Inicializar SDK de Widgets
46
+ const widgetsSDK = InfoselWidgets.init({ sdkManager });
47
+
48
+ // Crear un espacio de trabajo
49
+ const workspace = await widgetsSDK.createWorkspace({
50
+ name: 'Mi Dashboard',
51
+ description: 'Espacio de trabajo personal',
52
+ });
53
+ ```
54
+
55
+ ### Configuración con Token Existente
56
+
57
+ ```typescript
58
+ import InfoselWidgets from '@infosel-sdk/widgets';
59
+ import {
60
+ InfoselSdkManager,
61
+ AuthConfigurationBuilder,
62
+ Token,
63
+ } from '@infosel-sdk/core';
64
+
65
+ // Configuración con token existente
66
+ const token: Token = {
67
+ accessToken: 'tu-access-token',
68
+ refreshToken: 'tu-refresh-token',
69
+ };
70
+
71
+ const authConfig = AuthConfigurationBuilder.existingToken()
72
+ .withRealm('hub')
73
+ .withEnvironment('prod')
74
+ .withClientId('hub-app')
75
+ .withToken(token)
76
+ .build();
77
+
78
+ const sdkManager = InfoselSdkManager.initWithConfiguration({
79
+ authConfiguration: authConfig,
80
+ });
81
+
82
+ const widgetsSDK = InfoselWidgets.init({ sdkManager });
83
+ ```
84
+
85
+ ## 🔍 Validación de Configuración
86
+
87
+ La nueva API incluye validaciones robustas:
88
+
89
+ ```typescript
90
+ import { AuthConfigurationBuilder } from '@infosel-sdk/core';
91
+
92
+ const builder = AuthConfigurationBuilder.keyCloak()
93
+ .withRealm('invalid@realm') // Caracteres inválidos
94
+ .withCredentials({
95
+ grant_type: 'client_credentials',
96
+ client_id: '', // Client ID vacío
97
+ client_secret: 'secret',
98
+ });
99
+
100
+ // Validar antes de construir
101
+ const validation = builder.validate();
102
+ if (!validation.isValid) {
103
+ console.log('Errores:', validation.errors);
104
+ // ['Realm contains invalid characters...', 'Client ID is required...']
105
+ }
106
+
107
+ // O validar automáticamente al construir
108
+ try {
109
+ const config = builder.build();
110
+ } catch (error) {
111
+ console.error(error.message); // Lista todos los errores de validación
112
+ }
113
+ ```
114
+
115
+ ## 📚 API Completa del SDK
116
+
117
+ ### 🏢 Gestión de Espacios de Trabajo
118
+
119
+ #### Crear Espacio de Trabajo
120
+
121
+ ```typescript
122
+ const workspace = await widgetsSDK.createWorkspace({
123
+ name: 'Mi Dashboard de Trading',
124
+ description: 'Espacio de trabajo personal para análisis de mercado',
125
+ userId: 'user-123', // Opcional: asociar a usuario específico
126
+ projectId: 'project-123', // Opcional: asociar a proyecto específico
127
+ });
128
+
129
+ console.log('Espacio de trabajo creado:', workspace);
130
+ ```
131
+
132
+ #### Obtener Espacios de Trabajo
133
+
134
+ ```typescript
135
+ // Obtener todos los espacios de trabajo de un proyecto
136
+ const allWorkspaces = await widgetsSDK.getWorkspaces({
137
+ projectId: 'project-123',
138
+ });
139
+
140
+ // Obtener espacios de trabajo por usuario
141
+ const userWorkspaces = await widgetsSDK.getWorkspacesByUser({
142
+ userId: 'user-123',
143
+ });
144
+
145
+ // Obtener espacios de trabajo específicos del usuario (por connectionId)
146
+ const specificUserWorkspaces = await widgetsSDK.getUserWorkspaces({
147
+ connectionId: 'connection-123',
148
+ projectId: 'project-123',
149
+ });
150
+
151
+ // Obtener espacios de trabajo por ID de proyecto
152
+ const projectWorkspaces = await widgetsSDK.getWorkspacesByProjectId({
153
+ projectId: 'project-123',
154
+ });
155
+
156
+ console.log('Espacios de trabajo:', allWorkspaces);
157
+ ```
158
+
159
+ #### Obtener Detalles del Espacio de Trabajo
160
+
161
+ ```typescript
162
+ const workspaceDetails = await widgetsSDK.getWorkspace({
163
+ workspaceId: 'workspace-123',
164
+ });
165
+
166
+ console.log('Detalles del workspace:', workspaceDetails);
167
+ console.log('Widgets en el workspace:', workspaceDetails.widgets);
168
+ ```
169
+
170
+ #### Actualizar Espacio de Trabajo
171
+
172
+ ```typescript
173
+ const updatedWorkspace = await widgetsSDK.updateWorkspace({
174
+ id: 'workspace-123',
175
+ name: 'Dashboard Actualizado',
176
+ description: 'Nueva descripción del espacio de trabajo',
177
+ });
178
+
179
+ console.log('Espacio de trabajo actualizado:', updatedWorkspace);
180
+ ```
181
+
182
+ #### Duplicar Espacio de Trabajo
183
+
184
+ ```typescript
185
+ const duplicatedWorkspace = await widgetsSDK.duplicateWorkspace({
186
+ id: 'workspace-123',
187
+ name: 'Copia de Mi Dashboard',
188
+ });
189
+
190
+ console.log('Espacio de trabajo duplicado:', duplicatedWorkspace);
191
+ ```
192
+
193
+ #### Eliminar Espacio de Trabajo
194
+
195
+ ```typescript
196
+ const result = await widgetsSDK.deleteWorkspace({
197
+ id: 'workspace-123',
198
+ });
199
+
200
+ console.log('Resultado:', result); // ID del workspace eliminado
201
+ ```
202
+
203
+ ### 🎯 Gestión de Widgets
204
+
205
+ #### Crear Widget
206
+
207
+ ```typescript
208
+ // Widget de gráfico
209
+ const chartWidget = await widgetsSDK.createWidget({
210
+ workspaceId: 'workspace-123',
211
+ type: 'CHART',
212
+ name: 'Gráfico de AAPL',
213
+ instruments: [
214
+ {
215
+ uniqueKey: 'AAPL_US',
216
+ symbol: 'AAPL',
217
+ },
218
+ ],
219
+ });
220
+
221
+ // Widget de tabla dinámica
222
+ const tableWidget = await widgetsSDK.createWidget({
223
+ workspaceId: 'workspace-123',
224
+ type: 'DYNAMIC_TABLE',
225
+ name: 'Tabla de Precios',
226
+ instruments: [
227
+ {
228
+ uniqueKey: 'AAPL_US',
229
+ symbol: 'AAPL',
230
+ },
231
+ {
232
+ uniqueKey: 'MSFT_US',
233
+ symbol: 'MSFT',
234
+ },
235
+ ],
236
+ });
237
+
238
+ // Widget de lista de noticias
239
+ const newsWidget = await widgetsSDK.createWidget({
240
+ workspaceId: 'workspace-123',
241
+ type: 'NEWS_LIST',
242
+ name: 'Noticias Financieras',
243
+ newsConfiguration: {
244
+ period: 12,
245
+ listType: 9,
246
+ limit: 20,
247
+ offset: 0,
248
+ sourcesId: '',
249
+ newsTypeId: '',
250
+ },
251
+ sizes: {
252
+ create: {
253
+ node: {
254
+ width: 12,
255
+ height: 18,
256
+ minWidth: 12,
257
+ minHeight: 12,
258
+ maxWidth: 18,
259
+ maxHeight: 18,
260
+ x: 0,
261
+ y: 0,
262
+ },
263
+ },
264
+ },
265
+ });
266
+
267
+ console.log('Widget creado:', chartWidget);
268
+ ```
269
+
270
+ #### Tipos de Widgets Disponibles
271
+
272
+ ```typescript
273
+ // Tipos soportados:
274
+ // - 'FINANCIAL_STATEMENTS': Estados financieros
275
+ // - 'DYNAMIC_TABLE': Tabla dinámica
276
+ // - 'PREDEFINED_TABLE': Tabla predefinida
277
+ // - 'NEWS_LIST': Lista de noticias
278
+ // - 'TICKER_TAPE': Cinta de ticker
279
+ // - 'CHART': Gráfico
280
+ // - 'CUSTOM_TABLE': Tabla personalizada
281
+ // - 'SHORT_SALES': Ventas en corto
282
+ // - 'MARKET_TOTAL': Total de mercado
283
+ // - 'TRADED_PACKAGES': Paquetes negociados
284
+ // - 'BROKERAGE_TRADES': Operaciones de corretaje
285
+ // - 'BROKERAGE_CONCENTRATION': Concentración de corretaje
286
+ // - 'BROKERAGE_PARTICIPATION': Participación de corretaje
287
+ // - 'DECREED_RIGHTS_SEARCHER': Buscador de derechos decretados
288
+ // - 'INDICES_COMPONENTS': Componentes de índices
289
+ ```
290
+
291
+ #### Actualizar Instrumentos del Widget
292
+
293
+ ```typescript
294
+ const updatedInstruments = await widgetsSDK.updateWidgetInstruments({
295
+ widgetId: 'widget-123',
296
+ instruments: {
297
+ keys: ['AAPL_US', 'MSFT_US', 'GOOGL_US'],
298
+ },
299
+ });
300
+
301
+ console.log('Instrumentos actualizados:', updatedInstruments);
302
+ ```
303
+
304
+ #### Actualizar Configuración del Gráfico del Widget
305
+
306
+ ```typescript
307
+ const result = await widgetsSDK.updateWidgetChart({
308
+ widgetId: 'widget-123',
309
+ chartConfiguration: {
310
+ id: 'chart-config-123',
311
+ globalConfiguration: JSON.stringify({
312
+ // Configuración del gráfico
313
+ type: 'line',
314
+ colors: ['#FF5733', '#33FF57'],
315
+ }),
316
+ },
317
+ });
318
+
319
+ console.log('Configuración actualizada:', result);
320
+ ```
321
+
322
+ #### Duplicar Widget
323
+
324
+ ```typescript
325
+ const duplicatedWidget = await widgetsSDK.duplicateWidget({
326
+ widgetId: 'widget-123',
327
+ workspaceId: 'workspace-456',
328
+ name: 'Copia del Widget',
329
+ });
330
+
331
+ console.log('Widget duplicado:', duplicatedWidget);
332
+ ```
333
+
334
+ #### Eliminar Widget
335
+
336
+ ```typescript
337
+ const result = await widgetsSDK.deleteWidget('widget-123');
338
+ console.log('Resultado:', result); // ID del widget eliminado
339
+ ```
340
+
341
+ #### Obtener Widgets del Proyecto
342
+
343
+ ```typescript
344
+ const projectWidgets = await widgetsSDK.getProjectWidgets({
345
+ projectId: 'project-123',
346
+ });
347
+
348
+ console.log('Widgets del proyecto:', projectWidgets);
349
+ console.log('Widgets por workspace:', projectWidgets.workspaces);
350
+ ```
351
+
352
+ #### Obtener Widgets del Usuario
353
+
354
+ ```typescript
355
+ const userWidgets = await widgetsSDK.getUserWidgets({
356
+ id: 'user-123',
357
+ });
358
+
359
+ console.log('Widgets del usuario:', userWidgets);
360
+ console.log('Total de widgets:', userWidgets.widgets.length);
361
+ ```
362
+
363
+ ### 🔧 Gestión de Instrumentos
364
+
365
+ #### Crear Instrumento Personalizado
366
+
367
+ ```typescript
368
+ const newInstrument = await widgetsSDK.createInstrument({
369
+ symbol: 'CUSTOM_STOCK',
370
+ uniqueKey: 'CUSTOM_001',
371
+ widgetId: 'widget-123',
372
+ });
373
+
374
+ console.log('Instrumento creado:', newInstrument);
375
+ ```
376
+
377
+ #### Obtener Lista de Instrumentos
378
+
379
+ ```typescript
380
+ const instruments = await widgetsSDK.getInstruments({
381
+ workspaceId: 'workspace-123',
382
+ // Parámetros opcionales de paginación
383
+ limit: 50,
384
+ offset: 0,
385
+ });
386
+
387
+ console.log('Total de instrumentos:', instruments.total);
388
+ console.log('Instrumentos:', instruments.fields);
389
+ ```
390
+
391
+ #### Eliminar Instrumento
392
+
393
+ ```typescript
394
+ const result = await widgetsSDK.deleteInstrument('instrument-id-123');
395
+ console.log('Resultado:', result); // ID del instrumento eliminado
396
+ ```
397
+
398
+ ## 🔧 Ejemplos Prácticos Completos
399
+
400
+ ### 📱 Dashboard Completo de Widgets
401
+
402
+ ```typescript
403
+ import InfoselWidgets from '@infosel-sdk/widgets';
404
+ import { InfoselSdkManager, AuthConfigurationBuilder } from '@infosel-sdk/core';
405
+
406
+ class WidgetsDashboard {
407
+ private widgetsSDK: InfoselWidgets;
408
+
409
+ constructor() {
410
+ this.initializeSDK();
411
+ }
412
+
413
+ private async initializeSDK() {
414
+ const authConfig = AuthConfigurationBuilder.keyCloak()
415
+ .withRealm('hub')
416
+ .withEnvironment('qa')
417
+ .withCredentials({
418
+ grant_type: 'client_credentials',
419
+ client_id: process.env.KEYCLOAK_CLIENT_ID!,
420
+ client_secret: process.env.KEYCLOAK_CLIENT_SECRET!,
421
+ })
422
+ .build();
423
+
424
+ const sdkManager = InfoselSdkManager.initWithConfiguration({
425
+ authConfiguration: authConfig,
426
+ });
427
+
428
+ this.widgetsSDK = InfoselWidgets.init({ sdkManager });
429
+ }
430
+
431
+ // Crear dashboard completo
432
+ async createCompleteDashboard(userId: string, projectId: string) {
433
+ try {
434
+ // 1. Crear espacio de trabajo
435
+ const workspace = await this.widgetsSDK.createWorkspace({
436
+ name: 'Dashboard de Trading',
437
+ description: 'Dashboard completo para análisis de mercado',
438
+ userId,
439
+ projectId,
440
+ });
441
+
442
+ // 2. Crear widget de gráfico para AAPL
443
+ const chartWidget = await this.widgetsSDK.createWidget({
444
+ workspaceId: workspace.id,
445
+ type: 'CHART',
446
+ name: 'Gráfico AAPL',
447
+ instruments: [{ uniqueKey: 'AAPL_US', symbol: 'AAPL' }],
448
+ });
449
+
450
+ // 3. Crear widget de tabla para múltiples instrumentos
451
+ const tableWidget = await this.widgetsSDK.createWidget({
452
+ workspaceId: workspace.id,
453
+ type: 'DYNAMIC_TABLE',
454
+ name: 'Portafolio',
455
+ instruments: [
456
+ { uniqueKey: 'AAPL_US', symbol: 'AAPL' },
457
+ { uniqueKey: 'MSFT_US', symbol: 'MSFT' },
458
+ { uniqueKey: 'GOOGL_US', symbol: 'GOOGL' },
459
+ ],
460
+ });
461
+
462
+ // 4. Crear widget de noticias
463
+ const newsWidget = await this.widgetsSDK.createWidget({
464
+ workspaceId: workspace.id,
465
+ type: 'NEWS_LIST',
466
+ name: 'Noticias Financieras',
467
+ newsConfiguration: {
468
+ period: 12,
469
+ listType: 9,
470
+ limit: 20,
471
+ offset: 0,
472
+ sourcesId: '',
473
+ newsTypeId: '',
474
+ },
475
+ });
476
+
477
+ return {
478
+ workspace,
479
+ widgets: [chartWidget, tableWidget, newsWidget],
480
+ };
481
+ } catch (error) {
482
+ console.error('Error creando dashboard:', error);
483
+ throw error;
484
+ }
485
+ }
486
+
487
+ // Duplicar workspace completo
488
+ async duplicateWorkspaceWithWidgets(workspaceId: string, newName: string) {
489
+ try {
490
+ // 1. Obtener workspace original
491
+ const originalWorkspace = await this.widgetsSDK.getWorkspace({
492
+ workspaceId,
493
+ });
494
+
495
+ // 2. Duplicar workspace
496
+ const duplicatedWorkspace = await this.widgetsSDK.duplicateWorkspace({
497
+ id: workspaceId,
498
+ name: newName,
499
+ });
500
+
501
+ return duplicatedWorkspace;
502
+ } catch (error) {
503
+ console.error('Error duplicando workspace:', error);
504
+ throw error;
505
+ }
506
+ }
507
+ }
508
+
509
+ // Uso del dashboard
510
+ async function main() {
511
+ const dashboard = new WidgetsDashboard();
512
+
513
+ try {
514
+ // Crear dashboard completo
515
+ const result = await dashboard.createCompleteDashboard(
516
+ 'user-123',
517
+ 'project-123',
518
+ );
519
+ console.log('Dashboard creado:', result);
520
+
521
+ // Duplicar workspace
522
+ const duplicated = await dashboard.duplicateWorkspaceWithWidgets(
523
+ result.workspace.id,
524
+ 'Copia del Dashboard',
525
+ );
526
+ console.log('Workspace duplicado:', duplicated);
527
+ } catch (error) {
528
+ console.error('Error en main:', error);
529
+ }
530
+ }
531
+
532
+ main();
533
+ ```
534
+
535
+ ### 🎯 Gestor de Widgets Avanzado
536
+
537
+ ```typescript
538
+ class AdvancedWidgetManager {
539
+ private widgetsSDK: InfoselWidgets;
540
+
541
+ constructor(widgetsSDK: InfoselWidgets) {
542
+ this.widgetsSDK = widgetsSDK;
543
+ }
544
+
545
+ // Crear widget de gráfico con configuración
546
+ async createChartWidget(
547
+ workspaceId: string,
548
+ instrument: string,
549
+ name: string,
550
+ ) {
551
+ try {
552
+ const widget = await this.widgetsSDK.createWidget({
553
+ workspaceId,
554
+ type: 'CHART',
555
+ name,
556
+ instruments: [{ uniqueKey: instrument, symbol: instrument }],
557
+ sizes: {
558
+ create: {
559
+ node: {
560
+ width: 800,
561
+ height: 600,
562
+ minWidth: 400,
563
+ minHeight: 300,
564
+ maxWidth: 1200,
565
+ maxHeight: 900,
566
+ x: 0,
567
+ y: 0,
568
+ },
569
+ },
570
+ },
571
+ });
572
+
573
+ return widget;
574
+ } catch (error) {
575
+ console.error('Error creando widget de gráfico:', error);
576
+ throw error;
577
+ }
578
+ }
579
+
580
+ // Crear widget de tabla con múltiples instrumentos
581
+ async createTableWidget(
582
+ workspaceId: string,
583
+ instruments: string[],
584
+ name: string,
585
+ ) {
586
+ try {
587
+ const widget = await this.widgetsSDK.createWidget({
588
+ workspaceId,
589
+ type: 'DYNAMIC_TABLE',
590
+ name,
591
+ instruments: instruments.map(instrument => ({
592
+ uniqueKey: instrument,
593
+ symbol: instrument,
594
+ })),
595
+ });
596
+
597
+ return widget;
598
+ } catch (error) {
599
+ console.error('Error creando widget de tabla:', error);
600
+ throw error;
601
+ }
602
+ }
603
+
604
+ // Actualizar instrumentos de un widget
605
+ async updateWidgetInstruments(widgetId: string, instruments: string[]) {
606
+ try {
607
+ const updatedInstruments = await this.widgetsSDK.updateWidgetInstruments({
608
+ widgetId,
609
+ instruments: { keys: instruments },
610
+ });
611
+
612
+ return updatedInstruments;
613
+ } catch (error) {
614
+ console.error('Error actualizando instrumentos:', error);
615
+ throw error;
616
+ }
617
+ }
618
+
619
+ // Duplicar widget a otro workspace
620
+ async duplicateWidgetToWorkspace(
621
+ widgetId: string,
622
+ targetWorkspaceId: string,
623
+ newName?: string,
624
+ ) {
625
+ try {
626
+ const duplicatedWidget = await this.widgetsSDK.duplicateWidget({
627
+ widgetId,
628
+ workspaceId: targetWorkspaceId,
629
+ name: newName || `Copia de Widget ${widgetId}`,
630
+ });
631
+
632
+ return duplicatedWidget;
633
+ } catch (error) {
634
+ console.error('Error duplicando widget:', error);
635
+ throw error;
636
+ }
637
+ }
638
+
639
+ // Eliminar widget
640
+ async deleteWidget(widgetId: string) {
641
+ try {
642
+ const result = await this.widgetsSDK.deleteWidget(widgetId);
643
+ return result;
644
+ } catch (error) {
645
+ console.error('Error eliminando widget:', error);
646
+ throw error;
647
+ }
648
+ }
649
+ }
650
+
651
+ // Uso del gestor de widgets
652
+ const widgetManager = new AdvancedWidgetManager(widgetsSDK);
653
+
654
+ // Crear widgets en un workspace
655
+ async function setupWorkspaceWidgets(workspaceId: string) {
656
+ try {
657
+ // Widget de gráfico para AAPL
658
+ const chartWidget = await widgetManager.createChartWidget(
659
+ workspaceId,
660
+ 'AAPL_US',
661
+ 'Gráfico de Apple',
662
+ );
663
+
664
+ // Widget de tabla para portafolio
665
+ const tableWidget = await widgetManager.createTableWidget(
666
+ workspaceId,
667
+ ['AAPL_US', 'MSFT_US', 'GOOGL_US'],
668
+ 'Portafolio Principal',
669
+ );
670
+
671
+ console.log('Widgets creados:', { chartWidget, tableWidget });
672
+ return { chartWidget, tableWidget };
673
+ } catch (error) {
674
+ console.error('Error configurando widgets:', error);
675
+ throw error;
676
+ }
677
+ }
678
+ ```
679
+
680
+ ### 🏢 Gestor de Espacios de Trabajo
681
+
682
+ ```typescript
683
+ class WorkspaceManager {
684
+ private widgetsSDK: InfoselWidgets;
685
+
686
+ constructor(widgetsSDK: InfoselWidgets) {
687
+ this.widgetsSDK = widgetsSDK;
688
+ }
689
+
690
+ // Crear workspace con widgets iniciales
691
+ async createWorkspaceWithWidgets(
692
+ name: string,
693
+ description: string,
694
+ userId: string,
695
+ projectId: string,
696
+ initialInstruments: string[] = [],
697
+ ) {
698
+ try {
699
+ // 1. Crear workspace
700
+ const workspace = await this.widgetsSDK.createWorkspace({
701
+ name,
702
+ description,
703
+ userId,
704
+ projectId,
705
+ });
706
+
707
+ // 2. Crear widgets iniciales si hay instrumentos
708
+ const widgets = [];
709
+ if (initialInstruments.length > 0) {
710
+ const chartWidget = await this.widgetsSDK.createWidget({
711
+ workspaceId: workspace.id,
712
+ type: 'CHART',
713
+ name: 'Gráfico Principal',
714
+ instruments: initialInstruments.map(instrument => ({
715
+ uniqueKey: instrument,
716
+ symbol: instrument,
717
+ })),
718
+ });
719
+ widgets.push(chartWidget);
720
+ }
721
+
722
+ return { workspace, widgets };
723
+ } catch (error) {
724
+ console.error('Error creando workspace con widgets:', error);
725
+ throw error;
726
+ }
727
+ }
728
+
729
+ // Obtener todos los workspaces de un usuario
730
+ async getUserWorkspaces(userId: string) {
731
+ try {
732
+ const workspaces = await this.widgetsSDK.getWorkspacesByUser({
733
+ userId,
734
+ });
735
+
736
+ return workspaces;
737
+ } catch (error) {
738
+ console.error('Error obteniendo workspaces del usuario:', error);
739
+ throw error;
740
+ }
741
+ }
742
+
743
+ // Actualizar workspace
744
+ async updateWorkspace(
745
+ workspaceId: string,
746
+ updates: { name?: string; description?: string },
747
+ ) {
748
+ try {
749
+ const updatedWorkspace = await this.widgetsSDK.updateWorkspace({
750
+ id: workspaceId,
751
+ ...updates,
752
+ });
753
+
754
+ return updatedWorkspace;
755
+ } catch (error) {
756
+ console.error('Error actualizando workspace:', error);
757
+ throw error;
758
+ }
759
+ }
760
+
761
+ // Duplicar workspace completo
762
+ async duplicateWorkspace(workspaceId: string, newName: string) {
763
+ try {
764
+ const duplicatedWorkspace = await this.widgetsSDK.duplicateWorkspace({
765
+ id: workspaceId,
766
+ name: newName,
767
+ });
768
+
769
+ return duplicatedWorkspace;
770
+ } catch (error) {
771
+ console.error('Error duplicando workspace:', error);
772
+ throw error;
773
+ }
774
+ }
775
+
776
+ // Eliminar workspace
777
+ async deleteWorkspace(workspaceId: string) {
778
+ try {
779
+ const result = await this.widgetsSDK.deleteWorkspace({
780
+ id: workspaceId,
781
+ });
782
+
783
+ return result;
784
+ } catch (error) {
785
+ console.error('Error eliminando workspace:', error);
786
+ throw error;
787
+ }
788
+ }
789
+ }
790
+
791
+ // Uso del gestor de workspaces
792
+ const workspaceManager = new WorkspaceManager(widgetsSDK);
793
+
794
+ // Crear workspace con widgets iniciales
795
+ async function createUserDashboard(userId: string, projectId: string) {
796
+ try {
797
+ const result = await workspaceManager.createWorkspaceWithWidgets(
798
+ 'Mi Dashboard Personal',
799
+ 'Dashboard para análisis de mercado',
800
+ userId,
801
+ projectId,
802
+ ['AAPL_US', 'MSFT_US', 'GOOGL_US'],
803
+ );
804
+
805
+ console.log('Dashboard creado:', result);
806
+ return result;
807
+ } catch (error) {
808
+ console.error('Error creando dashboard:', error);
809
+ throw error;
810
+ }
811
+ }
812
+ ```
813
+
814
+ ## 📚 Referencia de API
815
+
816
+ ### Clases Principales
817
+
818
+ #### `InfoselWidgets`
819
+
820
+ Punto de entrada principal para el SDK de Widgets. Se inicializa usando el método estático `init()` que recibe el `InfoselSdkManager`.
821
+
822
+ #### `InfoselSdkManager`
823
+
824
+ Gestor central del SDK que maneja la configuración, autenticación y modo de operación. Se inicializa usando el método estático `initWithConfiguration()` con configuración moderna o `init()` con configuración legacy.
825
+
826
+ #### `AuthConfigurationBuilder`
827
+
828
+ Builder para crear configuraciones de autenticación validadas y centralizadas. Proporciona una API fluida para configurar autenticación KeyCloak y basada en tokens.
829
+
830
+ #### `WidgetsMapper`
831
+
832
+ Mapeador de datos para convertir entre modelos de API y dominio.
833
+
834
+ ### Métodos Disponibles
835
+
836
+ #### 🏢 Gestión de Espacios de Trabajo
837
+
838
+ | Método | Descripción | Parámetros |
839
+ | ---------------------------- | --------------------------------------------------- | ---------------------------- |
840
+ | `createWorkspace()` | Crear nuevo espacio de trabajo | `CreateWorkspaceRequest` |
841
+ | `getWorkspaces()` | Obtener espacios de trabajo de un proyecto | `GetWorkspacesRequest` |
842
+ | `getWorkspacesByUser()` | Obtener espacios de trabajo del usuario | `GetWorkspacesByUserRequest` |
843
+ | `getUserWorkspaces()` | Obtener espacios de trabajo específicos del usuario | `GetUserWorkspacesRequest` |
844
+ | `getWorkspacesByProjectId()` | Obtener espacios de trabajo por ID de proyecto | `GetWorkspacesRequest` |
845
+ | `getWorkspace()` | Obtener detalles del workspace | `GetWorkspaceRequest` |
846
+ | `updateWorkspace()` | Actualizar espacio de trabajo | `UpdateWorkspaceRequest` |
847
+ | `duplicateWorkspace()` | Duplicar espacio de trabajo | `DuplicateWorkspaceRequest` |
848
+ | `deleteWorkspace()` | Eliminar espacio de trabajo | `DeleteWorkspaceRequest` |
849
+
850
+ #### 🎯 Gestión de Widgets
851
+
852
+ | Método | Descripción | Parámetros |
853
+ | --------------------------- | ------------------------------------ | -------------------------------- |
854
+ | `createWidget()` | Crear nuevo widget | `CreateWidgetRequest` |
855
+ | `duplicateWidget()` | Duplicar widget | `DuplicateWidgetRequest` |
856
+ | `updateWidgetInstruments()` | Actualizar instrumentos del widget | `UpdateWidgetInstrumentsRequest` |
857
+ | `updateWidgetChart()` | Actualizar configuración del gráfico | `UpdateWidgetChartRequest` |
858
+ | `deleteWidget()` | Eliminar widget | `string` (ID) |
859
+ | `getProjectWidgets()` | Obtener widgets del proyecto | `GetProjectWidgetsRequest` |
860
+ | `getUserWidgets()` | Obtener widgets del usuario | `GetUserWidgetsRequest` |
861
+
862
+ #### 🔧 Gestión de Instrumentos
863
+
864
+ | Método | Descripción | Parámetros |
865
+ | -------------------- | ----------------------------- | ------------------------- |
866
+ | `createInstrument()` | Crear nuevo instrumento | `CreateInstrumentRequest` |
867
+ | `deleteInstrument()` | Eliminar instrumento | `string` (ID) |
868
+ | `getInstruments()` | Obtener lista de instrumentos | `GetInstrumentsRequest` |
869
+
870
+ ### Entidades
871
+
872
+ #### Entidades Principales
873
+
874
+ - `Widget`: Configuración y datos del widget
875
+ - `Workspace`: Espacio de trabajo del usuario
876
+ - `Instrument`: Representación de instrumento financiero
877
+ - `WorkspaceWidgets`: Workspace con sus widgets asociados
878
+ - `UserWidgets`: Widgets del usuario
879
+ - `UserWorkspaces`: Espacios de trabajo del usuario
880
+ - `ProjectWidgetsContainer`: Contenedor de widgets del proyecto
881
+ - `WorkspacesContainer`: Contenedor de espacios de trabajo
882
+ - `InstrumentsResponse`: Respuesta con lista de instrumentos
883
+
884
+ #### Entidades de Solicitud/Respuesta
885
+
886
+ - `CreateWidgetRequest`: Parámetros de creación de widget
887
+ - `CreateWorkspaceRequest`: Parámetros de creación de espacio de trabajo
888
+ - `CreateInstrumentRequest`: Parámetros de creación de instrumento
889
+ - `UpdateWidgetInstrumentsRequest`: Parámetros de actualización de instrumentos
890
+ - `UpdateWidgetChartRequest`: Parámetros de actualización de gráfico
891
+ - `UpdateWorkspaceRequest`: Parámetros de actualización de workspace
892
+ - `DuplicateWidgetRequest`: Parámetros de duplicación de widget
893
+ - `DuplicateWorkspaceRequest`: Parámetros de duplicación de workspace
894
+ - `DeleteWorkspaceRequest`: Parámetros de eliminación de workspace
895
+ - `GetWorkspaceRequest`: Parámetros para obtener workspace
896
+ - `GetWorkspacesRequest`: Parámetros para obtener workspaces
897
+ - `GetWorkspacesByUserRequest`: Parámetros para obtener workspaces por usuario
898
+ - `GetUserWorkspacesRequest`: Parámetros para obtener workspaces del usuario
899
+ - `GetUserWidgetsRequest`: Parámetros para obtener widgets del usuario
900
+ - `GetProjectWidgetsRequest`: Parámetros para obtener widgets del proyecto
901
+ - `GetInstrumentsRequest`: Parámetros para obtener instrumentos
902
+
903
+ #### Tipos de Widgets
904
+
905
+ - `FINANCIAL_STATEMENTS`: Estados financieros
906
+ - `DYNAMIC_TABLE`: Tabla dinámica con datos en tiempo real
907
+ - `PREDEFINED_TABLE`: Tabla predefinida con estructura fija
908
+ - `CUSTOM_TABLE`: Tabla personalizable
909
+ - `NEWS_LIST`: Lista de noticias financieras
910
+ - `TICKER_TAPE`: Cinta de ticker con precios
911
+ - `CHART`: Gráfico de precios y volúmenes
912
+ - `SHORT_SALES`: Ventas en corto
913
+ - `MARKET_TOTAL`: Total de mercado
914
+ - `TRADED_PACKAGES`: Paquetes negociados
915
+ - `BROKERAGE_TRADES`: Operaciones de corretaje
916
+ - `BROKERAGE_CONCENTRATION`: Concentración de corretaje
917
+ - `BROKERAGE_PARTICIPATION`: Participación de corretaje
918
+ - `DECREED_RIGHTS_SEARCHER`: Buscador de derechos decretados
919
+ - `INDICES_COMPONENTS`: Componentes de índices
920
+
921
+ ## 🔗 Dependencias
922
+
923
+ - `@infosel-sdk/core`: Funcionalidad core del SDK (versión ^0.0.5)
924
+ - `dayjs`: Manejo de fechas y horas
925
+ - `tslib`: Biblioteca runtime de TypeScript
926
+
927
+ ## 🆕 Novedades en Core v0.0.5
928
+
929
+ ### ✨ Configuration Builder Pattern
930
+
931
+ - **Nueva API fluida** para configuración sin duplicaciones
932
+ - **Validaciones centralizadas** con mensajes de error descriptivos
933
+ - **Single source of truth** para configuración de realm
934
+ - **Compatibilidad hacia atrás** mantenida
935
+
936
+ ### 🔧 Mejoras en Configuración
937
+
938
+ - **Configuración dinámica de realm** para múltiples ambientes
939
+ - **Validación de formatos** de realm, client_id y credenciales
940
+ - **Valores por defecto inteligentes** basados en el tipo de autenticación
941
+ - **Type safety mejorado** con TypeScript
942
+
943
+ ## 🧪 Testing
944
+
945
+ ### Pruebas Unitarias
946
+
947
+ ```bash
948
+ # Ejecutar tests unitarios
949
+ npm test
950
+
951
+ # Ejecutar tests con cobertura
952
+ npm run test:coverage
953
+ ```
954
+
955
+ ## 📞 Soporte
956
+
957
+ Para soporte y preguntas, por favor contacta al equipo de desarrollo de Infosel.
958
+
959
+ ## 🔗 Paquetes Relacionados
960
+
961
+ - `@infosel-sdk/core`: Funcionalidad core del SDK (versión ^0.0.5)
962
+ - `@infosel-sdk/markets`: SDK de mercados financieros
963
+ - `@infosel-sdk/news`: SDK de noticias y contenido
964
+ - `@infosel-sdk/securities`: SDK de valores y trading
965
+
966
+ ---