@bitrix24/b24jssdk 0.4.10 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (258) hide show
  1. package/README-AI.md +2 -1
  2. package/dist/esm/_virtual/_commonjsHelpers.mjs +16 -0
  3. package/dist/esm/_virtual/_commonjsHelpers.mjs.map +1 -0
  4. package/dist/esm/_virtual/protobuf.mjs +16 -0
  5. package/dist/esm/_virtual/protobuf.mjs.map +1 -0
  6. package/dist/esm/_virtual/protobuf2.mjs +12 -0
  7. package/dist/esm/_virtual/protobuf2.mjs.map +1 -0
  8. package/dist/esm/core/abstract-b24.mjs +355 -0
  9. package/dist/esm/core/abstract-b24.mjs.map +1 -0
  10. package/dist/esm/core/actions/abstract-action.mjs +24 -0
  11. package/dist/esm/core/actions/abstract-action.mjs.map +1 -0
  12. package/dist/esm/core/actions/abstract-batch.mjs +95 -0
  13. package/dist/esm/core/actions/abstract-batch.mjs.map +1 -0
  14. package/dist/esm/core/actions/manager.mjs +53 -0
  15. package/dist/esm/core/actions/manager.mjs.map +1 -0
  16. package/dist/esm/core/actions/v2/batch-by-chunk.mjs +92 -0
  17. package/dist/esm/core/actions/v2/batch-by-chunk.mjs.map +1 -0
  18. package/dist/esm/core/actions/v2/batch.mjs +126 -0
  19. package/dist/esm/core/actions/v2/batch.mjs.map +1 -0
  20. package/dist/esm/core/actions/v2/call-list.mjs +131 -0
  21. package/dist/esm/core/actions/v2/call-list.mjs.map +1 -0
  22. package/dist/esm/core/actions/v2/call.mjs +68 -0
  23. package/dist/esm/core/actions/v2/call.mjs.map +1 -0
  24. package/dist/esm/core/actions/v2/fetch-list.mjs +132 -0
  25. package/dist/esm/core/actions/v2/fetch-list.mjs.map +1 -0
  26. package/dist/esm/core/actions/v2/manager-v2.mjs +74 -0
  27. package/dist/esm/core/actions/v2/manager-v2.mjs.map +1 -0
  28. package/dist/esm/core/actions/v3/batch-by-chunk.mjs +91 -0
  29. package/dist/esm/core/actions/v3/batch-by-chunk.mjs.map +1 -0
  30. package/dist/esm/core/actions/v3/batch.mjs +129 -0
  31. package/dist/esm/core/actions/v3/batch.mjs.map +1 -0
  32. package/dist/esm/core/actions/v3/call-list.mjs +127 -0
  33. package/dist/esm/core/actions/v3/call-list.mjs.map +1 -0
  34. package/dist/esm/core/actions/v3/call.mjs +58 -0
  35. package/dist/esm/core/actions/v3/call.mjs.map +1 -0
  36. package/dist/esm/core/actions/v3/fetch-list.mjs +125 -0
  37. package/dist/esm/core/actions/v3/fetch-list.mjs.map +1 -0
  38. package/dist/esm/core/actions/v3/manager-v3.mjs +74 -0
  39. package/dist/esm/core/actions/v3/manager-v3.mjs.map +1 -0
  40. package/dist/esm/core/http/abstract-http.mjs +563 -0
  41. package/dist/esm/core/http/abstract-http.mjs.map +1 -0
  42. package/dist/esm/core/http/ajax-error.mjs +107 -0
  43. package/dist/esm/core/http/ajax-error.mjs.map +1 -0
  44. package/dist/esm/core/http/ajax-result.mjs +176 -0
  45. package/dist/esm/core/http/ajax-result.mjs.map +1 -0
  46. package/dist/esm/core/http/limiters/adaptive-delayer.mjs +135 -0
  47. package/dist/esm/core/http/limiters/adaptive-delayer.mjs.map +1 -0
  48. package/dist/esm/core/http/limiters/manager.mjs +308 -0
  49. package/dist/esm/core/http/limiters/manager.mjs.map +1 -0
  50. package/dist/esm/core/http/limiters/operating-limiter.mjs +171 -0
  51. package/dist/esm/core/http/limiters/operating-limiter.mjs.map +1 -0
  52. package/dist/esm/core/http/limiters/params-factory.mjs +121 -0
  53. package/dist/esm/core/http/limiters/params-factory.mjs.map +1 -0
  54. package/dist/esm/core/http/limiters/rate-limiter.mjs +402 -0
  55. package/dist/esm/core/http/limiters/rate-limiter.mjs.map +1 -0
  56. package/dist/esm/core/http/v2.mjs +100 -0
  57. package/dist/esm/core/http/v2.mjs.map +1 -0
  58. package/dist/esm/core/http/v3.mjs +94 -0
  59. package/dist/esm/core/http/v3.mjs.map +1 -0
  60. package/dist/esm/core/interaction/batch/abstract-interaction-batch.mjs +69 -0
  61. package/dist/esm/core/interaction/batch/abstract-interaction-batch.mjs.map +1 -0
  62. package/dist/esm/core/interaction/batch/parse-row.mjs +67 -0
  63. package/dist/esm/core/interaction/batch/parse-row.mjs.map +1 -0
  64. package/dist/esm/core/interaction/batch/processing/interface-strategy.mjs +42 -0
  65. package/dist/esm/core/interaction/batch/processing/interface-strategy.mjs.map +1 -0
  66. package/dist/esm/core/interaction/batch/processing/v2/abstract-processing.mjs +121 -0
  67. package/dist/esm/core/interaction/batch/processing/v2/abstract-processing.mjs.map +1 -0
  68. package/dist/esm/core/interaction/batch/processing/v2/as-array.mjs +32 -0
  69. package/dist/esm/core/interaction/batch/processing/v2/as-array.mjs.map +1 -0
  70. package/dist/esm/core/interaction/batch/processing/v2/as-object.mjs +32 -0
  71. package/dist/esm/core/interaction/batch/processing/v2/as-object.mjs.map +1 -0
  72. package/dist/esm/core/interaction/batch/processing/v3/abstract-processing.mjs +118 -0
  73. package/dist/esm/core/interaction/batch/processing/v3/abstract-processing.mjs.map +1 -0
  74. package/dist/esm/core/interaction/batch/processing/v3/as-array.mjs +32 -0
  75. package/dist/esm/core/interaction/batch/processing/v3/as-array.mjs.map +1 -0
  76. package/dist/esm/core/interaction/batch/processing/v3/as-object.mjs +32 -0
  77. package/dist/esm/core/interaction/batch/processing/v3/as-object.mjs.map +1 -0
  78. package/dist/esm/core/interaction/batch/v2.mjs +44 -0
  79. package/dist/esm/core/interaction/batch/v2.mjs.map +1 -0
  80. package/dist/esm/core/interaction/batch/v3.mjs +42 -0
  81. package/dist/esm/core/interaction/batch/v3.mjs.map +1 -0
  82. package/dist/esm/core/language/list.mjs +56 -0
  83. package/dist/esm/core/language/list.mjs.map +1 -0
  84. package/dist/esm/core/request-id-generator.mjs +42 -0
  85. package/dist/esm/core/request-id-generator.mjs.map +1 -0
  86. package/dist/esm/core/result.mjs +101 -0
  87. package/dist/esm/core/result.mjs.map +1 -0
  88. package/dist/esm/core/sdk-error.mjs +83 -0
  89. package/dist/esm/core/sdk-error.mjs.map +1 -0
  90. package/dist/esm/core/tools/abstract-tool.mjs +24 -0
  91. package/dist/esm/core/tools/abstract-tool.mjs.map +1 -0
  92. package/dist/esm/core/tools/healthcheck.mjs +48 -0
  93. package/dist/esm/core/tools/healthcheck.mjs.map +1 -0
  94. package/dist/esm/core/tools/manager.mjs +50 -0
  95. package/dist/esm/core/tools/manager.mjs.map +1 -0
  96. package/dist/esm/core/tools/ping.mjs +56 -0
  97. package/dist/esm/core/tools/ping.mjs.map +1 -0
  98. package/dist/esm/core/version-manager.mjs +116 -0
  99. package/dist/esm/core/version-manager.mjs.map +1 -0
  100. package/dist/esm/frame/auth.mjs +98 -0
  101. package/dist/esm/frame/auth.mjs.map +1 -0
  102. package/dist/esm/frame/b24.mjs +170 -0
  103. package/dist/esm/frame/b24.mjs.map +1 -0
  104. package/dist/esm/frame/dialog.mjs +78 -0
  105. package/dist/esm/frame/dialog.mjs.map +1 -0
  106. package/dist/esm/frame/frame.mjs +101 -0
  107. package/dist/esm/frame/frame.mjs.map +1 -0
  108. package/dist/esm/frame/message/commands.mjs +37 -0
  109. package/dist/esm/frame/message/commands.mjs.map +1 -0
  110. package/dist/esm/frame/message/controller.mjs +177 -0
  111. package/dist/esm/frame/message/controller.mjs.map +1 -0
  112. package/dist/esm/frame/options.mjs +106 -0
  113. package/dist/esm/frame/options.mjs.map +1 -0
  114. package/dist/esm/frame/parent.mjs +250 -0
  115. package/dist/esm/frame/parent.mjs.map +1 -0
  116. package/dist/esm/frame/placement.mjs +131 -0
  117. package/dist/esm/frame/placement.mjs.map +1 -0
  118. package/dist/esm/frame/slider.mjs +156 -0
  119. package/dist/esm/frame/slider.mjs.map +1 -0
  120. package/dist/esm/helper/abstract-helper.mjs +52 -0
  121. package/dist/esm/helper/abstract-helper.mjs.map +1 -0
  122. package/dist/esm/helper/app-manager.mjs +37 -0
  123. package/dist/esm/helper/app-manager.mjs.map +1 -0
  124. package/dist/esm/helper/currency-manager.mjs +207 -0
  125. package/dist/esm/helper/currency-manager.mjs.map +1 -0
  126. package/dist/esm/helper/helper-manager.mjs +388 -0
  127. package/dist/esm/helper/helper-manager.mjs.map +1 -0
  128. package/dist/esm/helper/license-manager.mjs +50 -0
  129. package/dist/esm/helper/license-manager.mjs.map +1 -0
  130. package/dist/esm/helper/options-manager.mjs +196 -0
  131. package/dist/esm/helper/options-manager.mjs.map +1 -0
  132. package/dist/esm/helper/payment-manager.mjs +33 -0
  133. package/dist/esm/helper/payment-manager.mjs.map +1 -0
  134. package/dist/esm/helper/profile-manager.mjs +33 -0
  135. package/dist/esm/helper/profile-manager.mjs.map +1 -0
  136. package/dist/esm/helper/use-b24-helper.mjs +84 -0
  137. package/dist/esm/helper/use-b24-helper.mjs.map +1 -0
  138. package/dist/esm/hook/auth.mjs +77 -0
  139. package/dist/esm/hook/auth.mjs.map +1 -0
  140. package/dist/esm/hook/b24.mjs +115 -0
  141. package/dist/esm/hook/b24.mjs.map +1 -0
  142. package/dist/esm/index.d.mts +2757 -525
  143. package/dist/esm/index.d.ts +2757 -525
  144. package/dist/esm/index.mjs +70 -14111
  145. package/dist/esm/index.mjs.map +1 -1
  146. package/dist/esm/loader-b24frame.mjs +101 -0
  147. package/dist/esm/loader-b24frame.mjs.map +1 -0
  148. package/dist/esm/logger/abstract-logger.mjs +69 -0
  149. package/dist/esm/logger/abstract-logger.mjs.map +1 -0
  150. package/dist/esm/logger/browser.mjs +162 -0
  151. package/dist/esm/logger/browser.mjs.map +1 -0
  152. package/dist/esm/logger/formatter/abstract-formatter.mjs +34 -0
  153. package/dist/esm/logger/formatter/abstract-formatter.mjs.map +1 -0
  154. package/dist/esm/logger/formatter/json-formatter.mjs +34 -0
  155. package/dist/esm/logger/formatter/json-formatter.mjs.map +1 -0
  156. package/dist/esm/logger/formatter/line-formatter.mjs +41 -0
  157. package/dist/esm/logger/formatter/line-formatter.mjs.map +1 -0
  158. package/dist/esm/logger/formatter/telegram-formatter.mjs +103 -0
  159. package/dist/esm/logger/formatter/telegram-formatter.mjs.map +1 -0
  160. package/dist/esm/logger/handler/abstract-handler.mjs +39 -0
  161. package/dist/esm/logger/handler/abstract-handler.mjs.map +1 -0
  162. package/dist/esm/logger/handler/consola-adapter.mjs +62 -0
  163. package/dist/esm/logger/handler/consola-adapter.mjs.map +1 -0
  164. package/dist/esm/logger/handler/console-handler.mjs +98 -0
  165. package/dist/esm/logger/handler/console-handler.mjs.map +1 -0
  166. package/dist/esm/logger/handler/console-v2-handler.mjs +51 -0
  167. package/dist/esm/logger/handler/console-v2-handler.mjs.map +1 -0
  168. package/dist/esm/logger/handler/memory-handler.mjs +48 -0
  169. package/dist/esm/logger/handler/memory-handler.mjs.map +1 -0
  170. package/dist/esm/logger/handler/stream-handler.mjs +73 -0
  171. package/dist/esm/logger/handler/stream-handler.mjs.map +1 -0
  172. package/dist/esm/logger/handler/telegram-handler.mjs +157 -0
  173. package/dist/esm/logger/handler/telegram-handler.mjs.map +1 -0
  174. package/dist/esm/logger/handler/winston-adapter.mjs +57 -0
  175. package/dist/esm/logger/handler/winston-adapter.mjs.map +1 -0
  176. package/dist/esm/logger/logger-factory.mjs +67 -0
  177. package/dist/esm/logger/logger-factory.mjs.map +1 -0
  178. package/dist/esm/logger/logger.mjs +76 -0
  179. package/dist/esm/logger/logger.mjs.map +1 -0
  180. package/dist/esm/logger/null-logger.mjs +32 -0
  181. package/dist/esm/logger/null-logger.mjs.map +1 -0
  182. package/dist/esm/logger/processor/memory-usage-processor.mjs +20 -0
  183. package/dist/esm/logger/processor/memory-usage-processor.mjs.map +1 -0
  184. package/dist/esm/logger/processor/pid-processor.mjs +20 -0
  185. package/dist/esm/logger/processor/pid-processor.mjs.map +1 -0
  186. package/dist/esm/oauth/auth.mjs +211 -0
  187. package/dist/esm/oauth/auth.mjs.map +1 -0
  188. package/dist/esm/oauth/b24.mjs +117 -0
  189. package/dist/esm/oauth/b24.mjs.map +1 -0
  190. package/dist/esm/oauth/refresh-token-error.mjs +20 -0
  191. package/dist/esm/oauth/refresh-token-error.mjs.map +1 -0
  192. package/dist/esm/pullClient/abstract-connector.mjs +78 -0
  193. package/dist/esm/pullClient/abstract-connector.mjs.map +1 -0
  194. package/dist/esm/pullClient/channel-manager.mjs +89 -0
  195. package/dist/esm/pullClient/channel-manager.mjs.map +1 -0
  196. package/dist/esm/pullClient/client.mjs +2064 -0
  197. package/dist/esm/pullClient/client.mjs.map +1 -0
  198. package/dist/esm/pullClient/errors.mjs +31 -0
  199. package/dist/esm/pullClient/errors.mjs.map +1 -0
  200. package/dist/esm/pullClient/json-rpc.mjs +210 -0
  201. package/dist/esm/pullClient/json-rpc.mjs.map +1 -0
  202. package/dist/esm/pullClient/long-polling-connector.mjs +157 -0
  203. package/dist/esm/pullClient/long-polling-connector.mjs.map +1 -0
  204. package/dist/esm/pullClient/protobuf/index.mjs +17 -0
  205. package/dist/esm/pullClient/protobuf/index.mjs.map +1 -0
  206. package/dist/esm/pullClient/protobuf/model.mjs +1058 -0
  207. package/dist/esm/pullClient/protobuf/model.mjs.map +1 -0
  208. package/dist/esm/pullClient/protobuf/protobuf.mjs +4653 -0
  209. package/dist/esm/pullClient/protobuf/protobuf.mjs.map +1 -0
  210. package/dist/esm/pullClient/shared-config.mjs +133 -0
  211. package/dist/esm/pullClient/shared-config.mjs.map +1 -0
  212. package/dist/esm/pullClient/storage-manager.mjs +72 -0
  213. package/dist/esm/pullClient/storage-manager.mjs.map +1 -0
  214. package/dist/esm/pullClient/web-socket-connector.mjs +129 -0
  215. package/dist/esm/pullClient/web-socket-connector.mjs.map +1 -0
  216. package/dist/esm/tools/browser.mjs +154 -0
  217. package/dist/esm/tools/browser.mjs.map +1 -0
  218. package/dist/esm/tools/environment.mjs +29 -0
  219. package/dist/esm/tools/environment.mjs.map +1 -0
  220. package/dist/esm/tools/formatters/iban.mjs +304 -0
  221. package/dist/esm/tools/formatters/iban.mjs.map +1 -0
  222. package/dist/esm/tools/formatters/numbers.mjs +64 -0
  223. package/dist/esm/tools/formatters/numbers.mjs.map +1 -0
  224. package/dist/esm/tools/index.mjs +37 -0
  225. package/dist/esm/tools/index.mjs.map +1 -0
  226. package/dist/esm/tools/scroll-size.mjs +25 -0
  227. package/dist/esm/tools/scroll-size.mjs.map +1 -0
  228. package/dist/esm/tools/text.mjs +208 -0
  229. package/dist/esm/tools/text.mjs.map +1 -0
  230. package/dist/esm/tools/type.mjs +337 -0
  231. package/dist/esm/tools/type.mjs.map +1 -0
  232. package/dist/esm/tools/use-formatters.mjs +460 -0
  233. package/dist/esm/tools/use-formatters.mjs.map +1 -0
  234. package/dist/esm/tools/uuidv7.mjs +54 -0
  235. package/dist/esm/tools/uuidv7.mjs.map +1 -0
  236. package/dist/esm/types/b24-helper.mjs +56 -0
  237. package/dist/esm/types/b24-helper.mjs.map +1 -0
  238. package/dist/esm/types/b24.mjs +16 -0
  239. package/dist/esm/types/b24.mjs.map +1 -0
  240. package/dist/esm/types/bizproc/index.mjs +187 -0
  241. package/dist/esm/types/bizproc/index.mjs.map +1 -0
  242. package/dist/esm/types/catalog/index.mjs +35 -0
  243. package/dist/esm/types/catalog/index.mjs.map +1 -0
  244. package/dist/esm/types/common.mjs +31 -0
  245. package/dist/esm/types/common.mjs.map +1 -0
  246. package/dist/esm/types/crm/entity-type.mjs +57 -0
  247. package/dist/esm/types/crm/entity-type.mjs.map +1 -0
  248. package/dist/esm/types/crm/productrow.mjs +17 -0
  249. package/dist/esm/types/crm/productrow.mjs.map +1 -0
  250. package/dist/esm/types/logger.mjs +22 -0
  251. package/dist/esm/types/logger.mjs.map +1 -0
  252. package/dist/esm/types/pull.mjs +83 -0
  253. package/dist/esm/types/pull.mjs.map +1 -0
  254. package/dist/umd/index.js +31216 -26905
  255. package/dist/umd/index.js.map +1 -1
  256. package/dist/umd/index.min.js +63 -40
  257. package/dist/umd/index.min.js.map +1 -1
  258. package/package.json +36 -31
