@fintekkers/ledger-models 0.1.119 → 0.1.129

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 (260) hide show
  1. package/.npmrc.example +4 -0
  2. package/catalog/fields.json +275 -0
  3. package/catalog/measures.json +259 -0
  4. package/node/fintekkers/models/portfolio/portfolio_pb.js +13 -19
  5. package/node/fintekkers/models/position/field_pb.js +1 -7
  6. package/node/fintekkers/models/position/measure_pb.d.ts +18 -0
  7. package/node/fintekkers/models/position/measure_pb.js +20 -8
  8. package/node/fintekkers/models/position/position_filter_pb.js +7 -13
  9. package/node/fintekkers/models/position/position_pb.d.ts +7 -0
  10. package/node/fintekkers/models/position/position_pb.js +64 -17
  11. package/node/fintekkers/models/position/position_status_pb.js +1 -7
  12. package/node/fintekkers/models/position/position_util_pb.js +11 -17
  13. package/node/fintekkers/models/price/price_pb.d.ts +4 -0
  14. package/node/fintekkers/models/price/price_pb.js +45 -19
  15. package/node/fintekkers/models/price/price_type_grpc_pb.js +1 -0
  16. package/node/fintekkers/models/price/price_type_pb.d.ts +15 -0
  17. package/node/fintekkers/models/price/price_type_pb.js +30 -0
  18. package/node/fintekkers/models/security/bond/auction_type_pb.js +1 -7
  19. package/node/fintekkers/models/security/bond/issuance_pb.js +17 -23
  20. package/node/fintekkers/models/security/coupon_frequency_pb.js +1 -7
  21. package/node/fintekkers/models/security/coupon_type_pb.js +1 -7
  22. package/node/fintekkers/models/security/identifier/identifier_pb.js +9 -15
  23. package/node/fintekkers/models/security/identifier/identifier_type_pb.d.ts +1 -0
  24. package/node/fintekkers/models/security/identifier/identifier_type_pb.js +2 -7
  25. package/node/fintekkers/models/security/index/index_type_grpc_pb.js +1 -0
  26. package/node/fintekkers/models/security/index/index_type_pb.d.ts +26 -0
  27. package/node/fintekkers/models/security/index/index_type_pb.js +41 -0
  28. package/node/fintekkers/models/security/index_composition_pb.d.ts +126 -0
  29. package/node/fintekkers/models/security/index_composition_pb.js +992 -0
  30. package/node/fintekkers/models/security/security_pb.d.ts +382 -0
  31. package/node/fintekkers/models/security/security_pb.js +3183 -57
  32. package/node/fintekkers/models/security/security_quantity_type_pb.js +1 -7
  33. package/node/fintekkers/models/security/security_type_pb.d.ts +3 -0
  34. package/node/fintekkers/models/security/security_type_pb.js +5 -8
  35. package/node/fintekkers/models/security/tenor_pb.js +9 -15
  36. package/node/fintekkers/models/security/tenor_type_pb.js +1 -7
  37. package/node/fintekkers/models/strategy/strategy_allocation_pb.js +13 -19
  38. package/node/fintekkers/models/strategy/strategy_pb.js +14 -20
  39. package/node/fintekkers/models/transaction/transaction_pb.js +24 -30
  40. package/node/fintekkers/models/transaction/transaction_type_pb.js +1 -7
  41. package/node/fintekkers/models/util/api/api_key_pb.js +10 -16
  42. package/node/fintekkers/models/util/currency_pb.d.ts +27 -0
  43. package/node/fintekkers/models/util/currency_pb.js +170 -0
  44. package/node/fintekkers/models/util/date_range_pb.js +8 -14
  45. package/node/fintekkers/models/util/decimal_value_pb.js +4 -10
  46. package/node/fintekkers/models/util/endpoint_pb.js +7 -13
  47. package/node/fintekkers/models/util/local_date_pb.js +5 -11
  48. package/node/fintekkers/models/util/local_timestamp_pb.js +5 -11
  49. package/node/fintekkers/models/util/lock/node_partition_pb.js +9 -15
  50. package/node/fintekkers/models/util/lock/node_state_pb.js +10 -16
  51. package/node/fintekkers/models/util/uuid_pb.js +3 -9
  52. package/node/fintekkers/models/valuation/cashflow_pb.d.ts +57 -0
  53. package/node/fintekkers/models/valuation/cashflow_pb.js +401 -0
  54. package/node/fintekkers/requests/index_composition/create_index_composition_request_pb.d.ts +79 -0
  55. package/node/fintekkers/requests/index_composition/create_index_composition_request_pb.js +599 -0
  56. package/node/fintekkers/requests/index_composition/get_index_composition_request_pb.d.ts +84 -0
  57. package/node/fintekkers/requests/index_composition/get_index_composition_request_pb.js +624 -0
  58. package/node/fintekkers/requests/portfolio/create_portfolio_request_pb.js +7 -13
  59. package/node/fintekkers/requests/portfolio/create_portfolio_response_pb.js +8 -14
  60. package/node/fintekkers/requests/portfolio/query_portfolio_request_pb.d.ts +3 -0
  61. package/node/fintekkers/requests/portfolio/query_portfolio_request_pb.js +39 -15
  62. package/node/fintekkers/requests/portfolio/query_portfolio_response_pb.js +8 -14
  63. package/node/fintekkers/requests/position/query_position_request_pb.js +15 -27
  64. package/node/fintekkers/requests/position/query_position_response_pb.js +10 -16
  65. package/node/fintekkers/requests/price/create_price_request_pb.js +7 -13
  66. package/node/fintekkers/requests/price/create_price_response_pb.js +8 -14
  67. package/node/fintekkers/requests/price/query_price_request_pb.js +12 -18
  68. package/node/fintekkers/requests/price/query_price_response_pb.js +8 -14
  69. package/node/fintekkers/requests/security/create_security_request_pb.js +7 -13
  70. package/node/fintekkers/requests/security/create_security_response_pb.js +9 -15
  71. package/node/fintekkers/requests/security/get_field_values_request_pb.js +7 -13
  72. package/node/fintekkers/requests/security/get_field_values_response_pb.js +7 -13
  73. package/node/fintekkers/requests/security/get_fields_response_pb.js +8 -17
  74. package/node/fintekkers/requests/security/query_security_request_pb.d.ts +3 -0
  75. package/node/fintekkers/requests/security/query_security_request_pb.js +39 -15
  76. package/node/fintekkers/requests/security/query_security_response_pb.js +9 -15
  77. package/node/fintekkers/requests/transaction/create_transaction_request_pb.js +7 -13
  78. package/node/fintekkers/requests/transaction/create_transaction_response_pb.js +8 -14
  79. package/node/fintekkers/requests/transaction/query_transaction_request_pb.js +10 -16
  80. package/node/fintekkers/requests/transaction/query_transaction_response_pb.js +9 -15
  81. package/node/fintekkers/requests/util/delete_request_pb.d.ts +135 -0
  82. package/node/fintekkers/requests/util/delete_request_pb.js +1051 -0
  83. package/node/fintekkers/requests/util/errors/error_pb.js +7 -13
  84. package/node/fintekkers/requests/util/errors/message_pb.js +6 -12
  85. package/node/fintekkers/requests/util/errors/summary_pb.js +4 -10
  86. package/node/fintekkers/requests/util/lock/lock_request_pb.js +8 -14
  87. package/node/fintekkers/requests/util/lock/lock_response_pb.js +9 -15
  88. package/node/fintekkers/requests/util/operation_pb.js +1 -7
  89. package/node/fintekkers/requests/valuation/curve_request_pb.d.ts +85 -0
  90. package/node/fintekkers/requests/valuation/curve_request_pb.js +646 -0
  91. package/node/fintekkers/requests/valuation/curve_response_pb.d.ts +105 -0
  92. package/node/fintekkers/requests/valuation/curve_response_pb.js +806 -0
  93. package/node/fintekkers/requests/valuation/product_inputs.test.ts +172 -0
  94. package/node/fintekkers/requests/valuation/product_inputs_pb.d.ts +239 -0
  95. package/node/fintekkers/requests/valuation/product_inputs_pb.js +1801 -0
  96. package/node/fintekkers/requests/valuation/valuation_request_pb.d.ts +19 -0
  97. package/node/fintekkers/requests/valuation/valuation_request_pb.js +168 -22
  98. package/node/fintekkers/requests/valuation/valuation_response_pb.d.ts +13 -0
  99. package/node/fintekkers/requests/valuation/valuation_response_pb.js +118 -16
  100. package/node/fintekkers/services/index-composition-service/index_composition_service_grpc_pb.d.ts +60 -0
  101. package/node/fintekkers/services/index-composition-service/index_composition_service_grpc_pb.js +87 -0
  102. package/node/fintekkers/services/index-composition-service/index_composition_service_pb.d.ts +9 -0
  103. package/node/fintekkers/services/index-composition-service/index_composition_service_pb.js +21 -0
  104. package/node/fintekkers/services/lock-service/lock_service_grpc_pb.js +22 -22
  105. package/node/fintekkers/services/lock-service/lock_service_pb.js +15 -21
  106. package/node/fintekkers/services/portfolio-service/portfolio_service_grpc_pb.d.ts +18 -0
  107. package/node/fintekkers/services/portfolio-service/portfolio_service_grpc_pb.js +39 -5
  108. package/node/fintekkers/services/portfolio-service/portfolio_service_pb.d.ts +1 -0
  109. package/node/fintekkers/services/portfolio-service/portfolio_service_pb.js +3 -7
  110. package/node/fintekkers/services/position-service/position_service_grpc_pb.d.ts +37 -0
  111. package/node/fintekkers/services/position-service/position_service_grpc_pb.js +64 -6
  112. package/node/fintekkers/services/position-service/position_service_pb.d.ts +3 -0
  113. package/node/fintekkers/services/position-service/position_service_pb.js +7 -7
  114. package/node/fintekkers/services/price-service/price_service_grpc_pb.js +5 -5
  115. package/node/fintekkers/services/price-service/price_service_pb.js +1 -7
  116. package/node/fintekkers/services/security-service/security_service_grpc_pb.d.ts +18 -0
  117. package/node/fintekkers/services/security-service/security_service_grpc_pb.js +43 -9
  118. package/node/fintekkers/services/security-service/security_service_pb.d.ts +1 -0
  119. package/node/fintekkers/services/security-service/security_service_pb.js +3 -7
  120. package/node/fintekkers/services/transaction-service/transaction_service_grpc_pb.d.ts +55 -0
  121. package/node/fintekkers/services/transaction-service/transaction_service_grpc_pb.js +97 -5
  122. package/node/fintekkers/services/transaction-service/transaction_service_pb.d.ts +4 -0
  123. package/node/fintekkers/services/transaction-service/transaction_service_pb.js +9 -7
  124. package/node/fintekkers/services/valuation-service/valuation_service_grpc_pb.d.ts +19 -0
  125. package/node/fintekkers/services/valuation-service/valuation_service_grpc_pb.js +37 -2
  126. package/node/fintekkers/services/valuation-service/valuation_service_pb.d.ts +2 -0
  127. package/node/fintekkers/services/valuation-service/valuation_service_pb.js +5 -7
  128. package/node/wrappers/models/portfolio/portfolio.js.map +1 -1
  129. package/node/wrappers/models/portfolio/portfolio.test.d.ts +2 -0
  130. package/node/wrappers/models/portfolio/portfolio.test.js +29 -0
  131. package/node/wrappers/models/portfolio/portfolio.test.js.map +1 -0
  132. package/node/wrappers/models/portfolio/portfolio.test.ts +28 -0
  133. package/node/wrappers/models/position/position.js +25 -13
  134. package/node/wrappers/models/position/position.js.map +1 -1
  135. package/node/wrappers/models/position/position.test.js +20 -0
  136. package/node/wrappers/models/position/position.test.js.map +1 -1
  137. package/node/wrappers/models/position/position.test.ts +23 -0
  138. package/node/wrappers/models/position/position.ts +27 -13
  139. package/node/wrappers/models/position/positionfilter.js +1 -1
  140. package/node/wrappers/models/position/positionfilter.js.map +1 -1
  141. package/node/wrappers/models/position/positionfilter.test.js.map +1 -1
  142. package/node/wrappers/models/price/Price.cash.test.d.ts +1 -0
  143. package/node/wrappers/models/price/Price.cash.test.js +42 -0
  144. package/node/wrappers/models/price/Price.cash.test.js.map +1 -0
  145. package/node/wrappers/models/price/Price.cash.test.ts +43 -0
  146. package/node/wrappers/models/price/Price.d.ts +38 -0
  147. package/node/wrappers/models/price/Price.js +111 -0
  148. package/node/wrappers/models/price/Price.js.map +1 -0
  149. package/node/wrappers/models/price/Price.test.d.ts +1 -0
  150. package/node/wrappers/models/price/Price.test.js +55 -0
  151. package/node/wrappers/models/price/Price.test.js.map +1 -0
  152. package/node/wrappers/models/price/Price.test.ts +63 -0
  153. package/node/wrappers/models/price/Price.ts +123 -0
  154. package/node/wrappers/models/security/BondSecurity.d.ts +17 -2
  155. package/node/wrappers/models/security/BondSecurity.js +59 -11
  156. package/node/wrappers/models/security/BondSecurity.js.map +1 -1
  157. package/node/wrappers/models/security/BondSecurity.priceScale.test.d.ts +1 -0
  158. package/node/wrappers/models/security/BondSecurity.priceScale.test.js +36 -0
  159. package/node/wrappers/models/security/BondSecurity.priceScale.test.js.map +1 -0
  160. package/node/wrappers/models/security/BondSecurity.priceScale.test.ts +36 -0
  161. package/node/wrappers/models/security/BondSecurity.test.js +34 -1
  162. package/node/wrappers/models/security/BondSecurity.test.js.map +1 -1
  163. package/node/wrappers/models/security/BondSecurity.test.ts +42 -1
  164. package/node/wrappers/models/security/BondSecurity.ts +63 -11
  165. package/node/wrappers/models/security/security-roundtrip.test.d.ts +1 -0
  166. package/node/wrappers/models/security/security-roundtrip.test.js +173 -0
  167. package/node/wrappers/models/security/security-roundtrip.test.js.map +1 -0
  168. package/node/wrappers/models/security/security-roundtrip.test.ts +192 -0
  169. package/node/wrappers/models/security/security.d.ts +8 -0
  170. package/node/wrappers/models/security/security.js +24 -2
  171. package/node/wrappers/models/security/security.js.map +1 -1
  172. package/node/wrappers/models/security/security.ts +26 -2
  173. package/node/wrappers/models/security/term.js +31 -6
  174. package/node/wrappers/models/security/term.js.map +1 -1
  175. package/node/wrappers/models/security/term.test.js +21 -2
  176. package/node/wrappers/models/security/term.test.js.map +1 -1
  177. package/node/wrappers/models/security/term.test.ts +28 -2
  178. package/node/wrappers/models/security/term.ts +34 -6
  179. package/node/wrappers/models/transaction/transaction.d.ts +59 -1
  180. package/node/wrappers/models/transaction/transaction.derived.test.d.ts +1 -0
  181. package/node/wrappers/models/transaction/transaction.derived.test.js +199 -0
  182. package/node/wrappers/models/transaction/transaction.derived.test.js.map +1 -0
  183. package/node/wrappers/models/transaction/transaction.derived.test.ts +251 -0
  184. package/node/wrappers/models/transaction/transaction.js +350 -2
  185. package/node/wrappers/models/transaction/transaction.js.map +1 -1
  186. package/node/wrappers/models/transaction/transaction.ts +416 -2
  187. package/node/wrappers/models/transaction/transaction_constructor.test.d.ts +1 -0
  188. package/node/wrappers/models/transaction/transaction_constructor.test.js +100 -0
  189. package/node/wrappers/models/transaction/transaction_constructor.test.js.map +1 -0
  190. package/node/wrappers/models/transaction/transaction_constructor.test.ts +111 -0
  191. package/node/wrappers/models/transaction/transaction_type.js.map +1 -1
  192. package/node/wrappers/models/utils/datetime.d.ts +6 -0
  193. package/node/wrappers/models/utils/datetime.js +14 -6
  194. package/node/wrappers/models/utils/datetime.js.map +1 -1
  195. package/node/wrappers/models/utils/datetime.ts +15 -6
  196. package/node/wrappers/models/utils/protoEnum.js.map +1 -1
  197. package/node/wrappers/models/utils/requestcontext.d.ts +17 -3
  198. package/node/wrappers/models/utils/requestcontext.js +39 -7
  199. package/node/wrappers/models/utils/requestcontext.js.map +1 -1
  200. package/node/wrappers/models/utils/requestcontext.test.d.ts +1 -0
  201. package/node/wrappers/models/utils/requestcontext.test.js +108 -0
  202. package/node/wrappers/models/utils/requestcontext.test.js.map +1 -0
  203. package/node/wrappers/models/utils/requestcontext.test.ts +85 -0
  204. package/node/wrappers/models/utils/requestcontext.ts +49 -9
  205. package/node/wrappers/models/utils/serialization.d.ts +2 -1
  206. package/node/wrappers/models/utils/serialization.js +4 -0
  207. package/node/wrappers/models/utils/serialization.js.map +1 -1
  208. package/node/wrappers/models/utils/serialization.test.js +15 -0
  209. package/node/wrappers/models/utils/serialization.test.js.map +1 -1
  210. package/node/wrappers/models/utils/serialization.test.ts +19 -1
  211. package/node/wrappers/models/utils/serialization.ts +5 -4
  212. package/node/wrappers/models/utils/serialization.util.js.map +1 -1
  213. package/node/wrappers/models/utils/uuid.js +9 -1
  214. package/node/wrappers/models/utils/uuid.js.map +1 -1
  215. package/node/wrappers/models/utils/uuid.test.js +22 -4
  216. package/node/wrappers/models/utils/uuid.test.js.map +1 -1
  217. package/node/wrappers/models/utils/uuid.test.ts +26 -5
  218. package/node/wrappers/models/utils/uuid.ts +7 -1
  219. package/node/wrappers/services/apikey.test.d.ts +7 -0
  220. package/node/wrappers/services/apikey.test.js +56 -0
  221. package/node/wrappers/services/apikey.test.js.map +1 -0
  222. package/node/wrappers/services/apikey.test.ts +65 -0
  223. package/node/wrappers/services/portfolio-service/PortfolioService.d.ts +1 -1
  224. package/node/wrappers/services/portfolio-service/PortfolioService.js +8 -2
  225. package/node/wrappers/services/portfolio-service/PortfolioService.js.map +1 -1
  226. package/node/wrappers/services/portfolio-service/PortfolioService.ts +7 -2
  227. package/node/wrappers/services/position-service/PositionService.d.ts +1 -1
  228. package/node/wrappers/services/position-service/PositionService.js +8 -2
  229. package/node/wrappers/services/position-service/PositionService.js.map +1 -1
  230. package/node/wrappers/services/position-service/PositionService.ts +7 -2
  231. package/node/wrappers/services/position-service/position.test.js.map +1 -1
  232. package/node/wrappers/services/price-service/PriceService.d.ts +29 -0
  233. package/node/wrappers/services/price-service/PriceService.js +151 -0
  234. package/node/wrappers/services/price-service/PriceService.js.map +1 -0
  235. package/node/wrappers/services/price-service/PriceService.ts +127 -0
  236. package/node/wrappers/services/price-service/price-wrapper.test.d.ts +1 -0
  237. package/node/wrappers/services/price-service/price-wrapper.test.js +132 -0
  238. package/node/wrappers/services/price-service/price-wrapper.test.js.map +1 -0
  239. package/node/wrappers/services/price-service/price-wrapper.test.ts +120 -0
  240. package/node/wrappers/services/price-service/price.test.d.ts +1 -0
  241. package/node/wrappers/services/price-service/price.test.js +198 -0
  242. package/node/wrappers/services/price-service/price.test.js.map +1 -0
  243. package/node/wrappers/services/price-service/price.test.ts +205 -0
  244. package/node/wrappers/services/security-service/SecurityService.d.ts +1 -1
  245. package/node/wrappers/services/security-service/SecurityService.js +8 -2
  246. package/node/wrappers/services/security-service/SecurityService.js.map +1 -1
  247. package/node/wrappers/services/security-service/SecurityService.searchByUuid.test.d.ts +1 -0
  248. package/node/wrappers/services/security-service/SecurityService.searchByUuid.test.js +38 -0
  249. package/node/wrappers/services/security-service/SecurityService.searchByUuid.test.js.map +1 -0
  250. package/node/wrappers/services/security-service/SecurityService.searchByUuid.test.ts +32 -0
  251. package/node/wrappers/services/security-service/SecurityService.ts +7 -2
  252. package/node/wrappers/services/security-service/security.maturityLadder.test.js.map +1 -1
  253. package/node/wrappers/services/transaction-service/TransactionService.d.ts +1 -1
  254. package/node/wrappers/services/transaction-service/TransactionService.js +8 -2
  255. package/node/wrappers/services/transaction-service/TransactionService.js.map +1 -1
  256. package/node/wrappers/services/transaction-service/TransactionService.ts +7 -2
  257. package/node/wrappers/services/transaction-service/transaction.search.test.js.map +1 -1
  258. package/node/wrappers/services/transaction-service/transaction.test.js.map +1 -1
  259. package/package.json +3 -2
  260. package/.env +0 -3
