@rockcarver/frodo-cli 2.0.0-2 → 2.0.0-21

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 (453) hide show
  1. package/CHANGELOG.md +186 -3
  2. package/esm/app.js +14 -5
  3. package/esm/app.js.map +1 -1
  4. package/esm/cli/FrodoCommand.js +18 -4
  5. package/esm/cli/FrodoCommand.js.map +1 -1
  6. package/esm/cli/_template/something-delete.js +7 -4
  7. package/esm/cli/_template/something-delete.js.map +1 -1
  8. package/esm/cli/_template/something-describe.js +7 -4
  9. package/esm/cli/_template/something-describe.js.map +1 -1
  10. package/esm/cli/_template/something-else-delete.js +7 -4
  11. package/esm/cli/_template/something-else-delete.js.map +1 -1
  12. package/esm/cli/_template/something-else-describe.js +7 -4
  13. package/esm/cli/_template/something-else-describe.js.map +1 -1
  14. package/esm/cli/_template/something-else-export.js +7 -4
  15. package/esm/cli/_template/something-else-export.js.map +1 -1
  16. package/esm/cli/_template/something-else-import.js +7 -4
  17. package/esm/cli/_template/something-else-import.js.map +1 -1
  18. package/esm/cli/_template/something-else-list.js +7 -4
  19. package/esm/cli/_template/something-else-list.js.map +1 -1
  20. package/esm/cli/_template/something-else.js +1 -1
  21. package/esm/cli/_template/something-else.js.map +1 -1
  22. package/esm/cli/_template/something-export.js +7 -4
  23. package/esm/cli/_template/something-export.js.map +1 -1
  24. package/esm/cli/_template/something-import.js +7 -4
  25. package/esm/cli/_template/something-import.js.map +1 -1
  26. package/esm/cli/_template/something-list.js +7 -4
  27. package/esm/cli/_template/something-list.js.map +1 -1
  28. package/esm/cli/_template/something-other-delete.js +7 -4
  29. package/esm/cli/_template/something-other-delete.js.map +1 -1
  30. package/esm/cli/_template/something-other-describe.js +7 -4
  31. package/esm/cli/_template/something-other-describe.js.map +1 -1
  32. package/esm/cli/_template/something-other-export.js +7 -4
  33. package/esm/cli/_template/something-other-export.js.map +1 -1
  34. package/esm/cli/_template/something-other-import.js +7 -4
  35. package/esm/cli/_template/something-other-import.js.map +1 -1
  36. package/esm/cli/_template/something-other-list.js +7 -4
  37. package/esm/cli/_template/something-other-list.js.map +1 -1
  38. package/esm/cli/_template/something-other.js +1 -1
  39. package/esm/cli/_template/something-other.js.map +1 -1
  40. package/esm/cli/_template/something.js +2 -2
  41. package/esm/cli/_template/something.js.map +1 -1
  42. package/esm/cli/admin/admin-add-autoid-static-user-mapping.js +10 -4
  43. package/esm/cli/admin/admin-add-autoid-static-user-mapping.js.map +1 -1
  44. package/esm/cli/admin/admin-create-oauth2-client-with-admin-privileges.js +14 -7
  45. package/esm/cli/admin/admin-create-oauth2-client-with-admin-privileges.js.map +1 -1
  46. package/esm/cli/admin/admin-federation-export.js +45 -0
  47. package/esm/cli/admin/admin-federation-export.js.map +1 -0
  48. package/esm/cli/admin/admin-federation-import.js +49 -0
  49. package/esm/cli/admin/admin-federation-import.js.map +1 -0
  50. package/esm/cli/admin/admin-federation-list.js +29 -0
  51. package/esm/cli/admin/admin-federation-list.js.map +1 -0
  52. package/esm/cli/admin/admin-federation.js +13 -0
  53. package/esm/cli/admin/admin-federation.js.map +1 -0
  54. package/esm/cli/admin/admin-get-access-token.js +12 -6
  55. package/esm/cli/admin/admin-get-access-token.js.map +1 -1
  56. package/esm/cli/admin/admin-grant-oauth2-client-admin-privileges.js +12 -6
  57. package/esm/cli/admin/admin-grant-oauth2-client-admin-privileges.js.map +1 -1
  58. package/esm/cli/admin/admin-hide-generic-extension-attributes.js +11 -5
  59. package/esm/cli/admin/admin-hide-generic-extension-attributes.js.map +1 -1
  60. package/esm/cli/admin/admin-list-oauth2-clients-with-admin-privileges.js +10 -4
  61. package/esm/cli/admin/admin-list-oauth2-clients-with-admin-privileges.js.map +1 -1
  62. package/esm/cli/admin/admin-list-oauth2-clients-with-custom-privileges.js +10 -4
  63. package/esm/cli/admin/admin-list-oauth2-clients-with-custom-privileges.js.map +1 -1
  64. package/esm/cli/admin/admin-list-static-user-mappings.js +11 -5
  65. package/esm/cli/admin/admin-list-static-user-mappings.js.map +1 -1
  66. package/esm/cli/admin/admin-remove-static-user-mapping.js +12 -5
  67. package/esm/cli/admin/admin-remove-static-user-mapping.js.map +1 -1
  68. package/esm/cli/admin/admin-repair-org-model.js +11 -5
  69. package/esm/cli/admin/admin-repair-org-model.js.map +1 -1
  70. package/esm/cli/admin/admin-revoke-oauth2-client-admin-privileges.js +12 -6
  71. package/esm/cli/admin/admin-revoke-oauth2-client-admin-privileges.js.map +1 -1
  72. package/esm/cli/admin/admin-show-generic-extension-attributes.js +11 -5
  73. package/esm/cli/admin/admin-show-generic-extension-attributes.js.map +1 -1
  74. package/esm/cli/admin/admin.js +3 -2
  75. package/esm/cli/admin/admin.js.map +1 -1
  76. package/esm/cli/agent/agent-delete.js +13 -6
  77. package/esm/cli/agent/agent-delete.js.map +1 -1
  78. package/esm/cli/agent/agent-describe.js +7 -4
  79. package/esm/cli/agent/agent-describe.js.map +1 -1
  80. package/esm/cli/agent/agent-export.js +8 -5
  81. package/esm/cli/agent/agent-export.js.map +1 -1
  82. package/esm/cli/agent/agent-gateway-delete.js +13 -6
  83. package/esm/cli/agent/agent-gateway-delete.js.map +1 -1
  84. package/esm/cli/agent/agent-gateway-describe.js +7 -4
  85. package/esm/cli/agent/agent-gateway-describe.js.map +1 -1
  86. package/esm/cli/agent/agent-gateway-export.js +8 -5
  87. package/esm/cli/agent/agent-gateway-export.js.map +1 -1
  88. package/esm/cli/agent/agent-gateway-import.js +8 -5
  89. package/esm/cli/agent/agent-gateway-import.js.map +1 -1
  90. package/esm/cli/agent/agent-gateway-list.js +7 -4
  91. package/esm/cli/agent/agent-gateway-list.js.map +1 -1
  92. package/esm/cli/agent/agent-gateway.js +1 -1
  93. package/esm/cli/agent/agent-gateway.js.map +1 -1
  94. package/esm/cli/agent/agent-import.js +8 -5
  95. package/esm/cli/agent/agent-import.js.map +1 -1
  96. package/esm/cli/agent/agent-java-delete.js +13 -6
  97. package/esm/cli/agent/agent-java-delete.js.map +1 -1
  98. package/esm/cli/agent/agent-java-describe.js +7 -4
  99. package/esm/cli/agent/agent-java-describe.js.map +1 -1
  100. package/esm/cli/agent/agent-java-export.js +8 -5
  101. package/esm/cli/agent/agent-java-export.js.map +1 -1
  102. package/esm/cli/agent/agent-java-import.js +8 -5
  103. package/esm/cli/agent/agent-java-import.js.map +1 -1
  104. package/esm/cli/agent/agent-java-list.js +7 -4
  105. package/esm/cli/agent/agent-java-list.js.map +1 -1
  106. package/esm/cli/agent/agent-java.js +1 -1
  107. package/esm/cli/agent/agent-java.js.map +1 -1
  108. package/esm/cli/agent/agent-list.js +7 -4
  109. package/esm/cli/agent/agent-list.js.map +1 -1
  110. package/esm/cli/agent/agent-web-delete.js +13 -6
  111. package/esm/cli/agent/agent-web-delete.js.map +1 -1
  112. package/esm/cli/agent/agent-web-describe.js +7 -4
  113. package/esm/cli/agent/agent-web-describe.js.map +1 -1
  114. package/esm/cli/agent/agent-web-export.js +8 -5
  115. package/esm/cli/agent/agent-web-export.js.map +1 -1
  116. package/esm/cli/agent/agent-web-import.js +8 -5
  117. package/esm/cli/agent/agent-web-import.js.map +1 -1
  118. package/esm/cli/agent/agent-web-list.js +7 -4
  119. package/esm/cli/agent/agent-web-list.js.map +1 -1
  120. package/esm/cli/agent/agent-web.js +1 -1
  121. package/esm/cli/agent/agent-web.js.map +1 -1
  122. package/esm/cli/agent/agent.js +2 -2
  123. package/esm/cli/agent/agent.js.map +1 -1
  124. package/esm/cli/app/app-delete.js +27 -8
  125. package/esm/cli/app/app-delete.js.map +1 -1
  126. package/esm/cli/app/app-describe.js +9 -5
  127. package/esm/cli/app/app-describe.js.map +1 -1
  128. package/esm/cli/app/app-export.js +17 -13
  129. package/esm/cli/app/app-export.js.map +1 -1
  130. package/esm/cli/app/app-import.js +21 -17
  131. package/esm/cli/app/app-import.js.map +1 -1
  132. package/esm/cli/app/app-list.js +12 -8
  133. package/esm/cli/app/app-list.js.map +1 -1
  134. package/esm/cli/app/app.js +8 -12
  135. package/esm/cli/app/app.js.map +1 -1
  136. package/esm/cli/authz/authz-policy-delete.js +10 -7
  137. package/esm/cli/authz/authz-policy-delete.js.map +1 -1
  138. package/esm/cli/authz/authz-policy-describe.js +8 -5
  139. package/esm/cli/authz/authz-policy-describe.js.map +1 -1
  140. package/esm/cli/authz/authz-policy-export.js +12 -9
  141. package/esm/cli/authz/authz-policy-export.js.map +1 -1
  142. package/esm/cli/authz/authz-policy-import.js +10 -7
  143. package/esm/cli/authz/authz-policy-import.js.map +1 -1
  144. package/esm/cli/authz/authz-policy-list.js +9 -6
  145. package/esm/cli/authz/authz-policy-list.js.map +1 -1
  146. package/esm/cli/authz/authz-policy.js +1 -1
  147. package/esm/cli/authz/authz-policy.js.map +1 -1
  148. package/esm/cli/authz/authz-set-delete.js +9 -6
  149. package/esm/cli/authz/authz-set-delete.js.map +1 -1
  150. package/esm/cli/authz/authz-set-describe.js +8 -5
  151. package/esm/cli/authz/authz-set-describe.js.map +1 -1
  152. package/esm/cli/authz/authz-set-export.js +10 -7
  153. package/esm/cli/authz/authz-set-export.js.map +1 -1
  154. package/esm/cli/authz/authz-set-import.js +10 -7
  155. package/esm/cli/authz/authz-set-import.js.map +1 -1
  156. package/esm/cli/authz/authz-set-list.js +7 -4
  157. package/esm/cli/authz/authz-set-list.js.map +1 -1
  158. package/esm/cli/authz/authz-set.js +1 -1
  159. package/esm/cli/authz/authz-set.js.map +1 -1
  160. package/esm/cli/authz/authz-type-delete.js +10 -7
  161. package/esm/cli/authz/authz-type-delete.js.map +1 -1
  162. package/esm/cli/authz/authz-type-describe.js +9 -6
  163. package/esm/cli/authz/authz-type-describe.js.map +1 -1
  164. package/esm/cli/authz/authz-type-export.js +11 -8
  165. package/esm/cli/authz/authz-type-export.js.map +1 -1
  166. package/esm/cli/authz/authz-type-import.js +12 -9
  167. package/esm/cli/authz/authz-type-import.js.map +1 -1
  168. package/esm/cli/authz/authz-type-list.js +8 -5
  169. package/esm/cli/authz/authz-type-list.js.map +1 -1
  170. package/esm/cli/authz/authz-type.js +1 -1
  171. package/esm/cli/authz/authz-type.js.map +1 -1
  172. package/esm/cli/authz/authz.js +2 -2
  173. package/esm/cli/authz/authz.js.map +1 -1
  174. package/esm/cli/conn/conn-delete.js +2 -2
  175. package/esm/cli/conn/conn-delete.js.map +1 -1
  176. package/esm/cli/conn/conn-describe.js +2 -2
  177. package/esm/cli/conn/conn-describe.js.map +1 -1
  178. package/esm/cli/conn/conn-list.js +2 -2
  179. package/esm/cli/conn/conn-list.js.map +1 -1
  180. package/esm/cli/conn/conn-save.js +31 -15
  181. package/esm/cli/conn/conn-save.js.map +1 -1
  182. package/esm/cli/conn/conn.js +2 -2
  183. package/esm/cli/conn/conn.js.map +1 -1
  184. package/esm/cli/email/email-template-export.js +10 -7
  185. package/esm/cli/email/email-template-export.js.map +1 -1
  186. package/esm/cli/email/email-template-import.js +11 -8
  187. package/esm/cli/email/email-template-import.js.map +1 -1
  188. package/esm/cli/email/email-template-list.js +8 -5
  189. package/esm/cli/email/email-template-list.js.map +1 -1
  190. package/esm/cli/email/email-template.js +1 -1
  191. package/esm/cli/email/email-template.js.map +1 -1
  192. package/esm/cli/email/email.js +2 -2
  193. package/esm/cli/email/email.js.map +1 -1
  194. package/esm/cli/esv/esv-apply.js +18 -8
  195. package/esm/cli/esv/esv-apply.js.map +1 -1
  196. package/esm/cli/esv/esv-secret-create.js +8 -5
  197. package/esm/cli/esv/esv-secret-create.js.map +1 -1
  198. package/esm/cli/esv/esv-secret-delete.js +9 -6
  199. package/esm/cli/esv/esv-secret-delete.js.map +1 -1
  200. package/esm/cli/esv/esv-secret-describe.js +8 -5
  201. package/esm/cli/esv/esv-secret-describe.js.map +1 -1
  202. package/esm/cli/esv/esv-secret-export.js +7 -4
  203. package/esm/cli/esv/esv-secret-export.js.map +1 -1
  204. package/esm/cli/esv/esv-secret-import.js +7 -4
  205. package/esm/cli/esv/esv-secret-import.js.map +1 -1
  206. package/esm/cli/esv/esv-secret-list.js +8 -5
  207. package/esm/cli/esv/esv-secret-list.js.map +1 -1
  208. package/esm/cli/esv/esv-secret-set.js +8 -5
  209. package/esm/cli/esv/esv-secret-set.js.map +1 -1
  210. package/esm/cli/esv/esv-secret-version-activate.js +8 -5
  211. package/esm/cli/esv/esv-secret-version-activate.js.map +1 -1
  212. package/esm/cli/esv/esv-secret-version-create.js +9 -6
  213. package/esm/cli/esv/esv-secret-version-create.js.map +1 -1
  214. package/esm/cli/esv/esv-secret-version-deactivate.js +8 -5
  215. package/esm/cli/esv/esv-secret-version-deactivate.js.map +1 -1
  216. package/esm/cli/esv/esv-secret-version-delete.js +9 -6
  217. package/esm/cli/esv/esv-secret-version-delete.js.map +1 -1
  218. package/esm/cli/esv/esv-secret-version-list.js +8 -5
  219. package/esm/cli/esv/esv-secret-version-list.js.map +1 -1
  220. package/esm/cli/esv/esv-secret-version.js +1 -1
  221. package/esm/cli/esv/esv-secret-version.js.map +1 -1
  222. package/esm/cli/esv/esv-secret.js +1 -1
  223. package/esm/cli/esv/esv-secret.js.map +1 -1
  224. package/esm/cli/esv/esv-variable-create.js +10 -6
  225. package/esm/cli/esv/esv-variable-create.js.map +1 -1
  226. package/esm/cli/esv/esv-variable-delete.js +9 -6
  227. package/esm/cli/esv/esv-variable-delete.js.map +1 -1
  228. package/esm/cli/esv/esv-variable-describe.js +8 -5
  229. package/esm/cli/esv/esv-variable-describe.js.map +1 -1
  230. package/esm/cli/esv/esv-variable-export.js +7 -4
  231. package/esm/cli/esv/esv-variable-export.js.map +1 -1
  232. package/esm/cli/esv/esv-variable-import.js +7 -4
  233. package/esm/cli/esv/esv-variable-import.js.map +1 -1
  234. package/esm/cli/esv/esv-variable-list.js +8 -5
  235. package/esm/cli/esv/esv-variable-list.js.map +1 -1
  236. package/esm/cli/esv/esv-variable-set.js +8 -5
  237. package/esm/cli/esv/esv-variable-set.js.map +1 -1
  238. package/esm/cli/esv/esv-variable.js +1 -1
  239. package/esm/cli/esv/esv-variable.js.map +1 -1
  240. package/esm/cli/esv/esv.js +2 -2
  241. package/esm/cli/esv/esv.js.map +1 -1
  242. package/esm/cli/idm/idm-count.js +9 -6
  243. package/esm/cli/idm/idm-count.js.map +1 -1
  244. package/esm/cli/idm/idm-export.js +10 -7
  245. package/esm/cli/idm/idm-export.js.map +1 -1
  246. package/esm/cli/idm/idm-import.js +11 -8
  247. package/esm/cli/idm/idm-import.js.map +1 -1
  248. package/esm/cli/idm/idm-list.js +7 -4
  249. package/esm/cli/idm/idm-list.js.map +1 -1
  250. package/esm/cli/idm/idm.js +2 -2
  251. package/esm/cli/idm/idm.js.map +1 -1
  252. package/esm/cli/idp/idp-export.js +11 -8
  253. package/esm/cli/idp/idp-export.js.map +1 -1
  254. package/esm/cli/idp/idp-import.js +15 -12
  255. package/esm/cli/idp/idp-import.js.map +1 -1
  256. package/esm/cli/idp/idp-list.js +7 -4
  257. package/esm/cli/idp/idp-list.js.map +1 -1
  258. package/esm/cli/idp/idp.js +2 -2
  259. package/esm/cli/idp/idp.js.map +1 -1
  260. package/esm/cli/info/info.js +16 -10
  261. package/esm/cli/info/info.js.map +1 -1
  262. package/esm/cli/journey/journey-delete.js +8 -5
  263. package/esm/cli/journey/journey-delete.js.map +1 -1
  264. package/esm/cli/journey/journey-describe.js +18 -10
  265. package/esm/cli/journey/journey-describe.js.map +1 -1
  266. package/esm/cli/journey/journey-disable.js +12 -6
  267. package/esm/cli/journey/journey-disable.js.map +1 -1
  268. package/esm/cli/journey/journey-enable.js +12 -6
  269. package/esm/cli/journey/journey-enable.js.map +1 -1
  270. package/esm/cli/journey/journey-export.js +10 -7
  271. package/esm/cli/journey/journey-export.js.map +1 -1
  272. package/esm/cli/journey/journey-import.js +11 -8
  273. package/esm/cli/journey/journey-import.js.map +1 -1
  274. package/esm/cli/journey/journey-list.js +6 -3
  275. package/esm/cli/journey/journey-list.js.map +1 -1
  276. package/esm/cli/journey/journey-prune.js +23 -12
  277. package/esm/cli/journey/journey-prune.js.map +1 -1
  278. package/esm/cli/journey/journey.js +2 -2
  279. package/esm/cli/journey/journey.js.map +1 -1
  280. package/esm/cli/{logging/logs-fetch.js → log/log-fetch.js} +68 -36
  281. package/esm/cli/log/log-fetch.js.map +1 -0
  282. package/esm/cli/log/log-key-delete.js +35 -0
  283. package/esm/cli/log/log-key-delete.js.map +1 -0
  284. package/esm/cli/log/log-key-describe.js +22 -0
  285. package/esm/cli/log/log-key-describe.js.map +1 -0
  286. package/esm/cli/log/log-key-list.js +26 -0
  287. package/esm/cli/log/log-key-list.js.map +1 -0
  288. package/esm/cli/log/log-key.js +8 -0
  289. package/esm/cli/log/log-key.js.map +1 -0
  290. package/esm/cli/log/log-list.js +80 -0
  291. package/esm/cli/log/log-list.js.map +1 -0
  292. package/esm/cli/log/log-tail.js +77 -0
  293. package/esm/cli/log/log-tail.js.map +1 -0
  294. package/esm/cli/{logging/logs.js → log/log.js} +6 -3
  295. package/esm/cli/log/log.js.map +1 -0
  296. package/esm/cli/oauth/oauth-client-delete.js +22 -0
  297. package/esm/cli/oauth/oauth-client-delete.js.map +1 -0
  298. package/esm/cli/oauth/oauth-client-describe.js +22 -0
  299. package/esm/cli/oauth/oauth-client-describe.js.map +1 -0
  300. package/esm/cli/oauth/oauth-client-export.js +52 -0
  301. package/esm/cli/oauth/oauth-client-export.js.map +1 -0
  302. package/esm/cli/oauth/oauth-client-import.js +57 -0
  303. package/esm/cli/oauth/oauth-client-import.js.map +1 -0
  304. package/esm/cli/oauth/oauth-client-list.js +25 -0
  305. package/esm/cli/oauth/oauth-client-list.js.map +1 -0
  306. package/esm/cli/oauth/oauth-client.js +14 -0
  307. package/esm/cli/oauth/oauth-client.js.map +1 -0
  308. package/esm/cli/oauth/oauth.js +13 -0
  309. package/esm/cli/oauth/oauth.js.map +1 -0
  310. package/esm/cli/realm/realm-add-custom-domain.js +8 -5
  311. package/esm/cli/realm/realm-add-custom-domain.js.map +1 -1
  312. package/esm/cli/realm/realm-describe.js +8 -5
  313. package/esm/cli/realm/realm-describe.js.map +1 -1
  314. package/esm/cli/realm/realm-list.js +8 -5
  315. package/esm/cli/realm/realm-list.js.map +1 -1
  316. package/esm/cli/realm/realm-remove-custom-domain.js +11 -5
  317. package/esm/cli/realm/realm-remove-custom-domain.js.map +1 -1
  318. package/esm/cli/realm/realm.js +2 -2
  319. package/esm/cli/realm/realm.js.map +1 -1
  320. package/esm/cli/saml/saml-cot-export.js +10 -7
  321. package/esm/cli/saml/saml-cot-export.js.map +1 -1
  322. package/esm/cli/saml/saml-cot-import.js +11 -8
  323. package/esm/cli/saml/saml-cot-import.js.map +1 -1
  324. package/esm/cli/saml/saml-cot-list.js +8 -5
  325. package/esm/cli/saml/saml-cot-list.js.map +1 -1
  326. package/esm/cli/saml/saml-cot.js +1 -1
  327. package/esm/cli/saml/saml-cot.js.map +1 -1
  328. package/esm/cli/saml/saml-delete.js +14 -7
  329. package/esm/cli/saml/saml-delete.js.map +1 -1
  330. package/esm/cli/saml/saml-describe.js +8 -5
  331. package/esm/cli/saml/saml-describe.js.map +1 -1
  332. package/esm/cli/saml/saml-export.js +10 -7
  333. package/esm/cli/saml/saml-export.js.map +1 -1
  334. package/esm/cli/saml/saml-import.js +11 -8
  335. package/esm/cli/saml/saml-import.js.map +1 -1
  336. package/esm/cli/saml/saml-list.js +8 -5
  337. package/esm/cli/saml/saml-list.js.map +1 -1
  338. package/esm/cli/saml/saml-metadata-export.js +9 -6
  339. package/esm/cli/saml/saml-metadata-export.js.map +1 -1
  340. package/esm/cli/saml/saml-metadata.js +1 -1
  341. package/esm/cli/saml/saml-metadata.js.map +1 -1
  342. package/esm/cli/saml/saml.js +2 -2
  343. package/esm/cli/saml/saml.js.map +1 -1
  344. package/esm/cli/script/script-delete.js +7 -4
  345. package/esm/cli/script/script-delete.js.map +1 -1
  346. package/esm/cli/script/script-describe.js +7 -4
  347. package/esm/cli/script/script-describe.js.map +1 -1
  348. package/esm/cli/script/script-export.js +8 -5
  349. package/esm/cli/script/script-export.js.map +1 -1
  350. package/esm/cli/script/script-import.js +9 -6
  351. package/esm/cli/script/script-import.js.map +1 -1
  352. package/esm/cli/script/script-list.js +8 -5
  353. package/esm/cli/script/script-list.js.map +1 -1
  354. package/esm/cli/script/script.js +2 -2
  355. package/esm/cli/script/script.js.map +1 -1
  356. package/esm/cli/service/service-delete.js +8 -5
  357. package/esm/cli/service/service-delete.js.map +1 -1
  358. package/esm/cli/service/service-export.js +9 -6
  359. package/esm/cli/service/service-export.js.map +1 -1
  360. package/esm/cli/service/service-import.js +10 -7
  361. package/esm/cli/service/service-import.js.map +1 -1
  362. package/esm/cli/service/service-list.js +7 -4
  363. package/esm/cli/service/service-list.js.map +1 -1
  364. package/esm/cli/service/service.js +2 -2
  365. package/esm/cli/service/service.js.map +1 -1
  366. package/esm/cli/shell/shell.js +57 -0
  367. package/esm/cli/shell/shell.js.map +1 -0
  368. package/esm/cli/theme/theme-delete.js +10 -7
  369. package/esm/cli/theme/theme-delete.js.map +1 -1
  370. package/esm/cli/theme/theme-export.js +11 -8
  371. package/esm/cli/theme/theme-export.js.map +1 -1
  372. package/esm/cli/theme/theme-import.js +12 -9
  373. package/esm/cli/theme/theme-import.js.map +1 -1
  374. package/esm/cli/theme/theme-list.js +7 -4
  375. package/esm/cli/theme/theme-list.js.map +1 -1
  376. package/esm/cli/theme/theme.js +2 -2
  377. package/esm/cli/theme/theme.js.map +1 -1
  378. package/esm/help/SampleData.js +7 -0
  379. package/esm/help/SampleData.js.map +1 -0
  380. package/esm/launch.js +1 -1
  381. package/esm/launch.js.map +1 -1
  382. package/esm/loader.js +2 -2
  383. package/esm/loader.js.map +1 -1
  384. package/esm/ops/AdminFederationOps.js +216 -0
  385. package/esm/ops/AdminFederationOps.js.map +1 -0
  386. package/esm/ops/AgentOps.js +88 -54
  387. package/esm/ops/AgentOps.js.map +1 -1
  388. package/esm/ops/ApplicationOps.js +309 -0
  389. package/esm/ops/ApplicationOps.js.map +1 -0
  390. package/esm/ops/CirclesOfTrustOps.js +25 -13
  391. package/esm/ops/CirclesOfTrustOps.js.map +1 -1
  392. package/esm/ops/ConnectionProfileOps.js +13 -6
  393. package/esm/ops/ConnectionProfileOps.js.map +1 -1
  394. package/esm/ops/EmailTemplateOps.js +53 -47
  395. package/esm/ops/EmailTemplateOps.js.map +1 -1
  396. package/esm/ops/IdmOps.js +58 -64
  397. package/esm/ops/IdmOps.js.map +1 -1
  398. package/esm/ops/IdpOps.js +48 -25
  399. package/esm/ops/IdpOps.js.map +1 -1
  400. package/esm/ops/JourneyOps.js +108 -43
  401. package/esm/ops/JourneyOps.js.map +1 -1
  402. package/esm/ops/LogOps.js +92 -30
  403. package/esm/ops/LogOps.js.map +1 -1
  404. package/esm/ops/NodeOps.js +6 -3
  405. package/esm/ops/NodeOps.js.map +1 -1
  406. package/esm/ops/OAuth2ClientOps.js +29 -16
  407. package/esm/ops/OAuth2ClientOps.js.map +1 -1
  408. package/esm/ops/OrganizationOps.js +14 -22
  409. package/esm/ops/OrganizationOps.js.map +1 -1
  410. package/esm/ops/PolicyOps.js +60 -28
  411. package/esm/ops/PolicyOps.js.map +1 -1
  412. package/esm/ops/PolicySetOps.js +39 -22
  413. package/esm/ops/PolicySetOps.js.map +1 -1
  414. package/esm/ops/RealmOps.js +15 -8
  415. package/esm/ops/RealmOps.js.map +1 -1
  416. package/esm/ops/ResourceTypeOps.js +43 -27
  417. package/esm/ops/ResourceTypeOps.js.map +1 -1
  418. package/esm/ops/Saml2Ops.js +56 -42
  419. package/esm/ops/Saml2Ops.js.map +1 -1
  420. package/esm/ops/Saml2Ops.test_.js.map +1 -1
  421. package/esm/ops/ScriptOps.js +72 -18
  422. package/esm/ops/ScriptOps.js.map +1 -1
  423. package/esm/ops/SecretsOps.js +33 -18
  424. package/esm/ops/SecretsOps.js.map +1 -1
  425. package/esm/ops/ServiceOps.js +49 -28
  426. package/esm/ops/ServiceOps.js.map +1 -1
  427. package/esm/ops/ThemeOps.js +42 -22
  428. package/esm/ops/ThemeOps.js.map +1 -1
  429. package/esm/ops/VariablesOps.js +37 -28
  430. package/esm/ops/VariablesOps.js.map +1 -1
  431. package/esm/ops/utils/OpsUtils.js +1 -1
  432. package/esm/ops/utils/OpsUtils.js.map +1 -1
  433. package/esm/ops/utils/Wordwrap.js +1 -1
  434. package/esm/ops/utils/Wordwrap.js.map +1 -1
  435. package/esm/storage/StaticStorage.js +1 -1
  436. package/esm/storage/StaticStorage.js.map +1 -1
  437. package/esm/utils/Config.js +7 -4
  438. package/esm/utils/Config.js.map +1 -1
  439. package/esm/utils/Console.js +9 -5
  440. package/esm/utils/Console.js.map +1 -1
  441. package/esm/utils/ExportImportUtils.js +32 -66
  442. package/esm/utils/ExportImportUtils.js.map +1 -1
  443. package/esm/utils/Version.js +19 -16
  444. package/esm/utils/Version.js.map +1 -1
  445. package/package.json +45 -35
  446. package/esm/cli/logging/logs-fetch.js.map +0 -1
  447. package/esm/cli/logging/logs-list.js +0 -49
  448. package/esm/cli/logging/logs-list.js.map +0 -1
  449. package/esm/cli/logging/logs-tail.js +0 -46
  450. package/esm/cli/logging/logs-tail.js.map +0 -1
  451. package/esm/cli/logging/logs.js.map +0 -1
  452. package/esm/cli/theme/theme-delete.e2e.test_.js.map +0 -1
  453. package/esm/cli/theme/theme-list.e2e.test_.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"journey.js","names":["FrodoStubCommand","path","fileURLToPath","__dirname","dirname","import","meta","url","setup","program","description","executableDir","command"],"sources":["cli/journey/journey.ts"],"sourcesContent":["import { FrodoStubCommand } from '../FrodoCommand';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nexport default function setup() {\n const program = new FrodoStubCommand('journey')\n .description('Manage journeys/trees.')\n .executableDir(__dirname);\n\n program.command('list', 'List journeys/trees.');\n\n program.command(\n 'describe',\n 'If host argument is supplied, describe the journey/tree indicated by -t, or all journeys/trees in the realm if no -t is supplied, otherwise describe the journey/tree export file indicated by -f.'\n );\n\n program.command('export', 'Export journeys/trees.');\n\n program.command('import', 'Import journeys/trees.');\n\n program.command('delete', 'Delete journeys/trees.');\n\n program.command(\n 'prune',\n 'Prune orphaned configuration artifacts left behind after deleting authentication trees. You will be prompted before any destructive operations are performed.'\n );\n\n program.command('enable', 'Enable journeys/trees.');\n\n program.command('disable', 'Disable journeys/trees.');\n\n return program;\n}\n"],"mappings":"AAAA,SAASA,gBAAgB,QAAQ,iBAAiB;AAClD,OAAOC,IAAI,MAAM,MAAM;AACvB,SAASC,aAAa,QAAQ,KAAK;AAEnC,MAAMC,SAAS,GAAGF,IAAI,CAACG,OAAO,CAACF,aAAa,CAACG,MAAM,CAACC,IAAI,CAACC,GAAG,CAAC,CAAC;AAE9D,eAAe,SAASC,KAAKA,CAAA,EAAG;EAC9B,MAAMC,OAAO,GAAG,IAAIT,gBAAgB,CAAC,SAAS,CAAC,CAC5CU,WAAW,CAAC,wBAAwB,CAAC,CACrCC,aAAa,CAACR,SAAS,CAAC;EAE3BM,OAAO,CAACG,OAAO,CAAC,MAAM,EAAE,sBAAsB,CAAC;EAE/CH,OAAO,CAACG,OAAO,CACb,UAAU,EACV,oMACF,CAAC;EAEDH,OAAO,CAACG,OAAO,CAAC,QAAQ,EAAE,wBAAwB,CAAC;EAEnDH,OAAO,CAACG,OAAO,CAAC,QAAQ,EAAE,wBAAwB,CAAC;EAEnDH,OAAO,CAACG,OAAO,CAAC,QAAQ,EAAE,wBAAwB,CAAC;EAEnDH,OAAO,CAACG,OAAO,CACb,OAAO,EACP,+JACF,CAAC;EAEDH,OAAO,CAACG,OAAO,CAAC,QAAQ,EAAE,wBAAwB,CAAC;EAEnDH,OAAO,CAACG,OAAO,CAAC,SAAS,EAAE,yBAAyB,CAAC;EAErD,OAAOH,OAAO;AAChB"}
