mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-10-19 05:26: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.
26 lines
1.1 KiB
JavaScript
26 lines
1.1 KiB
JavaScript
import { createRequire } from 'node:module';
|
|
import path from 'node:path';
|
|
|
|
/**
|
|
* setRTLTextPlugin() takes the URL of a classic script that the GL worker pulls in
|
|
* with importScripts. mapbox-gl-rtl-text ships exactly that as
|
|
* dist/mapbox-gl-rtl-text.js, but its "exports" field publishes only the ESM/WASM
|
|
* entry, so the resolver refuses the subpath. Resolving the entry it does publish
|
|
* and stepping across to dist keeps this working wherever npm hoists the package.
|
|
*
|
|
* Shared by vite.config.js and vitest.config.ts: the build needs it to emit the
|
|
* asset, and the test run needs it because a lazily imported engine module reaches
|
|
* the same specifier.
|
|
*
|
|
* The pattern is a regex, not a string key: the import carries a `?url` suffix,
|
|
* which a string alias will not match. It is left unanchored on purpose so the
|
|
* query survives the rewrite and Vite still emits an asset URL.
|
|
*/
|
|
export const rtlTextAlias = {
|
|
find: /^@mapbox\/mapbox-gl-rtl-text\/dist\/mapbox-gl-rtl-text\.js/,
|
|
replacement: path.join(
|
|
path.dirname(createRequire(import.meta.url).resolve('@mapbox/mapbox-gl-rtl-text')),
|
|
'../dist/mapbox-gl-rtl-text.js',
|
|
),
|
|
};
|