@massif-maps/style-tools 6.1.0-rc.1

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 (55) hide show
  1. package/README.md +58 -0
  2. package/dist/cli.js +436 -0
  3. package/dist/cli.js.map +1 -0
  4. package/dist/generated/properties.json +2488 -0
  5. package/dist/legend-svg.js +142 -0
  6. package/dist/legend-svg.js.map +1 -0
  7. package/dist/mapbox2css/browser-host.js +27 -0
  8. package/dist/mapbox2css/browser-host.js.map +1 -0
  9. package/dist/mapbox2css/casing.js +84 -0
  10. package/dist/mapbox2css/casing.js.map +1 -0
  11. package/dist/mapbox2css/config.js +212 -0
  12. package/dist/mapbox2css/config.js.map +1 -0
  13. package/dist/mapbox2css/contour.js +61 -0
  14. package/dist/mapbox2css/contour.js.map +1 -0
  15. package/dist/mapbox2css/coverage.js +56 -0
  16. package/dist/mapbox2css/coverage.js.map +1 -0
  17. package/dist/mapbox2css/emissive.js +192 -0
  18. package/dist/mapbox2css/emissive.js.map +1 -0
  19. package/dist/mapbox2css/expression.js +606 -0
  20. package/dist/mapbox2css/expression.js.map +1 -0
  21. package/dist/mapbox2css/filter.js +285 -0
  22. package/dist/mapbox2css/filter.js.map +1 -0
  23. package/dist/mapbox2css/fold.js +588 -0
  24. package/dist/mapbox2css/fold.js.map +1 -0
  25. package/dist/mapbox2css/host.js +13 -0
  26. package/dist/mapbox2css/host.js.map +1 -0
  27. package/dist/mapbox2css/index.js +3599 -0
  28. package/dist/mapbox2css/index.js.map +1 -0
  29. package/dist/mapbox2css/narrow.js +284 -0
  30. package/dist/mapbox2css/narrow.js.map +1 -0
  31. package/dist/mapbox2css/node-host.js +36 -0
  32. package/dist/mapbox2css/node-host.js.map +1 -0
  33. package/dist/mapbox2css/placement.js +62 -0
  34. package/dist/mapbox2css/placement.js.map +1 -0
  35. package/dist/mapbox2css/png.js +264 -0
  36. package/dist/mapbox2css/png.js.map +1 -0
  37. package/dist/mapbox2css/properties.js +155 -0
  38. package/dist/mapbox2css/properties.js.map +1 -0
  39. package/dist/mapbox2css/schema.js +865 -0
  40. package/dist/mapbox2css/schema.js.map +1 -0
  41. package/dist/mapbox2css/shield.js +118 -0
  42. package/dist/mapbox2css/shield.js.map +1 -0
  43. package/dist/mapbox2css/split.js +380 -0
  44. package/dist/mapbox2css/split.js.map +1 -0
  45. package/dist/mapbox2css/sprite.js +882 -0
  46. package/dist/mapbox2css/sprite.js.map +1 -0
  47. package/dist/mapbox2css/types.js +2 -0
  48. package/dist/mapbox2css/types.js.map +1 -0
  49. package/dist/mapbox2css/variables.js +273 -0
  50. package/dist/mapbox2css/variables.js.map +1 -0
  51. package/dist/wasm.js +43 -0
  52. package/dist/wasm.js.map +1 -0
  53. package/package.json +48 -0
  54. package/wasm/massif-style.mjs +2 -0
  55. package/wasm/massif-style.wasm +0 -0
