@freighttech/shipment-tracking 0.6.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 (456) hide show
  1. package/LICENSE +21 -0
  2. package/NOTICE +25 -0
  3. package/dist/generated/entities/bic_config/index.js +21 -0
  4. package/dist/generated/entities/bic_config/index.js.map +7 -0
  5. package/dist/generated/entities/carrier_config/index.js +27 -0
  6. package/dist/generated/entities/carrier_config/index.js.map +7 -0
  7. package/dist/generated/entities/location_override/index.js +33 -0
  8. package/dist/generated/entities/location_override/index.js.map +7 -0
  9. package/dist/generated/entities/shipment/index.js +73 -0
  10. package/dist/generated/entities/shipment/index.js.map +7 -0
  11. package/dist/generated/entities/ships_go_config/index.js +31 -0
  12. package/dist/generated/entities/ships_go_config/index.js.map +7 -0
  13. package/dist/generated/entities/tracking_event/index.js +101 -0
  14. package/dist/generated/entities/tracking_event/index.js.map +7 -0
  15. package/dist/generated/entities/tracking_job/index.js +47 -0
  16. package/dist/generated/entities/tracking_job/index.js.map +7 -0
  17. package/dist/generated/entities/webhook/index.js +25 -0
  18. package/dist/generated/entities/webhook/index.js.map +7 -0
  19. package/dist/generated/entities/webhook_delivery/index.js +25 -0
  20. package/dist/generated/entities/webhook_delivery/index.js.map +7 -0
  21. package/dist/generated/entities.ids.generated.js +21 -0
  22. package/dist/generated/entities.ids.generated.js.map +7 -0
  23. package/dist/index.js +41 -0
  24. package/dist/index.js.map +7 -0
  25. package/dist/modules/shipment_tracking/acl.js +22 -0
  26. package/dist/modules/shipment_tracking/acl.js.map +7 -0
  27. package/dist/modules/shipment_tracking/api/bic-configs/route.js +176 -0
  28. package/dist/modules/shipment_tracking/api/bic-configs/route.js.map +7 -0
  29. package/dist/modules/shipment_tracking/api/bic-configs/test/route.js +95 -0
  30. package/dist/modules/shipment_tracking/api/bic-configs/test/route.js.map +7 -0
  31. package/dist/modules/shipment_tracking/api/cargo-events/route.js +93 -0
  32. package/dist/modules/shipment_tracking/api/cargo-events/route.js.map +7 -0
  33. package/dist/modules/shipment_tracking/api/carrier-configs/route.js +139 -0
  34. package/dist/modules/shipment_tracking/api/carrier-configs/route.js.map +7 -0
  35. package/dist/modules/shipment_tracking/api/dashboard/ships-map/route.js +177 -0
  36. package/dist/modules/shipment_tracking/api/dashboard/ships-map/route.js.map +7 -0
  37. package/dist/modules/shipment_tracking/api/location-overrides/route.js +179 -0
  38. package/dist/modules/shipment_tracking/api/location-overrides/route.js.map +7 -0
  39. package/dist/modules/shipment_tracking/api/openapi.js +27 -0
  40. package/dist/modules/shipment_tracking/api/openapi.js.map +7 -0
  41. package/dist/modules/shipment_tracking/api/shipments/route.js +192 -0
  42. package/dist/modules/shipment_tracking/api/shipments/route.js.map +7 -0
  43. package/dist/modules/shipment_tracking/api/shipsgo-configs/route.js +185 -0
  44. package/dist/modules/shipment_tracking/api/shipsgo-configs/route.js.map +7 -0
  45. package/dist/modules/shipment_tracking/api/tracking-jobs/route.js +144 -0
  46. package/dist/modules/shipment_tracking/api/tracking-jobs/route.js.map +7 -0
  47. package/dist/modules/shipment_tracking/api/tracking-jobs/sync/route.js +107 -0
  48. package/dist/modules/shipment_tracking/api/tracking-jobs/sync/route.js.map +7 -0
  49. package/dist/modules/shipment_tracking/api/utils.js +12 -0
  50. package/dist/modules/shipment_tracking/api/utils.js.map +7 -0
  51. package/dist/modules/shipment_tracking/api/webhooks/deliveries/route.js +76 -0
  52. package/dist/modules/shipment_tracking/api/webhooks/deliveries/route.js.map +7 -0
  53. package/dist/modules/shipment_tracking/api/webhooks/route.js +135 -0
  54. package/dist/modules/shipment_tracking/api/webhooks/route.js.map +7 -0
  55. package/dist/modules/shipment_tracking/api/webhooks/test/route.js +71 -0
  56. package/dist/modules/shipment_tracking/api/webhooks/test/route.js.map +7 -0
  57. package/dist/modules/shipment_tracking/assets/carriers/cma_cgm.png +0 -0
  58. package/dist/modules/shipment_tracking/assets/carriers/cosco.png +0 -0
  59. package/dist/modules/shipment_tracking/assets/carriers/evergreen.png +0 -0
  60. package/dist/modules/shipment_tracking/assets/carriers/hapag_lloyd.png +0 -0
  61. package/dist/modules/shipment_tracking/assets/carriers/maersk.png +0 -0
  62. package/dist/modules/shipment_tracking/assets/carriers/msc.png +0 -0
  63. package/dist/modules/shipment_tracking/assets/carriers/one.png +0 -0
  64. package/dist/modules/shipment_tracking/assets/carriers/oocl.png +0 -0
  65. package/dist/modules/shipment_tracking/assets/carriers/yang_ming.png +0 -0
  66. package/dist/modules/shipment_tracking/assets/carriers/zim.png +0 -0
  67. package/dist/modules/shipment_tracking/assets/index.js +52 -0
  68. package/dist/modules/shipment_tracking/assets/index.js.map +7 -0
  69. package/dist/modules/shipment_tracking/backend/carrier-configs/page.js +621 -0
  70. package/dist/modules/shipment_tracking/backend/carrier-configs/page.js.map +7 -0
  71. package/dist/modules/shipment_tracking/backend/carrier-configs/page.meta.js +19 -0
  72. package/dist/modules/shipment_tracking/backend/carrier-configs/page.meta.js.map +7 -0
  73. package/dist/modules/shipment_tracking/backend/location-overrides/page.js +198 -0
  74. package/dist/modules/shipment_tracking/backend/location-overrides/page.js.map +7 -0
  75. package/dist/modules/shipment_tracking/backend/location-overrides/page.meta.js +19 -0
  76. package/dist/modules/shipment_tracking/backend/location-overrides/page.meta.js.map +7 -0
  77. package/dist/modules/shipment_tracking/backend/shipment-tracking/page.js +279 -0
  78. package/dist/modules/shipment_tracking/backend/shipment-tracking/page.js.map +7 -0
  79. package/dist/modules/shipment_tracking/backend/shipment-tracking/page.meta.js +19 -0
  80. package/dist/modules/shipment_tracking/backend/shipment-tracking/page.meta.js.map +7 -0
  81. package/dist/modules/shipment_tracking/backend/tracking-jobs/page.js +10 -0
  82. package/dist/modules/shipment_tracking/backend/tracking-jobs/page.js.map +7 -0
  83. package/dist/modules/shipment_tracking/backend/tracking-jobs/page.meta.js +19 -0
  84. package/dist/modules/shipment_tracking/backend/tracking-jobs/page.meta.js.map +7 -0
  85. package/dist/modules/shipment_tracking/backend/webhooks/page.js +198 -0
  86. package/dist/modules/shipment_tracking/backend/webhooks/page.js.map +7 -0
  87. package/dist/modules/shipment_tracking/backend/webhooks/page.meta.js +19 -0
  88. package/dist/modules/shipment_tracking/backend/webhooks/page.meta.js.map +7 -0
  89. package/dist/modules/shipment_tracking/ce.js +52 -0
  90. package/dist/modules/shipment_tracking/ce.js.map +7 -0
  91. package/dist/modules/shipment_tracking/cli.js +229 -0
  92. package/dist/modules/shipment_tracking/cli.js.map +7 -0
  93. package/dist/modules/shipment_tracking/commands/bic-configs.js +66 -0
  94. package/dist/modules/shipment_tracking/commands/bic-configs.js.map +7 -0
  95. package/dist/modules/shipment_tracking/commands/carrier-configs.js +65 -0
  96. package/dist/modules/shipment_tracking/commands/carrier-configs.js.map +7 -0
  97. package/dist/modules/shipment_tracking/commands/index.js +9 -0
  98. package/dist/modules/shipment_tracking/commands/index.js.map +7 -0
  99. package/dist/modules/shipment_tracking/commands/location-overrides.js +93 -0
  100. package/dist/modules/shipment_tracking/commands/location-overrides.js.map +7 -0
  101. package/dist/modules/shipment_tracking/commands/shipments.js +200 -0
  102. package/dist/modules/shipment_tracking/commands/shipments.js.map +7 -0
  103. package/dist/modules/shipment_tracking/commands/shipsgo-configs.js +75 -0
  104. package/dist/modules/shipment_tracking/commands/shipsgo-configs.js.map +7 -0
  105. package/dist/modules/shipment_tracking/commands/tracking-jobs.js +120 -0
  106. package/dist/modules/shipment_tracking/commands/tracking-jobs.js.map +7 -0
  107. package/dist/modules/shipment_tracking/commands/tracking.js +140 -0
  108. package/dist/modules/shipment_tracking/commands/tracking.js.map +7 -0
  109. package/dist/modules/shipment_tracking/commands/webhooks.js +115 -0
  110. package/dist/modules/shipment_tracking/commands/webhooks.js.map +7 -0
  111. package/dist/modules/shipment_tracking/components/CombinedTimestampCell.js +168 -0
  112. package/dist/modules/shipment_tracking/components/CombinedTimestampCell.js.map +7 -0
  113. package/dist/modules/shipment_tracking/components/FacilityLocationInput.js +202 -0
  114. package/dist/modules/shipment_tracking/components/FacilityLocationInput.js.map +7 -0
  115. package/dist/modules/shipment_tracking/components/LocationOverrideDrawer.js +501 -0
  116. package/dist/modules/shipment_tracking/components/LocationOverrideDrawer.js.map +7 -0
  117. package/dist/modules/shipment_tracking/components/ShipmentDetailsDrawer.js +818 -0
  118. package/dist/modules/shipment_tracking/components/ShipmentDetailsDrawer.js.map +7 -0
  119. package/dist/modules/shipment_tracking/components/ShipmentDrawer.js +404 -0
  120. package/dist/modules/shipment_tracking/components/ShipmentDrawer.js.map +7 -0
  121. package/dist/modules/shipment_tracking/components/ShipsGoConfigSection.js +200 -0
  122. package/dist/modules/shipment_tracking/components/ShipsGoConfigSection.js.map +7 -0
  123. package/dist/modules/shipment_tracking/components/TimestampCell.js +108 -0
  124. package/dist/modules/shipment_tracking/components/TimestampCell.js.map +7 -0
  125. package/dist/modules/shipment_tracking/components/TrackingJobDrawer.js +343 -0
  126. package/dist/modules/shipment_tracking/components/TrackingJobDrawer.js.map +7 -0
  127. package/dist/modules/shipment_tracking/components/VesselTrackingMap.js +496 -0
  128. package/dist/modules/shipment_tracking/components/VesselTrackingMap.js.map +7 -0
  129. package/dist/modules/shipment_tracking/components/WebhookDrawer.js +332 -0
  130. package/dist/modules/shipment_tracking/components/WebhookDrawer.js.map +7 -0
  131. package/dist/modules/shipment_tracking/data/entities.js +686 -0
  132. package/dist/modules/shipment_tracking/data/entities.js.map +7 -0
  133. package/dist/modules/shipment_tracking/data/validators.js +434 -0
  134. package/dist/modules/shipment_tracking/data/validators.js.map +7 -0
  135. package/dist/modules/shipment_tracking/di.js +60 -0
  136. package/dist/modules/shipment_tracking/di.js.map +7 -0
  137. package/dist/modules/shipment_tracking/encryption.js +12 -0
  138. package/dist/modules/shipment_tracking/encryption.js.map +7 -0
  139. package/dist/modules/shipment_tracking/events.js +87 -0
  140. package/dist/modules/shipment_tracking/events.js.map +7 -0
  141. package/dist/modules/shipment_tracking/hooks/useVesselTracking.js +137 -0
  142. package/dist/modules/shipment_tracking/hooks/useVesselTracking.js.map +7 -0
  143. package/dist/modules/shipment_tracking/i18n/de.json +327 -0
  144. package/dist/modules/shipment_tracking/i18n/en.json +327 -0
  145. package/dist/modules/shipment_tracking/i18n/es.json +327 -0
  146. package/dist/modules/shipment_tracking/i18n/pl.json +327 -0
  147. package/dist/modules/shipment_tracking/index.js +15 -0
  148. package/dist/modules/shipment_tracking/index.js.map +7 -0
  149. package/dist/modules/shipment_tracking/lib/adapters/cma-cgm.js +66 -0
  150. package/dist/modules/shipment_tracking/lib/adapters/cma-cgm.js.map +7 -0
  151. package/dist/modules/shipment_tracking/lib/adapters/cosco-types.js +1 -0
  152. package/dist/modules/shipment_tracking/lib/adapters/cosco-types.js.map +7 -0
  153. package/dist/modules/shipment_tracking/lib/adapters/cosco.js +236 -0
  154. package/dist/modules/shipment_tracking/lib/adapters/cosco.js.map +7 -0
  155. package/dist/modules/shipment_tracking/lib/adapters/evergreen.js +87 -0
  156. package/dist/modules/shipment_tracking/lib/adapters/evergreen.js.map +7 -0
  157. package/dist/modules/shipment_tracking/lib/adapters/hapag-lloyd.js +68 -0
  158. package/dist/modules/shipment_tracking/lib/adapters/hapag-lloyd.js.map +7 -0
  159. package/dist/modules/shipment_tracking/lib/adapters/index.js +20 -0
  160. package/dist/modules/shipment_tracking/lib/adapters/index.js.map +7 -0
  161. package/dist/modules/shipment_tracking/lib/adapters/maersk.js +84 -0
  162. package/dist/modules/shipment_tracking/lib/adapters/maersk.js.map +7 -0
  163. package/dist/modules/shipment_tracking/lib/adapters/msc.js +170 -0
  164. package/dist/modules/shipment_tracking/lib/adapters/msc.js.map +7 -0
  165. package/dist/modules/shipment_tracking/lib/adapters/zim.js +85 -0
  166. package/dist/modules/shipment_tracking/lib/adapters/zim.js.map +7 -0
  167. package/dist/modules/shipment_tracking/lib/audit-helpers.js +20 -0
  168. package/dist/modules/shipment_tracking/lib/audit-helpers.js.map +7 -0
  169. package/dist/modules/shipment_tracking/lib/auth/base64url.js +8 -0
  170. package/dist/modules/shipment_tracking/lib/auth/base64url.js.map +7 -0
  171. package/dist/modules/shipment_tracking/lib/auth/oauth-client.js +38 -0
  172. package/dist/modules/shipment_tracking/lib/auth/oauth-client.js.map +7 -0
  173. package/dist/modules/shipment_tracking/lib/background.js +15 -0
  174. package/dist/modules/shipment_tracking/lib/background.js.map +7 -0
  175. package/dist/modules/shipment_tracking/lib/bic-api-client.js +106 -0
  176. package/dist/modules/shipment_tracking/lib/bic-api-client.js.map +7 -0
  177. package/dist/modules/shipment_tracking/lib/carrier-adapter.js +17 -0
  178. package/dist/modules/shipment_tracking/lib/carrier-adapter.js.map +7 -0
  179. package/dist/modules/shipment_tracking/lib/current-vessel.js +149 -0
  180. package/dist/modules/shipment_tracking/lib/current-vessel.js.map +7 -0
  181. package/dist/modules/shipment_tracking/lib/dcsa-event-mapping.js +124 -0
  182. package/dist/modules/shipment_tracking/lib/dcsa-event-mapping.js.map +7 -0
  183. package/dist/modules/shipment_tracking/lib/dcsa-event-parser.js +112 -0
  184. package/dist/modules/shipment_tracking/lib/dcsa-event-parser.js.map +7 -0
  185. package/dist/modules/shipment_tracking/lib/dcsa-params.js +16 -0
  186. package/dist/modules/shipment_tracking/lib/dcsa-params.js.map +7 -0
  187. package/dist/modules/shipment_tracking/lib/empty-return.js +48 -0
  188. package/dist/modules/shipment_tracking/lib/empty-return.js.map +7 -0
  189. package/dist/modules/shipment_tracking/lib/location-overrides.js +85 -0
  190. package/dist/modules/shipment_tracking/lib/location-overrides.js.map +7 -0
  191. package/dist/modules/shipment_tracking/lib/location-types.js +59 -0
  192. package/dist/modules/shipment_tracking/lib/location-types.js.map +7 -0
  193. package/dist/modules/shipment_tracking/lib/logger.js +113 -0
  194. package/dist/modules/shipment_tracking/lib/logger.js.map +7 -0
  195. package/dist/modules/shipment_tracking/lib/poi-event-processor.js +183 -0
  196. package/dist/modules/shipment_tracking/lib/poi-event-processor.js.map +7 -0
  197. package/dist/modules/shipment_tracking/lib/poi-nats-config.js +52 -0
  198. package/dist/modules/shipment_tracking/lib/poi-nats-config.js.map +7 -0
  199. package/dist/modules/shipment_tracking/lib/poi-types.js +43 -0
  200. package/dist/modules/shipment_tracking/lib/poi-types.js.map +7 -0
  201. package/dist/modules/shipment_tracking/lib/rate-limiter.js +31 -0
  202. package/dist/modules/shipment_tracking/lib/rate-limiter.js.map +7 -0
  203. package/dist/modules/shipment_tracking/lib/route-extraction.js +187 -0
  204. package/dist/modules/shipment_tracking/lib/route-extraction.js.map +7 -0
  205. package/dist/modules/shipment_tracking/lib/route-inference.js +106 -0
  206. package/dist/modules/shipment_tracking/lib/route-inference.js.map +7 -0
  207. package/dist/modules/shipment_tracking/lib/schedule-generator.js +63 -0
  208. package/dist/modules/shipment_tracking/lib/schedule-generator.js.map +7 -0
  209. package/dist/modules/shipment_tracking/lib/shipsgo-client.js +143 -0
  210. package/dist/modules/shipment_tracking/lib/shipsgo-client.js.map +7 -0
  211. package/dist/modules/shipment_tracking/lib/shipsgo-mapper.js +204 -0
  212. package/dist/modules/shipment_tracking/lib/shipsgo-mapper.js.map +7 -0
  213. package/dist/modules/shipment_tracking/lib/status-machine.js +131 -0
  214. package/dist/modules/shipment_tracking/lib/status-machine.js.map +7 -0
  215. package/dist/modules/shipment_tracking/lib/time-extraction.js +41 -0
  216. package/dist/modules/shipment_tracking/lib/time-extraction.js.map +7 -0
  217. package/dist/modules/shipment_tracking/lib/timestamp-utils.js +100 -0
  218. package/dist/modules/shipment_tracking/lib/timestamp-utils.js.map +7 -0
  219. package/dist/modules/shipment_tracking/lib/vessel-api.js +111 -0
  220. package/dist/modules/shipment_tracking/lib/vessel-api.js.map +7 -0
  221. package/dist/modules/shipment_tracking/lib/vessel-cache.js +50 -0
  222. package/dist/modules/shipment_tracking/lib/vessel-cache.js.map +7 -0
  223. package/dist/modules/shipment_tracking/lib/vessel-extraction.js +13 -0
  224. package/dist/modules/shipment_tracking/lib/vessel-extraction.js.map +7 -0
  225. package/dist/modules/shipment_tracking/lib/webhook-dispatcher.js +62 -0
  226. package/dist/modules/shipment_tracking/lib/webhook-dispatcher.js.map +7 -0
  227. package/dist/modules/shipment_tracking/migrations/Migration20260422161208_shipment_tracking.js +48 -0
  228. package/dist/modules/shipment_tracking/migrations/Migration20260422161208_shipment_tracking.js.map +7 -0
  229. package/dist/modules/shipment_tracking/migrations/Migration20260529120000_shipment_tracking_poi_region_names.js +15 -0
  230. package/dist/modules/shipment_tracking/migrations/Migration20260529120000_shipment_tracking_poi_region_names.js.map +7 -0
  231. package/dist/modules/shipment_tracking/migrations/Migration20260821120000_shipment_tracking_shipsgo.js +47 -0
  232. package/dist/modules/shipment_tracking/migrations/Migration20260821120000_shipment_tracking_shipsgo.js.map +7 -0
  233. package/dist/modules/shipment_tracking/notifications.js +145 -0
  234. package/dist/modules/shipment_tracking/notifications.js.map +7 -0
  235. package/dist/modules/shipment_tracking/services/carrierRegistry.js +24 -0
  236. package/dist/modules/shipment_tracking/services/carrierRegistry.js.map +7 -0
  237. package/dist/modules/shipment_tracking/services/poiNatsService.js +397 -0
  238. package/dist/modules/shipment_tracking/services/poiNatsService.js.map +7 -0
  239. package/dist/modules/shipment_tracking/services/shipsGoProvider.js +163 -0
  240. package/dist/modules/shipment_tracking/services/shipsGoProvider.js.map +7 -0
  241. package/dist/modules/shipment_tracking/services/trackingService.js +1283 -0
  242. package/dist/modules/shipment_tracking/services/trackingService.js.map +7 -0
  243. package/dist/modules/shipment_tracking/services/webhookService.js +263 -0
  244. package/dist/modules/shipment_tracking/services/webhookService.js.map +7 -0
  245. package/dist/modules/shipment_tracking/setup.js +72 -0
  246. package/dist/modules/shipment_tracking/setup.js.map +7 -0
  247. package/dist/modules/shipment_tracking/subscribers/cargo-event-created.js +60 -0
  248. package/dist/modules/shipment_tracking/subscribers/cargo-event-created.js.map +7 -0
  249. package/dist/modules/shipment_tracking/subscribers/dcsa-event-webhook-dispatch.js +58 -0
  250. package/dist/modules/shipment_tracking/subscribers/dcsa-event-webhook-dispatch.js.map +7 -0
  251. package/dist/modules/shipment_tracking/subscribers/poi-event-notification.js +82 -0
  252. package/dist/modules/shipment_tracking/subscribers/poi-event-notification.js.map +7 -0
  253. package/dist/modules/shipment_tracking/subscribers/poi-event-webhook-dispatch.js +53 -0
  254. package/dist/modules/shipment_tracking/subscribers/poi-event-webhook-dispatch.js.map +7 -0
  255. package/dist/modules/shipment_tracking/subscribers/shipment-status-changed.js +28 -0
  256. package/dist/modules/shipment_tracking/subscribers/shipment-status-changed.js.map +7 -0
  257. package/dist/modules/shipment_tracking/subscribers/terminal-event-ingest.js +67 -0
  258. package/dist/modules/shipment_tracking/subscribers/terminal-event-ingest.js.map +7 -0
  259. package/dist/modules/shipment_tracking/subscribers/tracking-job-initial-poll.js +30 -0
  260. package/dist/modules/shipment_tracking/subscribers/tracking-job-initial-poll.js.map +7 -0
  261. package/dist/modules/shipment_tracking/subscribers/tracking-job-webhook-dispatch.js +19 -0
  262. package/dist/modules/shipment_tracking/subscribers/tracking-job-webhook-dispatch.js.map +7 -0
  263. package/dist/modules/shipment_tracking/tables/index.js +6 -0
  264. package/dist/modules/shipment_tracking/tables/index.js.map +7 -0
  265. package/dist/modules/shipment_tracking/tables/tracking_job/table.client.js +284 -0
  266. package/dist/modules/shipment_tracking/tables/tracking_job/table.client.js.map +7 -0
  267. package/dist/modules/shipment_tracking/tables/tracking_job/table.js +36 -0
  268. package/dist/modules/shipment_tracking/tables/tracking_job/table.js.map +7 -0
  269. package/dist/modules/shipment_tracking/widgets/dashboard/ships-map/config.js +25 -0
  270. package/dist/modules/shipment_tracking/widgets/dashboard/ships-map/config.js.map +7 -0
  271. package/dist/modules/shipment_tracking/widgets/dashboard/ships-map/widget.client.js +355 -0
  272. package/dist/modules/shipment_tracking/widgets/dashboard/ships-map/widget.client.js.map +7 -0
  273. package/dist/modules/shipment_tracking/widgets/dashboard/ships-map/widget.js +26 -0
  274. package/dist/modules/shipment_tracking/widgets/dashboard/ships-map/widget.js.map +7 -0
  275. package/dist/types/assets.d.js +1 -0
  276. package/dist/types/assets.d.js.map +7 -0
  277. package/generated/entities/bic_config/index.ts +20 -0
  278. package/generated/entities/carrier_config/index.ts +23 -0
  279. package/generated/entities/location_override/index.ts +26 -0
  280. package/generated/entities/shipment/index.ts +46 -0
  281. package/generated/entities/ships_go_config/index.ts +25 -0
  282. package/generated/entities/tracking_event/index.ts +60 -0
  283. package/generated/entities/tracking_job/index.ts +33 -0
  284. package/generated/entities/webhook/index.ts +22 -0
  285. package/generated/entities/webhook_delivery/index.ts +22 -0
  286. package/generated/entities.ids.generated.ts +47 -0
  287. package/package.json +81 -0
  288. package/src/index.ts +39 -0
  289. package/src/modules/shipment_tracking/__integration__/TC-TRACK-410-shipsgo-config-api.spec.ts +133 -0
  290. package/src/modules/shipment_tracking/__integration__/meta.ts +4 -0
  291. package/src/modules/shipment_tracking/__tests__/empty-return-stop.test.ts +231 -0
  292. package/src/modules/shipment_tracking/__tests__/fixtures/hapag-lloyd-transship-container.json +702 -0
  293. package/src/modules/shipment_tracking/__tests__/fixtures/index.ts +434 -0
  294. package/src/modules/shipment_tracking/__tests__/fixtures/maersk-multi-transship-completed.json +1518 -0
  295. package/src/modules/shipment_tracking/__tests__/fixtures/maersk-transship-intransit.json +558 -0
  296. package/src/modules/shipment_tracking/__tests__/fixtures/msc-direct.json +222 -0
  297. package/src/modules/shipment_tracking/__tests__/fixtures/msc-multi-transship-completed.json +974 -0
  298. package/src/modules/shipment_tracking/__tests__/fixtures/msc-multi.json +4846 -0
  299. package/src/modules/shipment_tracking/__tests__/fixtures/msc-transship.json +409 -0
  300. package/src/modules/shipment_tracking/__tests__/fixtures/poi-events.json +240 -0
  301. package/src/modules/shipment_tracking/__tests__/fixtures/synthetic/index.ts +138 -0
  302. package/src/modules/shipment_tracking/__tests__/fixtures/synthetic-eta-updates.json +288 -0
  303. package/src/modules/shipment_tracking/__tests__/fixtures/synthetic-route-inference.json +201 -0
  304. package/src/modules/shipment_tracking/__tests__/fixtures/synthetic-voyage-progression.json +410 -0
  305. package/src/modules/shipment_tracking/__tests__/shipsgo-air-mapper.test.ts +157 -0
  306. package/src/modules/shipment_tracking/__tests__/shipsgo-client.test.ts +155 -0
  307. package/src/modules/shipment_tracking/__tests__/shipsgo-mapper.test.ts +201 -0
  308. package/src/modules/shipment_tracking/__tests__/shipsgo-poll.test.ts +357 -0
  309. package/src/modules/shipment_tracking/__tests__/shipsgo-provider.test.ts +364 -0
  310. package/src/modules/shipment_tracking/__tests__/trackingService.integration.test.ts +2248 -0
  311. package/src/modules/shipment_tracking/__tests__/webhookPayload.test.ts +151 -0
  312. package/src/modules/shipment_tracking/acl.ts +18 -0
  313. package/src/modules/shipment_tracking/api/bic-configs/route.ts +206 -0
  314. package/src/modules/shipment_tracking/api/bic-configs/test/route.ts +108 -0
  315. package/src/modules/shipment_tracking/api/cargo-events/route.ts +101 -0
  316. package/src/modules/shipment_tracking/api/carrier-configs/route.ts +142 -0
  317. package/src/modules/shipment_tracking/api/dashboard/ships-map/route.ts +246 -0
  318. package/src/modules/shipment_tracking/api/location-overrides/route.ts +185 -0
  319. package/src/modules/shipment_tracking/api/openapi.ts +28 -0
  320. package/src/modules/shipment_tracking/api/shipments/route.ts +197 -0
  321. package/src/modules/shipment_tracking/api/shipsgo-configs/route.ts +215 -0
  322. package/src/modules/shipment_tracking/api/tracking-jobs/route.ts +149 -0
  323. package/src/modules/shipment_tracking/api/tracking-jobs/sync/route.ts +116 -0
  324. package/src/modules/shipment_tracking/api/utils.ts +10 -0
  325. package/src/modules/shipment_tracking/api/webhooks/deliveries/route.ts +82 -0
  326. package/src/modules/shipment_tracking/api/webhooks/route.ts +138 -0
  327. package/src/modules/shipment_tracking/api/webhooks/test/route.ts +84 -0
  328. package/src/modules/shipment_tracking/assets/carriers/cma_cgm.png +0 -0
  329. package/src/modules/shipment_tracking/assets/carriers/cosco.png +0 -0
  330. package/src/modules/shipment_tracking/assets/carriers/evergreen.png +0 -0
  331. package/src/modules/shipment_tracking/assets/carriers/hapag_lloyd.png +0 -0
  332. package/src/modules/shipment_tracking/assets/carriers/maersk.png +0 -0
  333. package/src/modules/shipment_tracking/assets/carriers/msc.png +0 -0
  334. package/src/modules/shipment_tracking/assets/carriers/one.png +0 -0
  335. package/src/modules/shipment_tracking/assets/carriers/oocl.png +0 -0
  336. package/src/modules/shipment_tracking/assets/carriers/yang_ming.png +0 -0
  337. package/src/modules/shipment_tracking/assets/carriers/zim.png +0 -0
  338. package/src/modules/shipment_tracking/assets/index.ts +66 -0
  339. package/src/modules/shipment_tracking/backend/carrier-configs/page.meta.ts +16 -0
  340. package/src/modules/shipment_tracking/backend/carrier-configs/page.tsx +782 -0
  341. package/src/modules/shipment_tracking/backend/location-overrides/page.meta.ts +16 -0
  342. package/src/modules/shipment_tracking/backend/location-overrides/page.tsx +241 -0
  343. package/src/modules/shipment_tracking/backend/shipment-tracking/page.meta.ts +16 -0
  344. package/src/modules/shipment_tracking/backend/shipment-tracking/page.tsx +340 -0
  345. package/src/modules/shipment_tracking/backend/tracking-jobs/page.meta.ts +16 -0
  346. package/src/modules/shipment_tracking/backend/tracking-jobs/page.tsx +16 -0
  347. package/src/modules/shipment_tracking/backend/webhooks/page.meta.ts +16 -0
  348. package/src/modules/shipment_tracking/backend/webhooks/page.tsx +228 -0
  349. package/src/modules/shipment_tracking/ce.ts +48 -0
  350. package/src/modules/shipment_tracking/cli.ts +321 -0
  351. package/src/modules/shipment_tracking/commands/bic-configs.ts +94 -0
  352. package/src/modules/shipment_tracking/commands/carrier-configs.ts +89 -0
  353. package/src/modules/shipment_tracking/commands/index.ts +8 -0
  354. package/src/modules/shipment_tracking/commands/location-overrides.ts +119 -0
  355. package/src/modules/shipment_tracking/commands/shipments.ts +247 -0
  356. package/src/modules/shipment_tracking/commands/shipsgo-configs.ts +101 -0
  357. package/src/modules/shipment_tracking/commands/tracking-jobs.ts +158 -0
  358. package/src/modules/shipment_tracking/commands/tracking.ts +230 -0
  359. package/src/modules/shipment_tracking/commands/webhooks.ts +159 -0
  360. package/src/modules/shipment_tracking/components/CombinedTimestampCell.tsx +236 -0
  361. package/src/modules/shipment_tracking/components/FacilityLocationInput.tsx +235 -0
  362. package/src/modules/shipment_tracking/components/LocationOverrideDrawer.tsx +586 -0
  363. package/src/modules/shipment_tracking/components/ShipmentDetailsDrawer.tsx +1364 -0
  364. package/src/modules/shipment_tracking/components/ShipmentDrawer.tsx +498 -0
  365. package/src/modules/shipment_tracking/components/ShipsGoConfigSection.tsx +266 -0
  366. package/src/modules/shipment_tracking/components/TimestampCell.tsx +146 -0
  367. package/src/modules/shipment_tracking/components/TrackingJobDrawer.tsx +467 -0
  368. package/src/modules/shipment_tracking/components/VesselTrackingMap.tsx +761 -0
  369. package/src/modules/shipment_tracking/components/WebhookDrawer.tsx +434 -0
  370. package/src/modules/shipment_tracking/data/entities.ts +748 -0
  371. package/src/modules/shipment_tracking/data/validators.ts +523 -0
  372. package/src/modules/shipment_tracking/di.ts +73 -0
  373. package/src/modules/shipment_tracking/encryption.ts +17 -0
  374. package/src/modules/shipment_tracking/events.ts +122 -0
  375. package/src/modules/shipment_tracking/hooks/useVesselTracking.ts +297 -0
  376. package/src/modules/shipment_tracking/i18n/de.json +327 -0
  377. package/src/modules/shipment_tracking/i18n/en.json +327 -0
  378. package/src/modules/shipment_tracking/i18n/es.json +327 -0
  379. package/src/modules/shipment_tracking/i18n/pl.json +327 -0
  380. package/src/modules/shipment_tracking/index.ts +13 -0
  381. package/src/modules/shipment_tracking/lib/__tests__/dcsa-event-mapping.test.ts +385 -0
  382. package/src/modules/shipment_tracking/lib/__tests__/dcsa-event-parser.test.ts +398 -0
  383. package/src/modules/shipment_tracking/lib/__tests__/empty-return.test.ts +174 -0
  384. package/src/modules/shipment_tracking/lib/__tests__/poi-event-processor.test.ts +699 -0
  385. package/src/modules/shipment_tracking/lib/__tests__/route-inference.test.ts +402 -0
  386. package/src/modules/shipment_tracking/lib/__tests__/status-machine.test.ts +447 -0
  387. package/src/modules/shipment_tracking/lib/__tests__/time-extraction.test.ts +331 -0
  388. package/src/modules/shipment_tracking/lib/__tests__/timestamp-utils.test.ts +260 -0
  389. package/src/modules/shipment_tracking/lib/__tests__/vessel-api.test.ts +125 -0
  390. package/src/modules/shipment_tracking/lib/__tests__/vessel-extraction.test.ts +108 -0
  391. package/src/modules/shipment_tracking/lib/adapters/cma-cgm.ts +84 -0
  392. package/src/modules/shipment_tracking/lib/adapters/cosco-types.ts +145 -0
  393. package/src/modules/shipment_tracking/lib/adapters/cosco.ts +314 -0
  394. package/src/modules/shipment_tracking/lib/adapters/evergreen.ts +107 -0
  395. package/src/modules/shipment_tracking/lib/adapters/hapag-lloyd.ts +88 -0
  396. package/src/modules/shipment_tracking/lib/adapters/index.ts +18 -0
  397. package/src/modules/shipment_tracking/lib/adapters/maersk.ts +104 -0
  398. package/src/modules/shipment_tracking/lib/adapters/msc.ts +223 -0
  399. package/src/modules/shipment_tracking/lib/adapters/zim.ts +106 -0
  400. package/src/modules/shipment_tracking/lib/audit-helpers.ts +29 -0
  401. package/src/modules/shipment_tracking/lib/auth/base64url.ts +4 -0
  402. package/src/modules/shipment_tracking/lib/auth/oauth-client.ts +53 -0
  403. package/src/modules/shipment_tracking/lib/background.ts +24 -0
  404. package/src/modules/shipment_tracking/lib/bic-api-client.ts +199 -0
  405. package/src/modules/shipment_tracking/lib/carrier-adapter.ts +136 -0
  406. package/src/modules/shipment_tracking/lib/current-vessel.ts +274 -0
  407. package/src/modules/shipment_tracking/lib/dcsa-event-mapping.ts +202 -0
  408. package/src/modules/shipment_tracking/lib/dcsa-event-parser.ts +163 -0
  409. package/src/modules/shipment_tracking/lib/dcsa-params.ts +14 -0
  410. package/src/modules/shipment_tracking/lib/empty-return.ts +122 -0
  411. package/src/modules/shipment_tracking/lib/location-overrides.ts +150 -0
  412. package/src/modules/shipment_tracking/lib/location-types.ts +154 -0
  413. package/src/modules/shipment_tracking/lib/logger.ts +195 -0
  414. package/src/modules/shipment_tracking/lib/poi-event-processor.ts +302 -0
  415. package/src/modules/shipment_tracking/lib/poi-nats-config.ts +134 -0
  416. package/src/modules/shipment_tracking/lib/poi-types.ts +198 -0
  417. package/src/modules/shipment_tracking/lib/rate-limiter.ts +58 -0
  418. package/src/modules/shipment_tracking/lib/route-extraction.ts +439 -0
  419. package/src/modules/shipment_tracking/lib/route-inference.ts +238 -0
  420. package/src/modules/shipment_tracking/lib/schedule-generator.ts +92 -0
  421. package/src/modules/shipment_tracking/lib/shipsgo-client.ts +350 -0
  422. package/src/modules/shipment_tracking/lib/shipsgo-mapper.ts +296 -0
  423. package/src/modules/shipment_tracking/lib/status-machine.ts +230 -0
  424. package/src/modules/shipment_tracking/lib/time-extraction.ts +85 -0
  425. package/src/modules/shipment_tracking/lib/timestamp-utils.ts +244 -0
  426. package/src/modules/shipment_tracking/lib/vessel-api.ts +299 -0
  427. package/src/modules/shipment_tracking/lib/vessel-cache.ts +102 -0
  428. package/src/modules/shipment_tracking/lib/vessel-extraction.ts +39 -0
  429. package/src/modules/shipment_tracking/lib/webhook-dispatcher.ts +93 -0
  430. package/src/modules/shipment_tracking/migrations/.snapshot-open-mercato.json +2914 -0
  431. package/src/modules/shipment_tracking/migrations/Migration20260422161208_shipment_tracking.ts +60 -0
  432. package/src/modules/shipment_tracking/migrations/Migration20260529120000_shipment_tracking_poi_region_names.ts +22 -0
  433. package/src/modules/shipment_tracking/migrations/Migration20260821120000_shipment_tracking_shipsgo.ts +65 -0
  434. package/src/modules/shipment_tracking/notifications.ts +151 -0
  435. package/src/modules/shipment_tracking/services/carrierRegistry.ts +29 -0
  436. package/src/modules/shipment_tracking/services/poiNatsService.ts +526 -0
  437. package/src/modules/shipment_tracking/services/shipsGoProvider.ts +231 -0
  438. package/src/modules/shipment_tracking/services/trackingService.ts +1777 -0
  439. package/src/modules/shipment_tracking/services/webhookService.ts +347 -0
  440. package/src/modules/shipment_tracking/setup.ts +99 -0
  441. package/src/modules/shipment_tracking/subscribers/__tests__/terminal-event-ingest.test.ts +141 -0
  442. package/src/modules/shipment_tracking/subscribers/cargo-event-created.ts +115 -0
  443. package/src/modules/shipment_tracking/subscribers/dcsa-event-webhook-dispatch.ts +115 -0
  444. package/src/modules/shipment_tracking/subscribers/poi-event-notification.ts +144 -0
  445. package/src/modules/shipment_tracking/subscribers/poi-event-webhook-dispatch.ts +94 -0
  446. package/src/modules/shipment_tracking/subscribers/shipment-status-changed.ts +41 -0
  447. package/src/modules/shipment_tracking/subscribers/terminal-event-ingest.ts +109 -0
  448. package/src/modules/shipment_tracking/subscribers/tracking-job-initial-poll.ts +53 -0
  449. package/src/modules/shipment_tracking/subscribers/tracking-job-webhook-dispatch.ts +50 -0
  450. package/src/modules/shipment_tracking/tables/index.ts +4 -0
  451. package/src/modules/shipment_tracking/tables/tracking_job/table.client.tsx +337 -0
  452. package/src/modules/shipment_tracking/tables/tracking_job/table.ts +34 -0
  453. package/src/modules/shipment_tracking/widgets/dashboard/ships-map/config.ts +32 -0
  454. package/src/modules/shipment_tracking/widgets/dashboard/ships-map/widget.client.tsx +448 -0
  455. package/src/modules/shipment_tracking/widgets/dashboard/ships-map/widget.ts +25 -0
  456. package/src/types/assets.d.ts +5 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/modules/shipment_tracking/backend/webhooks/page.meta.ts"],
