mobility-toolbox-js 2.3.9 → 2.3.10

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 (471) hide show
  1. package/.esdoc.js +18 -0
  2. package/.eslintignore +1 -0
  3. package/.eslintrc.js +25 -0
  4. package/.fixpackrc +20 -0
  5. package/.github/workflows/build.yml +16 -0
  6. package/.github/workflows/conventional-pr-title.yml +16 -0
  7. package/.github/workflows/cypress.yml +101 -0
  8. package/.github/workflows/test.yml +17 -0
  9. package/.husky/commit-msg +4 -0
  10. package/.husky/post-checkout +4 -0
  11. package/.husky/post-merge +4 -0
  12. package/.husky/post-rebase +4 -0
  13. package/.husky/pre-commit +4 -0
  14. package/.lintstagedrc.js +10 -0
  15. package/.nvmrc +1 -0
  16. package/.prettierrc.js +5 -0
  17. package/.stylelintrc.js +4 -0
  18. package/CHANGELOG.md +132 -0
  19. package/LICENSE +21 -0
  20. package/MIGRATION-V2.md +248 -0
  21. package/README.md +42 -0
  22. package/__mocks__/mapbox-gl.js +81 -0
  23. package/__mocks__/maplibre-gl.js +81 -0
  24. package/babel.config.js +9 -0
  25. package/commitlint.config.js +1 -0
  26. package/cypress/e2e/examples/api.cy.js +7 -0
  27. package/cypress/e2e/examples/examples.cy.js +7 -0
  28. package/cypress/e2e/examples/navigation.cy.js +29 -0
  29. package/cypress/fixtures/example.json +5 -0
  30. package/cypress/plugins/index.js +21 -0
  31. package/cypress/support/commands.js +25 -0
  32. package/cypress/support/e2e.js +20 -0
  33. package/cypress.config.ts +15 -0
  34. package/data/fetchRoute.json +292 -0
  35. package/data/fetchTrajectories.json +18 -0
  36. package/data/fetchTrajectoryById.json +3 -0
  37. package/data/fetchTrajectoryStations.json +18 -0
  38. package/data/stopsSearch.json +15 -0
  39. package/dependabot.yml +15 -0
  40. package/doc/.eslintrc.json +1 -0
  41. package/doc/README.md +34 -0
  42. package/doc/next.config.js +16 -0
  43. package/doc/package.json +41 -0
  44. package/doc/pages/404.js +5 -0
  45. package/doc/pages/_app.js +61 -0
  46. package/doc/pages/_document.js +64 -0
  47. package/doc/pages/doc/[...slug].js +23 -0
  48. package/doc/pages/doc.js +23 -0
  49. package/doc/pages/example/[example].js +52 -0
  50. package/doc/pages/examples.js +34 -0
  51. package/doc/pages/index.js +25 -0
  52. package/doc/public/README.md +15 -0
  53. package/doc/public/favicon.ico +0 -0
  54. package/doc/public/static/assets/Lato-Black.ttf +0 -0
  55. package/doc/public/static/assets/Lato-BlackItalic.ttf +0 -0
  56. package/doc/public/static/assets/Lato-Bold.ttf +0 -0
  57. package/doc/public/static/assets/Lato-BoldItalic.ttf +0 -0
  58. package/doc/public/static/assets/Lato-Italic.ttf +0 -0
  59. package/doc/public/static/assets/Lato-Light.ttf +0 -0
  60. package/doc/public/static/assets/Lato-LightItalic.ttf +0 -0
  61. package/doc/public/static/assets/Lato-Regular.ttf +0 -0
  62. package/doc/public/static/assets/Lato-Thin.ttf +0 -0
  63. package/doc/public/static/assets/Lato-ThinItalic.ttf +0 -0
  64. package/doc/public/static/assets/OFL.txt +93 -0
  65. package/doc/public/static/examples/assets/tralis-live-map/index.js +11 -0
  66. package/doc/public/static/examples/assets/tralis-live-map/s1kreis.svg +105 -0
  67. package/doc/public/static/examples/assets/tralis-live-map/s20kreis.svg +101 -0
  68. package/doc/public/static/examples/assets/tralis-live-map/s2kreis.svg +95 -0
  69. package/doc/public/static/examples/assets/tralis-live-map/s3kreis.svg +95 -0
  70. package/doc/public/static/examples/assets/tralis-live-map/s4kreis.svg +95 -0
  71. package/doc/public/static/examples/assets/tralis-live-map/s6kreis.svg +95 -0
  72. package/doc/public/static/examples/assets/tralis-live-map/s7kreis.svg +95 -0
  73. package/doc/public/static/examples/assets/tralis-live-map/s8kreis.svg +93 -0
  74. package/doc/public/static/examples/assets/tralis-live-map/unknown.svg +107 -0
  75. package/doc/public/static/examples/layers.html +11 -0
  76. package/doc/public/static/examples/layers.js +97 -0
  77. package/doc/public/static/examples/mb-copyright.html +26 -0
  78. package/doc/public/static/examples/mb-copyright.js +37 -0
  79. package/doc/public/static/examples/mb-tracker.html +1 -0
  80. package/doc/public/static/examples/mb-tracker.js +40 -0
  81. package/doc/public/static/examples/mb-tracker.md +1 -0
  82. package/doc/public/static/examples/mb-tralis.html +1 -0
  83. package/doc/public/static/examples/mb-tralis.js +34 -0
  84. package/doc/public/static/examples/ol-copyright.html +26 -0
  85. package/doc/public/static/examples/ol-copyright.js +43 -0
  86. package/doc/public/static/examples/ol-mapbox-layer.html +1 -0
  87. package/doc/public/static/examples/ol-mapbox-layer.js +28 -0
  88. package/doc/public/static/examples/ol-mapbox-style-layer.html +12 -0
  89. package/doc/public/static/examples/ol-mapbox-style-layer.js +48 -0
  90. package/doc/public/static/examples/ol-query.html +32 -0
  91. package/doc/public/static/examples/ol-query.js +83 -0
  92. package/doc/public/static/examples/ol-routing.html +26 -0
  93. package/doc/public/static/examples/ol-routing.js +65 -0
  94. package/doc/public/static/examples/ol-routing.md +1 -0
  95. package/doc/public/static/examples/ol-stop-finder.html +15 -0
  96. package/doc/public/static/examples/ol-stop-finder.js +35 -0
  97. package/doc/public/static/examples/ol-stop-finder.md +1 -0
  98. package/doc/public/static/examples/ol-tracker.html +1 -0
  99. package/doc/public/static/examples/ol-tracker.js +41 -0
  100. package/doc/public/static/examples/ol-tracker.md +1 -0
  101. package/doc/public/static/examples/ol-tralis.html +5 -0
  102. package/doc/public/static/examples/ol-tralis.js +62 -0
  103. package/doc/public/static/examples/tralis-live-map.html +1 -0
  104. package/doc/public/static/examples/tralis-live-map.js +67 -0
  105. package/doc/public/static/examples/tralis-live-map.md +3 -0
  106. package/doc/public/static/img/live_tracker_mb.jpg +0 -0
  107. package/doc/public/static/img/live_tracker_munich.jpg +0 -0
  108. package/doc/public/static/img/live_tracker_ol.jpg +0 -0
  109. package/doc/public/static/img/mapbox.jpg +0 -0
  110. package/doc/public/static/img/mapbox_style.jpg +0 -0
  111. package/doc/public/static/img/ol-copyright.png +0 -0
  112. package/doc/public/static/img/query_objects.jpg +0 -0
  113. package/doc/public/static/img/routing.jpg +0 -0
  114. package/doc/public/static/img/simple_map.jpg +0 -0
  115. package/doc/public/static/img/stops.jpg +0 -0
  116. package/doc/public/vercel.svg +4 -0
  117. package/doc/src/components/CodeSandboxButton.js +102 -0
  118. package/doc/src/components/Documentation.js +42 -0
  119. package/doc/src/components/Esdoc/Anchor.js +57 -0
  120. package/doc/src/components/Esdoc/ClassDoc.js +272 -0
  121. package/doc/src/components/Esdoc/DeprecatedHTML.js +16 -0
  122. package/doc/src/components/Esdoc/DetailDocs.js +279 -0
  123. package/doc/src/components/Esdoc/DetailHTML.js +33 -0
  124. package/doc/src/components/Esdoc/DirectSubclassHTML.js +30 -0
  125. package/doc/src/components/Esdoc/DocBuilderUtils.js +697 -0
  126. package/doc/src/components/Esdoc/DocLinkHTML.js +63 -0
  127. package/doc/src/components/Esdoc/DocsLinkHTML.js +38 -0
  128. package/doc/src/components/Esdoc/Esdoc.js +63 -0
  129. package/doc/src/components/Esdoc/EsdocContent.js +56 -0
  130. package/doc/src/components/Esdoc/EsdocNavigation.js +13 -0
  131. package/doc/src/components/Esdoc/EsdocSearch.js +78 -0
  132. package/doc/src/components/Esdoc/ExperimentalHTML.js +17 -0
  133. package/doc/src/components/Esdoc/ExtendsChainHTML.js +32 -0
  134. package/doc/src/components/Esdoc/FileDocLinkHTML.js +62 -0
  135. package/doc/src/components/Esdoc/IdentifiersDoc.js +113 -0
  136. package/doc/src/components/Esdoc/IndirectSubclassHTML.js +30 -0
  137. package/doc/src/components/Esdoc/InheritedSummaryDoc.js +70 -0
  138. package/doc/src/components/Esdoc/InheritedSummaryHTML.js +38 -0
  139. package/doc/src/components/Esdoc/MixinClassesHTML.js +29 -0
  140. package/doc/src/components/Esdoc/NavDoc.js +112 -0
  141. package/doc/src/components/Esdoc/OverrideMethod.js +44 -0
  142. package/doc/src/components/Esdoc/OverrideMethodDescription.js +35 -0
  143. package/doc/src/components/Esdoc/Properties.js +89 -0
  144. package/doc/src/components/Esdoc/README.md +45 -0
  145. package/doc/src/components/Esdoc/SignatureHTML.js +123 -0
  146. package/doc/src/components/Esdoc/SingleDoc.js +31 -0
  147. package/doc/src/components/Esdoc/SummaryDoc.js +160 -0
  148. package/doc/src/components/Esdoc/SummaryHTML.js +96 -0
  149. package/doc/src/components/Esdoc/TypeDocLinkHTML.js +251 -0
  150. package/doc/src/components/Esdoc/index.js +7 -0
  151. package/doc/src/components/Esdoc/taffydb.js +2070 -0
  152. package/doc/src/components/Example.js +200 -0
  153. package/doc/src/components/ExampleCard.js +126 -0
  154. package/doc/src/components/Examples.js +78 -0
  155. package/doc/src/components/Home.js +121 -0
  156. package/doc/src/components/TrackerExample.js +39 -0
  157. package/doc/src/examples.js +117 -0
  158. package/doc/styles/App.scss +53 -0
  159. package/doc/styles/identifiers.css +38 -0
  160. package/doc/styles/search.css +76 -0
  161. package/doc/styles/style.css +603 -0
  162. package/esdoc/README.md +27 -0
  163. package/esdoc/plugins/MyPlugin.js +69 -0
  164. package/esdoc/plugins/dynamic-property-plugin/Plugin.js +50 -0
  165. package/esdoc/plugins/externals-plugin/Plugin.js +45 -0
  166. package/esdoc/plugins/externals-plugin/externals.js +93 -0
  167. package/esdoc/plugins/optional-chaining-plugin/Plugin.js +8 -0
  168. package/global-setup.js +3 -0
  169. package/jest.config.js +24 -0
  170. package/package.json +18 -18
  171. package/pull_request_template.md +17 -0
  172. package/scripts/read-pkg-json.js +22 -0
  173. package/src/api/RealtimeAPI.test.js +144 -0
  174. package/src/api/RealtimeAPI.ts +712 -0
  175. package/src/api/RoutingAPI.test.js +41 -0
  176. package/src/api/RoutingAPI.ts +47 -0
  177. package/src/api/StopsAPI.test.js +34 -0
  178. package/src/api/StopsAPI.ts +45 -0
  179. package/{api → src/api}/typedefs.js +11 -1
  180. package/src/common/api/HttpAPI.test.js +68 -0
  181. package/src/common/api/HttpAPI.ts +77 -0
  182. package/src/common/api/WebSocketAPI.test.js +421 -0
  183. package/src/common/api/WebSocketAPI.ts +515 -0
  184. package/src/common/controls/ControlCommon.test.js +106 -0
  185. package/src/common/controls/ControlCommon.ts +194 -0
  186. package/src/common/controls/CopyrightControlCommon.ts +41 -0
  187. package/src/common/controls/StopFinderControlCommon.ts +192 -0
  188. package/src/common/layers/LayerCommon.test.js +158 -0
  189. package/src/common/layers/LayerCommon.ts +321 -0
  190. package/src/common/mixins/RealtimeLayerMixin.ts +1168 -0
  191. package/src/common/mixins/UserInteractionsLayerMixin.test.js +227 -0
  192. package/src/common/mixins/UserInteractionsLayerMixin.ts +352 -0
  193. package/src/common/styles/realtimeDefaultStyle.ts +436 -0
  194. package/src/common/styles/realtimeDelayStyle.ts +27 -0
  195. package/src/common/styles/realtimeHeadingStyle.ts +138 -0
  196. package/src/common/styles/realtimeSimpleStyle.ts +25 -0
  197. package/{common → src/common}/typedefs.js +1 -1
  198. package/src/common/utils/compareDepartures.ts +46 -0
  199. package/src/common/utils/createCanvas.ts +33 -0
  200. package/src/common/utils/createRealtimeFilters.test.js +100 -0
  201. package/src/common/utils/createRealtimeFilters.ts +96 -0
  202. package/src/common/utils/debounceDeparturesMessages.ts +52 -0
  203. package/src/common/utils/debounceWebsocketMessages.ts +47 -0
  204. package/src/common/utils/getLayersAsFlatArray.ts +17 -0
  205. package/src/common/utils/getMapboxMapCopyrights.test.js +47 -0
  206. package/src/common/utils/getMapboxMapCopyrights.ts +52 -0
  207. package/src/common/utils/getMapboxRender.ts +104 -0
  208. package/src/common/utils/getMaplibreRender.ts +54 -0
  209. package/{common/utils/getRealtimeModeSuffix.d.ts → src/common/utils/getRealtimeModeSuffix.ts} +4 -2
  210. package/src/common/utils/getUrlWithParams.ts +21 -0
  211. package/src/common/utils/getVehiclePosition.ts +92 -0
  212. package/{common → src/common}/utils/index.js +1 -2
  213. package/src/common/utils/realtimeConfig.test.js +57 -0
  214. package/src/common/utils/realtimeConfig.ts +228 -0
  215. package/src/common/utils/removeDuplicate.test.js +22 -0
  216. package/src/common/utils/removeDuplicate.ts +22 -0
  217. package/src/common/utils/renderTrajectories.ts +194 -0
  218. package/src/common/utils/sortAndFilterDepartures.ts +78 -0
  219. package/src/common/utils/sortByDelay.ts +29 -0
  220. package/src/common/utils/timeUtils.test.js +16 -0
  221. package/src/common/utils/timeUtils.ts +45 -0
  222. package/{iife.js → src/iife.js} +3 -1
  223. package/src/index.js +10 -0
  224. package/{mapbox/controls/CopyrightControl.js → src/mapbox/controls/CopyrightControl.ts} +26 -21
  225. package/src/mapbox/layers/Layer.test.js +217 -0
  226. package/src/mapbox/layers/Layer.ts +144 -0
  227. package/src/mapbox/layers/RealtimeLayer.test.js +13 -0
  228. package/src/mapbox/layers/RealtimeLayer.ts +350 -0
  229. package/src/mapbox/utils/getMercatorResolution.ts +21 -0
  230. package/src/mapbox/utils/getSourceCoordinates.ts +34 -0
  231. package/src/ol/README.md +0 -0
  232. package/src/ol/controls/CopyrightControl.test.js +211 -0
  233. package/src/ol/controls/CopyrightControl.ts +82 -0
  234. package/src/ol/controls/RoutingControl.test.js +205 -0
  235. package/src/ol/controls/RoutingControl.ts +869 -0
  236. package/src/ol/controls/StopFinderControl.test.js +59 -0
  237. package/{ol/controls/StopFinderControl.js → src/ol/controls/StopFinderControl.ts} +10 -7
  238. package/src/ol/controls/snapshots/RoutingControlRouteGen10.json +58 -0
  239. package/src/ol/controls/snapshots/RoutingControlRouteGen100.json +292 -0
  240. package/src/ol/controls/snapshots/RoutingControlRouteGen30.json +69 -0
  241. package/src/ol/controls/snapshots/RoutingControlRouteGen5.json +58 -0
  242. package/src/ol/controls/snapshots/RoutingControlRouteOSM.json +759 -0
  243. package/src/ol/controls/snapshots/RoutingControlStation1.json +60 -0
  244. package/src/ol/controls/snapshots/RoutingControlStation2.json +49 -0
  245. package/src/ol/layers/Layer.test.js +212 -0
  246. package/src/ol/layers/Layer.ts +252 -0
  247. package/src/ol/layers/MapGlLayer.ts +294 -0
  248. package/src/ol/layers/MapboxLayer.test.js +190 -0
  249. package/src/ol/layers/MapboxLayer.ts +136 -0
  250. package/src/ol/layers/MapboxStyleLayer.test.js +258 -0
  251. package/src/ol/layers/MapboxStyleLayer.ts +466 -0
  252. package/{ol/layers/MaplibreLayer.d.ts → src/ol/layers/MaplibreLayer.ts} +21 -10
  253. package/src/ol/layers/RealtimeLayer.test.js +84 -0
  254. package/src/ol/layers/RealtimeLayer.ts +465 -0
  255. package/src/ol/layers/RoutingLayer.test.js +48 -0
  256. package/src/ol/layers/RoutingLayer.ts +113 -0
  257. package/src/ol/layers/VectorLayer.test.js +87 -0
  258. package/src/ol/layers/VectorLayer.ts +48 -0
  259. package/src/ol/layers/WMSLayer.test.js +65 -0
  260. package/src/ol/layers/WMSLayer.ts +114 -0
  261. package/src/ol/styles/fullTrajectoryDelayStyle.ts +37 -0
  262. package/src/ol/styles/fullTrajectoryStyle.ts +56 -0
  263. package/{setupTests.js → src/setupTests.js} +12 -7
  264. package/tsconfig.json +23 -0
  265. package/api/RealtimeAPI.d.ts +0 -290
  266. package/api/RealtimeAPI.d.ts.map +0 -1
  267. package/api/RealtimeAPI.js +0 -483
  268. package/api/RoutingAPI.d.ts +0 -37
  269. package/api/RoutingAPI.d.ts.map +0 -1
  270. package/api/RoutingAPI.js +0 -35
  271. package/api/StopsAPI.d.ts +0 -38
  272. package/api/StopsAPI.d.ts.map +0 -1
  273. package/api/StopsAPI.js +0 -36
  274. package/api/index.d.ts +0 -4
  275. package/api/index.d.ts.map +0 -1
  276. package/api/typedefs.d.ts +0 -179
  277. package/api/typedefs.d.ts.map +0 -1
  278. package/common/api/HttpAPI.d.ts +0 -31
  279. package/common/api/HttpAPI.d.ts.map +0 -1
  280. package/common/api/HttpAPI.js +0 -57
  281. package/common/api/WebSocketAPI.d.ts +0 -153
  282. package/common/api/WebSocketAPI.d.ts.map +0 -1
  283. package/common/api/WebSocketAPI.js +0 -341
  284. package/common/controls/ControlCommon.d.ts +0 -76
  285. package/common/controls/ControlCommon.d.ts.map +0 -1
  286. package/common/controls/ControlCommon.js +0 -150
  287. package/common/controls/CopyrightControlCommon.d.ts +0 -13
  288. package/common/controls/CopyrightControlCommon.d.ts.map +0 -1
  289. package/common/controls/CopyrightControlCommon.js +0 -34
  290. package/common/controls/StopFinderControlCommon.d.ts +0 -55
  291. package/common/controls/StopFinderControlCommon.d.ts.map +0 -1
  292. package/common/controls/StopFinderControlCommon.js +0 -144
  293. package/common/index.d.ts +0 -3
  294. package/common/index.d.ts.map +0 -1
  295. package/common/layers/LayerCommon.d.ts +0 -94
  296. package/common/layers/LayerCommon.d.ts.map +0 -1
  297. package/common/layers/LayerCommon.js +0 -244
  298. package/common/mixins/RealtimeLayerMixin.d.ts +0 -288
  299. package/common/mixins/RealtimeLayerMixin.d.ts.map +0 -1
  300. package/common/mixins/RealtimeLayerMixin.js +0 -779
  301. package/common/mixins/UserInteractionsLayerMixin.d.ts +0 -60
  302. package/common/mixins/UserInteractionsLayerMixin.d.ts.map +0 -1
  303. package/common/mixins/UserInteractionsLayerMixin.js +0 -241
  304. package/common/styles/index.d.ts +0 -5
  305. package/common/styles/index.d.ts.map +0 -1
  306. package/common/styles/realtimeDefaultStyle.d.ts +0 -36
  307. package/common/styles/realtimeDefaultStyle.d.ts.map +0 -1
  308. package/common/styles/realtimeDefaultStyle.js +0 -276
  309. package/common/styles/realtimeDelayStyle.d.ts +0 -12
  310. package/common/styles/realtimeDelayStyle.d.ts.map +0 -1
  311. package/common/styles/realtimeDelayStyle.js +0 -13
  312. package/common/styles/realtimeHeadingStyle.d.ts +0 -12
  313. package/common/styles/realtimeHeadingStyle.d.ts.map +0 -1
  314. package/common/styles/realtimeHeadingStyle.js +0 -87
  315. package/common/styles/realtimeSimpleStyle.d.ts +0 -4
  316. package/common/styles/realtimeSimpleStyle.d.ts.map +0 -1
  317. package/common/styles/realtimeSimpleStyle.js +0 -23
  318. package/common/typedefs.d.ts +0 -183
  319. package/common/typedefs.d.ts.map +0 -1
  320. package/common/utils/compareDepartures.d.ts +0 -11
  321. package/common/utils/compareDepartures.d.ts.map +0 -1
  322. package/common/utils/compareDepartures.js +0 -35
  323. package/common/utils/createCanvas.d.ts +0 -11
  324. package/common/utils/createCanvas.d.ts.map +0 -1
  325. package/common/utils/createCanvas.js +0 -28
  326. package/common/utils/createRealtimeFilters.d.ts +0 -13
  327. package/common/utils/createRealtimeFilters.d.ts.map +0 -1
  328. package/common/utils/createRealtimeFilters.js +0 -74
  329. package/common/utils/debounceDeparturesMessages.d.ts +0 -13
  330. package/common/utils/debounceDeparturesMessages.d.ts.map +0 -1
  331. package/common/utils/debounceDeparturesMessages.js +0 -28
  332. package/common/utils/debounceWebsocketMessages.d.ts +0 -12
  333. package/common/utils/debounceWebsocketMessages.d.ts.map +0 -1
  334. package/common/utils/debounceWebsocketMessages.js +0 -30
  335. package/common/utils/getLayersAsFlatArray.d.ts +0 -4
  336. package/common/utils/getLayersAsFlatArray.d.ts.map +0 -1
  337. package/common/utils/getLayersAsFlatArray.js +0 -16
  338. package/common/utils/getMapboxMapCopyrights.d.ts +0 -18
  339. package/common/utils/getMapboxMapCopyrights.d.ts.map +0 -1
  340. package/common/utils/getMapboxMapCopyrights.js +0 -30
  341. package/common/utils/getMapboxRender.d.ts +0 -8
  342. package/common/utils/getMapboxRender.d.ts.map +0 -1
  343. package/common/utils/getMapboxRender.js +0 -88
  344. package/common/utils/getMaplibreRender.d.ts +0 -9
  345. package/common/utils/getMaplibreRender.d.ts.map +0 -1
  346. package/common/utils/getMaplibreRender.js +0 -40
  347. package/common/utils/getRealtimeModeSuffix.d.ts.map +0 -1
  348. package/common/utils/getRealtimeModeSuffix.js +0 -7
  349. package/common/utils/getUrlWithParams.d.ts +0 -9
  350. package/common/utils/getUrlWithParams.d.ts.map +0 -1
  351. package/common/utils/getUrlWithParams.js +0 -18
  352. package/common/utils/getVehiclePosition.d.ts +0 -16
  353. package/common/utils/getVehiclePosition.d.ts.map +0 -1
  354. package/common/utils/getVehiclePosition.js +0 -72
  355. package/common/utils/index.d.ts +0 -18
  356. package/common/utils/index.d.ts.map +0 -1
  357. package/common/utils/realtimeConfig.d.ts +0 -53
  358. package/common/utils/realtimeConfig.d.ts.map +0 -1
  359. package/common/utils/realtimeConfig.js +0 -202
  360. package/common/utils/removeDuplicate.d.ts +0 -10
  361. package/common/utils/removeDuplicate.d.ts.map +0 -1
  362. package/common/utils/removeDuplicate.js +0 -15
  363. package/common/utils/renderTrajectories.d.ts +0 -17
  364. package/common/utils/renderTrajectories.d.ts.map +0 -1
  365. package/common/utils/renderTrajectories.js +0 -110
  366. package/common/utils/sortAndFilterDepartures.d.ts +0 -16
  367. package/common/utils/sortAndFilterDepartures.d.ts.map +0 -1
  368. package/common/utils/sortAndFilterDepartures.js +0 -58
  369. package/common/utils/sortByDelay.d.ts +0 -4
  370. package/common/utils/sortByDelay.d.ts.map +0 -1
  371. package/common/utils/sortByDelay.js +0 -21
  372. package/common/utils/timeUtils.d.ts +0 -24
  373. package/common/utils/timeUtils.d.ts.map +0 -1
  374. package/common/utils/timeUtils.js +0 -39
  375. package/iife.d.ts +0 -3
  376. package/iife.d.ts.map +0 -1
  377. package/index.d.ts +0 -10
  378. package/index.d.ts.map +0 -1
  379. package/index.js +0 -10
  380. package/mapbox/controls/CopyrightControl.d.ts +0 -29
  381. package/mapbox/controls/CopyrightControl.d.ts.map +0 -1
  382. package/mapbox/controls/index.d.ts +0 -2
  383. package/mapbox/controls/index.d.ts.map +0 -1
  384. package/mapbox/index.d.ts +0 -6
  385. package/mapbox/index.d.ts.map +0 -1
  386. package/mapbox/layers/Layer.d.ts +0 -59
  387. package/mapbox/layers/Layer.d.ts.map +0 -1
  388. package/mapbox/layers/Layer.js +0 -101
  389. package/mapbox/layers/RealtimeLayer.d.ts +0 -180
  390. package/mapbox/layers/RealtimeLayer.d.ts.map +0 -1
  391. package/mapbox/layers/RealtimeLayer.js +0 -270
  392. package/mapbox/layers/index.d.ts +0 -3
  393. package/mapbox/layers/index.d.ts.map +0 -1
  394. package/mapbox/utils/getMercatorResolution.d.ts +0 -9
  395. package/mapbox/utils/getMercatorResolution.d.ts.map +0 -1
  396. package/mapbox/utils/getMercatorResolution.js +0 -18
  397. package/mapbox/utils/getSourceCoordinates.d.ts +0 -9
  398. package/mapbox/utils/getSourceCoordinates.d.ts.map +0 -1
  399. package/mapbox/utils/getSourceCoordinates.js +0 -27
  400. package/mapbox/utils/index.d.ts +0 -3
  401. package/mapbox/utils/index.d.ts.map +0 -1
  402. package/mbt.js +0 -64706
  403. package/mbt.js.map +0 -7
  404. package/mbt.min.js +0 -1090
  405. package/mbt.min.js.map +0 -7
  406. package/ol/controls/CopyrightControl.d.ts +0 -31
  407. package/ol/controls/CopyrightControl.d.ts.map +0 -1
  408. package/ol/controls/CopyrightControl.js +0 -68
  409. package/ol/controls/RoutingControl.d.ts +0 -193
  410. package/ol/controls/RoutingControl.d.ts.map +0 -1
  411. package/ol/controls/RoutingControl.js +0 -631
  412. package/ol/controls/StopFinderControl.d.ts +0 -30
  413. package/ol/controls/StopFinderControl.d.ts.map +0 -1
  414. package/ol/controls/index.d.ts +0 -4
  415. package/ol/controls/index.d.ts.map +0 -1
  416. package/ol/index.d.ts +0 -6
  417. package/ol/index.d.ts.map +0 -1
  418. package/ol/layers/Layer.d.ts +0 -86
  419. package/ol/layers/Layer.d.ts.map +0 -1
  420. package/ol/layers/Layer.js +0 -174
  421. package/ol/layers/MapGlLayer.d.ts +0 -67
  422. package/ol/layers/MapGlLayer.d.ts.map +0 -1
  423. package/ol/layers/MapGlLayer.js +0 -218
  424. package/ol/layers/MapboxLayer.d.ts +0 -50
  425. package/ol/layers/MapboxLayer.d.ts.map +0 -1
  426. package/ol/layers/MapboxLayer.js +0 -109
  427. package/ol/layers/MapboxStyleLayer.d.ts +0 -130
  428. package/ol/layers/MapboxStyleLayer.d.ts.map +0 -1
  429. package/ol/layers/MapboxStyleLayer.js +0 -378
  430. package/ol/layers/MaplibreLayer.d.ts.map +0 -1
  431. package/ol/layers/MaplibreLayer.js +0 -34
  432. package/ol/layers/RealtimeLayer.d.ts +0 -202
  433. package/ol/layers/RealtimeLayer.d.ts.map +0 -1
  434. package/ol/layers/RealtimeLayer.js +0 -332
  435. package/ol/layers/RoutingLayer.d.ts +0 -35
  436. package/ol/layers/RoutingLayer.d.ts.map +0 -1
  437. package/ol/layers/RoutingLayer.js +0 -85
  438. package/ol/layers/VectorLayer.d.ts +0 -25
  439. package/ol/layers/VectorLayer.d.ts.map +0 -1
  440. package/ol/layers/VectorLayer.js +0 -38
  441. package/ol/layers/WMSLayer.d.ts +0 -42
  442. package/ol/layers/WMSLayer.d.ts.map +0 -1
  443. package/ol/layers/WMSLayer.js +0 -88
  444. package/ol/layers/index.d.ts +0 -9
  445. package/ol/layers/index.d.ts.map +0 -1
  446. package/ol/styles/fullTrajectoryDelayStyle.d.ts +0 -4
  447. package/ol/styles/fullTrajectoryDelayStyle.d.ts.map +0 -1
  448. package/ol/styles/fullTrajectoryDelayStyle.js +0 -33
  449. package/ol/styles/fullTrajectoryStyle.d.ts +0 -5
  450. package/ol/styles/fullTrajectoryStyle.d.ts.map +0 -1
  451. package/ol/styles/fullTrajectoryStyle.js +0 -44
  452. package/ol/styles/index.d.ts +0 -3
  453. package/ol/styles/index.d.ts.map +0 -1
  454. package/setupTests.d.ts +0 -2
  455. package/setupTests.d.ts.map +0 -1
  456. /package/{api → src/api}/index.js +0 -0
  457. /package/{common → src/common}/index.js +0 -0
  458. /package/{common → src/common}/styles/index.js +0 -0
  459. /package/{mapbox → src/mapbox}/controls/index.js +0 -0
  460. /package/{mapbox → src/mapbox}/index.js +0 -0
  461. /package/{mapbox → src/mapbox}/layers/index.js +0 -0
  462. /package/{mapbox → src/mapbox}/utils/index.js +0 -0
  463. /package/{ol → src/ol}/controls/index.js +0 -0
  464. /package/{ol → src/ol}/index.js +0 -0
  465. /package/{ol → src/ol}/layers/index.js +0 -0
  466. /package/{ol → src/ol}/styles/index.js +0 -0
  467. /package/{types → src/types}/common.d.ts +0 -0
  468. /package/{types → src/types}/index.d.ts +0 -0
  469. /package/{types → src/types}/realtime.d.ts +0 -0
  470. /package/{types → src/types}/routing.d.ts +0 -0
  471. /package/{types → src/types}/stops.d.ts +0 -0
