@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,523 @@
1
+ import { z } from 'zod'
2
+
3
+ const uuid = () => z.string().uuid()
4
+
5
+ const scopedSchema = z.object({
6
+ organizationId: uuid(),
7
+ tenantId: uuid(),
8
+ })
9
+
10
+ // ─── Timestamp Schemas ───────────────────────────────────────
11
+
12
+ export const timestampSourceSchema = z.enum(['carrier_api', 'manual', 'ais', 'port', 'edi'])
13
+ export type TimestampSourceInput = z.infer<typeof timestampSourceSchema>
14
+
15
+ export const shipmentTimestampEntrySchema = z.object({
16
+ value: z.string().datetime({ message: 'Must be ISO 8601 datetime' }),
17
+ offset: z.string().regex(/^[+-]\d{2}:\d{2}$|^Z$/, 'Must be timezone offset like +08:00 or Z').nullable(),
18
+ source: timestampSourceSchema,
19
+ updatedAt: z.string().datetime({ message: 'Must be ISO 8601 datetime' }),
20
+ sourceEventId: z.string().nullable().optional(),
21
+ })
22
+ export type ShipmentTimestampEntryInput = z.infer<typeof shipmentTimestampEntrySchema>
23
+
24
+ export const timestampEntryInputSchema = z.object({
25
+ value: z.string().datetime({ message: 'Must be ISO 8601 datetime' }),
26
+ offset: z.string().regex(/^[+-]\d{2}:\d{2}$|^Z$/, 'Must be timezone offset like +08:00 or Z').nullable().optional(),
27
+ source: timestampSourceSchema,
28
+ sourceEventId: z.string().nullable().optional(),
29
+ })
30
+ export type TimestampEntryInput = z.infer<typeof timestampEntryInputSchema>
31
+
32
+ // UN/LOCODE format: 2 uppercase letters (country) + 3 alphanumeric characters (location)
33
+ // Example: PLGDY (Poland, Gdynia), CRMOB (Costa Rica, Moín), BEANR (Belgium, Antwerp)
34
+ export const unLocodeSchema = z.string()
35
+ .trim()
36
+ .toUpperCase()
37
+ .length(5, 'UN/LOCODE must be exactly 5 characters')
38
+ .regex(/^[A-Z]{2}[A-Z0-9]{3}$/, 'Invalid UN/LOCODE format (expected: 2 letters + 3 alphanumeric)')
39
+
40
+ // Optional UN/LOCODE - will be auto-inferred from tracking events if not provided
41
+ export const optionalUnLocodeSchema = unLocodeSchema.optional()
42
+
43
+ // ─── Enums ───────────────────────────────────────────────────
44
+
45
+ export const shipmentStatusSchema = z.enum(['PENDING', 'BOOKED', 'DEPARTED', 'IN_TRANSIT', 'PRE_ARRIVAL', 'ARRIVED', 'DELIVERED'])
46
+ export type ShipmentStatus = z.infer<typeof shipmentStatusSchema>
47
+
48
+ export const trackingEventSourceSchema = z.enum(['dcsa', 'ais', 'port', 'edi', 'manual', 'shipsgo'])
49
+ export type TrackingEventSource = z.infer<typeof trackingEventSourceSchema>
50
+
51
+ export const trackingReferenceTypeSchema = z.enum(['container', 'booking', 'bol', 'awb'])
52
+ export type TrackingReferenceType = z.infer<typeof trackingReferenceTypeSchema>
53
+
54
+ export const trackingProviderSchema = z.enum(['carrier', 'shipsgo'])
55
+ export type TrackingProvider = z.infer<typeof trackingProviderSchema>
56
+
57
+ export const trackingModeSchema = z.enum(['ocean', 'air'])
58
+ export type TrackingMode = z.infer<typeof trackingModeSchema>
59
+
60
+ // ─── Facility Location (JSONB) ───────────────────────────────
61
+
62
+ export const facilityCodeListProviderSchema = z.enum(['BIC', 'SMDG'])
63
+ export type FacilityCodeListProvider = z.infer<typeof facilityCodeListProviderSchema>
64
+
65
+ export const facilityLocationSourceSchema = z.enum(['dcsa', 'bic', 'manual'])
66
+ export type FacilityLocationSource = z.infer<typeof facilityLocationSourceSchema>
67
+
68
+ export const coordsSchema = z.object({
69
+ latitude: z.number(),
70
+ longitude: z.number(),
71
+ })
72
+ export type Coords = z.infer<typeof coordsSchema>
73
+
74
+ /**
75
+ * Rich location data for origin, destination, or transshipment points.
76
+ * Combines port-level (UN/LOCODE) with facility-level (terminal) details.
77
+ */
78
+ export const facilityLocationSchema = z.object({
79
+ // Display name (terminal or port name)
80
+ name: z.string(),
81
+
82
+ // Port-level identifiers
83
+ unlocode: z.string().nullable(), // UN/LOCODE (e.g., "PLGDN")
84
+ countryCode: z.string().nullable(), // ISO 3166-1 alpha-2 (e.g., "PL")
85
+
86
+ // Facility/terminal identifiers (separate fields)
87
+ facilityCode: z.string().nullable(), // SMDG/BIC code (e.g., "DCT")
88
+ facilityCodeListProvider: facilityCodeListProviderSchema.nullable(),
89
+ facilityTypeCode: z.string().nullable(), // POTE (port terminal), DEPO (depot), etc.
90
+
91
+ // Address (from DCSA otherFacility or BIC API)
92
+ address: z.string().nullable(), // Full address string
93
+
94
+ // Coordinates
95
+ coords: coordsSchema.nullable(),
96
+
97
+ // Operator (from BIC API enrichment only)
98
+ operatorName: z.string().nullable(),
99
+
100
+ // Source of the data
101
+ source: facilityLocationSourceSchema,
102
+ })
103
+ export type FacilityLocationInput = z.infer<typeof facilityLocationSchema>
104
+
105
+ // ─── Route & Event Entries (JSONB) ───────────────────────────
106
+
107
+ export const routeStopEntrySchema = z.object({
108
+ location: z.string(),
109
+ unlocode: z.string().nullable().optional(),
110
+ type: z.enum(['origin', 'transshipment', 'destination']),
111
+ vesselName: z.string().nullable().optional(),
112
+ ata: z.string().nullable().optional(), // Actual arrival
113
+ atd: z.string().nullable().optional(), // Actual departure
114
+ eta: z.string().nullable().optional(), // Estimated arrival (for delay calculation)
115
+ etd: z.string().nullable().optional(), // Estimated departure (for delay calculation)
116
+ // Facility/terminal details
117
+ facilityCode: z.string().nullable().optional(),
118
+ facilityCodeListProvider: facilityCodeListProviderSchema.nullable().optional(),
119
+ facilityTypeCode: z.string().nullable().optional(),
120
+ facilityAddress: z.string().nullable().optional(),
121
+ coords: coordsSchema.nullable().optional(),
122
+ })
123
+ export type RouteStopEntryInput = z.infer<typeof routeStopEntrySchema>
124
+
125
+ // Seal information (from DCSA events)
126
+ export const sealInfoSchema = z.object({
127
+ number: z.string(),
128
+ source: z.string().nullable().optional(), // CAR, SHI, TER, CUS
129
+ type: z.string().nullable().optional(),
130
+ })
131
+ export type SealInfoInput = z.infer<typeof sealInfoSchema>
132
+
133
+ export const cargoEventEntrySchema = z.object({
134
+ id: z.string(),
135
+ eventType: z.string(),
136
+ eventCode: z.string(),
137
+ eventClassifierCode: z.enum(['ACT', 'PLN', 'EST']).nullable().optional(),
138
+ eventDateTime: z.string(),
139
+ description: z.string().nullable().optional(),
140
+ locationName: z.string().nullable().optional(),
141
+ locationUnlocode: z.string().nullable().optional(),
142
+ vesselName: z.string().nullable().optional(),
143
+ vesselImo: z.string().nullable().optional(),
144
+ voyageNumber: z.string().nullable().optional(),
145
+ isTransshipmentMove: z.boolean().nullable().optional(),
146
+ // Facility/terminal details
147
+ facilityCode: z.string().nullable().optional(),
148
+ facilityCodeListProvider: facilityCodeListProviderSchema.nullable().optional(),
149
+ facilityTypeCode: z.string().nullable().optional(),
150
+ facilityAddress: z.string().nullable().optional(),
151
+ latitude: z.number().nullable().optional(),
152
+ longitude: z.number().nullable().optional(),
153
+ // Seal information
154
+ seals: z.array(sealInfoSchema).nullable().optional(),
155
+ })
156
+ export type CargoEventEntryInput = z.infer<typeof cargoEventEntrySchema>
157
+
158
+ // ─── Shipment ────────────────────────────────────────────────
159
+
160
+ export const shipmentCreateSchema = scopedSchema.extend({
161
+ // Optional: link to existing tracking job
162
+ trackingJobId: uuid().optional(),
163
+ carrierCode: z.string().trim().max(20).optional(),
164
+ containerNumber: z.string().trim().max(50).optional(),
165
+ bookingNumber: z.string().trim().max(100).optional(),
166
+ bolNumber: z.string().trim().max(100).optional(),
167
+ // Multi-source timestamps (JSONB arrays)
168
+ etdTimestamps: z.array(shipmentTimestampEntrySchema).optional(),
169
+ etaTimestamps: z.array(shipmentTimestampEntrySchema).optional(),
170
+ atdTimestamps: z.array(shipmentTimestampEntrySchema).optional(),
171
+ ataTimestamps: z.array(shipmentTimestampEntrySchema).optional(),
172
+ // Location data (JSONB)
173
+ originLocation: facilityLocationSchema.optional(),
174
+ destinationLocation: facilityLocationSchema.optional(),
175
+ vesselName: z.string().trim().max(200).optional(),
176
+ vesselImo: z.string().trim().max(20).optional(),
177
+ voyageNumber: z.string().trim().max(50).optional(),
178
+ extra: z.record(z.string(), z.unknown()).optional(),
179
+ })
180
+
181
+ export const shipmentUpdateSchema = z.object({
182
+ id: uuid(),
183
+ }).merge(
184
+ scopedSchema.extend({
185
+ trackingJobId: uuid().optional().nullable(),
186
+ carrierCode: z.string().trim().max(20).optional().nullable(),
187
+ containerNumber: z.string().trim().max(50).optional().nullable(),
188
+ bookingNumber: z.string().trim().max(100).optional().nullable(),
189
+ bolNumber: z.string().trim().max(100).optional().nullable(),
190
+ status: shipmentStatusSchema.optional(),
191
+ // Multi-source timestamps - can replace entire arrays or add entries
192
+ etdTimestamps: z.array(shipmentTimestampEntrySchema).optional().nullable(),
193
+ etaTimestamps: z.array(shipmentTimestampEntrySchema).optional().nullable(),
194
+ atdTimestamps: z.array(shipmentTimestampEntrySchema).optional().nullable(),
195
+ ataTimestamps: z.array(shipmentTimestampEntrySchema).optional().nullable(),
196
+ // Add single timestamp entries (convenience for manual updates)
197
+ addEtdTimestamp: timestampEntryInputSchema.optional(),
198
+ addEtaTimestamp: timestampEntryInputSchema.optional(),
199
+ addAtdTimestamp: timestampEntryInputSchema.optional(),
200
+ addAtaTimestamp: timestampEntryInputSchema.optional(),
201
+ // Location data (JSONB)
202
+ originLocation: facilityLocationSchema.optional().nullable(),
203
+ destinationLocation: facilityLocationSchema.optional().nullable(),
204
+ vesselName: z.string().trim().max(200).optional().nullable(),
205
+ vesselImo: z.string().trim().max(20).optional().nullable(),
206
+ voyageNumber: z.string().trim().max(50).optional().nullable(),
207
+ extra: z.record(z.string(), z.unknown()).optional().nullable(),
208
+ }).partial(),
209
+ )
210
+
211
+ export const shipmentListSchema = z.object({
212
+ id: z.string().uuid().optional(),
213
+ page: z.coerce.number().min(1).default(1),
214
+ pageSize: z.coerce.number().min(1).max(100).default(50),
215
+ search: z.string().optional(),
216
+ status: z.string().optional(),
217
+ carrierCode: z.string().optional(),
218
+ sortField: z.string().optional(),
219
+ sortDir: z.enum(['asc', 'desc']).optional(),
220
+ }).passthrough()
221
+
222
+ export type ShipmentCreateInput = z.infer<typeof shipmentCreateSchema>
223
+ export type ShipmentUpdateInput = z.infer<typeof shipmentUpdateSchema>
224
+
225
+ // ─── TrackingJob ─────────────────────────────────────────────
226
+
227
+ export const trackingJobCreateSchema = scopedSchema.extend({
228
+ carrierCode: z.string().trim().min(1).max(50),
229
+ referenceType: trackingReferenceTypeSchema,
230
+ referenceValue: z.string().trim().min(1).max(100),
231
+ // Origin/destination are optional - will be auto-inferred from tracking events if not provided
232
+ originUnlocode: optionalUnLocodeSchema,
233
+ destinationUnlocode: optionalUnLocodeSchema,
234
+ schedule: z.array(z.string()).optional(),
235
+ })
236
+
237
+ export const trackingJobUpdateSchema = z.object({
238
+ id: uuid(),
239
+ }).merge(
240
+ scopedSchema.extend({
241
+ status: z.enum(['active', 'paused', 'deactivated', 'failed', 'completed']).optional(),
242
+ schedule: z.array(z.string()).optional().nullable(),
243
+ nextPollAt: z.coerce.date().optional().nullable(),
244
+ }).partial(),
245
+ )
246
+
247
+ export const trackingJobListSchema = z.object({
248
+ page: z.coerce.number().min(1).default(1),
249
+ pageSize: z.coerce.number().min(1).max(100).default(50),
250
+ status: z.string().optional(),
251
+ carrierCode: z.string().optional(),
252
+ referenceType: z.string().optional(),
253
+ referenceValue: z.string().optional(),
254
+ sortField: z.string().optional(),
255
+ sortDir: z.enum(['asc', 'desc']).optional(),
256
+ }).passthrough()
257
+
258
+ export type TrackingJobCreateInput = z.infer<typeof trackingJobCreateSchema>
259
+ export type TrackingJobUpdateInput = z.infer<typeof trackingJobUpdateSchema>
260
+
261
+ // ─── TrackingEvent ───────────────────────────────────────────
262
+
263
+ export const trackingEventListSchema = z.object({
264
+ page: z.coerce.number().min(1).default(1),
265
+ pageSize: z.coerce.number().min(1).max(100).default(50),
266
+ trackingJobId: uuid().optional(),
267
+ equipmentReference: z.string().optional(),
268
+ source: trackingEventSourceSchema.optional(),
269
+ eventType: z.string().optional(),
270
+ eventCode: z.string().optional(),
271
+ sortField: z.string().optional(),
272
+ sortDir: z.enum(['asc', 'desc']).optional(),
273
+ }).passthrough()
274
+
275
+ /** @deprecated Use trackingEventListSchema instead */
276
+ export const cargoEventListSchema = trackingEventListSchema
277
+
278
+ // ─── CarrierConfig ───────────────────────────────────────────
279
+
280
+ export const carrierConfigCreateSchema = scopedSchema.extend({
281
+ carrierCode: z.string().trim().min(1).max(50),
282
+ apiEndpoint: z.string().trim().url().max(500).optional(),
283
+ authConfig: z.record(z.string(), z.unknown()).optional(),
284
+ rateLimitRequests: z.coerce.number().int().min(1).max(10000).default(60),
285
+ rateLimitWindowSeconds: z.coerce.number().int().min(1).max(86400).default(60),
286
+ isActive: z.boolean().default(true),
287
+ })
288
+
289
+ export const carrierConfigUpdateSchema = z.object({
290
+ id: uuid(),
291
+ }).merge(
292
+ scopedSchema.extend({
293
+ apiEndpoint: z.string().trim().url().max(500).optional().nullable(),
294
+ authConfig: z.record(z.string(), z.unknown()).optional().nullable(),
295
+ rateLimitRequests: z.coerce.number().int().min(1).max(10000).optional(),
296
+ rateLimitWindowSeconds: z.coerce.number().int().min(1).max(86400).optional(),
297
+ isActive: z.boolean().optional(),
298
+ }).partial(),
299
+ )
300
+
301
+ export const carrierConfigListSchema = z.object({
302
+ page: z.coerce.number().min(1).default(1),
303
+ pageSize: z.coerce.number().min(1).max(100).default(50),
304
+ carrierCode: z.string().optional(),
305
+ isActive: z.string().optional(),
306
+ sortField: z.string().optional(),
307
+ sortDir: z.enum(['asc', 'desc']).optional(),
308
+ }).passthrough()
309
+
310
+ export type CarrierConfigCreateInput = z.infer<typeof carrierConfigCreateSchema>
311
+ export type CarrierConfigUpdateInput = z.infer<typeof carrierConfigUpdateSchema>
312
+
313
+ // ─── BicConfig ───────────────────────────────────────────────
314
+
315
+ export const bicConfigUpsertSchema = scopedSchema.extend({
316
+ isEnabled: z.boolean().default(false),
317
+ username: z.string().trim().min(1, 'Username is required').max(200),
318
+ password: z.string().trim().min(1, 'Password is required').max(500),
319
+ baseUrl: z.string().trim().url().max(500).default('https://api.bic-code.org'),
320
+ })
321
+
322
+ export const bicConfigResponseSchema = z.object({
323
+ id: uuid(),
324
+ organizationId: uuid(),
325
+ tenantId: uuid(),
326
+ isEnabled: z.boolean(),
327
+ username: z.string(),
328
+ // Password is NOT included in response for security
329
+ baseUrl: z.string(),
330
+ createdAt: z.string(),
331
+ updatedAt: z.string(),
332
+ })
333
+
334
+ export const bicConfigTestSchema = scopedSchema.extend({
335
+ username: z.string().trim().min(1),
336
+ password: z.string().trim().min(1),
337
+ baseUrl: z.string().trim().url().default('https://api.bic-code.org'),
338
+ })
339
+
340
+ export type BicConfigUpsertInput = z.infer<typeof bicConfigUpsertSchema>
341
+ export type BicConfigResponse = z.infer<typeof bicConfigResponseSchema>
342
+ export type BicConfigTestInput = z.infer<typeof bicConfigTestSchema>
343
+
344
+ // ─── ShipsGoConfig ───────────────────────────────────────────
345
+ // One row per organization/tenant. Upsert semantics (like BicConfig). The API
346
+ // token is write-only in responses; on update the sentinel '__UNCHANGED__'
347
+ // leaves the stored token intact.
348
+
349
+ export const shipsGoConfigUpsertSchema = scopedSchema.extend({
350
+ isEnabled: z.boolean().default(false),
351
+ apiToken: z.string().trim().min(1, 'API token is required').max(500),
352
+ baseUrl: z.string().trim().url().max(500).default('https://api.shipsgo.com/v2'),
353
+ oceanEnabled: z.boolean().default(true),
354
+ airEnabled: z.boolean().default(true),
355
+ rateLimitRequests: z.coerce.number().int().min(1).max(10000).default(60),
356
+ rateLimitWindowSeconds: z.coerce.number().int().min(1).max(86400).default(60),
357
+ })
358
+
359
+ export const shipsGoConfigResponseSchema = z.object({
360
+ id: uuid(),
361
+ organizationId: uuid(),
362
+ tenantId: uuid(),
363
+ isEnabled: z.boolean(),
364
+ // apiToken is NOT included in responses for security
365
+ baseUrl: z.string(),
366
+ oceanEnabled: z.boolean(),
367
+ airEnabled: z.boolean(),
368
+ rateLimitRequests: z.number(),
369
+ rateLimitWindowSeconds: z.number(),
370
+ createdAt: z.string(),
371
+ updatedAt: z.string(),
372
+ })
373
+
374
+ export type ShipsGoConfigUpsertInput = z.infer<typeof shipsGoConfigUpsertSchema>
375
+ export type ShipsGoConfigResponse = z.infer<typeof shipsGoConfigResponseSchema>
376
+
377
+ // ─── Webhook ─────────────────────────────────────────────────
378
+
379
+ export const webhookCreateSchema = scopedSchema.extend({
380
+ url: z.string().trim().url().max(500),
381
+ eventsSubscribed: z.array(z.string().trim().min(1)).min(1),
382
+ hmacSecret: z.string().trim().max(256).optional(),
383
+ isActive: z.boolean().default(true),
384
+ })
385
+
386
+ export const webhookUpdateSchema = z.object({
387
+ id: uuid(),
388
+ }).merge(
389
+ scopedSchema.extend({
390
+ url: z.string().trim().url().max(500).optional(),
391
+ eventsSubscribed: z.array(z.string().trim().min(1)).min(1).optional(),
392
+ hmacSecret: z.string().trim().max(256).optional().nullable(),
393
+ isActive: z.boolean().optional(),
394
+ }).partial(),
395
+ )
396
+
397
+ export const webhookListSchema = z.object({
398
+ id: z.string().uuid().optional(),
399
+ page: z.coerce.number().min(1).default(1),
400
+ pageSize: z.coerce.number().min(1).max(100).default(50),
401
+ isActive: z.string().optional(),
402
+ sortField: z.string().optional(),
403
+ sortDir: z.enum(['asc', 'desc']).optional(),
404
+ }).passthrough()
405
+
406
+ export type WebhookCreateInput = z.infer<typeof webhookCreateSchema>
407
+ export type WebhookUpdateInput = z.infer<typeof webhookUpdateSchema>
408
+
409
+ // ─── WebhookDelivery ─────────────────────────────────────────
410
+
411
+ export const webhookDeliveryListSchema = z.object({
412
+ page: z.coerce.number().min(1).default(1),
413
+ pageSize: z.coerce.number().min(1).max(100).default(50),
414
+ webhookId: uuid().optional(),
415
+ status: z.string().optional(),
416
+ eventType: z.string().optional(),
417
+ sortField: z.string().optional(),
418
+ sortDir: z.enum(['asc', 'desc']).optional(),
419
+ }).passthrough()
420
+
421
+ // ─── LocationOverride ────────────────────────────────────────
422
+
423
+ export const locationOverrideDataSchema = z.object({
424
+ name: z.string().trim().min(1, 'Name is required').max(200),
425
+ address: z.string().trim().max(500).nullable().optional(),
426
+ operatorName: z.string().trim().max(200).nullable().optional(),
427
+ countryCode: z.string().trim().length(2, 'Country code must be 2 characters').toUpperCase().nullable().optional(),
428
+ facilityTypeCode: z.string().trim().max(20).nullable().optional(),
429
+ coords: coordsSchema.nullable().optional(),
430
+ })
431
+ export type LocationOverrideData = z.infer<typeof locationOverrideDataSchema>
432
+
433
+ export const locationOverrideCreateSchema = scopedSchema.extend({
434
+ carrierCode: z.string().trim().max(20).nullable().optional(),
435
+ unlocode: unLocodeSchema,
436
+ facilityCode: z.string().trim().min(1, 'Facility code is required').max(50),
437
+ facilityCodeListProvider: facilityCodeListProviderSchema,
438
+ overrideData: locationOverrideDataSchema,
439
+ description: z.string().trim().max(500).nullable().optional(),
440
+ isActive: z.boolean().default(true),
441
+ })
442
+
443
+ export const locationOverrideUpdateSchema = z.object({
444
+ id: uuid(),
445
+ }).merge(
446
+ scopedSchema.extend({
447
+ carrierCode: z.string().trim().max(20).nullable().optional(),
448
+ unlocode: unLocodeSchema.optional(),
449
+ facilityCode: z.string().trim().min(1).max(50).optional(),
450
+ facilityCodeListProvider: facilityCodeListProviderSchema.optional(),
451
+ overrideData: locationOverrideDataSchema.optional(),
452
+ description: z.string().trim().max(500).nullable().optional(),
453
+ isActive: z.boolean().optional(),
454
+ }).partial(),
455
+ )
456
+
457
+ export const locationOverrideListSchema = z.object({
458
+ page: z.coerce.number().min(1).default(1),
459
+ pageSize: z.coerce.number().min(1).max(100).default(50),
460
+ carrierCode: z.string().optional(),
461
+ unlocode: z.string().optional(),
462
+ facilityCode: z.string().optional(),
463
+ isActive: z.string().optional(),
464
+ search: z.string().optional(),
465
+ sortField: z.string().optional(),
466
+ sortDir: z.enum(['asc', 'desc']).optional(),
467
+ }).passthrough()
468
+
469
+ export type LocationOverrideCreateInput = z.infer<typeof locationOverrideCreateSchema>
470
+ export type LocationOverrideUpdateInput = z.infer<typeof locationOverrideUpdateSchema>
471
+
472
+ // ─── Ships Map Dashboard Widget ──────────────────────────────
473
+
474
+ /** Optional scope filter for the ships-map aggregation route. */
475
+ export const shipsMapQuerySchema = z.object({
476
+ scope: z.enum(['in_transit', 'at_port', 'all']).optional().default('all'),
477
+ })
478
+ export type ShipsMapQueryInput = z.infer<typeof shipsMapQuerySchema>
479
+
480
+ /** A single shipment grouped under a map marker. */
481
+ export const shipsMapShipmentSchema = z.object({
482
+ id: z.string(),
483
+ containerNumber: z.string().nullable(),
484
+ status: z.string(),
485
+ eta: z.string().nullable(),
486
+ destinationLocation: z.string().nullable(),
487
+ })
488
+
489
+ /**
490
+ * Map marker discriminated by `kind`:
491
+ * - `vessel`: a live AIS position for a vessel actually carrying in-transit cargo.
492
+ * - `port`: a port where at-rest cargo is waiting (the planned onward vessel's AIS is unrelated).
493
+ */
494
+ export const shipsMapMarkerSchema = z.discriminatedUnion('kind', [
495
+ z.object({
496
+ kind: z.literal('vessel'),
497
+ imo: z.string(),
498
+ name: z.string().nullable(),
499
+ position: z.object({ lat: z.number(), lng: z.number() }),
500
+ heading: z.number().nullable(),
501
+ destination: z.string().nullable(),
502
+ updatedAt: z.string().nullable(),
503
+ shipments: z.array(shipsMapShipmentSchema),
504
+ }),
505
+ z.object({
506
+ kind: z.literal('port'),
507
+ portName: z.string().nullable(),
508
+ unlocode: z.string().nullable(),
509
+ position: z.object({ lat: z.number(), lng: z.number() }),
510
+ shipments: z.array(shipsMapShipmentSchema),
511
+ }),
512
+ ])
513
+
514
+ export const shipsMapResponseSchema = z.object({
515
+ markers: z.array(shipsMapMarkerSchema),
516
+ /** Active shipments with no plottable position (no IMO/coords, or a vessel-api miss). */
517
+ unresolvedCount: z.number(),
518
+ generatedAt: z.string(),
519
+ })
520
+
521
+ export type ShipsMapShipment = z.infer<typeof shipsMapShipmentSchema>
522
+ export type ShipsMapMarker = z.infer<typeof shipsMapMarkerSchema>
523
+ export type ShipsMapResponse = z.infer<typeof shipsMapResponseSchema>
@@ -0,0 +1,73 @@
1
+ import { asClass } from 'awilix'
2
+ import type { AppContainer } from '@open-mercato/shared/lib/di/container'
3
+ import { CarrierRegistryService } from './services/carrierRegistry'
4
+ import { TrackingService } from './services/trackingService'
5
+ import { ShipsGoProvider } from './services/shipsGoProvider'
6
+ import { WebhookService } from './services/webhookService'
7
+ import { PoiNatsService } from './services/poiNatsService'
8
+ import { registerAllAdapters } from './lib/adapters'
9
+
10
+ export function register(container: AppContainer) {
11
+ // Register carrier registry (singleton - adapters are registered once)
12
+ container.register({
13
+ shipmentTrackingCarrierRegistry: asClass(CarrierRegistryService).singleton(),
14
+ })
15
+
16
+ // Register webhook service first (no dependencies on other shipment-tracking services)
17
+ container.register({
18
+ shipmentTrackingWebhookService: {
19
+ resolve: () =>
20
+ new WebhookService({
21
+ em: () => container.resolve('em'),
22
+ eventBus: container.resolve('eventBus'),
23
+ }),
24
+ },
25
+ })
26
+
27
+ // Register ShipsGo aggregator provider (fallback tracking; no external deps)
28
+ container.register({
29
+ shipmentTrackingShipsGoProvider: {
30
+ resolve: () =>
31
+ new ShipsGoProvider({
32
+ em: () => container.resolve('em'),
33
+ }),
34
+ },
35
+ })
36
+
37
+ // Register tracking service (depends on webhook service)
38
+ container.register({
39
+ shipmentTrackingService: {
40
+ resolve: () => {
41
+ const cache = container.resolve<any>('cache')
42
+ return new TrackingService({
43
+ em: () => container.resolve('em'),
44
+ eventBus: container.resolve('eventBus'),
45
+ carrierRegistry: container.resolve('shipmentTrackingCarrierRegistry'),
46
+ shipsGoProvider: container.resolve('shipmentTrackingShipsGoProvider'),
47
+ webhookService: container.resolve('shipmentTrackingWebhookService'),
48
+ cacheService: {
49
+ get: (key: string) => cache.get(key),
50
+ set: (key: string, value: string, ttlSeconds?: number) =>
51
+ cache.set(key, value, ttlSeconds ? { ttl: ttlSeconds * 1000 } : undefined),
52
+ },
53
+ })
54
+ },
55
+ },
56
+ })
57
+
58
+ // Register POI NATS subscriber service
59
+ container.register({
60
+ poiNatsService: {
61
+ resolve: () =>
62
+ new PoiNatsService({
63
+ em: () => container.resolve('em'),
64
+ eventBus: container.resolve('eventBus'),
65
+ trackingService: container.resolve('shipmentTrackingService'),
66
+ }),
67
+ },
68
+ })
69
+
70
+ // Register all built-in carrier adapters
71
+ const registry = container.resolve<CarrierRegistryService>('shipmentTrackingCarrierRegistry')
72
+ registerAllAdapters(registry)
73
+ }
@@ -0,0 +1,17 @@
1
+ import type { ModuleEncryptionMap } from '@open-mercato/shared/modules/encryption'
2
+
3
+ /**
4
+ * Tenant-data-encryption declarations for the shipment_tracking module.
5
+ *
6
+ * `ShipsGoConfig.apiToken` holds the per-tenant ShipsGo API token and must be
7
+ * encrypted at rest. Reads go through `findOneWithDecryption`; writes are
8
+ * encrypted transparently by the ORM subscriber using this map.
9
+ */
10
+ export const defaultEncryptionMaps: ModuleEncryptionMap[] = [
11
+ {
12
+ entityId: 'shipment_tracking:shipsgo_config',
13
+ fields: [{ field: 'apiToken' }],
14
+ },
15
+ ]
16
+
17
+ export default defaultEncryptionMaps