@salesforce/b2c-tooling-sdk 0.2.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (578) hide show
  1. package/README.md +180 -13
  2. package/data/scaffolds/cartridge/files/.project.ejs +17 -0
  3. package/data/scaffolds/cartridge/files/cartridge/cartridge.properties.ejs +4 -0
  4. package/data/scaffolds/cartridge/files/cartridge/controllers/Example.js.ejs +19 -0
  5. package/data/scaffolds/cartridge/files/cartridge/models/example.js.ejs +14 -0
  6. package/data/scaffolds/cartridge/files/cartridge/scripts/helpers/exampleHelpers.js.ejs +18 -0
  7. package/data/scaffolds/cartridge/files/cartridge/static/default/css/example.css +6 -0
  8. package/data/scaffolds/cartridge/files/cartridge/templates/default/example/show.isml.ejs +11 -0
  9. package/data/scaffolds/cartridge/scaffold.json +88 -0
  10. package/data/scaffolds/controller/files/controller.js.ejs +134 -0
  11. package/data/scaffolds/controller/files/template.isml.ejs +22 -0
  12. package/data/scaffolds/controller/scaffold.json +64 -0
  13. package/data/scaffolds/custom-api/files/api.json.ejs +11 -0
  14. package/data/scaffolds/custom-api/files/schema.yaml.ejs +188 -0
  15. package/data/scaffolds/custom-api/files/script.js.ejs +95 -0
  16. package/data/scaffolds/custom-api/scaffold.json +65 -0
  17. package/data/scaffolds/hook/files/hook.js.ejs +99 -0
  18. package/data/scaffolds/hook/files/hooks-entry.json.ejs +6 -0
  19. package/data/scaffolds/hook/scaffold.json +60 -0
  20. package/data/scaffolds/job-step/files/step-chunk.js.ejs +136 -0
  21. package/data/scaffolds/job-step/files/step-task.js.ejs +47 -0
  22. package/data/scaffolds/job-step/files/steptypes-entry.json.ejs +41 -0
  23. package/data/scaffolds/job-step/scaffold.json +64 -0
  24. package/data/scaffolds/page-designer-component/files/component.isml.ejs +23 -0
  25. package/data/scaffolds/page-designer-component/files/component.js.ejs +35 -0
  26. package/data/scaffolds/page-designer-component/files/component.json.ejs +50 -0
  27. package/data/scaffolds/page-designer-component/scaffold.json +66 -0
  28. package/data/scaffolds/service/files/service-http.js.ejs +245 -0
  29. package/data/scaffolds/service/files/service-sftp.js.ejs +371 -0
  30. package/data/scaffolds/service/files/service-soap.js.ejs +230 -0
  31. package/data/scaffolds/service/scaffold.json +83 -0
  32. package/data/script-api/dw.extensions.payments.SalesforcePaymentsMgr.md +48 -0
  33. package/data/script-api/dw.system.Request.md +5 -0
  34. package/data/script-api/dw.web.Cookie.md +108 -31
  35. package/data/script-api/index.json +2 -2
  36. package/data/script-api/index.md +1 -1
  37. package/dist/cjs/auth/api-key.d.ts +2 -2
  38. package/dist/cjs/auth/api-key.js +1 -0
  39. package/dist/cjs/auth/api-key.js.map +1 -1
  40. package/dist/cjs/auth/basic.d.ts +2 -2
  41. package/dist/cjs/auth/basic.js +2 -0
  42. package/dist/cjs/auth/basic.js.map +1 -1
  43. package/dist/cjs/auth/index.d.ts +1 -1
  44. package/dist/cjs/auth/index.js.map +1 -1
  45. package/dist/cjs/auth/oauth-implicit.d.ts +3 -2
  46. package/dist/cjs/auth/oauth-implicit.js +9 -3
  47. package/dist/cjs/auth/oauth-implicit.js.map +1 -1
  48. package/dist/cjs/auth/oauth.d.ts +3 -2
  49. package/dist/cjs/auth/oauth.js +10 -3
  50. package/dist/cjs/auth/oauth.js.map +1 -1
  51. package/dist/cjs/auth/types.d.ts +15 -1
  52. package/dist/cjs/auth/types.js +5 -0
  53. package/dist/cjs/auth/types.js.map +1 -1
  54. package/dist/cjs/cli/am-command.d.ts +74 -0
  55. package/dist/cjs/cli/am-command.js +189 -0
  56. package/dist/cjs/cli/am-command.js.map +1 -0
  57. package/dist/cjs/cli/base-command.d.ts +61 -0
  58. package/dist/cjs/cli/base-command.js +171 -4
  59. package/dist/cjs/cli/base-command.js.map +1 -1
  60. package/dist/cjs/cli/config.d.ts +80 -0
  61. package/dist/cjs/cli/config.js +122 -2
  62. package/dist/cjs/cli/config.js.map +1 -1
  63. package/dist/cjs/cli/index.d.ts +3 -2
  64. package/dist/cjs/cli/index.js +4 -1
  65. package/dist/cjs/cli/index.js.map +1 -1
  66. package/dist/cjs/cli/instance-command.d.ts +5 -0
  67. package/dist/cjs/cli/instance-command.js +24 -23
  68. package/dist/cjs/cli/instance-command.js.map +1 -1
  69. package/dist/cjs/cli/mrt-command.d.ts +0 -6
  70. package/dist/cjs/cli/mrt-command.js +5 -29
  71. package/dist/cjs/cli/mrt-command.js.map +1 -1
  72. package/dist/cjs/cli/oauth-command.d.ts +25 -6
  73. package/dist/cjs/cli/oauth-command.js +65 -42
  74. package/dist/cjs/cli/oauth-command.js.map +1 -1
  75. package/dist/cjs/cli/ods-command.d.ts +23 -1
  76. package/dist/cjs/cli/ods-command.js +61 -4
  77. package/dist/cjs/cli/ods-command.js.map +1 -1
  78. package/dist/cjs/cli/webdav-command.d.ts +5 -0
  79. package/dist/cjs/clients/am-api.d.ts +491 -0
  80. package/dist/cjs/clients/am-api.js +944 -0
  81. package/dist/cjs/clients/am-api.js.map +1 -0
  82. package/dist/cjs/clients/am-apiclients-api.generated.d.ts +803 -0
  83. package/dist/cjs/clients/am-apiclients-api.generated.js +6 -0
  84. package/dist/cjs/clients/am-apiclients-api.generated.js.map +1 -0
  85. package/dist/cjs/clients/am-roles-api.generated.d.ts +298 -0
  86. package/dist/cjs/clients/am-roles-api.generated.js +6 -0
  87. package/dist/cjs/clients/am-roles-api.generated.js.map +1 -0
  88. package/dist/cjs/clients/am-users-api.generated.d.ts +891 -0
  89. package/dist/cjs/clients/am-users-api.generated.js +6 -0
  90. package/dist/cjs/clients/am-users-api.generated.js.map +1 -0
  91. package/dist/cjs/clients/cdn-zones.d.ts +33 -1
  92. package/dist/cjs/clients/cdn-zones.js.map +1 -1
  93. package/dist/cjs/clients/custom-apis.d.ts +30 -1
  94. package/dist/cjs/clients/custom-apis.js.map +1 -1
  95. package/dist/cjs/clients/index.d.ts +6 -2
  96. package/dist/cjs/clients/index.js +3 -1
  97. package/dist/cjs/clients/index.js.map +1 -1
  98. package/dist/cjs/clients/middleware-registry.d.ts +1 -1
  99. package/dist/cjs/clients/middleware-registry.js.map +1 -1
  100. package/dist/cjs/clients/middleware.d.ts +49 -2
  101. package/dist/cjs/clients/middleware.js +214 -2
  102. package/dist/cjs/clients/middleware.js.map +1 -1
  103. package/dist/cjs/clients/mrt-b2c.d.ts +25 -1
  104. package/dist/cjs/clients/mrt-b2c.js.map +1 -1
  105. package/dist/cjs/clients/mrt.d.ts +24 -1
  106. package/dist/cjs/clients/mrt.js +5 -1
  107. package/dist/cjs/clients/mrt.js.map +1 -1
  108. package/dist/cjs/clients/ocapi.d.ts +22 -2
  109. package/dist/cjs/clients/ocapi.js +0 -2
  110. package/dist/cjs/clients/ocapi.js.map +1 -1
  111. package/dist/cjs/clients/ods.d.ts +28 -1
  112. package/dist/cjs/clients/ods.js.map +1 -1
  113. package/dist/cjs/clients/scapi-schemas.d.ts +30 -1
  114. package/dist/cjs/clients/scapi-schemas.js.map +1 -1
  115. package/dist/cjs/clients/slas-admin.d.ts +28 -0
  116. package/dist/cjs/clients/slas-admin.js.map +1 -1
  117. package/dist/cjs/clients/tls-dispatcher.d.ts +42 -0
  118. package/dist/cjs/clients/tls-dispatcher.js +107 -0
  119. package/dist/cjs/clients/tls-dispatcher.js.map +1 -0
  120. package/dist/cjs/clients/webdav.d.ts +8 -1
  121. package/dist/cjs/clients/webdav.js +5 -1
  122. package/dist/cjs/clients/webdav.js.map +1 -1
  123. package/dist/cjs/config/dw-json.d.ts +106 -21
  124. package/dist/cjs/config/dw-json.js +170 -4
  125. package/dist/cjs/config/dw-json.js.map +1 -1
  126. package/dist/cjs/config/index.d.ts +7 -5
  127. package/dist/cjs/config/index.js +7 -3
  128. package/dist/cjs/config/index.js.map +1 -1
  129. package/dist/cjs/config/instance-manager.d.ts +97 -0
  130. package/dist/cjs/config/instance-manager.js +166 -0
  131. package/dist/cjs/config/instance-manager.js.map +1 -0
  132. package/dist/cjs/config/mapping.d.ts +63 -5
  133. package/dist/cjs/config/mapping.js +179 -18
  134. package/dist/cjs/config/mapping.js.map +1 -1
  135. package/dist/cjs/config/resolved-config.d.ts +1 -3
  136. package/dist/cjs/config/resolved-config.js +0 -8
  137. package/dist/cjs/config/resolved-config.js.map +1 -1
  138. package/dist/cjs/config/resolver.d.ts +1 -1
  139. package/dist/cjs/config/resolver.js +19 -3
  140. package/dist/cjs/config/resolver.js.map +1 -1
  141. package/dist/cjs/config/sources/dw-json-source.d.ts +17 -1
  142. package/dist/cjs/config/sources/dw-json-source.js +70 -3
  143. package/dist/cjs/config/sources/dw-json-source.js.map +1 -1
  144. package/dist/cjs/config/sources/mobify-source.js +3 -2
  145. package/dist/cjs/config/sources/mobify-source.js.map +1 -1
  146. package/dist/cjs/config/sources/package-json-source.js +9 -4
  147. package/dist/cjs/config/sources/package-json-source.js.map +1 -1
  148. package/dist/cjs/config/types.d.ts +78 -18
  149. package/dist/cjs/defaults.d.ts +6 -0
  150. package/dist/cjs/defaults.js +6 -0
  151. package/dist/cjs/defaults.js.map +1 -1
  152. package/dist/{esm/operations → cjs}/docs/download.d.ts +1 -1
  153. package/dist/cjs/{operations/docs → docs}/download.js +2 -2
  154. package/dist/cjs/docs/download.js.map +1 -0
  155. package/dist/{esm/operations → cjs}/docs/index.d.ts +4 -4
  156. package/dist/cjs/docs/index.js.map +1 -0
  157. package/dist/cjs/docs/schema.js.map +1 -0
  158. package/dist/cjs/docs/search.js.map +1 -0
  159. package/dist/cjs/docs/types.js.map +1 -0
  160. package/dist/cjs/i18n/index.js +3 -0
  161. package/dist/cjs/i18n/index.js.map +1 -1
  162. package/dist/cjs/index.d.ts +11 -12
  163. package/dist/cjs/index.js +12 -10
  164. package/dist/cjs/index.js.map +1 -1
  165. package/dist/cjs/instance/index.d.ts +4 -0
  166. package/dist/cjs/instance/index.js +6 -1
  167. package/dist/cjs/instance/index.js.map +1 -1
  168. package/dist/cjs/logging/index.d.ts +1 -1
  169. package/dist/cjs/logging/logger.js +27 -0
  170. package/dist/cjs/logging/logger.js.map +1 -1
  171. package/dist/cjs/logging/types.d.ts +9 -0
  172. package/dist/cjs/operations/content/asset-query.d.ts +22 -0
  173. package/dist/cjs/operations/content/asset-query.js +77 -0
  174. package/dist/cjs/operations/content/asset-query.js.map +1 -0
  175. package/dist/cjs/operations/content/export.d.ts +57 -0
  176. package/dist/cjs/operations/content/export.js +224 -0
  177. package/dist/cjs/operations/content/export.js.map +1 -0
  178. package/dist/cjs/operations/content/index.d.ts +43 -0
  179. package/dist/cjs/operations/content/index.js +48 -0
  180. package/dist/cjs/operations/content/index.js.map +1 -0
  181. package/dist/cjs/operations/content/library.d.ts +137 -0
  182. package/dist/cjs/operations/content/library.js +392 -0
  183. package/dist/cjs/operations/content/library.js.map +1 -0
  184. package/dist/cjs/operations/content/types.d.ts +144 -0
  185. package/dist/cjs/operations/content/types.js +7 -0
  186. package/dist/cjs/operations/content/types.js.map +1 -0
  187. package/dist/cjs/operations/logs/index.d.ts +65 -0
  188. package/dist/cjs/operations/logs/index.js +73 -0
  189. package/dist/cjs/operations/logs/index.js.map +1 -0
  190. package/dist/cjs/operations/logs/list.d.ts +35 -0
  191. package/dist/cjs/operations/logs/list.js +144 -0
  192. package/dist/cjs/operations/logs/list.js.map +1 -0
  193. package/dist/cjs/operations/logs/path-normalizer.d.ts +82 -0
  194. package/dist/cjs/operations/logs/path-normalizer.js +190 -0
  195. package/dist/cjs/operations/logs/path-normalizer.js.map +1 -0
  196. package/dist/cjs/operations/logs/tail.d.ts +92 -0
  197. package/dist/cjs/operations/logs/tail.js +525 -0
  198. package/dist/cjs/operations/logs/tail.js.map +1 -0
  199. package/dist/cjs/operations/logs/types.d.ts +132 -0
  200. package/dist/cjs/operations/logs/types.js +7 -0
  201. package/dist/cjs/operations/logs/types.js.map +1 -0
  202. package/dist/cjs/operations/mrt/b2c-config.js +19 -4
  203. package/dist/cjs/operations/mrt/b2c-config.js.map +1 -1
  204. package/dist/cjs/operations/mrt/index.d.ts +2 -0
  205. package/dist/cjs/operations/mrt/index.js +2 -0
  206. package/dist/cjs/operations/mrt/index.js.map +1 -1
  207. package/dist/cjs/operations/mrt/push.js +3 -0
  208. package/dist/cjs/operations/mrt/push.js.map +1 -1
  209. package/dist/cjs/operations/mrt/tail-logs.d.ts +130 -0
  210. package/dist/cjs/operations/mrt/tail-logs.js +223 -0
  211. package/dist/cjs/operations/mrt/tail-logs.js.map +1 -0
  212. package/dist/cjs/operations/ods/index.d.ts +8 -0
  213. package/dist/cjs/operations/ods/index.js +13 -0
  214. package/dist/cjs/operations/ods/index.js.map +1 -0
  215. package/dist/cjs/operations/ods/sandbox-lookup.d.ts +63 -0
  216. package/dist/cjs/operations/ods/sandbox-lookup.js +130 -0
  217. package/dist/cjs/operations/ods/sandbox-lookup.js.map +1 -0
  218. package/dist/cjs/operations/ods/wait-for-sandbox.d.ts +64 -0
  219. package/dist/cjs/operations/ods/wait-for-sandbox.js +114 -0
  220. package/dist/cjs/operations/ods/wait-for-sandbox.js.map +1 -0
  221. package/dist/cjs/operations/orgs/index.d.ts +74 -0
  222. package/dist/cjs/operations/orgs/index.js +33 -0
  223. package/dist/cjs/operations/orgs/index.js.map +1 -0
  224. package/dist/cjs/operations/roles/index.d.ts +43 -0
  225. package/dist/cjs/operations/roles/index.js +48 -0
  226. package/dist/cjs/operations/roles/index.js.map +1 -0
  227. package/dist/cjs/operations/users/index.d.ts +143 -0
  228. package/dist/cjs/operations/users/index.js +141 -0
  229. package/dist/cjs/operations/users/index.js.map +1 -0
  230. package/dist/cjs/scaffold/engine.d.ts +68 -0
  231. package/dist/cjs/scaffold/engine.js +149 -0
  232. package/dist/cjs/scaffold/engine.js.map +1 -0
  233. package/dist/cjs/scaffold/executor.d.ts +36 -0
  234. package/dist/cjs/scaffold/executor.js +285 -0
  235. package/dist/cjs/scaffold/executor.js.map +1 -0
  236. package/dist/cjs/scaffold/index.d.ts +74 -0
  237. package/dist/cjs/scaffold/index.js +23 -0
  238. package/dist/cjs/scaffold/index.js.map +1 -0
  239. package/dist/cjs/scaffold/merge.d.ts +56 -0
  240. package/dist/cjs/scaffold/merge.js +183 -0
  241. package/dist/cjs/scaffold/merge.js.map +1 -0
  242. package/dist/cjs/scaffold/parameter-resolver.d.ts +86 -0
  243. package/dist/cjs/scaffold/parameter-resolver.js +179 -0
  244. package/dist/cjs/scaffold/parameter-resolver.js.map +1 -0
  245. package/dist/cjs/scaffold/registry.d.ts +45 -0
  246. package/dist/cjs/scaffold/registry.js +219 -0
  247. package/dist/cjs/scaffold/registry.js.map +1 -0
  248. package/dist/cjs/scaffold/sources.d.ts +45 -0
  249. package/dist/cjs/scaffold/sources.js +113 -0
  250. package/dist/cjs/scaffold/sources.js.map +1 -0
  251. package/dist/cjs/scaffold/types.d.ts +280 -0
  252. package/dist/cjs/scaffold/types.js +14 -0
  253. package/dist/cjs/scaffold/types.js.map +1 -0
  254. package/dist/cjs/scaffold/validation.d.ts +81 -0
  255. package/dist/cjs/scaffold/validation.js +250 -0
  256. package/dist/cjs/scaffold/validation.js.map +1 -0
  257. package/dist/cjs/scaffold/validators.d.ts +33 -0
  258. package/dist/cjs/scaffold/validators.js +334 -0
  259. package/dist/cjs/scaffold/validators.js.map +1 -0
  260. package/dist/{esm/operations/scapi-schemas → cjs/schemas}/collapse.d.ts +1 -1
  261. package/dist/cjs/schemas/collapse.js.map +1 -0
  262. package/dist/cjs/{operations/scapi-schemas → schemas}/index.d.ts +5 -5
  263. package/dist/cjs/{operations/scapi-schemas → schemas}/index.js +5 -5
  264. package/dist/cjs/schemas/index.js.map +1 -0
  265. package/dist/cjs/telemetry/index.d.ts +26 -0
  266. package/dist/cjs/telemetry/index.js +32 -0
  267. package/dist/cjs/telemetry/index.js.map +1 -0
  268. package/dist/cjs/telemetry/telemetry.d.ts +90 -0
  269. package/dist/cjs/telemetry/telemetry.js +283 -0
  270. package/dist/cjs/telemetry/telemetry.js.map +1 -0
  271. package/dist/cjs/telemetry/types.d.ts +62 -0
  272. package/dist/cjs/telemetry/types.js +7 -0
  273. package/dist/cjs/telemetry/types.js.map +1 -0
  274. package/dist/cjs/test-utils/config-isolation.js +7 -0
  275. package/dist/cjs/test-utils/config-isolation.js.map +1 -1
  276. package/dist/esm/auth/api-key.d.ts +2 -2
  277. package/dist/esm/auth/api-key.js +1 -0
  278. package/dist/esm/auth/api-key.js.map +1 -1
  279. package/dist/esm/auth/basic.d.ts +2 -2
  280. package/dist/esm/auth/basic.js +2 -0
  281. package/dist/esm/auth/basic.js.map +1 -1
  282. package/dist/esm/auth/index.d.ts +1 -1
  283. package/dist/esm/auth/index.js.map +1 -1
  284. package/dist/esm/auth/oauth-implicit.d.ts +3 -2
  285. package/dist/esm/auth/oauth-implicit.js +9 -3
  286. package/dist/esm/auth/oauth-implicit.js.map +1 -1
  287. package/dist/esm/auth/oauth.d.ts +3 -2
  288. package/dist/esm/auth/oauth.js +10 -3
  289. package/dist/esm/auth/oauth.js.map +1 -1
  290. package/dist/esm/auth/types.d.ts +15 -1
  291. package/dist/esm/auth/types.js +5 -0
  292. package/dist/esm/auth/types.js.map +1 -1
  293. package/dist/esm/cli/am-command.d.ts +74 -0
  294. package/dist/esm/cli/am-command.js +196 -0
  295. package/dist/esm/cli/am-command.js.map +1 -0
  296. package/dist/esm/cli/base-command.d.ts +61 -0
  297. package/dist/esm/cli/base-command.js +171 -4
  298. package/dist/esm/cli/base-command.js.map +1 -1
  299. package/dist/esm/cli/config.d.ts +80 -0
  300. package/dist/esm/cli/config.js +122 -2
  301. package/dist/esm/cli/config.js.map +1 -1
  302. package/dist/esm/cli/index.d.ts +3 -2
  303. package/dist/esm/cli/index.js +4 -1
  304. package/dist/esm/cli/index.js.map +1 -1
  305. package/dist/esm/cli/instance-command.d.ts +5 -0
  306. package/dist/esm/cli/instance-command.js +24 -23
  307. package/dist/esm/cli/instance-command.js.map +1 -1
  308. package/dist/esm/cli/mrt-command.d.ts +0 -6
  309. package/dist/esm/cli/mrt-command.js +5 -29
  310. package/dist/esm/cli/mrt-command.js.map +1 -1
  311. package/dist/esm/cli/oauth-command.d.ts +25 -6
  312. package/dist/esm/cli/oauth-command.js +65 -42
  313. package/dist/esm/cli/oauth-command.js.map +1 -1
  314. package/dist/esm/cli/ods-command.d.ts +23 -1
  315. package/dist/esm/cli/ods-command.js +61 -4
  316. package/dist/esm/cli/ods-command.js.map +1 -1
  317. package/dist/esm/cli/webdav-command.d.ts +5 -0
  318. package/dist/esm/clients/am-api.d.ts +491 -0
  319. package/dist/esm/clients/am-api.js +944 -0
  320. package/dist/esm/clients/am-api.js.map +1 -0
  321. package/dist/esm/clients/am-apiclients-api.generated.d.ts +803 -0
  322. package/dist/esm/clients/am-apiclients-api.generated.js +6 -0
  323. package/dist/esm/clients/am-apiclients-api.generated.js.map +1 -0
  324. package/dist/esm/clients/am-roles-api.generated.d.ts +298 -0
  325. package/dist/esm/clients/am-roles-api.generated.js +6 -0
  326. package/dist/esm/clients/am-roles-api.generated.js.map +1 -0
  327. package/dist/esm/clients/am-users-api.generated.d.ts +891 -0
  328. package/dist/esm/clients/am-users-api.generated.js +6 -0
  329. package/dist/esm/clients/am-users-api.generated.js.map +1 -0
  330. package/dist/esm/clients/cdn-zones.d.ts +33 -1
  331. package/dist/esm/clients/cdn-zones.js.map +1 -1
  332. package/dist/esm/clients/custom-apis.d.ts +30 -1
  333. package/dist/esm/clients/custom-apis.js.map +1 -1
  334. package/dist/esm/clients/index.d.ts +6 -2
  335. package/dist/esm/clients/index.js +3 -1
  336. package/dist/esm/clients/index.js.map +1 -1
  337. package/dist/esm/clients/middleware-registry.d.ts +1 -1
  338. package/dist/esm/clients/middleware-registry.js.map +1 -1
  339. package/dist/esm/clients/middleware.d.ts +49 -2
  340. package/dist/esm/clients/middleware.js +214 -2
  341. package/dist/esm/clients/middleware.js.map +1 -1
  342. package/dist/esm/clients/mrt-b2c.d.ts +25 -1
  343. package/dist/esm/clients/mrt-b2c.js.map +1 -1
  344. package/dist/esm/clients/mrt.d.ts +24 -1
  345. package/dist/esm/clients/mrt.js +5 -1
  346. package/dist/esm/clients/mrt.js.map +1 -1
  347. package/dist/esm/clients/ocapi.d.ts +22 -2
  348. package/dist/esm/clients/ocapi.js +0 -2
  349. package/dist/esm/clients/ocapi.js.map +1 -1
  350. package/dist/esm/clients/ods.d.ts +28 -1
  351. package/dist/esm/clients/ods.js.map +1 -1
  352. package/dist/esm/clients/scapi-schemas.d.ts +30 -1
  353. package/dist/esm/clients/scapi-schemas.js.map +1 -1
  354. package/dist/esm/clients/slas-admin.d.ts +28 -0
  355. package/dist/esm/clients/slas-admin.js.map +1 -1
  356. package/dist/esm/clients/tls-dispatcher.d.ts +42 -0
  357. package/dist/esm/clients/tls-dispatcher.js +107 -0
  358. package/dist/esm/clients/tls-dispatcher.js.map +1 -0
  359. package/dist/esm/clients/webdav.d.ts +8 -1
  360. package/dist/esm/clients/webdav.js +5 -1
  361. package/dist/esm/clients/webdav.js.map +1 -1
  362. package/dist/esm/config/dw-json.d.ts +106 -21
  363. package/dist/esm/config/dw-json.js +170 -4
  364. package/dist/esm/config/dw-json.js.map +1 -1
  365. package/dist/esm/config/index.d.ts +7 -5
  366. package/dist/esm/config/index.js +7 -3
  367. package/dist/esm/config/index.js.map +1 -1
  368. package/dist/esm/config/instance-manager.d.ts +97 -0
  369. package/dist/esm/config/instance-manager.js +166 -0
  370. package/dist/esm/config/instance-manager.js.map +1 -0
  371. package/dist/esm/config/mapping.d.ts +63 -5
  372. package/dist/esm/config/mapping.js +179 -18
  373. package/dist/esm/config/mapping.js.map +1 -1
  374. package/dist/esm/config/resolved-config.d.ts +1 -3
  375. package/dist/esm/config/resolved-config.js +0 -8
  376. package/dist/esm/config/resolved-config.js.map +1 -1
  377. package/dist/esm/config/resolver.d.ts +1 -1
  378. package/dist/esm/config/resolver.js +19 -3
  379. package/dist/esm/config/resolver.js.map +1 -1
  380. package/dist/esm/config/sources/dw-json-source.d.ts +17 -1
  381. package/dist/esm/config/sources/dw-json-source.js +70 -3
  382. package/dist/esm/config/sources/dw-json-source.js.map +1 -1
  383. package/dist/esm/config/sources/mobify-source.js +3 -2
  384. package/dist/esm/config/sources/mobify-source.js.map +1 -1
  385. package/dist/esm/config/sources/package-json-source.js +9 -4
  386. package/dist/esm/config/sources/package-json-source.js.map +1 -1
  387. package/dist/esm/config/types.d.ts +78 -18
  388. package/dist/esm/defaults.d.ts +6 -0
  389. package/dist/esm/defaults.js +6 -0
  390. package/dist/esm/defaults.js.map +1 -1
  391. package/dist/{cjs/operations → esm}/docs/download.d.ts +1 -1
  392. package/dist/esm/{operations/docs → docs}/download.js +2 -2
  393. package/dist/esm/docs/download.js.map +1 -0
  394. package/dist/{cjs/operations → esm}/docs/index.d.ts +4 -4
  395. package/dist/esm/docs/index.js.map +1 -0
  396. package/dist/esm/docs/schema.js.map +1 -0
  397. package/dist/esm/docs/search.js.map +1 -0
  398. package/dist/esm/docs/types.js.map +1 -0
  399. package/dist/esm/i18n/index.js +3 -0
  400. package/dist/esm/i18n/index.js.map +1 -1
  401. package/dist/esm/index.d.ts +11 -12
  402. package/dist/esm/index.js +12 -10
  403. package/dist/esm/index.js.map +1 -1
  404. package/dist/esm/instance/index.d.ts +4 -0
  405. package/dist/esm/instance/index.js +6 -1
  406. package/dist/esm/instance/index.js.map +1 -1
  407. package/dist/esm/logging/index.d.ts +1 -1
  408. package/dist/esm/logging/logger.js +27 -0
  409. package/dist/esm/logging/logger.js.map +1 -1
  410. package/dist/esm/logging/types.d.ts +9 -0
  411. package/dist/esm/operations/content/asset-query.d.ts +22 -0
  412. package/dist/esm/operations/content/asset-query.js +77 -0
  413. package/dist/esm/operations/content/asset-query.js.map +1 -0
  414. package/dist/esm/operations/content/export.d.ts +57 -0
  415. package/dist/esm/operations/content/export.js +224 -0
  416. package/dist/esm/operations/content/export.js.map +1 -0
  417. package/dist/esm/operations/content/index.d.ts +43 -0
  418. package/dist/esm/operations/content/index.js +48 -0
  419. package/dist/esm/operations/content/index.js.map +1 -0
  420. package/dist/esm/operations/content/library.d.ts +137 -0
  421. package/dist/esm/operations/content/library.js +392 -0
  422. package/dist/esm/operations/content/library.js.map +1 -0
  423. package/dist/esm/operations/content/types.d.ts +144 -0
  424. package/dist/esm/operations/content/types.js +7 -0
  425. package/dist/esm/operations/content/types.js.map +1 -0
  426. package/dist/esm/operations/logs/index.d.ts +65 -0
  427. package/dist/esm/operations/logs/index.js +73 -0
  428. package/dist/esm/operations/logs/index.js.map +1 -0
  429. package/dist/esm/operations/logs/list.d.ts +35 -0
  430. package/dist/esm/operations/logs/list.js +144 -0
  431. package/dist/esm/operations/logs/list.js.map +1 -0
  432. package/dist/esm/operations/logs/path-normalizer.d.ts +82 -0
  433. package/dist/esm/operations/logs/path-normalizer.js +190 -0
  434. package/dist/esm/operations/logs/path-normalizer.js.map +1 -0
  435. package/dist/esm/operations/logs/tail.d.ts +92 -0
  436. package/dist/esm/operations/logs/tail.js +525 -0
  437. package/dist/esm/operations/logs/tail.js.map +1 -0
  438. package/dist/esm/operations/logs/types.d.ts +132 -0
  439. package/dist/esm/operations/logs/types.js +7 -0
  440. package/dist/esm/operations/logs/types.js.map +1 -0
  441. package/dist/esm/operations/mrt/b2c-config.js +19 -4
  442. package/dist/esm/operations/mrt/b2c-config.js.map +1 -1
  443. package/dist/esm/operations/mrt/index.d.ts +2 -0
  444. package/dist/esm/operations/mrt/index.js +2 -0
  445. package/dist/esm/operations/mrt/index.js.map +1 -1
  446. package/dist/esm/operations/mrt/push.js +3 -0
  447. package/dist/esm/operations/mrt/push.js.map +1 -1
  448. package/dist/esm/operations/mrt/tail-logs.d.ts +130 -0
  449. package/dist/esm/operations/mrt/tail-logs.js +223 -0
  450. package/dist/esm/operations/mrt/tail-logs.js.map +1 -0
  451. package/dist/esm/operations/ods/index.d.ts +8 -0
  452. package/dist/esm/operations/ods/index.js +13 -0
  453. package/dist/esm/operations/ods/index.js.map +1 -0
  454. package/dist/esm/operations/ods/sandbox-lookup.d.ts +63 -0
  455. package/dist/esm/operations/ods/sandbox-lookup.js +130 -0
  456. package/dist/esm/operations/ods/sandbox-lookup.js.map +1 -0
  457. package/dist/esm/operations/ods/wait-for-sandbox.d.ts +64 -0
  458. package/dist/esm/operations/ods/wait-for-sandbox.js +114 -0
  459. package/dist/esm/operations/ods/wait-for-sandbox.js.map +1 -0
  460. package/dist/esm/operations/orgs/index.d.ts +74 -0
  461. package/dist/esm/operations/orgs/index.js +33 -0
  462. package/dist/esm/operations/orgs/index.js.map +1 -0
  463. package/dist/esm/operations/roles/index.d.ts +43 -0
  464. package/dist/esm/operations/roles/index.js +48 -0
  465. package/dist/esm/operations/roles/index.js.map +1 -0
  466. package/dist/esm/operations/users/index.d.ts +143 -0
  467. package/dist/esm/operations/users/index.js +141 -0
  468. package/dist/esm/operations/users/index.js.map +1 -0
  469. package/dist/esm/scaffold/engine.d.ts +68 -0
  470. package/dist/esm/scaffold/engine.js +149 -0
  471. package/dist/esm/scaffold/engine.js.map +1 -0
  472. package/dist/esm/scaffold/executor.d.ts +36 -0
  473. package/dist/esm/scaffold/executor.js +285 -0
  474. package/dist/esm/scaffold/executor.js.map +1 -0
  475. package/dist/esm/scaffold/index.d.ts +74 -0
  476. package/dist/esm/scaffold/index.js +23 -0
  477. package/dist/esm/scaffold/index.js.map +1 -0
  478. package/dist/esm/scaffold/merge.d.ts +56 -0
  479. package/dist/esm/scaffold/merge.js +183 -0
  480. package/dist/esm/scaffold/merge.js.map +1 -0
  481. package/dist/esm/scaffold/parameter-resolver.d.ts +86 -0
  482. package/dist/esm/scaffold/parameter-resolver.js +179 -0
  483. package/dist/esm/scaffold/parameter-resolver.js.map +1 -0
  484. package/dist/esm/scaffold/registry.d.ts +45 -0
  485. package/dist/esm/scaffold/registry.js +219 -0
  486. package/dist/esm/scaffold/registry.js.map +1 -0
  487. package/dist/esm/scaffold/sources.d.ts +45 -0
  488. package/dist/esm/scaffold/sources.js +113 -0
  489. package/dist/esm/scaffold/sources.js.map +1 -0
  490. package/dist/esm/scaffold/types.d.ts +280 -0
  491. package/dist/esm/scaffold/types.js +14 -0
  492. package/dist/esm/scaffold/types.js.map +1 -0
  493. package/dist/esm/scaffold/validation.d.ts +81 -0
  494. package/dist/esm/scaffold/validation.js +250 -0
  495. package/dist/esm/scaffold/validation.js.map +1 -0
  496. package/dist/esm/scaffold/validators.d.ts +33 -0
  497. package/dist/esm/scaffold/validators.js +334 -0
  498. package/dist/esm/scaffold/validators.js.map +1 -0
  499. package/dist/{cjs/operations/scapi-schemas → esm/schemas}/collapse.d.ts +1 -1
  500. package/dist/esm/schemas/collapse.js.map +1 -0
  501. package/dist/esm/{operations/scapi-schemas → schemas}/index.d.ts +5 -5
  502. package/dist/esm/{operations/scapi-schemas → schemas}/index.js +5 -5
  503. package/dist/esm/schemas/index.js.map +1 -0
  504. package/dist/esm/telemetry/index.d.ts +26 -0
  505. package/dist/esm/telemetry/index.js +32 -0
  506. package/dist/esm/telemetry/index.js.map +1 -0
  507. package/dist/esm/telemetry/telemetry.d.ts +90 -0
  508. package/dist/esm/telemetry/telemetry.js +283 -0
  509. package/dist/esm/telemetry/telemetry.js.map +1 -0
  510. package/dist/esm/telemetry/types.d.ts +62 -0
  511. package/dist/esm/telemetry/types.js +7 -0
  512. package/dist/esm/telemetry/types.js.map +1 -0
  513. package/dist/esm/test-utils/config-isolation.js +7 -0
  514. package/dist/esm/test-utils/config-isolation.js.map +1 -1
  515. package/package.json +112 -50
  516. package/specs/am-apiclients-api-v1.yaml +965 -0
  517. package/specs/am-roles-api-v1.yaml +316 -0
  518. package/specs/am-users-api-v1.yaml +1102 -0
  519. package/dist/cjs/logger.d.ts +0 -66
  520. package/dist/cjs/logger.js +0 -80
  521. package/dist/cjs/logger.js.map +0 -1
  522. package/dist/cjs/operations/docs/download.js.map +0 -1
  523. package/dist/cjs/operations/docs/index.js.map +0 -1
  524. package/dist/cjs/operations/docs/schema.js.map +0 -1
  525. package/dist/cjs/operations/docs/search.js.map +0 -1
  526. package/dist/cjs/operations/docs/types.js.map +0 -1
  527. package/dist/cjs/operations/scapi-schemas/collapse.js.map +0 -1
  528. package/dist/cjs/operations/scapi-schemas/index.js.map +0 -1
  529. package/dist/cjs/operations/sites/index.d.ts +0 -56
  530. package/dist/cjs/operations/sites/index.js +0 -19
  531. package/dist/cjs/operations/sites/index.js.map +0 -1
  532. package/dist/cjs/platform/index.d.ts +0 -38
  533. package/dist/cjs/platform/index.js +0 -42
  534. package/dist/cjs/platform/index.js.map +0 -1
  535. package/dist/cjs/platform/mrt.d.ts +0 -19
  536. package/dist/cjs/platform/mrt.js +0 -22
  537. package/dist/cjs/platform/mrt.js.map +0 -1
  538. package/dist/cjs/platform/ods.d.ts +0 -17
  539. package/dist/cjs/platform/ods.js +0 -22
  540. package/dist/cjs/platform/ods.js.map +0 -1
  541. package/dist/esm/logger.d.ts +0 -66
  542. package/dist/esm/logger.js +0 -80
  543. package/dist/esm/logger.js.map +0 -1
  544. package/dist/esm/operations/docs/download.js.map +0 -1
  545. package/dist/esm/operations/docs/index.js.map +0 -1
  546. package/dist/esm/operations/docs/schema.js.map +0 -1
  547. package/dist/esm/operations/docs/search.js.map +0 -1
  548. package/dist/esm/operations/docs/types.js.map +0 -1
  549. package/dist/esm/operations/scapi-schemas/collapse.js.map +0 -1
  550. package/dist/esm/operations/scapi-schemas/index.js.map +0 -1
  551. package/dist/esm/operations/sites/index.d.ts +0 -56
  552. package/dist/esm/operations/sites/index.js +0 -67
  553. package/dist/esm/operations/sites/index.js.map +0 -1
  554. package/dist/esm/platform/index.d.ts +0 -38
  555. package/dist/esm/platform/index.js +0 -42
  556. package/dist/esm/platform/index.js.map +0 -1
  557. package/dist/esm/platform/mrt.d.ts +0 -19
  558. package/dist/esm/platform/mrt.js +0 -22
  559. package/dist/esm/platform/mrt.js.map +0 -1
  560. package/dist/esm/platform/ods.d.ts +0 -17
  561. package/dist/esm/platform/ods.js +0 -22
  562. package/dist/esm/platform/ods.js.map +0 -1
  563. /package/dist/cjs/{operations/docs → docs}/index.js +0 -0
  564. /package/dist/cjs/{operations/docs → docs}/schema.d.ts +0 -0
  565. /package/dist/cjs/{operations/docs → docs}/schema.js +0 -0
  566. /package/dist/cjs/{operations/docs → docs}/search.d.ts +0 -0
  567. /package/dist/cjs/{operations/docs → docs}/search.js +0 -0
  568. /package/dist/cjs/{operations/docs → docs}/types.d.ts +0 -0
  569. /package/dist/cjs/{operations/docs → docs}/types.js +0 -0
  570. /package/dist/cjs/{operations/scapi-schemas → schemas}/collapse.js +0 -0
  571. /package/dist/esm/{operations/docs → docs}/index.js +0 -0
  572. /package/dist/esm/{operations/docs → docs}/schema.d.ts +0 -0
  573. /package/dist/esm/{operations/docs → docs}/schema.js +0 -0
  574. /package/dist/esm/{operations/docs → docs}/search.d.ts +0 -0
  575. /package/dist/esm/{operations/docs → docs}/search.js +0 -0
  576. /package/dist/esm/{operations/docs → docs}/types.d.ts +0 -0
  577. /package/dist/esm/{operations/docs → docs}/types.js +0 -0
  578. /package/dist/esm/{operations/scapi-schemas → schemas}/collapse.js +0 -0