@@ -0,0 +1,436 @@
1
+ import type {
2
+ RealtimeTrajectory,
3
+ ViewState,
4
+ StyleCache,
5
+ RealtimeStyleOptions,
6
+ RealtimeStyleFunction,
7
+ } from '../../types';
8
+ import createCanvas from '../utils/createCanvas';
9
+
10
+ /** @private */
11
+ const cacheDelayBg: StyleCache = {};
12
+
13
+ /**
14
+ * Draw circle delay background
15
+ *
16
+ * @private
17
+ */
18
+ export const getDelayBgCanvas = (
19
+ origin: number,
20
+ radius: number,
21
+ color: string,
22
+ ) => {
23
+ const key = `${origin}, ${radius}, ${color}`;
24
+ if (!cacheDelayBg[key]) {
25
+ const canvas = createCanvas(origin * 2, origin * 2);
26
+ if (canvas) {
27
+ const ctx = canvas.getContext('2d');
28
+ if (!ctx) {
29
+ return null;
30
+ }
31
+ ctx.beginPath();
32
+ ctx.arc(origin, origin, radius, 0, 2 * Math.PI, false);
33
+ ctx.fillStyle = color;
34
+ ctx.filter = 'blur(1px)';
35
+ ctx.fill();
36
+ cacheDelayBg[key] = canvas;
37
+ }
38
+ }
39
+ return cacheDelayBg[key];
40
+ };
41
+
42
+ /** @private */
43
+ const cacheDelayText: StyleCache = {};
44
+
45
+ /**
46
+ * Draw delay text
47
+ *
48
+ * @private
49
+ */
50
+ export const getDelayTextCanvas = (
51
+ text: string,
52
+ fontSize: number,
53
+ font: string,
54
+ delayColor: string,
55
+ delayOutlineColor: string = '#000',
56
+ pixelRatio: number = 1,
57
+ ) => {
58
+ const key = `${text}, ${font}, ${delayColor}, ${delayOutlineColor}, ${pixelRatio}`;
59
+ if (!cacheDelayText[key]) {
60
+ const canvas = createCanvas(
61
+ Math.ceil(text.length * fontSize),
62
+ Math.ceil(fontSize + 8 * pixelRatio),
63
+ );
64
+ if (canvas) {
65
+ const ctx = canvas.getContext('2d') as CanvasRenderingContext2D;
66
+ if (!ctx) {
67
+ return null;
68
+ }
69
+ ctx.font = font;
70
+ ctx.textAlign = 'left';
71
+ ctx.textBaseline = 'middle';
72
+ ctx.font = font;
73
+ ctx.fillStyle = delayColor;
74
+ ctx.strokeStyle = delayOutlineColor;
75
+ ctx.lineWidth = 1.5 * pixelRatio;
76
+ ctx.strokeText(text, 0, fontSize);
77
+ ctx.fillText(text, 0, fontSize);
78
+ cacheDelayText[key] = canvas;
79
+ }
80
+ }
81
+ return cacheDelayText[key];
82
+ };
83
+
84
+ /** @private */
85
+ const cacheCircle: StyleCache = {};
86
+
87
+ /**
88
+ * Draw colored circle with black border
89
+ *
90
+ * @private
91
+ */
92
+ export const getCircleCanvas = (
93
+ origin: number,
94
+ radius: number,
95
+ color: string,
96
+ hasStroke: boolean,
97
+ hasDash: boolean,
98
+ pixelRatio: number,
99
+ ) => {
100
+ const key = `${origin}, ${radius}, ${color}, ${hasStroke}, ${hasDash}, ${pixelRatio}`;
101
+ if (!cacheCircle[key]) {
102
+ const canvas = createCanvas(origin * 2, origin * 2);
103
+ if (canvas) {
104
+ const ctx = canvas.getContext('2d');
105
+ if (!ctx) {
106
+ return null;
107
+ }
108
+ ctx.fillStyle = color;
109
+
110
+ if (hasStroke) {
111
+ ctx.lineWidth = 1 * pixelRatio;
112
+ ctx.strokeStyle = '#000000';
113
+ }
114
+
115
+ ctx.beginPath();
116
+ ctx.arc(origin, origin, radius, 0, 2 * Math.PI, false);
117
+ ctx.fill();
118
+
119
+ if (hasDash) {
120
+ ctx.setLineDash([5, 3]);
121
+ }
122
+
123
+ if (hasStroke) {
124
+ ctx.stroke();
125
+ }
126
+
127
+ cacheCircle[key] = canvas;
128
+ }
129
+ }
130
+ return cacheCircle[key];
131
+ };
132
+
133
+ /** @private */
134
+ const cacheText: StyleCache = {};
135
+
136
+ /**
137
+ * Draw text in the circle
138
+ *
139
+ * @private
140
+ */
141
+ export const getTextCanvas = (
142
+ text: string,
143
+ origin: number,
144
+ textSize: number,
145
+ fillColor: string,
146
+ strokeColor: string,
147
+ hasStroke: boolean,
148
+ pixelRatio: number,
149
+ getTextFont: (fontSize: number, text?: string) => string,
150
+ ) => {
151
+ const key = `${text}, ${origin}, ${textSize}, ${fillColor},${strokeColor}, ${hasStroke}, ${pixelRatio}`;
152
+ if (!cacheText[key]) {
153
+ const canvas = createCanvas(origin * 2, origin * 2);
154
+ if (canvas) {
155
+ const ctx = canvas.getContext('2d');
156
+ if (!ctx) {
157
+ return null;
158
+ }
159
+
160
+ // Draw a stroke to the text only if a provider provides realtime but we don't use it.
161
+ if (hasStroke) {
162
+ ctx.save();
163
+ ctx.textBaseline = 'middle';
164
+ ctx.textAlign = 'center';
165
+ ctx.font = getTextFont(textSize + 2, text);
166
+ ctx.strokeStyle = strokeColor;
167
+ ctx.strokeText(text, origin, origin);
168
+ ctx.restore();
169
+ }
170
+
171
+ // Draw a text
172
+ ctx.textBaseline = 'middle';
173
+ ctx.textAlign = 'center';
174
+ ctx.fillStyle = fillColor;
175
+ ctx.font = getTextFont(textSize, text);
176
+ ctx.strokeStyle = strokeColor;
177
+ ctx.strokeText(text, origin, origin);
178
+ ctx.fillText(text, origin, origin);
179
+
180
+ cacheText[key] = canvas;
181
+ }
182
+ }
183
+ return cacheText[key];
184
+ };
185
+
186
+ /** @private */
187
+ const cache: StyleCache = {};
188
+
189
+ /**
190
+ * A tracker style that take in account the delay.
191
+ *
192
+ * @param {RealtimeTrajectory} trajectory The trajectory to render.
193
+ * @param {ViewState} viewState The view state of the map.
194
+ * @param {RealtimeStyleOptions} options Some options to change the rendering
195
+ * @return a canvas
196
+ */
197
+ const realtimeDefaultStyle: RealtimeStyleFunction = (
198
+ trajectory: RealtimeTrajectory,
199
+ viewState: ViewState,
200
+ options: RealtimeStyleOptions,
201
+ ) => {
202
+ const {
203
+ hoverVehicleId,
204
+ selectedVehicleId,
205
+ useDelayStyle,
206
+ delayOutlineColor = '#000',
207
+ delayDisplay = 300000,
208
+ getRadius = () => 0,
209
+ getBgColor = () => '#000',
210
+ getDelayColor = () => '#000',
211
+ getDelayText = () => null,
212
+ getDelayFont = (fontSize: number) => `bold ${fontSize}px arial, sans-serif`,
213
+ getText = (text?: string) => text,
214
+ getTextFont = (fontSize: number) => `bold ${fontSize}px arial, sans-serif`,
215
+ getTextColor = () => '#000',
216
+ getTextSize = () => 14,
217
+ getMaxRadiusForText = () => 10,
218
+ getMaxRadiusForStrokeAndDelay = () => 7,
219
+ } = options;
220
+
221
+ const { zoom, pixelRatio = 1 } = viewState;
222
+ let { type } = trajectory.properties;
223
+ const {
224
+ train_id: id,
225
+ line,
226
+ delay,
227
+ state,
228
+ operator_provides_realtime_journey: operatorProvidesRealtime,
229
+ } = trajectory.properties;
230
+ let { name, text_color: textColor, color } = line || {};
231
+
232
+ name = getText(name);
233
+
234
+ const cancelled = state === 'JOURNEY_CANCELLED';
235
+
236
+ if (!type) {
237
+ type = 'Rail';
238
+ }
239
+
240
+ if (!name) {
241
+ name = 'I';
242
+ }
243
+
244
+ if (!textColor) {
245
+ textColor = '#000000';
246
+ }
247
+
248
+ if (color && color[0] !== '#') {
249
+ color = `#${color}`;
250
+ }
251
+
252
+ if (textColor[0] !== '#') {
253
+ textColor = `#${textColor}`;
254
+ }
255
+
256
+ const z = Math.min(Math.floor(zoom || 1), 16);
257
+ const hover = !!(hoverVehicleId && hoverVehicleId === id);
258
+ const selected = !!(selectedVehicleId && selectedVehicleId === id);
259
+
260
+ // Calcul the radius of the circle
261
+ let radius = getRadius(type, z) * pixelRatio;
262
+ const isDisplayStrokeAndDelay =
263
+ radius >= getMaxRadiusForStrokeAndDelay() * pixelRatio;
264
+
265
+ if (hover || selected) {
266
+ radius = isDisplayStrokeAndDelay
267
+ ? radius + 5 * pixelRatio
268
+ : 14 * pixelRatio;
269
+ }
270
+ const isDisplayText = radius > getMaxRadiusForText() * pixelRatio;
271
+
272
+ // Optimize the cache key, very important in high zoom level
273
+ let key = `${radius}${hover || selected}`;
274
+
275
+ if (useDelayStyle) {
276
+ key += `${operatorProvidesRealtime}${delay}`;
277
+
278
+ if (isDisplayStrokeAndDelay) {
279
+ key += `${cancelled}`;
280
+ }
281
+ } else {
282
+ key += `${color || type}`;
283
+
284
+ if (isDisplayStrokeAndDelay) {
285
+ key += `${cancelled}${delay}`;
286
+ }
287
+ }
288
+
289
+ if (isDisplayText) {
290
+ key += `${name}${textColor}`;
291
+ }
292
+
293
+ if (!cache[key]) {
294
+ if (radius === 0) {
295
+ return null;
296
+ }
297
+
298
+ const margin = 1 * pixelRatio;
299
+ const radiusDelay = radius + 2 * pixelRatio;
300
+ const markerSize = radius * 2;
301
+ const size = radiusDelay * 2 + margin * 2;
302
+ const origin = size / 2;
303
+
304
+ // Draw circle delay background
305
+ let delayBg = null;
306
+ if (isDisplayStrokeAndDelay && delay !== null) {
307
+ delayBg = getDelayBgCanvas(
308
+ origin,
309
+ radiusDelay,
310
+ getDelayColor(delay, cancelled),
311
+ );
312
+ }
313
+
314
+ // Show delay if feature is hovered or if delay is above 5mins.
315
+ let delayText = null;
316
+ let fontSize = 0;
317
+ if (
318
+ isDisplayStrokeAndDelay &&
319
+ (hover || (delay || 0) >= delayDisplay || cancelled)
320
+ ) {
321
+ // Draw delay text
322
+ fontSize =
323
+ Math.max(
324
+ cancelled ? 19 : 14,
325
+ Math.min(cancelled ? 19 : 17, radius * 1.2),
326
+ ) * pixelRatio;
327
+ const text = getDelayText(delay, cancelled);
328
+
329
+ if (text) {
330
+ delayText = getDelayTextCanvas(
331
+ text,
332
+ fontSize,
333
+ getDelayFont(fontSize, text),
334
+ getDelayColor(delay, cancelled, true),
335
+ delayOutlineColor,
336
+ pixelRatio,
337
+ );
338
+ }
339
+ }
340
+
341
+ // Draw colored circle with black border
342
+ let circleFillColor;
343
+ if (useDelayStyle) {
344
+ circleFillColor = getDelayColor(delay, cancelled);
345
+ } else {
346
+ circleFillColor = color || getBgColor(type);
347
+ }
348
+
349
+ const hasStroke = isDisplayStrokeAndDelay || hover || selected;
350
+
351
+ const hasDash =
352
+ !!isDisplayStrokeAndDelay &&
353
+ !!useDelayStyle &&
354
+ delay === null &&
355
+ operatorProvidesRealtime === 'yes';
356
+
357
+ const circle = getCircleCanvas(
358
+ origin,
359
+ radius,
360
+ circleFillColor,
361
+ hasStroke,
362
+ hasDash,
363
+ pixelRatio,
364
+ );
365
+
366
+ // Create the canvas
367
+ const width = size + (delayText?.width || 0) * 2;
368
+ const height = size;
369
+ const canvas = createCanvas(width, height);
370
+ if (canvas) {
371
+ const ctx = canvas.getContext('2d') as CanvasRenderingContext2D;
372
+ if (!ctx) {
373
+ return null;
374
+ }
375
+
376
+ // The renderTrajectories will center the image on the vehicle positions.
377
+ const originX = delayText?.width || 0;
378
+
379
+ if (delayBg) {
380
+ ctx.drawImage(delayBg, originX, 0);
381
+ }
382
+
383
+ if (circle) {
384
+ ctx.drawImage(circle, originX, 0);
385
+ }
386
+
387
+ // Draw text in the circle
388
+ let circleText = null;
389
+ if (isDisplayText) {
390
+ const fontSize2 = Math.max(radius, 10);
391
+ const textSize = getTextSize(
392
+ ctx,
393
+ markerSize,
394
+ name,
395
+ fontSize2,
396
+ getTextFont,
397
+ );
398
+ const textColor2 = !useDelayStyle
399
+ ? textColor || getTextColor(type)
400
+ : '#000000';
401
+ const hasStroke2 =
402
+ !!useDelayStyle &&
403
+ delay === null &&
404
+ operatorProvidesRealtime === 'yes';
405
+
406
+ circleText = getTextCanvas(
407
+ name,
408
+ origin,
409
+ textSize,
410
+ textColor2,
411
+ circleFillColor,
412
+ hasStroke2,
413
+ pixelRatio,
414
+ getTextFont,
415
+ );
416
+ }
417
+
418
+ if (circleText) {
419
+ ctx.drawImage(circleText, originX, 0);
420
+ }
421
+
422
+ if (delayText) {
423
+ ctx.drawImage(
424
+ delayText,
425
+ originX + Math.ceil(origin + radiusDelay) + margin,
426
+ Math.ceil(origin - fontSize),
427
+ );
428
+ }
429
+
430
+ cache[key] = canvas;
431
+ }
432
+ }
433
+
434
+ return cache[key];
435
+ };
436
+ export default realtimeDefaultStyle;
@@ -0,0 +1,27 @@
1
+ import realtimeDefaultStyle from './realtimeDefaultStyle';
2
+
3
+ import type {
4
+ RealtimeTrajectory,
5
+ ViewState,
6
+ RealtimeStyleOptions,
7
+ RealtimeStyleFunction,
8
+ } from '../../types';
9
+ /**
10
+ * A tracker style that display the delay as backgroundColor.
11
+ *
12
+ * @param {*} trajectory The trajectory to render.
13
+ * @param {*} viewState The view state of the map.
14
+ * @param {*} options Some options to change the rendering
15
+ * @return a canvas
16
+ */
17
+ const realtimeDelayStyle: RealtimeStyleFunction = (
18
+ trajectory: RealtimeTrajectory,
19
+ viewState: ViewState,
20
+ options: RealtimeStyleOptions,
21
+ ) => {
22
+ return realtimeDefaultStyle(trajectory, viewState, {
23
+ ...options,
24
+ useDelayStyle: true,
25
+ });
26
+ };
27
+ export default realtimeDelayStyle;
@@ -0,0 +1,138 @@
1
+ import type {
2
+ RealtimeTrajectory,
3
+ ViewState,
4
+ RealtimeStyleOptions,
5
+ RealtimeStyleFunction,
6
+ AnyCanvas,
7
+ } from '../../types';
8
+ import createCanvas from '../utils/createCanvas';
9
+ import { getBgColor } from '../utils/realtimeConfig';
10
+ import realtimeDefaultStyle from './realtimeDefaultStyle';
11
+
12
+ /** @private */
13
+ const rotateCanvas = (canvas: AnyCanvas, rotation: number) => {
14
+ const ctx = canvas.getContext('2d');
15
+ ctx?.translate(canvas.width / 2, canvas.height / 2);
16
+ ctx?.rotate(rotation);
17
+ ctx?.translate(-canvas.width / 2, -canvas.height / 2);
18
+ };
19
+
20
+ /** @private */
21
+ const arrowCache: {
22
+ [key: string]: AnyCanvas | null;
23
+ } = {};
24
+
25
+ /** @private */
26
+ const getArrowCanvas = (fillColor: string): AnyCanvas | null => {
27
+ const key = `${fillColor}`;
28
+ if (!arrowCache[key]) {
29
+ // Create the arrow canvas
30
+ const arrowCanvas = createCanvas(20, 20);
31
+ const ctx = arrowCanvas?.getContext('2d');
32
+ if (ctx) {
33
+ ctx.fillStyle = fillColor;
34
+ ctx.beginPath();
35
+ ctx.moveTo(5, 5);
36
+ ctx.lineTo(10, 10);
37
+ ctx.lineTo(5, 15);
38
+ ctx.fill();
39
+ ctx.beginPath();
40
+ ctx.moveTo(5, 5);
41
+ ctx.lineTo(10, 10);
42
+ ctx.lineTo(5, 15);
43
+ ctx.lineTo(5, 5);
44
+ ctx.stroke();
45
+ }
46
+ arrowCache[key] = arrowCanvas;
47
+ }
48
+
49
+ return arrowCache[key];
50
+ };
51
+
52
+ /** @private */
53
+ const bufferArrowCache: {
54
+ [key: string]: AnyCanvas | null;
55
+ } = {};
56
+
57
+ /** @private */
58
+ const getBufferArrowCanvas = (
59
+ canvas: AnyCanvas,
60
+ fillColor: string,
61
+ rotation: number,
62
+ ): AnyCanvas | null => {
63
+ const margin = 20;
64
+ const bufferKey = `${fillColor},${canvas.width},${canvas.height},${rotation}`;
65
+ if (!bufferArrowCache[bufferKey]) {
66
+ // Create a buffer canvas around the current vehicle to display properly the arrow
67
+ const buffer = createCanvas(
68
+ canvas.width + margin * 2,
69
+ canvas.height + margin * 2,
70
+ );
71
+ const arrowCanvas = getArrowCanvas(fillColor);
72
+ if (arrowCanvas && buffer) {
73
+ const bufferCtx = buffer.getContext('2d');
74
+ bufferCtx?.drawImage(
75
+ arrowCanvas,
76
+ buffer.width - margin,
77
+ buffer.height / 2 - arrowCanvas.height / 2,
78
+ arrowCanvas.width,
79
+ arrowCanvas.height,
80
+ );
81
+ bufferCtx?.save();
82
+ const rot = rotation + (90 * Math.PI) / 180;
83
+ rotateCanvas(buffer, -rot);
84
+ bufferCtx?.restore();
85
+ }
86
+
87
+ bufferArrowCache[bufferKey] = buffer;
88
+ }
89
+
90
+ return bufferArrowCache[bufferKey];
91
+ };
92
+
93
+ /**
94
+ * A tracker style that take in account the delay.
95
+ *
96
+ * @param {RealtimeTrajectory} trajectory The trajectory to render.
97
+ * @param {ViewState} viewState The view state of the map.
98
+ * @param {RealtimeStyleOptions} options Some options to change the rendering
99
+ * @return a canvas
100
+ */
101
+ const realtimeHeadingStyle: RealtimeStyleFunction = (
102
+ trajectory: RealtimeTrajectory,
103
+ viewState: ViewState,
104
+ options: RealtimeStyleOptions,
105
+ ) => {
106
+ // @ts-ignore
107
+ const { rotation, type, line } = trajectory.properties;
108
+ const { color } = line || {};
109
+
110
+ const canvas = realtimeDefaultStyle(trajectory, viewState, options);
111
+
112
+ if (canvas && rotation !== null) {
113
+ const circleFillColor = color || getBgColor(type);
114
+ const bufferArrow = getBufferArrowCanvas(canvas, circleFillColor, rotation);
115
+ if (bufferArrow) {
116
+ const bufferSize = (bufferArrow.width - canvas.width) / 2;
117
+ const vehicleWithArrow = createCanvas(
118
+ bufferArrow.width,
119
+ bufferArrow.height,
120
+ );
121
+ vehicleWithArrow
122
+ ?.getContext('2d')
123
+ ?.drawImage(bufferArrow, 0, 0, bufferArrow.width, bufferArrow.height);
124
+ vehicleWithArrow
125
+ ?.getContext('2d')
126
+ ?.drawImage(
127
+ canvas,
128
+ bufferSize,
129
+ bufferSize,
130
+ canvas.width,
131
+ canvas.height,
132
+ );
133
+ return vehicleWithArrow;
134
+ }
135
+ }
136
+ return canvas;
137
+ };
138
+ export default realtimeHeadingStyle;
@@ -0,0 +1,25 @@
1
+ import type { AnyCanvas, RealtimeStyleFunction } from '../../types';
2
+ import createCanvas from '../utils/createCanvas';
3
+
4
+ /**
5
+ * A very simple tracker style.
6
+ * Display blue point for each train.
7
+ */
8
+ let canvas: AnyCanvas | null;
9
+ const realtimeSimpleStyle: RealtimeStyleFunction = () => {
10
+ if (!canvas) {
11
+ canvas = createCanvas(15, 15);
12
+ const ctx = canvas?.getContext('2d');
13
+ if (ctx) {
14
+ ctx.arc(8, 8, 5, 0, 2 * Math.PI, false);
15
+ ctx.fillStyle = '#8ED6FF';
16
+ ctx.fill();
17
+ ctx.lineWidth = 3;
18
+ ctx.strokeStyle = 'black';
19
+ ctx.stroke();
20
+ ctx.lineWidth = 3;
21
+ }
22
+ }
23
+ return canvas;
24
+ };
25
+ export default realtimeSimpleStyle;
@@ -55,5 +55,5 @@
55
55
  * @property {number!} rotation An angle in radians representing the direction (from the true north) towards which the vehicle is facing.