4
+ "sourcesContent": ["import React from 'react'\nimport { Webhook } from 'lucide-react'\n\nexport const metadata = {\n requireAuth: true,\n requireFeatures: ['shipment_tracking.webhooks.view'],\n pageTitle: 'Webhooks',\n pageTitleKey: 'shipment_tracking.nav.webhooks',\n pageGroup: 'Shipment Tracking',\n pageGroupKey: 'shipment_tracking.nav.group',\n pageContext: 'settings' as const,\n pagePriority: 10,\n pageOrder: 130,\n icon: React.createElement(Webhook, { size: 16 }),\n breadcrumb: [{ label: 'Webhooks', labelKey: 'shipment_tracking.nav.webhooks' }],\n}\n"],
5
+ "mappings": "AAAA,OAAO,WAAW;AAClB,SAAS,eAAe;AAEjB,MAAM,WAAW;AAAA,EACtB,aAAa;AAAA,EACb,iBAAiB,CAAC,iCAAiC;AAAA,EACnD,WAAW;AAAA,EACX,cAAc;AAAA,EACd,WAAW;AAAA,EACX,cAAc;AAAA,EACd,aAAa;AAAA,EACb,cAAc;AAAA,EACd,WAAW;AAAA,EACX,MAAM,MAAM,cAAc,SAAS,EAAE,MAAM,GAAG,CAAC;AAAA,EAC/C,YAAY,CAAC,EAAE,OAAO,YAAY,UAAU,iCAAiC,CAAC;AAChF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,52 @@
1
+ const entities = [
2
+ {
3
+ id: "shipment_tracking:shipment",
4
+ label: "Shipment",
5
+ description: "Ocean container shipment tracked across carriers.",
6
+ labelField: "containerNumber",
7
+ showInSidebar: false,
8
+ fields: []
9
+ },
10
+ {
11
+ id: "shipment_tracking:tracking_job",
12
+ label: "Tracking Job",
13
+ description: "Scheduled polling job for a shipment carrier.",
14
+ labelField: "referenceValue",
15
+ showInSidebar: false,
16
+ defaultEditor: false,
17
+ fields: []
18
+ },
19
+ {
20
+ id: "shipment_tracking:cargo_event",
21
+ label: "Cargo Event",
22
+ description: "Individual tracking event for a shipment.",
23
+ labelField: "eventCode",
24
+ showInSidebar: false,
25
+ defaultEditor: false,
26
+ fields: []
27
+ },
28
+ {
29
+ id: "shipment_tracking:carrier_config",
30
+ label: "Carrier Config",
31
+ description: "Carrier API configuration with authentication credentials.",
32
+ labelField: "carrierCode",
33
+ showInSidebar: false,
34
+ defaultEditor: false,
35
+ fields: []
36
+ },
37
+ {
38
+ id: "shipment_tracking:webhook",
39
+ label: "Webhook",
40
+ description: "Webhook endpoint for shipment tracking event notifications.",
41
+ labelField: "url",
42
+ showInSidebar: false,
43
+ defaultEditor: false,
44
+ fields: []
45
+ }
46
+ ];
47
+ var ce_default = entities;
48
+ export {
49
+ ce_default as default,
50
+ entities
51
+ };
52
+ //# sourceMappingURL=ce.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/modules/shipment_tracking/ce.ts"],
4
+ "sourcesContent": ["export const entities = [\n {\n id: 'shipment_tracking:shipment',\n label: 'Shipment',\n description: 'Ocean container shipment tracked across carriers.',\n labelField: 'containerNumber',\n showInSidebar: false,\n fields: [],\n },\n {\n id: 'shipment_tracking:tracking_job',\n label: 'Tracking Job',\n description: 'Scheduled polling job for a shipment carrier.',\n labelField: 'referenceValue',\n showInSidebar: false,\n defaultEditor: false,\n fields: [],\n },\n {\n id: 'shipment_tracking:cargo_event',\n label: 'Cargo Event',\n description: 'Individual tracking event for a shipment.',\n labelField: 'eventCode',\n showInSidebar: false,\n defaultEditor: false,\n fields: [],\n },\n {\n id: 'shipment_tracking:carrier_config',\n label: 'Carrier Config',\n description: 'Carrier API configuration with authentication credentials.',\n labelField: 'carrierCode',\n showInSidebar: false,\n defaultEditor: false,\n fields: [],\n },\n {\n id: 'shipment_tracking:webhook',\n label: 'Webhook',\n description: 'Webhook endpoint for shipment tracking event notifications.',\n labelField: 'url',\n showInSidebar: false,\n defaultEditor: false,\n fields: [],\n },\n]\n\nexport default entities\n"],
5
+ "mappings": "AAAO,MAAM,WAAW;AAAA,EACtB;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,QAAQ,CAAC;AAAA,EACX;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,eAAe;AAAA,IACf,QAAQ,CAAC;AAAA,EACX;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,eAAe;AAAA,IACf,QAAQ,CAAC;AAAA,EACX;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,eAAe;AAAA,IACf,QAAQ,CAAC;AAAA,EACX;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,eAAe;AAAA,IACf,QAAQ,CAAC;AAAA,EACX;AACF;AAEA,IAAO,aAAQ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,229 @@
1
+ import { createRequestContainer } from "@open-mercato/shared/lib/di/container";
2
+ function parseArgs(args) {
3
+ const result = {};
4
+ for (let i = 0; i < args.length; i++) {
5
+ const arg = args[i];
6
+ if (arg.startsWith("--")) {
7
+ const key = arg.slice(2);
8
+ if (arg.includes("=")) {
9
+ const [k, v] = arg.slice(2).split("=");
10
+ result[k] = v;
11
+ } else {
12
+ const nextArg = args[i + 1];
13
+ if (nextArg && !nextArg.startsWith("--")) {
14
+ result[key] = nextArg;
15
+ i++;
16
+ } else {
17
+ result[key] = true;
18
+ }
19
+ }
20
+ }
21
+ }
22
+ return result;
23
+ }
24
+ const setupSchedulesCommand = {
25
+ command: "setup-schedules",
26
+ async run(rest) {
27
+ const args = parseArgs(rest);
28
+ const tenantId = String(args.tenantId ?? args.tenant ?? "");
29
+ const organizationId = String(args.organizationId ?? args.orgId ?? args.org ?? "");
30
+ if (!tenantId || !organizationId) {
31
+ console.error(
32
+ "Usage: mercato shipment_tracking setup-schedules --tenant <tenantId> --org <organizationId>"
33
+ );
34
+ console.error("");
35
+ console.error("This command registers the scheduled jobs for shipment tracking:");
36
+ console.error(" - Daily poll schedule (6:00 AM UTC): polls all active tracking jobs");
37
+ console.error(" - Pre-arrival evaluation (every 6h): upgrades IN_TRANSIT \u2192 PRE_ARRIVAL");
38
+ console.error("");
39
+ console.error("After running, sync with BullMQ:");
40
+ console.error(" yarn mercato scheduler start");
41
+ return;
42
+ }
43
+ const { resolve } = await createRequestContainer();
44
+ try {
45
+ const schedulerService = resolve("schedulerService");
46
+ if (!schedulerService) {
47
+ console.error("\u274C Scheduler service not available.");
48
+ console.error(" Make sure the scheduler module is installed and configured.");
49
+ process.exit(1);
50
+ }
51
+ console.log("\u{1F4C5} Registering shipment tracking schedules...\n");
52
+ await schedulerService.register({
53
+ name: "Daily Shipment Tracking Poll",
54
+ description: "Polls all active tracking jobs for carrier updates every day at 6:00 AM UTC.",
55
+ scopeType: "organization",
56
+ tenantId,
57
+ organizationId,
58
+ scheduleType: "cron",
59
+ scheduleValue: "0 6 * * *",
60
+ // 6:00 AM UTC daily
61
+ timezone: "UTC",
62
+ targetType: "command",
63
+ targetCommand: "shipment_tracking.tracking.poll_all",
64
+ targetPayload: {
65
+ tenantId,
66
+ organizationId
67
+ },
68
+ sourceType: "module",
69
+ sourceModule: "shipment_tracking",
70
+ isEnabled: true
71
+ });
72
+ console.log(` \u2705 Registered daily poll schedule`);
73
+ console.log(` Cron: 0 6 * * * (6:00 AM UTC daily)`);
74
+ await schedulerService.register({
75
+ name: "Pre-Arrival Status Evaluation",
76
+ description: "Checks IN_TRANSIT shipments every 6 hours and upgrades them to PRE_ARRIVAL when ETA is within 7 days.",
77
+ scopeType: "organization",
78
+ tenantId,
79
+ organizationId,
80
+ scheduleType: "cron",
81
+ scheduleValue: "0 */6 * * *",
82
+ // Every 6 hours
83
+ timezone: "UTC",
84
+ targetType: "command",
85
+ targetCommand: "shipment_tracking.tracking.evaluate_pre_arrival",
86
+ targetPayload: {
87
+ tenantId,
88
+ organizationId
89
+ },
90
+ sourceType: "module",
91
+ sourceModule: "shipment_tracking",
92
+ isEnabled: true
93
+ });
94
+ console.log(` \u2705 Registered pre-arrival evaluation schedule`);
95
+ console.log(` Cron: 0 */6 * * * (every 6 hours)`);
96
+ console.log("");
97
+ console.log("\u2705 Schedules registered successfully!");
98
+ console.log("");
99
+ console.log("Next steps:");
100
+ console.log(" 1. Sync schedules with BullMQ: yarn mercato scheduler start");
101
+ console.log(" 2. Ensure worker is running: yarn mercato worker:start");
102
+ console.log("");
103
+ } catch (error) {
104
+ if (error.message?.includes("not registered")) {
105
+ console.error("\u274C Scheduler service not available.");
106
+ console.error(" Make sure the scheduler module is installed.");
107
+ } else {
108
+ console.error("\u274C Failed to register schedules:", error.message);
109
+ }
110
+ process.exit(1);
111
+ }
112
+ }
113
+ };
114
+ const poiWorkerCommand = {
115
+ command: "poi:worker",
116
+ async run() {
117
+ const { resolve } = await createRequestContainer();
118
+ try {
119
+ const poiService = resolve("poiNatsService");
120
+ if (!poiService) {
121
+ console.error("[poi-worker] PoiNatsService not available");
122
+ process.exit(1);
123
+ }
124
+ if (!poiService.isConfigured()) {
125
+ console.log("[poi-worker] POI_NATS_URL not configured, exiting");
126
+ console.log("[poi-worker] Set POI_NATS_URL environment variable to enable");
127
+ process.exit(0);
128
+ }
129
+ console.log("[poi-worker] Starting POI NATS consumer...");
130
+ await poiService.start();
131
+ const stats = poiService.getStats();
132
+ console.log(`[poi-worker] Consumer started at ${stats.connectedAt?.toISOString()}`);
133
+ console.log("[poi-worker] Listening for POI proximity events");
134
+ let isShuttingDown = false;
135
+ const gracefulShutdown = async () => {
136
+ if (isShuttingDown) return;
137
+ isShuttingDown = true;
138
+ console.log("[poi-worker] Shutting down...");
139
+ try {
140
+ await poiService.stop();
141
+ console.log("[poi-worker] Stopped");
142
+ } catch (error) {
143
+ console.error("[poi-worker] Error during shutdown:", error);
144
+ }
145
+ process.exit(0);
146
+ };
147
+ process.on("SIGINT", gracefulShutdown);
148
+ process.on("SIGTERM", gracefulShutdown);
149
+ await new Promise(() => {
150
+ });
151
+ } catch (error) {
152
+ console.error("[poi-worker] Failed to start:", error.message);
153
+ process.exit(1);
154
+ }
155
+ }
156
+ };
157
+ const poiStatusCommand = {
158
+ command: "poi:status",
159
+ async run() {
160
+ const { resolve } = await createRequestContainer();
161
+ try {
162
+ const poiService = resolve("poiNatsService");
163
+ if (!poiService) {
164
+ console.error("PoiNatsService not available.");
165
+ process.exit(1);
166
+ }
167
+ console.log("POI NATS Subscriber Status\n");
168
+ if (!poiService.isConfigured()) {
169
+ console.log(" Status: not configured");
170
+ console.log("");
171
+ console.log("Set POI_NATS_URL environment variable to enable POI event subscription.");
172
+ process.exit(0);
173
+ }
174
+ const stats = poiService.getStats();
175
+ console.log(` Status: ${stats.status}`);
176
+ console.log(` Connected at: ${stats.connectedAt?.toISOString() ?? "N/A"}`);
177
+ console.log(` Messages received: ${stats.messagesReceived}`);
178
+ console.log(` Messages processed: ${stats.messagesProcessed}`);
179
+ console.log(` Events created: ${stats.eventsCreated}`);
180
+ console.log(` Errors: ${stats.errors}`);
181
+ console.log(` Last message at: ${stats.lastMessageAt?.toISOString() ?? "N/A"}`);
182
+ console.log("");
183
+ } catch (error) {
184
+ console.error("Failed to get status:", error.message);
185
+ process.exit(1);
186
+ }
187
+ }
188
+ };
189
+ const poiHelpCommand = {
190
+ command: "poi:help",
191
+ async run() {
192
+ console.log("POI NATS Consumer Commands\n");
193
+ console.log("Commands:");
194
+ console.log(" poi:worker Start the POI NATS consumer worker (long-running)");
195
+ console.log(" poi:status Show consumer status and statistics");
196
+ console.log(" poi:help Show this help message");
197
+ console.log("");
198
+ console.log("Environment Variables:");
199
+ console.log(" POI_NATS_URL NATS server URL (required to enable)");
200
+ console.log(" POI_NATS_STREAM JetStream stream name (default: AIS_STREAM)");
201
+ console.log(" POI_NATS_SUBJECT Subject filter (default: ais.ship.proximity.events)");
202
+ console.log(" POI_NATS_CONSUMER Durable consumer name (default: shipment-tracking-poi)");
203
+ console.log("");
204
+ console.log("Prerequisites:");
205
+ console.log(" Create a durable consumer on the NATS server:");
206
+ console.log(" nats consumer add AIS_STREAM shipment-tracking-poi \\");
207
+ console.log(' --filter "ais.ship.proximity.events" \\');
208
+ console.log(" --ack explicit --deliver all --replay instant");
209
+ console.log("");
210
+ console.log("Running as a service:");
211
+ console.log(" # Direct:");
212
+ console.log(" POI_NATS_URL=nats://localhost:4222 yarn mercato shipment_tracking poi:worker");
213
+ console.log("");
214
+ console.log(" # With pm2:");
215
+ console.log(' pm2 start "yarn mercato shipment_tracking poi:worker" --name poi-worker');
216
+ console.log("");
217
+ console.log(" # With Docker (add to docker-compose.yml):");
218
+ console.log(" poi-worker:");
219
+ console.log(" command: yarn mercato shipment_tracking poi:worker");
220
+ console.log(" environment:");
221
+ console.log(" - POI_NATS_URL=nats://nats:4222");
222
+ console.log("");
223
+ }
224
+ };
225
+ var cli_default = [setupSchedulesCommand, poiWorkerCommand, poiStatusCommand, poiHelpCommand];
226
+ export {
227
+ cli_default as default
228
+ };
229
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/modules/shipment_tracking/cli.ts"],
4
+ "sourcesContent": ["import type { ModuleCli } from '@open-mercato/shared/modules/registry'\nimport { createRequestContainer } from '@open-mercato/shared/lib/di/container'\nimport type { PoiNatsService } from './services/poiNatsService'\n\n// \u2500\u2500\u2500 Argument Parser \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction parseArgs(args: string[]): Record<string, string | boolean> {\n const result: Record<string, string | boolean> = {}\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i]\n\n if (arg.startsWith('--')) {\n const key = arg.slice(2)\n\n if (arg.includes('=')) {\n const [k, v] = arg.slice(2).split('=')\n result[k] = v\n } else {\n const nextArg = args[i + 1]\n if (nextArg && !nextArg.startsWith('--')) {\n result[key] = nextArg\n i++\n } else {\n result[key] = true\n }\n }\n }\n }\n\n return result\n}\n\n// \u2500\u2500\u2500 Scheduler Service Type \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ntype SchedulerServiceType = {\n register: (registration: {\n name: string\n description?: string\n scopeType: 'system' | 'organization' | 'tenant'\n organizationId?: string\n tenantId?: string\n scheduleType: 'cron' | 'interval'\n scheduleValue: string\n timezone?: string\n targetType: 'queue' | 'command'\n targetQueue?: string\n targetCommand?: string\n targetPayload?: unknown\n sourceType?: 'user' | 'module'\n sourceModule?: string\n isEnabled?: boolean\n }) => Promise<void>\n}\n\n// \u2500\u2500\u2500 Setup Schedules Command \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Register scheduled jobs for shipment tracking\n *\n * This command registers the daily poll and pre-arrival evaluation schedules\n * for an organization.\n *\n * Usage:\n * yarn mercato shipment_tracking setup-schedules --tenant <tenantId> --org <organizationId>\n *\n * After running, start the scheduler to sync with BullMQ:\n * yarn mercato scheduler start\n */\nconst setupSchedulesCommand: ModuleCli = {\n command: 'setup-schedules',\n async run(rest) {\n const args = parseArgs(rest)\n const tenantId = String(args.tenantId ?? args.tenant ?? '')\n const organizationId = String(args.organizationId ?? args.orgId ?? args.org ?? '')\n\n if (!tenantId || !organizationId) {\n console.error(\n 'Usage: mercato shipment_tracking setup-schedules --tenant <tenantId> --org <organizationId>',\n )\n console.error('')\n console.error('This command registers the scheduled jobs for shipment tracking:')\n console.error(' - Daily poll schedule (6:00 AM UTC): polls all active tracking jobs')\n console.error(' - Pre-arrival evaluation (every 6h): upgrades IN_TRANSIT \u2192 PRE_ARRIVAL')\n console.error('')\n console.error('After running, sync with BullMQ:')\n console.error(' yarn mercato scheduler start')\n return\n }\n\n const { resolve } = await createRequestContainer()\n\n try {\n const schedulerService = resolve<SchedulerServiceType>('schedulerService')\n\n if (!schedulerService) {\n console.error('\u274C Scheduler service not available.')\n console.error(' Make sure the scheduler module is installed and configured.')\n process.exit(1)\n }\n\n console.log('\uD83D\uDCC5 Registering shipment tracking schedules...\\n')\n\n // Register daily poll schedule\n await schedulerService.register({\n name: 'Daily Shipment Tracking Poll',\n description:\n 'Polls all active tracking jobs for carrier updates every day at 6:00 AM UTC.',\n scopeType: 'organization',\n tenantId,\n organizationId,\n scheduleType: 'cron',\n scheduleValue: '0 6 * * *', // 6:00 AM UTC daily\n timezone: 'UTC',\n targetType: 'command',\n targetCommand: 'shipment_tracking.tracking.poll_all',\n targetPayload: {\n tenantId,\n organizationId,\n },\n sourceType: 'module',\n sourceModule: 'shipment_tracking',\n isEnabled: true,\n })\n console.log(` \u2705 Registered daily poll schedule`)\n console.log(` Cron: 0 6 * * * (6:00 AM UTC daily)`)\n\n // Register PRE_ARRIVAL evaluation schedule\n await schedulerService.register({\n name: 'Pre-Arrival Status Evaluation',\n description:\n 'Checks IN_TRANSIT shipments every 6 hours and upgrades them to PRE_ARRIVAL when ETA is within 7 days.',\n scopeType: 'organization',\n tenantId,\n organizationId,\n scheduleType: 'cron',\n scheduleValue: '0 */6 * * *', // Every 6 hours\n timezone: 'UTC',\n targetType: 'command',\n targetCommand: 'shipment_tracking.tracking.evaluate_pre_arrival',\n targetPayload: {\n tenantId,\n organizationId,\n },\n sourceType: 'module',\n sourceModule: 'shipment_tracking',\n isEnabled: true,\n })\n console.log(` \u2705 Registered pre-arrival evaluation schedule`)\n console.log(` Cron: 0 */6 * * * (every 6 hours)`)\n\n console.log('')\n console.log('\u2705 Schedules registered successfully!')\n console.log('')\n console.log('Next steps:')\n console.log(' 1. Sync schedules with BullMQ: yarn mercato scheduler start')\n console.log(' 2. Ensure worker is running: yarn mercato worker:start')\n console.log('')\n } catch (error: any) {\n if (error.message?.includes('not registered')) {\n console.error('\u274C Scheduler service not available.')\n console.error(' Make sure the scheduler module is installed.')\n } else {\n console.error('\u274C Failed to register schedules:', error.message)\n }\n process.exit(1)\n }\n },\n}\n\n// \u2500\u2500\u2500 POI NATS Subscriber Commands \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * POI NATS Worker\n *\n * Long-running worker process that consumes POI proximity events from NATS JetStream.\n * Run this as a separate process/service alongside the main app.\n *\n * Usage:\n * yarn mercato shipment_tracking poi:worker\n *\n * With pm2:\n * pm2 start \"yarn mercato shipment_tracking poi:worker\" --name poi-worker\n *\n * With systemd:\n * ExecStart=/path/to/yarn mercato shipment_tracking poi:worker\n */\nconst poiWorkerCommand: ModuleCli = {\n command: 'poi:worker',\n async run() {\n const { resolve } = await createRequestContainer()\n\n try {\n const poiService = resolve<PoiNatsService>('poiNatsService')\n\n if (!poiService) {\n console.error('[poi-worker] PoiNatsService not available')\n process.exit(1)\n }\n\n // Check if POI NATS is configured\n if (!poiService.isConfigured()) {\n console.log('[poi-worker] POI_NATS_URL not configured, exiting')\n console.log('[poi-worker] Set POI_NATS_URL environment variable to enable')\n process.exit(0)\n }\n\n console.log('[poi-worker] Starting POI NATS consumer...')\n\n // Start the NATS subscriber\n await poiService.start()\n\n const stats = poiService.getStats()\n console.log(`[poi-worker] Consumer started at ${stats.connectedAt?.toISOString()}`)\n console.log('[poi-worker] Listening for POI proximity events')\n\n // Keep the process alive and handle graceful shutdown\n let isShuttingDown = false\n const gracefulShutdown = async () => {\n if (isShuttingDown) return\n isShuttingDown = true\n console.log('[poi-worker] Shutting down...')\n try {\n await poiService.stop()\n console.log('[poi-worker] Stopped')\n } catch (error) {\n console.error('[poi-worker] Error during shutdown:', error)\n }\n process.exit(0)\n }\n\n process.on('SIGINT', gracefulShutdown)\n process.on('SIGTERM', gracefulShutdown)\n\n // Keep alive\n await new Promise(() => {})\n } catch (error: any) {\n console.error('[poi-worker] Failed to start:', error.message)\n process.exit(1)\n }\n },\n}\n\nconst poiStatusCommand: ModuleCli = {\n command: 'poi:status',\n async run() {\n const { resolve } = await createRequestContainer()\n\n try {\n const poiService = resolve<PoiNatsService>('poiNatsService')\n\n if (!poiService) {\n console.error('PoiNatsService not available.')\n process.exit(1)\n }\n\n console.log('POI NATS Subscriber Status\\n')\n\n // Check if POI NATS is configured\n if (!poiService.isConfigured()) {\n console.log(' Status: not configured')\n console.log('')\n console.log('Set POI_NATS_URL environment variable to enable POI event subscription.')\n process.exit(0)\n }\n\n const stats = poiService.getStats()\n\n console.log(` Status: ${stats.status}`)\n console.log(` Connected at: ${stats.connectedAt?.toISOString() ?? 'N/A'}`)\n console.log(` Messages received: ${stats.messagesReceived}`)\n console.log(` Messages processed: ${stats.messagesProcessed}`)\n console.log(` Events created: ${stats.eventsCreated}`)\n console.log(` Errors: ${stats.errors}`)\n console.log(` Last message at: ${stats.lastMessageAt?.toISOString() ?? 'N/A'}`)\n console.log('')\n } catch (error: any) {\n console.error('Failed to get status:', error.message)\n process.exit(1)\n }\n },\n}\n\nconst poiHelpCommand: ModuleCli = {\n command: 'poi:help',\n async run() {\n console.log('POI NATS Consumer Commands\\n')\n console.log('Commands:')\n console.log(' poi:worker Start the POI NATS consumer worker (long-running)')\n console.log(' poi:status Show consumer status and statistics')\n console.log(' poi:help Show this help message')\n console.log('')\n console.log('Environment Variables:')\n console.log(' POI_NATS_URL NATS server URL (required to enable)')\n console.log(' POI_NATS_STREAM JetStream stream name (default: AIS_STREAM)')\n console.log(' POI_NATS_SUBJECT Subject filter (default: ais.ship.proximity.events)')\n console.log(' POI_NATS_CONSUMER Durable consumer name (default: shipment-tracking-poi)')\n console.log('')\n console.log('Prerequisites:')\n console.log(' Create a durable consumer on the NATS server:')\n console.log(' nats consumer add AIS_STREAM shipment-tracking-poi \\\\')\n console.log(' --filter \"ais.ship.proximity.events\" \\\\')\n console.log(' --ack explicit --deliver all --replay instant')\n console.log('')\n console.log('Running as a service:')\n console.log(' # Direct:')\n console.log(' POI_NATS_URL=nats://localhost:4222 yarn mercato shipment_tracking poi:worker')\n console.log('')\n console.log(' # With pm2:')\n console.log(' pm2 start \"yarn mercato shipment_tracking poi:worker\" --name poi-worker')\n console.log('')\n console.log(' # With Docker (add to docker-compose.yml):')\n console.log(' poi-worker:')\n console.log(' command: yarn mercato shipment_tracking poi:worker')\n console.log(' environment:')\n console.log(' - POI_NATS_URL=nats://nats:4222')\n console.log('')\n },\n}\n\nexport default [setupSchedulesCommand, poiWorkerCommand, poiStatusCommand, poiHelpCommand]\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,66 @@
1
+ import { registerCommand } from "@open-mercato/shared/lib/commands";
2
+ import { findOneWithDecryption } from "@open-mercato/shared/lib/encryption/find";
3
+ import { BicConfig } from "../data/entities.js";
4
+ function ensureScope(ctx, tenantId, organizationId) {
5
+ if (ctx.auth?.tenantId && ctx.auth.tenantId !== tenantId) {
6
+ throw new Error("Tenant mismatch");
7
+ }
8
+ if (!ctx.auth?.isSuperAdmin && ctx.auth?.organizationId && ctx.auth.organizationId !== organizationId) {
9
+ throw new Error("Organization mismatch");
10
+ }
11
+ }
12
+ const upsertBicConfig = {
13
+ id: "shipment_tracking.bic_config.upsert",
14
+ async execute(input, ctx) {
15
+ ensureScope(ctx, input.tenantId, input.organizationId);
16
+ const em = ctx.container.resolve("em").fork();
17
+ let bicConfig = await findOneWithDecryption(
18
+ em,
19
+ BicConfig,
20
+ { organizationId: input.organizationId, tenantId: input.tenantId },
21
+ {},
22
+ { tenantId: input.tenantId, organizationId: input.organizationId }
23
+ );
24
+ if (bicConfig) {
25
+ bicConfig.isEnabled = input.isEnabled;
26
+ bicConfig.username = input.username;
27
+ if (input.password && input.password !== "__UNCHANGED__") {
28
+ bicConfig.password = input.password;
29
+ }
30
+ bicConfig.baseUrl = input.baseUrl ?? "https://api.bic-code.org";
31
+ } else {
32
+ bicConfig = em.create(BicConfig, {
33
+ organizationId: input.organizationId,
34
+ tenantId: input.tenantId,
35
+ isEnabled: input.isEnabled,
36
+ username: input.username,
37
+ password: input.password,
38
+ baseUrl: input.baseUrl ?? "https://api.bic-code.org"
39
+ });
40
+ }
41
+ await em.flush();
42
+ return { id: bicConfig.id };
43
+ }
44
+ };
45
+ const deleteBicConfig = {
46
+ id: "shipment_tracking.bic_config.delete",
47
+ async execute(input, ctx) {
48
+ ensureScope(ctx, input.tenantId, input.organizationId);
49
+ const em = ctx.container.resolve("em").fork();
50
+ const bicConfig = await findOneWithDecryption(
51
+ em,
52
+ BicConfig,
53
+ { organizationId: input.organizationId, tenantId: input.tenantId },
54
+ {},
55
+ { tenantId: input.tenantId, organizationId: input.organizationId }
56
+ );
57
+ if (bicConfig) {
58
+ em.remove(bicConfig);
59
+ await em.flush();
60
+ }
61
+ return { success: true };
62
+ }
63
+ };
64
+ registerCommand(upsertBicConfig);
65
+ registerCommand(deleteBicConfig);
66
+ //# sourceMappingURL=bic-configs.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/shipment_tracking/commands/bic-configs.ts"],
4
+ "sourcesContent": ["import { registerCommand } from '@open-mercato/shared/lib/commands'\nimport type { CommandHandler, CommandRuntimeContext } from '@open-mercato/shared/lib/commands'\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport { findOneWithDecryption } from '@open-mercato/shared/lib/encryption/find'\nimport { BicConfig } from '../data/entities'\nimport type { BicConfigUpsertInput } from '../data/validators'\n\nfunction ensureScope(ctx: CommandRuntimeContext, tenantId: string, organizationId: string) {\n if (ctx.auth?.tenantId && ctx.auth.tenantId !== tenantId) {\n throw new Error('Tenant mismatch')\n }\n if (!ctx.auth?.isSuperAdmin && ctx.auth?.organizationId && ctx.auth.organizationId !== organizationId) {\n throw new Error('Organization mismatch')\n }\n}\n\n/**\n * Upsert BIC config - creates if not exists, updates if exists.\n * There is only one BIC config per organization/tenant.\n */\nconst upsertBicConfig: CommandHandler<BicConfigUpsertInput, { id: string }> = {\n id: 'shipment_tracking.bic_config.upsert',\n\n async execute(input, ctx) {\n ensureScope(ctx, input.tenantId, input.organizationId)\n\n const em = ctx.container.resolve<EntityManager>('em').fork()\n\n // Find existing config for this org/tenant\n let bicConfig = await findOneWithDecryption(\n em,\n BicConfig,\n { organizationId: input.organizationId, tenantId: input.tenantId },\n {},\n { tenantId: input.tenantId, organizationId: input.organizationId },\n )\n\n if (bicConfig) {\n // Update existing\n bicConfig.isEnabled = input.isEnabled\n bicConfig.username = input.username\n // Only update password if a new one was provided (not the sentinel value)\n if (input.password && input.password !== '__UNCHANGED__') {\n bicConfig.password = input.password\n }\n bicConfig.baseUrl = input.baseUrl ?? 'https://api.bic-code.org'\n } else {\n // Create new\n bicConfig = em.create(BicConfig, {\n organizationId: input.organizationId,\n tenantId: input.tenantId,\n isEnabled: input.isEnabled,\n username: input.username,\n password: input.password,\n baseUrl: input.baseUrl ?? 'https://api.bic-code.org',\n })\n }\n\n await em.flush()\n\n return { id: bicConfig.id }\n },\n}\n\n/**\n * Delete BIC config\n */\nconst deleteBicConfig: CommandHandler<{ tenantId: string; organizationId: string }, { success: boolean }> = {\n id: 'shipment_tracking.bic_config.delete',\n\n async execute(input, ctx) {\n ensureScope(ctx, input.tenantId, input.organizationId)\n\n const em = ctx.container.resolve<EntityManager>('em').fork()\n\n const bicConfig = await findOneWithDecryption(\n em,\n BicConfig,\n { organizationId: input.organizationId, tenantId: input.tenantId },\n {},\n { tenantId: input.tenantId, organizationId: input.organizationId },\n )\n\n if (bicConfig) {\n em.remove(bicConfig)\n await em.flush()\n }\n\n return { success: true }\n },\n}\n\nregisterCommand(upsertBicConfig)\nregisterCommand(deleteBicConfig)\n"],
5
+ "mappings": "AAAA,SAAS,uBAAuB;AAGhC,SAAS,6BAA6B;AACtC,SAAS,iBAAiB;AAG1B,SAAS,YAAY,KAA4B,UAAkB,gBAAwB;AACzF,MAAI,IAAI,MAAM,YAAY,IAAI,KAAK,aAAa,UAAU;AACxD,UAAM,IAAI,MAAM,iBAAiB;AAAA,EACnC;AACA,MAAI,CAAC,IAAI,MAAM,gBAAgB,IAAI,MAAM,kBAAkB,IAAI,KAAK,mBAAmB,gBAAgB;AACrG,UAAM,IAAI,MAAM,uBAAuB;AAAA,EACzC;AACF;AAMA,MAAM,kBAAwE;AAAA,EAC5E,IAAI;AAAA,EAEJ,MAAM,QAAQ,OAAO,KAAK;AACxB,gBAAY,KAAK,MAAM,UAAU,MAAM,cAAc;AAErD,UAAM,KAAK,IAAI,UAAU,QAAuB,IAAI,EAAE,KAAK;AAG3D,QAAI,YAAY,MAAM;AAAA,MACpB;AAAA,MACA;AAAA,MACA,EAAE,gBAAgB,MAAM,gBAAgB,UAAU,MAAM,SAAS;AAAA,MACjE,CAAC;AAAA,MACD,EAAE,UAAU,MAAM,UAAU,gBAAgB,MAAM,eAAe;AAAA,IACnE;AAEA,QAAI,WAAW;AAEb,gBAAU,YAAY,MAAM;AAC5B,gBAAU,WAAW,MAAM;AAE3B,UAAI,MAAM,YAAY,MAAM,aAAa,iBAAiB;AACxD,kBAAU,WAAW,MAAM;AAAA,MAC7B;AACA,gBAAU,UAAU,MAAM,WAAW;AAAA,IACvC,OAAO;AAEL,kBAAY,GAAG,OAAO,WAAW;AAAA,QAC/B,gBAAgB,MAAM;AAAA,QACtB,UAAU,MAAM;AAAA,QAChB,WAAW,MAAM;AAAA,QACjB,UAAU,MAAM;AAAA,QAChB,UAAU,MAAM;AAAA,QAChB,SAAS,MAAM,WAAW;AAAA,MAC5B,CAAC;AAAA,IACH;AAEA,UAAM,GAAG,MAAM;AAEf,WAAO,EAAE,IAAI,UAAU,GAAG;AAAA,EAC5B;AACF;AAKA,MAAM,kBAAsG;AAAA,EAC1G,IAAI;AAAA,EAEJ,MAAM,QAAQ,OAAO,KAAK;AACxB,gBAAY,KAAK,MAAM,UAAU,MAAM,cAAc;AAErD,UAAM,KAAK,IAAI,UAAU,QAAuB,IAAI,EAAE,KAAK;AAE3D,UAAM,YAAY,MAAM;AAAA,MACtB;AAAA,MACA;AAAA,MACA,EAAE,gBAAgB,MAAM,gBAAgB,UAAU,MAAM,SAAS;AAAA,MACjE,CAAC;AAAA,MACD,EAAE,UAAU,MAAM,UAAU,gBAAgB,MAAM,eAAe;AAAA,IACnE;AAEA,QAAI,WAAW;AACb,SAAG,OAAO,SAAS;AACnB,YAAM,GAAG,MAAM;AAAA,IACjB;AAEA,WAAO,EAAE,SAAS,KAAK;AAAA,EACzB;AACF;AAEA,gBAAgB,eAAe;AAC/B,gBAAgB,eAAe;",
6
+ "names": []
7
+ }
@@ -0,0 +1,65 @@
1
+ import { registerCommand } from "@open-mercato/shared/lib/commands";
2
+ import { findOneWithDecryption } from "@open-mercato/shared/lib/encryption/find";
3
+ import { CarrierConfig } from "../data/entities.js";
4
+ function ensureScope(ctx, tenantId, organizationId) {
5
+ if (ctx.auth?.tenantId && ctx.auth.tenantId !== tenantId) {
6
+ throw new Error("Tenant mismatch");
7
+ }
8
+ if (!ctx.auth?.isSuperAdmin && ctx.auth?.organizationId && ctx.auth.organizationId !== organizationId) {
9
+ throw new Error("Organization mismatch");
10
+ }
11
+ }
12
+ const createCarrierConfig = {
13
+ id: "shipment_tracking.carrier_config.create",
14
+ async execute(input, ctx) {
15
+ ensureScope(ctx, input.tenantId, input.organizationId);
16
+ const em = ctx.container.resolve("em").fork();
17
+ const carrierConfig = em.create(CarrierConfig, {
18
+ organizationId: input.organizationId,
19
+ tenantId: input.tenantId,
20
+ carrierCode: input.carrierCode,
21
+ apiEndpoint: input.apiEndpoint ?? null,
22
+ authConfig: input.authConfig ?? null,
23
+ rateLimitRequests: input.rateLimitRequests ?? 60,
24
+ rateLimitWindowSeconds: input.rateLimitWindowSeconds ?? 60,
25
+ isActive: input.isActive ?? true
26
+ });
27
+ await em.flush();
28
+ return { id: carrierConfig.id };
29
+ }
30
+ };
31
+ const updateCarrierConfig = {
32
+ id: "shipment_tracking.carrier_config.update",
33
+ async execute(input, ctx) {
34
+ const em = ctx.container.resolve("em").fork();
35
+ const carrierConfig = await findOneWithDecryption(em, CarrierConfig, { id: input.id, deletedAt: null });
36
+ if (!carrierConfig) throw new Error("Carrier config not found");
37
+ ensureScope(ctx, carrierConfig.tenantId, carrierConfig.organizationId);
38
+ if (input.apiEndpoint !== void 0) carrierConfig.apiEndpoint = input.apiEndpoint;
39
+ if (input.authConfig !== void 0) carrierConfig.authConfig = input.authConfig;
40
+ if (input.rateLimitRequests !== void 0) carrierConfig.rateLimitRequests = input.rateLimitRequests;
41
+ if (input.rateLimitWindowSeconds !== void 0) carrierConfig.rateLimitWindowSeconds = input.rateLimitWindowSeconds;
42
+ if (input.isActive !== void 0) carrierConfig.isActive = input.isActive;
43
+ await em.flush();
44
+ return { id: carrierConfig.id };
45
+ }
46
+ };
47
+ const deleteCarrierConfig = {
48
+ id: "shipment_tracking.carrier_config.delete",
49
+ async execute(input, ctx) {
50
+ const em = ctx.container.resolve("em").fork();
51
+ const carrierConfig = await findOneWithDecryption(em, CarrierConfig, {
52
+ id: input.id,
53
+ deletedAt: null
54
+ });
55
+ if (!carrierConfig) throw new Error("Carrier config not found");
56
+ ensureScope(ctx, carrierConfig.tenantId, carrierConfig.organizationId);
57
+ carrierConfig.deletedAt = /* @__PURE__ */ new Date();
58
+ await em.flush();
59
+ return { id: carrierConfig.id };
60
+ }
61
+ };
62
+ registerCommand(createCarrierConfig);
63
+ registerCommand(updateCarrierConfig);
64
+ registerCommand(deleteCarrierConfig);
65
+ //# sourceMappingURL=carrier-configs.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/shipment_tracking/commands/carrier-configs.ts"],
4
+ "sourcesContent": ["import { registerCommand } from '@open-mercato/shared/lib/commands'\nimport type { CommandHandler, CommandRuntimeContext } from '@open-mercato/shared/lib/commands'\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport { findOneWithDecryption } from '@open-mercato/shared/lib/encryption/find'\nimport { CarrierConfig } from '../data/entities'\nimport type { CarrierConfigCreateInput, CarrierConfigUpdateInput } from '../data/validators'\n\nfunction ensureScope(ctx: CommandRuntimeContext, tenantId: string, organizationId: string) {\n if (ctx.auth?.tenantId && ctx.auth.tenantId !== tenantId) {\n throw new Error('Tenant mismatch')\n }\n if (!ctx.auth?.isSuperAdmin && ctx.auth?.organizationId && ctx.auth.organizationId !== organizationId) {\n throw new Error('Organization mismatch')\n }\n}\n\nconst createCarrierConfig: CommandHandler<CarrierConfigCreateInput, { id: string }> = {\n id: 'shipment_tracking.carrier_config.create',\n\n async execute(input, ctx) {\n ensureScope(ctx, input.tenantId, input.organizationId)\n\n const em = ctx.container.resolve<EntityManager>('em').fork()\n\n const carrierConfig = em.create(CarrierConfig, {\n organizationId: input.organizationId,\n tenantId: input.tenantId,\n carrierCode: input.carrierCode,\n apiEndpoint: input.apiEndpoint ?? null,\n authConfig: input.authConfig ?? null,\n rateLimitRequests: input.rateLimitRequests ?? 60,\n rateLimitWindowSeconds: input.rateLimitWindowSeconds ?? 60,\n isActive: input.isActive ?? true,\n })\n\n await em.flush()\n\n return { id: carrierConfig.id }\n },\n}\n\nconst updateCarrierConfig: CommandHandler<CarrierConfigUpdateInput, { id: string }> = {\n id: 'shipment_tracking.carrier_config.update',\n\n async execute(input, ctx) {\n const em = ctx.container.resolve<EntityManager>('em').fork()\n\n const carrierConfig = await findOneWithDecryption(em, CarrierConfig, { id: input.id, deletedAt: null })\n if (!carrierConfig) throw new Error('Carrier config not found')\n\n ensureScope(ctx, carrierConfig.tenantId, carrierConfig.organizationId)\n\n if (input.apiEndpoint !== undefined) carrierConfig.apiEndpoint = input.apiEndpoint\n if (input.authConfig !== undefined) carrierConfig.authConfig = input.authConfig\n if (input.rateLimitRequests !== undefined) carrierConfig.rateLimitRequests = input.rateLimitRequests\n if (input.rateLimitWindowSeconds !== undefined) carrierConfig.rateLimitWindowSeconds = input.rateLimitWindowSeconds\n if (input.isActive !== undefined) carrierConfig.isActive = input.isActive\n\n await em.flush()\n\n return { id: carrierConfig.id }\n },\n}\n\nconst deleteCarrierConfig: CommandHandler<{ id: string; tenantId: string; organizationId: string }, { id: string }> = {\n id: 'shipment_tracking.carrier_config.delete',\n\n async execute(input, ctx) {\n const em = ctx.container.resolve<EntityManager>('em').fork()\n\n // Fetch first, then validate scope (same pattern as update)\n const carrierConfig = await findOneWithDecryption(em, CarrierConfig, {\n id: input.id,\n deletedAt: null,\n })\n if (!carrierConfig) throw new Error('Carrier config not found')\n\n ensureScope(ctx, carrierConfig.tenantId, carrierConfig.organizationId)\n\n carrierConfig.deletedAt = new Date()\n await em.flush()\n\n return { id: carrierConfig.id }\n },\n}\n\nregisterCommand(createCarrierConfig)\nregisterCommand(updateCarrierConfig)\nregisterCommand(deleteCarrierConfig)\n"],
5
+ "mappings": "AAAA,SAAS,uBAAuB;AAGhC,SAAS,6BAA6B;AACtC,SAAS,qBAAqB;AAG9B,SAAS,YAAY,KAA4B,UAAkB,gBAAwB;AACzF,MAAI,IAAI,MAAM,YAAY,IAAI,KAAK,aAAa,UAAU;AACxD,UAAM,IAAI,MAAM,iBAAiB;AAAA,EACnC;AACA,MAAI,CAAC,IAAI,MAAM,gBAAgB,IAAI,MAAM,kBAAkB,IAAI,KAAK,mBAAmB,gBAAgB;AACrG,UAAM,IAAI,MAAM,uBAAuB;AAAA,EACzC;AACF;AAEA,MAAM,sBAAgF;AAAA,EACpF,IAAI;AAAA,EAEJ,MAAM,QAAQ,OAAO,KAAK;AACxB,gBAAY,KAAK,MAAM,UAAU,MAAM,cAAc;AAErD,UAAM,KAAK,IAAI,UAAU,QAAuB,IAAI,EAAE,KAAK;AAE3D,UAAM,gBAAgB,GAAG,OAAO,eAAe;AAAA,MAC7C,gBAAgB,MAAM;AAAA,MACtB,UAAU,MAAM;AAAA,MAChB,aAAa,MAAM;AAAA,MACnB,aAAa,MAAM,eAAe;AAAA,MAClC,YAAY,MAAM,cAAc;AAAA,MAChC,mBAAmB,MAAM,qBAAqB;AAAA,MAC9C,wBAAwB,MAAM,0BAA0B;AAAA,MACxD,UAAU,MAAM,YAAY;AAAA,IAC9B,CAAC;AAED,UAAM,GAAG,MAAM;AAEf,WAAO,EAAE,IAAI,cAAc,GAAG;AAAA,EAChC;AACF;AAEA,MAAM,sBAAgF;AAAA,EACpF,IAAI;AAAA,EAEJ,MAAM,QAAQ,OAAO,KAAK;AACxB,UAAM,KAAK,IAAI,UAAU,QAAuB,IAAI,EAAE,KAAK;AAE3D,UAAM,gBAAgB,MAAM,sBAAsB,IAAI,eAAe,EAAE,IAAI,MAAM,IAAI,WAAW,KAAK,CAAC;AACtG,QAAI,CAAC,cAAe,OAAM,IAAI,MAAM,0BAA0B;AAE9D,gBAAY,KAAK,cAAc,UAAU,cAAc,cAAc;AAErE,QAAI,MAAM,gBAAgB,OAAW,eAAc,cAAc,MAAM;AACvE,QAAI,MAAM,eAAe,OAAW,eAAc,aAAa,MAAM;AACrE,QAAI,MAAM,sBAAsB,OAAW,eAAc,oBAAoB,MAAM;AACnF,QAAI,MAAM,2BAA2B,OAAW,eAAc,yBAAyB,MAAM;AAC7F,QAAI,MAAM,aAAa,OAAW,eAAc,WAAW,MAAM;AAEjE,UAAM,GAAG,MAAM;AAEf,WAAO,EAAE,IAAI,cAAc,GAAG;AAAA,EAChC;AACF;AAEA,MAAM,sBAAgH;AAAA,EACpH,IAAI;AAAA,EAEJ,MAAM,QAAQ,OAAO,KAAK;AACxB,UAAM,KAAK,IAAI,UAAU,QAAuB,IAAI,EAAE,KAAK;AAG3D,UAAM,gBAAgB,MAAM,sBAAsB,IAAI,eAAe;AAAA,MACnE,IAAI,MAAM;AAAA,MACV,WAAW;AAAA,IACb,CAAC;AACD,QAAI,CAAC,cAAe,OAAM,IAAI,MAAM,0BAA0B;AAE9D,gBAAY,KAAK,cAAc,UAAU,cAAc,cAAc;AAErE,kBAAc,YAAY,oBAAI,KAAK;AACnC,UAAM,GAAG,MAAM;AAEf,WAAO,EAAE,IAAI,cAAc,GAAG;AAAA,EAChC;AACF;AAEA,gBAAgB,mBAAmB;AACnC,gBAAgB,mBAAmB;AACnC,gBAAgB,mBAAmB;",
6
+ "names": []
7
+ }
@@ -0,0 +1,9 @@
1
+ import "./shipments.js";
2
+ import "./tracking.js";
3
+ import "./tracking-jobs.js";
4
+ import "./webhooks.js";
5
+ import "./carrier-configs.js";
6
+ import "./bic-configs.js";
7
+ import "./shipsgo-configs.js";
8
+ import "./location-overrides.js";
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/shipment_tracking/commands/index.ts"],
4
+ "sourcesContent": ["import './shipments'\nimport './tracking'\nimport './tracking-jobs'\nimport './webhooks'\nimport './carrier-configs'\nimport './bic-configs'\nimport './shipsgo-configs'\nimport './location-overrides'\n"],
5
+ "mappings": "AAAA,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;",
6
+ "names": []
7
+ }
@@ -0,0 +1,93 @@
1
+ import { registerCommand } from "@open-mercato/shared/lib/commands";
2
+ import { findOneWithDecryption } from "@open-mercato/shared/lib/encryption/find";
3
+ import { LocationOverride } from "../data/entities.js";
4
+ function ensureScope(ctx, tenantId, organizationId) {
5
+ if (ctx.auth?.tenantId && ctx.auth.tenantId !== tenantId) {
6
+ throw new Error("Tenant mismatch");
7
+ }
8
+ if (!ctx.auth?.isSuperAdmin && ctx.auth?.organizationId && ctx.auth.organizationId !== organizationId) {
9
+ throw new Error("Organization mismatch");
10
+ }
11
+ }
12
+ const createLocationOverride = {
13
+ id: "shipment_tracking.location_override.create",
14
+ async execute(input, ctx) {
15
+ ensureScope(ctx, input.tenantId, input.organizationId);
16
+ const em = ctx.container.resolve("em").fork();
17
+ const override = em.create(LocationOverride, {
18
+ organizationId: input.organizationId,
19
+ tenantId: input.tenantId,
20
+ carrierCode: input.carrierCode?.toUpperCase() ?? null,
21
+ unlocode: input.unlocode.toUpperCase(),
22
+ facilityCode: input.facilityCode,
23
+ facilityCodeListProvider: input.facilityCodeListProvider,
24
+ overrideData: input.overrideData,
25
+ description: input.description ?? null,
26
+ isActive: input.isActive ?? true,
27
+ createdByUserId: ctx.auth?.userId ?? null,
28
+ updatedByUserId: ctx.auth?.userId ?? null
29
+ });
30
+ await em.flush();
31
+ return { id: override.id };
32
+ },
33
+ async undo({ input, ctx }) {
34
+ const em = ctx.container.resolve("em").fork();
35
+ const override = await findOneWithDecryption(em, LocationOverride, {
36
+ tenantId: input.tenantId,
37
+ organizationId: input.organizationId,
38
+ unlocode: input.unlocode,
39
+ facilityCode: input.facilityCode,
40
+ facilityCodeListProvider: input.facilityCodeListProvider,
41
+ carrierCode: input.carrierCode ?? null
42
+ });
43
+ if (override) {
44
+ em.remove(override);
45
+ await em.flush();
46
+ }
47
+ }
48
+ };
49
+ const updateLocationOverride = {
50
+ id: "shipment_tracking.location_override.update",
51
+ async execute(input, ctx) {
52
+ const em = ctx.container.resolve("em").fork();
53
+ const override = await findOneWithDecryption(em, LocationOverride, { id: input.id });
54
+ if (!override) throw new Error("Location override not found");
55
+ ensureScope(ctx, override.tenantId, override.organizationId);
56
+ if (input.carrierCode !== void 0) override.carrierCode = input.carrierCode?.toUpperCase() ?? null;
57
+ if (input.unlocode !== void 0) override.unlocode = input.unlocode.toUpperCase();
58
+ if (input.facilityCode !== void 0) override.facilityCode = input.facilityCode;
59
+ if (input.facilityCodeListProvider !== void 0) override.facilityCodeListProvider = input.facilityCodeListProvider;
60
+ if (input.overrideData !== void 0) override.overrideData = input.overrideData;
61
+ if (input.description !== void 0) override.description = input.description;
62
+ if (input.isActive !== void 0) override.isActive = input.isActive;
63
+ override.updatedByUserId = ctx.auth?.userId ?? null;
64
+ await em.flush();
65
+ return { id: override.id };
66
+ }
67
+ };
68
+ const deleteLocationOverride = {
69
+ id: "shipment_tracking.location_override.delete",
70
+ async execute(input, ctx) {
71
+ ensureScope(ctx, input.tenantId, input.organizationId);
72
+ const em = ctx.container.resolve("em").fork();
73
+ const override = await findOneWithDecryption(em, LocationOverride, { id: input.id });
74
+ if (!override) throw new Error("Location override not found");
75
+ override.deletedAt = /* @__PURE__ */ new Date();
76
+ override.updatedByUserId = ctx.auth?.userId ?? null;
77
+ await em.flush();
78
+ return { id: input.id };
79
+ },
80
+ async undo({ input, ctx }) {
81
+ const em = ctx.container.resolve("em").fork();
82
+ const override = await em.findOne(LocationOverride, { id: input.id });
83
+ if (override) {
84
+ override.deletedAt = null;
85
+ override.updatedByUserId = ctx.auth?.userId ?? null;
86
+ await em.flush();
87
+ }
88
+ }
89
+ };
90
+ registerCommand(createLocationOverride);
91
+ registerCommand(updateLocationOverride);
92
+ registerCommand(deleteLocationOverride);
93
+ //# sourceMappingURL=location-overrides.js.map