@@ -1,13 +1,27 @@
1
+ /**
2
+ * Extended RequestInit that supports undici dispatcher for TLS/mTLS.
3
+ * Uses `unknown` for dispatcher to avoid type conflicts between undici package
4
+ * and @types/node/undici-types.
5
+ */
6
+ export type FetchInit = Omit<RequestInit, 'dispatcher'> & {
7
+ /** undici dispatcher for custom TLS options (mTLS, self-signed certs) */
8
+ dispatcher?: unknown;
9
+ };
1
10
  export interface AuthStrategy {
2
11
  /**
3
12
  * Performs a fetch request with authentication.
4
13
  * Implementations MUST handle header injection and 401 retries (token refresh) internally.
5
14
  */
6
- fetch(url: string, init?: RequestInit): Promise<Response>;
15
+ fetch(url: string, init?: FetchInit): Promise<Response>;
7
16
  /**
8
17
  * Optional: Helper for legacy clients (like a strict WebDAV lib) that need the raw header.
9
18
  */
10
19
  getAuthorizationHeader?(): Promise<string>;
20
+ /**
21
+ * Optional: Invalidates the cached token, forcing re-authentication on next request.
22
+ * Used by middleware to retry requests after receiving a 401 response.
23
+ */
24
+ invalidateToken?(): void;
11
25
  }
