@maplibre/maplibre-gl-style-spec
Version:
a specification for maplibre styles
500 lines (469 loc) • 14.7 kB
text/typescript
import {migrateV8 as migrate} from './v8';
import {describe, test, expect} from 'vitest';
describe('migrate v8', () => {
test('split text-font', () => {
const input = {
version: 7,
sources: {
vector: {
type: 'vector',
url: 'http://www.example.com/example.json'
}
},
layers: [
{
id: 'minimum',
type: 'symbol',
source: 'vector',
'source-layer': 'layer',
layout: {
'text-font': 'Helvetica, Arial',
'text-field': '{foo}'
}
}
]
} as any;
const output = {
version: 8,
sources: {
vector: {
type: 'vector',
url: 'http://www.example.com/example.json'
}
},
layers: [
{
id: 'minimum',
type: 'symbol',
source: 'vector',
'source-layer': 'layer',
layout: {
'text-font': ['Helvetica', 'Arial'],
'text-field': '{foo}'
}
}
]
};
expect(migrate(input)).toEqual(output);
});
test('rename symbol-min-distance', () => {
const input = {
version: 7,
sources: {
vector: {
type: 'vector',
url: 'http://www.example.com/example.json'
}
},
layers: [
{
id: 'minimum',
type: 'symbol',
source: 'vector',
'source-layer': 'layer',
layout: {
'symbol-min-distance': 2
}
}
]
} as any;
const output = {
version: 8,
sources: {
vector: {
type: 'vector',
url: 'http://www.example.com/example.json'
}
},
layers: [
{
id: 'minimum',
type: 'symbol',
source: 'vector',
'source-layer': 'layer',
layout: {
'symbol-spacing': 2
}
}
]
};
expect(migrate(input)).toEqual(output);
});
test('renames urls', () => {
const input = {
version: 7,
sources: {
vector: {
type: 'video',
url: ['foo'],
coordinates: [
[1, 0],
[1, 0],
[1, 0],
[1, 0]
]
}
},
layers: []
} as any;
const output = {
version: 8,
sources: {
vector: {
type: 'video',
urls: ['foo'],
coordinates: [
[0, 1],
[0, 1],
[0, 1],
[0, 1]
]
}
},
layers: []
};
expect(migrate(input)).toEqual(output);
});
test('not migrate interpolated functions', () => {
const input = {
version: 7,
sources: {
vector: {
type: 'vector',
url: 'http://www.example.com/example.json'
}
},
layers: [
{
id: 'functions',
type: 'symbol',
source: 'vector',
'source-layer': 'layer',
layout: {
'line-width': {
base: 2,
stops: [
[1, 2],
[3, 6]
]
}
}
}
]
} as any;
const output = {
version: 8,
sources: {
vector: {
type: 'vector',
url: 'http://www.example.com/example.json'
}
},
layers: [
{
id: 'functions',
type: 'symbol',
source: 'vector',
'source-layer': 'layer',
layout: {
'line-width': {
base: 2,
stops: [
[1, 2],
[3, 6]
]
}
}
}
]
};
expect(migrate(input)).toEqual(output);
});
test('not migrate piecewise-constant functions', () => {
const input = {
version: 7,
sources: {
vector: {
type: 'vector',
url: 'http://www.example.com/example.json'
}
},
layers: [
{
id: 'functions',
type: 'symbol',
source: 'vector',
'source-layer': 'layer',
layout: {
'text-transform': {
stops: [
[1, 'uppercase'],
[3, 'lowercase']
]
}
}
}
]
} as any;
const output = {
version: 8,
sources: {
vector: {
type: 'vector',
url: 'http://www.example.com/example.json'
}
},
layers: [
{
id: 'functions',
type: 'symbol',
source: 'vector',
'source-layer': 'layer',
layout: {
'text-transform': {
stops: [
[1, 'uppercase'],
[3, 'lowercase']
]
}
}
}
]
};
expect(migrate(input)).toEqual(output);
});
test('inline constants', () => {
const input = {
version: 7,
constants: {
'@foo': 0.5
},
sources: {
vector: {type: 'vector', url: 'http://www.example.com/example.json'}
},
layers: [
{
id: 'minimum',
type: 'fill',
source: 'vector',
'source-layer': 'layer',
layout: {
'fill-opacity': '@foo'
}
}
]
} as any;
const output = {
version: 8,
sources: {
vector: {type: 'vector', url: 'http://www.example.com/example.json'}
},
layers: [
{
id: 'minimum',
type: 'fill',
source: 'vector',
'source-layer': 'layer',
layout: {
'fill-opacity': 0.5
}
}
]
};
expect(migrate(input)).toEqual(output);
});
test('migrate and inline fontstack constants', () => {
const input = {
version: 7,
constants: {
'@foo': 'Arial Unicode,Foo Bar'
},
sources: {
vector: {type: 'vector', url: 'http://www.example.com/example.json'}
},
layers: [
{
id: 'minimum',
type: 'symbol',
source: 'vector',
'source-layer': 'layer',
layout: {
'text-font': '@foo'
}
}
]
} as any;
const output = {
version: 8,
sources: {
vector: {type: 'vector', url: 'http://www.example.com/example.json'}
},
layers: [
{
id: 'minimum',
type: 'symbol',
source: 'vector',
'source-layer': 'layer',
layout: {
'text-font': ['Arial Unicode', 'Foo Bar']
}
}
]
};
expect(migrate(input)).toEqual(output);
});
test('update fontstack function', () => {
const input = {
version: 7,
sources: {
vector: {type: 'vector', url: 'http://www.example.com/example.json'}
},
layers: [
{
id: 'minimum',
type: 'symbol',
source: 'vector',
'source-layer': 'layer',
layout: {
'text-font': {
base: 1,
stops: [
[0, 'Open Sans Regular, Arial Unicode MS Regular'],
[6, 'Open Sans Semibold, Arial Unicode MS Regular']
]
}
}
}
]
} as any;
const output = {
version: 8,
sources: {
vector: {type: 'vector', url: 'http://www.example.com/example.json'}
},
layers: [
{
id: 'minimum',
type: 'symbol',
source: 'vector',
'source-layer': 'layer',
layout: {
'text-font': {
base: 1,
stops: [
[0, ['Open Sans Regular', 'Arial Unicode MS Regular']],
[6, ['Open Sans Semibold', 'Arial Unicode MS Regular']]
]
}
}
}
]
};
expect(migrate(input)).toEqual(output);
});
test('inline and migrate fontstack constant function', () => {
const input = {
version: 7,
constants: {
'@function': {
base: 1,
stops: [
[0, 'Open Sans Regular, Arial Unicode MS Regular'],
[6, 'Open Sans Semibold, Arial Unicode MS Regular']
]
}
},
sources: {
vector: {type: 'vector', url: 'http://www.example.com/example.json'}
},
layers: [
{
id: 'minimum',
type: 'symbol',
source: 'vector',
'source-layer': 'layer',
layout: {
'text-font': '@function'
}
}
]
} as any;
const output = {
version: 8,
sources: {
vector: {type: 'vector', url: 'http://www.example.com/example.json'}
},
layers: [
{
id: 'minimum',
type: 'symbol',
source: 'vector',
'source-layer': 'layer',
layout: {
'text-font': {
base: 1,
stops: [
[0, ['Open Sans Regular', 'Arial Unicode MS Regular']],
[6, ['Open Sans Semibold', 'Arial Unicode MS Regular']]
]
}
}
}
]
};
expect(migrate(input)).toEqual(output);
});
test('update fontstack function constant', () => {
const input = {
version: 7,
constants: {
'@font-stack-a': 'Open Sans Regular, Arial Unicode MS Regular',
'@font-stack-b': 'Open Sans Semibold, Arial Unicode MS Regular'
},
sources: {
vector: {type: 'vector', url: 'http://www.example.com/example.json'}
},
layers: [
{
id: 'minimum',
type: 'symbol',
source: 'vector',
'source-layer': 'layer',
layout: {
'text-font': {
base: 1,
stops: [
[0, '@font-stack-a'],
[6, '@font-stack-b']
]
}
}
}
]
} as any;
const output = {
version: 8,
sources: {
vector: {type: 'vector', url: 'http://www.example.com/example.json'}
},
layers: [
{
id: 'minimum',
type: 'symbol',
source: 'vector',
'source-layer': 'layer',
layout: {
'text-font': {
base: 1,
stops: [
[0, ['Open Sans Regular', 'Arial Unicode MS Regular']],
[6, ['Open Sans Semibold', 'Arial Unicode MS Regular']]
]
}
}
}
]
};
expect(migrate(input)).toEqual(output);
});
});