mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-10-18 21:16:47 +00:00
dc7d1f5e10
Vector basemaps rendered Arabic, Hebrew, Persian and Urdu place names as isolated letters in logical order — "القاهرة" drawn as "ة ر ه ا ق ل ا" — because neither GL engine loads its optional RTL text plugin by default and TREK never registered one. Raster basemaps hid the problem, since their labels are drawn server-side, so it only became visible for everyone when the default basemap became a vector style. Both engine entry points now register the plugin lazily, so the payload is only fetched once a map actually paints RTL text and Latin-only users download nothing. The call is left with each engine because the two signatures genuinely differ: MapLibre takes (url, lazy) and returns a promise, Mapbox takes (url, callback, deferred). The plugin is bundled rather than loaded from a CDN: TREK is offline-first and the production CSP is script-src 'self', so a remote plugin URL would be refused by the worker that imports it. Bundling also puts it in the Workbox precache, so shaping keeps working offline. It needs a resolve alias because the package publishes only its ESM/WASM entry point through "exports" while setRTLTextPlugin requires the classic script in dist/ — the alias is shared by the build and test configs so the two cannot drift.
18 lines
786 B
TypeScript
18 lines
786 B
TypeScript
import mapboxgl from 'mapbox-gl'
|
|
import 'mapbox-gl/dist/mapbox-gl.css'
|
|
import rtlTextPluginUrl from '@mapbox/mapbox-gl-rtl-text/dist/mapbox-gl-rtl-text.js?url'
|
|
import { registerRtlTextPlugin } from '../rtlText'
|
|
|
|
/**
|
|
* The only module in the client that pulls mapbox-gl in at runtime.
|
|
*
|
|
* It has to stay reachable through `import('./engines/mapbox')` and nothing else:
|
|
* a static import from anywhere in the tree drags 1.8 MB into the parent chunk and
|
|
* quietly undoes the split. `npm run check:gl-split` fails on that.
|
|
*/
|
|
// Arabic/Hebrew/Persian labels come out unjoined and reversed without this.
|
|
// Mapbox's signature is (url, callback, deferred) — see rtlText.ts.
|
|
registerRtlTextPlugin(() => mapboxgl.setRTLTextPlugin(rtlTextPluginUrl, null, true))
|
|
|
|
export default mapboxgl
|