@bitrix24/b24jssdk 1.3.0 → 2.0.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 (440) hide show
  1. package/README-AI.md +3 -2
  2. package/README.md +2 -0
  3. package/dist/cjs/_virtual/_commonjsHelpers.cjs +19 -0
  4. package/dist/cjs/_virtual/_commonjsHelpers.cjs.map +1 -0
  5. package/dist/cjs/_virtual/protobuf.cjs +20 -0
  6. package/dist/cjs/_virtual/protobuf.cjs.map +1 -0
  7. package/dist/cjs/_virtual/protobuf2.cjs +14 -0
  8. package/dist/cjs/_virtual/protobuf2.cjs.map +1 -0
  9. package/dist/cjs/core/abstract-b24.cjs +357 -0
  10. package/dist/cjs/core/abstract-b24.cjs.map +1 -0
  11. package/dist/cjs/core/actions/abstract-action.cjs +26 -0
  12. package/dist/cjs/core/actions/abstract-action.cjs.map +1 -0
  13. package/dist/cjs/core/actions/abstract-batch.cjs +97 -0
  14. package/dist/cjs/core/actions/abstract-batch.cjs.map +1 -0
  15. package/dist/cjs/core/actions/manager.cjs +55 -0
  16. package/dist/cjs/core/actions/manager.cjs.map +1 -0
  17. package/dist/cjs/core/actions/v2/batch-by-chunk.cjs +95 -0
  18. package/dist/cjs/core/actions/v2/batch-by-chunk.cjs.map +1 -0
  19. package/dist/cjs/core/actions/v2/batch.cjs +128 -0
  20. package/dist/cjs/core/actions/v2/batch.cjs.map +1 -0
  21. package/dist/cjs/core/actions/v2/call-list.cjs +144 -0
  22. package/dist/cjs/core/actions/v2/call-list.cjs.map +1 -0
  23. package/dist/cjs/core/actions/v2/call.cjs +56 -0
  24. package/dist/cjs/core/actions/v2/call.cjs.map +1 -0
  25. package/dist/cjs/core/actions/v2/fetch-list.cjs +145 -0
  26. package/dist/cjs/core/actions/v2/fetch-list.cjs.map +1 -0
  27. package/dist/cjs/core/actions/v2/manager-v2.cjs +76 -0
  28. package/dist/cjs/core/actions/v2/manager-v2.cjs.map +1 -0
  29. package/dist/cjs/core/actions/v3/_keyset-paginate.cjs +69 -0
  30. package/dist/cjs/core/actions/v3/_keyset-paginate.cjs.map +1 -0
  31. package/dist/cjs/core/actions/v3/aggregate.cjs +96 -0
  32. package/dist/cjs/core/actions/v3/aggregate.cjs.map +1 -0
  33. package/dist/cjs/core/actions/v3/batch-by-chunk.cjs +93 -0
  34. package/dist/cjs/core/actions/v3/batch-by-chunk.cjs.map +1 -0
  35. package/dist/cjs/core/actions/v3/batch.cjs +122 -0
  36. package/dist/cjs/core/actions/v3/batch.cjs.map +1 -0
  37. package/dist/cjs/core/actions/v3/call-list.cjs +126 -0
  38. package/dist/cjs/core/actions/v3/call-list.cjs.map +1 -0
  39. package/dist/cjs/core/actions/v3/call-tail.cjs +118 -0
  40. package/dist/cjs/core/actions/v3/call-tail.cjs.map +1 -0
  41. package/dist/cjs/core/actions/v3/call.cjs +51 -0
  42. package/dist/cjs/core/actions/v3/call.cjs.map +1 -0
  43. package/dist/cjs/core/actions/v3/fetch-list.cjs +122 -0
  44. package/dist/cjs/core/actions/v3/fetch-list.cjs.map +1 -0
  45. package/dist/cjs/core/actions/v3/fetch-tail.cjs +112 -0
  46. package/dist/cjs/core/actions/v3/fetch-tail.cjs.map +1 -0
  47. package/dist/cjs/core/actions/v3/manager-v3.cjs +100 -0
  48. package/dist/cjs/core/actions/v3/manager-v3.cjs.map +1 -0
  49. package/dist/cjs/core/http/abstract-http.cjs +641 -0
  50. package/dist/cjs/core/http/abstract-http.cjs.map +1 -0
  51. package/dist/cjs/core/http/ajax-error.cjs +113 -0
  52. package/dist/cjs/core/http/ajax-error.cjs.map +1 -0
  53. package/dist/cjs/core/http/ajax-result.cjs +219 -0
  54. package/dist/cjs/core/http/ajax-result.cjs.map +1 -0
  55. package/dist/cjs/core/http/limiters/adaptive-delayer.cjs +137 -0
  56. package/dist/cjs/core/http/limiters/adaptive-delayer.cjs.map +1 -0
  57. package/dist/cjs/core/http/limiters/manager.cjs +373 -0
  58. package/dist/cjs/core/http/limiters/manager.cjs.map +1 -0
  59. package/dist/cjs/core/http/limiters/operating-limiter.cjs +173 -0
  60. package/dist/cjs/core/http/limiters/operating-limiter.cjs.map +1 -0
  61. package/dist/cjs/core/http/limiters/params-factory.cjs +124 -0
  62. package/dist/cjs/core/http/limiters/params-factory.cjs.map +1 -0
  63. package/dist/cjs/core/http/limiters/rate-limiter.cjs +404 -0
  64. package/dist/cjs/core/http/limiters/rate-limiter.cjs.map +1 -0
  65. package/dist/cjs/core/http/redact.cjs +85 -0
  66. package/dist/cjs/core/http/redact.cjs.map +1 -0
  67. package/dist/cjs/core/http/v2.cjs +85 -0
  68. package/dist/cjs/core/http/v2.cjs.map +1 -0
  69. package/dist/cjs/core/http/v3.cjs +82 -0
  70. package/dist/cjs/core/http/v3.cjs.map +1 -0
  71. package/dist/cjs/core/interaction/batch/abstract-interaction-batch.cjs +71 -0
  72. package/dist/cjs/core/interaction/batch/abstract-interaction-batch.cjs.map +1 -0
  73. package/dist/cjs/core/interaction/batch/parse-row.cjs +69 -0
  74. package/dist/cjs/core/interaction/batch/parse-row.cjs.map +1 -0
  75. package/dist/cjs/core/interaction/batch/processing/interface-strategy.cjs +87 -0
  76. package/dist/cjs/core/interaction/batch/processing/interface-strategy.cjs.map +1 -0
  77. package/dist/cjs/core/interaction/batch/processing/v2/abstract-processing.cjs +138 -0
  78. package/dist/cjs/core/interaction/batch/processing/v2/abstract-processing.cjs.map +1 -0
  79. package/dist/cjs/core/interaction/batch/processing/v2/as-array.cjs +34 -0
  80. package/dist/cjs/core/interaction/batch/processing/v2/as-array.cjs.map +1 -0
  81. package/dist/cjs/core/interaction/batch/processing/v2/as-object.cjs +34 -0
  82. package/dist/cjs/core/interaction/batch/processing/v2/as-object.cjs.map +1 -0
  83. package/dist/cjs/core/interaction/batch/processing/v3/abstract-processing.cjs +115 -0
  84. package/dist/cjs/core/interaction/batch/processing/v3/abstract-processing.cjs.map +1 -0
  85. package/dist/cjs/core/interaction/batch/processing/v3/as-array.cjs +34 -0
  86. package/dist/cjs/core/interaction/batch/processing/v3/as-array.cjs.map +1 -0
  87. package/dist/cjs/core/interaction/batch/processing/v3/as-object.cjs +34 -0
  88. package/dist/cjs/core/interaction/batch/processing/v3/as-object.cjs.map +1 -0
  89. package/dist/cjs/core/interaction/batch/v2.cjs +47 -0
  90. package/dist/cjs/core/interaction/batch/v2.cjs.map +1 -0
  91. package/dist/cjs/core/interaction/batch/v3.cjs +45 -0
  92. package/dist/cjs/core/interaction/batch/v3.cjs.map +1 -0
  93. package/dist/cjs/core/language/list.cjs +59 -0
  94. package/dist/cjs/core/language/list.cjs.map +1 -0
  95. package/dist/cjs/core/request-id-generator.cjs +44 -0
  96. package/dist/cjs/core/request-id-generator.cjs.map +1 -0
  97. package/dist/cjs/core/result.cjs +137 -0
  98. package/dist/cjs/core/result.cjs.map +1 -0
  99. package/dist/cjs/core/sdk-error.cjs +85 -0
  100. package/dist/cjs/core/sdk-error.cjs.map +1 -0
  101. package/dist/cjs/core/tools/abstract-tool.cjs +26 -0
  102. package/dist/cjs/core/tools/abstract-tool.cjs.map +1 -0
  103. package/dist/cjs/core/tools/healthcheck.cjs +50 -0
  104. package/dist/cjs/core/tools/healthcheck.cjs.map +1 -0
  105. package/dist/cjs/core/tools/manager.cjs +52 -0
  106. package/dist/cjs/core/tools/manager.cjs.map +1 -0
  107. package/dist/cjs/core/tools/ping.cjs +58 -0
  108. package/dist/cjs/core/tools/ping.cjs.map +1 -0
  109. package/dist/cjs/core/version-manager.cjs +57 -0
  110. package/dist/cjs/core/version-manager.cjs.map +1 -0
  111. package/dist/cjs/frame/auth.cjs +100 -0
  112. package/dist/cjs/frame/auth.cjs.map +1 -0
  113. package/dist/cjs/frame/b24.cjs +178 -0
  114. package/dist/cjs/frame/b24.cjs.map +1 -0
  115. package/dist/cjs/frame/dialog.cjs +120 -0
  116. package/dist/cjs/frame/dialog.cjs.map +1 -0
  117. package/dist/cjs/frame/frame.cjs +103 -0
  118. package/dist/cjs/frame/frame.cjs.map +1 -0
  119. package/dist/cjs/frame/message/commands.cjs +39 -0
  120. package/dist/cjs/frame/message/commands.cjs.map +1 -0
  121. package/dist/cjs/frame/message/controller.cjs +191 -0
  122. package/dist/cjs/frame/message/controller.cjs.map +1 -0
  123. package/dist/cjs/frame/options.cjs +108 -0
  124. package/dist/cjs/frame/options.cjs.map +1 -0
  125. package/dist/cjs/frame/parent.cjs +259 -0
  126. package/dist/cjs/frame/parent.cjs.map +1 -0
  127. package/dist/cjs/frame/placement.cjs +156 -0
  128. package/dist/cjs/frame/placement.cjs.map +1 -0
  129. package/dist/cjs/frame/slider.cjs +162 -0
  130. package/dist/cjs/frame/slider.cjs.map +1 -0
  131. package/dist/cjs/helper/abstract-helper.cjs +55 -0
  132. package/dist/cjs/helper/abstract-helper.cjs.map +1 -0
  133. package/dist/cjs/helper/app-manager.cjs +39 -0
  134. package/dist/cjs/helper/app-manager.cjs.map +1 -0
  135. package/dist/cjs/helper/currency-manager.cjs +215 -0
  136. package/dist/cjs/helper/currency-manager.cjs.map +1 -0
  137. package/dist/cjs/helper/helper-manager.cjs +397 -0
  138. package/dist/cjs/helper/helper-manager.cjs.map +1 -0
  139. package/dist/cjs/helper/license-manager.cjs +52 -0
  140. package/dist/cjs/helper/license-manager.cjs.map +1 -0
  141. package/dist/cjs/helper/options-manager.cjs +205 -0
  142. package/dist/cjs/helper/options-manager.cjs.map +1 -0
  143. package/dist/cjs/helper/payment-manager.cjs +35 -0
  144. package/dist/cjs/helper/payment-manager.cjs.map +1 -0
  145. package/dist/cjs/helper/profile-manager.cjs +35 -0
  146. package/dist/cjs/helper/profile-manager.cjs.map +1 -0
  147. package/dist/cjs/helper/use-b24-helper.cjs +85 -0
  148. package/dist/cjs/helper/use-b24-helper.cjs.map +1 -0
  149. package/dist/cjs/hook/auth.cjs +79 -0
  150. package/dist/cjs/hook/auth.cjs.map +1 -0
  151. package/dist/cjs/hook/b24.cjs +117 -0
  152. package/dist/cjs/hook/b24.cjs.map +1 -0
  153. package/dist/cjs/index.cjs +176 -0
  154. package/dist/cjs/index.cjs.map +1 -0
  155. package/dist/cjs/index.d.cts +6415 -0
  156. package/dist/cjs/index.d.mts +6415 -0
  157. package/dist/cjs/index.d.ts +6415 -0
  158. package/dist/cjs/loader-b24frame.cjs +103 -0
  159. package/dist/cjs/loader-b24frame.cjs.map +1 -0
  160. package/dist/cjs/logger/abstract-logger.cjs +71 -0
  161. package/dist/cjs/logger/abstract-logger.cjs.map +1 -0
  162. package/dist/cjs/logger/browser.cjs +165 -0
  163. package/dist/cjs/logger/browser.cjs.map +1 -0
  164. package/dist/cjs/logger/formatter/abstract-formatter.cjs +36 -0
  165. package/dist/cjs/logger/formatter/abstract-formatter.cjs.map +1 -0
  166. package/dist/cjs/logger/formatter/json-formatter.cjs +36 -0
  167. package/dist/cjs/logger/formatter/json-formatter.cjs.map +1 -0
  168. package/dist/cjs/logger/formatter/line-formatter.cjs +43 -0
  169. package/dist/cjs/logger/formatter/line-formatter.cjs.map +1 -0
  170. package/dist/cjs/logger/formatter/telegram-formatter.cjs +105 -0
  171. package/dist/cjs/logger/formatter/telegram-formatter.cjs.map +1 -0
  172. package/dist/cjs/logger/handler/abstract-handler.cjs +41 -0
  173. package/dist/cjs/logger/handler/abstract-handler.cjs.map +1 -0
  174. package/dist/cjs/logger/handler/consola-adapter.cjs +64 -0
  175. package/dist/cjs/logger/handler/consola-adapter.cjs.map +1 -0
  176. package/dist/cjs/logger/handler/console-handler.cjs +100 -0
  177. package/dist/cjs/logger/handler/console-handler.cjs.map +1 -0
  178. package/dist/cjs/logger/handler/console-v2-handler.cjs +53 -0
  179. package/dist/cjs/logger/handler/console-v2-handler.cjs.map +1 -0
  180. package/dist/cjs/logger/handler/memory-handler.cjs +50 -0
  181. package/dist/cjs/logger/handler/memory-handler.cjs.map +1 -0
  182. package/dist/cjs/logger/handler/stream-handler.cjs +75 -0
  183. package/dist/cjs/logger/handler/stream-handler.cjs.map +1 -0
  184. package/dist/cjs/logger/handler/telegram-handler.cjs +159 -0
  185. package/dist/cjs/logger/handler/telegram-handler.cjs.map +1 -0
  186. package/dist/cjs/logger/handler/winston-adapter.cjs +59 -0
  187. package/dist/cjs/logger/handler/winston-adapter.cjs.map +1 -0
  188. package/dist/cjs/logger/logger-factory.cjs +69 -0
  189. package/dist/cjs/logger/logger-factory.cjs.map +1 -0
  190. package/dist/cjs/logger/logger.cjs +78 -0
  191. package/dist/cjs/logger/logger.cjs.map +1 -0
  192. package/dist/cjs/logger/null-logger.cjs +34 -0
  193. package/dist/cjs/logger/null-logger.cjs.map +1 -0
  194. package/dist/cjs/logger/processor/memory-usage-processor.cjs +22 -0
  195. package/dist/cjs/logger/processor/memory-usage-processor.cjs.map +1 -0
  196. package/dist/cjs/logger/processor/pid-processor.cjs +22 -0
  197. package/dist/cjs/logger/processor/pid-processor.cjs.map +1 -0
  198. package/dist/cjs/oauth/auth.cjs +214 -0
  199. package/dist/cjs/oauth/auth.cjs.map +1 -0
  200. package/dist/cjs/oauth/b24.cjs +119 -0
  201. package/dist/cjs/oauth/b24.cjs.map +1 -0
  202. package/dist/cjs/oauth/refresh-token-error.cjs +22 -0
  203. package/dist/cjs/oauth/refresh-token-error.cjs.map +1 -0
  204. package/dist/cjs/pullClient/abstract-connector.cjs +80 -0
  205. package/dist/cjs/pullClient/abstract-connector.cjs.map +1 -0
  206. package/dist/cjs/pullClient/channel-manager.cjs +91 -0
  207. package/dist/cjs/pullClient/channel-manager.cjs.map +1 -0
  208. package/dist/cjs/pullClient/client.cjs +2177 -0
  209. package/dist/cjs/pullClient/client.cjs.map +1 -0
  210. package/dist/cjs/pullClient/errors.cjs +34 -0
  211. package/dist/cjs/pullClient/errors.cjs.map +1 -0
  212. package/dist/cjs/pullClient/json-rpc.cjs +213 -0
  213. package/dist/cjs/pullClient/json-rpc.cjs.map +1 -0
  214. package/dist/cjs/pullClient/long-polling-connector.cjs +159 -0
  215. package/dist/cjs/pullClient/long-polling-connector.cjs.map +1 -0
  216. package/dist/cjs/pullClient/protobuf/index.cjs +22 -0
  217. package/dist/cjs/pullClient/protobuf/index.cjs.map +1 -0
  218. package/dist/cjs/pullClient/protobuf/model.cjs +1060 -0
  219. package/dist/cjs/pullClient/protobuf/model.cjs.map +1 -0
  220. package/dist/cjs/pullClient/protobuf/protobuf.cjs +4655 -0
  221. package/dist/cjs/pullClient/protobuf/protobuf.cjs.map +1 -0
  222. package/dist/cjs/pullClient/shared-config.cjs +135 -0
  223. package/dist/cjs/pullClient/shared-config.cjs.map +1 -0
  224. package/dist/cjs/pullClient/storage-manager.cjs +74 -0
  225. package/dist/cjs/pullClient/storage-manager.cjs.map +1 -0
  226. package/dist/cjs/pullClient/web-socket-connector.cjs +131 -0
  227. package/dist/cjs/pullClient/web-socket-connector.cjs.map +1 -0
  228. package/dist/cjs/tools/batch-ref-v3.cjs +54 -0
  229. package/dist/cjs/tools/batch-ref-v3.cjs.map +1 -0
  230. package/dist/cjs/tools/browser.cjs +156 -0
  231. package/dist/cjs/tools/browser.cjs.map +1 -0
  232. package/dist/cjs/tools/environment.cjs +32 -0
  233. package/dist/cjs/tools/environment.cjs.map +1 -0
  234. package/dist/cjs/tools/filter-v3.cjs +139 -0
  235. package/dist/cjs/tools/filter-v3.cjs.map +1 -0
  236. package/dist/cjs/tools/formatters/iban.cjs +307 -0
  237. package/dist/cjs/tools/formatters/iban.cjs.map +1 -0
  238. package/dist/cjs/tools/formatters/numbers.cjs +68 -0
  239. package/dist/cjs/tools/formatters/numbers.cjs.map +1 -0
  240. package/dist/cjs/tools/index.cjs +42 -0
  241. package/dist/cjs/tools/index.cjs.map +1 -0
  242. package/dist/cjs/tools/scroll-size.cjs +29 -0
  243. package/dist/cjs/tools/scroll-size.cjs.map +1 -0
  244. package/dist/cjs/tools/text.cjs +210 -0
  245. package/dist/cjs/tools/text.cjs.map +1 -0
  246. package/dist/cjs/tools/type.cjs +339 -0
  247. package/dist/cjs/tools/type.cjs.map +1 -0
  248. package/dist/cjs/tools/use-formatters.cjs +462 -0
  249. package/dist/cjs/tools/use-formatters.cjs.map +1 -0
  250. package/dist/cjs/tools/uuidv7.cjs +58 -0
  251. package/dist/cjs/tools/uuidv7.cjs.map +1 -0
  252. package/dist/cjs/types/b24-helper.cjs +62 -0
  253. package/dist/cjs/types/b24-helper.cjs.map +1 -0
  254. package/dist/cjs/types/b24.cjs +18 -0
  255. package/dist/cjs/types/b24.cjs.map +1 -0
  256. package/dist/cjs/types/bizproc/index.cjs +195 -0
  257. package/dist/cjs/types/bizproc/index.cjs.map +1 -0
  258. package/dist/cjs/types/catalog/index.cjs +39 -0
  259. package/dist/cjs/types/catalog/index.cjs.map +1 -0
  260. package/dist/cjs/types/common.cjs +33 -0
  261. package/dist/cjs/types/common.cjs.map +1 -0
  262. package/dist/cjs/types/crm/entity-type.cjs +62 -0
  263. package/dist/cjs/types/crm/entity-type.cjs.map +1 -0
  264. package/dist/cjs/types/crm/productrow.cjs +19 -0
  265. package/dist/cjs/types/crm/productrow.cjs.map +1 -0
  266. package/dist/cjs/types/logger.cjs +24 -0
  267. package/dist/cjs/types/logger.cjs.map +1 -0
  268. package/dist/cjs/types/pull.cjs +94 -0
  269. package/dist/cjs/types/pull.cjs.map +1 -0
  270. package/dist/esm/_virtual/_commonjsHelpers.mjs +1 -1
  271. package/dist/esm/_virtual/protobuf.mjs +1 -1
  272. package/dist/esm/_virtual/protobuf2.mjs +1 -1
  273. package/dist/esm/core/abstract-b24.mjs +1 -1
  274. package/dist/esm/core/actions/abstract-action.mjs +1 -1
  275. package/dist/esm/core/actions/abstract-batch.mjs +1 -1
  276. package/dist/esm/core/actions/manager.mjs +1 -1
  277. package/dist/esm/core/actions/v2/batch-by-chunk.mjs +1 -1
  278. package/dist/esm/core/actions/v2/batch.mjs +1 -1
  279. package/dist/esm/core/actions/v2/call-list.mjs +1 -1
  280. package/dist/esm/core/actions/v2/call.mjs +1 -15
  281. package/dist/esm/core/actions/v2/call.mjs.map +1 -1
  282. package/dist/esm/core/actions/v2/fetch-list.mjs +1 -1
  283. package/dist/esm/core/actions/v2/manager-v2.mjs +1 -1
  284. package/dist/esm/core/actions/v3/_keyset-paginate.mjs +66 -0
  285. package/dist/esm/core/actions/v3/_keyset-paginate.mjs.map +1 -0
  286. package/dist/esm/core/actions/v3/aggregate.mjs +94 -0
  287. package/dist/esm/core/actions/v3/aggregate.mjs.map +1 -0
  288. package/dist/esm/core/actions/v3/batch-by-chunk.mjs +1 -1
  289. package/dist/esm/core/actions/v3/batch.mjs +1 -10
  290. package/dist/esm/core/actions/v3/batch.mjs.map +1 -1
  291. package/dist/esm/core/actions/v3/call-list.mjs +30 -44
  292. package/dist/esm/core/actions/v3/call-list.mjs.map +1 -1
  293. package/dist/esm/core/actions/v3/call-tail.mjs +116 -0
  294. package/dist/esm/core/actions/v3/call-tail.mjs.map +1 -0
  295. package/dist/esm/core/actions/v3/call.mjs +1 -10
  296. package/dist/esm/core/actions/v3/call.mjs.map +1 -1
  297. package/dist/esm/core/actions/v3/fetch-list.mjs +24 -41
  298. package/dist/esm/core/actions/v3/fetch-list.mjs.map +1 -1
  299. package/dist/esm/core/actions/v3/fetch-tail.mjs +110 -0
  300. package/dist/esm/core/actions/v3/fetch-tail.mjs.map +1 -0
  301. package/dist/esm/core/actions/v3/manager-v3.mjs +25 -1
  302. package/dist/esm/core/actions/v3/manager-v3.mjs.map +1 -1
  303. package/dist/esm/core/http/abstract-http.mjs +68 -17
  304. package/dist/esm/core/http/abstract-http.mjs.map +1 -1
  305. package/dist/esm/core/http/ajax-error.mjs +1 -1
  306. package/dist/esm/core/http/ajax-result.mjs +9 -8
  307. package/dist/esm/core/http/ajax-result.mjs.map +1 -1
  308. package/dist/esm/core/http/limiters/adaptive-delayer.mjs +1 -1
  309. package/dist/esm/core/http/limiters/manager.mjs +1 -1
  310. package/dist/esm/core/http/limiters/operating-limiter.mjs +1 -1
  311. package/dist/esm/core/http/limiters/params-factory.mjs +1 -1
  312. package/dist/esm/core/http/limiters/rate-limiter.mjs +1 -1
  313. package/dist/esm/core/http/redact.mjs +41 -13
  314. package/dist/esm/core/http/redact.mjs.map +1 -1
  315. package/dist/esm/core/http/v2.mjs +1 -18
  316. package/dist/esm/core/http/v2.mjs.map +1 -1
  317. package/dist/esm/core/http/v3.mjs +1 -15
  318. package/dist/esm/core/http/v3.mjs.map +1 -1
  319. package/dist/esm/core/interaction/batch/abstract-interaction-batch.mjs +1 -1
  320. package/dist/esm/core/interaction/batch/parse-row.mjs +1 -1
  321. package/dist/esm/core/interaction/batch/processing/interface-strategy.mjs +44 -1
  322. package/dist/esm/core/interaction/batch/processing/interface-strategy.mjs.map +1 -1
  323. package/dist/esm/core/interaction/batch/processing/v2/abstract-processing.mjs +7 -6
  324. package/dist/esm/core/interaction/batch/processing/v2/abstract-processing.mjs.map +1 -1
  325. package/dist/esm/core/interaction/batch/processing/v2/as-array.mjs +3 -3
  326. package/dist/esm/core/interaction/batch/processing/v2/as-array.mjs.map +1 -1
  327. package/dist/esm/core/interaction/batch/processing/v2/as-object.mjs +1 -1
  328. package/dist/esm/core/interaction/batch/processing/v3/abstract-processing.mjs +7 -19
  329. package/dist/esm/core/interaction/batch/processing/v3/abstract-processing.mjs.map +1 -1
  330. package/dist/esm/core/interaction/batch/processing/v3/as-array.mjs +3 -3
  331. package/dist/esm/core/interaction/batch/processing/v3/as-array.mjs.map +1 -1
  332. package/dist/esm/core/interaction/batch/processing/v3/as-object.mjs +1 -1
  333. package/dist/esm/core/interaction/batch/v2.mjs +1 -1
  334. package/dist/esm/core/interaction/batch/v3.mjs +1 -1
  335. package/dist/esm/core/language/list.mjs +1 -1
  336. package/dist/esm/core/request-id-generator.mjs +1 -1
  337. package/dist/esm/core/result.mjs +11 -4
  338. package/dist/esm/core/result.mjs.map +1 -1
  339. package/dist/esm/core/sdk-error.mjs +1 -1
  340. package/dist/esm/core/tools/abstract-tool.mjs +1 -1
  341. package/dist/esm/core/tools/healthcheck.mjs +1 -1
  342. package/dist/esm/core/tools/manager.mjs +1 -1
  343. package/dist/esm/core/tools/ping.mjs +1 -1
  344. package/dist/esm/core/version-manager.mjs +19 -157
  345. package/dist/esm/core/version-manager.mjs.map +1 -1
  346. package/dist/esm/frame/auth.mjs +1 -1
  347. package/dist/esm/frame/b24.mjs +8 -2
  348. package/dist/esm/frame/b24.mjs.map +1 -1
  349. package/dist/esm/frame/dialog.mjs +1 -1
  350. package/dist/esm/frame/frame.mjs +1 -1
  351. package/dist/esm/frame/message/commands.mjs +1 -1
  352. package/dist/esm/frame/message/controller.mjs +17 -6
  353. package/dist/esm/frame/message/controller.mjs.map +1 -1
  354. package/dist/esm/frame/options.mjs +1 -1
  355. package/dist/esm/frame/parent.mjs +1 -1
  356. package/dist/esm/frame/placement.mjs +1 -1
  357. package/dist/esm/frame/slider.mjs +1 -1
  358. package/dist/esm/helper/abstract-helper.mjs +1 -1
  359. package/dist/esm/helper/app-manager.mjs +1 -1
  360. package/dist/esm/helper/currency-manager.mjs +1 -1
  361. package/dist/esm/helper/helper-manager.mjs +1 -1
  362. package/dist/esm/helper/license-manager.mjs +1 -1
  363. package/dist/esm/helper/options-manager.mjs +1 -1
  364. package/dist/esm/helper/payment-manager.mjs +1 -1
  365. package/dist/esm/helper/profile-manager.mjs +1 -1
  366. package/dist/esm/helper/use-b24-helper.mjs +1 -1
  367. package/dist/esm/hook/auth.mjs +1 -1
  368. package/dist/esm/hook/b24.mjs +3 -3
  369. package/dist/esm/hook/b24.mjs.map +1 -1
  370. package/dist/esm/index.d.mts +412 -39
  371. package/dist/esm/index.d.ts +412 -39
  372. package/dist/esm/index.mjs +3 -1
  373. package/dist/esm/index.mjs.map +1 -1
  374. package/dist/esm/loader-b24frame.mjs +1 -1
  375. package/dist/esm/logger/abstract-logger.mjs +1 -1
  376. package/dist/esm/logger/browser.mjs +1 -1
  377. package/dist/esm/logger/formatter/abstract-formatter.mjs +1 -1
  378. package/dist/esm/logger/formatter/json-formatter.mjs +1 -1
  379. package/dist/esm/logger/formatter/line-formatter.mjs +1 -1
  380. package/dist/esm/logger/formatter/telegram-formatter.mjs +1 -1
  381. package/dist/esm/logger/handler/abstract-handler.mjs +1 -1
  382. package/dist/esm/logger/handler/consola-adapter.mjs +1 -1
  383. package/dist/esm/logger/handler/console-handler.mjs +1 -1
  384. package/dist/esm/logger/handler/console-v2-handler.mjs +1 -1
  385. package/dist/esm/logger/handler/memory-handler.mjs +1 -1
  386. package/dist/esm/logger/handler/stream-handler.mjs +1 -1
  387. package/dist/esm/logger/handler/telegram-handler.mjs +1 -1
  388. package/dist/esm/logger/handler/winston-adapter.mjs +1 -1
  389. package/dist/esm/logger/logger-factory.mjs +1 -1
  390. package/dist/esm/logger/logger.mjs +1 -1
  391. package/dist/esm/logger/null-logger.mjs +1 -1
  392. package/dist/esm/logger/processor/memory-usage-processor.mjs +1 -1
  393. package/dist/esm/logger/processor/pid-processor.mjs +1 -1
  394. package/dist/esm/oauth/auth.mjs +13 -16
  395. package/dist/esm/oauth/auth.mjs.map +1 -1
  396. package/dist/esm/oauth/b24.mjs +1 -1
  397. package/dist/esm/oauth/refresh-token-error.mjs +1 -1
  398. package/dist/esm/pullClient/abstract-connector.mjs +1 -1
  399. package/dist/esm/pullClient/channel-manager.mjs +1 -1
  400. package/dist/esm/pullClient/client.mjs +141 -30
  401. package/dist/esm/pullClient/client.mjs.map +1 -1
  402. package/dist/esm/pullClient/errors.mjs +1 -1
  403. package/dist/esm/pullClient/json-rpc.mjs +5 -4
  404. package/dist/esm/pullClient/json-rpc.mjs.map +1 -1
  405. package/dist/esm/pullClient/long-polling-connector.mjs +1 -1
  406. package/dist/esm/pullClient/protobuf/index.mjs +1 -1
  407. package/dist/esm/pullClient/protobuf/model.mjs +1 -1
  408. package/dist/esm/pullClient/protobuf/protobuf.mjs +1 -1
  409. package/dist/esm/pullClient/shared-config.mjs +1 -1
  410. package/dist/esm/pullClient/storage-manager.mjs +1 -1
  411. package/dist/esm/pullClient/web-socket-connector.mjs +1 -1
  412. package/dist/esm/tools/batch-ref-v3.mjs +52 -0
  413. package/dist/esm/tools/batch-ref-v3.mjs.map +1 -0
  414. package/dist/esm/tools/browser.mjs +1 -1
  415. package/dist/esm/tools/environment.mjs +1 -1
  416. package/dist/esm/tools/filter-v3.mjs +137 -0
  417. package/dist/esm/tools/filter-v3.mjs.map +1 -0
  418. package/dist/esm/tools/formatters/iban.mjs +1 -1
  419. package/dist/esm/tools/formatters/numbers.mjs +1 -1
  420. package/dist/esm/tools/index.mjs +1 -1
  421. package/dist/esm/tools/scroll-size.mjs +1 -1
  422. package/dist/esm/tools/text.mjs +1 -1
  423. package/dist/esm/tools/type.mjs +1 -1
  424. package/dist/esm/tools/use-formatters.mjs +1 -1
  425. package/dist/esm/tools/uuidv7.mjs +1 -1
  426. package/dist/esm/types/b24-helper.mjs +1 -1
  427. package/dist/esm/types/b24.mjs +1 -1
  428. package/dist/esm/types/bizproc/index.mjs +1 -1
  429. package/dist/esm/types/catalog/index.mjs +1 -1
  430. package/dist/esm/types/common.mjs +1 -1
  431. package/dist/esm/types/crm/entity-type.mjs +1 -1
  432. package/dist/esm/types/crm/productrow.mjs +1 -1
  433. package/dist/esm/types/logger.mjs +1 -1
  434. package/dist/esm/types/pull.mjs +1 -1
  435. package/dist/umd/index.js +1258 -719
  436. package/dist/umd/index.js.map +1 -1
  437. package/dist/umd/index.min.js +26 -26
  438. package/dist/umd/index.min.js.map +1 -1
  439. package/dist/umd/package.json +3 -0
  440. package/package.json +12 -4
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * @package @bitrix24/b24jssdk
3
- * @version 1.3.0
3
+ * @version 2.0.0
4
4
  * @copyright (c) 2026 Bitrix24