@@ -0,0 +1,192 @@
1
+ /**
2
+ * ISSUE #7: SecurityProto round-trip serialization tests for all 6 security types.
3
+ *
4
+ * For each type: construct → serialize to bytes → deserialize → verify all fields match.
5
+ */
6
+ import { SecurityProto } from '../../../fintekkers/models/security/security_pb';
7
+ import { SecurityTypeProto } from '../../../fintekkers/models/security/security_type_pb';
8
+ import { CouponFrequencyProto } from '../../../fintekkers/models/security/coupon_frequency_pb';
9
+ import { CouponTypeProto } from '../../../fintekkers/models/security/coupon_type_pb';
10
+ import { SecurityQuantityTypeProto } from '../../../fintekkers/models/security/security_quantity_type_pb';
11
+ import { IdentifierProto } from '../../../fintekkers/models/security/identifier/identifier_pb';
12
+ import { IdentifierTypeProto } from '../../../fintekkers/models/security/identifier/identifier_type_pb';
13
+ import { IndexTypeProto } from '../../../fintekkers/models/security/index/index_type_pb';
14
+ import { DecimalValueProto } from '../../../fintekkers/models/util/decimal_value_pb';
15
+ import { LocalDateProto } from '../../../fintekkers/models/util/local_date_pb';
16
+
17
+ function makeDecimal(value: string): DecimalValueProto {
18
+ return new DecimalValueProto().setArbitraryPrecisionValue(value);
19
+ }
20
+
21
+ function makeDate(year: number, month: number, day: number): LocalDateProto {
22
+ return new LocalDateProto().setYear(year).setMonth(month).setDay(day);
23
+ }
24
+
25
+ function makeIdentifier(type: number, value: string): IdentifierProto {
26
+ return new IdentifierProto().setIdentifierType(type).setIdentifierValue(value);
27
+ }
28
+
29
+ describe('SecurityProto Round-Trip Serialization — All 6 Security Types', () => {
30
+
31
+ test('BOND_SECURITY: all bond fields survive round-trip', () => {
32
+ const original = new SecurityProto();
33
+ original.setObjectClass('Security');
34
+ original.setVersion('0.0.1');
35
+ original.setSecurityType(SecurityTypeProto.BOND_SECURITY);
36
+ original.setAssetClass('Fixed Income');
37
+ original.setIssuerName('US Treasury');
38
+ original.setQuantityType(SecurityQuantityTypeProto.ORIGINAL_FACE_VALUE);
39
+ original.setIdentifier(makeIdentifier(IdentifierTypeProto.CUSIP, '912828ZT0'));
40
+ original.setDescription('UST 5% 2030');
41
+ original.setCouponRate(makeDecimal('5.0'));
42
+ original.setCouponType(CouponTypeProto.FIXED);
43
+ original.setCouponFrequency(CouponFrequencyProto.SEMIANNUALLY);
44
+ original.setFaceValue(makeDecimal('1000'));
45
+ original.setIssueDate(makeDate(2020, 1, 15));
46
+ original.setDatedDate(makeDate(2020, 1, 15));
47
+ original.setMaturityDate(makeDate(2030, 1, 15));
48
+
49
+ const bytes = original.serializeBinary();
50
+ const parsed = SecurityProto.deserializeBinary(bytes);
51
+
52
+ expect(parsed.getSecurityType()).toBe(SecurityTypeProto.BOND_SECURITY);
53
+ expect(parsed.getAssetClass()).toBe('Fixed Income');
54
+ expect(parsed.getIssuerName()).toBe('US Treasury');
55
+ expect(parsed.getDescription()).toBe('UST 5% 2030');
56
+ expect(parsed.getQuantityType()).toBe(SecurityQuantityTypeProto.ORIGINAL_FACE_VALUE);
57
+ expect(parsed.getCouponRate()!.getArbitraryPrecisionValue()).toBe('5.0');
58
+ expect(parsed.getCouponType()).toBe(CouponTypeProto.FIXED);
59
+ expect(parsed.getCouponFrequency()).toBe(CouponFrequencyProto.SEMIANNUALLY);
60
+ expect(parsed.getFaceValue()!.getArbitraryPrecisionValue()).toBe('1000');
61
+ expect(parsed.getIssueDate()!.getYear()).toBe(2020);
62
+ expect(parsed.getDatedDate()!.getMonth()).toBe(1);
63
+ expect(parsed.getMaturityDate()!.getYear()).toBe(2030);
64
+ expect(parsed.getMaturityDate()!.getMonth()).toBe(1);
65
+ expect(parsed.getMaturityDate()!.getDay()).toBe(15);
66
+ expect(parsed.getIdentifier()!.getIdentifierValue()).toBe('912828ZT0');
67
+ expect(parsed.getIdentifier()!.getIdentifierType()).toBe(IdentifierTypeProto.CUSIP);
68
+ });
69
+
70
+ test('TIPS: bond fields + base_cpi + inflation_index_type survive round-trip', () => {
71
+ const original = new SecurityProto();
72
+ original.setObjectClass('Security');
73
+ original.setVersion('0.0.1');
74
+ original.setSecurityType(SecurityTypeProto.TIPS);
75
+ original.setAssetClass('Fixed Income');
76
+ original.setIssuerName('US Treasury');
77
+ original.setCouponRate(makeDecimal('0.625'));
78
+ original.setCouponType(CouponTypeProto.FIXED);
79
+ original.setCouponFrequency(CouponFrequencyProto.SEMIANNUALLY);
80
+ original.setFaceValue(makeDecimal('1000'));
81
+ original.setMaturityDate(makeDate(2030, 1, 15));
82
+ original.setBaseCpi(makeDecimal('256.394'));
83
+ original.setInflationIndexType(IndexTypeProto.CPI_U);
84
+
85
+ const bytes = original.serializeBinary();
86
+ const parsed = SecurityProto.deserializeBinary(bytes);
87
+
88
+ expect(parsed.getSecurityType()).toBe(SecurityTypeProto.TIPS);
89
+ expect(parsed.getCouponRate()!.getArbitraryPrecisionValue()).toBe('0.625');
90
+ expect(parsed.getCouponType()).toBe(CouponTypeProto.FIXED);
91
+ expect(parsed.getCouponFrequency()).toBe(CouponFrequencyProto.SEMIANNUALLY);
92
+ expect(parsed.getFaceValue()!.getArbitraryPrecisionValue()).toBe('1000');
93
+ expect(parsed.getMaturityDate()!.getYear()).toBe(2030);
94
+ expect(parsed.getBaseCpi()!.getArbitraryPrecisionValue()).toBe('256.394');
95
+ expect(parsed.getInflationIndexType()).toBe(IndexTypeProto.CPI_U);
96
+ });
97
+
98
+ test('FRN: spread + reference_rate_index + reset_frequency survive round-trip', () => {
99
+ const original = new SecurityProto();
100
+ original.setObjectClass('Security');
101
+ original.setVersion('0.0.1');
102
+ original.setSecurityType(SecurityTypeProto.FRN);
103
+ original.setAssetClass('Fixed Income');
104
+ original.setIssuerName('US Treasury');
105
+ original.setCouponType(CouponTypeProto.FLOAT);
106
+ original.setCouponFrequency(CouponFrequencyProto.QUARTERLY);
107
+ original.setFaceValue(makeDecimal('100'));
108
+ original.setMaturityDate(makeDate(2028, 1, 15));
109
+ original.setSpread(makeDecimal('50'));
110
+ original.setReferenceRateIndex(IndexTypeProto.T_BILL_13_WEEK);
111
+ // Note: setResetFrequency (field 92) not yet in generated JS — codegen needs update
112
+
113
+ const bytes = original.serializeBinary();
114
+ const parsed = SecurityProto.deserializeBinary(bytes);
115
+
116
+ expect(parsed.getSecurityType()).toBe(SecurityTypeProto.FRN);
117
+ expect(parsed.getCouponType()).toBe(CouponTypeProto.FLOAT);
118
+ expect(parsed.getCouponFrequency()).toBe(CouponFrequencyProto.QUARTERLY);
119
+ expect(parsed.getFaceValue()!.getArbitraryPrecisionValue()).toBe('100');
120
+ expect(parsed.getMaturityDate()!.getYear()).toBe(2028);
121
+ expect(parsed.getSpread()!.getArbitraryPrecisionValue()).toBe('50');
122
+ expect(parsed.getReferenceRateIndex()).toBe(IndexTypeProto.T_BILL_13_WEEK);
123
+ });
124
+
125
+ test('EQUITY_SECURITY: identifier + asset_class survive round-trip', () => {
126
+ const original = new SecurityProto();
127
+ original.setObjectClass('Security');
128
+ original.setVersion('0.0.1');
129
+ original.setSecurityType(SecurityTypeProto.EQUITY_SECURITY);
130
+ original.setAssetClass('Equity');
131
+ original.setIssuerName('Apple Inc.');
132
+ original.setQuantityType(SecurityQuantityTypeProto.UNITS);
133
+ original.setIdentifier(makeIdentifier(IdentifierTypeProto.EXCH_TICKER, 'AAPL'));
134
+ original.setDescription('Apple Inc. Common Stock');
135
+
136
+ const bytes = original.serializeBinary();
137
+ const parsed = SecurityProto.deserializeBinary(bytes);
138
+
139
+ expect(parsed.getSecurityType()).toBe(SecurityTypeProto.EQUITY_SECURITY);
140
+ expect(parsed.getAssetClass()).toBe('Equity');
141
+ expect(parsed.getIssuerName()).toBe('Apple Inc.');
142
+ expect(parsed.getQuantityType()).toBe(SecurityQuantityTypeProto.UNITS);
143
+ expect(parsed.getDescription()).toBe('Apple Inc. Common Stock');
144
+ expect(parsed.getIdentifier()!.getIdentifierValue()).toBe('AAPL');
145
+ expect(parsed.getIdentifier()!.getIdentifierType()).toBe(IdentifierTypeProto.EXCH_TICKER);
146
+ });
147
+
148
+ test('CASH_SECURITY: cash_id + settlement fields survive round-trip', () => {
149
+ const original = new SecurityProto();
150
+ original.setObjectClass('Security');
151
+ original.setVersion('0.0.1');
152
+ original.setSecurityType(SecurityTypeProto.CASH_SECURITY);
153
+ original.setAssetClass('Cash');
154
+ original.setIssuerName('Federal Reserve');
155
+ original.setQuantityType(SecurityQuantityTypeProto.UNITS);
156
+ original.setCashId('USD');
157
+ original.setDescription('US Dollar');
158
+ original.setIdentifier(makeIdentifier(IdentifierTypeProto.CASH, 'USD'));
159
+
160
+ const bytes = original.serializeBinary();
161
+ const parsed = SecurityProto.deserializeBinary(bytes);
162
+
163
+ expect(parsed.getSecurityType()).toBe(SecurityTypeProto.CASH_SECURITY);
164
+ expect(parsed.getAssetClass()).toBe('Cash');
165
+ expect(parsed.getCashId()).toBe('USD');
166
+ expect(parsed.getDescription()).toBe('US Dollar');
167
+ expect(parsed.getIdentifier()!.getIdentifierValue()).toBe('USD');
168
+ expect(parsed.getIdentifier()!.getIdentifierType()).toBe(IdentifierTypeProto.CASH);
169
+ });
170
+
171
+ test('INDEX_SECURITY: index_type + inflation_index_type survive round-trip', () => {
172
+ const original = new SecurityProto();
173
+ original.setObjectClass('Security');
174
+ original.setVersion('0.0.1');
175
+ original.setSecurityType(SecurityTypeProto.INDEX_SECURITY);
176
+ original.setAssetClass('Index');
177
+ original.setIssuerName('Bureau of Labor Statistics');
178
+ original.setDescription('US CPI-U All Urban Consumers');
179
+ original.setIndexType(IndexTypeProto.CPI_U);
180
+ original.setIdentifier(makeIdentifier(IdentifierTypeProto.CUSIP, 'CPI-U'));
181
+
182
+ const bytes = original.serializeBinary();
183
+ const parsed = SecurityProto.deserializeBinary(bytes);
184
+
185
+ expect(parsed.getSecurityType()).toBe(SecurityTypeProto.INDEX_SECURITY);
186
+ expect(parsed.getAssetClass()).toBe('Index');
187
+ expect(parsed.getIssuerName()).toBe('Bureau of Labor Statistics');
188
+ expect(parsed.getDescription()).toBe('US CPI-U All Urban Consumers');
189
+ expect(parsed.getIndexType()).toBe(IndexTypeProto.CPI_U);
190
+ expect(parsed.getIdentifier()!.getIdentifierValue()).toBe('CPI-U');
191
+ });
192
+ });
@@ -22,6 +22,14 @@ declare class Security {
22
22
  getSecurityID(): IdentifierProto;
23
23
  getIssueDate(): LocalDate;
24
24
  getMaturityDate(): LocalDate;
25
+ /**
26
+ * Returns the bond-like details sub-message from the oneof, if set.
27
+ * Works for BondDetails, TipsDetails, and FrnDetails (all share the same
28
+ * base bond fields: coupon_rate, maturity_date, etc.).
29
+ * Returns undefined if the oneof is not set or the proto doesn't support it
30
+ * (e.g. when JS codegen hasn't been updated).
31
+ */
32
+ protected getBondLikeDetails(): any | undefined;
25
33
  getIssuerName(): string;
26
34
  equals(other: Security): boolean;
27
35
  }