12
26
  /**
13
27
  * Configuration for Basic authentication (username/access-key).
@@ -1,3 +1,8 @@
1
+ /*
2
+ * Copyright (c) 2025, Salesforce, Inc.
3
+ * SPDX-License-Identifier: Apache-2
4
+ * For full license text, see the license.txt file in the repo root or http://www.apache.org/licenses/LICENSE-2.0
5
+ */
1
6
  /** All available auth methods in default priority order */
2
7
  export const ALL_AUTH_METHODS = ['client-credentials', 'implicit', 'basic', 'api-key'];
3
8
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/auth/types.ts"],"names":[],"mappings":"AA8FA,2DAA2D;AAC3D,MAAM,CAAC,MAAM,gBAAgB,GAAiB,CAAC,oBAAoB,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/auth/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA2GH,2DAA2D;AAC3D,MAAM,CAAC,MAAM,gBAAgB,GAAiB,CAAC,oBAAoB,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC"}
@@ -0,0 +1,74 @@
1
+ import { Command } from '@oclif/core';
2
+ import { OAuthCommand } from './oauth-command.js';
3
+ import type { AccountManagerClient } from '../clients/am-api.js';
4
+ /**
5
+ * Base command for Account Manager operations.
6
+ *
7
+ * Extends OAuthCommand with Account Manager client setup for users, roles, and organizations.
8
+ * Provides enhanced error messages with role-specific guidance when authentication fails.
9
+ *
10
+ * @example
11
+ * export default class UserList extends AmCommand<typeof UserList> {
12
+ * async run(): Promise<void> {
13
+ * const users = await this.accountManagerClient.listUsers({});
14
+ * // ...
15
+ * }
16
+ * }
17
+ *
18
+ * @example
19
+ * export default class OrgList extends AmCommand<typeof OrgList> {
20
+ * async run(): Promise<void> {
21
+ * const orgs = await this.accountManagerClient.listOrgs();
22
+ * // ...
23
+ * }
24
+ * }
25
+ */
26
+ export declare abstract class AmCommand<T extends typeof Command> extends OAuthCommand<T> {
27
+ protected getDefaultClientId(): string;
28
+ private _accountManagerClient?;
29
+ private _authStrategy?;
30
+ /**
31
+ * Gets the auth method type that was used, based on the stored strategy.
32
+ */
33
+ protected get authMethodUsed(): 'implicit' | 'client-credentials' | undefined;
34
+ /**
35
+ * Gets the unified Account Manager client, creating it if necessary.
36
+ * This provides direct access to all Account Manager API methods (users, roles, orgs).
37
+ *
38
+ * @example
39
+ * const client = this.accountManagerClient;
40
+ * const users = await client.listUsers({});
41
+ * const roles = await client.listRoles({});
42
+ * const orgs = await client.listOrgs();
43
+ * const user = await client.getUser('user-id');
44
+ * const role = await client.getRole('bm-admin');
45
+ * const org = await client.getOrg('org-id');
46
+ */
47
+ protected get accountManagerClient(): AccountManagerClient;
48
+ /**
49
+ * Override catch() to detect auth errors and append contextual AM role guidance.
50
+ */
51
+ protected catch(err: Error & {
52
+ exitCode?: number;
53
+ }): Promise<never>;
54
+ /**
55
+ * Builds a contextual suggestion message based on the auth method and AM subtopic.
56
+ */
57
+ private getAuthErrorSuggestion;
58
+ /**
59
+ * Gets the AM subtopic from the command ID (e.g., 'am:users:list' → 'users').
60
+ */
61
+ private getAmSubtopic;
62
+ /**
63
+ * Attempts to extract roles from the cached JWT token synchronously.
64
+ */
65
+ private getJwtRolesInfo;
66
+ /**
67
+ * Suggestion for client-credentials auth failures.
68
+ */
69
+ private getClientCredentialsSuggestion;
70
+ /**
71
+ * Suggestion for implicit auth failures.
72
+ */
73
+ private getImplicitSuggestion;
74
+ }
@@ -0,0 +1,189 @@
1
+ import { OAuthCommand } from './oauth-command.js';
2
+ import { createAccountManagerClient } from '../clients/am-api.js';
3
+ import { ImplicitOAuthStrategy } from '../auth/oauth-implicit.js';
4
+ import { DEFAULT_PUBLIC_CLIENT_ID } from '../defaults.js';
5
+ /** Account Manager role: User Administrator */
6
+ const AM_USER_ADMIN = 'User Administrator';
7
+ /** Account Manager role: Account Administrator */
8
+ const AM_ACCOUNT_ADMIN = 'Account Administrator';
9
+ /** Account Manager role: API Administrator */
10
+ const AM_API_ADMIN = 'API Administrator';
11
+ /** Patterns that indicate an authentication/authorization error */
12
+ const AUTH_ERROR_PATTERNS = [
13
+ 'authentication invalid',
14
+ 'operation forbidden',
15
+ '401',
16
+ '403',
17
+ 'failed to get access token',
18
+ 'unauthorized',
19
+ ];
20
+ /**
21
+ * Base command for Account Manager operations.
22
+ *
23
+ * Extends OAuthCommand with Account Manager client setup for users, roles, and organizations.
24
+ * Provides enhanced error messages with role-specific guidance when authentication fails.
25
+ *
26
+ * @example
27
+ * export default class UserList extends AmCommand<typeof UserList> {
28
+ * async run(): Promise<void> {
29
+ * const users = await this.accountManagerClient.listUsers({});
30
+ * // ...
31
+ * }
32
+ * }
33
+ *
34
+ * @example
35
+ * export default class OrgList extends AmCommand<typeof OrgList> {
36
+ * async run(): Promise<void> {
37
+ * const orgs = await this.accountManagerClient.listOrgs();
38
+ * // ...
39
+ * }
40
+ * }
41
+ */
42
+ export class AmCommand extends OAuthCommand {
43
+ getDefaultClientId() {
44
+ return DEFAULT_PUBLIC_CLIENT_ID;
45
+ }
46
+ _accountManagerClient;
47
+ _authStrategy;
48
+ /**
49
+ * Gets the auth method type that was used, based on the stored strategy.
50
+ */
51
+ get authMethodUsed() {
52
+ if (!this._authStrategy)
53
+ return undefined;
54
+ return this._authStrategy instanceof ImplicitOAuthStrategy ? 'implicit' : 'client-credentials';
55
+ }
56
+ /**
57
+ * Gets the unified Account Manager client, creating it if necessary.
58
+ * This provides direct access to all Account Manager API methods (users, roles, orgs).
59
+ *
60
+ * @example
61
+ * const client = this.accountManagerClient;
62
+ * const users = await client.listUsers({});
63
+ * const roles = await client.listRoles({});
64
+ * const orgs = await client.listOrgs();
65
+ * const user = await client.getUser('user-id');
66
+ * const role = await client.getRole('bm-admin');
67
+ * const org = await client.getOrg('org-id');
68
+ */
69
+ get accountManagerClient() {
70
+ if (!this._accountManagerClient) {
71
+ this.requireOAuthCredentials();
72
+ const authStrategy = this.getOAuthStrategy();
73
+ this._authStrategy = authStrategy;
74
+ this._accountManagerClient = createAccountManagerClient({
75
+ hostname: this.accountManagerHost,
76
+ }, authStrategy);
77
+ }
78
+ return this._accountManagerClient;
79
+ }
80
+ /**
81
+ * Override catch() to detect auth errors and append contextual AM role guidance.
82
+ */
83
+ async catch(err) {
84
+ const message = err.message?.toLowerCase() ?? '';
85
+ const isAuthError = AUTH_ERROR_PATTERNS.some((pattern) => message.includes(pattern));
86
+ if (isAuthError) {
87
+ const suggestion = this.getAuthErrorSuggestion();
88
+ if (suggestion) {
89
+ err.message = `${err.message}\n\n${suggestion}`;
90
+ }
91
+ }
92
+ return super.catch(err);
93
+ }
94
+ /**
95
+ * Builds a contextual suggestion message based on the auth method and AM subtopic.
96
+ */
97
+ getAuthErrorSuggestion() {
98
+ const subtopic = this.getAmSubtopic();
99
+ const authMethod = this.authMethodUsed;
100
+ if (!subtopic)
101
+ return undefined;
102
+ // Try to get current JWT roles for client-credentials (avoid triggering browser login for implicit)
103
+ let rolesInfo = '';
104
+ if (authMethod === 'client-credentials' && this._authStrategy) {
105
+ try {
106
+ // getJWT() is async but we only want cached token info — use synchronous check
107
+ // The token should already be cached if we got far enough to receive an auth error
108
+ rolesInfo = this.getJwtRolesInfo();
109
+ }
110
+ catch {
111
+ // Token may be expired or unavailable, skip roles info
112
+ }
113
+ }
114
+ if (authMethod === 'client-credentials') {
115
+ return this.getClientCredentialsSuggestion(subtopic, rolesInfo);
116
+ }
117
+ if (authMethod === 'implicit') {
118
+ return this.getImplicitSuggestion(subtopic);
119
+ }
120
+ return undefined;
121
+ }
122
+ /**
123
+ * Gets the AM subtopic from the command ID (e.g., 'am:users:list' → 'users').
124
+ */
125
+ getAmSubtopic() {
126
+ if (!this.id)
127
+ return undefined;
128
+ const parts = this.id.split(':');
129
+ // Command IDs are like 'am:users:list', 'am:roles:get', 'am:orgs:list', 'am:clients:list'
130
+ const amIndex = parts.indexOf('am');
131
+ if (amIndex >= 0 && amIndex + 1 < parts.length) {
132
+ return parts[amIndex + 1];
133
+ }
134
+ return undefined;
135
+ }
136
+ /**
137
+ * Attempts to extract roles from the cached JWT token synchronously.
138
+ */
139
+ getJwtRolesInfo() {
140
+ // Access the strategy's internal token cache via getJWT()
141
+ // This is best-effort — if no token is cached, we skip
142
+ if (!this._authStrategy)
143
+ return '';
144
+ // We can't call async getJWT() here, but we can check if OAuthStrategy has a cached token
145
+ // by looking at the strategy type. For now, we'll return empty and let the suggestion
146
+ // work without role details.
147
+ return '';
148
+ }
149
+ /**
150
+ * Suggestion for client-credentials auth failures.
151
+ */
152
+ getClientCredentialsSuggestion(subtopic, rolesInfo) {
153
+ const suffix = rolesInfo ? `\n${rolesInfo}` : '';
154
+ switch (subtopic) {
155
+ case 'users':
156
+ case 'roles':
157
+ return (`Suggestion: Add the "${AM_USER_ADMIN}" role to your API client, ` +
158
+ `or use --user-auth to authenticate as a user with the appropriate role.${suffix}`);
159
+ case 'orgs':
160
+ return (`Suggestion: Use --user-auth to authenticate as a user with the "${AM_ACCOUNT_ADMIN}" role. ` +
161
+ `Organization management requires user authentication.${suffix}`);
162
+ case 'clients':
163
+ return (`Suggestion: Use --user-auth to authenticate as a user with the ` +
164
+ `"${AM_ACCOUNT_ADMIN}" or "${AM_API_ADMIN}" role. ` +
165
+ `API client management requires user authentication.${suffix}`);
166
+ default:
167
+ return `Suggestion: Try using --user-auth for browser-based authentication.${suffix}`;
168
+ }
169
+ }
170
+ /**
171
+ * Suggestion for implicit auth failures.
172
+ */
173
+ getImplicitSuggestion(subtopic) {
174
+ switch (subtopic) {
175
+ case 'users':
176
+ case 'roles':
177
+ return (`Suggestion: Your user account needs the "${AM_ACCOUNT_ADMIN}" or "${AM_USER_ADMIN}" role ` +
178
+ `to manage users and roles.`);
179
+ case 'clients':
180
+ return (`Suggestion: Your user account needs the "${AM_ACCOUNT_ADMIN}" or "${AM_API_ADMIN}" role ` +
181
+ `to manage API clients.`);
182
+ case 'orgs':
183
+ return `Suggestion: Your user account needs the "${AM_ACCOUNT_ADMIN}" role to manage organizations.`;
184
+ default:
185
+ return `Suggestion: Verify your user account has the appropriate Account Manager role.`;
186
+ }
187
+ }
188
+ }
189
+ //# sourceMappingURL=am-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"am-command.js","sourceRoot":"","sources":["../../../src/cli/am-command.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,10 @@
1
1
  import { Command, type Interfaces } from '@oclif/core';
