diff --git a/build/generate-struct-arrays.ts b/build/generate-struct-arrays.ts index 18cae98e745..d43f932c078 100644 --- a/build/generate-struct-arrays.ts +++ b/build/generate-struct-arrays.ts @@ -113,14 +113,12 @@ function createStructArrayLayoutType({members, size, alignment}) { const key = `${members.map(m => `${m.components}${typeAbbreviations[m.type]}`).join('')}${size}`; const className = `StructArrayLayout${key}`; - if (!layoutCache[key]) { - layoutCache[key] = { - className, - members, - size, - usedTypes - }; - } + layoutCache[key] ||= { + className, + members, + size, + usedTypes + }; return className; } diff --git a/eslint.config.js b/eslint.config.js index 7382c98f08d..4220be4c68c 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -71,6 +71,7 @@ export default [ '@typescript-eslint/array-type': ['error', {default: 'array-simple'}], 'local/prefer-type-for-data-shapes': 'error', + 'logical-assignment-operators': ['error', 'always', {enforceForIfStatements: true}], 'prefer-object-spread': 'error', 'prefer-object-has-own': 'error', 'object-shorthand': 'error', diff --git a/src/data/bucket/circle_bucket.ts b/src/data/bucket/circle_bucket.ts index 961d62f612d..e0caaae48ac 100644 --- a/src/data/bucket/circle_bucket.ts +++ b/src/data/bucket/circle_bucket.ts @@ -97,7 +97,7 @@ export class CircleBucket im sortFeaturesByKey = !circleSortKey.isConstant(); // Circles that are "printed" onto the map surface should be tessellated to follow the globe's curvature. - subdivide = subdivide || circleStyle.paint.get('circle-pitch-alignment') === 'map'; + subdivide ||= circleStyle.paint.get('circle-pitch-alignment') === 'map'; } const granularity = subdivide ? options.subdivisionGranularity.circle : 1; diff --git a/src/data/bucket/line_bucket.ts b/src/data/bucket/line_bucket.ts index 3b891e3dd42..b5848e47f6a 100644 --- a/src/data/bucket/line_bucket.ts +++ b/src/data/bucket/line_bucket.ts @@ -347,7 +347,7 @@ export class LineBucket implements Bucket { // If we still don't have a previous normal, this is the beginning of a // non-closed line, so we're doing a straight "join". - prevNormal = prevNormal || nextNormal; + prevNormal ||= nextNormal; // Determine the normal of the join extrusion. It is the angle bisector // of the segments between the previous line and the next line. diff --git a/src/data/bucket/symbol_bucket.ts b/src/data/bucket/symbol_bucket.ts index 40e9d103318..241ceb6ae1c 100644 --- a/src/data/bucket/symbol_bucket.ts +++ b/src/data/bucket/symbol_bucket.ts @@ -478,11 +478,11 @@ export class SymbolBucket implements Bucket { const formattedText = Formatted.factory(resolvedTokens); // on this instance: if hasRTLText is already true, all future calls to containsRTLText can be skipped. - const bucketHasRTLText = this.hasRTLText = (this.hasRTLText || containsRTLText(formattedText)); + this.hasRTLText ||= containsRTLText(formattedText); if ( - !bucketHasRTLText || // non-rtl text so can proceed safely + !this.hasRTLText || // non-rtl text so can proceed safely rtlWorkerPlugin.getRTLTextPluginStatus() === 'unavailable' || // We don't intend to lazy-load the rtl text plugin, so proceed with incorrect shaping - bucketHasRTLText && rtlWorkerPlugin.isParsed() // Use the rtlText plugin to shape text + this.hasRTLText && rtlWorkerPlugin.isParsed() // Use the rtlText plugin to shape text ) { text = transformText(formattedText, layer, evaluationFeature); } @@ -533,8 +533,8 @@ export class SymbolBucket implements Bucket { if (!section.image) { const doesAllowVerticalWritingMode = allowsVerticalWritingMode(text.toString()); const sectionFont = section.fontStack || fontStack; - const sectionStack = stacks[sectionFont] = stacks[sectionFont] || {}; - this.calculateGlyphDependencies(section.text, sectionStack, textAlongLine, this.allowVerticalPlacement, doesAllowVerticalWritingMode); + stacks[sectionFont] ||= {}; + this.calculateGlyphDependencies(section.text, stacks[sectionFont], textAlongLine, this.allowVerticalPlacement, doesAllowVerticalWritingMode); } else { // Add section image to the list of dependencies. icons[section.image.name] = true; @@ -544,7 +544,7 @@ export class SymbolBucket implements Bucket { } if (layout.get('symbol-placement') === 'line') { - // Merge adjacent lines with the same text to improve labelling. + // Merge adjacent lines with the same text to improve labeling. // It's better to place labels on one long line than on many short segments. this.features = mergeLines(this.features); } diff --git a/src/data/feature_index.ts b/src/data/feature_index.ts index 0bb08f1fcd6..5bf4da8ef8c 100644 --- a/src/data/feature_index.ts +++ b/src/data/feature_index.ts @@ -174,9 +174,7 @@ export class FeatureIndex { serializedLayers, sourceFeatureState, (feature: VectorTileFeatureLike, styleLayer: StyleLayer, featureState: FeatureState) => { - if (!featureGeometry) { - featureGeometry = loadGeometry(feature); - } + featureGeometry ||= loadGeometry(feature); return styleLayer.queryIntersectsFeature({ queryGeometry, diff --git a/src/geo/projection/vertical_perspective_projection.ts b/src/geo/projection/vertical_perspective_projection.ts index 282d7f8faa5..f23325faf45 100644 --- a/src/geo/projection/vertical_perspective_projection.ts +++ b/src/geo/projection/vertical_perspective_projection.ts @@ -96,9 +96,7 @@ export class VerticalPerspectiveProjection implements Projection { } public updateGPUdependent(renderContext: ProjectionGPUContext): void { - if (!this._errorMeasurement) { - this._errorMeasurement = new ProjectionErrorMeasurement(renderContext); - } + this._errorMeasurement ||= new ProjectionErrorMeasurement(renderContext); const mercatorY = mercatorYfromLat(this._errorQueryLatitudeDegrees); const expectedResult = 2.0 * Math.atan(Math.exp(Math.PI - (mercatorY * Math.PI * 2.0))) - Math.PI * 0.5; const newValue = this._errorMeasurement.updateErrorLoop(mercatorY, expectedResult); @@ -155,9 +153,9 @@ export class VerticalPerspectiveProjection implements Projection { const currentTime = now(); let dirty = false; // Error correction transition - dirty = dirty || (currentTime - this._errorMeasurementLastChangeTime) / 1000.0 < (globeConstants.errorTransitionTimeSeconds + 0.2); + dirty ||= (currentTime - this._errorMeasurementLastChangeTime) / 1000.0 < (globeConstants.errorTransitionTimeSeconds + 0.2); // Error correction query in flight - dirty = dirty || (this._errorMeasurement?.awaitingQuery); + dirty ||= (this._errorMeasurement?.awaitingQuery); return dirty; } diff --git a/src/render/glyph_manager.ts b/src/render/glyph_manager.ts index 6e3211596b6..21d8fffa66a 100644 --- a/src/render/glyph_manager.ts +++ b/src/render/glyph_manager.ts @@ -78,9 +78,7 @@ export class GlyphManager { const result: GetGlyphsResponse = {}; for (const {stack, id, glyph} of updatedGlyphs) { - if (!result[stack]) { - result[stack] = {}; - } + result[stack] ||= {}; // Clone the glyph so that our own copy of its ArrayBuffer doesn't get transferred. result[stack][id] = glyph && { id: glyph.id, @@ -94,14 +92,8 @@ export class GlyphManager { async _getAndCacheGlyphsPromise(stack: string, id: number): Promise<{stack: string; id: number; glyph: StyleGlyph}> { // Create an entry for this fontstack if it doesn’t already exist. - let entry = this.entries[stack]; - if (!entry) { - entry = this.entries[stack] = { - glyphs: {}, - requests: {}, - ranges: {} - }; - } + this.entries[stack] ??= {glyphs: {}, requests: {}, ranges: {}}; + const entry = this.entries[stack]; // Try to get the glyph from the cache of client-side glyphs by codepoint. let glyph = entry.glyphs[id]; @@ -127,9 +119,7 @@ export class GlyphManager { } // Start downloading this range unless we’re currently downloading it. - if (!entry.requests[range]) { - entry.requests[range] = GlyphManager.loadGlyphRange(stack, range, this.url, this.requestManager); - } + entry.requests[range] ||= GlyphManager.loadGlyphRange(stack, range, this.url, this.requestManager); try { // Get the response and cache the glyphs from it. @@ -269,12 +259,8 @@ export class GlyphManager { destroy() { for (const stack in this.entries) { const entry = this.entries[stack]; - if (entry.tinySDF) { - entry.tinySDF = null; - } - if (entry.ideographTinySDF) { - entry.ideographTinySDF = null; - } + entry.tinySDF = null; + entry.ideographTinySDF = null; entry.glyphs = {}; entry.requests = {}; entry.ranges = {}; diff --git a/src/render/line_atlas.ts b/src/render/line_atlas.ts index b809f775ce4..bd733604abc 100644 --- a/src/render/line_atlas.ts +++ b/src/render/line_atlas.ts @@ -50,9 +50,7 @@ export class LineAtlas { getDash(dasharray: number[], round: boolean) { const key = dasharray.join(',') + String(round); - if (!this.dashEntry[key]) { - this.dashEntry[key] = this.addDash(dasharray, round); - } + this.dashEntry[key] ||= this.addDash(dasharray, round); return this.dashEntry[key]; } diff --git a/src/render/painter.ts b/src/render/painter.ts index b50b1bc5980..0c1efaa608a 100644 --- a/src/render/painter.ts +++ b/src/render/painter.ts @@ -727,7 +727,7 @@ export class Painter { * @returns */ useProgram(name: string, programConfiguration?: ProgramConfiguration | null, forceSimpleProjection: boolean = false, defines: string[] = []): Program { - this.cache = this.cache || {}; + this.cache ||= {}; const useTerrain = !!this.style.map.terrain; const projection = this.style.projection; @@ -743,19 +743,17 @@ export class Painter { const key = name + configurationKey + projectionKey + overdrawKey + terrainKey + definesKey; - if (!this.cache[key]) { - this.cache[key] = new Program( - this.context, - shaders[name], - programConfiguration, - programUniforms[name], - this._showOverdrawInspector, - useTerrain, - projectionPrelude, - projectionDefine, - defines - ); - } + this.cache[key] ||= new Program( + this.context, + shaders[name], + programConfiguration, + programUniforms[name], + this._showOverdrawInspector, + useTerrain, + projectionPrelude, + projectionDefine, + defines + ); return this.cache[key]; } diff --git a/src/source/canvas_source.ts b/src/source/canvas_source.ts index dbc4f157584..f9bb54ca03e 100644 --- a/src/source/canvas_source.ts +++ b/src/source/canvas_source.ts @@ -107,13 +107,11 @@ export class CanvasSource extends ImageSource { async load() { this._loaded = true; - if (!this.canvas) { - this.canvas = (this.options.canvas instanceof HTMLCanvasElement) ? - this.options.canvas : - document.getElementById(this.options.canvas) as HTMLCanvasElement; - // cast to HTMLCanvasElement in else of ternary - // should we do a safety check and throw if it's not actually HTMLCanvasElement? - } + this.canvas ||= (this.options.canvas instanceof HTMLCanvasElement) ? + this.options.canvas : + document.getElementById(this.options.canvas) as HTMLCanvasElement; + // cast to HTMLCanvasElement in else of ternary + // should we do a safety check and throw if it's not actually HTMLCanvasElement? this.width = this.canvas.width; this.height = this.canvas.height; diff --git a/src/source/geojson_source.test.ts b/src/source/geojson_source.test.ts index 3c8c4648216..b69470b8fbb 100644 --- a/src/source/geojson_source.test.ts +++ b/src/source/geojson_source.test.ts @@ -94,7 +94,7 @@ describe('GeoJSONSource.constructor', () => { describe('GeoJSONSource.setData', () => { function createSource(opts?) { - opts = opts || {}; + opts ||= {}; opts = extend(opts, {data: {}}); return new GeoJSONSource('id', opts, wrapDispatcher({ sendAsync(_message) { diff --git a/src/source/geojson_worker_source.test.ts b/src/source/geojson_worker_source.test.ts index e99e9d778ba..39ad786f552 100644 --- a/src/source/geojson_worker_source.test.ts +++ b/src/source/geojson_worker_source.test.ts @@ -349,7 +349,7 @@ describe('resourceTiming', () => { return null; }); window.performance.measure = vi.fn().mockImplementation((name, start, end) => { - measures[name] = measures[name] || []; + measures[name] ||= []; measures[name].push({ duration: marks[end] - marks[start], entryType: 'measure', diff --git a/src/source/query_features.ts b/src/source/query_features.ts index 9b6f5c603e6..caa73df323a 100644 --- a/src/source/query_features.ts +++ b/src/source/query_features.ts @@ -186,7 +186,7 @@ export function queryRenderedSymbols(styleLayers: {[_: string]: StyleLayer}, styleLayers); for (const layerID in bucketSymbols) { - const resultFeatures = result[layerID] = result[layerID] || []; + result[layerID] ||= []; const layerSymbols = bucketSymbols[layerID]; layerSymbols.sort((a, b) => { // Match topDownFeatureComparator from FeatureIndex, but using @@ -195,7 +195,7 @@ export function queryRenderedSymbols(styleLayers: {[_: string]: StyleLayer}, if (featureSortOrder) { // queryRenderedSymbols documentation says we'll return features in // "top-to-bottom" rendering order (aka last-to-first). - // Actually there can be multiple symbol instances per feature, so + // Actually, there can be multiple symbol instances per feature, so // we sort each feature based on the first matching symbol instance. const sortedA = featureSortOrder.indexOf(a.featureIndex); const sortedB = featureSortOrder.indexOf(b.featureIndex); @@ -207,7 +207,7 @@ export function queryRenderedSymbols(styleLayers: {[_: string]: StyleLayer}, } }); for (const symbolFeature of layerSymbols) { - resultFeatures.push(symbolFeature); + result[layerID].push(symbolFeature); } } } @@ -245,18 +245,18 @@ function mergeRenderedFeatureLayers(tiles: RenderedFeatureLayer[]): QueryResults // wrapped ID, don't duplicate features between the two tiles const result: QueryResults = {}; const wrappedIDLayerMap = {}; - for (const tile of tiles) { - const queryResults = tile.queryResults; - const wrappedID = tile.wrappedTileID; - const wrappedIDLayers = wrappedIDLayerMap[wrappedID] = wrappedIDLayerMap[wrappedID] || {}; + for (const {queryResults, wrappedTileID} of tiles) { + wrappedIDLayerMap[wrappedTileID] ||= {}; + const wrappedIDLayers = wrappedIDLayerMap[wrappedTileID]; for (const layerID in queryResults) { const tileFeatures = queryResults[layerID]; - const wrappedIDFeatures = wrappedIDLayers[layerID] = wrappedIDLayers[layerID] || {}; - const resultFeatures = result[layerID] = result[layerID] || []; + wrappedIDLayers[layerID] ||= {}; + const wrappedIDFeatures = wrappedIDLayers[layerID]; + result[layerID] ||= []; for (const tileFeature of tileFeatures) { if (!wrappedIDFeatures[tileFeature.featureIndex]) { wrappedIDFeatures[tileFeature.featureIndex] = true; - resultFeatures.push(tileFeature); + result[layerID].push(tileFeature); } } } @@ -269,7 +269,7 @@ function convertFeaturesToMapFeatures(result: QueryResults, tileManager: TileMan for (const layerID in result) { for (const featureWrapper of result[layerID]) { convertFeatureToMapFeature(featureWrapper, tileManager); - }; + } } return result as QueryRenderedFeaturesResults; } diff --git a/src/source/raster_dem_tile_worker_source.ts b/src/source/raster_dem_tile_worker_source.ts index 4323b2c111c..d02d56edb27 100644 --- a/src/source/raster_dem_tile_worker_source.ts +++ b/src/source/raster_dem_tile_worker_source.ts @@ -23,7 +23,7 @@ export class RasterDEMTileWorkerSource { new RGBAImage({width, height}, await getImageData(rawImageData, -1, -1, width, height)) : rawImageData; const dem = new DEMData(uid, imagePixels, encoding, redFactor, greenFactor, blueFactor, baseShift); - this.loaded = this.loaded || {}; + this.loaded ||= {}; this.loaded[uid] = dem; return dem; } diff --git a/src/source/rtl_text_plugin_main_thread.ts b/src/source/rtl_text_plugin_main_thread.ts index 2890a83ee3e..943ca94295b 100644 --- a/src/source/rtl_text_plugin_main_thread.ts +++ b/src/source/rtl_text_plugin_main_thread.ts @@ -82,8 +82,6 @@ class RTLMainThreadPlugin extends Evented { let rtlMainThreadPlugin: RTLMainThreadPlugin = null; export function rtlMainThreadPluginFactory(): RTLMainThreadPlugin { - if (!rtlMainThreadPlugin) { - rtlMainThreadPlugin = new RTLMainThreadPlugin(); - } + rtlMainThreadPlugin ||= new RTLMainThreadPlugin(); return rtlMainThreadPlugin; } diff --git a/src/source/source_state.ts b/src/source/source_state.ts index 8120aed37e5..c9a04e385c4 100644 --- a/src/source/source_state.ts +++ b/src/source/source_state.ts @@ -30,8 +30,8 @@ export class SourceFeatureState { updateState(sourceLayer: string, featureId: number | string, newState: any) { const feature = String(featureId); - this.stateChanges[sourceLayer] = this.stateChanges[sourceLayer] || {}; - this.stateChanges[sourceLayer][feature] = this.stateChanges[sourceLayer][feature] || {}; + this.stateChanges[sourceLayer] ||= {}; + this.stateChanges[sourceLayer][feature] ||= {}; extend(this.stateChanges[sourceLayer][feature], newState); if (this.deletedStates[sourceLayer] === null) { @@ -61,11 +61,11 @@ export class SourceFeatureState { const feature = String(featureId); - this.deletedStates[sourceLayer] = this.deletedStates[sourceLayer] || {}; + this.deletedStates[sourceLayer] ||= {}; if (key && featureId !== undefined) { if (this.deletedStates[sourceLayer][feature] !== null) { - this.deletedStates[sourceLayer][feature] = this.deletedStates[sourceLayer][feature] || {}; + this.deletedStates[sourceLayer][feature] ||= {}; this.deletedStates[sourceLayer][feature][key] = null; } } else if (featureId !== undefined) { @@ -109,10 +109,10 @@ export class SourceFeatureState { const featuresChanged: LayerFeatureStates = {}; for (const sourceLayer in this.stateChanges) { - this.state[sourceLayer] = this.state[sourceLayer] || {}; + this.state[sourceLayer] ||= {}; const layerStates = {}; for (const feature in this.stateChanges[sourceLayer]) { - if (!this.state[sourceLayer][feature]) this.state[sourceLayer][feature] = {}; + this.state[sourceLayer][feature] ||= {}; extend(this.state[sourceLayer][feature], this.stateChanges[sourceLayer][feature]); layerStates[feature] = this.state[sourceLayer][feature]; } @@ -120,7 +120,7 @@ export class SourceFeatureState { } for (const sourceLayer in this.deletedStates) { - this.state[sourceLayer] = this.state[sourceLayer] || {}; + this.state[sourceLayer] ||= {}; const layerStates = {}; if (this.deletedStates[sourceLayer] === null) { @@ -141,7 +141,7 @@ export class SourceFeatureState { } } - featuresChanged[sourceLayer] = featuresChanged[sourceLayer] || {}; + featuresChanged[sourceLayer] ||= {}; extend(featuresChanged[sourceLayer], layerStates); } diff --git a/src/source/vector_tile_worker_source.test.ts b/src/source/vector_tile_worker_source.test.ts index f2ab07ac4f1..80011a03000 100644 --- a/src/source/vector_tile_worker_source.test.ts +++ b/src/source/vector_tile_worker_source.test.ts @@ -428,7 +428,7 @@ describe('vector tile worker source', () => { return null; }); window.performance.measure = vi.fn().mockImplementation((name, start, end) => { - measures[name] = measures[name] || []; + measures[name] ||= []; measures[name].push({ duration: marks[end] - marks[start], entryType: 'measure', diff --git a/src/source/worker.ts b/src/source/worker.ts index 66599d0a706..c37c81ca1f0 100644 --- a/src/source/worker.ts +++ b/src/source/worker.ts @@ -211,18 +211,14 @@ export default class Worker { private _getAvailableImages(mapId: string) { let availableImages = this.availableImages[mapId]; - if (!availableImages) { - availableImages = []; - } + availableImages ||= []; return availableImages; } private _getLayerIndex(mapId: string) { let layerIndexes = this.layerIndexes[mapId]; - if (!layerIndexes) { - layerIndexes = this.layerIndexes[mapId] = new StyleLayerIndex(); - } + layerIndexes ||= this.layerIndexes[mapId] = new StyleLayerIndex(); return layerIndexes; } @@ -234,10 +230,8 @@ export default class Worker { * @returns a new instance or a cached one */ private _getWorkerSource(mapId: string, sourceType: string, sourceName: string): WorkerSource { - if (!this.workerSources[mapId]) - this.workerSources[mapId] = {}; - if (!this.workerSources[mapId][sourceType]) - this.workerSources[mapId][sourceType] = {}; + this.workerSources[mapId] ||= {}; + this.workerSources[mapId][sourceType] ||= {}; if (!this.workerSources[mapId][sourceType][sourceName]) { // use a wrapped actor so that we can attach a target mapId param @@ -271,12 +265,8 @@ export default class Worker { * @returns a new instance or a cached one */ private _getDEMWorkerSource(mapId: string, sourceType: string) { - if (!this.demWorkerSources[mapId]) - this.demWorkerSources[mapId] = {}; - - if (!this.demWorkerSources[mapId][sourceType]) { - this.demWorkerSources[mapId][sourceType] = new RasterDEMTileWorkerSource(); - } + this.demWorkerSources[mapId] ||= {}; + this.demWorkerSources[mapId][sourceType] ||= new RasterDEMTileWorkerSource(); return this.demWorkerSources[mapId][sourceType]; } diff --git a/src/style/light.ts b/src/style/light.ts index 6057b7076fc..5408e6ef13f 100644 --- a/src/style/light.ts +++ b/src/style/light.ts @@ -74,7 +74,7 @@ export class Light extends Evented { constructor(lightOptions?: LightSpecification) { super(); - lightProperties = lightProperties || new Properties({ + lightProperties ||= new Properties({ 'anchor': new DataConstantProperty(styleSpec.light.anchor as StylePropertySpecification), 'position': new LightPositionProperty(), 'color': new DataConstantProperty(styleSpec.light.color as StylePropertySpecification), diff --git a/src/style/pauseable_placement.ts b/src/style/pauseable_placement.ts index 17650f75faa..8b9b9b1a7a7 100644 --- a/src/style/pauseable_placement.ts +++ b/src/style/pauseable_placement.ts @@ -107,9 +107,7 @@ export class PauseablePlacement { (!layer.minzoom || layer.minzoom <= placementZoom) && (!layer.maxzoom || layer.maxzoom > placementZoom)) { - if (!this._inProgressLayer) { - this._inProgressLayer = new LayerPlacement(layer); - } + this._inProgressLayer ||= new LayerPlacement(layer); const pausePlacement = this._inProgressLayer.continuePlacement(layerTiles[layer.source], this.placement, this._showCollisionBoxes, layer, shouldPausePlacement); diff --git a/src/style/sky.ts b/src/style/sky.ts index 9b4daa184b6..a61b1e145a6 100644 --- a/src/style/sky.ts +++ b/src/style/sky.ts @@ -60,15 +60,13 @@ export class Sky extends Evented { setSky(sky?: SkySpecification, options: StyleSetterOptions = {}) { if (this._validate(validateSky, sky, options)) return; - if (!sky) { - sky = { - 'sky-color': 'transparent', - 'horizon-color': 'transparent', - 'fog-color': 'transparent', - 'fog-ground-blend': 1, - 'atmosphere-blend': 0, - }; - } + sky ||= { + 'sky-color': 'transparent', + 'horizon-color': 'transparent', + 'fog-color': 'transparent', + 'fog-ground-blend': 1, + 'atmosphere-blend': 0, + }; for (const name in sky) { const value = sky[name]; diff --git a/src/style/style.ts b/src/style/style.ts index 55c3bcd1604..e1452ab0ea4 100644 --- a/src/style/style.ts +++ b/src/style/style.ts @@ -1835,7 +1835,7 @@ export class Style extends Evented { } const layerBucketsChanged = this.crossTileSymbolIndex.addLayer(styleLayer, layerTiles[styleLayer.source], transform.center.lng); - symbolBucketsChanged = symbolBucketsChanged || layerBucketsChanged; + symbolBucketsChanged ||= layerBucketsChanged; } this.crossTileSymbolIndex.pruneUnusedLayers(this._order); @@ -1845,7 +1845,7 @@ export class Style extends Evented { // We need to restart placement to keep layer indices in sync. // Also force full placement when fadeDuration === 0 to ensure that newly loaded // tiles will fully display symbols in their first frame - forceFullPlacement = forceFullPlacement || this._layerOrderChanged || fadeDuration === 0; + forceFullPlacement ||= this._layerOrderChanged || fadeDuration === 0; if (forceFullPlacement || !this.pauseablePlacement || (this.pauseablePlacement.isDone() && !this.placement.stillRecent(now(), transform.zoom))) { this.pauseablePlacement = new PauseablePlacement(transform, this.map.terrain, this._order, forceFullPlacement, showCollisionBoxes, fadeDuration, crossSourceCollisions, this.placement); diff --git a/src/style/style_layer.ts b/src/style/style_layer.ts index 75e50e26dfc..6033a0b2875 100644 --- a/src/style/style_layer.ts +++ b/src/style/style_layer.ts @@ -365,7 +365,7 @@ export abstract class StyleLayer extends Evented { }; if (this.visibility) { - output.layout = output.layout || {}; + output.layout ||= {}; output.layout.visibility = this.visibility; } diff --git a/src/style/style_layer_index.ts b/src/style/style_layer_index.ts index b2565b3762b..eee739b8b49 100644 --- a/src/style/style_layer_index.ts +++ b/src/style/style_layer_index.ts @@ -59,15 +59,11 @@ export class StyleLayerIndex { const sourceId = layer.source || ''; let sourceGroup = this.familiesBySource[sourceId]; - if (!sourceGroup) { - sourceGroup = this.familiesBySource[sourceId] = {}; - } + sourceGroup ||= this.familiesBySource[sourceId] = {}; const sourceLayerId = layer.sourceLayer || GEOJSON_TILE_LAYER_NAME; let sourceLayerFamilies = sourceGroup[sourceLayerId]; - if (!sourceLayerFamilies) { - sourceLayerFamilies = sourceGroup[sourceLayerId] = []; - } + sourceLayerFamilies ||= sourceGroup[sourceLayerId] = []; sourceLayerFamilies.push(layers); } diff --git a/src/symbol/collision_index.ts b/src/symbol/collision_index.ts index 881df8d67cf..d627fe0458b 100644 --- a/src/symbol/collision_index.ts +++ b/src/symbol/collision_index.ts @@ -327,8 +327,8 @@ export class CollisionIndex { const x2 = centerX + radius; const y2 = centerY + radius; - entirelyOffscreen = entirelyOffscreen && this.isOffscreen(x1, y1, x2, y2); - inGrid = inGrid || this.isInsideGrid(x1, y1, x2, y2); + entirelyOffscreen &&= this.isOffscreen(x1, y1, x2, y2); + inGrid ||= this.isInsideGrid(x1, y1, x2, y2); if (overlapMode !== 'always' && this.grid.hitTestCircle(centerX, centerY, radius, overlapMode, collisionGroupPredicate)) { // Don't early exit if we're showing the debug circles because we still want to calculate diff --git a/src/symbol/cross_tile_symbol_index.ts b/src/symbol/cross_tile_symbol_index.ts index ecd914cd95b..e1ec633464f 100644 --- a/src/symbol/cross_tile_symbol_index.ts +++ b/src/symbol/cross_tile_symbol_index.ts @@ -237,9 +237,7 @@ class CrossTileSymbolLayerIndex { symbolInstance.crossTileID = 0; } - if (!this.usedCrossTileIDs[tileID.overscaledZ]) { - this.usedCrossTileIDs[tileID.overscaledZ] = {}; - } + this.usedCrossTileIDs[tileID.overscaledZ] ||= {}; const zoomCrossTileIDs = this.usedCrossTileIDs[tileID.overscaledZ]; for (const zoom in this.indexes) { @@ -333,7 +331,8 @@ export class CrossTileSymbolIndex { continue; if (!symbolBucket.bucketInstanceId) { - symbolBucket.bucketInstanceId = ++this.maxBucketInstanceId; + this.maxBucketInstanceId += 1; + symbolBucket.bucketInstanceId = this.maxBucketInstanceId; } if (layerIndex.addBucket(tile.tileID, symbolBucket, this.crossTileIDs)) { diff --git a/src/symbol/placement.ts b/src/symbol/placement.ts index fa6a8ef0cb3..38e14f92930 100644 --- a/src/symbol/placement.ts +++ b/src/symbol/placement.ts @@ -714,7 +714,7 @@ export class Placement { // in this case, but for now quirks in text-anchor // and text-offset may prevent that from being true. placeText = textAlwaysOverlap || (placedGlyphCircles.circles.length > 0 && !placedGlyphCircles.collisionDetected); - offscreen = offscreen && placedGlyphCircles.offscreen; + offscreen &&= placedGlyphCircles.offscreen; } if (collisionArrays.iconFeatureIndex) { @@ -746,7 +746,7 @@ export class Placement { placedIconBoxes = placeIconFeature(collisionArrays.iconBox); placeIcon = placedIconBoxes.placeable; } - offscreen = offscreen && placedIconBoxes.offscreen; + offscreen &&= placedIconBoxes.offscreen; } const iconWithoutText = textOptional || @@ -759,7 +759,7 @@ export class Placement { } else if (!textWithoutIcon) { placeText = placeIcon && placeText; } else if (!iconWithoutText) { - placeIcon = placeIcon && placeText; + placeIcon &&= placeText; } const hasTextBox = placeText && placedGlyphBoxes.placeable; @@ -966,12 +966,11 @@ export class Placement { const prevOpacity = prevOpacities[crossTileID]; if (prevOpacity) { this.opacities[crossTileID] = new JointOpacityState(prevOpacity, increment, jointPlacement.text, jointPlacement.icon); - placementChanged = placementChanged || - jointPlacement.text !== prevOpacity.text.placed || - jointPlacement.icon !== prevOpacity.icon.placed; + placementChanged ||= jointPlacement.text !== prevOpacity.text.placed; + placementChanged ||= jointPlacement.icon !== prevOpacity.icon.placed; } else { this.opacities[crossTileID] = new JointOpacityState(null, increment, jointPlacement.text, jointPlacement.icon, jointPlacement.skipFade); - placementChanged = placementChanged || jointPlacement.text || jointPlacement.icon; + placementChanged ||= jointPlacement.text || jointPlacement.icon; } } @@ -982,7 +981,8 @@ export class Placement { const jointOpacity = new JointOpacityState(prevOpacity, increment, false, false); if (!jointOpacity.isHidden()) { this.opacities[crossTileID] = jointOpacity; - placementChanged = placementChanged || prevOpacity.text.placed || prevOpacity.icon.placed; + placementChanged ||= prevOpacity.text.placed; + placementChanged ||= prevOpacity.icon.placed; } } } @@ -1061,7 +1061,7 @@ export class Placement { for (let i = 0; i < numVertices / 4; i++) { iconOrText.opacityVertexArray.emplaceBack(opacity); } - iconOrText.hasVisibleVertices = iconOrText.hasVisibleVertices || (opacity !== PACKED_HIDDEN_OPACITY); + iconOrText.hasVisibleVertices ||= (opacity !== PACKED_HIDDEN_OPACITY); }; const boxArrays = this.collisionBoxArrays.get(bucket.bucketInstanceId); diff --git a/src/symbol/projection.ts b/src/symbol/projection.ts index 35956e55829..a0ba9a3e8d8 100644 --- a/src/symbol/projection.ts +++ b/src/symbol/projection.ts @@ -642,7 +642,7 @@ export function projectLineVertexToLabelPlane(index: number, projectionContext: if (projection.signedDistanceFromCamera > 0) { cache.projections[index] = projection.point; - cache.anyProjectionOccluded = cache.anyProjectionOccluded || projection.isOccluded; + cache.anyProjectionOccluded ||= projection.isOccluded; return projection.point; } @@ -874,8 +874,7 @@ export function placeGlyphAlongLine( prevToCurrentOffsetNormal = transformToOffsetNormal(prevToCurrent, lineOffsetY, direction); } // Initialize offsetPrev on our first iteration, after that it will be pre-calculated - if (!offsetPreviousVertex) - offsetPreviousVertex = previousVertex.add(prevToCurrentOffsetNormal); + offsetPreviousVertex ||= previousVertex.add(prevToCurrentOffsetNormal); offsetIntersectionPoint = findOffsetIntersectionPoint(currentIndex, prevToCurrentOffsetNormal, currentVertex, lineStartIndex, lineEndIndex, offsetPreviousVertex, lineOffsetY, projectionContext, syntheticVertexArgs); diff --git a/src/tile/terrain_tile_manager.ts b/src/tile/terrain_tile_manager.ts index 401b69e0347..1b53c50fbcd 100644 --- a/src/tile/terrain_tile_manager.ts +++ b/src/tile/terrain_tile_manager.ts @@ -273,8 +273,7 @@ export class TerrainTileManager extends Evented { if (z > source.maxzoom) z = source.maxzoom; if (z < source.minzoom) return undefined; // cache for tileID to terrain-tileID - if (!this._sourceTileCache[tileID.key]) - this._sourceTileCache[tileID.key] = tileID.scaledTo(z).key; + this._sourceTileCache[tileID.key] ||= tileID.scaledTo(z).key; let tile = this.findTileInCaches(this._sourceTileCache[tileID.key]); // during tile-loading phase look if parent tiles (with loaded dem) are available. if (!tile?.dem && searchForDEM) { diff --git a/src/tile/tile.ts b/src/tile/tile.ts index f6d87680976..ce5912df0ef 100644 --- a/src/tile/tile.ts +++ b/src/tile/tile.ts @@ -297,17 +297,13 @@ export class Tile { this.imageAtlasTexture.destroy(); } - if (this.imageAtlas) { - this.imageAtlas = null; - } + this.imageAtlas &&= null; if (this.glyphAtlasTexture) { this.glyphAtlasTexture.destroy(); } - if (this.dashPositions) { - this.dashPositions = null; - } + this.dashPositions &&= null; this.latestFeatureIndex = null; this.state = 'unloaded'; diff --git a/src/tile/tile_manager.ts b/src/tile/tile_manager.ts index e1e1688a724..c6c70659a0f 100644 --- a/src/tile/tile_manager.ts +++ b/src/tile/tile_manager.ts @@ -404,7 +404,8 @@ export class TileManager extends Evented { // determine if the loaded tile (hasData) is a qualified descendent of any target tile for (const targetID of targetTileIDs) { if (tile.tileID.isChildOf(targetID)) { - (loadedDescendents[targetID.key] ||= []).push(tile); + loadedDescendents[targetID.key] ||= []; + loadedDescendents[targetID.key].push(tile); } } } @@ -935,7 +936,7 @@ export class TileManager extends Evented { * Set the value of a particular state for a feature */ setFeatureState(sourceLayer: string, featureId: number | string, state: any) { - sourceLayer = sourceLayer || GEOJSON_TILE_LAYER_NAME; + sourceLayer ||= GEOJSON_TILE_LAYER_NAME; this._state.updateState(sourceLayer, featureId, state); } @@ -943,7 +944,7 @@ export class TileManager extends Evented { * Resets the value of a particular state key for a feature */ removeFeatureState(sourceLayer?: string, featureId?: number | string, key?: string) { - sourceLayer = sourceLayer || GEOJSON_TILE_LAYER_NAME; + sourceLayer ||= GEOJSON_TILE_LAYER_NAME; this._state.removeFeatureState(sourceLayer, featureId, key); } @@ -951,7 +952,7 @@ export class TileManager extends Evented { * Get the entire state object for a feature */ getFeatureState(sourceLayer: string, featureId: number | string) { - sourceLayer = sourceLayer || GEOJSON_TILE_LAYER_NAME; + sourceLayer ||= GEOJSON_TILE_LAYER_NAME; return this._state.getState(sourceLayer, featureId); } diff --git a/src/ui/camera.test.ts b/src/ui/camera.test.ts index c9287d00f71..1ebefbe2ded 100644 --- a/src/ui/camera.test.ts +++ b/src/ui/camera.test.ts @@ -44,7 +44,7 @@ function attachSimulateFrame(camera) { } function createCamera(options?): Camera & { simulateFrame: () => void } { - options = options || {}; + options ||= {}; const transform = options.globe ? new GlobeTransform() : new MercatorTransform(); transform.setMinZoom(0); @@ -70,7 +70,7 @@ function createCamera(options?): Camera & { simulateFrame: () => void } { } function createCameraGlobe(options?) { - options = options || {}; + options ||= {}; options.globe = true; return createCamera(options); } @@ -1924,7 +1924,7 @@ describe('flyTo', () => { let leftWorld0 = false; camera.on('move', () => { - leftWorld0 = leftWorld0 || (camera.getCenter().lng < -180); + leftWorld0 ||= (camera.getCenter().lng < -180); }); const promise = camera.once('moveend'); @@ -3781,7 +3781,7 @@ describe('flyTo globe projection', () => { let leftWorld0 = false; camera.on('move', () => { - leftWorld0 = leftWorld0 || (camera.getCenter().lng < -180); + leftWorld0 ||= (camera.getCenter().lng < -180); }); const promise = camera.once('moveend'); diff --git a/src/ui/camera.ts b/src/ui/camera.ts index 1f03f91c57d..424057d0bf6 100644 --- a/src/ui/camera.ts +++ b/src/ui/camera.ts @@ -1170,11 +1170,11 @@ export abstract class Camera extends Evented { center: options.center, }); - this._rotating = this._rotating || (startBearing !== bearing); - this._pitching = this._pitching || (pitch !== startPitch); - this._rolling = this._rolling || (roll !== startRoll); + this._rotating ||= (startBearing !== bearing); + this._pitching ||= (pitch !== startPitch); + this._rolling ||= (roll !== startRoll); this._padding = !tr.isPaddingEqual(padding); - this._zooming = this._zooming || easeHandler.isZooming; + this._zooming ||= easeHandler.isZooming; this._easeId = options.easeId; this._prepareEase(eventData, options.noMoveStart, currently); @@ -1261,9 +1261,7 @@ export abstract class Camera extends Evented { _getTransformForUpdate(): ITransform { if (!this.transformCameraUpdate && !this.terrain) return this.transform; - if (!this._requestedCameraState) { - this._requestedCameraState = this.transform.clone(); - } + this._requestedCameraState ||= this.transform.clone(); return this._requestedCameraState; } diff --git a/src/ui/control/fullscreen_control.ts b/src/ui/control/fullscreen_control.ts index 8493d2947cb..c29f271417f 100644 --- a/src/ui/control/fullscreen_control.ts +++ b/src/ui/control/fullscreen_control.ts @@ -83,7 +83,7 @@ export class FullscreenControl extends Evented implements IControl { /** {@inheritDoc IControl.onAdd} */ onAdd(map: Map): HTMLElement { this._map = map; - if (!this._container) this._container = this._map.getContainer(); + this._container ||= this._map.getContainer(); this._controlContainer = DOM.create('div', 'maplibregl-ctrl maplibregl-ctrl-group'); this._setupUI(); return this._controlContainer; diff --git a/src/ui/handler/scroll_zoom.ts b/src/ui/handler/scroll_zoom.ts index 99233617af8..b664cb786ef 100644 --- a/src/ui/handler/scroll_zoom.ts +++ b/src/ui/handler/scroll_zoom.ts @@ -236,9 +236,7 @@ export class ScrollZoomHandler implements Handler { _start(e: MouseEvent) { if (!this._delta) return; - if (this._frameId) { - this._frameId = null; - } + this._frameId &&= null; this._active = true; if (!this.isZooming()) { @@ -333,9 +331,7 @@ export class ScrollZoomHandler implements Handler { const k = easing(t); zoom = interpolates.number(startZoom, targetZoom, k); if (t < 1) { - if (!this._frameId) { - this._frameId = true; - } + this._frameId ||= true; } else { finished = true; } diff --git a/src/ui/handler_manager.ts b/src/ui/handler_manager.ts index b00ad9bc14c..2f0b3367c57 100644 --- a/src/ui/handler_manager.ts +++ b/src/ui/handler_manager.ts @@ -540,7 +540,7 @@ export class HandlerManager { around = pinchAround; } - around = around || map.transform.centerPoint; + around ||= map.transform.centerPoint; if (terrain && !tr.isPointOnMapSurface(around)) { around = tr.centerPoint; diff --git a/src/ui/map.ts b/src/ui/map.ts index ff1afe2c055..b1336e70b46 100644 --- a/src/ui/map.ts +++ b/src/ui/map.ts @@ -1576,8 +1576,8 @@ export class Map extends Camera { } _saveDelegatedListener(type: keyof MapEventType | string, delegatedListener: DelegatedListener): void { - this._delegatedListeners = this._delegatedListeners || {}; - this._delegatedListeners[type] = this._delegatedListeners[type] || []; + this._delegatedListeners ||= {}; + this._delegatedListeners[type] ||= []; this._delegatedListeners[type].push(delegatedListener); } @@ -1972,7 +1972,7 @@ export class Map extends Camera { let queryGeometry: Point[]; const isGeometry = geometryOrOptions instanceof Point || Array.isArray(geometryOrOptions); const geometry = isGeometry ? geometryOrOptions : [[0, 0], [this.transform.width, this.transform.height]]; - options = options || (isGeometry ? {} : geometryOrOptions) || {}; + options ||= (isGeometry ? {} : geometryOrOptions) || {}; if (geometry instanceof Point || typeof geometry[0] === 'number') { queryGeometry = [Point.convert(geometry as PointLike)]; @@ -3577,7 +3577,7 @@ export class Map extends Camera { _update(updateStyle?: boolean) { if (!this.style?._loaded) return this; - this._styleDirty = this._styleDirty || updateStyle; + this._styleDirty ||= updateStyle; this._sourcesDirty = true; this.triggerRepaint(); diff --git a/src/ui/popup.test.ts b/src/ui/popup.test.ts index ed0e5453d95..eb7076645e3 100644 --- a/src/ui/popup.test.ts +++ b/src/ui/popup.test.ts @@ -10,7 +10,7 @@ const containerWidth = 512; const containerHeight = 512; function createMap(options?) { - options = options || {}; + options ||= {}; const container = window.document.createElement('div'); window.document.body.appendChild(container); Object.defineProperty(container, 'clientWidth', {value: options.width || containerWidth}); diff --git a/src/util/browser.ts b/src/util/browser.ts index 7f6dff5118e..c2b2d8c8184 100755 --- a/src/util/browser.ts +++ b/src/util/browser.ts @@ -62,7 +62,7 @@ export const browser = { }, resolveURL(path: string) { - if (!linkEl) linkEl = document.createElement('a'); + linkEl ||= document.createElement('a'); linkEl.href = path; return linkEl.href; }, @@ -74,9 +74,7 @@ export const browser = { // In case your test crashes when checking matchMedia, call setMatchMedia from 'src/util/test/util' if (!matchMedia) return false; //Lazily initialize media query - if (reducedMotionQuery == null) { - reducedMotionQuery = matchMedia('(prefers-reduced-motion: reduce)'); - } + reducedMotionQuery ??= matchMedia('(prefers-reduced-motion: reduce)'); return reducedMotionQuery.matches; }, diff --git a/src/util/dispatcher.test.ts b/src/util/dispatcher.test.ts index d65c4e4a54e..d2f497705a4 100644 --- a/src/util/dispatcher.test.ts +++ b/src/util/dispatcher.test.ts @@ -32,9 +32,7 @@ describe('Dispatcher', () => { const releaseCalled = []; const workerPool = { acquire () { - if (!workers) { - workers = [workerFactory(), workerFactory()]; - } + workers ||= [workerFactory(), workerFactory()]; return workers; }, release (id) { diff --git a/src/util/evented.ts b/src/util/evented.ts index 75c87c495e4..f31d7d2de2a 100644 --- a/src/util/evented.ts +++ b/src/util/evented.ts @@ -10,7 +10,7 @@ type Listeners = {[_: string]: Listener[]}; function _addEventListener(type: string, listener: Listener, listenerList: Listeners) { const listenerExists = listenerList[type]?.includes(listener); if (!listenerExists) { - listenerList[type] = listenerList[type] || []; + listenerList[type] ||= []; listenerList[type].push(listener); } } @@ -71,7 +71,7 @@ export class Evented { * extended with `target` and `type` properties. */ on(type: string, listener: Listener): Subscription { - this._listeners = this._listeners || {}; + this._listeners ||= {}; _addEventListener(type, listener, this._listeners); return { @@ -107,7 +107,7 @@ export class Evented { if (!listener) { return new Promise((resolve) => this.once(type, resolve)); } - this._oneTimeListeners = this._oneTimeListeners || {}; + this._oneTimeListeners ||= {}; _addEventListener(type, listener, this._oneTimeListeners); return this; diff --git a/src/util/global_worker_pool.ts b/src/util/global_worker_pool.ts index 640bd0dc53f..be46bc17bdb 100644 --- a/src/util/global_worker_pool.ts +++ b/src/util/global_worker_pool.ts @@ -7,9 +7,7 @@ let globalWorkerPool; * to be shared across each Map */ export function getGlobalWorkerPool() { - if (!globalWorkerPool) { - globalWorkerPool = new WorkerPool(); - } + globalWorkerPool ||= new WorkerPool(); return globalWorkerPool; } diff --git a/src/util/image_request.ts b/src/util/image_request.ts index 9c0ec128735..b637af0f71e 100644 --- a/src/util/image_request.ts +++ b/src/util/image_request.ts @@ -105,9 +105,7 @@ export namespace ImageRequest { */ export const getImage = (requestParameters: RequestParameters, abortController: AbortController, supportImageRefresh: boolean = true): Promise> => { return new Promise>((resolve, reject) => { - if (!requestParameters.headers) { - requestParameters.headers = {}; - } + requestParameters.headers ||= {}; requestParameters.headers.accept = 'image/webp,*/*'; extend(requestParameters, {type: 'image'}); const request: ImageRequestQueueItem = { diff --git a/src/util/offscreen_canvas_supported.ts b/src/util/offscreen_canvas_supported.ts index b83bac1a3a6..1eb6b74cd5d 100644 --- a/src/util/offscreen_canvas_supported.ts +++ b/src/util/offscreen_canvas_supported.ts @@ -1,11 +1,9 @@ let supportsOffscreenCanvas: boolean; export function offscreenCanvasSupported(): boolean { - if (supportsOffscreenCanvas == null) { - supportsOffscreenCanvas = typeof OffscreenCanvas !== 'undefined' && + supportsOffscreenCanvas ??= typeof OffscreenCanvas !== 'undefined' && new OffscreenCanvas(1, 1).getContext('2d') && typeof createImageBitmap === 'function'; - } return supportsOffscreenCanvas; } diff --git a/src/util/test/util.ts b/src/util/test/util.ts index 7f60cf3e101..8e48c34be6c 100644 --- a/src/util/test/util.ts +++ b/src/util/test/util.ts @@ -66,7 +66,7 @@ export function createMap(options?) { } export function equalWithPrecision(test, expected, actual, multiplier, message, extra) { - message = message || `should be equal to within ${multiplier}`; + message ||= `should be equal to within ${multiplier}`; const expectedRounded = Math.round(expected / multiplier) * multiplier; const actualRounded = Math.round(actual / multiplier) * multiplier; diff --git a/src/webgl/draw/draw_color_relief.ts b/src/webgl/draw/draw_color_relief.ts index 2ce53539758..91aa8787388 100644 --- a/src/webgl/draw/draw_color_relief.ts +++ b/src/webgl/draw/draw_color_relief.ts @@ -84,7 +84,7 @@ function renderColorRelief( context.activeTexture.set(gl.TEXTURE0); context.pixelStoreUnpackPremultiplyAlpha.set(false); - tile.demTexture = tile.demTexture || painter.getTileTexture(textureStride); + tile.demTexture ||= painter.getTileTexture(textureStride); if (tile.demTexture) { const demTexture = tile.demTexture; demTexture.update(pixelData, {premultiply: false}); diff --git a/src/webgl/draw/draw_heatmap.ts b/src/webgl/draw/draw_heatmap.ts index 9a1f9f9d798..ff1cf3abac4 100644 --- a/src/webgl/draw/draw_heatmap.ts +++ b/src/webgl/draw/draw_heatmap.ts @@ -231,8 +231,6 @@ function createHeatmapFbo(context: Context, width: number, height: number): Fram } function getColorRampTexture(context: Context, layer: HeatmapStyleLayer): Texture { - if (!layer.colorRampTexture) { - layer.colorRampTexture = new Texture(context, layer.colorRamp, context.gl.RGBA); - } + layer.colorRampTexture ||= new Texture(context, layer.colorRamp, context.gl.RGBA); return layer.colorRampTexture; } diff --git a/src/webgl/draw/draw_hillshade.ts b/src/webgl/draw/draw_hillshade.ts index 5696f5a33d6..fb2b26703ad 100644 --- a/src/webgl/draw/draw_hillshade.ts +++ b/src/webgl/draw/draw_hillshade.ts @@ -124,7 +124,7 @@ function prepareHillshade( context.activeTexture.set(gl.TEXTURE1); context.pixelStoreUnpackPremultiplyAlpha.set(false); - tile.demTexture = tile.demTexture || painter.getTileTexture(textureStride); + tile.demTexture ||= painter.getTileTexture(textureStride); if (tile.demTexture) { const demTexture = tile.demTexture; demTexture.update(pixelData, {premultiply: false}); diff --git a/src/webgl/program.ts b/src/webgl/program.ts index 9ecbded9f82..2cbd1527ed3 100644 --- a/src/webgl/program.ts +++ b/src/webgl/program.ts @@ -234,10 +234,9 @@ export class Program { } for (const segment of segments.get()) { - const vaos = segment.vaos || (segment.vaos = {}); - const vao: VertexArrayObject = vaos[layerID] || (vaos[layerID] = new VertexArrayObject()); - - vao.bind( + segment.vaos ||= {}; + segment.vaos[layerID] ||= new VertexArrayObject(); + segment.vaos[layerID].bind( context, this, layoutVertexBuffer, diff --git a/src/webgl/render_to_texture.ts b/src/webgl/render_to_texture.ts index c2377169552..bcbecbb7a42 100644 --- a/src/webgl/render_to_texture.ts +++ b/src/webgl/render_to_texture.ts @@ -94,7 +94,7 @@ export class RenderToTexture { for (const tileID of tileIDs) { const keys = this.terrain.tileManager.getTerrainCoords(tileID, terrainTileRanges); for (const key in keys) { - if (!this._coordsAscending[id][key]) this._coordsAscending[id][key] = []; + this._coordsAscending[id][key] ||= []; this._coordsAscending[id][key].push(keys[key]); } } diff --git a/test/integration/query/query.test.ts b/test/integration/query/query.test.ts index 56e271986e7..8a82463ac33 100644 --- a/test/integration/query/query.test.ts +++ b/test/integration/query/query.test.ts @@ -21,7 +21,7 @@ async function performQueryOnFixture(fixture) { async function handleOperation(map: maplibregl.Map, operation) { const opName = operation[0]; - + switch (opName) { case 'wait': while (!map.loaded()) { @@ -115,7 +115,7 @@ describe('query tests', () => { - + `); @@ -139,7 +139,7 @@ describe('query tests', () => { } return entry; }); - + const coverageReport = new CoverageReport({ name: 'MapLibre Coverage Report', outputDir: './coverage/query', @@ -149,9 +149,9 @@ describe('query tests', () => { } }); coverageReport.cleanCache(); - + await coverageReport.add(rawV8CoverageData); - + await coverageReport.generate(); }, 60000); @@ -225,7 +225,7 @@ function processStyle(testName:string, style: unknown, port:number) { const clone = JSON.parse(JSON.stringify(style)); localizeURLs(clone, port, 'test/integration'); - clone.metadata = clone.metadata || {}; + clone.metadata ||= {}; clone.metadata.test = { testName, diff --git a/test/integration/render/run_render_tests.ts b/test/integration/render/run_render_tests.ts index 558dcdce2a3..bb1a03b7b5d 100644 --- a/test/integration/render/run_render_tests.ts +++ b/test/integration/render/run_render_tests.ts @@ -169,9 +169,7 @@ function compareRenderResults(directory: string, testData: TestData, data: Uint8 const expectedBuf = fs.readFileSync(path); const expectedImg = PNG.sync.read(expectedBuf); const diffImg = new PNG({width, height}); - if (!testData.expected) { - testData.expected = expectedBuf.toString('base64'); // default expected image - } + testData.expected ||= expectedBuf.toString('base64'); // default expected image const diff = pixelmatch( actualImg.data, expectedImg.data, diffImg.data, @@ -215,7 +213,7 @@ function getTestStyles(options: RenderOptions, directory: string, port: number): .map(fixture => { const id = path.dirname(fixture); const style = JSON.parse(fs.readFileSync(path.join(directory, fixture), 'utf8')) as StyleWithTestData; - style.metadata = style.metadata || {} as any; + style.metadata ||= {} as any; style.metadata.test = { id,