56
56
  */
57
57
  // These lines is to block TypeScript to add "use strict;" in the outputed file.
58
- const dummy = () => { };
58
+ const dummy = () => {};
59
59
  export default dummy;
@@ -0,0 +1,46 @@
1
+ import { RealtimeDeparture } from '../../types';
2
+
3
+ /**
4
+ * Compare two given departures for sort alogithm,
5
+ * @param {Departure} a First departure.
6
+ * @param {Departure} b Second departure.
7
+ * @param {boolean} [sortByMinArrivalTime=false] Sort departures by arrival time.
8
+ * @private
9
+ */
10
+ const compareDepartures = (
11
+ a: RealtimeDeparture,
12
+ b: RealtimeDeparture,
13
+ sortByMinArrivalTime: boolean = false,
14
+ ): number => {
15
+ // First LEAVING and HIDDEN, then BOARDING and then sorted by time.
16
+ const topStates = ['HIDDEN', 'LEAVING', 'BOARDING'];
17
+ const aTop = a.has_fzo && topStates.indexOf(a.state) > -1;
18
+ const bTop = b.has_fzo && topStates.indexOf(b.state) > -1;
19
+
20
+ if (aTop || bTop) {
21
+ if (aTop !== bTop) {
22
+ return aTop ? -1 : 1;
23
+ }
24
+
25
+ if (a.state !== b.state) {
26
+ // one is leaving
27
+ return topStates.indexOf(a.state) - topStates.indexOf(b.state);
28
+ }
29
+ }
30
+
31
+ let aDuration = null;
32
+ let bDuration = null;
33
+ const now = Date.now();
34
+
35
+ if (sortByMinArrivalTime) {
36
+ aDuration = new Date(a.min_arrival_time || a.time).getTime() - now;
37
+ bDuration = new Date(b.min_arrival_time || b.time).getTime() - now;
38
+ } else {
39
+ aDuration = new Date(a.time).getTime() - now;
40
+ bDuration = new Date(b.time).getTime() - now;
41
+ }
42
+
43
+ return aDuration - bDuration;
44
+ };
45
+
46
+ export default compareDepartures;
@@ -0,0 +1,33 @@
1
+ import { AnyCanvas } from '../../types';
2
+
3
+ /**
4
+ * This function try to create a canvas element and return it.
5
+ * it uses document.createElement('canvas') if document is available
6
+ * or new OffscreenCanvas(width, height) if OffscreenCanvas is avalaible (for web worker)
7
+ * or it returns null if neither is available.
8
+ * @private
9
+ */
10
+ const createCanvas = (width: number, height: number): AnyCanvas | null => {
11
+ let canvas = null;
12
+
13
+ // Prevent SSR errors
14
+ if (typeof window === 'undefined') {
15
+ return null;
16
+ }
17
+
18
+ if (typeof document !== 'undefined' && document?.createElement) {
19
+ canvas = document.createElement('canvas');
20
+ canvas.width = width;
21
+ canvas.height = height;
22
+ } else if (OffscreenCanvas) {
23
+ canvas = new OffscreenCanvas(width, height);
24
+ } else {
25
+ // eslint-disable-next-line no-console
26
+ console.error(
27
+ "We didn't find a way to create a canvas element, document.createElement('canvas') and new OffscrenCanvas() are not supported",
28
+ );
29
+ }
30
+ return canvas;
31
+ };
32
+
33
+ export default createCanvas;