2
+ import type { LoadConfigOptions, PluginSources } from './config.js';
2
3
  import type { ResolvedB2CConfig } from '../config/index.js';
3
4
  import { type Logger } from '../logging/index.js';
4
5
  import { type ExtraParamsConfig } from '../clients/middleware.js';
5
6
  import type { ConfigSource } from '../config/types.js';
7
+ import { Telemetry, type TelemetryAttributes } from '../telemetry/index.js';
6
8
  export type Flags<T extends typeof Command> = Interfaces.InferredFlags<(typeof BaseCommand)['baseFlags'] & T['flags']>;
7
9
  export type Args<T extends typeof Command> = Interfaces.InferredArgs<T['args']>;
8
10
  /**
@@ -13,6 +15,11 @@ export type Args<T extends typeof Command> = Interfaces.InferredArgs<T['args']>;
13
15
  * - SFCC_LOG_COLORIZE: Force colors on/off (default: auto-detect TTY)
14
16
  * - SFCC_REDACT_SECRETS: Set to 'false' to disable secret redaction
15
17
  * - NO_COLOR: Industry standard to disable colors
18
+ *
19
+ * Environment variables for telemetry:
20
+ * - SF_DISABLE_TELEMETRY: Set to 'true' to disable telemetry (sf CLI standard)
21
+ * - SFCC_DISABLE_TELEMETRY: Set to 'true' to disable telemetry
22
+ * - SFCC_APP_INSIGHTS_KEY: Override connection string from package.json
16
23
  */
