@salesforce/b2c-tooling-sdk 0.2.0 → 0.3.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 (327) hide show
  1. package/dist/cjs/auth/api-key.d.ts +2 -2
  2. package/dist/cjs/auth/api-key.js +1 -0
  3. package/dist/cjs/auth/api-key.js.map +1 -1
  4. package/dist/cjs/auth/basic.d.ts +2 -2
  5. package/dist/cjs/auth/basic.js +2 -0
  6. package/dist/cjs/auth/basic.js.map +1 -1
  7. package/dist/cjs/auth/index.d.ts +1 -1
  8. package/dist/cjs/auth/index.js.map +1 -1
  9. package/dist/cjs/auth/oauth-implicit.d.ts +2 -2
  10. package/dist/cjs/auth/oauth-implicit.js +1 -0
  11. package/dist/cjs/auth/oauth-implicit.js.map +1 -1
  12. package/dist/cjs/auth/oauth.d.ts +2 -2
  13. package/dist/cjs/auth/oauth.js +2 -0
  14. package/dist/cjs/auth/oauth.js.map +1 -1
  15. package/dist/cjs/auth/types.d.ts +10 -1
  16. package/dist/cjs/auth/types.js +5 -0
  17. package/dist/cjs/auth/types.js.map +1 -1
  18. package/dist/cjs/cli/base-command.d.ts +23 -0
  19. package/dist/cjs/cli/base-command.js +29 -4
  20. package/dist/cjs/cli/base-command.js.map +1 -1
  21. package/dist/cjs/cli/config.d.ts +71 -0
  22. package/dist/cjs/cli/config.js +105 -2
  23. package/dist/cjs/cli/config.js.map +1 -1
  24. package/dist/cjs/cli/index.d.ts +2 -2
  25. package/dist/cjs/cli/index.js +3 -1
  26. package/dist/cjs/cli/index.js.map +1 -1
  27. package/dist/cjs/cli/instance-command.d.ts +4 -0
  28. package/dist/cjs/cli/instance-command.js +24 -23
  29. package/dist/cjs/cli/instance-command.js.map +1 -1
  30. package/dist/cjs/cli/mrt-command.d.ts +0 -6
  31. package/dist/cjs/cli/mrt-command.js +5 -29
  32. package/dist/cjs/cli/mrt-command.js.map +1 -1
  33. package/dist/cjs/cli/oauth-command.d.ts +5 -6
  34. package/dist/cjs/cli/oauth-command.js +13 -35
  35. package/dist/cjs/cli/oauth-command.js.map +1 -1
  36. package/dist/cjs/cli/ods-command.d.ts +18 -0
  37. package/dist/cjs/cli/ods-command.js +51 -0
  38. package/dist/cjs/cli/ods-command.js.map +1 -1
  39. package/dist/cjs/cli/webdav-command.d.ts +4 -0
  40. package/dist/cjs/clients/cdn-zones.d.ts +33 -1
  41. package/dist/cjs/clients/cdn-zones.js.map +1 -1
  42. package/dist/cjs/clients/custom-apis.d.ts +30 -1
  43. package/dist/cjs/clients/custom-apis.js.map +1 -1
  44. package/dist/cjs/clients/index.d.ts +2 -0
  45. package/dist/cjs/clients/index.js +1 -0
  46. package/dist/cjs/clients/index.js.map +1 -1
  47. package/dist/cjs/clients/mrt-b2c.d.ts +25 -1
  48. package/dist/cjs/clients/mrt-b2c.js.map +1 -1
  49. package/dist/cjs/clients/mrt.d.ts +24 -1
  50. package/dist/cjs/clients/mrt.js.map +1 -1
  51. package/dist/cjs/clients/ocapi.d.ts +22 -2
  52. package/dist/cjs/clients/ocapi.js +0 -2
  53. package/dist/cjs/clients/ocapi.js.map +1 -1
  54. package/dist/cjs/clients/ods.d.ts +28 -1
  55. package/dist/cjs/clients/ods.js.map +1 -1
  56. package/dist/cjs/clients/scapi-schemas.d.ts +30 -1
  57. package/dist/cjs/clients/scapi-schemas.js.map +1 -1
  58. package/dist/cjs/clients/slas-admin.d.ts +28 -0
  59. package/dist/cjs/clients/slas-admin.js.map +1 -1
  60. package/dist/cjs/clients/tls-dispatcher.d.ts +42 -0
  61. package/dist/cjs/clients/tls-dispatcher.js +107 -0
  62. package/dist/cjs/clients/tls-dispatcher.js.map +1 -0
  63. package/dist/cjs/clients/webdav.d.ts +8 -1
  64. package/dist/cjs/clients/webdav.js +5 -1
  65. package/dist/cjs/clients/webdav.js.map +1 -1
  66. package/dist/cjs/config/dw-json.d.ts +14 -0
  67. package/dist/cjs/config/dw-json.js +3 -2
  68. package/dist/cjs/config/dw-json.js.map +1 -1
  69. package/dist/cjs/config/index.d.ts +2 -2
  70. package/dist/cjs/config/index.js +1 -1
  71. package/dist/cjs/config/index.js.map +1 -1
  72. package/dist/cjs/config/mapping.d.ts +1 -1
  73. package/dist/cjs/config/mapping.js +20 -4
  74. package/dist/cjs/config/mapping.js.map +1 -1
  75. package/dist/cjs/config/resolved-config.d.ts +1 -3
  76. package/dist/cjs/config/resolved-config.js +0 -8
  77. package/dist/cjs/config/resolved-config.js.map +1 -1
  78. package/dist/cjs/config/resolver.d.ts +1 -1
  79. package/dist/cjs/config/resolver.js +20 -4
  80. package/dist/cjs/config/resolver.js.map +1 -1
  81. package/dist/cjs/config/sources/mobify-source.js +3 -2
  82. package/dist/cjs/config/sources/mobify-source.js.map +1 -1
  83. package/dist/cjs/config/sources/package-json-source.js +3 -1
  84. package/dist/cjs/config/sources/package-json-source.js.map +1 -1
  85. package/dist/cjs/config/types.d.ts +6 -18
  86. package/dist/{esm/operations → cjs}/docs/download.d.ts +1 -1
  87. package/dist/cjs/{operations/docs → docs}/download.js +2 -2
  88. package/dist/cjs/docs/download.js.map +1 -0
  89. package/dist/{esm/operations → cjs}/docs/index.d.ts +4 -4
  90. package/dist/cjs/docs/index.js.map +1 -0
  91. package/dist/cjs/docs/schema.js.map +1 -0
  92. package/dist/cjs/docs/search.js.map +1 -0
  93. package/dist/cjs/docs/types.js.map +1 -0
  94. package/dist/cjs/index.d.ts +5 -10
  95. package/dist/cjs/index.js +4 -8
  96. package/dist/cjs/index.js.map +1 -1
  97. package/dist/cjs/instance/index.d.ts +4 -0
  98. package/dist/cjs/instance/index.js +6 -1
  99. package/dist/cjs/instance/index.js.map +1 -1
  100. package/dist/cjs/logging/index.d.ts +1 -1
  101. package/dist/cjs/logging/logger.js +15 -0
  102. package/dist/cjs/logging/logger.js.map +1 -1
  103. package/dist/cjs/logging/types.d.ts +9 -0
  104. package/dist/cjs/operations/logs/index.d.ts +65 -0
  105. package/dist/cjs/operations/logs/index.js +73 -0
  106. package/dist/cjs/operations/logs/index.js.map +1 -0
  107. package/dist/cjs/operations/logs/list.d.ts +35 -0
  108. package/dist/cjs/operations/logs/list.js +144 -0
  109. package/dist/cjs/operations/logs/list.js.map +1 -0
  110. package/dist/cjs/operations/logs/path-normalizer.d.ts +82 -0
  111. package/dist/cjs/operations/logs/path-normalizer.js +190 -0
  112. package/dist/cjs/operations/logs/path-normalizer.js.map +1 -0
  113. package/dist/cjs/operations/logs/tail.d.ts +92 -0
  114. package/dist/cjs/operations/logs/tail.js +525 -0
  115. package/dist/cjs/operations/logs/tail.js.map +1 -0
  116. package/dist/cjs/operations/logs/types.d.ts +132 -0
  117. package/dist/cjs/operations/logs/types.js +7 -0
  118. package/dist/cjs/operations/logs/types.js.map +1 -0
  119. package/dist/cjs/operations/mrt/push.js +3 -0
  120. package/dist/cjs/operations/mrt/push.js.map +1 -1
  121. package/dist/cjs/operations/ods/index.d.ts +6 -0
  122. package/dist/cjs/operations/ods/index.js +12 -0
  123. package/dist/cjs/operations/ods/index.js.map +1 -0
  124. package/dist/cjs/operations/ods/sandbox-lookup.d.ts +63 -0
  125. package/dist/cjs/operations/ods/sandbox-lookup.js +130 -0
  126. package/dist/cjs/operations/ods/sandbox-lookup.js.map +1 -0
  127. package/dist/{esm/operations/scapi-schemas → cjs/schemas}/collapse.d.ts +1 -1
  128. package/dist/cjs/schemas/collapse.js.map +1 -0
  129. package/dist/cjs/{operations/scapi-schemas → schemas}/index.d.ts +5 -5
  130. package/dist/cjs/{operations/scapi-schemas → schemas}/index.js +5 -5
  131. package/dist/cjs/schemas/index.js.map +1 -0
  132. package/dist/cjs/test-utils/config-isolation.js +7 -0
  133. package/dist/cjs/test-utils/config-isolation.js.map +1 -1
  134. package/dist/esm/auth/api-key.d.ts +2 -2
  135. package/dist/esm/auth/api-key.js +1 -0
  136. package/dist/esm/auth/api-key.js.map +1 -1
  137. package/dist/esm/auth/basic.d.ts +2 -2
  138. package/dist/esm/auth/basic.js +2 -0
  139. package/dist/esm/auth/basic.js.map +1 -1
  140. package/dist/esm/auth/index.d.ts +1 -1
  141. package/dist/esm/auth/index.js.map +1 -1
  142. package/dist/esm/auth/oauth-implicit.d.ts +2 -2
  143. package/dist/esm/auth/oauth-implicit.js +1 -0
  144. package/dist/esm/auth/oauth-implicit.js.map +1 -1
  145. package/dist/esm/auth/oauth.d.ts +2 -2
  146. package/dist/esm/auth/oauth.js +2 -0
  147. package/dist/esm/auth/oauth.js.map +1 -1
  148. package/dist/esm/auth/types.d.ts +10 -1
  149. package/dist/esm/auth/types.js +5 -0
  150. package/dist/esm/auth/types.js.map +1 -1
  151. package/dist/esm/cli/base-command.d.ts +23 -0
  152. package/dist/esm/cli/base-command.js +29 -4
  153. package/dist/esm/cli/base-command.js.map +1 -1
  154. package/dist/esm/cli/config.d.ts +71 -0
  155. package/dist/esm/cli/config.js +105 -2
  156. package/dist/esm/cli/config.js.map +1 -1
  157. package/dist/esm/cli/index.d.ts +2 -2
  158. package/dist/esm/cli/index.js +3 -1
  159. package/dist/esm/cli/index.js.map +1 -1
  160. package/dist/esm/cli/instance-command.d.ts +4 -0
  161. package/dist/esm/cli/instance-command.js +24 -23
  162. package/dist/esm/cli/instance-command.js.map +1 -1
  163. package/dist/esm/cli/mrt-command.d.ts +0 -6
  164. package/dist/esm/cli/mrt-command.js +5 -29
  165. package/dist/esm/cli/mrt-command.js.map +1 -1
  166. package/dist/esm/cli/oauth-command.d.ts +5 -6
  167. package/dist/esm/cli/oauth-command.js +13 -35
  168. package/dist/esm/cli/oauth-command.js.map +1 -1
  169. package/dist/esm/cli/ods-command.d.ts +18 -0
  170. package/dist/esm/cli/ods-command.js +51 -0
  171. package/dist/esm/cli/ods-command.js.map +1 -1
  172. package/dist/esm/cli/webdav-command.d.ts +4 -0
  173. package/dist/esm/clients/cdn-zones.d.ts +33 -1
  174. package/dist/esm/clients/cdn-zones.js.map +1 -1
  175. package/dist/esm/clients/custom-apis.d.ts +30 -1
  176. package/dist/esm/clients/custom-apis.js.map +1 -1
  177. package/dist/esm/clients/index.d.ts +2 -0
  178. package/dist/esm/clients/index.js +1 -0
  179. package/dist/esm/clients/index.js.map +1 -1
  180. package/dist/esm/clients/mrt-b2c.d.ts +25 -1
  181. package/dist/esm/clients/mrt-b2c.js.map +1 -1
  182. package/dist/esm/clients/mrt.d.ts +24 -1
  183. package/dist/esm/clients/mrt.js.map +1 -1
  184. package/dist/esm/clients/ocapi.d.ts +22 -2
  185. package/dist/esm/clients/ocapi.js +0 -2
  186. package/dist/esm/clients/ocapi.js.map +1 -1
  187. package/dist/esm/clients/ods.d.ts +28 -1
  188. package/dist/esm/clients/ods.js.map +1 -1
  189. package/dist/esm/clients/scapi-schemas.d.ts +30 -1
  190. package/dist/esm/clients/scapi-schemas.js.map +1 -1
  191. package/dist/esm/clients/slas-admin.d.ts +28 -0
  192. package/dist/esm/clients/slas-admin.js.map +1 -1
  193. package/dist/esm/clients/tls-dispatcher.d.ts +42 -0
  194. package/dist/esm/clients/tls-dispatcher.js +107 -0
  195. package/dist/esm/clients/tls-dispatcher.js.map +1 -0
  196. package/dist/esm/clients/webdav.d.ts +8 -1
  197. package/dist/esm/clients/webdav.js +5 -1
  198. package/dist/esm/clients/webdav.js.map +1 -1
  199. package/dist/esm/config/dw-json.d.ts +14 -0
  200. package/dist/esm/config/dw-json.js +3 -2
  201. package/dist/esm/config/dw-json.js.map +1 -1
  202. package/dist/esm/config/index.d.ts +2 -2
  203. package/dist/esm/config/index.js +1 -1
  204. package/dist/esm/config/index.js.map +1 -1
  205. package/dist/esm/config/mapping.d.ts +1 -1
  206. package/dist/esm/config/mapping.js +20 -4
  207. package/dist/esm/config/mapping.js.map +1 -1
  208. package/dist/esm/config/resolved-config.d.ts +1 -3
  209. package/dist/esm/config/resolved-config.js +0 -8
  210. package/dist/esm/config/resolved-config.js.map +1 -1
  211. package/dist/esm/config/resolver.d.ts +1 -1
  212. package/dist/esm/config/resolver.js +20 -4
  213. package/dist/esm/config/resolver.js.map +1 -1
  214. package/dist/esm/config/sources/mobify-source.js +3 -2
  215. package/dist/esm/config/sources/mobify-source.js.map +1 -1
  216. package/dist/esm/config/sources/package-json-source.js +3 -1
  217. package/dist/esm/config/sources/package-json-source.js.map +1 -1
  218. package/dist/esm/config/types.d.ts +6 -18
  219. package/dist/{cjs/operations → esm}/docs/download.d.ts +1 -1
  220. package/dist/esm/{operations/docs → docs}/download.js +2 -2
  221. package/dist/esm/docs/download.js.map +1 -0
  222. package/dist/{cjs/operations → esm}/docs/index.d.ts +4 -4
  223. package/dist/esm/docs/index.js.map +1 -0
  224. package/dist/esm/docs/schema.js.map +1 -0
  225. package/dist/esm/docs/search.js.map +1 -0
  226. package/dist/esm/docs/types.js.map +1 -0
  227. package/dist/esm/index.d.ts +5 -10
  228. package/dist/esm/index.js +4 -8
  229. package/dist/esm/index.js.map +1 -1
  230. package/dist/esm/instance/index.d.ts +4 -0
  231. package/dist/esm/instance/index.js +6 -1
  232. package/dist/esm/instance/index.js.map +1 -1
  233. package/dist/esm/logging/index.d.ts +1 -1
  234. package/dist/esm/logging/logger.js +15 -0
  235. package/dist/esm/logging/logger.js.map +1 -1
  236. package/dist/esm/logging/types.d.ts +9 -0
  237. package/dist/esm/operations/logs/index.d.ts +65 -0
  238. package/dist/esm/operations/logs/index.js +73 -0
  239. package/dist/esm/operations/logs/index.js.map +1 -0
  240. package/dist/esm/operations/logs/list.d.ts +35 -0
  241. package/dist/esm/operations/logs/list.js +144 -0
  242. package/dist/esm/operations/logs/list.js.map +1 -0
  243. package/dist/esm/operations/logs/path-normalizer.d.ts +82 -0
  244. package/dist/esm/operations/logs/path-normalizer.js +190 -0
  245. package/dist/esm/operations/logs/path-normalizer.js.map +1 -0
  246. package/dist/esm/operations/logs/tail.d.ts +92 -0
  247. package/dist/esm/operations/logs/tail.js +525 -0
  248. package/dist/esm/operations/logs/tail.js.map +1 -0
  249. package/dist/esm/operations/logs/types.d.ts +132 -0
  250. package/dist/esm/operations/logs/types.js +7 -0
  251. package/dist/esm/operations/logs/types.js.map +1 -0
  252. package/dist/esm/operations/mrt/push.js +3 -0
  253. package/dist/esm/operations/mrt/push.js.map +1 -1
  254. package/dist/esm/operations/ods/index.d.ts +6 -0
  255. package/dist/esm/operations/ods/index.js +12 -0
  256. package/dist/esm/operations/ods/index.js.map +1 -0
  257. package/dist/esm/operations/ods/sandbox-lookup.d.ts +63 -0
  258. package/dist/esm/operations/ods/sandbox-lookup.js +130 -0
  259. package/dist/esm/operations/ods/sandbox-lookup.js.map +1 -0
  260. package/dist/{cjs/operations/scapi-schemas → esm/schemas}/collapse.d.ts +1 -1
  261. package/dist/esm/schemas/collapse.js.map +1 -0
  262. package/dist/esm/{operations/scapi-schemas → schemas}/index.d.ts +5 -5
  263. package/dist/esm/{operations/scapi-schemas → schemas}/index.js +5 -5
  264. package/dist/esm/schemas/index.js.map +1 -0
  265. package/dist/esm/test-utils/config-isolation.js +7 -0
  266. package/dist/esm/test-utils/config-isolation.js.map +1 -1
  267. package/package.json +28 -35
  268. package/dist/cjs/logger.d.ts +0 -66
  269. package/dist/cjs/logger.js +0 -80
  270. package/dist/cjs/logger.js.map +0 -1
  271. package/dist/cjs/operations/docs/download.js.map +0 -1
  272. package/dist/cjs/operations/docs/index.js.map +0 -1
  273. package/dist/cjs/operations/docs/schema.js.map +0 -1
  274. package/dist/cjs/operations/docs/search.js.map +0 -1
  275. package/dist/cjs/operations/docs/types.js.map +0 -1
  276. package/dist/cjs/operations/scapi-schemas/collapse.js.map +0 -1
  277. package/dist/cjs/operations/scapi-schemas/index.js.map +0 -1
  278. package/dist/cjs/operations/sites/index.d.ts +0 -56
  279. package/dist/cjs/operations/sites/index.js +0 -19
  280. package/dist/cjs/operations/sites/index.js.map +0 -1
  281. package/dist/cjs/platform/index.d.ts +0 -38
  282. package/dist/cjs/platform/index.js +0 -42
  283. package/dist/cjs/platform/index.js.map +0 -1
  284. package/dist/cjs/platform/mrt.d.ts +0 -19
  285. package/dist/cjs/platform/mrt.js +0 -22
  286. package/dist/cjs/platform/mrt.js.map +0 -1
  287. package/dist/cjs/platform/ods.d.ts +0 -17
  288. package/dist/cjs/platform/ods.js +0 -22
  289. package/dist/cjs/platform/ods.js.map +0 -1
  290. package/dist/esm/logger.d.ts +0 -66
  291. package/dist/esm/logger.js +0 -80
  292. package/dist/esm/logger.js.map +0 -1
  293. package/dist/esm/operations/docs/download.js.map +0 -1
  294. package/dist/esm/operations/docs/index.js.map +0 -1
  295. package/dist/esm/operations/docs/schema.js.map +0 -1
  296. package/dist/esm/operations/docs/search.js.map +0 -1
  297. package/dist/esm/operations/docs/types.js.map +0 -1
  298. package/dist/esm/operations/scapi-schemas/collapse.js.map +0 -1
  299. package/dist/esm/operations/scapi-schemas/index.js.map +0 -1
  300. package/dist/esm/operations/sites/index.d.ts +0 -56
  301. package/dist/esm/operations/sites/index.js +0 -67
  302. package/dist/esm/operations/sites/index.js.map +0 -1
  303. package/dist/esm/platform/index.d.ts +0 -38
  304. package/dist/esm/platform/index.js +0 -42
  305. package/dist/esm/platform/index.js.map +0 -1
  306. package/dist/esm/platform/mrt.d.ts +0 -19
  307. package/dist/esm/platform/mrt.js +0 -22
  308. package/dist/esm/platform/mrt.js.map +0 -1
  309. package/dist/esm/platform/ods.d.ts +0 -17
  310. package/dist/esm/platform/ods.js +0 -22
  311. package/dist/esm/platform/ods.js.map +0 -1
  312. /package/dist/cjs/{operations/docs → docs}/index.js +0 -0
  313. /package/dist/cjs/{operations/docs → docs}/schema.d.ts +0 -0
  314. /package/dist/cjs/{operations/docs → docs}/schema.js +0 -0
  315. /package/dist/cjs/{operations/docs → docs}/search.d.ts +0 -0
  316. /package/dist/cjs/{operations/docs → docs}/search.js +0 -0
  317. /package/dist/cjs/{operations/docs → docs}/types.d.ts +0 -0
  318. /package/dist/cjs/{operations/docs → docs}/types.js +0 -0
  319. /package/dist/cjs/{operations/scapi-schemas → schemas}/collapse.js +0 -0
  320. /package/dist/esm/{operations/docs → docs}/index.js +0 -0
  321. /package/dist/esm/{operations/docs → docs}/schema.d.ts +0 -0
  322. /package/dist/esm/{operations/docs → docs}/schema.js +0 -0
  323. /package/dist/esm/{operations/docs → docs}/search.d.ts +0 -0
  324. /package/dist/esm/{operations/docs → docs}/search.js +0 -0
  325. /package/dist/esm/{operations/docs → docs}/types.d.ts +0 -0
  326. /package/dist/esm/{operations/docs → docs}/types.js +0 -0
  327. /package/dist/esm/{operations/scapi-schemas → schemas}/collapse.js +0 -0