1
+ {"version":3,"file":"journey.js","names":["path","fileURLToPath","FrodoStubCommand","__dirname","dirname","import","meta","url","setup","program","description","executableDir","command"],"sources":["../../../src/cli/journey/journey.ts"],"sourcesContent":["import path from 'path';\nimport { fileURLToPath } from 'url';\n\nimport { FrodoStubCommand } from '../FrodoCommand';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nexport default function setup() {\n const program = new FrodoStubCommand('journey')\n .description('Manage journeys/trees.')\n .executableDir(__dirname);\n\n program.command('list', 'List journeys/trees.');\n\n program.command(\n 'describe',\n 'If host argument is supplied, describe the journey/tree indicated by -t, or all journeys/trees in the realm if no -t is supplied, otherwise describe the journey/tree export file indicated by -f.'\n );\n\n program.command('export', 'Export journeys/trees.');\n\n program.command('import', 'Import journeys/trees.');\n\n program.command('delete', 'Delete journeys/trees.');\n\n program.command(\n 'prune',\n 'Prune orphaned configuration artifacts left behind after deleting authentication trees. You will be prompted before any destructive operations are performed.'\n );\n\n program.command('enable', 'Enable journeys/trees.');\n\n program.command('disable', 'Disable journeys/trees.');\n\n return program;\n}\n"],"mappings":"AAAA,OAAOA,IAAI,MAAM,MAAM;AACvB,SAASC,aAAa,QAAQ,KAAK;AAEnC,SAASC,gBAAgB,QAAQ,iBAAiB;AAElD,MAAMC,SAAS,GAAGH,IAAI,CAACI,OAAO,CAACH,aAAa,CAACI,MAAM,CAACC,IAAI,CAACC,GAAG,CAAC,CAAC;AAE9D,eAAe,SAASC,KAAKA,CAAA,EAAG;EAC9B,MAAMC,OAAO,GAAG,IAAIP,gBAAgB,CAAC,SAAS,CAAC,CAC5CQ,WAAW,CAAC,wBAAwB,CAAC,CACrCC,aAAa,CAACR,SAAS,CAAC;EAE3BM,OAAO,CAACG,OAAO,CAAC,MAAM,EAAE,sBAAsB,CAAC;EAE/CH,OAAO,CAACG,OAAO,CACb,UAAU,EACV,oMACF,CAAC;EAEDH,OAAO,CAACG,OAAO,CAAC,QAAQ,EAAE,wBAAwB,CAAC;EAEnDH,OAAO,CAACG,OAAO,CAAC,QAAQ,EAAE,wBAAwB,CAAC;EAEnDH,OAAO,CAACG,OAAO,CAAC,QAAQ,EAAE,wBAAwB,CAAC;EAEnDH,OAAO,CAACG,OAAO,CACb,OAAO,EACP,+JACF,CAAC;EAEDH,OAAO,CAACG,OAAO,CAAC,QAAQ,EAAE,wBAAwB,CAAC;EAEnDH,OAAO,CAACG,OAAO,CAAC,SAAS,EAAE,yBAAyB,CAAC;EAErD,OAAOH,OAAO;AAChB"}
@@ -1,49 +1,75 @@
1
- import { FrodoCommand } from '../FrodoCommand';
2
- import { sourcesOptionM } from './logs';
3
- import { Option } from 'commander';
4
1
  import { frodo, state } from '@rockcarver/frodo-lib';