17
24
  export declare abstract class BaseCommand<T extends typeof Command> extends Command {
18
25
  static baseFlags: {
@@ -31,11 +38,31 @@ export declare abstract class BaseCommand<T extends typeof Command> extends Comm
31
38
  protected args: Args<T>;
32
39
  protected resolvedConfig: ResolvedB2CConfig;
33
40
  protected logger: Logger;
41
+ /** Telemetry instance for tracking command events */
42
+ protected telemetry?: Telemetry;
34
43
  /** High-priority config sources from plugins (inserted before defaults) */
35
44
  protected pluginSourcesBefore: ConfigSource[];
36
45
  /** Low-priority config sources from plugins (inserted after defaults) */
37
46
  protected pluginSourcesAfter: ConfigSource[];
47
+ /** Start time for command duration tracking */
48
+ private commandStartTime?;
38
49
  init(): Promise<void>;
50
+ /**
51
+ * Auto-initialize telemetry from package.json oclif.telemetry config.
52
+ * Called during init() to enable automatic telemetry for all commands.
53
+ */
54
+ private initTelemetryFromConfig;
55
+ /**
56
+ * Manual telemetry initialization for non-pjson usage (e.g., MCP server with additional attributes).
57
+ * Use this when you need to pass custom initial attributes or use a different connection string.
58
+ *
59
+ * @param options - Telemetry options
60
+ * @returns The telemetry instance, or undefined if telemetry is disabled
61
+ */
62
+ protected initTelemetry(options: {
63
+ appInsightsKey?: string;
64
+ initialAttributes?: TelemetryAttributes;
65
+ }): Promise<Telemetry | undefined>;
39
66
  /**
40
67
  * Determine colorize setting based on env vars and TTY.
41
68
  * Priority: NO_COLOR > SFCC_LOG_COLORIZE > TTY detection
@@ -50,7 +77,35 @@ export declare abstract class BaseCommand<T extends typeof Command> extends Comm
50
77
  * Override oclif's warn() to use pino.
51
78
  */
52
79
  warn(input: string | Error): string | Error;
80
+ /**
81
+ * Gets base configuration options from common flags.
82
+ *
83
+ * Subclasses should spread these options when overriding loadConfiguration()
84
+ * to ensure common options like startDir are always included.
85
+ *
86
+ * @example
87
+ * ```typescript
88
+ * protected override loadConfiguration(): ResolvedB2CConfig {
89
+ * const options: LoadConfigOptions = {
90
+ * ...this.getBaseConfigOptions(),
91
+ * // Add subclass-specific options here
92
+ * };
93
+ * return loadConfig(extractMyFlags(this.flags), options, this.getPluginSources());
94
+ * }
95
+ * ```
96
+ */
97
+ protected getBaseConfigOptions(): LoadConfigOptions;
98
+ /**
99
+ * Gets plugin sources for configuration resolution.
100
+ */
101
+ protected getPluginSources(): PluginSources;
53
102
  protected loadConfiguration(): ResolvedB2CConfig;
103
+ /**
104
+ * Enrich telemetry with realm/tenant context from the resolved configuration.
105
+ * Called after loadConfiguration() in init() so that COMMAND_SUCCESS and
106
+ * COMMAND_EXCEPTION events include organizational context.
107
+ */
108
+ protected addTelemetryContext(): void;
54
109
  /**
55
110
  * Collects config sources from plugins via the `b2c:config-sources` hook.
56
111
  *
@@ -93,10 +148,16 @@ export declare abstract class BaseCommand<T extends typeof Command> extends Comm
93
148
  *
94
149
  * Logs the error using the structured logger (including cause if available).
95
150
  * In JSON mode, outputs a JSON error object to stdout instead of oclif's default format.
151
+ * Sends exception to telemetry if initialized.
96
152
  */
97
153
  protected catch(err: Error & {
98
154
  exitCode?: number;
99
155
  }): Promise<never>;
156
+ /**
157
+ * Called after run() completes (whether successfully or via catch()).
158
+ * Tracks COMMAND_SUCCESS and stops telemetry.
159
+ */
160
+ protected finally(err: Error | undefined): Promise<void>;
100
161
  baseCommandTest(): void;
101
162
  /**
102
163
  * Parse extra params from --extra-query, --extra-body, and --extra-headers flags.
@@ -5,12 +5,14 @@
5
5
  */
6
6
  import { Command, Flags } from '@oclif/core';
7
7
  import { loadConfig } from './config.js';
8
+ import { parseFriendlySandboxId } from '../operations/ods/sandbox-lookup.js';
8
9
  import { setLanguage } from '../i18n/index.js';
9
10
  import { configureLogger, getLogger } from '../logging/index.js';
10
11
  import { createExtraParamsMiddleware } from '../clients/middleware.js';
11
12
  import { globalMiddlewareRegistry } from '../clients/middleware-registry.js';
12
13
  import { globalAuthMiddlewareRegistry } from '../auth/middleware.js';
13
14
  import { setUserAgent } from '../clients/user-agent.js';
15
+ import { createTelemetry, Telemetry } from '../telemetry/index.js';
14
16
  const LOG_LEVELS = ['trace', 'debug', 'info', 'warn', 'error', 'silent'];
15
17
  /**
16
18
  * Base command class for B2C CLI tools.
@@ -20,6 +22,11 @@ const LOG_LEVELS = ['trace', 'debug', 'info', 'warn', 'error', 'silent'];
20
22
  * - SFCC_LOG_COLORIZE: Force colors on/off (default: auto-detect TTY)
21
23
  * - SFCC_REDACT_SECRETS: Set to 'false' to disable secret redaction
22
24
  * - NO_COLOR: Industry standard to disable colors
25
+ *
26
+ * Environment variables for telemetry:
27
+ * - SF_DISABLE_TELEMETRY: Set to 'true' to disable telemetry (sf CLI standard)
28
+ * - SFCC_DISABLE_TELEMETRY: Set to 'true' to disable telemetry
29
+ * - SFCC_APP_INSIGHTS_KEY: Override connection string from package.json
23
30
  */
24
31
  export class BaseCommand extends Command {
25
32
  static baseFlags = {
@@ -85,10 +92,14 @@ export class BaseCommand extends Command {
85
92
  args;
86
93
  resolvedConfig;
87
94
  logger;
95
+ /** Telemetry instance for tracking command events */
96
+ telemetry;
88
97
  /** High-priority config sources from plugins (inserted before defaults) */
89
98
  pluginSourcesBefore = [];
90
99
  /** Low-priority config sources from plugins (inserted after defaults) */
91
100
  pluginSourcesAfter = [];
101
+ /** Start time for command duration tracking */
102
+ commandStartTime;
92
103
  async init() {
93
104
  await super.init();
94
105
  const { args, flags } = await this.parse({
@@ -115,7 +126,59 @@ export class BaseCommand extends Command {
115
126
  await this.collectPluginAuthMiddleware();
116
127
  // Collect config sources from plugins before loading configuration
117
128
  await this.collectPluginConfigSources();
129
+ // Auto-initialize telemetry from oclif pjson config
130
+ await this.initTelemetryFromConfig();
118
131
  this.resolvedConfig = this.loadConfiguration();
132
+ this.addTelemetryContext();
133
+ }
134
+ /**
135
+ * Auto-initialize telemetry from package.json oclif.telemetry config.
136
+ * Called during init() to enable automatic telemetry for all commands.
137
+ */
138
+ async initTelemetryFromConfig() {
139
+ const pjsonTelemetry = this.config.pjson.oclif?.telemetry;
140
+ const connectionString = Telemetry.getConnectionString(pjsonTelemetry?.connectionString);
141
+ if (!connectionString)
142
+ return;
143
+ this.telemetry = createTelemetry({
144
+ project: this.config.name,
145
+ appInsightsKey: connectionString,
146
+ version: this.config.version,
147
+ dataDir: this.config.dataDir,
148
+ initialAttributes: { command: this.id },
149
+ });
150
+ await this.telemetry.start();
151
+ // Track command start
152
+ this.commandStartTime = Date.now();
153
+ this.telemetry.sendEvent('COMMAND_START', { command: this.id });
154
+ }
155
+ /**
156
+ * Manual telemetry initialization for non-pjson usage (e.g., MCP server with additional attributes).
157
+ * Use this when you need to pass custom initial attributes or use a different connection string.
158
+ *
159
+ * @param options - Telemetry options
160
+ * @returns The telemetry instance, or undefined if telemetry is disabled
161
+ */
162
+ async initTelemetry(options) {
163
+ // If telemetry was already initialized by initTelemetryFromConfig, stop it first
164
+ if (this.telemetry) {
165
+ await this.telemetry.stop();
166
+ }
167
+ const connectionString = Telemetry.getConnectionString(options.appInsightsKey);
168
+ if (!connectionString)
169
+ return undefined;
170
+ this.telemetry = createTelemetry({
171
+ project: this.config.name,
172
+ appInsightsKey: connectionString,
173
+ version: this.config.version,
174
+ dataDir: this.config.dataDir,
175
+ initialAttributes: { command: this.id, ...options.initialAttributes },
176
+ });
177
+ await this.telemetry.start();
178
+ // Track command start
179
+ this.commandStartTime = Date.now();
180
+ this.telemetry.sendEvent('COMMAND_START', { command: this.id });
181
+ return this.telemetry;
119
182
  }
120
183
  /**
121
184
  * Determine colorize setting based on env vars and TTY.
@@ -166,16 +229,91 @@ export class BaseCommand extends Command {
166
229
  this.logger.warn(message);
167
230
  return input;
168
231
  }
169
- loadConfiguration() {
170
- const options = {
232
+ /**
233
+ * Gets base configuration options from common flags.
234
+ *
235
+ * Subclasses should spread these options when overriding loadConfiguration()
236
+ * to ensure common options like startDir are always included.
237
+ *
238
+ * @example
239
+ * ```typescript
240
+ * protected override loadConfiguration(): ResolvedB2CConfig {
241
+ * const options: LoadConfigOptions = {
242
+ * ...this.getBaseConfigOptions(),
243
+ * // Add subclass-specific options here
244
+ * };
245
+ * return loadConfig(extractMyFlags(this.flags), options, this.getPluginSources());
246
+ * }
247
+ * ```
248
+ */
249
+ getBaseConfigOptions() {
250
+ return {
171
251
  instance: this.flags.instance,
172
252
  configPath: this.flags.config,
253
+ startDir: this.flags['working-directory'],
173
254
  };
174
- const pluginSources = {
255
+ }
256
+ /**
257
+ * Gets plugin sources for configuration resolution.
258
+ */
259
+ getPluginSources() {
260
+ return {
175
261
  before: this.pluginSourcesBefore,
176
262
  after: this.pluginSourcesAfter,
177
263
  };
178
- return loadConfig({}, options, pluginSources);
264
+ }
265
+ loadConfiguration() {
266
+ return loadConfig({}, this.getBaseConfigOptions(), this.getPluginSources());
267
+ }
268
+ /**
269
+ * Enrich telemetry with realm/tenant context from the resolved configuration.
270
+ * Called after loadConfiguration() in init() so that COMMAND_SUCCESS and
271
+ * COMMAND_EXCEPTION events include organizational context.
272
+ */
273
+ addTelemetryContext() {
274
+ if (!this.telemetry)
275
+ return;
276
+ try {
277
+ const attributes = {};
278
+ const { values, sources } = this.resolvedConfig;
279
+ // Extract realm from tenantId (e.g., "zzpq_019" or "f_ecom_zzpq_019")
280
+ if (values.tenantId) {
281
+ attributes.tenantId = values.tenantId;
282
+ const parsed = parseFriendlySandboxId(values.tenantId);
283
+ if (parsed) {
284
+ attributes.realm = parsed.realm;
285
+ }
286
+ }
287
+ // Fallback: extract realm from hostname (e.g., "zzpq-019.dx.commercecloud.salesforce.com")
288
+ if (!attributes.realm && values.hostname) {
289
+ const parsed = parseFriendlySandboxId(values.hostname.split('.')[0]);
290
+ if (parsed) {
291
+ attributes.realm = parsed.realm;
292
+ }
293
+ }
294
+ if (values.hostname) {
295
+ attributes.hostname = values.hostname;
296
+ }
297
+ if (values.clientId) {
298
+ attributes.clientId = values.clientId;
299
+ }
300
+ if (values.shortCode) {
301
+ attributes.shortCode = values.shortCode;
302
+ }
303
+ // Record which config sources contributed
304
+ if (sources.length > 0) {
305
+ attributes.configSources = sources.map((s) => s.name).join(', ');
306
+ }
307
+ if (Object.keys(attributes).length > 0) {
308
+ this.telemetry.addAttributes(attributes);
309
+ if (process.env.SFCC_TELEMETRY_LOG === 'true') {
310
+ this.logger.debug({ attributes }, 'telemetry context enriched');
311
+ }
312
+ }
313
+ }
314
+ catch {
315
+ // Best-effort: telemetry context enrichment must never prevent command execution
316
+ }
179
317
  }
180
318
  /**
181
319
  * Collects config sources from plugins via the `b2c:config-sources` hook.
@@ -303,9 +441,25 @@ export class BaseCommand extends Command {
303
441
  *
304
442
  * Logs the error using the structured logger (including cause if available).
305
443
  * In JSON mode, outputs a JSON error object to stdout instead of oclif's default format.
444
+ * Sends exception to telemetry if initialized.
306
445
  */
307
446
  async catch(err) {
308
447
  const exitCode = err.exitCode ?? 1;
448
+ const duration = this.commandStartTime ? Date.now() - this.commandStartTime : undefined;
449
+ // Send exception and COMMAND_ERROR event so the error appears in custom events (same view as COMMAND_START)
450
+ // Flush explicitly before stop to ensure events are sent before process exits
451
+ if (this.telemetry) {
452
+ this.telemetry.sendException(err, { command: this.id, exitCode, duration });
453
+ this.telemetry.sendEvent('COMMAND_ERROR', {
454
+ command: this.id,
455
+ exitCode,
456
+ duration,
457
+ errorMessage: err.message,
458
+ ...(err.cause ? { errorCause: String(err.cause) } : {}),
459
+ });
460
+ await this.telemetry.flush();
461
+ await this.telemetry.stop();
462
+ }
309
463
  // Log if logger is available (may not be if error during init)
310
464
  if (this.logger) {
311
465
  this.logger.error({ cause: err?.cause }, err.message);
@@ -325,6 +479,19 @@ export class BaseCommand extends Command {
325
479
  // Use oclif's error() for proper exit code and display
326
480
  this.error(err.message, { exit: exitCode });
327
481
  }
482
+ /**
483
+ * Called after run() completes (whether successfully or via catch()).
484
+ * Tracks COMMAND_SUCCESS and stops telemetry.
485
+ */
486
+ async finally(err) {
487
+ // Only track success if no error occurred
488
+ if (!err && this.telemetry) {
489
+ const duration = this.commandStartTime ? Date.now() - this.commandStartTime : undefined;
490
+ this.telemetry.sendEvent('COMMAND_SUCCESS', { command: this.id, duration });
491
+ await this.telemetry.stop();
492
+ }
493
+ await super.finally(err);
494
+ }
328
495
  baseCommandTest() {
329
496
  this.logger.info('BaseCommand initialized');
330
497
  }