5
5
  * @license MIT
6
6
  * @see https://github.com/bitrix24/b24jssdk
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * @package @bitrix24/b24jssdk
3
- * @version 1.3.0
3
+ * @version 2.0.0
4
4
  * @copyright (c) 2026 Bitrix24
5
5
  * @license MIT
6
6
  * @see https://github.com/bitrix24/b24jssdk
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * @package @bitrix24/b24jssdk
3
- * @version 1.3.0
3
+ * @version 2.0.0
4
4
  * @copyright (c) 2026 Bitrix24
5
5
  * @license MIT
6
6
  * @see https://github.com/bitrix24/b24jssdk
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * @package @bitrix24/b24jssdk
3
- * @version 1.3.0
3
+ * @version 2.0.0
4
4
  * @copyright (c) 2026 Bitrix24
5
5
  * @license MIT
6
6
  * @see https://github.com/bitrix24/b24jssdk
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * @package @bitrix24/b24jssdk
3
- * @version 1.3.0
3
+ * @version 2.0.0
4
4
  * @copyright (c) 2026 Bitrix24
5
5
  * @license MIT
6
6
  * @see https://github.com/bitrix24/b24jssdk
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * @package @bitrix24/b24jssdk
3
- * @version 1.3.0
3
+ * @version 2.0.0
4
4
  * @copyright (c) 2026 Bitrix24
