@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/data/validators.ts"],
4
+ "sourcesContent": ["import { z } from 'zod'\n\nconst uuid = () => z.string().uuid()\n\nconst scopedSchema = z.object({\n organizationId: uuid(),\n tenantId: uuid(),\n})\n\n// \u2500\u2500\u2500 Timestamp Schemas \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\nexport const timestampSourceSchema = z.enum(['carrier_api', 'manual', 'ais', 'port', 'edi'])\nexport type TimestampSourceInput = z.infer<typeof timestampSourceSchema>\n\nexport const shipmentTimestampEntrySchema = z.object({\n value: z.string().datetime({ message: 'Must be ISO 8601 datetime' }),\n offset: z.string().regex(/^[+-]\\d{2}:\\d{2}$|^Z$/, 'Must be timezone offset like +08:00 or Z').nullable(),\n source: timestampSourceSchema,\n updatedAt: z.string().datetime({ message: 'Must be ISO 8601 datetime' }),\n sourceEventId: z.string().nullable().optional(),\n})\nexport type ShipmentTimestampEntryInput = z.infer<typeof shipmentTimestampEntrySchema>\n\nexport const timestampEntryInputSchema = z.object({\n value: z.string().datetime({ message: 'Must be ISO 8601 datetime' }),\n offset: z.string().regex(/^[+-]\\d{2}:\\d{2}$|^Z$/, 'Must be timezone offset like +08:00 or Z').nullable().optional(),\n source: timestampSourceSchema,\n sourceEventId: z.string().nullable().optional(),\n})\nexport type TimestampEntryInput = z.infer<typeof timestampEntryInputSchema>\n\n// UN/LOCODE format: 2 uppercase letters (country) + 3 alphanumeric characters (location)\n// Example: PLGDY (Poland, Gdynia), CRMOB (Costa Rica, Mo\u00EDn), BEANR (Belgium, Antwerp)\nexport const unLocodeSchema = z.string()\n .trim()\n .toUpperCase()\n .length(5, 'UN/LOCODE must be exactly 5 characters')\n .regex(/^[A-Z]{2}[A-Z0-9]{3}$/, 'Invalid UN/LOCODE format (expected: 2 letters + 3 alphanumeric)')\n\n// Optional UN/LOCODE - will be auto-inferred from tracking events if not provided\nexport const optionalUnLocodeSchema = unLocodeSchema.optional()\n\n// \u2500\u2500\u2500 Enums \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\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport const shipmentStatusSchema = z.enum(['PENDING', 'BOOKED', 'DEPARTED', 'IN_TRANSIT', 'PRE_ARRIVAL', 'ARRIVED', 'DELIVERED'])\nexport type ShipmentStatus = z.infer<typeof shipmentStatusSchema>\n\nexport const trackingEventSourceSchema = z.enum(['dcsa', 'ais', 'port', 'edi', 'manual', 'shipsgo'])\nexport type TrackingEventSource = z.infer<typeof trackingEventSourceSchema>\n\nexport const trackingReferenceTypeSchema = z.enum(['container', 'booking', 'bol', 'awb'])\nexport type TrackingReferenceType = z.infer<typeof trackingReferenceTypeSchema>\n\nexport const trackingProviderSchema = z.enum(['carrier', 'shipsgo'])\nexport type TrackingProvider = z.infer<typeof trackingProviderSchema>\n\nexport const trackingModeSchema = z.enum(['ocean', 'air'])\nexport type TrackingMode = z.infer<typeof trackingModeSchema>\n\n// \u2500\u2500\u2500 Facility Location (JSONB) \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\nexport const facilityCodeListProviderSchema = z.enum(['BIC', 'SMDG'])\nexport type FacilityCodeListProvider = z.infer<typeof facilityCodeListProviderSchema>\n\nexport const facilityLocationSourceSchema = z.enum(['dcsa', 'bic', 'manual'])\nexport type FacilityLocationSource = z.infer<typeof facilityLocationSourceSchema>\n\nexport const coordsSchema = z.object({\n latitude: z.number(),\n longitude: z.number(),\n})\nexport type Coords = z.infer<typeof coordsSchema>\n\n/**\n * Rich location data for origin, destination, or transshipment points.\n * Combines port-level (UN/LOCODE) with facility-level (terminal) details.\n */\nexport const facilityLocationSchema = z.object({\n // Display name (terminal or port name)\n name: z.string(),\n\n // Port-level identifiers\n unlocode: z.string().nullable(), // UN/LOCODE (e.g., \"PLGDN\")\n countryCode: z.string().nullable(), // ISO 3166-1 alpha-2 (e.g., \"PL\")\n\n // Facility/terminal identifiers (separate fields)\n facilityCode: z.string().nullable(), // SMDG/BIC code (e.g., \"DCT\")\n facilityCodeListProvider: facilityCodeListProviderSchema.nullable(),\n facilityTypeCode: z.string().nullable(), // POTE (port terminal), DEPO (depot), etc.\n\n // Address (from DCSA otherFacility or BIC API)\n address: z.string().nullable(), // Full address string\n\n // Coordinates\n coords: coordsSchema.nullable(),\n\n // Operator (from BIC API enrichment only)\n operatorName: z.string().nullable(),\n\n // Source of the data\n source: facilityLocationSourceSchema,\n})\nexport type FacilityLocationInput = z.infer<typeof facilityLocationSchema>\n\n// \u2500\u2500\u2500 Route & Event Entries (JSONB) \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\nexport const routeStopEntrySchema = z.object({\n location: z.string(),\n unlocode: z.string().nullable().optional(),\n type: z.enum(['origin', 'transshipment', 'destination']),\n vesselName: z.string().nullable().optional(),\n ata: z.string().nullable().optional(), // Actual arrival\n atd: z.string().nullable().optional(), // Actual departure\n eta: z.string().nullable().optional(), // Estimated arrival (for delay calculation)\n etd: z.string().nullable().optional(), // Estimated departure (for delay calculation)\n // Facility/terminal details\n facilityCode: z.string().nullable().optional(),\n facilityCodeListProvider: facilityCodeListProviderSchema.nullable().optional(),\n facilityTypeCode: z.string().nullable().optional(),\n facilityAddress: z.string().nullable().optional(),\n coords: coordsSchema.nullable().optional(),\n})\nexport type RouteStopEntryInput = z.infer<typeof routeStopEntrySchema>\n\n// Seal information (from DCSA events)\nexport const sealInfoSchema = z.object({\n number: z.string(),\n source: z.string().nullable().optional(), // CAR, SHI, TER, CUS\n type: z.string().nullable().optional(),\n})\nexport type SealInfoInput = z.infer<typeof sealInfoSchema>\n\nexport const cargoEventEntrySchema = z.object({\n id: z.string(),\n eventType: z.string(),\n eventCode: z.string(),\n eventClassifierCode: z.enum(['ACT', 'PLN', 'EST']).nullable().optional(),\n eventDateTime: z.string(),\n description: z.string().nullable().optional(),\n locationName: z.string().nullable().optional(),\n locationUnlocode: z.string().nullable().optional(),\n vesselName: z.string().nullable().optional(),\n vesselImo: z.string().nullable().optional(),\n voyageNumber: z.string().nullable().optional(),\n isTransshipmentMove: z.boolean().nullable().optional(),\n // Facility/terminal details\n facilityCode: z.string().nullable().optional(),\n facilityCodeListProvider: facilityCodeListProviderSchema.nullable().optional(),\n facilityTypeCode: z.string().nullable().optional(),\n facilityAddress: z.string().nullable().optional(),\n latitude: z.number().nullable().optional(),\n longitude: z.number().nullable().optional(),\n // Seal information\n seals: z.array(sealInfoSchema).nullable().optional(),\n})\nexport type CargoEventEntryInput = z.infer<typeof cargoEventEntrySchema>\n\n// \u2500\u2500\u2500 Shipment \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\u2500\u2500\u2500\u2500\n\nexport const shipmentCreateSchema = scopedSchema.extend({\n // Optional: link to existing tracking job\n trackingJobId: uuid().optional(),\n carrierCode: z.string().trim().max(20).optional(),\n containerNumber: z.string().trim().max(50).optional(),\n bookingNumber: z.string().trim().max(100).optional(),\n bolNumber: z.string().trim().max(100).optional(),\n // Multi-source timestamps (JSONB arrays)\n etdTimestamps: z.array(shipmentTimestampEntrySchema).optional(),\n etaTimestamps: z.array(shipmentTimestampEntrySchema).optional(),\n atdTimestamps: z.array(shipmentTimestampEntrySchema).optional(),\n ataTimestamps: z.array(shipmentTimestampEntrySchema).optional(),\n // Location data (JSONB)\n originLocation: facilityLocationSchema.optional(),\n destinationLocation: facilityLocationSchema.optional(),\n vesselName: z.string().trim().max(200).optional(),\n vesselImo: z.string().trim().max(20).optional(),\n voyageNumber: z.string().trim().max(50).optional(),\n extra: z.record(z.string(), z.unknown()).optional(),\n})\n\nexport const shipmentUpdateSchema = z.object({\n id: uuid(),\n}).merge(\n scopedSchema.extend({\n trackingJobId: uuid().optional().nullable(),\n carrierCode: z.string().trim().max(20).optional().nullable(),\n containerNumber: z.string().trim().max(50).optional().nullable(),\n bookingNumber: z.string().trim().max(100).optional().nullable(),\n bolNumber: z.string().trim().max(100).optional().nullable(),\n status: shipmentStatusSchema.optional(),\n // Multi-source timestamps - can replace entire arrays or add entries\n etdTimestamps: z.array(shipmentTimestampEntrySchema).optional().nullable(),\n etaTimestamps: z.array(shipmentTimestampEntrySchema).optional().nullable(),\n atdTimestamps: z.array(shipmentTimestampEntrySchema).optional().nullable(),\n ataTimestamps: z.array(shipmentTimestampEntrySchema).optional().nullable(),\n // Add single timestamp entries (convenience for manual updates)\n addEtdTimestamp: timestampEntryInputSchema.optional(),\n addEtaTimestamp: timestampEntryInputSchema.optional(),\n addAtdTimestamp: timestampEntryInputSchema.optional(),\n addAtaTimestamp: timestampEntryInputSchema.optional(),\n // Location data (JSONB)\n originLocation: facilityLocationSchema.optional().nullable(),\n destinationLocation: facilityLocationSchema.optional().nullable(),\n vesselName: z.string().trim().max(200).optional().nullable(),\n vesselImo: z.string().trim().max(20).optional().nullable(),\n voyageNumber: z.string().trim().max(50).optional().nullable(),\n extra: z.record(z.string(), z.unknown()).optional().nullable(),\n }).partial(),\n)\n\nexport const shipmentListSchema = z.object({\n id: z.string().uuid().optional(),\n page: z.coerce.number().min(1).default(1),\n pageSize: z.coerce.number().min(1).max(100).default(50),\n search: z.string().optional(),\n status: z.string().optional(),\n carrierCode: z.string().optional(),\n sortField: z.string().optional(),\n sortDir: z.enum(['asc', 'desc']).optional(),\n}).passthrough()\n\nexport type ShipmentCreateInput = z.infer<typeof shipmentCreateSchema>\nexport type ShipmentUpdateInput = z.infer<typeof shipmentUpdateSchema>\n\n// \u2500\u2500\u2500 TrackingJob \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\u2500\n\nexport const trackingJobCreateSchema = scopedSchema.extend({\n carrierCode: z.string().trim().min(1).max(50),\n referenceType: trackingReferenceTypeSchema,\n referenceValue: z.string().trim().min(1).max(100),\n // Origin/destination are optional - will be auto-inferred from tracking events if not provided\n originUnlocode: optionalUnLocodeSchema,\n destinationUnlocode: optionalUnLocodeSchema,\n schedule: z.array(z.string()).optional(),\n})\n\nexport const trackingJobUpdateSchema = z.object({\n id: uuid(),\n}).merge(\n scopedSchema.extend({\n status: z.enum(['active', 'paused', 'deactivated', 'failed', 'completed']).optional(),\n schedule: z.array(z.string()).optional().nullable(),\n nextPollAt: z.coerce.date().optional().nullable(),\n }).partial(),\n)\n\nexport const trackingJobListSchema = z.object({\n page: z.coerce.number().min(1).default(1),\n pageSize: z.coerce.number().min(1).max(100).default(50),\n status: z.string().optional(),\n carrierCode: z.string().optional(),\n referenceType: z.string().optional(),\n referenceValue: z.string().optional(),\n sortField: z.string().optional(),\n sortDir: z.enum(['asc', 'desc']).optional(),\n}).passthrough()\n\nexport type TrackingJobCreateInput = z.infer<typeof trackingJobCreateSchema>\nexport type TrackingJobUpdateInput = z.infer<typeof trackingJobUpdateSchema>\n\n// \u2500\u2500\u2500 TrackingEvent \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\nexport const trackingEventListSchema = z.object({\n page: z.coerce.number().min(1).default(1),\n pageSize: z.coerce.number().min(1).max(100).default(50),\n trackingJobId: uuid().optional(),\n equipmentReference: z.string().optional(),\n source: trackingEventSourceSchema.optional(),\n eventType: z.string().optional(),\n eventCode: z.string().optional(),\n sortField: z.string().optional(),\n sortDir: z.enum(['asc', 'desc']).optional(),\n}).passthrough()\n\n/** @deprecated Use trackingEventListSchema instead */\nexport const cargoEventListSchema = trackingEventListSchema\n\n// \u2500\u2500\u2500 CarrierConfig \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\nexport const carrierConfigCreateSchema = scopedSchema.extend({\n carrierCode: z.string().trim().min(1).max(50),\n apiEndpoint: z.string().trim().url().max(500).optional(),\n authConfig: z.record(z.string(), z.unknown()).optional(),\n rateLimitRequests: z.coerce.number().int().min(1).max(10000).default(60),\n rateLimitWindowSeconds: z.coerce.number().int().min(1).max(86400).default(60),\n isActive: z.boolean().default(true),\n})\n\nexport const carrierConfigUpdateSchema = z.object({\n id: uuid(),\n}).merge(\n scopedSchema.extend({\n apiEndpoint: z.string().trim().url().max(500).optional().nullable(),\n authConfig: z.record(z.string(), z.unknown()).optional().nullable(),\n rateLimitRequests: z.coerce.number().int().min(1).max(10000).optional(),\n rateLimitWindowSeconds: z.coerce.number().int().min(1).max(86400).optional(),\n isActive: z.boolean().optional(),\n }).partial(),\n)\n\nexport const carrierConfigListSchema = z.object({\n page: z.coerce.number().min(1).default(1),\n pageSize: z.coerce.number().min(1).max(100).default(50),\n carrierCode: z.string().optional(),\n isActive: z.string().optional(),\n sortField: z.string().optional(),\n sortDir: z.enum(['asc', 'desc']).optional(),\n}).passthrough()\n\nexport type CarrierConfigCreateInput = z.infer<typeof carrierConfigCreateSchema>\nexport type CarrierConfigUpdateInput = z.infer<typeof carrierConfigUpdateSchema>\n\n// \u2500\u2500\u2500 BicConfig \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\u2500\u2500\u2500\n\nexport const bicConfigUpsertSchema = scopedSchema.extend({\n isEnabled: z.boolean().default(false),\n username: z.string().trim().min(1, 'Username is required').max(200),\n password: z.string().trim().min(1, 'Password is required').max(500),\n baseUrl: z.string().trim().url().max(500).default('https://api.bic-code.org'),\n})\n\nexport const bicConfigResponseSchema = z.object({\n id: uuid(),\n organizationId: uuid(),\n tenantId: uuid(),\n isEnabled: z.boolean(),\n username: z.string(),\n // Password is NOT included in response for security\n baseUrl: z.string(),\n createdAt: z.string(),\n updatedAt: z.string(),\n})\n\nexport const bicConfigTestSchema = scopedSchema.extend({\n username: z.string().trim().min(1),\n password: z.string().trim().min(1),\n baseUrl: z.string().trim().url().default('https://api.bic-code.org'),\n})\n\nexport type BicConfigUpsertInput = z.infer<typeof bicConfigUpsertSchema>\nexport type BicConfigResponse = z.infer<typeof bicConfigResponseSchema>\nexport type BicConfigTestInput = z.infer<typeof bicConfigTestSchema>\n\n// \u2500\u2500\u2500 ShipsGoConfig \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// One row per organization/tenant. Upsert semantics (like BicConfig). The API\n// token is write-only in responses; on update the sentinel '__UNCHANGED__'\n// leaves the stored token intact.\n\nexport const shipsGoConfigUpsertSchema = scopedSchema.extend({\n isEnabled: z.boolean().default(false),\n apiToken: z.string().trim().min(1, 'API token is required').max(500),\n baseUrl: z.string().trim().url().max(500).default('https://api.shipsgo.com/v2'),\n oceanEnabled: z.boolean().default(true),\n airEnabled: z.boolean().default(true),\n rateLimitRequests: z.coerce.number().int().min(1).max(10000).default(60),\n rateLimitWindowSeconds: z.coerce.number().int().min(1).max(86400).default(60),\n})\n\nexport const shipsGoConfigResponseSchema = z.object({\n id: uuid(),\n organizationId: uuid(),\n tenantId: uuid(),\n isEnabled: z.boolean(),\n // apiToken is NOT included in responses for security\n baseUrl: z.string(),\n oceanEnabled: z.boolean(),\n airEnabled: z.boolean(),\n rateLimitRequests: z.number(),\n rateLimitWindowSeconds: z.number(),\n createdAt: z.string(),\n updatedAt: z.string(),\n})\n\nexport type ShipsGoConfigUpsertInput = z.infer<typeof shipsGoConfigUpsertSchema>\nexport type ShipsGoConfigResponse = z.infer<typeof shipsGoConfigResponseSchema>\n\n// \u2500\u2500\u2500 Webhook \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\u2500\u2500\u2500\u2500\u2500\n\nexport const webhookCreateSchema = scopedSchema.extend({\n url: z.string().trim().url().max(500),\n eventsSubscribed: z.array(z.string().trim().min(1)).min(1),\n hmacSecret: z.string().trim().max(256).optional(),\n isActive: z.boolean().default(true),\n})\n\nexport const webhookUpdateSchema = z.object({\n id: uuid(),\n}).merge(\n scopedSchema.extend({\n url: z.string().trim().url().max(500).optional(),\n eventsSubscribed: z.array(z.string().trim().min(1)).min(1).optional(),\n hmacSecret: z.string().trim().max(256).optional().nullable(),\n isActive: z.boolean().optional(),\n }).partial(),\n)\n\nexport const webhookListSchema = z.object({\n id: z.string().uuid().optional(),\n page: z.coerce.number().min(1).default(1),\n pageSize: z.coerce.number().min(1).max(100).default(50),\n isActive: z.string().optional(),\n sortField: z.string().optional(),\n sortDir: z.enum(['asc', 'desc']).optional(),\n}).passthrough()\n\nexport type WebhookCreateInput = z.infer<typeof webhookCreateSchema>\nexport type WebhookUpdateInput = z.infer<typeof webhookUpdateSchema>\n\n// \u2500\u2500\u2500 WebhookDelivery \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\nexport const webhookDeliveryListSchema = z.object({\n page: z.coerce.number().min(1).default(1),\n pageSize: z.coerce.number().min(1).max(100).default(50),\n webhookId: uuid().optional(),\n status: z.string().optional(),\n eventType: z.string().optional(),\n sortField: z.string().optional(),\n sortDir: z.enum(['asc', 'desc']).optional(),\n}).passthrough()\n\n// \u2500\u2500\u2500 LocationOverride \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\nexport const locationOverrideDataSchema = z.object({\n name: z.string().trim().min(1, 'Name is required').max(200),\n address: z.string().trim().max(500).nullable().optional(),\n operatorName: z.string().trim().max(200).nullable().optional(),\n countryCode: z.string().trim().length(2, 'Country code must be 2 characters').toUpperCase().nullable().optional(),\n facilityTypeCode: z.string().trim().max(20).nullable().optional(),\n coords: coordsSchema.nullable().optional(),\n})\nexport type LocationOverrideData = z.infer<typeof locationOverrideDataSchema>\n\nexport const locationOverrideCreateSchema = scopedSchema.extend({\n carrierCode: z.string().trim().max(20).nullable().optional(),\n unlocode: unLocodeSchema,\n facilityCode: z.string().trim().min(1, 'Facility code is required').max(50),\n facilityCodeListProvider: facilityCodeListProviderSchema,\n overrideData: locationOverrideDataSchema,\n description: z.string().trim().max(500).nullable().optional(),\n isActive: z.boolean().default(true),\n})\n\nexport const locationOverrideUpdateSchema = z.object({\n id: uuid(),\n}).merge(\n scopedSchema.extend({\n carrierCode: z.string().trim().max(20).nullable().optional(),\n unlocode: unLocodeSchema.optional(),\n facilityCode: z.string().trim().min(1).max(50).optional(),\n facilityCodeListProvider: facilityCodeListProviderSchema.optional(),\n overrideData: locationOverrideDataSchema.optional(),\n description: z.string().trim().max(500).nullable().optional(),\n isActive: z.boolean().optional(),\n }).partial(),\n)\n\nexport const locationOverrideListSchema = z.object({\n page: z.coerce.number().min(1).default(1),\n pageSize: z.coerce.number().min(1).max(100).default(50),\n carrierCode: z.string().optional(),\n unlocode: z.string().optional(),\n facilityCode: z.string().optional(),\n isActive: z.string().optional(),\n search: z.string().optional(),\n sortField: z.string().optional(),\n sortDir: z.enum(['asc', 'desc']).optional(),\n}).passthrough()\n\nexport type LocationOverrideCreateInput = z.infer<typeof locationOverrideCreateSchema>\nexport type LocationOverrideUpdateInput = z.infer<typeof locationOverrideUpdateSchema>\n\n// \u2500\u2500\u2500 Ships Map Dashboard Widget \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/** Optional scope filter for the ships-map aggregation route. */\nexport const shipsMapQuerySchema = z.object({\n scope: z.enum(['in_transit', 'at_port', 'all']).optional().default('all'),\n})\nexport type ShipsMapQueryInput = z.infer<typeof shipsMapQuerySchema>\n\n/** A single shipment grouped under a map marker. */\nexport const shipsMapShipmentSchema = z.object({\n id: z.string(),\n containerNumber: z.string().nullable(),\n status: z.string(),\n eta: z.string().nullable(),\n destinationLocation: z.string().nullable(),\n})\n\n/**\n * Map marker discriminated by `kind`:\n * - `vessel`: a live AIS position for a vessel actually carrying in-transit cargo.\n * - `port`: a port where at-rest cargo is waiting (the planned onward vessel's AIS is unrelated).\n */\nexport const shipsMapMarkerSchema = z.discriminatedUnion('kind', [\n z.object({\n kind: z.literal('vessel'),\n imo: z.string(),\n name: z.string().nullable(),\n position: z.object({ lat: z.number(), lng: z.number() }),\n heading: z.number().nullable(),\n destination: z.string().nullable(),\n updatedAt: z.string().nullable(),\n shipments: z.array(shipsMapShipmentSchema),\n }),\n z.object({\n kind: z.literal('port'),\n portName: z.string().nullable(),\n unlocode: z.string().nullable(),\n position: z.object({ lat: z.number(), lng: z.number() }),\n shipments: z.array(shipsMapShipmentSchema),\n }),\n])\n\nexport const shipsMapResponseSchema = z.object({\n markers: z.array(shipsMapMarkerSchema),\n /** Active shipments with no plottable position (no IMO/coords, or a vessel-api miss). */\n unresolvedCount: z.number(),\n generatedAt: z.string(),\n})\n\nexport type ShipsMapShipment = z.infer<typeof shipsMapShipmentSchema>\nexport type ShipsMapMarker = z.infer<typeof shipsMapMarkerSchema>\nexport type ShipsMapResponse = z.infer<typeof shipsMapResponseSchema>\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,60 @@
1
+ import { asClass } from "awilix";
2
+ import { CarrierRegistryService } from "./services/carrierRegistry.js";
3
+ import { TrackingService } from "./services/trackingService.js";
4
+ import { ShipsGoProvider } from "./services/shipsGoProvider.js";
5
+ import { WebhookService } from "./services/webhookService.js";
6
+ import { PoiNatsService } from "./services/poiNatsService.js";
7
+ import { registerAllAdapters } from "./lib/adapters/index.js";
8
+ function register(container) {
9
+ container.register({
10
+ shipmentTrackingCarrierRegistry: asClass(CarrierRegistryService).singleton()
11
+ });
12
+ container.register({
13
+ shipmentTrackingWebhookService: {
14
+ resolve: () => new WebhookService({
15
+ em: () => container.resolve("em"),
16
+ eventBus: container.resolve("eventBus")
17
+ })
18
+ }
19
+ });
20
+ container.register({
21
+ shipmentTrackingShipsGoProvider: {
22
+ resolve: () => new ShipsGoProvider({
23
+ em: () => container.resolve("em")
24
+ })
25
+ }
26
+ });
27
+ container.register({
28
+ shipmentTrackingService: {
29
+ resolve: () => {
30
+ const cache = container.resolve("cache");
31
+ return new TrackingService({
32
+ em: () => container.resolve("em"),
33
+ eventBus: container.resolve("eventBus"),
34
+ carrierRegistry: container.resolve("shipmentTrackingCarrierRegistry"),
35
+ shipsGoProvider: container.resolve("shipmentTrackingShipsGoProvider"),
36
+ webhookService: container.resolve("shipmentTrackingWebhookService"),
37
+ cacheService: {
38
+ get: (key) => cache.get(key),
39
+ set: (key, value, ttlSeconds) => cache.set(key, value, ttlSeconds ? { ttl: ttlSeconds * 1e3 } : void 0)
40
+ }
41
+ });
42
+ }
43
+ }
44
+ });
45
+ container.register({
46
+ poiNatsService: {
47
+ resolve: () => new PoiNatsService({
48
+ em: () => container.resolve("em"),
49
+ eventBus: container.resolve("eventBus"),
50
+ trackingService: container.resolve("shipmentTrackingService")
51
+ })
52
+ }
53
+ });
54
+ const registry = container.resolve("shipmentTrackingCarrierRegistry");
55
+ registerAllAdapters(registry);
56
+ }
57
+ export {
58
+ register
59
+ };
60
+ //# sourceMappingURL=di.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/modules/shipment_tracking/di.ts"],
4
+ "sourcesContent": ["import { asClass } from 'awilix'\nimport type { AppContainer } from '@open-mercato/shared/lib/di/container'\nimport { CarrierRegistryService } from './services/carrierRegistry'\nimport { TrackingService } from './services/trackingService'\nimport { ShipsGoProvider } from './services/shipsGoProvider'\nimport { WebhookService } from './services/webhookService'\nimport { PoiNatsService } from './services/poiNatsService'\nimport { registerAllAdapters } from './lib/adapters'\n\nexport function register(container: AppContainer) {\n // Register carrier registry (singleton - adapters are registered once)\n container.register({\n shipmentTrackingCarrierRegistry: asClass(CarrierRegistryService).singleton(),\n })\n\n // Register webhook service first (no dependencies on other shipment-tracking services)\n container.register({\n shipmentTrackingWebhookService: {\n resolve: () =>\n new WebhookService({\n em: () => container.resolve('em'),\n eventBus: container.resolve('eventBus'),\n }),\n },\n })\n\n // Register ShipsGo aggregator provider (fallback tracking; no external deps)\n container.register({\n shipmentTrackingShipsGoProvider: {\n resolve: () =>\n new ShipsGoProvider({\n em: () => container.resolve('em'),\n }),\n },\n })\n\n // Register tracking service (depends on webhook service)\n container.register({\n shipmentTrackingService: {\n resolve: () => {\n const cache = container.resolve<any>('cache')\n return new TrackingService({\n em: () => container.resolve('em'),\n eventBus: container.resolve('eventBus'),\n carrierRegistry: container.resolve('shipmentTrackingCarrierRegistry'),\n shipsGoProvider: container.resolve('shipmentTrackingShipsGoProvider'),\n webhookService: container.resolve('shipmentTrackingWebhookService'),\n cacheService: {\n get: (key: string) => cache.get(key),\n set: (key: string, value: string, ttlSeconds?: number) =>\n cache.set(key, value, ttlSeconds ? { ttl: ttlSeconds * 1000 } : undefined),\n },\n })\n },\n },\n })\n\n // Register POI NATS subscriber service\n container.register({\n poiNatsService: {\n resolve: () =>\n new PoiNatsService({\n em: () => container.resolve('em'),\n eventBus: container.resolve('eventBus'),\n trackingService: container.resolve('shipmentTrackingService'),\n }),\n },\n })\n\n // Register all built-in carrier adapters\n const registry = container.resolve<CarrierRegistryService>('shipmentTrackingCarrierRegistry')\n registerAllAdapters(registry)\n}\n"],
5
+ "mappings": "AAAA,SAAS,eAAe;AAExB,SAAS,8BAA8B;AACvC,SAAS,uBAAuB;AAChC,SAAS,uBAAuB;AAChC,SAAS,sBAAsB;AAC/B,SAAS,sBAAsB;AAC/B,SAAS,2BAA2B;AAE7B,SAAS,SAAS,WAAyB;AAEhD,YAAU,SAAS;AAAA,IACjB,iCAAiC,QAAQ,sBAAsB,EAAE,UAAU;AAAA,EAC7E,CAAC;AAGD,YAAU,SAAS;AAAA,IACjB,gCAAgC;AAAA,MAC9B,SAAS,MACP,IAAI,eAAe;AAAA,QACjB,IAAI,MAAM,UAAU,QAAQ,IAAI;AAAA,QAChC,UAAU,UAAU,QAAQ,UAAU;AAAA,MACxC,CAAC;AAAA,IACL;AAAA,EACF,CAAC;AAGD,YAAU,SAAS;AAAA,IACjB,iCAAiC;AAAA,MAC/B,SAAS,MACP,IAAI,gBAAgB;AAAA,QAClB,IAAI,MAAM,UAAU,QAAQ,IAAI;AAAA,MAClC,CAAC;AAAA,IACL;AAAA,EACF,CAAC;AAGD,YAAU,SAAS;AAAA,IACjB,yBAAyB;AAAA,MACvB,SAAS,MAAM;AACb,cAAM,QAAQ,UAAU,QAAa,OAAO;AAC5C,eAAO,IAAI,gBAAgB;AAAA,UACzB,IAAI,MAAM,UAAU,QAAQ,IAAI;AAAA,UAChC,UAAU,UAAU,QAAQ,UAAU;AAAA,UACtC,iBAAiB,UAAU,QAAQ,iCAAiC;AAAA,UACpE,iBAAiB,UAAU,QAAQ,iCAAiC;AAAA,UACpE,gBAAgB,UAAU,QAAQ,gCAAgC;AAAA,UAClE,cAAc;AAAA,YACZ,KAAK,CAAC,QAAgB,MAAM,IAAI,GAAG;AAAA,YACnC,KAAK,CAAC,KAAa,OAAe,eAChC,MAAM,IAAI,KAAK,OAAO,aAAa,EAAE,KAAK,aAAa,IAAK,IAAI,MAAS;AAAA,UAC7E;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,CAAC;AAGD,YAAU,SAAS;AAAA,IACjB,gBAAgB;AAAA,MACd,SAAS,MACP,IAAI,eAAe;AAAA,QACjB,IAAI,MAAM,UAAU,QAAQ,IAAI;AAAA,QAChC,UAAU,UAAU,QAAQ,UAAU;AAAA,QACtC,iBAAiB,UAAU,QAAQ,yBAAyB;AAAA,MAC9D,CAAC;AAAA,IACL;AAAA,EACF,CAAC;AAGD,QAAM,WAAW,UAAU,QAAgC,iCAAiC;AAC5F,sBAAoB,QAAQ;AAC9B;",
6
+ "names": []
7
+ }
@@ -0,0 +1,12 @@
1
+ const defaultEncryptionMaps = [
2
+ {
3
+ entityId: "shipment_tracking:shipsgo_config",
4
+ fields: [{ field: "apiToken" }]
5
+ }
6
+ ];
7
+ var encryption_default = defaultEncryptionMaps;
8
+ export {
9
+ encryption_default as default,
10
+ defaultEncryptionMaps
11
+ };
12
+ //# sourceMappingURL=encryption.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/modules/shipment_tracking/encryption.ts"],
4
+ "sourcesContent": ["import type { ModuleEncryptionMap } from '@open-mercato/shared/modules/encryption'\n\n/**\n * Tenant-data-encryption declarations for the shipment_tracking module.\n *\n * `ShipsGoConfig.apiToken` holds the per-tenant ShipsGo API token and must be\n * encrypted at rest. Reads go through `findOneWithDecryption`; writes are\n * encrypted transparently by the ORM subscriber using this map.\n */\nexport const defaultEncryptionMaps: ModuleEncryptionMap[] = [\n {\n entityId: 'shipment_tracking:shipsgo_config',\n fields: [{ field: 'apiToken' }],\n },\n]\n\nexport default defaultEncryptionMaps\n"],
5
+ "mappings": "AASO,MAAM,wBAA+C;AAAA,EAC1D;AAAA,IACE,UAAU;AAAA,IACV,QAAQ,CAAC,EAAE,OAAO,WAAW,CAAC;AAAA,EAChC;AACF;AAEA,IAAO,qBAAQ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,87 @@
1
+ import { createModuleEvents } from "@open-mercato/shared/modules/events";
2
+ const events = [
3
+ // ─── Shipment CRUD ─────────────────────────────────────────────
4
+ // Emitted PER SHIPMENT (container) - booking with N containers = N events
5
+ { id: "shipment_tracking.shipment.created", label: "Shipment Created", entity: "shipment", category: "crud" },
6
+ { id: "shipment_tracking.shipment.updated", label: "Shipment Updated", entity: "shipment", category: "crud" },
7
+ { id: "shipment_tracking.shipment.deleted", label: "Shipment Deleted", entity: "shipment", category: "crud" },
8
+ // ─── Shipment Lifecycle ────────────────────────────────────────
9
+ // Emitted PER SHIPMENT (container) - booking with N containers = N events
10
+ { id: "shipment_tracking.shipment.status_changed", label: "Shipment Status Changed", entity: "shipment", category: "lifecycle" },
11
+ { id: "shipment_tracking.shipment.booked", label: "Shipment Booked", entity: "shipment", category: "lifecycle" },
12
+ { id: "shipment_tracking.shipment.pre_arrival", label: "Shipment Pre-Arrival", entity: "shipment", category: "lifecycle" },
13
+ { id: "shipment_tracking.shipment.delivered", label: "Shipment Delivered", entity: "shipment", category: "lifecycle" },
14
+ // ─── Transport Events (DCSA TRANSPORT) ─────────────────────────
15
+ // Emitted PER SHIPMENT when shipment ETA/ETD is updated
16
+ // Vessel/transport movement events per DCSA T&T standard
17
+ { id: "shipment_tracking.transport.departed", label: "Transport Departed", entity: "shipment", category: "lifecycle" },
18
+ { id: "shipment_tracking.transport.arrived", label: "Transport Arrived", entity: "shipment", category: "lifecycle" },
19
+ { id: "shipment_tracking.transport.eta_updated", label: "ETA Updated", entity: "shipment", category: "lifecycle" },
20
+ { id: "shipment_tracking.transport.etd_updated", label: "ETD Updated", entity: "shipment", category: "lifecycle" },
21
+ { id: "shipment_tracking.transport.omitted", label: "Port Omitted", entity: "shipment", category: "lifecycle" },
22
+ // ─── Equipment Events (DCSA EQUIPMENT) ─────────────────────────
23
+ // Emitted PER CONTAINER - tied to specific equipmentReference
24
+ // Container handling events per DCSA T&T standard
25
+ { id: "shipment_tracking.equipment.loaded", label: "Container Loaded", entity: "tracking_event", category: "lifecycle" },
26
+ { id: "shipment_tracking.equipment.discharged", label: "Container Discharged", entity: "tracking_event", category: "lifecycle" },
27
+ { id: "shipment_tracking.equipment.gate_in", label: "Container Gate In", entity: "tracking_event", category: "lifecycle" },
28
+ { id: "shipment_tracking.equipment.gate_out", label: "Container Gate Out", entity: "tracking_event", category: "lifecycle" },
29
+ { id: "shipment_tracking.equipment.available_pickup", label: "Available for Pickup", entity: "tracking_event", category: "lifecycle" },
30
+ { id: "shipment_tracking.equipment.customs_released", label: "Customs Released", entity: "tracking_event", category: "lifecycle" },
31
+ { id: "shipment_tracking.equipment.inspected", label: "Container Inspected", entity: "tracking_event", category: "lifecycle" },
32
+ // NOTE: air (mode='air') milestones are NOT separate events. The ShipsGo
33
+ // mapper translates air movements onto the DCSA departure/arrival/delivery
34
+ // codes, so an air shipment already emits the shared transport.*/shipment.*
35
+ // lifecycle events the notification system consumes. Dedicated air.* events
36
+ // would need their own emit path + subscribers and would double-fire; add
37
+ // them only when a consumer genuinely needs the RCS/MAN/RCF granularity.
38
+ // ─── Tracking Events (generic) ─────────────────────────────────
39
+ // Emitted PER RAW EVENT from carrier API (contains equipmentReference)
40
+ { id: "shipment_tracking.tracking_event.created", label: "Tracking Event Created", entity: "tracking_event", category: "crud" },
41
+ // ─── Internal Events (excluded from webhook triggers) ──────────
42
+ // Emitted PER TRACKING JOB (BOL/Booking) - once regardless of container count
43
+ // Tracking jobs - internal system events
44
+ { id: "shipment_tracking.tracking_job.created", label: "Tracking Job Created", entity: "tracking_job", category: "crud", excludeFromTriggers: true },
45
+ { id: "shipment_tracking.tracking_job.updated", label: "Tracking Job Updated", entity: "tracking_job", category: "crud", excludeFromTriggers: true },
46
+ { id: "shipment_tracking.tracking_job.failed", label: "Tracking Job Failed", entity: "tracking_job", category: "lifecycle", excludeFromTriggers: true },
47
+ { id: "shipment_tracking.tracking_job.completed", label: "Tracking Job Completed", entity: "tracking_job", category: "lifecycle", excludeFromTriggers: true },
48
+ // Webhook delivery - internal infrastructure events
49
+ { id: "shipment_tracking.webhook.delivery_success", label: "Webhook Delivery Success", entity: "webhook_delivery", category: "lifecycle", excludeFromTriggers: true },
50
+ { id: "shipment_tracking.webhook.delivery_failed", label: "Webhook Delivery Failed", entity: "webhook_delivery", category: "lifecycle", excludeFromTriggers: true },
51
+ // ─── Tracking Job Poll Events ──────────────────────────────────
52
+ // Emitted PER TRACKING JOB
53
+ { id: "shipment_tracking.tracking_job.poll_failed", label: "Tracking Job Poll Failed", entity: "tracking_job", category: "lifecycle", excludeFromTriggers: true },
54
+ // ─── Tracking Job POI Events (for notifications) ───────────────
55
+ // Emitted PER TRACKING JOB (BOL/Booking) - once regardless of container count
56
+ // Used for in-app notifications to avoid duplicates for multi-container bookings
57
+ { id: "shipment_tracking.tracking_job.poi.port_arrival", label: "Tracking Job - Port Arrival", entity: "tracking_job", category: "lifecycle" },
58
+ { id: "shipment_tracking.tracking_job.poi.port_proximity_arrival", label: "Tracking Job - Approaching Port", entity: "tracking_job", category: "lifecycle" },
59
+ { id: "shipment_tracking.tracking_job.poi.port_departure", label: "Tracking Job - Port Departure", entity: "tracking_job", category: "lifecycle" },
60
+ { id: "shipment_tracking.tracking_job.poi.terminal_arrival", label: "Tracking Job - Terminal Arrival", entity: "tracking_job", category: "lifecycle" },
61
+ { id: "shipment_tracking.tracking_job.poi.terminal_proximity_arrival", label: "Tracking Job - Approaching Terminal", entity: "tracking_job", category: "lifecycle" },
62
+ { id: "shipment_tracking.tracking_job.poi.terminal_departure", label: "Tracking Job - Terminal Departure", entity: "tracking_job", category: "lifecycle" },
63
+ { id: "shipment_tracking.tracking_job.poi.waypoint_reached", label: "Tracking Job - Waypoint Reached", entity: "tracking_job", category: "lifecycle" },
64
+ // ─── POI Proximity Events (AIS) ─────────────────────────────────
65
+ // Emitted PER SHIPMENT (container) - a vessel arrival triggers N events for N containers
66
+ // Real-time vessel position events from AIS POI detector
67
+ // NOTE: Notification subscribers should deduplicate by bookingNumber/bolNumber
68
+ { id: "shipment_tracking.poi.port_arrival", label: "Vessel Port Arrival (AIS)", entity: "tracking_event", category: "lifecycle" },
69
+ { id: "shipment_tracking.poi.port_proximity_arrival", label: "Vessel Approaching Port (AIS)", entity: "tracking_event", category: "lifecycle" },
70
+ { id: "shipment_tracking.poi.port_departure", label: "Vessel Port Departure (AIS)", entity: "tracking_event", category: "lifecycle" },
71
+ { id: "shipment_tracking.poi.terminal_arrival", label: "Vessel Terminal Arrival (AIS)", entity: "tracking_event", category: "lifecycle" },
72
+ { id: "shipment_tracking.poi.terminal_proximity_arrival", label: "Vessel Approaching Terminal (AIS)", entity: "tracking_event", category: "lifecycle" },
73
+ { id: "shipment_tracking.poi.terminal_departure", label: "Vessel Terminal Departure (AIS)", entity: "tracking_event", category: "lifecycle" },
74
+ { id: "shipment_tracking.poi.waypoint_reached", label: "Vessel Waypoint Reached (AIS)", entity: "tracking_event", category: "lifecycle" }
75
+ ];
76
+ const eventsConfig = createModuleEvents({
77
+ moduleId: "shipment_tracking",
78
+ events
79
+ });
80
+ const emitShipmentTrackingEvent = eventsConfig.emit;
81
+ var events_default = eventsConfig;
82
+ export {
83
+ events_default as default,
84
+ emitShipmentTrackingEvent,
85
+ eventsConfig
86
+ };
87
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/modules/shipment_tracking/events.ts"],
4
+ "sourcesContent": ["import { createModuleEvents } from '@open-mercato/shared/modules/events'\n\n/**\n * Shipment Tracking Module Events\n *\n * Event Emission Granularity:\n * \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\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 * PER SHIPMENT (Container):\n * - Shipment CRUD/Lifecycle events are emitted once per shipment entity.\n * - A booking with 5 containers will trigger 5 events.\n * - Includes: shipment.*, transport.*, equipment.*, poi.*\n *\n * PER TRACKING JOB (BOL/Booking):\n * - Tracking job events are emitted once per tracking job, regardless of\n * how many containers are in the booking.\n * - Includes: tracking_job.*\n *\n * PER TRACKING EVENT (Raw Event Record):\n * - tracking_event.created is emitted per raw event record from carriers.\n * - Contains equipmentReference for the specific container.\n *\n * NOTE: For notifications, POI events emit per-shipment which can cause\n * duplicate notifications for multi-container bookings. The notification\n * subscriber should deduplicate by bookingNumber/bolNumber.\n * \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\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\nconst events = [\n // \u2500\u2500\u2500 Shipment CRUD \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\u2500\n // Emitted PER SHIPMENT (container) - booking with N containers = N events\n { id: 'shipment_tracking.shipment.created', label: 'Shipment Created', entity: 'shipment', category: 'crud' },\n { id: 'shipment_tracking.shipment.updated', label: 'Shipment Updated', entity: 'shipment', category: 'crud' },\n { id: 'shipment_tracking.shipment.deleted', label: 'Shipment Deleted', entity: 'shipment', category: 'crud' },\n\n // \u2500\u2500\u2500 Shipment Lifecycle \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 // Emitted PER SHIPMENT (container) - booking with N containers = N events\n { id: 'shipment_tracking.shipment.status_changed', label: 'Shipment Status Changed', entity: 'shipment', category: 'lifecycle' },\n { id: 'shipment_tracking.shipment.booked', label: 'Shipment Booked', entity: 'shipment', category: 'lifecycle' },\n { id: 'shipment_tracking.shipment.pre_arrival', label: 'Shipment Pre-Arrival', entity: 'shipment', category: 'lifecycle' },\n { id: 'shipment_tracking.shipment.delivered', label: 'Shipment Delivered', entity: 'shipment', category: 'lifecycle' },\n\n // \u2500\u2500\u2500 Transport Events (DCSA TRANSPORT) \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 // Emitted PER SHIPMENT when shipment ETA/ETD is updated\n // Vessel/transport movement events per DCSA T&T standard\n { id: 'shipment_tracking.transport.departed', label: 'Transport Departed', entity: 'shipment', category: 'lifecycle' },\n { id: 'shipment_tracking.transport.arrived', label: 'Transport Arrived', entity: 'shipment', category: 'lifecycle' },\n { id: 'shipment_tracking.transport.eta_updated', label: 'ETA Updated', entity: 'shipment', category: 'lifecycle' },\n { id: 'shipment_tracking.transport.etd_updated', label: 'ETD Updated', entity: 'shipment', category: 'lifecycle' },\n { id: 'shipment_tracking.transport.omitted', label: 'Port Omitted', entity: 'shipment', category: 'lifecycle' },\n\n // \u2500\u2500\u2500 Equipment Events (DCSA EQUIPMENT) \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 // Emitted PER CONTAINER - tied to specific equipmentReference\n // Container handling events per DCSA T&T standard\n { id: 'shipment_tracking.equipment.loaded', label: 'Container Loaded', entity: 'tracking_event', category: 'lifecycle' },\n { id: 'shipment_tracking.equipment.discharged', label: 'Container Discharged', entity: 'tracking_event', category: 'lifecycle' },\n { id: 'shipment_tracking.equipment.gate_in', label: 'Container Gate In', entity: 'tracking_event', category: 'lifecycle' },\n { id: 'shipment_tracking.equipment.gate_out', label: 'Container Gate Out', entity: 'tracking_event', category: 'lifecycle' },\n { id: 'shipment_tracking.equipment.available_pickup', label: 'Available for Pickup', entity: 'tracking_event', category: 'lifecycle' },\n { id: 'shipment_tracking.equipment.customs_released', label: 'Customs Released', entity: 'tracking_event', category: 'lifecycle' },\n { id: 'shipment_tracking.equipment.inspected', label: 'Container Inspected', entity: 'tracking_event', category: 'lifecycle' },\n\n // NOTE: air (mode='air') milestones are NOT separate events. The ShipsGo\n // mapper translates air movements onto the DCSA departure/arrival/delivery\n // codes, so an air shipment already emits the shared transport.*/shipment.*\n // lifecycle events the notification system consumes. Dedicated air.* events\n // would need their own emit path + subscribers and would double-fire; add\n // them only when a consumer genuinely needs the RCS/MAN/RCF granularity.\n\n // \u2500\u2500\u2500 Tracking Events (generic) \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 // Emitted PER RAW EVENT from carrier API (contains equipmentReference)\n { id: 'shipment_tracking.tracking_event.created', label: 'Tracking Event Created', entity: 'tracking_event', category: 'crud' },\n\n // \u2500\u2500\u2500 Internal Events (excluded from webhook triggers) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Emitted PER TRACKING JOB (BOL/Booking) - once regardless of container count\n // Tracking jobs - internal system events\n { id: 'shipment_tracking.tracking_job.created', label: 'Tracking Job Created', entity: 'tracking_job', category: 'crud', excludeFromTriggers: true },\n { id: 'shipment_tracking.tracking_job.updated', label: 'Tracking Job Updated', entity: 'tracking_job', category: 'crud', excludeFromTriggers: true },\n { id: 'shipment_tracking.tracking_job.failed', label: 'Tracking Job Failed', entity: 'tracking_job', category: 'lifecycle', excludeFromTriggers: true },\n { id: 'shipment_tracking.tracking_job.completed', label: 'Tracking Job Completed', entity: 'tracking_job', category: 'lifecycle', excludeFromTriggers: true },\n\n // Webhook delivery - internal infrastructure events\n { id: 'shipment_tracking.webhook.delivery_success', label: 'Webhook Delivery Success', entity: 'webhook_delivery', category: 'lifecycle', excludeFromTriggers: true },\n { id: 'shipment_tracking.webhook.delivery_failed', label: 'Webhook Delivery Failed', entity: 'webhook_delivery', category: 'lifecycle', excludeFromTriggers: true },\n\n // \u2500\u2500\u2500 Tracking Job Poll Events \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 // Emitted PER TRACKING JOB\n { id: 'shipment_tracking.tracking_job.poll_failed', label: 'Tracking Job Poll Failed', entity: 'tracking_job', category: 'lifecycle', excludeFromTriggers: true },\n\n // \u2500\u2500\u2500 Tracking Job POI Events (for notifications) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Emitted PER TRACKING JOB (BOL/Booking) - once regardless of container count\n // Used for in-app notifications to avoid duplicates for multi-container bookings\n { id: 'shipment_tracking.tracking_job.poi.port_arrival', label: 'Tracking Job - Port Arrival', entity: 'tracking_job', category: 'lifecycle' },\n { id: 'shipment_tracking.tracking_job.poi.port_proximity_arrival', label: 'Tracking Job - Approaching Port', entity: 'tracking_job', category: 'lifecycle' },\n { id: 'shipment_tracking.tracking_job.poi.port_departure', label: 'Tracking Job - Port Departure', entity: 'tracking_job', category: 'lifecycle' },\n { id: 'shipment_tracking.tracking_job.poi.terminal_arrival', label: 'Tracking Job - Terminal Arrival', entity: 'tracking_job', category: 'lifecycle' },\n { id: 'shipment_tracking.tracking_job.poi.terminal_proximity_arrival', label: 'Tracking Job - Approaching Terminal', entity: 'tracking_job', category: 'lifecycle' },\n { id: 'shipment_tracking.tracking_job.poi.terminal_departure', label: 'Tracking Job - Terminal Departure', entity: 'tracking_job', category: 'lifecycle' },\n { id: 'shipment_tracking.tracking_job.poi.waypoint_reached', label: 'Tracking Job - Waypoint Reached', entity: 'tracking_job', category: 'lifecycle' },\n\n // \u2500\u2500\u2500 POI Proximity Events (AIS) \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 // Emitted PER SHIPMENT (container) - a vessel arrival triggers N events for N containers\n // Real-time vessel position events from AIS POI detector\n // NOTE: Notification subscribers should deduplicate by bookingNumber/bolNumber\n { id: 'shipment_tracking.poi.port_arrival', label: 'Vessel Port Arrival (AIS)', entity: 'tracking_event', category: 'lifecycle' },\n { id: 'shipment_tracking.poi.port_proximity_arrival', label: 'Vessel Approaching Port (AIS)', entity: 'tracking_event', category: 'lifecycle' },\n { id: 'shipment_tracking.poi.port_departure', label: 'Vessel Port Departure (AIS)', entity: 'tracking_event', category: 'lifecycle' },\n { id: 'shipment_tracking.poi.terminal_arrival', label: 'Vessel Terminal Arrival (AIS)', entity: 'tracking_event', category: 'lifecycle' },\n { id: 'shipment_tracking.poi.terminal_proximity_arrival', label: 'Vessel Approaching Terminal (AIS)', entity: 'tracking_event', category: 'lifecycle' },\n { id: 'shipment_tracking.poi.terminal_departure', label: 'Vessel Terminal Departure (AIS)', entity: 'tracking_event', category: 'lifecycle' },\n { id: 'shipment_tracking.poi.waypoint_reached', label: 'Vessel Waypoint Reached (AIS)', entity: 'tracking_event', category: 'lifecycle' },\n] as const\n\nexport const eventsConfig = createModuleEvents({\n moduleId: 'shipment_tracking',\n events,\n})\n\nexport const emitShipmentTrackingEvent = eventsConfig.emit\n\nexport type ShipmentTrackingEventId = typeof events[number]['id']\n\nexport default eventsConfig\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,137 @@
1
+ "use client";
2
+ import { useState, useEffect, useMemo } from "react";
3
+ import { useQuery } from "@tanstack/react-query";
4
+ import {
5
+ fetchVessel,
6
+ fetchVesselTrace,
7
+ fetchPois
8
+ } from "../lib/vessel-api.js";
9
+ function useVessel(vesselImo, options = {}) {
10
+ const { autoRefresh = true, refreshInterval = 3e4, enabled = true } = options;
11
+ return useQuery({
12
+ queryKey: ["vessel-info", vesselImo],
13
+ queryFn: () => fetchVessel(vesselImo),
14
+ enabled: enabled && !!vesselImo,
15
+ staleTime: refreshInterval,
16
+ refetchInterval: autoRefresh ? refreshInterval : false,
17
+ retry: 2
18
+ });
19
+ }
20
+ function useDebouncedBounds(delay = 500) {
21
+ const [bounds, setBounds] = useState(null);
22
+ const [debouncedBounds, setDebouncedBounds] = useState(null);
23
+ const [isDebouncing, setIsDebouncing] = useState(false);
24
+ useEffect(() => {
25
+ if (!bounds) {
26
+ setDebouncedBounds(null);
27
+ setIsDebouncing(false);
28
+ return;
29
+ }
30
+ setIsDebouncing(true);
31
+ const timer = setTimeout(() => {
32
+ setDebouncedBounds(bounds);
33
+ setIsDebouncing(false);
34
+ }, delay);
35
+ return () => {
36
+ clearTimeout(timer);
37
+ };
38
+ }, [bounds, delay]);
39
+ return { bounds, debouncedBounds, setBounds, isDebouncing };
40
+ }
41
+ function useVesselTrace(vesselImo, bounds, options = {}) {
42
+ const { limit = 2e3, staleTime = 6e4, enabled = true, from } = options;
43
+ const boundsKey = useMemo(() => {
44
+ if (!bounds) return null;
45
+ return `${bounds.north.toFixed(3)},${bounds.south.toFixed(3)},${bounds.east.toFixed(3)},${bounds.west.toFixed(3)}`;
46
+ }, [bounds]);
47
+ const timeRange = from ? { from } : void 0;
48
+ return useQuery({
49
+ queryKey: ["vessel-trace", vesselImo, boundsKey, limit, from],
50
+ queryFn: () => fetchVesselTrace(vesselImo, bounds ?? void 0, limit, timeRange),
51
+ enabled: enabled && !!vesselImo && !!bounds,
52
+ staleTime,
53
+ retry: 1
54
+ });
55
+ }
56
+ function usePois(bounds, options = {}) {
57
+ const { limit = 1e3, staleTime = 3e5, enabled = true } = options;
58
+ const boundsKey = useMemo(() => {
59
+ if (!bounds) return null;
60
+ return `${bounds.north.toFixed(2)},${bounds.south.toFixed(2)},${bounds.east.toFixed(2)},${bounds.west.toFixed(2)}`;
61
+ }, [bounds]);
62
+ return useQuery({
63
+ queryKey: ["pois", boundsKey, limit],
64
+ queryFn: async () => {
65
+ const results = await Promise.all(
66
+ ["PORT", "TERMINAL", "PORT_GEOMETRIC_CENTER"].map(
67
+ (type) => fetchPois(bounds ?? void 0, { type, limit })
68
+ )
69
+ );
70
+ const seen = /* @__PURE__ */ new Set();
71
+ return results.flat().filter((poi) => {
72
+ if (seen.has(poi.code)) return false;
73
+ seen.add(poi.code);
74
+ return true;
75
+ });
76
+ },
77
+ enabled: enabled && !!bounds,
78
+ staleTime,
79
+ retry: 1
80
+ });
81
+ }
82
+ function useVesselTracking(vesselImo, options = {}) {
83
+ const {
84
+ autoRefresh = true,
85
+ vesselRefreshInterval = 3e4,
86
+ traceLimit = 2e3,
87
+ boundsDebounceDelay = 500,
88
+ traceFrom,
89
+ enablePois = false,
90
+ poiLimit = 1e3
91
+ } = options;
92
+ const { bounds, debouncedBounds, setBounds, isDebouncing } = useDebouncedBounds(boundsDebounceDelay);
93
+ const {
94
+ data: vessel,
95
+ isLoading: isVesselLoading,
96
+ error: vesselError
97
+ } = useVessel(vesselImo, {
98
+ autoRefresh,
99
+ refreshInterval: vesselRefreshInterval
100
+ });
101
+ const {
102
+ data: trace,
103
+ isLoading: isTraceLoading,
104
+ error: traceError
105
+ } = useVesselTrace(vesselImo, debouncedBounds, {
106
+ limit: traceLimit,
107
+ from: traceFrom
108
+ });
109
+ const {
110
+ data: pois,
111
+ isLoading: isPoisLoading
112
+ } = usePois(debouncedBounds, {
113
+ enabled: enablePois,
114
+ limit: poiLimit
115
+ });
116
+ return {
117
+ vessel,
118
+ isVesselLoading,
119
+ vesselError: vesselError ?? null,
120
+ trace,
121
+ isTraceLoading,
122
+ traceError: traceError ?? null,
123
+ isDebouncing,
124
+ bounds,
125
+ setBounds,
126
+ pois,
127
+ isPoisLoading
128
+ };
129
+ }
130
+ export {
131
+ useDebouncedBounds,
132
+ usePois,
133
+ useVessel,
134
+ useVesselTrace,
135
+ useVesselTracking
136
+ };
137
+ //# sourceMappingURL=useVesselTracking.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/shipment_tracking/hooks/useVesselTracking.ts"],
4
+ "sourcesContent": ["'use client'\n\n/**\n * React hooks for vessel tracking with real-time position and trace data.\n *\n * Features:\n * - useVessel: Fetch vessel info with auto-refresh\n * - useVesselTrace: Fetch trace with viewport bounding box filter\n * - useDebouncedBounds: Debounce map viewport changes\n */\n\nimport { useState, useEffect, useCallback, useMemo } from 'react'\nimport { useQuery } from '@tanstack/react-query'\nimport {\n fetchVessel,\n fetchVesselTrace,\n fetchPois,\n type VesselInfo,\n type TraceResponse,\n type BoundingBox,\n type TimeRange,\n type PoiInfo,\n} from '../lib/vessel-api'\n\n// \u2500\u2500\u2500 useVessel \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\u2500\u2500\u2500\n\ninterface UseVesselOptions {\n /** Enable auto-refresh (default: true) */\n autoRefresh?: boolean\n /** Auto-refresh interval in ms (default: 30000) */\n refreshInterval?: number\n /** Enable the query (default: true) */\n enabled?: boolean\n}\n\n/**\n * Hook to fetch vessel information by IMO number.\n * Auto-refreshes every 30 seconds by default.\n */\nexport function useVessel(\n vesselImo: string | null | undefined,\n options: UseVesselOptions = {}\n) {\n const { autoRefresh = true, refreshInterval = 30_000, enabled = true } = options\n\n return useQuery<VesselInfo | null, Error>({\n queryKey: ['vessel-info', vesselImo],\n queryFn: () => fetchVessel(vesselImo!),\n enabled: enabled && !!vesselImo,\n staleTime: refreshInterval,\n refetchInterval: autoRefresh ? refreshInterval : false,\n retry: 2,\n })\n}\n\n// \u2500\u2500\u2500 useDebouncedBounds \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\ninterface UseDebouncedBoundsResult {\n /** Current bounds (updated immediately) */\n bounds: BoundingBox | null\n /** Debounced bounds (updated after delay) */\n debouncedBounds: BoundingBox | null\n /** Update bounds - call this on map viewport change */\n setBounds: (bounds: BoundingBox | null) => void\n /** Whether bounds are currently being debounced */\n isDebouncing: boolean\n}\n\n/**\n * Hook to debounce map viewport bounds changes.\n * Prevents excessive API calls when user is panning/zooming.\n *\n * @param delay - Debounce delay in ms (default: 500)\n */\nexport function useDebouncedBounds(delay = 500): UseDebouncedBoundsResult {\n const [bounds, setBounds] = useState<BoundingBox | null>(null)\n const [debouncedBounds, setDebouncedBounds] = useState<BoundingBox | null>(null)\n const [isDebouncing, setIsDebouncing] = useState(false)\n\n useEffect(() => {\n if (!bounds) {\n setDebouncedBounds(null)\n setIsDebouncing(false)\n return\n }\n\n setIsDebouncing(true)\n const timer = setTimeout(() => {\n setDebouncedBounds(bounds)\n setIsDebouncing(false)\n }, delay)\n\n return () => {\n clearTimeout(timer)\n }\n }, [bounds, delay])\n\n return { bounds, debouncedBounds, setBounds, isDebouncing }\n}\n\n// \u2500\u2500\u2500 useVesselTrace \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\ninterface UseVesselTraceOptions {\n /** Maximum number of trace points to fetch (default: 2000) */\n limit?: number\n /** Stale time in ms (default: 60000) */\n staleTime?: number\n /** Enable the query (default: true) */\n enabled?: boolean\n /** Start time filter (ISO 8601) - limits trace to events after this date */\n from?: string\n}\n\n/**\n * Hook to fetch vessel trace (position history) within a bounding box.\n * Only fetches when bounds are provided (debounce with useDebouncedBounds).\n */\nexport function useVesselTrace(\n vesselImo: string | null | undefined,\n bounds: BoundingBox | null,\n options: UseVesselTraceOptions = {}\n) {\n const { limit = 2000, staleTime = 60_000, enabled = true, from } = options\n\n // Memoize bounds to prevent unnecessary refetches\n const boundsKey = useMemo(() => {\n if (!bounds) return null\n // Round to 3 decimal places to prevent micro-changes from triggering refetch\n return `${bounds.north.toFixed(3)},${bounds.south.toFixed(3)},${bounds.east.toFixed(3)},${bounds.west.toFixed(3)}`\n }, [bounds])\n\n // Build time range if from is provided\n const timeRange: TimeRange | undefined = from ? { from } : undefined\n\n return useQuery<TraceResponse, Error>({\n queryKey: ['vessel-trace', vesselImo, boundsKey, limit, from],\n queryFn: () => fetchVesselTrace(vesselImo!, bounds ?? undefined, limit, timeRange),\n enabled: enabled && !!vesselImo && !!bounds,\n staleTime,\n retry: 1,\n })\n}\n\n// \u2500\u2500\u2500 usePois \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\u2500\u2500\u2500\u2500\u2500\n\ninterface UsePoisOptions {\n /** Maximum number of POIs to fetch (default: 1000) */\n limit?: number\n /** Stale time in ms (default: 300000 \u2014 POIs are near-static) */\n staleTime?: number\n /** Enable the query (default: true). Gate this on zoom to avoid clutter/over-fetch. */\n enabled?: boolean\n}\n\n/**\n * Hook to fetch points of interest within a bounding box.\n * Only fetches when bounds are provided and `enabled` is true (gate on zoom level).\n */\nexport function usePois(\n bounds: BoundingBox | null,\n options: UsePoisOptions = {}\n) {\n const { limit = 1000, staleTime = 300_000, enabled = true } = options\n\n // Round bounds so micro pan/zoom doesn't re-trigger; reuses the trace pattern.\n const boundsKey = useMemo(() => {\n if (!bounds) return null\n return `${bounds.north.toFixed(2)},${bounds.south.toFixed(2)},${bounds.east.toFixed(2)},${bounds.west.toFixed(2)}`\n }, [bounds])\n\n return useQuery<PoiInfo[], Error>({\n queryKey: ['pois', boundsKey, limit],\n queryFn: async () => {\n // Waypoints are open-water grid markers \u2014 exclude them at the source. The API `type`\n // filter is single-value, so request the real-place types in parallel and merge.\n const results = await Promise.all(\n (['PORT', 'TERMINAL', 'PORT_GEOMETRIC_CENTER'] as const).map((type) =>\n fetchPois(bounds ?? undefined, { type, limit }),\n ),\n )\n const seen = new Set<string>()\n return results.flat().filter((poi) => {\n if (seen.has(poi.code)) return false\n seen.add(poi.code)\n return true\n })\n },\n enabled: enabled && !!bounds,\n staleTime,\n retry: 1,\n })\n}\n\n// \u2500\u2500\u2500 useVesselTracking (combined) \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\ninterface UseVesselTrackingOptions {\n /** Auto-refresh vessel position (default: true) */\n autoRefresh?: boolean\n /** Vessel refresh interval in ms (default: 30000) */\n vesselRefreshInterval?: number\n /** Trace fetch limit (default: 2000) */\n traceLimit?: number\n /** Bounds debounce delay in ms (default: 500) */\n boundsDebounceDelay?: number\n /** Start time filter for trace (ISO 8601) - limits trace to events after this date */\n traceFrom?: string\n /** Fetch POIs for the current viewport (default: false) */\n enablePois?: boolean\n /** Max POIs to fetch per viewport (default: 1000) */\n poiLimit?: number\n}\n\ninterface UseVesselTrackingResult {\n /** Vessel info */\n vessel: VesselInfo | null | undefined\n /** Whether vessel is loading */\n isVesselLoading: boolean\n /** Vessel fetch error */\n vesselError: Error | null\n /** Trace data */\n trace: TraceResponse | undefined\n /** Whether trace is loading */\n isTraceLoading: boolean\n /** Trace fetch error */\n traceError: Error | null\n /** Whether bounds are being debounced */\n isDebouncing: boolean\n /** Current viewport bounds */\n bounds: BoundingBox | null\n /** Update bounds (call on map viewport change) */\n setBounds: (bounds: BoundingBox | null) => void\n /** POIs within the current viewport (empty unless enablePois) */\n pois: PoiInfo[] | undefined\n /** Whether POIs are loading */\n isPoisLoading: boolean\n}\n\n/**\n * Combined hook for vessel tracking with map integration.\n * Handles vessel info, trace, and debounced bounds in one hook.\n */\nexport function useVesselTracking(\n vesselImo: string | null | undefined,\n options: UseVesselTrackingOptions = {}\n): UseVesselTrackingResult {\n const {\n autoRefresh = true,\n vesselRefreshInterval = 30_000,\n traceLimit = 2000,\n boundsDebounceDelay = 500,\n traceFrom,\n enablePois = false,\n poiLimit = 1000,\n } = options\n\n const { bounds, debouncedBounds, setBounds, isDebouncing } = useDebouncedBounds(boundsDebounceDelay)\n\n const {\n data: vessel,\n isLoading: isVesselLoading,\n error: vesselError,\n } = useVessel(vesselImo, {\n autoRefresh,\n refreshInterval: vesselRefreshInterval,\n })\n\n const {\n data: trace,\n isLoading: isTraceLoading,\n error: traceError,\n } = useVesselTrace(vesselImo, debouncedBounds, {\n limit: traceLimit,\n from: traceFrom,\n })\n\n const {\n data: pois,\n isLoading: isPoisLoading,\n } = usePois(debouncedBounds, {\n enabled: enablePois,\n limit: poiLimit,\n })\n\n return {\n vessel,\n isVesselLoading,\n vesselError: vesselError ?? null,\n trace,\n isTraceLoading,\n traceError: traceError ?? null,\n isDebouncing,\n bounds,\n setBounds,\n pois,\n isPoisLoading,\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }