Removed submodule maplibre-gl-js (#938)

This commit is contained in:
Alex Cristici
2023-03-25 15:46:49 +02:00
committed by GitHub
parent 6c4918374a
commit eadb3697e9
3416 changed files with 136345 additions and 115 deletions

View File

@@ -18,7 +18,6 @@ on:
- "src/**"
- "test/**"
- "vendor/**"
- maplibre-gl-js
- ".gitmodules"
- "!**/*.md"

View File

@@ -20,7 +20,6 @@ on:
- "src/**"
- "test/**"
- "vendor/**"
- maplibre-gl-js
- ".gitmodules"
- "!**/*.md"

View File

@@ -10,7 +10,6 @@ on:
- "include/**"
- "workflows/core-build.yml"
- "vendor/**"
- maplibre-gl-js
- "CMakeLists.txt"
concurrency:

View File

@@ -21,7 +21,6 @@ on:
- "src/**"
- "test/**"
- "vendor/**"
- maplibre-gl-js
- ".gitmodules"
- "!**/*.md"

View File

@@ -21,7 +21,6 @@ on:
- "src/**"
- "test/**"
- "vendor/**"
- maplibre-gl-js
- ".gitmodules"
- "!**/*.md"
@@ -42,7 +41,6 @@ on:
- "src/**"
- "test/**"
- "vendor/**"
- maplibre-gl-js
- ".gitmodules"
- "!**/*.md"

View File

@@ -25,7 +25,6 @@ on:
- "src/**"
- "test/**"
- "vendor/**"
- maplibre-gl-js
- ".gitmodules"
- "!**/*.md"
@@ -50,7 +49,6 @@ on:
- "src/**"
- "test/**"
- "vendor/**"
- maplibre-gl-js
- ".gitmodules"
- "!**/*.md"

View File

@@ -22,7 +22,6 @@ on:
- "src/**"
- "test/**"
- "vendor/**"
- maplibre-gl-js
- ".gitmodules"
- "!**/*.md"
@@ -44,7 +43,6 @@ on:
- "src/**"
- "test/**"
- "vendor/**"
- maplibre-gl-js
- ".gitmodules"
- "!**/*.md"

View File

@@ -1,56 +0,0 @@
name: update-gl-js
on:
workflow_dispatch:
inputs:
commit:
description: 'Commit'
required: true
default: '49bc4ca45'
jobs:
update-gl-js:
runs-on: macos-12
steps:
- uses: actions/checkout@v3
with:
submodules: recursive
fetch-depth: 0
- uses: actions/setup-node@v3
with:
node-version: 10
- name: Setup git and create branch
run: |
git config --global user.email "mail@example.com"
git config --global user.name "GitHub Action"
git checkout -b update-gl-js-to-${{ github.event.inputs.commit }}
- name: Checkout MapLibre GL JS
working-directory: maplibre-gl-js
run: |
git checkout ${{ github.event.inputs.commit }}
yarn install
- name: Generate code for main repo
run: |
npm ci --ignore-scripts
node scripts/generate-shaders.js
- name: Generate code for iOS
working-directory: platform/ios
run: |
npm install --ignore-scripts
node platform/darwin/scripts/generate-style-code.js
node platform/darwin/scripts/update-examples.js
- name: Commit and push changes
run: |
git add -u
git commit -m "Update MapLibre GL JS to ${{ github.event.inputs.commit }}"
git push --set-upstream origin update-gl-js-to-${{ github.event.inputs.commit }}
- name: Create pull request
run: gh pr create --base main --fill
env:
GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}

3
.gitmodules vendored
View File

@@ -46,9 +46,6 @@
[submodule "platform/android/vendor/mapbox-gestures-android"]
path = platform/android/vendor/mapbox-gestures-android
url = https://github.com/mapbox/mapbox-gestures-android.git
[submodule "maplibre-gl-js"]
path = maplibre-gl-js
url = https://github.com/maplibre/maplibre-gl-js.git
[submodule "docs/doxygen/doxygen-awesome-css"]
path = docs/doxygen/doxygen-awesome-css
url = https://github.com/jothepro/doxygen-awesome-css.git

View File