5
5
  * @license MIT
6
6
  * @see https://github.com/bitrix24/b24jssdk
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * @package @bitrix24/b24jssdk
3
- * @version 1.3.0
3
+ * @version 2.0.0
4
4
  * @copyright (c) 2026 Bitrix24
5
5
  * @license MIT
6
6
  * @see https://github.com/bitrix24/b24jssdk
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * @package @bitrix24/b24jssdk
3
- * @version 1.3.0
3
+ * @version 2.0.0
4
4
  * @copyright (c) 2026 Bitrix24
5
5
  * @license MIT
6
6
  * @see https://github.com/bitrix24/b24jssdk
@@ -1,15 +1,13 @@
1
1
  /**
2
2
  * @package @bitrix24/b24jssdk
3
- * @version 1.3.0
3
+ * @version 2.0.0
4
4
  * @copyright (c) 2026 Bitrix24
5
5
  * @license MIT
6
6
  * @see https://github.com/bitrix24/b24jssdk
7
7
  * @see https://bitrix24.github.io/b24jssdk/
8
8
  */
9
9
  import { AbstractAction } from '../abstract-action.mjs';
10
- import { versionManager } from '../../version-manager.mjs';
11
10
  import { ApiVersion } from '../../../types/b24.mjs';
12
- import { LoggerFactory } from '../../../logger/logger-factory.mjs';
13
11
 
