Skip to content

Commit d56b0b6

Browse files
authored
Add transition property typings (#1206)
* add transition property typings * exclude *.test-d.ts files from coverage * exclude *.test-d.ts files from test-build coverage
1 parent b49ea57 commit d56b0b6

File tree

4 files changed

+175
-3
lines changed

4 files changed

+175
-3
lines changed

build/generate-style-spec.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,10 @@ function propertyDeclaration(key, property) {
6767
return `"${key}"${property.required ? '' : '?'}: ${propertyType(property)}`;
6868
}
6969

70+
function transitionPropertyDeclaration(key) {
71+
return `"${key}-transition"?: TransitionSpecification`;
72+
}
73+
7074
function objectDeclaration(key, properties) {
7175
return `export type ${key} = ${objectType(properties, '')};`;
7276
}
@@ -75,7 +79,14 @@ function objectType(properties, indent) {
7579
return `{
7680
${Object.keys(properties)
7781
.filter(k => k !== '*')
78-
.map(k => ` ${indent}${propertyDeclaration(k, properties[k])}`)
82+
.flatMap(k => {
83+
const declarations = [propertyDeclaration(k, properties[k])];
84+
if (properties[k].transition) {
85+
declarations.push(transitionPropertyDeclaration(k));
86+
}
87+
return declarations;
88+
})
89+
.map(declaration => ` ${indent}${declaration}`)
7990
.join(',\n')}
8091
${indent}}`;
8192
}

src/index.test-d.ts

Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
import {describe, expectTypeOf, test} from 'vitest';
2+
import type {
3+
BackgroundLayerSpecification,
4+
CircleLayerSpecification,
5+
ColorReliefLayerSpecification,
6+
FillExtrusionLayerSpecification,
7+
FillLayerSpecification,
8+
HeatmapLayerSpecification,
9+
HillshadeLayerSpecification,
10+
LightSpecification,
11+
LineLayerSpecification,
12+
RasterLayerSpecification,
13+
SkySpecification,
14+
SymbolLayerSpecification,
15+
} from './types.g';
16+
17+
describe('style-spec', () => {
18+
test('LightSpecification contains *-transition keys for transitionable properties', () => {
19+
expectTypeOf<{'position-transition': {duration: 100}}>().toExtend<LightSpecification>();
20+
expectTypeOf<{'color-transition': {duration: 100}}>().toExtend<LightSpecification>();
21+
expectTypeOf<{'intensity-transition': {duration: 100}}>().toExtend<LightSpecification>();
22+
});
23+
test('LightSpecification does not contain *-transition keys for untransitionable properties', () => {
24+
expectTypeOf<{'anchor-transition': {duration: 100}}>().not.toExtend<LightSpecification>();
25+
});
26+
27+
test('SkySpecification contains *-transition keys for transitionable properties', () => {
28+
expectTypeOf<{'sky-color-transition': {duration: 100}}>().toExtend<SkySpecification>();
29+
expectTypeOf<{'horizon-color-transition': {duration: 100}}>().toExtend<SkySpecification>();
30+
expectTypeOf<{'fog-color-transition': {duration: 100}}>().toExtend<SkySpecification>();
31+
expectTypeOf<{'fog-ground-blend-transition': {duration: 100}}>().toExtend<SkySpecification>();
32+
expectTypeOf<{'horizon-fog-blend-transition': {duration: 100}}>().toExtend<SkySpecification>();
33+
expectTypeOf<{'sky-horizon-blend-transition': {duration: 100}}>().toExtend<SkySpecification>();
34+
expectTypeOf<{'atmosphere-blend-transition': {duration: 100}}>().toExtend<SkySpecification>();
35+
});
36+
37+
test('BackgroundLayerSpecification contains *-transition keys for transitionable paint properties', () => {
38+
expectTypeOf<{'background-color-transition': {duration: 100}}>().toExtend<BackgroundLayerSpecification['paint']>();
39+
expectTypeOf<{'background-pattern-transition': {duration: 100}}>().toExtend<BackgroundLayerSpecification['paint']>();
40+
expectTypeOf<{'background-opacity-transition': {duration: 100}}>().toExtend<BackgroundLayerSpecification['paint']>();
41+
});
42+
43+
test('CircleLayerSpecification contains *-transition keys for transitionable paint properties', () => {
44+
expectTypeOf<{'circle-radius-transition': {duration: 100}}>().toExtend<CircleLayerSpecification['paint']>();
45+
expectTypeOf<{'circle-color-transition': {duration: 100}}>().toExtend<CircleLayerSpecification['paint']>();
46+
expectTypeOf<{'circle-blur-transition': {duration: 100}}>().toExtend<CircleLayerSpecification['paint']>();
47+
expectTypeOf<{'circle-opacity-transition': {duration: 100}}>().toExtend<CircleLayerSpecification['paint']>();
48+
expectTypeOf<{'circle-translate-transition': {duration: 100}}>().toExtend<CircleLayerSpecification['paint']>();
49+
expectTypeOf<{'circle-stroke-width-transition': {duration: 100}}>().toExtend<CircleLayerSpecification['paint']>();
50+
expectTypeOf<{'circle-stroke-color-transition': {duration: 100}}>().toExtend<CircleLayerSpecification['paint']>();
51+
expectTypeOf<{'circle-stroke-opacity-transition': {duration: 100}}>().toExtend<CircleLayerSpecification['paint']>();
52+
});
53+
test('CircleLayerSpecification does not contain *-transition keys for untransitionable paint properties', () => {
54+
expectTypeOf<{'circle-translate-anchor-transition': {duration: 100}}>().not.toExtend<CircleLayerSpecification['paint']>();
55+
expectTypeOf<{'circle-pitch-scale-transition': {duration: 100}}>().not.toExtend<CircleLayerSpecification['paint']>();
56+
expectTypeOf<{'circle-pitch-alignment-transition': {duration: 100}}>().not.toExtend<CircleLayerSpecification['paint']>();
57+
});
58+
59+
test('ColorReliefLayerSpecification contains *-transition keys for transitionable paint properties', () => {
60+
expectTypeOf<{'color-relief-opacity-transition': {duration: 100}}>().toExtend<ColorReliefLayerSpecification['paint']>();
61+
});
62+
test('ColorReliefLayerSpecification does not contain *-transition keys for untransitionable paint properties', () => {
63+
expectTypeOf<{'color-relief-color-transition': {duration: 100}}>().not.toExtend<ColorReliefLayerSpecification['paint']>();
64+
});
65+
66+
test('FillLayerSpecification contains *-transition keys for transitionable paint properties', () => {
67+
expectTypeOf<{'fill-opacity-transition': {duration: 100}}>().toExtend<FillLayerSpecification['paint']>();
68+
expectTypeOf<{'fill-color-transition': {duration: 100}}>().toExtend<FillLayerSpecification['paint']>();
69+
expectTypeOf<{'fill-outline-color-transition': {duration: 100}}>().toExtend<FillLayerSpecification['paint']>();
70+
expectTypeOf<{'fill-translate-transition': {duration: 100}}>().toExtend<FillLayerSpecification['paint']>();
71+
expectTypeOf<{'fill-pattern-transition': {duration: 100}}>().toExtend<FillLayerSpecification['paint']>();
72+
});
73+
test('FillLayerSpecification does not contain *-transition keys for untransitionable paint properties', () => {
74+
expectTypeOf<{'fill-antialias-transition': {duration: 100}}>().not.toExtend<FillLayerSpecification['paint']>();
75+
expectTypeOf<{'fill-translate-anchor-transition': {duration: 100}}>().not.toExtend<FillLayerSpecification['paint']>();
76+
});
77+
78+
test('FillExtrusionLayerSpecification contains *-transition keys for transitionable paint properties', () => {
79+
expectTypeOf<{'fill-extrusion-opacity-transition': {duration: 100}}>().toExtend<FillExtrusionLayerSpecification['paint']>();
80+
expectTypeOf<{'fill-extrusion-color-transition': {duration: 100}}>().toExtend<FillExtrusionLayerSpecification['paint']>();
81+
expectTypeOf<{'fill-extrusion-translate-transition': {duration: 100}}>().toExtend<FillExtrusionLayerSpecification['paint']>();
82+
expectTypeOf<{'fill-extrusion-pattern-transition': {duration: 100}}>().toExtend<FillExtrusionLayerSpecification['paint']>();
83+
expectTypeOf<{'fill-extrusion-height-transition': {duration: 100}}>().toExtend<FillExtrusionLayerSpecification['paint']>();
84+
expectTypeOf<{'fill-extrusion-base-transition': {duration: 100}}>().toExtend<FillExtrusionLayerSpecification['paint']>();
85+
});
86+
test('FillExtrusionLayerSpecification does not contain *-transition keys for untransitionable paint properties', () => {
87+
expectTypeOf<{'fill-extrusion-translate-anchor-transition': {duration: 100}}>().not.toExtend<FillExtrusionLayerSpecification['paint']>();
88+
expectTypeOf<{'fill-extrusion-vertical-gradient-transition': {duration: 100}}>().not.toExtend<FillExtrusionLayerSpecification['paint']>();
89+
});
90+
91+
test('HeatmapLayerSpecification contains *-transition keys for transitionable paint properties', () => {
92+
expectTypeOf<{'heatmap-radius-transition': {duration: 100}}>().toExtend<HeatmapLayerSpecification['paint']>();
93+
expectTypeOf<{'heatmap-intensity-transition': {duration: 100}}>().toExtend<HeatmapLayerSpecification['paint']>();
94+
expectTypeOf<{'heatmap-opacity-transition': {duration: 100}}>().toExtend<HeatmapLayerSpecification['paint']>();
95+
});
96+
test('HeatmapLayerSpecification does not contain *-transition keys for untransitionable paint properties', () => {
97+
expectTypeOf<{'heatmap-weight-transition': {duration: 100}}>().not.toExtend<HeatmapLayerSpecification['paint']>();
98+
expectTypeOf<{'heatmap-color-transition': {duration: 100}}>().not.toExtend<HeatmapLayerSpecification['paint']>();
99+
});
100+
101+
test('HillshadeLayerSpecification contains *-transition keys for transitionable paint properties', () => {
102+
expectTypeOf<{'hillshade-exaggeration-transition': {duration: 100}}>().toExtend<HillshadeLayerSpecification['paint']>();
103+
expectTypeOf<{'hillshade-shadow-color-transition': {duration: 100}}>().toExtend<HillshadeLayerSpecification['paint']>();
104+
expectTypeOf<{'hillshade-highlight-color-transition': {duration: 100}}>().toExtend<HillshadeLayerSpecification['paint']>();
105+
expectTypeOf<{'hillshade-accent-color-transition': {duration: 100}}>().toExtend<HillshadeLayerSpecification['paint']>();
106+
});
107+
test('HillshadeLayerSpecification does not contain *-transition keys for untransitionable paint properties', () => {
108+
expectTypeOf<{'hillshade-illumination-direction-transition': {duration: 100}}>().not.toExtend<HillshadeLayerSpecification['paint']>();
109+
expectTypeOf<{'hillshade-illumination-altitude-transition': {duration: 100}}>().not.toExtend<HillshadeLayerSpecification['paint']>();
110+
expectTypeOf<{'hillshade-illumination-anchor-transition': {duration: 100}}>().not.toExtend<HillshadeLayerSpecification['paint']>();
111+
expectTypeOf<{'hillshade-method-transition': {duration: 100}}>().not.toExtend<HillshadeLayerSpecification['paint']>();
112+
});
113+
114+
test('LineLayerSpecification contains *-transition keys for transitionable paint properties', () => {
115+
expectTypeOf<{'line-opacity-transition': {duration: 100}}>().toExtend<LineLayerSpecification['paint']>();
116+
expectTypeOf<{'line-color-transition': {duration: 100}}>().toExtend<LineLayerSpecification['paint']>();
117+
expectTypeOf<{'line-translate-transition': {duration: 100}}>().toExtend<LineLayerSpecification['paint']>();
118+
expectTypeOf<{'line-width-transition': {duration: 100}}>().toExtend<LineLayerSpecification['paint']>();
119+
expectTypeOf<{'line-gap-width-transition': {duration: 100}}>().toExtend<LineLayerSpecification['paint']>();
120+
expectTypeOf<{'line-offset-transition': {duration: 100}}>().toExtend<LineLayerSpecification['paint']>();
121+
expectTypeOf<{'line-blur-transition': {duration: 100}}>().toExtend<LineLayerSpecification['paint']>();
122+
expectTypeOf<{'line-dasharray-transition': {duration: 100}}>().toExtend<LineLayerSpecification['paint']>();
123+
expectTypeOf<{'line-pattern-transition': {duration: 100}}>().toExtend<LineLayerSpecification['paint']>();
124+
});
125+
test('LineLayerSpecification does not contain *-transition keys for untransitionable paint properties', () => {
126+
expectTypeOf<{'line-translate-anchor-transition': {duration: 100}}>().not.toExtend<LineLayerSpecification['paint']>();
127+
expectTypeOf<{'line-gradient-transition': {duration: 100}}>().not.toExtend<LineLayerSpecification['paint']>();
128+
});
129+
130+
test('RasterLayerSpecification contains *-transition keys for transitionable paint properties', () => {
131+
expectTypeOf<{'raster-opacity-transition': {duration: 100}}>().toExtend<RasterLayerSpecification['paint']>();
132+
expectTypeOf<{'raster-hue-rotate-transition': {duration: 100}}>().toExtend<RasterLayerSpecification['paint']>();
133+
expectTypeOf<{'raster-brightness-min-transition': {duration: 100}}>().toExtend<RasterLayerSpecification['paint']>();
134+
expectTypeOf<{'raster-brightness-max-transition': {duration: 100}}>().toExtend<RasterLayerSpecification['paint']>();
135+
expectTypeOf<{'raster-saturation-transition': {duration: 100}}>().toExtend<RasterLayerSpecification['paint']>();
136+
expectTypeOf<{'raster-contrast-transition': {duration: 100}}>().toExtend<RasterLayerSpecification['paint']>();
137+
});
138+
test('RasterLayerSpecification does not contain *-transition keys for untransitionable paint properties', () => {
139+
expectTypeOf<{'raster-resampling-transition': {duration: 100}}>().not.toExtend<RasterLayerSpecification['paint']>();
140+
expectTypeOf<{'raster-fade-duration-transition': {duration: 100}}>().not.toExtend<RasterLayerSpecification['paint']>();
141+
});
142+
143+
test('SymbolLayerSpecification contains *-transition keys for transitionable paint properties', () => {
144+
expectTypeOf<{'icon-opacity-transition': {duration: 100}}>().toExtend<SymbolLayerSpecification['paint']>();
145+
expectTypeOf<{'icon-color-transition': {duration: 100}}>().toExtend<SymbolLayerSpecification['paint']>();
146+
expectTypeOf<{'icon-halo-color-transition': {duration: 100}}>().toExtend<SymbolLayerSpecification['paint']>();
147+
expectTypeOf<{'icon-halo-width-transition': {duration: 100}}>().toExtend<SymbolLayerSpecification['paint']>();
148+
expectTypeOf<{'icon-halo-blur-transition': {duration: 100}}>().toExtend<SymbolLayerSpecification['paint']>();
149+
expectTypeOf<{'icon-translate-transition': {duration: 100}}>().toExtend<SymbolLayerSpecification['paint']>();
150+
expectTypeOf<{'text-opacity-transition': {duration: 100}}>().toExtend<SymbolLayerSpecification['paint']>();
151+
expectTypeOf<{'text-color-transition': {duration: 100}}>().toExtend<SymbolLayerSpecification['paint']>();
152+
expectTypeOf<{'text-halo-color-transition': {duration: 100}}>().toExtend<SymbolLayerSpecification['paint']>();
153+
expectTypeOf<{'text-halo-width-transition': {duration: 100}}>().toExtend<SymbolLayerSpecification['paint']>();
154+
expectTypeOf<{'text-halo-blur-transition': {duration: 100}}>().toExtend<SymbolLayerSpecification['paint']>();
155+
expectTypeOf<{'text-translate-transition': {duration: 100}}>().toExtend<SymbolLayerSpecification['paint']>();
156+
});
157+
test('SymbolLayerSpecification does not contain *-transition keys for untransitionable paint properties', () => {
158+
expectTypeOf<{'icon-translate-anchor-transition': {duration: 100}}>().not.toExtend<SymbolLayerSpecification['paint']>();
159+
expectTypeOf<{'text-translate-anchor-transition': {duration: 100}}>().not.toExtend<SymbolLayerSpecification['paint']>();
160+
});
161+
});

vitest.config.build.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export default defineConfig({
1010
coverage: {
1111
provider: 'v8',
1212
reporter: ['json', 'html'],
13-
exclude: ['node_modules/', 'dist/', '**/*.test.ts'],
13+
exclude: ['node_modules/', 'dist/', '**/*.{test,test-d}.ts'],
1414
all: true,
1515
include: ['src'],
1616
reportsDirectory: './coverage/vitest/build',

vitest.config.integration.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export default defineConfig({
1010
coverage: {
1111
provider: 'v8',
1212
reporter: ['json', 'html'],
13-
exclude: ['node_modules/', 'dist/', '**/*.test.ts'],
13+
exclude: ['node_modules/', 'dist/', '**/*.{test,test-d}.ts'],
1414
all: true,
1515
include: ['src'],
1616
reportsDirectory: './coverage/vitest/integration',

0 commit comments

Comments
 (0)