@@ -21,14 +21,6 @@ Code and build scripts belonging to platform SDKs are contained in the `platform
- `platform/android` - Android SDK, forked from https://github.com/mapbox/mapbox-gl-native-android/commit/4c12fb2c.
- `platform/glfw` - [GLFW](https://www.glfw.org) is library to support OpenGL development on the desktop. The code in this directory builds an executable application `mbgl-glfw` for demo/dev/local testing purposes.
## Maplibre-gl-js
`maplibre-gl-js` is added to this repostiory as a top-level submodule to provide
- Test cases and test data, e.g. all rendering test manifests json files under `render-test` load test cases from `maplibre-gl-js/test/*`.
- Shader written in GLSL ES.
- Style specification
## Other directories
- `benchmark` contains the performance tests built using https://github.com/google/benchmark/. The code under this directory builds the `mbgl-benchmark-test` executable to execute the benchmark tests.

View File

@@ -7,14 +7,13 @@ To check that the output of the rendering is correct, we compare actual rendered
The directory sturcture of the render tests looks like:
```
maplibre-gl-js/
test/
integration/
render-tests/
<name-of-style-spec-feature>/
<name-of-feature-value>/
expected.png
style.json
maetrics/
integration/
render-tests/
<name-of-style-spec-feature>/
<name-of-feature-value>/
expected.png
style.json
```
After the render test run, the folder will also contain an `actual.png` file and a `diff.png` which is the difference between the expected and the actual image. There is a pixel difference threshold value which is used to decide if a render test passed or failed.

View File

@@ -342,7 +342,7 @@ std::tuple<filesystem::path, std::vector<filesystem::path>, bool, uint32_t> pars
exit(2);
}
filesystem::path rootPath {std::string(TEST_RUNNER_ROOT_PATH).append("/maplibre-gl-js/test/integration/expression-tests")};
filesystem::path rootPath {std::string(TEST_RUNNER_ROOT_PATH).append("/metrics/integration/expression-tests")};
if (!filesystem::exists(rootPath)) {
Log::Error(Event::General, "Test path '" + rootPath.string() + "' does not exist.");
exit(3);

Submodule maplibre-gl-js deleted from 9489d7654e

View File

@@ -1,5 +1,5 @@
{
"base_test_path": "../maplibre-gl-js/test/integration",
"base_test_path": "integration",
"cache_path": "cache-style.db",
"expectation_paths": [
"expectations/platform-all"

View File

@@ -1,5 +1,5 @@
{
"base_test_path": "../maplibre-gl-js/test/integration",
"base_test_path": "integration",
"cache_path": "cache-style.db",
"expectation_paths": [
"expectations/platform-all",

View File

@@ -0,0 +1,157 @@
These integration tests verify the correctness and consistency of [mapbox-gl-js](https://github.com/mapbox/mapbox-gl-js) and
[mapbox-gl-native](https://github.com/mapbox/mapbox-gl-native) rendering.
## Organization
Tests are contained in a directory tree, generally organized by [style specification](https://github.com/mapbox/mapbox-gl-style-spec)
property: `background-color`, `line-width`, etc., with a second level of directories below that for individual tests. For example, the test for specifying a literal `circle-radius` value lives in [`test/integration/render-tests/circle-radius/literal/`](https://github.com/mapbox/mapbox-gl-js/tree/master/test/integration/render-tests/circle-radius/literal).
Within a leaf directory is a `style.json` file (e.g. [`circle-radius/literal/style.json`](https://github.com/mapbox/mapbox-gl-js/blob/master/test/integration/render-tests/circle-radius/literal/style.json)), which contains the minimal style needed for the given test case. The style can specify the map size, center, bearing, and pitch, and additional test metadata (e.g. output image dimensions).
The expected output for a given test case is in `expected.png`, e.g. [`circle-radius/literal/expected.png`](https://github.com/mapbox/mapbox-gl-js/blob/master/test/integration/render-tests/circle-radius/literal/expected.png).
Supporting files -- glyphs, sprites, and tiles -- live in their own respective subdirectories at the top level. The test
harness sets up the environment such that requests for these resources are directed to the correct location.
The contents of vector tile fixtures can be read using the [`vt2geojson`](https://github.com/mapbox/vt2geojson) tool (see below).
## Running tests
To run the entire integration test suite (both render or query tests), from within the `mapbox-gl-js` directory run the command:
```
yarn run test-suite
```
To run only the render/query tests:
```
yarn run test-render
```
or
```
yarn run test-query-node
```
### Running specific tests
To run a subset of tests or an individual test, you can pass a specific subdirectory to the `test-render` script. For example, to run all the tests for a given property, e.g. `circle-radius`:
```
$ yarn run test-render circle-radius
...
* passed circle-radius/antimeridian
* passed circle-radius/default
* passed circle-radius/function
* passed circle-radius/literal
* passed circle-radius/property-function
* passed circle-radius/zoom-and-property-function
6 passed (100.0%)
Results at: ./test/integration/render-tests/index.html
Done in 2.71s.
```
Or to run a single test:
```
$ yarn run test-render circle-radius/literal
...
* passed circle-radius/literal
1 passed (100.0%)
Results at: ./test/integration/render-tests/index.html
Done in 2.32s.
```
### Viewing test results
During a test run, the test harness will use GL-JS to create an `actual.png` image from the given `style.json`, and will then use [pixelmatch](https://github.com/mapbox/pixelmatch) to compare that image to `expected.png`, generating a `diff.png` highlighting the mismatching pixels (if any) in red.
After the test(s) have run, you can view the results graphically by opening the `index.html` file generated by the harness:
```
open ./test/integration/render-tests/index.html
```
or
```
open ./test/integration/query-tests/index.html
```
## Running tests in the browser
Query tests can be run in the browser, the server for serving up the test page and test fixtures starts when you run
```
yarn run start
```
OR
```
yarn run start-debug
```
If you want to run only the test server run:
```
yarn run watch-query
```
Then open the following url in the browser of your choice to start running the tests.
```
http://localhost:7357/
```
### Running specific tests
A filter can be specified by using the `filter` query param in the url. E.g, adding
```
?filter=circle-pitch
```
to the end of the url will only run the tests that contain `circle-pitch` in the name.
### Build Notifications
The terminal window can be very noisy with both the build and the test servers running in the same session.
So the server uses platform notifications to inform when the build has finished. If this behaviour is annoying, it can be disabled by setting the following env-var
```
DISABLE_BUILD_NOTIFICATIONS=true
```
## Writing new tests
_Note: Expected results are always generated with the **js** implementation. This is merely for consistency and does not
imply that in the event of a rendering discrepancy, the js implementation is always correct._
To add a new render test:
1. Create a new directory `test/integration/render-tests/<property-name>/<new-test-name>`
2. Create a new `style.json` file within that directory, specifying the map to load. Feel free to copy & modify one of the existing `style.json` files from the `render-tests` subdirectories.
3. Generate an `expected.png` image from the given style by running the new test with the `UPDATE` flag enabled:
```
$ UPDATE=1 yarn run test-render <property-name>/<new-test-name>
```
The test will appear to fail, but you'll now see a new `expected.png` in the test directory.
4. Manually inspect `expected.png` to verify it looks as expected, and optionally run the test again without the update flag (`yarn run test-render <property-name>/<new-test-name>`) to watch it pass (enjoy that dopamine kick!)
5. Commit the new `style.json` and `expected.png` :rocket:
## Reading Vector Tile Fixtures
Install `vt2geojson`, a command line utility which turns vector tiles into geojson, and `harp`, a simple file server.
```
npm install -g vt2geojson harp
```
Start a static file server
```
harp server .
```
Read the contents of an entire vector tile
```
vt2geojson -z 14 -y 8803 -x 5374 http://localhost:9000/tiles/14-8803-5374.mvt
```
Read the contents of a particular layer in a vector tile
```
vt2geojson --layer poi_label -z 14 -y 8803 -x 5374 http://localhost:9000/tiles/14-8803-5374.mvt
```

View File

@@ -0,0 +1,123 @@
class NullIsland {
constructor() {
this.id = 'null-island';
this.type = 'custom';
this.renderingMode = '2d';
}
onAdd(map, gl) {
const vertexSource = `
uniform mat4 u_matrix;
void main() {
gl_Position = u_matrix * vec4(0.5, 0.5, 0.0, 1.0);
gl_PointSize = 20.0;
}`;
const fragmentSource = `
void main() {
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}`;
const vertexShader = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vertexShader, vertexSource);
gl.compileShader(vertexShader);
const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fragmentShader, fragmentSource);
gl.compileShader(fragmentShader);
this.program = gl.createProgram();
gl.attachShader(this.program, vertexShader);
gl.attachShader(this.program, fragmentShader);
gl.linkProgram(this.program);
}
render(gl, matrix) {
gl.useProgram(this.program);
gl.uniformMatrix4fv(gl.getUniformLocation(this.program, "u_matrix"), false, matrix);
gl.drawArrays(gl.POINTS, 0, 1);
}
}
class Tent3D {
constructor() {
this.id = 'tent-3d';
this.type = 'custom';
this.renderingMode = '3d';
}
onAdd(map, gl) {
const vertexSource = `
attribute vec3 aPos;
uniform mat4 uMatrix;
void main() {
gl_Position = uMatrix * vec4(aPos, 1.0);
}
`;
const fragmentSource = `
void main() {
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}
`;
const vertexShader = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vertexShader, vertexSource);
gl.compileShader(vertexShader);
const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fragmentShader, fragmentSource);
gl.compileShader(fragmentShader);
this.program = gl.createProgram();
gl.attachShader(this.program, vertexShader);
gl.attachShader(this.program, fragmentShader);
gl.linkProgram(this.program);
gl.validateProgram(this.program);
this.program.aPos = gl.getAttribLocation(this.program, "aPos");
this.program.uMatrix = gl.getUniformLocation(this.program, "uMatrix");
const x = 0.5 - 0.015;
const y = 0.5 - 0.01;
const z = 0.01;
const d = 0.01;
const vertexArray = new Float32Array([
x, y, 0,
x + d, y, 0,
x, y + d, z,
x + d, y + d, z,
x, y + d + d, 0,
x + d, y + d + d, 0]);
const indexArray = new Uint16Array([
0, 1, 2,
1, 2, 3,
2, 3, 4,
3, 4, 5
]);
this.vertexBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, vertexArray, gl.STATIC_DRAW);
this.indexBuffer = gl.createBuffer();
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indexArray, gl.STATIC_DRAW);
}
render(gl, matrix) {
gl.useProgram(this.program);
gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer);
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);
gl.enableVertexAttribArray(this.program.a_pos);
gl.vertexAttribPointer(this.program.aPos, 3, gl.FLOAT, false, 0, 0);
gl.uniformMatrix4fv(this.program.uMatrix, false, matrix);
gl.drawElements(gl.TRIANGLES, 12, gl.UNSIGNED_SHORT, 0);
}
}
export default {
"tent-3d": Tent3D,
"null-island": NullIsland
};

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,707 @@
{
"type": "Feature",
"geometry": {
"type": "LineString",
"coordinates": [
[
-77.066104,
38.910203
],
[
-77.066106,
38.910321
],
[
-77.066112,
38.910758
],
[
-77.065249,
38.910775
],
[
-77.065178,
38.910793
],
[
-77.065139,
38.910804
],
[
-77.064904,
38.91036
],
[
-77.064855,
38.910268
],
[
-77.064621,
38.909825
],
[
-77.06459,
38.909766
],
[
-77.064342,
38.909298
],
[
-77.064281,
38.909182
],
[
-77.064201,
38.909226
],
[
-77.064175,
38.909235
],
[
-77.064149,
38.909241
],
[
-77.064122,
38.909244
],
[
-77.06336,
38.90926
],
[
-77.061442,
38.909288
],
[
-77.060801,
38.909297
],
[
-77.059237,
38.909315
],
[
-77.058186,
38.90933
],
[
-77.057113,
38.909343
],
[
-77.055623,
38.909368
],
[
-77.054762,
38.909377
],
[
-77.053951,
38.909389
],
[
-77.053904,
38.909393
],
[
-77.053858,
38.909399
],
[
-77.053813,
38.909408
],
[
-77.052833,
38.909635
],
[
-77.052799,
38.909642
],
[
-77.052772,
38.909645
],
[
-77.052692,
38.90965
],
[
-77.052443,
38.909649
],
[
-77.05096,
38.909639
],
[
-77.050327,
38.909634
],
[
-77.049545,
38.909631
],
[
-77.049533,
38.909635
],
[
-77.049341,
38.909635
],
[
-77.048903,
38.909635
],
[
-77.048797,
38.909634
],
[
-77.04773,
38.909639
],
[
-77.046632,
38.90964
],
[
-77.045758,
38.909641
],
[
-77.044877,
38.909643
],
[
-77.044578,
38.909641
],
[
-77.044493,
38.909635
],
[
-77.04442,
38.909626
],
[
-77.044345,
38.909608
],
[
-77.044283,
38.909578
],
[
-77.044249,
38.909541
],
[
-77.044212,
38.909496
],
[
-77.044199,
38.909458
],
[
-77.044182,
38.909421
],
[
-77.044162,
38.909385
],
[
-77.04414,
38.90935
],
[
-77.044113,
38.909313
],
[
-77.044083,
38.90928
],
[
-77.044051,
38.909247
],
[
-77.044018,
38.909165
],
[
-77.044018,
38.909117
],
[
-77.044029,
38.909071
],
[
-77.044037,
38.909038
],
[
-77.044058,
38.908981
],
[
-77.043996,
38.909021
],
[
-77.043919,
38.909052
],
[
-77.043854,
38.909067
],
[
-77.043798,
38.909073
],
[
-77.043755,
38.909075
],
[
-77.043689,
38.909056
],
[
-77.043656,
38.909048
],
[
-77.04359,
38.909036
],
[
-77.043527,
38.909028
],
[
-77.043486,
38.909026
],
[
-77.043444,
38.909025
],
[
-77.043402,
38.909026
],
[
-77.043344,
38.909029
],
[
-77.043286,
38.909037
],
[
-77.043263,
38.909041
],
[
-77.04323,
38.909047
],
[
-77.043194,
38.909056
],
[
-77.043022,
38.909118
],
[
-77.042995,
38.909132
],
[
-77.04296,
38.909151
],
[
-77.042938,
38.909165
],
[
-77.042915,
38.90918
],
[
-77.042875,
38.909209
],
[
-77.04284,
38.909239
],
[
-77.042823,
38.909255
],
[
-77.042791,
38.909288
],
[
-77.042774,
38.909307
],
[
-77.042712,
38.909315
],
[
-77.042637,
38.909322
],
[
-77.042551,
38.909317
],
[
-77.042422,
38.909299
],
[
-77.041676,
38.90903
],
[
-77.039935,
38.908425
],
[
-77.038503,
38.907925
],
[
-77.037656,
38.907632
],
[
-77.037477,
38.907534
],
[
-77.037317,
38.907438
],
[
-77.037238,
38.90739
],
[
-77.037121,
38.907315
],
[
-77.036997,
38.907233
],
[
-77.036875,
38.907137
],
[
-77.036833,
38.907094
],
[
-77.036817,
38.907081
],
[
-77.036795,
38.907068
],
[
-77.036774,
38.907058
],
[
-77.036767,
38.907052
],
[
-77.036712,
38.907034
],
[
-77.03669,
38.907028
],
[
-77.036643,
38.907022
],
[
-77.03661,
38.907021
],
[
-77.03653,
38.907021
],
[
-77.036474,
38.907021
],
[
-77.03643,
38.907025
],
[
-77.03639,
38.907033
],
[
-77.036295,
38.907058
],
[
-77.036005,
38.906995
],
[
-77.035439,
38.906869
],
[
-77.035142,
38.906757
],
[
-77.035049,
38.906725
],
[
-77.0348,
38.906641
],
[
-77.034673,
38.906594
],
[
-77.034568,
38.906558
],
[
-77.034059,
38.906382
],
[
-77.033931,
38.906338
],
[
-77.032623,
38.905883
],
[
-77.03129,
38.905426
],
[
-77.030031,
38.904982
],
[
-77.029623,
38.904835
],
[
-77.028082,
38.904304
],
[
-77.027679,
38.904167
],
[
-77.02705,
38.903949
],
[
-77.026409,
38.903729
],
[
-77.025984,
38.903579
],
[
-77.024321,
38.902997
],
[
-77.024139,
38.902954
],
[
-77.023952,
38.902954
],
[
-77.023188,
38.902956
],
[
-77.022699,
38.902958
],
[
-77.021917,
38.90296
],
[
-77.021918,
38.902902
],
[
-77.021918,
38.902521
],
[
-77.019907,
38.902521
],
[
-77.018928,
38.902521
],
[
-77.016176,
38.902519
],
[
-77.015177,
38.902518
],
[
-77.013722,
38.902514
],
[
-77.012171,
38.902516
],
[
-77.011237,
38.902516
],
[
-77.009846,
38.902515
],
[
-77.009117,
38.902514
],
[
-77.009126,
38.901346
],
[
-77.00912,
38.900203
],
[
-77.009062,
38.900203
],
[
-77.008975,
38.900203
],
[
-77.008004,
38.900198
],
[
-77.00631,
38.900193
],
[
-77.005531,
38.900197
],
[
-77.002929,
38.9002
],
[
-77.002038,
38.900203
],
[
-77.001892,
38.900203
],
[
-77.000571,
38.900205
],
[
-76.999507,
38.900204
],
[
-76.998442,
38.900204
],
[
-76.998369,
38.900204
],
[
-76.996167,
38.900205
],
[
-76.994961,
38.900203
],
[
-76.994962,
38.899748
],
[
-76.994961,
38.899626
],
[
-76.994961,
38.899367
],
[
-76.994961,
38.898908
],
[
-76.994962,
38.898447
]
]
},
"properties": {
"name": "P Street Northwest - Massachusetts Avenue Northwest"
}
}

View File

@@ -0,0 +1 @@
42

View File

@@ -0,0 +1,701 @@
{
"type": "LineString",
"coordinates": [
[
-77.066104,
38.910203
],
[
-77.066106,
38.910321
],
[
-77.066112,
38.910758
],
[
-77.065249,
38.910775
],
[
-77.065178,
38.910793
],
[
-77.065139,
38.910804
],
[
-77.064904,
38.91036
],
[
-77.064855,
38.910268
],
[
-77.064621,
38.909825
],
[
-77.06459,
38.909766
],
[
-77.064342,
38.909298
],
[
-77.064281,
38.909182
],
[
-77.064201,
38.909226
],
[
-77.064175,
38.909235
],
[
-77.064149,
38.909241
],
[
-77.064122,
38.909244
],
[
-77.06336,
38.90926
],
[
-77.061442,
38.909288
],
[
-77.060801,
38.909297
],
[
-77.059237,
38.909315
],
[
-77.058186,
38.90933
],
[
-77.057113,
38.909343
],
[
-77.055623,
38.909368
],
[
-77.054762,
38.909377
],
[
-77.053951,
38.909389
],
[
-77.053904,
38.909393
],
[
-77.053858,
38.909399
],
[
-77.053813,
38.909408
],
[
-77.052833,
38.909635
],
[
-77.052799,
38.909642
],
[
-77.052772,
38.909645
],
[
-77.052692,
38.90965
],
[
-77.052443,
38.909649
],
[
-77.05096,
38.909639
],
[
-77.050327,
38.909634
],
[
-77.049545,
38.909631
],
[
-77.049533,
38.909635
],
[
-77.049341,
38.909635
],
[
-77.048903,
38.909635
],
[
-77.048797,
38.909634
],
[
-77.04773,
38.909639
],
[
-77.046632,
38.90964
],
[
-77.045758,
38.909641
],
[
-77.044877,
38.909643
],
[
-77.044578,
38.909641
],
[
-77.044493,
38.909635
],
[
-77.04442,
38.909626
],
[
-77.044345,
38.909608
],
[
-77.044283,
38.909578
],
[
-77.044249,
38.909541
],
[
-77.044212,
38.909496
],
[
-77.044199,
38.909458
],
[
-77.044182,
38.909421
],
[
-77.044162,
38.909385
],
[
-77.04414,
38.90935
],
[
-77.044113,
38.909313
],
[
-77.044083,
38.90928
],
[
-77.044051,
38.909247
],
[
-77.044018,
38.909165
],
[
-77.044018,
38.909117
],
[
-77.044029,
38.909071
],
[
-77.044037,
38.909038
],
[
-77.044058,
38.908981
],
[
-77.043996,
38.909021
],
[
-77.043919,
38.909052
],
[
-77.043854,
38.909067
],
[
-77.043798,
38.909073
],
[
-77.043755,
38.909075
],
[
-77.043689,
38.909056
],
[
-77.043656,
38.909048
],
[
-77.04359,
38.909036
],
[
-77.043527,
38.909028
],
[
-77.043486,
38.909026
],
[
-77.043444,
38.909025
],
[
-77.043402,
38.909026
],
[
-77.043344,
38.909029
],
[
-77.043286,
38.909037
],
[
-77.043263,
38.909041
],
[
-77.04323,
38.909047
],
[
-77.043194,
38.909056
],
[
-77.043022,
38.909118
],
[
-77.042995,
38.909132
],
[
-77.04296,
38.909151
],
[
-77.042938,
38.909165
],
[
-77.042915,
38.90918
],
[
-77.042875,
38.909209
],
[
-77.04284,
38.909239
],
[
-77.042823,
38.909255
],
[
-77.042791,
38.909288
],
[
-77.042774,
38.909307
],
[
-77.042712,
38.909315
],
[
-77.042637,
38.909322
],
[
-77.042551,
38.909317
],
[
-77.042422,
38.909299
],
[
-77.041676,
38.90903
],
[
-77.039935,
38.908425
],
[
-77.038503,
38.907925
],
[
-77.037656,
38.907632
],
[
-77.037477,
38.907534
],
[
-77.037317,
38.907438
],
[
-77.037238,
38.90739
],
[
-77.037121,
38.907315
],
[
-77.036997,
38.907233
],
[
-77.036875,
38.907137
],
[
-77.036833,
38.907094
],
[
-77.036817,
38.907081
],
[
-77.036795,
38.907068
],
[
-77.036774,
38.907058
],
[
-77.036767,
38.907052
],
[
-77.036712,
38.907034
],
[
-77.03669,
38.907028
],
[
-77.036643,
38.907022
],
[
-77.03661,
38.907021
],
[
-77.03653,
38.907021
],
[
-77.036474,
38.907021
],
[
-77.03643,
38.907025
],
[
-77.03639,
38.907033
],
[
-77.036295,
38.907058
],
[
-77.036005,
38.906995
],
[
-77.035439,
38.906869
],
[
-77.035142,
38.906757
],
[
-77.035049,
38.906725
],
[
-77.0348,
38.906641
],
[
-77.034673,
38.906594
],
[
-77.034568,
38.906558
],
[
-77.034059,
38.906382
],
[
-77.033931,
38.906338
],
[
-77.032623,
38.905883
],
[
-77.03129,
38.905426
],
[
-77.030031,
38.904982
],
[
-77.029623,
38.904835
],
[
-77.028082,
38.904304
],
[
-77.027679,
38.904167
],
[
-77.02705,
38.903949
],
[
-77.026409,
38.903729
],
[
-77.025984,
38.903579
],
[
-77.024321,
38.902997
],
[
-77.024139,
38.902954
],
[
-77.023952,
38.902954
],
[
-77.023188,
38.902956
],
[
-77.022699,
38.902958
],
[
-77.021917,
38.90296
],
[
-77.021918,
38.902902
],
[
-77.021918,
38.902521
],
[
-77.019907,
38.902521
],
[
-77.018928,
38.902521
],
[
-77.016176,
38.902519
],
[
-77.015177,
38.902518
],
[
-77.013722,
38.902514
],
[
-77.012171,
38.902516
],
[
-77.011237,
38.902516
],
[
-77.009846,
38.902515
],
[
-77.009117,
38.902514
],
[
-77.009126,
38.901346
],
[
-77.00912,
38.900203
],
[
-77.009062,
38.900203
],
[
-77.008975,
38.900203
],
[
-77.008004,
38.900198
],
[
-77.00631,
38.900193
],
[
-77.005531,
38.900197
],
[
-77.002929,
38.9002
],
[
-77.002038,
38.900203
],
[
-77.001892,
38.900203
],
[
-77.000571,
38.900205
],
[
-76.999507,
38.900204
],
[
-76.998442,
38.900204
],
[
-76.998369,
38.900204
],
[
-76.996167,
38.900205
],
[
-76.994961,
38.900203
],
[
-76.994962,
38.899748
],
[
-76.994961,
38.899626
],
[
-76.994961,
38.899367
],
[
-76.994961,
38.898908
],
[
-76.994962,
38.898447
]
]
}

View File

@@ -0,0 +1,7 @@
{
"type": "Model",
"geometry": [ -77.050327, 38.909634 ],
"properties": {
"name": "P Street Northwest - Massachusetts Avenue Northwest"
}
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
{"type":"FeatureCollection","features":[{"type":"Feature","id":"112025b24165963ca83d2b9e6e5943e3","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-48.51562499999926,44.08758502824452],[-48.86718749999943,1.7575368113081424],[5.9765624999998295,-2.2737367544323206e-13],[3.8671874999998295,44.5904671813081],[-48.51562499999926,44.08758502824452]]]}},{"type":"Feature","id":"c5aece77e9cb2eac3b1e3a146e9df170","properties":{},"geometry":{"type":"Polygon","coordinates":[[[29.531249999999517,15.623036831527799],[29.882812499999574,-27.994401411045992],[-17.57812499999983,-22.268764039073815],[-14.062499999999801,24.84656534821923],[29.531249999999517,15.623036831527799]]]}}]}

0
metrics/integration/dist/.gitkeep vendored Normal file
View File

View File

@@ -0,0 +1,18 @@
{
"expression": ["abs", ["get", "x"]],
"inputs": [
[{}, {"properties": {"x": -2}}],
[{}, {"properties": {"x": 2}}],
[{}, {"properties": {"x": -1.1}}]
],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": false,
"isZoomConstant": true,
"type": "number"
},
"outputs": [2, 2, 1.1],
"serialized": ["abs", ["number", ["get", "x"]]]
}
}

View File

@@ -0,0 +1,14 @@
{
"expression": ["acos", 0.5],
"inputs": [[{}, {}]],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": true,
"isZoomConstant": true,
"type": "number"
},
"outputs": [1.04719],
"serialized": 1.0471975511965979
}
}

View File

@@ -0,0 +1,14 @@
{
"expression": ["all"],
"inputs": [[{}, {}]],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": true,
"isZoomConstant": true,
"type": "boolean"
},
"outputs": [true],
"serialized": true
}
}

View File

@@ -0,0 +1,14 @@
{
"expression": ["all", false],
"inputs": [[{}, {}]],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": true,
"isZoomConstant": true,
"type": "boolean"
},
"outputs": [false],
"serialized": false
}
}

View File

@@ -0,0 +1,17 @@
{
"expression": ["all", ["boolean", ["get", "x"]], ["boolean", ["get", "y"]]],
"inputs": [
[{}, {"properties": {"x": true, "y": false}}],
[{}, {"properties": {"x": true, "y": true}}]
],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": false,
"isZoomConstant": true,
"type": "boolean"
},
"outputs": [false, true],
"serialized": ["all", ["boolean", ["get", "x"]], ["boolean", ["get", "y"]]]
}
}

View File

@@ -0,0 +1,14 @@
{
"expression": ["all", false, ["error", "unreachable"]],
"inputs": [[{}, {}]],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": true,
"isZoomConstant": true,
"type": "boolean"
},
"outputs": [false],
"serialized": ["all", false, ["error", "unreachable"]]
}
}

View File

@@ -0,0 +1,14 @@
{
"expression": ["any"],
"inputs": [[{}, {}]],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": true,
"isZoomConstant": true,
"type": "boolean"
},
"outputs": [false],
"serialized": false
}
}

View File

@@ -0,0 +1,14 @@
{
"expression": ["any", false],
"inputs": [[{}, {}]],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": true,
"isZoomConstant": true,
"type": "boolean"
},
"outputs": [false],
"serialized": false
}
}

View File

@@ -0,0 +1,19 @@
{
"expression": ["any", ["boolean", ["get", "x"]], ["boolean", ["get", "y"]]],
"inputs": [
[{}, {"properties": {"x": true, "y": true}}],
[{}, {"properties": {"x": true, "y": false}}],
[{}, {"properties": {"x": false, "y": true}}],
[{}, {"properties": {"x": false, "y": false}}]
],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": false,
"isZoomConstant": true,
"type": "boolean"
},
"outputs": [true, true, true, false],
"serialized": ["any", ["boolean", ["get", "x"]], ["boolean", ["get", "y"]]]
}
}

View File

@@ -0,0 +1,14 @@
{
"expression": ["any", true, ["error", "unreachable"]],
"inputs": [[{}, {}]],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": true,
"isZoomConstant": true,
"type": "boolean"
},
"outputs": [true],
"serialized": ["any", true, ["error", "unreachable"]]
}
}

View File

@@ -0,0 +1,14 @@
{
"expression": ["array", ["literal", [1, 2, 3]]],
"inputs": [[{}, {}]],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": true,
"isZoomConstant": true,
"type": "array"
},
"outputs": [[1, 2, 3]],
"serialized": ["literal", [1, 2, 3]]
}
}

View File

@@ -0,0 +1,22 @@
{
"expression": ["array", "number", null, ["get", "x"], ["literal", [0]]],
"inputs": [
[{}, {}],
[{}, {"properties": {"x": []}}],
[{}, {"properties": {"x": ["1"]}}]
],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": false,
"isZoomConstant": true,
"type": "array<number>"
},
"outputs": [
[0],
[],
[0]
],
"serialized": ["array", "number", null, ["get", "x"], ["literal", [0]]]
}
}

View File

@@ -0,0 +1,20 @@
{
"expression": ["at", 0, ["get", "array"]],
"inputs": [
[{}, {"properties": {"array": [0, 1, 2]}}],
[{}, {"properties": {"array": "not"}}]
],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": false,
"isZoomConstant": true,
"type": "value"
},
"outputs": [
0,
{"error": "Expected value to be of type array, but found string instead."}
],
"serialized": ["at", 0, ["array", ["get", "array"]]]
}
}

View File

@@ -0,0 +1,32 @@
{
"propertySpec": {
"type": "array",
"value": "string",
"property-type": "data-driven",
"expression": {"parameters": ["zoom", "feature"]}
},
"expression": ["get", "array"],
"inputs": [
[{}, {"properties": {"array": ["a", "b"]}}],
[{}, {"properties": {"array": [1, 2]}}],
[{}, {"properties": {"array": "not"}}]
],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": false,
"isZoomConstant": true,
"type": "array<string>"
},
"outputs": [
["a", "b"],
{
"error": "Expected value to be of type array<string>, but found array<number, 2> instead."
},
{
"error": "Expected value to be of type array<string>, but found string instead."
}
],
"serialized": ["array", "string", ["get", "array"]]
}
}

View File

@@ -0,0 +1,33 @@
{
"propertySpec": {
"type": "array",
"value": "number",
"length": 2,
"property-type": "data-driven",
"expression": {"parameters": ["zoom", "feature"]}
},
"expression": ["get", "array"],
"inputs": [
[{}, {"properties": {"array": [1, 2]}}],
[{}, {"properties": {"array": [1, 2, 3]}}],
[{}, {"properties": {"array": "not"}}]
],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": false,
"isZoomConstant": true,
"type": "array<number, 2>"
},
"outputs": [
[1, 2],
{
"error": "Expected value to be of type array<number, 2>, but found array<number, 3> instead."
},
{
"error": "Expected value to be of type array<number, 2>, but found string instead."
}
],
"serialized": ["array", "number", 2, ["get", "array"]]
}
}

View File

@@ -0,0 +1,26 @@
{
"expression": ["array", "number", 2, ["get", "x"]],
"inputs": [
[{}, {"properties": {"x": [1, 0]}}],
[{}, {"properties": {"x": [0]}}],
[{}, {"properties": {"x": [1, 2, 3]}}]
],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": false,
"isZoomConstant": true,
"type": "array<number, 2>"
},
"outputs": [
[1, 0],
{
"error": "Expected value to be of type array<number, 2>, but found array<number, 1> instead."
},
{
"error": "Expected value to be of type array<number, 2>, but found array<number, 3> instead."
}
],
"serialized": ["array", "number", 2, ["get", "x"]]
}
}

View File

@@ -0,0 +1,28 @@
{
"expression": ["array", "string", ["get", "x"]],
"inputs": [
[{}, {"properties": {"x": ["a", "b"]}}],
[{}, {"properties": {"x": [1, 2]}}],
[{}, {"properties": {"x": [1, "b"]}}],
[{}, {"properties": {"x": []}}]
],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": false,
"isZoomConstant": true,
"type": "array<string>"
},
"outputs": [
["a", "b"],
{
"error": "Expected value to be of type array<string>, but found array<number, 2> instead."
},
{
"error": "Expected value to be of type array<string>, but found array<value, 2> instead."
},
[]
],
"serialized": ["array", "string", ["get", "x"]]
}
}

View File

@@ -0,0 +1,14 @@
{
"expression": ["asin", 0.5],
"inputs": [[{}, {}]],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": true,
"isZoomConstant": true,
"type": "number"
},
"outputs": [0.523598],
"serialized": 0.5235987755982989
}
}

View File

@@ -0,0 +1,30 @@
{
"expression": [
"number",
["at", ["number", ["get", "i"]], ["array", ["get", "arr"]]]
],
"inputs": [
[{}, {"properties": {"i": 1, "arr": [9, 8, 7]}}],
[{}, {"properties": {"i": -1, "arr": [9, 8, 7]}}],
[{}, {"properties": {"i": 4, "arr": [9, 8, 7]}}],
[{}, {"properties": {"i": 1.5, "arr": [9, 8, 7]}}]
],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": false,
"isZoomConstant": true,
"type": "number"
},
"outputs": [
8,
{"error": "Array index out of bounds: -1 < 0."},
{"error": "Array index out of bounds: 4 > 2."},
{"error": "Array index must be an integer, but found 1.5 instead."}
],
"serialized": [
"number",
["at", ["number", ["get", "i"]], ["array", ["get", "arr"]]]
]
}
}

View File

@@ -0,0 +1,20 @@
{
"propertySpec": {
"type": "string",
"property-type": "data-driven",
"expression": {"parameters": ["zoom", "feature"]}
},
"expression": ["at", 1, ["literal", [1, 2, 3]]],
"inputs": [],
"expected": {
"compiled": {
"result": "error",
"errors": [
{
"key": "[2]",
"error": "Expected array<string> but found array<number, 3> instead."
}
]
}
}
}

View File

@@ -0,0 +1,14 @@
{
"expression": ["atan", 1],
"inputs": [[{}, {}]],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": true,
"isZoomConstant": true,
"type": "number"
},
"outputs": [0.785398],
"serialized": 0.7853981633974483
}
}

View File

@@ -0,0 +1,42 @@
{
"expression": ["boolean", ["get", "x"]],
"inputs": [
[{}, {}],
[{}, {"properties": {"x": true}}],
[{}, {"properties": {"x": false}}],
[{}, {"properties": {"x": ""}}],
[{}, {"properties": {"x": "false"}}],
[{}, {"properties": {"x": 0}}],
[{}, {"properties": {"x": 1}}],
[{}, {"properties": {"x": null}}]
],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": false,
"isZoomConstant": true,
"type": "boolean"
},
"outputs": [
{
"error": "Expected value to be of type boolean, but found null instead."
},
true,
false,
{
"error": "Expected value to be of type boolean, but found string instead."
},
{
"error": "Expected value to be of type boolean, but found string instead."
},
{
"error": "Expected value to be of type boolean, but found number instead."
},
{
"error": "Expected value to be of type boolean, but found number instead."
},
{"error": "Expected value to be of type boolean, but found null instead."}
],
"serialized": ["boolean", ["get", "x"]]
}
}

View File

@@ -0,0 +1,23 @@
{
"expression": ["boolean", ["get", "x"], false],
"inputs": [
[{}, {}],
[{}, {"properties": {"x": true}}],
[{}, {"properties": {"x": false}}],
[{}, {"properties": {"x": ""}}],
[{}, {"properties": {"x": "false"}}],
[{}, {"properties": {"x": 0}}],
[{}, {"properties": {"x": 1}}],
[{}, {"properties": {"x": null}}]
],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": false,
"isZoomConstant": true,
"type": "boolean"
},
"outputs": [false, true, false, false, false, false, false, false],
"serialized": ["boolean", ["get", "x"], false]
}
}

View File

@@ -0,0 +1,40 @@
{
"propertySpec": {
"type": "string",
"property-type": "data-driven",
"expression": {"parameters": ["zoom", "feature"]}
},
"expression": ["case", ["get", "x"], "x", ["get", "y"], "y", "otherwise"],
"inputs": [
[{}, {"properties": {"x": true, "y": true}}],
[{}, {"properties": {"x": true, "y": false}}],
[{}, {"properties": {"x": false, "y": true}}],
[{}, {"properties": {"x": false, "y": false}}],
[{}, {"properties": {"x": "false", "y": false}}]
],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": false,
"isZoomConstant": true,
"type": "string"
},
"outputs": [
"x",
"x",
"y",
"otherwise",
{
"error": "Expected value to be of type boolean, but found string instead."
}
],
"serialized": [
"case",
["boolean", ["get", "x"]],
"x",
["boolean", ["get", "y"]],
"y",
"otherwise"
]
}
}

View File

@@ -0,0 +1,30 @@
{
"propertySpec": {
"type": "array",
"value": "string",
"property-type": "data-driven",
"expression": {"parameters": ["zoom", "feature"]}
},
"expression": [
"case",
["boolean", ["get", "x"]],
["literal", ["one"]],
["literal", ["one", "two"]]
],
"inputs": [],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": false,
"isZoomConstant": true,
"type": "array<string>"
},
"outputs": [],
"serialized": [
"case",
["boolean", ["get", "x"]],
["literal", ["one"]],
["literal", ["one", "two"]]
]
}
}

View File

@@ -0,0 +1,14 @@
{
"expression": ["boolean", ["all", false, ["case", true, true, true]]],
"inputs": [[{}, {}]],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": true,
"isZoomConstant": true,
"type": "boolean"
},
"outputs": [false],
"serialized": false
}
}

View File

@@ -0,0 +1,23 @@
{
"expression": ["ceil", ["get", "x"]],
"inputs": [
[{}, {"properties": {"x": -2.6}}],
[{}, {"properties": {"x": -2.5}}],
[{}, {"properties": {"x": -2.4}}],
[{}, {"properties": {"x": -2}}],
[{}, {"properties": {"x": 2.6}}],
[{}, {"properties": {"x": 2.5}}],
[{}, {"properties": {"x": 2.4}}],
[{}, {"properties": {"x": 2}}]
],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": false,
"isZoomConstant": true,
"type": "number"
},
"outputs": [-2, -2, -2, -2, 3, 3, 3, 2],
"serialized": ["ceil", ["number", ["get", "x"]]]
}
}

View File

@@ -0,0 +1,12 @@
{
"propertySpec": {"type": "string"},
"expression": ["coalesce", ["get", "a"], 5],
"expected": {
"compiled": {
"result": "error",
"errors": [
{"key": "[2]", "error": "Expected string but found number instead."}
]
}
}
}

View File

@@ -0,0 +1,20 @@
{
"expression": ["coalesce", ["get", "x"], ["get", "y"], ["get", "z"], 0],
"inputs": [
[{}, {"properties": {"x": 1}}],
[{}, {"properties": {"x": 1, "y": 2, "z": 3}}],
[{}, {"properties": {"y": 2}}],
[{}, {"properties": {"z": 3}}],
[{}, {}]
],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": false,
"isZoomConstant": true,
"type": "value"
},
"outputs": [1, 1, 2, 3, 0],
"serialized": ["coalesce", ["get", "x"], ["get", "y"], ["get", "z"], 0]
}
}

View File

@@ -0,0 +1,36 @@
{
"expression": [
"coalesce",
["number", ["get", "x"]],
["number", ["get", "y"]],
["number", ["get", "z"]]
],
"inputs": [
[{}, {"properties": {"x": 1}}],
[{}, {"properties": {"x": 1, "y": 2, "z": 3}}],
[{}, {"properties": {"y": 2}}],
[{}, {"properties": {"z": 3}}],
[{}, {}]
],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": false,
"isZoomConstant": true,
"type": "number"
},
"outputs": [
1,
1,
{"error": "Expected value to be of type number, but found null instead."},
{"error": "Expected value to be of type number, but found null instead."},
{"error": "Expected value to be of type number, but found null instead."}
],
"serialized": [
"coalesce",
["number", ["get", "x"]],
["number", ["get", "y"]],
["number", ["get", "z"]]
]
}
}

View File

@@ -0,0 +1,26 @@
{
"propertySpec": {
"type": "array",
"value": "string",
"property-type": "data-driven",
"expression": {"parameters": ["zoom", "feature"]}
},
"expression": [
"coalesce",
["literal", ["one"]],
["literal", ["one", "two"]],
null
],
"inputs": [],
"expected": {
"compiled": {
"result": "error",
"errors": [
{
"key": "[3]",
"error": "Expected array<string> but found null instead."
}
]
}
}
}

View File

@@ -0,0 +1,25 @@
{
"propertySpec": {"type": "string"},
"expression": ["coalesce", ["get", "a"], ["get", "b"]],
"inputs": [
[{}, {"properties": {"a": "one"}}],
[{}, {"properties": {"b": "two"}}],
[{}, {"properties": {"b": 5}}],
[{}, {"properties": {}}]
],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": false,
"isZoomConstant": true,
"type": "string"
},
"outputs": [
"one",
"two",
"5",
""
],
"serialized": ["to-string", ["coalesce", ["get", "a"], ["get", "b"]]]
}
}

View File

@@ -0,0 +1,15 @@
{
"expectExpressionType": null,
"expression": ["coalesce", ["get", "z"], 0],
"inputs": [[{}, {"properties": {"z": 1}}], [{}, {"properties": {"z": null}}]],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": false,
"isZoomConstant": true,
"type": "value"
},
"outputs": [1, 0],
"serialized": ["coalesce", ["get", "z"], 0]
}
}

View File

@@ -0,0 +1,67 @@
{
"expression": [
"case",
[
"==",
[
"resolved-locale",
[
"collator",
{"case-sensitive": true, "diacritic-sensitive": false, "locale": "de"}
]
],
"de"
],
[
"==",
["string", ["get", "lhs"]],
["get", "rhs"],
[
"collator",
{"case-sensitive": true, "diacritic-sensitive": false, "locale": "de"}
]
],
["case", ["==", ["get", "rhs"], "ue"], true, false]
],
"inputs": [
[{}, {"properties": {"lhs": "ü", "rhs": "ue"}}],
[{}, {"properties": {"lhs": "ü", "rhs": "u"}}]
],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": false,
"isZoomConstant": true,
"type": "boolean"
},
"outputs": [true, false],
"serialized": [
"case",
[
"==",
[
"resolved-locale",
[
"collator",
{
"case-sensitive": true,
"diacritic-sensitive": false,
"locale": "de"
}
]
],
"de"
],
[
"==",
["string", ["get", "lhs"]],
["get", "rhs"],
[
"collator",
{"case-sensitive": true, "diacritic-sensitive": false, "locale": "de"}
]
],
["case", ["==", ["get", "rhs"], "ue"], true, false]
]
}
}

View File

@@ -0,0 +1,34 @@
{
"expression": [
"<",
["string", ["get", "lhs"]],
["get", "rhs"],
[
"collator",
{"case-sensitive": true, "diacritic-sensitive": false, "locale": "en"}
]
],
"inputs": [
[{}, {"properties": {"lhs": "a", "rhs": "ä"}}],
[{}, {"properties": {"lhs": "a", "rhs": "A"}}],
[{}, {"properties": {"lhs": "ä", "rhs": "b"}}]
],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": false,
"isZoomConstant": true,
"type": "boolean"
},
"outputs": [false, true, true],
"serialized": [
"<",
["string", ["get", "lhs"]],
["string", ["get", "rhs"]],
[
"collator",
{"case-sensitive": true, "diacritic-sensitive": false, "locale": "en"}
]
]
}
}

View File

@@ -0,0 +1,40 @@
{
"expression": [
"!",
[
"!=",
["string", ["get", "lhs"]],
["get", "rhs"],
[
"collator",
{"case-sensitive": true, "diacritic-sensitive": false, "locale": "en"}
]
]
],
"inputs": [
[{}, {"properties": {"lhs": "a", "rhs": "ä"}}],
[{}, {"properties": {"lhs": "a", "rhs": "A"}}],
[{}, {"properties": {"lhs": "b", "rhs": "ä"}}]
],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": false,
"isZoomConstant": true,
"type": "boolean"
},
"outputs": [true, false, false],
"serialized": [
"!",
[
"!=",
["string", ["get", "lhs"]],
["get", "rhs"],
[
"collator",
{"case-sensitive": true, "diacritic-sensitive": false, "locale": "en"}
]
]
]
}
}

View File

@@ -0,0 +1,28 @@
{
"expression": [
"==",
["string", ["get", "lhs"]],
["get", "rhs"],
["collator", {"case-sensitive": false, "diacritic-sensitive": false}]
],
"inputs": [
[{}, {"properties": {"lhs": "a", "rhs": "a"}}],
[{}, {"properties": {"lhs": "A", "rhs": "A"}}],
[{}, {"properties": {"lhs": "b", "rhs": "a"}}]
],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": false,
"isZoomConstant": true,
"type": "boolean"
},
"outputs": [true, true, false],
"serialized": [
"==",
["string", ["get", "lhs"]],
["get", "rhs"],
["collator", {"case-sensitive": false, "diacritic-sensitive": false}]
]
}
}

View File

@@ -0,0 +1,34 @@
{
"expression": [
"==",
["string", ["get", "lhs"]],
["get", "rhs"],
[
"collator",
{"case-sensitive": false, "diacritic-sensitive": false, "locale": "en"}
]
],
"inputs": [
[{}, {"properties": {"lhs": "a", "rhs": "ä"}}],
[{}, {"properties": {"lhs": "a", "rhs": "A"}}],
[{}, {"properties": {"lhs": "b", "rhs": "ä"}}]
],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": false,
"isZoomConstant": true,
"type": "boolean"
},
"outputs": [true, true, false],
"serialized": [
"==",
["string", ["get", "lhs"]],
["get", "rhs"],
[
"collator",
{"case-sensitive": false, "diacritic-sensitive": false, "locale": "en"}
]
]
}
}

View File

@@ -0,0 +1,34 @@
{
"expression": [
">",
["string", ["get", "lhs"]],
["get", "rhs"],
[
"collator",
{"case-sensitive": false, "diacritic-sensitive": false, "locale": "en"}
]
],
"inputs": [
[{}, {"properties": {"lhs": "a", "rhs": "ä"}}],
[{}, {"properties": {"lhs": "a", "rhs": "A"}}],
[{}, {"properties": {"lhs": "b", "rhs": "ä"}}]
],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": false,
"isZoomConstant": true,
"type": "boolean"
},
"outputs": [false, false, true],
"serialized": [
">",
["string", ["get", "lhs"]],
["string", ["get", "rhs"]],
[
"collator",
{"case-sensitive": false, "diacritic-sensitive": false, "locale": "en"}
]
]
}
}

View File

@@ -0,0 +1,35 @@
{
"expression": [
"<=",
["string", ["get", "lhs"]],
["get", "rhs"],
[
"collator",
{"case-sensitive": false, "diacritic-sensitive": true, "locale": "en"}
]
],
"inputs": [
[{}, {"properties": {"lhs": "ä", "rhs": "a"}}],
[{}, {"properties": {"lhs": "A", "rhs": "a"}}],
[{}, {"properties": {"lhs": "a", "rhs": "a"}}],
[{}, {"properties": {"lhs": "ä", "rhs": "b"}}]
],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": false,
"isZoomConstant": true,
"type": "boolean"
},
"outputs": [false, true, true, true],
"serialized": [
"<=",
["string", ["get", "lhs"]],
["string", ["get", "rhs"]],
[
"collator",
{"case-sensitive": false, "diacritic-sensitive": true, "locale": "en"}
]
]
}
}

View File

@@ -0,0 +1,40 @@
{
"expression": [
"!",
[
"!=",
["string", ["get", "lhs"]],
["get", "rhs"],
[
"collator",
{"case-sensitive": false, "diacritic-sensitive": true, "locale": "en"}
]
]
],
"inputs": [
[{}, {"properties": {"lhs": "a", "rhs": "ä"}}],
[{}, {"properties": {"lhs": "a", "rhs": "A"}}],
[{}, {"properties": {"lhs": "b", "rhs": "ä"}}]
],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": false,
"isZoomConstant": true,
"type": "boolean"
},
"outputs": [false, true, false],
"serialized": [
"!",
[
"!=",
["string", ["get", "lhs"]],
["get", "rhs"],
[
"collator",
{"case-sensitive": false, "diacritic-sensitive": true, "locale": "en"}
]
]
]
}
}

View File

@@ -0,0 +1,32 @@
{
"expression": [
"==",
["string", ["get", "lhs"]],
["get", "rhs"],
["collator", {"diacritic-sensitive": true, "locale": "en"}]
],
"inputs": [
[{}, {"properties": {"lhs": "ä", "rhs": "a"}}],
[{}, {"properties": {"lhs": "A", "rhs": "a"}}],
[{}, {"properties": {"lhs": "a", "rhs": "a"}}],
[{}, {"properties": {"lhs": "ä", "rhs": "b"}}]
],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": false,
"isZoomConstant": true,
"type": "boolean"
},
"outputs": [false, true, true, false],
"serialized": [
"==",
["string", ["get", "lhs"]],
["get", "rhs"],
[
"collator",
{"case-sensitive": false, "diacritic-sensitive": true, "locale": "en"}
]
]
}
}

View File

@@ -0,0 +1,16 @@
{
"expression": [
"<",
1,
2,
["collator", {"case-sensitive": false, "diacritic-sensitive": false}]
],
"expected": {
"compiled": {
"result": "error",
"errors": [
{"key": "", "error": "Cannot use collator to compare non-string types."}
]
}
}
}

View File

@@ -0,0 +1,31 @@
{
"expression": [
"<",
["string", ["get", "lhs"]],
["get", "rhs"],
["collator", {"case-sensitive": ["==", 1, 1], "locale": "en"}]
],
"inputs": [
[{}, {"properties": {"lhs": "a", "rhs": "ä"}}],
[{}, {"properties": {"lhs": "a", "rhs": "A"}}],
[{}, {"properties": {"lhs": "ä", "rhs": "b"}}]
],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": false,
"isZoomConstant": true,
"type": "boolean"
},
"outputs": [false, true, true],
"serialized": [
"<",
["string", ["get", "lhs"]],
["string", ["get", "rhs"]],
[
"collator",
{"case-sensitive": true, "diacritic-sensitive": false, "locale": "en"}
]
]
}
}

View File

@@ -0,0 +1,16 @@
{
"expression": [
"==",
1,
2,
["collator", {"case-sensitive": false, "diacritic-sensitive": false}]
],
"expected": {
"compiled": {
"result": "error",
"errors": [
{"key": "", "error": "Cannot use collator to compare non-string types."}
]
}
}
}

View File

@@ -0,0 +1,11 @@
{
"expression": ["==", "foo", "bar", ["collator", ["subexpression"]]],
"expected": {
"compiled": {
"result": "error",
"errors": [
{"key": "[3]", "error": "Collator options argument must be an object."}
]
}
}
}

View File

@@ -0,0 +1,34 @@
{
"expression": [
"==",
["string", ["get", "lhs"]],
["get", "rhs"],
[
"collator",
{"case-sensitive": true, "diacritic-sensitive": true, "locale": "en"}
]
],
"inputs": [
[{}, {"properties": {"lhs": "a", "rhs": "ä"}}],
[{}, {"properties": {"lhs": "a", "rhs": "A"}}],
[{}, {"properties": {"lhs": "b", "rhs": "ä"}}]
],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": false,
"isZoomConstant": true,
"type": "boolean"
},
"outputs": [false, false, false],
"serialized": [
"==",
["string", ["get", "lhs"]],
["get", "rhs"],
[
"collator",
{"case-sensitive": true, "diacritic-sensitive": true, "locale": "en"}
]
]
}
}

View File

@@ -0,0 +1,35 @@
{
"expression": [
">=",
["string", ["get", "lhs"]],
["get", "rhs"],
[
"collator",
{"case-sensitive": true, "diacritic-sensitive": true, "locale": "en"}
]
],
"inputs": [
[{}, {"properties": {"lhs": "a", "rhs": "ä"}}],
[{}, {"properties": {"lhs": "a", "rhs": "A"}}],
[{}, {"properties": {"lhs": "a", "rhs": "a"}}],
[{}, {"properties": {"lhs": "b", "rhs": "ä"}}]
],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": false,
"isZoomConstant": true,
"type": "boolean"
},
"outputs": [false, false, true, true],
"serialized": [
">=",
["string", ["get", "lhs"]],
["string", ["get", "rhs"]],
[
"collator",
{"case-sensitive": true, "diacritic-sensitive": true, "locale": "en"}
]
]
}
}

View File

@@ -0,0 +1,14 @@
{
"expression": ["concat"],
"inputs": [[{}, {}]],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": true,
"isZoomConstant": true,
"type": "string"
},
"outputs": [""],
"serialized": ""
}
}

View File

@@ -0,0 +1,14 @@
{
"expression": ["concat", "foo"],
"inputs": [[{}, {}]],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": true,
"isZoomConstant": true,
"type": "string"
},
"outputs": ["foo"],
"serialized": "foo"
}
}

View File

@@ -0,0 +1,14 @@
{
"expression": ["concat", "a", "b", "c"],
"inputs": [[{}, {}]],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": true,
"isZoomConstant": true,
"type": "string"
},
"outputs": ["abc"],
"serialized": "abc"
}
}

View File

@@ -0,0 +1,14 @@
{
"expression": ["concat", ["get", "a"], ["get", "1"], ["get", "true"]],
"inputs": [[{}, {"properties": {"a": "a", "1": 1, "true": true}}]],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": false,
"isZoomConstant": true,
"type": "string"
},
"outputs": ["a1true"],
"serialized": ["concat", ["get", "a"], ["get", "1"], ["get", "true"]]
}
}

View File

@@ -0,0 +1,23 @@
{
"propertySpec": {
"type": "color",
"property-type": "data-driven",
"expression": {"parameters": ["zoom", "feature"]}
},
"expression": ["step", ["get", "x"], "black", 0, "invalid", 10, "blue"],
"inputs": [
[{}, {"properties": {"x": -1}}],
[{}, {"properties": {"x": 0}}],
[{}, {"properties": {"x": 5}}],
[{}, {"properties": {"x": 10}}],
[{}, {"properties": {"x": 11}}]
],
"expected": {
"compiled": {
"result": "error",
"errors": [
{"key": "[4]", "error": "Could not parse color from value 'invalid'"}
]
}
}
}

View File

@@ -0,0 +1,15 @@
{
"propertySpec": {"type": "color"},
"expression": "red",
"inputs": [[{}, {}]],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": true,
"isZoomConstant": true,
"type": "color"
},
"outputs": [[1, 0, 0, 1]],
"serialized": ["rgba", 255, 0, 0, 1]
}
}

View File

@@ -0,0 +1,14 @@
{
"expression": ["to-color", "red"],
"inputs": [[{}, {}]],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": true,
"isZoomConstant": true,
"type": "color"
},
"outputs": [[1, 0, 0, 1]],
"serialized": ["rgba", 255, 0, 0, 1]
}
}

View File

@@ -0,0 +1,21 @@
{
"expression": [
"let",
"a",
1,
"b",
2,
["+", ["+", ["var", "a"], ["var", "b"]], ["var", "a"]]
],
"inputs": [[{}, {}]],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": true,
"isZoomConstant": true,
"type": "number"
},
"outputs": [4],
"serialized": 4
}
}

View File

@@ -0,0 +1,14 @@
{
"expression": ["cos", 0],
"inputs": [[{}, {}]],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": true,
"isZoomConstant": true,
"type": "number"
},
"outputs": [1],
"serialized": 1
}
}

View File

@@ -0,0 +1,14 @@
{
"expression": ["/", 10, 5],
"inputs": [[{}, {}]],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": true,
"isZoomConstant": true,
"type": "number"
},
"outputs": [2],
"serialized": 2
}
}

View File

@@ -0,0 +1,14 @@
{
"expression": ["downcase", "StRiNg"],
"inputs": [[{}, {}]],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": true,
"isZoomConstant": true,
"type": "string"
},
"outputs": ["string"],
"serialized": "string"
}
}

View File

@@ -0,0 +1,14 @@
{
"expression": ["e"],
"inputs": [[{}, {}]],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": true,
"isZoomConstant": true,
"type": "number"
},
"outputs": [2.71828],
"serialized": 2.718281828459045
}
}

View File

@@ -0,0 +1,14 @@
{
"expression": ["==", ["get", "x"], ["literal", [1]]],
"expected": {
"compiled": {
"result": "error",
"errors": [
{
"key": "[2]",
"error": "\"==\" comparisons are not supported for type 'array<number, 1>'."
}
]
}
}
}

View File

@@ -0,0 +1,31 @@
{
"expression": [
"==",
["get", "x"],
["get", "y"],
["collator", {"case-sensitive": false, "diacritic-sensitive": false}]
],
"inputs": [
[{}, {"properties": {"x": "a", "y": "A"}}],
[{}, {"properties": {"x": "1", "y": "2"}}],
[{}, {"properties": {"x": "1", "y": null}}],
[{}, {"properties": {"x": null, "y": null}}],
[{}, {"properties": {"x": 1, "y": "1"}}],
[{}, {"properties": {"x": 1, "y": 1}}]
],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": false,
"isZoomConstant": true,
"type": "boolean"
},
"outputs": [true, false, false, true, false, true],
"serialized": [
"==",
["get", "x"],
["get", "y"],
["collator", {"case-sensitive": false, "diacritic-sensitive": false}]
]
}
}

View File

@@ -0,0 +1,14 @@
{
"expression": ["==", ["get", "x"], ["to-color", "red"]],
"expected": {
"compiled": {
"result": "error",
"errors": [
{
"key": "[2]",
"error": "\"==\" comparisons are not supported for type 'color'."
}
]
}
}
}

View File

@@ -0,0 +1,11 @@
{
"expression": ["==", ["string", ["get", "x"]], ["number", ["get", "y"]]],
"expected": {
"compiled": {
"result": "error",
"errors": [
{"key": "", "error": "Cannot compare types 'string' and 'number'."}
]
}
}
}

View File

@@ -0,0 +1,14 @@
{
"expression": ["==", null, ["get", "x"]],
"inputs": [[{}, {"properties": {}}], [{}, {"properties": {"x": 1}}]],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": false,
"isZoomConstant": true,
"type": "boolean"
},
"outputs": [true, false],
"serialized": ["==", null, ["get", "x"]]
}
}

View File

@@ -0,0 +1,14 @@
{
"expression": ["==", null, ["get", "x"]],
"inputs": [[{}, {"properties": {}}], [{}, {"properties": {"x": 1}}]],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": false,
"isZoomConstant": true,
"type": "boolean"
},
"outputs": [true, false],
"serialized": ["==", null, ["get", "x"]]
}
}

View File

@@ -0,0 +1,18 @@
{
"expression": ["==", ["number", ["get", "x"]], ["get", "y"]],
"inputs": [
[{}, {"properties": {"x": 1, "y": 1}}],
[{}, {"properties": {"x": 1, "y": 2}}],
[{}, {"properties": {"x": 1, "y": "1"}}]
],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": false,
"isZoomConstant": true,
"type": "boolean"
},
"outputs": [true, false, false],
"serialized": ["==", ["number", ["get", "x"]], ["get", "y"]]
}
}

View File

@@ -0,0 +1,14 @@
{
"expression": ["==", ["get", "x"], ["literal", {}]],
"expected": {
"compiled": {
"result": "error",
"errors": [
{
"key": "[2]",
"error": "\"==\" comparisons are not supported for type 'object'."
}
]
}
}
}

View File

@@ -0,0 +1,18 @@
{
"expression": ["==", ["string", ["get", "x"]], ["get", "y"]],
"inputs": [
[{}, {"properties": {"x": "1", "y": "1"}}],
[{}, {"properties": {"x": "1", "y": 2}}],
[{}, {"properties": {"x": "1", "y": 1}}]
],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": false,
"isZoomConstant": true,
"type": "boolean"
},
"outputs": [true, false, false],
"serialized": ["==", ["string", ["get", "x"]], ["get", "y"]]
}
}

View File

@@ -0,0 +1,21 @@
{
"expression": ["==", ["get", "x"], ["get", "y"]],
"inputs": [
[{}, {"properties": {"x": 0, "y": 0}}],
[{}, {"properties": {"x": "0", "y": "0"}}],
[{}, {"properties": {"x": 0, "y": false}}],
[{}, {"properties": {"x": 0, "y": "0"}}],
[{}, {"properties": {"x": 0, "y": null}}],
[{}, {"properties": {"x": "0", "y": null}}]
],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": false,
"isZoomConstant": true,
"type": "boolean"
},
"outputs": [true, true, false, false, false, false],
"serialized": ["==", ["get", "x"], ["get", "y"]]
}
}

View File

@@ -0,0 +1,23 @@
{
"expression": ["floor", ["get", "x"]],
"inputs": [
[{}, {"properties": {"x": -2.6}}],
[{}, {"properties": {"x": -2.5}}],
[{}, {"properties": {"x": -2.4}}],
[{}, {"properties": {"x": -2}}],
[{}, {"properties": {"x": 2.6}}],
[{}, {"properties": {"x": 2.5}}],
[{}, {"properties": {"x": 2.4}}],
[{}, {"properties": {"x": 2}}]
],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": false,
"isZoomConstant": true,
"type": "number"
},
"outputs": [-3, -3, -3, -2, 2, 2, 2, 2],
"serialized": ["floor", ["number", ["get", "x"]]]
}
}

View File

@@ -0,0 +1,96 @@
{
"expression": [
"format",
"a",
{},
"b",
{
"font-scale": 2
},
"c",
{
"text-font": [
"literal",
[
"a",
"b"
]
]
},
"d",
{
"text-color": "rgb(0, 255, 0)"
}
],
"inputs": [
[
{},
{}
]
],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": true,
"isZoomConstant": true,
"type": "formatted"
},
"outputs": [
{
"sections": [
{
"text": "a",
"image": null,
"scale": null,
"fontStack": null,
"textColor": null
},
{
"text": "b",
"image": null,
"scale": 2,
"fontStack": null,
"textColor": null
},
{
"text": "c",
"image": null,
"scale": null,
"fontStack": "a,b",
"textColor": null
},
{
"text": "d",
"image": null,
"scale": null,
"fontStack": null,
"textColor": {"r":0,"g":1,"b":0,"a":1}
}
]
}
],
"serialized": [
"format",
"a",
{},
"b",
{
"font-scale": 2
},
"c",
{
"text-font": [
"literal",
[
"a",
"b"
]
]
},
"d",
{
"text-color": ["rgba", 0, 255, 0, 1]
}
]
}
}

View File

@@ -0,0 +1,56 @@
{
"expression": [
"format",
["get", "a"],
{},
["get", "1"],
{},
["get", "true"],
{}
],
"inputs": [[{}, {"properties": {"a": "a", "1": 1, "true": true}}]],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": false,
"isZoomConstant": true,
"type": "formatted"
},
"outputs": [
{
"sections": [
{
"text": "a",
"image": null,
"scale": null,
"fontStack": null,
"textColor": null
},
{
"text": "1",
"image": null,
"scale": null,
"fontStack": null,
"textColor": null
},
{
"text": "true",
"image": null,
"scale": null,
"fontStack": null,
"textColor": null
}
]
}
],
"serialized": [
"format",
["get", "a"],
{},
["get", "1"],
{},
["get", "true"],
{}
]
}
}

View File

@@ -0,0 +1,52 @@
{
"expression": [
"format",
"a",
{
"font-scale": ["get", "font-scale"]
}
],
"inputs": [
[{}, {"properties": {"font-scale": 1.5}}],
[{}, {"properties": {"font-scale": 0.5}}]
],
"expected": {
"compiled": {
"result": "success",
"isFeatureConstant": false,
"isZoomConstant": true,
"type": "formatted"
},
"outputs": [
{
"sections": [
{
"text": "a",
"image": null,
"scale": 1.5,
"fontStack": null,
"textColor": null
}
]
},
{
"sections": [
{
"text": "a",
"image": null,
"scale": 0.5,
"fontStack": null,
"textColor": null
}
]
}
],
"serialized": [
"format",
"a",
{
"font-scale": ["number", ["get", "font-scale"]]
}
]
}
}

Some files were not shown because too many files have changed in this diff Show More