14
12
  var __defProp = Object.defineProperty;
15
13
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
@@ -47,18 +45,6 @@ class CallV2 extends AbstractAction {
47
45
  * console.log(response.getData().result.item.name)
48
46
  */
49
47
  async make(options) {
50
- if (versionManager.isSupport(ApiVersion.v3, options.method)) {
51
- LoggerFactory.forcedLog(
52
- this._logger,
53
- "warning",
54
- `The method ${options.method} is available in restApi:v3. It's worth migrating to the new API.`,
55
- {
56
- method: options.method,
57
- requestId: options.requestId,
58
- code: "JSSDK_CORE_METHOD_AVAILABLE_IN_API_V3"
59
- }
60
- );
61
- }
62
48
  const params = options.params || {};
63
49
  return this._b24.getHttpClient(ApiVersion.v2).call(options.method, params, options.requestId);
64
50
  }
@@ -1 +1 @@
1
- {"version":3,"file":"call.mjs","sources":["../../../../../src/core/actions/v2/call.ts"],"sourcesContent":["import type { ActionOptions } from '../abstract-action'\nimport type { TypeCallParams } from '../../../types/http'\nimport type { AjaxResult } from '../../http/ajax-result'\nimport { AbstractAction } from '../abstract-action'\nimport { versionManager } from '../../version-manager'\nimport { ApiVersion } from '../../../types/b24'\nimport { LoggerFactory } from '../../../logger'\n\nexport type ActionCallV2 = ActionOptions & {\n method: string\n params?: TypeCallParams\n requestId?: string\n}\n\n/**\n * Calls the Bitrix24 REST API method `restApi:v2`\n *\n * @todo add docs\n */\nexport class CallV2 extends AbstractAction {\n /**\n * Calls the Bitrix24 REST API method.\n *\n * @template T - The expected data type in the response (default is `unknown`).\n *\n * @param {ActionCallV2} options - parameters for executing the request.\n * - `method: string` - REST API method name (eg: `crm.item.get`)\n * - `params?: TypeCallParams` - Parameters for calling the method.\n * - `requestId?: string` - Unique request identifier for tracking. Used for query deduplication and debugging.\n *\n * @returns {Promise<AjaxResult<T>>} A promise that resolves to the result of an REST API call.\n *\n * @example\n * import { EnumCrmEntityTypeId } from '@bitrix24/b24jssdk'\n *\n * interface CrmItem { id: number, name: string, lastName: string }\n * const response = await b24.actions.v2.call.make<{ item: CrmItem }>({\n * method: 'crm.item.get',\n * params: {\n * entityTypeId: EnumCrmEntityTypeId.contact,\n * id: 123\n * },\n * requestId: 'item-123'\n * })\n * if (!response.isSuccess) {\n * throw new Error(`Problem: ${response.getErrorMessages().join('; ')}`)\n * }\n * console.log(response.getData().result.item.name)\n */\n public override async make<T = unknown>(options: ActionCallV2): Promise<AjaxResult<T>> {\n if (versionManager.isSupport(ApiVersion.v3, options.method)) {\n LoggerFactory.forcedLog(\n this._logger,\n 'warning',\n `The method ${options.method} is available in restApi:v3. It's worth migrating to the new API.`,\n {\n method: options.method,\n requestId: options.requestId,\n code: 'JSSDK_CORE_METHOD_AVAILABLE_IN_API_V3'\n }\n )\n }\n\n const params = options.params || {}\n return this._b24.getHttpClient(ApiVersion.v2).call<T>(options.method, params, options.requestId)\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AAmBO,MAAM,eAAe,cAAA,CAAe;AAAA,EAnB3C;AAmB2C,IAAA,MAAA,CAAA,IAAA,EAAA,QAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA8BzC,MAAsB,KAAkB,OAAA,EAA+C;AACrF,IAAA,IAAI,eAAe,SAAA,CAAU,UAAA,CAAW,EAAA,EAAI,OAAA,CAAQ,MAAM,CAAA,EAAG;AAC3D,MAAA,aAAA,CAAc,SAAA;AAAA,QACZ,IAAA,CAAK,OAAA;AAAA,QACL,SAAA;AAAA,QACA,CAAA,WAAA,EAAc,QAAQ,MAAM,CAAA,iEAAA,CAAA;AAAA,QAC5B;AAAA,UACE,QAAQ,OAAA,CAAQ,MAAA;AAAA,UAChB,WAAW,OAAA,CAAQ,SAAA;AAAA,UACnB,IAAA,EAAM;AAAA;AACR,OACF;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,EAAC;AAClC,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,UAAA,CAAW,EAAE,CAAA,CAAE,IAAA,CAAQ,OAAA,CAAQ,MAAA,EAAQ,MAAA,EAAQ,OAAA,CAAQ,SAAS,CAAA;AAAA,EACjG;AACF;;;;"}
1
+ {"version":3,"file":"call.mjs","sources":["../../../../../src/core/actions/v2/call.ts"],"sourcesContent":["import type { ActionOptions } from '../abstract-action'\nimport type { TypeCallParams } from '../../../types/http'\nimport type { AjaxResult } from '../../http/ajax-result'\nimport { AbstractAction } from '../abstract-action'\nimport { ApiVersion } from '../../../types/b24'\n\nexport type ActionCallV2 = ActionOptions & {\n method: string\n params?: TypeCallParams\n requestId?: string\n}\n\n/**\n * Calls the Bitrix24 REST API method `restApi:v2`\n *\n * @todo add docs\n */\nexport class CallV2 extends AbstractAction {\n /**\n * Calls the Bitrix24 REST API method.\n *\n * @template T - The expected data type in the response (default is `unknown`).\n *\n * @param {ActionCallV2} options - parameters for executing the request.\n * - `method: string` - REST API method name (eg: `crm.item.get`)\n * - `params?: TypeCallParams` - Parameters for calling the method.\n * - `requestId?: string` - Unique request identifier for tracking. Used for query deduplication and debugging.\n *\n * @returns {Promise<AjaxResult<T>>} A promise that resolves to the result of an REST API call.\n *\n * @example\n * import { EnumCrmEntityTypeId } from '@bitrix24/b24jssdk'\n *\n * interface CrmItem { id: number, name: string, lastName: string }\n * const response = await b24.actions.v2.call.make<{ item: CrmItem }>({\n * method: 'crm.item.get',\n * params: {\n * entityTypeId: EnumCrmEntityTypeId.contact,\n * id: 123\n * },\n * requestId: 'item-123'\n * })\n * if (!response.isSuccess) {\n * throw new Error(`Problem: ${response.getErrorMessages().join('; ')}`)\n * }\n * console.log(response.getData().result.item.name)\n */\n public override async make<T = unknown>(options: ActionCallV2): Promise<AjaxResult<T>> {\n const params = options.params || {}\n return this._b24.getHttpClient(ApiVersion.v2).call<T>(options.method, params, options.requestId)\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;AAiBO,MAAM,eAAe,cAAA,CAAe;AAAA,EAjB3C;AAiB2C,IAAA,MAAA,CAAA,IAAA,EAAA,QAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA8BzC,MAAsB,KAAkB,OAAA,EAA+C;AACrF,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,EAAC;AAClC,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,UAAA,CAAW,EAAE,CAAA,CAAE,IAAA,CAAQ,OAAA,CAAQ,MAAA,EAAQ,MAAA,EAAQ,OAAA,CAAQ,SAAS,CAAA;AAAA,EACjG;AACF;;;;"}
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * @package @bitrix24/b24jssdk
3
- * @version 1.3.0
3
+ * @version 2.0.0
4
4
  * @copyright (c) 2026 Bitrix24
5
5
  * @license MIT
6
6
  * @see https://github.com/bitrix24/b24jssdk
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * @package @bitrix24/b24jssdk
3
- * @version 1.3.0
3
+ * @version 2.0.0
4
4
  * @copyright (c) 2026 Bitrix24
5
5
  * @license MIT
6
6
  * @see https://github.com/bitrix24/b24jssdk
@@ -0,0 +1,66 @@
1
+ /**
2
+ * @package @bitrix24/b24jssdk
3
+ * @version 2.0.0
4
+ * @copyright (c) 2026 Bitrix24
5
+ * @license MIT
6
+ * @see https://github.com/bitrix24/b24jssdk
7
+ * @see https://bitrix24.github.io/b24jssdk/
8
+ */
9
+ var __defProp = Object.defineProperty;
10
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
11
+ class KeysetPaginationError extends Error {
12
+ static {
13
+ __name(this, "KeysetPaginationError");
14
+ }
15
+ errors;
16
+ messages;
17
+ constructor(errors, messages) {
18
+ super(messages.join("; "));
19
+ this.name = "KeysetPaginationError";
20
+ this.errors = errors;
21
+ this.messages = messages;
22
+ }
23
+ }
24
+ async function* keysetPaginate(b24, logger, strategy) {
25
+ let cursor = strategy.initialCursor;
26
+ let maxPageSize = 0;
27
+ while (true) {
28
+ const response = await b24.actions.v3.call.make({
29
+ method: strategy.method,
30
+ params: strategy.buildParams(cursor),
31
+ requestId: strategy.requestId
32
+ });
33
+ if (!response.isSuccess) {
34
+ logger.error(strategy.errorLabel, {
35
+ method: strategy.method,
36
+ requestId: strategy.requestId,
37
+ messages: response.getErrorMessages()
38
+ });
39
+ throw new KeysetPaginationError(response.errors, response.getErrorMessages());
40
+ }
41
+ const responseData = response.getData();
42
+ if (!responseData) {
43
+ break;
44
+ }
45
+ const resultData = responseData.result[strategy.customKeyForResult];
46
+ if (!Array.isArray(resultData) || resultData.length === 0) {
47
+ break;
48
+ }
49
+ yield resultData;
50
+ maxPageSize = Math.max(maxPageSize, resultData.length);
51
+ if (resultData.length < maxPageSize) {
52
+ break;
53
+ }
54
+ const lastItem = resultData[resultData.length - 1];
55
+ const next = lastItem ? strategy.readNextCursor(lastItem) : null;
56
+ if (next === null || next === void 0) {
57
+ logger.warning(strategy.noCursorWarning);
58
+ break;
59
+ }
60
+ cursor = next;
61
+ }
62
+ }
63
+ __name(keysetPaginate, "keysetPaginate");
64
+
65
+ export { KeysetPaginationError, keysetPaginate };
66
+ //# sourceMappingURL=_keyset-paginate.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_keyset-paginate.mjs","sources":["../../../../../src/core/actions/v3/_keyset-paginate.ts"],"sourcesContent":["import type { TypeB24 } from '../../../types/b24'\nimport type { LoggerInterface } from '../../../types/logger'\nimport type { TypeCallParams } from '../../../types/http'\nimport type { AjaxResult } from '../../http/ajax-result'\n\n/**\n * Thrown by {@link keysetPaginate} when the underlying v3 `call` reports a soft\n * error part-way through a walk. It carries both the raw `[key, Error]` entries\n * (so the eager `call*` helpers can fold them into a `Result` via `addError`)\n * and the flat messages (so the streaming `fetch*` helpers can rethrow as their\n * own action-specific `SdkError`).\n */\nexport class KeysetPaginationError extends Error {\n public readonly errors: Iterable<[string, Error]>\n public readonly messages: string[]\n\n constructor(errors: Iterable<[string, Error]>, messages: string[]) {\n super(messages.join('; '))\n this.name = 'KeysetPaginationError'\n this.errors = errors\n this.messages = messages\n }\n}\n\n/**\n * Per-helper plug-ins that adapt the shared keyset loop to either the emulated\n * `list` cursor (a `[field, '>', n]` filter) or the native `tail` cursor.\n */\nexport type KeysetPaginateStrategy = {\n /** REST API method name (e.g. `tasks.task.list`, `main.eventlog.tail`). */\n method: string\n /** Optional request id forwarded to `call`. */\n requestId?: string\n /** Key under `result` that holds the row array (e.g. `items`). */\n customKeyForResult: string | null\n /** Cursor value used for the very first page. */\n initialCursor: number | string\n /** Build the per-page request params for a given cursor value. */\n buildParams: (cursor: number | string) => TypeCallParams\n /**\n * Read the next cursor value from the last item of a full page. Return `null`\n * to stop pagination — used when the cursor field cannot be read from the\n * response (the loop logs {@link KeysetPaginateStrategy.noCursorWarning}).\n */\n readNextCursor: (lastItem: Record<string, any>) => number | string | null\n /** Logged at `warning` level when `readNextCursor` returns `null`. */\n noCursorWarning: string\n /** Label logged at `error` level when the underlying `call` fails. */\n errorLabel: string\n}\n\n/**\n * Shared keyset-pagination driver for the v3 list/tail helpers\n * (`callList`/`fetchList` and `callTail`/`fetchTail`).\n *\n * It repeatedly calls `actions.v3.call`, yields each page, and advances the\n * cursor until the data runs out. End-of-data is detected by the size of the\n * page the **server actually returns**, not the requested `limit`: the loop\n * tracks the largest page seen so far (`maxPageSize`) and stops only when a page\n * is shorter than that (or empty). This matters because some v3 methods (e.g.\n * `tasks.task.list`) silently cap the page below the requested `limit`; keying\n * the stop on `limit` would end the walk right after the first capped page.\n *\n * On a soft error it throws {@link KeysetPaginationError}; the calling helper\n * decides whether to fold it into a `Result` (eager) or rethrow as an\n * `SdkError` (streaming).\n */\nexport async function* keysetPaginate<T = unknown>(\n b24: TypeB24,\n logger: LoggerInterface,\n strategy: KeysetPaginateStrategy\n): AsyncGenerator<T[]> {\n let cursor = strategy.initialCursor\n let maxPageSize = 0\n\n while (true) {\n const response: AjaxResult<T> = await b24.actions.v3.call.make<T>({\n method: strategy.method,\n params: strategy.buildParams(cursor),\n requestId: strategy.requestId\n })\n\n if (!response.isSuccess) {\n logger.error(strategy.errorLabel, {\n method: strategy.method,\n requestId: strategy.requestId,\n messages: response.getErrorMessages()\n })\n throw new KeysetPaginationError(response.errors, response.getErrorMessages())\n }\n\n const responseData = response.getData()\n if (!responseData) {\n break\n }\n\n const resultData: T[] = (responseData.result as any)[strategy.customKeyForResult as any] as T[]\n // Guard against a wrong `customKeyForResult` (key absent → undefined): treat\n // a missing/non-array bucket as \"no data\" instead of throwing on `.length`.\n if (!Array.isArray(resultData) || resultData.length === 0) {\n break\n }\n\n yield resultData\n\n maxPageSize = Math.max(maxPageSize, resultData.length)\n if (resultData.length < maxPageSize) {\n break\n }\n\n const lastItem = resultData[resultData.length - 1] as Record<string, any>\n const next = lastItem ? strategy.readNextCursor(lastItem) : null\n if (next === null || next === undefined) {\n logger.warning(strategy.noCursorWarning)\n break\n }\n cursor = next\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;AAYO,MAAM,8BAA8B,KAAA,CAAM;AAAA,EAZjD;AAYiD,IAAA,MAAA,CAAA,IAAA,EAAA,uBAAA,CAAA;AAAA;AAAA,EAC/B,MAAA;AAAA,EACA,QAAA;AAAA,EAEhB,WAAA,CAAY,QAAmC,QAAA,EAAoB;AACjE,IAAA,KAAA,CAAM,QAAA,CAAS,IAAA,CAAK,IAAI,CAAC,CAAA;AACzB,IAAA,IAAA,CAAK,IAAA,GAAO,uBAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAAA,EAClB;AACF;AA6CA,gBAAuB,cAAA,CACrB,GAAA,EACA,MAAA,EACA,QAAA,EACqB;AACrB,EAAA,IAAI,SAAS,QAAA,CAAS,aAAA;AACtB,EAAA,IAAI,WAAA,GAAc,CAAA;AAElB,EAAA,OAAO,IAAA,EAAM;AACX,IAAA,MAAM,WAA0B,MAAM,GAAA,CAAI,OAAA,CAAQ,EAAA,CAAG,KAAK,IAAA,CAAQ;AAAA,MAChE,QAAQ,QAAA,CAAS,MAAA;AAAA,MACjB,MAAA,EAAQ,QAAA,CAAS,WAAA,CAAY,MAAM,CAAA;AAAA,MACnC,WAAW,QAAA,CAAS;AAAA,KACrB,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,SAAA,EAAW;AACvB,MAAA,MAAA,CAAO,KAAA,CAAM,SAAS,UAAA,EAAY;AAAA,QAChC,QAAQ,QAAA,CAAS,MAAA;AAAA,QACjB,WAAW,QAAA,CAAS,SAAA;AAAA,QACpB,QAAA,EAAU,SAAS,gBAAA;AAAiB,OACrC,CAAA;AACD,MAAA,MAAM,IAAI,qBAAA,CAAsB,QAAA,CAAS,MAAA,EAAQ,QAAA,CAAS,kBAAkB,CAAA;AAAA,IAC9E;AAEA,IAAA,MAAM,YAAA,GAAe,SAAS,OAAA,EAAQ;AACtC,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAmB,YAAA,CAAa,MAAA,CAAe,QAAA,CAAS,kBAAyB,CAAA;AAGvF,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,IAAK,UAAA,CAAW,WAAW,CAAA,EAAG;AACzD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAA;AAEN,IAAA,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,UAAA,CAAW,MAAM,CAAA;AACrD,IAAA,IAAI,UAAA,CAAW,SAAS,WAAA,EAAa;AACnC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,UAAA,CAAW,UAAA,CAAW,MAAA,GAAS,CAAC,CAAA;AACjD,IAAA,MAAM,IAAA,GAAO,QAAA,GAAW,QAAA,CAAS,cAAA,CAAe,QAAQ,CAAA,GAAI,IAAA;AAC5D,IAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,IAAA,KAAS,MAAA,EAAW;AACvC,MAAA,MAAA,CAAO,OAAA,CAAQ,SAAS,eAAe,CAAA;AACvC,MAAA;AAAA,IACF;AACA,IAAA,MAAA,GAAS,IAAA;AAAA,EACX;AACF;AAnDuB,MAAA,CAAA,cAAA,EAAA,gBAAA,CAAA;;;;"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * @package @bitrix24/b24jssdk
3
+ * @version 2.0.0
4
+ * @copyright (c) 2026 Bitrix24
5
+ * @license MIT
6
+ * @see https://github.com/bitrix24/b24jssdk
7
+ * @see https://bitrix24.github.io/b24jssdk/
8
+ */
9
+ import { AbstractAction } from '../abstract-action.mjs';
10
+ import { Result } from '../../result.mjs';
11
+ import { SdkError } from '../../sdk-error.mjs';
12
+
13
+ var __defProp = Object.defineProperty;
14
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
15
+ const AGGREGATE_FUNCTIONS = ["sum", "avg", "min", "max", "count", "countDistinct"];
16
+ class AggregateV3 extends AbstractAction {
17
+ static {
18
+ __name(this, "AggregateV3");
19
+ }
20
+ /**
21
+ * @param {ActionAggregateV3} options
22
+ * - `method: string` - an `*.aggregate` method name.
23
+ * - `select: AggregateSelectV3` - per-function field selection (`sum`/`avg`/`min`/`max`/`count`/`countDistinct`).
24
+ * - `params?: { filter }` - optional v3 filter (array-of-triples; use `FilterV3` to build it).
25
+ * - `requestId?: string` - tracking id.
26
+ *
27
+ * @returns {Promise<Result<AggregateResultV3>>} buckets keyed by function then field name.
28
+ *
29
+ * @example
30
+ * const response = await b24.actions.v3.aggregate.make({
31
+ * method: 'some.entity.aggregate',
32
+ * select: { sum: { amount: 'totalAmount' }, count: ['id'] },
33
+ * params: { filter: FilterV3.build(FilterV3.eq('status', 'NEW')) }
34
+ * })
35
+ * if (response.isSuccess) {
36
+ * const total = response.getData()?.sum?.amount
37
+ * }
38
+ */
39
+ async make(options) {
40
+ const result = new Result();
41
+ const select = options?.select ?? {};
42
+ for (const fn of Object.keys(select)) {
43
+ if (!AGGREGATE_FUNCTIONS.includes(fn)) {
44
+ throw new SdkError({
45
+ code: "JSSDK_AGGREGATE_V3_INVALID_FUNCTION",
46
+ description: `AggregateV3: "${fn}" is not an aggregate function \u2014 use one of ${AGGREGATE_FUNCTIONS.join(" ")}.`,
47
+ status: 400
48
+ });
49
+ }
50
+ const fields = select[fn];
51
+ if (!Array.isArray(fields) && (typeof fields !== "object" || fields === null)) {
52
+ throw new SdkError({
53
+ code: "JSSDK_AGGREGATE_V3_INVALID_SELECT",
54
+ description: `AggregateV3: select.${fn} must be a string[] (default alias) or a { field: alias } map.`,
55
+ status: 400
56
+ });
57
+ }
58
+ }
59
+ const params = { select };
60
+ if (options?.params?.filter) {
61
+ params.filter = options.params.filter;
62
+ }
63
+ const response = await this._b24.actions.v3.call.make({
64
+ method: options.method,
65
+ params,
66
+ requestId: options.requestId
67
+ });
68
+ if (!response.isSuccess) {
69
+ this._logger.error("aggregateMethod", {
70
+ method: options.method,
71
+ requestId: options.requestId,
72
+ messages: response.getErrorMessages()
73
+ });
74
+ for (const [index, error] of response.errors) {
75
+ result.addError(error, index);
76
+ }
77
+ return result;
78
+ }
79
+ const payload = response.getData()?.result;
80
+ let buckets;
81
+ if (payload && typeof payload === "object" && "result" in payload) {
82
+ buckets = payload.result ?? {};
83
+ } else if (payload && typeof payload === "object") {
84
+ this._logger.warning(`aggregate.make: response has no nested 'result.result' envelope (the v3 reference \xA77 specifies double nesting); falling back to the top-level 'result'. method=${options.method}`);
85
+ buckets = payload;
86
+ } else {
87
+ buckets = {};
88
+ }
89
+ return result.setData(buckets);
90
+ }
91
+ }
92
+
93
+ export { AggregateV3 };
94
+ //# sourceMappingURL=aggregate.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aggregate.mjs","sources":["../../../../../src/core/actions/v3/aggregate.ts"],"sourcesContent":["import type { ActionOptions } from '../abstract-action'\nimport type { TypeCallParams } from '../../../types/http'\nimport type { AjaxResult } from '../../http/ajax-result'\nimport { AbstractAction } from '../abstract-action'\nimport { Result } from '../../result'\nimport { SdkError } from '../../sdk-error'\n\n/**\n * The six aggregate functions the v3 `aggregate` action accepts (reference §7).\n * Anything else is rejected server-side with `UNKNOWNAGGREGATEFUNCTIONEXCEPTION`.\n */\nexport type AggregateFunctionV3 = 'sum' | 'avg' | 'min' | 'max' | 'count' | 'countDistinct'\n\nconst AGGREGATE_FUNCTIONS: readonly AggregateFunctionV3[] = ['sum', 'avg', 'min', 'max', 'count', 'countDistinct']\n\n/**\n * Per-function field selection. Two forms (reference §7):\n * - list: `['amount', 'qty']` — default alias `<func>_<field>`;\n * - map: `{ amount: 'totalAmount' }` — custom alias.\n * Note: the response keys buckets by the **field name**, not the alias.\n */\nexport type AggregateSelectV3 = Partial<Record<AggregateFunctionV3, string[] | Record<string, string>>>\n\n/**\n * Aggregate response buckets: `{ sum: { amount: 12345 }, count: { id: 87 } }`.\n * Keyed by function, then by field name.\n */\nexport type AggregateResultV3 = Partial<Record<AggregateFunctionV3, Record<string, number>>>\n\n/** @experimental options for the v3 `aggregate` action — unverified live (see {@link AggregateV3}). */\nexport type ActionAggregateV3 = ActionOptions & {\n method: string\n select: AggregateSelectV3\n params?: Pick<TypeCallParams, 'filter'>\n requestId?: string\n}\n\n/**\n * Runs the v3 `aggregate` action for modules that support it (reference §7).\n * `restApi:v3`\n *\n * @experimental NOT verified against a live portal — no module on the SDK's\n * reference test portal currently exposes an `*.aggregate` endpoint. The\n * request/response shapes follow the published v3 reference and may change once\n * verified live; pin to a version if you depend on the exact shape.\n */\nexport class AggregateV3 extends AbstractAction {\n /**\n * @param {ActionAggregateV3} options\n * - `method: string` - an `*.aggregate` method name.\n * - `select: AggregateSelectV3` - per-function field selection (`sum`/`avg`/`min`/`max`/`count`/`countDistinct`).\n * - `params?: { filter }` - optional v3 filter (array-of-triples; use `FilterV3` to build it).\n * - `requestId?: string` - tracking id.\n *\n * @returns {Promise<Result<AggregateResultV3>>} buckets keyed by function then field name.\n *\n * @example\n * const response = await b24.actions.v3.aggregate.make({\n * method: 'some.entity.aggregate',\n * select: { sum: { amount: 'totalAmount' }, count: ['id'] },\n * params: { filter: FilterV3.build(FilterV3.eq('status', 'NEW')) }\n * })\n * if (response.isSuccess) {\n * const total = response.getData()?.sum?.amount\n * }\n */\n public override async make(options: ActionAggregateV3): Promise<Result<AggregateResultV3>> {\n const result: Result<AggregateResultV3> = new Result()\n\n const select = options?.select ?? {}\n for (const fn of Object.keys(select)) {\n if (!AGGREGATE_FUNCTIONS.includes(fn as AggregateFunctionV3)) {\n throw new SdkError({\n code: 'JSSDK_AGGREGATE_V3_INVALID_FUNCTION',\n description: `AggregateV3: \"${fn}\" is not an aggregate function — use one of ${AGGREGATE_FUNCTIONS.join(' ')}.`,\n status: 400\n })\n }\n const fields = (select as Record<string, unknown>)[fn]\n if (!Array.isArray(fields) && (typeof fields !== 'object' || fields === null)) {\n throw new SdkError({\n code: 'JSSDK_AGGREGATE_V3_INVALID_SELECT',\n description: `AggregateV3: select.${fn} must be a string[] (default alias) or a { field: alias } map.`,\n status: 400\n })\n }\n }\n\n // `TypeCallParams.select` is typed `string[]` for the `list` methods, but the\n // v3 `aggregate` action takes an object select (`{ sum: { field: alias } }`);\n // the server accepts it, hence the cast.\n const params: TypeCallParams = { select: select as unknown as TypeCallParams['select'] }\n if (options?.params?.filter) {\n params.filter = options.params.filter\n }\n\n const response: AjaxResult<unknown> = await this._b24.actions.v3.call.make<unknown>({\n method: options.method,\n params,\n requestId: options.requestId\n })\n\n if (!response.isSuccess) {\n this._logger.error('aggregateMethod', {\n method: options.method,\n requestId: options.requestId,\n messages: response.getErrorMessages()\n })\n for (const [index, error] of response.errors) {\n result.addError(error, index)\n }\n return result\n }\n\n // The reference (§7) nests one extra level: { result: { result: { <func>: {...} } } }.\n // `getData()` unwraps the outer `result`, so the buckets are at `payload.result`.\n // This shape is unverified against a live portal — be defensive: if a portal\n // returns the buckets at a single level instead, fall back to the payload and\n // warn rather than silently returning empty data.\n const payload = response.getData()?.result as any\n let buckets: AggregateResultV3\n if (payload && typeof payload === 'object' && 'result' in payload) {\n buckets = (payload.result ?? {}) as AggregateResultV3\n } else if (payload && typeof payload === 'object') {\n this._logger.warning(`aggregate.make: response has no nested 'result.result' envelope (the v3 reference §7 specifies double nesting); falling back to the top-level 'result'. method=${options.method}`)\n buckets = payload as AggregateResultV3\n } else {\n buckets = {}\n }\n return result.setData(buckets)\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * @package @bitrix24/b24jssdk
3
- * @version 1.3.0
3
+ * @version 2.0.0
4
4
  * @copyright (c) 2026 Bitrix24
5
5
  * @license MIT
6
6
  * @see https://github.com/bitrix24/b24jssdk
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * @package @bitrix24/b24jssdk
3
- * @version 1.3.0
3
+ * @version 2.0.0
4
4
  * @copyright (c) 2026 Bitrix24
5
5
  * @license MIT
6
6
  * @see https://github.com/bitrix24/b24jssdk
@@ -8,8 +8,6 @@
8
8
  */
9
9
  import { AbstractBatch } from '../abstract-batch.mjs';
10
10
  import { ApiVersion } from '../../../types/b24.mjs';
11
- import { versionManager } from '../../version-manager.mjs';
12
- import { SdkError } from '../../sdk-error.mjs';
13
11
 
14
12
  var __defProp = Object.defineProperty;
15
13
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
@@ -113,13 +111,6 @@ class BatchV3 extends AbstractBatch {
113
111
  ...options.options,
114
112
  apiVersion: ApiVersion.v3
115
113
  };
116
- if (versionManager.automaticallyObtainApiVersionForBatch(options.calls) !== opts.apiVersion) {
117
- throw new SdkError({
118
- code: "JSSDK_CORE_METHOD_NOT_SUPPORT_IN_API_V3",
119
- description: `restApi:v3 not support some methods in calls: ${JSON.stringify(options.calls)}`,
120
- status: 500
121
- });
122
- }
123
114
  const response = await this._b24.getHttpClient(ApiVersion.v3).batch(options.calls, opts);
124
115
  return this._processBatchResponse(response, options.calls, opts);
125
116
  }
@@ -1 +1 @@
1
- {"version":3,"file":"batch.mjs","sources":["../../../../../src/core/actions/v3/batch.ts"],"sourcesContent":["import type { ActionOptions } from '../abstract-action'\nimport type { CallBatchResult, IB24BatchOptions } from '../../../types/b24'\nimport type {\n BatchCommandsArrayUniversal,\n BatchCommandsObjectUniversal,\n BatchNamedCommandsUniversal\n} from '../../../types/http'\nimport { AbstractBatch } from '../abstract-batch'\nimport { ApiVersion } from '../../../types/b24'\nimport { versionManager } from '../../version-manager'\nimport { SdkError } from '../../sdk-error'\n\nexport type ActionBatchV3 = ActionOptions & {\n calls: BatchCommandsArrayUniversal | BatchCommandsObjectUniversal | BatchNamedCommandsUniversal\n options?: IB24BatchOptions\n}\n\n/**\n * Executes a batch request to the Bitrix24 REST API with a maximum number of commands of no more than 50. `restApi:v3`\n * Allows you to execute multiple requests in a single API call, significantly improving performance.\n *\n * @todo add docs\n */\nexport class BatchV3 extends AbstractBatch {\n /**\n * Executes a batch request to the Bitrix24 REST API with a maximum number of commands of no more than 50.\n * Allows you to execute multiple requests in a single API call, significantly improving performance.\n *\n * @template T - The data type returned by batch query commands (default is `unknown`)\n *\n * @param {ActionBatchV3} options - parameters for executing the request.\n * - `calls: BatchCommandsArrayUniversal | BatchCommandsObjectUniversal | BatchNamedCommandsUniversal` - Commands to execute in a batch.\n * Supports several formats:\n * 1. Array of tuples: `[['method1', params1], ['method2', params2], ...]`\n * 2. Array of objects: `[{ method: 'method1', params: params1 }, { method: 'method2', params: params2 }, ...]`\n * 3. An object with named commands: `{ cmd1: { method: 'method1', params: params1 }, cmd2: ['method2', params2], ...}`\n * - `options?: IB24BatchOptions` - Additional options for executing a batch request.\n * - `isHaltOnError?: boolean` - Whether to stop execution on the first error (default: true)\n * - `requestId?: string` - Unique request identifier for tracking. Used for query deduplication and debugging (default: undefined)\n * - `returnAjaxResult?: boolean` - Whether to return an AjaxResult object instead of data (default: false)\n *\n * @returns {Promise<CallBatchResult<T>>} A promise that is resolved by the result of executing a batch request:\n * - On success: a `Result` object with the command execution results\n * - The structure of the results depends on the format of the `calls` input data:\n * - For an array of commands, an array of results in the same order\n * - For named commands, an object with keys corresponding to the command names\n *\n * @example\n * interface TaskItem { id: number, title: string }\n * const response = await b24.actions.v3.batch.make<{ item: TaskItem }>({\n * calls: [\n * ['tasks.task.get', { id: 1, select: ['id', 'title'] }],\n * ['tasks.task.get', { id: 2, select: ['id', 'title'] }],\n * ['tasks.task.get', { id: 3, select: ['id', 'title'] }]\n * ],\n * options: {\n * isHaltOnError: true,\n * returnAjaxResult: true,\n * requestId: 'batch-123'\n * }\n * })\n * if (!response.isSuccess) {\n * throw new Error(`Problem: ${response.getErrorMessages().join('; ')}`)\n * }\n *\n * const resultData = (response as Result<AjaxResult<{ item: TaskItem }>[]>).getData()\n * resultData.forEach((resultRow, index) => {\n * if (resultRow.isSuccess) {\n * console.log(`Item ${index + 1}:`, resultRow.getData()!.result.item)\n * }\n * })\n *\n * @example\n * const response = await b24.actions.v3.batch.make({\n * calls: [\n * { method: 'tasks.task.get', params: { id: 1, select: ['id', 'title'] } },\n * { method: 'tasks.task.get', params: { id: 2, select: ['id', 'title'] } }\n * ],\n * options: {\n * isHaltOnError: true,\n * returnAjaxResult: true,\n * requestId: 'batch-123'\n * }\n * })\n * if (!response.isSuccess) {\n * throw new Error(`Problem: ${response.getErrorMessages().join('; ')}`)\n * }\n *\n * @example\n * interface TaskItem { id: number, title: string }\n * interface MainEventLogItem { id: number, userId: number }\n * const response = await b24.actions.v3.batch.make<{ item: TaskItem } | { items: MainEventLogItem[] }>({\n * calls: {\n * Task: { method: 'tasks.task.get', params: { id: 1, select: ['id', 'title'] } },\n * MainEventLog: ['main.eventlog.list', { select: ['id', 'userId'], pagination: { limit: 5 } }]\n * },\n * options: {\n * isHaltOnError: true,\n * returnAjaxResult: true,\n * requestId: 'batch-123'\n * }\n * })\n * if (!response.isSuccess) {\n * throw new Error(`Problem: ${response.getErrorMessages().join('; ')}`)\n * }\n *\n * const results = response.getData() as Record<string, AjaxResult<{ item: TaskItem } | { items: MainEventLogItem[] }>>\n * console.log('Task:', results.Task.getData()?.result.item as TaskItem)\n * console.log('MainEventLog:', results.MainEventLog.getData()?.result.items as MainEventLogItem[])\n *\n * @warning The maximum number of commands in one batch request is 50.\n * @note A batch request executes faster than sequential single calls,\n * but if one command fails, the entire batch may fail\n * (depending on API settings and options).\n */\n public override async make<T = unknown>(options: ActionBatchV3): Promise<CallBatchResult<T>> {\n const opts = {\n ...options.options,\n apiVersion: ApiVersion.v3\n }\n\n if (versionManager.automaticallyObtainApiVersionForBatch(options.calls) !== opts.apiVersion) {\n throw new SdkError({\n code: 'JSSDK_CORE_METHOD_NOT_SUPPORT_IN_API_V3',\n description: `restApi:v3 not support some methods in calls: ${JSON.stringify(options.calls)}`,\n status: 500\n })\n }\n\n const response = await this._b24.getHttpClient(ApiVersion.v3).batch<T>(options.calls, opts)\n\n return this._processBatchResponse<T>(response, options.calls, opts)\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AAuBO,MAAM,gBAAgB,aAAA,CAAc;AAAA,EAvB3C;AAuB2C,IAAA,MAAA,CAAA,IAAA,EAAA,SAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA4FzC,MAAsB,KAAkB,OAAA,EAAqD;AAC3F,IAAA,MAAM,IAAA,GAAO;AAAA,MACX,GAAG,OAAA,CAAQ,OAAA;AAAA,MACX,YAAY,UAAA,CAAW;AAAA,KACzB;AAEA,IAAA,IAAI,eAAe,qCAAA,CAAsC,OAAA,CAAQ,KAAK,CAAA,KAAM,KAAK,UAAA,EAAY;AAC3F,MAAA,MAAM,IAAI,QAAA,CAAS;AAAA,QACjB,IAAA,EAAM,yCAAA;AAAA,QACN,aAAa,CAAA,8CAAA,EAAiD,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,KAAK,CAAC,CAAA,CAAA;AAAA,QAC3F,MAAA,EAAQ;AAAA,OACT,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,UAAA,CAAW,EAAE,CAAA,CAAE,KAAA,CAAS,OAAA,CAAQ,KAAA,EAAO,IAAI,CAAA;AAE1F,IAAA,OAAO,IAAA,CAAK,qBAAA,CAAyB,QAAA,EAAU,OAAA,CAAQ,OAAO,IAAI,CAAA;AAAA,EACpE;AACF;;;;"}
1
+ {"version":3,"file":"batch.mjs","sources":["../../../../../src/core/actions/v3/batch.ts"],"sourcesContent":["import type { ActionOptions } from '../abstract-action'\nimport type { CallBatchResult, IB24BatchOptions } from '../../../types/b24'\nimport type {\n BatchCommandsArrayUniversal,\n BatchCommandsObjectUniversal,\n BatchNamedCommandsUniversal\n} from '../../../types/http'\nimport { AbstractBatch } from '../abstract-batch'\nimport { ApiVersion } from '../../../types/b24'\n\nexport type ActionBatchV3 = ActionOptions & {\n calls: BatchCommandsArrayUniversal | BatchCommandsObjectUniversal | BatchNamedCommandsUniversal\n options?: IB24BatchOptions\n}\n\n/**\n * Executes a batch request to the Bitrix24 REST API with a maximum number of commands of no more than 50. `restApi:v3`\n * Allows you to execute multiple requests in a single API call, significantly improving performance.\n *\n * @todo add docs\n */\nexport class BatchV3 extends AbstractBatch {\n /**\n * Executes a batch request to the Bitrix24 REST API with a maximum number of commands of no more than 50.\n * Allows you to execute multiple requests in a single API call, significantly improving performance.\n *\n * @template T - The data type returned by batch query commands (default is `unknown`)\n *\n * @param {ActionBatchV3} options - parameters for executing the request.\n * - `calls: BatchCommandsArrayUniversal | BatchCommandsObjectUniversal | BatchNamedCommandsUniversal` - Commands to execute in a batch.\n * Supports several formats:\n * 1. Array of tuples: `[['method1', params1], ['method2', params2], ...]`\n * 2. Array of objects: `[{ method: 'method1', params: params1 }, { method: 'method2', params: params2 }, ...]`\n * 3. An object with named commands: `{ cmd1: { method: 'method1', params: params1 }, cmd2: ['method2', params2], ...}`\n * - `options?: IB24BatchOptions` - Additional options for executing a batch request.\n * - `isHaltOnError?: boolean` - Whether to stop execution on the first error (default: true)\n * - `requestId?: string` - Unique request identifier for tracking. Used for query deduplication and debugging (default: undefined)\n * - `returnAjaxResult?: boolean` - Whether to return an AjaxResult object instead of data (default: false)\n *\n * @returns {Promise<CallBatchResult<T>>} A promise that is resolved by the result of executing a batch request:\n * - On success: a `Result` object with the command execution results\n * - The structure of the results depends on the format of the `calls` input data:\n * - For an array of commands, an array of results in the same order\n * - For named commands, an object with keys corresponding to the command names\n *\n * @example\n * interface TaskItem { id: number, title: string }\n * const response = await b24.actions.v3.batch.make<{ item: TaskItem }>({\n * calls: [\n * ['tasks.task.get', { id: 1, select: ['id', 'title'] }],\n * ['tasks.task.get', { id: 2, select: ['id', 'title'] }],\n * ['tasks.task.get', { id: 3, select: ['id', 'title'] }]\n * ],\n * options: {\n * isHaltOnError: true,\n * returnAjaxResult: true,\n * requestId: 'batch-123'\n * }\n * })\n * if (!response.isSuccess) {\n * throw new Error(`Problem: ${response.getErrorMessages().join('; ')}`)\n * }\n *\n * const resultData = (response as Result<AjaxResult<{ item: TaskItem }>[]>).getData()\n * resultData.forEach((resultRow, index) => {\n * if (resultRow.isSuccess) {\n * console.log(`Item ${index + 1}:`, resultRow.getData()!.result.item)\n * }\n * })\n *\n * @example\n * const response = await b24.actions.v3.batch.make({\n * calls: [\n * { method: 'tasks.task.get', params: { id: 1, select: ['id', 'title'] } },\n * { method: 'tasks.task.get', params: { id: 2, select: ['id', 'title'] } }\n * ],\n * options: {\n * isHaltOnError: true,\n * returnAjaxResult: true,\n * requestId: 'batch-123'\n * }\n * })\n * if (!response.isSuccess) {\n * throw new Error(`Problem: ${response.getErrorMessages().join('; ')}`)\n * }\n *\n * @example\n * interface TaskItem { id: number, title: string }\n * interface MainEventLogItem { id: number, userId: number }\n * const response = await b24.actions.v3.batch.make<{ item: TaskItem } | { items: MainEventLogItem[] }>({\n * calls: {\n * Task: { method: 'tasks.task.get', params: { id: 1, select: ['id', 'title'] } },\n * MainEventLog: ['main.eventlog.list', { select: ['id', 'userId'], pagination: { limit: 5 } }]\n * },\n * options: {\n * isHaltOnError: true,\n * returnAjaxResult: true,\n * requestId: 'batch-123'\n * }\n * })\n * if (!response.isSuccess) {\n * throw new Error(`Problem: ${response.getErrorMessages().join('; ')}`)\n * }\n *\n * const results = response.getData() as Record<string, AjaxResult<{ item: TaskItem } | { items: MainEventLogItem[] }>>\n * console.log('Task:', results.Task.getData()?.result.item as TaskItem)\n * console.log('MainEventLog:', results.MainEventLog.getData()?.result.items as MainEventLogItem[])\n *\n * @warning The maximum number of commands in one batch request is 50.\n * @note A batch request executes faster than sequential single calls,\n * but if one command fails, the entire batch may fail\n * (depending on API settings and options).\n */\n public override async make<T = unknown>(options: ActionBatchV3): Promise<CallBatchResult<T>> {\n const opts = {\n ...options.options,\n apiVersion: ApiVersion.v3\n }\n\n // No client-side allowlist: every command is sent to the v3 batch endpoint\n // and the server validates each method (unknown ones come back as errors).\n const response = await this._b24.getHttpClient(ApiVersion.v3).batch<T>(options.calls, opts)\n\n return this._processBatchResponse<T>(response, options.calls, opts)\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;AAqBO,MAAM,gBAAgB,aAAA,CAAc;AAAA,EArB3C;AAqB2C,IAAA,MAAA,CAAA,IAAA,EAAA,SAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA4FzC,MAAsB,KAAkB,OAAA,EAAqD;AAC3F,IAAA,MAAM,IAAA,GAAO;AAAA,MACX,GAAG,OAAA,CAAQ,OAAA;AAAA,MACX,YAAY,UAAA,CAAW;AAAA,KACzB;AAIA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,UAAA,CAAW,EAAE,CAAA,CAAE,KAAA,CAAS,OAAA,CAAQ,KAAA,EAAO,IAAI,CAAA;AAE1F,IAAA,OAAO,IAAA,CAAK,qBAAA,CAAyB,QAAA,EAAU,OAAA,CAAQ,OAAO,IAAI,CAAA;AAAA,EACpE;AACF;;;;"}
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * @package @bitrix24/b24jssdk
3
- * @version 1.3.0
3
+ * @version 2.0.0
4
4
  * @copyright (c) 2026 Bitrix24
5
5
  * @license MIT
6
6
  * @see https://github.com/bitrix24/b24jssdk
@@ -8,6 +8,7 @@
8
8
  */
9
9
  import { AbstractAction } from '../abstract-action.mjs';
10
10
  import { Result } from '../../result.mjs';
11
+ import { keysetPaginate, KeysetPaginationError } from './_keyset-paginate.mjs';
11
12
 
12
13
  var __defProp = Object.defineProperty;
13
14
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
@@ -82,54 +83,39 @@ class CallListV3 extends AbstractAction {
82
83
  filter: [...params["filter"] || []],
83
84
  pagination: { page: 0, limit: batchSize }
84
85
  };
85
- let allItems = [];
86
- let isContinue = true;
87
- let nextId = 0;
88
- do {
89
- const sendParams = { ...requestParams, filter: [...requestParams.filter] };
90
- sendParams.filter.push([cursorIdKey, ">", nextId]);
91
- const response = await this._b24.actions.v3.call.make({
86
+ const allItems = [];
87
+ try {
88
+ for await (const page of keysetPaginate(this._b24, this._logger, {
92
89
  method: options.method,
93
- params: sendParams,
94
- requestId: options.requestId
95
- });
96
- if (!response.isSuccess) {
97
- this._logger.error("callFastListMethod", {
98
- method: options.method,
99
- requestId: options.requestId,
100
- messages: response.getErrorMessages()
101
- });
102
- for (const [index, error] of response.errors) {
103
- result.addError(error, index);
90
+ requestId: options.requestId,
91
+ customKeyForResult,
92
+ initialCursor: 0,
93
+ // Emulated keyset: append the `[cursorIdKey, '>', cursor]` page filter.
94
+ buildParams: /* @__PURE__ */ __name((cursor) => ({ ...requestParams, filter: [...requestParams.filter, [cursorIdKey, ">", cursor]] }), "buildParams"),
95
+ // Advance by the numeric id read from the last item via `idKey`. A
96
+ // non-numeric value (almost always an `idKey` that doesn't match the
97
+ // response field — e.g. sorting by `ID` while the response carries a
98
+ // lowercase `id`) stops the walk instead of silently truncating.
99
+ readNextCursor: /* @__PURE__ */ __name((lastItem) => {
100
+ const value = Number.parseInt(lastItem[idKey], 10);
101
+ return Number.isFinite(value) ? value : null;
102
+ }, "readNextCursor"),
103
+ noCursorWarning: `callList.make: pagination stops here \u2014 no numeric id could be read from the returned items via idKey "${idKey}". Make sure idKey matches the id field in the response; if the sortable field name differs from it, also set cursorIdKey (e.g. idKey: 'id', cursorIdKey: 'ID').`,
104
+ errorLabel: "callFastListMethod"
105
+ })) {
106
+ for (const item of page) {
107
+ allItems.push(item);
104
108
  }
105
- isContinue = false;
106
- break;
107
109
  }
108
- const responseData = response.getData();
109
- if (!responseData) {
110
- isContinue = false;
111
- break;
112
- }
113
- const resultData = responseData.result[customKeyForResult];
114
- if (resultData.length === 0) {
115
- isContinue = false;
116
- break;
117
- }
118
- allItems = [...allItems, ...resultData];
119
- if (resultData.length < batchSize) {
120
- isContinue = false;
121
- break;
122
- }
123
- const lastItem = resultData[resultData.length - 1];
124
- const cursorValue = lastItem ? Number.parseInt(lastItem[idKey], 10) : Number.NaN;
125
- if (Number.isFinite(cursorValue)) {
126
- nextId = cursorValue;
110
+ } catch (error) {
111
+ if (error instanceof KeysetPaginationError) {
112
+ for (const [index, err] of error.errors) {
113
+ result.addError(err, index);
114
+ }
127
115
  } else {
128
- this._logger.warning(`callList.make: pagination stops here \u2014 no numeric id could be read from the returned items via idKey "${idKey}". Make sure idKey matches the id field in the response; if the sortable field name differs from it, also set cursorIdKey (e.g. idKey: 'id', cursorIdKey: 'ID').`);
129
- isContinue = false;
130
- break;
116
+ throw error;
131
117
  }
132
- } while (isContinue);
118
+ }
133
119
  return result.setData(allItems);
134
120
  }
135
121
  }
@@ -1 +1 @@
1
- {"version":3,"file":"call-list.mjs","sources":["../../../../../src/core/actions/v3/call-list.ts"],"sourcesContent":["import type { ActionOptions } from '../abstract-action'\nimport type { TypeCallParams } from '../../../types/http'\nimport type { AjaxResult } from '../../http/ajax-result'\nimport { AbstractAction } from '../abstract-action'\nimport { Result } from '../../result'\n\nexport type ActionCallListV3 = ActionOptions & {\n method: string\n params?: Omit<TypeCallParams, 'pagination' | 'order'>\n idKey?: string\n cursorIdKey?: string\n customKeyForResult: string\n requestId?: string\n limit?: number\n}\n\n/**\n * Fast data retrieval without counting the total number of records. `restApi:v3`\n *\n * @todo add docs\n */\nexport class CallListV3 extends AbstractAction {\n /**\n * Fast data retrieval without counting the total number of records.\n *\n * @template T - The type of the elements of the returned array (default is `unknown`).\n *\n * @param {ActionCallListV3} options - parameters for executing the request.\n * - `method: string` - The name of the REST API method that returns a list of data (for example: `crm.item.list`, `tasks.task.list`)\n * - `params?: Omit<TypeCallParams, 'pagination' | 'order'>` - Request parameters, excluding the `pagination` and `order` parameters,\n * since the method is designed to obtain all data in one call.\n * Note: Use `filter`, `order`, and `select` to control the selection.\n * - `idKey?: string` - The name of the id field as it appears in each RESPONSE item; its value\n * drives the cursor. Default is 'id'. Set it to match the id field the method returns.\n * - `cursorIdKey?: string` - The field name used in the REQUEST for `order` and the\n * `[field, '>', n]` page filter. Defaults to `idKey`. Set it only when the sortable /\n * filterable field name differs from the response field name (e.g. an uppercase request\n * field but a lowercase response id): pass `idKey: 'id', cursorIdKey: 'ID'`.\n * - `customKeyForResult: string` - A custom key indicating that the response REST API will be\n * grouped by this field.\n * Example: `items` to group a list of CRM items.\n * - `requestId?: string` - Unique request identifier for tracking. Used for query deduplication and debugging.\n * - `limit?: number` - How many records to retrieve at a time. Default is `50`. Maximum is `1000`.\n *\n * @returns {Promise<Result<T[]>>} A promise that resolves to the result of an REST API call.\n *\n * @example\n * import { Text } from '@bitrix24/b24jssdk'\n *\n * interface MainEventLogItem { id: number, userId: number }\n * const sixMonthAgo = new Date()\n * sixMonthAgo.setMonth((new Date()).getMonth() - 6)\n * sixMonthAgo.setHours(0, 0, 0)\n * const response = await b24.actions.v3.callList.make<MainEventLogItem>({\n * method: 'main.eventlog.list',\n * params: {\n * filter: [\n * ['timestampX', '>=', Text.toB24Format(sixMonthAgo)] // created at least 6 months ago\n * ],\n * select: ['id', 'userId']\n * },\n * idKey: 'id',\n * customKeyForResult: 'items',\n * requestId: 'eventlog-123',\n * limit: 60\n * })\n * if (!response.isSuccess) {\n * throw new Error(`Problem: ${response.getErrorMessages().join('; ')}`)\n * }\n * const list = response.getData()\n * console.log(`Result: ${list?.length}`) // Number of items received\n */\n public override async make<T = unknown>(options: ActionCallListV3): Promise<Result<T[]>> {\n const batchSize = options?.limit ?? 50\n const result: Result<T[]> = new Result()\n\n const idKey = options?.idKey ?? 'id'\n const cursorIdKey = options?.cursorIdKey ?? idKey\n const customKeyForResult = options?.customKeyForResult ?? null\n const params = options?.params ?? {}\n\n // Warn and strip user-provided `order` — cursor pagination requires ordering by cursorIdKey only\n if ('order' in params && params['order']) {\n this._logger.warning('callList.make: user-provided `order` parameter is ignored because cursor-based pagination requires ordering by cursorIdKey. Use `filter` to narrow results instead.')\n }\n\n const { order: _ignoredOrder, ...restParams } = params as TypeCallParams\n const requestParams: TypeCallParams = {\n ...restParams,\n order: { [cursorIdKey]: 'ASC' },\n filter: [...(params['filter'] || [])],\n pagination: { page: 0, limit: batchSize }\n }\n\n let allItems: T[] = []\n let isContinue = true\n let nextId = 0\n do {\n const sendParams = { ...requestParams, filter: [...requestParams.filter] }\n sendParams.filter.push([cursorIdKey, '>', nextId])\n const response: AjaxResult<T> = await this._b24.actions.v3.call.make<T>({\n method: options.method,\n params: sendParams,\n requestId: options.requestId\n })\n\n if (!response.isSuccess) {\n this._logger.error('callFastListMethod', {\n method: options.method,\n requestId: options.requestId,\n messages: response.getErrorMessages()\n })\n for (const [index, error] of response.errors) {\n result.addError(error, index)\n }\n isContinue = false\n break\n }\n const responseData = response.getData()\n if (!responseData) {\n isContinue = false\n break\n }\n\n const resultData = (responseData.result as any)[customKeyForResult] as T[]\n if (resultData.length === 0) {\n isContinue = false\n break\n }\n\n allItems = [...allItems, ...resultData]\n\n if (resultData.length < batchSize) {\n isContinue = false\n break\n }\n\n // Update the filter for the next iteration\n const lastItem = resultData[resultData.length - 1] as Record<string, any>\n const cursorValue = lastItem ? Number.parseInt(lastItem[idKey], 10) : Number.NaN\n if (Number.isFinite(cursorValue)) {\n nextId = cursorValue\n } else {\n // A full page came back, yet no usable numeric cursor id could be read from\n // its items via `idKey` — almost always an `idKey` that doesn't match the\n // response field (e.g. a request that sorts by `ID` while the response\n // carries a lowercase `id`). Without a cursor we can't advance, so stop and\n // tell the caller how to fix it instead of silently truncating.\n this._logger.warning(`callList.make: pagination stops here — no numeric id could be read from the returned items via idKey \"${idKey}\". Make sure idKey matches the id field in the response; if the sortable field name differs from it, also set cursorIdKey (e.g. idKey: 'id', cursorIdKey: 'ID').`)\n isContinue = false\n break\n }\n } while (isContinue)\n\n return result.setData(allItems)\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"call-list.mjs","sources":["../../../../../src/core/actions/v3/call-list.ts"],"sourcesContent":["import type { ActionOptions } from '../abstract-action'\nimport type { TypeCallParams } from '../../../types/http'\nimport { AbstractAction } from '../abstract-action'\nimport { Result } from '../../result'\nimport { keysetPaginate, KeysetPaginationError } from './_keyset-paginate'\n\nexport type ActionCallListV3 = ActionOptions & {\n method: string\n params?: Omit<TypeCallParams, 'pagination' | 'order'>\n idKey?: string\n cursorIdKey?: string\n customKeyForResult: string\n requestId?: string\n limit?: number\n}\n\n/**\n * Fast data retrieval without counting the total number of records. `restApi:v3`\n *\n * @todo add docs\n */\nexport class CallListV3 extends AbstractAction {\n /**\n * Fast data retrieval without counting the total number of records.\n *\n * @template T - The type of the elements of the returned array (default is `unknown`).\n *\n * @param {ActionCallListV3} options - parameters for executing the request.\n * - `method: string` - The name of the REST API method that returns a list of data (for example: `crm.item.list`, `tasks.task.list`)\n * - `params?: Omit<TypeCallParams, 'pagination' | 'order'>` - Request parameters, excluding the `pagination` and `order` parameters,\n * since the method is designed to obtain all data in one call.\n * Note: Use `filter`, `order`, and `select` to control the selection.\n * - `idKey?: string` - The name of the id field as it appears in each RESPONSE item; its value\n * drives the cursor. Default is 'id'. Set it to match the id field the method returns.\n * - `cursorIdKey?: string` - The field name used in the REQUEST for `order` and the\n * `[field, '>', n]` page filter. Defaults to `idKey`. Set it only when the sortable /\n * filterable field name differs from the response field name (e.g. an uppercase request\n * field but a lowercase response id): pass `idKey: 'id', cursorIdKey: 'ID'`.\n * - `customKeyForResult: string` - A custom key indicating that the response REST API will be\n * grouped by this field.\n * Example: `items` to group a list of CRM items.\n * - `requestId?: string` - Unique request identifier for tracking. Used for query deduplication and debugging.\n * - `limit?: number` - How many records to retrieve at a time. Default is `50`. Maximum is `1000`.\n *\n * @returns {Promise<Result<T[]>>} A promise that resolves to the result of an REST API call.\n *\n * @example\n * import { Text } from '@bitrix24/b24jssdk'\n *\n * interface MainEventLogItem { id: number, userId: number }\n * const sixMonthAgo = new Date()\n * sixMonthAgo.setMonth((new Date()).getMonth() - 6)\n * sixMonthAgo.setHours(0, 0, 0)\n * const response = await b24.actions.v3.callList.make<MainEventLogItem>({\n * method: 'main.eventlog.list',\n * params: {\n * filter: [\n * ['timestampX', '>=', Text.toB24Format(sixMonthAgo)] // created at least 6 months ago\n * ],\n * select: ['id', 'userId']\n * },\n * idKey: 'id',\n * customKeyForResult: 'items',\n * requestId: 'eventlog-123',\n * limit: 60\n * })\n * if (!response.isSuccess) {\n * throw new Error(`Problem: ${response.getErrorMessages().join('; ')}`)\n * }\n * const list = response.getData()\n * console.log(`Result: ${list?.length}`) // Number of items received\n */\n public override async make<T = unknown>(options: ActionCallListV3): Promise<Result<T[]>> {\n const batchSize = options?.limit ?? 50\n const result: Result<T[]> = new Result()\n\n const idKey = options?.idKey ?? 'id'\n const cursorIdKey = options?.cursorIdKey ?? idKey\n const customKeyForResult = options?.customKeyForResult ?? null\n const params = options?.params ?? {}\n\n // Warn and strip user-provided `order` — cursor pagination requires ordering by cursorIdKey only\n if ('order' in params && params['order']) {\n this._logger.warning('callList.make: user-provided `order` parameter is ignored because cursor-based pagination requires ordering by cursorIdKey. Use `filter` to narrow results instead.')\n }\n\n const { order: _ignoredOrder, ...restParams } = params as TypeCallParams\n const requestParams: TypeCallParams = {\n ...restParams,\n order: { [cursorIdKey]: 'ASC' },\n filter: [...(params['filter'] || [])],\n pagination: { page: 0, limit: batchSize }\n }\n\n const allItems: T[] = []\n try {\n for await (const page of keysetPaginate<T>(this._b24, this._logger, {\n method: options.method,\n requestId: options.requestId,\n customKeyForResult,\n initialCursor: 0,\n // Emulated keyset: append the `[cursorIdKey, '>', cursor]` page filter.\n buildParams: cursor => ({ ...requestParams, filter: [...requestParams.filter, [cursorIdKey, '>', cursor]] }),\n // Advance by the numeric id read from the last item via `idKey`. A\n // non-numeric value (almost always an `idKey` that doesn't match the\n // response field e.g. sorting by `ID` while the response carries a\n // lowercase `id`) stops the walk instead of silently truncating.\n readNextCursor: (lastItem) => {\n const value = Number.parseInt(lastItem[idKey], 10)\n return Number.isFinite(value) ? value : null\n },\n noCursorWarning: `callList.make: pagination stops here — no numeric id could be read from the returned items via idKey \"${idKey}\". Make sure idKey matches the id field in the response; if the sortable field name differs from it, also set cursorIdKey (e.g. idKey: 'id', cursorIdKey: 'ID').`,\n errorLabel: 'callFastListMethod'\n })) {\n for (const item of page) {\n allItems.push(item)\n }\n }\n } catch (error) {\n if (error instanceof KeysetPaginationError) {\n for (const [index, err] of error.errors) {\n result.addError(err, index)\n }\n } else {\n throw error\n }\n }\n\n return result.setData(allItems)\n }\n}\n"],"names":[],"mappings":"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"}