@@ -0,0 +1,606 @@
1
+ import { isPitch } from './fold.js';
2
+ /** Thrown when an expression has no CartoCSS equivalent. The caller drops the property. */
3
+ export class Untranslatable extends Error {
4
+ what;
5
+ constructor(what) {
6
+ super(what);
7
+ this.what = what;
8
+ }
9
+ }
10
+ const COLOR_KEYWORDS = /^(#|rgb|rgba|hsl|hsla)/;
11
+ function quote(text) {
12
+ return `'${text.replace(/\\/g, '\\\\').replace(/'/g, "\\'")}'`;
13
+ }
14
+ function literal(value) {
15
+ if (value === null)
16
+ return 'null';
17
+ if (typeof value === 'boolean')
18
+ return String(value);
19
+ if (typeof value === 'number')
20
+ return String(value);
21
+ if (typeof value === 'string')
22
+ return COLOR_KEYWORDS.test(value) ? value : quote(value);
23
+ throw new Untranslatable('array or object literal');
24
+ }
25
+ // CartoCSS '^' is XOR and there is no '%' at all (grammar term3), so MapBox's '^' goes
26
+ // through pow() and '%' is refused rather than mistranslated.
27
+ const BINARY = {
28
+ '+': '+', '-': '-', '*': '*', '/': '/',
29
+ '==': '=', '!=': '!=', '<': '<', '<=': '<=', '>': '>', '>=': '>=',
30
+ };
31
+ // Only what CartoCSSMapnikTranslator::_basicFuncMap carries. There is no abs/floor/ceil.
32
+ const UNARY_FN = {
33
+ 'upcase': 'uppercase', 'downcase': 'lowercase', 'length': 'length', 'ln': 'log',
34
+ };
35
+ const BINARY_FN = { '^': 'pow' };
36
+ const GEOMETRY_TYPE_FIELD = '[mapnik::geometry_type]';
37
+ /**
38
+ * AND as nested ternaries, because `&&` cannot be parsed at all.
39
+ *
40
+ * CartoCSSParser's term3 has `qi::lit("&") > unary` for bitwise and, and `>` is an EXPECTATION:
41
+ * on `&&` it consumes the first `&`, demands a unary, meets the second `&` and fails hard with no
42
+ * backtrack to term0's `&&`. `||` has no such shadow and is emitted directly.
43
+ */
44
+ /**
45
+ * The legacy token syntax MapBox still accepts for text-field: "{ref} {name}". Left as a quoted
46
+ * string the label would literally read "{name}", so the braces become field references and the
47
+ * surrounding text a concat.
48
+ */
49
+ export function expandTokens(text) {
50
+ const parts = [];
51
+ const pattern = /\{([^{}]+)\}/g;
52
+ let last = 0;
53
+ for (let m = pattern.exec(text); m !== null; m = pattern.exec(text)) {
54
+ if (m.index > last)
55
+ parts.push(quote(text.slice(last, m.index)));
56
+ parts.push(`[${m[1]}]`);
57
+ last = m.index + m[0].length;
58
+ }
59
+ if (last === 0)
60
+ return quote(text);
61
+ if (last < text.length)
62
+ parts.push(quote(text.slice(last)));
63
+ return parts.reduce((acc, part) => `concat(${acc}, ${part})`);
64
+ }
65
+ export function conjunction(parts) {
66
+ return parts.reduceRight((rest, part, index) => index === parts.length - 1 ? part : `(${part} ? ${rest} : false)`);
67
+ }
68
+ // ["geometry-type"] yields a NAME in MapBox and a number in the decoder, so a comparison against
69
+ // one of those names has to carry the mapping or it silently never matches.
70
+ const GEOMETRY_TYPE_VALUE = {
71
+ Point: 1, MultiPoint: 1, LineString: 2, MultiLineString: 2, Polygon: 3, MultiPolygon: 3,
72
+ };
73
+ /**
74
+ * MapBox's zoom, expressed in the SDK's. Both span 2^z tiles, but a MapBox tile is 512 style px
75
+ * and the SDK's tileDrawSize defaults to 256, so the same ground scale is one level higher here
76
+ * (WORLD_SIZE / (2^z * tileDrawSize) either way). A stop authored at MapBox z14 must therefore
77
+ * fire at SDK z15. Measured: SDK z15 = 3.144 m/CSS px, mapbox-gl z15 = 1.573.
78
+ */
79
+ let zoomOffset = 1;
80
+ /**
81
+ * Which makes the offset `log2(512 / tileDrawSize)`, not a constant: an app that sets 512 already
82
+ * numbers its zoom the way maplibre does, and shifting it there drew every road a level thin -
83
+ * a trunk casing 5.2 px where maplibre gave 7.6 at the same camera.
84
+ */
85
+ export function setTileDrawSize(tileDrawSize) {
86
+ zoomOffset = Math.log2(512 / tileDrawSize);
87
+ }
88
+ export function zoomOffsetLevels() {
89
+ return zoomOffset;
90
+ }
91
+ export function zoomInput() {
92
+ return zoomOffset === 0 ? '[view::zoom]' : `([view::zoom] - ${zoomOffset})`;
93
+ }
94
+ /**
95
+ * mapbox's `["measure-light", "brightness"]`, left LIVE instead of folded to the preset's value.
96
+ * The SDK resolves `view::brightness` per frame from the same light the radiance comes from, so a
97
+ * ramp over it - which is how Standard dims its one-way arrows and a few labels - follows the hour
98
+ * with no re-decode. Only emitted under --live-light; otherwise the value is a build-time constant.
99
+ */
100
+ export const BRIGHTNESS_INPUT = '[view::brightness]';
101
+ export const TILT_INPUT = '[view::tilt]';
102
+ /**
103
+ * MapBox expression -> a CartoCSS expression string.
104
+ *
105
+ * Zoom-driven `interpolate`/`step` become CartoCSS `linear()`/`step()` over the view zoom, which
106
+ * is what keeps them re-evaluated per frame instead of frozen into the tile. An interpolation over
107
+ * anything other than zoom has no such form and is refused.
108
+ */
109
+ export function translateExpression(expr, notes) {
110
+ if (expr === null || typeof expr !== 'object')
111
+ return literal(expr);
112
+ // Pre-expression style spec: a property value can be a stop function object rather than an
113
+ // expression array. Most real styles are still mostly written this way.
114
+ if (!Array.isArray(expr))
115
+ return translateStopFunction(expr, notes);
116
+ if (expr.length === 0)
117
+ throw new Untranslatable('empty expression');
118
+ const [head, ...args] = expr;
119
+ if (typeof head !== 'string')
120
+ throw new Untranslatable('non-string operator');
121
+ switch (head) {
122
+ case 'literal':
123
+ return literal(args[0]);
124
+ case 'get': {
125
+ if (args.length !== 1 || typeof args[0] !== 'string') {
126
+ throw new Untranslatable('get with a computed or scoped key');
127
+ }
128
+ return `[${args[0]}]`;
129
+ }
130
+ case 'has': {
131
+ if (args.length !== 1 || typeof args[0] !== 'string') {
132
+ throw new Untranslatable('has with a computed or scoped key');
133
+ }
134
+ return `([${args[0]}] != null)`;
135
+ }
136
+ case 'zoom':
137
+ return zoomInput();
138
+ // Only reached when the fold was told to LEAVE it live (--live-light); otherwise it was
139
+ // already replaced by the preset's constant before translation.
140
+ case 'measure-light': {
141
+ if (args[0] !== 'brightness')
142
+ throw new Untranslatable(`measure-light ${String(args[0])}`);
143
+ return BRIGHTNESS_INPUT;
144
+ }
145
+ // Mapbox Standard's runtime knobs - lightPreset, theme, showPointOfInterestLabels. A style
146
+ // parameter is the same idea: named, defaulted in the project, and set without a reload, so
147
+ // day/night stays ONE style here as it is there. convert() declares what it finds.
148
+ case 'config': {
149
+ if (typeof args[0] !== 'string')
150
+ throw new Untranslatable('config with a computed name');
151
+ // ["config", name, importId] scopes the lookup to one import; a converted project has a
152
+ // single style, so the name alone identifies it.
153
+ if (args.length > 1)
154
+ notes?.push(`config "${args[0]}" read across imports, taken as one parameter`);
155
+ return `[param::${args[0]}]`;
156
+ }
157
+ case 'geometry-type':
158
+ return GEOMETRY_TYPE_FIELD;
159
+ case 'id':
160
+ return '[mapnik::feature_id]';
161
+ case 'concat':
162
+ // CartoCSS concat is binary; fold left rather than rely on '+' coercing strings.
163
+ return args
164
+ .map((a) => translateExpression(a))
165
+ .reduce((acc, part) => `concat(${acc}, ${part})`);
166
+ case 'coalesce':
167
+ // Parenthesised WHOLE: `??` sits in the grammar's term0 with && and ||, so it binds
168
+ // LOOSER than a comparison (CartoCSSParser, term0/term1). Left bare, `[x] ?? '' = 'y'`
169
+ // parses as `[x] ?? ('' = 'y')` - true for any feature carrying the field, which
170
+ // silently passed every filter written that way.
171
+ return `(${args.map((a) => `(${translateExpression(a)})`).join(' ?? ')})`;
172
+ // ["format", section, options, section, options, …]. The per-section options are the rich
173
+ // part - a font, a scale, a colour for that run alone - and CartoCSS styles the whole
174
+ // label at once, so only the TEXT is carried. Mapbox Standard writes every POI name as
175
+ // `["format", ["coalesce", …], {}]`, an empty options object, which loses nothing.
176
+ case 'format': {
177
+ const sections = args.filter((_, i) => i % 2 === 0);
178
+ const styled = args.filter((_, i) => i % 2 === 1)
179
+ .some((options) => !!options && typeof options === 'object' && Object.keys(options).length > 0);
180
+ if (styled)
181
+ notes?.push('format section options dropped: CartoCSS styles the whole label at once');
182
+ if (sections.length === 0)
183
+ throw new Untranslatable('format with no sections');
184
+ return sections
185
+ .map((section) => translateExpression(section))
186
+ .reduce((acc, part) => `concat(${acc}, ${part})`);
187
+ }
188
+ case 'to-string':
189
+ return `('' + ${translateExpression(args[0])})`;
190
+ case 'to-number':
191
+ return `(0 + ${translateExpression(args[0])})`;
192
+ case 'to-boolean':
193
+ return `(!(!${translateExpression(args[0])}))`;
194
+ // The type ASSERTIONS. MapBox uses them to prove a type to its own checker and errors at
195
+ // runtime if the value is not one; several arguments are tried in turn, which is a coalesce.
196
+ // CartoCSS is not typed, so the assertion carries no meaning and only the value survives.
197
+ // Cheap, and load-bearing: `["number", ["get", "filterrank"]]` sits in poi-label's FILTER,
198
+ // so refusing it dropped every POI in Mapbox Standard, and in 3d-building's height.
199
+ case 'number':
200
+ case 'string':
201
+ case 'boolean': {
202
+ if (args.length === 0)
203
+ throw new Untranslatable(`${head} with no argument`);
204
+ return args.length === 1
205
+ ? translateExpression(args[0])
206
+ : `(${args.map((a) => translateExpression(a)).join(' ?? ')})`;
207
+ }
208
+ case 'sqrt':
209
+ return `pow(${translateExpression(args[0])}, 0.5)`;
210
+ case '!':
211
+ return `(!${translateExpression(args[0])})`;
212
+ case 'all':
213
+ case 'any': {
214
+ if (args.length === 0)
215
+ return head === 'all' ? 'true' : 'false';
216
+ const parts = args.map((a) => translateExpression(a, notes));
217
+ return head === 'any' ? `(${parts.join(' || ')})` : conjunction(parts);
218
+ }
219
+ // ["in", needle, haystack] - the EXPRESSION operator, which is a different thing from the
220
+ // legacy ["in", key, v1, v2, ...] filter and was reaching here as an unknown operator. It
221
+ // is how a modern style says "class is one of these", so a layer using it was dropped
222
+ // whole: MapTiler streets-v4 lost every minor-road FILL that way and drew its outline
223
+ // alone, which reads as grey roads.
224
+ case 'in': {
225
+ if (args.length !== 2)
226
+ throw new Untranslatable('in with the wrong argument count');
227
+ const haystack = literalList(args[1]);
228
+ if (haystack === null) {
229
+ // A string haystack is a substring test, which CartoCSS has no form for.
230
+ throw new Untranslatable('in over a string or a computed haystack');
231
+ }
232
+ if (haystack.length === 0)
233
+ return 'false';
234
+ const sliced = sliceSource(args[0]);
235
+ if (sliced !== null) {
236
+ const alternatives = haystack.map((v) => (typeof v === 'string' ? v : null));
237
+ if (alternatives.every((v) => v !== null && v.length === sliced.length)) {
238
+ notes?.push(`slice(${sliced.of}, 0, ${sliced.length}) compared as a regex prefix`);
239
+ return `(${sliced.of} =~ '(${alternatives.map(escapeRegex).join('|')}).*')`;
240
+ }
241
+ }
242
+ const needle = translateExpression(args[0], notes);
243
+ return `(${haystack.map((v) => `${needle} = ${literal(v)}`).join(' || ')})`;
244
+ }
245
+ case 'case':
246
+ return translateCase(args);
247
+ case 'match':
248
+ return translateMatch(args, notes);
249
+ case 'step':
250
+ return translateStep(args);
251
+ case 'interpolate':
252
+ return translateInterpolate(args, notes);
253
+ case 'min':
254
+ case 'max': {
255
+ // CartoCSS min/max are binary; fold left.
256
+ const parts = args.map((a) => translateExpression(a));
257
+ return parts.reduce((acc, part) => `${head}(${acc}, ${part})`);
258
+ }
259
+ default: {
260
+ // `slice(x, 0, n) == 'D'` is how a style tests a PREFIX, and it is the only use of
261
+ // slice that survives: CartoCSS has no substring, but `=~` is a FULL std::regex_match
262
+ // (Predicate::applyOp, StringUtils::regexMatch), and a prefix is `D.*`. Without this every country-specific road shield fell through
263
+ // to the style's fallback colour - French D-roads drew on a white plate, not a yellow
264
+ // one - because the branch that picks the colour could not be translated at all.
265
+ if ((head === '==' || head === '!=') && args.length === 2) {
266
+ const prefix = prefixTest(args[0], args[1], notes)
267
+ ?? prefixTest(args[1], args[0], notes);
268
+ if (prefix !== null)
269
+ return head === '==' ? prefix : `(!${prefix})`;
270
+ }
271
+ // MapBox's arithmetic is VARIADIC - `["+", a, b, c]` is a sum, not a malformed pair -
272
+ // and `-` with one argument is negation. Taking only the two-argument form refused
273
+ // poi-label's whole filter over a three-term `+`, which is every POI in Standard.
274
+ if ((head === '+' || head === '*') && args.length > 2) {
275
+ return `(${args.map((x) => translateExpression(x, notes)).join(` ${head} `)})`;
276
+ }
277
+ if (head === '-' && args.length === 1) {
278
+ // No unary minus before a parenthesised value in the grammar.
279
+ return `(0 - ${translateExpression(args[0], notes)})`;
280
+ }
281
+ if (BINARY[head] && args.length === 2) {
282
+ let [a, b] = args.map((x) => translateExpression(x, notes));
283
+ if (a === GEOMETRY_TYPE_FIELD || b === GEOMETRY_TYPE_FIELD) {
284
+ const name = (a === GEOMETRY_TYPE_FIELD ? b : a).replace(/^'|'$/g, '');
285
+ const numeric = GEOMETRY_TYPE_VALUE[name];
286
+ if (numeric === undefined)
287
+ throw new Untranslatable(`geometry type "${name}"`);
288
+ if (a === GEOMETRY_TYPE_FIELD)
289
+ b = String(numeric);
290
+ else
291
+ a = String(numeric);
292
+ }
293
+ return `(${a} ${BINARY[head]} ${b})`;
294
+ }
295
+ if (BINARY_FN[head] && args.length === 2) {
296
+ const [a, b] = args.map((x) => translateExpression(x));
297
+ return `${BINARY_FN[head]}(${a}, ${b})`;
298
+ }
299
+ if (UNARY_FN[head] && args.length === 1) {
300
+ return `${UNARY_FN[head]}(${translateExpression(args[0])})`;
301
+ }
302
+ throw new Untranslatable(`["${head}", ...]`);
303
+ }
304
+ }
305
+ }
306
+ /** ["case", cond, val, ..., fallback] -> nested ternaries, which is what CartoCSS has. */
307
+ /**
308
+ * `["slice", x, 0, n]` - the prefix form. Any other slice (a non-zero start, a computed bound) has
309
+ * no regex equivalent and is left to be refused.
310
+ */
311
+ function sliceSource(node) {
312
+ // A style upcases the prefix before comparing it. Case-folding the WHOLE string and matching
313
+ // the prefix against it says the same thing, and leaves a shape the regex below can take.
314
+ if (Array.isArray(node) && node.length === 2 && typeof node[0] === 'string' && node[0] in UNARY_FN) {
315
+ const inner = sliceSource(node[1]);
316
+ return inner === null ? null : { of: `${UNARY_FN[node[0]]}(${inner.of})`, length: inner.length };
317
+ }
318
+ if (!Array.isArray(node) || node[0] !== 'slice' || node.length !== 4)
319
+ return null;
320
+ if (node[2] !== 0 || typeof node[3] !== 'number')
321
+ return null;
322
+ return { of: translateExpression(node[1]), length: node[3] };
323
+ }
324
+ /** One label of a match over a slice, as the prefix regex a CartoCSS `=~` can take. */
325
+ function prefixLabel(sliced, label) {
326
+ if (typeof label !== 'string' || label.length !== sliced.length)
327
+ return 'false';
328
+ return `(${sliced.of} =~ '${escapeRegex(label)}.*')`;
329
+ }
330
+ /** `slice(x, 0, n) == 'PREFIX'` as a full-regex match, or null when it is not that shape. */
331
+ function prefixTest(maybeSlice, maybeLiteral, notes) {
332
+ const sliced = sliceSource(maybeSlice);
333
+ if (sliced === null || typeof maybeLiteral !== 'string')
334
+ return null;
335
+ // A prefix of a different length than the slice can never equal it.
336
+ if (maybeLiteral.length !== sliced.length)
337
+ return 'false';
338
+ notes?.push(`slice(${sliced.of}, 0, ${sliced.length}) compared as a regex prefix`);
339
+ return `(${sliced.of} =~ '${escapeRegex(maybeLiteral)}.*')`;
340
+ }
341
+ /** The literal is style data, so anything with meaning in a regex has to lose it. */
342
+ function escapeRegex(value) {
343
+ return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
344
+ }
345
+ /**
346
+ * The elements of an `in` haystack, or null when it is not a literal array. Only the spec form
347
+ * counts: a bare array would swallow `["get", "class"]`, whose elements are strings too.
348
+ */
349
+ function literalList(node) {
350
+ if (Array.isArray(node) && node[0] === 'literal' && Array.isArray(node[1]))
351
+ return node[1];
352
+ return null;
353
+ }
354
+ function translateCase(args) {
355
+ if (args.length < 3 || args.length % 2 === 0)
356
+ throw new Untranslatable('malformed case');
357
+ const fallback = translateExpression(args[args.length - 1]);
358
+ let out = fallback;
359
+ for (let i = args.length - 3; i >= 0; i -= 2) {
360
+ out = `(${translateExpression(args[i])} ? ${translateExpression(args[i + 1])} : ${out})`;
361
+ }
362
+ return out;
363
+ }
364
+ /**
365
+ * ["match", input, label, value, ..., fallback]. CartoCSS has no match over an arbitrary input, so
366
+ * this expands to equality ternaries. Multi-label branches (a label array) expand to an or-chain.
367
+ */
368
+ function translateMatch(args, notes) {
369
+ if (args.length < 4 || args.length % 2 !== 0)
370
+ throw new Untranslatable('malformed match');
371
+ // Matching on a PREFIX is how a style picks a road shield's colour from its ref - the first
372
+ // letter says which network it is. CartoCSS has no substring, so each label becomes the same
373
+ // regex `==` uses; without it every branch fell through and every country took the fallback.
374
+ const sliced = sliceSource(args[0]);
375
+ if (sliced !== null)
376
+ notes?.push(`slice(${sliced.of}, 0, ${sliced.length}) matched as a regex prefix`);
377
+ const input = sliced === null ? translateExpression(args[0]) : null;
378
+ let out = translateExpression(args[args.length - 1]);
379
+ for (let i = args.length - 3; i >= 1; i -= 2) {
380
+ const labels = Array.isArray(args[i]) ? args[i] : [args[i]];
381
+ const test = labels.map((l) => (sliced !== null
382
+ ? prefixLabel(sliced, l)
383
+ : `${input} = ${translateExpression(l)}`)).join(' || ');
384
+ out = `((${test}) ? ${translateExpression(args[i + 1])} : ${out})`;
385
+ }
386
+ return out;
387
+ }
388
+ /**
389
+ * ["step", input, base, stop, value, ...] -> step([view::zoom], (0, base), (stop, value), ...).
390
+ *
391
+ * Every argument after the input has to be a (key, value) list - CartoCSSMapnikTranslator refuses
392
+ * a flat one ("Expecting element list for interpolation function"). MapBox's base covers everything
393
+ * below the first stop, which is a keyframe at zoom 0.
394
+ */
395
+ function translateStep(args) {
396
+ if (args.length < 3)
397
+ throw new Untranslatable('malformed step');
398
+ // A step over ZOOM is a per-frame function and maps onto CartoCSS's own; over a FIELD it is a
399
+ // per-feature decision, which is a chain of ternaries. Unlike `interpolate` there is nothing to
400
+ // unroll - a step has finitely many outcomes, one per stop. Mapbox Standard sizes 10 label
401
+ // layers by `["step", ["get", "sizerank"], …]`, which was 35 text-sizes dropped.
402
+ if (translateExpression(args[0]) !== zoomInput())
403
+ return stepOnField(args);
404
+ const input = requireZoom(args[0], 'step');
405
+ const stops = [`(0, ${translateExpression(args[1])})`];
406
+ for (let i = 2; i < args.length; i += 2) {
407
+ stops.push(`(${translateExpression(args[i])}, ${translateExpression(args[i + 1])})`);
408
+ }
409
+ return `step(${input}, ${stops.join(', ')})`;
410
+ }
411
+ /** A stop value that is itself a ramp, which is the one thing a CartoCSS ramp cannot hold. */
412
+ function isRamp(value) {
413
+ return Array.isArray(value) && (value[0] === 'interpolate' || value[0] === 'step');
414
+ }
415
+ /**
416
+ * ["interpolate", ["linear"], ["zoom"], z, v, ...] -> linear([view::zoom], (z, v), ...).
417
+ * ["exponential", 1] is linear, so it is accepted; any other base is not.
418
+ */
419
+ function translateInterpolate(args, notes) {
420
+ if (args.length < 4)
421
+ throw new Untranslatable('malformed interpolate');
422
+ const [kind, ...rest] = args;
423
+ if (!Array.isArray(kind) || kind.length === 0)
424
+ throw new Untranslatable('malformed interpolate type');
425
+ let fn;
426
+ let base = null;
427
+ if (kind[0] === 'linear')
428
+ fn = 'linear';
429
+ // NOT CartoCSS's `cubic`. MapBox's is an EASING between each pair of stops; CartoCSS's is a
430
+ // spline THROUGH all of them, and cglib's overshoots hard - Standard sizes its settlement
431
+ // labels this way and Paris went from 38 to 71 device pixels over one zoom level, where the
432
+ // easing moves 20.0 to 20.3. Linear is within about a unit of the easing over these stops and
433
+ // cannot overshoot; carrying the control points properly would need a curve type in the SDK.
434
+ else if (kind[0] === 'cubic-bezier') {
435
+ fn = 'linear';
436
+ notes?.push('cubic-bezier easing taken as linear');
437
+ }
438
+ else if (kind[0] === 'exponential' && typeof kind[1] === 'number') {
439
+ fn = 'linear';
440
+ if (kind[1] !== 1)
441
+ base = kind[1];
442
+ }
443
+ else {
444
+ throw new Untranslatable(`interpolate ["${String(kind[0])}"${kind[1] !== undefined ? `, ${String(kind[1])}` : ''}]`);
445
+ }
446
+ if (isPitch(rest[0]))
447
+ return pitchRamp(rest, base);
448
+ const input = requireZoom(rest[0], 'interpolate');
449
+ const pairs = [];
450
+ for (let i = 1; i < rest.length; i += 2) {
451
+ pairs.push([rest[i], rest[i + 1]]);
452
+ }
453
+ // CartoCSS has no NESTED ramp. `linear(z, (13, c), (14, linear(brightness, ...)))` parses and
454
+ // then draws NOTHING - Mapbox Standard writes its water fill exactly that way and every lake
455
+ // came out empty (device A/B: replacing the inner ramp with a constant brought them back). The
456
+ // inner ramp is the one that carries the day/night difference, so the outer collapses onto it.
457
+ const nested = pairs.filter(([, value]) => isRamp(value));
458
+ if (nested.length > 0) {
459
+ notes?.push(`a ramp over ${input} collapsed onto the ramp at one of its stops: ` +
460
+ 'CartoCSS cannot nest two, and a nested one silently draws nothing');
461
+ return translateExpression(nested[nested.length - 1][1], notes);
462
+ }
463
+ // The SDK interpolates an exponential ramp itself, so the curve is carried rather than
464
+ // approximated. Resampling only ever worked when the stops were plain numbers, and mapbox
465
+ // writes a road width as an exponential over PER-CLASS values - the fallback to plain linear
466
+ // made those nearly three times too wide in the middle of a span, which is every road in
467
+ // Mapbox Standard between its stop zooms.
468
+ if (base !== null) {
469
+ const stops = pairs.map(([k, v]) => `(${translateExpression(k)}, ${translateExpression(v)})`);
470
+ return `exponential(${base}, ${input}, ${stops.join(', ')})`;
471
+ }
472
+ const stops = pairs.map(([k, v]) => `(${translateExpression(k)}, ${translateExpression(v)})`);
473
+ return `${fn}(${input}, ${stops.join(', ')})`;
474
+ }
475
+ /**
476
+ * A ramp over MapBox's pitch, degrees away from straight down, as one over the SDK's tilt, degrees up
477
+ * from the horizon: each key becomes `90 - pitch`, so the stops run in reverse.
478
+ */
479
+ function pitchRamp(rest, base) {
480
+ if (base !== null)
481
+ throw new Untranslatable('exponential interpolate over pitch');
482
+ const stops = [];
483
+ for (let i = rest.length - 2; i >= 1; i -= 2) {
484
+ if (typeof rest[i] !== 'number')
485
+ throw new Untranslatable('interpolate over pitch with a computed stop');
486
+ stops.push(`(${90 - rest[i]}, ${translateExpression(rest[i + 1])})`);
487
+ }
488
+ return `linear(${TILT_INPUT}, ${stops.join(', ')})`;
489
+ }
490
+ /**
491
+ * MapBox interpolates an exponential ramp per segment as `t = (b^(x-x0) - 1) / (b^(x1-x0) - 1)`;
492
+ * CartoCSS has `linear` and `cubic` and no base at all. Resampling the curve into extra linear
493
+ * stops agrees at every original stop and stays close between them, where substituting a plain
494
+ * linear does not - at base 2 over four zoom levels it is out by about a third at the midpoint.
495
+ *
496
+ * Returns null when a stop is not a plain number, which is when there is no curve to sample.
497
+ */
498
+ const EXPONENTIAL_SUBDIVISIONS = 4;
499
+ function resampleExponential(pairs, base) {
500
+ const numeric = [];
501
+ for (const [k, v] of pairs) {
502
+ if (typeof k !== 'number' || typeof v !== 'number')
503
+ return null;
504
+ numeric.push([k, v]);
505
+ }
506
+ if (numeric.length < 2)
507
+ return null;
508
+ const round = (n) => Math.round(n * 1e4) / 1e4;
509
+ const out = [];
510
+ for (let i = 0; i + 1 < numeric.length; i++) {
511
+ const [x0, y0] = numeric[i];
512
+ const [x1, y1] = numeric[i + 1];
513
+ out.push([round(x0), round(y0)]);
514
+ const span = x1 - x0;
515
+ const denom = Math.pow(base, span) - 1;
516
+ if (!(span > 0) || denom === 0)
517
+ continue;
518
+ for (let j = 1; j < EXPONENTIAL_SUBDIVISIONS; j++) {
519
+ const x = x0 + (span * j) / EXPONENTIAL_SUBDIVISIONS;
520
+ const t = (Math.pow(base, x - x0) - 1) / denom;
521
+ out.push([round(x), round(y0 + (y1 - y0) * t)]);
522
+ }
523
+ }
524
+ const last = numeric[numeric.length - 1];
525
+ out.push([round(last[0]), round(last[1])]);
526
+ return out;
527
+ }
528
+ /** `["step", x, base, k1, v1, …]` over a field: the highest stop x reaches, else the base. */
529
+ function stepOnField(args) {
530
+ const input = translateExpression(args[0]);
531
+ let out = translateExpression(args[1]);
532
+ // Built from the bottom up, so the outermost test is the highest stop - which is the one a
533
+ // reader checks first and the order `step` itself resolves in.
534
+ for (let i = 2; i + 1 < args.length; i += 2) {
535
+ out = `((${input} >= ${translateExpression(args[i])}) ? ${translateExpression(args[i + 1])} : ${out})`;
536
+ }
537
+ return out;
538
+ }
539
+ /**
540
+ * CartoCSS interpolation functions only take a view variable as their input; interpolating over a
541
+ * feature field would have to be unrolled, and there is no bounded way to do that.
542
+ */
543
+ function requireZoom(input, where) {
544
+ const translated = translateExpression(input);
545
+ // The scene brightness is a view variable too, and a ramp over it interpolates the same way.
546
+ if (translated !== zoomInput() && translated !== BRIGHTNESS_INPUT) {
547
+ throw new Untranslatable(`${where} over ${translated} rather than zoom`);
548
+ }
549
+ return translated;
550
+ }
551
+ /**
552
+ * The pre-expression "function" syntax: `{stops, base, property, type, default}`.
553
+ *
554
+ * A zoom function maps onto CartoCSS's own interpolation and stays per-frame. A function over a
555
+ * FEATURE property can only be carried when it is a lookup (categorical/interval/identity), since
556
+ * CartoCSS interpolation takes a view variable and nothing else.
557
+ */
558
+ function translateStopFunction(fn, notes) {
559
+ const type = typeof fn.type === 'string' ? fn.type : undefined;
560
+ const property = typeof fn.property === 'string' ? fn.property : undefined;
561
+ const input = property !== undefined ? `[${property}]` : zoomInput();
562
+ if (type === 'identity') {
563
+ return input;
564
+ }
565
+ const stops = fn.stops;
566
+ if (!Array.isArray(stops) || stops.length === 0) {
567
+ throw new Untranslatable(property !== undefined ? 'property function with no stops' : 'object literal');
568
+ }
569
+ const pairs = stops.map((stop) => {
570
+ if (!Array.isArray(stop) || stop.length !== 2)
571
+ throw new Untranslatable('malformed stop');
572
+ return [stop[0], stop[1]];
573
+ });
574
+ if (property === undefined) {
575
+ if (type === 'categorical')
576
+ throw new Untranslatable('categorical zoom function');
577
+ if (type === 'interval') {
578
+ return `step(${input}, ${pairs.map(([k, v]) => `(${translateExpression(k, notes)}, ${translateExpression(v, notes)})`).join(', ')})`;
579
+ }
580
+ // exponential (the default). CartoCSS has linear and cubic, so a base other than 1 is an
581
+ // approximation: it agrees at every stop and differs only in between.
582
+ const base = typeof fn.base === 'number' ? fn.base : 1;
583
+ if (base !== 1) {
584
+ notes?.push(`exponential zoom function with base ${base} approximated as linear`);
585
+ }
586
+ return `linear(${input}, ${pairs.map(([k, v]) => `(${translateExpression(k, notes)}, ${translateExpression(v, notes)})`).join(', ')})`;
587
+ }
588
+ // Over a feature property. Only a lookup survives; an interpolation does not.
589
+ if (type === 'categorical') {
590
+ return lookupChain(input, pairs, '=', fn.default, notes);
591
+ }
592
+ if (type === 'interval') {
593
+ return lookupChain(input, [...pairs].reverse(), '>=', fn.default, notes);
594
+ }
595
+ throw new Untranslatable(`${type ?? 'exponential'} interpolation over [${property}] rather than zoom`);
596
+ }
597
+ /** Stops as a ternary chain, since CartoCSS has no lookup construct over a field. */
598
+ function lookupChain(input, pairs, op, fallback, notes) {
599
+ let out = fallback !== undefined ? translateExpression(fallback, notes) : translateExpression(pairs[pairs.length - 1][1], notes);
600
+ for (let i = pairs.length - 1; i >= 0; i--) {
601
+ const [key, value] = pairs[i];
602
+ out = `(${input} ${op} ${translateExpression(key, notes)} ? ${translateExpression(value, notes)} : ${out})`;
603
+ }
604
+ return out;
605
+ }
606
+ //# sourceMappingURL=expression.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expression.js","sourceRoot":"","sources":["../../src/mapbox2css/expression.ts"],"names":[],"mappings":"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"}