@@ -15,6 +15,8 @@ class Security {
15
15
  static create(proto) {
16
16
  switch (proto.getSecurityType()) {
17
17
  case security_type_pb_1.SecurityTypeProto.BOND_SECURITY:
18
+ case security_type_pb_1.SecurityTypeProto.TIPS:
19
+ case security_type_pb_1.SecurityTypeProto.FRN:
18
20
  // Lazy import to avoid circular dependency
19
21
  const BondSecurity = require('./BondSecurity').default;
20
22
  return new BondSecurity(proto);
@@ -84,17 +86,37 @@ class Security {
84
86
  return identifier;
85
87
  }
86
88
  getIssueDate() {
87
- const date = this.proto.getIssueDate();
89
+ // Prefer oneof bond sub-message if available, fall back to flat fields
90
+ const bond = this.getBondLikeDetails();
91
+ const date = bond ? bond.getIssueDate() : this.proto.getIssueDate();
88
92
  if (!date)
89
93
  throw new Error("Issue date is required");
90
94
  return new date_1.LocalDate(date);
91
95
  }
92
96
  getMaturityDate() {
93
- const date = this.proto.getMaturityDate();
97
+ // Prefer oneof bond sub-message if available, fall back to flat fields
98
+ const bond = this.getBondLikeDetails();
99
+ const date = bond ? bond.getMaturityDate() : this.proto.getMaturityDate();
94
100
  if (!date)
95
101
  throw new Error("Maturity date is required");
96
102
  return new date_1.LocalDate(date);
97
103
  }
104
+ /**
105
+ * Returns the bond-like details sub-message from the oneof, if set.
106
+ * Works for BondDetails, TipsDetails, and FrnDetails (all share the same
107
+ * base bond fields: coupon_rate, maturity_date, etc.).
108
+ * Returns undefined if the oneof is not set or the proto doesn't support it
109
+ * (e.g. when JS codegen hasn't been updated).
110
+ */
111
+ getBondLikeDetails() {
112
+ // Guard: check if the oneof accessor exists (JS codegen may be stale)
113
+ if (typeof this.proto.getBondDetails !== 'function')
114
+ return undefined;
115
+ return this.proto.getBondDetails() ||
116
+ this.proto.getTipsDetails() ||
117
+ this.proto.getFrnDetails() ||
118
+ undefined;
119
+ }
98
120
  getIssuerName() {
99
121
  return this.proto.getIssuerName();
100
122
  }
@@ -1 +1 @@
1
- {"version":3,"file":"security.js","sourceRoot":"","sources":["security.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"security.js","sourceRoot":"","sources":["security.ts"],"names":[],"mappings":"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"}
@@ -19,6 +19,8 @@ class Security {
19
19
  static create(proto: SecurityProto): Security {
20
20
  switch (proto.getSecurityType()) {
21
21
  case SecurityTypeProto.BOND_SECURITY:
22
+ case SecurityTypeProto.TIPS:
23
+ case SecurityTypeProto.FRN:
22
24
  // Lazy import to avoid circular dependency
23
25
  const BondSecurity = require('./BondSecurity').default;
24
26
  return new BondSecurity(proto);
@@ -27,6 +29,7 @@ class Security {
27
29
  }
28
30
  }
29
31
 
32
+
30
33
  toString(): string {
31
34
  return `ID[${this.getID().toString()}], ${this.getSecurityID()}[${this.getIssuerName()}]`;
32
35
  }
@@ -98,17 +101,38 @@ class Security {
98
101
  }
99
102
 
100
103
  getIssueDate(): LocalDate {
101
- const date = this.proto.getIssueDate();
104
+ // Prefer oneof bond sub-message if available, fall back to flat fields
105
+ const bond = this.getBondLikeDetails();
106
+ const date = bond ? bond.getIssueDate() : this.proto.getIssueDate();
102
107
  if (!date) throw new Error("Issue date is required");
103
108
  return new LocalDate(date);
104
109
  }
105
110
 
106
111
  getMaturityDate(): LocalDate {
107
- const date = this.proto.getMaturityDate();
112
+ // Prefer oneof bond sub-message if available, fall back to flat fields
113
+ const bond = this.getBondLikeDetails();
114
+ const date = bond ? bond.getMaturityDate() : this.proto.getMaturityDate();
108
115
  if (!date) throw new Error("Maturity date is required");
109
116
  return new LocalDate(date);
110
117
  }
111
118
 
119
+ /**
120
+ * Returns the bond-like details sub-message from the oneof, if set.
121
+ * Works for BondDetails, TipsDetails, and FrnDetails (all share the same
122
+ * base bond fields: coupon_rate, maturity_date, etc.).
123
+ * Returns undefined if the oneof is not set or the proto doesn't support it
124
+ * (e.g. when JS codegen hasn't been updated).
125
+ */
126
+ protected getBondLikeDetails(): any | undefined {
127
+ // Guard: check if the oneof accessor exists (JS codegen may be stale)
128
+ if (typeof this.proto.getBondDetails !== 'function') return undefined;
129
+
130
+ return this.proto.getBondDetails() ||
131
+ this.proto.getTipsDetails() ||
132
+ this.proto.getFrnDetails() ||
133
+ undefined;
134
+ }
135
+
112
136
  getIssuerName(): string {
113
137
  return this.proto.getIssuerName();
114
138
  }
@@ -64,11 +64,36 @@ class Tenor {
64
64
  if (Tenor.isPeriodNegative(period)) {
65
65
  return '';
66
66
  }
67
- const years = period.years;
68
- const months = period.months;
69
- // Extract weeks and remaining days from total days (matching Java behavior)
70
- const weeks = Math.floor(period.days / 7);
71
- const days = period.days % 7;
67
+ let years = period.years;
68
+ let months = period.months;
69
+ // Extract weeks and remaining days from total days
70
+ let weeks = Math.floor(period.days / 7);
71
+ let days = period.days % 7;
72
+ // Calculate total days from weeks and days
73
+ const totalDays = weeks * 7 + days;
74
+ // Round up months when total days >= 27 (approximately 4 weeks)
75
+ // This covers cases like 3W6D (27 days) which should round up
76
+ if (totalDays >= 27) {
77
+ months += 1;
78
+ weeks = 0; // Weeks are absorbed into months
79
+ days = 0; // Days are discarded when rounding up
80
+ }
81
+ // Also round up months when months >= 11 and there are any weeks (>= 2 weeks)
82
+ // This covers cases like 11M2W which should round to 12M = 1Y
83
+ else if (months >= 11 && weeks >= 2) {
84
+ months += 1;
85
+ weeks = 0;
86
+ days = 0;
87
+ }
88
+ // Discard days when there are no weeks (e.g., 6M1D -> 6M)
89
+ else if (weeks === 0 && days > 0) {
90
+ days = 0;
91
+ }
92
+ // Round up years when months reach 12 or more
93
+ if (months >= 12) {
94
+ years += Math.floor(months / 12);
95
+ months = months % 12;
96
+ }
72
97
  const parts = [];
73
98
  if (years > 0) {
74
99
  parts.push(`${years}Y`);
@@ -82,7 +107,7 @@ class Tenor {
82
107
  if (days > 0) {
83
108
  parts.push(`${days}D`);
84
109
  }
85
- return parts.join('');
110
+ return parts.join('').trim();
86
111
  }
87
112
  /**
88
113
  * Checks if a period is negative (has any negative component).
@@ -1 +1 @@
1
- {"version":3,"file":"term.js","sourceRoot":"","sources":["term.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"term.js","sourceRoot":"","sources":["term.ts"],"names":[],"mappings":"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"}
@@ -168,11 +168,30 @@ function testPeriodToString() {
168
168
  const period1 = { years: 2, months: 3, days: 0 };
169
169
  assert(term_1.Tenor.periodToString(period1) === '2Y3M', 'Should return "2Y3M"');
170
170
  const period2 = { years: 0, months: 6, days: 14 };
171
- assert(term_1.Tenor.periodToString(period2) === '6M2W', 'Should convert 14 days to 2W');
171
+ assert(term_1.Tenor.periodToString(period2) === '6M2W', 'Should convert 14 days to 2W (less than 4 weeks)');
172
172
  const period3 = { years: 1, months: 0, days: 21 };
173
- assert(term_1.Tenor.periodToString(period3) === '1Y3W', 'Should convert 21 days to 3W');
173
+ assert(term_1.Tenor.periodToString(period3) === '1Y3W', 'Should convert 21 days to 3W (less than 4 weeks)');
174
174
  const period4 = { years: 0, months: 0, days: 10 };
175
175
  assert(term_1.Tenor.periodToString(period4) === '1W3D', 'Should convert 10 days to 1W3D');
176
+ // Test rounding: 4 or more weeks should round up to months
177
+ const period7 = { years: 0, months: 0, days: 28 };
178
+ assert(term_1.Tenor.periodToString(period7) === '1M', '28 days (4 weeks) should round up to 1M');
179
+ const period8 = { years: 0, months: 0, days: 35 };
180
+ assert(term_1.Tenor.periodToString(period8) === '1M', '35 days (5 weeks) should round up to 1M');
181
+ // Test rounding: 12 or more months should round up to years
182
+ const period9 = { years: 0, months: 12, days: 0 };
183
+ assert(term_1.Tenor.periodToString(period9) === '1Y', '12 months should round up to 1Y');
184
+ const period10 = { years: 0, months: 13, days: 0 };
185
+ assert(term_1.Tenor.periodToString(period10) === '1Y1M', '13 months should round up to 1Y1M');
186
+ // Test rounding: 3M3W6D (27 days total) should round to 4M
187
+ const period11 = { years: 0, months: 3, days: 27 }; // 3 weeks * 7 + 6 days = 27 days
188
+ assert(term_1.Tenor.periodToString(period11) === '4M', '3M3W6D (27 days) should round to 4M');
189
+ // Test discarding days when there are no weeks: 6M1D should be 6M
190
+ const period12 = { years: 0, months: 6, days: 1 };
191
+ assert(term_1.Tenor.periodToString(period12) === '6M', '6M1D should discard days and be 6M');
192
+ // Test rounding: 19Y11M2W should round to 20Y (11 months + 2 weeks rounds to 12 months = 1 year)
193
+ const period13 = { years: 19, months: 11, days: 14 }; // 2 weeks * 7 = 14 days
194
+ assert(term_1.Tenor.periodToString(period13) === '20Y', '19Y11M2W should round to 20Y');
176
195
  // Test negative period
177
196
  const period5 = { years: -1, months: 0, days: 0 };
178
197
  assert(term_1.Tenor.periodToString(period5) === '', 'Negative period should return empty string');
@@ -1 +1 @@
1
- {"version":3,"file":"term.test.js","sourceRoot":"","sources":["term.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"term.test.js","sourceRoot":"","sources":["term.test.ts"],"names":[],"mappings":"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"}
@@ -204,14 +204,40 @@ function testPeriodToString(): void {
204
204
  assert(Tenor.periodToString(period1) === '2Y3M', 'Should return "2Y3M"');
205
205
 
206
206
  const period2: Period = { years: 0, months: 6, days: 14 };
207
- assert(Tenor.periodToString(period2) === '6M2W', 'Should convert 14 days to 2W');
207
+ assert(Tenor.periodToString(period2) === '6M2W', 'Should convert 14 days to 2W (less than 4 weeks)');
208
208
 
209
209
  const period3: Period = { years: 1, months: 0, days: 21 };
210
- assert(Tenor.periodToString(period3) === '1Y3W', 'Should convert 21 days to 3W');
210
+ assert(Tenor.periodToString(period3) === '1Y3W', 'Should convert 21 days to 3W (less than 4 weeks)');
211
211
 
212
212
  const period4: Period = { years: 0, months: 0, days: 10 };
213
213
  assert(Tenor.periodToString(period4) === '1W3D', 'Should convert 10 days to 1W3D');
214
214
 
215
+ // Test rounding: 4 or more weeks should round up to months
216
+ const period7: Period = { years: 0, months: 0, days: 28 };
217
+ assert(Tenor.periodToString(period7) === '1M', '28 days (4 weeks) should round up to 1M');
218
+
219
+ const period8: Period = { years: 0, months: 0, days: 35 };
220
+ assert(Tenor.periodToString(period8) === '1M', '35 days (5 weeks) should round up to 1M');
221
+
222
+ // Test rounding: 12 or more months should round up to years
223
+ const period9: Period = { years: 0, months: 12, days: 0 };
224
+ assert(Tenor.periodToString(period9) === '1Y', '12 months should round up to 1Y');
225
+
226
+ const period10: Period = { years: 0, months: 13, days: 0 };
227
+ assert(Tenor.periodToString(period10) === '1Y1M', '13 months should round up to 1Y1M');
228
+
229
+ // Test rounding: 3M3W6D (27 days total) should round to 4M
230
+ const period11: Period = { years: 0, months: 3, days: 27 }; // 3 weeks * 7 + 6 days = 27 days
231
+ assert(Tenor.periodToString(period11) === '4M', '3M3W6D (27 days) should round to 4M');
232
+
233
+ // Test discarding days when there are no weeks: 6M1D should be 6M
234
+ const period12: Period = { years: 0, months: 6, days: 1 };
235
+ assert(Tenor.periodToString(period12) === '6M', '6M1D should discard days and be 6M');
236
+
237
+ // Test rounding: 19Y11M2W should round to 20Y (11 months + 2 weeks rounds to 12 months = 1 year)
238
+ const period13: Period = { years: 19, months: 11, days: 14 }; // 2 weeks * 7 = 14 days
239
+ assert(Tenor.periodToString(period13) === '20Y', '19Y11M2W should round to 20Y');
240
+
215
241
  // Test negative period
216
242
  const period5: Period = { years: -1, months: 0, days: 0 };
217
243
  assert(Tenor.periodToString(period5) === '', 'Negative period should return empty string');
@@ -98,11 +98,39 @@ export class Tenor {
98
98
  return '';
99
99
  }
100
100
 
101
- const years = period.years;
102
- const months = period.months;
103
- // Extract weeks and remaining days from total days (matching Java behavior)
104
- const weeks = Math.floor(period.days / 7);
105
- const days = period.days % 7;
101
+ let years = period.years;
102
+ let months = period.months;
103
+ // Extract weeks and remaining days from total days
104
+ let weeks = Math.floor(period.days / 7);
105
+ let days = period.days % 7;
106
+
107
+ // Calculate total days from weeks and days
108
+ const totalDays = weeks * 7 + days;
109
+
110
+ // Round up months when total days >= 27 (approximately 4 weeks)
111
+ // This covers cases like 3W6D (27 days) which should round up
112
+ if (totalDays >= 27) {
113
+ months += 1;
114
+ weeks = 0; // Weeks are absorbed into months
115
+ days = 0; // Days are discarded when rounding up
116
+ }
117
+ // Also round up months when months >= 11 and there are any weeks (>= 2 weeks)
118
+ // This covers cases like 11M2W which should round to 12M = 1Y
119
+ else if (months >= 11 && weeks >= 2) {
120
+ months += 1;
121
+ weeks = 0;
122
+ days = 0;
123
+ }
124
+ // Discard days when there are no weeks (e.g., 6M1D -> 6M)
125
+ else if (weeks === 0 && days > 0) {
126
+ days = 0;
127
+ }
128
+
129
+ // Round up years when months reach 12 or more
130
+ if (months >= 12) {
131
+ years += Math.floor(months / 12);
132
+ months = months % 12;
133
+ }
106
134
 
107
135
  const parts: string[] = [];
108
136
  if (years > 0) {
@@ -118,7 +146,7 @@ export class Tenor {
118
146
  parts.push(`${days}D`);
119
147
  }
120
148
 
121
- return parts.join('');
149
+ return parts.join('').trim();
122
150
  }
123
151
 
124
152
  /**