@@ -0,0 +1,304 @@
1
+ /**
2
+ * @package @bitrix24/b24jssdk
3
+ * @version 1.0.1
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 { Type } from '../type.mjs';
10
+
11
+ var __defProp = Object.defineProperty;
12
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
13
+ class IbanSpecification {
14
+ static {
15
+ __name(this, "IbanSpecification");
16
+ }
17
+ /**
18
+ * the code of the country
19
+ */
20
+ countryCode;
21
+ /**
22
+ * the length of the IBAN
23
+ */
24
+ length;
25
+ /**
26
+ * the structure of the underlying BBAN (for validation and formatting)
27
+ */
28
+ structure;
29
+ /**
30
+ * an example valid IBAN
31
+ */
32
+ example;
33
+ _cachedRegex = null;
34
+ constructor(countryCode, length, structure, example) {
35
+ this.countryCode = countryCode;
36
+ this.length = length;
37
+ this.structure = structure;
38
+ this.example = example;
39
+ }
40
+ /**
41
+ * Check if the passed iban is valid, according to this specification.
42
+ *
43
+ * @param {string} iban the iban to validate
44
+ * @returns {boolean} true if valid, false otherwise
45
+ */
46
+ isValid(iban) {
47
+ return this.length === iban.length && this.countryCode === iban.slice(0, 2) && this._regex().test(iban.slice(4)) && this._iso7064Mod9710(this._iso13616Prepare(iban)) == 1;
48
+ }
49
+ /**
50
+ * Convert the passed IBAN to a country-specific BBAN.
51
+ *
52
+ * @param iban the IBAN to convert
53
+ * @param separator the separator to use between BBAN blocks
54
+ * @returns {string} the BBAN
55
+ */
56
+ toBBAN(iban, separator) {
57
+ return (this._regex().exec(iban.slice(4) || "") || []).slice(1).join(separator);
58
+ }
59
+ /**
60
+ * Convert the passed BBAN to an IBAN for this country specification.
61
+ * Please note that <i>"generation of the IBAN shall be the exclusive responsibility of the bank/branch servicing the account"</i>.
62
+ * This method implements the preferred algorithm described in http://en.wikipedia.org/wiki/International_Bank_Account_Number#Generating_IBAN_check_digits
63
+ *
64
+ * @param bban the BBAN to convert to IBAN
65
+ * @returns {string} the IBAN
66
+ */
67
+ fromBBAN(bban) {
68
+ if (!this.isValidBBAN(bban)) {
69
+ throw new Error("Invalid BBAN");
70
+ }
71
+ const remainder = this._iso7064Mod9710(
72
+ this._iso13616Prepare(this.countryCode + "00" + bban)
73
+ );
74
+ const checkDigit = ("0" + (98 - remainder)).slice(-2);
75
+ return this.countryCode + checkDigit + bban;
76
+ }
77
+ /**
78
+ * Check of the passed BBAN is valid.
79
+ * This function only checks the format of the BBAN (length and compliance with alphanumeric specifications) but does not
80
+ * verify the check digit.
81
+ *
82
+ * @param bban the BBAN to validate
83
+ * @returns {boolean} true if the passed bban is a valid BBAN, according to this specification, false otherwise
84
+ */
85
+ isValidBBAN(bban) {
86
+ return this.length - 4 === bban.length && this._regex().test(bban);
87
+ }
88
+ /**
89
+ * Lazy-loaded regex (parse the structure and construct the regular expression the first time we need it for validation)
90
+ */
91
+ _regex() {
92
+ if (null === this._cachedRegex) {
93
+ this._cachedRegex = this._parseStructure(this.structure);
94
+ }
95
+ return this._cachedRegex;
96
+ }
97
+ /**
98
+ * Parse the BBAN structure used to configure each IBAN Specification and returns a matching regular expression.
99
+ * A structure is composed of blocks of three characters (one letter and two digits).
100
+ * Each block represents
101
+ * a logical group in the typical representation of the BBAN.
102
+ * For each group, the letter indicates which characters
103
+ * are allowed in this group, and the following 2-digits number tells the length of the group.
104
+ *
105
+ * @param {string} structure the structure to parse
106
+ * @returns {RegExp}
107
+ */
108
+ _parseStructure(structure) {
109
+ const regex = (structure.match(/(.{3})/g) || []).map(
110
+ (block) => {
111
+ let format;
112
+ const pattern = block.slice(0, 1);
113
+ const repeats = Number.parseInt(block.slice(1), 10);
114
+ switch (pattern) {
115
+ case "A":
116
+ format = "0-9A-Za-z";
117
+ break;
118
+ case "B":
119
+ format = "0-9A-Z";
120
+ break;
121
+ case "C":
122
+ format = "A-Za-z";
123
+ break;
124
+ case "F":
125
+ format = "0-9";
126
+ break;
127
+ case "L":
128
+ format = "a-z";
129
+ break;
130
+ case "U":
131
+ format = "A-Z";
132
+ break;
133
+ case "W":
134
+ format = "0-9a-z";
135
+ break;
136
+ }
137
+ return "([" + format + "]{" + repeats + "})";
138
+ }
139
+ );
140
+ return new RegExp("^" + regex.join("") + "$");
141
+ }
142
+ /**
143
+ * Prepare an IBAN for mod 97 computation by moving the first 4 chars to the end and transforming the letters to
144
+ * numbers (A = 10, B = 11, ..., Z = 35), as specified in ISO13616.
145
+ *
146
+ * @param {string} iban the IBAN
147
+ * @returns {string} the prepared IBAN
148
+ */
149
+ _iso13616Prepare(iban) {
150
+ const A = "A".charCodeAt(0);
151
+ const Z = "Z".charCodeAt(0);
152
+ iban = iban.toUpperCase();
153
+ iban = iban.substring(4) + iban.substring(0, 4);
154
+ return iban.split("").map((n) => {
155
+ const code = n.charCodeAt(0);
156
+ if (code >= A && code <= Z) {
157
+ return (code - A + 10).toString();
158
+ } else {
159
+ return n;
160
+ }
161
+ }).join("");
162
+ }
163
+ /**
164
+ * Calculates MOD 97 10 of the passed IBAN as specified in ISO7064.
165
+ *
166
+ * @param iban
167
+ * @returns {number} MOD
168
+ */
169
+ _iso7064Mod9710(iban) {
170
+ let remainder = iban;
171
+ let block;
172
+ while (remainder.length > 2) {
173
+ block = remainder.slice(0, 9);
174
+ remainder = Number.parseInt(block, 10) % 97 + remainder.slice(block.length);
175
+ }
176
+ return Number.parseInt(remainder, 10) % 97;
177
+ }
178
+ }
179
+ class FormatterIban {
180
+ static {
181
+ __name(this, "FormatterIban");
182
+ }
183
+ static isInternalConstructing = false;
184
+ static instance = null;
185
+ _countries;
186
+ // region Init ////
187
+ constructor() {
188
+ if (!FormatterIban.isInternalConstructing) {
189
+ throw new TypeError("FormatterIban is not constructable");
190
+ }
191
+ FormatterIban.isInternalConstructing = false;
192
+ this._countries = /* @__PURE__ */ new Map();
193
+ }
194
+ /**
195
+ * @return FormatterIban
196
+ */
197
+ static getInstance() {
198
+ if (!FormatterIban.instance) {
199
+ FormatterIban.isInternalConstructing = true;
200
+ FormatterIban.instance = new FormatterIban();
201
+ }
202
+ return FormatterIban.instance;
203
+ }
204
+ addSpecification(IBAN) {
205
+ this._countries.set(IBAN.countryCode, IBAN);
206
+ }
207
+ // endregion ////
208
+ // region IBAN ////
209
+ /**
210
+ * Check if an IBAN is valid.
211
+ *
212
+ * @param {string} iban the IBAN to validate.
213
+ * @returns {boolean} true if the passed IBAN is valid, false otherwise
214
+ */
215
+ isValid(iban) {
216
+ if (!Type.isString(iban)) {
217
+ return false;
218
+ }
219
+ iban = this.electronicFormat(iban);
220
+ const countryCode = iban.slice(0, 2);
221
+ if (!this._countries.has(countryCode)) {
222
+ throw new Error(`No country with code ${countryCode}`);
223
+ }
224
+ const countryStructure = this._countries.get(countryCode);
225
+ return !!countryStructure && countryStructure.isValid(iban);
226
+ }
227
+ printFormat(iban, separator) {
228
+ if (typeof separator == "undefined") {
229
+ separator = " ";
230
+ }
231
+ const EVERY_FOUR_CHARS = /(.{4})(?!$)/g;
232
+ return this.electronicFormat(iban).replace(
233
+ EVERY_FOUR_CHARS,
234
+ "$1" + separator
235
+ );
236
+ }
237
+ electronicFormat(iban) {
238
+ const NON_ALPHANUM = /[^a-z0-9]/gi;
239
+ return iban.replace(NON_ALPHANUM, "").toUpperCase();
240
+ }
241
+ // endregion ////
242
+ // region BBAN ////
243
+ /**
244
+ * Convert an IBAN to a BBAN.
245
+ *
246
+ * @param iban
247
+ * @param {string} [separator] the separator to use between the blocks of the BBAN, defaults to ' '
248
+ * @returns {string|*} Convert an IBAN to a BBAN.
249
+ */
250
+ toBBAN(iban, separator) {
251
+ if (typeof separator == "undefined") {
252
+ separator = " ";
253
+ }
254
+ iban = this.electronicFormat(iban);
255
+ const countryCode = iban.slice(0, 2);
256
+ if (!this._countries.has(countryCode)) {
257
+ throw new Error(`No country with code ${countryCode}`);
258
+ }
259
+ const countryStructure = this._countries.get(countryCode);
260
+ if (!countryStructure) {
261
+ throw new Error(`No country with code ${countryCode}`);
262
+ }
263
+ return countryStructure.toBBAN(iban, separator);
264
+ }
265
+ /**
266
+ * Convert the passed BBAN to an IBAN for this country specification.
267
+ * Please note that <i>"generation of the IBAN shall be the exclusive responsibility of the bank/branch servicing the account"</i>.
268
+ * This method implements the preferred algorithm described in http://en.wikipedia.org/wiki/International_Bank_Account_Number#Generating_IBAN_check_digits
269
+ *
270
+ * @param countryCode the country of the BBAN
271
+ * @param bban the BBAN to convert to IBAN
272
+ * @returns {string} the IBAN
273
+ */
274
+ fromBBAN(countryCode, bban) {
275
+ if (!this._countries.has(countryCode)) {
276
+ throw new Error(`No country with code ${countryCode}`);
277
+ }
278
+ const countryStructure = this._countries.get(countryCode);
279
+ if (!countryStructure) {
280
+ throw new Error(`No country with code ${countryCode}`);
281
+ }
282
+ return countryStructure.fromBBAN(this.electronicFormat(bban));
283
+ }
284
+ /**
285
+ * Check the validity of the passed BBAN.
286
+ *
287
+ * @param countryCode the country of the BBAN
288
+ * @param bban the BBAN to check the validity of
289
+ */
290
+ isValidBBAN(countryCode, bban) {
291
+ if (!Type.isString(bban)) {
292
+ return false;
293
+ }
294
+ if (!this._countries.has(countryCode)) {
295
+ throw new Error(`No country with code ${countryCode}`);
296
+ }
297
+ const countryStructure = this._countries.get(countryCode);
298
+ return !!countryStructure && countryStructure.isValidBBAN(this.electronicFormat(bban));
299
+ }
300
+ // endregion ////
301
+ }
302
+
303
+ export { FormatterIban, IbanSpecification };
304
+ //# sourceMappingURL=iban.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iban.mjs","sources":["../../../../src/tools/formatters/iban.ts"],"sourcesContent":["import { Type } from './../type'\n\nexport class IbanSpecification {\n /**\n * the code of the country\n */\n readonly countryCode: string\n\n /**\n * the length of the IBAN\n */\n readonly length: number\n\n /**\n * the structure of the underlying BBAN (for validation and formatting)\n */\n readonly structure: string\n\n /**\n * an example valid IBAN\n */\n readonly example: string\n\n private _cachedRegex: null | RegExp = null\n\n constructor(\n countryCode: string,\n length: number,\n structure: string,\n example: string\n ) {\n this.countryCode = countryCode\n this.length = length\n this.structure = structure\n this.example = example\n }\n\n /**\n * Check if the passed iban is valid, according to this specification.\n *\n * @param {string} iban the iban to validate\n * @returns {boolean} true if valid, false otherwise\n */\n isValid(iban: string): boolean {\n return (\n this.length === iban.length\n && this.countryCode === iban.slice(0, 2)\n && this._regex().test(iban.slice(4))\n && this._iso7064Mod9710(this._iso13616Prepare(iban)) == 1\n )\n }\n\n /**\n * Convert the passed IBAN to a country-specific BBAN.\n *\n * @param iban the IBAN to convert\n * @param separator the separator to use between BBAN blocks\n * @returns {string} the BBAN\n */\n toBBAN(iban: string, separator: string): string {\n return (this._regex().exec(iban.slice(4) || '') || [])\n .slice(1)\n .join(separator)\n }\n\n /**\n * Convert the passed BBAN to an IBAN for this country specification.\n * Please note that <i>\"generation of the IBAN shall be the exclusive responsibility of the bank/branch servicing the account\"</i>.\n * This method implements the preferred algorithm described in http://en.wikipedia.org/wiki/International_Bank_Account_Number#Generating_IBAN_check_digits\n *\n * @param bban the BBAN to convert to IBAN\n * @returns {string} the IBAN\n */\n fromBBAN(bban: string): string {\n if (!this.isValidBBAN(bban)) {\n throw new Error('Invalid BBAN')\n }\n\n const remainder = this._iso7064Mod9710(\n this._iso13616Prepare(this.countryCode + '00' + bban)\n )\n\n const checkDigit = ('0' + (98 - remainder)).slice(-2)\n\n return this.countryCode + checkDigit + bban\n }\n\n /**\n * Check of the passed BBAN is valid.\n * This function only checks the format of the BBAN (length and compliance with alphanumeric specifications) but does not\n * verify the check digit.\n *\n * @param bban the BBAN to validate\n * @returns {boolean} true if the passed bban is a valid BBAN, according to this specification, false otherwise\n */\n isValidBBAN(bban: string): boolean {\n return this.length - 4 === bban.length && this._regex().test(bban)\n }\n\n /**\n * Lazy-loaded regex (parse the structure and construct the regular expression the first time we need it for validation)\n */\n private _regex(): RegExp {\n if (null === this._cachedRegex) {\n this._cachedRegex = this._parseStructure(this.structure)\n }\n\n return this._cachedRegex\n }\n\n /**\n * Parse the BBAN structure used to configure each IBAN Specification and returns a matching regular expression.\n * A structure is composed of blocks of three characters (one letter and two digits).\n * Each block represents\n * a logical group in the typical representation of the BBAN.\n * For each group, the letter indicates which characters\n * are allowed in this group, and the following 2-digits number tells the length of the group.\n *\n * @param {string} structure the structure to parse\n * @returns {RegExp}\n */\n private _parseStructure(structure: string): RegExp {\n // split in blocks of 3 chars\n const regex = (structure.match(/(.{3})/g) || []).map(\n (block: string): string => {\n // parse each structure block (1-char + 2-digits)\n let format\n const pattern = block.slice(0, 1)\n const repeats = Number.parseInt(block.slice(1), 10)\n\n switch (pattern) {\n case 'A':\n format = '0-9A-Za-z'\n break\n case 'B':\n format = '0-9A-Z'\n break\n case 'C':\n format = 'A-Za-z'\n break\n case 'F':\n format = '0-9'\n break\n case 'L':\n format = 'a-z'\n break\n case 'U':\n format = 'A-Z'\n break\n case 'W':\n format = '0-9a-z'\n break\n }\n\n return '([' + format + ']{' + repeats + '})'\n }\n )\n\n return new RegExp('^' + regex.join('') + '$')\n }\n\n /**\n * Prepare an IBAN for mod 97 computation by moving the first 4 chars to the end and transforming the letters to\n * numbers (A = 10, B = 11, ..., Z = 35), as specified in ISO13616.\n *\n * @param {string} iban the IBAN\n * @returns {string} the prepared IBAN\n */\n private _iso13616Prepare(iban: string): string {\n const A = 'A'.charCodeAt(0)\n\n const Z = 'Z'.charCodeAt(0)\n\n iban = iban.toUpperCase()\n\n iban = iban.substring(4) + iban.substring(0, 4)\n return (\n iban\n .split('')\n .map((n: string): string => {\n const code = n.charCodeAt(0)\n if (code >= A && code <= Z) {\n // A = 10, B = 11, ... Z = 35\n return (code - A + 10).toString()\n } else {\n return n\n }\n })\n .join('')\n )\n }\n\n /**\n * Calculates MOD 97 10 of the passed IBAN as specified in ISO7064.\n *\n * @param iban\n * @returns {number} MOD\n */\n private _iso7064Mod9710(iban: string): number {\n let remainder = iban\n let block\n\n while (remainder.length > 2) {\n block = remainder.slice(0, 9)\n remainder\n = (Number.parseInt(block, 10) % 97) + remainder.slice(block.length)\n }\n\n return Number.parseInt(remainder, 10) % 97\n }\n}\n\nexport class FormatterIban {\n private static isInternalConstructing: boolean = false\n private static instance: FormatterIban | null = null\n\n private _countries: Map<string, IbanSpecification>\n\n // region Init ////\n private constructor() {\n if (!FormatterIban.isInternalConstructing) {\n throw new TypeError('FormatterIban is not constructable')\n }\n FormatterIban.isInternalConstructing = false\n\n this._countries = new Map()\n }\n\n /**\n * @return FormatterIban\n */\n static getInstance(): FormatterIban {\n if (!FormatterIban.instance) {\n FormatterIban.isInternalConstructing = true\n FormatterIban.instance = new FormatterIban()\n }\n\n return FormatterIban.instance\n }\n\n addSpecification(IBAN: IbanSpecification): void {\n this._countries.set(IBAN.countryCode, IBAN)\n }\n\n // endregion ////\n\n // region IBAN ////\n /**\n * Check if an IBAN is valid.\n *\n * @param {string} iban the IBAN to validate.\n * @returns {boolean} true if the passed IBAN is valid, false otherwise\n */\n isValid(iban: string): boolean {\n if (!Type.isString(iban)) {\n return false\n }\n\n iban = this.electronicFormat(iban)\n const countryCode = iban.slice(0, 2)\n\n if (!this._countries.has(countryCode)) {\n throw new Error(`No country with code ${countryCode}`)\n }\n\n const countryStructure = this._countries.get(countryCode)\n\n return !!countryStructure && countryStructure.isValid(iban)\n }\n\n printFormat(iban: string, separator?: string): string {\n if (typeof separator == 'undefined') {\n separator = ' '\n }\n\n const EVERY_FOUR_CHARS = /(.{4})(?!$)/g\n\n return this.electronicFormat(iban).replace(\n EVERY_FOUR_CHARS,\n '$1' + separator\n )\n }\n\n electronicFormat(iban: string): string {\n const NON_ALPHANUM = /[^a-z0-9]/gi\n\n return iban.replace(NON_ALPHANUM, '').toUpperCase()\n }\n\n // endregion ////\n\n // region BBAN ////\n /**\n * Convert an IBAN to a BBAN.\n *\n * @param iban\n * @param {string} [separator] the separator to use between the blocks of the BBAN, defaults to ' '\n * @returns {string|*} Convert an IBAN to a BBAN.\n */\n toBBAN(iban: string, separator?: string): string {\n if (typeof separator == 'undefined') {\n separator = ' '\n }\n\n iban = this.electronicFormat(iban)\n\n const countryCode = iban.slice(0, 2)\n if (!this._countries.has(countryCode)) {\n throw new Error(`No country with code ${countryCode}`)\n }\n\n const countryStructure = this._countries.get(countryCode)\n\n if (!countryStructure) {\n throw new Error(`No country with code ${countryCode}`)\n }\n\n return countryStructure.toBBAN(iban, separator)\n }\n\n /**\n * Convert the passed BBAN to an IBAN for this country specification.\n * Please note that <i>\"generation of the IBAN shall be the exclusive responsibility of the bank/branch servicing the account\"</i>.\n * This method implements the preferred algorithm described in http://en.wikipedia.org/wiki/International_Bank_Account_Number#Generating_IBAN_check_digits\n *\n * @param countryCode the country of the BBAN\n * @param bban the BBAN to convert to IBAN\n * @returns {string} the IBAN\n */\n fromBBAN(countryCode: string, bban: string): string {\n if (!this._countries.has(countryCode)) {\n throw new Error(`No country with code ${countryCode}`)\n }\n\n const countryStructure = this._countries.get(countryCode)\n\n if (!countryStructure) {\n throw new Error(`No country with code ${countryCode}`)\n }\n\n return countryStructure.fromBBAN(this.electronicFormat(bban))\n }\n\n /**\n * Check the validity of the passed BBAN.\n *\n * @param countryCode the country of the BBAN\n * @param bban the BBAN to check the validity of\n */\n isValidBBAN(countryCode: string, bban: string): boolean {\n if (!Type.isString(bban)) {\n return false\n }\n\n if (!this._countries.has(countryCode)) {\n throw new Error(`No country with code ${countryCode}`)\n }\n\n const countryStructure = this._countries.get(countryCode)\n\n return (\n !!countryStructure\n && countryStructure.isValidBBAN(this.electronicFormat(bban))\n )\n }\n\n // endregion ////\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * @package @bitrix24/b24jssdk
3
+ * @version 1.0.1
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 { Type } from '../type.mjs';
10
+
11
+ var __defProp = Object.defineProperty;
12
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
13
+ class FormatterNumbers {
14
+ static {
15
+ __name(this, "FormatterNumbers");
16
+ }
17
+ static isInternalConstructing = false;
18
+ static instance = null;
19
+ _defLocale = null;
20
+ constructor() {
21
+ if (!FormatterNumbers.isInternalConstructing) {
22
+ throw new TypeError("FormatterNumber is not constructable");
23
+ }
24
+ FormatterNumbers.isInternalConstructing = false;
25
+ }
26
+ /**
27
+ * @return FormatterNumbers
28
+ */
29
+ static getInstance() {
30
+ if (!FormatterNumbers.instance) {
31
+ FormatterNumbers.isInternalConstructing = true;
32
+ FormatterNumbers.instance = new FormatterNumbers();
33
+ }
34
+ return FormatterNumbers.instance;
35
+ }
36
+ setDefLocale(locale) {
37
+ this._defLocale = locale;
38
+ }
39
+ format(value, locale) {
40
+ let formatter;
41
+ if (typeof locale === "undefined" || !Type.isStringFilled(locale)) {
42
+ locale = Type.isStringFilled(this._defLocale) ? this._defLocale || "en" : typeof navigator === "undefined" ? "en" : navigator?.language || "en";
43
+ }
44
+ if (Number.isInteger(value)) {
45
+ formatter = new Intl.NumberFormat(locale, {
46
+ minimumFractionDigits: 0,
47
+ maximumFractionDigits: 0
48
+ });
49
+ } else {
50
+ formatter = new Intl.NumberFormat(locale, {
51
+ minimumFractionDigits: 2,
52
+ maximumFractionDigits: 2
53
+ });
54
+ }
55
+ let result = formatter.format(value);
56
+ if (locale.includes("ru")) {
57
+ result = result.replace(",", ".");
58
+ }
59
+ return result;
60
+ }
61
+ }
62
+
63
+ export { FormatterNumbers as default };
64
+ //# sourceMappingURL=numbers.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"numbers.mjs","sources":["../../../../src/tools/formatters/numbers.ts"],"sourcesContent":["import { Type } from '../type'\n\nexport default class FormatterNumbers {\n private static isInternalConstructing: boolean = false\n private static instance: FormatterNumbers | null = null\n private _defLocale: null | string = null\n private constructor() {\n if (!FormatterNumbers.isInternalConstructing) {\n throw new TypeError('FormatterNumber is not constructable')\n }\n FormatterNumbers.isInternalConstructing = false\n }\n\n /**\n * @return FormatterNumbers\n */\n static getInstance(): FormatterNumbers {\n if (!FormatterNumbers.instance) {\n FormatterNumbers.isInternalConstructing = true\n FormatterNumbers.instance = new FormatterNumbers()\n }\n return FormatterNumbers.instance\n }\n\n setDefLocale(locale: string) {\n this._defLocale = locale\n }\n\n format(value: number, locale?: string): string {\n let formatter\n if (typeof locale === 'undefined' || !Type.isStringFilled(locale)) {\n locale = Type.isStringFilled(this._defLocale)\n ? this._defLocale || 'en'\n : (\n typeof navigator === 'undefined'\n ? 'en'\n : navigator?.language || 'en'\n )\n }\n\n if (Number.isInteger(value)) {\n formatter = new Intl.NumberFormat(locale, {\n minimumFractionDigits: 0,\n maximumFractionDigits: 0\n })\n } else {\n formatter = new Intl.NumberFormat(locale, {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2\n })\n }\n\n let result = formatter.format(value)\n if (locale.includes('ru')) {\n result = result.replace(',', '.')\n }\n\n return result\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAEA,MAAqB,gBAAA,CAAiB;AAAA,EAFtC;AAEsC,IAAA,MAAA,CAAA,IAAA,EAAA,kBAAA,CAAA;AAAA;AAAA,EACpC,OAAe,sBAAA,GAAkC,KAAA;AAAA,EACjD,OAAe,QAAA,GAAoC,IAAA;AAAA,EAC3C,UAAA,GAA4B,IAAA;AAAA,EAC5B,WAAA,GAAc;AACpB,IAAA,IAAI,CAAC,iBAAiB,sBAAA,EAAwB;AAC5C,MAAA,MAAM,IAAI,UAAU,sCAAsC,CAAA;AAAA,IAC5D;AACA,IAAA,gBAAA,CAAiB,sBAAA,GAAyB,KAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,WAAA,GAAgC;AACrC,IAAA,IAAI,CAAC,iBAAiB,QAAA,EAAU;AAC9B,MAAA,gBAAA,CAAiB,sBAAA,GAAyB,IAAA;AAC1C,MAAA,gBAAA,CAAiB,QAAA,GAAW,IAAI,gBAAA,EAAiB;AAAA,IACnD;AACA,IAAA,OAAO,gBAAA,CAAiB,QAAA;AAAA,EAC1B;AAAA,EAEA,aAAa,MAAA,EAAgB;AAC3B,IAAA,IAAA,CAAK,UAAA,GAAa,MAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CAAO,OAAe,MAAA,EAAyB;AAC7C,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,IAAA,CAAK,cAAA,CAAe,MAAM,CAAA,EAAG;AACjE,MAAA,MAAA,GAAS,IAAA,CAAK,cAAA,CAAe,IAAA,CAAK,UAAU,CAAA,GACxC,IAAA,CAAK,UAAA,IAAc,IAAA,GAEjB,OAAO,SAAA,KAAc,WAAA,GACjB,IAAA,GACA,WAAW,QAAA,IAAY,IAAA;AAAA,IAEnC;AAEA,IAAA,IAAI,MAAA,CAAO,SAAA,CAAU,KAAK,CAAA,EAAG;AAC3B,MAAA,SAAA,GAAY,IAAI,IAAA,CAAK,YAAA,CAAa,MAAA,EAAQ;AAAA,QACxC,qBAAA,EAAuB,CAAA;AAAA,QACvB,qBAAA,EAAuB;AAAA,OACxB,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,SAAA,GAAY,IAAI,IAAA,CAAK,YAAA,CAAa,MAAA,EAAQ;AAAA,QACxC,qBAAA,EAAuB,CAAA;AAAA,QACvB,qBAAA,EAAuB;AAAA,OACxB,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,MAAA,GAAS,SAAA,CAAU,MAAA,CAAO,KAAK,CAAA;AACnC,IAAA,IAAI,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,EAAG;AACzB,MAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA;AAAA,IAClC;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AACF;;;;"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * @package @bitrix24/b24jssdk
3
+ * @version 1.0.1
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
+ function pick(data, keys) {
12
+ const result = {};
13
+ for (const key of keys) {
14
+ result[key] = data[key];
15
+ }
16
+ return result;
17
+ }
18
+ __name(pick, "pick");
19
+ function omit(data, keys) {
20
+ const result = { ...data };
21
+ for (const key of keys) {
22
+ delete result[key];
23
+ }
24
+ return result;
25
+ }
26
+ __name(omit, "omit");
27
+ function isArrayOfArray(item) {
28
+ return Array.isArray(item[0]);
29
+ }
30
+ __name(isArrayOfArray, "isArrayOfArray");
31
+ function getEnumValue(enumObj, value) {
32
+ return Object.values(enumObj).includes(value) ? value : void 0;
33
+ }
34
+ __name(getEnumValue, "getEnumValue");
35
+
36
+ export { getEnumValue, isArrayOfArray, omit, pick };
37
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":["../../../src/tools/index.ts"],"sourcesContent":["/**\n * @todo add docs\n */\nexport function pick<Data extends object, Keys extends keyof Data>(data: Data, keys: Keys[]): Pick<Data, Keys> {\n const result = {} as Pick<Data, Keys>\n\n for (const key of keys) {\n result[key] = data[key]\n }\n\n return result\n}\n\n/**\n * @todo add docs\n */\nexport function omit<Data extends object, Keys extends keyof Data>(data: Data, keys: Keys[]): Omit<Data, Keys> {\n const result = { ...data }\n\n for (const key of keys) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete result[key]\n }\n\n return result as Omit<Data, Keys>\n}\n\n/**\n * @todo add docs\n */\nexport function isArrayOfArray<A>(item: A[] | A[][]): item is A[][] {\n return Array.isArray(item[0])\n}\n\n/**\n * @todo add docs\n *\n * @example\n * const result = getEnumValue(EnumBizprocDocumentType, 'CCrmDocumentSmartOrder')\n */\nexport function getEnumValue<T extends Record<string, string | number>>(\n enumObj: T,\n value: string | number\n): T[keyof T] | undefined {\n return (Object.values(enumObj) as (string | number)[]).includes(value)\n ? value as T[keyof T]\n : undefined\n}\n"],"names":[],"mappings":";;;;;;;;;;AAGO,SAAS,IAAA,CAAmD,MAAY,IAAA,EAAgC;AAC7G,EAAA,MAAM,SAAS,EAAC;AAEhB,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,MAAA,CAAO,GAAG,CAAA,GAAI,IAAA,CAAK,GAAG,CAAA;AAAA,EACxB;AAEA,EAAA,OAAO,MAAA;AACT;AARgB,MAAA,CAAA,IAAA,EAAA,MAAA,CAAA;AAaT,SAAS,IAAA,CAAmD,MAAY,IAAA,EAAgC;AAC7G,EAAA,MAAM,MAAA,GAAS,EAAE,GAAG,IAAA,EAAK;AAEzB,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AAEtB,IAAA,OAAO,OAAO,GAAG,CAAA;AAAA,EACnB;AAEA,EAAA,OAAO,MAAA;AACT;AATgB,MAAA,CAAA,IAAA,EAAA,MAAA,CAAA;AAcT,SAAS,eAAkB,IAAA,EAAkC;AAClE,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAC,CAAA;AAC9B;AAFgB,MAAA,CAAA,cAAA,EAAA,gBAAA,CAAA;AAUT,SAAS,YAAA,CACd,SACA,KAAA,EACwB;AACxB,EAAA,OAAQ,OAAO,MAAA,CAAO,OAAO,EAA0B,QAAA,CAAS,KAAK,IACjE,KAAA,GACA,MAAA;AACN;AAPgB,MAAA,CAAA,YAAA,EAAA,cAAA,CAAA;;;;"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * @package @bitrix24/b24jssdk
3
+ * @version 1.0.1
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
+ const useScrollSize = /* @__PURE__ */ __name(() => {
12
+ return {
13
+ scrollWidth: Math.max(
14
+ document.documentElement.scrollWidth,
15
+ document.documentElement.offsetWidth
16
+ ),
17
+ scrollHeight: Math.max(
18
+ document.documentElement.scrollHeight,
19
+ document.documentElement.offsetHeight
20
+ )
21
+ };
22
+ }, "useScrollSize");
23
+
24
+ export { useScrollSize as default };
25
+ //# sourceMappingURL=scroll-size.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scroll-size.mjs","sources":["../../../src/tools/scroll-size.ts"],"sourcesContent":["/**\n * Returns scroll info\n */\nconst useScrollSize = (): { scrollWidth: number, scrollHeight: number } => {\n return {\n scrollWidth: Math.max(\n document.documentElement.scrollWidth,\n document.documentElement.offsetWidth\n ),\n scrollHeight: Math.max(\n document.documentElement.scrollHeight,\n document.documentElement.offsetHeight\n )\n }\n}\n\nexport default useScrollSize\n"],"names":[],"mappings":";;;;;;;;;;AAGA,MAAM,gCAAgB,MAAA,CAAA,MAAqD;AACzE,EAAA,OAAO;AAAA,IACL,aAAa,IAAA,CAAK,GAAA;AAAA,MAChB,SAAS,eAAA,CAAgB,WAAA;AAAA,MACzB,SAAS,eAAA,CAAgB;AAAA,KAC3B;AAAA,IACA,cAAc,IAAA,CAAK,GAAA;AAAA,MACjB,SAAS,eAAA,CAAgB,YAAA;AAAA,MACzB,SAAS,eAAA,CAAgB;AAAA;AAC3B,GACF;AACF,CAAA,EAXsB,eAAA;;;;"}