@@ -0,0 +1,73 @@
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
+ */
6
+ /**
7
+ * Log operations for B2C Commerce instances.
8
+ *
9
+ * This module provides functions for listing, tailing, and analyzing log files
10
+ * on B2C Commerce instances via WebDAV.
11
+ *
12
+ * @module operations/logs
13
+ *
14
+ * @example
15
+ * List log files:
16
+ * ```typescript
17
+ * import { listLogFiles } from '@salesforce/b2c-tooling-sdk/operations/logs';
18
+ *
19
+ * const files = await listLogFiles(instance, {
20
+ * prefixes: ['error', 'customerror'],
21
+ * sortBy: 'date',
22
+ * sortOrder: 'desc'
23
+ * });
24
+ *
25
+ * for (const file of files) {
26
+ * console.log(`${file.name} (${file.size} bytes)`);
27
+ * }
28
+ * ```
29
+ *
30
+ * @example
31
+ * Tail logs in real-time:
32
+ * ```typescript
33
+ * import { tailLogs, createPathNormalizer } from '@salesforce/b2c-tooling-sdk/operations/logs';
34
+ *
35
+ * const normalizer = createPathNormalizer({ cartridgePath: './cartridges' });
36
+ *
37
+ * const { stop, done } = await tailLogs(instance, {
38
+ * prefixes: ['error', 'customerror'],
39
+ * pathNormalizer: normalizer,
40
+ * onEntry: (entry) => {
41
+ * console.log(`[${entry.file}] ${entry.level}: ${entry.message}`);
42
+ * },
43
+ * onError: (err) => console.error('Error:', err),
44
+ * });
45
+ *
46
+ * // Stop after 30 seconds
47
+ * setTimeout(() => stop(), 30000);
48
+ *
49
+ * await done;
50
+ * ```
51
+ *
52
+ * @example
53
+ * Get recent logs (one-shot):
54
+ * ```typescript
55
+ * import { getRecentLogs } from '@salesforce/b2c-tooling-sdk/operations/logs';
56
+ *
57
+ * const entries = await getRecentLogs(instance, {
58
+ * prefixes: ['error'],
59
+ * maxEntries: 50
60
+ * });
61
+ *
62
+ * for (const entry of entries) {
63
+ * console.log(`[${entry.timestamp}] ${entry.message}`);
64
+ * }
65
+ * ```
66
+ */
67
+ // List operations
68
+ export { extractPrefix, listLogFiles } from './list.js';
69
+ // Tail operations
70
+ export { aggregateLogEntries, getRecentLogs, parseLogEntry, splitLines, tailLogs } from './tail.js';
71
+ // Path normalization
72
+ export { createPathNormalizer, discoverAndCreateNormalizer, extractPaths, } from './path-normalizer.js';
73
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/operations/logs/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4DG;AAaH,kBAAkB;AAClB,OAAO,EAAC,aAAa,EAAE,YAAY,EAAC,MAAM,WAAW,CAAC;AAEtD,kBAAkB;AAClB,OAAO,EAAC,mBAAmB,EAAE,aAAa,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAC,MAAM,WAAW,CAAC;AAElG,qBAAqB;AACrB,OAAO,EACL,oBAAoB,EACpB,2BAA2B,EAC3B,YAAY,GAEb,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Log file listing operations.
3
+ */
4
+ import type { B2CInstance } from '../../instance/index.js';
5
+ import type { ListLogsOptions, LogFile } from './types.js';
6
+ /**
7
+ * Extracts the log prefix from a filename.
8
+ *
9
+ * @param filename - Log file name (e.g., "error-blade1-20250125.log")
10
+ * @returns The prefix (e.g., "error") or "unknown"
11
+ *
12
+ * @example
13
+ * extractPrefix("error-blade1-20250125.log") // "error"
14
+ * extractPrefix("customerror-blade1-20250125.log") // "customerror"
15
+ * extractPrefix("custom-mylog-blade1-20250125.log") // "custom-mylog"
16
+ */
17
+ export declare function extractPrefix(filename: string): string;
18
+ /**
19
+ * Lists log files on a B2C Commerce instance.
20
+ *
21
+ * @param instance - B2C instance to list logs from
22
+ * @param options - Listing options (filters, sorting)
23
+ * @returns Array of log files
24
+ *
25
+ * @example
26
+ * ```typescript
27
+ * // List all error and customerror logs
28
+ * const logs = await listLogFiles(instance, {
29
+ * prefixes: ['error', 'customerror'],
30
+ * sortBy: 'date',
31
+ * sortOrder: 'desc'
32
+ * });
33
+ * ```
34
+ */
35
+ export declare function listLogFiles(instance: B2CInstance, options?: ListLogsOptions): Promise<LogFile[]>;
@@ -0,0 +1,144 @@
1
+ import { getLogger } from '../../logging/logger.js';
2
+ /**
3
+ * Known log file prefixes in B2C Commerce.
4
+ * Used to extract the prefix from log file names.
5
+ */
6
+ const LOG_PREFIXES = [
7
+ // Custom logs (must check first due to "custom" prefix)
8
+ 'customdebug',
9
+ 'custominfo',
10
+ 'customwarn',
11
+ 'customerror',
12
+ 'customfatal',
13
+ // System logs
14
+ 'error',
15
+ 'warn',
16
+ 'info',
17
+ 'debug',
18
+ 'fatal',
19
+ 'api',
20
+ 'deprecation',
21
+ 'jobs',
22
+ 'staging',
23
+ 'quota',
24
+ 'sql',
25
+ 'service',
26
+ 'syslog',
27
+ 'security',
28
+ 'analytics',
29
+ 'migration',
30
+ // Custom named logs (format: custom-<name>-...)
31
+ 'custom',
32
+ ];
33
+ /**
34
+ * Extracts the log prefix from a filename.
35
+ *
36
+ * @param filename - Log file name (e.g., "error-blade1-20250125.log")
37
+ * @returns The prefix (e.g., "error") or "unknown"
38
+ *
39
+ * @example
40
+ * extractPrefix("error-blade1-20250125.log") // "error"
41
+ * extractPrefix("customerror-blade1-20250125.log") // "customerror"
42
+ * extractPrefix("custom-mylog-blade1-20250125.log") // "custom-mylog"
43
+ */
44
+ export function extractPrefix(filename) {
45
+ // Handle custom-<name> pattern (e.g., custom-mylog-blade1-...)
46
+ // Custom log names use word characters only (no dashes) to distinguish from hostname
47
+ const customMatch = filename.match(/^(custom-[a-zA-Z0-9_]+)-/);
48
+ if (customMatch) {
49
+ return customMatch[1];
50
+ }
51
+ // Check known prefixes (order matters - longer matches first)
52
+ for (const prefix of LOG_PREFIXES) {
53
+ if (filename.startsWith(`${prefix}-`) || filename.startsWith(`${prefix}_`)) {
54
+ return prefix;
55
+ }
56
+ }
57
+ // Fallback: extract first segment before dash or underscore
58
+ const match = filename.match(/^([a-zA-Z]+)[-_]/);
59
+ return match ? match[1] : 'unknown';
60
+ }
61
+ /**
62
+ * Lists log files on a B2C Commerce instance.
63
+ *
64
+ * @param instance - B2C instance to list logs from
65
+ * @param options - Listing options (filters, sorting)
66
+ * @returns Array of log files
67
+ *
68
+ * @example
69
+ * ```typescript
70
+ * // List all error and customerror logs
71
+ * const logs = await listLogFiles(instance, {
72
+ * prefixes: ['error', 'customerror'],
73
+ * sortBy: 'date',
74
+ * sortOrder: 'desc'
75
+ * });
76
+ * ```
77
+ */
78
+ export async function listLogFiles(instance, options = {}) {
79
+ const logger = getLogger();
80
+ const { prefixes, sortBy = 'date', sortOrder = 'desc' } = options;
81
+ logger.debug({ prefixes, sortBy, sortOrder }, 'Listing log files');
82
+ // Get all files from Logs directory
83
+ const entries = await instance.webdav.propfind('Logs', '1');
84
+ // Filter to only log files (not directories, not the Logs directory itself)
85
+ const logFiles = entries
86
+ .filter((entry) => {
87
+ // Skip directories
88
+ if (entry.isCollection)
89
+ return false;
90
+ // Skip if not a .log file
91
+ const name = entry.displayName || entry.href.split('/').pop() || '';
92
+ if (!name.endsWith('.log'))
93
+ return false;
94
+ return true;
95
+ })
96
+ .map((entry) => {
97
+ const name = entry.displayName || entry.href.split('/').pop() || '';
98
+ const prefix = extractPrefix(name);
99
+ return {
100
+ name,
101
+ prefix,
102
+ size: entry.contentLength || 0,
103
+ lastModified: entry.lastModified || new Date(0),
104
+ path: `Logs/${name}`,
105
+ };
106
+ });
107
+ // Filter by prefix if specified
108
+ let filtered = logFiles;
109
+ if (prefixes && prefixes.length > 0) {
110
+ const prefixSet = new Set(prefixes.map((p) => p.toLowerCase()));
111
+ filtered = logFiles.filter((file) => {
112
+ // Check exact prefix match
113
+ if (prefixSet.has(file.prefix.toLowerCase()))
114
+ return true;
115
+ // Also check if the prefix starts with any of the specified prefixes
116
+ // This handles cases like "custom-mylog" matching "custom"
117
+ for (const p of prefixSet) {
118
+ if (file.prefix.toLowerCase().startsWith(p))
119
+ return true;
120
+ }
121
+ return false;
122
+ });
123
+ }
124
+ // Sort the results
125
+ filtered.sort((a, b) => {
126
+ let comparison = 0;
127
+ switch (sortBy) {
128
+ case 'name':
129
+ comparison = a.name.localeCompare(b.name);
130
+ break;
131
+ case 'size':
132
+ comparison = a.size - b.size;
133
+ break;
134
+ case 'date':
135
+ default:
136
+ comparison = a.lastModified.getTime() - b.lastModified.getTime();
137
+ break;
138
+ }
139
+ return sortOrder === 'desc' ? -comparison : comparison;
140
+ });
141
+ logger.debug({ count: filtered.length }, `Found ${filtered.length} log files`);
142
+ return filtered;
143
+ }
144
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../../src/operations/logs/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ import { type CartridgeMapping } from '../code/cartridges.js';
2
+ /**
3
+ * Options for creating a path normalizer.
4
+ */
5
+ export interface PathNormalizerOptions {
6
+ /**
7
+ * Local path to the cartridges directory (simple mode).
8
+ * All cartridge references will be prefixed with this path.
9
+ * @example "./cartridges" or "/Users/dev/project/cartridges"
10
+ */
11
+ cartridgePath?: string;
12
+ /**
13
+ * Discovered cartridge mappings (precise mode).
14
+ * Each cartridge is mapped to its actual local path.
15
+ * Takes precedence over cartridgePath for known cartridges.
16
+ */
17
+ cartridges?: CartridgeMapping[];
18
+ }
19
+ /**
20
+ * Creates a path normalizer function for converting remote cartridge paths
21
+ * to local paths in log messages.
22
+ *
23
+ * Supports two modes:
24
+ * 1. **Cartridge mappings** (precise): Uses discovered cartridges to map each
25
+ * cartridge name to its actual local path. Best for projects with cartridges
26
+ * in different locations.
27
+ * 2. **Cartridge path** (simple): Prefixes all paths with a base directory.
28
+ * Best when all cartridges are in a single directory.
29
+ *
30
+ * @param options - Normalizer options
31
+ * @returns Function that normalizes paths in a message string, or undefined if no options provided
32
+ *
33
+ * @example
34
+ * ```typescript
35
+ * // Using discovered cartridges (recommended)
36
+ * const cartridges = findCartridges('./my-project');
37
+ * const normalize = createPathNormalizer({ cartridges });
38
+ *
39
+ * // Using simple cartridge path
40
+ * const normalize = createPathNormalizer({ cartridgePath: './cartridges' });
41
+ *
42
+ * // Input: "(app_storefront/cartridge/controllers/Home.js:45)"
43
+ * // Output: "(./cartridges/app_storefront/cartridge/controllers/Home.js:45)"
44
+ * const normalized = normalize(logMessage);
45
+ * ```
46
+ */
47
+ export declare function createPathNormalizer(options: PathNormalizerOptions): ((message: string) => string) | undefined;
48
+ /**
49
+ * Discovers cartridges and creates a path normalizer automatically.
50
+ *
51
+ * This is a convenience function that combines `findCartridges` with
52
+ * `createPathNormalizer` for easy setup. Cartridge paths are converted
53
+ * to relative paths from the current working directory.
54
+ *
55
+ * @param directory - Directory to search for cartridges (defaults to cwd)
56
+ * @returns Path normalizer function, or undefined if no cartridges found
57
+ *
58
+ * @example
59
+ * ```typescript
60
+ * // Auto-discover cartridges from current directory
61
+ * const normalize = discoverAndCreateNormalizer();
62
+ *
63
+ * // Auto-discover from specific directory
64
+ * const normalize = discoverAndCreateNormalizer('./my-project');
65
+ * ```
66
+ */
67
+ export declare function discoverAndCreateNormalizer(directory?: string): ((message: string) => string) | undefined;
68
+ /**
69
+ * Extracts all cartridge paths from a message.
70
+ *
71
+ * Useful for testing or analysis of log messages.
72
+ *
73
+ * @param message - Log message to extract paths from
74
+ * @returns Array of extracted paths
75
+ *
76
+ * @example
77
+ * ```typescript
78
+ * const paths = extractPaths("Error at (app_storefront/cartridge/controllers/Home.js:45)");
79
+ * // Returns: ["app_storefront/cartridge/controllers/Home.js:45"]
80
+ * ```
81
+ */
82
+ export declare function extractPaths(message: string): string[];
@@ -0,0 +1,190 @@
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
+ */
6
+ /**
7
+ * Path normalization for B2C Commerce log files.
8
+ *
9
+ * Converts remote cartridge paths in log messages to local paths
10
+ * for IDE click-to-open functionality.
11
+ */
12
+ import path from 'node:path';
13
+ import { findCartridges } from '../code/cartridges.js';
14
+ /**
15
+ * Patterns for matching cartridge paths in various contexts.
16
+ *
17
+ * B2C Commerce log files can contain paths in various formats:
18
+ * - In parentheses: (app_storefront/cartridge/controllers/Home.js:45)
19
+ * - In quotes: 'app_storefront/cartridge/controllers/Home.js:45'
20
+ * - In stack traces: at app_storefront/cartridge/controllers/Home.js:45
21
+ * - Plain paths: app_storefront/cartridge/controllers/Home.js:45
22
+ */
23
+ const PATH_PATTERNS = [
24
+ // Parentheses: (cartridge_name/cartridge/path/file.js:line)
25
+ {
26
+ pattern: /\(([a-zA-Z0-9_-]+\/cartridge\/[^)]+)\)/g,
27
+ context: 'parentheses',
28
+ extractPath: (match) => match[1],
29
+ buildReplacement: (match, normalizedPath) => `(${normalizedPath})`,
30
+ },
31
+ // Single quotes: 'cartridge_name/cartridge/path/file.js:line'
32
+ {
33
+ pattern: /'([a-zA-Z0-9_-]+\/cartridge\/[^']+)'/g,
34
+ context: 'quotes',
35
+ extractPath: (match) => match[1],
36
+ buildReplacement: (match, normalizedPath) => `'${normalizedPath}'`,
37
+ },
38
+ // Double quotes: "cartridge_name/cartridge/path/file.js:line"
39
+ {
40
+ pattern: /"([a-zA-Z0-9_-]+\/cartridge\/[^"]+)"/g,
41
+ context: 'quotes',
42
+ extractPath: (match) => match[1],
43
+ buildReplacement: (match, normalizedPath) => `"${normalizedPath}"`,
44
+ },
45
+ // Stack trace: at cartridge_name/cartridge/path/file.js:line
46
+ {
47
+ pattern: /at\s+([a-zA-Z0-9_-]+\/cartridge\/[^\s]+)/g,
48
+ context: 'stacktrace',
49
+ extractPath: (match) => match[1],
50
+ buildReplacement: (match, normalizedPath) => `at ${normalizedPath}`,
51
+ },
52
+ ];
53
+ /**
54
+ * Creates a path normalizer function for converting remote cartridge paths
55
+ * to local paths in log messages.
56
+ *
57
+ * Supports two modes:
58
+ * 1. **Cartridge mappings** (precise): Uses discovered cartridges to map each
59
+ * cartridge name to its actual local path. Best for projects with cartridges
60
+ * in different locations.
61
+ * 2. **Cartridge path** (simple): Prefixes all paths with a base directory.
62
+ * Best when all cartridges are in a single directory.
63
+ *
64
+ * @param options - Normalizer options
65
+ * @returns Function that normalizes paths in a message string, or undefined if no options provided
66
+ *
67
+ * @example
68
+ * ```typescript
69
+ * // Using discovered cartridges (recommended)
70
+ * const cartridges = findCartridges('./my-project');
71
+ * const normalize = createPathNormalizer({ cartridges });
72
+ *
73
+ * // Using simple cartridge path
74
+ * const normalize = createPathNormalizer({ cartridgePath: './cartridges' });
75
+ *
76
+ * // Input: "(app_storefront/cartridge/controllers/Home.js:45)"
77
+ * // Output: "(./cartridges/app_storefront/cartridge/controllers/Home.js:45)"
78
+ * const normalized = normalize(logMessage);
79
+ * ```
80
+ */
81
+ export function createPathNormalizer(options) {
82
+ const { cartridgePath, cartridges } = options;
83
+ // If no options provided, return undefined
84
+ if (!cartridgePath && (!cartridges || cartridges.length === 0)) {
85
+ return undefined;
86
+ }
87
+ // Build a map of cartridge names to their local paths
88
+ const cartridgeMap = new Map();
89
+ if (cartridges) {
90
+ for (const c of cartridges) {
91
+ cartridgeMap.set(c.name, c.src);
92
+ }
93
+ }
94
+ // Normalize the fallback cartridge path (remove trailing slash)
95
+ const normalizedCartridgePath = cartridgePath?.replace(/\/+$/, '');
96
+ return (message) => {
97
+ let result = message;
98
+ for (const { pattern, extractPath, buildReplacement } of PATH_PATTERNS) {
99
+ // Create a fresh regex for each message (stateful with /g flag)
100
+ const regex = new RegExp(pattern.source, pattern.flags);
101
+ result = result.replace(regex, (...args) => {
102
+ // The full match is the first arg, captured groups follow
103
+ const match = args;
104
+ const remotePath = extractPath(match);
105
+ // Extract cartridge name from the path (first segment before /cartridge/)
106
+ const cartridgeName = remotePath.split('/')[0];
107
+ const restOfPath = remotePath.substring(cartridgeName.length);
108
+ // Try to find the cartridge in our mappings
109
+ const localCartridgePath = cartridgeMap.get(cartridgeName);
110
+ let localPath;
111
+ if (localCartridgePath) {
112
+ // Use the discovered cartridge's actual path
113
+ localPath = `${localCartridgePath}${restOfPath}`;
114
+ }
115
+ else if (normalizedCartridgePath) {
116
+ // Fall back to simple prefix mode
117
+ localPath = `${normalizedCartridgePath}/${remotePath}`;
118
+ }
119
+ else {
120
+ // No mapping and no fallback - return original
121
+ return match[0];
122
+ }
123
+ return buildReplacement(match, localPath);
124
+ });
125
+ }
126
+ return result;
127
+ };
128
+ }
129
+ /**
130
+ * Discovers cartridges and creates a path normalizer automatically.
131
+ *
132
+ * This is a convenience function that combines `findCartridges` with
133
+ * `createPathNormalizer` for easy setup. Cartridge paths are converted
134
+ * to relative paths from the current working directory.
135
+ *
136
+ * @param directory - Directory to search for cartridges (defaults to cwd)
137
+ * @returns Path normalizer function, or undefined if no cartridges found
138
+ *
139
+ * @example
140
+ * ```typescript
141
+ * // Auto-discover cartridges from current directory
142
+ * const normalize = discoverAndCreateNormalizer();
143
+ *
144
+ * // Auto-discover from specific directory
145
+ * const normalize = discoverAndCreateNormalizer('./my-project');
146
+ * ```
147
+ */
148
+ export function discoverAndCreateNormalizer(directory) {
149
+ const searchDir = directory ?? process.cwd();
150
+ const cwd = process.cwd();
151
+ const cartridges = findCartridges(searchDir);
152
+ if (cartridges.length === 0) {
153
+ return undefined;
154
+ }
155
+ // Convert absolute paths to relative paths from cwd
156
+ const relativeCartridges = cartridges.map((c) => ({
157
+ ...c,
158
+ src: './' + path.relative(cwd, c.src),
159
+ }));
160
+ return createPathNormalizer({ cartridges: relativeCartridges });
161
+ }
162
+ /**
163
+ * Extracts all cartridge paths from a message.
164
+ *
165
+ * Useful for testing or analysis of log messages.
166
+ *
167
+ * @param message - Log message to extract paths from
168
+ * @returns Array of extracted paths
169
+ *
170
+ * @example
171
+ * ```typescript
172
+ * const paths = extractPaths("Error at (app_storefront/cartridge/controllers/Home.js:45)");
173
+ * // Returns: ["app_storefront/cartridge/controllers/Home.js:45"]
174
+ * ```
175
+ */
176
+ export function extractPaths(message) {
177
+ const paths = [];
178
+ for (const { pattern, extractPath } of PATH_PATTERNS) {
179
+ const regex = new RegExp(pattern.source, pattern.flags);
180
+ let match;
181
+ while ((match = regex.exec(message)) !== null) {
182
+ const path = extractPath(match);
183
+ if (!paths.includes(path)) {
184
+ paths.push(path);
185
+ }
186
+ }
187
+ }
188
+ return paths;
189
+ }
190
+ //# sourceMappingURL=path-normalizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-normalizer.js","sourceRoot":"","sources":["../../../../src/operations/logs/path-normalizer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Log tailing operations for B2C Commerce.
3
+ */
4
+ import type { B2CInstance } from '../../instance/index.js';
5
+ import type { GetRecentLogsOptions, LogEntry, TailLogsOptions, TailLogsResult } from './types.js';
6
+ /**
7
+ * Parses the first line of a log entry to extract timestamp, level, and message.
8
+ *
9
+ * Expected format: [timestamp GMT] LEVEL context - message
10
+ * Example: [2025-01-25 10:30:45.123 GMT] ERROR PipelineCallServlet|... - Error message
11
+ *
12
+ * The message field will contain:
13
+ * - The content portion from the first line (after LEVEL)
14
+ * - Plus any continuation lines (stack traces, etc.)
15
+ *
16
+ * @param firstLine - First line of the log entry
17
+ * @param file - File name the entry came from
18
+ * @param fullMessage - Complete raw message including all lines
19
+ * @param pathNormalizer - Optional function to normalize paths in the message
20
+ * @returns Parsed log entry
21
+ */
22
+ export declare function parseLogEntry(firstLine: string, file: string, fullMessage: string, pathNormalizer?: (msg: string) => string): LogEntry;
23
+ /**
24
+ * Splits content into lines, handling incomplete lines at boundaries.
25
+ * Uses TextDecoder with stream mode for proper UTF-8 multi-byte character handling.
26
+ *
27
+ * @param content - ArrayBuffer content
28
+ * @param decoder - TextDecoder instance (should be reused for streaming)
29
+ * @param isComplete - Whether this is the final chunk (flush decoder)
30
+ * @returns Array of complete lines (without trailing incomplete line)
31
+ */
32
+ export declare function splitLines(content: ArrayBuffer, decoder: InstanceType<typeof TextDecoder>, isComplete?: boolean): string[];
33
+ /**
34
+ * Aggregates lines into multi-line log entries.
35
+ *
36
+ * B2C log entries can span multiple lines. A new entry starts when a line
37
+ * begins with a timestamp pattern: [YYYY-MM-DD HH:MM:SS.mmm GMT]
38
+ *
39
+ * @param lines - Array of individual lines
40
+ * @param pendingLines - Lines carried over from previous chunk (incomplete entry)
41
+ * @returns Object with complete entries and any pending lines for next chunk
42
+ */
43
+ export declare function aggregateLogEntries(lines: string[], pendingLines?: string[]): {
44
+ entries: string[][];
45
+ pending: string[];
46
+ };
47
+ /**
48
+ * Tails log files on a B2C Commerce instance.
49
+ *
50
+ * Continuously polls for new log content using HTTP Range requests for efficiency.
51
+ * Calls the onEntry callback for each new log line.
52
+ *
53
+ * @param instance - B2C instance to tail logs from
54
+ * @param options - Tailing options (filters, callbacks, polling interval)
55
+ * @returns Tail result with stop() control and done promise
56
+ *
57
+ * @example
58
+ * ```typescript
59
+ * const result = await tailLogs(instance, {
60
+ * prefixes: ['error', 'customerror'],
61
+ * onEntry: (entry) => console.log(`[${entry.file}] ${entry.message}`),
62
+ * onError: (err) => console.error('Tail error:', err),
63
+ * });
64
+ *
65
+ * // Stop after 10 seconds
66
+ * setTimeout(() => result.stop(), 10000);
67
+ *
68
+ * // Wait for tailing to complete
69
+ * await result.done;
70
+ * ```
71
+ */
72
+ export declare function tailLogs(instance: B2CInstance, options?: TailLogsOptions): Promise<TailLogsResult>;
73
+ /**
74
+ * Gets recent log entries (one-shot retrieval).
75
+ *
76
+ * Useful for MCP server integration or programmatic access without continuous tailing.
77
+ * Reads the tail end of log files and returns parsed entries.
78
+ *
79
+ * @param instance - B2C instance to get logs from
80
+ * @param options - Retrieval options
81
+ * @returns Array of recent log entries
82
+ *
83
+ * @example
84
+ * ```typescript
85
+ * // Get the last 50 error entries
86
+ * const entries = await getRecentLogs(instance, {
87
+ * prefixes: ['error'],
88
+ * maxEntries: 50
89
+ * });
90
+ * ```
91
+ */
92
+ export declare function getRecentLogs(instance: B2CInstance, options?: GetRecentLogsOptions): Promise<LogEntry[]>;