5
- import * as config from '../../utils/Config';
6
- import { printMessage } from '../../utils/Console';
2
+ import { Option } from 'commander';
7
3
  import { fetchLogs, provisionCreds } from '../../ops/LogOps';
4
+ import * as config from '../../utils/Config';
5
+ import { printMessage, verboseMessage } from '../../utils/Console';
6
+ import { FrodoCommand } from '../FrodoCommand';
7
+ import { sourcesOptionM } from './log';
8
+ const {
9
+ getTokens
10
+ } = frodo.login;
11
+ const {
12
+ resolveLevel
13
+ } = frodo.cloud.log;
14
+ const {
15
+ getConnectionProfile,
16
+ saveConnectionProfile
17
+ } = frodo.conn;
8
18
  const SECONDS_IN_30_DAYS = 2592000;
9
19
  const SECONDS_IN_1_HOUR = 3600;
10
20
  const LOG_TIME_WINDOW_MAX = SECONDS_IN_30_DAYS;
11
21
  const LOG_TIME_WINDOW_INCREMENT = 1;
12
- const program = new FrodoCommand('frodo logs fetch', ['realm', 'type']);
22
+ const program = new FrodoCommand('frodo log fetch', ['realm', 'type']);
13
23
  program.description('Fetch Identity Cloud logs between a specified begin and end time period.\
14
24
  WARNING: depending on filters and time period specified, this could take substantial time to complete.').addOption(sourcesOptionM).addOption(new Option('-l, --level <level>', 'Set log level filter. You can specify the level as a number or a string. \
15
25
  Following values are possible (values on the same line are equivalent): \
16
26
  \n0, SEVERE, FATAL, or ERROR\n1, WARNING, WARN or CONFIG\
17
27
  \n2, INFO or INFORMATION\n3, DEBUG, FINE, FINER or FINEST\
18
- \n4 or ALL').default('ERROR', `${frodo.cloud.log.resolveLevel('ERROR')}`)).addOption(new Option('-t, --transaction-id <txid>', 'Filter by transactionId')).addOption(new Option('-b, --begin-timestamp <beginTs>', 'Begin timestamp for period (in ISO8601, example: "2022-10-13T19:06:28Z", or "2022-09.30". \
28
+ \n4 or ALL').default('ERROR', `${resolveLevel('ERROR')}`)).addOption(new Option('-t, --transaction-id <txid>', 'Filter by transactionId')).addOption(new Option('-b, --begin-timestamp <beginTs>', 'Begin timestamp for period (in ISO8601, example: "2022-10-13T19:06:28Z", or "2022-09.30". \
19
29
  Cannot be more than 30 days in the past. If not specified, logs from one hour ago are fetched \
20
30
  (-e is ignored)')).addOption(new Option('-e, --end-timestamp <endTs>', 'End timestamp for period. Default: "now"')).addOption(new Option('-s, --search-string <ss>', 'Filter by a specific string (ANDed with transactionID filter)')).addOption(new Option('-d, --defaults', 'Use default logging noise filters').default(false, `Use custom logging noise filters defined in $HOME/${config.FRODO_LOG_NOISEFILTER_FILENAME}`)).action(async (host, user, password, options, command) => {
21
31
  command.handleDefaultArgsAndOpts(host, user, password, options, command);
22
- let credsFromParameters = true;
23
- const conn = await frodo.conn.getConnectionProfile();
24
- if (conn) {
25
- state.setHost(conn.tenant);
26
- if (conn.logApiKey != null && conn.logApiSecret != null) {
27
- credsFromParameters = false;
28
- state.setLogApiKey(conn.logApiKey);
29
- state.setLogApiSecret(conn.logApiSecret);
30
- } else {
31
- if (conn.username == null && conn.password == null) {
32
- if (!state.getUsername() && !state.getPassword()) {
33
- credsFromParameters = false;
34
- printMessage('User credentials not specified as parameters and no saved API key and secret found!', 'warn');
35
- return;
36
- }
37
- } else {
38
- state.setUsername(conn.username);
39
- state.setPassword(conn.password);
40
- }
41
- if (await frodo.login.getTokens(true)) {
42
- const creds = await provisionCreds();
43
- state.setLogApiKey(creds.api_key_id);
44
- state.setLogApiSecret(creds.api_key_secret);
45
- }
32
+ let foundCredentials = false;
33
+ const conn = await getConnectionProfile();
34
+ if (conn) state.setHost(conn.tenant);
35
+
36
+ // log api creds have been supplied as username and password arguments
37
+ if (state.getUsername() && state.getPassword()) {
38
+ verboseMessage(`Using log api credentials from command line.`);
39
+ state.setLogApiKey(state.getUsername());
40
+ state.setLogApiSecret(state.getPassword());
41
+ foundCredentials = true;
42
+ }
43
+ // log api creds from connection profile
44
+ else if (conn && conn.logApiKey != null && conn.logApiSecret != null) {
45
+ verboseMessage(`Using log api credentials from connection profile.`);
46
+ state.setLogApiKey(conn.logApiKey);
47
+ state.setLogApiSecret(conn.logApiSecret);
48
+ foundCredentials = true;
49
+ }
50
+ // log api creds have been supplied via env variables
51
+ else if (state.getLogApiKey() && state.getLogApiSecret()) {
52
+ verboseMessage(`Using log api credentials from environment variables.`);
53
+ foundCredentials = true;
54
+ }
55
+ // no log api creds but got username and password, so can try to create them
56
+ else if (conn && conn.username && conn.password) {
57
+ printMessage(`Found admin credentials in connection profile, attempting to create log api credentials...`);
58
+ state.setUsername(conn.username);
59
+ state.setPassword(conn.password);
60
+ if (await getTokens(true)) {
61
+ const creds = await provisionCreds();
62
+ state.setLogApiKey(creds.api_key_id);
63
+ state.setLogApiSecret(creds.api_key_secret);
64
+ await saveConnectionProfile(state.getHost());
65
+ foundCredentials = true;
66
+ }
67
+ // unable to create credentials
68
+ else {
69
+ printMessage(`Unable to create log api credentials.`);
46
70
  }
71
+ }
72
+ if (foundCredentials) {
47
73
  const now = Date.now() / 1000;
48
74
  const nowString = new Date(now * 1000).toISOString();
49
75
  if (typeof options.beginTimestamp === 'undefined' || !options.beginTimestamp) {
@@ -66,26 +92,32 @@ Cannot be more than 30 days in the past. If not specified, logs from one hour ag
66
92
  const endTs = Date.parse(options.endTimestamp) / 1000;
67
93
  if (endTs < beginTs) {
68
94
  printMessage('End timestamp can not be before begin timestamp', 'error');
95
+ process.exitCode = 1;
69
96
  return;
70
97
  }
71
98
  if (now - beginTs > LOG_TIME_WINDOW_MAX) {
72
99
  printMessage('Begin timestamp can not be more than 30 days in the past', 'error');
100
+ process.exitCode = 1;
73
101
  return;
74
102
  }
75
103
  let intermediateEndTs = 0;
76
- printMessage(`Fetching ID Cloud logs from the following sources: ${command.opts().sources} and levels [${frodo.cloud.log.resolveLevel(command.opts().level)}] of ${conn.tenant}...`);
77
- if (credsFromParameters) await frodo.conn.saveConnectionProfile(host); // save new values if they were specified on CLI
78
-
104
+ printMessage(`Fetching ID Cloud logs from the following sources: ${command.opts().sources} and levels [${resolveLevel(command.opts().level)}] of ${conn.tenant}...`);
79
105
  let timeIncrement = LOG_TIME_WINDOW_INCREMENT;
80
106
  if (endTs - beginTs > 30) {
81
107
  timeIncrement = timeIncrement * 30;
82
108
  }
83
109
  do {
84
110
  intermediateEndTs = beginTs + timeIncrement;
85
- await fetchLogs(command.opts().sources, new Date(beginTs * 1000).toISOString(), new Date(intermediateEndTs * 1000).toISOString(), frodo.cloud.log.resolveLevel(command.opts().level), command.opts().transactionId, command.opts().searchString, null, config.getNoiseFilters(options.defaults));
111
+ await fetchLogs(command.opts().sources, new Date(beginTs * 1000).toISOString(), new Date(intermediateEndTs * 1000).toISOString(), resolveLevel(command.opts().level), command.opts().transactionId, command.opts().searchString, null, config.getNoiseFilters(options.defaults));
86
112
  beginTs = intermediateEndTs;
87
113
  } while (intermediateEndTs < endTs);
88
114
  }
115
+ // no log api credentials
116
+ else {
117
+ printMessage('No log api credentials found!');
118
+ program.help();
119
+ process.exitCode = 1;
120
+ }
89
121
  });
90
122
  program.parse();
91
- //# sourceMappingURL=logs-fetch.js.map
123
+ //# sourceMappingURL=log-fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-fetch.js","names":["frodo","state","Option","fetchLogs","provisionCreds","config","printMessage","verboseMessage","FrodoCommand","sourcesOptionM","getTokens","login","resolveLevel","cloud","log","getConnectionProfile","saveConnectionProfile","conn","SECONDS_IN_30_DAYS","SECONDS_IN_1_HOUR","LOG_TIME_WINDOW_MAX","LOG_TIME_WINDOW_INCREMENT","program","description","addOption","default","FRODO_LOG_NOISEFILTER_FILENAME","action","host","user","password","options","command","handleDefaultArgsAndOpts","foundCredentials","setHost","tenant","getUsername","getPassword","setLogApiKey","setLogApiSecret","logApiKey","logApiSecret","getLogApiKey","getLogApiSecret","username","setUsername","setPassword","creds","api_key_id","api_key_secret","getHost","now","Date","nowString","toISOString","beginTimestamp","tempStartDate","setTime","tempEndDate","endTimestamp","beginTs","parse","endTs","process","exitCode","intermediateEndTs","opts","sources","level","timeIncrement","transactionId","searchString","getNoiseFilters","defaults","help"],"sources":["../../../src/cli/log/log-fetch.ts"],"sourcesContent":["import { frodo, state } from '@rockcarver/frodo-lib';\nimport { Option } from 'commander';\n\nimport { fetchLogs, provisionCreds } from '../../ops/LogOps';\nimport * as config from '../../utils/Config';\nimport { printMessage, verboseMessage } from '../../utils/Console';\nimport { FrodoCommand } from '../FrodoCommand';\nimport { sourcesOptionM } from './log';\n\nconst { getTokens } = frodo.login;\nconst { resolveLevel } = frodo.cloud.log;\nconst { getConnectionProfile, saveConnectionProfile } = frodo.conn;\n\nconst SECONDS_IN_30_DAYS = 2592000;\nconst SECONDS_IN_1_HOUR = 3600;\nconst LOG_TIME_WINDOW_MAX = SECONDS_IN_30_DAYS;\nconst LOG_TIME_WINDOW_INCREMENT = 1;\n\nconst program = new FrodoCommand('frodo log fetch', ['realm', 'type']);\nprogram\n .description(\n 'Fetch Identity Cloud logs between a specified begin and end time period.\\\n WARNING: depending on filters and time period specified, this could take substantial time to complete.'\n )\n .addOption(sourcesOptionM)\n .addOption(\n new Option(\n '-l, --level <level>',\n 'Set log level filter. You can specify the level as a number or a string. \\\nFollowing values are possible (values on the same line are equivalent): \\\n\\n0, SEVERE, FATAL, or ERROR\\n1, WARNING, WARN or CONFIG\\\n\\n2, INFO or INFORMATION\\n3, DEBUG, FINE, FINER or FINEST\\\n\\n4 or ALL'\n ).default('ERROR', `${resolveLevel('ERROR')}`)\n )\n .addOption(\n new Option('-t, --transaction-id <txid>', 'Filter by transactionId')\n )\n .addOption(\n new Option(\n '-b, --begin-timestamp <beginTs>',\n 'Begin timestamp for period (in ISO8601, example: \"2022-10-13T19:06:28Z\", or \"2022-09.30\". \\\nCannot be more than 30 days in the past. If not specified, logs from one hour ago are fetched \\\n(-e is ignored)'\n )\n )\n .addOption(\n new Option(\n '-e, --end-timestamp <endTs>',\n 'End timestamp for period. Default: \"now\"'\n )\n )\n .addOption(\n new Option(\n '-s, --search-string <ss>',\n 'Filter by a specific string (ANDed with transactionID filter)'\n )\n )\n .addOption(\n new Option('-d, --defaults', 'Use default logging noise filters').default(\n false,\n `Use custom logging noise filters defined in $HOME/${config.FRODO_LOG_NOISEFILTER_FILENAME}`\n )\n )\n .action(async (host, user, password, options, command) => {\n command.handleDefaultArgsAndOpts(host, user, password, options, command);\n\n let foundCredentials = false;\n\n const conn = await getConnectionProfile();\n if (conn) state.setHost(conn.tenant);\n\n // log api creds have been supplied as username and password arguments\n if (state.getUsername() && state.getPassword()) {\n verboseMessage(`Using log api credentials from command line.`);\n state.setLogApiKey(state.getUsername());\n state.setLogApiSecret(state.getPassword());\n foundCredentials = true;\n }\n // log api creds from connection profile\n else if (conn && conn.logApiKey != null && conn.logApiSecret != null) {\n verboseMessage(`Using log api credentials from connection profile.`);\n state.setLogApiKey(conn.logApiKey);\n state.setLogApiSecret(conn.logApiSecret);\n foundCredentials = true;\n }\n // log api creds have been supplied via env variables\n else if (state.getLogApiKey() && state.getLogApiSecret()) {\n verboseMessage(`Using log api credentials from environment variables.`);\n foundCredentials = true;\n }\n // no log api creds but got username and password, so can try to create them\n else if (conn && conn.username && conn.password) {\n printMessage(\n `Found admin credentials in connection profile, attempting to create log api credentials...`\n );\n state.setUsername(conn.username);\n state.setPassword(conn.password);\n if (await getTokens(true)) {\n const creds = await provisionCreds();\n state.setLogApiKey(creds.api_key_id as string);\n state.setLogApiSecret(creds.api_key_secret as string);\n await saveConnectionProfile(state.getHost());\n foundCredentials = true;\n }\n // unable to create credentials\n else {\n printMessage(`Unable to create log api credentials.`);\n }\n }\n\n if (foundCredentials) {\n const now = Date.now() / 1000;\n const nowString = new Date(now * 1000).toISOString();\n if (\n typeof options.beginTimestamp === 'undefined' ||\n !options.beginTimestamp\n ) {\n // no beginTimestamp value specified, default is 1 hour ago\n const tempStartDate = new Date();\n tempStartDate.setTime((now - SECONDS_IN_1_HOUR) * 1000);\n options.beginTimestamp = tempStartDate.toISOString();\n // also override endTimestamp to now\n const tempEndDate = new Date();\n tempEndDate.setTime(now * 1000);\n options.endTimestamp = tempEndDate;\n printMessage(\n 'No timestamps specified, defaulting to logs from 1 hour ago',\n 'info'\n );\n }\n if (\n typeof options.endTimestamp === 'undefined' ||\n !options.endTimestamp\n ) {\n // no endTimestamp value specified, default is now\n options.endTimestamp = nowString;\n printMessage(\n 'No end timestamp specified, defaulting end timestamp to \"now\"',\n 'info'\n );\n }\n let beginTs = Date.parse(options.beginTimestamp) / 1000;\n const endTs = Date.parse(options.endTimestamp) / 1000;\n if (endTs < beginTs) {\n printMessage(\n 'End timestamp can not be before begin timestamp',\n 'error'\n );\n process.exitCode = 1;\n return;\n }\n if (now - beginTs > LOG_TIME_WINDOW_MAX) {\n printMessage(\n 'Begin timestamp can not be more than 30 days in the past',\n 'error'\n );\n process.exitCode = 1;\n return;\n }\n let intermediateEndTs = 0;\n printMessage(\n `Fetching ID Cloud logs from the following sources: ${\n command.opts().sources\n } and levels [${resolveLevel(command.opts().level)}] of ${\n conn.tenant\n }...`\n );\n\n let timeIncrement = LOG_TIME_WINDOW_INCREMENT;\n if (endTs - beginTs > 30) {\n timeIncrement = timeIncrement * 30;\n }\n do {\n intermediateEndTs = beginTs + timeIncrement;\n await fetchLogs(\n command.opts().sources,\n new Date(beginTs * 1000).toISOString(),\n new Date(intermediateEndTs * 1000).toISOString(),\n resolveLevel(command.opts().level),\n command.opts().transactionId,\n command.opts().searchString,\n null,\n config.getNoiseFilters(options.defaults)\n );\n beginTs = intermediateEndTs;\n } while (intermediateEndTs < endTs);\n }\n // no log api credentials\n else {\n printMessage('No log api credentials found!');\n program.help();\n process.exitCode = 1;\n }\n });\n\nprogram.parse();\n"],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { frodo } from '@rockcarver/frodo-lib';
2
+ import { Option } from 'commander';
3
+ import { deleteLogApiKey, deleteLogApiKeys } from '../../ops/LogOps';
4
+ import { printMessage, verboseMessage } from '../../utils/Console';
5
+ import { FrodoCommand } from '../FrodoCommand';
6
+ const {
7
+ getTokens
8
+ } = frodo.login;
9
+ const program = new FrodoCommand('frodo log key delete');
10
+ program.description('Delete log API keys.').addOption(new Option('-i, --key-id <key-id>', 'Key id. Regex if specified with -a.')).addOption(new Option('-a, --all', 'Delete all keys. Optionally specify regex filter -i.')).action(
11
+ // implement command logic inside action handler
12
+ async (host, realm, user, password, options, command) => {
13
+ command.handleDefaultArgsAndOpts(host, realm, user, password, options, command);
14
+ // delete by id
15
+ if (options.keyId && (await getTokens(true))) {
16
+ verboseMessage(`Deleting key ${options.keyId}`);
17
+ deleteLogApiKey(options.keyId);
18
+ }
19
+ // --all -a
20
+ else if (options.all && (await getTokens(true))) {
21
+ verboseMessage('Deleting keys...');
22
+ deleteLogApiKeys();
23
+ }
24
+ // unrecognized combination of options or no options
25
+ else {
26
+ printMessage('Unrecognized combination of options or no options...', 'error');
27
+ program.help();
28
+ process.exitCode = 1;
29
+ }
30
+ }
31
+ // end command logic inside action handler
32
+ );
33
+
34
+ program.parse();
35
+ //# sourceMappingURL=log-key-delete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-key-delete.js","names":["frodo","Option","deleteLogApiKey","deleteLogApiKeys","printMessage","verboseMessage","FrodoCommand","getTokens","login","program","description","addOption","action","host","realm","user","password","options","command","handleDefaultArgsAndOpts","keyId","all","help","process","exitCode","parse"],"sources":["../../../src/cli/log/log-key-delete.ts"],"sourcesContent":["import { frodo } from '@rockcarver/frodo-lib';\nimport { Option } from 'commander';\n\nimport { deleteLogApiKey, deleteLogApiKeys } from '../../ops/LogOps';\nimport { printMessage, verboseMessage } from '../../utils/Console';\nimport { FrodoCommand } from '../FrodoCommand';\n\nconst { getTokens } = frodo.login;\n\nconst program = new FrodoCommand('frodo log key delete');\n\nprogram\n .description('Delete log API keys.')\n .addOption(\n new Option('-i, --key-id <key-id>', 'Key id. Regex if specified with -a.')\n )\n .addOption(\n new Option(\n '-a, --all',\n 'Delete all keys. Optionally specify regex filter -i.'\n )\n )\n .action(\n // implement command logic inside action handler\n async (host, realm, user, password, options, command) => {\n command.handleDefaultArgsAndOpts(\n host,\n realm,\n user,\n password,\n options,\n command\n );\n // delete by id\n if (options.keyId && (await getTokens(true))) {\n verboseMessage(`Deleting key ${options.keyId}`);\n deleteLogApiKey(options.keyId);\n }\n // --all -a\n else if (options.all && (await getTokens(true))) {\n verboseMessage('Deleting keys...');\n deleteLogApiKeys();\n }\n // unrecognized combination of options or no options\n else {\n printMessage(\n 'Unrecognized combination of options or no options...',\n 'error'\n );\n program.help();\n process.exitCode = 1;\n }\n }\n // end command logic inside action handler\n );\n\nprogram.parse();\n"],"mappings":"AAAA,SAASA,KAAK,QAAQ,uBAAuB;AAC7C,SAASC,MAAM,QAAQ,WAAW;AAElC,SAASC,eAAe,EAAEC,gBAAgB,QAAQ,kBAAkB;AACpE,SAASC,YAAY,EAAEC,cAAc,QAAQ,qBAAqB;AAClE,SAASC,YAAY,QAAQ,iBAAiB;AAE9C,MAAM;EAAEC;AAAU,CAAC,GAAGP,KAAK,CAACQ,KAAK;AAEjC,MAAMC,OAAO,GAAG,IAAIH,YAAY,CAAC,sBAAsB,CAAC;AAExDG,OAAO,CACJC,WAAW,CAAC,sBAAsB,CAAC,CACnCC,SAAS,CACR,IAAIV,MAAM,CAAC,uBAAuB,EAAE,qCAAqC,CAC3E,CAAC,CACAU,SAAS,CACR,IAAIV,MAAM,CACR,WAAW,EACX,sDACF,CACF,CAAC,CACAW,MAAM;AACL;AACA,OAAOC,IAAI,EAAEC,KAAK,EAAEC,IAAI,EAAEC,QAAQ,EAAEC,OAAO,EAAEC,OAAO,KAAK;EACvDA,OAAO,CAACC,wBAAwB,CAC9BN,IAAI,EACJC,KAAK,EACLC,IAAI,EACJC,QAAQ,EACRC,OAAO,EACPC,OACF,CAAC;EACD;EACA,IAAID,OAAO,CAACG,KAAK,KAAK,MAAMb,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE;IAC5CF,cAAc,CAAE,gBAAeY,OAAO,CAACG,KAAM,EAAC,CAAC;IAC/ClB,eAAe,CAACe,OAAO,CAACG,KAAK,CAAC;EAChC;EACA;EAAA,KACK,IAAIH,OAAO,CAACI,GAAG,KAAK,MAAMd,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE;IAC/CF,cAAc,CAAC,kBAAkB,CAAC;IAClCF,gBAAgB,CAAC,CAAC;EACpB;EACA;EAAA,KACK;IACHC,YAAY,CACV,sDAAsD,EACtD,OACF,CAAC;IACDK,OAAO,CAACa,IAAI,CAAC,CAAC;IACdC,OAAO,CAACC,QAAQ,GAAG,CAAC;EACtB;AACF;AACA;AACF,CAAC;;AAEHf,OAAO,CAACgB,KAAK,CAAC,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { frodo } from '@rockcarver/frodo-lib';
2
+ import { Option } from 'commander';
3
+ import { FrodoCommand } from '../FrodoCommand';
4
+ const {
5
+ getTokens
6
+ } = frodo.login;
7
+ const program = new FrodoCommand('frodo log key describe');
8
+ program.description('Describe log API keys.').addOption(new Option('-i, --key-id <key-id>', 'Key id. If specified, -a and -A are ignored.')).action(
9
+ // implement command logic inside action handler
10
+ async (host, realm, user, password, options, command) => {
11
+ command.handleDefaultArgsAndOpts(host, realm, user, password, options, command);
12
+ if (await getTokens()) {
13
+ // code goes here
14
+ } else {
15
+ process.exitCode = 1;
16
+ }
17
+ }
18
+ // end command logic inside action handler
19
+ );
20
+
21
+ program.parse();
22
+ //# sourceMappingURL=log-key-describe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-key-describe.js","names":["frodo","Option","FrodoCommand","getTokens","login","program","description","addOption","action","host","realm","user","password","options","command","handleDefaultArgsAndOpts","process","exitCode","parse"],"sources":["../../../src/cli/log/log-key-describe.ts"],"sourcesContent":["import { frodo } from '@rockcarver/frodo-lib';\nimport { Option } from 'commander';\n\nimport { FrodoCommand } from '../FrodoCommand';\n\nconst { getTokens } = frodo.login;\n\nconst program = new FrodoCommand('frodo log key describe');\n\nprogram\n .description('Describe log API keys.')\n .addOption(\n new Option(\n '-i, --key-id <key-id>',\n 'Key id. If specified, -a and -A are ignored.'\n )\n )\n .action(\n // implement command logic inside action handler\n async (host, realm, user, password, options, command) => {\n command.handleDefaultArgsAndOpts(\n host,\n realm,\n user,\n password,\n options,\n command\n );\n if (await getTokens()) {\n // code goes here\n } else {\n process.exitCode = 1;\n }\n }\n // end command logic inside action handler\n );\n\nprogram.parse();\n"],"mappings":"AAAA,SAASA,KAAK,QAAQ,uBAAuB;AAC7C,SAASC,MAAM,QAAQ,WAAW;AAElC,SAASC,YAAY,QAAQ,iBAAiB;AAE9C,MAAM;EAAEC;AAAU,CAAC,GAAGH,KAAK,CAACI,KAAK;AAEjC,MAAMC,OAAO,GAAG,IAAIH,YAAY,CAAC,wBAAwB,CAAC;AAE1DG,OAAO,CACJC,WAAW,CAAC,wBAAwB,CAAC,CACrCC,SAAS,CACR,IAAIN,MAAM,CACR,uBAAuB,EACvB,8CACF,CACF,CAAC,CACAO,MAAM;AACL;AACA,OAAOC,IAAI,EAAEC,KAAK,EAAEC,IAAI,EAAEC,QAAQ,EAAEC,OAAO,EAAEC,OAAO,KAAK;EACvDA,OAAO,CAACC,wBAAwB,CAC9BN,IAAI,EACJC,KAAK,EACLC,IAAI,EACJC,QAAQ,EACRC,OAAO,EACPC,OACF,CAAC;EACD,IAAI,MAAMX,SAAS,CAAC,CAAC,EAAE;IACrB;EAAA,CACD,MAAM;IACLa,OAAO,CAACC,QAAQ,GAAG,CAAC;EACtB;AACF;AACA;AACF,CAAC;;AAEHZ,OAAO,CAACa,KAAK,CAAC,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { frodo } from '@rockcarver/frodo-lib';
2
+ import { Option } from 'commander';
3
+ import { listLogApiKeys } from '../../ops/LogOps';
4
+ import { verboseMessage } from '../../utils/Console';
5
+ import { FrodoCommand } from '../FrodoCommand';
6
+ const {
7
+ getTokens
8
+ } = frodo.login;
9
+ const program = new FrodoCommand('frodo log key list');
10
+ program.description('List log API keys.').addOption(new Option('-l, --long', 'Long with all fields.').default(false, 'false')).action(
11
+ // implement command logic inside action handler
12
+ async (host, realm, user, password, options, command) => {
13
+ command.handleDefaultArgsAndOpts(host, realm, user, password, options, command);
14
+ if (await getTokens(true)) {
15
+ verboseMessage(`Listing log API keys...`);
16
+ const outcome = await listLogApiKeys(options.long);
17
+ if (!outcome) process.exitCode = 1;
18
+ } else {
19
+ process.exitCode = 1;
20
+ }
21
+ }
22
+ // end command logic inside action handler
23
+ );
24
+
25
+ program.parse();
26
+ //# sourceMappingURL=log-key-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-key-list.js","names":["frodo","Option","listLogApiKeys","verboseMessage","FrodoCommand","getTokens","login","program","description","addOption","default","action","host","realm","user","password","options","command","handleDefaultArgsAndOpts","outcome","long","process","exitCode","parse"],"sources":["../../../src/cli/log/log-key-list.ts"],"sourcesContent":["import { frodo } from '@rockcarver/frodo-lib';\nimport { Option } from 'commander';\n\nimport { listLogApiKeys } from '../../ops/LogOps';\nimport { verboseMessage } from '../../utils/Console';\nimport { FrodoCommand } from '../FrodoCommand';\n\nconst { getTokens } = frodo.login;\n\nconst program = new FrodoCommand('frodo log key list');\n\nprogram\n .description('List log API keys.')\n .addOption(\n new Option('-l, --long', 'Long with all fields.').default(false, 'false')\n )\n .action(\n // implement command logic inside action handler\n async (host, realm, user, password, options, command) => {\n command.handleDefaultArgsAndOpts(\n host,\n realm,\n user,\n password,\n options,\n command\n );\n if (await getTokens(true)) {\n verboseMessage(`Listing log API keys...`);\n const outcome = await listLogApiKeys(options.long);\n if (!outcome) process.exitCode = 1;\n } else {\n process.exitCode = 1;\n }\n }\n // end command logic inside action handler\n );\n\nprogram.parse();\n"],"mappings":"AAAA,SAASA,KAAK,QAAQ,uBAAuB;AAC7C,SAASC,MAAM,QAAQ,WAAW;AAElC,SAASC,cAAc,QAAQ,kBAAkB;AACjD,SAASC,cAAc,QAAQ,qBAAqB;AACpD,SAASC,YAAY,QAAQ,iBAAiB;AAE9C,MAAM;EAAEC;AAAU,CAAC,GAAGL,KAAK,CAACM,KAAK;AAEjC,MAAMC,OAAO,GAAG,IAAIH,YAAY,CAAC,oBAAoB,CAAC;AAEtDG,OAAO,CACJC,WAAW,CAAC,oBAAoB,CAAC,CACjCC,SAAS,CACR,IAAIR,MAAM,CAAC,YAAY,EAAE,uBAAuB,CAAC,CAACS,OAAO,CAAC,KAAK,EAAE,OAAO,CAC1E,CAAC,CACAC,MAAM;AACL;AACA,OAAOC,IAAI,EAAEC,KAAK,EAAEC,IAAI,EAAEC,QAAQ,EAAEC,OAAO,EAAEC,OAAO,KAAK;EACvDA,OAAO,CAACC,wBAAwB,CAC9BN,IAAI,EACJC,KAAK,EACLC,IAAI,EACJC,QAAQ,EACRC,OAAO,EACPC,OACF,CAAC;EACD,IAAI,MAAMZ,SAAS,CAAC,IAAI,CAAC,EAAE;IACzBF,cAAc,CAAE,yBAAwB,CAAC;IACzC,MAAMgB,OAAO,GAAG,MAAMjB,cAAc,CAACc,OAAO,CAACI,IAAI,CAAC;IAClD,IAAI,CAACD,OAAO,EAAEE,OAAO,CAACC,QAAQ,GAAG,CAAC;EACpC,CAAC,MAAM;IACLD,OAAO,CAACC,QAAQ,GAAG,CAAC;EACtB;AACF;AACA;AACF,CAAC;;AAEHf,OAAO,CAACgB,KAAK,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { FrodoStubCommand } from '../FrodoCommand';
2
+ const program = new FrodoStubCommand('frodo log key');
3
+ program.description('Manage Identity Cloud log API keys.');
4
+ program.command('list', 'List log API keys.');
5
+ program.command('describe', 'Describe log API keys.');
6
+ program.command('delete', 'Delete log API keys.');
7
+ program.parse();
8
+ //# sourceMappingURL=log-key.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-key.js","names":["FrodoStubCommand","program","description","command","parse"],"sources":["../../../src/cli/log/log-key.ts"],"sourcesContent":["import { FrodoStubCommand } from '../FrodoCommand';\n\nconst program = new FrodoStubCommand('frodo log key');\n\nprogram.description('Manage Identity Cloud log API keys.');\n\nprogram.command('list', 'List log API keys.');\n\nprogram.command('describe', 'Describe log API keys.');\n\nprogram.command('delete', 'Delete log API keys.');\n\nprogram.parse();\n"],"mappings":"AAAA,SAASA,gBAAgB,QAAQ,iBAAiB;AAElD,MAAMC,OAAO,GAAG,IAAID,gBAAgB,CAAC,eAAe,CAAC;AAErDC,OAAO,CAACC,WAAW,CAAC,qCAAqC,CAAC;AAE1DD,OAAO,CAACE,OAAO,CAAC,MAAM,EAAE,oBAAoB,CAAC;AAE7CF,OAAO,CAACE,OAAO,CAAC,UAAU,EAAE,wBAAwB,CAAC;AAErDF,OAAO,CAACE,OAAO,CAAC,QAAQ,EAAE,sBAAsB,CAAC;AAEjDF,OAAO,CAACG,KAAK,CAAC,CAAC"}
@@ -0,0 +1,80 @@
1
+ import { frodo, state } from '@rockcarver/frodo-lib';
2
+ import { provisionCreds } from '../../ops/LogOps';
3
+ import { printMessage, verboseMessage } from '../../utils/Console';
4
+ import { FrodoCommand } from '../FrodoCommand';
5
+ const {
6
+ getTokens
7
+ } = frodo.login;
8
+ const {
9
+ getConnectionProfile,
10
+ saveConnectionProfile
11
+ } = frodo.conn;
12
+ const {
13
+ getLogSources
14
+ } = frodo.cloud.log;
15
+ const program = new FrodoCommand('frodo log list', ['realm', 'type']);
16
+ program.description('List available ID Cloud log sources.').action(async (host, user, password, options, command) => {
17
+ command.handleDefaultArgsAndOpts(host, user, password, options, command);
18
+ verboseMessage('Listing available ID Cloud log sources...');
19
+ let foundCredentials = false;
20
+ const conn = await getConnectionProfile();
21
+ if (conn) state.setHost(conn.tenant);
22
+
23
+ // log api creds have been supplied as username and password arguments
24
+ if (state.getUsername() && state.getPassword()) {
25
+ verboseMessage(`Using log api credentials from command line.`);
26
+ state.setLogApiKey(state.getUsername());
27
+ state.setLogApiSecret(state.getPassword());
28
+ foundCredentials = true;
29
+ }
30
+ // log api creds from connection profile
31
+ else if (conn && conn.logApiKey != null && conn.logApiSecret != null) {
32
+ verboseMessage(`Using log api credentials from connection profile.`);
33
+ state.setLogApiKey(conn.logApiKey);
34
+ state.setLogApiSecret(conn.logApiSecret);
35
+ foundCredentials = true;
36
+ }
37
+ // log api creds have been supplied via env variables
38
+ else if (state.getLogApiKey() && state.getLogApiSecret()) {
39
+ verboseMessage(`Using log api credentials from environment variables.`);
40
+ foundCredentials = true;
41
+ }
42
+ // no log api creds but got username and password, so can try to create them
43
+ else if (conn && conn.username && conn.password) {
44
+ printMessage(`Found admin credentials in connection profile, attempting to create log api credentials...`);
45
+ state.setUsername(conn.username);
46
+ state.setPassword(conn.password);
47
+ if (await getTokens(true)) {
48
+ const creds = await provisionCreds();
49
+ state.setLogApiKey(creds.api_key_id);
50
+ state.setLogApiSecret(creds.api_key_secret);
51
+ await saveConnectionProfile(state.getHost());
52
+ foundCredentials = true;
53
+ }
54
+ // unable to create credentials
55
+ else {
56
+ printMessage(`Unable to create log api credentials.`);
57
+ }
58
+ }
59
+ if (foundCredentials) {
60
+ const sources = await getLogSources();
61
+ if (sources.length === 0) {
62
+ printMessage("Can't get sources, possible cause - wrong API key or secret", 'error');
63
+ } else {
64
+ printMessage(`Log sources from ${state.getHost()}`);
65
+ for (const source of sources) {
66
+ printMessage(`${source}`, 'data');
67
+ }
68
+ printMessage('Use any combination of comma separated sources, example:', 'info');
69
+ printMessage(`$ frodo logs tail -c am-core,idm-core ${state.getHost()}`, 'text');
70
+ }
71
+ }
72
+ // no log api credentials
73
+ else {
74
+ printMessage('No log api credentials found!');
75
+ program.help();
76
+ process.exitCode = 1;
77
+ }
78
+ });
79
+ program.parse();
80
+ //# sourceMappingURL=log-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-list.js","names":["frodo","state","provisionCreds","printMessage","verboseMessage","FrodoCommand","getTokens","login","getConnectionProfile","saveConnectionProfile","conn","getLogSources","cloud","log","program","description","action","host","user","password","options","command","handleDefaultArgsAndOpts","foundCredentials","setHost","tenant","getUsername","getPassword","setLogApiKey","setLogApiSecret","logApiKey","logApiSecret","getLogApiKey","getLogApiSecret","username","setUsername","setPassword","creds","api_key_id","api_key_secret","getHost","sources","length","source","help","process","exitCode","parse"],"sources":["../../../src/cli/log/log-list.ts"],"sourcesContent":["import { frodo, state } from '@rockcarver/frodo-lib';\n\nimport { provisionCreds } from '../../ops/LogOps';\nimport { printMessage, verboseMessage } from '../../utils/Console';\nimport { FrodoCommand } from '../FrodoCommand';\n\nconst { getTokens } = frodo.login;\nconst { getConnectionProfile, saveConnectionProfile } = frodo.conn;\nconst { getLogSources } = frodo.cloud.log;\n\nconst program = new FrodoCommand('frodo log list', ['realm', 'type']);\nprogram\n .description('List available ID Cloud log sources.')\n .action(async (host, user, password, options, command) => {\n command.handleDefaultArgsAndOpts(host, user, password, options, command);\n\n verboseMessage('Listing available ID Cloud log sources...');\n\n let foundCredentials = false;\n\n const conn = await getConnectionProfile();\n if (conn) state.setHost(conn.tenant);\n\n // log api creds have been supplied as username and password arguments\n if (state.getUsername() && state.getPassword()) {\n verboseMessage(`Using log api credentials from command line.`);\n state.setLogApiKey(state.getUsername());\n state.setLogApiSecret(state.getPassword());\n foundCredentials = true;\n }\n // log api creds from connection profile\n else if (conn && conn.logApiKey != null && conn.logApiSecret != null) {\n verboseMessage(`Using log api credentials from connection profile.`);\n state.setLogApiKey(conn.logApiKey);\n state.setLogApiSecret(conn.logApiSecret);\n foundCredentials = true;\n }\n // log api creds have been supplied via env variables\n else if (state.getLogApiKey() && state.getLogApiSecret()) {\n verboseMessage(`Using log api credentials from environment variables.`);\n foundCredentials = true;\n }\n // no log api creds but got username and password, so can try to create them\n else if (conn && conn.username && conn.password) {\n printMessage(\n `Found admin credentials in connection profile, attempting to create log api credentials...`\n );\n state.setUsername(conn.username);\n state.setPassword(conn.password);\n if (await getTokens(true)) {\n const creds = await provisionCreds();\n state.setLogApiKey(creds.api_key_id as string);\n state.setLogApiSecret(creds.api_key_secret as string);\n await saveConnectionProfile(state.getHost());\n foundCredentials = true;\n }\n // unable to create credentials\n else {\n printMessage(`Unable to create log api credentials.`);\n }\n }\n\n if (foundCredentials) {\n const sources = await getLogSources();\n if (sources.length === 0) {\n printMessage(\n \"Can't get sources, possible cause - wrong API key or secret\",\n 'error'\n );\n } else {\n printMessage(`Log sources from ${state.getHost()}`);\n for (const source of sources) {\n printMessage(`${source}`, 'data');\n }\n printMessage(\n 'Use any combination of comma separated sources, example:',\n 'info'\n );\n printMessage(\n `$ frodo logs tail -c am-core,idm-core ${state.getHost()}`,\n 'text'\n );\n }\n }\n // no log api credentials\n else {\n printMessage('No log api credentials found!');\n program.help();\n process.exitCode = 1;\n }\n });\n\nprogram.parse();\n"],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ import { frodo, state } from '@rockcarver/frodo-lib';
2
+ import { Option } from 'commander';
3
+ import { provisionCreds, tailLogs } from '../../ops/LogOps';
4
+ import * as config from '../../utils/Config';
5
+ import { printMessage, verboseMessage } from '../../utils/Console';
6
+ import { FrodoCommand } from '../FrodoCommand';
7
+ import { sourcesOptionM } from './log';
8
+ const {
9
+ getTokens
10
+ } = frodo.login;
11
+ const {
12
+ resolveLevel
13
+ } = frodo.cloud.log;
14
+ const {
15
+ getConnectionProfile,
16
+ saveConnectionProfile
17
+ } = frodo.conn;
18
+ const program = new FrodoCommand('frodo log tail', ['realm', 'type']);
19
+ program.description('Tail Identity Cloud logs.').addOption(sourcesOptionM).addOption(new Option('-l, --level <level>', 'Set log level filter. You can specify the level as a number or a string. \
20
+ Following values are possible (values on the same line are equivalent): \
21
+ \n0, SEVERE, FATAL, or ERROR\n1, WARNING, WARN or CONFIG\
22
+ \n2, INFO or INFORMATION\n3, DEBUG, FINE, FINER or FINEST\
23
+ \n4 or ALL').default('ERROR', `${resolveLevel('ERROR')}`)).addOption(new Option('-t, --transaction-id <txid>', 'Filter by transactionId')).addOption(new Option('-d, --defaults', 'Use default logging noise filters').default(false, `Use custom logging noise filters defined in $HOME/${config.FRODO_LOG_NOISEFILTER_FILENAME}`)).action(async (host, user, password, options, command) => {
24
+ command.handleDefaultArgsAndOpts(host, user, password, options, command);
25
+ let foundCredentials = false;
26
+ const conn = await getConnectionProfile();
27
+ if (conn) state.setHost(conn.tenant);
28
+
29
+ // log api creds have been supplied as username and password arguments
30
+ if (state.getUsername() && state.getPassword()) {
31
+ verboseMessage(`Using log api credentials from command line.`);
32
+ state.setLogApiKey(state.getUsername());
33
+ state.setLogApiSecret(state.getPassword());
34
+ foundCredentials = true;
35
+ }
36
+ // log api creds from connection profile
37
+ else if (conn && conn.logApiKey != null && conn.logApiSecret != null) {
38
+ verboseMessage(`Using log api credentials from connection profile.`);
39
+ state.setLogApiKey(conn.logApiKey);
40
+ state.setLogApiSecret(conn.logApiSecret);
41
+ foundCredentials = true;
42
+ }
43
+ // log api creds have been supplied via env variables
44
+ else if (state.getLogApiKey() && state.getLogApiSecret()) {
45
+ verboseMessage(`Using log api credentials from environment variables.`);
46
+ foundCredentials = true;
47
+ }
48
+ // no log api creds but got username and password, so can try to create them
49
+ else if (conn && conn.username && conn.password) {
50
+ printMessage(`Found admin credentials in connection profile, attempting to create log api credentials...`);
51
+ state.setUsername(conn.username);
52
+ state.setPassword(conn.password);
53
+ if (await getTokens(true)) {
54
+ const creds = await provisionCreds();
55
+ state.setLogApiKey(creds.api_key_id);
56
+ state.setLogApiSecret(creds.api_key_secret);
57
+ await saveConnectionProfile(state.getHost());
58
+ foundCredentials = true;
59
+ }
60
+ // unable to create credentials
61
+ else {
62
+ printMessage(`Unable to create log api credentials.`);
63
+ }
64
+ }
65
+ if (foundCredentials) {
66
+ printMessage(`Tailing ID Cloud logs from the following sources: ${options.sources} and levels [${resolveLevel(options.level)}] of ${state.getHost()}...`);
67
+ await tailLogs(command.opts().sources, resolveLevel(command.opts().level), command.opts().transactionId, null, config.getNoiseFilters(options.defaults));
68
+ }
69
+ // no log api credentials
70
+ else {
71
+ printMessage('No log api credentials found!');
72
+ program.help();
73
+ process.exitCode = 1;
74
+ }
75
+ });
76
+ program.parse();
77
+ //# sourceMappingURL=log-tail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-tail.js","names":["frodo","state","Option","provisionCreds","tailLogs","config","printMessage","verboseMessage","FrodoCommand","sourcesOptionM","getTokens","login","resolveLevel","cloud","log","getConnectionProfile","saveConnectionProfile","conn","program","description","addOption","default","FRODO_LOG_NOISEFILTER_FILENAME","action","host","user","password","options","command","handleDefaultArgsAndOpts","foundCredentials","setHost","tenant","getUsername","getPassword","setLogApiKey","setLogApiSecret","logApiKey","logApiSecret","getLogApiKey","getLogApiSecret","username","setUsername","setPassword","creds","api_key_id","api_key_secret","getHost","sources","level","opts","transactionId","getNoiseFilters","defaults","help","process","exitCode","parse"],"sources":["../../../src/cli/log/log-tail.ts"],"sourcesContent":["import { frodo, state } from '@rockcarver/frodo-lib';\nimport { Option } from 'commander';\n\nimport { provisionCreds, tailLogs } from '../../ops/LogOps';\nimport * as config from '../../utils/Config';\nimport { printMessage, verboseMessage } from '../../utils/Console';\nimport { FrodoCommand } from '../FrodoCommand';\nimport { sourcesOptionM } from './log';\n\nconst { getTokens } = frodo.login;\nconst { resolveLevel } = frodo.cloud.log;\nconst { getConnectionProfile, saveConnectionProfile } = frodo.conn;\n\nconst program = new FrodoCommand('frodo log tail', ['realm', 'type']);\nprogram\n .description('Tail Identity Cloud logs.')\n .addOption(sourcesOptionM)\n .addOption(\n new Option(\n '-l, --level <level>',\n 'Set log level filter. You can specify the level as a number or a string. \\\nFollowing values are possible (values on the same line are equivalent): \\\n\\n0, SEVERE, FATAL, or ERROR\\n1, WARNING, WARN or CONFIG\\\n\\n2, INFO or INFORMATION\\n3, DEBUG, FINE, FINER or FINEST\\\n\\n4 or ALL'\n ).default('ERROR', `${resolveLevel('ERROR')}`)\n )\n .addOption(\n new Option('-t, --transaction-id <txid>', 'Filter by transactionId')\n )\n .addOption(\n new Option('-d, --defaults', 'Use default logging noise filters').default(\n false,\n `Use custom logging noise filters defined in $HOME/${config.FRODO_LOG_NOISEFILTER_FILENAME}`\n )\n )\n .action(async (host, user, password, options, command) => {\n command.handleDefaultArgsAndOpts(host, user, password, options, command);\n\n let foundCredentials = false;\n\n const conn = await getConnectionProfile();\n if (conn) state.setHost(conn.tenant);\n\n // log api creds have been supplied as username and password arguments\n if (state.getUsername() && state.getPassword()) {\n verboseMessage(`Using log api credentials from command line.`);\n state.setLogApiKey(state.getUsername());\n state.setLogApiSecret(state.getPassword());\n foundCredentials = true;\n }\n // log api creds from connection profile\n else if (conn && conn.logApiKey != null && conn.logApiSecret != null) {\n verboseMessage(`Using log api credentials from connection profile.`);\n state.setLogApiKey(conn.logApiKey);\n state.setLogApiSecret(conn.logApiSecret);\n foundCredentials = true;\n }\n // log api creds have been supplied via env variables\n else if (state.getLogApiKey() && state.getLogApiSecret()) {\n verboseMessage(`Using log api credentials from environment variables.`);\n foundCredentials = true;\n }\n // no log api creds but got username and password, so can try to create them\n else if (conn && conn.username && conn.password) {\n printMessage(\n `Found admin credentials in connection profile, attempting to create log api credentials...`\n );\n state.setUsername(conn.username);\n state.setPassword(conn.password);\n if (await getTokens(true)) {\n const creds = await provisionCreds();\n state.setLogApiKey(creds.api_key_id as string);\n state.setLogApiSecret(creds.api_key_secret as string);\n await saveConnectionProfile(state.getHost());\n foundCredentials = true;\n }\n // unable to create credentials\n else {\n printMessage(`Unable to create log api credentials.`);\n }\n }\n\n if (foundCredentials) {\n printMessage(\n `Tailing ID Cloud logs from the following sources: ${\n options.sources\n } and levels [${resolveLevel(options.level)}] of ${state.getHost()}...`\n );\n await tailLogs(\n command.opts().sources,\n resolveLevel(command.opts().level),\n command.opts().transactionId,\n null,\n config.getNoiseFilters(options.defaults)\n );\n }\n // no log api credentials\n else {\n printMessage('No log api credentials found!');\n program.help();\n process.exitCode = 1;\n }\n });\n\nprogram.parse();\n"],"mappings":"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"}
@@ -1,14 +1,17 @@
1
- import { FrodoStubCommand } from '../FrodoCommand';
2
1
  import { Option } from 'commander';
3
2
  import path from 'path';
4
3
  import { fileURLToPath } from 'url';
4
+ import { FrodoStubCommand } from '../FrodoCommand';
5
5
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
6
6
  export const sourcesOptionM = new Option('-c, --sources <sources>', 'Comma separated list of log sources').makeOptionMandatory().default('am-everything,idm-everything', 'Log everything');
7
7
  export default function setup() {
8
- const program = new FrodoStubCommand('logs').summary('List/View Identity Cloud logs').description(`View Identity Cloud logs. If valid tenant admin credentials are specified, a log API key and secret are automatically created for that admin user.`).executableDir(__dirname);
8
+ const program = new FrodoStubCommand('log')
9
+ // for backwards compatibility
10
+ .alias('logs').summary('List/View Identity Cloud logs').description(`View Identity Cloud logs. If valid tenant admin credentials are specified, a log API key and secret are automatically created for that admin user.`).executableDir(__dirname);
9
11
  program.command('list', 'List available ID Cloud log sources.');
10
12
  program.command('tail', 'Tail Identity Cloud logs.');
11
13
  program.command('fetch', 'Fetch Identity Cloud logs for a time window.');
14
+ program.command('key', 'Manage Identity Cloud log API keys.');
12
15
  return program;
13
16
  }
14
- //# sourceMappingURL=logs.js.map
17
+ //# sourceMappingURL=log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.js","names":["Option","path","fileURLToPath","FrodoStubCommand","__dirname","dirname","import","meta","url","sourcesOptionM","makeOptionMandatory","default","setup","program","alias","summary","description","executableDir","command"],"sources":["../../../src/cli/log/log.ts"],"sourcesContent":["import { Option } from 'commander';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\n\nimport { FrodoStubCommand } from '../FrodoCommand';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nexport const sourcesOptionM = new Option(\n '-c, --sources <sources>',\n 'Comma separated list of log sources'\n)\n .makeOptionMandatory()\n .default('am-everything,idm-everything', 'Log everything');\n\nexport default function setup() {\n const program = new FrodoStubCommand('log')\n // for backwards compatibility\n .alias('logs')\n .summary('List/View Identity Cloud logs')\n .description(\n `View Identity Cloud logs. If valid tenant admin credentials are specified, a log API key and secret are automatically created for that admin user.`\n )\n .executableDir(__dirname);\n\n program.command('list', 'List available ID Cloud log sources.');\n\n program.command('tail', 'Tail Identity Cloud logs.');\n\n program.command('fetch', 'Fetch Identity Cloud logs for a time window.');\n\n program.command('key', 'Manage Identity Cloud log API keys.');\n\n return program;\n}\n"],"mappings":"AAAA,SAASA,MAAM,QAAQ,WAAW;AAClC,OAAOC,IAAI,MAAM,MAAM;AACvB,SAASC,aAAa,QAAQ,KAAK;AAEnC,SAASC,gBAAgB,QAAQ,iBAAiB;AAElD,MAAMC,SAAS,GAAGH,IAAI,CAACI,OAAO,CAACH,aAAa,CAACI,MAAM,CAACC,IAAI,CAACC,GAAG,CAAC,CAAC;AAE9D,OAAO,MAAMC,cAAc,GAAG,IAAIT,MAAM,CACtC,yBAAyB,EACzB,qCACF,CAAC,CACEU,mBAAmB,CAAC,CAAC,CACrBC,OAAO,CAAC,8BAA8B,EAAE,gBAAgB,CAAC;AAE5D,eAAe,SAASC,KAAKA,CAAA,EAAG;EAC9B,MAAMC,OAAO,GAAG,IAAIV,gBAAgB,CAAC,KAAK;EACxC;EAAA,CACCW,KAAK,CAAC,MAAM,CAAC,CACbC,OAAO,CAAC,+BAA+B,CAAC,CACxCC,WAAW,CACT,oJACH,CAAC,CACAC,aAAa,CAACb,SAAS,CAAC;EAE3BS,OAAO,CAACK,OAAO,CAAC,MAAM,EAAE,sCAAsC,CAAC;EAE/DL,OAAO,CAACK,OAAO,CAAC,MAAM,EAAE,2BAA2B,CAAC;EAEpDL,OAAO,CAACK,OAAO,CAAC,OAAO,EAAE,8CAA8C,CAAC;EAExEL,OAAO,CAACK,OAAO,CAAC,KAAK,EAAE,qCAAqC,CAAC;EAE7D,OAAOL,OAAO;AAChB"}
@@ -0,0 +1,22 @@
1
+ import { frodo } from '@rockcarver/frodo-lib';
2
+ import { Option } from 'commander';
3
+ import { FrodoCommand } from '../FrodoCommand';
4
+ const {
5
+ getTokens
6
+ } = frodo.login;
7
+ const program = new FrodoCommand('frodo oauth client delete');
8
+ program.description('Delete OAuth2 clients.').addOption(new Option('-i, --app-id <id>', 'OAuth2 application id/name. If specified, -a and -A are ignored.')).addOption(new Option('-a, --all', 'Delete all cmds in a realm. Ignored with -i.')).addOption(new Option('--no-deep', 'No deep delete. This leaves orphaned configuration artifacts behind.')).action(
9
+ // implement command logic inside action handler
10
+ async (host, realm, user, password, options, command) => {
11
+ command.handleDefaultArgsAndOpts(host, realm, user, password, options, command);
12
+ if (await getTokens()) {
13
+ // code goes here
14
+ } else {
15
+ process.exitCode = 1;
16
+ }
17
+ }
18
+ // end command logic inside action handler
19
+ );
20
+
21
+ program.parse();
22
+ //# sourceMappingURL=oauth-client-delete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-client-delete.js","names":["frodo","Option","FrodoCommand","getTokens","login","program","description","addOption","action","host","realm","user","password","options","command","handleDefaultArgsAndOpts","process","exitCode","parse"],"sources":["../../../src/cli/oauth/oauth-client-delete.ts"],"sourcesContent":["import { frodo } from '@rockcarver/frodo-lib';\nimport { Option } from 'commander';\n\nimport { FrodoCommand } from '../FrodoCommand';\n\nconst { getTokens } = frodo.login;\n\nconst program = new FrodoCommand('frodo oauth client delete');\n\nprogram\n .description('Delete OAuth2 clients.')\n .addOption(\n new Option(\n '-i, --app-id <id>',\n 'OAuth2 application id/name. If specified, -a and -A are ignored.'\n )\n )\n .addOption(\n new Option('-a, --all', 'Delete all cmds in a realm. Ignored with -i.')\n )\n .addOption(\n new Option(\n '--no-deep',\n 'No deep delete. This leaves orphaned configuration artifacts behind.'\n )\n )\n .action(\n // implement command logic inside action handler\n async (host, realm, user, password, options, command) => {\n command.handleDefaultArgsAndOpts(\n host,\n realm,\n user,\n password,\n options,\n command\n );\n if (await getTokens()) {\n // code goes here\n } else {\n process.exitCode = 1;\n }\n }\n // end command logic inside action handler\n );\n\nprogram.parse();\n"],"mappings":"AAAA,SAASA,KAAK,QAAQ,uBAAuB;AAC7C,SAASC,MAAM,QAAQ,WAAW;AAElC,SAASC,YAAY,QAAQ,iBAAiB;AAE9C,MAAM;EAAEC;AAAU,CAAC,GAAGH,KAAK,CAACI,KAAK;AAEjC,MAAMC,OAAO,GAAG,IAAIH,YAAY,CAAC,2BAA2B,CAAC;AAE7DG,OAAO,CACJC,WAAW,CAAC,wBAAwB,CAAC,CACrCC,SAAS,CACR,IAAIN,MAAM,CACR,mBAAmB,EACnB,kEACF,CACF,CAAC,CACAM,SAAS,CACR,IAAIN,MAAM,CAAC,WAAW,EAAE,8CAA8C,CACxE,CAAC,CACAM,SAAS,CACR,IAAIN,MAAM,CACR,WAAW,EACX,sEACF,CACF,CAAC,CACAO,MAAM;AACL;AACA,OAAOC,IAAI,EAAEC,KAAK,EAAEC,IAAI,EAAEC,QAAQ,EAAEC,OAAO,EAAEC,OAAO,KAAK;EACvDA,OAAO,CAACC,wBAAwB,CAC9BN,IAAI,EACJC,KAAK,EACLC,IAAI,EACJC,QAAQ,EACRC,OAAO,EACPC,OACF,CAAC;EACD,IAAI,MAAMX,SAAS,CAAC,CAAC,EAAE;IACrB;EAAA,CACD,MAAM;IACLa,OAAO,CAACC,QAAQ,GAAG,CAAC;EACtB;AACF;AACA;AACF,CAAC;;AAEHZ,OAAO,CAACa,KAAK,CAAC,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { frodo } from '@rockcarver/frodo-lib';
2
+ import { Option } from 'commander';
3
+ import { FrodoCommand } from '../FrodoCommand';
4
+ const {
5
+ getTokens
6
+ } = frodo.login;
7
+ const program = new FrodoCommand('frodo oauth client describe');
8
+ program.description('Describe OAuth2 application.').addOption(new Option('-i, --app-id <id>', 'OAuth2 application id/name.')).action(
9
+ // implement command logic inside action handler
10
+ async (host, realm, user, password, options, command) => {
11
+ command.handleDefaultArgsAndOpts(host, realm, user, password, options, command);
12
+ if (await getTokens()) {
13
+ // code goes here
14
+ } else {
15
+ process.exitCode = 1;
16
+ }
17
+ }
18
+ // end command logic inside action handler
19
+ );
20
+
21
+ program.parse();
22
+ //# sourceMappingURL=oauth-client-describe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-client-describe.js","names":["frodo","Option","FrodoCommand","getTokens","login","program","description","addOption","action","host","realm","user","password","options","command","handleDefaultArgsAndOpts","process","exitCode","parse"],"sources":["../../../src/cli/oauth/oauth-client-describe.ts"],"sourcesContent":["import { frodo } from '@rockcarver/frodo-lib';\nimport { Option } from 'commander';\n\nimport { FrodoCommand } from '../FrodoCommand';\n\nconst { getTokens } = frodo.login;\n\nconst program = new FrodoCommand('frodo oauth client describe');\n\nprogram\n .description('Describe OAuth2 application.')\n .addOption(new Option('-i, --app-id <id>', 'OAuth2 application id/name.'))\n .action(\n // implement command logic inside action handler\n async (host, realm, user, password, options, command) => {\n command.handleDefaultArgsAndOpts(\n host,\n realm,\n user,\n password,\n options,\n command\n );\n if (await getTokens()) {\n // code goes here\n } else {\n process.exitCode = 1;\n }\n }\n // end command logic inside action handler\n );\n\nprogram.parse();\n"],"mappings":"AAAA,SAASA,KAAK,QAAQ,uBAAuB;AAC7C,SAASC,MAAM,QAAQ,WAAW;AAElC,SAASC,YAAY,QAAQ,iBAAiB;AAE9C,MAAM;EAAEC;AAAU,CAAC,GAAGH,KAAK,CAACI,KAAK;AAEjC,MAAMC,OAAO,GAAG,IAAIH,YAAY,CAAC,6BAA6B,CAAC;AAE/DG,OAAO,CACJC,WAAW,CAAC,8BAA8B,CAAC,CAC3CC,SAAS,CAAC,IAAIN,MAAM,CAAC,mBAAmB,EAAE,6BAA6B,CAAC,CAAC,CACzEO,MAAM;AACL;AACA,OAAOC,IAAI,EAAEC,KAAK,EAAEC,IAAI,EAAEC,QAAQ,EAAEC,OAAO,EAAEC,OAAO,KAAK;EACvDA,OAAO,CAACC,wBAAwB,CAC9BN,IAAI,EACJC,KAAK,EACLC,IAAI,EACJC,QAAQ,EACRC,OAAO,EACPC,OACF,CAAC;EACD,IAAI,MAAMX,SAAS,CAAC,CAAC,EAAE;IACrB;EAAA,CACD,MAAM;IACLa,OAAO,CAACC,QAAQ,GAAG,CAAC;EACtB;AACF;AACA;AACF,CAAC;;AAEHZ,OAAO,CAACa,KAAK,CAAC,CAAC"}