diff --git a/docs/api-reference/aggregation-layers/aggregation-layer.md b/docs/api-reference/aggregation-layers/aggregation-layer.md index 0f0961aefca..4748221b5b6 100644 --- a/docs/api-reference/aggregation-layers/aggregation-layer.md +++ b/docs/api-reference/aggregation-layers/aggregation-layer.md @@ -1,54 +1,38 @@ -# AggregationLayer +# AggregationLayer (Experimental) -All of the layers in `@deck.gl/aggregation-layers` module perform some sort of data aggregation. All these layers perform aggregation with different parameters (CPU vs GPU, aggregation to rectangular bins vs hexagon bins, world space vs screen space, aggregation of single weight vs multiple weights etc). +`AggregationLayer` is the base class for all layers in `@deck.gl/aggregation-layers` module. It implements the most common tasks for aggregation with flexibility of customizations. -`AggregationLayer` and `GridAggregationLayer` perform most of the common tasks for aggregation with flexibility of customizations. This document describes what `AggregationLayer` does and how to use it in other aggregation layers. +`AggregationLayer` extends [CompositeLayer](../core/composite-layer.md). +## Methods -`AggregationLayer` is subclassed form `CompositeLayer` and all layers in `@deck.gl/aggregation-layers` are subclassed from this Layer. +Any layer subclassing the `AggregationLayer` must implement the following methods: -## Integration with `AttributeManager` +#### `getAggregatorType` {#getaggregatortype} -This layer creates `AttributeManager` and makes it available for its subclasses. Any aggregation layer can add attributes to the `AttributeManager` and retrieve them using `getAttributes` method. This enables using `AttributeManager`'s features and optimization for using attributes. Also manual iteration of `data` prop can be removed and attributes can be directly set on GPU aggregation models or accessed directly for CPU aggregation. +Returns a string that indicates the type of aggregator that this layer uses, for example `'gpu'`. The aggregator type is re-evaluated every time the layer updates (usually due to props or state change). If the type string does not match its previous value, any existing aggregator will be disposed,and `createAggregator` is called to create a new instance. -Example: Adding attributes to an aggregation layer +#### `createAggregator` {#createaggregator} -``` -const attributeManager = this.getAttributeManager(); -attributeManager.add({ - positions: {size: 3, accessor: 'getPosition'}, - color: {size: 3, accessor: 'getColorWeight'}, - elevation: {size: 3, accessor: 'getElevationWeight'} -}); -``` +Arguments: +- `type` (string) - return value from `getAggregatorType()` -## updateState() +Returns a [Aggregator](./aggregator.md) instance. This instance will be accessible via `this.state.aggregator`. -During update state, Subclasses of `AggregationLayer` must first call 'super.updateState()', which calls +#### `onAttributeChange` {#onattributechange} -- `updateShaders(shaders)` : Subclasses can override this if they need to update shaders, for example, when performing GPU aggregation, aggregation shaders must be merged with argument of this function to correctly apply `extensions`. +Arguments: +- `attributeId` (string) - the id of an attribute that has been updated -- `_updateAttributes`: This checks and updates attributes based on updated props. +This event handler should be used to update the props of the aggregator, if needed, and call `aggregator.setNeedsUpdate` to request an update. -## Checking if aggregation is dirty +#### `renderLayers` {#renderlayers} -### Dimensions +Returns a list of sub layers. -Typical aggregation, involves : -1. Group the input data points into bins -2. Compute the aggregated value for each bin +Aggregation results can be obtained here with `aggregator.getBins`, `aggregator.getResult` and `aggregator.getResultDomain`. -For example, when `cellSize` or `data` is changed, layer needs to perform both `1` and `2` steps, when a parameter affecting a bin's value is changed (like `getWeight` accessor), layer only need to perform step `2`. -When doing CPU Aggregation, both above steps are performed individually. But for GPU aggregation, both are merged into single render call. +## Source -To support what state is dirty, constructor takes `dimensions` object, which contains, several keyed dimensions. It must contain `data` dimension that defines, when re-aggregation needs to be performed. - -### isAggregationDirty() - -This helper can be used if a dimension is changed. Sublayers can defined custom dimensions and call this method to check if a dimension is changed. - - -### isAttributeChanged() - -`AggregationLayer` tracks what attributes are changed in each update cycle. Super classes can use `isAttributeChanged()` method to check if a specific attribute is changed or any attribute is changed. +[modules/aggregation-layers/src/common/aggregation-layer.ts](https://github.com/visgl/deck.gl/tree/master/modules/aggregation-layers/src/common/aggregation-layer.ts) diff --git a/docs/api-reference/aggregation-layers/aggregator.md b/docs/api-reference/aggregation-layers/aggregator.md new file mode 100644 index 00000000000..d91c442b6af --- /dev/null +++ b/docs/api-reference/aggregation-layers/aggregator.md @@ -0,0 +1,168 @@ +# Aggregator Interface + +The `Aggregator` interface describes a type of class that performs aggregation. + +## Terminology + +_Aggregation_ is a 2-step process: + +1. **Sort**: Group a collection of _data points_ by some property into _bins_. +2. **Aggregate**: for each _bin_, calculate a numeric output (_result_) from some metrics (_values_) from all its members. Multiple results can be obtained independently (_channels_). + +An implementation of the _Aggregator_ interface takes the following inputs: +- The number of data points +- The group that each data point belongs to, by mapping each data point to a _binId_ (array of integers) +- The values to aggregate, by mapping each data point in each channel to one _value_ (number) +- The method (_operation_) to reduce a list of values to one number, such as SUM + +And yields the following outputs: +- A list of _binIds_ that data points get sorted into +- The aggregated values (_result_) as a list of numbers, comprised of one number per bin per channel +- The [min, max] among all aggregated values (_domain_) for each channel + +### Example + +Consider the task of making a [histogram](https://en.wikipedia.org/wiki/Histogram) that shows the result of a survey by age distribution. + +1. The _data points_ are the list of participants, and we know the age of each person. +2. Suppose we want to group them by 5-year intervals. A 21-year-old participant is assigned to the bin of age 20-25, with _binId_ `[20]`. A 35-year-old participant is assigned to the bin of age 35-40, with _binId_ `[35]`, and so on. +3. For each bin (i.e. age group), we calculate 2 _values_: + + The first _channel_ is "number of participants". Each participant in this group yields a _value_ of 1, and the result equals all values added together (_operation_: SUM). + + The second _channel_ is "average score". Each participant in this group yields a _value_ that is their test score, and the result equals the sum of all scores divided by the number of participants (_operation_: MEAN). +4. As the outcome of the aggregation, we have: + + Bins: `[15, 20, 25, 30, 35, 40]` + + Channel 0 result: `[1, 5, 12, 10, 8, 3]` + + Channel 0 domain: `[1, 12]` + + Channel 1 result: `[6, 8.2, 8.5, 7.9, 7.75, 8]` + + Channel 1 domain: `[6, 8.5]` + + +## Methods + +An implementation of `Aggregator` should expose the following methods: + +#### `setProps` {#setprops} + +Set runtime properties of the aggregation. + +```ts +aggregator.setProps({ + pointCount: 10000, + attributes: {...}, + operations: ['SUM', 'MEAN'], + binOptions: {groupSize: 5} +}); +``` + +Arguments: +- `pointCount` (number) - number of data points. +- `attributes` ([Attribute](../core/attribute.md)[]) - the input data. +- `operations` (string[]) - How to aggregate the values inside a bin, defined per channel. +- `binOptions` (object) - arbitrary settings that affect bin sorting. +- `onUpdate` (Function) - callback when a channel has been recalculated. Receives the following arguments: + + `channel` (number) - the channel that just updated + +#### `setNeedsUpdate` {#setneedsupdate} + +Flags a channel to need update. This could be a result of change in the input data or bin options. + +```ts +aggregator.setNeedsUpdate(0); +``` + +Arguments: +- `channel` (number, optional) - mark the given channel as dirty. If not provided, all channels will be updated. + +#### `update` {#update} + +Called after all props are set and before results are accessed. The aggregator should allocate resources and redo aggregations if needed at this stage. + +```ts +aggregator.update(); +``` + +#### `preDraw` {#predraw} + +Called before the result buffers are drawn to screen. Certain types of aggregations are dependent on render time context and this is alternative opportunity to update just-in-time. + +```ts +aggregator.preDraw({moduleSettings: ...}); +``` + +#### `getBin` {#getbin} + +Get the information of a given bin. + +```ts +const bin = aggregator.getBin(100); +``` + +Arguments: +- `index` (number) - index of the bin to locate it in `getBins()` + +Returns: +- `id` (number[]) - Unique bin ID. +- `value` (number[]) - Aggregated values by channel. +- `count` (number) - Number of data points in this bin. +- `pointIndices` (number[] | undefined) - Indices of data points in this bin if available. This field may not be populated when using GPU-based implementations. + +#### `getBins` {#getbins} + +Get an accessor to all bin IDs. + +```ts +const binIdsAttribute = aggregator.getBins(); +``` + +Returns: +- A [binary attribute](../core/layer.md#dataattributes) of the output bin IDs, or +- null, if `update` has never been called + +#### `getResult` {#getresult} + +Get an accessor to the aggregated values of a given channel. + +```ts +const resultAttribute = aggregator.getResult(0); +``` + +Arguments: +- `channel` (number) - the channel to retrieve results from + +Returns: +- A [binary attribute](../core/layer.md#dataattributes) of the output values of the given channel, or +- null, if `update` has never been called + +#### `getResultDomain` {#getresultdomain} + +Get the [min, max] of aggregated values of a given channel. + +```ts +const [min, max] = aggregator.getResultDomain(0); +``` + +Arguments: +- `channel` (number) - the channel to retrieve results from + +Returns the domain ([number, number]) of the aggregated values of the given channel. + +#### `destroy` {#destroy} + +Dispose all allocated resources. + +```ts +aggregator.destroy(); +``` + + +## Members + +An implementation of `Aggregator` should expose the following members: + +#### `binCount` (number) {#bincount} + +The number of bins in the aggregated result. + +## Source + +[modules/aggregation-layers/src/common/aggregator/aggregator.ts](https://github.com/visgl/deck.gl/tree/master/modules/aggregation-layers/src/common/aggregator/aggregator.ts) diff --git a/docs/api-reference/aggregation-layers/contour-layer.md b/docs/api-reference/aggregation-layers/contour-layer.md index 86dcaf8e199..2aef59b9697 100644 --- a/docs/api-reference/aggregation-layers/contour-layer.md +++ b/docs/api-reference/aggregation-layers/contour-layer.md @@ -147,7 +147,7 @@ npm install @deck.gl/core @deck.gl/layers @deck.gl/aggregation-layers ```ts import {ContourLayer} from '@deck.gl/aggregation-layers'; -import type {ContourLayerProps} from '@deck.gl/aggregation-layers'; +import type {ContourLayerProps, ContourLayerPickingInfo} from '@deck.gl/aggregation-layers'; new ContourLayer(...props: ContourLayerProps[]); ``` @@ -171,7 +171,7 @@ new deck.ContourLayer({}); Inherits from all [Base Layer](../core/layer.md) properties. -### Render Options +### Aggregation Options #### `cellSize` (number, optional) ![transition-enabled](https://img.shields.io/badge/transition-enabled-green.svg?style=flat-square") {#cellsize} @@ -183,19 +183,27 @@ Size of each cell in meters * Default: true -When set to true and browser supports GPU aggregation, aggregation is performed on GPU. GPU aggregation can be 2 to 3 times faster depending upon number of points and number of cells. +When set to `true` and the browser supports it, aggregation is performed on GPU. + +In the right context, enabling GPU aggregation can significantly speed up your application. However, depending on the nature of input data and required application features, there are pros and cons in leveraging this functionality. See [CPU vs GPU aggregation](./overview.md#cpu-vs-gpu-aggregation) for an in-depth discussion. + #### `aggregation` (string, optional) {#aggregation} -* Default: 'SUM' +* Default: `'SUM'` + +Defines the operation used to aggregate all data object weights to calculate a cell's value. Valid values are: + +- `'SUM'`: The sum of weights across all points that fall into a cell. +- `'MEAN'`: The mean weight across all points that fall into a cell. +- `'MIN'`: The minimum weight across all points that fall into a cell. +- `'MAX'`: The maximum weight across all points that fall into a cell. +- `'COUNT'`: The number of points that fall into a cell. -Defines the type of aggregation operation, valid values are 'SUM', 'MEAN', 'MIN' and 'MAX'. When no value or an invalid value is set, 'SUM' is used as aggregation. +`getWeight` and `aggregation` together determine the elevation value of each cell. -* SUM : Grid cell contains sum of all weights that fall into it. -* MEAN : Grid cell contains mean of all weights that fall into it. -* MIN : Grid cell contains minimum of all weights that fall into it. -* MAX : Grid cell contains maximum of all weights that fall into it. +### Render Options #### `contours` (object[], optional) {#contours} @@ -240,11 +248,18 @@ The weight of each object. * If a function is provided, it is called on each object to retrieve its weight. +## Picking + +The [PickingInfo.object](../../developer-guide/interactivity.md#the-pickinginfo-object) field returned by hover/click events of this layer represents a path (isoline) or a polygon (isoband). The object contains the following fields: + +- `contour` (object) - one of the contour configurations passed to the `contours` prop. + + ## Sub Layers The `ContourLayer` renders the following sublayers: -* `lines` - For Isolines, rendered by [LineLayer](../layers/line-layer.md) +* `lines` - For Isolines, rendered by [PathLayer](../layers/path-layer.md) * `bands` - For Isobands, rendered by [SolidPolygonLayer](../layers/solid-polygon-layer.md) diff --git a/docs/api-reference/aggregation-layers/cpu-aggregator.md b/docs/api-reference/aggregation-layers/cpu-aggregator.md new file mode 100644 index 00000000000..a2ff9c27a0e --- /dev/null +++ b/docs/api-reference/aggregation-layers/cpu-aggregator.md @@ -0,0 +1,92 @@ +# CPUAggregator + +The `CPUAggregator` implements the [Aggregator](./aggregator.md) interface by performing aggregation on the CPU. + +## Example + +This example implements an aggregator that makes a [histogram](https://en.wikipedia.org/wiki/Histogram) that calculates "weight" distribution by "position". + +```ts +import {CPUAggregator} from '@deck.gl/aggregation-layers'; + +const aggregator = new CPUAggregator({ + dimensions: 1, + getBin: { + sources: ['position'], + getValue: (data: {position: number}, index: number, options: {binSize: number}) => + [Math.floor(data.position / options.binSize)] + }, + getValue: [ + { + sources: ['weight'], + getValue: (data: {weight: number}) => data.weight + } + ] +}); + +const position = new Attribute(device, {id: 'position', size: 1}); +position.setData({value: new Float32Array(...)}); +const weight = new Attribute(device, {id: 'weight', size: 1}); +position.setData({value: new Float32Array(...)}); + +aggregator.setProps({ + pointCount: data.length, + operations: ['SUM'], + binOptions: { + binSize: 1 + }, + attributes: {position, weight} +}); + +aggregator.update(); +``` + +## Constructor + +```ts +new CPUAggregator(props); +``` + +Arguments: + +- `dimensions` (number) - size of bin IDs, either 1 or 2 +- `getBin` (VertexAccessor) - accessor to map each data point to a bin ID + + `sources` (string[]) - attribute names needed for the calculation + + `getValue` (`(data: object, index: number, options: object) => number[] | null`) - callback to retrieve the bin ID for each data point. + Bin ID should be an array with [dimensions] elements; or null if the data point should be skipped +- `getValue` (VertexAccessor[]) - accessor to map each data point to a weight value, defined per channel. Each accsor should contain these fields: + + `sources` (string[]) - attribute names needed for the calculation + + `getValue` (`(data: object, index: number, options: object) => number`) - callback to retrieve the value for each data point. + +## Props + +Requires all [Aggregator](./aggregator.md#setprops) props, and the following: + +#### `customOperations` (Function[]) {#customoperations} + +Overrides built-in aggregation operation with a custom reducer. +Each element can optionally be a callback with the following signature: + +```ts +(pointIndices: number[], getValue: (index: number) => number) => number; +``` + +If a custom operation is defined, the corresponding element in the `operations` array will be ignored. + +Example to calculate the median for channel 1: + +```ts +function median(pointIndices: number[], getValue: (index: number) => number) { + const values = pointIndices.map(getValue); + values.sort((a, b) => a - b); + return values[values.length >> 1]; +} + +aggregator.setProps({ + customOperations: [null, median, null] +}); +``` + +## Source + +[modules/aggregation-layers/src/common/aggregator/cpu-aggregator/cpu-aggregator.ts](https://github.com/visgl/deck.gl/tree/master/modules/aggregation-layers/src/common/aggregator/cpu-aggregator/cpu-aggregator.ts) diff --git a/docs/api-reference/aggregation-layers/cpu-grid-layer.md b/docs/api-reference/aggregation-layers/cpu-grid-layer.md deleted file mode 100644 index 132a5d1b1cb..00000000000 --- a/docs/api-reference/aggregation-layers/cpu-grid-layer.md +++ /dev/null @@ -1,447 +0,0 @@ -# CPUGridLayer - -import {CPUGridLayerDemo} from '@site/src/doc-demos/aggregation-layers'; - - - -The `CPUGridLayer` aggregates data into a grid-based heatmap. The color and height of a cell are determined based on the objects it contains. Aggregation is performed on CPU. - -`CPUGridLayer` is one of the sublayers for [GridLayer](./grid-layer.md), and is provided to customize CPU Aggregation for advanced use cases. For any regular use case, [GridLayer](./grid-layer.md) is recommended. - -`CPUGridLayer` is a [CompositeLayer](../core/composite-layer.md). - - -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - - - - -```js -import {Deck} from '@deck.gl/core'; -import {CPUGridLayer} from '@deck.gl/aggregation-layers'; - -const layer = new CPUGridLayer({ - id: 'CPUGridLayer', - data: 'https://raw.githubusercontent.com/visgl/deck.gl-data/master/website/sf-bike-parking.json', - - extruded: true, - getPosition: d => d.COORDINATES, - getColorWeight: d => d.SPACES, - getElevationWeight: d => d.SPACES, - elevationScale: 4, - cellSize: 200, - pickable: true -}); - -new Deck({ - initialViewState: { - longitude: -122.4, - latitude: 37.74, - zoom: 11 - }, - controller: true, - getTooltip: ({object}) => object && `Count: ${object.elevationValue}`, - layers: [layer] -}); -``` - - - - -```ts -import {Deck, PickingInfo} from '@deck.gl/core'; -import {CPUGridLayer} from '@deck.gl/aggregation-layers'; - -type BikeRack = { - ADDRESS: string; - SPACES: number; - COORDINATES: [longitude: number, latitude: number]; -}; - -const layer = new CPUGridLayer({ - id: 'CPUGridLayer', - data: 'https://raw.githubusercontent.com/visgl/deck.gl-data/master/website/sf-bike-parking.json', - - extruded: true, - getPosition: (d: BikeRack) => d.COORDINATES, - getColorWeight: (d: BikeRack) => d.SPACES, - getElevationWeight: (d: BikeRack) => d.SPACES, - elevationScale: 4, - cellSize: 200, - pickable: true -}); - -new Deck({ - initialViewState: { - longitude: -122.4, - latitude: 37.74, - zoom: 11 - }, - controller: true, - getTooltip: ({object}: PickingInfo) => object && `Count: ${object.elevationValue}`, - layers: [layer] -}); -``` - - - - -```tsx -import React from 'react'; -import DeckGL from '@deck.gl/react'; -import {CPUGridLayer} from '@deck.gl/aggregation-layers'; -import type {PickingInfo} from '@deck.gl/core'; - -type BikeRack = { - ADDRESS: string; - SPACES: number; - COORDINATES: [longitude: number, latitude: number]; -}; - -function App() { - const layer = new CPUGridLayer({ - id: 'CPUGridLayer', - data: 'https://raw.githubusercontent.com/visgl/deck.gl-data/master/website/sf-bike-parking.json', - - extruded: true, - getPosition: (d: BikeRack) => d.COORDINATES, - getColorWeight: (d: BikeRack) => d.SPACES, - getElevationWeight: (d: BikeRack) => d.SPACES, - elevationScale: 4, - cellSize: 200, - pickable: true - }); - - return ) => object && `Count: ${object.elevationValue}`} - layers={[layer]} - />; -} -``` - - - - -**Note:** The `CPUGridLayer` at the moment only works with `COORDINATE_SYSTEM.LNGLAT`. - - -## Installation - -To install the dependencies from NPM: - -```bash -npm install deck.gl -# or -npm install @deck.gl/core @deck.gl/layers @deck.gl/aggregation-layers -``` - -```ts -import {CPUGridLayer} from '@deck.gl/aggregation-layers'; -import type {CPUGridLayerProps} from '@deck.gl/aggregation-layers'; - -new CPUGridLayer(...props: CPUGridLayerProps[]); -``` - -To use pre-bundled scripts: - -```html - - - - - -``` - -```js -new deck.CPUGridLayer({}); -``` - - -## Properties - -Inherits from all [Base Layer](../core/layer.md) and [CompositeLayer](../core/composite-layer.md) properties. - -### Render Options - -#### `cellSize` (number, optional) ![transition-enabled](https://img.shields.io/badge/transition-enabled-green.svg?style=flat-square") {#cellsize} - -* Default: `1000` - -Size of each cell in meters - -#### `colorDomain` (number[2], optional) {#colordomain} - -* Default: `[min(colorWeight), max(colorWeight)]` - -Color scale domain, default is set to the extent of aggregated weights in each cell. -You can control how the colors of cells are mapped to weights by passing in an arbitrary color domain. -This is useful when you want to render different data input with the same color mapping for comparison. - -#### `colorRange` (Color[], optional) {#colorrange} - -* Default: [colorbrewer](http://colorbrewer2.org/#type=sequential&scheme=YlOrRd&n=6) `6-class YlOrRd` - -Specified as an array of colors [color1, color2, ...]. Each color is an array of 3 or 4 values [R, G, B] or [R, G, B, A], representing intensities of Red, Green, Blue and Alpha channels. Each intensity is a value between 0 and 255. When Alpha not provided a value of 255 is used. - -`colorDomain` is divided into `colorRange.length` equal segments, each mapped to one color in `colorRange`. - -#### `coverage` (number, optional) ![transition-enabled](https://img.shields.io/badge/transition-enabled-green.svg?style=flat-square") {#coverage} - -* Default: `1` - -Cell size multiplier, clamped between 0 - 1. The displayed size of cell is calculated by `coverage * cellSize`. -Note: coverage does not affect how objects are binned. - -#### `elevationDomain` (number[2], optional) {#elevationdomain} - -* Default: `[0, max(elevationWeight)]` - -Elevation scale input domain, default is set to between 0 and the max of aggregated weights in each cell. -You can control how the elevations of cells are mapped to weights by passing in an arbitrary elevation domain. -This is useful when you want to render different data input with the same elevation scale for comparison. - -#### `elevationRange` (number[2], optional) {#elevationrange} - -* Default: `[0, 1000]` - -Elevation scale output range - -#### `elevationScale` (number, optional) ![transition-enabled](https://img.shields.io/badge/transition-enabled-green.svg?style=flat-square") {#elevationscale} - -* Default: `1` - -Cell elevation multiplier. -This is a handy property to scale all cells without updating the data. - -#### `extruded` (boolean, optional) {#extruded} - -* Default: `true` - -Whether to enable cell elevation. If set to false, all cell will be flat. - -#### `upperPercentile` (number, optional) ![transition-enabled](https://img.shields.io/badge/transition-enabled-green.svg?style=flat-square") {#upperpercentile} - -* Default: `100` - -Filter cells and re-calculate color by `upperPercentile`. Cells with value -larger than the upperPercentile will be hidden. - -#### `lowerPercentile` (number, optional) ![transition-enabled](https://img.shields.io/badge/transition-enabled-green.svg?style=flat-square") {#lowerpercentile} - -* Default: `0` - -Filter cells and re-calculate color by `lowerPercentile`. Cells with value -smaller than the lowerPercentile will be hidden. - -#### `elevationUpperPercentile` (number, optional) ![transition-enabled](https://img.shields.io/badge/transition-enabled-green.svg?style=flat-square") {#elevationupperpercentile} - -* Default: `100` - -Filter cells and re-calculate elevation by `elevationUpperPercentile`. Cells with elevation value -larger than the elevationUpperPercentile will be hidden. - -#### `elevationLowerPercentile` (number, optional) ![transition-enabled](https://img.shields.io/badge/transition-enabled-green.svg?style=flat-square") {#elevationlowerpercentile} - -* Default: `0` - -Filter cells and re-calculate elevation by `elevationLowerPercentile`. Cells with elevation value -smaller than the elevationLowerPercentile will be hidden. - -#### `colorScaleType` (string, optional) {#colorscaletype} - -* Default: 'quantize' - -Scaling function used to determine the color of the grid cell, default value is 'quantize'. Supported Values are 'quantize', 'linear', 'quantile' and 'ordinal'. - -#### `material` (Material, optional) {#material} - -* Default: `true` - -This is an object that contains material props for [lighting effect](../core/lighting-effect.md) applied on extruded polygons. -Check [the lighting guide](../../developer-guide/using-effects.md#material-settings) for configurable settings. - - -#### `colorAggregation` (string, optional) {#coloraggregation} - -* Default: `'SUM'` - -Defines the operation used to aggregate all data object weights to calculate a bin's color value. Valid values are `'SUM'`, `'MEAN'`, `'MIN'` and `'MAX'`. `'SUM'` is used when an invalid value is provided. - -`getColorWeight` and `colorAggregation` together determine the elevation value of each cell. If the `getColorValue` prop is supplied, they will be ignored. - -##### Example: Color by the count of data elements - -```ts title="Option A: use getColorValue" -const layer = new CPUGridLayer({ - // ... - getColorValue: (points: BikeRack[]) => points.length, -}); -``` - -```ts title="Option B: use getColorWeight and colorAggregation" -const layer = new CPUGridLayer({ - // ... - getColorWeight: (d: BikeRack) => 1, - colorAggregation: 'SUM' -}); -``` - -##### Example: Color by the mean value of 'SPACES' field - -```ts title="Option A: use getColorValue" -const layer = new CPUGridLayer({ - // ... - getColorValue: (points: BikeRack[]) => { - // Calculate mean value - return points.reduce((sum: number, p: BikeRack) => sum += p.SPACES, 0) / points.length; - } -}); -``` - -```ts title="Option B: use getColorWeight and colorAggregation" -const layer = new CPUGridLayer({ - // ... - getColorWeight: (point: BikeRack) => point.SPACES, - colorAggregation: 'SUM' -}); -``` - -If your use case requires aggregating using an operation that is not one of 'SUM', 'MEAN', 'MAX' and 'MIN', `getColorValue` should be used to define such custom aggregation function. - - -#### `elevationAggregation` (string, optional) {#elevationaggregation} - -* Default: `'SUM'` - -Defines the operation used to aggregate all data object weights to calculate a bin's elevation value. Valid values are `'SUM'`, `'MEAN'`, `'MIN'` and `'MAX'`. `'SUM'` is used when an invalid value is provided. - -`getElevationWeight` and `elevationAggregation` together determine the elevation value of each cell. If the `getElevationValue` prop is supplied, they will be ignored. - -##### Example: Elevation by the count of data elements - -```ts title="Option A: use getElevationValue" -const layer = new CPUGridLayer({ - // ... - getElevationValue: (points: BikeRack[]) => points.length -}); -``` - -```ts title="Option B: use getElevationWeight and elevationAggregation" -const layer = new CPUGridLayer({ - // ... - getElevationWeight: (point: BikeRack) => 1, - elevationAggregation: 'SUM' -}); -``` - -##### Example: Elevation by the maximum value of 'SPACES' field - -```ts title="Option A: use getElevationValue" -const layer = new CPUGridLayer({ - // ... - getElevationValue: (points: BikeRack[]) => { - // Calculate max value - return points.reduce((max: number, p: BikeRack) => p.SPACES > max ? p.SPACES : max, -Infinity); - } -}); -``` - -```ts title="Option B: use getElevationWeight and elevationAggregation" -const layer = new CPUGridLayer({ - // ... - getElevationWeight: (point: BikeRack) => point.SPACES, - elevationAggregation: 'MAX' -}); -``` - -If your use case requires aggregating using an operation that is not one of 'SUM', 'MEAN', 'MAX' and 'MIN', `getElevationValue` should be used to define such custom aggregation function. - - -### Data Accessors - -#### `getPosition` ([Accessor<Position>](../../developer-guide/using-layers.md#accessors), optional) {#getposition} - -* Default: `object => object.position` - -Method called to retrieve the position of each object. - - -#### `getColorWeight` ([Accessor<number>](../../developer-guide/using-layers.md#accessors), optional) ![transition-enabled](https://img.shields.io/badge/transition-enabled-green.svg?style=flat-square") {#getcolorweight} - -* Default: `1` - -The weight of a data object used to calculate the color value for a cell. - -* If a number is provided, it is used as the weight for all objects. -* If a function is provided, it is called on each object to retrieve its weight. - - -#### `getColorValue` (Function, optional) ![transition-enabled](https://img.shields.io/badge/transition-enabled-green.svg?style=flat-square") {#getcolorvalue} - -* Default: `null` - -After data objects are aggregated into cells, this accessor is called on each cell to get the value that its color is based on. If supplied, this will override the effect of `getColorWeight` and `colorAggregation` props. - -Arguments: - -- `objects` (DataT[]) - a list of objects whose positions fall inside this cell. -- `objectInfo` (object) - contains the following fields: - + `indices` (number[]) - the indices of `objects` in the original data - + `data` - the value of the `data` prop. - - -#### `getElevationWeight` ([Accessor<number>](../../developer-guide/using-layers.md#accessors), optional) ![transition-enabled](https://img.shields.io/badge/transition-enabled-green.svg?style=flat-square") {#getelevationweight} - -* Default: `1` - -The weight of a data object used to calculate the elevation value for a cell. - -* If a number is provided, it is used as the weight for all objects. -* If a function is provided, it is called on each object to retrieve its weight. - - -#### `getElevationValue` (Function, optional) ![transition-enabled](https://img.shields.io/badge/transition-enabled-green.svg?style=flat-square") {#getelevationvalue} - -* Default: `null` - -After data objects are aggregated into cells, this accessor is called on each cell to get the value that its elevation is based on. If supplied, this will override the effect of `getElevationWeight` and `elevationAggregation` props. - -Arguments: - -- `objects` (DataT[]) - a list of objects whose positions fall inside this cell. -- `objectInfo` (object) - contains the following fields: - + `indices` (number[]) - the indices of `objects` in the original data - + `data` - the value of the `data` prop. - - -### Callbacks - -#### `onSetColorDomain` (Function, optional) {#onsetcolordomain} - -* Default: `([min, max]) => {}` - -This callback will be called when cell color domain has been calculated. - -#### `onSetElevationDomain` (Function, optional) {#onsetelevationdomain} - -* Default: `([min, max]) => {}` - -This callback will be called when cell elevation domain has been calculated. - - -## Sub Layers - -The CPUGridLayer renders the following sublayers: - -* `grid-cell` - a [GridCellLayer](../layers/grid-cell-layer.md) rendering the aggregated columns. - -## Source - -[modules/aggregation-layers/src/cpu-grid-layer](https://github.com/visgl/deck.gl/tree/master/modules/aggregation-layers/src/cpu-grid-layer) diff --git a/docs/api-reference/aggregation-layers/gpu-grid-layer.md b/docs/api-reference/aggregation-layers/gpu-grid-layer.md deleted file mode 100644 index 080f2a96dac..00000000000 --- a/docs/api-reference/aggregation-layers/gpu-grid-layer.md +++ /dev/null @@ -1,308 +0,0 @@ -# GPUGridLayer - -import {GPUGridLayerDemo} from '@site/src/doc-demos/aggregation-layers'; - - - -The `GPUGridLayer` aggregates data into a grid-based heatmap. The color and height of a cell are determined based on the objects it contains. - -`GPUGridLayer` is one of the sublayers for [GridLayer](./grid-layer.md). It is provided to customize GPU Aggregation for advanced use cases. For any regular use case, [GridLayer](./grid-layer.md) is recommended. - -`GPUGridLayer` is a [CompositeLayer](../core/composite-layer.md). - - - -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - - - - -```js -import {Deck} from '@deck.gl/core'; -import {GPUGridLayer} from '@deck.gl/aggregation-layers'; - -const layer = new GPUGridLayer({ - id: 'GPUGridLayer', - data: 'https://raw.githubusercontent.com/visgl/deck.gl-data/master/website/sf-bike-parking.json', - - extruded: true, - getPosition: d => d.COORDINATES, - getColorWeight: d => d.SPACES, - getElevationWeight: d => d.SPACES, - elevationScale: 4, - cellSize: 200, - pickable: true -}); - -new Deck({ - initialViewState: { - longitude: -122.4, - latitude: 37.74, - zoom: 11 - }, - controller: true, - getTooltip: ({object}) => object && `Count: ${object.elevationValue}`, - layers: [layer] -}); -``` - - - - -```ts -import {Deck, PickingInfo} from '@deck.gl/core'; -import {GPUGridLayer} from '@deck.gl/aggregation-layers'; - -type BikeRack = { - ADDRESS: string; - SPACES: number; - COORDINATES: [longitude: number, latitude: number]; -}; - -const layer = new GPUGridLayer({ - id: 'GPUGridLayer', - data: 'https://raw.githubusercontent.com/visgl/deck.gl-data/master/website/sf-bike-parking.json', - - extruded: true, - getPosition: (d: BikeRack) => d.COORDINATES, - getColorWeight: (d: BikeRack) => d.SPACES, - getElevationWeight: (d: BikeRack) => d.SPACES, - elevationScale: 4, - cellSize: 200, - pickable: true -}); - -new Deck({ - initialViewState: { - longitude: -122.4, - latitude: 37.74, - zoom: 11 - }, - controller: true, - getTooltip: ({object}: PickingInfo) => object && `Count: ${object.elevationValue}`, - layers: [layer] -}); -``` - - - - -```tsx -import React from 'react'; -import DeckGL from '@deck.gl/react'; -import {GPUGridLayer} from '@deck.gl/aggregation-layers'; -import type {PickingInfo} from '@deck.gl/core'; - -type BikeRack = { - ADDRESS: string; - SPACES: number; - COORDINATES: [longitude: number, latitude: number]; -}; - -function App() { - const layer = new GPUGridLayer({ - id: 'GPUGridLayer', - data: 'https://raw.githubusercontent.com/visgl/deck.gl-data/master/website/sf-bike-parking.json', - - extruded: true, - getPosition: (d: BikeRack) => d.COORDINATES, - getColorWeight: (d: BikeRack) => d.SPACES, - getElevationWeight: (d: BikeRack) => d.SPACES, - elevationScale: 4, - cellSize: 200, - pickable: true - }); - - return ) => object && `Count: ${object.elevationValue}`} - layers={[layer]} - />; -} -``` - - - - - -**Note:** The `GPUGridLayer` at the moment only works with `COORDINATE_SYSTEM.LNGLAT`. - -**Note:** GPU Aggregation is faster only when using large data sets (data size is more than 500K), for smaller data sets GPU Aggregation could be potentially slower than CPU Aggregation. - -**Note:** This layer is similar to [CPUGridLayer](./cpu-grid-layer.md) but performs aggregation on GPU. Check below for more detailed differences of this layer compared to `CPUGridLayer`. - - -## Installation - -To install the dependencies from NPM: - -```bash -npm install deck.gl -# or -npm install @deck.gl/core @deck.gl/layers @deck.gl/aggregation-layers -``` - -```ts -import {GPUGridLayer} from '@deck.gl/aggregation-layers'; -import type {GPUGridLayerProps} from '@deck.gl/aggregation-layers'; - -new GPUGridLayer(...props: GPUGridLayerProps[]); -``` - -To use pre-bundled scripts: - -```html - - - - - -``` - -```js -new deck._GPUGridLayer({}); -``` - - -## Properties - -Inherits from all [Base Layer](../core/layer.md) and [CompositeLayer](../core/composite-layer.md) properties. - -### Render Options - -#### `cellSize` (number, optional) ![transition-enabled](https://img.shields.io/badge/transition-enabled-green.svg?style=flat-square") {#cellsize} - -* Default: `1000` - -Size of each cell in meters. Must be greater than `0`. - -#### `colorDomain` (number[2], optional) {#colordomain} - -* Default: `[min(colorWeight), max(colorWeight)]` - -Color scale domain, default is set to the extent of aggregated weights in each cell. -You can control how the colors of cells are mapped to weights by passing in an arbitrary color domain. -This is useful when you want to render different data input with the same color mapping for comparison. - - -#### `colorRange` (Color[], optional) {#colorrange} - -* Default: [colorbrewer](http://colorbrewer2.org/#type=sequential&scheme=YlOrRd&n=6) `6-class YlOrRd` - -Specified as an array of colors [color1, color2, ...]. Each color is an array of 3 or 4 values [R, G, B] or [R, G, B, A], representing intensities of Red, Green, Blue and Alpha channels. Each intensity is a value between 0 and 255. When Alpha not provided a value of 255 is used. - -`colorDomain` is divided into `colorRange.length` equal segments, each mapped to one color in `colorRange`. - -#### `coverage` (number, optional) ![transition-enabled](https://img.shields.io/badge/transition-enabled-green.svg?style=flat-square") {#coverage} - -* Default: `1` - -Cell size multiplier, clamped between 0 - 1. The displayed size of cell is calculated by `coverage * cellSize`. -Note: coverage does not affect how objects are binned. - -#### `elevationDomain` (number[2], optional) {#elevationdomain} - -* Default: `[0, max(elevationWeight)]` - -Elevation scale input domain, default is set to between 0 and the max of aggregated weights in each cell. -You can control how the elevations of cells are mapped to weights by passing in an arbitrary elevation domain. -This is useful when you want to render different data input with the same elevation scale for comparison. - -#### `elevationRange` (number[2], optional) {#elevationrange} - -* Default: `[0, 1000]` - -Elevation scale output range - -#### `elevationScale` (number, optional) ![transition-enabled](https://img.shields.io/badge/transition-enabled-green.svg?style=flat-square") {#elevationscale} - -* Default: `1` - -Cell elevation multiplier. -This is a handy property to scale the height of all cells without updating the data. - -#### `extruded` (boolean, optional) {#extruded} - -* Default: `true` - -Whether to enable cell elevation. If set to false, all cell will be flat. - -#### `material` (Material, optional) {#material} - -* Default: `true` - -This is an object that contains material props for [lighting effect](../core/lighting-effect.md) applied on extruded polygons. -Check [the lighting guide](../../developer-guide/using-effects.md#material-settings) for configurable settings. - - - -#### `colorAggregation` (string, optional) {#coloraggregation} - -* Default: `'SUM'` - -Defines the operation used to aggregate all data object weights to calculate a bin's color value. Valid values are `'SUM'`, `'MEAN'`, `'MIN'` and `'MAX'`. `'SUM'` is used when an invalid value is provided. - -`getColorWeight` and `colorAggregation` together determine the elevation value of each cell. - -#### `elevationAggregation` (string, optional) {#elevationaggregation} - -* Default: `'SUM'` - -Defines the operation used to aggregate all data object weights to calculate a bin's elevation value. Valid values are `'SUM'`, `'MEAN'`, `'MIN'` and `'MAX'`. `'SUM'` is used when an invalid value is provided. - -`getElevationWeight` and `elevationAggregation` together determine the elevation value of each cell. - - -### Data Accessors - -#### `getPosition` ([Accessor<Position>](../../developer-guide/using-layers.md#accessors), optional) {#getposition} - -* Default: `object => object.position` - -Method called to retrieve the position of each object. - - -#### `getColorWeight` ([Accessor<number>](../../developer-guide/using-layers.md#accessors), optional) ![transition-enabled](https://img.shields.io/badge/transition-enabled-green.svg?style=flat-square") {#getcolorweight} - -* Default: `1` - -The weight of a data object used to calculate the color value for a cell. - -* If a number is provided, it is used as the weight for all objects. -* If a function is provided, it is called on each object to retrieve its weight. - - -#### `getElevationWeight` ([Accessor<number>](../../developer-guide/using-layers.md#accessors), optional) ![transition-enabled](https://img.shields.io/badge/transition-enabled-green.svg?style=flat-square") {#getelevationweight} - -* Default: `1` - -The weight of a data object used to calculate the elevation value for a cell. - -* If a number is provided, it is used as the weight for all objects. -* If a function is provided, it is called on each object to retrieve its weight. - - -## Differences compared to CPUGridLayer - -### Unsupported props - -Due to the nature of GPU Aggregation implementation, the following `CPUGridLayer` props are not supported by this layer. - -`upperPercentile` `lowerPercentile` `elevationUpperPercentile`, `elevationLowerPercentile`, `getColorValue`, `getElevationValue`, `onSetColorDomain` and `onSetElevationDomain` - -Instead of `getColorValue`, `getColorWeight` and `colorAggregation` should be used. Instead of `getElevationValue`, `getElevationWeight` and `elevationAggregation` should be used. There is no alternate for all other unsupported props, if they are needed `CPUGridLayer` should be used instead of this layer. - -### Picking - -When picking mode is `hover`, only the elevation value, color value of selected cell are included in picking result. Array of all objects that aggregated into that cell is not provided. For all other modes, picking results match with `CPUGridLayer`, for these cases data is aggregated on CPU to provide array of all objects that aggregated to the cell. - - -## Source - -[modules/aggregation-layers/src/gpu-grid-layer](https://github.com/visgl/deck.gl/tree/master/modules/aggregation-layers/src/gpu-grid-layer) diff --git a/docs/api-reference/aggregation-layers/grid-aggregation-layer.md b/docs/api-reference/aggregation-layers/grid-aggregation-layer.md deleted file mode 100644 index 0f876f2090d..00000000000 --- a/docs/api-reference/aggregation-layers/grid-aggregation-layer.md +++ /dev/null @@ -1,46 +0,0 @@ -# GridAggregationLayer - -This layer performs some common tasks required to perform aggregation to grid cells, especially it takes care of deciding CPU vs GPU aggregation, allocating resources for GPU aggregation and uploading results. - -This in an abstract layer, subclassed form `AggregationLayer`, `GPUGridLayer`, `ScreenGridLayer` and `ContourLayer` are subclassed from this layer. - -## updateState() - -During `updateState()`, it calls `updateAggregationState()` which sub classes must implement. During this method, sub classes must set following aggregation flags and aggregation params. - -### Aggregation Flags - -* `gpuAggregation`: When `true` aggregation happens on GPU, otherwise on CPU. -* `aggregationDataDirty` : When `true` data is re-aggregated. -* `aggregationWeightsDirty` : This flag is applicable only for CPU aggregation. When `true`, bin's aggregated values are re computed. - -## Aggregation Parameters - -* `gridOffset` : Grid's cell size in the format {xOffset, yOffset}. -* `projectPoints` : Should be `true` when doing screen space aggregation, when `false` it implies world space aggregation. -* `attributes` : Layer's current set of attributes which provide position and weights to CPU/GPU aggregators. -* `viewport` : current viewport object. -* `posOffset` : Offset to be added to object's position before aggregating. -* `boundingBox` : Bounding box of the input data. -Following are applicable for GPU aggregation only: -* `translation` : [xTranslation, yTranslation], position translation to be applied on positions. -* `scaling` : [xScale, yScale, flag], scaling to be applied on positions. When scaling not needed `flag` should be set to `0`. -* `vertexCount` : Number of objects to be aggregated. -* `moduleSettings` : Object with set of fields required for applying shader modules. - - -## updateResults() - -When aggregation performed on CPU, aggregation result is in JS Array objects. Subclasses can override this method to consume aggregation data. This method is called with an object with following fields: - * `aggregationData` (*Float32Array*) - Array containing aggregation data per grid cell. Four elements per grid cell in the format `[value, 0, 0, count]`, where `value` is the aggregated weight value, up to 3 different weights. `count` is the number of objects aggregated to the grid cell. - * `maxMinData` (*Float32Array*) - Array with four values in format, `[maxValue, 0, 0, minValue]`, where `maxValue` is max of all aggregated cells. - * `maxData` (*Float32Array*) - Array with four values in format, `[maxValue, 0, 0, count]`, where `maxValue` is max of all aggregated cells and `count` is total number aggregated objects. - * `minData` (*Float32Array*) - Array with four values in format, `[minValue, 0, 0, count]`, where `minValue` is min of all aggregated cells and `count` is total number aggregated objects. - - NOTE: The goal is to match format of CPU aggregation results to that of GPU aggregation, so consumers of this data (Sublayers) don't have to change. - -## allocateResources() - -Called with following arguments to allocated resources required to hold aggregation results. - * `numRow` (number) - Number of rows in the grid. - * `numCol` (number) - Number of columns in the grid. diff --git a/docs/api-reference/aggregation-layers/grid-layer.md b/docs/api-reference/aggregation-layers/grid-layer.md index 3025d2c69e6..ba9aea839fb 100644 --- a/docs/api-reference/aggregation-layers/grid-layer.md +++ b/docs/api-reference/aggregation-layers/grid-layer.md @@ -4,9 +4,7 @@ import {GridLayerDemo} from '@site/src/doc-demos/aggregation-layers'; -The `GridLayer` aggregates data into a grid-based heatmap. The color and height of a cell are determined based on the objects it contains. - -This layer renders either a [GPUGridLayer](./gpu-grid-layer.md) or a [CPUGridLayer](./cpu-grid-layer.md), depending on its props and whether GPU aggregation is supported. For more details check the `GPU Aggregation` section below. +The `GridLayer` aggregates data into a grid-based heatmap. The color and height of a grid cell are determined based on the objects it contains. `GridLayer` is a [CompositeLayer](../core/composite-layer.md). @@ -25,6 +23,7 @@ const layer = new GridLayer({ id: 'GridLayer', data: 'https://raw.githubusercontent.com/visgl/deck.gl-data/master/website/sf-bike-parking.json', + gpuAggregation: true, extruded: true, getPosition: d => d.COORDINATES, getColorWeight: d => d.SPACES, @@ -50,8 +49,8 @@ new Deck({ ```ts -import {Deck, PickingInfo} from '@deck.gl/core'; -import {GridLayer} from '@deck.gl/aggregation-layers'; +import {Deck} from '@deck.gl/core'; +import {GridLayer, GridLayerPickingInfo} from '@deck.gl/aggregation-layers'; type BikeRack = { ADDRESS: string; @@ -63,6 +62,7 @@ const layer = new GridLayer({ id: 'GridLayer', data: 'https://raw.githubusercontent.com/visgl/deck.gl-data/master/website/sf-bike-parking.json', + gpuAggregation: true, extruded: true, getPosition: (d: BikeRack) => d.COORDINATES, getColorWeight: (d: BikeRack) => d.SPACES, @@ -79,7 +79,7 @@ new Deck({ zoom: 11 }, controller: true, - getTooltip: ({object}: PickingInfo) => object && `Count: ${object.elevationValue}`, + getTooltip: ({object}: GridLayerPickingInfo) => object && `Count: ${object.elevationValue}`, layers: [layer] }); ``` @@ -90,8 +90,7 @@ new Deck({ ```tsx import React from 'react'; import DeckGL from '@deck.gl/react'; -import {GridLayer} from '@deck.gl/aggregation-layers'; -import type {PickingInfo} from '@deck.gl/core'; +import {GridLayer, GridLayerPickingInfo} from '@deck.gl/aggregation-layers'; type BikeRack = { ADDRESS: string; @@ -104,6 +103,7 @@ function App() { id: 'GridLayer', data: 'https://raw.githubusercontent.com/visgl/deck.gl-data/master/website/sf-bike-parking.json', + gpuAggregation: true, extruded: true, getPosition: (d: BikeRack) => d.COORDINATES, getColorWeight: (d: BikeRack) => d.SPACES, @@ -120,7 +120,7 @@ function App() { zoom: 11 }} controller - getTooltip={({object}: PickingInfo) => object && `Count: ${object.elevationValue}`} + getTooltip={({object}: GridLayerPickingInfo) => object && `Count: ${object.elevationValue}`} layers={[layer]} />; } @@ -129,8 +129,6 @@ function App() { -**Note:** The `GridLayer` at the moment only works with `COORDINATE_SYSTEM.LNGLAT`. - ## Installation @@ -144,7 +142,7 @@ npm install @deck.gl/core @deck.gl/layers @deck.gl/aggregation-layers ```ts import {GridLayer} from '@deck.gl/aggregation-layers'; -import type {GridLayerProps} from '@deck.gl/aggregation-layers'; +import type {GridLayerProps, GridLayerPickingInfo} from '@deck.gl/aggregation-layers'; new GridLayer(...props: GridLayerProps[]); ``` @@ -168,149 +166,67 @@ new deck.GridLayer({}); Inherits from all [Base Layer](../core/layer.md) and [CompositeLayer](../core/composite-layer.md) properties. -### Render Options - -#### `cellSize` (number, optional) {#cellsize} - -* Default: `1000` - -Size of each cell in meters - -#### `colorDomain` (number[2], optional) {#colordomain} - -* Default: `[min(colorWeight), max(colorWeight)]` - -Color scale domain, default is set to the extent of aggregated weights in each cell. -You can control how the colors of cells are mapped to weights by passing in an arbitrary color domain. -This is useful when you want to render different data input with the same color mapping for comparison. - -#### `colorRange` (Color[], optional) {#colorrange} - -* Default: [colorbrewer](http://colorbrewer2.org/#type=sequential&scheme=YlOrRd&n=6) `6-class YlOrRd` - -Specified as an array of colors [color1, color2, ...]. Each color is an array of 3 or 4 values [R, G, B] or [R, G, B, A], representing intensities of Red, Green, Blue and Alpha channels. Each intensity is a value between 0 and 255. When Alpha not provided a value of 255 is used. - -`colorDomain` is divided into `colorRange.length` equal segments, each mapped to one color in `colorRange`. - -#### `coverage` (number, optional) ![transition-enabled](https://img.shields.io/badge/transition-enabled-green.svg?style=flat-square") {#coverage} - -* Default: `1` - -Cell size multiplier, clamped between 0 - 1. The displayed size of cell is calculated by `coverage * cellSize`. -Note: coverage does not affect how objects are binned. - -#### `elevationDomain` (number[2], optional) {#elevationdomain} - -* Default: `[0, max(elevationWeight)]` - -Elevation scale input domain, default is set to between 0 and the max of aggregated weights in each cell. -You can control how the elevations of cells are mapped to weights by passing in an arbitrary elevation domain. -This is useful when you want to render different data input with the same elevation scale for comparison. - -#### `elevationRange` (number[2], optional) {#elevationrange} - -* Default: `[0, 1000]` - -Elevation scale output range - -#### `elevationScale` (number, optional) ![transition-enabled](https://img.shields.io/badge/transition-enabled-green.svg?style=flat-square") {#elevationscale} - -* Default: `1` - -Cell elevation multiplier. -This is a handy property to scale all cells without updating the data. - -#### `extruded` (boolean, optional) {#extruded} - -* Default: `true` - -Whether to enable cell elevation.If set to false, all cell will be flat. - -#### `upperPercentile` (number, optional) ![transition-enabled](https://img.shields.io/badge/transition-enabled-green.svg?style=flat-square") {#upperpercentile} - -* Default: `100` - -Filter cells and re-calculate color by `upperPercentile`. Cells with value -larger than the upperPercentile will be hidden. - -#### `lowerPercentile` (number, optional) ![transition-enabled](https://img.shields.io/badge/transition-enabled-green.svg?style=flat-square") {#lowerpercentile} - -* Default: `0` - -Filter cells and re-calculate color by `lowerPercentile`. Cells with value -smaller than the lowerPercentile will be hidden. - -#### `elevationUpperPercentile` (number, optional) ![transition-enabled](https://img.shields.io/badge/transition-enabled-green.svg?style=flat-square") {#elevationupperpercentile} - -* Default: `100` - -Filter cells and re-calculate elevation by `elevationUpperPercentile`. Cells with elevation value -larger than the elevationUpperPercentile will be hidden. +### Aggregation Options -#### `elevationLowerPercentile` (number, optional) ![transition-enabled](https://img.shields.io/badge/transition-enabled-green.svg?style=flat-square") {#elevationlowerpercentile} - -* Default: `0` - -Filter cells and re-calculate elevation by `elevationLowerPercentile`. Cells with elevation value -smaller than the elevationLowerPercentile will be hidden. - -#### `colorScaleType` (string, optional) {#colorscaletype} - -* Default: 'quantize' - -Scaling function used to determine the color of the grid cell, default value is 'quantize'. Supported Values are 'quantize', 'linear', 'quantile' and 'ordinal'. - -#### `fp64` (boolean, optional) {#fp64} +#### `gpuAggregation` (boolean, optional) {#gpuaggregation} * Default: `false` -Whether the aggregation should be performed in high-precision 64-bit mode. Note that since deck.gl v6.1, the default 32-bit projection uses a hybrid mode that matches 64-bit precision with significantly better performance. +When set to `true`, aggregation is performed on the GPU. -#### `gpuAggregation` (boolean, optional) {#gpuaggregation} +In the right context, enabling GPU aggregation can significantly speed up your application. However, depending on the nature of input data and required application features, there are pros and cons in leveraging this functionality. See [CPU vs GPU aggregation](./overview.md#cpu-vs-gpu-aggregation) for an in-depth discussion. -* Default: `false` +CPU aggregation is used as fallback in the following cases: -When set to true, aggregation is performed on GPU, provided other conditions are met, for more details check the `GPU Aggregation` section below. GPU aggregation can be a lot faster than CPU depending upon the number of objects and number of cells. +- The current browser does not support GPU aggregation +- `gridAggregator` is defined +- `getColorValue` is defined +- `getElevationValue` is defined -**Note:** GPU Aggregation is faster only when using large data sets. For smaller data sets GPU Aggregation could be potentially slower than CPU Aggregation. -#### `material` (Material, optional) {#material} +#### `cellSize` (number, optional) {#cellsize} -* Default: `true` +* Default: `1000` -This is an object that contains material props for [lighting effect](../core/lighting-effect.md) applied on extruded polygons. -Check [the lighting guide](../../developer-guide/using-effects.md#material-settings) for configurable settings. +Size of each cell in meters. #### `colorAggregation` (string, optional) {#coloraggregation} * Default: `'SUM'` -Defines the operation used to aggregate all data object weights to calculate a bin's color value. Valid values are `'SUM'`, `'MEAN'`, `'MIN'` and `'MAX'`. `'SUM'` is used when an invalid value is provided. +Defines the operation used to aggregate all data object weights to calculate a cell's color value. Valid values are: + +- `'SUM'`: The sum of weights across all points that fall into a cell. +- `'MEAN'`: The mean weight across all points that fall into a cell. +- `'MIN'`: The minimum weight across all points that fall into a cell. +- `'MAX'`: The maximum weight across all points that fall into a cell. +- `'COUNT'`: The number of points that fall into a cell. + +`getColorWeight` and `colorAggregation` together determine the color value of each cell. If the `getColorValue` prop is supplied, they will be ignored. -`getColorWeight` and `colorAggregation` together determine the elevation value of each cell. If the `getColorValue` prop is supplied, they will be ignored. Note that supplying `getColorValue` disables GPU aggregation. ##### Example: Color by the count of data elements ```ts title="Option A: use getColorValue (CPU only)" -const layer = new GridLayer({ - // ... - getColorValue: (points: BikeRack[]) => points.length, +const layer = new HexagonLayer({ + //... + getColorValue: (points: BikeRack[]) => points.length }); ``` -```ts title="Option B: use getColorWeight and colorAggregation (GPU or CPU)" -const layer = new GridLayer({ +```ts title="Option B: use getColorWeight and colorAggregation (CPU or GPU)" +const layer = new HexagonLayer({ // ... - getColorWeight: (d: BikeRack) => 1, - colorAggregation: 'SUM' + getColorWeight: 1, + colorAggregation: 'COUNT' }); ``` ##### Example: Color by the mean value of 'SPACES' field ```ts title="Option A: use getColorValue (CPU only)" -const layer = new GridLayer({ +const layer = new HexagonLayer({ // ... getColorValue: (points: BikeRack[]) => { // Calculate mean value @@ -319,46 +235,52 @@ const layer = new GridLayer({ }); ``` -```ts title="Option B: use getColorWeight and colorAggregation (GPU or CPU)" -const layer = new GridLayer({ +```ts title="Option B: use getColorWeight and colorAggregation (CPU or GPU)" +const layer = new HexagonLayer({ // ... getColorWeight: (point: BikeRack) => point.SPACES, - colorAggregation: 'SUM' + colorAggregation: 'MEAN' }); ``` -If your use case requires aggregating using an operation that is not one of 'SUM', 'MEAN', 'MAX' and 'MIN', `getColorValue` should be used to define such custom aggregation function. In those cases GPU aggregation is not supported. +If your use case requires aggregating using an operation other than the built-in `colorAggregation` values, `getColorValue` should be used to define such custom aggregation function. #### `elevationAggregation` (string, optional) {#elevationaggregation} * Default: `'SUM'` -Defines the operation used to aggregate all data object weights to calculate a bin's elevation value. Valid values are `'SUM'`, `'MEAN'`, `'MIN'` and `'MAX'`. `'SUM'` is used when an invalid value is provided. +Defines the operation used to aggregate all data object weights to calculate a cell's elevation value. Valid values are: -`getElevationWeight` and `elevationAggregation` together determine the elevation value of each cell. If the `getElevationValue` prop is supplied, they will be ignored. Note that supplying `getElevationValue` disables GPU aggregation. +- `'SUM'`: The sum of weights across all points that fall into a cell. +- `'MEAN'`: The mean weight across all points that fall into a cell. +- `'MIN'`: The minimum weight across all points that fall into a cell. +- `'MAX'`: The maximum weight across all points that fall into a cell. +- `'COUNT'`: The number of points that fall into a cell. + +`getElevationWeight` and `elevationAggregation` together determine the elevation value of each cell. If the `getElevationValue` prop is supplied, they will be ignored. ##### Example: Elevation by the count of data elements ```ts title="Option A: use getElevationValue (CPU only)" -const layer = new GridLayer({ +const layer = new HexagonLayer({ // ... getElevationValue: (points: BikeRack[]) => points.length }); ``` -```ts title="Option B: use getElevationWeight and elevationAggregation (GPU or CPU)" -const layer = new GridLayer({ +```ts title="Option B: use getElevationWeight and elevationAggregation (CPU or GPU)" +const layer = new HexagonLayer({ // ... - getElevationWeight: (point: BikeRack) => 1, - elevationAggregation: 'SUM' + getElevationWeight: 1, + elevationAggregation: 'COUNT' }); ``` ##### Example: Elevation by the maximum value of 'SPACES' field ```ts title="Option A: use getElevationValue (CPU only)" -const layer = new GridLayer({ +const layer = new HexagonLayer({ // ... getElevationValue: (points: BikeRack[]) => { // Calculate max value @@ -367,28 +289,146 @@ const layer = new GridLayer({ }); ``` -```ts title="Option B: use getElevationWeight and elevationAggregation (GPU or CPU)" -const layer = new GridLayer({ +```ts title="Option B: use getElevationWeight and elevationAggregation (CPU or GPU)" +const layer = new HexagonLayer({ // ... getElevationWeight: (point: BikeRack) => point.SPACES, elevationAggregation: 'MAX' }); ``` -If your use case requires aggregating using an operation that is not one of 'SUM', 'MEAN', 'MAX' and 'MIN', `getElevationValue` should be used to define such custom aggregation function. In those cases GPU aggregation is not supported. +If your use case requires aggregating using an operation other than the built-in `elevationAggregation` values, `getElevationValue` should be used to define such custom aggregation function. -#### `getElevationValue` (Function, optional) ![transition-enabled](https://img.shields.io/badge/transition-enabled-green.svg?style=flat-square") {#getelevationvalue} + +#### `gridAggregator` (Function, optional) {#gridaggregator} * Default: `null` -After data objects are aggregated into cells, this accessor is called on each cell to get the value that its elevation is based on. If supplied, this will override the effect of `getElevationWeight` and `elevationAggregation` props. Note that supplying this prop disables GPU aggregation. +A custom function to override how points are grouped into grid cells. +If this prop is supplied, GPU aggregation will be disabled regardless of the `gpuAggregation` setting. -Arguments: +This function will be called with the following arguments: +- `position` (number[]) - the position of a data point +- `cellSize` (number) - value of the `cellSize` prop -- `objects` (DataT[]) - a list of objects whose positions fall inside this cell. -- `objectInfo` (object) - contains the following fields: - + `indices` (number[]) - the indices of `objects` in the original data - + `data` - the value of the `data` prop. +It is expected to return an array of 2 integers that represent a cell ID. Points that resolve to the same cell ID are grouped together. + +### Render Options + +#### `coverage` (number, optional) ![transition-enabled](https://img.shields.io/badge/transition-enabled-green.svg?style=flat-square") {#coverage} + +* Default: `1` + +Cell size multiplier, clamped between 0 - 1. The displayed size of cell is calculated by `coverage * cellSize`. +Note: coverage does not affect how objects are binned. + +#### `extruded` (boolean, optional) {#extruded} + +* Default: `true` + +Whether to enable cell elevation.If set to false, all cell will be flat. + +#### `colorScaleType` (string, optional) {#colorscaletype} + +* Default: `'quantize'` + +The color scale converts from a continuous numeric stretch (`colorDomain`) into a list of colors (`colorRange`). Cells with value of `colorDomain[0]` will be rendered with the color of `colorRange[0]`, and cells with value of `colorDomain[1]` will be rendered with the color of `colorRange[colorRange.length - 1]`. + +`colorScaleType` determines how a numeric value in domain is mapped to a color in range. Supported values are: +- `'linear'`: `colorRange` is linearly interpolated based on where the value lies in `colorDomain`. +- `'quantize'`: `colorDomain` is divided into `colorRange.length` equal segments, each mapped to one discrete color in `colorRange`. +- `'quantile'`: input values are divided into `colorRange.length` equal-size groups, each mapped to one discrete color in `colorRange`. +- `'ordinal'`: each unique value is mapped to one discrete color in `colorRange`. + +Note that using "quantile" or "ordinal" scale with GPU aggregation will incur a one-time cost of reading aggregated values from the GPU to the CPU. This overhead may be undesirable if the source data updates frequently. + +#### `colorDomain` (number[2], optional) {#colordomain} + +* Default: `null` (auto) + +If not provided, the layer will set `colorDomain` to the +actual min, max values from all cells at run time. + +By providing a `colorDomain`, you can control how a value is represented by color. This is useful when you want to render different data input with the same color mapping for comparison. + +#### `colorRange` (Color[], optional) {#colorrange} + +* Default: [colorbrewer](http://colorbrewer2.org/#type=sequential&scheme=YlOrRd&n=6) `6-class YlOrRd` + +Specified as an array of colors [color1, color2, ...]. Each color is an array of 3 or 4 values [R, G, B] or [R, G, B, A], representing intensities of Red, Green, Blue and Alpha channels. Each intensity is a value between 0 and 255. When Alpha is omitted a value of 255 is used. + + +#### `elevationScaleType` (string, optional) {#elevationscaletype} + +* Default: `'linear'` + +The elevation scale converts from a continuous numeric stretch (`elevationDomain`) into another continuous numeric stretch (`elevationRange`). Cells with value of `elevationDomain[0]` will be rendered with the elevation of `elevationRange[0]`, and cells with value of `elevationDomain[1]` will be rendered with the elevation of `elevationRange[1]`. + +`elevationScaleType` determines how a numeric value in domain is mapped to a elevation in range. Supported values are: +- `'linear'`: `elevationRange` is linearly interpolated based on where the value lies in `elevationDomain`. +- `'quantile'`: input values are divided into percentile groups, each mapped to one discrete elevation in `elevationRange`. + +#### `elevationDomain` (number[2], optional) {#elevationdomain} + +* Default: `null` (auto) + +If not provided, the layer will set `elevationDomain` to the +actual min, max values from all cells at run time. + +By providing a `elevationDomain`, you can control how a value is represented by elevation. This is useful when you want to render different data input with the same elevation mapping for comparison. + +#### `elevationRange` (number[2], optional) ![transition-enabled](https://img.shields.io/badge/transition-enabled-green.svg?style=flat-square") {#elevationrange} + +* Default: `[0, 1000]` + +Elevation scale output range + +#### `elevationScale` (number, optional) ![transition-enabled](https://img.shields.io/badge/transition-enabled-green.svg?style=flat-square") {#elevationscale} + +* Default: `1` + +Cell elevation multiplier. +This is a handy property to scale all cells without updating the data. + + +#### `upperPercentile` (number, optional) ![transition-enabled](https://img.shields.io/badge/transition-enabled-green.svg?style=flat-square") {#upperpercentile} + +* Default: `100` + +Filter cells and re-calculate color by `upperPercentile`. Cells with value larger than the upperPercentile will be hidden. + +Note that using this prop with GPU aggregation will incur a one-time cost of reading aggregated values from the GPU to the CPU. This overhead may be undesirable if the source data updates frequently. + +#### `lowerPercentile` (number, optional) ![transition-enabled](https://img.shields.io/badge/transition-enabled-green.svg?style=flat-square") {#lowerpercentile} + +* Default: `0` + +Filter cells and re-calculate color by `lowerPercentile`. Cells with value smaller than the lowerPercentile will be hidden. + +Note that using this prop with GPU aggregation will incur a one-time cost of reading aggregated values from the GPU to the CPU. This overhead may be undesirable if the source data updates frequently. + +#### `elevationUpperPercentile` (number, optional) ![transition-enabled](https://img.shields.io/badge/transition-enabled-green.svg?style=flat-square") {#elevationupperpercentile} + +* Default: `100` + +Filter cells and re-calculate elevation by `elevationUpperPercentile`. Cells with elevation value larger than the elevationUpperPercentile will be hidden. + +Note that using this prop with GPU aggregation will incur a one-time cost of reading aggregated values from the GPU to the CPU. This overhead may be undesirable if the source data updates frequently. + +#### `elevationLowerPercentile` (number, optional) ![transition-enabled](https://img.shields.io/badge/transition-enabled-green.svg?style=flat-square") {#elevationlowerpercentile} + +* Default: `0` + +Filter cells and re-calculate elevation by `elevationLowerPercentile`. Cells with elevation value smaller than the elevationLowerPercentile will be hidden. + +Note that using this prop with GPU aggregation will incur a one-time cost of reading aggregated values from the GPU to the CPU. This overhead may be undesirable if the source data updates frequently. + +#### `material` (Material, optional) {#material} + +* Default: `true` + +This is an object that contains material props for [lighting effect](../core/lighting-effect.md) applied on extruded polygons. +Check [the lighting guide](../../developer-guide/using-effects.md#material-settings) for configurable settings. ### Data Accessors @@ -434,6 +474,20 @@ The weight of a data object used to calculate the elevation value for a cell. * If a function is provided, it is called on each object to retrieve its weight. +#### `getElevationValue` (Function, optional) ![transition-enabled](https://img.shields.io/badge/transition-enabled-green.svg?style=flat-square") {#getelevationvalue} + +* Default: `null` + +After data objects are aggregated into cells, this accessor is called on each cell to get the value that its elevation is based on. If supplied, this will override the effect of `getElevationWeight` and `elevationAggregation` props. + +Arguments: + +- `objects` (DataT[]) - a list of objects whose positions fall inside this cell. +- `objectInfo` (object) - contains the following fields: + + `indices` (number[]) - the indices of `objects` in the original data + + `data` - the value of the `data` prop. + + ### Callbacks #### `onSetColorDomain` (Function, optional) {#onsetcolordomain} @@ -449,52 +503,24 @@ This callback will be called when cell color domain has been calculated. This callback will be called when cell elevation domain has been calculated. -## GPU Aggregation - -### Performance Metrics - -The following table compares the performance between CPU and GPU aggregations using random data: +## Picking -| #objects | CPU #iterations/sec | GPU #iterations/sec | Notes | -| ---- | --- | --- | --- | -| 25K | 535 | 359 | GPU is 33% slower | -| 100K | 119 | 437 | GPU is 267% faster | -| 1M | 12.7 | 158 | GPU is 1144% faster | +The [PickingInfo.object](../../developer-guide/interactivity.md#the-pickinginfo-object) field returned by hover/click events of this layer represents an aggregated cell. The object contains the following fields: -*Numbers are collected on a 2016 15-inch Macbook Pro (CPU: 2.8 GHz Intel Core i7 and GPU: AMD Radeon R9 M370X 2 GB)* - -### Fallback Cases - -This layer performs aggregation on GPU when the `gpuAggregation` prop is set to `true`, but will fallback to CPU in the following cases: - -#### Percentile Props - -When following percentile props are set, it requires sorting of aggregated values, which cannot be supported when aggregating on GPU. - -* `lowerPercentile`, `upperPercentile`, `elevationLowerPercentile` and `elevationUpperPercentile`. - -#### Color and Elevation Props - -When `colorScaleType` props is set to a 'quantile' or 'ordinal', aggregation will fallback to CPU. For GPU Aggregation, use 'quantize', 'linear'. - -#### Color Scale Type Props - -When following percentile props are set, it requires sorting of aggregated values, which cannot be supported when aggregating on GPU. - -* `lowerPercentile`, `upperPercentile`, `elevationLowerPercentile` and `elevationUpperPercentile`. - -### Domain setting callbacks - -When using GPU Aggregation, `onSetColorDomain` and `onSetElevationDomain` are not fired. +- `col` (number) - Column index of the picked cell. +- `row` (number) - Row index of the picked cell. +- `colorValue` (number) - Aggregated color value, as determined by `getColorWeight` and `colorAggregation` +- `elevationValue` (number) - Aggregated elevation value, as determined by `getElevationWeight` and `elevationAggregation` +- `count` (number) - Number of data points in the picked cell +- `pointIndices` (number[]) - Indices of the data objects in the picked cell. Only available if using CPU aggregation. +- `points` (object[]) - The data objects in the picked cell. Only available if using CPU aggregation and layer data is an array. ## Sub Layers The GridLayer renders the following sublayers: -* `CPU` - a [CPUGridLayer](./cpu-grid-layer.md) when using CPU aggregation. - -* `GPU` - a [GPUGridLayer](./gpu-grid-layer.md) when using GPU aggregation. +* `cells` - a custom layer that extends the [ColumnLayer](../layers/column-layer.md). ## Source diff --git a/docs/api-reference/aggregation-layers/hexagon-layer.md b/docs/api-reference/aggregation-layers/hexagon-layer.md index 5107ba850f9..bb51e5988a0 100644 --- a/docs/api-reference/aggregation-layers/hexagon-layer.md +++ b/docs/api-reference/aggregation-layers/hexagon-layer.md @@ -6,7 +6,7 @@ import {HexagonLayerDemo} from '@site/src/doc-demos/aggregation-layers'; The `HexagonLayer` aggregates data into a hexagon-based heatmap. The color and height of a hexagon are determined based on the objects it contains. -HexagonLayer is a [CompositeLayer](../core/composite-layer.md) and at the moment only works with `COORDINATE_SYSTEM.LNGLAT`. +HexagonLayer is a [CompositeLayer](../core/composite-layer.md). import Tabs from '@theme/Tabs'; @@ -23,6 +23,7 @@ const layer = new HexagonLayer({ id: 'HexagonLayer', data: 'https://raw.githubusercontent.com/visgl/deck.gl-data/master/website/sf-bike-parking.json', + gpuAggregation: true, extruded: true, getPosition: d => d.COORDINATES, getColorWeight: d => d.SPACES, @@ -48,8 +49,8 @@ new Deck({ ```ts -import {Deck, PickingInfo} from '@deck.gl/core'; -import {HexagonLayer} from '@deck.gl/aggregation-layers'; +import {Deck} from '@deck.gl/core'; +import {HexagonLayer, HexagonLayerPickingInfo} from '@deck.gl/aggregation-layers'; type BikeRack = { ADDRESS: string; @@ -61,6 +62,7 @@ const layer = new HexagonLayer({ id: 'HexagonLayer', data: 'https://raw.githubusercontent.com/visgl/deck.gl-data/master/website/sf-bike-parking.json', + gpuAggregation: true, extruded: true, getPosition: (d: BikeRack) => d.COORDINATES, getColorWeight: (d: BikeRack) => d.SPACES, @@ -77,7 +79,7 @@ new Deck({ zoom: 11 }, controller: true, - getTooltip: ({object}: PickingInfo) => object && `Count: ${object.elevationValue}`, + getTooltip: ({object}: HexagonLayerPickingInfo) => object && `Count: ${object.elevationValue}`, layers: [layer] }); ``` @@ -88,8 +90,7 @@ new Deck({ ```tsx import React from 'react'; import DeckGL from '@deck.gl/react'; -import {HexagonLayer} from '@deck.gl/aggregation-layers'; -import type {PickingInfo} from '@deck.gl/core'; +import {HexagonLayer, HexagonLayerPickingInfo} from '@deck.gl/aggregation-layers'; type BikeRack = { ADDRESS: string; @@ -102,6 +103,7 @@ function App() { id: 'HexagonLayer', data: 'https://raw.githubusercontent.com/visgl/deck.gl-data/master/website/sf-bike-parking.json', + gpuAggregation: true, extruded: true, getPosition: (d: BikeRack) => d.COORDINATES, getColorWeight: (d: BikeRack) => d.SPACES, @@ -118,7 +120,7 @@ function App() { zoom: 11 }} controller - getTooltip={({object}: PickingInfo) => object && `Count: ${object.elevationValue}`} + getTooltip={({object}: HexagonLayerPickingInfo) => object && `Count: ${object.elevationValue}`} layers={[layer]} />; } @@ -140,7 +142,7 @@ npm install @deck.gl/core @deck.gl/layers @deck.gl/aggregation-layers ```ts import {HexagonLayer} from '@deck.gl/aggregation-layers'; -import type {HexagonLayerProps} from '@deck.gl/aggregation-layers'; +import type {HexagonLayerProps, HexagonLayerPickingInfo} from '@deck.gl/aggregation-layers'; new HexagonLayer(...props: HexagonLayerProps[]); ``` @@ -164,155 +166,65 @@ new deck.HexagonLayer({}); Inherits from all [Base Layer](../core/layer.md) and [CompositeLayer](../core/composite-layer.md) properties. -### Render Options - -#### `radius` (number, optional) ![transition-enabled](https://img.shields.io/badge/transition-enabled-green.svg?style=flat-square") {#radius} - -* Default: `1000` - -Radius of hexagon bin in meters. The hexagons are pointy-topped (rather than flat-topped). - -#### `hexagonAggregator` (Function, optional) {#hexagonaggregator} - -* Default: `d3-hexbin` - -`hexagonAggregator` is a function to aggregate data into hexagonal bins. -The `hexagonAggregator` takes props of the layer and current viewport as arguments. -The output should be `{hexagons: [], hexagonVertices: []}`. `hexagons` is -an array of `{centroid: [], points: []}`, where `centroid` is the -center of the hexagon, and `points` is an array of points that contained by it. `hexagonVertices` -(optional) is an array of points define the primitive hexagon geometry. - -By default, the `HexagonLayer` uses -[d3-hexbin](https://github.com/d3/d3-hexbin) as `hexagonAggregator`, -see `modules/aggregation-layers/src/hexagon-layer/hexagon-aggregator.ts` - -#### `colorDomain` (number[2], optional) {#colordomain} - -* Default: `[min(colorWeight), max(colorWeight)]` - -Color scale input domain. The color scale maps continues numeric domain into -discrete color range. If not provided, the layer will set `colorDomain` to the -extent of aggregated weights in each hexagon. -You can control how the colors of hexagons are mapped to weights by passing in an arbitrary color domain. -This is useful when you want to render different data input with the same color mapping for comparison. - -#### `colorRange` (Color[], optional) {#colorrange} - -* Default: [colorbrewer](http://colorbrewer2.org/#type=sequential&scheme=YlOrRd&n=6) `6-class YlOrRd` - -Specified as an array of colors [color1, color2, ...]. Each color is an array of 3 or 4 values [R, G, B] or [R, G, B, A], representing intensities of Red, Green, Blue and Alpha channels. Each intensity is a value between 0 and 255. When Alpha not provided a value of 255 is used. - -`colorDomain` is divided into `colorRange.length` equal segments, each mapped to one color in `colorRange`. - -#### `coverage` (number, optional) ![transition-enabled](https://img.shields.io/badge/transition-enabled-green.svg?style=flat-square") {#coverage} - -* Default: `1` - -Hexagon radius multiplier, clamped between 0 - 1. The displayed radius of hexagon is calculated by `coverage * radius`. -Note: coverage does not affect how objects are binned. - -#### `elevationDomain` (number[2], optional) {#elevationdomain} - -* Default: `[0, max(elevationWeight)]` - -Elevation scale input domain. The elevation scale is a linear scale that -maps number of counts to elevation. By default it is set to between -0 and the max of aggregated weights in each hexagon. -You can control how the elevations of hexagons are mapped to weights by passing in an arbitrary elevation domain. -This property is useful when you want to render different data input -with the same elevation scale for comparison. - -#### `elevationRange` (number[2], optional) {#elevationrange} - -* Default: `[0, 1000]` - -Elevation scale output range - -#### `elevationScale` (number, optional) ![transition-enabled](https://img.shields.io/badge/transition-enabled-green.svg?style=flat-square") {#elevationscale} - -* Default: `1` - -Hexagon elevation multiplier. The actual elevation is calculated by - `elevationScale * getElevationValue(d)`. `elevationScale` is a handy property to scale -all hexagons without updating the data. +### Aggregation Options -#### `extruded` (boolean, optional) {#extruded} +#### `gpuAggregation` (boolean, optional) {#gpuaggregation} * Default: `false` -Whether to enable cell elevation. If set to false, all cells will be flat. - -#### `upperPercentile` (number, optional) ![transition-enabled](https://img.shields.io/badge/transition-enabled-green.svg?style=flat-square") {#upperpercentile} - -* Default: `100` - -Filter bins and re-calculate color by `upperPercentile`. Hexagons with color value -larger than the upperPercentile will be hidden. - -#### `lowerPercentile` (number, optional) ![transition-enabled](https://img.shields.io/badge/transition-enabled-green.svg?style=flat-square") {#lowerpercentile} - -* Default: `0` - -Filter bins and re-calculate color by `lowerPercentile`. Hexagons with color value -smaller than the lowerPercentile will be hidden. +When set to `true`, aggregation is performed on the GPU. -#### `elevationUpperPercentile` (number, optional) ![transition-enabled](https://img.shields.io/badge/transition-enabled-green.svg?style=flat-square") {#elevationupperpercentile} +In the right context, enabling GPU aggregation can significantly speed up your application. However, depending on the nature of input data and required application features, there are pros and cons in leveraging this functionality. See [CPU vs GPU aggregation](./overview.md#cpu-vs-gpu-aggregation) for an in-depth discussion. -* Default: `100` +CPU aggregation is used as fallback in the following cases: -Filter bins and re-calculate elevation by `elevationUpperPercentile`. Hexagons with elevation value -larger than the elevationUpperPercentile will be hidden. +- The current browser does not support GPU aggregation +- `gridAggregator` is defined +- `getColorValue` is defined +- `getElevationValue` is defined -#### `elevationLowerPercentile` (number, optional) ![transition-enabled](https://img.shields.io/badge/transition-enabled-green.svg?style=flat-square") {#elevationlowerpercentile} - -* Default: `0` - -Filter bins and re-calculate elevation by `elevationLowerPercentile`. Hexagons with elevation value -smaller than the elevationLowerPercentile will be hidden. - -#### `colorScaleType` (string, optional) {#colorscaletype} -* Default: 'quantize' +#### `radius` (number, optional) {#radius} -Scaling function used to determine the color of the grid cell, default value is 'quantize'. Supported Values are 'quantize', 'quantile' and 'ordinal'. - -#### `material` (Material, optional) {#material} - -* Default: `true` - -This is an object that contains material props for [lighting effect](../core/lighting-effect.md) applied on extruded polygons. -Check [the lighting guide](../../developer-guide/using-effects.md#material-settings) for configurable settings. +* Default: `1000` +Radius of hexagon in meters. The hexagons are pointy-topped (rather than flat-topped). #### `colorAggregation` (string, optional) {#coloraggregation} * Default: `'SUM'` -Defines the operation used to aggregate all data object weights to calculate a bin's color value. Valid values are `'SUM'`, `'MEAN'`, `'MIN'` and `'MAX'`. `'SUM'` is used when an invalid value is provided. +Defines the operation used to aggregate all data object weights to calculate a hexagon's color value. Valid values are: + +- `'SUM'`: The sum of weights across all points that fall into a hexagon. +- `'MEAN'`: The mean weight across all points that fall into a hexagon. +- `'MIN'`: The minimum weight across all points that fall into a hexagon. +- `'MAX'`: The maximum weight across all points that fall into a hexagon. +- `'COUNT'`: The number of points that fall into a hexagon. + +`getColorWeight` and `colorAggregation` together determine the color value of each hexagon. If the `getColorValue` prop is supplied, they will be ignored. -`getColorWeight` and `colorAggregation` together determine the elevation value of each bin. If the `getColorValue` prop is supplied, they will be ignored. ##### Example: Color by the count of data elements -```ts title="Option A: use getColorValue" +```ts title="Option A: use getColorValue (CPU only)" const layer = new HexagonLayer({ //... getColorValue: (points: BikeRack[]) => points.length }); ``` -```ts title="Option B: use getColorWeight and colorAggregation" +```ts title="Option B: use getColorWeight and colorAggregation (CPU or GPU)" const layer = new HexagonLayer({ // ... - getColorWeight: (d: BikeRack) => 1, - colorAggregation: 'SUM' + getColorWeight: 1, + colorAggregation: 'COUNT' }); ``` ##### Example: Color by the mean value of 'SPACES' field -```ts title="Option A: use getColorValue" +```ts title="Option A: use getColorValue (CPU only)" const layer = new HexagonLayer({ // ... getColorValue: (points: BikeRack[]) => { @@ -322,45 +234,51 @@ const layer = new HexagonLayer({ }); ``` -```ts title="Option B: use getColorWeight and colorAggregation" +```ts title="Option B: use getColorWeight and colorAggregation (CPU or GPU)" const layer = new HexagonLayer({ // ... getColorWeight: (point: BikeRack) => point.SPACES, - colorAggregation: 'SUM' + colorAggregation: 'MEAN' }); ``` -If your use case requires aggregating using an operation that is not one of 'SUM', 'MEAN', 'MAX' and 'MIN', `getColorValue` should be used to define such custom aggregation function. +If your use case requires aggregating using an operation other than the built-in `colorAggregation` values, `getColorValue` should be used to define such custom aggregation function. #### `elevationAggregation` (string, optional) {#elevationaggregation} * Default: `'SUM'` -Defines the operation used to aggregate all data object weights to calculate a bin's elevation value. Valid values are `'SUM'`, `'MEAN'`, `'MIN'` and `'MAX'`. `'SUM'` is used when an invalid value is provided. +Defines the operation used to aggregate all data object weights to calculate a hexagon's elevation value. Valid values are: + +- `'SUM'`: The sum of weights across all points that fall into a hexagon. +- `'MEAN'`: The mean weight across all points that fall into a hexagon. +- `'MIN'`: The minimum weight across all points that fall into a hexagon. +- `'MAX'`: The maximum weight across all points that fall into a hexagon. +- `'COUNT'`: The number of points that fall into a hexagon. -`getElevationWeight` and `elevationAggregation` together determine the elevation value of each bin. If the `getElevationValue` prop is supplied, they will be ignored. +`getElevationWeight` and `elevationAggregation` together determine the elevation value of each hexagon. If the `getElevationValue` prop is supplied, they will be ignored. ##### Example: Elevation by the count of data elements -```ts title="Option A: use getElevationValue" +```ts title="Option A: use getElevationValue (CPU only)" const layer = new HexagonLayer({ // ... getElevationValue: (points: BikeRack[]) => points.length }); ``` -```ts title="Option B: use getElevationWeight and elevationAggregation" +```ts title="Option B: use getElevationWeight and elevationAggregation (CPU or GPU)" const layer = new HexagonLayer({ // ... - getElevationWeight: (point: BikeRack) => 1, - elevationAggregation: 'SUM' + getElevationWeight: 1, + elevationAggregation: 'COUNT' }); ``` ##### Example: Elevation by the maximum value of 'SPACES' field -```ts title="Option A: use getElevationValue" +```ts title="Option A: use getElevationValue (CPU only)" const layer = new HexagonLayer({ // ... getElevationValue: (points: BikeRack[]) => { @@ -370,7 +288,7 @@ const layer = new HexagonLayer({ }); ``` -```ts title="Option B: use getElevationWeight and elevationAggregation" +```ts title="Option B: use getElevationWeight and elevationAggregation (CPU or GPU)" const layer = new HexagonLayer({ // ... getElevationWeight: (point: BikeRack) => point.SPACES, @@ -378,7 +296,142 @@ const layer = new HexagonLayer({ }); ``` -If your use case requires aggregating using an operation that is not one of 'SUM', 'MEAN', 'MAX' and 'MIN', `getElevationValue` should be used to define such custom aggregation function. +If your use case requires aggregating using an operation other than the built-in `elevationAggregation` values, `getElevationValue` should be used to define such custom aggregation function. + + +#### `hexagonAggregator` (Function, optional) {#hexagonaggregator} + +* Default: `null` + +A custom function to override how points are grouped into hexagonal bins. +If this prop is supplied, GPU aggregation will be disabled regardless of the `gpuAggregation` setting. + +This function will be called with the following arguments: +- `position` (number[]) - the position of a data point +- `radius` (number) - value of the `radius` prop + +It is expected to return an array of 2 integers that represent a hexagon ID. Points that resolve to the same hexagon ID are grouped together. + +By default, the `HexagonLayer` uses +[d3-hexbin](https://github.com/d3/d3-hexbin) as `hexagonAggregator`, +see `modules/aggregation-layers/src/hexagon-layer/hexbin.ts` + +### Render Options + +#### `coverage` (number, optional) ![transition-enabled](https://img.shields.io/badge/transition-enabled-green.svg?style=flat-square") {#coverage} + +* Default: `1` + +Hexagon radius multiplier, clamped between 0 - 1. The displayed radius of hexagon is calculated by `coverage * radius`. +Note: coverage does not affect how objects are binned. + +#### `extruded` (boolean, optional) {#extruded} + +* Default: `false` + +Whether to render the hexagons as 3D columns. If set to `false`, all hexagons will be flat. + +#### `colorScaleType` (string, optional) {#colorscaletype} + +* Default: `'quantize'` + +The color scale converts from a continuous numeric stretch (`colorDomain`) into a list of colors (`colorRange`). Hexagons with value of `colorDomain[0]` will be rendered with the color of `colorRange[0]`, and hexagons with value of `colorDomain[1]` will be rendered with the color of `colorRange[colorRange.length - 1]`. + +`colorScaleType` determines how a numeric value in domain is mapped to a color in range. Supported values are: +- `'linear'`: `colorRange` is linearly interpolated based on where the value lies in `colorDomain`. +- `'quantize'`: `colorDomain` is divided into `colorRange.length` equal segments, each mapped to one discrete color in `colorRange`. +- `'quantile'`: input values are divided into `colorRange.length` equal-size groups, each mapped to one discrete color in `colorRange`. +- `'ordinal'`: each unique value is mapped to one discrete color in `colorRange`. + +Note that using "quantile" or "ordinal" scale with GPU aggregation will incur a one-time cost of reading aggregated values from the GPU to the CPU. This overhead may be undesirable if the source data updates frequently. + +#### `colorDomain` (number[2], optional) {#colordomain} + +* Default: `null` (auto) + +If not provided, the layer will set `colorDomain` to the +actual min, max values from all hexagons at run time. + +By providing a `colorDomain`, you can control how a value is represented by color. This is useful when you want to render different data input with the same color mapping for comparison. + +#### `colorRange` (Color[], optional) {#colorrange} + +* Default: [colorbrewer](http://colorbrewer2.org/#type=sequential&scheme=YlOrRd&n=6) `6-class YlOrRd` + +Specified as an array of colors [color1, color2, ...]. Each color is an array of 3 or 4 values [R, G, B] or [R, G, B, A], representing intensities of Red, Green, Blue and Alpha channels. Each intensity is a value between 0 and 255. When Alpha is omitted a value of 255 is used. + + +#### `elevationScaleType` (string, optional) {#elevationscaletype} + +* Default: `'linear'` + +The elevation scale converts from a continuous numeric stretch (`elevationDomain`) into another continuous numeric stretch (`elevationRange`). Hexagons with value of `elevationDomain[0]` will be rendered with the elevation of `elevationRange[0]`, and hexagons with value of `elevationDomain[1]` will be rendered with the elevation of `elevationRange[1]`. + +`elevationScaleType` determines how a numeric value in domain is mapped to a elevation in range. Supported values are: +- `'linear'`: `elevationRange` is linearly interpolated based on where the value lies in `elevationDomain`. +- `'quantile'`: input values are divided into percentile groups, each mapped to one discrete elevation in `elevationRange`. + +#### `elevationDomain` (number[2], optional) {#elevationdomain} + +* Default: `null` (auto) + +If not provided, the layer will set `elevationDomain` to the +actual min, max values from all hexagons at run time. + +By providing a `elevationDomain`, you can control how a value is represented by elevation. This is useful when you want to render different data input with the same elevation mapping for comparison. + +#### `elevationRange` (number[2], optional) ![transition-enabled](https://img.shields.io/badge/transition-enabled-green.svg?style=flat-square") {#elevationrange} + +* Default: `[0, 1000]` + +Elevation scale output range + +#### `elevationScale` (number, optional) ![transition-enabled](https://img.shields.io/badge/transition-enabled-green.svg?style=flat-square") {#elevationscale} + +* Default: `1` + +Hexagon elevation multiplier. +This is a handy property to scale all hexagons without updating the data. + + +#### `upperPercentile` (number, optional) ![transition-enabled](https://img.shields.io/badge/transition-enabled-green.svg?style=flat-square") {#upperpercentile} + +* Default: `100` + +Filter hexagons and re-calculate color by `upperPercentile`. Hexagons with value larger than the upperPercentile will be hidden. + +Note that using this prop with GPU aggregation will incur a one-time cost of reading aggregated values from the GPU to the CPU. This overhead may be undesirable if the source data updates frequently. + +#### `lowerPercentile` (number, optional) ![transition-enabled](https://img.shields.io/badge/transition-enabled-green.svg?style=flat-square") {#lowerpercentile} + +* Default: `0` + +Filter hexagons and re-calculate color by `lowerPercentile`. Hexagons with value smaller than the lowerPercentile will be hidden. + +Note that using this prop with GPU aggregation will incur a one-time cost of reading aggregated values from the GPU to the CPU. This overhead may be undesirable if the source data updates frequently. + +#### `elevationUpperPercentile` (number, optional) ![transition-enabled](https://img.shields.io/badge/transition-enabled-green.svg?style=flat-square") {#elevationupperpercentile} + +* Default: `100` + +Filter hexagons and re-calculate elevation by `elevationUpperPercentile`. Hexagons with elevation value larger than the elevationUpperPercentile will be hidden. + +Note that using this prop with GPU aggregation will incur a one-time cost of reading aggregated values from the GPU to the CPU. This overhead may be undesirable if the source data updates frequently. + +#### `elevationLowerPercentile` (number, optional) ![transition-enabled](https://img.shields.io/badge/transition-enabled-green.svg?style=flat-square") {#elevationlowerpercentile} + +* Default: `0` + +Filter bns and re-calculate elevation by `elevationLowerPercentile`. Hexagons with elevation value smaller than the elevationLowerPercentile will be hidden. + +Note that using this prop with GPU aggregation will incur a one-time cost of reading aggregated values from the GPU to the CPU. This overhead may be undesirable if the source data updates frequently. + +#### `material` (Material, optional) {#material} + +* Default: `true` + +This is an object that contains material props for [lighting effect](../core/lighting-effect.md) applied on extruded polygons. +Check [the lighting guide](../../developer-guide/using-effects.md#material-settings) for configurable settings. ### Data Accessors @@ -394,7 +447,7 @@ Method called to retrieve the position of each object. * Default: `1` -The weight of a data object used to calculate the color value for a bin. +The weight of a data object used to calculate the color value for a hexagon. * If a number is provided, it is used as the weight for all objects. * If a function is provided, it is called on each object to retrieve its weight. @@ -404,11 +457,11 @@ The weight of a data object used to calculate the color value for a bin. * Default: `null` -After data objects are aggregated into bins, this accessor is called on each bin to get the value that its color is based on. If supplied, this will override the effect of `getColorWeight` and `colorAggregation` props. +After data objects are sorted into hexagonal bins, this accessor is called on each hexagon to get the value that its color is based on. If supplied, this will override the effect of `getColorWeight` and `colorAggregation` props. Arguments: -- `objects` (DataT[]) - a list of objects whose positions fall inside this cell. +- `objects` (DataT[]) - a list of objects whose positions fall inside this hexagon. - `objectInfo` (object) - contains the following fields: + `indices` (number[]) - the indices of `objects` in the original data + `data` - the value of the `data` prop. @@ -418,7 +471,7 @@ Arguments: * Default: `1` -The weight of a data object used to calculate the elevation value for a bin. +The weight of a data object used to calculate the elevation value for a hexagon. * If a number is provided, it is used as the weight for all objects. * If a function is provided, it is called on each object to retrieve its weight. @@ -428,11 +481,11 @@ The weight of a data object used to calculate the elevation value for a bin. * Default: `null` -After data objects are aggregated into bins, this accessor is called on each bin to get the value that its elevation is based on. If supplied, this will override the effect of `getElevationWeight` and `elevationAggregation` props. +After data objects are sorted into hexagonal bins, this accessor is called on each hexagon to get the value that its elevation is based on. If supplied, this will override the effect of `getElevationWeight` and `elevationAggregation` props. Arguments: -- `objects` (DataT[]) - a list of objects whose positions fall inside this cell. +- `objects` (DataT[]) - a list of objects whose positions fall inside this hexagon. - `objectInfo` (object) - contains the following fields: + `indices` (number[]) - the indices of `objects` in the original data + `data` - the value of the `data` prop. @@ -444,21 +497,33 @@ Arguments: * Default: `([min, max]) => {}` -This callback will be called when bin color domain has been calculated. +This callback will be called when hexagon color domain has been calculated. #### `onSetElevationDomain` (Function, optional) {#onsetelevationdomain} * Default: `([min, max]) => {}` -This callback will be called when bin elevation domain has been calculated. +This callback will be called when hexagon elevation domain has been calculated. + + +## Picking + +The [PickingInfo.object](../../developer-guide/interactivity.md#the-pickinginfo-object) field returned by hover/click events of this layer represents an aggregated hexagon. The object contains the following fields: +- `col` (number) - Column index of the picked hexagon. +- `row` (number) - Row index of the picked hexagon. +- `colorValue` (number) - Aggregated color value, as determined by `getColorWeight` and `colorAggregation` +- `elevationValue` (number) - Aggregated elevation value, as determined by `getElevationWeight` and `elevationAggregation` +- `count` (number) - Number of data points in the picked hexagon +- `pointIndices` (number[]) - Indices of the data objects in the picked hexagon. Only available if using CPU aggregation. +- `points` (object[]) - The data objects in the picked hexagon. Only available if using CPU aggregation and layer data is an array. ## Sub Layers The HexagonLayer renders the following sublayers: -* `hexagon-cell` - a [ColumnLayer](../layers/column-layer.md) rendering the aggregated columns. +* `cells` - a [ColumnLayer](../layers/column-layer.md) rendering the aggregated columns. ## Source diff --git a/docs/api-reference/aggregation-layers/overview.md b/docs/api-reference/aggregation-layers/overview.md new file mode 100644 index 00000000000..68e7d1ac5d5 --- /dev/null +++ b/docs/api-reference/aggregation-layers/overview.md @@ -0,0 +1,43 @@ +# @deck.gl/aggregation-layers + +Layers that aggregate the input data and visualize them in alternative representations, such as grid and hexagon binning, contour, and heatmap. + + - [ContourLayer](./contour-layer.md) + - [GridLayer](./grid-layer.md) + - [HeatmapLayer](./heatmap-layer.md) + - [HexagonLayer](./hexagon-layer.md) + - [ScreenGridLayer](./screen-grid-layer.md) + +## CPU vs GPU Aggregation + +In the right context, enabling GPU aggregation can significantly speed up your application. This section offers in-depth insights into the performance and limitations that should be factored into leveraging this functionality. + +### Considerations + +- **Compaibility**: The client-side features required by GPU aggregation has been universally supported by evergreen browsers for a while and represent 95%+ of the global market. However, users have reported that driver discrepancies in certain devices/chips can affect the outcome. +- **Data size**: The time it takes for CPU to perform aggregation is generally linear to the size of the input data. GPU aggegation requires some up-front overhead in setting up shaders and uploading buffers, but the margin to process more data is very small. When working with large datasets (>100K) GPU is much faster than CPU. With small datasets, GPU could be slower than CPU. +- **Data distribution**: The memory needed by CPU aggregation is proportional to the number of cells that contain at least one data point. The memory needed by GPU aggregation is proportional to all possible cells, including the empty ones in between. GPU performs better with densely concentrated data points than sparse and sprawling data points. +- **Filtering**: GPU-based extentions such as [DataFilterExtension](../extensions/data-filter-extension.md), [MaskExtension](../extensions/mask-extension.md) only work with GPU aggregation. +- **Precision**: GPU shaders only support 32-bit floating numbers. While this layer implement mitigations to compensate for precision loss, it is expected if GPU aggregation does not produce identical results as the CPU. There are tests in place to ensure acceptable consistency between CPU and GPU aggregation. +- **Access to binned points**: GPU aggregation does not expose which data points are contained in a specific cell. If this is a requirement, for example, displaying a list of locations upon selecting a cell, then you need to either use CPU aggregation, or manually filter data on the fly. + +### Performance Metrics + +The following table compares the performance between CPU and GPU aggregations using random data: + +| #objects | CPU #iterations/sec | GPU #iterations/sec | Notes | +| ---- | --- | --- | --- | +| 25K | 535 | 359 | GPU is 33% slower | +| 100K | 119 | 437 | GPU is 267% faster | +| 1M | 12.7 | 158 | GPU is 1144% faster | + +*Numbers are collected on a 2016 15-inch Macbook Pro (CPU: 2.8 GHz Intel Core i7 and GPU: AMD Radeon R9 M370X 2 GB)* + +## Advanced usage + +It is possible to implement a custom aggregation layer, or even perform aggregation without layers, using the utilities from this module. + +- [AggregationLayer](./aggregation-layer.md) class +- [Aggregator](./aggregator.md) interface, implemented by + + [CPUAggregator](./cpu-aggregator.md) + + [WebGLAggregator](./webgl-aggregator.md) diff --git a/docs/api-reference/aggregation-layers/screen-grid-layer.md b/docs/api-reference/aggregation-layers/screen-grid-layer.md index 4cf70231509..ded50266958 100644 --- a/docs/api-reference/aggregation-layers/screen-grid-layer.md +++ b/docs/api-reference/aggregation-layers/screen-grid-layer.md @@ -4,7 +4,7 @@ import {ScreenGridLayerDemo} from '@site/src/doc-demos/aggregation-layers'; -The `ScreenGridLayer` aggregates data into histogram bins and renders them as a grid. By default aggregation happens on GPU, aggregation falls back to CPU when browser doesn't support GPU Aggregation or when `gpuAggregation` prop is set to 1. +The `ScreenGridLayer` aggregates data into histogram bins in screen space and renders them as a overlaid grid. import Tabs from '@theme/Tabs'; @@ -21,6 +21,7 @@ const layer = new ScreenGridLayer({ id: 'ScreenGridLayer', data: 'https://raw.githubusercontent.com/visgl/deck.gl-data/master/website/sf-bike-parking.json', + gpuAggregation: true, cellSizePixels: 50, colorRange: [ [0, 25, 0, 25], @@ -42,6 +43,7 @@ new Deck({ zoom: 11 }, controller: true, + getTooltip: ({object}) => object && `Count: ${object.value}`, layers: [layer] }); ``` @@ -51,7 +53,7 @@ new Deck({ ```ts import {Deck} from '@deck.gl/core'; -import {ScreenGridLayer} from '@deck.gl/aggregation-layers'; +import {ScreenGridLayer, ScreenGridLayerPickingInfo} from '@deck.gl/aggregation-layers'; type BikeRack = { ADDRESS: string; @@ -63,6 +65,7 @@ const layer = new ScreenGridLayer({ id: 'ScreenGridLayer', data: 'https://raw.githubusercontent.com/visgl/deck.gl-data/master/website/sf-bike-parking.json', + gpuAggregation: true, cellSizePixels: 50, colorRange: [ [0, 25, 0, 25], @@ -84,6 +87,7 @@ new Deck({ zoom: 11 }, controller: true, + getTooltip: ({object}: ScreenGridLayerPickingInfo) => object && `Count: ${object.value}`, layers: [layer] }); ``` @@ -94,7 +98,7 @@ new Deck({ ```tsx import React from 'react'; import DeckGL from '@deck.gl/react'; -import {ScreenGridLayer} from '@deck.gl/aggregation-layers'; +import {ScreenGridLayer, ScreenGridLayerPickingInfo} from '@deck.gl/aggregation-layers'; type BikeRack = { ADDRESS: string; @@ -107,6 +111,7 @@ function App() { id: 'ScreenGridLayer', data: 'https://raw.githubusercontent.com/visgl/deck.gl-data/master/website/sf-bike-parking.json', + gpuAggregation: true, cellSizePixels: 50, colorRange: [ [0, 25, 0, 25], @@ -128,6 +133,7 @@ function App() { zoom: 11 }} controller + getTooltip={({object}: ScreenGridLayerPickingInfo) => object && `Count: ${object.value}`} layers={[layer]} />; } @@ -156,7 +162,7 @@ npm install @deck.gl/core @deck.gl/layers @deck.gl/aggregation-layers ```ts import {ScreenGridLayer} from '@deck.gl/aggregation-layers'; -import type {ScreenGridLayerProps} from '@deck.gl/aggregation-layers'; +import type {ScreenGridLayerProps, ScreenGridLayerPickingInfo} from '@deck.gl/aggregation-layers'; new ScreenGridLayer(...props: ScreenGridLayerProps[]); ``` @@ -180,66 +186,71 @@ new deck.ScreenGridLayer({}); Inherits from all [Base Layer](../core/layer.md) properties. -### Render Options +### Aggregation Options -#### `cellSizePixels` (number, optional) ![transition-enabled](https://img.shields.io/badge/transition-enabled-green.svg?style=flat-square") {#cellsizepixels} +#### `gpuAggregation` (boolean, optional) {#gpuaggregation} -* Default: `100` +* Default: `true` -Unit width/height of the bins. +When set to `true` and the browser supports it, aggregation is performed on GPU. -#### `cellMarginPixels` (number, optional) ![transition-enabled](https://img.shields.io/badge/transition-enabled-green.svg?style=flat-square") {#cellmarginpixels} +In the right context, enabling GPU aggregation can significantly speed up your application. However, depending on the nature of input data and required application features, there are pros and cons in leveraging this functionality. See [CPU vs GPU aggregation](./overview.md#cpu-vs-gpu-aggregation) for an in-depth discussion. -* Default: `2`, gets clamped to [0, 5] -Cell margin size in pixels. +#### `cellSizePixels` (number, optional) ![transition-enabled](https://img.shields.io/badge/transition-enabled-green.svg?style=flat-square") {#cellsizepixels} -#### `minColor` (number[4], optional) **DEPRECATED** {#mincolor} +* Default: `100` -* Default: `[0, 0, 0, 255]` +Unit width/height of the bins. -Expressed as an rgba array, minimal color that could be rendered by a tile. This prop is deprecated in version 5.2.0, use `colorRange` and `colorDomain` instead. +#### `aggregation` (string, optional) {#aggregation} -#### `maxColor` (number[4], optional) **DEPRECATED** {#maxcolor} +* Default: `'SUM'` -* Default: `[0, 255, 0, 255]` +Defines the operation used to aggregate all data object weights to calculate a cell's value. Valid values are: -Expressed as an rgba array, maximal color that could be rendered by a tile. This prop is deprecated in version 5.2.0, use `colorRange` and `colorDomain` instead. +- `'SUM'`: The sum of weights across all points that fall into a cell. +- `'MEAN'`: The mean weight across all points that fall into a cell. +- `'MIN'`: The minimum weight across all points that fall into a cell. +- `'MAX'`: The maximum weight across all points that fall into a cell. +- `'COUNT'`: The number of points that fall into a cell. -#### `colorDomain` (number[2], optional) {#colordomain} +`getWeight` and `aggregation` together determine the elevation value of each cell. -* Default: `[1, max(weight)]` +### Render Options -Color scale input domain. The color scale maps continues numeric domain into -discrete color range. If not provided, the layer will set `colorDomain` to [1, max-of-all-cell-weights], You can control how the color of cells mapped -to value of its weight by passing in an arbitrary color domain. This property is extremely handy when you want to render different data input with the same color mapping for comparison. +#### `cellMarginPixels` (number, optional) ![transition-enabled](https://img.shields.io/badge/transition-enabled-green.svg?style=flat-square") {#cellmarginpixels} -#### `colorRange` (Color[6], optional) {#colorrange} +* Default: `2`, gets clamped to [0, 5] -* Default: +Cell margin size in pixels. -Specified as an array of 6 colors [color1, color2, ... color6]. Each color is an array of 3 or 4 values [R, G, B] or [R, G, B, A], representing intensities of Red, Green, Blue and Alpha channels. Each intensity is a value between 0 and 255. When Alpha not provided a value of 255 is used. By default `colorRange` is set to -[colorbrewer](http://colorbrewer2.org/#type=sequential&scheme=YlOrRd&n=6) `6-class YlOrRd`. +Note that setting this prop does not affect how points are binned. -NOTE: `minColor` and `maxColor` take precedence over `colorDomain` and `colorRange`, to use `colorDomain` and `colorRange` do not provide `minColor` and `maxColor`. +#### `colorScaleType` (string, optional) {#colorscaletype} -#### `gpuAggregation` (boolean, optional) {#gpuaggregation} +* Default: `'quantize'` -* Default: true +The color scale converts from a continuous numeric stretch (`colorDomain`) into a list of colors (`colorRange`). Cells with value of `colorDomain[0]` will be rendered with the color of `colorRange[0]`, and cells with value of `colorDomain[1]` will be rendered with the color of `colorRange[colorRange.length - 1]`. -When set to true and browser supports GPU aggregation, aggregation is performed on GPU. GPU aggregation can be 10 to 20 times faster depending upon number of points and number of cells. +`colorScaleType` determines how a numeric value in domain is mapped to a color in range. Supported values are: +- `'linear'`: `colorRange` is linearly interpolated based on where the value lies in `colorDomain`. +- `'quantize'`: `colorDomain` is divided into `colorRange.length` equal segments, each mapped to one discrete color in `colorRange`. -#### `aggregation` (string, optional) {#aggregation} +#### `colorDomain` (number[2], optional) {#colordomain} -* Default: 'SUM' +* Default: `null` (auto) -Defines the type of aggregation operation, valid values are 'SUM', 'MEAN', 'MIN' and 'MAX'. When no value or an invalid value is set, 'SUM' is used as aggregation. +If not provided, the layer will set `colorDomain` to the +actual min, max values from all cells at run time. -* SUM : Grid cell contains sum of all weights that fall into it. -* MEAN : Grid cell contains mean of all weights that fall into it. -* MIN : Grid cell contains minimum of all weights that fall into it. -* MAX : Grid cell contains maximum of all weights that fall into it. +By providing a `colorDomain`, you can control how a value is represented by color. This is useful when you want to render different data input with the same color mapping for comparison. +#### `colorRange` (Color[6], optional) {#colorrange} + +* Default: [colorbrewer](http://colorbrewer2.org/#type=sequential&scheme=YlOrRd&n=6) `6-class YlOrRd` + +Specified as an array of 6 colors [color1, color2, ... color6]. Each color is an array of 3 or 4 values [R, G, B] or [R, G, B, A], representing intensities of Red, Green, Blue and Alpha channels. Each intensity is a value between 0 and 255. When Alpha is omitted a value of 255 is used. ### Data Accessors @@ -259,6 +270,18 @@ The weight of each object. * If a function is provided, it is called on each object to retrieve its weight. +## Picking + +The [PickingInfo.object](../../developer-guide/interactivity.md#the-pickinginfo-object) field returned by hover/click events of this layer represents an aggregated cell. The object contains the following fields: + +- `col` (number) - Column index of the picked cell, starting from 0 at the left of the viewport. +- `row` (number) - Row index of the picked cell, starting from 0 at the top of the viewport. +- `value` (number) - Aggregated value, as determined by `getWeight` and `aggregation` +- `count` (number) - Number of data points in the picked cell +- `pointIndices` (number[]) - Indices of the data objects in the picked cell. Only available if using CPU aggregation. +- `points` (object[]) - The data objects in the picked cell. Only available if using CPU aggregation and layer data is an array. + + ## Source [modules/aggregation-layers/src/screen-grid-layer](https://github.com/visgl/deck.gl/tree/master/modules/aggregation-layers/src/screen-grid-layer) diff --git a/docs/api-reference/aggregation-layers/webgl-aggregator.md b/docs/api-reference/aggregation-layers/webgl-aggregator.md new file mode 100644 index 00000000000..027fa01ce3f --- /dev/null +++ b/docs/api-reference/aggregation-layers/webgl-aggregator.md @@ -0,0 +1,83 @@ +# WebGLAggregator + +The `WebGLAggregator` implements the [Aggregator](./aggregator.md) interface by performing aggregation on the GPU. + +## Example + +This example implements an aggregator that makes a [histogram](https://en.wikipedia.org/wiki/Histogram) that calculates "weight" distribution by "position". + +```ts +import {WebGLAggregator} from '@deck.gl/aggregation-layers'; + +const aggregator = new WebGLAggregator(device, { + dimensions: 1, + channelCount: 1, + bufferLayout: [ + {name: 'position', format: 'float32'}, + {name: 'weight', format: 'float32'} + ], + vs: ` + uniform float binSize; + in float position; + in float weight; + void getBin(out int binId) { + binId = int(floor(position / binSize)); + } + void getValue(out float value) { + value = weight; + }` +}); + +const position = new Attribute(device, {id: 'position', size: 1}); +position.setData({value: new Float32Array(...)}); +const weight = new Attribute(device, {id: 'weight', size: 1}); +position.setData({value: new Float32Array(...)}); + +aggregator.setProps({ + pointCount: data.length, + binIdRange: [0, 100], + operations: ['SUM'], + binOptions: { + binSize: 1 + }, + attributes: {position, weight} +}); + +aggregator.update(); +``` + +## Constructor + +```ts +new WebGLAggregator(props); +``` + +Arguments: + +- `dimensions` (number) - size of bin IDs, either 1 or 2 +- `channelCount` (number) - number of channels, up to 3 +- `vs` (string) - vertex shader for the aggregator. Should define the following functions: + + `void getBin(out int binId)`, if dimensions=1 or + `void getBin(out ivec2 binId)`, if dimensions=2 + * `void getValue(out float value)`, if channelCount=1 or + `void getValue(out vec2 value)`, if channelCount=2 or + `void getValue(out vec3 value)`, if channelCount=3 +- `bufferLayout` (object[]) - see [ModelProps](https://github.com/visgl/luma.gl/blob/master/modules/engine/src/model/model.ts) +- `modules` (object[]) - luma.gl shader modules, see [ModelProps](https://github.com/visgl/luma.gl/blob/master/modules/engine/src/model/model.ts) +- `defines` (object) - luma.gl shader defines, see [ModelProps](https://github.com/visgl/luma.gl/blob/master/modules/engine/src/model/model.ts) + +## Props + +Requires all [Aggregator](./aggregator.md#setprops) props, and the following: + +#### `binIdRange` (number[][]) {#binidrange} + +Limits of binId defined as [start, end] for each dimension. Ids less than `start` or larger than or equal to `end` are ignored. + +#### `moduleSettings` (object) {#modulesettings} + +Mapped uniforms for shadertool modules, see [ModelProps](https://github.com/visgl/luma.gl/blob/master/modules/engine/src/model/model.ts) + +## Source + +[modules/aggregation-layers/src/common/aggregator/gpu-aggregator/webgl-aggregator.ts](https://github.com/visgl/deck.gl/tree/master/modules/aggregation-layers/src/common/aggregator/gpu-aggregator/webgl-aggregator.ts) diff --git a/docs/api-reference/carto/fetch-map.md b/docs/api-reference/carto/fetch-map.md index b67da2a6360..8dfd98ac17e 100644 --- a/docs/api-reference/carto/fetch-map.md +++ b/docs/api-reference/carto/fetch-map.md @@ -50,13 +50,19 @@ const map = await fetchMap({cartoMapId, credentials, autoRefresh, onNewData}); Required. Identifier of map created in CARTO Builder. -#### `credentials` (object, optional) {#credentials} +#### `accessToken` (string, optional) {#accesstoken} -[CARTO Credentials](./overview.md#carto-credentials) to use in API requests. +CARTO platform access token. Only required for private maps. + +#### `apiBaseUrl` (string, optional) {#apibaseurl} + +Base URL of the CARTO Maps API. + +Example for account located in EU-west region: `https://gcp-eu-west1.api.carto.com` #### `headers` (object, optional) {#headers} -Custom headers to include in the map instantiation requests. +Custom HTTP headers to include in the map instantiation requests. #### `autoRefresh` (number, optional) {#autorefresh} diff --git a/docs/api-reference/core/layer.md b/docs/api-reference/core/layer.md index 2dbef0e5a61..b1f2a52d377 100644 --- a/docs/api-reference/core/layer.md +++ b/docs/api-reference/core/layer.md @@ -62,7 +62,7 @@ deck.gl layers typically expect `data` to be one of the following types: - `Promise`: the resolved value will be used as the value of the `data` prop. - `AsyncIterable`: an [async iterable](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/asyncIterator) object that yields data in batches. The default implementation expects each batch to be an array of data objects; one may change this behavior by supplying a custom `dataTransform` callback. -**data.attributes** +##### data.attributes When using a non-iterable `data` object, the object may optionally contain a field `attributes`, if the application wishes to supply binary buffers directly to the layer. This use case is discussed in detail in the [performance developer guide](../../developer-guide/performance.md#supply-attributes-directly). diff --git a/docs/api-reference/core/point-light.md b/docs/api-reference/core/point-light.md index f97db276136..c67b6516efb 100644 --- a/docs/api-reference/core/point-light.md +++ b/docs/api-reference/core/point-light.md @@ -1,6 +1,6 @@ # PointLight -Create a point light source which emits from a point in all directions.Point lights attenuation is not available. At most 5 directional lights can be supported. +Create a point light source which emits from a point in all directions. At most 5 directional lights can be supported.
@@ -33,6 +33,12 @@ const pointLight = new PointLight({color, intensity, position}); * `color` - (number[3],) RGB color of point light source, default value is `[255, 255, 255]`. * `intensity` - (number) Strength of point light source, default value is `1.0`. * `position` - (number[3]) Location of point light source, default value is `[0, 0, 1]`.The coordinate system of the position depends on the current [view](./deck.md#views): `[longitude, latitude, altitude]` in geospatial views and world position in non-geospatial views. +* `attenuation` = (number[3]) Light attenuation coefficients: `[C_constant, C_linear, C_quadratic]`. Reduces the intensity based on the distance `D` from the light: + ``` + Intensity = Intensity / (C_constant + C_linear * D + C_quadratic * D * D) + ``` + * For (approximately) physically correct attenuation, use `attenuation: [1, 0, n]`. + * Default: `[1, 0, 0]` (no attenuation due to distance). ## Source diff --git a/docs/api-reference/layers/README.md b/docs/api-reference/layers/README.md index 745437102e0..2237df04351 100644 --- a/docs/api-reference/layers/README.md +++ b/docs/api-reference/layers/README.md @@ -32,8 +32,6 @@ The [Aggregation Layers](https://www.npmjs.com/package/@deck.gl/aggregation-laye - [ContourLayer](../aggregation-layers/contour-layer.md) - [GridLayer](../aggregation-layers/grid-layer.md) - - [GPUGridLayer](../aggregation-layers/gpu-grid-layer.md) - - [CPUGridLayer](../aggregation-layers/cpu-grid-layer.md) - [HeatmapLayer](../aggregation-layers/heatmap-layer.md) - [HexagonLayer](../aggregation-layers/hexagon-layer.md) - [ScreenGridLayer](../aggregation-layers/screen-grid-layer.md) diff --git a/docs/developer-guide/base-maps/using-with-google-maps.md b/docs/developer-guide/base-maps/using-with-google-maps.md index 1340f70b78b..0e744df9c25 100644 --- a/docs/developer-guide/base-maps/using-with-google-maps.md +++ b/docs/developer-guide/base-maps/using-with-google-maps.md @@ -86,7 +86,7 @@ import {GoogleMapsOverlay} from '@deck.gl/google-maps'; function DeckGLOverlay(props: DeckProps) { const map = useMap(); - const overlay = useMemo(() => new GoogleMapsOverlay(props)); + const overlay = useMemo(() => new GoogleMapsOverlay(props), []); useEffect(() => { overlay.setMap(map); diff --git a/docs/developer-guide/custom-layers/subclassed-layers.md b/docs/developer-guide/custom-layers/subclassed-layers.md index c904e67e510..c5d5738359a 100644 --- a/docs/developer-guide/custom-layers/subclassed-layers.md +++ b/docs/developer-guide/custom-layers/subclassed-layers.md @@ -12,7 +12,6 @@ good technique to add it. ```js // Example to add per-segment color to PathLayer import {PathLayer} from '@deck.gl/layers'; -import GL from '@luma.gl/constants'; // Allow accessor: `getColor` (Function, optional) // Returns an color (array of numbers, RGBA) or array of colors (array of arrays). @@ -22,7 +21,7 @@ export default class MultiColorPathLayer extends PathLayer { this.getAttributeManager().addInstanced({ instanceColors: { size: 4, - type: GL.UNSIGNED_BYTE, + type: "unorm8", normalized: true, update: this.calculateColors } diff --git a/docs/developer-guide/interactivity.md b/docs/developer-guide/interactivity.md index 8d5e45ae50d..58aa22424fa 100644 --- a/docs/developer-guide/interactivity.md +++ b/docs/developer-guide/interactivity.md @@ -1031,7 +1031,7 @@ function App() { -Also note that by directly calling `queryObject`, integrating deck.gl into an existing application often becomes easier since you don't have to change the application's existing approach to event handling. +Also note that by directly calling `pickObject`, integrating deck.gl into an existing application often becomes easier since you don't have to change the application's existing approach to event handling. ### Under The Hood diff --git a/docs/get-started/using-with-map.md b/docs/get-started/using-with-map.md index f93adbd81ed..9611f73ce46 100644 --- a/docs/get-started/using-with-map.md +++ b/docs/get-started/using-with-map.md @@ -32,5 +32,6 @@ Deck renders into the WebGL2 context of the base map. This allows for occlusion | [Mapbox GL JS](https://docs.mapbox.com/mapbox-gl-js/api/) | ✓ | ✓ | [example](https://github.com/visgl/deck.gl/tree/master/examples/get-started/pure-js/mapbox) | [example](https://deck.gl/gallery/mapbox-overlay) | [link](../developer-guide/base-maps/using-with-mapbox.md) | | [MapLibre GL JS](https://maplibre.org/maplibre-gl-js-docs/api/) | ✓ | ✓ | [example](https://github.com/visgl/deck.gl/tree/master/examples/get-started/pure-js/maplibre) | [example](https://deck.gl/gallery/maplibre-overlay) | [link](../developer-guide/base-maps/using-with-maplibre.md) | | [OpenLayers](https://openlayers.org/) | ✓ | | [example](https://github.com/visgl/deck.gl/tree/master/examples/get-started/pure-js/openlayers) | | | +| [Apple Maps](https://developer.apple.com/documentation/mapkitjs) | ✓ | | [example](https://github.com/visgl/deck.gl/tree/master/examples/get-started/pure-js/apple-maps) | | | It is also important to understand the difference between the JS library that renders the map and the map data provider. For example, you can use Mapbox GL JS with the Mapbox service, but also with any other service that hosts Mapbox Vector Tiles. When using a base map, be sure to follow the terms and conditions, as well as the attribution requirements of both the JS library and the data provider. diff --git a/docs/table-of-contents.json b/docs/table-of-contents.json index f0a86a37ae7..bf838a26e70 100644 --- a/docs/table-of-contents.json +++ b/docs/table-of-contents.json @@ -95,10 +95,8 @@ "api-reference/layers/bitmap-layer", "api-reference/layers/column-layer", "api-reference/aggregation-layers/contour-layer", - "api-reference/aggregation-layers/cpu-grid-layer", "api-reference/geo-layers/geohash-layer", "api-reference/layers/geojson-layer", - "api-reference/aggregation-layers/gpu-grid-layer", "api-reference/geo-layers/great-circle-layer", "api-reference/layers/grid-cell-layer", "api-reference/aggregation-layers/grid-layer", @@ -210,6 +208,17 @@ "type": "category", "label": "Submodule API Reference", "items": [ + { + "type": "category", + "label": "@deck.gl/extensions", + "items": [ + "api-reference/aggregation-layers/overview", + "api-reference/aggregation-layers/aggregation-layer", + "api-reference/aggregation-layers/aggregator", + "api-reference/aggregation-layers/cpu-aggregator", + "api-reference/aggregation-layers/webgl-aggregator" + ] + }, { "type": "category", "label": "@deck.gl/arcgis", diff --git a/docs/upgrade-guide.md b/docs/upgrade-guide.md index 1685ac1655c..634b33e7a17 100644 --- a/docs/upgrade-guide.md +++ b/docs/upgrade-guide.md @@ -1,5 +1,21 @@ # Upgrade Guide +## Upgrading to v9.1 + +### Aggregation layers + +Breaking changes: + +- `GPUGridLayer` is removed. Use `GridLayer` with `gpuAggregation: true`. +- `CPUGridLayer` is removed. Use `GridLayer` with `gpuAggregation: false`. +- If you are supplying a custom [haxagonAggregator](./api-reference/aggregation-layers/hexagon-layer.md#haxagonaggregator) to `HexagonLayer`, its function signiature has changed. +- `HexagonLayer`'s sub layer is renamed `-cells` and is no longer a vanilla `ColumnLayer`. If you were overriding the sub layer class with your own, please open a Discussion on GitHub for support. + + +### LightingEffect + +- `PointLight.attenuation` was previously ignored. To retain old behavior, use the default (`[1, 0, 0]`). + ## Upgrading to v9.0 **Before you upgrade: known issues** diff --git a/docs/whats-new.md b/docs/whats-new.md index d682243cd9a..2a64994a012 100644 --- a/docs/whats-new.md +++ b/docs/whats-new.md @@ -2,6 +2,30 @@ This page contains highlights of each deck.gl release. Also check our [vis.gl blog](https://medium.com/vis-gl) for news about new releases and features in deck.gl. +## deck.gl v9.1 + +Release date: TBD (targeting September 2024) + +### WebGPU readiness + +- luma.gl v9.1 +- All layers migrated to UBO + +### Aggregation layers upgrade + +v9.1 restores the GPU aggregation functionality that was temporarily disabled in v9.0. It brings a major refactor of the aggregation layers, with full TypeScript and unit test coverage. +A new generic `Aggregator` interface makes it much easier to support custom aggregation operations. The current implementations of this interface include `CPUAggregator` and `WebGLAggregator`, with `WebGPUAggregator` on the roadmap. + +Highlights: + +- `GridLayer` now utilized both CPU and GPU aggregators in the same code path. +- `HexagonLayer` now supports GPU aggregation. Enable with `gpuAggregation: true`. +- `GridLayer` and `HexagonLayer` can use `*ScaleType`, `*UpperPercentile`, `*LowerPercentile`, `onSet*Domain` props along with GPU aggregation. +- `GridLayer` and `HexagonLayer` now support non-geospatial views. +- New picking info types for each aggregation layer. + +See [upgrade guide](./upgrade-guide.md) for more details. + ## deck.gl v9.0 Release date: March 21, 2024 diff --git a/examples/get-started/pure-js/apple-maps/README.md b/examples/get-started/pure-js/apple-maps/README.md new file mode 100644 index 00000000000..b31c3718a8d --- /dev/null +++ b/examples/get-started/pure-js/apple-maps/README.md @@ -0,0 +1,21 @@ +## Example: Use deck.gl with Apple Maps + +Uses [Vite](https://vitejs.dev/) to bundle and serve files. + +## Usage + +To run this example, you need a [Apple Maps token](https://developer.apple.com/documentation/mapkitjs/creating_a_maps_token). + +You need to then set the `data-token` property in `index.html` to this token. + +To install dependencies: + +```bash +npm install +# or +yarn +``` + +Commands: +* `npm start` is the development target, to serve the app and hot reload. +* `npm run build` is the production target, to create the final bundle and write to disk. diff --git a/examples/get-started/pure-js/apple-maps/app.js b/examples/get-started/pure-js/apple-maps/app.js new file mode 100644 index 00000000000..257be4ca950 --- /dev/null +++ b/examples/get-started/pure-js/apple-maps/app.js @@ -0,0 +1,80 @@ +/* global mapkit, window */ +import {Deck, WebMercatorViewport} from '@deck.gl/core'; +import {ScatterplotLayer} from '@deck.gl/layers'; + +const DATA_URL = + 'https://raw.githubusercontent.com/visgl/deck.gl-data/master/examples/scatterplot/manhattan.json'; // eslint-disable-line + +const initialViewState = { + longitude: -74, + latitude: 40.7, + zoom: 11, + maxZoom: 16, + pitch: 0, + bearing: 0, + maxPitch: 0 // Tilt not supported in Apple Maps +}; +const maleColor = [0, 128, 255]; +const femaleColor = [255, 0, 128]; + +async function init() { + await setupMapKitJs(); + const layers = [ + new ScatterplotLayer({ + id: 'scatter-plot', + data: DATA_URL, + radiusScale: 30, + radiusMinPixels: 0.25, + getPosition: d => [d[0], d[1], 0], + getFillColor: d => (d[2] === 1 ? maleColor : femaleColor), + getRadius: 1, + updateTriggers: { + getFillColor: [maleColor, femaleColor] + } + }) + ]; + + const deck = new Deck({canvas: 'deck-canvas', controller: true, initialViewState, layers}); + + // Sync deck view state with Apple Maps + const map = new mapkit.Map('map', viewPropsFromViewState(initialViewState)); + deck.setProps({ + onViewStateChange: ({viewState}) => { + const {region, rotation} = viewPropsFromViewState(viewState); + map.setRegionAnimated(region, false); + map.setRotationAnimated(rotation, false); + } + }); +} +init(); + +/** + * Converts deck.gl viewState into {region, rotation} used for Apple Maps + */ +function viewPropsFromViewState(viewState) { + const {longitude, latitude, bearing} = viewState; + const viewport = new WebMercatorViewport({...viewState, bearing: 0}); + const bounds = viewport.getBounds(); + + const center = new mapkit.Coordinate(latitude, longitude); + const span = new mapkit.CoordinateSpan(bounds[3] - bounds[1], bounds[2] - bounds[0]); + const region = new mapkit.CoordinateRegion(center, span); + const rotation = -bearing; + + return {region, rotation}; +} + +/** + * Wait for MapKit JS to be ready to use + */ +async function setupMapKitJs() { + // If MapKit JS is not yet loaded... + if (!window.mapkit || window.mapkit.loadedLibraries.length === 0) { + // ...await + +
+
+ +
+ + + diff --git a/examples/get-started/pure-js/apple-maps/package.json b/examples/get-started/pure-js/apple-maps/package.json new file mode 100644 index 00000000000..a5d2a63490a --- /dev/null +++ b/examples/get-started/pure-js/apple-maps/package.json @@ -0,0 +1,18 @@ +{ + "name": "deckgl-example-pure-js-apple-maps", + "version": "0.0.0", + "private": true, + "license": "MIT", + "scripts": { + "start": "vite --open", + "start-local": "vite --config ../../../vite.config.local.mjs", + "build": "vite build" + }, + "dependencies": { + "@deck.gl/core": "^9.0.0", + "@deck.gl/layers": "^9.0.0" + }, + "devDependencies": { + "vite": "^4.0.0" + } +} diff --git a/examples/get-started/pure-js/carto/app.js b/examples/get-started/pure-js/carto/app.js index f421d9cfe1e..edf9680e9ce 100644 --- a/examples/get-started/pure-js/carto/app.js +++ b/examples/get-started/pure-js/carto/app.js @@ -5,12 +5,11 @@ import {fetchMap} from '@deck.gl/carto'; const cartoMapId = 'ff6ac53f-741a-49fb-b615-d040bc5a96b8'; // Get map info from CARTO and update deck -fetchMap({cartoMapId}).then(({initialViewState, mapStyle, layers}) => { +fetchMap({cartoMapId}).then(({initialViewState, basemap, layers}) => { const deck = new Deck({canvas: 'deck-canvas', controller: true, initialViewState, layers}); // Add Mapbox GL for the basemap. It's not a requirement if you don't need a basemap. - const MAP_STYLE = `https://basemaps.cartocdn.com/gl/${mapStyle.styleType}-gl-style/style.json`; - const map = new maplibregl.Map({container: 'map', style: MAP_STYLE, interactive: false}); + const map = new maplibregl.Map({container: 'map', ...basemap?.props, interactive: false}); deck.setProps({ onViewStateChange: ({viewState}) => { const {longitude, latitude, ...rest} = viewState; diff --git a/examples/layer-browser/package.json b/examples/layer-browser/package.json index c495aa09b0a..c41df49cec4 100644 --- a/examples/layer-browser/package.json +++ b/examples/layer-browser/package.json @@ -8,16 +8,20 @@ "start-local": "vite --config ../vite.config.local.mjs" }, "dependencies": { - "@loaders.gl/ply": "^4.2.0", + "@loaders.gl/core": "^4.2.0", "@loaders.gl/gltf": "^4.2.0", + "@loaders.gl/ply": "^4.2.0", + "@probe.gl/log": "^4.0.9", "colorbrewer": "^1.0.0", "d3-request": "^1.0.6", "d3-scale": "^3.1.0", "extrude-polyline": "^1.0.6", + "h3-js": "^4.1.0", "maplibre-gl": "^3.0.0", - "react": "^16.3.0", + "prop-types": "^15.8.1", + "react": "^18.2.0", "react-autobind": "^1.0.6", - "react-dom": "^16.3.0", + "react-dom": "^18.2.0", "react-map-gl": "^7.1.0", "react-stats-zavatta": "^0.0.6" }, diff --git a/examples/layer-browser/src/examples/aggregation-layers.js b/examples/layer-browser/src/examples/aggregation-layers.js index 1c28436cad0..80e167ccfac 100644 --- a/examples/layer-browser/src/examples/aggregation-layers.js +++ b/examples/layer-browser/src/examples/aggregation-layers.js @@ -1,7 +1,5 @@ import { GridLayer, - GPUGridLayer, - CPUGridLayer, HexagonLayer, ContourLayer, ScreenGridLayer, @@ -70,22 +68,6 @@ function getMax(pts, key) { : null; } -const CPUGridLayerExample = { - layer: CPUGridLayer, - props: { - id: 'gridLayer', - data: dataSamples.points, - cellSize: 200, - opacity: 1, - extruded: true, - pickable: true, - colorScaleType: 'quantize', - getPosition: d => d.COORDINATES, - getColorValue: points => getMean(points, 'SPACES'), - getElevationValue: points => getMax(points, 'SPACES') - } -}; - const HexagonLayerExample = { layer: HexagonLayer, props: { @@ -114,20 +96,11 @@ const GRID_LAYER_PROPS_OBJECT = { getPosition: d => d.COORDINATES }; -const GPU_GRID_LAYER_PROPS_OBJECT = Object.assign({}, GRID_LAYER_PROPS_OBJECT, { - id: 'gpu-grid-layer' -}); - const GRID_LAYER_PROPS = { getData: () => dataSamples.points, props: GRID_LAYER_PROPS_OBJECT }; -const GPU_GRID_LAYER_PROPS = { - getData: () => dataSamples.points, - props: GPU_GRID_LAYER_PROPS_OBJECT -}; - const HEAT_LAYER_PROPS = { getData: () => dataSamples.points, props: { @@ -138,12 +111,12 @@ const HEAT_LAYER_PROPS = { } }; -const GPUGridLayerExample = Object.assign({}, {layer: GPUGridLayer}, GPU_GRID_LAYER_PROPS); const GridLayerExample = Object.assign({}, {layer: GridLayer}, GRID_LAYER_PROPS); const HeatmapLayerExample = Object.assign({}, {layer: HeatmapLayer}, HEAT_LAYER_PROPS); const GPUGridLayerPerfExample = (id, getData) => ({ - layer: GPUGridLayer, + layer: GridLayer, + gpuAggregation: true, getData, props: { id: `gpuGridLayerPerf-${id}`, @@ -158,12 +131,10 @@ const GPUGridLayerPerfExample = (id, getData) => ({ /* eslint-disable quote-props */ export default { 'Aggregation Layers': { - CPUGridLayer: CPUGridLayerExample, ScreenGridLayer: ScreenGridLayerExample, HexagonLayer: HexagonLayerExample, ContourLayer: ContourLayerExample, 'ContourLayer (Bands)': ContourLayerBandsExample, - GPUGridLayer: GPUGridLayerExample, GridLayer: GridLayerExample, HeatmapLayer: HeatmapLayerExample, 'GPUGridLayer (1M)': GPUGridLayerPerfExample('1M', dataSamples.getPoints1M), diff --git a/examples/playground/package.json b/examples/playground/package.json index 34c705077ef..3dba66ae2f9 100644 --- a/examples/playground/package.json +++ b/examples/playground/package.json @@ -14,7 +14,7 @@ "@loaders.gl/csv": "^4.2.0", "@loaders.gl/draco": "^4.2.0", "@loaders.gl/gltf": "^4.2.0", - "@luma.gl/constants": "^9.0.4", + "@luma.gl/constants": "^9.1.0-alpha.19", "brace": "^0.11.1", "deck.gl": "^9.0.0", "maplibre-gl": "^3.0.0", diff --git a/examples/website/3d-heatmap/app.tsx b/examples/website/3d-heatmap/app.tsx index 99c5af37a20..a6485b7682a 100644 --- a/examples/website/3d-heatmap/app.tsx +++ b/examples/website/3d-heatmap/app.tsx @@ -59,7 +59,7 @@ function getTooltip({object}: PickingInfo) { } const lat = object.position[1]; const lng = object.position[0]; - const count = object.points.length; + const count = object.count; return `\ latitude: ${Number.isFinite(lat) ? lat.toFixed(6) : ''} @@ -85,6 +85,7 @@ export default function App({ const layers = [ new HexagonLayer({ id: 'heatmap', + // gpuAggregation: true, colorRange, coverage, data, @@ -126,6 +127,8 @@ export async function renderToDOM(container: HTMLDivElement) { root.render(); const data = (await load(DATA_URL, CSVLoader)).data; - const points: DataPoint[] = data.map(d => [d.lng, d.lat]); + const points: DataPoint[] = data + .map(d => (Number.isFinite(d.lng) ? [d.lng, d.lat] : null)) + .filter(Boolean); root.render(); } diff --git a/examples/website/i3s/package.json b/examples/website/i3s/package.json index c9d172fee2c..a38a5904cce 100644 --- a/examples/website/i3s/package.json +++ b/examples/website/i3s/package.json @@ -10,6 +10,8 @@ }, "dependencies": { "@loaders.gl/i3s": "^4.2.0", + "maplibre-gl": "^3.0.0", + "react-map-gl": "^7.1.0", "deck.gl": "^9.0.0" }, "devDependencies": { diff --git a/examples/website/mesh/package.json b/examples/website/mesh/package.json index 809b679f367..4c82ac62e2b 100644 --- a/examples/website/mesh/package.json +++ b/examples/website/mesh/package.json @@ -10,7 +10,7 @@ }, "dependencies": { "@loaders.gl/obj": "^4.2.0", - "@math.gl/core": "^4.0.0", + "@math.gl/core": "^4.1.0-alpha.3", "deck.gl": "^9.0.0", "react": "^18.0.0", "react-dom": "^18.0.0" diff --git a/lerna.json b/lerna.json index 10899d9e602..bc00597b1a3 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "9.0.0-beta.11", + "version": "9.1.0-alpha.0", "npmClient": "yarn", "packages": [ "modules/*" diff --git a/modules/aggregation-layers/package.json b/modules/aggregation-layers/package.json index 8c72f9f1a30..78472da9071 100644 --- a/modules/aggregation-layers/package.json +++ b/modules/aggregation-layers/package.json @@ -3,7 +3,7 @@ "description": "deck.gl layers that aggregate the input data into alternative representations", "license": "MIT", "type": "module", - "version": "9.0.0-beta.11", + "version": "9.1.0-alpha.0", "publishConfig": { "access": "public" }, @@ -38,16 +38,17 @@ "prepublishOnly": "npm run build-bundle && npm run build-bundle -- --env=dev" }, "dependencies": { - "@luma.gl/constants": "^9.0.17", - "@luma.gl/shadertools": "^9.0.17", - "@math.gl/web-mercator": "^4.0.0", + "@luma.gl/constants": "^9.1.0-alpha.19", + "@luma.gl/shadertools": "^9.1.0-alpha.19", + "@math.gl/core": "^4.1.0-alpha.3", + "@math.gl/web-mercator": "^4.1.0-alpha.3", "d3-hexbin": "^0.2.1" }, "peerDependencies": { - "@deck.gl/core": "^9.0.0", - "@deck.gl/layers": "^9.0.0", - "@luma.gl/core": "^9.0.0", - "@luma.gl/engine": "^9.0.0" + "@deck.gl/core": "9.0.0-alpha.0", + "@deck.gl/layers": "9.0.0-alpha.0", + "@luma.gl/core": "^9.1.0-alpha.19", + "@luma.gl/engine": "^9.1.0-alpha.19" }, "gitHead": "13ace64fc2cee08c133afc882fc307253489a4e4" } diff --git a/modules/aggregation-layers/src/aggregation-layer-v9/aggregation-layer.ts b/modules/aggregation-layers/src/common/aggregation-layer.ts similarity index 98% rename from modules/aggregation-layers/src/aggregation-layer-v9/aggregation-layer.ts rename to modules/aggregation-layers/src/common/aggregation-layer.ts index 7003d1f3361..3ee15233670 100644 --- a/modules/aggregation-layers/src/aggregation-layer-v9/aggregation-layer.ts +++ b/modules/aggregation-layers/src/common/aggregation-layer.ts @@ -7,7 +7,7 @@ import { Attribute, AttributeManager } from '@deck.gl/core'; -import {Aggregator} from './aggregator'; +import {Aggregator} from './aggregator/aggregator'; export type AggregationLayerProps = CompositeLayerProps & { data: LayerDataSource; diff --git a/modules/aggregation-layers/src/aggregation-layer-v9/aggregator.ts b/modules/aggregation-layers/src/common/aggregator/aggregator.ts similarity index 89% rename from modules/aggregation-layers/src/aggregation-layer-v9/aggregator.ts rename to modules/aggregation-layers/src/common/aggregator/aggregator.ts index b90187c7520..7899a465b58 100644 --- a/modules/aggregation-layers/src/aggregation-layer-v9/aggregator.ts +++ b/modules/aggregation-layers/src/common/aggregator/aggregator.ts @@ -13,6 +13,8 @@ export type AggregationProps = { operations: AggregationOperation[]; /** Additional options to control bin sorting, e.g. bin size */ binOptions: Record; + /** Callback after a channel is updated */ + onUpdate?: (event: {channel: number}) => void; }; /** Descriptor of an aggregated bin */ @@ -39,10 +41,11 @@ export type AggregatedBin = { * - The number of data points * - The group that each data point belongs to, by mapping each data point to a _binId_ (integer or array of integers) * - The values to aggregate, by mapping each data point in each channel to one _value_ (number) - * - The method (_aggregationOperation_) to reduce a list of values to one number, such as SUM + * - The method (_operation_) to reduce a list of values to one number, such as SUM * * And yields the following outputs: - * - The aggregated values (_result_) as a list of numbers for each channel, comprised of one number per bin + * - A list of _binId_ that data points get sorted into + * - The aggregated values (_result_) as a list of numbers, comprised of one number per bin per channel * - The [min, max] among all aggregated values (_domain_) for each channel * */ diff --git a/modules/aggregation-layers/src/aggregation-layer-v9/cpu-aggregator/aggregate.ts b/modules/aggregation-layers/src/common/aggregator/cpu-aggregator/aggregate.ts similarity index 82% rename from modules/aggregation-layers/src/aggregation-layer-v9/cpu-aggregator/aggregate.ts rename to modules/aggregation-layers/src/common/aggregator/cpu-aggregator/aggregate.ts index 3afdfa7d0da..396f7da022e 100644 --- a/modules/aggregation-layers/src/aggregation-layer-v9/cpu-aggregator/aggregate.ts +++ b/modules/aggregation-layers/src/common/aggregator/cpu-aggregator/aggregate.ts @@ -1,7 +1,13 @@ import type {Bin} from './cpu-aggregator'; import type {AggregationOperation} from '../aggregator'; -type AggregationFunc = (pointIndices: number[], getValue: (index: number) => number) => number; +/** A reducer function that takes a list of data points and outputs one measurement */ +export type AggregationFunc = ( + /** Indices of the points */ + pointIndices: number[], + /** Accessor to the value for each point */ + getValue: (index: number) => number +) => number; const count: AggregationFunc = pointIndices => { return pointIndices.length; @@ -44,7 +50,7 @@ const max: AggregationFunc = (pointIndices, getValue) => { return result; }; -const AGGREGATION_FUNC: Record = { +export const BUILT_IN_OPERATIONS: Record = { COUNT: count, SUM: sum, MEAN: mean, @@ -67,7 +73,7 @@ export function aggregate({ /** Given the index of a data point, returns its value */ getValue: (index: number) => number; /** Method used to reduce a list of values to one number */ - operation: AggregationOperation; + operation: AggregationFunc; /** Array to write the output into */ target?: Float32Array | null; }): { @@ -80,11 +86,9 @@ export function aggregate({ let min = Infinity; let max = -Infinity; - const aggregationFunc = AGGREGATION_FUNC[operation]; - for (let j = 0; j < bins.length; j++) { const {points} = bins[j]; - target[j] = aggregationFunc(points, getValue); + target[j] = operation(points, getValue); if (target[j] < min) min = target[j]; if (target[j] > max) max = target[j]; } diff --git a/modules/aggregation-layers/src/aggregation-layer-v9/cpu-aggregator/cpu-aggregator.ts b/modules/aggregation-layers/src/common/aggregator/cpu-aggregator/cpu-aggregator.ts similarity index 85% rename from modules/aggregation-layers/src/aggregation-layer-v9/cpu-aggregator/cpu-aggregator.ts rename to modules/aggregation-layers/src/common/aggregator/cpu-aggregator/cpu-aggregator.ts index 55ffc7a6d06..f208334bdbc 100644 --- a/modules/aggregation-layers/src/aggregation-layer-v9/cpu-aggregator/cpu-aggregator.ts +++ b/modules/aggregation-layers/src/common/aggregator/cpu-aggregator/cpu-aggregator.ts @@ -1,7 +1,7 @@ import type {Aggregator, AggregationProps, AggregatedBin} from '../aggregator'; import {_deepEqual as deepEqual, BinaryAttribute} from '@deck.gl/core'; import {sortBins, packBinIds} from './sort-bins'; -import {aggregate} from './aggregate'; +import {aggregate, AggregationFunc, BUILT_IN_OPERATIONS} from './aggregate'; import {VertexAccessor, evaluateVertexAccessor} from './vertex-accessor'; /** Options used to construct a new CPUAggregator */ @@ -9,9 +9,7 @@ export type CPUAggregatorProps = { /** Size of bin IDs */ dimensions: number; /** Accessor to map each data point to a bin ID. - * If dimensions=1, bin ID should be a number; - * If dimensions>1, bin ID should be an array with [dimensions] elements; - * The data point will be skipped if bin ID is null. + * Bin ID should be an array with [dimensions] elements; or null if the data point should be skipped */ getBin: VertexAccessor; /** Accessor to map each data point to a weight value, defined per channel */ @@ -19,7 +17,10 @@ export type CPUAggregatorProps = { } & Partial; /** Props used to run CPU aggregation, can be changed at any time */ -type CPUAggregationProps = AggregationProps & {}; +type CPUAggregationProps = AggregationProps & { + /** Custom callback to aggregate points, overrides the built-in operations */ + customOperations: (AggregationFunc | null | undefined)[]; +}; export type Bin = { id: number[]; @@ -56,6 +57,7 @@ export class CPUAggregator implements Aggregator { binOptions: {}, pointCount: 0, operations: [], + customOperations: [], attributes: {} }; this.needsUpdate = true; @@ -84,6 +86,15 @@ export class CPUAggregator implements Aggregator { } } } + if (props.customOperations) { + for (let channel = 0; channel < this.channelCount; channel++) { + if ( + Boolean(props.customOperations[channel]) !== Boolean(oldProps.customOperations[channel]) + ) { + this.setNeedsUpdate(channel); + } + } + } if (props.pointCount !== undefined && props.pointCount !== oldProps.pointCount) { this.setNeedsUpdate(); } @@ -129,6 +140,9 @@ export class CPUAggregator implements Aggregator { } for (let channel = 0; channel < this.channelCount; channel++) { if (this.needsUpdate === true || this.needsUpdate[channel]) { + const operation = + this.props.customOperations[channel] || + BUILT_IN_OPERATIONS[this.props.operations[channel]]; const {value, domain} = aggregate({ bins: this.bins, getValue: evaluateVertexAccessor( @@ -136,11 +150,12 @@ export class CPUAggregator implements Aggregator { this.props.attributes, undefined ), - operation: this.props.operations[channel], + operation, // Reuse allocated typed array target: this.results[channel]?.value }); this.results[channel] = {value, domain, type: 'float32', size: 1}; + this.props.onUpdate?.({channel}); } } this.needsUpdate = false; diff --git a/modules/aggregation-layers/src/aggregation-layer-v9/cpu-aggregator/sort-bins.ts b/modules/aggregation-layers/src/common/aggregator/cpu-aggregator/sort-bins.ts similarity index 100% rename from modules/aggregation-layers/src/aggregation-layer-v9/cpu-aggregator/sort-bins.ts rename to modules/aggregation-layers/src/common/aggregator/cpu-aggregator/sort-bins.ts diff --git a/modules/aggregation-layers/src/aggregation-layer-v9/cpu-aggregator/vertex-accessor.ts b/modules/aggregation-layers/src/common/aggregator/cpu-aggregator/vertex-accessor.ts similarity index 100% rename from modules/aggregation-layers/src/aggregation-layer-v9/cpu-aggregator/vertex-accessor.ts rename to modules/aggregation-layers/src/common/aggregator/cpu-aggregator/vertex-accessor.ts diff --git a/modules/aggregation-layers/src/common/aggregator/gpu-aggregator/aggregation-transform-uniforms.ts b/modules/aggregation-layers/src/common/aggregator/gpu-aggregator/aggregation-transform-uniforms.ts new file mode 100644 index 00000000000..2de5e58d779 --- /dev/null +++ b/modules/aggregation-layers/src/common/aggregator/gpu-aggregator/aggregation-transform-uniforms.ts @@ -0,0 +1,31 @@ +import {NumberArray3, NumberArray4} from '@math.gl/core'; +import {ShaderModule} from '@luma.gl/shadertools'; +import {Texture} from '@luma.gl/core'; + +const uniformBlock = /* glsl */ `\ +uniform aggregatorTransformUniforms { + ivec4 binIdRange; + bvec3 isCount; + bvec3 isMean; + float naN; +} aggregatorTransform; +`; + +export type AggregatorTransformProps = { + binIdRange: NumberArray4; + isCount: NumberArray3; + isMean: NumberArray3; + naN: number; + bins: Texture; +}; + +export const aggregatorTransformUniforms = { + name: 'aggregatorTransform', + vs: uniformBlock, + uniformTypes: { + binIdRange: 'vec4', + isCount: 'vec3', + isMean: 'vec3', + naN: 'f32' + } +} as const satisfies ShaderModule; diff --git a/modules/aggregation-layers/src/common/aggregator/gpu-aggregator/bin-sorter-uniforms.ts b/modules/aggregation-layers/src/common/aggregator/gpu-aggregator/bin-sorter-uniforms.ts new file mode 100644 index 00000000000..72adc9b583a --- /dev/null +++ b/modules/aggregation-layers/src/common/aggregator/gpu-aggregator/bin-sorter-uniforms.ts @@ -0,0 +1,23 @@ +import {NumberArray2, NumberArray4} from '@math.gl/core'; +import {ShaderModule} from '@luma.gl/shadertools'; + +const uniformBlock = /* glsl */ `\ +uniform binSorterUniforms { + ivec4 binIdRange; + ivec2 targetSize; +} binSorter; +`; + +export type BinSorterProps = { + binIdRange: NumberArray4; + targetSize: NumberArray2; +}; + +export const binSorterUniforms = { + name: 'binSorter', + vs: uniformBlock, + uniformTypes: { + binIdRange: 'vec4', + targetSize: 'vec2' + } +} as const satisfies ShaderModule; diff --git a/modules/aggregation-layers/src/aggregation-layer-v9/gpu-aggregator/utils.ts b/modules/aggregation-layers/src/common/aggregator/gpu-aggregator/utils.ts similarity index 71% rename from modules/aggregation-layers/src/aggregation-layer-v9/gpu-aggregator/utils.ts rename to modules/aggregation-layers/src/common/aggregator/gpu-aggregator/utils.ts index 51d34d7cb48..fce392beb61 100644 --- a/modules/aggregation-layers/src/aggregation-layer-v9/gpu-aggregator/utils.ts +++ b/modules/aggregation-layers/src/common/aggregator/gpu-aggregator/utils.ts @@ -1,11 +1,5 @@ import type {Device, Framebuffer} from '@luma.gl/core'; -/** - * Marks GLSL shaders for syntax highlighting: glsl`...` - * Install https://marketplace.visualstudio.com/items?itemName=boyswan.glsl-literal - */ -export const glsl = (s: TemplateStringsArray) => `${s}`; - /** * Create a float texture to store aggregation result */ diff --git a/modules/aggregation-layers/src/aggregation-layer-v9/gpu-aggregator/webgl-aggregation-transform.ts b/modules/aggregation-layers/src/common/aggregator/gpu-aggregator/webgl-aggregation-transform.ts similarity index 75% rename from modules/aggregation-layers/src/aggregation-layer-v9/gpu-aggregator/webgl-aggregation-transform.ts rename to modules/aggregation-layers/src/common/aggregator/gpu-aggregator/webgl-aggregation-transform.ts index 1f438b29770..60f6e228b04 100644 --- a/modules/aggregation-layers/src/aggregation-layer-v9/gpu-aggregator/webgl-aggregation-transform.ts +++ b/modules/aggregation-layers/src/common/aggregator/gpu-aggregator/webgl-aggregation-transform.ts @@ -1,11 +1,16 @@ import {BufferTransform} from '@luma.gl/engine'; -import {glsl, createRenderTarget} from './utils'; +import {createRenderTarget} from './utils'; import type {Device, Framebuffer, Buffer, Texture} from '@luma.gl/core'; import type {WebGLAggregatorProps} from './webgl-aggregator'; import type {AggregationOperation} from '../aggregator'; import {TEXTURE_WIDTH} from './webgl-bin-sorter'; +import { + AggregatorTransformProps, + aggregatorTransformUniforms +} from './aggregation-transform-uniforms'; +import {NumberArray3} from '@math.gl/core'; const MAX_FLOAT32 = 3e38; @@ -30,6 +35,9 @@ export class WebGLAggregationTransform { this.device = device; this.channelCount = props.channelCount; this.transform = createTransform(device, props); + // Passed in as uniform because 1) there is no GLSL symbol for NaN 2) any expression that exploits undefined behavior to produces NaN + // will subject to platform differences and shader optimization + this.transform.model.shaderInputs.setProps({aggregatorTransform: {naN: NaN}}); this.domainFBO = createRenderTarget(device, 2, 1); } @@ -58,14 +66,15 @@ export class WebGLAggregationTransform { setDimensions(binCount: number, binIdRange: [number, number][]) { const {model, transformFeedback} = this.transform; model.setVertexCount(binCount); - model.setUniforms({ + const aggregatorTransformProps: Partial = { binIdRange: [ binIdRange[0][0], binIdRange[0][1], binIdRange[1]?.[0] || 0, binIdRange[1]?.[1] || 0 ] - }); + }; + model.shaderInputs.setProps({aggregatorTransform: aggregatorTransformProps}); // Only destroy existing buffer if it is not large enough const binBufferByteLength = binCount * binIdRange.length * 4; @@ -90,11 +99,14 @@ export class WebGLAggregationTransform { const transform = this.transform; const target = this.domainFBO; - transform.model.setUniforms({ - isCount: Array.from({length: 3}, (_, i) => (operations[i] === 'COUNT' ? 1 : 0)), - isMean: Array.from({length: 3}, (_, i) => (operations[i] === 'MEAN' ? 1 : 0)) - }); - transform.model.setBindings({bins}); + const isCount = [0, 1, 2].map(i => (operations[i] === 'COUNT' ? 1 : 0)); + const isMean = [0, 1, 2].map(i => (operations[i] === 'MEAN' ? 1 : 0)); + const aggregatorTransformProps: Partial = { + isCount: isCount as NumberArray3, + isMean: isMean as NumberArray3, + bins + }; + transform.model.shaderInputs.setProps({aggregatorTransform: aggregatorTransformProps}); transform.run({ id: 'gpu-aggregation-domain', @@ -113,14 +125,10 @@ export class WebGLAggregationTransform { } function createTransform(device: Device, props: WebGLAggregatorProps): BufferTransform { - const vs = glsl`\ + const vs = /* glsl */ `\ #version 300 es #define SHADER_NAME gpu-aggregation-domain-vertex -uniform ivec4 binIdRange; -uniform bvec3 isCount; -uniform bvec3 isMean; -uniform float naN; uniform sampler2D bins; #if NUM_DIMS == 1 @@ -130,11 +138,11 @@ out vec2 binIds; #endif #if NUM_CHANNELS == 1 -out float values; +flat out float values; #elif NUM_CHANNELS == 2 -out vec2 values; +flat out vec2 values; #else -out vec3 values; +flat out vec3 values; #endif void main() { @@ -142,21 +150,21 @@ void main() { int col = gl_VertexID - row * SAMPLER_WIDTH; vec4 weights = texelFetch(bins, ivec2(col, row), 0); vec3 value3 = mix( - mix(weights.rgb, vec3(weights.a), isCount), + mix(weights.rgb, vec3(weights.a), aggregatorTransform.isCount), weights.rgb / max(weights.a, 1.0), - isMean + aggregatorTransform.isMean ); if (weights.a == 0.0) { - value3 = vec3(naN); + value3 = vec3(aggregatorTransform.naN); } #if NUM_DIMS == 1 - binIds = float(gl_VertexID + binIdRange.x); + binIds = float(gl_VertexID + aggregatorTransform.binIdRange.x); #else - int y = gl_VertexID / (binIdRange.y - binIdRange.x); - int x = gl_VertexID - y * (binIdRange.y - binIdRange.x); - binIds.y = float(y + binIdRange.z); - binIds.x = float(x + binIdRange.x); + int y = gl_VertexID / (aggregatorTransform.binIdRange.y - aggregatorTransform.binIdRange.x); + int x = gl_VertexID - y * (aggregatorTransform.binIdRange.y - aggregatorTransform.binIdRange.x); + binIds.y = float(y + aggregatorTransform.binIdRange.z); + binIds.x = float(x + aggregatorTransform.binIdRange.x); #endif #if NUM_CHANNELS == 3 @@ -174,18 +182,18 @@ void main() { } `; - const fs = glsl`\ + const fs = /* glsl */ `\ #version 300 es #define SHADER_NAME gpu-aggregation-domain-fragment precision highp float; #if NUM_CHANNELS == 1 -in float values; +flat in float values; #elif NUM_CHANNELS == 2 -in vec2 values; +flat in vec2 values; #else -in vec3 values; +flat in vec3 values; #endif out vec4 fragColor; @@ -219,7 +227,9 @@ void main() { vs, fs, topology: 'point-list', + modules: [aggregatorTransformUniforms], parameters: { + blend: true, blendColorSrcFactor: 'one', blendColorDstFactor: 'one', blendColorOperation: 'max', @@ -232,11 +242,6 @@ void main() { NUM_CHANNELS: props.channelCount, SAMPLER_WIDTH: TEXTURE_WIDTH }, - uniforms: { - // Passed in as uniform because 1) there is no GLSL symbol for NaN 2) any expression that exploits undefined behavior to produces NaN - // will subject to platform differences and shader optimization - naN: NaN - }, varyings: ['binIds', 'values'], disableWarnings: true }); diff --git a/modules/aggregation-layers/src/aggregation-layer-v9/gpu-aggregator/webgl-aggregator.ts b/modules/aggregation-layers/src/common/aggregator/gpu-aggregator/webgl-aggregator.ts similarity index 96% rename from modules/aggregation-layers/src/aggregation-layer-v9/gpu-aggregator/webgl-aggregator.ts rename to modules/aggregation-layers/src/common/aggregator/gpu-aggregator/webgl-aggregator.ts index 06726bcc13c..88998ffed31 100644 --- a/modules/aggregation-layers/src/aggregation-layer-v9/gpu-aggregator/webgl-aggregator.ts +++ b/modules/aggregation-layers/src/common/aggregator/gpu-aggregator/webgl-aggregator.ts @@ -200,7 +200,7 @@ export class WebGLAggregator implements Aggregator { if (!deepEqual(props.binOptions, oldProps.binOptions, 2)) { this.setNeedsUpdate(); } - this.binSorter.setModelProps({uniforms: props.binOptions}); + this.binSorter.model.shaderInputs.setProps({binOptions: props.binOptions}); } if (props.attributes) { const attributeBuffers: Record = {}; @@ -252,7 +252,7 @@ export class WebGLAggregator implements Aggregator { } if (opts.moduleSettings) { - this.binSorter.setModelProps(opts); + this.binSorter.setModelProps({moduleSettings: opts.moduleSettings}); } const {operations} = this.props; @@ -264,7 +264,12 @@ export class WebGLAggregator implements Aggregator { // Read to buffer and calculate domain this.aggregationTransform.update(this.binSorter.texture, operations); - this.needsUpdate.fill(false); + for (let i = 0; i < this.channelCount; i++) { + if (this.needsUpdate[i]) { + this.needsUpdate[i] = false; + this.props.onUpdate?.({channel: i}); + } + } // Uncomment to debug // console.log('binsFBO', new Float32Array(this.device.readPixelsToArrayWebGL(this.binSorter.texture!).buffer)); diff --git a/modules/aggregation-layers/src/aggregation-layer-v9/gpu-aggregator/webgl-bin-sorter.ts b/modules/aggregation-layers/src/common/aggregator/gpu-aggregator/webgl-bin-sorter.ts similarity index 85% rename from modules/aggregation-layers/src/aggregation-layer-v9/gpu-aggregator/webgl-bin-sorter.ts rename to modules/aggregation-layers/src/common/aggregator/gpu-aggregator/webgl-bin-sorter.ts index 84d18e4277b..c7b431eab21 100644 --- a/modules/aggregation-layers/src/aggregation-layer-v9/gpu-aggregator/webgl-bin-sorter.ts +++ b/modules/aggregation-layers/src/common/aggregator/gpu-aggregator/webgl-bin-sorter.ts @@ -1,9 +1,10 @@ import {Model, ModelProps} from '@luma.gl/engine'; -import {glsl, createRenderTarget} from './utils'; +import {createRenderTarget} from './utils'; import type {Device, Framebuffer, Texture} from '@luma.gl/core'; import type {WebGLAggregatorProps} from './webgl-aggregator'; import type {AggregationOperation} from '../aggregator'; +import {BinSorterProps, binSorterUniforms} from './bin-sorter-uniforms'; const COLOR_CHANNELS = [0x1, 0x2, 0x4, 0x8]; // GPU color mask RED, GREEN, BLUE, ALPHA const MAX_FLOAT32 = 3e38; @@ -71,7 +72,7 @@ export class WebGLBinSorter { this.binsFBO.resize({width, height}); } - this.model.setUniforms({ + const binSorterProps: BinSorterProps = { binIdRange: [ binIdRange[0][0], binIdRange[0][1], @@ -79,7 +80,8 @@ export class WebGLBinSorter { binIdRange[1]?.[1] || 0 ], targetSize: [this.binsFBO.width, this.binsFBO.height] - }); + }; + this.model.shaderInputs.setProps({binSorter: binSorterProps}); } setModelProps( @@ -89,9 +91,6 @@ export class WebGLBinSorter { > ) { const model = this.model; - if (props.uniforms) { - model.setUniforms(props.uniforms); - } if (props.attributes) { model.setAttributes(props.attributes); } @@ -102,9 +101,17 @@ export class WebGLBinSorter { model.setVertexCount(props.vertexCount); } if (props.moduleSettings) { - // TODO v9.1 - remove after migrate to UBO - model.updateModuleSettings(props.moduleSettings); - model.shaderInputs.setProps({project: props.moduleSettings}); + const {viewport, devicePixelRatio, modelMatrix, coordinateSystem, coordinateOrigin} = + props.moduleSettings; + model.shaderInputs.setProps({ + project: { + viewport, + devicePixelRatio, + modelMatrix, + coordinateSystem, + coordinateOrigin + } + }); } } @@ -149,6 +156,7 @@ export class WebGLBinSorter { clearStencil: false }); model.setParameters({ + blend: true, blendColorSrcFactor: 'one', blendColorDstFactor: 'one', blendAlphaSrcFactor: 'one', @@ -180,14 +188,14 @@ function createModel(device: Device, props: WebGLAggregatorProps): Model { if (props.dimensions === 2) { // If user provides 2d bin IDs, convert them to 1d indices for data packing - userVs += glsl` + userVs += /* glsl */ ` void getBin(out int binId) { ivec2 binId2; getBin(binId2); - if (binId2.x < binIdRange.x || binId2.x >= binIdRange.y) { + if (binId2.x < binSorter.binIdRange.x || binId2.x >= binSorter.binIdRange.y) { binId = -1; } else { - binId = (binId2.y - binIdRange.z) * (binIdRange.y - binIdRange.x) + binId2.x; + binId = (binId2.y - binSorter.binIdRange.z) * (binSorter.binIdRange.y - binSorter.binIdRange.x) + binId2.x; } } `; @@ -197,9 +205,6 @@ void getBin(out int binId) { #version 300 es #define SHADER_NAME gpu-aggregation-sort-bins-vertex -uniform ivec4 binIdRange; -uniform ivec2 targetSize; - ${userVs} out vec3 v_Value; @@ -207,14 +212,14 @@ out vec3 v_Value; void main() { int binIndex; getBin(binIndex); - binIndex = binIndex - binIdRange.x; + binIndex = binIndex - binSorter.binIdRange.x; if (binIndex < 0) { gl_Position = vec4(0.); return; } - int row = binIndex / targetSize.x; - int col = binIndex - row * targetSize.x; - vec2 position = (vec2(col, row) + 0.5) / vec2(targetSize) * 2.0 - 1.0; + int row = binIndex / binSorter.targetSize.x; + int col = binIndex - row * binSorter.targetSize.x; + vec2 position = (vec2(col, row) + 0.5) / vec2(binSorter.targetSize) * 2.0 - 1.0; gl_Position = vec4(position, 0.0, 1.0); gl_PointSize = 1.0; @@ -227,7 +232,7 @@ void main() { #endif } `; - const fs = glsl`\ + const fs = /* glsl */ `\ #version 300 es #define SHADER_NAME gpu-aggregation-sort-bins-fragment @@ -249,7 +254,7 @@ void main() { `; const model = new Model(device, { bufferLayout: props.bufferLayout, - modules: props.modules, + modules: [...(props.modules || []), binSorterUniforms], defines: {...props.defines, NON_INSTANCED_MODEL: 1, NUM_CHANNELS: props.channelCount}, isInstanced: false, vs, diff --git a/modules/aggregation-layers/src/common/aggregator/index.ts b/modules/aggregation-layers/src/common/aggregator/index.ts new file mode 100644 index 00000000000..2a0553c6cfa --- /dev/null +++ b/modules/aggregation-layers/src/common/aggregator/index.ts @@ -0,0 +1,6 @@ +export {CPUAggregator} from './cpu-aggregator/cpu-aggregator'; +export {WebGLAggregator} from './gpu-aggregator/webgl-aggregator'; + +export type {Aggregator, AggregatedBin, AggregationOperation, AggregationProps} from './aggregator'; +export type {CPUAggregatorProps} from './cpu-aggregator/cpu-aggregator'; +export type {WebGLAggregatorProps} from './gpu-aggregator/webgl-aggregator'; diff --git a/modules/aggregation-layers/src/types.ts b/modules/aggregation-layers/src/common/types.ts similarity index 68% rename from modules/aggregation-layers/src/types.ts rename to modules/aggregation-layers/src/common/types.ts index fc4e117ae76..c2cdfdb4e70 100644 --- a/modules/aggregation-layers/src/types.ts +++ b/modules/aggregation-layers/src/common/types.ts @@ -1,11 +1,13 @@ /** Type assigned to e.g. getColorValue/getElevationValue props in aggregation layers (e.g. CPUGridLayer, HexagonLayer)*/ -export type AggregateAccessor = (args: { +export type AggregateAccessor = ( /** a list of objects whose positions fall inside this cell. */ - objects: DataT[]; + objects: DataT[], objectInfo: { /** the indices of `objects` in the original data. */ indices: number[]; /** the value of the `data` prop */ data: any; - }; -}) => number; + } +) => number; + +export type ScaleType = 'linear' | 'quantize' | 'quantile' | 'ordinal'; diff --git a/modules/aggregation-layers/src/utils/color-utils.ts b/modules/aggregation-layers/src/common/utils/color-utils.ts similarity index 80% rename from modules/aggregation-layers/src/utils/color-utils.ts rename to modules/aggregation-layers/src/common/utils/color-utils.ts index 366547df734..b62aa23806f 100644 --- a/modules/aggregation-layers/src/utils/color-utils.ts +++ b/modules/aggregation-layers/src/common/utils/color-utils.ts @@ -20,6 +20,7 @@ import type {Color} from '@deck.gl/core'; import type {Device, Texture} from '@luma.gl/core'; import type {NumericArray, TypedArray, TypedArrayConstructor} from '@math.gl/types'; +import type {ScaleType} from '../types'; export const defaultColorRange: Color[] = [ [255, 255, 178], @@ -63,15 +64,33 @@ export function colorRangeToFlatArray( return flatArray; } -export function colorRangeToTexture(device: Device, colorRange: Color[] | NumericArray): Texture { +export const COLOR_RANGE_FILTER: Record = { + linear: 'linear', + quantile: 'nearest', + quantize: 'nearest', + ordinal: 'nearest' +} as const; + +export function updateColorRangeTexture(texture: Texture, type: ScaleType) { + texture.setSampler({ + minFilter: COLOR_RANGE_FILTER[type], + magFilter: COLOR_RANGE_FILTER[type] + }); +} + +export function createColorRangeTexture( + device: Device, + colorRange: Color[] | NumericArray, + type: ScaleType = 'linear' +): Texture { const colors = colorRangeToFlatArray(colorRange, false, Uint8Array); return device.createTexture({ format: 'rgba8unorm', mipmaps: false, sampler: { - minFilter: 'linear', - magFilter: 'linear', + minFilter: COLOR_RANGE_FILTER[type], + magFilter: COLOR_RANGE_FILTER[type], addressModeU: 'clamp-to-edge', addressModeV: 'clamp-to-edge' }, diff --git a/modules/aggregation-layers/src/utils/prop-utils.ts b/modules/aggregation-layers/src/common/utils/prop-utils.ts similarity index 100% rename from modules/aggregation-layers/src/utils/prop-utils.ts rename to modules/aggregation-layers/src/common/utils/prop-utils.ts diff --git a/modules/aggregation-layers/src/common/utils/scale-utils.ts b/modules/aggregation-layers/src/common/utils/scale-utils.ts new file mode 100644 index 00000000000..4810b260569 --- /dev/null +++ b/modules/aggregation-layers/src/common/utils/scale-utils.ts @@ -0,0 +1,232 @@ +import type {BinaryAttribute} from '@deck.gl/core'; +import type {ScaleType} from '../types'; + +type ScaleProps = { + scaleType: ScaleType; + /** Trim the lower end of the domain by this percentile. Set to `0` to disable. */ + lowerPercentile: number; + /** Trim the upper end of the domain by this percentile. Set to `100` to disable. */ + upperPercentile: number; +}; + +/** Applies a scale to BinaryAttribute */ +export class AttributeWithScale { + /** Input values accessor. Has either a `value` (CPU aggregation) or a `buffer` (GPU aggregation) */ + private readonly input: BinaryAttribute; + private readonly inputLength: number; + + private props: ScaleProps = { + scaleType: 'linear', + lowerPercentile: 0, + upperPercentile: 100 + }; + + // cached calculations + private _percentile?: {attribute: BinaryAttribute; domain: number[]}; + private _ordinal?: {attribute: BinaryAttribute; domain: number[]}; + + /** Output values accessor */ + attribute: BinaryAttribute; + /** [min, max] of attribute values, or null if unknown */ + domain: [number, number] | null = null; + /** Valid domain if lower/upper percentile are defined */ + cutoff: [number, number] | null = null; + + constructor(input: BinaryAttribute, inputLength: number) { + this.input = input; + this.inputLength = inputLength; + // No processing is needed with the default scale + this.attribute = input; + } + + private getScalePercentile() { + if (!this._percentile) { + const value = getAttributeValue(this.input, this.inputLength); + this._percentile = applyScaleQuantile(value); + } + return this._percentile; + } + + private getScaleOrdinal() { + if (!this._ordinal) { + const value = getAttributeValue(this.input, this.inputLength); + this._ordinal = applyScaleOrdinal(value); + } + return this._ordinal; + } + + /** Returns the [lowerCutoff, upperCutoff] of scaled values, or null if not applicable */ + private getCutoff({ + scaleType, + lowerPercentile, + upperPercentile + }: ScaleProps): [number, number] | null { + if (scaleType === 'quantile') { + return [lowerPercentile, upperPercentile - 1]; + } + + if (lowerPercentile > 0 || upperPercentile < 100) { + const {domain: thresholds} = this.getScalePercentile(); + let lowValue = thresholds[Math.floor(lowerPercentile) - 1] ?? -Infinity; + let highValue = thresholds[Math.floor(upperPercentile) - 1] ?? Infinity; + + if (scaleType === 'ordinal') { + const {domain: sortedUniqueValues} = this.getScaleOrdinal(); + lowValue = sortedUniqueValues.findIndex(x => x >= lowValue); + highValue = sortedUniqueValues.findIndex(x => x > highValue) - 1; + if (highValue === -2) { + highValue = sortedUniqueValues.length - 1; + } + } + return [lowValue, highValue]; + } + + return null; + } + + update(props: ScaleProps) { + const oldProps = this.props; + + if (props.scaleType !== oldProps.scaleType) { + switch (props.scaleType) { + case 'quantile': { + const {attribute} = this.getScalePercentile(); + this.attribute = attribute; + this.domain = [0, 99]; + break; + } + case 'ordinal': { + const {attribute, domain} = this.getScaleOrdinal(); + this.attribute = attribute; + this.domain = [0, domain.length - 1]; + break; + } + + default: + this.attribute = this.input; + this.domain = null; + } + } + if ( + props.scaleType !== oldProps.scaleType || + props.lowerPercentile !== oldProps.lowerPercentile || + props.upperPercentile !== oldProps.upperPercentile + ) { + this.cutoff = this.getCutoff(props); + } + this.props = props; + return this; + } +} + +/** + * Transform an array of values to ordinal indices + */ +export function applyScaleOrdinal(values: Float32Array): { + attribute: BinaryAttribute; + domain: number[]; +} { + const uniqueValues = new Set(); + for (const x of values) { + if (Number.isFinite(x)) { + uniqueValues.add(x); + } + } + const sortedUniqueValues = Array.from(uniqueValues).sort(); + const domainMap = new Map(); + for (let i = 0; i < sortedUniqueValues.length; i++) { + domainMap.set(sortedUniqueValues[i], i); + } + + return { + attribute: { + value: values.map(x => (Number.isFinite(x) ? domainMap.get(x) : NaN)), + type: 'float32', + size: 1 + }, + domain: sortedUniqueValues + }; +} + +/** + * Transform an array of values to percentiles + */ +export function applyScaleQuantile( + values: Float32Array, + rangeLength = 100 +): { + attribute: BinaryAttribute; + domain: number[]; +} { + const sortedValues = Array.from(values).filter(Number.isFinite).sort(ascending); + let i = 0; + const n = Math.max(1, rangeLength); + const thresholds: number[] = new Array(n - 1); + while (++i < n) { + thresholds[i - 1] = threshold(sortedValues, i / n); + } + return { + attribute: { + value: values.map(x => (Number.isFinite(x) ? bisectRight(thresholds, x) : NaN)), + type: 'float32', + size: 1 + }, + domain: thresholds + }; +} + +function getAttributeValue(attribute: BinaryAttribute, length: number): Float32Array { + const elementStride = (attribute.stride ?? 4) / 4; + const elementOffset = (attribute.offset ?? 0) / 4; + let value = attribute.value as Float32Array; + if (!value) { + const bytes = attribute.buffer?.readSyncWebGL(0, elementStride * 4 * length); + if (bytes) { + value = new Float32Array(bytes.buffer); + attribute.value = value; + } + } + + if (elementStride === 1) { + return value.subarray(0, length); + } + const result = new Float32Array(length); + for (let i = 0; i < length; i++) { + result[i] = value[i * elementStride + elementOffset]; + } + return result; +} + +function ascending(a: number, b: number): number { + return a - b; +} + +function threshold(domain: number[], fraction: number): number { + const domainLength = domain.length; + if (fraction <= 0 || domainLength < 2) { + return domain[0]; + } + if (fraction >= 1) { + return domain[domainLength - 1]; + } + + const domainFraction = (domainLength - 1) * fraction; + const lowIndex = Math.floor(domainFraction); + const low = domain[lowIndex]; + const high = domain[lowIndex + 1]; + return low + (high - low) * (domainFraction - lowIndex); +} + +function bisectRight(a: number[], x: number): number { + let lo = 0; + let hi = a.length; + while (lo < hi) { + const mid = (lo + hi) >>> 1; + if (a[mid] > x) { + hi = mid; + } else { + lo = mid + 1; + } + } + return lo; +} diff --git a/modules/aggregation-layers/src/contour-layer/bin-options-uniforms.ts b/modules/aggregation-layers/src/contour-layer/bin-options-uniforms.ts new file mode 100644 index 00000000000..b79f84f4596 --- /dev/null +++ b/modules/aggregation-layers/src/contour-layer/bin-options-uniforms.ts @@ -0,0 +1,22 @@ +import type {ShaderModule} from '@luma.gl/shadertools'; + +const uniformBlock = /* glsl */ `\ +uniform binOptionsUniforms { + vec2 cellOriginCommon; + vec2 cellSizeCommon; +} binOptions; +`; + +export type BinOptions = { + cellOriginCommon: [number, number]; + cellSizeCommon: [number, number]; +}; + +export const binOptionsUniforms = { + name: 'binOptions', + vs: uniformBlock, + uniformTypes: { + cellOriginCommon: 'vec2', + cellSizeCommon: 'vec2' + } +} as const satisfies ShaderModule; diff --git a/modules/aggregation-layers/src/contour-layer/contour-layer.ts b/modules/aggregation-layers/src/contour-layer/contour-layer.ts index 9ff03bf4fde..ce3b3ff454f 100644 --- a/modules/aggregation-layers/src/contour-layer/contour-layer.ts +++ b/modules/aggregation-layers/src/contour-layer/contour-layer.ts @@ -1,57 +1,45 @@ -// Copyright (c) 2015 - 2018 Uber Technologies, Inc. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -import {LineLayer, SolidPolygonLayer} from '@deck.gl/layers'; -import {generateContours} from './contour-utils'; +// deck.gl +// SPDX-License-Identifier: MIT +// Copyright (c) vis.gl contributors + import { Accessor, - AccessorFunction, - Color, - log, + COORDINATE_SYSTEM, + GetPickingInfoParams, + project32, + LayersList, + PickingInfo, Position, + Viewport, + _deepEqual, UpdateParameters, - DefaultProps, - LayersList + DefaultProps } from '@deck.gl/core'; - -import GPUGridAggregator from '../utils/gpu-grid-aggregation/gpu-grid-aggregator'; -import {AGGREGATION_OPERATION, getValueFunc} from '../utils/aggregation-operation-utils'; -import {getBoundingBox, getGridParams} from '../utils/grid-aggregation-utils'; -import GridAggregationLayer, {GridAggregationLayerProps} from '../grid-aggregation-layer'; +import {PathLayer, SolidPolygonLayer} from '@deck.gl/layers'; +import {WebGLAggregator, CPUAggregator, AggregationOperation} from '../common/aggregator/index'; +import AggregationLayer from '../common/aggregation-layer'; +import {AggregationLayerProps} from '../common/aggregation-layer'; +import {generateContours, Contour, ContourLine, ContourPolygon} from './contour-utils'; +import {getAggregatorValueReader} from './value-reader'; +import {Matrix4} from '@math.gl/core'; +import {BinOptions, binOptionsUniforms} from './bin-options-uniforms'; const DEFAULT_COLOR = [255, 255, 255, 255]; const DEFAULT_STROKE_WIDTH = 1; -const DEFAULT_THRESHOLD = 1; const defaultProps: DefaultProps = { // grid aggregation - cellSize: {type: 'number', min: 1, max: 1000, value: 1000}, + cellSize: {type: 'number', min: 1, value: 1000}, + gridOrigin: {type: 'array', compare: true, value: [0, 0]}, getPosition: {type: 'accessor', value: (x: any) => x.position}, getWeight: {type: 'accessor', value: 1}, - gpuAggregation: false, // TODO(v9): Re-enable GPU aggregation. + gpuAggregation: true, aggregation: 'SUM', // contour lines contours: { type: 'object', - value: [{threshold: DEFAULT_THRESHOLD}], + value: [{threshold: 1}], optional: true, compare: 3 }, @@ -59,33 +47,27 @@ const defaultProps: DefaultProps = { zOffset: 0.005 }; -const POSITION_ATTRIBUTE_NAME = 'positions'; - -const DIMENSIONS = { - data: { - props: ['cellSize'] - }, - weights: { - props: ['aggregation'], - accessors: ['getWeight'] - } -}; - -/** All properties supported by ContourLayer. */ +/** All properties supported by GridLayer. */ export type ContourLayerProps = _ContourLayerProps & - GridAggregationLayerProps; + AggregationLayerProps; -/** Properties added by ContourLayer. */ -export type _ContourLayerProps = { +/** Properties added by GridLayer. */ +type _ContourLayerProps = { /** * Size of each cell in meters. * @default 1000 */ cellSize?: number; + /** + * The grid origin + * @default [0, 0] + */ + gridOrigin?: [number, number]; + /** * When set to true, aggregation is performed on GPU, provided other conditions are met. - * @default true + * @default false */ gpuAggregation?: boolean; @@ -93,35 +75,13 @@ export type _ContourLayerProps = { * Defines the type of aggregation operation, valid values are 'SUM', 'MEAN', 'MIN' and 'MAX'. * @default 'SUM' */ - aggregation?: 'SUM' | 'MEAN' | 'MIN' | 'MAX'; + aggregation?: AggregationOperation; /** * Definition of contours to be drawn. * @default [{threshold: 1}] */ - contours: { - /** - * Isolines: `threshold` value must be a single `Number`, Isolines are generated based on this threshold value. - * - * Isobands: `threshold` value must be an Array of two `Number`s. Isobands are generated using `[threshold[0], threshold[1])` as threshold range, i.e area that has values `>= threshold[0]` and `< threshold[1]` are rendered with corresponding color. NOTE: `threshold[0]` is inclusive and `threshold[1]` is not inclusive. - */ - threshold: number | number[]; - - /** - * RGBA color array to be used to render the contour. - * @default [255, 255, 255, 255] - */ - color?: Color; - - /** - * Applicable for `Isoline`s only, width of the Isoline in pixels. - * @default 1 - */ - strokeWidth?: number; - - /** Defines z order of the contour. */ - zIndex?: number; - }[]; + contours?: Contour[]; /** * A very small z offset that is added for each vertex of a contour (Isoline or Isoband). @@ -133,7 +93,7 @@ export type _ContourLayerProps = { * Method called to retrieve the position of each object. * @default object => object.position */ - getPosition?: AccessorFunction; + getPosition?: Accessor; /** * The weight of each object. @@ -142,243 +102,322 @@ export type _ContourLayerProps = { getWeight?: Accessor; }; -/** Aggregate data into iso-lines or iso-bands for a given threshold and cell size. */ -export default class ContourLayer< - DataT = any, - ExtraPropsT extends {} = {} -> extends GridAggregationLayer>> { +export type ContourLayerPickingInfo = PickingInfo<{ + contour: Contour; +}>; + +/** Aggregate data into a grid-based heatmap. The color and height of a cell are determined based on the objects it contains. */ +export default class GridLayer extends AggregationLayer< + DataT, + ExtraPropsT & Required<_ContourLayerProps> +> { static layerName = 'ContourLayer'; static defaultProps = defaultProps; - state!: GridAggregationLayer['state'] & { - contourData: { - contourSegments: { - start: number[]; - end: number[]; - contour: any; - }[]; - contourPolygons: { - vertices: number[][]; - contour: any; - }[]; + state!: AggregationLayer['state'] & + BinOptions & { + // Aggregator result + aggregatedValueReader?: (x: number, y: number) => number; + contourData?: { + lines: ContourLine[]; + polygons: ContourPolygon[]; + }; + + binIdRange: [number, number][]; + aggregatorViewport: Viewport; }; - thresholdData: any; - }; - initializeState(): void { - super.initializeAggregationLayer({ - dimensions: DIMENSIONS - }); - this.setState({ - contourData: {}, - projectPoints: false, - weights: { - count: { - size: 1, - operation: AGGREGATION_OPERATION.SUM - } - } + getAggregatorType(): string { + return this.props.gpuAggregation && WebGLAggregator.isSupported(this.context.device) + ? 'gpu' + : 'cpu'; + } + + createAggregator(type: string): WebGLAggregator | CPUAggregator { + if (type === 'cpu') { + return new CPUAggregator({ + dimensions: 2, + getBin: { + sources: ['positions'], + getValue: ({positions}: {positions: number[]}, index: number, opts: BinOptions) => { + const viewport = this.state.aggregatorViewport; + // project to common space + const p = viewport.projectPosition(positions); + const {cellSizeCommon, cellOriginCommon} = opts; + return [ + Math.floor((p[0] - cellOriginCommon[0]) / cellSizeCommon[0]), + Math.floor((p[1] - cellOriginCommon[1]) / cellSizeCommon[1]) + ]; + } + }, + getValue: [{sources: ['counts'], getValue: ({counts}) => counts}], + onUpdate: this._onAggregationUpdate.bind(this) + }); + } + return new WebGLAggregator(this.context.device, { + dimensions: 2, + channelCount: 1, + bufferLayout: this.getAttributeManager()!.getBufferLayouts({isInstanced: false}), + ...super.getShaders({ + modules: [project32, binOptionsUniforms], + vs: /* glsl */ ` + in vec3 positions; + in vec3 positions64Low; + in float counts; + + void getBin(out ivec2 binId) { + vec3 positionCommon = project_position(positions, positions64Low); + vec2 gridCoords = floor(positionCommon.xy / binOptions.cellSizeCommon); + binId = ivec2(gridCoords); + } + void getValue(out float value) { + value = counts; + } + ` + }), + onUpdate: this._onAggregationUpdate.bind(this) }); + } + + initializeState() { + super.initializeState(); + const attributeManager = this.getAttributeManager()!; attributeManager.add({ - [POSITION_ATTRIBUTE_NAME]: { + positions: { size: 3, accessor: 'getPosition', type: 'float64', fp64: this.use64bitPositions() }, - // this attribute is used in gpu aggregation path only - count: {size: 3, accessor: 'getWeight'} + counts: {size: 1, accessor: 'getWeight'} + }); + } + + updateState(params: UpdateParameters) { + const aggregatorChanged = super.updateState(params); + + const {props, oldProps, changeFlags} = params; + const {aggregator} = this.state; + if ( + aggregatorChanged || + changeFlags.dataChanged || + props.cellSize !== oldProps.cellSize || + !_deepEqual(props.gridOrigin, oldProps.gridOrigin, 1) || + props.aggregation !== oldProps.aggregation + ) { + this._updateBinOptions(); + const {cellSizeCommon, cellOriginCommon, binIdRange} = this.state; + + aggregator.setProps({ + // @ts-expect-error only used by GPUAggregator + binIdRange, + pointCount: this.getNumInstances(), + operations: [props.aggregation], + binOptions: { + cellSizeCommon, + cellOriginCommon + } + }); + } + + if (!_deepEqual(oldProps.contours, props.contours, 2)) { + // Recalculate contours + this.setState({contourData: null}); + } + + return aggregatorChanged; + } + + private _updateBinOptions() { + const bounds = this.getBounds(); + const cellSizeCommon: [number, number] = [1, 1]; + let cellOriginCommon: [number, number] = [0, 0]; + const binIdRange: [number, number][] = [ + [0, 1], + [0, 1] + ]; + let viewport = this.context.viewport; + + if (bounds && Number.isFinite(bounds[0][0])) { + let centroid = [(bounds[0][0] + bounds[1][0]) / 2, (bounds[0][1] + bounds[1][1]) / 2]; + const {cellSize, gridOrigin} = this.props; + const {unitsPerMeter} = viewport.getDistanceScales(centroid); + cellSizeCommon[0] = unitsPerMeter[0] * cellSize; + cellSizeCommon[1] = unitsPerMeter[1] * cellSize; + + // Offset common space to center at the origin of the grid cell where the data center is in + // This improves precision without affecting the cell positions + const centroidCommon = viewport.projectFlat(centroid); + cellOriginCommon = [ + Math.floor((centroidCommon[0] - gridOrigin[0]) / cellSizeCommon[0]) * cellSizeCommon[0] + + gridOrigin[0], + Math.floor((centroidCommon[1] - gridOrigin[1]) / cellSizeCommon[1]) * cellSizeCommon[1] + + gridOrigin[1] + ]; + centroid = viewport.unprojectFlat(cellOriginCommon); + + const ViewportType = viewport.constructor as any; + // We construct a viewport for the GPU aggregator's project module + // This viewport is determined by data + // removes arbitrary precision variance that depends on initial view state + viewport = viewport.isGeospatial + ? new ViewportType({longitude: centroid[0], latitude: centroid[1], zoom: 12}) + : new Viewport({position: [centroid[0], centroid[1], 0], zoom: 12}); + + // Round to the nearest 32-bit float to match CPU and GPU results + cellOriginCommon = [Math.fround(viewport.center[0]), Math.fround(viewport.center[1])]; + + const corners = [ + bounds[0], + bounds[1], + [bounds[0][0], bounds[1][1]], + [bounds[1][0], bounds[0][1]] + ].map(p => viewport.projectFlat(p)); + + const minX = Math.min(...corners.map(p => p[0])); + const minY = Math.min(...corners.map(p => p[1])); + const maxX = Math.max(...corners.map(p => p[0])); + const maxY = Math.max(...corners.map(p => p[1])); + binIdRange[0][0] = Math.floor((minX - cellOriginCommon[0]) / cellSizeCommon[0]); + binIdRange[0][1] = Math.floor((maxX - cellOriginCommon[0]) / cellSizeCommon[0]) + 1; + binIdRange[1][0] = Math.floor((minY - cellOriginCommon[1]) / cellSizeCommon[1]); + binIdRange[1][1] = Math.floor((maxY - cellOriginCommon[1]) / cellSizeCommon[1]) + 1; + } + + this.setState({cellSizeCommon, cellOriginCommon, binIdRange, aggregatorViewport: viewport}); + } + + override draw(opts) { + // Replaces render time viewport with our own + if (opts.moduleParameters.viewport) { + opts.moduleParameters.viewport = this.state.aggregatorViewport; + } + super.draw(opts); + } + + private _onAggregationUpdate() { + const {aggregator, binIdRange} = this.state; + this.setState({ + aggregatedValueReader: getAggregatorValueReader({aggregator, binIdRange, channel: 0}), + contourData: null }); } - updateState(opts: UpdateParameters): void { - super.updateState(opts); - let contoursChanged = false; - const {oldProps, props} = opts; - const {aggregationDirty} = this.state; + private _getContours(): { + lines: ContourLine[]; + polygons: ContourPolygon[]; + } | null { + const {aggregatedValueReader} = this.state; + if (!aggregatedValueReader) { + return null; + } + + if (!this.state.contourData) { + const {binIdRange} = this.state; + const {contours} = this.props; + const contourData = generateContours({ + contours, + getValue: aggregatedValueReader, + xRange: binIdRange[0], + yRange: binIdRange[1] + }); - if (oldProps.contours !== props.contours || oldProps.zOffset !== props.zOffset) { - contoursChanged = true; - this._updateThresholdData(opts.props); + this.state.contourData = contourData; } + return this.state.contourData; + } - if (this.getNumInstances() > 0 && (aggregationDirty || contoursChanged)) { - this._generateContours(); + onAttributeChange(id: string) { + const {aggregator} = this.state; + switch (id) { + case 'positions': + aggregator.setNeedsUpdate(); + + this._updateBinOptions(); + const {cellSizeCommon, cellOriginCommon, binIdRange} = this.state; + aggregator.setProps({ + // @ts-expect-error only used by GPUAggregator + binIdRange, + binOptions: { + cellSizeCommon, + cellOriginCommon + } + }); + break; + + case 'counts': + aggregator.setNeedsUpdate(0); + break; + + default: + // This should not happen } } - renderLayers(): LayersList { - const {contourSegments, contourPolygons} = this.state.contourData; + renderLayers(): LayersList | null { + const contourData = this._getContours(); + if (!contourData) { + return null; + } + const {lines, polygons} = contourData; + const {zOffset} = this.props; + const {cellOriginCommon, cellSizeCommon} = this.state; - const LinesSubLayerClass = this.getSubLayerClass('lines', LineLayer); + const LinesSubLayerClass = this.getSubLayerClass('lines', PathLayer); const BandsSubLayerClass = this.getSubLayerClass('bands', SolidPolygonLayer); + const modelMatrix = new Matrix4() + .translate([cellOriginCommon[0], cellOriginCommon[1], 0]) + .scale([cellSizeCommon[0], cellSizeCommon[1], zOffset]); // Contour lines layer const lineLayer = - contourSegments && - contourSegments.length > 0 && + lines && + lines.length > 0 && new LinesSubLayerClass( this.getSubLayerProps({ id: 'lines' }), { - data: this.state.contourData.contourSegments, - getSourcePosition: d => d.start, - getTargetPosition: d => d.end, - getColor: d => d.contour.color || DEFAULT_COLOR, - getWidth: d => d.contour.strokeWidth || DEFAULT_STROKE_WIDTH + data: lines, + coordinateSystem: COORDINATE_SYSTEM.CARTESIAN, + modelMatrix, + getPath: d => d.vertices, + getColor: d => d.contour.color ?? DEFAULT_COLOR, + getWidth: d => d.contour.strokeWidth ?? DEFAULT_STROKE_WIDTH, + widthUnits: 'pixels' } ); // Contour bands layer const bandsLayer = - contourPolygons && - contourPolygons.length > 0 && + polygons && + polygons.length > 0 && new BandsSubLayerClass( this.getSubLayerProps({ id: 'bands' }), { - data: this.state.contourData.contourPolygons, + data: polygons, + coordinateSystem: COORDINATE_SYSTEM.CARTESIAN, + modelMatrix, getPolygon: d => d.vertices, - getFillColor: d => d.contour.color || DEFAULT_COLOR + getFillColor: d => d.contour.color ?? DEFAULT_COLOR } ); return [lineLayer, bandsLayer]; } - // Aggregation Overrides - - /* eslint-disable max-statements, complexity */ - updateAggregationState(opts: UpdateParameters) { - const {props, oldProps} = opts; - const {cellSize, coordinateSystem} = props; - const {viewport} = this.context; - const cellSizeChanged = oldProps.cellSize !== cellSize; - let gpuAggregation = props.gpuAggregation; - if (this.state.gpuAggregation !== props.gpuAggregation) { - if (gpuAggregation && !GPUGridAggregator.isSupported(this.context.device)) { - log.warn('GPU Grid Aggregation not supported, falling back to CPU')(); - gpuAggregation = false; - } - } - const gpuAggregationChanged = gpuAggregation !== this.state.gpuAggregation; - this.setState({ - gpuAggregation - }); - - const {dimensions} = this.state; - const positionsChanged = this.isAttributeChanged(POSITION_ATTRIBUTE_NAME); - const {data, weights} = dimensions; - - let {boundingBox} = this.state; - if (positionsChanged) { - boundingBox = getBoundingBox(this.getAttributes(), this.getNumInstances()); - this.setState({boundingBox}); - } - if (positionsChanged || cellSizeChanged) { - const {gridOffset, translation, width, height, numCol, numRow} = getGridParams( - boundingBox, - cellSize, - viewport, - coordinateSystem - ); - this.allocateResources(numRow, numCol); - this.setState({ - gridOffset, - boundingBox, - translation, - posOffset: translation.slice(), // Used for CPU aggregation, to offset points - gridOrigin: [-1 * translation[0], -1 * translation[1]], - width, - height, - numCol, - numRow - }); - } - - const aggregationDataDirty = - positionsChanged || - gpuAggregationChanged || - this.isAggregationDirty(opts, { - dimension: data, - compareAll: gpuAggregation // check for all (including extentions props) when using gpu aggregation - }); - const aggregationWeightsDirty = this.isAggregationDirty(opts, { - dimension: weights - }); - - if (aggregationWeightsDirty) { - this._updateAccessors(opts); - } - if (aggregationDataDirty || aggregationWeightsDirty) { - this._resetResults(); - } - this.setState({ - aggregationDataDirty, - aggregationWeightsDirty - }); - } - /* eslint-enable max-statements, complexity */ - - // Private (Aggregation) - - private _updateAccessors(opts: UpdateParameters) { - const {getWeight, aggregation, data} = opts.props; - const {count} = this.state.weights; - if (count) { - count.getWeight = getWeight; - count.operation = AGGREGATION_OPERATION[aggregation]; - } - this.setState({getValue: getValueFunc(aggregation, getWeight, {data})}); - } - - private _resetResults() { - const {count} = this.state.weights; - if (count) { - count.aggregationData = null; - } - } - - // Private (Contours) - - private _generateContours() { - const {numCol, numRow, gridOrigin, gridOffset, thresholdData} = this.state; - const {count} = this.state.weights; - let {aggregationData} = count; - if (!aggregationData) { - // @ts-ignore - aggregationData = count.aggregationBuffer!.readSyncWebGL() as Float32Array; - count.aggregationData = aggregationData; - } - - const {cellWeights} = GPUGridAggregator.getCellData({countsData: aggregationData}); - const contourData = generateContours({ - thresholdData, - cellWeights, - gridSize: [numCol, numRow], - gridOrigin, - cellSize: [gridOffset.xOffset, gridOffset.yOffset] - }); - - // contourData contains both iso-lines and iso-bands if requested. - this.setState({contourData}); - } - - private _updateThresholdData(props) { - const {contours, zOffset} = props; - const count = contours.length; - const thresholdData = new Array(count); - for (let i = 0; i < count; i++) { - const contour = contours[i]; - thresholdData[i] = { - contour, - zIndex: contour.zIndex || i, - zOffset + getPickingInfo(params: GetPickingInfoParams): ContourLayerPickingInfo { + const info: ContourLayerPickingInfo = params.info; + const {object} = info; + if (object) { + info.object = { + contour: (object as ContourLine | ContourPolygon).contour }; } - this.setState({thresholdData}); + + return info; } } diff --git a/modules/aggregation-layers/src/contour-layer/contour-utils.ts b/modules/aggregation-layers/src/contour-layer/contour-utils.ts index 183b1776f48..bfecf8718ea 100644 --- a/modules/aggregation-layers/src/contour-layer/contour-utils.ts +++ b/modules/aggregation-layers/src/contour-layer/contour-utils.ts @@ -1,56 +1,83 @@ -import {getCode, getVertices, CONTOUR_TYPE} from './marching-squares'; +import type {Color} from '@deck.gl/core'; +import {getCode, getLines, getPolygons} from './marching-squares'; + +export type Contour = { + /** + * Isolines: `threshold` value must be a single `Number`, Isolines are generated based on this threshold value. + * + * Isobands: `threshold` value must be an Array of two `Number`s. Isobands are generated using `[threshold[0], threshold[1])` as threshold range, i.e area that has values `>= threshold[0]` and `< threshold[1]` are rendered with corresponding color. NOTE: `threshold[0]` is inclusive and `threshold[1]` is not inclusive. + */ + threshold: number | number[]; + + /** + * RGBA color array to be used to render the contour. + * @default [255, 255, 255, 255] + */ + color?: Color; + + /** + * Applicable for `Isoline`s only, width of the Isoline in pixels. + * @default 1 + */ + strokeWidth?: number; + + /** Defines z order of the contour. */ + zIndex?: number; +}; + +export type ContourLine = { + vertices: number[][]; + contour: Contour; +}; + +export type ContourPolygon = { + vertices: number[][]; + contour: Contour; +}; // Given all the cell weights, generates contours for each threshold. /* eslint-disable max-depth */ export function generateContours({ - thresholdData, - cellWeights, - gridSize, - gridOrigin, - cellSize + contours, + getValue, + xRange, + yRange }: { - thresholdData: any; - cellWeights: Float32Array; - gridSize: number[]; - gridOrigin: number[]; - cellSize: number[]; + contours: Contour[]; + getValue: (x: number, y: number) => number; + xRange: [number, number]; + yRange: [number, number]; }) { - const contourSegments: {start: number[]; end: number[]; contour: any}[] = []; - const contourPolygons: {vertices: number[][]; contour: any}[] = []; - const width = gridSize[0]; - const height = gridSize[1]; + const contourLines: ContourLine[] = []; + const contourPolygons: ContourPolygon[] = []; let segmentIndex = 0; let polygonIndex = 0; - for (const data of thresholdData) { - const {contour} = data; + for (let i = 0; i < contours.length; i++) { + const contour = contours[i]; + const z = contour.zIndex ?? i; const {threshold} = contour; - for (let x = -1; x < width; x++) { - for (let y = -1; y < height; y++) { + for (let x = xRange[0] - 1; x < xRange[1]; x++) { + for (let y = yRange[0] - 1; y < yRange[1]; y++) { // Get the MarchingSquares code based on neighbor cell weights. const {code, meanCode} = getCode({ - cellWeights, + getValue, threshold, x, y, - width, - height + xRange, + yRange }); const opts = { - type: CONTOUR_TYPE.ISO_BANDS, - gridOrigin, - cellSize, x, y, - width, - height, + z, code, - meanCode, - thresholdData: data + meanCode }; if (Array.isArray(threshold)) { - opts.type = CONTOUR_TYPE.ISO_BANDS; - const polygons = getVertices(opts) as number[][][]; + // ISO bands + const polygons = getPolygons(opts); for (const polygon of polygons) { contourPolygons[polygonIndex++] = { vertices: polygon, @@ -58,13 +85,11 @@ export function generateContours({ }; } } else { - // Get the intersection vertices based on MarchingSquares code. - opts.type = CONTOUR_TYPE.ISO_LINES; - const vertices = getVertices(opts) as number[][]; - for (let i = 0; i < vertices.length; i += 2) { - contourSegments[segmentIndex++] = { - start: vertices[i], - end: vertices[i + 1], + // ISO lines + const path = getLines(opts); + if (path.length > 0) { + contourLines[segmentIndex++] = { + vertices: path, contour }; } @@ -72,6 +97,6 @@ export function generateContours({ } } } - return {contourSegments, contourPolygons}; + return {lines: contourLines, polygons: contourPolygons}; } /* eslint-enable max-depth */ diff --git a/modules/aggregation-layers/src/contour-layer/marching-squares.ts b/modules/aggregation-layers/src/contour-layer/marching-squares.ts index 3d92e68a3a3..c7e12455a90 100644 --- a/modules/aggregation-layers/src/contour-layer/marching-squares.ts +++ b/modules/aggregation-layers/src/contour-layer/marching-squares.ts @@ -1,24 +1,15 @@ // All utility methods needed to implement Marching Squares algorithm // Ref: https://en.wikipedia.org/wiki/Marching_squares -import {log} from '@deck.gl/core'; import {ISOLINES_CODE_OFFSET_MAP, ISOBANDS_CODE_OFFSET_MAP} from './marching-squares-codes'; -export const CONTOUR_TYPE = { - ISO_LINES: 1, - ISO_BANDS: 2 -}; - -const DEFAULT_THRESHOLD_DATA = { - zIndex: 0, - zOffset: 0.005 -}; - // Utility methods function getVertexCode(weight: number, threshold: number | number[]): number { // threshold must be a single value or a range (array of size 2) - + if (Number.isNaN(weight)) { + return 0; + } // Iso-bands if (Array.isArray(threshold)) { if (weight < threshold[0]) { @@ -32,60 +23,71 @@ function getVertexCode(weight: number, threshold: number | number[]): number { // Returns marching square code for given cell /* eslint-disable complexity, max-statements*/ -export function getCode(opts) { +export function getCode(opts: { + getValue: (x: number, y: number) => number; + threshold: number | number[]; + x: number; + xRange: [number, number]; + y: number; + yRange: [number, number]; +}): { + code: number; + meanCode: number; +} { // Assumptions // Origin is on bottom-left , and X increase to right, Y to top // When processing one cell, we process 4 cells, by extending row to top and on column to right // to create a 2X2 cell grid - const {cellWeights, x, y, width, height} = opts; - let threshold = opts.threshold; - if (opts.thresholdValue) { - log.deprecated('thresholdValue', 'threshold')(); - threshold = opts.thresholdValue; - } + const {x, y, xRange, yRange, getValue, threshold} = opts; - const isLeftBoundary = x < 0; - const isRightBoundary = x >= width - 1; - const isBottomBoundary = y < 0; - const isTopBoundary = y >= height - 1; + const isLeftBoundary = x < xRange[0]; + const isRightBoundary = x >= xRange[1] - 1; + const isBottomBoundary = y < yRange[0]; + const isTopBoundary = y >= yRange[1] - 1; const isBoundary = isLeftBoundary || isRightBoundary || isBottomBoundary || isTopBoundary; - const weights: Record = {}; - const codes: Record = {}; + let weights: number = 0; + let current: number; + let right: number; + let top: number; + let topRight: number; // TOP if (isLeftBoundary || isTopBoundary) { - codes.top = 0; + top = 0; } else { - weights.top = cellWeights[(y + 1) * width + x]; - codes.top = getVertexCode(weights.top, threshold); + const w = getValue(x, y + 1); + top = getVertexCode(w, threshold); + weights += w; } // TOP-RIGHT if (isRightBoundary || isTopBoundary) { - codes.topRight = 0; + topRight = 0; } else { - weights.topRight = cellWeights[(y + 1) * width + x + 1]; - codes.topRight = getVertexCode(weights.topRight, threshold); + const w = getValue(x + 1, y + 1); + topRight = getVertexCode(w, threshold); + weights += w; } // RIGHT if (isRightBoundary || isBottomBoundary) { - codes.right = 0; + right = 0; } else { - weights.right = cellWeights[y * width + x + 1]; - codes.right = getVertexCode(weights.right, threshold); + const w = getValue(x + 1, y); + right = getVertexCode(w, threshold); + weights += w; } // CURRENT if (isLeftBoundary || isBottomBoundary) { - codes.current = 0; + current = 0; } else { - weights.current = cellWeights[y * width + x]; - codes.current = getVertexCode(weights.current, threshold); + const w = getValue(x, y); + current = getVertexCode(w, threshold); + weights += w; } - const {top, topRight, right, current} = codes; let code = -1; if (Number.isFinite(threshold)) { code = (top << 3) | (topRight << 2) | (right << 1) | current; @@ -99,10 +101,7 @@ export function getCode(opts) { // only occur when we are not processing a cell on boundary // because when on a boundary either, bottom-row, top-row, left-column or right-column will have both 0 codes if (!isBoundary) { - meanCode = getVertexCode( - (weights.top + weights.topRight + weights.right + weights.current) / 4, - threshold - ); + meanCode = getVertexCode(weights / 4, threshold); } return {code, meanCode}; } @@ -110,13 +109,15 @@ export function getCode(opts) { // Returns intersection vertices for given cellindex // [x, y] refers current marching cell, reference vertex is always top-right corner -export function getVertices(opts) { - const {gridOrigin, cellSize, x, y, code, meanCode, type = CONTOUR_TYPE.ISO_LINES} = opts; - const thresholdData = {...DEFAULT_THRESHOLD_DATA, ...opts.thresholdData}; - let offsets = - type === CONTOUR_TYPE.ISO_BANDS - ? ISOBANDS_CODE_OFFSET_MAP[code] - : ISOLINES_CODE_OFFSET_MAP[code]; +export function getPolygons(opts: { + x: number; + y: number; + z: number; + code: number; + meanCode: number; +}) { + const {x, y, z, code, meanCode} = opts; + let offsets: any = ISOBANDS_CODE_OFFSET_MAP[code]; // handle saddle cases if (!Array.isArray(offsets)) { @@ -124,49 +125,55 @@ export function getVertices(opts) { } // Reference vertex is at top-right move to top-right corner - - const vZ = thresholdData.zIndex * thresholdData.zOffset; - const rX = (x + 1) * cellSize[0]; - const rY = (y + 1) * cellSize[1]; - - const refVertexX = gridOrigin[0] + rX; - const refVertexY = gridOrigin[1] + rY; + const rX = x + 1; + const rY = y + 1; // offsets format - // ISO_LINES: [[1A, 1B], [2A, 2B]], - // ISO_BANDS: [[1A, 1B, 1C, ...], [2A, 2B, 2C, ...]], - + // [[1A, 1B, 1C, ...], [2A, 2B, 2C, ...]], // vertices format - - // ISO_LINES: [[x1A, y1A], [x1B, y1B], [x2A, x2B], ...], - - // ISO_BANDS: => confirms to SolidPolygonLayer's simple polygon format - // [ - // [[x1A, y1A], [x1B, y1B], [x1C, y1C] ... ], + // [ + // [[x1A, y1A], [x1B, y1B], [x1C, y1C] ... ], // ... - // ] - - if (type === CONTOUR_TYPE.ISO_BANDS) { - const polygons: number[][][] = []; - offsets.forEach(polygonOffsets => { - const polygon: number[][] = []; - polygonOffsets.forEach(xyOffset => { - const vX = refVertexX + xyOffset[0] * cellSize[0]; - const vY = refVertexY + xyOffset[1] * cellSize[1]; - polygon.push([vX, vY, vZ]); - }); - polygons.push(polygon); + // ] + + const polygons: number[][][] = []; + offsets.forEach(polygonOffsets => { + const polygon: number[][] = []; + polygonOffsets.forEach(xyOffset => { + const vX = rX + xyOffset[0]; + const vY = rY + xyOffset[1]; + polygon.push([vX, vY, z]); }); - return polygons; + polygons.push(polygon); + }); + return polygons; +} + +// Returns intersection vertices for given cellindex +// [x, y] refers current marching cell, reference vertex is always top-right corner +export function getLines(opts: {x: number; y: number; z: number; code: number; meanCode: number}) { + const {x, y, z, code, meanCode} = opts; + let offsets = ISOLINES_CODE_OFFSET_MAP[code]; + + // handle saddle cases + if (!Array.isArray(offsets)) { + offsets = offsets[meanCode]; } - // default case is ISO_LINES + // Reference vertex is at top-right move to top-right corner + const rX = x + 1; + const rY = y + 1; + + // offsets format + // [[1A, 1B], [2A, 2B]], + // vertices format + // [[x1A, y1A], [x1B, y1B], [x2A, x2B], ...], const lines: number[][] = []; offsets.forEach(xyOffsets => { xyOffsets.forEach(offset => { - const vX = refVertexX + offset[0] * cellSize[0]; - const vY = refVertexY + offset[1] * cellSize[1]; - lines.push([vX, vY, vZ]); + const vX = rX + offset[0]; + const vY = rY + offset[1]; + lines.push([vX, vY, z]); }); }); return lines; diff --git a/modules/aggregation-layers/src/contour-layer/value-reader.ts b/modules/aggregation-layers/src/contour-layer/value-reader.ts new file mode 100644 index 00000000000..cb402514052 --- /dev/null +++ b/modules/aggregation-layers/src/contour-layer/value-reader.ts @@ -0,0 +1,61 @@ +import {Aggregator, CPUAggregator, WebGLAggregator} from '../common/aggregator/index'; +import type {TypedArray} from '@luma.gl/core'; + +type ValueReader = (x: number, y: number) => number; + +/** Returns an accessor to the aggregated values from bin id */ +export function getAggregatorValueReader(opts: { + aggregator: Aggregator; + binIdRange: [number, number][]; + channel: 0 | 1 | 2; +}): ValueReader | null { + const {aggregator, binIdRange, channel} = opts; + + if (aggregator instanceof WebGLAggregator) { + const buffer = aggregator.getResult(channel)?.buffer; + if (buffer) { + const values = new Float32Array(buffer.readSyncWebGL().buffer); + return getWebGLAggregatorValueReader(values, binIdRange); + } + } + if (aggregator instanceof CPUAggregator) { + const values = aggregator.getResult(channel)?.value; + const ids = aggregator.getBins()?.value; + if (ids && values) { + return getCPUAggregatorValueReader(values, ids, aggregator.binCount); + } + } + return null; +} + +function getWebGLAggregatorValueReader( + values: Float32Array, + binIdRange: [number, number][] +): ValueReader { + const [[minX, maxX], [minY, maxY]] = binIdRange; + const width = maxX - minX; + const height = maxY - minY; + return (x: number, y: number) => { + x -= minX; + y -= minY; + if (x < 0 || x >= width || y < 0 || y >= height) { + return NaN; + } + return values[y * width + x]; + }; +} + +function getCPUAggregatorValueReader( + values: TypedArray, + ids: TypedArray, + count: number +): ValueReader { + const idMap: Record> = {}; + for (let i = 0; i < count; i++) { + const x = ids[i * 2]; + const y = ids[i * 2 + 1]; + idMap[x] = idMap[x] || {}; + idMap[x][y] = values[i]; + } + return (x: number, y: number) => idMap[x]?.[y] ?? NaN; +} diff --git a/modules/aggregation-layers/src/cpu-grid-layer/cpu-grid-layer.ts b/modules/aggregation-layers/src/cpu-grid-layer/cpu-grid-layer.ts deleted file mode 100644 index 3bccacbccd5..00000000000 --- a/modules/aggregation-layers/src/cpu-grid-layer/cpu-grid-layer.ts +++ /dev/null @@ -1,329 +0,0 @@ -// Copyright (c) 2015 - 2017 Uber Technologies, Inc. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -import {GridCellLayer} from '@deck.gl/layers'; -import {Accessor, AccessorFunction, Color, Position, Material, DefaultProps} from '@deck.gl/core'; - -import {defaultColorRange} from '../utils/color-utils'; -import {pointToDensityGridDataCPU} from './grid-aggregator'; -import CPUAggregator from '../utils/cpu-aggregator'; -import AggregationLayer, {AggregationLayerProps} from '../aggregation-layer'; - -import {Layer, UpdateParameters, GetPickingInfoParams, PickingInfo} from '@deck.gl/core'; -import {AggregateAccessor} from '../types'; - -// eslint-disable-next-line @typescript-eslint/no-empty-function -function nop() {} - -const defaultProps: DefaultProps = { - // color - colorDomain: null, - colorRange: defaultColorRange, - getColorValue: {type: 'accessor', value: null}, // default value is calculated from `getColorWeight` and `colorAggregation` - getColorWeight: {type: 'accessor', value: 1}, - colorAggregation: 'SUM', - lowerPercentile: {type: 'number', min: 0, max: 100, value: 0}, - upperPercentile: {type: 'number', min: 0, max: 100, value: 100}, - colorScaleType: 'quantize', - onSetColorDomain: nop, - - // elevation - elevationDomain: null, - elevationRange: [0, 1000], - getElevationValue: {type: 'accessor', value: null}, // default value is calculated from `getElevationWeight` and `elevationAggregation` - getElevationWeight: {type: 'accessor', value: 1}, - elevationAggregation: 'SUM', - elevationLowerPercentile: {type: 'number', min: 0, max: 100, value: 0}, - elevationUpperPercentile: {type: 'number', min: 0, max: 100, value: 100}, - elevationScale: {type: 'number', min: 0, value: 1}, - elevationScaleType: 'linear', - onSetElevationDomain: nop, - - gridAggregator: pointToDensityGridDataCPU, - - // grid - cellSize: {type: 'number', min: 0, max: 1000, value: 1000}, - coverage: {type: 'number', min: 0, max: 1, value: 1}, - getPosition: {type: 'accessor', value: (x: any) => x.position}, - extruded: false, - - // Optional material for 'lighting' shader module - material: true, - - // data filter - _filterData: {type: 'function', value: null, optional: true} -}; - -/** All properties supported by CPUGridLayer. */ -export type CPUGridLayerProps = _CPUGridLayerProps & - AggregationLayerProps; - -/** Properties added by CPUGridLayer. */ -type _CPUGridLayerProps = { - /** - * Size of each cell in meters. - * @default 1000 - */ - cellSize?: number; - - /** - * Color scale domain, default is set to the extent of aggregated weights in each cell. - * @default [min(colorWeight), max(colorWeight)] - */ - colorDomain?: [number, number] | null; - - /** - * Default: [colorbrewer](http://colorbrewer2.org/#type=sequential&scheme=YlOrRd&n=6) `6-class YlOrRd` - */ - colorRange?: Color[]; - - /** - * Cell size multiplier, clamped between 0 - 1. - * @default 1 - */ - coverage?: number; - - /** - * Elevation scale input domain, default is set to between 0 and the max of aggregated weights in each cell. - * @default [0, max(elevationWeight)] - */ - elevationDomain?: [number, number] | null; - - /** - * Elevation scale output range. - * @default [0, 1000] - */ - elevationRange?: [number, number]; - - /** - * Cell elevation multiplier. - * @default 1 - */ - elevationScale?: number; - - /** - * Whether to enable cell elevation. If set to false, all cell will be flat. - * @default true - */ - extruded?: boolean; - - /** - * Filter cells and re-calculate color by `upperPercentile`. - * Cells with value arger than the upperPercentile will be hidden. - * @default 100 - */ - upperPercentile?: number; - - /** - * Filter cells and re-calculate color by `lowerPercentile`. - * Cells with value smaller than the lowerPercentile will be hidden. - * @default 0 - */ - lowerPercentile?: number; - - /** - * Filter cells and re-calculate elevation by `elevationUpperPercentile`. - * Cells with elevation value larger than the `elevationUpperPercentile` will be hidden. - * @default 100 - */ - elevationUpperPercentile?: number; - - /** - * Filter cells and re-calculate elevation by `elevationLowerPercentile`. - * Cells with elevation value larger than the `elevationLowerPercentile` will be hidden. - * @default 0 - */ - elevationLowerPercentile?: number; - - /** - * Scaling function used to determine the color of the grid cell, default value is 'quantize'. - * Supported Values are 'quantize', 'linear', 'quantile' and 'ordinal'. - * @default 'quantize' - */ - colorScaleType?: 'quantize' | 'linear' | 'quantile' | 'ordinal'; - - /** - * Scaling function used to determine the elevation of the grid cell, only supports 'linear'. - */ - elevationScaleType?: 'linear'; - - // TODO - document - gridAggregator?: (props: any, params: any) => any; - - /** - * Material settings for lighting effect. Applies if `extruded: true`. - * - * @default true - * @see https://deck.gl/docs/developer-guide/using-lighting - */ - material?: Material; - - /** - * Defines the operation used to aggregate all data object weights to calculate a cell's color value. - * @default 'SUM' - */ - colorAggregation?: 'SUM' | 'MEAN' | 'MIN' | 'MAX'; - - /** - * Defines the operation used to aggregate all data object weights to calculate a cell's elevation value. - * @default 'SUM' - */ - elevationAggregation?: 'SUM' | 'MEAN' | 'MIN' | 'MAX'; - - /** - * Method called to retrieve the position of each object. - * @default object => object.position - */ - getPosition?: AccessorFunction; - - /** - * The weight of a data object used to calculate the color value for a cell. - * @default 1 - */ - getColorWeight?: Accessor; - - /** - * After data objects are aggregated into cells, this accessor is called on each cell to get the value that its color is based on. - * @default null - */ - getColorValue?: AggregateAccessor | null; - - /** - * The weight of a data object used to calculate the elevation value for a cell. - * @default 1 - */ - getElevationWeight?: Accessor; - - /** - * After data objects are aggregated into cells, this accessor is called on each cell to get the value that its elevation is based on. - * @default null - */ - getElevationValue?: AggregateAccessor | null; - - /** - * This callback will be called when bin color domain has been calculated. - * @default () => {} - */ - onSetColorDomain?: (minMax: [number, number]) => void; - - /** - * This callback will be called when bin elevation domain has been calculated. - * @default () => {} - */ - onSetElevationDomain?: (minMax: [number, number]) => void; - - /** - * (Experimental) Filter data objects - */ - _filterData: null | ((d: DataT) => boolean); -}; - -/** Aggregate data into a grid-based heatmap. Aggregation is performed on CPU. */ -export default class CPUGridLayer< - DataT = any, - ExtraPropsT extends {} = {} -> extends AggregationLayer>> { - static layerName = 'CPUGridLayer'; - static defaultProps = defaultProps; - - state!: AggregationLayer['state'] & { - cpuAggregator: CPUAggregator; - aggregatorState: CPUAggregator['state']; - }; - - initializeState(): void { - const cpuAggregator = new CPUAggregator({ - getAggregator: props => props.gridAggregator, - getCellSize: props => props.cellSize - }); - - this.state = { - cpuAggregator, - aggregatorState: cpuAggregator.state - }; - const attributeManager = this.getAttributeManager()!; - attributeManager.add({ - positions: {size: 3, type: 'float64', accessor: 'getPosition'} - }); - // color and elevation attributes can't be added as attributes - // they are calcualted using 'getValue' accessor that takes an array of pints. - } - - updateState(opts: UpdateParameters) { - super.updateState(opts); - this.setState({ - // make a copy of the internal state of cpuAggregator for testing - aggregatorState: this.state.cpuAggregator.updateState(opts, { - viewport: this.context.viewport, - attributes: this.getAttributes(), - numInstances: this.getNumInstances() - }) - }); - } - - getPickingInfo({info}: GetPickingInfoParams): PickingInfo { - return this.state.cpuAggregator.getPickingInfo({info}); - } - - // create a method for testing - _onGetSublayerColor(cell) { - return this.state.cpuAggregator.getAccessor('fillColor')(cell); - } - - // create a method for testing - _onGetSublayerElevation(cell) { - return this.state.cpuAggregator.getAccessor('elevation')(cell); - } - - _getSublayerUpdateTriggers() { - return this.state.cpuAggregator.getUpdateTriggers(this.props); - } - - renderLayers(): Layer { - const {elevationScale, extruded, cellSize, coverage, material, transitions} = this.props; - const {cpuAggregator} = this.state; - const SubLayerClass = this.getSubLayerClass('grid-cell', GridCellLayer); - const updateTriggers = this._getSublayerUpdateTriggers(); - - return new SubLayerClass( - { - cellSize, - coverage, - material, - elevationScale, - extruded, - - getFillColor: this._onGetSublayerColor.bind(this), - getElevation: this._onGetSublayerElevation.bind(this), - transitions: transitions && { - getFillColor: transitions.getColorValue || transitions.getColorWeight, - getElevation: transitions.getElevationValue || transitions.getElevationWeight - } - }, - this.getSubLayerProps({ - id: 'grid-cell', - updateTriggers - }), - { - data: cpuAggregator.state.layerData.data - } - ); - } -} diff --git a/modules/aggregation-layers/src/cpu-grid-layer/grid-aggregator.ts b/modules/aggregation-layers/src/cpu-grid-layer/grid-aggregator.ts deleted file mode 100644 index de55d03b617..00000000000 --- a/modules/aggregation-layers/src/cpu-grid-layer/grid-aggregator.ts +++ /dev/null @@ -1,184 +0,0 @@ -// Copyright (c) 2015 - 2017 Uber Technologies, Inc. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -import {createIterable} from '@deck.gl/core'; -import {getGridOffset} from '../utils/grid-aggregation-utils'; - -export type GridHash = { - [key: string]: { - count: number; - points: unknown[]; - lonIdx: number; - latIdx: number; - }; -}; - -/** - * Calculate density grid from an array of points - * @param {Object} props - object containing : - * @param {Iterable} [props.data] - data objects to be aggregated - * @param {Integer} [props.cellSize] - size of the grid cell - * - * @param {Object} aggregationParams - object containing : - * @param {Object} gridOffset - {xOffset, yOffset} cell size in meters - * @param {Integer} width - width of the grid - * @param {Integer} height - height of the grid - * @param {Boolean} projectPoints - `true` if doing screen space projection, `false` otherwise - * @param {Array} attributes - attributes array containing position values - * @param {Viewport} viewport - viewport to be used for projection - * @param {Array} posOffset - [xOffset, yOffset] offset to be applied to positions to get cell index - * @param {Object} boundingBox - {xMin, yMin, xMax, yMax} bounding box of input data - * - * @returns {object} - grid data, cell dimension - */ -export function pointToDensityGridDataCPU(props, aggregationParams) { - const hashInfo = pointsToGridHashing(props, aggregationParams); - const result = getGridLayerDataFromGridHash(hashInfo); - - return { - gridHash: hashInfo.gridHash, - gridOffset: hashInfo.gridOffset, - data: result - }; -} - -/** - * Project points into each cell, return a hash table of cells - * @param {Iterable} points - * @param {number} cellSize - unit size in meters - * @param {function} getPosition - position accessor - * @returns {object} - grid hash and cell dimension - */ -/* eslint-disable-next-line max-statements, complexity */ -function pointsToGridHashing( - props, - aggregationParams -): { - gridHash: GridHash; - gridOffset: {xOffset: number; yOffset: number}; - offsets: [number, number]; -} { - const {data = [], cellSize} = props; - const {attributes, viewport, projectPoints, numInstances} = aggregationParams; - const positions = attributes.positions.value; - const {size} = attributes.positions.getAccessor(); - const boundingBox = - aggregationParams.boundingBox || getPositionBoundingBox(attributes.positions, numInstances); - const offsets = aggregationParams.posOffset || [180, 90]; - const gridOffset = aggregationParams.gridOffset || getGridOffset(boundingBox, cellSize); - - if (gridOffset.xOffset <= 0 || gridOffset.yOffset <= 0) { - return {gridHash: {}, gridOffset, offsets: [0, 0]}; - } - - const {width, height} = viewport; - const numCol = Math.ceil(width / gridOffset.xOffset); - const numRow = Math.ceil(height / gridOffset.yOffset); - - // calculate count per cell - const gridHash = {}; - - const {iterable, objectInfo} = createIterable(data); - const position = new Array(3); - for (const pt of iterable) { - objectInfo.index++; - position[0] = positions[objectInfo.index * size]; - position[1] = positions[objectInfo.index * size + 1]; - position[2] = size >= 3 ? positions[objectInfo.index * size + 2] : 0; - const [x, y] = projectPoints ? viewport.project(position) : position; - if (Number.isFinite(x) && Number.isFinite(y)) { - const yIndex = Math.floor((y + offsets[1]) / gridOffset.yOffset); - const xIndex = Math.floor((x + offsets[0]) / gridOffset.xOffset); - if ( - !projectPoints || - // when doing screen space agggregation (projectPoints = true), filter points outside of the viewport range. - (xIndex >= 0 && xIndex < numCol && yIndex >= 0 && yIndex < numRow) - ) { - const key = `${yIndex}-${xIndex}`; - - gridHash[key] = gridHash[key] || {count: 0, points: [], lonIdx: xIndex, latIdx: yIndex}; - gridHash[key].count += 1; - gridHash[key].points.push({ - source: pt, - index: objectInfo.index - }); - } - } - } - - return {gridHash, gridOffset, offsets: [offsets[0] * -1, offsets[1] * -1]}; -} -/* eslint-enable max-statements, complexity */ - -function getGridLayerDataFromGridHash({ - gridHash, - gridOffset, - offsets -}: { - gridHash: GridHash; - gridOffset: {xOffset: number; yOffset: number}; - offsets: [number, number]; -}) { - const data = new Array(Object.keys(gridHash).length); - let i = 0; - for (const key in gridHash) { - const idxs = key.split('-'); - const latIdx = parseInt(idxs[0], 10); - const lonIdx = parseInt(idxs[1], 10); - const index = i++; - - data[index] = { - index, - position: [ - offsets[0] + gridOffset.xOffset * lonIdx, - offsets[1] + gridOffset.yOffset * latIdx - ], - ...gridHash[key] - }; - } - return data; -} - -// Calculate bounding box of position attribute -function getPositionBoundingBox(positionAttribute, numInstance) { - // TODO - value might not exist (e.g. attribute transition) - const positions = positionAttribute.value; - const {size} = positionAttribute.getAccessor(); - - let yMin = Infinity; - let yMax = -Infinity; - let xMin = Infinity; - let xMax = -Infinity; - let y; - let x; - - for (let i = 0; i < numInstance; i++) { - x = positions[i * size]; - y = positions[i * size + 1]; - if (Number.isFinite(x) && Number.isFinite(y)) { - yMin = y < yMin ? y : yMin; - yMax = y > yMax ? y : yMax; - xMin = x < xMin ? x : xMin; - xMax = x > xMax ? x : xMax; - } - } - - return {xMin, xMax, yMin, yMax}; -} diff --git a/modules/aggregation-layers/src/gpu-grid-layer/gpu-grid-cell-layer-fragment.glsl.ts b/modules/aggregation-layers/src/gpu-grid-layer/gpu-grid-cell-layer-fragment.glsl.ts deleted file mode 100644 index 09ac499b409..00000000000 --- a/modules/aggregation-layers/src/gpu-grid-layer/gpu-grid-cell-layer-fragment.glsl.ts +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (c) 2015 - 2017 Uber Technologies, Inc. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -export default `\ -#version 300 es -#define SHADER_NAME gpu-grid-cell-layer-fragment-shader - -precision highp float; - -in vec4 vColor; - -out vec4 fragColor; - -void main(void) { - fragColor = vColor; - fragColor = picking_filterColor(fragColor); -} -`; diff --git a/modules/aggregation-layers/src/gpu-grid-layer/gpu-grid-cell-layer-vertex.glsl.ts b/modules/aggregation-layers/src/gpu-grid-layer/gpu-grid-cell-layer-vertex.glsl.ts deleted file mode 100644 index b23943364df..00000000000 --- a/modules/aggregation-layers/src/gpu-grid-layer/gpu-grid-cell-layer-vertex.glsl.ts +++ /dev/null @@ -1,143 +0,0 @@ -// Copyright (c) 2015 - 2017 Uber Technologies, Inc. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -// Inspired by screen-grid-layer vertex shader in deck.gl - -export default `\ -#version 300 es -#define SHADER_NAME gpu-grid-cell-layer-vertex-shader -#define RANGE_COUNT 6 - -in vec3 positions; -in vec3 normals; - -in vec4 colors; -in vec4 elevations; -in vec3 instancePickingColors; - -// Custom uniforms -uniform vec2 offset; -uniform bool extruded; -uniform float cellSize; -uniform float coverage; -uniform float opacity; -uniform float elevationScale; - -uniform ivec2 gridSize; -uniform vec2 gridOrigin; -uniform vec2 gridOriginLow; -uniform vec2 gridOffset; -uniform vec2 gridOffsetLow; -uniform vec4 colorRange[RANGE_COUNT]; -uniform vec2 elevationRange; - -// Domain uniforms -uniform vec2 colorDomain; -uniform bool colorDomainValid; -uniform vec2 elevationDomain; -uniform bool elevationDomainValid; - -layout(std140) uniform; -uniform ColorData -{ - vec4 maxMinCount; -} colorData; -uniform ElevationData -{ - vec4 maxMinCount; -} elevationData; - -#define EPSILON 0.00001 - -// Result -out vec4 vColor; - -vec4 quantizeScale(vec2 domain, vec4 range[RANGE_COUNT], float value) { - vec4 outColor = vec4(0., 0., 0., 0.); - if (value >= (domain.x - EPSILON) && value <= (domain.y + EPSILON)) { - float domainRange = domain.y - domain.x; - if (domainRange <= 0.) { - outColor = colorRange[0]; - } else { - float rangeCount = float(RANGE_COUNT); - float rangeStep = domainRange / rangeCount; - float idx = floor((value - domain.x) / rangeStep); - idx = clamp(idx, 0., rangeCount - 1.); - int intIdx = int(idx); - outColor = colorRange[intIdx]; - } - } - return outColor; -} - -float linearScale(vec2 domain, vec2 range, float value) { - if (value >= (domain.x - EPSILON) && value <= (domain.y + EPSILON)) { - return ((value - domain.x) / (domain.y - domain.x)) * (range.y - range.x) + range.x; - } - return -1.; -} - -void main(void) { - vec2 clrDomain = colorDomainValid ? colorDomain : vec2(colorData.maxMinCount.a, colorData.maxMinCount.r); - vec4 color = quantizeScale(clrDomain, colorRange, colors.r); - - float elevation = 0.0; - - if (extruded) { - vec2 elvDomain = elevationDomainValid ? elevationDomain : vec2(elevationData.maxMinCount.a, elevationData.maxMinCount.r); - elevation = linearScale(elvDomain, elevationRange, elevations.r); - elevation = elevation * (positions.z + 1.0) / 2.0 * elevationScale; - } - - // if aggregated color or elevation is 0 do not render - float shouldRender = float(color.r > 0.0 && elevations.r >= 0.0); - float dotRadius = cellSize / 2. * coverage * shouldRender; - - int yIndex = (gl_InstanceID / gridSize[0]); - int xIndex = gl_InstanceID - (yIndex * gridSize[0]); - - vec2 instancePositionXFP64 = mul_fp64(vec2(gridOffset[0], gridOffsetLow[0]), vec2(float(xIndex), 0.)); - instancePositionXFP64 = sum_fp64(instancePositionXFP64, vec2(gridOrigin[0], gridOriginLow[0])); - vec2 instancePositionYFP64 = mul_fp64(vec2(gridOffset[1], gridOffsetLow[1]), vec2(float(yIndex), 0.)); - instancePositionYFP64 = sum_fp64(instancePositionYFP64, vec2(gridOrigin[1], gridOriginLow[1])); - - vec3 centroidPosition = vec3(instancePositionXFP64[0], instancePositionYFP64[0], elevation); - vec3 centroidPosition64Low = vec3(instancePositionXFP64[1], instancePositionYFP64[1], 0.0); - geometry.worldPosition = centroidPosition; - vec3 pos = vec3(project_size(positions.xy + offset) * dotRadius, 0.); - - // Set color to be rendered to picking fbo (also used to check for selection highlight). - picking_setPickingColor(instancePickingColors); - - gl_Position = project_position_to_clipspace(centroidPosition, centroidPosition64Low, pos, geometry.position); - - // Light calculations - // Worldspace is the linear space after Mercator projection - - vec3 normals_commonspace = project_normal(normals); - - if (extruded) { - vec3 lightColor = lighting_getLightColor(color.rgb, project.cameraPosition, geometry.position.xyz, normals_commonspace); - vColor = vec4(lightColor, color.a * opacity) / 255.; - } else { - vColor = vec4(color.rgb, color.a * opacity) / 255.; - } -} -`; diff --git a/modules/aggregation-layers/src/gpu-grid-layer/gpu-grid-cell-layer.ts b/modules/aggregation-layers/src/gpu-grid-layer/gpu-grid-cell-layer.ts deleted file mode 100644 index d04ed5e01b7..00000000000 --- a/modules/aggregation-layers/src/gpu-grid-layer/gpu-grid-cell-layer.ts +++ /dev/null @@ -1,202 +0,0 @@ -// Copyright (c) 2015 - 2017 Uber Technologies, Inc. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -import { - Layer, - fp64LowPart, - project32, - gouraudLighting, - picking, - LayerProps, - DefaultProps -} from '@deck.gl/core'; -import {CubeGeometry} from '@luma.gl/engine'; -import {fp64arithmetic} from '@luma.gl/shadertools'; -import {Model} from '@luma.gl/engine'; -import {Buffer} from '@luma.gl/core'; -import {GL} from '@luma.gl/constants'; -import {defaultColorRange, colorRangeToFlatArray} from '../utils/color-utils'; -import type {_GPUGridLayerProps} from './gpu-grid-layer'; -import vs from './gpu-grid-cell-layer-vertex.glsl'; -import fs from './gpu-grid-cell-layer-fragment.glsl'; - -const COLOR_DATA_UBO_INDEX = 0; -const ELEVATION_DATA_UBO_INDEX = 1; - -const defaultProps: DefaultProps<_GPUGridCellLayerProps & LayerProps> = { - // color - colorDomain: null, - colorRange: defaultColorRange, - - // elevation - elevationDomain: null, - elevationRange: [0, 1000], - elevationScale: {type: 'number', min: 0, value: 1}, - - // grid - gridSize: {type: 'array', value: [1, 1]}, - gridOrigin: {type: 'array', value: [0, 0]}, - gridOffset: {type: 'array', value: [0, 0]}, - - cellSize: {type: 'number', min: 0, max: 1000, value: 1000}, - offset: {type: 'array', value: [1, 1]}, - coverage: {type: 'number', min: 0, max: 1, value: 1}, - extruded: true, - - material: true // Use lighting module defaults -}; - -type _GPUGridCellLayerProps = _GPUGridLayerProps & { - cellSize: number; - offset: number[]; - coverage: number; - extruded: boolean; - elevationScale: number; - elevationRange: [number, number]; - gridSize: number[]; - gridOrigin: number[]; - gridOffset: number[]; - colorMaxMinBuffer: Buffer; - elevationMaxMinBuffer: Buffer; -}; - -export default class GPUGridCellLayer extends Layer> { - static layerName = 'GPUGridCellLayer'; - static defaultProps = defaultProps; - - state!: { - model?: Model; - }; - - getShaders() { - return super.getShaders({ - vs, - fs, - modules: [project32, gouraudLighting, picking, fp64arithmetic] - }); - } - - initializeState(): void { - const attributeManager = this.getAttributeManager()!; - attributeManager.addInstanced({ - colors: { - size: 4, - noAlloc: true - }, - elevations: { - size: 4, - noAlloc: true - } - }); - const model = this._getModel(); - this._setupUniformBuffer(model); - this.setState({model}); - } - - _getModel(): Model { - return new Model(this.context.device, { - ...this.getShaders(), - id: this.props.id, - geometry: new CubeGeometry(), - isInstanced: true - }); - } - - draw({uniforms}) { - const { - cellSize, - offset, - extruded, - elevationScale, - coverage, - gridSize, - gridOrigin, - gridOffset, - elevationRange, - colorMaxMinBuffer, - elevationMaxMinBuffer - } = this.props; - const model = this.state.model!; - - const gridOriginLow = [fp64LowPart(gridOrigin[0]), fp64LowPart(gridOrigin[1])]; - const gridOffsetLow = [fp64LowPart(gridOffset[0]), fp64LowPart(gridOffset[1])]; - const domainUniforms = this.getDomainUniforms(); - const colorRange = colorRangeToFlatArray(this.props.colorRange); - this.bindUniformBuffers(colorMaxMinBuffer, elevationMaxMinBuffer); - model.setUniforms(uniforms); - model.setUniforms(domainUniforms); - model.setUniforms({ - cellSize, - offset, - extruded, - elevationScale, - coverage, - gridSize, - gridOrigin, - gridOriginLow, - gridOffset, - gridOffsetLow, - // @ts-ignore - colorRange, - elevationRange - }); - model.draw(this.context.renderPass); - this.unbindUniformBuffers(colorMaxMinBuffer, elevationMaxMinBuffer); - } - - bindUniformBuffers(colorMaxMinBuffer, elevationMaxMinBuffer) { - colorMaxMinBuffer.bind({target: GL.UNIFORM_BUFFER, index: COLOR_DATA_UBO_INDEX}); - elevationMaxMinBuffer.bind({target: GL.UNIFORM_BUFFER, index: ELEVATION_DATA_UBO_INDEX}); - } - - unbindUniformBuffers(colorMaxMinBuffer, elevationMaxMinBuffer) { - colorMaxMinBuffer.unbind({target: GL.UNIFORM_BUFFER, index: COLOR_DATA_UBO_INDEX}); - elevationMaxMinBuffer.unbind({target: GL.UNIFORM_BUFFER, index: ELEVATION_DATA_UBO_INDEX}); - } - - getDomainUniforms() { - const {colorDomain, elevationDomain} = this.props; - const domainUniforms: Record = {}; - if (colorDomain !== null) { - domainUniforms.colorDomainValid = true; - domainUniforms.colorDomain = colorDomain; - } else { - domainUniforms.colorDomainValid = false; - } - if (elevationDomain !== null) { - domainUniforms.elevationDomainValid = true; - domainUniforms.elevationDomain = elevationDomain; - } else { - domainUniforms.elevationDomainValid = false; - } - return domainUniforms; - } - - private _setupUniformBuffer(model: Model): void { - // @ts-expect-error TODO v9 This code is not portable to WebGPU - const programHandle = model.pipeline.handle; - - const gl = this.context.gl; - const colorIndex = gl.getUniformBlockIndex(programHandle, 'ColorData'); - const elevationIndex = gl.getUniformBlockIndex(programHandle, 'ElevationData'); - gl.uniformBlockBinding(programHandle, colorIndex, COLOR_DATA_UBO_INDEX); - gl.uniformBlockBinding(programHandle, elevationIndex, ELEVATION_DATA_UBO_INDEX); - } -} diff --git a/modules/aggregation-layers/src/gpu-grid-layer/gpu-grid-layer.ts b/modules/aggregation-layers/src/gpu-grid-layer/gpu-grid-layer.ts deleted file mode 100644 index d55a6fa6cd0..00000000000 --- a/modules/aggregation-layers/src/gpu-grid-layer/gpu-grid-layer.ts +++ /dev/null @@ -1,455 +0,0 @@ -// Copyright (c) 2015 - 2017 Uber Technologies, Inc. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -import {GL} from '@luma.gl/constants'; -import { - Accessor, - AccessorFunction, - Color, - Material, - GetPickingInfoParams, - LayerContext, - log, - PickingInfo, - Position, - DefaultProps -} from '@deck.gl/core'; - -import GPUGridAggregator from '../utils/gpu-grid-aggregation/gpu-grid-aggregator'; -import {AGGREGATION_OPERATION} from '../utils/aggregation-operation-utils'; -import {defaultColorRange, colorRangeToFlatArray} from '../utils/color-utils'; -import GPUGridCellLayer from './gpu-grid-cell-layer'; -import {pointToDensityGridDataCPU, GridHash} from './../cpu-grid-layer/grid-aggregator'; -import GridAggregationLayer, {GridAggregationLayerProps} from '../grid-aggregation-layer'; -import {getBoundingBox, getGridParams} from '../utils/grid-aggregation-utils'; - -const defaultProps: DefaultProps = { - // color - colorDomain: null, - colorRange: defaultColorRange, - getColorWeight: {type: 'accessor', value: 1}, - colorAggregation: 'SUM', - - // elevation - elevationDomain: null, - elevationRange: [0, 1000], - getElevationWeight: {type: 'accessor', value: 1}, - elevationAggregation: 'SUM', - elevationScale: {type: 'number', min: 0, value: 1}, - - // grid - cellSize: {type: 'number', min: 1, max: 1000, value: 1000}, - coverage: {type: 'number', min: 0, max: 1, value: 1}, - getPosition: {type: 'accessor', value: (x: any) => x.position}, - extruded: false, - - // Optional material for 'lighting' shader module - material: true -}; - -// This layer only perform GPU aggregation, no need to seperate data and weight props -// aggregation will be dirty when any of the props are changed. - -const DIMENSIONS = { - data: { - props: ['cellSize', 'colorAggregation', 'elevationAggregation'] - } - // rest of the changes are detected by `state.attributesChanged` -}; -const POSITION_ATTRIBUTE_NAME = 'positions'; - -/** All properties supported by GPUGridLayer. */ -export type GPUGridLayerProps = _GPUGridLayerProps & - GridAggregationLayerProps; - -/** Properties added by GPUGridLayer. */ -export type _GPUGridLayerProps = { - /** - * Size of each cell in meters. - * @default 1000 - */ - cellSize?: number; - - /** - * Color scale domain, default is set to the extent of aggregated weights in each cell. - * @default [min(colorWeight), max(colorWeight)] - */ - colorDomain?: [number, number] | null; - - /** - * Default: [colorbrewer](http://colorbrewer2.org/#type=sequential&scheme=YlOrRd&n=6) `6-class YlOrRd` - */ - colorRange?: Color[]; - - /** - * Cell size multiplier, clamped between 0 - 1. - * @default 1 - */ - coverage?: number; - - /** - * Elevation scale input domain, default is set to between 0 and the max of aggregated weights in each cell. - * @default [0, max(elevationWeight)] - */ - elevationDomain?: [number, number] | null; - - /** - * Elevation scale output range. - * @default [0, 1000] - */ - elevationRange?: [number, number]; - - /** - * Cell elevation multiplier. - * @default 1 - */ - elevationScale?: number; - - /** - * Whether to enable cell elevation. If set to false, all cell will be flat. - * @default true - */ - extruded?: boolean; - - /** - * Material settings for lighting effect. Applies if `extruded: true`. - * - * @default true - * @see https://deck.gl/docs/developer-guide/using-lighting - */ - material?: Material; - - /** - * Defines the operation used to aggregate all data object weights to calculate a cell's color value. - * @default 'SUM' - */ - colorAggregation?: 'SUM' | 'MEAN' | 'MIN' | 'MAX'; - - /** - * Defines the operation used to aggregate all data object weights to calculate a cell's elevation value. - * @default 'SUM' - */ - elevationAggregation?: 'SUM' | 'MEAN' | 'MIN' | 'MAX'; - - /** - * Method called to retrieve the position of each object. - * @default object => object.position - */ - getPosition?: AccessorFunction; - - /** - * The weight of a data object used to calculate the color value for a cell. - * @default 1 - */ - getColorWeight?: Accessor; - - /** - * The weight of a data object used to calculate the elevation value for a cell. - * @default 1 - */ - getElevationWeight?: Accessor; -}; - -/** Aggregate data into a grid-based heatmap. Aggregation is performed on GPU. */ -export default class GPUGridLayer< - DataT = any, - ExtraPropsT extends {} = {} -> extends GridAggregationLayer>> { - static layerName = 'GPUGridLayer'; - static defaultProps = defaultProps; - - state!: GridAggregationLayer['state'] & { - isSupported: boolean; - gridHash?: GridHash; - }; - - initializeState({device}: LayerContext): void { - const isSupported = GPUGridAggregator.isSupported(device); - if (!isSupported) { - log.error('GPUGridLayer is not supported on this browser, use GridLayer instead')(); - } - super.initializeAggregationLayer({ - dimensions: DIMENSIONS - }); - this.setState({ - gpuAggregation: false, // TODO(v9): Re-enable GPU aggregation. - projectPoints: false, // aggregation in world space - isSupported, - weights: { - color: { - needMin: true, - needMax: true, - combineMaxMin: true, - maxMinBuffer: device.createBuffer({ - byteLength: 4 * 4, - // @ts-expect-error webgl-legacy - accessor: {size: 4, type: GL.FLOAT, divisor: 1} - }) - }, - elevation: { - needMin: true, - needMax: true, - combineMaxMin: true, - maxMinBuffer: device.createBuffer({ - byteLength: 4 * 4, - // @ts-expect-error - accessor: {size: 4, type: GL.FLOAT, divisor: 1} - }) - } - }, - positionAttributeName: 'positions' - }); - const attributeManager = this.getAttributeManager()!; - attributeManager.add({ - [POSITION_ATTRIBUTE_NAME]: { - size: 3, - accessor: 'getPosition', - type: 'float64', - fp64: this.use64bitPositions() - }, - color: {size: 3, accessor: 'getColorWeight'}, - elevation: {size: 3, accessor: 'getElevationWeight'} - }); - } - - updateState(opts) { - if (this.state.isSupported === false) { - // Skip update, layer not supported - return; - } - super.updateState(opts); - const {aggregationDirty} = this.state; - if (aggregationDirty) { - // reset cached CPU Aggregation results (used for picking) - this.setState({ - gridHash: null - }); - } - } - - getHashKeyForIndex(index: number): string { - const {numRow, numCol, boundingBox, gridOffset} = this.state; - const gridSize = [numCol, numRow]; - const gridOrigin = [boundingBox.xMin, boundingBox.yMin]; - const cellSize = [gridOffset.xOffset, gridOffset.yOffset]; - - const yIndex = Math.floor(index / gridSize[0]); - const xIndex = index - yIndex * gridSize[0]; - // This will match the index to the hash-key to access aggregation data from CPU aggregation results. - const latIdx = Math.floor( - (yIndex * cellSize[1] + gridOrigin[1] + 90 + cellSize[1] / 2) / cellSize[1] - ); - const lonIdx = Math.floor( - (xIndex * cellSize[0] + gridOrigin[0] + 180 + cellSize[0] / 2) / cellSize[0] - ); - return `${latIdx}-${lonIdx}`; - } - - getPositionForIndex(index: number): Position { - const {numRow, numCol, boundingBox, gridOffset} = this.state; - const gridSize = [numCol, numRow]; - const gridOrigin = [boundingBox.xMin, boundingBox.yMin]; - const cellSize = [gridOffset.xOffset, gridOffset.yOffset]; - - const yIndex = Math.floor(index / gridSize[0]); - const xIndex = index - yIndex * gridSize[0]; - const yPos = yIndex * cellSize[1] + gridOrigin[1]; - const xPos = xIndex * cellSize[0] + gridOrigin[0]; - return [xPos, yPos]; - } - - getPickingInfo({info, mode}: GetPickingInfoParams): PickingInfo { - const {index} = info; - let object: any = null; - if (index >= 0) { - const gpuGridAggregator = this.state.gpuGridAggregator!; - const position = this.getPositionForIndex(index); - const colorInfo = GPUGridAggregator.getAggregationData({ - pixelIndex: index, - ...gpuGridAggregator.getData('color') - }); - const elevationInfo = GPUGridAggregator.getAggregationData({ - pixelIndex: index, - ...gpuGridAggregator.getData('elevation') - }); - - object = { - colorValue: colorInfo.cellWeight, - elevationValue: elevationInfo.cellWeight, - count: colorInfo.cellCount || elevationInfo.cellCount, - position, - totalCount: colorInfo.totalCount || elevationInfo.totalCount - }; - if (mode !== 'hover') { - // perform CPU aggregation for full list of points for each cell - const {props} = this; - let {gridHash} = this.state; - if (!gridHash) { - const {gridOffset, translation, boundingBox} = this.state; - const {viewport} = this.context; - const attributes = this.getAttributes(); - const cpuAggregation = pointToDensityGridDataCPU(props as any, { - gridOffset, - attributes, - viewport, - translation, - boundingBox - }); - gridHash = cpuAggregation.gridHash; - this.setState({gridHash}); - } - const key = this.getHashKeyForIndex(index); - const cpuAggregationData = gridHash[key]; - Object.assign(object, cpuAggregationData); - } - } - - // override object with picked cell - info.picked = Boolean(object); - info.object = object; - - return info; - } - - renderLayers() { - if (!this.state.isSupported) { - return null; - } - const { - elevationScale, - extruded, - cellSize: cellSizeMeters, - coverage, - material, - elevationRange, - colorDomain, - elevationDomain - } = this.props; - - const {weights, numRow, numCol, gridOrigin, gridOffset} = this.state; - const {color, elevation} = weights; - const colorRange = colorRangeToFlatArray(this.props.colorRange); - - const SubLayerClass = this.getSubLayerClass('gpu-grid-cell', GPUGridCellLayer); - - return new SubLayerClass( - { - gridSize: [numCol, numRow], - gridOrigin, - gridOffset: [gridOffset.xOffset, gridOffset.yOffset], - colorRange, - elevationRange, - colorDomain, - elevationDomain, - - cellSize: cellSizeMeters, - coverage, - material, - elevationScale, - extruded - }, - this.getSubLayerProps({ - id: 'gpu-grid-cell' - }), - { - data: { - attributes: { - colors: color.aggregationBuffer, - elevations: elevation.aggregationBuffer - } - }, - colorMaxMinBuffer: color.maxMinBuffer, - elevationMaxMinBuffer: elevation.maxMinBuffer, - numInstances: numCol * numRow - } - ); - } - - finalizeState(context: LayerContext) { - const {color, elevation} = this.state.weights; - [color, elevation].forEach(weight => { - const {aggregationBuffer, maxMinBuffer} = weight; - maxMinBuffer?.destroy(); - aggregationBuffer?.destroy(); - }); - super.finalizeState(context); - } - - // Aggregation Overrides - - updateAggregationState(opts) { - const {props, oldProps} = opts; - const {cellSize, coordinateSystem} = props; - const {viewport} = this.context; - const cellSizeChanged = oldProps.cellSize !== cellSize; - const {dimensions} = this.state; - - const positionsChanged = this.isAttributeChanged(POSITION_ATTRIBUTE_NAME); - // any attribute changed - const attributesChanged = positionsChanged || this.isAttributeChanged(); - - let {boundingBox} = this.state; - if (positionsChanged) { - boundingBox = getBoundingBox(this.getAttributes(), this.getNumInstances()); - this.setState({boundingBox}); - } - if (positionsChanged || cellSizeChanged) { - const {gridOffset, translation, width, height, numCol, numRow} = getGridParams( - boundingBox, - cellSize, - viewport, - coordinateSystem - ); - this.allocateResources(numRow, numCol); - this.setState({ - gridOffset, - translation, - gridOrigin: [-1 * translation[0], -1 * translation[1]], - width, - height, - numCol, - numRow - }); - } - - const aggregationDataDirty = - attributesChanged || - this.isAggregationDirty(opts, { - dimension: dimensions.data, - compareAll: true - }); - - if (aggregationDataDirty) { - this._updateAccessors(opts); - } - this.setState({ - aggregationDataDirty - }); - } - - // Private - - _updateAccessors(opts) { - const {colorAggregation, elevationAggregation} = opts.props; - const {color, elevation} = this.state.weights; - color.operation = AGGREGATION_OPERATION[colorAggregation]; - elevation.operation = AGGREGATION_OPERATION[elevationAggregation]; - } -} diff --git a/modules/aggregation-layers/src/grid-aggregation-layer.ts b/modules/aggregation-layers/src/grid-aggregation-layer.ts deleted file mode 100644 index 467a7e067de..00000000000 --- a/modules/aggregation-layers/src/grid-aggregation-layer.ts +++ /dev/null @@ -1,243 +0,0 @@ -// Copyright (c) 2015 - 2017 Uber Technologies, Inc. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -import {GL} from '@luma.gl/constants'; -import {LayerContext, log, UpdateParameters, Accessor} from '@deck.gl/core'; -import AggregationLayer, {AggregationLayerProps} from './aggregation-layer'; -import GPUGridAggregator from './utils/gpu-grid-aggregation/gpu-grid-aggregator'; -import BinSorter from './utils/bin-sorter'; -import {pointToDensityGridDataCPU} from './cpu-grid-layer/grid-aggregator'; -import type {Buffer} from '@luma.gl/core'; - -export type GridAggregationLayerProps = AggregationLayerProps; - -export default abstract class GridAggregationLayer< - DataT, - ExtraPropsT extends {} = {} -> extends AggregationLayer { - static layerName = 'GridAggregationLayer'; - - state!: AggregationLayer['state'] & { - aggregationDataDirty?: boolean; - aggregationWeightsDirty?: boolean; - aggregationDirty?: boolean; - gpuAggregation?: any; - getValue?: () => any; - sortedBins?: BinSorter; - weights: { - [key: string]: { - aggregationBuffer?: Buffer; - maxMinBuffer?: Buffer; - aggregationData: Float32Array | null; - maxMinData: Float32Array; - maxData: Float32Array; - minData: Float32Array; - getWeight: Accessor; - operation: number; - }; - }; - cpuGridAggregator?: Function; - gpuGridAggregator?: GPUGridAggregator; - layerData: any; - numRow: number; - numCol: number; - gridOffset: {xOffset: number; yOffset: number}; - posOffset: number[]; - gridOrigin: number[]; - translation: number[]; - scaling: number[]; - boundingBox: {xMin: number; yMin: number; xMax: number; yMax: number}; - projectPoints?: (p: [number, number]) => [number, number]; - }; - - initializeAggregationLayer({dimensions}) { - super.initializeAggregationLayer(dimensions); - this.setState({ - // CPU aggregation results - layerData: {}, - gpuGridAggregator: new GPUGridAggregator(this.context.device, { - id: `${this.id}-gpu-aggregator` - }), - cpuGridAggregator: pointToDensityGridDataCPU - }); - } - - updateState(opts: UpdateParameters) { - // get current attributes - super.updateState(opts); - - this.updateAggregationState(opts); - - const {aggregationDataDirty, aggregationWeightsDirty, gpuAggregation} = this.state; - if (this.getNumInstances() <= 0) { - return; - } - let aggregationDirty = false; - // CPU aggregation is two steps - // 1. Create bins (based on cellSize and position) 2. Aggregate weights for each bin - // For GPU aggregation both above steps are combined into one step - - // step-1 - if (aggregationDataDirty || (gpuAggregation && aggregationWeightsDirty)) { - this._updateAggregation(opts); - aggregationDirty = true; - } - // step-2 (Applicalbe for CPU aggregation only) - if (!gpuAggregation && (aggregationDataDirty || aggregationWeightsDirty)) { - this._updateWeightBins(); - this._uploadAggregationResults(); - aggregationDirty = true; - } - - this.setState({aggregationDirty}); - } - - finalizeState(context: LayerContext) { - const {count} = this.state.weights; - if (count && count.aggregationBuffer) { - count.aggregationBuffer.delete(); - } - this.state.gpuGridAggregator?.delete(); - super.finalizeState(context); - } - - updateShaders(shaders: any): void { - if (this.state.gpuAggregation) { - this.state.gpuGridAggregator!.updateShaders(shaders); - } - } - - // Methods that can be overriden by subclasses for customizations - - updateAggregationState(opts: UpdateParameters) { - // Sublayers should implement this method. - log.assert(false); - } - - allocateResources(numRow, numCol) { - if (this.state.numRow !== numRow || this.state.numCol !== numCol) { - const dataBytes = numCol * numRow * 4 * 4; - const {weights} = this.state; - for (const name in weights) { - const weight = weights[name]; - if (weight.aggregationBuffer) { - weight.aggregationBuffer.delete(); - } - weight.aggregationBuffer = this.context.device.createBuffer({ - byteLength: dataBytes, - // @ts-expect-error legacy - accessor: { - size: 4, - type: GL.FLOAT, - divisor: 1 - } - }); - } - } - } - - updateResults({aggregationData, maxMinData, maxData, minData}) { - const {count} = this.state.weights; - if (count) { - count.aggregationData = aggregationData; - count.maxMinData = maxMinData; - count.maxData = maxData; - count.minData = minData; - } - } - - // Private - - _updateAggregation(opts) { - const { - cpuGridAggregator, - gpuGridAggregator, - gridOffset, - posOffset, - translation = [0, 0], - scaling = [0, 0, 0], - boundingBox, - projectPoints, - gpuAggregation, - numCol, - numRow - } = this.state; - const {props} = opts; - const {viewport} = this.context; - const attributes = this.getAttributes(); - const vertexCount = this.getNumInstances(); - - if (!gpuAggregation) { - const result = cpuGridAggregator!(props, { - gridOffset, - projectPoints, - attributes, - viewport, - posOffset, - boundingBox - }); - this.setState({ - layerData: result - }); - } else { - const {weights} = this.state; - gpuGridAggregator!.run({ - weights, - cellSize: [gridOffset.xOffset, gridOffset.yOffset], - numCol, - numRow, - translation, - scaling, - vertexCount, - projectPoints, - attributes, - moduleSettings: this.getModuleSettings() - }); - } - } - - _updateWeightBins() { - const {getValue} = this.state; - - const sortedBins = new BinSorter(this.state.layerData.data || [], {getValue}); - this.setState({sortedBins}); - } - - _uploadAggregationResults(): void { - const {numCol, numRow} = this.state; - const {data} = this.state.layerData; - const {aggregatedBins, minValue, maxValue, totalCount} = this.state.sortedBins!; - - const ELEMENTCOUNT = 4; - const aggregationSize = numCol * numRow * ELEMENTCOUNT; - const aggregationData = new Float32Array(aggregationSize).fill(0); - for (const bin of aggregatedBins) { - const {lonIdx, latIdx} = data[bin.i]; - const {value, counts} = bin; - const cellIndex = (lonIdx + latIdx * numCol) * ELEMENTCOUNT; - aggregationData[cellIndex] = value; - aggregationData[cellIndex + ELEMENTCOUNT - 1] = counts; - } - const maxMinData = new Float32Array([maxValue, 0, 0, minValue]); - const maxData = new Float32Array([maxValue, 0, 0, totalCount]); - const minData = new Float32Array([minValue, 0, 0, totalCount]); - this.updateResults({aggregationData, maxMinData, maxData, minData}); - } -} diff --git a/modules/aggregation-layers/src/grid-layer/bin-options-uniforms.ts b/modules/aggregation-layers/src/grid-layer/bin-options-uniforms.ts new file mode 100644 index 00000000000..b79f84f4596 --- /dev/null +++ b/modules/aggregation-layers/src/grid-layer/bin-options-uniforms.ts @@ -0,0 +1,22 @@ +import type {ShaderModule} from '@luma.gl/shadertools'; + +const uniformBlock = /* glsl */ `\ +uniform binOptionsUniforms { + vec2 cellOriginCommon; + vec2 cellSizeCommon; +} binOptions; +`; + +export type BinOptions = { + cellOriginCommon: [number, number]; + cellSizeCommon: [number, number]; +}; + +export const binOptionsUniforms = { + name: 'binOptions', + vs: uniformBlock, + uniformTypes: { + cellOriginCommon: 'vec2', + cellSizeCommon: 'vec2' + } +} as const satisfies ShaderModule; diff --git a/modules/aggregation-layers/src/grid-layer/grid-cell-layer-vertex.glsl.ts b/modules/aggregation-layers/src/grid-layer/grid-cell-layer-vertex.glsl.ts new file mode 100644 index 00000000000..11e49390076 --- /dev/null +++ b/modules/aggregation-layers/src/grid-layer/grid-cell-layer-vertex.glsl.ts @@ -0,0 +1,68 @@ +// deck.gl +// SPDX-License-Identifier: MIT +// Copyright (c) vis.gl contributors + +export default /* glsl */ `#version 300 es + +#define SHADER_NAME grid-cell-layer-vertex-shader + +in vec3 positions; +in vec3 normals; + +in vec2 instancePositions; +in float instanceElevationValues; +in float instanceColorValues; +in vec3 instancePickingColors; + +uniform sampler2D colorRange; + +// Result +out vec4 vColor; + +float interp(float value, vec2 domain, vec2 range) { + float r = min(max((value - domain.x) / (domain.y - domain.x), 0.), 1.); + return mix(range.x, range.y, r); +} + +vec4 interp(float value, vec2 domain, sampler2D range) { + float r = (value - domain.x) / (domain.y - domain.x); + return texture(range, vec2(r, 0.5)); +} + +void main(void) { + geometry.pickingColor = instancePickingColors; + + if (isnan(instanceColorValues) || + instanceColorValues < grid.colorDomain.z || + instanceColorValues > grid.colorDomain.w || + instanceElevationValues < grid.elevationDomain.z || + instanceElevationValues > grid.elevationDomain.w + ) { + gl_Position = vec4(0.); + return; + } + + vec2 commonPosition = (instancePositions + (positions.xy + 1.0) / 2.0 * column.coverage) * grid.sizeCommon + grid.originCommon - project.commonOrigin.xy; + geometry.position = vec4(commonPosition, 0.0, 1.0); + geometry.normal = project_normal(normals); + + // calculate z, if 3d not enabled set to 0 + float elevation = 0.0; + if (column.extruded) { + elevation = interp(instanceElevationValues, grid.elevationDomain.xy, grid.elevationRange); + elevation = project_size(elevation); + // cylindar gemoetry height are between -1.0 to 1.0, transform it to between 0, 1 + geometry.position.z = (positions.z + 1.0) / 2.0 * elevation; + } + + gl_Position = project_common_position_to_clipspace(geometry.position); + DECKGL_FILTER_GL_POSITION(gl_Position, geometry); + + vColor = interp(instanceColorValues, grid.colorDomain.xy, colorRange); + vColor.a *= layer.opacity; + if (column.extruded) { + vColor.rgb = lighting_getLightColor(vColor.rgb, project.cameraPosition, geometry.position.xyz, geometry.normal); + } + DECKGL_FILTER_COLOR(vColor, geometry); +} +`; diff --git a/modules/aggregation-layers/src/grid-layer/grid-cell-layer.ts b/modules/aggregation-layers/src/grid-layer/grid-cell-layer.ts new file mode 100644 index 00000000000..1391e32e583 --- /dev/null +++ b/modules/aggregation-layers/src/grid-layer/grid-cell-layer.ts @@ -0,0 +1,141 @@ +// deck.gl +// SPDX-License-Identifier: MIT +// Copyright (c) vis.gl contributors + +import {Texture} from '@luma.gl/core'; +import {UpdateParameters, Color} from '@deck.gl/core'; +import {ColumnLayer} from '@deck.gl/layers'; +import {CubeGeometry} from '@luma.gl/engine'; +import {createColorRangeTexture, updateColorRangeTexture} from '../common/utils/color-utils'; +import vs from './grid-cell-layer-vertex.glsl'; +import {GridProps, gridUniforms} from './grid-layer-uniforms'; +import type {ScaleType} from '../common/types'; + +/** Proprties added by GridCellLayer. */ +type GridCellLayerProps = { + cellSizeCommon: [number, number]; + cellOriginCommon: [number, number]; + colorDomain: [number, number]; + colorCutoff: [number, number] | null; + colorRange: Color[]; + colorScaleType: ScaleType; + elevationDomain: [number, number]; + elevationCutoff: [number, number] | null; + elevationRange: [number, number]; +}; + +export class GridCellLayer extends ColumnLayer< + null, + ExtraPropsT & Required +> { + static layerName = 'GridCellLayer'; + + state!: ColumnLayer['state'] & { + colorTexture: Texture; + }; + + getShaders() { + const shaders = super.getShaders(); + shaders.modules.push(gridUniforms); + return {...shaders, vs}; + } + + initializeState() { + super.initializeState(); + + const attributeManager = this.getAttributeManager()!; + attributeManager.remove([ + 'instanceElevations', + 'instanceFillColors', + 'instanceLineColors', + 'instanceStrokeWidths' + ]); + attributeManager.addInstanced({ + instancePositions: { + size: 2, + type: 'float32', + accessor: 'getBin' + }, + instanceColorValues: { + size: 1, + type: 'float32', + accessor: 'getColorValue' + }, + instanceElevationValues: { + size: 1, + type: 'float32', + accessor: 'getElevationValue' + } + }); + } + + updateState(params: UpdateParameters) { + super.updateState(params); + + const {props, oldProps} = params; + const model = this.state.fillModel!; + + if (oldProps.colorRange !== props.colorRange) { + this.state.colorTexture?.destroy(); + this.state.colorTexture = createColorRangeTexture( + this.context.device, + props.colorRange, + props.colorScaleType + ); + const gridProps: Partial = {colorRange: this.state.colorTexture}; + model.shaderInputs.setProps({grid: gridProps}); + } else if (oldProps.colorScaleType !== props.colorScaleType) { + updateColorRangeTexture(this.state.colorTexture, props.colorScaleType); + } + } + + finalizeState(context) { + super.finalizeState(context); + + this.state.colorTexture?.destroy(); + } + + protected _updateGeometry() { + const geometry = new CubeGeometry(); + this.state.fillModel!.setGeometry(geometry); + } + + draw({uniforms}) { + const { + cellOriginCommon, + cellSizeCommon, + elevationRange, + elevationScale, + extruded, + coverage, + colorDomain, + elevationDomain + } = this.props; + const colorCutoff = this.props.colorCutoff || [-Infinity, Infinity]; + const elevationCutoff = this.props.elevationCutoff || [-Infinity, Infinity]; + const fillModel = this.state.fillModel!; + + const gridProps: Omit = { + colorDomain: [ + Math.max(colorDomain[0], colorCutoff[0]), // instanceColorValue that maps to colorRange[0] + Math.min(colorDomain[1], colorCutoff[1]), // instanceColorValue that maps to colorRange[colorRange.length - 1] + Math.max(colorDomain[0] - 1, colorCutoff[0]), // hide cell if instanceColorValue is less than this + Math.min(colorDomain[1] + 1, colorCutoff[1]) // hide cell if instanceColorValue is greater than this + ], + elevationDomain: [ + Math.max(elevationDomain[0], elevationCutoff[0]), // instanceElevationValue that maps to elevationRange[0] + Math.min(elevationDomain[1], elevationCutoff[1]), // instanceElevationValue that maps to elevationRange[elevationRange.length - 1] + Math.max(elevationDomain[0] - 1, elevationCutoff[0]), // hide cell if instanceElevationValue is less than this + Math.min(elevationDomain[1] + 1, elevationCutoff[1]) // hide cell if instanceElevationValue is greater than this + ], + elevationRange: [elevationRange[0] * elevationScale, elevationRange[1] * elevationScale], + originCommon: cellOriginCommon, + sizeCommon: cellSizeCommon + }; + fillModel.shaderInputs.setProps({ + column: {extruded, coverage}, + grid: gridProps + }); + fillModel.draw(this.context.renderPass); + } +} diff --git a/modules/aggregation-layers/src/grid-layer/grid-layer-uniforms.ts b/modules/aggregation-layers/src/grid-layer/grid-layer-uniforms.ts new file mode 100644 index 00000000000..506178f282a --- /dev/null +++ b/modules/aggregation-layers/src/grid-layer/grid-layer-uniforms.ts @@ -0,0 +1,33 @@ +import {Texture} from '@luma.gl/core'; +import type {ShaderModule} from '@luma.gl/shadertools'; + +const uniformBlock = /* glsl */ `\ +uniform gridUniforms { + vec4 colorDomain; + vec4 elevationDomain; + vec2 elevationRange; + vec2 originCommon; + vec2 sizeCommon; +} grid; +`; + +export type GridProps = { + colorDomain: [number, number, number, number]; + colorRange: Texture; + elevationDomain: [number, number, number, number]; + elevationRange: [number, number]; + originCommon: [number, number]; + sizeCommon: [number, number]; +}; + +export const gridUniforms = { + name: 'grid', + vs: uniformBlock, + uniformTypes: { + colorDomain: 'vec4', + elevationDomain: 'vec4', + elevationRange: 'vec2', + originCommon: 'vec2', + sizeCommon: 'vec2' + } +} as const satisfies ShaderModule; diff --git a/modules/aggregation-layers/src/grid-layer/grid-layer.ts b/modules/aggregation-layers/src/grid-layer/grid-layer.ts index 9d6c7a0d312..b5049b7d9f3 100644 --- a/modules/aggregation-layers/src/grid-layer/grid-layer.ts +++ b/modules/aggregation-layers/src/grid-layer/grid-layer.ts @@ -1,112 +1,657 @@ +// deck.gl +// SPDX-License-Identifier: MIT +// Copyright (c) vis.gl contributors + import { - CompositeLayer, + log, + Accessor, + Color, + GetPickingInfoParams, CompositeLayerProps, + createIterable, Layer, + Material, + project32, + LayersList, + PickingInfo, + Position, + Viewport, UpdateParameters, DefaultProps } from '@deck.gl/core'; -import GPUGridAggregator from '../utils/gpu-grid-aggregation/gpu-grid-aggregator'; -import GPUGridLayer, {GPUGridLayerProps} from '../gpu-grid-layer/gpu-grid-layer'; -import CPUGridLayer, {CPUGridLayerProps} from '../cpu-grid-layer/cpu-grid-layer'; +import {WebGLAggregator, CPUAggregator, AggregationOperation} from '../common/aggregator/index'; +import AggregationLayer from '../common/aggregation-layer'; +import {AggregateAccessor} from '../common/types'; +import {defaultColorRange} from '../common/utils/color-utils'; +import {AttributeWithScale} from '../common/utils/scale-utils'; + +import {GridCellLayer} from './grid-cell-layer'; +import {BinOptions, binOptionsUniforms} from './bin-options-uniforms'; + +// eslint-disable-next-line @typescript-eslint/no-empty-function +function noop() {} const defaultProps: DefaultProps = { - ...GPUGridLayer.defaultProps, - ...CPUGridLayer.defaultProps, - gpuAggregation: false + gpuAggregation: false, + + // color + colorDomain: null, + colorRange: defaultColorRange, + getColorValue: {type: 'accessor', value: null}, // default value is calculated from `getColorWeight` and `colorAggregation` + getColorWeight: {type: 'accessor', value: 1}, + colorAggregation: 'SUM', + lowerPercentile: {type: 'number', min: 0, max: 100, value: 0}, + upperPercentile: {type: 'number', min: 0, max: 100, value: 100}, + colorScaleType: 'quantize', + onSetColorDomain: noop, + + // elevation + elevationDomain: null, + elevationRange: [0, 1000], + getElevationValue: {type: 'accessor', value: null}, // default value is calculated from `getElevationWeight` and `elevationAggregation` + getElevationWeight: {type: 'accessor', value: 1}, + elevationAggregation: 'SUM', + elevationScale: {type: 'number', min: 0, value: 1}, + elevationLowerPercentile: {type: 'number', min: 0, max: 100, value: 0}, + elevationUpperPercentile: {type: 'number', min: 0, max: 100, value: 100}, + elevationScaleType: 'linear', + onSetElevationDomain: noop, + + // grid + cellSize: {type: 'number', min: 0, value: 1000}, + coverage: {type: 'number', min: 0, max: 1, value: 1}, + getPosition: {type: 'accessor', value: (x: any) => x.position}, + gridAggregator: {type: 'function', optional: true, value: null}, + extruded: false, + + // Optional material for 'lighting' shader module + material: true }; /** All properties supported by GridLayer. */ export type GridLayerProps = _GridLayerProps & CompositeLayerProps; /** Properties added by GridLayer. */ -type _GridLayerProps = CPUGridLayerProps & - GPUGridLayerProps & { - /** - * Whether the aggregation should be performed in high-precision 64-bit mode. - * @default false - */ - fp64?: boolean; - - /** - * When set to true, aggregation is performed on GPU, provided other conditions are met. - * @default false - */ - gpuAggregation?: boolean; - }; +type _GridLayerProps = { + /** + * Custom accessor to retrieve a grid bin index from each data object. + * Not supported by GPU aggregation. + */ + gridAggregator?: ((position: number[], cellSize: number) => [number, number]) | null; + + /** + * Size of each cell in meters. + * @default 1000 + */ + cellSize?: number; + + /** + * Color scale domain, default is set to the extent of aggregated weights in each cell. + * @default [min(colorWeight), max(colorWeight)] + */ + colorDomain?: [number, number] | null; + + /** + * Default: [colorbrewer](http://colorbrewer2.org/#type=sequential&scheme=YlOrRd&n=6) `6-class YlOrRd` + */ + colorRange?: Color[]; + + /** + * Cell size multiplier, clamped between 0 - 1. + * @default 1 + */ + coverage?: number; + + /** + * Elevation scale input domain, default is set to between 0 and the max of aggregated weights in each cell. + * @default [0, max(elevationWeight)] + */ + elevationDomain?: [number, number] | null; + + /** + * Elevation scale output range. + * @default [0, 1000] + */ + elevationRange?: [number, number]; + + /** + * Cell elevation multiplier. + * @default 1 + */ + elevationScale?: number; + + /** + * Whether to enable cell elevation. If set to false, all cell will be flat. + * @default true + */ + extruded?: boolean; + + /** + * Filter cells and re-calculate color by `upperPercentile`. + * Cells with value larger than the upperPercentile will be hidden. + * @default 100 + */ + upperPercentile?: number; + + /** + * Filter cells and re-calculate color by `lowerPercentile`. + * Cells with value smaller than the lowerPercentile will be hidden. + * @default 0 + */ + lowerPercentile?: number; + + /** + * Filter cells and re-calculate elevation by `elevationUpperPercentile`. + * Cells with elevation value larger than the `elevationUpperPercentile` will be hidden. + * @default 100 + */ + elevationUpperPercentile?: number; + + /** + * Filter cells and re-calculate elevation by `elevationLowerPercentile`. + * Cells with elevation value larger than the `elevationLowerPercentile` will be hidden. + * @default 0 + */ + elevationLowerPercentile?: number; + + /** + * Scaling function used to determine the color of the grid cell. + * Supported Values are 'quantize', 'linear', 'quantile' and 'ordinal'. + * @default 'quantize' + */ + colorScaleType?: 'quantize' | 'linear' | 'quantile' | 'ordinal'; + + /** + * Scaling function used to determine the elevation of the grid cell. + * Supported Values are 'linear' and 'quantile'. + * @default 'linear' + */ + elevationScaleType?: 'linear' | 'quantile'; + + /** + * Material settings for lighting effect. Applies if `extruded: true`. + * + * @default true + * @see https://deck.gl/docs/developer-guide/using-lighting + */ + material?: Material; + + /** + * Defines the operation used to aggregate all data object weights to calculate a cell's color value. + * Valid values are 'SUM', 'MEAN', 'MIN', 'MAX', 'COUNT'. + * + * @default 'SUM' + */ + colorAggregation?: AggregationOperation; + + /** + * Defines the operation used to aggregate all data object weights to calculate a cell's elevation value. + * Valid values are 'SUM', 'MEAN', 'MIN', 'MAX', 'COUNT'. + * + * @default 'SUM' + */ + elevationAggregation?: AggregationOperation; + + /** + * Method called to retrieve the position of each object. + * @default object => object.position + */ + getPosition?: Accessor; + + /** + * The weight of a data object used to calculate the color value for a cell. + * @default 1 + */ + getColorWeight?: Accessor; + + /** + * After data objects are aggregated into cells, this accessor is called on each cell to get the value that its color is based on. + * Not supported by GPU aggregation. + * @default null + */ + getColorValue?: AggregateAccessor | null; + + /** + * The weight of a data object used to calculate the elevation value for a cell. + * @default 1 + */ + getElevationWeight?: Accessor; + + /** + * After data objects are aggregated into cells, this accessor is called on each cell to get the value that its elevation is based on. + * Not supported by GPU aggregation. + * @default null + */ + getElevationValue?: AggregateAccessor | null; + + /** + * This callback will be called when bin color domain has been calculated. + * @default () => {} + */ + onSetColorDomain?: (minMax: [number, number]) => void; + + /** + * This callback will be called when bin elevation domain has been calculated. + * @default () => {} + */ + onSetElevationDomain?: (minMax: [number, number]) => void; + + /** + * When set to true, aggregation is performed on GPU, provided other conditions are met. + * @default false + */ + gpuAggregation?: boolean; +}; + +export type GridLayerPickingInfo = PickingInfo<{ + /** Column index of the picked cell */ + col: number; + /** Row index of the picked cell */ + row: number; + /** Aggregated color value, as determined by `getColorWeight` and `colorAggregation` */ + colorValue: number; + /** Aggregated elevation value, as determined by `getElevationWeight` and `elevationAggregation` */ + elevationValue: number; + /** Number of data points in the picked cell */ + count: number; + /** Indices of the data objects in the picked cell. Only available if using CPU aggregation. */ + pointIndices?: number[]; + /** The data objects in the picked cell. Only available if using CPU aggregation and layer data is an array. */ + points?: DataT[]; +}>; /** Aggregate data into a grid-based heatmap. The color and height of a cell are determined based on the objects it contains. */ -export default class GridLayer extends CompositeLayer< +export default class GridLayer extends AggregationLayer< + DataT, ExtraPropsT & Required<_GridLayerProps> > { static layerName = 'GridLayer'; static defaultProps = defaultProps; - state!: CompositeLayer['state'] & { - useGPUAggregation: boolean; - }; + state!: AggregationLayer['state'] & + BinOptions & { + // Needed if getColorValue, getElevationValue are used + dataAsArray?: DataT[]; - initializeState() { - this.state = { - useGPUAggregation: false // TODO(v9): Re-enable GPU aggregation. + colors?: AttributeWithScale; + elevations?: AttributeWithScale; + + binIdRange: [number, number][]; + aggregatorViewport: Viewport; }; + + getAggregatorType(): string { + const {gpuAggregation, gridAggregator, getColorValue, getElevationValue} = this.props; + if (gpuAggregation && (gridAggregator || getColorValue || getElevationValue)) { + // If these features are desired by the app, the user should explicitly use CPU aggregation + log.warn('Features not supported by GPU aggregation, falling back to CPU')(); + return 'cpu'; + } + + if ( + // GPU aggregation is requested + gpuAggregation && + // GPU aggregation is supported by the device + WebGLAggregator.isSupported(this.context.device) + ) { + return 'gpu'; + } + return 'cpu'; } - updateState({props}: UpdateParameters) { - this.setState({ - // TODO(v9): Re-enable GPU aggregation. - // useGPUAggregation: this.canUseGPUAggregation(props) - useGPUAggregation: false + createAggregator(type: string): WebGLAggregator | CPUAggregator { + if (type === 'cpu') { + const {gridAggregator, cellSize} = this.props; + return new CPUAggregator({ + dimensions: 2, + getBin: { + sources: ['positions'], + getValue: ({positions}: {positions: number[]}, index: number, opts: BinOptions) => { + if (gridAggregator) { + return gridAggregator(positions, cellSize); + } + const viewport = this.state.aggregatorViewport; + // project to common space + const p = viewport.projectPosition(positions); + const {cellSizeCommon, cellOriginCommon} = opts; + return [ + Math.floor((p[0] - cellOriginCommon[0]) / cellSizeCommon[0]), + Math.floor((p[1] - cellOriginCommon[1]) / cellSizeCommon[1]) + ]; + } + }, + getValue: [ + {sources: ['colorWeights'], getValue: ({colorWeights}) => colorWeights}, + {sources: ['elevationWeights'], getValue: ({elevationWeights}) => elevationWeights} + ] + }); + } + return new WebGLAggregator(this.context.device, { + dimensions: 2, + channelCount: 2, + bufferLayout: this.getAttributeManager()!.getBufferLayouts({isInstanced: false}), + ...super.getShaders({ + modules: [project32, binOptionsUniforms], + vs: /* glsl */ ` + in vec3 positions; + in vec3 positions64Low; + in float colorWeights; + in float elevationWeights; + + void getBin(out ivec2 binId) { + vec3 positionCommon = project_position(positions, positions64Low); + vec2 gridCoords = floor(positionCommon.xy / binOptions.cellSizeCommon); + binId = ivec2(gridCoords); + } + void getValue(out vec2 value) { + value = vec2(colorWeights, elevationWeights); + } + ` + }) }); } - renderLayers(): Layer { - const {data, updateTriggers} = this.props; - const id = this.state.useGPUAggregation ? 'GPU' : 'CPU'; - const LayerType = this.state.useGPUAggregation - ? this.getSubLayerClass('GPU', GPUGridLayer) - : this.getSubLayerClass('CPU', CPUGridLayer); - return new LayerType( - this.props, - this.getSubLayerProps({ - id, - updateTriggers - }), - { - data + initializeState() { + super.initializeState(); + + const attributeManager = this.getAttributeManager()!; + attributeManager.add({ + positions: { + size: 3, + accessor: 'getPosition', + type: 'float64', + fp64: this.use64bitPositions() + }, + colorWeights: {size: 1, accessor: 'getColorWeight'}, + elevationWeights: {size: 1, accessor: 'getElevationWeight'} + }); + } + + updateState(params: UpdateParameters) { + const aggregatorChanged = super.updateState(params); + + const {props, oldProps, changeFlags} = params; + const {aggregator} = this.state; + if ( + (changeFlags.dataChanged || !this.state.dataAsArray) && + (props.getColorValue || props.getElevationValue) + ) { + // Convert data to array + this.state.dataAsArray = Array.from(createIterable(props.data).iterable); + } + if ( + aggregatorChanged || + changeFlags.dataChanged || + props.cellSize !== oldProps.cellSize || + props.getColorValue !== oldProps.getColorValue || + props.getElevationValue !== oldProps.getElevationValue || + props.colorAggregation !== oldProps.colorAggregation || + props.elevationAggregation !== oldProps.elevationAggregation + ) { + this._updateBinOptions(); + const {cellSizeCommon, cellOriginCommon, binIdRange, dataAsArray} = this.state; + + aggregator.setProps({ + // @ts-expect-error only used by GPUAggregator + binIdRange, + pointCount: this.getNumInstances(), + operations: [props.colorAggregation, props.elevationAggregation], + binOptions: { + cellSizeCommon, + cellOriginCommon + }, + onUpdate: this._onAggregationUpdate.bind(this) + }); + + if (dataAsArray) { + const {getColorValue, getElevationValue} = this.props; + aggregator.setProps({ + // @ts-expect-error only used by CPUAggregator + customOperations: [ + getColorValue && + ((indices: number[]) => + getColorValue( + indices.map(i => dataAsArray[i]), + {indices, data: props.data} + )), + getElevationValue && + ((indices: number[]) => + getElevationValue( + indices.map(i => dataAsArray[i]), + {indices, data: props.data} + )) + ] + }); } - ); + } + if (changeFlags.updateTriggersChanged && changeFlags.updateTriggersChanged.getColorValue) { + aggregator.setNeedsUpdate(0); + } + if (changeFlags.updateTriggersChanged && changeFlags.updateTriggersChanged.getElevationValue) { + aggregator.setNeedsUpdate(1); + } + + return aggregatorChanged; } - // Private methods + private _updateBinOptions() { + const bounds = this.getBounds(); + const cellSizeCommon: [number, number] = [1, 1]; + let cellOriginCommon: [number, number] = [0, 0]; + const binIdRange: [number, number][] = [ + [0, 1], + [0, 1] + ]; + let viewport = this.context.viewport; - canUseGPUAggregation(props: GridLayer['props']) { - const { - gpuAggregation, - lowerPercentile, - upperPercentile, - getColorValue, - getElevationValue, - colorScaleType - } = props; - if (!gpuAggregation) { - // cpu aggregation is requested - return false; + if (bounds && Number.isFinite(bounds[0][0])) { + let centroid = [(bounds[0][0] + bounds[1][0]) / 2, (bounds[0][1] + bounds[1][1]) / 2]; + const {cellSize} = this.props; + const {unitsPerMeter} = viewport.getDistanceScales(centroid); + cellSizeCommon[0] = unitsPerMeter[0] * cellSize; + cellSizeCommon[1] = unitsPerMeter[1] * cellSize; + + // Offset common space to center at the origin of the grid cell where the data center is in + // This improves precision without affecting the cell positions + const centroidCommon = viewport.projectFlat(centroid); + cellOriginCommon = [ + Math.floor(centroidCommon[0] / cellSizeCommon[0]) * cellSizeCommon[0], + Math.floor(centroidCommon[1] / cellSizeCommon[1]) * cellSizeCommon[1] + ]; + centroid = viewport.unprojectFlat(cellOriginCommon); + + const ViewportType = viewport.constructor as any; + // We construct a viewport for the GPU aggregator's project module + // This viewport is determined by data + // removes arbitrary precision variance that depends on initial view state + viewport = viewport.isGeospatial + ? new ViewportType({longitude: centroid[0], latitude: centroid[1], zoom: 12}) + : new Viewport({position: [centroid[0], centroid[1], 0], zoom: 12}); + + // Round to the nearest 32-bit float to match CPU and GPU results + cellOriginCommon = [Math.fround(viewport.center[0]), Math.fround(viewport.center[1])]; + + const corners = [ + bounds[0], + bounds[1], + [bounds[0][0], bounds[1][1]], + [bounds[1][0], bounds[0][1]] + ].map(p => viewport.projectFlat(p)); + + const minX = Math.min(...corners.map(p => p[0])); + const minY = Math.min(...corners.map(p => p[1])); + const maxX = Math.max(...corners.map(p => p[0])); + const maxY = Math.max(...corners.map(p => p[1])); + binIdRange[0][0] = Math.floor((minX - cellOriginCommon[0]) / cellSizeCommon[0]); + binIdRange[0][1] = Math.floor((maxX - cellOriginCommon[0]) / cellSizeCommon[0]) + 1; + binIdRange[1][0] = Math.floor((minY - cellOriginCommon[1]) / cellSizeCommon[1]); + binIdRange[1][1] = Math.floor((maxY - cellOriginCommon[1]) / cellSizeCommon[1]) + 1; + } + + this.setState({cellSizeCommon, cellOriginCommon, binIdRange, aggregatorViewport: viewport}); + } + + override draw(opts) { + // Replaces render time viewport with our own + if (opts.moduleParameters.viewport) { + opts.moduleParameters.viewport = this.state.aggregatorViewport; } - if (!GPUGridAggregator.isSupported(this.context.device)) { - return false; + super.draw(opts); + } + + private _onAggregationUpdate({channel}: {channel: number}) { + const props = this.getCurrentLayer()!.props; + const {aggregator} = this.state; + if (channel === 0) { + const result = aggregator.getResult(0)!; + this.setState({ + colors: new AttributeWithScale(result, aggregator.binCount) + }); + props.onSetColorDomain(aggregator.getResultDomain(0)); + } else if (channel === 1) { + const result = aggregator.getResult(1)!; + this.setState({ + elevations: new AttributeWithScale(result, aggregator.binCount) + }); + props.onSetElevationDomain(aggregator.getResultDomain(1)); } - if (lowerPercentile !== 0 || upperPercentile !== 100) { - // percentile calculations requires sorting not supported on GPU - return false; + } + + onAttributeChange(id: string) { + const {aggregator} = this.state; + switch (id) { + case 'positions': + aggregator.setNeedsUpdate(); + + this._updateBinOptions(); + const {cellSizeCommon, cellOriginCommon, binIdRange} = this.state; + aggregator.setProps({ + // @ts-expect-error only used by GPUAggregator + binIdRange, + binOptions: { + cellSizeCommon, + cellOriginCommon + } + }); + break; + + case 'colorWeights': + aggregator.setNeedsUpdate(0); + break; + + case 'elevationWeights': + aggregator.setNeedsUpdate(1); + break; + + default: + // This should not happen } - if (getColorValue !== null || getElevationValue !== null) { - // accessor for custom color or elevation calculation is specified - return false; + } + + renderLayers(): LayersList | Layer | null { + const {aggregator, cellOriginCommon, cellSizeCommon} = this.state; + const { + elevationScale, + colorRange, + elevationRange, + extruded, + coverage, + material, + transitions, + colorScaleType, + lowerPercentile, + upperPercentile, + colorDomain, + elevationScaleType, + elevationLowerPercentile, + elevationUpperPercentile, + elevationDomain + } = this.props; + const CellLayerClass = this.getSubLayerClass('cells', GridCellLayer); + const binAttribute = aggregator.getBins(); + + const colors = this.state.colors?.update({ + scaleType: colorScaleType, + lowerPercentile, + upperPercentile + }); + const elevations = this.state.elevations?.update({ + scaleType: elevationScaleType, + lowerPercentile: elevationLowerPercentile, + upperPercentile: elevationUpperPercentile + }); + + if (!colors || !elevations) { + return null; } - if (colorScaleType === 'quantile' || colorScaleType === 'ordinal') { - // quantile and ordinal scales are not supported on GPU - return false; + + return new CellLayerClass( + this.getSubLayerProps({ + id: 'cells' + }), + { + data: { + length: aggregator.binCount, + attributes: { + getBin: binAttribute, + getColorValue: colors.attribute, + getElevationValue: elevations.attribute + } + }, + // Data has changed shallowly, but we likely don't need to update the attributes + dataComparator: (data, oldData) => data.length === oldData.length, + updateTriggers: { + getBin: [binAttribute], + getColorValue: [colors.attribute], + getElevationValue: [elevations.attribute] + }, + cellOriginCommon, + cellSizeCommon, + elevationScale, + colorRange, + colorScaleType, + elevationRange, + extruded, + coverage, + material, + colorDomain: colors.domain || colorDomain || aggregator.getResultDomain(0), + elevationDomain: elevations.domain || elevationDomain || aggregator.getResultDomain(1), + colorCutoff: colors.cutoff, + elevationCutoff: elevations.cutoff, + transitions: transitions && { + getFillColor: transitions.getColorValue || transitions.getColorWeight, + getElevation: transitions.getElevationValue || transitions.getElevationWeight + }, + // Extensions are already handled by the GPUAggregator, do not pass it down + extensions: [] + } + ); + } + + getPickingInfo(params: GetPickingInfoParams): GridLayerPickingInfo { + const info: GridLayerPickingInfo = params.info; + const {index} = info; + if (index >= 0) { + const bin = this.state.aggregator.getBin(index); + let object: GridLayerPickingInfo['object']; + if (bin) { + object = { + col: bin.id[0], + row: bin.id[1], + colorValue: bin.value[0], + elevationValue: bin.value[1], + count: bin.count + }; + if (bin.pointIndices) { + object.pointIndices = bin.pointIndices; + object.points = Array.isArray(this.props.data) + ? bin.pointIndices.map(i => (this.props.data as DataT[])[i]) + : []; + } + } + info.object = object; } - return true; + + return info; } } diff --git a/modules/aggregation-layers/src/aggregation-layer.ts b/modules/aggregation-layers/src/heatmap-layer/aggregation-layer.ts similarity index 98% rename from modules/aggregation-layers/src/aggregation-layer.ts rename to modules/aggregation-layers/src/heatmap-layer/aggregation-layer.ts index 65930d676e6..310a48e1fd5 100644 --- a/modules/aggregation-layers/src/aggregation-layer.ts +++ b/modules/aggregation-layers/src/heatmap-layer/aggregation-layer.ts @@ -27,12 +27,13 @@ import { CompositeLayerProps, Attribute } from '@deck.gl/core'; -import {filterProps} from './utils/prop-utils'; +import {filterProps} from '../common/utils/prop-utils'; export type AggregationLayerProps = CompositeLayerProps & { data: LayerDataSource; }; +/** Legacy AggregationLayer, to be removed in v9.1 */ export default abstract class AggregationLayer< DataT, ExtraPropsT extends {} = {} diff --git a/modules/aggregation-layers/src/heatmap-layer/heatmap-layer.ts b/modules/aggregation-layers/src/heatmap-layer/heatmap-layer.ts index b1fafe78386..258c0301e9a 100644 --- a/modules/aggregation-layers/src/heatmap-layer/heatmap-layer.ts +++ b/modules/aggregation-layers/src/heatmap-layer/heatmap-layer.ts @@ -45,8 +45,8 @@ import { project32 } from '@deck.gl/core'; import TriangleLayer from './triangle-layer'; -import AggregationLayer, {AggregationLayerProps} from '../aggregation-layer'; -import {defaultColorRange, colorRangeToFlatArray} from '../utils/color-utils'; +import AggregationLayer, {AggregationLayerProps} from './aggregation-layer'; +import {defaultColorRange, colorRangeToFlatArray} from '../common/utils/color-utils'; import weightsVs from './weights-vs.glsl'; import weightsFs from './weights-fs.glsl'; import maxVs from './max-vs.glsl'; @@ -574,9 +574,10 @@ export default class HeatmapLayer< if (colorTexture && colorTexture?.width === colorRange.length) { // TODO(v9): Unclear whether `setSubImageData` is a public API, or what to use if not. - (colorTexture as any).setSubImageData({data: colors}); + (colorTexture as any).setTexture2DData({data: colors}); } else { colorTexture?.destroy(); + // @ts-expect-error TODO(ib) - texture API change colorTexture = this.context.device.createTexture({ ...TEXTURE_PROPS, data: colors, diff --git a/modules/aggregation-layers/src/hexagon-layer/bin-options-uniforms.ts b/modules/aggregation-layers/src/hexagon-layer/bin-options-uniforms.ts new file mode 100644 index 00000000000..ec957b533c7 --- /dev/null +++ b/modules/aggregation-layers/src/hexagon-layer/bin-options-uniforms.ts @@ -0,0 +1,23 @@ +import type {ShaderModule} from '@luma.gl/shadertools'; +import {NumberArray2} from '@math.gl/core'; + +const uniformBlock = /* glsl */ `\ +uniform binOptionsUniforms { + vec2 hexOriginCommon; + float radiusCommon; +} binOptions; +`; + +export type BinOptions = { + hexOriginCommon: NumberArray2; + radiusCommon: number; +}; + +export const binOptionsUniforms = { + name: 'binOptions', + vs: uniformBlock, + uniformTypes: { + hexOriginCommon: 'vec2', + radiusCommon: 'f32' + } +} as const satisfies ShaderModule; diff --git a/modules/aggregation-layers/src/hexagon-layer/hexagon-aggregator.ts b/modules/aggregation-layers/src/hexagon-layer/hexagon-aggregator.ts deleted file mode 100644 index 2b6ae6fd98d..00000000000 --- a/modules/aggregation-layers/src/hexagon-layer/hexagon-aggregator.ts +++ /dev/null @@ -1,127 +0,0 @@ -// Copyright (c) 2015 - 2017 Uber Technologies, Inc. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -import {hexbin} from 'd3-hexbin'; -import {createIterable, log} from '@deck.gl/core'; - -/** - * Use d3-hexbin to performs hexagonal binning from geo points to hexagons - * @param {Iterable} data - array of points - * @param {Number} radius - hexagon radius in meter - * @param {function} getPosition - get points lon lat - * @param {Object} viewport - current viewport object - - * @return {Object} - hexagons and countRange - */ -export function pointToHexbin(props, aggregationParams) { - const {data, radius} = props; - const {viewport, attributes} = aggregationParams; - // get hexagon radius in mercator world unit - const centerLngLat = data.length ? getPointsCenter(data, aggregationParams) : null; - const radiusCommon = getRadiusInCommon(radius, viewport, centerLngLat); - - // add world space coordinates to points - const screenPoints: { - screenCoord: number[]; - source: any; - index: number; - }[] = []; - const {iterable, objectInfo} = createIterable(data); - const positions = attributes.positions.value; - const {size} = attributes.positions.getAccessor(); - for (const object of iterable) { - objectInfo.index++; - const posIndex = objectInfo.index * size; - const position = [positions[posIndex], positions[posIndex + 1]]; - const arrayIsFinite = Number.isFinite(position[0]) && Number.isFinite(position[1]); - if (arrayIsFinite) { - screenPoints.push({ - screenCoord: viewport.projectFlat(position), - source: object, - index: objectInfo.index - }); - } else { - log.warn('HexagonLayer: invalid position')(); - } - } - - const newHexbin = hexbin() - .radius(radiusCommon) - .x(d => d.screenCoord[0]) - .y(d => d.screenCoord[1]); - - const hexagonBins = newHexbin(screenPoints); - - return { - hexagons: hexagonBins.map((hex, index) => ({ - position: viewport.unprojectFlat([hex.x, hex.y]), - points: hex, - index - })), - radiusCommon - }; -} - -/** - * Get the bounding box of all data points - */ -export function getPointsCenter(data, aggregationParams) { - const {attributes} = aggregationParams; - const positions = attributes.positions.value; - const {size} = attributes.positions.getAccessor(); - - let minX = Infinity; - let minY = Infinity; - let maxX = -Infinity; - let maxY = -Infinity; - let i; - - for (i = 0; i < size * data.length; i += size) { - const x = positions[i]; - const y = positions[i + 1]; - const arrayIsFinite = Number.isFinite(x) && Number.isFinite(y); - - if (arrayIsFinite) { - minX = Math.min(x, minX); - maxX = Math.max(x, maxX); - minY = Math.min(y, minY); - maxY = Math.max(y, maxY); - } - } - - // return center - return [minX, minY, maxX, maxY].every(Number.isFinite) - ? [(minX + maxX) / 2, (minY + maxY) / 2] - : null; -} - -/** - * Get radius in mercator world space coordinates from meter - * @param {Number} radius - in meter - * @param {Object} viewport - current viewport object - * @param {Array} center - data center - - * @return {Number} radius in mercator world spcae coordinates - */ -export function getRadiusInCommon(radius, viewport, center) { - const {unitsPerMeter} = viewport.getDistanceScales(center); - // x, y distance should be the same - return radius * unitsPerMeter[0]; -} diff --git a/modules/aggregation-layers/src/hexagon-layer/hexagon-cell-layer-vertex.glsl.ts b/modules/aggregation-layers/src/hexagon-layer/hexagon-cell-layer-vertex.glsl.ts new file mode 100644 index 00000000000..88bc07406c8 --- /dev/null +++ b/modules/aggregation-layers/src/hexagon-layer/hexagon-cell-layer-vertex.glsl.ts @@ -0,0 +1,73 @@ +// deck.gl +// SPDX-License-Identifier: MIT +// Copyright (c) vis.gl contributors + +import {getHexbinCentroidGLSL} from './hexbin'; + +export default /* glsl */ `\ +#version 300 es +#define SHADER_NAME hexagon-cell-layer-vertex-shader + +in vec3 positions; +in vec3 normals; + +in vec2 instancePositions; +in float instanceElevationValues; +in float instanceColorValues; +in vec3 instancePickingColors; + +uniform sampler2D colorRange; + +// Result +out vec4 vColor; + +${getHexbinCentroidGLSL} + +float interp(float value, vec2 domain, vec2 range) { + float r = min(max((value - domain.x) / (domain.y - domain.x), 0.), 1.); + return mix(range.x, range.y, r); +} + +vec4 interp(float value, vec2 domain, sampler2D range) { + float r = (value - domain.x) / (domain.y - domain.x); + return texture(range, vec2(r, 0.5)); +} + +void main(void) { + geometry.pickingColor = instancePickingColors; + + if (isnan(instanceColorValues) || + instanceColorValues < hexagon.colorDomain.z || + instanceColorValues > hexagon.colorDomain.w || + instanceElevationValues < hexagon.elevationDomain.z || + instanceElevationValues > hexagon.elevationDomain.w + ) { + gl_Position = vec4(0.); + return; + } + + vec2 commonPosition = hexbinCentroid(instancePositions, column.radius) + (hexagon.originCommon - project.commonOrigin.xy); + commonPosition += positions.xy * column.radius * column.coverage; + geometry.position = vec4(commonPosition, 0.0, 1.0); + geometry.normal = project_normal(normals); + + // calculate z, if 3d not enabled set to 0 + float elevation = 0.0; + if (column.extruded) { + elevation = interp(instanceElevationValues, hexagon.elevationDomain.xy, hexagon.elevationRange); + elevation = project_size(elevation); + // cylindar gemoetry height are between -1.0 to 1.0, transform it to between 0, 1 + geometry.position.z = (positions.z + 1.0) / 2.0 * elevation; + } + + gl_Position = project_common_position_to_clipspace(geometry.position); + DECKGL_FILTER_GL_POSITION(gl_Position, geometry); + + vColor = interp(instanceColorValues, hexagon.colorDomain.xy, colorRange); + vColor.a *= layer.opacity; + if (column.extruded) { + vColor.rgb = lighting_getLightColor(vColor.rgb, project.cameraPosition, geometry.position.xyz, geometry.normal); + } + DECKGL_FILTER_COLOR(vColor, geometry); +} +`; diff --git a/modules/aggregation-layers/src/hexagon-layer/hexagon-cell-layer.ts b/modules/aggregation-layers/src/hexagon-layer/hexagon-cell-layer.ts new file mode 100644 index 00000000000..1d8b174b554 --- /dev/null +++ b/modules/aggregation-layers/src/hexagon-layer/hexagon-cell-layer.ts @@ -0,0 +1,141 @@ +// deck.gl +// SPDX-License-Identifier: MIT +// Copyright (c) vis.gl contributors + +import {Texture} from '@luma.gl/core'; +import {UpdateParameters, Color} from '@deck.gl/core'; +import {ColumnLayer} from '@deck.gl/layers'; +import {createColorRangeTexture, updateColorRangeTexture} from '../common/utils/color-utils'; +import vs from './hexagon-cell-layer-vertex.glsl'; +import {HexagonProps, hexagonUniforms} from './hexagon-layer-uniforms'; +import type {ScaleType} from '../common/types'; + +/** Proprties added by HexagonCellLayer. */ +export type _HexagonCellLayerProps = { + hexOriginCommon: [number, number]; + colorDomain: [number, number]; + colorCutoff: [number, number] | null; + colorRange: Color[]; + colorScaleType: ScaleType; + elevationDomain: [number, number]; + elevationCutoff: [number, number] | null; + elevationRange: [number, number]; +}; + +export default class HexagonCellLayer extends ColumnLayer< + null, + ExtraPropsT & Required<_HexagonCellLayerProps> +> { + static layerName = 'HexagonCellLayer'; + + state!: ColumnLayer['state'] & { + colorTexture: Texture; + }; + + getShaders() { + const shaders = super.getShaders(); + shaders.modules.push(hexagonUniforms); + return {...shaders, vs}; + } + + initializeState() { + super.initializeState(); + + const attributeManager = this.getAttributeManager()!; + attributeManager.remove([ + 'instanceElevations', + 'instanceFillColors', + 'instanceLineColors', + 'instanceStrokeWidths' + ]); + attributeManager.addInstanced({ + instancePositions: { + size: 2, + type: 'float32', + accessor: 'getBin' + }, + instanceColorValues: { + size: 1, + type: 'float32', + accessor: 'getColorValue' + }, + instanceElevationValues: { + size: 1, + type: 'float32', + accessor: 'getElevationValue' + } + }); + } + + updateState(params: UpdateParameters) { + super.updateState(params); + + const {props, oldProps} = params; + const model = this.state.fillModel!; + + if (oldProps.colorRange !== props.colorRange) { + this.state.colorTexture?.destroy(); + this.state.colorTexture = createColorRangeTexture( + this.context.device, + props.colorRange, + props.colorScaleType + ); + const hexagonProps: Partial = {colorRange: this.state.colorTexture}; + model.shaderInputs.setProps({hexagon: hexagonProps}); + } else if (oldProps.colorScaleType !== props.colorScaleType) { + updateColorRangeTexture(this.state.colorTexture, props.colorScaleType); + } + } + + finalizeState(context) { + super.finalizeState(context); + + this.state.colorTexture?.destroy(); + } + + draw({uniforms}) { + const { + radius, + hexOriginCommon, + elevationRange, + elevationScale, + extruded, + coverage, + colorDomain, + elevationDomain + } = this.props; + const colorCutoff = this.props.colorCutoff || [-Infinity, Infinity]; + const elevationCutoff = this.props.elevationCutoff || [-Infinity, Infinity]; + const fillModel = this.state.fillModel!; + + if (fillModel.vertexArray.indexBuffer) { + // indices are for drawing wireframe, disable them + // TODO - this should be handled in ColumnLayer? + fillModel.setIndexBuffer(null); + } + fillModel.setVertexCount(this.state.fillVertexCount); + + const hexagonProps: Omit = { + colorDomain: [ + Math.max(colorDomain[0], colorCutoff[0]), // instanceColorValue that maps to colorRange[0] + Math.min(colorDomain[1], colorCutoff[1]), // instanceColorValue that maps to colorRange[colorRange.length - 1] + Math.max(colorDomain[0] - 1, colorCutoff[0]), // hide cell if instanceColorValue is less than this + Math.min(colorDomain[1] + 1, colorCutoff[1]) // hide cell if instanceColorValue is greater than this + ], + elevationDomain: [ + Math.max(elevationDomain[0], elevationCutoff[0]), // instanceElevationValue that maps to elevationRange[0] + Math.min(elevationDomain[1], elevationCutoff[1]), // instanceElevationValue that maps to elevationRange[elevationRange.length - 1] + Math.max(elevationDomain[0] - 1, elevationCutoff[0]), // hide cell if instanceElevationValue is less than this + Math.min(elevationDomain[1] + 1, elevationCutoff[1]) // hide cell if instanceElevationValue is greater than this + ], + elevationRange: [elevationRange[0] * elevationScale, elevationRange[1] * elevationScale], + originCommon: hexOriginCommon + }; + + fillModel.shaderInputs.setProps({ + column: {extruded, coverage, radius}, + hexagon: hexagonProps + }); + fillModel.draw(this.context.renderPass); + } +} diff --git a/modules/aggregation-layers/src/hexagon-layer/hexagon-layer-uniforms.ts b/modules/aggregation-layers/src/hexagon-layer/hexagon-layer-uniforms.ts new file mode 100644 index 00000000000..24fcb489831 --- /dev/null +++ b/modules/aggregation-layers/src/hexagon-layer/hexagon-layer-uniforms.ts @@ -0,0 +1,30 @@ +import {Texture} from '@luma.gl/core'; +import type {ShaderModule} from '@luma.gl/shadertools'; + +const uniformBlock = /* glsl */ `\ +uniform hexagonUniforms { + vec4 colorDomain; + vec4 elevationDomain; + vec2 elevationRange; + vec2 originCommon; +} hexagon; +`; + +export type HexagonProps = { + colorDomain: [number, number, number, number]; + colorRange: Texture; + elevationDomain: [number, number, number, number]; + elevationRange: [number, number]; + originCommon: [number, number]; +}; + +export const hexagonUniforms = { + name: 'hexagon', + vs: uniformBlock, + uniformTypes: { + colorDomain: 'vec4', + elevationDomain: 'vec4', + elevationRange: 'vec2', + originCommon: 'vec2' + } +} as const satisfies ShaderModule; diff --git a/modules/aggregation-layers/src/hexagon-layer/hexagon-layer.ts b/modules/aggregation-layers/src/hexagon-layer/hexagon-layer.ts index b40251d6602..640900243ba 100644 --- a/modules/aggregation-layers/src/hexagon-layer/hexagon-layer.ts +++ b/modules/aggregation-layers/src/hexagon-layer/hexagon-layer.ts @@ -1,88 +1,79 @@ -// Copyright (c) 2015 - 2017 Uber Technologies, Inc. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. +// deck.gl +// SPDX-License-Identifier: MIT +// Copyright (c) vis.gl contributors import { + log, Accessor, - AccessorFunction, Color, - log, - Position, + GetPickingInfoParams, + CompositeLayerProps, + createIterable, + Layer, Material, + project32, + LayersList, + PickingInfo, + Position, + Viewport, UpdateParameters, DefaultProps } from '@deck.gl/core'; -import {ColumnLayer} from '@deck.gl/layers'; - -import {defaultColorRange} from '../utils/color-utils'; - -import {pointToHexbin} from './hexagon-aggregator'; -import CPUAggregator from '../utils/cpu-aggregator'; -import AggregationLayer, {AggregationLayerProps} from '../aggregation-layer'; +import {WebGLAggregator, CPUAggregator, AggregationOperation} from '../common/aggregator/index'; +import AggregationLayer from '../common/aggregation-layer'; +import {AggregateAccessor} from '../common/types'; +import {defaultColorRange} from '../common/utils/color-utils'; +import {AttributeWithScale} from '../common/utils/scale-utils'; -import {AggregateAccessor} from '../types'; +import HexagonCellLayer from './hexagon-cell-layer'; +import {pointToHexbin, HexbinVertices, getHexbinCentroid, pointToHexbinGLSL} from './hexbin'; +import {BinOptions, binOptionsUniforms} from './bin-options-uniforms'; // eslint-disable-next-line @typescript-eslint/no-empty-function -function nop() {} +function noop() {} const defaultProps: DefaultProps = { + gpuAggregation: false, + // color colorDomain: null, colorRange: defaultColorRange, - getColorValue: {type: 'accessor', value: null}, // default value is calcuated from `getColorWeight` and `colorAggregation` + getColorValue: {type: 'accessor', value: null}, // default value is calculated from `getColorWeight` and `colorAggregation` getColorWeight: {type: 'accessor', value: 1}, colorAggregation: 'SUM', - lowerPercentile: {type: 'number', value: 0, min: 0, max: 100}, - upperPercentile: {type: 'number', value: 100, min: 0, max: 100}, + lowerPercentile: {type: 'number', min: 0, max: 100, value: 0}, + upperPercentile: {type: 'number', min: 0, max: 100, value: 100}, colorScaleType: 'quantize', - onSetColorDomain: nop, + onSetColorDomain: noop, // elevation elevationDomain: null, elevationRange: [0, 1000], - getElevationValue: {type: 'accessor', value: null}, // default value is calcuated from `getElevationWeight` and `elevationAggregation` + getElevationValue: {type: 'accessor', value: null}, // default value is calculated from `getElevationWeight` and `elevationAggregation` getElevationWeight: {type: 'accessor', value: 1}, elevationAggregation: 'SUM', - elevationLowerPercentile: {type: 'number', value: 0, min: 0, max: 100}, - elevationUpperPercentile: {type: 'number', value: 100, min: 0, max: 100}, elevationScale: {type: 'number', min: 0, value: 1}, + elevationLowerPercentile: {type: 'number', min: 0, max: 100, value: 0}, + elevationUpperPercentile: {type: 'number', min: 0, max: 100, value: 100}, elevationScaleType: 'linear', - onSetElevationDomain: nop, + onSetElevationDomain: noop, - radius: {type: 'number', value: 1000, min: 1}, + // hexbin + radius: {type: 'number', min: 1, value: 1000}, coverage: {type: 'number', min: 0, max: 1, value: 1}, - extruded: false, - hexagonAggregator: pointToHexbin, getPosition: {type: 'accessor', value: (x: any) => x.position}, - // Optional material for 'lighting' shader module - material: true, + hexagonAggregator: {type: 'function', optional: true, value: null}, + extruded: false, - // data filter - _filterData: {type: 'function', value: null, optional: true} + // Optional material for 'lighting' shader module + material: true }; -/** All properties supported by by HexagonLayer. */ -export type HexagonLayerProps = _HexagonLayerProps & - AggregationLayerProps; +/** All properties supported by HexagonLayer. */ +export type HexagonLayerProps = _HexagonLayerProps & CompositeLayerProps; /** Properties added by HexagonLayer. */ -type _HexagonLayerProps = { +type _HexagonLayerProps = { /** * Radius of hexagon bin in meters. The hexagons are pointy-topped (rather than flat-topped). * @default 1000 @@ -90,31 +81,31 @@ type _HexagonLayerProps = { radius?: number; /** - * Function to aggregate data into hexagonal bins. - * @default d3-hexbin + * Custom accessor to retrieve a hexagonal bin index from each data object. + * Not supported by GPU aggregation. + * @default null */ - hexagonAggregator?: (props: any, params: any) => any; + hexagonAggregator?: ((position: number[], radius: number) => [number, number]) | null; /** - * Color scale input domain. + * Color scale domain, default is set to the extent of aggregated weights in each cell. * @default [min(colorWeight), max(colorWeight)] */ colorDomain?: [number, number] | null; /** - * Specified as an array of colors [color1, color2, ...]. - * @default `6-class YlOrRd` - [colorbrewer](http://colorbrewer2.org/#type=sequential&scheme=YlOrRd&n=6) + * Default: [colorbrewer](http://colorbrewer2.org/#type=sequential&scheme=YlOrRd&n=6) `6-class YlOrRd` */ colorRange?: Color[]; /** - * Hexagon radius multiplier, clamped between 0 - 1. + * Cell size multiplier, clamped between 0 - 1. * @default 1 */ coverage?: number; /** - * Elevation scale input domain. The elevation scale is a linear scale that maps number of counts to elevation. + * Elevation scale input domain, default is set to between 0 and the max of aggregated weights in each cell. * @default [0, max(elevationWeight)] */ elevationDomain?: [number, number] | null; @@ -126,54 +117,56 @@ type _HexagonLayerProps = { elevationRange?: [number, number]; /** - * Hexagon elevation multiplier. + * Cell elevation multiplier. * @default 1 */ elevationScale?: number; /** * Whether to enable cell elevation. If set to false, all cell will be flat. - * @default false + * @default true */ extruded?: boolean; /** - * Filter bins and re-calculate color by `upperPercentile`. - * Hexagons with color value larger than the `upperPercentile` will be hidden. + * Filter cells and re-calculate color by `upperPercentile`. + * Cells with value larger than the upperPercentile will be hidden. * @default 100 */ upperPercentile?: number; /** - * Filter bins and re-calculate color by `lowerPercentile`. - * Hexagons with color value smaller than the `lowerPercentile` will be hidden. + * Filter cells and re-calculate color by `lowerPercentile`. + * Cells with value smaller than the lowerPercentile will be hidden. * @default 0 */ lowerPercentile?: number; /** - * Filter bins and re-calculate elevation by `elevationUpperPercentile`. - * Hexagons with elevation value larger than the `elevationUpperPercentile` will be hidden. + * Filter cells and re-calculate elevation by `elevationUpperPercentile`. + * Cells with elevation value larger than the `elevationUpperPercentile` will be hidden. * @default 100 */ elevationUpperPercentile?: number; /** - * Filter bins and re-calculate elevation by `elevationLowerPercentile`. - * Hexagons with elevation value larger than the `elevationLowerPercentile` will be hidden. + * Filter cells and re-calculate elevation by `elevationLowerPercentile`. + * Cells with elevation value larger than the `elevationLowerPercentile` will be hidden. * @default 0 */ elevationLowerPercentile?: number; /** * Scaling function used to determine the color of the grid cell, default value is 'quantize'. - * Supported Values are 'quantize', 'quantile' and 'ordinal'. + * Supported Values are 'quantize', 'linear', 'quantile' and 'ordinal'. * @default 'quantize' */ - colorScaleType?: 'quantize' | 'quantile' | 'ordinal'; + colorScaleType?: 'quantize' | 'linear' | 'quantile' | 'ordinal'; /** * Scaling function used to determine the elevation of the grid cell, only supports 'linear'. + * Supported Values are 'linear' and 'quantile'. + * @default 'linear' */ elevationScaleType?: 'linear'; @@ -187,207 +180,490 @@ type _HexagonLayerProps = { /** * Defines the operation used to aggregate all data object weights to calculate a cell's color value. + * Valid values are 'SUM', 'MEAN', 'MIN', 'MAX', 'COUNT'. + * * @default 'SUM' */ - colorAggregation?: 'SUM' | 'MEAN' | 'MIN' | 'MAX'; + colorAggregation?: AggregationOperation; /** * Defines the operation used to aggregate all data object weights to calculate a cell's elevation value. + * Valid values are 'SUM', 'MEAN', 'MIN', 'MAX', 'COUNT'. + * * @default 'SUM' */ - elevationAggregation?: 'SUM' | 'MEAN' | 'MIN' | 'MAX'; + elevationAggregation?: AggregationOperation; /** * Method called to retrieve the position of each object. * @default object => object.position */ - getPosition?: AccessorFunction; + getPosition?: Accessor; /** - * The weight of a data object used to calculate the color value for a bin. + * The weight of a data object used to calculate the color value for a cell. * @default 1 */ getColorWeight?: Accessor; /** - * After data objects are aggregated into bins, this accessor is called on each cell to get the value that its color is based on. + * After data objects are aggregated into cells, this accessor is called on each cell to get the value that its color is based on. + * Not supported by GPU aggregation. * @default null */ getColorValue?: AggregateAccessor | null; /** - * The weight of a data object used to calculate the elevation value for a bin. + * The weight of a data object used to calculate the elevation value for a cell. * @default 1 */ getElevationWeight?: Accessor; /** - * After data objects are aggregated into bins, this accessor is called on each cell to get the value that its elevation is based on. + * After data objects are aggregated into cells, this accessor is called on each cell to get the value that its elevation is based on. + * Not supported by GPU aggregation. * @default null */ getElevationValue?: AggregateAccessor | null; /** - * This callback will be called when cell color domain has been calculated. + * This callback will be called when bin color domain has been calculated. * @default () => {} */ onSetColorDomain?: (minMax: [number, number]) => void; /** - * This callback will be called when cell elevation domain has been calculated. + * This callback will be called when bin elevation domain has been calculated. * @default () => {} */ onSetElevationDomain?: (minMax: [number, number]) => void; /** - * (Experimental) Filter data objects + * When set to true, aggregation is performed on GPU, provided other conditions are met. + * @default false */ - _filterData: null | ((d: DataT) => boolean); + gpuAggregation?: boolean; }; -/** Aggregates data into a hexagon-based heatmap. The color and height of a hexagon are determined based on the objects it contains. */ -export default class HexagonLayer extends AggregationLayer< - DataT, - ExtraPropsT & Required<_HexagonLayerProps> -> { +export type HexagonLayerPickingInfo = PickingInfo<{ + /** Column index of the picked cell */ + col: number; + /** Row index of the picked cell */ + row: number; + /** Aggregated color value, as determined by `getColorWeight` and `colorAggregation` */ + colorValue: number; + /** Aggregated elevation value, as determined by `getElevationWeight` and `elevationAggregation` */ + elevationValue: number; + /** Number of data points in the picked cell */ + count: number; + /** Centroid of the hexagon */ + position: [number, number]; + /** Indices of the data objects in the picked cell. Only available if using CPU aggregation. */ + pointIndices?: number[]; + /** The data objects in the picked cell. Only available if using CPU aggregation and layer data is an array. */ + points?: DataT[]; +}>; + +/** Aggregate data into a grid-based heatmap. The color and height of a cell are determined based on the objects it contains. */ +export default class HexagonLayer< + DataT = any, + ExtraPropsT extends {} = {} +> extends AggregationLayer>> { static layerName = 'HexagonLayer'; static defaultProps = defaultProps; - state!: AggregationLayer['state'] & { - cpuAggregator: CPUAggregator; - aggregatorState: CPUAggregator['state']; - vertices: number[][] | null; - }; - initializeState() { - const cpuAggregator = new CPUAggregator({ - getAggregator: props => props.hexagonAggregator, - getCellSize: props => props.radius - }); + state!: AggregationLayer['state'] & + BinOptions & { + // Needed if getColorValue, getElevationValue are used + dataAsArray?: DataT[]; - this.state = { - cpuAggregator, - aggregatorState: cpuAggregator.state, - vertices: null + colors?: AttributeWithScale; + elevations?: AttributeWithScale; + + binIdRange: [number, number][]; + aggregatorViewport: Viewport; }; - const attributeManager = this.getAttributeManager()!; - attributeManager.add({ - positions: {size: 3, type: 'float64', accessor: 'getPosition'} - }); - // color and elevation attributes can't be added as attributes - // they are calculated using 'getValue' accessor that takes an array of pints. - } - updateState(opts: UpdateParameters) { - super.updateState(opts); + getAggregatorType(): string { + const {gpuAggregation, hexagonAggregator, getColorValue, getElevationValue} = this.props; + if (gpuAggregation && (hexagonAggregator || getColorValue || getElevationValue)) { + // If these features are desired by the app, the user should explicitly use CPU aggregation + log.warn('Features not supported by GPU aggregation, falling back to CPU')(); + return 'cpu'; + } - if (opts.changeFlags.propsOrDataChanged) { - const aggregatorState = this.state.cpuAggregator.updateState(opts, { - viewport: this.context.viewport, - attributes: this.getAttributes() - }); - if (this.state.aggregatorState.layerData !== aggregatorState.layerData) { - // if user provided custom aggregator and returns hexagonVertices, - // Need to recalculate radius and angle based on vertices - // @ts-expect-error - const {hexagonVertices} = aggregatorState.layerData || {}; - this.setState({ - vertices: hexagonVertices && this.convertLatLngToMeterOffset(hexagonVertices) - }); - } + if ( + // GPU aggregation is requested + gpuAggregation && + // GPU aggregation is supported by the device + WebGLAggregator.isSupported(this.context.device) + ) { + return 'gpu'; + } + return 'cpu'; + } - this.setState({ - // make a copy of the internal state of cpuAggregator for testing - aggregatorState + createAggregator(type: string): WebGLAggregator | CPUAggregator { + if (type === 'cpu') { + const {hexagonAggregator, radius} = this.props; + return new CPUAggregator({ + dimensions: 2, + getBin: { + sources: ['positions'], + getValue: ({positions}: {positions: number[]}, index: number, opts: BinOptions) => { + if (hexagonAggregator) { + return hexagonAggregator(positions, radius); + } + const viewport = this.state.aggregatorViewport; + // project to common space + const p = viewport.projectPosition(positions); + const {radiusCommon, hexOriginCommon} = opts; + return pointToHexbin( + [p[0] - hexOriginCommon[0], p[1] - hexOriginCommon[1]], + radiusCommon + ); + } + }, + getValue: [ + {sources: ['colorWeights'], getValue: ({colorWeights}) => colorWeights}, + {sources: ['elevationWeights'], getValue: ({elevationWeights}) => elevationWeights} + ] }); } + return new WebGLAggregator(this.context.device, { + dimensions: 2, + channelCount: 2, + bufferLayout: this.getAttributeManager()!.getBufferLayouts({isInstanced: false}), + ...super.getShaders({ + modules: [project32, binOptionsUniforms], + vs: /* glsl */ ` + in vec3 positions; + in vec3 positions64Low; + in float colorWeights; + in float elevationWeights; + + ${pointToHexbinGLSL} + + void getBin(out ivec2 binId) { + vec3 positionCommon = project_position(positions, positions64Low); + binId = pointToHexbin(positionCommon.xy, binOptions.radiusCommon); } + void getValue(out vec2 value) { + value = vec2(colorWeights, elevationWeights); + } + ` + }) + }); + } + + initializeState() { + super.initializeState(); - convertLatLngToMeterOffset(hexagonVertices) { - const {viewport} = this.context; - if (Array.isArray(hexagonVertices) && hexagonVertices.length === 6) { - // get centroid of hexagons - const vertex0 = hexagonVertices[0]; - const vertex3 = hexagonVertices[3]; + const attributeManager = this.getAttributeManager()!; + attributeManager.add({ + positions: { + size: 3, + accessor: 'getPosition', + type: 'float64', + fp64: this.use64bitPositions() + }, + colorWeights: {size: 1, accessor: 'getColorWeight'}, + elevationWeights: {size: 1, accessor: 'getElevationWeight'} + }); + } - const centroid = [(vertex0[0] + vertex3[0]) / 2, (vertex0[1] + vertex3[1]) / 2]; - const centroidFlat = viewport.projectFlat(centroid); + updateState(params: UpdateParameters) { + const aggregatorChanged = super.updateState(params); + + const {props, oldProps, changeFlags} = params; + const {aggregator} = this.state; + if ( + (changeFlags.dataChanged || !this.state.dataAsArray) && + (props.getColorValue || props.getElevationValue) + ) { + // Convert data to array + this.state.dataAsArray = Array.from(createIterable(props.data).iterable); + } + if ( + aggregatorChanged || + changeFlags.dataChanged || + props.radius !== oldProps.radius || + props.getColorValue !== oldProps.getColorValue || + props.getElevationValue !== oldProps.getElevationValue || + props.colorAggregation !== oldProps.colorAggregation || + props.elevationAggregation !== oldProps.elevationAggregation + ) { + this._updateBinOptions(); + const {radiusCommon, hexOriginCommon, binIdRange, dataAsArray} = this.state; + + aggregator.setProps({ + // @ts-expect-error only used by GPUAggregator + binIdRange, + pointCount: this.getNumInstances(), + operations: [props.colorAggregation, props.elevationAggregation], + binOptions: { + radiusCommon, + hexOriginCommon + }, + onUpdate: this._onAggregationUpdate.bind(this) + }); - const {metersPerUnit} = viewport.getDistanceScales(centroid); + if (dataAsArray) { + const {getColorValue, getElevationValue} = this.props; + aggregator.setProps({ + // @ts-expect-error only used by CPUAggregator + customOperations: [ + getColorValue && + ((indices: number[]) => + getColorValue( + indices.map(i => dataAsArray[i]), + {indices, data: props.data} + )), + getElevationValue && + ((indices: number[]) => + getElevationValue( + indices.map(i => dataAsArray[i]), + {indices, data: props.data} + )) + ] + }); + } + } + if (changeFlags.updateTriggersChanged && changeFlags.updateTriggersChanged.getColorValue) { + aggregator.setNeedsUpdate(0); + } + if (changeFlags.updateTriggersChanged && changeFlags.updateTriggersChanged.getElevationValue) { + aggregator.setNeedsUpdate(1); + } - // offset all points by centroid to meter offset - const vertices = hexagonVertices.map(vt => { - const vtFlat = viewport.projectFlat(vt); + return aggregatorChanged; + } - return [ - (vtFlat[0] - centroidFlat[0]) * metersPerUnit[0], - (vtFlat[1] - centroidFlat[1]) * metersPerUnit[1] - ]; + private _updateBinOptions() { + const bounds = this.getBounds(); + let radiusCommon = 1; + let hexOriginCommon: [number, number] = [0, 0]; + const binIdRange: [number, number][] = [ + [0, 1], + [0, 1] + ]; + let viewport = this.context.viewport; + + if (bounds && Number.isFinite(bounds[0][0])) { + let centroid = [(bounds[0][0] + bounds[1][0]) / 2, (bounds[0][1] + bounds[1][1]) / 2]; + const {radius} = this.props; + const {unitsPerMeter} = viewport.getDistanceScales(centroid); + radiusCommon = unitsPerMeter[0] * radius; + + // Use the centroid of the hex at the center of the data + // This offsets the common space without changing the bins + const centerHex = pointToHexbin(viewport.projectFlat(centroid), radiusCommon); + centroid = viewport.unprojectFlat(getHexbinCentroid(centerHex, radiusCommon)); + + const ViewportType = viewport.constructor as any; + // We construct a viewport for the GPU aggregator's project module + // This viewport is determined by data + // removes arbitrary precision variance that depends on initial view state + viewport = viewport.isGeospatial + ? new ViewportType({longitude: centroid[0], latitude: centroid[1], zoom: 12}) + : new Viewport({position: [centroid[0], centroid[1], 0], zoom: 12}); + + hexOriginCommon = [Math.fround(viewport.center[0]), Math.fround(viewport.center[1])]; + + const corners = [ + bounds[0], + bounds[1], + [bounds[0][0], bounds[1][1]], + [bounds[1][0], bounds[0][1]] + ].map(p => { + const positionCommon = viewport.projectFlat(p); + positionCommon[0] -= hexOriginCommon[0]; + positionCommon[1] -= hexOriginCommon[1]; + return pointToHexbin(positionCommon, radiusCommon); }); - return vertices; + const minX = Math.min(...corners.map(p => p[0])); + const minY = Math.min(...corners.map(p => p[1])); + const maxX = Math.max(...corners.map(p => p[0])); + const maxY = Math.max(...corners.map(p => p[1])); + + binIdRange[0] = [minX - 1, maxX + 2]; // i range + binIdRange[1] = [minY - 1, maxY + 2]; // j range } - log.error('HexagonLayer: hexagonVertices needs to be an array of 6 points')(); - return null; + this.setState({radiusCommon, hexOriginCommon, binIdRange, aggregatorViewport: viewport}); } - getPickingInfo({info}) { - return this.state.cpuAggregator.getPickingInfo({info}); + override draw(opts) { + // Replaces render time viewport with our own + if (opts.moduleParameters.viewport) { + opts.moduleParameters.viewport = this.state.aggregatorViewport; + } + super.draw(opts); } - // create a method for testing - _onGetSublayerColor(cell) { - return this.state.cpuAggregator.getAccessor('fillColor')(cell); + private _onAggregationUpdate({channel}: {channel: number}) { + const props = this.getCurrentLayer()!.props; + const {aggregator} = this.state; + if (channel === 0) { + const result = aggregator.getResult(0)!; + this.setState({ + colors: new AttributeWithScale(result, aggregator.binCount) + }); + props.onSetColorDomain(aggregator.getResultDomain(0)); + } else if (channel === 1) { + const result = aggregator.getResult(1)!; + this.setState({ + elevations: new AttributeWithScale(result, aggregator.binCount) + }); + props.onSetElevationDomain(aggregator.getResultDomain(1)); + } } - // create a method for testing - _onGetSublayerElevation(cell) { - return this.state.cpuAggregator.getAccessor('elevation')(cell); - } + onAttributeChange(id: string) { + const {aggregator} = this.state; + switch (id) { + case 'positions': + aggregator.setNeedsUpdate(); + + this._updateBinOptions(); + const {radiusCommon, hexOriginCommon, binIdRange} = this.state; + aggregator.setProps({ + // @ts-expect-error only used by GPUAggregator + binIdRange, + binOptions: { + radiusCommon, + hexOriginCommon + } + }); + break; + + case 'colorWeights': + aggregator.setNeedsUpdate(0); + break; + + case 'elevationWeights': + aggregator.setNeedsUpdate(1); + break; - _getSublayerUpdateTriggers() { - return this.state.cpuAggregator.getUpdateTriggers(this.props); + default: + // This should not happen + } } - renderLayers() { - const {elevationScale, extruded, coverage, material, transitions} = this.props; - const {aggregatorState, vertices} = this.state; - - const SubLayerClass = this.getSubLayerClass('hexagon-cell', ColumnLayer); - const updateTriggers = this._getSublayerUpdateTriggers(); - - const geometry = vertices - ? {vertices, radius: 1} - : { - // default geometry - // @ts-expect-error TODO - undefined property? - radius: aggregatorState.layerData.radiusCommon || 1, - radiusUnits: 'common', - angle: 90 - }; - return new SubLayerClass( + renderLayers(): LayersList | Layer | null { + const {aggregator, radiusCommon, hexOriginCommon} = this.state; + const { + elevationScale, + colorRange, + elevationRange, + extruded, + coverage, + material, + transitions, + colorScaleType, + lowerPercentile, + upperPercentile, + colorDomain, + elevationScaleType, + elevationLowerPercentile, + elevationUpperPercentile, + elevationDomain + } = this.props; + const CellLayerClass = this.getSubLayerClass('cells', HexagonCellLayer); + const binAttribute = aggregator.getBins(); + + const colors = this.state.colors?.update({ + scaleType: colorScaleType, + lowerPercentile, + upperPercentile + }); + const elevations = this.state.elevations?.update({ + scaleType: elevationScaleType, + lowerPercentile: elevationLowerPercentile, + upperPercentile: elevationUpperPercentile + }); + + if (!colors || !elevations) { + return null; + } + + return new CellLayerClass( + this.getSubLayerProps({ + id: 'cells' + }), { - ...geometry, + data: { + length: aggregator.binCount, + attributes: { + getBin: binAttribute, + getColorValue: colors.attribute, + getElevationValue: elevations.attribute + } + }, + // Data has changed shallowly, but we likely don't need to update the attributes + dataComparator: (data, oldData) => data.length === oldData.length, + updateTriggers: { + getBin: [binAttribute], + getColorValue: [colors.attribute], + getElevationValue: [elevations.attribute] + }, diskResolution: 6, + vertices: HexbinVertices, + radius: radiusCommon, + hexOriginCommon, elevationScale, + colorRange, + colorScaleType, + elevationRange, extruded, coverage, material, - - getFillColor: this._onGetSublayerColor.bind(this), - getElevation: this._onGetSublayerElevation.bind(this), + colorDomain: colors.domain || colorDomain || aggregator.getResultDomain(0), + elevationDomain: elevations.domain || elevationDomain || aggregator.getResultDomain(1), + colorCutoff: colors.cutoff, + elevationCutoff: elevations.cutoff, transitions: transitions && { getFillColor: transitions.getColorValue || transitions.getColorWeight, getElevation: transitions.getElevationValue || transitions.getElevationWeight - } - }, - this.getSubLayerProps({ - id: 'hexagon-cell', - updateTriggers - }), - { - data: aggregatorState.layerData.data + }, + // Extensions are already handled by the GPUAggregator, do not pass it down + extensions: [] } ); } + + getPickingInfo(params: GetPickingInfoParams): HexagonLayerPickingInfo { + const info: HexagonLayerPickingInfo = params.info; + const {index} = info; + if (index >= 0) { + const bin = this.state.aggregator.getBin(index); + let object: HexagonLayerPickingInfo['object']; + if (bin) { + const centroidCommon = getHexbinCentroid( + bin.id as [number, number], + this.state.radiusCommon + ); + const centroid = this.context.viewport.unprojectFlat(centroidCommon); + + object = { + col: bin.id[0], + row: bin.id[1], + position: centroid, + colorValue: bin.value[0], + elevationValue: bin.value[1], + count: bin.count + }; + if (bin.pointIndices) { + object.pointIndices = bin.pointIndices; + object.points = Array.isArray(this.props.data) + ? bin.pointIndices.map(i => (this.props.data as DataT[])[i]) + : []; + } + } + info.object = object; + } + + return info; + } } diff --git a/modules/aggregation-layers/src/hexagon-layer/hexbin.ts b/modules/aggregation-layers/src/hexagon-layer/hexbin.ts new file mode 100644 index 00000000000..6beaa661f87 --- /dev/null +++ b/modules/aggregation-layers/src/hexagon-layer/hexbin.ts @@ -0,0 +1,79 @@ +// deck.gl +// SPDX-License-Identifier: MIT +// Copyright (c) vis.gl contributors + +const THIRD_PI = Math.PI / 3; +const DIST_X = 2 * Math.sin(THIRD_PI); +const DIST_Y = 1.5; + +type HexBin = [i: number, j: number]; +type Point = [x: number, y: number]; + +export const HexbinVertices = Array.from({length: 6}, (_, i) => { + const angle = i * THIRD_PI; + return [Math.sin(angle), -Math.cos(angle)]; +}); + +/** + * Adapted from d3-hexbin + * Copyright Mike Bostock, 2012-2016 + All rights reserved. + * https://github.com/d3/d3-hexbin/blob/master/src/hexbin.js + * + * Returns the hexbin that a point (x,y) falls into + */ +export function pointToHexbin([px, py]: Point, radius: number): HexBin { + let pj = Math.round((py = py / radius / DIST_Y)); + let pi = Math.round((px = px / radius / DIST_X - (pj & 1) / 2)); + const py1 = py - pj; + + if (Math.abs(py1) * 3 > 1) { + const px1 = px - pi; + const pi2 = pi + (px < pi ? -1 : 1) / 2; + const pj2 = pj + (py < pj ? -1 : 1); + const px2 = px - pi2; + const py2 = py - pj2; + if (px1 * px1 + py1 * py1 > px2 * px2 + py2 * py2) { + pi = pi2 + (pj & 1 ? 1 : -1) / 2; + pj = pj2; + } + } + return [pi, pj]; +} + +export const pointToHexbinGLSL = /* glsl */ ` +const vec2 DIST = vec2(${DIST_X}, ${DIST_Y}); + +ivec2 pointToHexbin(vec2 p, float radius) { + p /= radius * DIST; + float pj = round(p.y); + float pjm2 = mod(pj, 2.0); + p.x -= pjm2 * 0.5; + float pi = round(p.x); + vec2 d1 = p - vec2(pi, pj); + + if (abs(d1.y) * 3. > 1.) { + vec2 v2 = step(0.0, d1) - 0.5; + v2.y *= 2.0; + vec2 d2 = d1 - v2; + if (dot(d1, d1) > dot(d2, d2)) { + pi += v2.x + pjm2 - 0.5; + pj += v2.y; + } + } + return ivec2(pi, pj); +} +`; + +export function getHexbinCentroid([i, j]: HexBin, radius: number): Point { + return [(i + (j & 1) / 2) * radius * DIST_X, j * radius * DIST_Y]; +} + +export const getHexbinCentroidGLSL = ` +const vec2 DIST = vec2(${DIST_X}, ${DIST_Y}); + +vec2 hexbinCentroid(vec2 binId, float radius) { + binId.x += fract(binId.y * 0.5); + return binId * DIST * radius; +} +`; diff --git a/modules/aggregation-layers/src/index.ts b/modules/aggregation-layers/src/index.ts index 4c803c0789a..1f8cec9d74b 100644 --- a/modules/aggregation-layers/src/index.ts +++ b/modules/aggregation-layers/src/index.ts @@ -19,34 +19,28 @@ // THE SOFTWARE. export {default as ScreenGridLayer} from './screen-grid-layer/screen-grid-layer'; -export {default as CPUGridLayer} from './cpu-grid-layer/cpu-grid-layer'; export {default as HexagonLayer} from './hexagon-layer/hexagon-layer'; export {default as ContourLayer} from './contour-layer/contour-layer'; export {default as GridLayer} from './grid-layer/grid-layer'; -export {default as GPUGridLayer} from './gpu-grid-layer/gpu-grid-layer'; -export {AGGREGATION_OPERATION} from './utils/aggregation-operation-utils'; - -// experimental export export {default as HeatmapLayer} from './heatmap-layer/heatmap-layer'; -export {default as _GPUGridAggregator} from './utils/gpu-grid-aggregation/gpu-grid-aggregator'; -export {default as _CPUAggregator} from './utils/cpu-aggregator'; -export {default as _AggregationLayer} from './aggregation-layer'; -export {default as _BinSorter} from './utils/bin-sorter'; -export {WebGLAggregator} from './aggregation-layer-v9/gpu-aggregator/webgl-aggregator'; -export {CPUAggregator} from './aggregation-layer-v9/cpu-aggregator/cpu-aggregator'; +export {default as _AggregationLayer} from './common/aggregation-layer'; +export {WebGLAggregator, CPUAggregator} from './common/aggregator/index'; // types -export type {ContourLayerProps} from './contour-layer/contour-layer'; +export type {ContourLayerProps, ContourLayerPickingInfo} from './contour-layer/contour-layer'; export type {HeatmapLayerProps} from './heatmap-layer/heatmap-layer'; -export type {HexagonLayerProps} from './hexagon-layer/hexagon-layer'; -export type {CPUGridLayerProps} from './cpu-grid-layer/cpu-grid-layer'; -export type {GridLayerProps} from './grid-layer/grid-layer'; -export type {GPUGridLayerProps} from './gpu-grid-layer/gpu-grid-layer'; +export type {HexagonLayerProps, HexagonLayerPickingInfo} from './hexagon-layer/hexagon-layer'; +export type {GridLayerProps, GridLayerPickingInfo} from './grid-layer/grid-layer'; export type { ScreenGridLayerProps, ScreenGridLayerPickingInfo } from './screen-grid-layer/screen-grid-layer'; -export type {WebGLAggregatorProps} from './aggregation-layer-v9/gpu-aggregator/webgl-aggregator'; -export type {CPUAggregatorProps} from './aggregation-layer-v9/cpu-aggregator/cpu-aggregator'; +export type { + Aggregator, + AggregationOperation, + AggregationProps, + WebGLAggregatorProps, + CPUAggregatorProps +} from './common/aggregator/index'; diff --git a/modules/aggregation-layers/src/screen-grid-layer/bin-options-uniforms.ts b/modules/aggregation-layers/src/screen-grid-layer/bin-options-uniforms.ts new file mode 100644 index 00000000000..b365d7aaa26 --- /dev/null +++ b/modules/aggregation-layers/src/screen-grid-layer/bin-options-uniforms.ts @@ -0,0 +1,19 @@ +import type {ShaderModule} from '@luma.gl/shadertools'; + +const uniformBlock = /* glsl */ `\ +uniform binOptionsUniforms { + float cellSizePixels; +} binOptions; +`; + +export type BinOptions = { + cellSizePixels: number; +}; + +export const binOptionsUniforms = { + name: 'binOptions', + vs: uniformBlock, + uniformTypes: { + cellSizePixels: 'f32' + } +} as const satisfies ShaderModule; diff --git a/modules/aggregation-layers/src/screen-grid-layer/screen-grid-cell-layer.ts b/modules/aggregation-layers/src/screen-grid-layer/screen-grid-cell-layer.ts index 4c302c19723..dc77bfe7ef9 100644 --- a/modules/aggregation-layers/src/screen-grid-layer/screen-grid-cell-layer.ts +++ b/modules/aggregation-layers/src/screen-grid-layer/screen-grid-cell-layer.ts @@ -21,9 +21,10 @@ import {Texture} from '@luma.gl/core'; import {Model, Geometry} from '@luma.gl/engine'; import {Layer, picking, UpdateParameters, DefaultProps, Color} from '@deck.gl/core'; -import {defaultColorRange, colorRangeToTexture} from '../utils/color-utils'; +import {defaultColorRange, createColorRangeTexture} from '../common/utils/color-utils'; import vs from './screen-grid-layer-vertex.glsl'; import fs from './screen-grid-layer-fragment.glsl'; +import {ScreenGridProps, screenGridUniforms} from './screen-grid-layer-uniforms'; import {ShaderModule} from '@luma.gl/shadertools'; const defaultProps: DefaultProps<_ScreenGridCellLayerProps> = { @@ -52,7 +53,7 @@ export default class ScreenGridCellLayer extends La }; getShaders(): {vs: string; fs: string; modules: ShaderModule[]} { - return {vs, fs, modules: [picking]}; + return super.getShaders({vs, fs, modules: [picking, screenGridUniforms]}); } initializeState() { @@ -80,8 +81,9 @@ export default class ScreenGridCellLayer extends La if (oldProps.colorRange !== props.colorRange) { this.state.colorTexture?.destroy(); - this.state.colorTexture = colorRangeToTexture(this.context.device, props.colorRange); - model.setBindings({colorRange: this.state.colorTexture}); + this.state.colorTexture = createColorRangeTexture(this.context.device, props.colorRange); + const screenGridProps: Partial = {colorRange: this.state.colorTexture}; + model.shaderInputs.setProps({screenGrid: screenGridProps}); } if ( @@ -93,10 +95,11 @@ export default class ScreenGridCellLayer extends La const {cellSizePixels: gridSize, cellMarginPixels} = this.props; const cellSize = Math.max(gridSize - cellMarginPixels, 0); - model.setUniforms({ + const screenGridProps: Partial = { gridSizeClipspace: [(gridSize / width) * 2, (gridSize / height) * 2], cellSizeClipspace: [(cellSize / width) * 2, (cellSize / height) * 2] - }); + }; + model.shaderInputs.setProps({screenGrid: screenGridProps}); } } @@ -111,8 +114,8 @@ export default class ScreenGridCellLayer extends La const colorDomain = this.props.colorDomain(); const model = this.state.model!; - model.setUniforms(uniforms); - model.setUniforms({colorDomain}); + const screenGridProps: Partial = {colorDomain}; + model.shaderInputs.setProps({screenGrid: screenGridProps}); model.draw(this.context.renderPass); } diff --git a/modules/aggregation-layers/src/screen-grid-layer/screen-grid-layer-uniforms.ts b/modules/aggregation-layers/src/screen-grid-layer/screen-grid-layer-uniforms.ts new file mode 100644 index 00000000000..2a0091c1d15 --- /dev/null +++ b/modules/aggregation-layers/src/screen-grid-layer/screen-grid-layer-uniforms.ts @@ -0,0 +1,27 @@ +import {Texture} from '@luma.gl/core'; +import type {ShaderModule} from '@luma.gl/shadertools'; + +const uniformBlock = /* glsl */ `\ +uniform screenGridUniforms { + vec2 cellSizeClipspace; + vec2 gridSizeClipspace; + vec2 colorDomain; +} screenGrid; +`; + +export type ScreenGridProps = { + cellSizeClipspace: [number, number]; + gridSizeClipspace: [number, number]; + colorDomain: [number, number]; + colorRange: Texture; +}; + +export const screenGridUniforms = { + name: 'screenGrid', + vs: uniformBlock, + uniformTypes: { + cellSizeClipspace: 'vec2', + gridSizeClipspace: 'vec2', + colorDomain: 'vec2' + } +} as const satisfies ShaderModule; diff --git a/modules/aggregation-layers/src/screen-grid-layer/screen-grid-layer-vertex.glsl.ts b/modules/aggregation-layers/src/screen-grid-layer/screen-grid-layer-vertex.glsl.ts index 4b35cbd8556..f3a387976f4 100644 --- a/modules/aggregation-layers/src/screen-grid-layer/screen-grid-layer-vertex.glsl.ts +++ b/modules/aggregation-layers/src/screen-grid-layer/screen-grid-layer-vertex.glsl.ts @@ -28,28 +28,23 @@ in vec2 instancePositions; in float instanceWeights; in vec3 instancePickingColors; -uniform float opacity; -uniform ivec2 binCount; -uniform vec2 gridSizeClipspace; -uniform vec2 cellSizeClipspace; -uniform vec2 colorDomain; uniform sampler2D colorRange; out vec4 vColor; flat out int vIsValid; void main(void) { - vec2 pos = instancePositions * gridSizeClipspace + positions * cellSizeClipspace; + vec2 pos = instancePositions * screenGrid.gridSizeClipspace + positions * screenGrid.cellSizeClipspace; pos.x = pos.x - 1.0; pos.y = 1.0 - pos.y; gl_Position = vec4(pos, 0., 1.); vIsValid = isnan(instanceWeights) ? 0 : 1; - float r = min(max((instanceWeights - colorDomain.x) / (colorDomain.y - colorDomain.x), 0.), 1.); + float r = min(max((instanceWeights - screenGrid.colorDomain.x) / (screenGrid.colorDomain.y - screenGrid.colorDomain.x), 0.), 1.); vec4 rangeColor = texture(colorRange, vec2(r, 0.5)); - vColor = vec4(rangeColor.rgb, rangeColor.a * opacity); + vColor = vec4(rangeColor.rgb, rangeColor.a * layer.opacity); // Set color to be rendered to picking fbo (also used to check for selection highlight). picking_setPickingColor(instancePickingColors); diff --git a/modules/aggregation-layers/src/screen-grid-layer/screen-grid-layer.ts b/modules/aggregation-layers/src/screen-grid-layer/screen-grid-layer.ts index 4d8f7b63716..fb2b49977b3 100644 --- a/modules/aggregation-layers/src/screen-grid-layer/screen-grid-layer.ts +++ b/modules/aggregation-layers/src/screen-grid-layer/screen-grid-layer.ts @@ -31,11 +31,10 @@ import { UpdateParameters, DefaultProps } from '@deck.gl/core'; -import {WebGLAggregator} from '../aggregation-layer-v9/gpu-aggregator/webgl-aggregator'; -import {CPUAggregator} from '../aggregation-layer-v9/cpu-aggregator/cpu-aggregator'; -import AggregationLayer from '../aggregation-layer-v9/aggregation-layer'; -import {AggregationOperation} from '../aggregation-layer-v9/aggregator'; +import {WebGLAggregator, CPUAggregator, AggregationOperation} from '../common/aggregator/index'; +import AggregationLayer from '../common/aggregation-layer'; import ScreenGridCellLayer from './screen-grid-cell-layer'; +import {BinOptions, binOptionsUniforms} from './bin-options-uniforms'; const defaultProps: DefaultProps = { ...(ScreenGridCellLayer.defaultProps as DefaultProps), @@ -140,9 +139,9 @@ export default class ScreenGridLayer< dimensions: 2, getBin: { sources: ['positions'], - getValue: ({positions}, index, opts) => { + getValue: ({positions}: {positions: number[]}, index: number, opts: BinOptions) => { const viewport = this.context.viewport; - const p = viewport.project(positions as number[]); + const p = viewport.project(positions); const cellSizePixels: number = opts.cellSizePixels; if (p[0] < 0 || p[0] >= viewport.width || p[1] < 0 || p[1] >= viewport.height) { // Not on screen @@ -159,9 +158,8 @@ export default class ScreenGridLayer< channelCount: 1, bufferLayout: this.getAttributeManager()!.getBufferLayouts({isInstanced: false}), ...super.getShaders({ - modules: [project32], + modules: [project32, binOptionsUniforms], vs: ` - uniform float cellSizePixels; in vec3 positions; in vec3 positions64Low; in float counts; @@ -169,7 +167,7 @@ export default class ScreenGridLayer< void getBin(out ivec2 binId) { vec4 pos = project_position_to_clipspace(positions, positions64Low, vec3(0.0)); vec2 screenCoords = vec2(pos.x / pos.w + 1.0, 1.0 - pos.y / pos.w) / 2.0 * project.viewportSize / project.devicePixelRatio; - vec2 gridCoords = floor(screenCoords / cellSizePixels); + vec2 gridCoords = floor(screenCoords / binOptions.cellSizePixels); binId = ivec2(gridCoords); } void getValue(out float weight) { diff --git a/modules/aggregation-layers/src/utils/aggregation-operation-utils.ts b/modules/aggregation-layers/src/utils/aggregation-operation-utils.ts deleted file mode 100644 index f0fc105270f..00000000000 --- a/modules/aggregation-layers/src/utils/aggregation-operation-utils.ts +++ /dev/null @@ -1,118 +0,0 @@ -// Copyright (c) 2015 - 2019 Uber Technologies, Inc. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -export const AGGREGATION_OPERATION = { - SUM: 1, - MEAN: 2, - MIN: 3, - MAX: 4 -}; - -function sumReducer(accu, cur) { - return accu + cur; -} - -function maxReducer(accu, cur) { - return cur > accu ? cur : accu; -} - -function minReducer(accu, cur) { - return cur < accu ? cur : accu; -} - -export function getMean(pts, accessor) { - if (Number.isFinite(accessor)) { - return pts.length ? accessor : null; - } - const filtered = pts.map(accessor).filter(Number.isFinite); - - return filtered.length ? filtered.reduce(sumReducer, 0) / filtered.length : null; -} - -export function getSum(pts, accessor) { - if (Number.isFinite(accessor)) { - return pts.length ? pts.length * accessor : null; - } - const filtered = pts.map(accessor).filter(Number.isFinite); - - return filtered.length ? filtered.reduce(sumReducer, 0) : null; -} - -export function getMax(pts, accessor) { - if (Number.isFinite(accessor)) { - return pts.length ? accessor : null; - } - const filtered = pts.map(accessor).filter(Number.isFinite); - - return filtered.length ? filtered.reduce(maxReducer, -Infinity) : null; -} - -export function getMin(pts, accessor) { - if (Number.isFinite(accessor)) { - return pts.length ? accessor : null; - } - const filtered = pts.map(accessor).filter(Number.isFinite); - - return filtered.length ? filtered.reduce(minReducer, Infinity) : null; -} - -// Function to convert from aggregation/accessor props (like colorAggregation and getColorWeight) to getValue prop (like getColorValue) -export function getValueFunc(aggregation, accessor, context) { - const op = AGGREGATION_OPERATION[aggregation] || AGGREGATION_OPERATION.SUM; - accessor = wrapAccessor(accessor, context); - switch (op) { - case AGGREGATION_OPERATION.MIN: - return pts => getMin(pts, accessor); - case AGGREGATION_OPERATION.SUM: - return pts => getSum(pts, accessor); - case AGGREGATION_OPERATION.MEAN: - return pts => getMean(pts, accessor); - case AGGREGATION_OPERATION.MAX: - return pts => getMax(pts, accessor); - default: - return null; - } -} - -type AccessorContext = { - data?; - index?: number; - indices?: number[]; -}; - -function wrapAccessor(accessor, context: AccessorContext = {}) { - if (Number.isFinite(accessor)) { - return accessor; - } - return pt => { - context.index = pt.index; - return accessor(pt.source, context); - }; -} - -export function wrapGetValueFunc(getValue, context: AccessorContext = {}) { - return pts => { - context.indices = pts.map(pt => pt.index); - return getValue( - pts.map(pt => pt.source), - context - ); - }; -} diff --git a/modules/aggregation-layers/src/utils/bin-sorter.ts b/modules/aggregation-layers/src/utils/bin-sorter.ts deleted file mode 100644 index c02482f7cce..00000000000 --- a/modules/aggregation-layers/src/utils/bin-sorter.ts +++ /dev/null @@ -1,218 +0,0 @@ -// Copyright (c) 2015 - 2017 Uber Technologies, Inc. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -// getValue takes an array of points returns a value to sort the bins on. -// by default it returns the number of points -// this is where to pass in a function to color the bins by -// avg/mean/max of specific value of the point -const defaultGetValue = points => points.length; - -import {clamp, getQuantileDomain, getOrdinalDomain} from './scale-utils'; - -const MAX_32_BIT_FLOAT = 3.402823466e38; - -// access array of points in each bin -const defaultGetPoints = bin => bin.points; -// access index of each bin -const defaultGetIndex = bin => bin.index; - -// d3-scending -const ascending = (a, b) => (a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN); - -const defaultProps = { - getValue: defaultGetValue, - getPoints: defaultGetPoints, - getIndex: defaultGetIndex, - filterData: null -}; - -export type AggregatedBin = { - i: number; - value: any; - counts: number; -}; - -export default class BinSorter { - maxCount!: number; - maxValue!: number; - minValue!: number; - totalCount!: number; - - aggregatedBins: AggregatedBin[]; - sortedBins!: AggregatedBin[]; - binMap: Record; - - constructor(bins: unknown[] = [], props: Partial = defaultProps) { - this.aggregatedBins = this.getAggregatedBins(bins, props); - this._updateMinMaxValues(); - this.binMap = this.getBinMap(); - } - - /** - * Get an array of object with aggregated values and index of bins - * Array object will be sorted by value optionally. - * @param {Array} bins - * @param {Function} getValue - * @return {Array} array of values and index lookup - */ - getAggregatedBins(bins, props): AggregatedBin[] { - const { - getValue = defaultGetValue, - getPoints = defaultGetPoints, - getIndex = defaultGetIndex, - filterData - } = props; - - const hasFilter = typeof filterData === 'function'; - const binCount = bins.length; - const aggregatedBins: AggregatedBin[] = []; - let index = 0; - - for (let binIndex = 0; binIndex < binCount; binIndex++) { - const bin = bins[binIndex]; - const points = getPoints(bin); - const i = getIndex(bin); - - const filteredPoints = hasFilter ? points.filter(filterData) : points; - - bin.filteredPoints = hasFilter ? filteredPoints : null; - - const value = filteredPoints.length ? getValue(filteredPoints) : null; - - if (value !== null && value !== undefined) { - // filter bins if value is null or undefined - aggregatedBins[index] = { - i: Number.isFinite(i) ? i : binIndex, - value, - counts: filteredPoints.length - }; - index++; - } - } - return aggregatedBins; - } - - _percentileToIndex(percentileRange): [number, number] { - const len = this.sortedBins.length; - if (len < 2) { - return [0, 0]; - } - - const [lower, upper] = percentileRange.map(n => clamp(n, 0, 100)); - - const lowerIdx = Math.ceil((lower / 100) * (len - 1)); - const upperIdx = Math.floor((upper / 100) * (len - 1)); - - return [lowerIdx, upperIdx]; - } - - /** - * Get a mapping from cell/hexagon index to sorted bin - * This is used to retrieve bin value for color calculation - * @return {Object} bin index to aggregatedBins - */ - getBinMap(): Record { - const binMap = {}; - for (const bin of this.aggregatedBins) { - binMap[bin.i] = bin; - } - return binMap; - } - - // Private - - /** - * Get ths max count of all bins - */ - _updateMinMaxValues(): void { - let maxCount = 0; - let maxValue = 0; - let minValue = MAX_32_BIT_FLOAT; - let totalCount = 0; - for (const x of this.aggregatedBins) { - maxCount = maxCount > x.counts ? maxCount : x.counts; - maxValue = maxValue > x.value ? maxValue : x.value; - minValue = minValue < x.value ? minValue : x.value; - totalCount += x.counts; - } - this.maxCount = maxCount; - this.maxValue = maxValue; - this.minValue = minValue; - this.totalCount = totalCount; - } - - /** - * Get range of values of all bins - * @param {Number[]} range - * @param {Number} range[0] - lower bound - * @param {Number} range[1] - upper bound - * @return {Array} array of new value range - */ - getValueRange(percentileRange: [number, number]): [number, number] { - if (!this.sortedBins) { - this.sortedBins = this.aggregatedBins.sort((a, b) => ascending(a.value, b.value)); - } - if (!this.sortedBins.length) { - // @ts-expect-error - return []; - } - let lowerIdx = 0; - let upperIdx = this.sortedBins.length - 1; - - if (Array.isArray(percentileRange)) { - const idxRange = this._percentileToIndex(percentileRange); - lowerIdx = idxRange[0]; - upperIdx = idxRange[1]; - } - - return [this.sortedBins[lowerIdx].value, this.sortedBins[upperIdx].value]; - } - - getValueDomainByScale(scale: string, [lower = 0, upper = 100] = []) { - if (!this.sortedBins) { - this.sortedBins = this.aggregatedBins.sort((a, b) => ascending(a.value, b.value)); - } - if (!this.sortedBins.length) { - return []; - } - const indexEdge = this._percentileToIndex([lower, upper]); - - return this._getScaleDomain(scale, indexEdge); - } - - _getScaleDomain(scaleType: string, [lowerIdx, upperIdx]: [number, number]): [number, number] { - const bins = this.sortedBins; - - switch (scaleType) { - case 'quantize': - case 'linear': - return [bins[lowerIdx].value, bins[upperIdx].value]; - - case 'quantile': - return getQuantileDomain(bins.slice(lowerIdx, upperIdx + 1), d => d.value); - - case 'ordinal': - return getOrdinalDomain(bins, d => d.value) as [number, number]; - - default: - return [bins[lowerIdx].value, bins[upperIdx].value]; - } - } -} diff --git a/modules/aggregation-layers/src/utils/cpu-aggregator.ts b/modules/aggregation-layers/src/utils/cpu-aggregator.ts deleted file mode 100644 index 115cc0ef4d7..00000000000 --- a/modules/aggregation-layers/src/utils/cpu-aggregator.ts +++ /dev/null @@ -1,503 +0,0 @@ -// Copyright (c) 2015 - 2018 Uber Technologies, Inc. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -import BinSorter from './bin-sorter'; -import {getScaleFunctionByScaleType} from './scale-utils'; -import {getValueFunc, wrapGetValueFunc} from './aggregation-operation-utils'; - -// eslint-disable-next-line @typescript-eslint/no-empty-function -function noop() {} - -const dimensionSteps = ['getBins', 'getDomain', 'getScaleFunc']; -const defaultDimensions = [ - { - key: 'fillColor', - accessor: 'getFillColor', - pickingInfo: 'colorValue', - getBins: { - triggers: { - value: { - prop: 'getColorValue', - updateTrigger: 'getColorValue' - }, - weight: { - prop: 'getColorWeight', - updateTrigger: 'getColorWeight' - }, - aggregation: { - prop: 'colorAggregation' - }, - filterData: { - prop: '_filterData', - updateTrigger: '_filterData' - } - } - }, - getDomain: { - triggers: { - lowerPercentile: { - prop: 'lowerPercentile' - }, - upperPercentile: { - prop: 'upperPercentile' - }, - scaleType: { - prop: 'colorScaleType' - } - } - }, - getScaleFunc: { - triggers: { - domain: {prop: 'colorDomain'}, - range: {prop: 'colorRange'} - }, - onSet: { - props: 'onSetColorDomain' - } - }, - nullValue: [0, 0, 0, 0] - }, - { - key: 'elevation', - accessor: 'getElevation', - pickingInfo: 'elevationValue', - getBins: { - triggers: { - value: { - prop: 'getElevationValue', - updateTrigger: 'getElevationValue' - }, - weight: { - prop: 'getElevationWeight', - updateTrigger: 'getElevationWeight' - }, - aggregation: { - prop: 'elevationAggregation' - }, - filterData: { - prop: '_filterData', - updateTrigger: '_filterData' - } - } - }, - getDomain: { - triggers: { - lowerPercentile: { - prop: 'elevationLowerPercentile' - }, - upperPercentile: { - prop: 'elevationUpperPercentile' - }, - scaleType: { - prop: 'elevationScaleType' - } - } - }, - getScaleFunc: { - triggers: { - domain: {prop: 'elevationDomain'}, - range: {prop: 'elevationRange'} - }, - onSet: { - props: 'onSetElevationDomain' - } - }, - nullValue: -1 - } -]; -const defaultGetCellSize = props => props.cellSize; -export default class CPUAggregator { - state: { - layerData: { - data?: any[]; - }; - dimensions: Record; - } = { - layerData: { - data: undefined - }, - dimensions: { - // color: { - // getValue: null, - // domain: null, - // sortedBins: null, - // scaleFunc: noop - // }, - // elevation: { - // getValue: null, - // domain: null, - // sortedBins: null, - // scaleFunc: noop - // } - } - }; - changeFlags: Record = {}; - dimensionUpdaters: Record = {}; - - _getCellSize; - _getAggregator; - - constructor(opts) { - this._getCellSize = opts.getCellSize || defaultGetCellSize; - this._getAggregator = opts.getAggregator; - this._addDimension(opts.dimensions || defaultDimensions); - } - - static defaultDimensions() { - return defaultDimensions; - } - - updateState(opts, aggregationParams) { - const {oldProps, props, changeFlags} = opts; - this.updateGetValueFuncs(oldProps, props, changeFlags); - const reprojectNeeded = this.needsReProjectPoints(oldProps, props, changeFlags); - let aggregationDirty = false; - if (changeFlags.dataChanged || reprojectNeeded) { - // project data into bin and aggregate wegiths per bin - this.getAggregatedData(props, aggregationParams); - aggregationDirty = true; - } else { - const dimensionChanges = this.getDimensionChanges(oldProps, props, changeFlags) || []; - // this here is layer - dimensionChanges.forEach(f => typeof f === 'function' && f()); - aggregationDirty = true; - } - this.setState({aggregationDirty}); - - return this.state; - } - - // Update private state - setState(updateObject) { - this.state = {...this.state, ...updateObject}; - } - - // Update private state.dimensions - setDimensionState(key, updateObject) { - this.setState({ - dimensions: { - ...this.state.dimensions, - [key]: {...this.state.dimensions[key], ...updateObject} - } - }); - } - - normalizeResult(result: {hexagons?; layerData?} = {}) { - // support previous hexagonAggregator API - if (result.hexagons) { - return {data: result.hexagons, ...result}; - } else if (result.layerData) { - return {data: result.layerData, ...result}; - } - - return result; - } - - getAggregatedData(props, aggregationParams) { - const aggregator = this._getAggregator(props); - - const result = aggregator(props, aggregationParams); - this.setState({ - layerData: this.normalizeResult(result) - }); - this.changeFlags = { - layerData: true - }; - this.getSortedBins(props); - } - - updateGetValueFuncs(oldProps, props, changeFlags) { - for (const key in this.dimensionUpdaters) { - const {value, weight, aggregation} = this.dimensionUpdaters[key].getBins.triggers; - let getValue = props[value.prop]; - const getValueChanged = this.needUpdateDimensionStep( - this.dimensionUpdaters[key].getBins, - oldProps, - props, - changeFlags - ); - - if (getValueChanged) { - if (getValue) { - getValue = wrapGetValueFunc(getValue, {data: props.data}); - } else { - // If `getValue` is not provided from props, build it with aggregation and weight. - getValue = getValueFunc(props[aggregation.prop], props[weight.prop], {data: props.data}); - } - } - - if (getValue) { - this.setDimensionState(key, {getValue}); - } - } - } - - needsReProjectPoints(oldProps, props, changeFlags) { - return ( - this._getCellSize(oldProps) !== this._getCellSize(props) || - this._getAggregator(oldProps) !== this._getAggregator(props) || - (changeFlags.updateTriggersChanged && - (changeFlags.updateTriggersChanged.all || changeFlags.updateTriggersChanged.getPosition)) - ); - } - - // Adds dimensions - addDimension(dimensions) { - this._addDimension(dimensions); - } - - _addDimension(dimensions = []) { - dimensions.forEach(dimension => { - const {key} = dimension; - this.dimensionUpdaters[key] = this.getDimensionUpdaters(dimension); - this.state.dimensions[key] = { - getValue: null, - domain: null, - sortedBins: null, - scaleFunc: noop - }; - }); - } - - getDimensionUpdaters({key, accessor, pickingInfo, getBins, getDomain, getScaleFunc, nullValue}) { - return { - key, - accessor, - pickingInfo, - getBins: {updater: this.getDimensionSortedBins.bind(this), ...getBins}, - getDomain: {updater: this.getDimensionValueDomain.bind(this), ...getDomain}, - getScaleFunc: {updater: this.getDimensionScale.bind(this), ...getScaleFunc}, - attributeAccessor: this.getSubLayerDimensionAttribute(key, nullValue) - }; - } - - needUpdateDimensionStep(dimensionStep, oldProps, props, changeFlags) { - // whether need to update current dimension step - // dimension step is the value, domain, scaleFunction of each dimension - // each step is an object with properties links to layer prop and whether the prop is - // controlled by updateTriggers - // getBins: { - // value: { - // prop: 'getElevationValue', - // updateTrigger: 'getElevationValue' - // }, - // weight: { - // prop: 'getElevationWeight', - // updateTrigger: 'getElevationWeight' - // }, - // aggregation: { - // prop: 'elevationAggregation' - // } - // } - return Object.values(dimensionStep.triggers).some((item: any) => { - if (item.updateTrigger) { - // check based on updateTriggers change first - // if data has changed, always update value - return ( - changeFlags.dataChanged || - (changeFlags.updateTriggersChanged && - (changeFlags.updateTriggersChanged.all || - changeFlags.updateTriggersChanged[item.updateTrigger])) - ); - } - // fallback to direct comparison - return oldProps[item.prop] !== props[item.prop]; - }); - } - - getDimensionChanges(oldProps: any, props: any, changeFlags: any): Function[] | null { - // const {dimensionUpdaters} = this.state; - const updaters: Function[] = []; - - // get dimension to be updated - for (const key in this.dimensionUpdaters) { - // return the first triggered updater for each dimension - const needUpdate = dimensionSteps.find(step => - this.needUpdateDimensionStep( - this.dimensionUpdaters[key][step], - oldProps, - props, - changeFlags - ) - ); - - if (needUpdate) { - updaters.push( - this.dimensionUpdaters[key][needUpdate].updater.bind( - this, - props, - this.dimensionUpdaters[key] - ) - ); - } - } - - return updaters.length ? updaters : null; - } - - getUpdateTriggers(props) { - const _updateTriggers = props.updateTriggers || {}; - const updateTriggers = {}; - - for (const key in this.dimensionUpdaters) { - const {accessor} = this.dimensionUpdaters[key]; - // fold dimension triggers into each accessor - updateTriggers[accessor] = {}; - - dimensionSteps.forEach(step => { - Object.values(this.dimensionUpdaters[key][step].triggers).forEach( - ({prop, updateTrigger}: any) => { - if (updateTrigger) { - // if prop is based on updateTrigger e.g. getColorValue, getColorWeight - // and updateTriggers is passed in from layer prop - // fold the updateTriggers into accessor - const fromProp = _updateTriggers[updateTrigger]; - if (typeof fromProp === 'object' && !Array.isArray(fromProp)) { - // if updateTrigger is an object spread it - Object.assign(updateTriggers[accessor], fromProp); - } else if (fromProp !== undefined) { - updateTriggers[accessor][prop] = fromProp; - } - } else { - // if prop is not based on updateTrigger - updateTriggers[accessor][prop] = props[prop]; - } - } - ); - }); - } - - return updateTriggers; - } - - getSortedBins(props) { - for (const key in this.dimensionUpdaters) { - this.getDimensionSortedBins(props, this.dimensionUpdaters[key]); - } - } - - getDimensionSortedBins(props, dimensionUpdater) { - const {key} = dimensionUpdater; - const {getValue} = this.state.dimensions[key]; - - const sortedBins = new BinSorter(this.state.layerData.data || [], { - getValue, - filterData: props._filterData - }); - this.setDimensionState(key, {sortedBins}); - this.getDimensionValueDomain(props, dimensionUpdater); - } - - getDimensionValueDomain(props, dimensionUpdater) { - const {getDomain, key} = dimensionUpdater; - const { - triggers: {lowerPercentile, upperPercentile, scaleType} - } = getDomain; - const valueDomain = this.state.dimensions[key].sortedBins.getValueDomainByScale( - props[scaleType.prop], - [props[lowerPercentile.prop], props[upperPercentile.prop]] - ); - - this.setDimensionState(key, {valueDomain}); - this.getDimensionScale(props, dimensionUpdater); - } - - getDimensionScale(props, dimensionUpdater) { - const {key, getScaleFunc, getDomain} = dimensionUpdater; - const {domain, range} = getScaleFunc.triggers; - const {scaleType} = getDomain.triggers; - const {onSet} = getScaleFunc; - const dimensionRange = props[range.prop]; - const dimensionDomain = props[domain.prop] || this.state.dimensions[key].valueDomain; - const getScaleFunction = getScaleFunctionByScaleType(scaleType && props[scaleType.prop]); - const scaleFunc = getScaleFunction(dimensionDomain, dimensionRange); - - if (typeof onSet === 'object' && typeof props[onSet.props] === 'function') { - props[onSet.props](scaleFunc.domain()); - } - - this.setDimensionState(key, {scaleFunc}); - } - - getSubLayerDimensionAttribute(key, nullValue) { - return cell => { - const {sortedBins, scaleFunc} = this.state.dimensions[key]; - const bin = sortedBins.binMap[cell.index]; - - if (bin && bin.counts === 0) { - // no points left in bin after filtering - return nullValue; - } - const cv = bin && bin.value; - const domain = scaleFunc.domain(); - - const isValueInDomain = cv >= domain[0] && cv <= domain[domain.length - 1]; - - // if cell value is outside domain, set alpha to 0 - return isValueInDomain ? scaleFunc(cv) : nullValue; - }; - } - - getSubLayerAccessors(props) { - const accessors = {}; - for (const key in this.dimensionUpdaters) { - const {accessor} = this.dimensionUpdaters[key]; - accessors[accessor] = this.getSubLayerDimensionAttribute(props, key); - } - - return accessors; - } - - getPickingInfo({info}) { - const isPicked = info.picked && info.index > -1; - let object = null; - - if (isPicked) { - // const {sortedColorBins, sortedElevationBins} = this.state; - - // @ts-expect-error - const cell = this.state.layerData.data[info.index]; - - const binInfo = {}; - for (const key in this.dimensionUpdaters) { - const {pickingInfo} = this.dimensionUpdaters[key]; - const {sortedBins} = this.state.dimensions[key]; - const value = sortedBins.binMap[cell.index] && sortedBins.binMap[cell.index].value; - binInfo[pickingInfo] = value; - } - - object = Object.assign(binInfo, cell, { - points: cell.filteredPoints || cell.points - }); - } - - // override object with picked cell - info.picked = Boolean(object); - info.object = object; - - return info; - } - - getAccessor(dimensionKey) { - if (!this.dimensionUpdaters.hasOwnProperty(dimensionKey)) { - return noop; - } - return this.dimensionUpdaters[dimensionKey].attributeAccessor; - } -} diff --git a/modules/aggregation-layers/src/utils/gpu-grid-aggregation/aggregate-all-fs.glsl.ts b/modules/aggregation-layers/src/utils/gpu-grid-aggregation/aggregate-all-fs.glsl.ts deleted file mode 100644 index 34afd078c83..00000000000 --- a/modules/aggregation-layers/src/utils/gpu-grid-aggregation/aggregate-all-fs.glsl.ts +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright (c) 2015 - 2018 Uber Technologies, Inc. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -export default `\ -#version 300 es -#define SHADER_NAME gpu-aggregation-all-fs - -precision highp float; - -in vec2 vTextureCoord; -uniform sampler2D uSampler; -uniform bool combineMaxMin; -out vec4 fragColor; -void main(void) { - vec4 textureColor = texture(uSampler, vec2(vTextureCoord.s, vTextureCoord.t)); - if (textureColor.a == 0.) { - discard; - } - fragColor.rgb = textureColor.rgb; - // if combineMinMax is true, use Alpha channel for first weights min value. - fragColor.a = combineMaxMin ? textureColor.r : textureColor.a; -} -`; diff --git a/modules/aggregation-layers/src/utils/gpu-grid-aggregation/aggregate-all-vs.glsl.ts b/modules/aggregation-layers/src/utils/gpu-grid-aggregation/aggregate-all-vs.glsl.ts deleted file mode 100644 index bb5daaf0c22..00000000000 --- a/modules/aggregation-layers/src/utils/gpu-grid-aggregation/aggregate-all-vs.glsl.ts +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright (c) 2015 - 2018 Uber Technologies, Inc. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -export default `\ -#version 300 es -#define SHADER_NAME gpu-aggregation-all-vs-64 - -in vec2 position; -uniform ivec2 gridSize; -out vec2 vTextureCoord; - -void main(void) { - // Map each position to single pixel - vec2 pos = vec2(-1.0, -1.0); - - // Move to pixel center, pixel-size in screen sapce (2/gridSize) * 0.5 => 1/gridSize - vec2 offset = 1.0 / vec2(gridSize); - pos = pos + offset; - - gl_Position = vec4(pos, 0.0, 1.0); - - int yIndex = gl_InstanceID / gridSize[0]; - int xIndex = gl_InstanceID - (yIndex * gridSize[0]); - - vec2 yIndexFP64 = vec2(float(yIndex), 0.); - vec2 xIndexFP64 = vec2(float(xIndex), 0.); - vec2 gridSizeYFP64 = vec2(gridSize[1], 0.); - vec2 gridSizeXFP64 = vec2(gridSize[0], 0.); - - vec2 texCoordXFP64 = div_fp64(yIndexFP64, gridSizeYFP64); - vec2 texCoordYFP64 = div_fp64(xIndexFP64, gridSizeXFP64); - - vTextureCoord = vec2(texCoordYFP64.x, texCoordXFP64.x); - // Enforce default value for ANGLE issue (https://bugs.chromium.org/p/angleproject/issues/detail?id=3941) - gl_PointSize = 1.0; -} -`; diff --git a/modules/aggregation-layers/src/utils/gpu-grid-aggregation/aggregate-to-grid-fs.glsl.ts b/modules/aggregation-layers/src/utils/gpu-grid-aggregation/aggregate-to-grid-fs.glsl.ts deleted file mode 100644 index a30fa559509..00000000000 --- a/modules/aggregation-layers/src/utils/gpu-grid-aggregation/aggregate-to-grid-fs.glsl.ts +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (c) 2015 - 2018 Uber Technologies, Inc. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -export default `\ -#version 300 es -#define SHADER_NAME gpu-aggregation-to-grid-fs - -precision highp float; - -in vec3 vWeights; - -out vec4 fragColor; - -void main(void) { - fragColor = vec4(vWeights, 1.0); - DECKGL_FILTER_COLOR(fragColor, geometry); -} -`; diff --git a/modules/aggregation-layers/src/utils/gpu-grid-aggregation/aggregate-to-grid-vs.glsl.ts b/modules/aggregation-layers/src/utils/gpu-grid-aggregation/aggregate-to-grid-vs.glsl.ts deleted file mode 100644 index 7af16e7634e..00000000000 --- a/modules/aggregation-layers/src/utils/gpu-grid-aggregation/aggregate-to-grid-vs.glsl.ts +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright (c) 2015 - 2018 Uber Technologies, Inc. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -export default `\ -#version 300 es -#define SHADER_NAME gpu-aggregation-to-grid-vs - -in vec3 positions; -in vec3 positions64Low; -in vec3 weights; -uniform vec2 cellSize; -uniform vec2 gridSize; -uniform bool projectPoints; -uniform vec2 translation; -uniform vec3 scaling; - -out vec3 vWeights; - -vec2 project_to_pixel(vec4 pos) { - vec4 result; - pos.xy = pos.xy/pos.w; - result = pos + vec4(translation, 0., 0.); - result.xy = scaling.z > 0. ? result.xy * scaling.xy : result.xy; - return result.xy; -} - -void main(void) { - - vWeights = weights; - - vec4 windowPos = vec4(positions, 1.); - if (projectPoints) { - windowPos = project_position_to_clipspace(positions, positions64Low, vec3(0)); - } - - vec2 pos = project_to_pixel(windowPos); - - vec2 pixelXY64[2]; - pixelXY64[0] = vec2(pos.x, 0.); - pixelXY64[1] = vec2(pos.y, 0.); - - // Transform (0,0):windowSize -> (0, 0): gridSize - vec2 gridXY64[2]; - gridXY64[0] = div_fp64(pixelXY64[0], vec2(cellSize.x, 0)); - gridXY64[1] = div_fp64(pixelXY64[1], vec2(cellSize.y, 0)); - float x = floor(gridXY64[0].x); - float y = floor(gridXY64[1].x); - pos = vec2(x, y); - - // Transform (0,0):gridSize -> (-1, -1):(1,1) - pos = (pos * (2., 2.) / (gridSize)) - (1., 1.); - - // Move to pixel center, pixel-size in screen sapce (2/gridSize) * 0.5 => 1/gridSize - vec2 offset = 1.0 / gridSize; - pos = pos + offset; - - gl_Position = vec4(pos, 0.0, 1.0); - - // Enforce default value for ANGLE issue (https://bugs.chromium.org/p/angleproject/issues/detail?id=3941) - gl_PointSize = 1.0; -} -`; diff --git a/modules/aggregation-layers/src/utils/gpu-grid-aggregation/gpu-grid-aggregator-constants.ts b/modules/aggregation-layers/src/utils/gpu-grid-aggregation/gpu-grid-aggregator-constants.ts deleted file mode 100644 index 4776ce15376..00000000000 --- a/modules/aggregation-layers/src/utils/gpu-grid-aggregation/gpu-grid-aggregator-constants.ts +++ /dev/null @@ -1,44 +0,0 @@ -import {GL} from '@luma.gl/constants'; -import type {TextureProps} from '@luma.gl/core'; -import {AGGREGATION_OPERATION} from '../aggregation-operation-utils'; - -export const DEFAULT_RUN_PARAMS = { - projectPoints: false, - viewport: null, - createBufferObjects: true, - moduleSettings: {} -}; - -export const MAX_32_BIT_FLOAT = 3.402823466e38; -export const MIN_BLEND_EQUATION = [GL.MIN, GL.FUNC_ADD]; -export const MAX_BLEND_EQUATION = [GL.MAX, GL.FUNC_ADD]; -export const MAX_MIN_BLEND_EQUATION = [GL.MAX, GL.MIN]; -export const EQUATION_MAP = { - [AGGREGATION_OPERATION.SUM]: GL.FUNC_ADD, - [AGGREGATION_OPERATION.MEAN]: GL.FUNC_ADD, - [AGGREGATION_OPERATION.MIN]: MIN_BLEND_EQUATION, - [AGGREGATION_OPERATION.MAX]: MAX_BLEND_EQUATION -}; - -export const ELEMENTCOUNT = 4; -export const DEFAULT_WEIGHT_PARAMS = { - size: 1, - operation: AGGREGATION_OPERATION.SUM, - needMin: false, - needMax: false, - combineMaxMin: false -}; - -export const PIXEL_SIZE = 4; // RGBA32F -export const WEIGHT_SIZE = 3; - -export const MAX_MIN_TEXTURE_OPTS: TextureProps = { - format: 'rgba32float', - mipmaps: false, - sampler: { - minFilter: 'nearest', - magFilter: 'nearest' - }, - width: 1, - height: 1 -}; diff --git a/modules/aggregation-layers/src/utils/gpu-grid-aggregation/gpu-grid-aggregator-utils.ts b/modules/aggregation-layers/src/utils/gpu-grid-aggregation/gpu-grid-aggregator-utils.ts deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/modules/aggregation-layers/src/utils/gpu-grid-aggregation/gpu-grid-aggregator.md b/modules/aggregation-layers/src/utils/gpu-grid-aggregation/gpu-grid-aggregator.md deleted file mode 100644 index b0843c65f7b..00000000000 --- a/modules/aggregation-layers/src/utils/gpu-grid-aggregation/gpu-grid-aggregator.md +++ /dev/null @@ -1,155 +0,0 @@ -# GPUGridAggregator Class (Advanced) (WebGL2) - -`GPUGridAggregator` performs grid aggregation on GPU. Aggregation can be performed either in world space or in screen space. - -# Usage (Aggregation in World space) -``` -const aggregator = new GPUGridAggregator(device); - -const results = aggregator.run({ - attributes, // position and weight attributes - weights: { - weight1: { - operation: AGGREGATION_OPERATION.MEAN, - needMax: true, - } - }, - cellSize: [50, 50], - width: 500, - height: 500 -}); - -// results.weight1.aggregationBuffer contains, one aggregated value for each grid cell, which is equal to mean weight of all sample points that fall into that grid cell. -// results.weight1.maxBuffer contains max mean value of all grid cells. - -``` - -# Usage (Aggregation in Screen space) - -You can also perform aggregation in screen space by provide a viewport and set `projectPoints` to true. Aggregator will first project positions and then aggregate them in screen space. - -``` -const aggregator = new GPUGridAggregator(device); - -const results = aggregator.run({ - attributes, // position and weight attributes - weights: { - weight1: { - operation: AGGREGATION_OPERATION.MEAN, - needMax: true, - } - }, - cellSize: [50, 50], - width: 500, - height: 500, - viewport, - projectPoints: true -}); - -// results.weight1.aggregationBuffer contains, one aggregated value for each grid cell, which is equal to mean weight of all sample points that fall into that grid cell. -// results.weight1.maxBuffer contains max mean value of all grid cells. - -``` - -## Methods - -### constructor - -‘ScreenGridAggregator’ constructor takes following arguments and constructs an object. - -* device (WebGLContext) : used for querying WebGL features and creating required webgl resources. -* opts (Object) : Optionally contains and ‘id’ and ‘sahderCache’ object for caching/re-using shaders. - - -### run - -Performs aggregation either on CPU or GPU based on the provided options and browser’s WebGL capabilities. - -```js -const results = gpuGridAggregator.run({ - positions, - weights, - cellSize: [5, 5], - viewport, - changeFlags, - projectPoints: true, - translation, - scaling -}); -``` - -Parameters: -* positions (Array) : Array of points in world space (lng, lat). -* weights (Object) : Object contains one or more weights. Key represents id and corresponding object represents the weight. Each weight object contains following values: - - * `values` (Array, Float32Array or Buffer) : Contains weight values for all points, there should be 3 floats for each point, un-used values can be 0. - * `size` (Number, default: 1, minValue: 1, maxValue: 3) : Size of a single weight instance. Determines how many distinct weights exist in the array. - * `operation` (Enum {SUM, MEAN, MIN or MAX}, default: SUM) : Defines aggregation operation. - * `needMin` (Boolean, default: false) : when true additional aggregation steps are performed to calculate minimum of all aggregation values and total count, result object will contain minBuffer. - * `needMax` (Boolean, default: false) : when true additional aggregation steps are performed to calculate maximum of all aggregation values and total count, result object will contain maxBuffer. - * `combineMaxMin` (Boolean, default: false) : Applicable only when `needMin` and `needMax` are set. When true, both min and max values are calculated in single aggregation step using `blendEquationSeparate` WebGL API. But since Alpha channel can only contain one float, it will only provide minimum value for first weight in Alpha channel and RGB channels store maximum value up to 3 weights. Also when selected total count is not available. Result object will contain maxMinBuffer. - -* cellSize: (Array) : Size of the cell, cellSize[0] is width and cellSize[1] is height. -* width: (Number, Optional) : Grid width in pixels, deduced from ‘viewport’ when not provided. -* height: (Number, Optional) : Grid height in pixels, deduced from ‘viewport’ when not provided. -* viewport: (Object, Viewport) : Contains size of viewport and also used to perform projection. -* changeFlags: (Object, Optional) : Object with following keyed values, that determine whether to re-create internal WebGL resources for performing aggregation compared to last run. If no value is provided, all flags are treated to be true. - * dataChanged (Bool) : should be set to true when data is changed. - * viewportChanged (Bool) : should be set to true when viewport is changed. - * cellSizeChagned (Bool) : should be set to true when cellSize is changed. -* countsBuffer: (Buffer, optional) : used to update aggregation data per grid, details in Output section. -* maxCountBuffer: (Buffer, optional) : used to update total aggregation data, details in Output section. -* projectPoints (Bool) : when true performs aggregation in screen space. -* translation (Array) : [xOffset, yOffset], used to translate input positions before aggregating them (for example, lng/lat can be moved to +ve range). -* scaling (Array) : [xScale, yScale, isScalingValid] : `xScale`, `yScale` define scaling to be applied before aggregating. Scaling is applied only when `isScalingValie` is > 0. -* createBufferObjects (Bool, options, default: true) : Only applicable when aggregation is performed on CPU. When set to false, aggregated data is not uploaded into Buffer objects. In a typical use case, Applications need data in `Buffer` objects to use them in next rendering cycle, hence by default its value is true, but if needed this step can be avoided by setting this flag to false. - -NOTE: When doing screen space aggregation, i.e projectPoints is true, `translation` and `scaling` should be set to transformation required for camera space (NDC) to screen (pixel) space. - -Returns: -* An object, where key represents `id` of the weight and value contains following aggregated data. - - * `aggregationBuffer` (Buffer) : Aggregated values per grid cell, aggregation is performed as per specified `operation`. Size of the buffer is 4, with R, G and B channel corresponds to aggregated weights. When input `size` is < 3, G or B channels contain undefined values. Alpha channel contains count of points aggregated into this cell. (R: weight#1 G: weight#2 B: weight#3 A: count) - - * `aggregationTexture` (Texture) : When aggregation is performed on GPU, contains above data as form of texture, useful for applications that want to consume the texture instead of buffer. This value is `null` when aggregation is performed on CPU. - - * `minBuffer` (Buffer, optional) : Contains data for one pixel with R, G, B and A channels contain min value of all aggregated grid cells. When aggregation is performed on CPU, `minBuffer` is `null` but `minData` Array is returned with same data. This value is `null` when `needMin` is false. (R: weight#1 min value G: weight#2 min value B: weight#3 min value A: total count) - - * `minTexture` (Texture2D, optional) : Texture2D object (1X1 size with RGBA_FLOAT_32 format) contains same data as `minBuffer`. - - * `maxBuffer` (Buffer, optional) : Contains data for one pixel with R, G, B and A channels contain max value of all aggregated grid cells. When aggregation is performed on CPU, `maxBuffer` is `null` but `maxData` Array is returned with same data. This value is `null` when `needMax` is false. (R: weight#1 max value G: weight#2 max value B: weight#3 max value A: total count) - - * `maxTexture` (Texture2D, optional) : Texture2D object (1X1 size with RGBA_FLOAT_32 format) contains same data as `maxBuffer`. - - * `maxMinBuffer` (Buffer, optional) : Contains data for one pixel, with RGB channels contains max value of all aggregated grid cells and A channel contains minimum value of all aggregated grid cells. When `combineMaxMin` is `false` this value will be `null`. (R: weight#1 max value G: weight#2 max value B: weight#3 max value A: weight#1 min value) - - * `maxMinTexture` (Texture2D, optional) : Texture2D object (1X1 size with RGBA_FLOAT_32 format) contains same data as `maxMinBuffer`. - - NOTES: - * `minBuffer`, `maxBuffer` and `maxMinBuffer` are usually consumed by setting them as uniform buffer object or read by the CPU. - * Aggregation data per cell, is always in `Buffer` objects to provide common API irrespective of whether aggregation is performed on CPU or GPU. - * Min-max aggregation results is provided in form of `Texture2D` and `Buffer` objects whether aggregation is performed on CPU or GPU. - * When aggregation is performed on CPU, min-max aggregation results are also provided in form of Float32Arrays. - - -### getData - -Reads aggregation results from GPU memory (Buffer) to CPU memory (Typed Arrays). - -```js -const aggregationResults = gpuGridAggregator.getData('weightId'); -``` - -Parameters: - * `weightId` (String) : `id` of the weight for which aggregation data is needed. - -Returns: -An object with aggregation results in CPU memory (Typed Arrays). Returned object contains following values : - * `aggregationData` : Aggregated data per grid cell. - Following additional arrays exist if they were requested when aggregation is performed. - * `minData` : Min aggregation results. - * `maxData` : Max aggregation results. - * `maxMinData` : Combined max min aggregation results. - -Note: -When aggregation is performed on GPU, `getData` performs Buffer read and can potentially an expensive operation due to CPU and GPU sync, in such cases data is also cached to avoid reading from GPU memory for subsequent calls. diff --git a/modules/aggregation-layers/src/utils/gpu-grid-aggregation/gpu-grid-aggregator.ts b/modules/aggregation-layers/src/utils/gpu-grid-aggregation/gpu-grid-aggregator.ts deleted file mode 100644 index 00882788a9d..00000000000 --- a/modules/aggregation-layers/src/utils/gpu-grid-aggregation/gpu-grid-aggregator.ts +++ /dev/null @@ -1,690 +0,0 @@ -// Copyright (c) 2015 - 2018 Uber Technologies, Inc. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -import type {Device, DeviceFeature} from '@luma.gl/core'; -import {Model, TextureTransform} from '@luma.gl/engine'; -import {fp64arithmetic} from '@luma.gl/shadertools'; -import {GL} from '@luma.gl/constants'; -import {project32, _mergeShaders as mergeShaders, getShaderAssembler} from '@deck.gl/core'; - -import { - DEFAULT_RUN_PARAMS, - MAX_32_BIT_FLOAT, - MIN_BLEND_EQUATION, - MAX_BLEND_EQUATION, - MAX_MIN_BLEND_EQUATION, - EQUATION_MAP, - DEFAULT_WEIGHT_PARAMS, - PIXEL_SIZE -} from './gpu-grid-aggregator-constants'; -import {AGGREGATION_OPERATION} from '../aggregation-operation-utils'; - -import AGGREGATE_TO_GRID_VS from './aggregate-to-grid-vs.glsl'; -import AGGREGATE_TO_GRID_FS from './aggregate-to-grid-fs.glsl'; -import AGGREGATE_ALL_VS from './aggregate-all-vs.glsl'; -import AGGREGATE_ALL_FS from './aggregate-all-fs.glsl'; -import TRANSFORM_MEAN_VS from './transform-mean-vs.glsl'; -import {getFloatTexture, getFramebuffer} from './../resource-utils'; - -const BUFFER_NAMES = ['aggregationBuffer', 'maxMinBuffer', 'minBuffer', 'maxBuffer']; -const ARRAY_BUFFER_MAP = { - maxData: 'maxBuffer', - minData: 'minBuffer', - maxMinData: 'maxMinBuffer' -}; - -const REQUIRED_FEATURES: DeviceFeature[] = [ - 'float32-renderable-webgl', - 'texture-blend-float-webgl' -]; - -export type GPUGridAggregatorProps = { - id?: string; -}; - -export default class GPUGridAggregator { - // Decode and return aggregation data of given pixel. - static getAggregationData({ - aggregationData, - maxData, - minData, - maxMinData, - pixelIndex - }: { - aggregationData?: Float32Array; - maxData?: Float32Array; - minData?: Float32Array; - maxMinData?: Float32Array; - pixelIndex: number; - }) { - const index = pixelIndex * PIXEL_SIZE; - const results: {cellCount?; cellWeight?; maxCellWieght?; minCellWeight?; totalCount?} = {}; - if (aggregationData) { - results.cellCount = aggregationData[index + 3]; - results.cellWeight = aggregationData[index]; - } - if (maxMinData) { - results.maxCellWieght = maxMinData[0]; - results.minCellWeight = maxMinData[3]; - } else { - if (maxData) { - results.maxCellWieght = maxData[0]; - results.totalCount = maxData[3]; - } - if (minData) { - results.minCellWeight = minData[0]; - results.totalCount = minData[3]; - } - } - return results; - } - - // Decodes and retuns counts and weights of all cells - static getCellData({countsData, size = 1}) { - const numCells = countsData.length / 4; - const cellWeights = new Float32Array(numCells * size); - const cellCounts = new Uint32Array(numCells); - for (let i = 0; i < numCells; i++) { - // weights in RGB channels - for (let sizeIndex = 0; sizeIndex < size; sizeIndex++) { - cellWeights[i * size + sizeIndex] = countsData[i * 4 + sizeIndex]; - } - // count in Alpha channel - cellCounts[i] = countsData[i * 4 + 3]; - } - return {cellCounts, cellWeights}; - } - - static isSupported(device: Device) { - return REQUIRED_FEATURES.every(feature => device.features.has(feature)); - } - - // DEBUG ONLY - // static logData({aggregationBuffer, minBuffer, maxBuffer, maxMinBuffer, limit = 10}) { - // if (aggregationBuffer) { - // console.log('Aggregation Data:'); - // const agrData = aggregationBuffer.getData(); - // for (let index = 0; index < agrData.length && limit > 0; index += 4) { - // if (agrData[index + 3] > 0) { - // console.log( - // `index: ${index} weights: ${agrData[index]} ${agrData[index + 1]} ${ - // agrData[index + 2] - // } count: ${agrData[index + 3]}` - // ); - // limit--; - // } - // } - // } - // const obj = {minBuffer, maxBuffer, maxMinBuffer}; - // for (const key in obj) { - // if (obj[key]) { - // const data = obj[key].getData(); - // console.log(`${key} data : R: ${data[0]} G: ${data[1]} B: ${data[2]} A: ${data[3]}`); - // } - // } - // } - - state = { - // per weight GPU resources - weightAttributes: {}, - textures: {}, - meanTextures: {}, - buffers: {}, - framebuffers: {}, - maxMinFramebuffers: {}, - minFramebuffers: {}, - maxFramebuffers: {}, - equations: {}, - - shaderOptions: {}, - modelDirty: false, - - // common resources to be deleted - resources: {}, - - // results - results: {} - }; - - id: string; - device: Device; - _hasGPUSupport: boolean; - - gridAggregationModel; - allAggregationModel; - meanTransform; - - constructor(device: Device, props: GPUGridAggregatorProps = {}) { - this.id = props.id || 'gpu-grid-aggregator'; - this.device = device; - - const REQUIRED_FEATURES: DeviceFeature[] = [ - 'float32-renderable-webgl' // render to float texture - ]; - - this._hasGPUSupport = REQUIRED_FEATURES.every(feature => device.features.has(feature)); - if (this._hasGPUSupport) { - this._setupModels(); - } - } - - // Delete owned resources. - delete() { - const {gridAggregationModel, allAggregationModel, meanTransform} = this; - const { - textures, - framebuffers, - maxMinFramebuffers, - minFramebuffers, - maxFramebuffers, - meanTextures, - resources - } = this.state; - - gridAggregationModel?.destroy(); - allAggregationModel?.destroy(); - meanTransform?.destroy(); - - deleteResources([ - framebuffers, - textures, - maxMinFramebuffers, - minFramebuffers, - maxFramebuffers, - meanTextures, - resources - ]); - } - - // Perform aggregation and retun the results - run(opts = {}) { - // reset results - this.setState({results: {}}); - const aggregationParams = this._normalizeAggregationParams(opts); - return this._runAggregation(aggregationParams); - } - - // Reads aggregation data into JS Array object - // For WebGL1, data is available in JS Array objects already. - // For WebGL2, data is read from Buffer objects and cached for subsequent queries. - getData(weightId) { - const data: { - aggregationData?: Float32Array; - maxData?: Float32Array; - minData?: Float32Array; - maxMinData?: Float32Array; - } = {}; - const results = this.state.results; - if (!results[weightId].aggregationData) { - // cache the results if reading from the buffer (WebGL2 path) - results[weightId].aggregationData = results[weightId].aggregationBuffer.getData(); - } - data.aggregationData = results[weightId].aggregationData; - - // Check for optional results - for (const arrayName in ARRAY_BUFFER_MAP) { - const bufferName = ARRAY_BUFFER_MAP[arrayName]; - - if (results[weightId][arrayName] || results[weightId][bufferName]) { - // cache the result - results[weightId][arrayName] = - results[weightId][arrayName] || results[weightId][bufferName].getData(); - data[arrayName] = results[weightId][arrayName]; - } - } - return data; - } - - updateShaders(shaderOptions = {}) { - this.setState({shaderOptions, modelDirty: true}); - } - - // PRIVATE - - _normalizeAggregationParams(opts) { - const aggregationParams = {...DEFAULT_RUN_PARAMS, ...opts}; - const {weights} = aggregationParams; - if (weights) { - aggregationParams.weights = normalizeWeightParams(weights); - } - return aggregationParams; - } - - // Update priveate state - setState(updateObject) { - Object.assign(this.state, updateObject); - } - - // GPU Aggregation methods - - _getAggregateData(opts) { - const results = {}; - const { - textures, - framebuffers, - maxMinFramebuffers, - minFramebuffers, - maxFramebuffers, - resources - } = this.state; - const {weights} = opts; - - for (const id in weights) { - results[id] = {}; - const {needMin, needMax, combineMaxMin} = weights[id]; - results[id].aggregationTexture = textures[id]; - results[id].aggregationBuffer = this.device.readPixelsToBufferWebGL(framebuffers[id], { - target: weights[id].aggregationBuffer, // update if a buffer is provided - sourceType: GL.FLOAT - }); - if (needMin && needMax && combineMaxMin) { - results[id].maxMinBuffer = this.device.readPixelsToBufferWebGL(maxMinFramebuffers[id], { - target: weights[id].maxMinBuffer, // update if a buffer is provided - sourceType: GL.FLOAT - }); - results[id].maxMinTexture = resources[`${id}-maxMinTexture`]; - } else { - if (needMin) { - results[id].minBuffer = this.device.readPixelsToBufferWebGL(minFramebuffers[id], { - target: weights[id].minBuffer, // update if a buffer is provided - sourceType: GL.FLOAT - }); - results[id].minTexture = resources[`${id}-minTexture`]; - } - if (needMax) { - results[id].maxBuffer = this.device.readPixelsToBufferWebGL(maxFramebuffers[id], { - target: weights[id].maxBuffer, // update if a buffer is provided - sourceType: GL.FLOAT - }); - results[id].maxTexture = resources[`${id}-maxTexture`]; - } - } - } - this._trackGPUResultBuffers(results, weights); - return results; - } - - _renderAggregateData(opts) { - const { - cellSize, - projectPoints, - attributes, - moduleSettings, - numCol, - numRow, - weights, - translation, - scaling - } = opts; - const {maxMinFramebuffers, minFramebuffers, maxFramebuffers} = this.state; - - const gridSize = [numCol, numRow]; - const parameters = { - blend: true, - depthTest: false, - blendFunc: [GL.ONE, GL.ONE] - }; - const uniforms = { - cellSize, - gridSize, - projectPoints, - translation, - scaling - }; - - for (const id in weights) { - const {needMin, needMax} = weights[id]; - const combineMaxMin = needMin && needMax && weights[id].combineMaxMin; - this._renderToWeightsTexture({ - id, - parameters, - moduleSettings, - uniforms, - gridSize, - attributes, - weights - }); - if (combineMaxMin) { - this._renderToMaxMinTexture({ - id, - parameters: {...parameters, blendEquation: MAX_MIN_BLEND_EQUATION}, - gridSize, - minOrMaxFb: maxMinFramebuffers[id], - clearParams: {clearColor: [0, 0, 0, MAX_32_BIT_FLOAT]}, - combineMaxMin - }); - } else { - if (needMin) { - this._renderToMaxMinTexture({ - id, - parameters: {...parameters, blendEquation: MIN_BLEND_EQUATION}, - gridSize, - minOrMaxFb: minFramebuffers[id], - clearParams: {clearColor: [MAX_32_BIT_FLOAT, MAX_32_BIT_FLOAT, MAX_32_BIT_FLOAT, 0]}, - combineMaxMin - }); - } - if (needMax) { - this._renderToMaxMinTexture({ - id, - parameters: {...parameters, blendEquation: MAX_BLEND_EQUATION}, - gridSize, - minOrMaxFb: maxFramebuffers[id], - clearParams: {clearColor: [0, 0, 0, 0]}, - combineMaxMin - }); - } - } - } - } - - // render all aggregated grid-cells to generate Min, Max or MaxMin data texture - _renderToMaxMinTexture(opts) { - const {id, gridSize, minOrMaxFb, combineMaxMin, clearParams = {}} = opts; - const {framebuffers} = this.state; - const {allAggregationModel} = this; - - this.device.withParametersWebGL( - { - ...clearParams, - framebuffer: minOrMaxFb, - viewport: [0, 0, gridSize[0], gridSize[1]] - }, - () => { - this.device.clearWebGL({color: true}); - - // allAggregationModel.setParameters(parameters); - allAggregationModel.setUniforms({gridSize, combineMaxMin}); - allAggregationModel.setBindings({uSampler: framebuffers[id].texture}); - allAggregationModel.draw(); - // TODO - we need to create a render pass for the aggregation - // allAggregationModel.draw(renderPass); - } - ); - } - - // render all data points to aggregate weights - _renderToWeightsTexture(opts) { - const {id, parameters, moduleSettings, uniforms, gridSize, weights} = opts; - const {framebuffers, equations, weightAttributes} = this.state; - const {gridAggregationModel} = this; - const {operation} = weights[id]; - - const clearColor = - operation === AGGREGATION_OPERATION.MIN - ? [MAX_32_BIT_FLOAT, MAX_32_BIT_FLOAT, MAX_32_BIT_FLOAT, 0] - : [0, 0, 0, 0]; - this.device.withParametersWebGL( - { - framebuffer: framebuffers[id], - viewport: [0, 0, gridSize[0], gridSize[1]], - clearColor - }, - () => { - this.device.clearWebGL({color: true}); - - const attributes = {weights: weightAttributes[id]}; - gridAggregationModel.draw({ - parameters: {...parameters, blendEquation: equations[id]}, - moduleSettings, - uniforms, - attributes - }); - } - ); - - if (operation === AGGREGATION_OPERATION.MEAN) { - const {meanTextures, textures} = this.state; - const transformOptions = { - _sourceTextures: {aggregationValues: meanTextures[id]}, // contains aggregated data - _targetTexture: textures[id], // store mean values, - elementCount: textures[id].width * textures[id].height - }; - if (this.meanTransform) { - this.meanTransform.update(transformOptions); - } else { - this.meanTransform = getMeanTransform(this.device, transformOptions); - } - this.meanTransform.run({ - parameters: { - blend: false, - depthTest: false - } - }); - - // update framebuffer with mean results so device.readPixelsToBufferWebGL returns mean values - framebuffers[id].attach({[GL.COLOR_ATTACHMENT0]: textures[id]}); - } - } - - _runAggregation(opts) { - this._updateModels(opts); - this._setupFramebuffers(opts); - this._renderAggregateData(opts); - const results = this._getAggregateData(opts); - this.setState({results}); - return results; - } - - // set up framebuffer for each weight - /* eslint-disable complexity, max-depth, max-statements*/ - _setupFramebuffers(opts) { - const { - textures, - framebuffers, - maxMinFramebuffers, - minFramebuffers, - maxFramebuffers, - meanTextures, - equations - } = this.state; - const {weights} = opts; - const {numCol, numRow} = opts; - const framebufferSize = {width: numCol, height: numRow}; - for (const id in weights) { - const {needMin, needMax, combineMaxMin, operation} = weights[id]; - textures[id] = - weights[id].aggregationTexture || - textures[id] || - getFloatTexture(this.device, {id: `${id}-texture`, width: numCol, height: numRow}); - textures[id].resize(framebufferSize); - let texture = textures[id]; - if (operation === AGGREGATION_OPERATION.MEAN) { - // For MEAN, we first aggregatet into a temp texture - meanTextures[id] = - meanTextures[id] || - getFloatTexture(this.device, {id: `${id}-mean-texture`, width: numCol, height: numRow}); - meanTextures[id].resize(framebufferSize); - texture = meanTextures[id]; - } - if (framebuffers[id]) { - framebuffers[id].attach({[GL.COLOR_ATTACHMENT0]: texture}); - } else { - framebuffers[id] = getFramebuffer(this.device, { - id: `${id}-fb`, - width: numCol, - height: numRow, - texture - }); - } - framebuffers[id].resize(framebufferSize); - equations[id] = EQUATION_MAP[operation] || EQUATION_MAP[AGGREGATION_OPERATION.SUM]; - // For min/max framebuffers will use default size 1X1 - if (needMin || needMax) { - if (needMin && needMax && combineMaxMin) { - if (!maxMinFramebuffers[id]) { - texture = weights[id].maxMinTexture || this._getMinMaxTexture(`${id}-maxMinTexture`); - maxMinFramebuffers[id] = getFramebuffer(this.device, {id: `${id}-maxMinFb`, texture}); - } - } else { - if (needMin) { - if (!minFramebuffers[id]) { - texture = weights[id].minTexture || this._getMinMaxTexture(`${id}-minTexture`); - minFramebuffers[id] = getFramebuffer(this.device, { - id: `${id}-minFb`, - texture - }); - } - } - if (needMax) { - if (!maxFramebuffers[id]) { - texture = weights[id].maxTexture || this._getMinMaxTexture(`${id}-maxTexture`); - maxFramebuffers[id] = getFramebuffer(this.device, { - id: `${id}-maxFb`, - texture - }); - } - } - } - } - } - } - /* eslint-enable complexity, max-depth, max-statements */ - - _getMinMaxTexture(name) { - const {resources} = this.state; - if (!resources[name]) { - resources[name] = getFloatTexture(this.device, {id: 'resourceName'}); - } - return resources[name]; - } - - _setupModels({numCol = 0, numRow = 0} = {}) { - const {shaderOptions} = this.state; - this.gridAggregationModel?.destroy(); - this.gridAggregationModel = getAggregationModel(this.device, shaderOptions); - if (!this.allAggregationModel) { - const instanceCount = numCol * numRow; - this.allAggregationModel = getAllAggregationModel(this.device, instanceCount); - } - } - - // set up buffers for all weights - _setupWeightAttributes(opts) { - const {weightAttributes} = this.state; - const {weights} = opts; - for (const id in weights) { - weightAttributes[id] = opts.attributes[id]; - } - } - - /** GPU Aggregation results are provided in Buffers, if new Buffer objects are created track them for later deletion. */ - /* eslint-disable max-depth */ - _trackGPUResultBuffers(results, weights) { - const {resources} = this.state; - for (const id in results) { - if (results[id]) { - for (const bufferName of BUFFER_NAMES) { - if (results[id][bufferName] && weights[id][bufferName] !== results[id][bufferName]) { - // No result buffer is provided in weights object, `device.readPixelsToBufferWebGL` has created a new Buffer object - // collect the new buffer for garabge collection - const name = `gpu-result-${id}-${bufferName}`; - if (resources[name]) { - resources[name].delete(); - } - resources[name] = results[id][bufferName]; - } - } - } - } - } - /* eslint-enable max-depth */ - - _updateModels(opts) { - const {vertexCount, attributes, numCol, numRow} = opts; - const {modelDirty} = this.state; - - if (modelDirty) { - this._setupModels(opts); - this.setState({modelDirty: false}); - } - - // this maps color/elevation to weight name. - this._setupWeightAttributes(opts); - - this.gridAggregationModel.setVertexCount(vertexCount); - this.gridAggregationModel.setAttributes(attributes); - - this.allAggregationModel.setInstanceCount(numCol * numRow); - } -} - -// HELPER METHODS - -function normalizeWeightParams(weights) { - const result = {}; - for (const id in weights) { - result[id] = {...DEFAULT_WEIGHT_PARAMS, ...weights[id]}; - } - return result; -} - -function deleteResources(resources) { - resources = Array.isArray(resources) ? resources : [resources]; - resources.forEach(obj => { - for (const name in obj) { - obj[name].delete(); - } - }); -} - -function getAggregationModel(device: Device, shaderOptions) { - const shaders = mergeShaders( - { - vs: AGGREGATE_TO_GRID_VS, - fs: AGGREGATE_TO_GRID_FS, - modules: [fp64arithmetic, project32] - }, - shaderOptions - ); - - return new Model(device, { - id: 'Grid-Aggregation-Model', - vertexCount: 1, - drawMode: GL.POINTS, - shaderAssembler: getShaderAssembler(), - ...shaders - }); -} - -function getAllAggregationModel(device: Device, instanceCount: number): Model { - return new Model(device, { - id: 'All-Aggregation-Model', - vs: AGGREGATE_ALL_VS, - fs: AGGREGATE_ALL_FS, - modules: [fp64arithmetic], - vertexCount: 1, - topology: 'point-list', - isInstanced: true, - instanceCount, - attributes: { - // @ts-expect-error - position: [0, 0] - } - }); -} - -function getMeanTransform(device: Device, opts) { - return new TextureTransform(device, { - vs: TRANSFORM_MEAN_VS, - _targetTextureVarying: 'meanValues', - ...opts - }); -} diff --git a/modules/aggregation-layers/src/utils/gpu-grid-aggregation/transform-mean-vs.glsl.ts b/modules/aggregation-layers/src/utils/gpu-grid-aggregation/transform-mean-vs.glsl.ts deleted file mode 100644 index 1f3e024747d..00000000000 --- a/modules/aggregation-layers/src/utils/gpu-grid-aggregation/transform-mean-vs.glsl.ts +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright (c) 2015 - 2018 Uber Technologies, Inc. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -export default `\ -#version 300 es -#define SHADER_NAME gpu-aggregation-transform-mean-vs -in vec4 aggregationValues; -out vec4 meanValues; - -void main() -{ - // TODO: Use 64-bit division ?? not needed given this is aggregation ?? - bool isCellValid = bool(aggregationValues.w > 0.); - // aggregationValues: XYZ contain aggregated values, W contains count - meanValues.xyz = isCellValid ? aggregationValues.xyz/aggregationValues.w : vec3(0, 0, 0); - meanValues.w = aggregationValues.w; - - // Enforce default value for ANGLE issue (https://bugs.chromium.org/p/angleproject/issues/detail?id=3941) - gl_PointSize = 1.0; -} -`; diff --git a/modules/aggregation-layers/src/utils/grid-aggregation-utils.ts b/modules/aggregation-layers/src/utils/grid-aggregation-utils.ts deleted file mode 100644 index 17e9ce4886f..00000000000 --- a/modules/aggregation-layers/src/utils/grid-aggregation-utils.ts +++ /dev/null @@ -1,147 +0,0 @@ -import {log, COORDINATE_SYSTEM} from '@deck.gl/core'; -const R_EARTH = 6378000; - -function toFinite(n) { - return Number.isFinite(n) ? n : 0; -} - -// Parse input data to build positions, wights and bounding box. -/* eslint-disable-next-line max-statements */ -export function getBoundingBox(attributes, vertexCount) { - // TODO - value might not exist (e.g. attribute transition) - const positions = attributes.positions.value; - - let yMin = Infinity; - let yMax = -Infinity; - let xMin = Infinity; - let xMax = -Infinity; - let y; - let x; - - for (let i = 0; i < vertexCount; i++) { - x = positions[i * 3]; - y = positions[i * 3 + 1]; - yMin = y < yMin ? y : yMin; - yMax = y > yMax ? y : yMax; - xMin = x < xMin ? x : xMin; - xMax = x > xMax ? x : xMax; - } - - const boundingBox = { - xMin: toFinite(xMin), - xMax: toFinite(xMax), - yMin: toFinite(yMin), - yMax: toFinite(yMax) - }; - - return boundingBox; -} -/* eslint-enable max-statements */ - -// Returns XY translation for positions to peform aggregation in +ve sapce -function getTranslation(boundingBox, gridOffset, coordinateSystem, viewport) { - const {width, height} = viewport; - - // Origin to define grid - // DEFAULT coordinate system is treated as LNGLAT - const worldOrigin = - coordinateSystem === COORDINATE_SYSTEM.CARTESIAN ? [-width / 2, -height / 2] : [-180, -90]; - - // Other coordinate systems not supported/verified yet - log.assert( - coordinateSystem === COORDINATE_SYSTEM.CARTESIAN || - coordinateSystem === COORDINATE_SYSTEM.LNGLAT || - coordinateSystem === COORDINATE_SYSTEM.DEFAULT - ); - - const {xMin, yMin} = boundingBox; - return [ - // Align origin to match grid cell boundaries in CPU and GPU aggregations - -1 * (alignToCell(xMin - worldOrigin[0], gridOffset.xOffset) + worldOrigin[0]), - -1 * (alignToCell(yMin - worldOrigin[1], gridOffset.yOffset) + worldOrigin[1]) - ]; -} - -// Aligns `inValue` to given `cellSize` -export function alignToCell(inValue, cellSize) { - const sign = inValue < 0 ? -1 : 1; - - let value = sign < 0 ? Math.abs(inValue) + cellSize : Math.abs(inValue); - - value = Math.floor(value / cellSize) * cellSize; - - return value * sign; -} - -/** - * Based on geometric center of sample points, calculate cellSize in lng/lat (degree) space - * @param {object} boundingBox - {xMin, yMin, xMax, yMax} contains bounding box of data - * @param {number} cellSize - grid cell size in meters - * @param {boolean, optional} converToDegrees - when true offsets are converted from meters to lng/lat (degree) space - * @returns {xOffset, yOffset} - cellSize size - */ - -export function getGridOffset(boundingBox, cellSize, convertToMeters = true) { - if (!convertToMeters) { - return {xOffset: cellSize, yOffset: cellSize}; - } - - const {yMin, yMax} = boundingBox; - const centerLat = (yMin + yMax) / 2; - - return calculateGridLatLonOffset(cellSize, centerLat); -} - -export function getGridParams(boundingBox, cellSize, viewport, coordinateSystem) { - const gridOffset = getGridOffset( - boundingBox, - cellSize, - coordinateSystem !== COORDINATE_SYSTEM.CARTESIAN - ); - - const translation = getTranslation(boundingBox, gridOffset, coordinateSystem, viewport); - - const {xMin, yMin, xMax, yMax} = boundingBox; - - const width = xMax - xMin + gridOffset.xOffset; - const height = yMax - yMin + gridOffset.yOffset; - - const numCol = Math.ceil(width / gridOffset.xOffset); - const numRow = Math.ceil(height / gridOffset.yOffset); - return {gridOffset, translation, width, height, numCol, numRow}; -} - -/** - * calculate grid layer cell size in lat lon based on world unit size - * and current latitude - * @param {number} cellSize - * @param {number} latitude - * @returns {object} - lat delta and lon delta - */ -function calculateGridLatLonOffset(cellSize, latitude) { - const yOffset = calculateLatOffset(cellSize); - const xOffset = calculateLonOffset(latitude, cellSize); - return {yOffset, xOffset}; -} - -/** - * with a given x-km change, calculate the increment of latitude - * based on stackoverflow http://stackoverflow.com/questions/7477003 - * @param {number} dy - change in km - * @return {number} - increment in latitude - */ -function calculateLatOffset(dy) { - return (dy / R_EARTH) * (180 / Math.PI); -} - -/** - * with a given x-km change, and current latitude - * calculate the increment of longitude - * based on stackoverflow http://stackoverflow.com/questions/7477003 - * @param {number} lat - latitude of current location (based on city) - * @param {number} dx - change in km - * @return {number} - increment in longitude - */ -function calculateLonOffset(lat, dx) { - return ((dx / R_EARTH) * (180 / Math.PI)) / Math.cos((lat * Math.PI) / 180); -} diff --git a/modules/aggregation-layers/src/utils/resource-utils.ts b/modules/aggregation-layers/src/utils/resource-utils.ts deleted file mode 100644 index c6e2297978e..00000000000 --- a/modules/aggregation-layers/src/utils/resource-utils.ts +++ /dev/null @@ -1,52 +0,0 @@ -import {Device, SamplerProps} from '@luma.gl/core'; - -const DEFAULT_SAMPLER: SamplerProps = { - minFilter: 'nearest', - magFilter: 'nearest' -}; - -type FloatTextureOptions = { - id: string; - width?: number; - height?: number; - data?: any; - unpackFlipY?: boolean; - sampler?: SamplerProps; -}; - -// TODO - not working -export function getFloatTexture(device: Device, opts: FloatTextureOptions) { - const {width = 1, height = 1, data = null, sampler = DEFAULT_SAMPLER} = opts; - const texture = device.createTexture({ - data, - format: 'rgba32float', // device.info.type === 'webgl2' ? 'rgba32float' : GL.RGBA, - // type: GL.FLOAT, - // border: 0, - mipmaps: false, - sampler, - width, - height - // ts-expect-error - // unpackFlipY - }); - return texture; -} - -export function getFramebuffer(device: Device, opts) { - const {id, width = 1, height = 1, texture} = opts; - const fb = device.createFramebuffer({ - id, - width, - height, - colorAttachments: [texture] - }); - - return fb; -} - -export function getFloatArray(array, size, fillValue = 0) { - if (!array || array.length < size) { - return new Float32Array(size).fill(fillValue); - } - return array; -} diff --git a/modules/aggregation-layers/src/utils/scale-utils.js b/modules/aggregation-layers/src/utils/scale-utils.js deleted file mode 100644 index c38f1c9d7c1..00000000000 --- a/modules/aggregation-layers/src/utils/scale-utils.js +++ /dev/null @@ -1,219 +0,0 @@ -// Copyright (c) 2015 - 2017 Uber Technologies, Inc. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -import {log} from '@deck.gl/core'; - -// a scale function wrapper just like d3-scales -export function getScale(domain, range, scaleFunction) { - const scale = scaleFunction; - scale.domain = () => domain; - scale.range = () => range; - - return scale; -} - -// Quantize scale is similar to linear scales, -// except it uses a discrete rather than continuous range -// return a quantize scale function -export function getQuantizeScale(domain, range) { - const scaleFunction = value => quantizeScale(domain, range, value); - - return getScale(domain, range, scaleFunction); -} - -// return a linear scale function -export function getLinearScale(domain, range) { - const scaleFunction = value => linearScale(domain, range, value); - - return getScale(domain, range, scaleFunction); -} - -export function getQuantileScale(domain, range) { - // calculate threshold - const sortedDomain = domain.sort(ascending); - let i = 0; - const n = Math.max(1, range.length); - const thresholds = new Array(n - 1); - while (++i < n) { - thresholds[i - 1] = threshold(sortedDomain, i / n); - } - - const scaleFunction = value => thresholdsScale(thresholds, range, value); - scaleFunction.thresholds = () => thresholds; - - return getScale(domain, range, scaleFunction); -} - -function ascending(a, b) { - return a - b; -} - -function threshold(domain, fraction) { - const domainLength = domain.length; - if (fraction <= 0 || domainLength < 2) { - return domain[0]; - } - if (fraction >= 1) { - return domain[domainLength - 1]; - } - - const domainFraction = (domainLength - 1) * fraction; - const lowIndex = Math.floor(domainFraction); - const low = domain[lowIndex]; - const high = domain[lowIndex + 1]; - return low + (high - low) * (domainFraction - lowIndex); -} - -function bisectRight(a, x) { - let lo = 0; - let hi = a.length; - while (lo < hi) { - const mid = (lo + hi) >>> 1; - if (ascending(a[mid], x) > 0) { - hi = mid; - } else { - lo = mid + 1; - } - } - return lo; -} - -// return a quantize scale function -function thresholdsScale(thresholds, range, value) { - return range[bisectRight(thresholds, value)]; -} - -// ordinal Scale -function ordinalScale(domain, domainMap, range, value) { - const key = `${value}`; - let d = domainMap.get(key); - if (d === undefined) { - // update the domain - d = domain.push(value); - domainMap.set(key, d); - } - return range[(d - 1) % range.length]; -} - -export function getOrdinalScale(domain, range) { - const domainMap = new Map(); - const uniqueDomain = []; - for (const d of domain) { - const key = `${d}`; - if (!domainMap.has(key)) { - domainMap.set(key, uniqueDomain.push(d)); - } - } - - const scaleFunction = value => ordinalScale(uniqueDomain, domainMap, range, value); - - return getScale(domain, range, scaleFunction); -} - -// Quantize scale is similar to linear scales, -// except it uses a discrete rather than continuous range -export function quantizeScale(domain, range, value) { - const domainRange = domain[1] - domain[0]; - if (domainRange <= 0) { - log.warn('quantizeScale: invalid domain, returning range[0]')(); - return range[0]; - } - const step = domainRange / range.length; - const idx = Math.floor((value - domain[0]) / step); - const clampIdx = Math.max(Math.min(idx, range.length - 1), 0); - - return range[clampIdx]; -} - -// Linear scale maps continuous domain to continuous range -export function linearScale(domain, range, value) { - return ((value - domain[0]) / (domain[1] - domain[0])) * (range[1] - range[0]) + range[0]; -} - -// get scale domains -function notNullOrUndefined(d) { - return d !== undefined && d !== null; -} - -export function unique(values) { - const results = []; - values.forEach(v => { - if (!results.includes(v) && notNullOrUndefined(v)) { - results.push(v); - } - }); - - return results; -} - -function getTruthyValues(data, valueAccessor) { - const values = typeof valueAccessor === 'function' ? data.map(valueAccessor) : data; - return values.filter(notNullOrUndefined); -} - -export function getLinearDomain(data, valueAccessor) { - const sorted = getTruthyValues(data, valueAccessor).sort(); - return sorted.length ? [sorted[0], sorted[sorted.length - 1]] : [0, 0]; -} - -export function getQuantileDomain(data, valueAccessor) { - return getTruthyValues(data, valueAccessor); -} - -export function getOrdinalDomain(data, valueAccessor) { - return unique(getTruthyValues(data, valueAccessor)); -} - -export function getScaleDomain(scaleType, data, valueAccessor) { - switch (scaleType) { - case 'quantize': - case 'linear': - return getLinearDomain(data, valueAccessor); - - case 'quantile': - return getQuantileDomain(data, valueAccessor); - - case 'ordinal': - return getOrdinalDomain(data, valueAccessor); - - default: - return getLinearDomain(data, valueAccessor); - } -} - -export function clamp(value, min, max) { - return Math.max(min, Math.min(max, value)); -} - -export function getScaleFunctionByScaleType(scaleType) { - switch (scaleType) { - case 'quantize': - return getQuantizeScale; - case 'linear': - return getLinearScale; - case 'quantile': - return getQuantileScale; - case 'ordinal': - return getOrdinalScale; - - default: - return getQuantizeScale; - } -} diff --git a/modules/arcgis/package.json b/modules/arcgis/package.json index 4fcb0ac4ceb..12e953974ba 100644 --- a/modules/arcgis/package.json +++ b/modules/arcgis/package.json @@ -3,7 +3,7 @@ "description": "Use deck.gl as a custom ArcGIS API for JavaScript layer", "license": "MIT", "type": "module", - "version": "9.0.0-beta.11", + "version": "9.1.0-alpha.0", "publishConfig": { "access": "public" }, @@ -36,14 +36,14 @@ "prepublishOnly": "npm run build-bundle && npm run build-bundle -- --env=dev" }, "dependencies": { - "@luma.gl/constants": "^9.0.17", + "@luma.gl/constants": "^9.1.0-alpha.19", "esri-loader": "^3.7.0" }, "peerDependencies": { "@arcgis/core": "^4.0.0", - "@deck.gl/core": "^9.0.0", - "@luma.gl/core": "^9.0.0", - "@luma.gl/engine": "^9.0.0" + "@deck.gl/core": "9.0.0-alpha.0", + "@luma.gl/core": "^9.1.0-alpha.19", + "@luma.gl/engine": "^9.1.0-alpha.19" }, "devDependencies": { "@arcgis/core": "^4.21.0" diff --git a/modules/carto/package.json b/modules/carto/package.json index f37577e0719..8a537fee5ef 100644 --- a/modules/carto/package.json +++ b/modules/carto/package.json @@ -3,7 +3,7 @@ "description": "CARTO official integration with Deck.gl. Build geospatial applications using CARTO and Deck.gl.", "license": "MIT", "type": "module", - "version": "9.0.0-beta.11", + "version": "9.1.0-alpha.0", "publishConfig": { "access": "public" }, @@ -47,9 +47,9 @@ "@loaders.gl/mvt": "^4.2.0", "@loaders.gl/schema": "^4.2.0", "@loaders.gl/tiles": "^4.2.0", - "@luma.gl/core": "^9.0.17", - "@luma.gl/shadertools": "^9.0.17", - "@math.gl/web-mercator": "^4.0.0", + "@luma.gl/core": "^9.1.0-alpha.19", + "@luma.gl/shadertools": "^9.1.0-alpha.19", + "@math.gl/web-mercator": "^4.1.0-alpha.3", "@types/d3-array": "^3.0.2", "@types/d3-color": "^1.4.2", "@types/d3-scale": "^3.0.0", @@ -65,12 +65,13 @@ "quadbin": "^0.2.0" }, "peerDependencies": { - "@deck.gl/aggregation-layers": "^9.0.0", - "@deck.gl/core": "^9.0.0", - "@deck.gl/extensions": "^9.0.0", - "@deck.gl/geo-layers": "^9.0.0", - "@deck.gl/layers": "^9.0.0", - "@loaders.gl/core": "^4.2.0" + "@deck.gl/aggregation-layers": "9.0.0-alpha.0", + "@deck.gl/core": "9.0.0-alpha.0", + "@deck.gl/extensions": "9.0.0-alpha.0", + "@deck.gl/geo-layers": "9.0.0-alpha.0", + "@deck.gl/layers": "9.0.0-alpha.0", + "@loaders.gl/core": "^4.2.0", + "@luma.gl/core": "^9.1.0-alpha.19" }, "gitHead": "13ace64fc2cee08c133afc882fc307253489a4e4" } diff --git a/modules/carto/src/api/fetch-map.ts b/modules/carto/src/api/fetch-map.ts index 018626f0a43..757a2532866 100644 --- a/modules/carto/src/api/fetch-map.ts +++ b/modules/carto/src/api/fetch-map.ts @@ -1,7 +1,4 @@ /* eslint-disable camelcase */ -/** - * Maps API Client for Carto 3 - */ import {CartoAPIError} from './carto-api-error'; import {DEFAULT_API_BASE_URL, DEFAULT_CLIENT} from './common'; import {buildPublicMapUrl, buildStatsUrl} from './endpoints'; @@ -206,11 +203,39 @@ async function fillInTileStats( } export type FetchMapOptions = { + /** + * CARTO platform access token. Only required for private maps. + */ + accessToken?: string; + + /** + * Base URL of the CARTO Maps API. + * + * Example for account located in EU-west region: `https://gcp-eu-west1.api.carto.com` + * + * @default https://gcp-us-east1.api.carto.com + */ apiBaseUrl?: string; + + /** + * Identifier of map created in CARTO Builder. + */ cartoMapId: string; clientId?: string; + + /** + * Custom HTTP headers added to map instantiation and data requests. + */ headers?: Record; + + /** + * Interval in seconds at which to autoRefresh the data. If provided, `onNewData` must also be provided. + */ autoRefresh?: number; + + /** + * Callback function that will be invoked whenever data in layers is changed. If provided, `autoRefresh` must also be provided. + */ onNewData?: (map: any) => void; }; @@ -224,6 +249,7 @@ export type FetchMapResult = ParseMapResult & { /* eslint-disable max-statements */ export async function fetchMap({ + accessToken, apiBaseUrl = DEFAULT_API_BASE_URL, cartoMapId, clientId = DEFAULT_CLIENT, @@ -234,6 +260,10 @@ export async function fetchMap({ assert(cartoMapId, 'Must define CARTO map id: fetchMap({cartoMapId: "XXXX-XXXX-XXXX"})'); assert(apiBaseUrl, 'Must define apiBaseUrl'); + if (accessToken) { + headers = {Authorization: `Bearer ${accessToken}`, ...headers}; + } + if (autoRefresh || onNewData) { assert(onNewData, 'Must define `onNewData` when using autoRefresh'); assert(typeof onNewData === 'function', '`onNewData` must be a function'); diff --git a/modules/carto/src/api/layer-map.ts b/modules/carto/src/api/layer-map.ts index 4830701de37..bfd8497b428 100644 --- a/modules/carto/src/api/layer-map.ts +++ b/modules/carto/src/api/layer-map.ts @@ -14,7 +14,7 @@ import {format as d3Format} from 'd3-format'; import moment from 'moment-timezone'; import {Accessor, Layer, _ConstructorOf as ConstructorOf} from '@deck.gl/core'; -import {CPUGridLayer, HeatmapLayer, HexagonLayer} from '@deck.gl/aggregation-layers'; +import {GridLayer, HeatmapLayer, HexagonLayer} from '@deck.gl/aggregation-layers'; import {GeoJsonLayer} from '@deck.gl/layers'; import {H3HexagonLayer} from '@deck.gl/geo-layers'; @@ -192,7 +192,7 @@ export function getLayer( Layer: GeoJsonLayer }, grid: { - Layer: CPUGridLayer, + Layer: GridLayer, propMap: {visConfig: {...aggregationVisConfig, worldUnitSize: x => ({cellSize: 1000 * x})}}, defaultProps: {getPosition} }, diff --git a/modules/carto/src/layers/heatmap-tile-layer.ts b/modules/carto/src/layers/heatmap-tile-layer.ts index 0649b0558e2..a6d622e8c0f 100644 --- a/modules/carto/src/layers/heatmap-tile-layer.ts +++ b/modules/carto/src/layers/heatmap-tile-layer.ts @@ -321,6 +321,7 @@ class HeatmapTileLayer extends Composit (colorTexture as any).setSubImageData({data: colors}); } else { colorTexture?.destroy(); + // @ts-ignore TODO v9.1 colorTexture = this.context.device.createTexture({ ...TEXTURE_PROPS, data: colors, diff --git a/modules/carto/src/layers/heatmap.ts b/modules/carto/src/layers/heatmap.ts index 1d10db703dd..a19d939cae7 100644 --- a/modules/carto/src/layers/heatmap.ts +++ b/modules/carto/src/layers/heatmap.ts @@ -1,6 +1,5 @@ import type {ShaderPass} from '@luma.gl/shadertools'; import {Texture} from '@luma.gl/core'; -const glsl = (s: TemplateStringsArray) => `${s}`; /** * @filter Heatmap @@ -11,7 +10,7 @@ const glsl = (s: TemplateStringsArray) => `${s}`; * @param opacity Output opacity */ -const fs = glsl`\ +const fs = /* glsl */ `\ uniform heatmapUniforms { vec2 colorDomain; vec2 delta; @@ -134,6 +133,7 @@ export const heatmap = { opacity: 'f32', radiusPixels: 'f32' }, + // @ts-ignore TODO v9.1 getUniforms: opts => { if (!opts) return {}; const { @@ -155,7 +155,9 @@ export const heatmap = { }, fs, passes: [ + // @ts-expect-error Seems typing in luma.gl should be Partial<> {sampler: true, uniforms: {delta: [1, 0]}}, + // @ts-expect-error Seems typing in luma.gl should be Partial<> {sampler: true, uniforms: {delta: [0, 1]}} ] } as const satisfies ShaderPass; diff --git a/modules/carto/src/layers/point-label-layer.ts b/modules/carto/src/layers/point-label-layer.ts index 2964e959502..a20a9876f51 100644 --- a/modules/carto/src/layers/point-label-layer.ts +++ b/modules/carto/src/layers/point-label-layer.ts @@ -24,10 +24,10 @@ class EnhancedTextBackgroundLayer extends TextBackgroundLayer { // Modify shader so that the padding is offset by the pixel offset to ensure the padding // always captures the anchor point. As padding is uniform we cannot pass it a per-label value - vs = vs.replaceAll('padding.', '_padding.'); + vs = vs.replaceAll('textBackground.padding.', '_padding.'); vs = vs.replace( 'void main(void) {', - 'void main(void) {\n vec4 _padding = padding + instancePixelOffsets.xyxy * vec4(1.0, 1.0, -1.0, -1.0);' + 'void main(void) {\n vec4 _padding = textBackground.padding + instancePixelOffsets.xyxy * vec4(1.0, 1.0, -1.0, -1.0);' ); return {...shaders, vs}; diff --git a/modules/core/package.json b/modules/core/package.json index 2c2be647922..5270c4382cd 100644 --- a/modules/core/package.json +++ b/modules/core/package.json @@ -3,7 +3,7 @@ "description": "deck.gl core library", "license": "MIT", "type": "module", - "version": "9.0.0-beta.11", + "version": "9.1.0-alpha.0", "publishConfig": { "access": "public" }, @@ -42,14 +42,15 @@ "dependencies": { "@loaders.gl/core": "^4.2.0", "@loaders.gl/images": "^4.2.0", - "@luma.gl/constants": "^9.0.17", - "@luma.gl/core": "^9.0.17", - "@luma.gl/engine": "^9.0.17", - "@luma.gl/shadertools": "^9.0.17", - "@luma.gl/webgl": "^9.0.17", - "@math.gl/core": "^4.0.0", - "@math.gl/sun": "^4.0.0", - "@math.gl/web-mercator": "^4.0.0", + "@luma.gl/constants": "^9.1.0-alpha.19", + "@luma.gl/core": "^9.1.0-alpha.19", + "@luma.gl/engine": "^9.1.0-alpha.19", + "@luma.gl/shadertools": "^9.1.0-alpha.19", + "@luma.gl/webgl": "^9.1.0-alpha.19", + "@math.gl/core": "^4.1.0-alpha.3", + "@math.gl/sun": "^4.1.0-alpha.3", + "@math.gl/types": "^4.1.0-alpha.3", + "@math.gl/web-mercator": "^4.1.0-alpha.3", "@probe.gl/env": "^4.0.9", "@probe.gl/log": "^4.0.9", "@probe.gl/stats": "^4.0.9", diff --git a/modules/core/src/effects/lighting/ambient-light.ts b/modules/core/src/effects/lighting/ambient-light.ts index eb75c7db638..1861bb6afc1 100644 --- a/modules/core/src/effects/lighting/ambient-light.ts +++ b/modules/core/src/effects/lighting/ambient-light.ts @@ -1,4 +1,4 @@ -const DEFAULT_LIGHT_COLOR = [255, 255, 255]; +const DEFAULT_LIGHT_COLOR = [255, 255, 255] as [number, number, number]; const DEFAULT_LIGHT_INTENSITY = 1.0; let idCount = 0; @@ -8,7 +8,7 @@ export type AmbientLightOptions = { /** Light color, [r, g, b] in the 0-255 range * @default [255, 255, 255] */ - color?: number[]; + color?: [number, number, number]; /** Light intensity, higher number is brighter * @default 1.0 */ @@ -17,9 +17,9 @@ export type AmbientLightOptions = { export class AmbientLight { id: string; - color: number[]; + color: [number, number, number]; intensity: number; - type = 'ambient'; + type = 'ambient' as const; constructor(props: AmbientLightOptions = {}) { const {color = DEFAULT_LIGHT_COLOR} = props; diff --git a/modules/core/src/effects/lighting/camera-light.ts b/modules/core/src/effects/lighting/camera-light.ts index 460331b6f72..1494e98bbc0 100644 --- a/modules/core/src/effects/lighting/camera-light.ts +++ b/modules/core/src/effects/lighting/camera-light.ts @@ -1,8 +1,8 @@ /* eslint-disable camelcase */ +import type {NumberArray16} from '@math.gl/types'; import {PointLight} from './point-light'; import {getUniformsFromViewport} from '../../shaderlib/project/viewport-uniforms'; import type Layer from '../../lib/layer'; -import {NumArray16} from '../../shaderlib/misc/uniform-types'; export default class CameraLight extends PointLight { getProjectedLight({layer}: {layer: Layer}): PointLight { @@ -11,7 +11,7 @@ export default class CameraLight extends PointLight { const {coordinateSystem, coordinateOrigin, modelMatrix} = layer.props; const {cameraPosition} = getUniformsFromViewport({ viewport, - modelMatrix: modelMatrix as NumArray16, + modelMatrix: modelMatrix as NumberArray16, coordinateSystem, coordinateOrigin }); diff --git a/modules/core/src/effects/lighting/directional-light.ts b/modules/core/src/effects/lighting/directional-light.ts index 6e1ff77fb3e..801c1ff00f9 100644 --- a/modules/core/src/effects/lighting/directional-light.ts +++ b/modules/core/src/effects/lighting/directional-light.ts @@ -1,9 +1,9 @@ import {Vector3} from '@math.gl/core'; import type Layer from '../../lib/layer'; -const DEFAULT_LIGHT_COLOR = [255, 255, 255]; +const DEFAULT_LIGHT_COLOR = [255, 255, 255] as [number, number, number]; const DEFAULT_LIGHT_INTENSITY = 1.0; -const DEFAULT_LIGHT_DIRECTION = [0.0, 0.0, -1.0]; +const DEFAULT_LIGHT_DIRECTION = [0.0, 0.0, -1.0] as [number, number, number]; let idCount = 0; @@ -12,7 +12,7 @@ export type DirectionalLightOptions = { /** Light color, [r, g, b] in the 0-255 range * @default [255, 255, 255] */ - color?: number[]; + color?: [number, number, number]; /** Light intensity, higher number is brighter * @default 1.0 */ @@ -20,7 +20,7 @@ export type DirectionalLightOptions = { /** Light direction in the common space * @default [0.0, 0.0, -1.0] */ - direction?: number[]; + direction?: [number, number, number]; /** (Experimental) render shadows cast by this light * @default false */ @@ -29,10 +29,10 @@ export type DirectionalLightOptions = { export class DirectionalLight { id: string; - color: number[]; + color: [number, number, number]; intensity: number; - type = 'directional'; - direction: number[]; + type = 'directional' as const; + direction: [number, number, number]; shadow: boolean; constructor(props: DirectionalLightOptions = {}) { diff --git a/modules/core/src/effects/lighting/lighting-effect.ts b/modules/core/src/effects/lighting/lighting-effect.ts index 6d0d4525cea..e5e656b7360 100644 --- a/modules/core/src/effects/lighting/lighting-effect.ts +++ b/modules/core/src/effects/lighting/lighting-effect.ts @@ -9,21 +9,25 @@ import shadow from '../../shaderlib/shadow/shadow'; import type Layer from '../../lib/layer'; import type {Effect, EffectContext, PreRenderOptions} from '../../lib/effect'; +import {LightingProps} from '@luma.gl/shadertools'; -const DEFAULT_AMBIENT_LIGHT_PROPS = {color: [255, 255, 255], intensity: 1.0}; +const DEFAULT_AMBIENT_LIGHT_PROPS = { + color: [255, 255, 255] as [number, number, number], + intensity: 1.0 +}; const DEFAULT_DIRECTIONAL_LIGHT_PROPS = [ { - color: [255, 255, 255], + color: [255, 255, 255] as [number, number, number], intensity: 1.0, - direction: [-1, 3, -1] + direction: [-1, 3, -1] as [number, number, number] }, { - color: [255, 255, 255], + color: [255, 255, 255] as [number, number, number], intensity: 0.9, - direction: [1, -8, -2.5] + direction: [1, -8, -2.5] as [number, number, number] } ]; -const DEFAULT_SHADOW_COLOR = [0, 0, 0, 200 / 255]; +const DEFAULT_SHADOW_COLOR = [0, 0, 0, 200 / 255] as [number, number, number, number]; export type LightingEffectProps = Record; @@ -31,15 +35,14 @@ export type LightingEffectProps = Record shadowPass.getShadowMap()), dummyShadowMap: this.dummyShadowMap, shadowColor: this.shadowColor, shadowMatrices: this.shadowMatrices @@ -142,6 +141,7 @@ export default class LightingEffect implements Effect { // when not rendering to screen, turn off lighting by adding empty light source object // lights shader module relies on the `lightSources` to turn on/off lighting parameters.lightSources = { + enabled: true, ambientLight: this.ambientLight, directionalLights: this.directionalLights.map(directionalLight => directionalLight.getProjectedLight({layer}) @@ -157,7 +157,6 @@ export default class LightingEffect implements Effect { shadowPass.delete(); } this.shadowPasses.length = 0; - this.shadowMaps.length = 0; if (this.dummyShadowMap) { this.dummyShadowMap.destroy(); @@ -182,7 +181,6 @@ export default class LightingEffect implements Effect { for (let i = 0; i < this.directionalLights.length; i++) { const shadowPass = new ShadowPass(device); this.shadowPasses[i] = shadowPass; - this.shadowMaps[i] = shadowPass.shadowMap; } } diff --git a/modules/core/src/effects/lighting/point-light.ts b/modules/core/src/effects/lighting/point-light.ts index 6187eae0459..d6102de9a10 100644 --- a/modules/core/src/effects/lighting/point-light.ts +++ b/modules/core/src/effects/lighting/point-light.ts @@ -3,10 +3,10 @@ import {COORDINATE_SYSTEM} from '../../lib/constants'; import type Layer from '../../lib/layer'; -const DEFAULT_LIGHT_COLOR = [255, 255, 255]; +const DEFAULT_LIGHT_COLOR = [255, 255, 255] as [number, number, number]; const DEFAULT_LIGHT_INTENSITY = 1.0; -const DEFAULT_ATTENUATION = [0, 0, 1]; -const DEFAULT_LIGHT_POSITION = [0.0, 0.0, 1.0]; +const DEFAULT_ATTENUATION = [1, 0, 0] as [number, number, number]; +const DEFAULT_LIGHT_POSITION = [0.0, 0.0, 1.0] as [number, number, number]; let idCount = 0; @@ -15,7 +15,7 @@ export type PointLightOptions = { /** Light color, [r, g, b] in the 0-255 range * @default [255, 255, 255] */ - color?: number[]; + color?: [number, number, number]; /** Light intensity, higher number is brighter * @default 1.0 */ @@ -23,20 +23,20 @@ export type PointLightOptions = { /** Light position [x, y, z] in the common space * @default [0.0, 0.0, 1.0] */ - position?: number[]; + position?: [number, number, number]; /** Light attenuation - * @default [0.0, 0.0, 1.0] + * @default [1.0, 0.0, 0.0] */ - attenuation?: number[]; + attenuation?: [number, number, number]; }; export class PointLight { id: string; - color: number[]; + color: [number, number, number]; intensity: number; - type = 'point'; - position: number[]; - attenuation: number[]; + type = 'point' as const; + position: [number, number, number]; + attenuation: [number, number, number]; protected projectedLight: PointLight; @@ -74,12 +74,9 @@ export class PointLight { } } -function getAttenuation(props: PointLightOptions): number[] { +function getAttenuation(props: PointLightOptions): [number, number, number] { if (props.attenuation) { return props.attenuation; } - if ('intensity' in props) { - return [0, 0, props.intensity || 0]; - } return DEFAULT_ATTENUATION; } diff --git a/modules/core/src/effects/lighting/sun-light.ts b/modules/core/src/effects/lighting/sun-light.ts index 3430f61e842..2e1624aa122 100644 --- a/modules/core/src/effects/lighting/sun-light.ts +++ b/modules/core/src/effects/lighting/sun-light.ts @@ -8,7 +8,7 @@ export type SunLightOptions = { /** Light color, [r, g, b] in the 0-255 range * @default [255, 255, 255] */ - color?: number[]; + color?: [number, number, number]; /** Light intensity, higher number is brighter * @default 1.0 */ @@ -43,7 +43,11 @@ export default class SunLight extends DirectionalLight { } else { // @ts-expect-error longitude and latitude are not defined on all viewports const {latitude, longitude} = viewport; - this.direction = getSunDirection(this.timestamp, latitude, longitude); + this.direction = getSunDirection(this.timestamp, latitude, longitude) as [ + number, + number, + number + ]; } return this; diff --git a/modules/core/src/effects/post-process-effect.ts b/modules/core/src/effects/post-process-effect.ts index a3537d02ff2..4303f81e511 100644 --- a/modules/core/src/effects/post-process-effect.ts +++ b/modules/core/src/effects/post-process-effect.ts @@ -1,5 +1,5 @@ import type {Device, Framebuffer} from '@luma.gl/core'; -import {normalizeShaderModule, ShaderPass} from '@luma.gl/shadertools'; +import {initializeShaderModule, ShaderPass} from '@luma.gl/shadertools'; import ScreenPass from '../passes/screen-pass'; @@ -14,7 +14,7 @@ export default class PostProcessEffect implement constructor(module: ShaderPassT, props: ShaderPassT['props']) { this.id = `${module.name}-pass`; this.props = props; - normalizeShaderModule(module); + initializeShaderModule(module); this.module = module; } @@ -44,7 +44,7 @@ export default class PostProcessEffect implement } const clearCanvas = !renderToTarget || Boolean(params.clearCanvas); const moduleProps = {}; - const uniforms = this.module.passes[index].uniforms; + const uniforms = this.module.passes![index].uniforms; moduleProps[this.module.name] = {...this.props, ...uniforms}; passes[index].render({clearCanvas, inputBuffer, outputBuffer, moduleProps}); @@ -66,7 +66,7 @@ export default class PostProcessEffect implement } function createPasses(device: Device, module: ShaderPass, id: string): ScreenPass[] { - return module.passes.map((pass, index) => { + return module.passes!.map((pass, index) => { const fs = getFragmentShaderForRenderPass(module, pass); const idn = `${id}-${index}`; return new ScreenPass(device, {id: idn, module, fs}); @@ -99,9 +99,12 @@ void main() { } `; -function getFragmentShaderForRenderPass(module: ShaderPass, pass: ShaderPass['passes'][0]): string { +function getFragmentShaderForRenderPass( + module: ShaderPass, + pass: NonNullable[0] +): string { if (pass.filter) { - const func = typeof pass.filter === 'string' ? pass.filter : `${module.name}_filterColor`; + const func = typeof pass.filter === 'string' ? pass.filter : `${module.name}_filterColor_ext`; return FILTER_FS_TEMPLATE(func); } diff --git a/modules/core/src/lib/deck.ts b/modules/core/src/lib/deck.ts index 6bf7396bb77..3b97d7100fc 100644 --- a/modules/core/src/lib/deck.ts +++ b/modules/core/src/lib/deck.ts @@ -32,7 +32,7 @@ import typedArrayManager from '../utils/typed-array-manager'; import {VERSION} from './init'; import {luma} from '@luma.gl/core'; -import {WebGLDevice} from '@luma.gl/webgl'; +import {WebGLDevice, webgl2Adapter} from '@luma.gl/webgl'; import {Timeline} from '@luma.gl/engine'; import {AnimationLoop} from '@luma.gl/engine'; import {GL} from '@luma.gl/constants'; @@ -375,21 +375,26 @@ export default class Deck { // See if we already have a device if (props.device) { this.device = props.device; - } else if (props.gl) { + } + + let deviceOrPromise: Device | Promise | null = this.device; + + // Attach a new luma.gl device to a WebGL2 context if supplied + if (!deviceOrPromise && props.gl) { if (props.gl instanceof WebGLRenderingContext) { log.error('WebGL1 context not supported.')(); } - this.device = WebGLDevice.attach(props.gl); + deviceOrPromise = webgl2Adapter.attach(props.gl); } - let deviceOrPromise: Device | Promise | null = this.device; + // Create a new device if (!deviceOrPromise) { - // TODO v9 should we install WebGL backend as default for now? - luma.registerDevices([WebGLDevice]); - + // Create the "best" device supported from the registered adapters deviceOrPromise = luma.createDevice({ + type: 'best-available', + adapters: [webgl2Adapter], ...props.deviceProps, - canvas: this._createCanvas(props) + createCanvasContext: {canvas: this._createCanvas(props)} }); } diff --git a/modules/core/src/lib/layer.ts b/modules/core/src/lib/layer.ts index 01a65edaf76..44e3459fc88 100644 --- a/modules/core/src/lib/layer.ts +++ b/modules/core/src/lib/layer.ts @@ -756,6 +756,7 @@ export default abstract class Layer extends Component< pickingColorCache[i * 4 + 0] = pickingColor[0]; pickingColorCache[i * 4 + 1] = pickingColor[1]; pickingColorCache[i * 4 + 2] = pickingColor[2]; + pickingColorCache[i * 4 + 3] = 0; } } @@ -1076,8 +1077,14 @@ export default abstract class Layer extends Component< if (moduleParameters) { const {isActive, isAttribute} = moduleParameters.picking; const {viewport, devicePixelRatio, coordinateSystem, coordinateOrigin} = moduleParameters; - const {modelMatrix} = this.props; - this.setModuleParameters(moduleParameters); + // @ts-expect-error material is not a Layer prop + const {material, modelMatrix} = this.props; + + // Do not pass picking module to avoid crash + // TODO remove `setModuleParameters` from codebase + const {picking: _, ...rest} = moduleParameters; + this.setModuleParameters(rest); + const { // shadow shadowEnabled, @@ -1095,8 +1102,11 @@ export default abstract class Layer extends Component< terrainCover, drawToTerrainHeightMap, useTerrainHeightMap, - terrainSkipRender + terrainSkipRender, + // lighting + lightSources } = moduleParameters; + const shadowProps = { viewport, shadowEnabled, @@ -1118,11 +1128,15 @@ export default abstract class Layer extends Component< useTerrainHeightMap, terrainSkipRender }; + this.setShaderModuleProps({ // TODO Revisit whether this is necessary once all layers ported to UBO shadow: shadowProps, terrain: terrainProps, layer: {opacity}, + lighting: lightSources, + phongMaterial: material, + gouraudMaterial: material, picking: {isActive, isAttribute} as PickingProps, project: { viewport, diff --git a/modules/core/src/passes/layers-pass.ts b/modules/core/src/passes/layers-pass.ts index 17498ea4647..207bfd17747 100644 --- a/modules/core/src/passes/layers-pass.ts +++ b/modules/core/src/passes/layers-pass.ts @@ -74,13 +74,13 @@ export default class LayersPass extends Pass { parameters.colorMask = colorMask; } if (options.scissorRect) { - parameters.scissorRect = options.scissorRect; + parameters.scissorRect = options.scissorRect as [number, number, number, number]; } const renderPass = this.device.beginRenderPass({ framebuffer: options.target, parameters, - clearColor, + clearColor: clearColor as [number, number, number, number], clearDepth, clearStencil }); diff --git a/modules/core/src/passes/pick-layers-pass.ts b/modules/core/src/passes/pick-layers-pass.ts index eb3ded73a90..61ed13720ce 100644 --- a/modules/core/src/passes/pick-layers-pass.ts +++ b/modules/core/src/passes/pick-layers-pass.ts @@ -117,9 +117,7 @@ export default class PickLayersPass extends LayersPass { isActive: 1, isAttribute: this.pickZ }, - // turn off lighting by adding empty light source object - // lights shader module relies on the `lightSources` to turn on/off lighting - lightSources: {} + lightSources: {enabled: false} }; } diff --git a/modules/core/src/passes/shadow-pass.ts b/modules/core/src/passes/shadow-pass.ts index af57eb68bef..a1628bd216c 100644 --- a/modules/core/src/passes/shadow-pass.ts +++ b/modules/core/src/passes/shadow-pass.ts @@ -1,11 +1,9 @@ -import type {Device, Framebuffer, Texture} from '@luma.gl/core'; +import {Device, Framebuffer, Texture} from '@luma.gl/core'; import type Layer from '../lib/layer'; import type Viewport from '../viewports/viewport'; import LayersPass from './layers-pass'; export default class ShadowPass extends LayersPass { - shadowMap: Texture; - depthBuffer: Texture; fbo: Framebuffer; constructor( @@ -17,7 +15,8 @@ export default class ShadowPass extends LayersPass { super(device, props); // The shadowMap texture - this.shadowMap = device.createTexture({ + const shadowMap = device.createTexture({ + format: 'rgba8unorm', width: 1, height: 1, sampler: { @@ -25,11 +24,11 @@ export default class ShadowPass extends LayersPass { magFilter: 'linear', addressModeU: 'clamp-to-edge', addressModeV: 'clamp-to-edge' - } + }, + mipmaps: true }); - // @ts-ignore - this.depthBuffer = device.createTexture({ + const depthBuffer = device.createTexture({ format: 'depth16unorm', width: 1, height: 1, @@ -40,12 +39,23 @@ export default class ShadowPass extends LayersPass { id: 'shadowmap', width: 1, height: 1, - colorAttachments: [this.shadowMap], + colorAttachments: [shadowMap], // Depth attachment has to be specified for depth test to work - depthStencilAttachment: this.depthBuffer + depthStencilAttachment: depthBuffer }); } + delete() { + if (this.fbo) { + this.fbo.destroy(); + this.fbo = null!; + } + } + + getShadowMap(): Texture { + return this.fbo.colorAttachments[0].texture; + } + render(params) { const target = this.fbo; @@ -76,21 +86,4 @@ export default class ShadowPass extends LayersPass { drawToShadowMap: true }; } - - delete() { - if (this.fbo) { - this.fbo.destroy(); - this.fbo = null!; - } - - if (this.shadowMap) { - this.shadowMap.destroy(); - this.shadowMap = null!; - } - - if (this.depthBuffer) { - this.depthBuffer.destroy(); - this.depthBuffer = null!; - } - } } diff --git a/modules/core/src/scripting/lumagl.ts b/modules/core/src/scripting/lumagl.ts index c7a1016113d..6aa53cbdbcd 100644 --- a/modules/core/src/scripting/lumagl.ts +++ b/modules/core/src/scripting/lumagl.ts @@ -6,8 +6,8 @@ import {luma} from '@luma.gl/core'; export const { stats, registerDevices, - getAvailableDevices, - getSupportedDevices, + getSupportedAdapters, + getBestAvailableAdapter, setDefaultDeviceProps, attachDevice, createDevice, diff --git a/modules/core/src/shaderlib/misc/uniform-types.ts b/modules/core/src/shaderlib/misc/uniform-types.ts deleted file mode 100644 index 8836dc29ca5..00000000000 --- a/modules/core/src/shaderlib/misc/uniform-types.ts +++ /dev/null @@ -1,38 +0,0 @@ -type NumArray2 = [number, number]; -type NumArray3 = [number, number, number]; -type NumArray4 = [number, number, number, number]; -type NumArray6 = [number, number, number, number, number, number]; -type NumArray8 = [number, number, number, number, number, number, number, number]; -type NumArray9 = [number, number, number, number, number, number, number, number, number]; -type NumArray12 = [ - number, - number, - number, - number, - number, - number, - number, - number, - number, - number, - number, - number -]; -export type NumArray16 = [ - number, - number, - number, - number, - number, - number, - number, - number, - number, - number, - number, - number, - number, - number, - number, - number -]; diff --git a/modules/core/src/shaderlib/project/viewport-uniforms.ts b/modules/core/src/shaderlib/project/viewport-uniforms.ts index bb1ceca031e..81e09aa869b 100644 --- a/modules/core/src/shaderlib/project/viewport-uniforms.ts +++ b/modules/core/src/shaderlib/project/viewport-uniforms.ts @@ -20,6 +20,7 @@ /* eslint-disable complexity, camelcase */ import {mat4, vec4} from '@math.gl/core'; +import type {NumberArray16} from '@math.gl/types'; import {COORDINATE_SYSTEM, PROJECTION_MODE} from '../../lib/constants'; @@ -27,7 +28,6 @@ import memoize from '../../utils/memoize'; import type Viewport from '../../viewports/viewport'; import type {CoordinateSystem} from '../../lib/constants'; -import type {NumArray16} from '../misc/uniform-types'; type Vec3 = [number, number, number]; type Vec4 = [number, number, number, number]; @@ -35,8 +35,8 @@ type Vec4 = [number, number, number, number]; // To quickly set a vector to zero const ZERO_VECTOR: Vec4 = [0, 0, 0, 0]; // 4x4 matrix that drops 4th component of vector -const VECTOR_TO_POINT_MATRIX: NumArray16 = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0]; -const IDENTITY_MATRIX: NumArray16 = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]; +const VECTOR_TO_POINT_MATRIX: NumberArray16 = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0]; +const IDENTITY_MATRIX: NumberArray16 = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]; const DEFAULT_PIXELS_PER_UNIT2: Vec3 = [0, 0, 0]; const DEFAULT_COORDINATE_ORIGIN: Vec3 = [0, 0, 0]; @@ -127,8 +127,8 @@ function calculateMatrixAndOffset( coordinateSystem: CoordinateSystem, coordinateOrigin: Vec3 ): { - viewMatrix: NumArray16; - viewProjectionMatrix: NumArray16; + viewMatrix: NumberArray16; + viewProjectionMatrix: NumberArray16; projectionCenter: Vec4; originCommon: Vec4; cameraPosCommon: Vec3; @@ -177,8 +177,8 @@ function calculateMatrixAndOffset( } return { - viewMatrix: viewMatrix as NumArray16, - viewProjectionMatrix: viewProjectionMatrix as NumArray16, + viewMatrix: viewMatrix as NumberArray16, + viewProjectionMatrix: viewProjectionMatrix as NumberArray16, projectionCenter, originCommon, cameraPosCommon, @@ -209,8 +209,8 @@ export type ProjectUniforms = { scale: number; wrapLongitude: boolean; - viewProjectionMatrix: NumArray16; - modelMatrix: NumArray16; + viewProjectionMatrix: NumberArray16; + modelMatrix: NumberArray16; // This is for lighting calculations cameraPosition: Vec3; @@ -219,7 +219,7 @@ export type ProjectUniforms = { export type ProjectProps = { viewport: Viewport; devicePixelRatio?: number; - modelMatrix?: NumArray16 | null; + modelMatrix?: NumberArray16 | null; coordinateSystem?: CoordinateSystem; coordinateOrigin?: Vec3; autoWrapLongitude?: boolean; diff --git a/modules/core/src/shaderlib/shadow/shadow.ts b/modules/core/src/shaderlib/shadow/shadow.ts index 8295edc391e..e91d474259d 100644 --- a/modules/core/src/shaderlib/shadow/shadow.ts +++ b/modules/core/src/shaderlib/shadow/shadow.ts @@ -25,11 +25,11 @@ import memoize from '../../utils/memoize'; import {pixelsToWorld} from '@math.gl/web-mercator'; import type {Texture} from '@luma.gl/core'; -import {glsl, ShaderModule} from '@luma.gl/shadertools'; +import {ShaderModule} from '@luma.gl/shadertools'; import type Viewport from '../../viewports/viewport'; import type {ProjectUniforms} from '../project/viewport-uniforms'; -const uniformBlock = glsl` +const uniformBlock = /* glsl */ ` uniform shadowUniforms { bool drawShadowMap; bool useShadowMap; @@ -43,7 +43,7 @@ uniform shadowUniforms { } shadow; `; -const vertex = glsl` +const vertex = /* glsl */ ` const int max_lights = 2; out vec3 shadow_vPosition[max_lights]; @@ -76,7 +76,7 @@ ${uniformBlock} ${vertex} `; -const fragment = glsl` +const fragment = /* glsl */ ` const int max_lights = 2; uniform sampler2D shadow_uShadowMap0; uniform sampler2D shadow_uShadowMap1; diff --git a/modules/core/src/types/types.ts b/modules/core/src/types/types.ts index dec20ba63c9..9b030cc7df0 100644 --- a/modules/core/src/types/types.ts +++ b/modules/core/src/types/types.ts @@ -1,6 +1,6 @@ // deck.gl, MIT license -export type {TypedArray, TypedArrayConstructor, NumberArray as NumericArray} from '@luma.gl/core'; +export type {TypedArray, TypedArrayConstructor, NumericArray} from '@math.gl/types'; export interface ConstructorOf { new (...args): T; diff --git a/modules/core/src/utils/texture.ts b/modules/core/src/utils/texture.ts index 46d92404041..7c80cad5642 100644 --- a/modules/core/src/utils/texture.ts +++ b/modules/core/src/utils/texture.ts @@ -29,7 +29,6 @@ export function createTexture( sampler: SamplerProps ): Texture | null { if (image instanceof Texture) { - // @ts-expect-error This type error seems like it shouldn't happen... return image; } else if (image.constructor && image.constructor.name !== 'Object') { // Browser object @@ -50,7 +49,8 @@ export function createTexture( ...DEFAULT_TEXTURE_PARAMETERS, ...samplerParameters, ...sampler - } + }, + mipmaps: true }); // Track this texture internalTextures[texture.id] = owner; diff --git a/modules/core/src/viewports/viewport.ts b/modules/core/src/viewports/viewport.ts index 7a9b4e30311..c57b8556b89 100644 --- a/modules/core/src/viewports/viewport.ts +++ b/modules/core/src/viewports/viewport.ts @@ -367,7 +367,7 @@ export default class Viewport { } getDistanceScales(coordinateOrigin?: number[]): DistanceScales { - if (coordinateOrigin) { + if (coordinateOrigin && this.isGeospatial) { return getDistanceScales({ longitude: coordinateOrigin[0], latitude: coordinateOrigin[1], diff --git a/modules/extensions/package.json b/modules/extensions/package.json index 249d5f4568d..2f93e38c617 100644 --- a/modules/extensions/package.json +++ b/modules/extensions/package.json @@ -3,7 +3,7 @@ "description": "Plug-and-play functionalities for deck.gl layers", "license": "MIT", "type": "module", - "version": "9.0.0-beta.11", + "version": "9.1.0-alpha.0", "publishConfig": { "access": "public" }, @@ -38,14 +38,14 @@ "prepublishOnly": "npm run build-bundle && npm run build-bundle -- --env=dev" }, "dependencies": { - "@luma.gl/constants": "^9.0.17", - "@luma.gl/shadertools": "^9.0.17", - "@math.gl/core": "^4.0.0" + "@luma.gl/constants": "^9.1.0-alpha.19", + "@luma.gl/shadertools": "^9.1.0-alpha.19", + "@math.gl/core": "^4.1.0-alpha.3" }, "peerDependencies": { - "@deck.gl/core": "^9.0.0", - "@luma.gl/core": "^9.0.0", - "@luma.gl/engine": "^9.0.0" + "@deck.gl/core": "9.0.0-alpha.0", + "@luma.gl/core": "^9.1.0-alpha.19", + "@luma.gl/engine": "^9.1.0-alpha.19" }, "gitHead": "13ace64fc2cee08c133afc882fc307253489a4e4" } diff --git a/modules/extensions/src/brushing/shader-module.ts b/modules/extensions/src/brushing/shader-module.ts index 04579af5c8a..229b16829b7 100644 --- a/modules/extensions/src/brushing/shader-module.ts +++ b/modules/extensions/src/brushing/shader-module.ts @@ -23,7 +23,6 @@ import {project} from '@deck.gl/core'; import type {Viewport} from '@deck.gl/core'; import type {BrushingExtensionProps} from './brushing-extension'; -import {glsl} from '../utils/syntax-tags'; export type BrushingModuleProps = { // From layer context @@ -38,7 +37,7 @@ type BrushingModuleUniforms = { radius?: number; }; -const uniformBlock = glsl`\ +const uniformBlock = /* glsl */ `\ uniform brushingUniforms { bool enabled; highp int target; @@ -47,7 +46,7 @@ uniform brushingUniforms { } brushing; `; -const vertex = glsl` +const vertex = /* glsl */ ` in vec2 brushingTargets; out float brushing_isVisible; @@ -77,7 +76,7 @@ ${uniformBlock} ${vertex} `; -const fragment = glsl` +const fragment = /* glsl */ ` in float brushing_isVisible; `; @@ -94,7 +93,7 @@ const TARGET = { }; const inject = { - 'vs:DECKGL_FILTER_GL_POSITION': glsl` + 'vs:DECKGL_FILTER_GL_POSITION': /* glsl */ ` vec2 brushingTarget; vec2 brushingSource; if (brushing.target == 3) { diff --git a/modules/extensions/src/clip/clip-extension.ts b/modules/extensions/src/clip/clip-extension.ts index 5f40bed7fe1..ed03619907a 100644 --- a/modules/extensions/src/clip/clip-extension.ts +++ b/modules/extensions/src/clip/clip-extension.ts @@ -22,7 +22,6 @@ import type {ShaderModule} from '@luma.gl/shadertools'; import {LayerExtension} from '@deck.gl/core'; import type {Layer} from '@deck.gl/core'; -import {glsl} from '../utils/syntax-tags'; const defaultProps = { clipBounds: [0, 0, 1, 1], @@ -41,7 +40,7 @@ export type ClipExtensionProps = { clipByInstance?: boolean; }; -const shaderFunction = glsl` +const shaderFunction = /* glsl */ ` uniform clipUniforms { vec4 bounds; } clip; @@ -68,16 +67,16 @@ const shaderModuleVs: ShaderModule = { }; const injectionVs = { - 'vs:#decl': glsl` + 'vs:#decl': /* glsl */ ` out float clip_isVisible; `, - 'vs:DECKGL_FILTER_GL_POSITION': glsl` + 'vs:DECKGL_FILTER_GL_POSITION': /* glsl */ ` clip_isVisible = float(clip_isInBounds(geometry.worldPosition.xy)); `, - 'fs:#decl': glsl` + 'fs:#decl': /* glsl */ ` in float clip_isVisible; `, - 'fs:DECKGL_FILTER_COLOR': glsl` + 'fs:DECKGL_FILTER_COLOR': /* glsl */ ` if (clip_isVisible < 0.5) discard; ` }; @@ -95,16 +94,16 @@ const shaderModuleFs: ShaderModule = { }; const injectionFs = { - 'vs:#decl': glsl` + 'vs:#decl': /* glsl */ ` out vec2 clip_commonPosition; `, - 'vs:DECKGL_FILTER_GL_POSITION': glsl` + 'vs:DECKGL_FILTER_GL_POSITION': /* glsl */ ` clip_commonPosition = geometry.position.xy; `, - 'fs:#decl': glsl` + 'fs:#decl': /* glsl */ ` in vec2 clip_commonPosition; `, - 'fs:DECKGL_FILTER_COLOR': glsl` + 'fs:DECKGL_FILTER_COLOR': /* glsl */ ` if (!clip_isInBounds(clip_commonPosition)) discard; ` }; diff --git a/modules/extensions/src/collision-filter/collision-filter-pass.ts b/modules/extensions/src/collision-filter/collision-filter-pass.ts index 55e9780026e..6127c821fd4 100644 --- a/modules/extensions/src/collision-filter/collision-filter-pass.ts +++ b/modules/extensions/src/collision-filter/collision-filter-pass.ts @@ -24,7 +24,7 @@ export default class CollisionFilterPass extends LayersPass { isActive: 1, isAttribute: false }, - lightSources: {} + lightSources: {enabled: false} }; } } diff --git a/modules/extensions/src/collision-filter/shader-module.ts b/modules/extensions/src/collision-filter/shader-module.ts index 6993015e3d9..4d15439d26b 100644 --- a/modules/extensions/src/collision-filter/shader-module.ts +++ b/modules/extensions/src/collision-filter/shader-module.ts @@ -1,9 +1,8 @@ import {Framebuffer, Texture, TextureView} from '@luma.gl/core'; import type {ShaderModule} from '@luma.gl/shadertools'; import {project} from '@deck.gl/core'; -import {glsl} from '../utils/syntax-tags'; -const vs = glsl` +const vs = /* glsl */ ` in float collisionPriorities; uniform sampler2D collision_texture; @@ -54,10 +53,10 @@ float collision_isVisible(vec2 texCoords, vec3 pickingColor) { `; const inject = { - 'vs:#decl': glsl` + 'vs:#decl': /* glsl */ ` float collision_fade = 1.0; `, - 'vs:DECKGL_FILTER_GL_POSITION': glsl` + 'vs:DECKGL_FILTER_GL_POSITION': /* glsl */ ` if (collision.sort) { float collisionPriority = collisionPriorities; position.z = -0.001 * collisionPriority * position.w; // Support range -1000 -> 1000 @@ -73,7 +72,7 @@ const inject = { } } `, - 'vs:DECKGL_FILTER_COLOR': glsl` + 'vs:DECKGL_FILTER_COLOR': /* glsl */ ` color.a *= collision_fade; ` }; diff --git a/modules/extensions/src/data-filter/shader-module.ts b/modules/extensions/src/data-filter/shader-module.ts index 5358c125f70..2dd460ad9bf 100644 --- a/modules/extensions/src/data-filter/shader-module.ts +++ b/modules/extensions/src/data-filter/shader-module.ts @@ -1,6 +1,5 @@ import type {ShaderModule} from '@luma.gl/shadertools'; import type {DataFilterExtensionOptions, DataFilterExtensionProps} from './data-filter-extension'; -import {glsl} from '../utils/syntax-tags'; import {UniformFormat} from '@luma.gl/shadertools/dist/types'; /* @@ -28,7 +27,7 @@ export type Defines = { DATAFILTER_DOUBLE?: boolean; }; -const uniformBlock = glsl`\ +const uniformBlock = /* glsl */ `\ uniform dataFilterUniforms { bool useSoftMargin; bool enabled; @@ -50,7 +49,7 @@ uniform dataFilterUniforms { } dataFilter; `; -const vertex = glsl` +const vertex = /* glsl */ ` #ifdef DATAFILTER_TYPE in DATAFILTER_TYPE filterValues; #ifdef DATAFILTER_DOUBLE @@ -134,7 +133,7 @@ ${uniformBlock} ${vertex} `; -const fragment = glsl` +const fragment = /* glsl */ ` in float dataFilter_value; `; @@ -215,7 +214,7 @@ function getUniforms64(opts?: DataFilterModuleProps | {}): Record { } const inject = { - 'vs:#main-start': glsl` + 'vs:#main-start': /* glsl */ ` dataFilter_value = 1.0; if (dataFilter.enabled) { #ifdef DATAFILTER_TYPE @@ -235,19 +234,19 @@ const inject = { } `, - 'vs:#main-end': glsl` + 'vs:#main-end': /* glsl */ ` if (dataFilter_value == 0.0) { gl_Position = vec4(0.); } `, - 'vs:DECKGL_FILTER_SIZE': glsl` + 'vs:DECKGL_FILTER_SIZE': /* glsl */ ` if (dataFilter.transformSize) { size = size * dataFilter_value; } `, - 'fs:DECKGL_FILTER_COLOR': glsl` + 'fs:DECKGL_FILTER_COLOR': /* glsl */ ` if (dataFilter_value == 0.0) discard; if (dataFilter.transformColor) { color.a *= dataFilter_value; diff --git a/modules/extensions/src/fill-style/shader-module.ts b/modules/extensions/src/fill-style/shader-module.ts index 5885fee4f3e..d5b37e0de16 100644 --- a/modules/extensions/src/fill-style/shader-module.ts +++ b/modules/extensions/src/fill-style/shader-module.ts @@ -3,9 +3,8 @@ import {project, fp64LowPart} from '@deck.gl/core'; import type {Viewport, ProjectUniforms} from '@deck.gl/core'; import type {Texture} from '@luma.gl/core'; -import {glsl} from '../utils/syntax-tags'; -const uniformBlock = glsl`\ +const uniformBlock = /* glsl */ `\ uniform fillUniforms { vec2 patternTextureSize; bool patternEnabled; @@ -18,7 +17,7 @@ uniform fillUniforms { /* * fill pattern shader module */ -const patternVs = glsl` +const patternVs = /* glsl */ ` in vec4 fillPatternFrames; in float fillPatternScales; in vec2 fillPatternOffsets; @@ -33,7 +32,7 @@ ${uniformBlock} ${patternVs} `; -const patternFs = glsl` +const patternFs = /* glsl */ ` uniform sampler2D fill_patternTexture; in vec4 fill_patternBounds; @@ -49,11 +48,11 @@ ${patternFs} `; const inject = { - 'vs:DECKGL_FILTER_GL_POSITION': glsl` + 'vs:DECKGL_FILTER_GL_POSITION': /* glsl */ ` fill_uv = geometry.position.xy; `, - 'vs:DECKGL_FILTER_COLOR': glsl` + 'vs:DECKGL_FILTER_COLOR': /* glsl */ ` if (fill.patternEnabled) { fill_patternBounds = fillPatternFrames / vec4(fill.patternTextureSize, fill.patternTextureSize); fill_patternPlacement.xy = fillPatternOffsets; @@ -61,7 +60,7 @@ const inject = { } `, - 'fs:DECKGL_FILTER_COLOR': glsl` + 'fs:DECKGL_FILTER_COLOR': /* glsl */ ` if (fill.patternEnabled) { vec2 scale = FILL_UV_SCALE * fill_patternPlacement.zw; vec2 patternUV = mod(mod(fill.uvCoordinateOrigin, scale) + fill.uvCoordinateOrigin64Low + fill_uv, scale) / scale; diff --git a/modules/extensions/src/mask/shader-module.ts b/modules/extensions/src/mask/shader-module.ts index e387db44a7d..aa097dae145 100644 --- a/modules/extensions/src/mask/shader-module.ts +++ b/modules/extensions/src/mask/shader-module.ts @@ -1,9 +1,8 @@ import type {ShaderModule} from '@luma.gl/shadertools'; import {project} from '@deck.gl/core'; import type {Texture} from '@luma.gl/core'; -import {glsl} from '../utils/syntax-tags'; -const uniformBlock = glsl`\ +const uniformBlock = /* glsl */ `\ uniform maskUniforms { vec4 bounds; highp int channel; @@ -13,7 +12,7 @@ uniform maskUniforms { } mask; `; -const vertex = glsl` +const vertex = /* glsl */ ` vec2 mask_getCoords(vec4 position) { return (position.xy - mask.bounds.xy) / (mask.bounds.zw - mask.bounds.xy); } @@ -24,7 +23,7 @@ ${uniformBlock} ${vertex} `; -const fragment = glsl` +const fragment = /* glsl */ ` uniform sampler2D mask_texture; bool mask_isInBounds(vec2 texCoords) { @@ -57,10 +56,10 @@ ${fragment} `; const inject = { - 'vs:#decl': glsl` + 'vs:#decl': /* glsl */ ` out vec2 mask_texCoords; `, - 'vs:#main-end': glsl` + 'vs:#main-end': /* glsl */ ` vec4 mask_common_position; if (mask.maskByInstance) { mask_common_position = project_position(vec4(geometry.worldPosition, 1.0)); @@ -69,10 +68,10 @@ out vec2 mask_texCoords; } mask_texCoords = mask_getCoords(mask_common_position); `, - 'fs:#decl': glsl` + 'fs:#decl': /* glsl */ ` in vec2 mask_texCoords; `, - 'fs:#main-start': glsl` + 'fs:#main-start': /* glsl */ ` if (mask.enabled) { bool mask = mask_isInBounds(mask_texCoords); diff --git a/modules/extensions/src/terrain/shader-module.ts b/modules/extensions/src/terrain/shader-module.ts index 6ff66a72319..e3027c1d0e6 100644 --- a/modules/extensions/src/terrain/shader-module.ts +++ b/modules/extensions/src/terrain/shader-module.ts @@ -6,7 +6,6 @@ import {project, ProjectUniforms, Viewport} from '@deck.gl/core'; import type {Texture} from '@luma.gl/core'; import type {Bounds} from '../utils/projection-utils'; import type {TerrainCover} from './terrain-cover'; -import {glsl} from '../utils/syntax-tags'; /** Module parameters expected by the terrain shader module */ export type TerrainModuleProps = { @@ -50,8 +49,9 @@ const TERRAIN_MODE_CONSTANTS = Object.keys(TERRAIN_MODE) .join('\n'); const uniformBlock = + // eslint-disable-next-line prefer-template TERRAIN_MODE_CONSTANTS + - glsl` + /* glsl */ ` uniform terrainUniforms { float mode; vec4 bounds; @@ -63,16 +63,18 @@ uniform sampler2D terrain_map; export const terrainModule = { name: 'terrain', dependencies: [project], - vs: uniformBlock + glsl`out vec3 commonPos;`, - fs: uniformBlock + glsl`in vec3 commonPos;`, + // eslint-disable-next-line prefer-template + vs: uniformBlock + /* glsl */ 'out vec3 commonPos;', + // eslint-disable-next-line prefer-template + fs: uniformBlock + /* glsl */ 'in vec3 commonPos;', inject: { - 'vs:#main-start': glsl` + 'vs:#main-start': /* glsl */ ` if (terrain.mode == TERRAIN_MODE_SKIP) { gl_Position = vec4(0.0); return; } `, - 'vs:DECKGL_FILTER_GL_POSITION': glsl` + 'vs:DECKGL_FILTER_GL_POSITION': /* glsl */ ` commonPos = geometry.position.xyz; if (terrain.mode == TERRAIN_MODE_WRITE_HEIGHT_MAP) { vec2 texCoords = (commonPos.xy - terrain.bounds.xy) / terrain.bounds.zw; @@ -91,13 +93,13 @@ if (terrain.mode == TERRAIN_MODE_USE_HEIGHT_MAP) { } } `, - 'fs:#main-start': glsl` + 'fs:#main-start': /* glsl */ ` if (terrain.mode == TERRAIN_MODE_WRITE_HEIGHT_MAP) { fragColor = vec4(commonPos.z, 0.0, 0.0, 1.0); return; } `, - 'fs:DECKGL_FILTER_COLOR': glsl` + 'fs:DECKGL_FILTER_COLOR': /* glsl */ ` if ((terrain.mode == TERRAIN_MODE_USE_COVER) || (terrain.mode == TERRAIN_MODE_USE_COVER_ONLY)) { vec2 texCoords = (commonPos.xy - terrain.bounds.xy) / terrain.bounds.zw; vec4 pixel = texture(terrain_map, texCoords); diff --git a/modules/extensions/src/utils/syntax-tags.ts b/modules/extensions/src/utils/syntax-tags.ts deleted file mode 100644 index 79ddb2eb1db..00000000000 --- a/modules/extensions/src/utils/syntax-tags.ts +++ /dev/null @@ -1,5 +0,0 @@ -/** - * Marks GLSL shaders for syntax highlighting: glsl`...` - * Install https://marketplace.visualstudio.com/items?itemName=boyswan.glsl-literal - */ -export const glsl = (s: TemplateStringsArray) => `${s}`; diff --git a/modules/geo-layers/package.json b/modules/geo-layers/package.json index 36863faadde..221f607bf9f 100644 --- a/modules/geo-layers/package.json +++ b/modules/geo-layers/package.json @@ -3,7 +3,7 @@ "description": "deck.gl layers supporting geospatial use cases and GIS formats", "license": "MIT", "type": "module", - "version": "9.0.0-beta.11", + "version": "9.1.0-alpha.0", "publishConfig": { "access": "public" }, @@ -46,23 +46,23 @@ "@loaders.gl/terrain": "^4.2.0", "@loaders.gl/tiles": "^4.2.0", "@loaders.gl/wms": "^4.2.0", - "@luma.gl/gltf": "^9.0.17", - "@luma.gl/shadertools": "^9.0.17", - "@math.gl/core": "^4.0.0", - "@math.gl/culling": "^4.0.0", - "@math.gl/web-mercator": "^4.0.0", + "@luma.gl/gltf": "^9.1.0-alpha.19", + "@luma.gl/shadertools": "^9.1.0-alpha.19", + "@math.gl/core": "^4.1.0-alpha.3", + "@math.gl/culling": "^4.1.0-alpha.3", + "@math.gl/web-mercator": "^4.1.0-alpha.3", "@types/geojson": "^7946.0.8", "h3-js": "^4.1.0", "long": "^3.2.0" }, "peerDependencies": { - "@deck.gl/core": "^9.0.0", - "@deck.gl/extensions": "^9.0.0", - "@deck.gl/layers": "^9.0.0", - "@deck.gl/mesh-layers": "^9.0.0", + "@deck.gl/core": "9.0.0-alpha.0", + "@deck.gl/extensions": "9.0.0-alpha.0", + "@deck.gl/layers": "9.0.0-alpha.0", + "@deck.gl/mesh-layers": "9.0.0-alpha.0", "@loaders.gl/core": "^4.2.0", - "@luma.gl/core": "^9.0.0", - "@luma.gl/engine": "^9.0.0" + "@luma.gl/core": "^9.1.0-alpha.19", + "@luma.gl/engine": "^9.1.0-alpha.19" }, "gitHead": "13ace64fc2cee08c133afc882fc307253489a4e4" } diff --git a/modules/geo-layers/src/mesh-layer/mesh-layer-fragment.glsl.ts b/modules/geo-layers/src/mesh-layer/mesh-layer-fragment.glsl.ts index 9893b6233c4..af024fcfc63 100644 --- a/modules/geo-layers/src/mesh-layer/mesh-layer-fragment.glsl.ts +++ b/modules/geo-layers/src/mesh-layer/mesh-layer-fragment.glsl.ts @@ -15,7 +15,7 @@ out vec4 fragColor; void main(void) { -#ifdef MODULE_PBR +#ifdef MODULE_PBRMATERIAL fragColor = vColor * pbr_filterColor(vec4(0)); geometry.uv = pbr_vUV; @@ -35,7 +35,7 @@ void main(void) { vec4 color = simpleMesh.hasTexture ? texture(sampler, vTexCoord) : vColor; vec3 lightColor = lighting_getLightColor(color.rgb, cameraPosition, position_commonspace.xyz, normal); - fragColor = vec4(lightColor, color.a * opacity); + fragColor = vec4(lightColor, color.a * layer.opacity); #endif diff --git a/modules/geo-layers/src/mesh-layer/mesh-layer-vertex.glsl.ts b/modules/geo-layers/src/mesh-layer/mesh-layer-vertex.glsl.ts index c96a27b907d..0ce60274c00 100644 --- a/modules/geo-layers/src/mesh-layer/mesh-layer-vertex.glsl.ts +++ b/modules/geo-layers/src/mesh-layer/mesh-layer-vertex.glsl.ts @@ -59,7 +59,7 @@ void main(void) { DECKGL_FILTER_GL_POSITION(gl_Position, geometry); - #ifdef MODULE_PBR + #ifdef MODULE_PBRMATERIAL // set PBR data pbr_vPosition = geometry.position.xyz; #ifdef HAS_NORMALS diff --git a/modules/geo-layers/src/mesh-layer/mesh-layer.ts b/modules/geo-layers/src/mesh-layer/mesh-layer.ts index 9178ca6b70a..3e20a851ccb 100644 --- a/modules/geo-layers/src/mesh-layer/mesh-layer.ts +++ b/modules/geo-layers/src/mesh-layer/mesh-layer.ts @@ -1,6 +1,6 @@ import type {NumericArray} from '@math.gl/core'; import {parsePBRMaterial, ParsedPBRMaterial} from '@luma.gl/gltf'; -import {pbr} from '@luma.gl/shadertools'; +import {pbrMaterial} from '@luma.gl/shadertools'; import {Model} from '@luma.gl/engine'; import type {MeshAttribute, MeshAttributes} from '@loaders.gl/schema'; import type {UpdateParameters, DefaultProps, LayerContext} from '@deck.gl/core'; @@ -59,7 +59,7 @@ export default class MeshLayer extends getShaders() { const shaders = super.getShaders(); const modules = shaders.modules; - modules.push(pbr, meshUniforms); + modules.push(pbrMaterial, meshUniforms); return {...shaders, vs, fs}; } @@ -100,20 +100,21 @@ export default class MeshLayer extends const meshProps: MeshProps = { pickFeatureIds: Boolean(featureIds) }; - // TODO replace with shaderInputs.setProps({pbr: u_Camera}) once - // luma pbr module ported to UBO - model.setUniforms({ + const pbrProjectionProps = { // Needed for PBR (TODO: find better way to get it) - u_Camera: model.uniforms.cameraPosition + camera: model.uniforms.cameraPosition as [number, number, number] + }; + model.shaderInputs.setProps({ + pbrProjection: pbrProjectionProps, + mesh: meshProps }); - model.shaderInputs.setProps({mesh: meshProps}); super.draw(opts); } protected getModel(mesh: Mesh): Model { - const {id, pbrMaterial} = this.props; - const parsedPBRMaterial = this.parseMaterial(pbrMaterial, mesh); + const {id} = this.props; + const parsedPBRMaterial = this.parseMaterial(this.props.pbrMaterial, mesh); // Keep material to explicitly remove textures this.setState({parsedPBRMaterial}); const shaders = this.getShaders(); @@ -135,26 +136,36 @@ export default class MeshLayer extends return model; } - updatePbrMaterialUniforms(pbrMaterial) { + updatePbrMaterialUniforms(material) { const {model} = this.state; if (model) { const {mesh} = this.props; - const parsedPBRMaterial = this.parseMaterial(pbrMaterial, mesh as Mesh); + const parsedPBRMaterial = this.parseMaterial(material, mesh as Mesh); // Keep material to explicitly remove textures this.setState({parsedPBRMaterial}); - model.setBindings(parsedPBRMaterial.bindings); - model.setUniforms(parsedPBRMaterial.uniforms); + + const {pbr_baseColorSampler} = parsedPBRMaterial.bindings; + const {emptyTexture} = this.state; + const simpleMeshProps = { + sampler: pbr_baseColorSampler || emptyTexture, + hasTexture: Boolean(pbr_baseColorSampler) + }; + const {camera, ...pbrMaterialProps} = { + ...parsedPBRMaterial.bindings, + ...parsedPBRMaterial.uniforms + }; + model.shaderInputs.setProps({simpleMesh: simpleMeshProps, pbrMaterial: pbrMaterialProps}); } } - parseMaterial(pbrMaterial, mesh: Mesh): ParsedPBRMaterial { + parseMaterial(material, mesh: Mesh): ParsedPBRMaterial { const unlit = Boolean( - pbrMaterial.pbrMetallicRoughness && pbrMaterial.pbrMetallicRoughness.baseColorTexture + material.pbrMetallicRoughness && material.pbrMetallicRoughness.baseColorTexture ); return parsePBRMaterial( this.context.device, - {unlit, ...pbrMaterial}, + {unlit, ...material}, {NORMAL: mesh.attributes.normals, TEXCOORD_0: mesh.attributes.texCoords}, { pbrDebug: false, diff --git a/modules/google-maps/package.json b/modules/google-maps/package.json index c8826618a2a..c7d0c37d938 100644 --- a/modules/google-maps/package.json +++ b/modules/google-maps/package.json @@ -3,7 +3,7 @@ "description": "Use deck.gl as a custom Google Maps overlay", "license": "MIT", "type": "module", - "version": "9.0.0-beta.11", + "version": "9.1.0-alpha.0", "publishConfig": { "access": "public" }, @@ -38,13 +38,13 @@ "prepublishOnly": "npm run build-bundle && npm run build-bundle -- --env=dev" }, "dependencies": { - "@luma.gl/constants": "^9.0.17", - "@math.gl/core": "^4.0.0", + "@luma.gl/constants": "^9.1.0-alpha.19", + "@math.gl/core": "^4.1.0-alpha.3", "@types/google.maps": "^3.48.6" }, "peerDependencies": { - "@deck.gl/core": "^9.0.0", - "@luma.gl/core": "^9.0.0" + "@deck.gl/core": "9.0.0-alpha.0", + "@luma.gl/core": "^9.1.0-alpha.19" }, "gitHead": "13ace64fc2cee08c133afc882fc307253489a4e4" } diff --git a/modules/json/package.json b/modules/json/package.json index 3f4de8b0e70..3604b5b7f41 100644 --- a/modules/json/package.json +++ b/modules/json/package.json @@ -3,7 +3,7 @@ "description": "JSON format rendering components for deck.gl", "license": "MIT", "type": "module", - "version": "9.0.0-beta.11", + "version": "9.1.0-alpha.0", "publishConfig": { "access": "public" }, @@ -38,10 +38,10 @@ "prepublishOnly": "npm run build-bundle && npm run build-bundle -- --env=dev" }, "dependencies": { - "expression-eval": "^5.0.0" + "jsep": "^0.3.0" }, "peerDependencies": { - "@deck.gl/core": "^9.0.0" + "@deck.gl/core": "9.0.0-alpha.0" }, "gitHead": "13ace64fc2cee08c133afc882fc307253489a4e4" } diff --git a/modules/json/src/helpers/parse-expression-string.ts b/modules/json/src/helpers/parse-expression-string.ts index f88ecef4c17..ab1dcf691d8 100644 --- a/modules/json/src/helpers/parse-expression-string.ts +++ b/modules/json/src/helpers/parse-expression-string.ts @@ -1,8 +1,7 @@ import {get} from '../utils/get'; // expression-eval: Small jsep based expression parser that supports array and object indexing -import * as expressionEval from 'expression-eval'; -const {parse, eval: evaluate} = expressionEval; +import {parse, eval as evaluate} from '../utils/expression-eval'; const cachedExpressionMap = { '-': object => object diff --git a/modules/json/src/utils/expression-eval.ts b/modules/json/src/utils/expression-eval.ts new file mode 100644 index 00000000000..e5f7b0857c3 --- /dev/null +++ b/modules/json/src/utils/expression-eval.ts @@ -0,0 +1,339 @@ +import jsep from 'jsep'; + +/** + * Sources: + * - Copyright (c) 2013 Stephen Oney, http://jsep.from.so/, MIT License + * - Copyright (c) 2023 Don McCurdy, https://github.com/donmccurdy/expression-eval, MIT License + */ + +// Default operator precedence from https://github.com/EricSmekens/jsep/blob/master/src/jsep.js#L55 +const DEFAULT_PRECEDENCE = { + '||': 1, + '&&': 2, + '|': 3, + '^': 4, + '&': 5, + '==': 6, + '!=': 6, + '===': 6, + '!==': 6, + '<': 7, + '>': 7, + '<=': 7, + '>=': 7, + '<<': 8, + '>>': 8, + '>>>': 8, + '+': 9, + '-': 9, + '*': 10, + '/': 10, + '%': 10 +}; + +const binops = { + '||': (a: unknown, b: unknown) => { + return a || b; + }, + '&&': (a: unknown, b: unknown) => { + return a && b; + }, + '|': (a: number, b: number) => { + return a | b; + }, + '^': (a: number, b: number) => { + return a ^ b; + }, + '&': (a: number, b: number) => { + return a & b; + }, + '==': (a: unknown, b: unknown) => { + // eslint-disable-next-line eqeqeq + return a == b; + }, + '!=': (a: unknown, b: unknown) => { + // eslint-disable-next-line eqeqeq + return a != b; + }, + '===': (a: unknown, b: unknown) => { + return a === b; + }, + '!==': (a: unknown, b: unknown) => { + return a !== b; + }, + '<': (a: number | string, b: number | string) => { + return a < b; + }, + '>': (a: number | string, b: number | string) => { + return a > b; + }, + '<=': (a: number | string, b: number | string) => { + return a <= b; + }, + '>=': (a: number | string, b: number | string) => { + return a >= b; + }, + '<<': (a: number, b: number) => { + return a << b; + }, + '>>': (a: number, b: number) => { + return a >> b; + }, + '>>>': (a: number, b: number) => { + return a >>> b; + }, + '+': (a: unknown, b: unknown) => { + // @ts-expect-error + return a + b; + }, + '-': (a: number, b: number) => { + return a - b; + }, + '*': (a: number, b: number) => { + return a * b; + }, + '/': (a: number, b: number) => { + return a / b; + }, + '%': (a: number, b: number) => { + return a % b; + } +}; + +const unops = { + '-': (a: number) => { + return -a; + }, + '+': (a: unknown) => { + // @ts-expect-error + // eslint-disable-next-line no-implicit-coercion + return +a; + }, + '~': (a: number) => { + return ~a; + }, + '!': (a: unknown) => { + return !a; + } +}; + +declare type operand = number | string; +declare type unaryCallback = (a: operand) => operand; +declare type binaryCallback = (a: operand, b: operand) => operand; + +type AnyExpression = + | jsep.ArrayExpression + | jsep.BinaryExpression + | jsep.MemberExpression + | jsep.CallExpression + | jsep.ConditionalExpression + | jsep.Identifier + | jsep.Literal + | jsep.LogicalExpression + | jsep.ThisExpression + | jsep.UnaryExpression; + +function evaluateArray(list, context) { + return list.map(function (v) { + return evaluate(v, context); + }); +} + +async function evaluateArrayAsync(list, context) { + const res = await Promise.all(list.map(v => evalAsync(v, context))); + return res; +} + +function evaluateMember(node: jsep.MemberExpression, context: object) { + const object = evaluate(node.object, context); + let key: string; + if (node.computed) { + key = evaluate(node.property, context); + } else { + key = (node.property as jsep.Identifier).name; + } + if (/^__proto__|prototype|constructor$/.test(key)) { + throw Error(`Access to member "${key}" disallowed.`); + } + return [object, object[key]]; +} + +async function evaluateMemberAsync(node: jsep.MemberExpression, context: object) { + const object = await evalAsync(node.object, context); + let key: string; + if (node.computed) { + key = await evalAsync(node.property, context); + } else { + key = (node.property as jsep.Identifier).name; + } + if (/^__proto__|prototype|constructor$/.test(key)) { + throw Error(`Access to member "${key}" disallowed.`); + } + return [object, object[key]]; +} + +// eslint-disable-next-line complexity +function evaluate(_node: jsep.Expression, context: object) { + const node = _node as AnyExpression; + + switch (node.type) { + case 'ArrayExpression': + return evaluateArray(node.elements, context); + + case 'BinaryExpression': + return binops[node.operator](evaluate(node.left, context), evaluate(node.right, context)); + + case 'CallExpression': + let caller: object; + let fn: Function; + let assign: unknown[]; + if (node.callee.type === 'MemberExpression') { + assign = evaluateMember(node.callee as jsep.MemberExpression, context); + caller = assign[0] as object; + fn = assign[1] as Function; + } else { + fn = evaluate(node.callee, context); + } + if (typeof fn !== 'function') { + return undefined; + } + return fn.apply(caller!, evaluateArray(node.arguments, context)); + + case 'ConditionalExpression': + return evaluate(node.test, context) + ? evaluate(node.consequent, context) + : evaluate(node.alternate, context); + + case 'Identifier': + return context[node.name]; + + case 'Literal': + return node.value; + + case 'LogicalExpression': + if (node.operator === '||') { + return evaluate(node.left, context) || evaluate(node.right, context); + } else if (node.operator === '&&') { + return evaluate(node.left, context) && evaluate(node.right, context); + } + return binops[node.operator](evaluate(node.left, context), evaluate(node.right, context)); + + case 'MemberExpression': + return evaluateMember(node, context)[1]; + + case 'ThisExpression': + return context; + + case 'UnaryExpression': + return unops[node.operator](evaluate(node.argument, context)); + + default: + return undefined; + } +} + +// eslint-disable-next-line complexity +async function evalAsync(_node: jsep.Expression, context: object) { + const node = _node as AnyExpression; + + // Brackets used for some case blocks here, to avoid edge cases related to variable hoisting. + // See: https://stackoverflow.com/questions/57759348/const-and-let-variable-shadowing-in-a-switch-statement + switch (node.type) { + case 'ArrayExpression': + return await evaluateArrayAsync(node.elements, context); + + case 'BinaryExpression': { + const [left, right] = await Promise.all([ + evalAsync(node.left, context), + evalAsync(node.right, context) + ]); + return binops[node.operator](left, right); + } + + case 'CallExpression': { + let caller: object; + let fn: Function; + let assign: unknown[]; + if (node.callee.type === 'MemberExpression') { + assign = await evaluateMemberAsync(node.callee as jsep.MemberExpression, context); + caller = assign[0] as object; + fn = assign[1] as Function; + } else { + fn = await evalAsync(node.callee, context); + } + if (typeof fn !== 'function') { + return undefined; + } + return await fn.apply(caller!, await evaluateArrayAsync(node.arguments, context)); + } + + case 'ConditionalExpression': + return (await evalAsync(node.test, context)) + ? await evalAsync(node.consequent, context) + : await evalAsync(node.alternate, context); + + case 'Identifier': + return context[node.name]; + + case 'Literal': + return node.value; + + case 'LogicalExpression': { + if (node.operator === '||') { + return (await evalAsync(node.left, context)) || (await evalAsync(node.right, context)); + } else if (node.operator === '&&') { + return (await evalAsync(node.left, context)) && (await evalAsync(node.right, context)); + } + + const [left, right] = await Promise.all([ + evalAsync(node.left, context), + evalAsync(node.right, context) + ]); + + return binops[node.operator](left, right); + } + + case 'MemberExpression': + return (await evaluateMemberAsync(node, context))[1]; + + case 'ThisExpression': + return context; + + case 'UnaryExpression': + return unops[node.operator](await evalAsync(node.argument, context)); + + default: + return undefined; + } +} + +function compile(expression: string | jsep.Expression): (context: object) => any { + return evaluate.bind(null, jsep(expression)); +} + +function compileAsync(expression: string | jsep.Expression): (context: object) => Promise { + return evalAsync.bind(null, jsep(expression)); +} + +// Added functions to inject Custom Unary Operators (and override existing ones) +function addUnaryOp(operator: string, _function: unaryCallback): void { + jsep.addUnaryOp(operator); + unops[operator] = _function; +} + +// Added functions to inject Custom Binary Operators (and override existing ones) +function addBinaryOp( + operator: string, + precedenceOrFn: number | binaryCallback, + _function: binaryCallback +): void { + if (_function) { + jsep.addBinaryOp(operator, precedenceOrFn as number); + binops[operator] = _function; + } else { + jsep.addBinaryOp(operator, DEFAULT_PRECEDENCE[operator] || 1); + binops[operator] = precedenceOrFn; + } +} + +export {jsep as parse, evaluate as eval, evalAsync, compile, compileAsync, addUnaryOp, addBinaryOp}; diff --git a/modules/jupyter-widget/package.json b/modules/jupyter-widget/package.json index 982be5300db..88b307c5372 100644 --- a/modules/jupyter-widget/package.json +++ b/modules/jupyter-widget/package.json @@ -2,7 +2,7 @@ "name": "@deck.gl/jupyter-widget", "description": "Jupyter widget for rendering deck.gl in a Jupyter notebook", "license": "MIT", - "version": "9.0.0-beta.11", + "version": "9.1.0-alpha.0", "keywords": [ "jupyter", "jupyterlab", @@ -29,17 +29,17 @@ "prepublishOnly": "npm run build" }, "dependencies": { - "@deck.gl/aggregation-layers": "9.0.0-beta.11", - "@deck.gl/geo-layers": "9.0.0-beta.11", - "@deck.gl/google-maps": "9.0.0-beta.11", - "@deck.gl/json": "9.0.0-beta.11", - "@deck.gl/layers": "9.0.0-beta.11", - "@deck.gl/mesh-layers": "9.0.0-beta.11", + "@deck.gl/aggregation-layers": "9.1.0-alpha.0", + "@deck.gl/geo-layers": "9.1.0-alpha.0", + "@deck.gl/google-maps": "9.1.0-alpha.0", + "@deck.gl/json": "9.1.0-alpha.0", + "@deck.gl/layers": "9.1.0-alpha.0", + "@deck.gl/mesh-layers": "9.1.0-alpha.0", "@jupyter-widgets/base": "^1.1.10 || ^2 || ^3 || ^4", "@loaders.gl/3d-tiles": "^4.2.0", "@loaders.gl/core": "^4.2.0", "@loaders.gl/csv": "^4.2.0", - "@luma.gl/core": "^9.0.17", + "@luma.gl/core": "^9.1.0-alpha.19", "d3-dsv": "^1.0.8", "mapbox-gl": "^1.13.2" }, diff --git a/modules/layers/package.json b/modules/layers/package.json index ee74992edfc..4b38fabe5be 100644 --- a/modules/layers/package.json +++ b/modules/layers/package.json @@ -3,7 +3,7 @@ "description": "deck.gl core layers", "license": "MIT", "type": "module", - "version": "9.0.0-beta.11", + "version": "9.1.0-alpha.0", "publishConfig": { "access": "public" }, @@ -40,16 +40,16 @@ "@loaders.gl/images": "^4.2.0", "@loaders.gl/schema": "^4.2.0", "@mapbox/tiny-sdf": "^2.0.5", - "@math.gl/core": "^4.0.0", - "@math.gl/polygon": "^4.0.0", - "@math.gl/web-mercator": "^4.0.0", + "@math.gl/core": "^4.1.0-alpha.3", + "@math.gl/polygon": "^4.1.0-alpha.3", + "@math.gl/web-mercator": "^4.1.0-alpha.3", "earcut": "^2.2.4" }, "peerDependencies": { - "@deck.gl/core": "^9.0.0", + "@deck.gl/core": "9.0.0-alpha.0", "@loaders.gl/core": "^4.2.0", - "@luma.gl/core": "^9.0.0", - "@luma.gl/engine": "^9.0.0" + "@luma.gl/core": "^9.1.0-alpha.19", + "@luma.gl/engine": "^9.1.0-alpha.19" }, "gitHead": "13ace64fc2cee08c133afc882fc307253489a4e4" } diff --git a/modules/layers/src/column-layer/column-layer.ts b/modules/layers/src/column-layer/column-layer.ts index 8621213103e..9e6ebc87762 100644 --- a/modules/layers/src/column-layer/column-layer.ts +++ b/modules/layers/src/column-layer/column-layer.ts @@ -21,8 +21,6 @@ import { Layer, project32, - gouraudLighting, - phongLighting, picking, UNIT, LayerProps, @@ -36,6 +34,7 @@ import { Material, DefaultProps } from '@deck.gl/core'; +import {gouraudMaterial, phongMaterial} from '@luma.gl/shadertools'; import {Model} from '@luma.gl/engine'; import ColumnGeometry from './column-geometry'; @@ -254,7 +253,7 @@ export default class ColumnLayer exten vs, fs, defines, - modules: [project32, flatShading ? phongLighting : gouraudLighting, picking, columnUniforms] + modules: [project32, flatShading ? phongMaterial : gouraudMaterial, picking, columnUniforms] }); } diff --git a/modules/layers/src/geojson-layer/geojson-binary.ts b/modules/layers/src/geojson-layer/geojson-binary.ts index 2210b49bbe6..787a6e90aea 100644 --- a/modules/layers/src/geojson-layer/geojson-binary.ts +++ b/modules/layers/src/geojson-layer/geojson-binary.ts @@ -74,9 +74,9 @@ export function calculatePickingColors( const pickingColor = []; for (let i = 0; i < featureIds.length; i++) { encodePickingColor(featureIds[i], pickingColor); - pickingColors[key]![i * 3 + 0] = pickingColor[0]; - pickingColors[key]![i * 3 + 1] = pickingColor[1]; - pickingColors[key]![i * 3 + 2] = pickingColor[2]; + pickingColors[key][i * 3 + 0] = pickingColor[0]; + pickingColors[key][i * 3 + 1] = pickingColor[1]; + pickingColors[key][i * 3 + 2] = pickingColor[2]; } } diff --git a/modules/layers/src/icon-layer/icon-manager.ts b/modules/layers/src/icon-layer/icon-manager.ts index 816afee23a6..0a8fe7ee29f 100644 --- a/modules/layers/src/icon-layer/icon-manager.ts +++ b/modules/layers/src/icon-layer/icon-manager.ts @@ -84,7 +84,7 @@ function resizeImage( maxWidth: number, maxHeight: number ): { - data: HTMLImageElement | HTMLCanvasElement | ImageBitmap; + image: HTMLImageElement | HTMLCanvasElement | ImageBitmap; width: number; height: number; } { @@ -94,7 +94,7 @@ function resizeImage( if (resizeRatio === 1) { // No resizing required - return {data: imageData, width, height}; + return {image: imageData, width, height}; } ctx.canvas.height = height; @@ -104,7 +104,7 @@ function resizeImage( // image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight ctx.drawImage(imageData, 0, 0, imageData.width, imageData.height, 0, 0, width, height); - return {data: ctx.canvas, width, height}; + return {image: ctx.canvas, width, height}; } function getIconId(icon: UnpackedIcon): string { @@ -120,11 +120,17 @@ function resizeTexture( ): Texture { const {width: oldWidth, height: oldHeight, device} = texture; - const newTexture = device.createTexture({format: 'rgba8unorm', width, height, sampler}); + const newTexture = device.createTexture({ + format: 'rgba8unorm', + width, + height, + sampler, + mipmaps: true + }); const commandEncoder = device.createCommandEncoder(); commandEncoder.copyTextureToTexture({ - source: texture, - destination: newTexture, + sourceTexture: texture, + destinationTexture: newTexture, width: oldWidth, height: oldHeight }); @@ -407,7 +413,8 @@ export default class IconManager { format: 'rgba8unorm', width: this._canvasWidth, height: this._canvasHeight, - sampler: this._samplerParameters || DEFAULT_SAMPLER_PARAMETERS + sampler: this._samplerParameters || DEFAULT_SAMPLER_PARAMETERS, + mipmaps: true }); } @@ -448,16 +455,15 @@ export default class IconManager { const iconDef = this._mapping[id]; const {x, y, width: maxWidth, height: maxHeight} = iconDef; - const {data, width, height} = resizeImage( + const {image, width, height} = resizeImage( ctx, imageData as ImageBitmap, maxWidth, maxHeight ); - // @ts-expect-error TODO v9 API not yet clear - this._texture.setSubImageData({ - data, + this._texture?.copyExternalImage({ + image, x: x + (maxWidth - width) / 2, y: y + (maxHeight - height) / 2, width, diff --git a/modules/layers/src/point-cloud-layer/point-cloud-layer.ts b/modules/layers/src/point-cloud-layer/point-cloud-layer.ts index a0347004468..37904c8b40c 100644 --- a/modules/layers/src/point-cloud-layer/point-cloud-layer.ts +++ b/modules/layers/src/point-cloud-layer/point-cloud-layer.ts @@ -21,7 +21,6 @@ import { Layer, project32, - gouraudLighting, picking, UNIT, LayerProps, @@ -36,6 +35,7 @@ import { DefaultProps } from '@deck.gl/core'; import {Model, Geometry} from '@luma.gl/engine'; +import {gouraudMaterial} from '@luma.gl/shadertools'; import {pointCloudUniforms, PointCloudProps} from './point-cloud-layer-uniforms'; import vs from './point-cloud-layer-vertex.glsl'; @@ -144,7 +144,7 @@ export default class PointCloudLayer e return super.getShaders({ vs, fs, - modules: [project32, gouraudLighting, picking, pointCloudUniforms] + modules: [project32, gouraudMaterial, picking, pointCloudUniforms] }); } diff --git a/modules/layers/src/scatterplot-layer/scatterplot-layer-fragment.glsl.ts b/modules/layers/src/scatterplot-layer/scatterplot-layer-fragment.glsl.ts index 55352c5257a..b933ee422ce 100644 --- a/modules/layers/src/scatterplot-layer/scatterplot-layer-fragment.glsl.ts +++ b/modules/layers/src/scatterplot-layer/scatterplot-layer-fragment.glsl.ts @@ -57,7 +57,7 @@ void main(void) { } fragColor = vec4(vLineColor.rgb, vLineColor.a * isLine); } - } else if (!scatterplot.filled) { + } else if (scatterplot.filled == false) { discard; } else { fragColor = vFillColor; diff --git a/modules/layers/src/solid-polygon-layer/solid-polygon-layer.ts b/modules/layers/src/solid-polygon-layer/solid-polygon-layer.ts index 902e71d52f0..9df726f40e2 100644 --- a/modules/layers/src/solid-polygon-layer/solid-polygon-layer.ts +++ b/modules/layers/src/solid-polygon-layer/solid-polygon-layer.ts @@ -18,8 +18,9 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. -import {Layer, project32, gouraudLighting, picking, COORDINATE_SYSTEM} from '@deck.gl/core'; +import {Layer, project32, picking, COORDINATE_SYSTEM} from '@deck.gl/core'; import {Model, Geometry} from '@luma.gl/engine'; +import {gouraudMaterial} from '@luma.gl/shadertools'; // Polygon geometry generation is managed by the polygon tesselator import PolygonTesselator from './polygon-tesselator'; @@ -155,7 +156,7 @@ export default class SolidPolygonLayer defines: { RING_WINDING_ORDER_CW: !this.props._normalize && this.props._windingOrder === 'CCW' ? 0 : 1 }, - modules: [project32, gouraudLighting, picking, solidPolygonUniforms] + modules: [project32, gouraudMaterial, picking, solidPolygonUniforms] }); } diff --git a/modules/main/package.json b/modules/main/package.json index 439024df39c..5508c31dfcc 100644 --- a/modules/main/package.json +++ b/modules/main/package.json @@ -3,7 +3,7 @@ "description": "A suite of 3D-enabled data visualization overlays, suitable for react-map-gl", "license": "MIT", "type": "module", - "version": "9.0.0-beta.11", + "version": "9.1.0-alpha.0", "keywords": [ "webgl", "visualization", @@ -39,22 +39,22 @@ "prepublishOnly": "npm run build-bundle && npm run build-bundle -- --env=dev" }, "dependencies": { - "@deck.gl/aggregation-layers": "9.0.0-beta.11", - "@deck.gl/arcgis": "9.0.0-beta.11", - "@deck.gl/carto": "9.0.0-beta.11", - "@deck.gl/core": "9.0.0-beta.11", - "@deck.gl/extensions": "9.0.0-beta.11", - "@deck.gl/geo-layers": "9.0.0-beta.11", - "@deck.gl/google-maps": "9.0.0-beta.11", - "@deck.gl/json": "9.0.0-beta.11", - "@deck.gl/layers": "9.0.0-beta.11", - "@deck.gl/mapbox": "9.0.0-beta.11", - "@deck.gl/mesh-layers": "9.0.0-beta.11", - "@deck.gl/react": "9.0.0-beta.11", - "@deck.gl/widgets": "9.0.0-beta.11", + "@deck.gl/aggregation-layers": "9.1.0-alpha.0", + "@deck.gl/arcgis": "9.1.0-alpha.0", + "@deck.gl/carto": "9.1.0-alpha.0", + "@deck.gl/core": "9.1.0-alpha.0", + "@deck.gl/extensions": "9.1.0-alpha.0", + "@deck.gl/geo-layers": "9.1.0-alpha.0", + "@deck.gl/google-maps": "9.1.0-alpha.0", + "@deck.gl/json": "9.1.0-alpha.0", + "@deck.gl/layers": "9.1.0-alpha.0", + "@deck.gl/mapbox": "9.1.0-alpha.0", + "@deck.gl/mesh-layers": "9.1.0-alpha.0", + "@deck.gl/react": "9.1.0-alpha.0", + "@deck.gl/widgets": "9.1.0-alpha.0", "@loaders.gl/core": "^4.2.0", - "@luma.gl/core": "^9.0.17", - "@luma.gl/engine": "^9.0.17" + "@luma.gl/core": "^9.1.0-alpha.19", + "@luma.gl/engine": "^9.1.0-alpha.19" }, "peerDependencies": { "@arcgis/core": "^4.0.0", diff --git a/modules/main/src/index.ts b/modules/main/src/index.ts index 36180c4e2f1..be4f29db16c 100644 --- a/modules/main/src/index.ts +++ b/modules/main/src/index.ts @@ -114,12 +114,9 @@ export { export { ScreenGridLayer, - CPUGridLayer, HexagonLayer, ContourLayer, GridLayer, - GPUGridLayer, - AGGREGATION_OPERATION, HeatmapLayer, WebGLAggregator, CPUAggregator @@ -204,9 +201,7 @@ export type { export type { ContourLayerProps, - CPUGridLayerProps, GridLayerProps, - GPUGridLayerProps, HeatmapLayerProps, HexagonLayerProps, ScreenGridLayerProps diff --git a/modules/mapbox/package.json b/modules/mapbox/package.json index fcd14a050ce..4aa97682864 100644 --- a/modules/mapbox/package.json +++ b/modules/mapbox/package.json @@ -3,7 +3,7 @@ "description": "Use deck.gl layers as custom mapbox-gl-js layers", "license": "MIT", "type": "module", - "version": "9.0.0-beta.11", + "version": "9.1.0-alpha.0", "publishConfig": { "access": "public" }, @@ -38,12 +38,12 @@ "prepublishOnly": "npm run build-bundle && npm run build-bundle -- --env=dev" }, "dependencies": { - "@luma.gl/constants": "^9.0.17", - "@math.gl/web-mercator": "^4.0.0" + "@luma.gl/constants": "^9.1.0-alpha.19", + "@math.gl/web-mercator": "^4.1.0-alpha.3" }, "peerDependencies": { - "@deck.gl/core": "^9.0.0", - "@luma.gl/core": "^9.0.0" + "@deck.gl/core": "^9.0.0-alpha", + "@luma.gl/core": "^9.1.0-alpha.19" }, "gitHead": "13ace64fc2cee08c133afc882fc307253489a4e4" } diff --git a/modules/mapbox/src/resolve-layers.ts b/modules/mapbox/src/resolve-layers.ts index 1a964fb35e4..565eea5e664 100644 --- a/modules/mapbox/src/resolve-layers.ts +++ b/modules/mapbox/src/resolve-layers.ts @@ -42,8 +42,10 @@ export function resolveLayers( for (const layer of layers) { const mapboxLayer = map.getLayer(layer.id) as MapboxLayer; if (mapboxLayer) { + // Mapbox's map.getLayer() had a breaking change in v3.6.0, see https://github.com/visgl/deck.gl/issues/9086 // @ts-expect-error not typed - mapboxLayer.implementation.setProps(layer.props); + const layerInstance = mapboxLayer.implementation || mapboxLayer; + layerInstance.setProps(layer.props); } else { map.addLayer( new MapboxLayer({id: layer.id, deck}), diff --git a/modules/mesh-layers/package.json b/modules/mesh-layers/package.json index 7a6d4c3f4d5..3f128cb6acc 100644 --- a/modules/mesh-layers/package.json +++ b/modules/mesh-layers/package.json @@ -3,7 +3,7 @@ "description": "deck.gl layers that loads 3D meshes or scene graphs", "license": "MIT", "type": "module", - "version": "9.0.0-beta.11", + "version": "9.1.0-alpha.0", "publishConfig": { "access": "public" }, @@ -39,13 +39,13 @@ }, "dependencies": { "@loaders.gl/gltf": "^4.2.0", - "@luma.gl/gltf": "^9.0.17", - "@luma.gl/shadertools": "^9.0.17" + "@luma.gl/gltf": "^9.1.0-alpha.19", + "@luma.gl/shadertools": "^9.1.0-alpha.19" }, "peerDependencies": { - "@deck.gl/core": "^9.0.0", - "@luma.gl/core": "^9.0.0", - "@luma.gl/engine": "^9.0.0" + "@deck.gl/core": "^9.0.0-alpha", + "@luma.gl/core": "^9.1.0-alpha.19", + "@luma.gl/engine": "^9.1.0-alpha.19" }, "gitHead": "13ace64fc2cee08c133afc882fc307253489a4e4" } diff --git a/modules/mesh-layers/src/scenegraph-layer/scenegraph-layer-fragment.glsl.ts b/modules/mesh-layers/src/scenegraph-layer/scenegraph-layer-fragment.glsl.ts index e9198db308f..a0b8373a7dd 100644 --- a/modules/mesh-layers/src/scenegraph-layer/scenegraph-layer-fragment.glsl.ts +++ b/modules/mesh-layers/src/scenegraph-layer/scenegraph-layer-fragment.glsl.ts @@ -8,21 +8,21 @@ in vec4 vColor; out vec4 fragColor; -// MODULE_PBR contains all the varying definitions needed -#ifndef MODULE_PBR +// pbrMaterial contains all the varying definitions needed +#ifndef LIGHTING_PBR #if defined(HAS_UV) && defined(HAS_BASECOLORMAP) in vec2 vTEXCOORD_0; - uniform sampler2D u_BaseColorSampler; + uniform sampler2D pbr_baseColorSampler; #endif #endif void main(void) { - #ifdef MODULE_PBR + #ifdef LIGHTING_PBR fragColor = vColor * pbr_filterColor(vec4(0)); geometry.uv = pbr_vUV; #else #if defined(HAS_UV) && defined(HAS_BASECOLORMAP) - fragColor = vColor * texture(u_BaseColorSampler, vTEXCOORD_0); + fragColor = vColor * texture(pbr_baseColorSampler, vTEXCOORD_0); geometry.uv = vTEXCOORD_0; #else fragColor = vColor; diff --git a/modules/mesh-layers/src/scenegraph-layer/scenegraph-layer-vertex.glsl.ts b/modules/mesh-layers/src/scenegraph-layer/scenegraph-layer-vertex.glsl.ts index b93bc5a6a6c..730ba2d6244 100644 --- a/modules/mesh-layers/src/scenegraph-layer/scenegraph-layer-vertex.glsl.ts +++ b/modules/mesh-layers/src/scenegraph-layer/scenegraph-layer-vertex.glsl.ts @@ -18,7 +18,7 @@ in vec3 positions; #ifdef HAS_UV in vec2 texCoords; #endif -#ifdef MODULE_PBR +#ifdef LIGHTING_PBR #ifdef HAS_NORMALS in vec3 normals; #endif @@ -27,8 +27,8 @@ in vec3 positions; // Varying out vec4 vColor; -// MODULE_PBR contains all the varying definitions needed -#ifndef MODULE_PBR +// pbrMaterial contains all the varying definitions needed +#ifndef LIGHTING_PBR #ifdef HAS_UV out vec2 vTEXCOORD_0; #endif @@ -36,7 +36,7 @@ out vec4 vColor; // Main void main(void) { - #if defined(HAS_UV) && !defined(MODULE_PBR) + #if defined(HAS_UV) && !defined(LIGHTING_PBR) vTEXCOORD_0 = texCoords; geometry.uv = texCoords; #endif @@ -47,7 +47,7 @@ void main(void) { mat3 instanceModelMatrix = mat3(instanceModelMatrixCol0, instanceModelMatrixCol1, instanceModelMatrixCol2); vec3 normal = vec3(0.0, 0.0, 1.0); - #ifdef MODULE_PBR + #ifdef LIGHTING_PBR #ifdef HAS_NORMALS normal = instanceModelMatrix * (scenegraph.sceneModelMatrix * vec4(normals, 0.0)).xyz; #endif @@ -74,7 +74,7 @@ void main(void) { } DECKGL_FILTER_GL_POSITION(gl_Position, geometry); - #ifdef MODULE_PBR + #ifdef LIGHTING_PBR // set PBR data pbr_vPosition = geometry.position.xyz; #ifdef HAS_NORMALS diff --git a/modules/mesh-layers/src/scenegraph-layer/scenegraph-layer.ts b/modules/mesh-layers/src/scenegraph-layer/scenegraph-layer.ts index b7d0580e309..50cb1e3a2e4 100644 --- a/modules/mesh-layers/src/scenegraph-layer/scenegraph-layer.ts +++ b/modules/mesh-layers/src/scenegraph-layer/scenegraph-layer.ts @@ -20,7 +20,7 @@ import {Layer, project32, picking, log} from '@deck.gl/core'; import type {Device} from '@luma.gl/core'; -import {pbr} from '@luma.gl/shadertools'; +import {pbrMaterial} from '@luma.gl/shadertools'; import {ScenegraphNode, GroupNode, ModelNode, Model} from '@luma.gl/engine'; import {GLTFAnimator, PBREnvironment, createScenegraphsFromGLTF} from '@luma.gl/gltf'; import {GLTFLoader, postProcessGLTF} from '@loaders.gl/gltf'; @@ -188,13 +188,20 @@ export default class ScenegraphLayer e }; getShaders() { - const modules = [project32, picking, scenegraphUniforms]; + const defines: {LIGHTING_PBR?: 1} = {}; + let pbr; if (this.props._lighting === 'pbr') { - modules.push(pbr); + pbr = pbrMaterial; + defines.LIGHTING_PBR = 1; + } else { + // Dummy shader module needed to handle + // pbrMaterial.pbr_baseColorSampler binding + pbr = {name: 'pbrMaterial'}; } - return super.getShaders({vs, fs, modules}); + const modules = [project32, picking, scenegraphUniforms, pbr]; + return super.getShaders({defines, vs, fs, modules}); } initializeState() { @@ -368,6 +375,11 @@ export default class ScenegraphLayer e if (node instanceof ModelNode) { const {model} = node; model.setInstanceCount(numInstances); + + const pbrProjectionProps = { + // Needed for PBR (TODO: find better way to get it) + camera: model.uniforms.cameraPosition as [number, number, number] + }; const scenegraphProps: ScenegraphProps = { sizeScale, sizeMinPixels, @@ -375,15 +387,11 @@ export default class ScenegraphLayer e composeModelMatrix: shouldComposeModelMatrix(viewport, coordinateSystem), sceneModelMatrix: worldMatrix }; - // TODO replace with shaderInputs.setProps({pbr: u_Camera}) once - // luma pbr module ported to UBO - model.setUniforms({ - // Needed for PBR (TODO: find better way to get it) - // eslint-disable-next-line camelcase - u_Camera: model.uniforms.cameraPosition - }); - model.shaderInputs.setProps({scenegraph: scenegraphProps}); + model.shaderInputs.setProps({ + pbrProjection: pbrProjectionProps, + scenegraph: scenegraphProps + }); model.draw(renderPass); } }); diff --git a/modules/mesh-layers/src/simple-mesh-layer/simple-mesh-layer.ts b/modules/mesh-layers/src/simple-mesh-layer/simple-mesh-layer.ts index d3bb5c0109f..c3ed4ec0a01 100644 --- a/modules/mesh-layers/src/simple-mesh-layer/simple-mesh-layer.ts +++ b/modules/mesh-layers/src/simple-mesh-layer/simple-mesh-layer.ts @@ -22,19 +22,11 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. -import { - Layer, - project32, - phongLighting, - picking, - DefaultProps, - log, - LayerContext, - Material -} from '@deck.gl/core'; +import {Layer, project32, picking, DefaultProps, log, LayerContext, Material} from '@deck.gl/core'; import {SamplerProps, Texture} from '@luma.gl/core'; import {Model, Geometry} from '@luma.gl/engine'; import {ParsedPBRMaterial} from '@luma.gl/gltf'; +import {phongMaterial} from '@luma.gl/shadertools'; import {MATRIX_ATTRIBUTES, shouldComposeModelMatrix} from '../utils/matrix'; @@ -229,7 +221,7 @@ export default class SimpleMeshLayer e return super.getShaders({ vs, fs, - modules: [project32, phongLighting, picking, simpleMeshUniforms] + modules: [project32, phongMaterial, picking, simpleMeshUniforms] }); } diff --git a/modules/react/package.json b/modules/react/package.json index 9668d235017..8acfb363f85 100644 --- a/modules/react/package.json +++ b/modules/react/package.json @@ -3,7 +3,7 @@ "description": "React Components for deck.gl", "license": "MIT", "type": "module", - "version": "9.0.0-beta.11", + "version": "9.1.0-alpha.0", "publishConfig": { "access": "public" }, @@ -34,7 +34,7 @@ "sideEffects": false, "scripts": {}, "peerDependencies": { - "@deck.gl/core": "^9.0.0", + "@deck.gl/core": "9.0.0-alpha.0", "react": ">=16.3.0", "react-dom": ">=16.3.0" }, diff --git a/modules/test-utils/package.json b/modules/test-utils/package.json index d68f2e52f48..57be70e7608 100644 --- a/modules/test-utils/package.json +++ b/modules/test-utils/package.json @@ -3,7 +3,7 @@ "description": "Test utilities for deck.gl layers", "license": "MIT", "type": "module", - "version": "9.0.0-beta.11", + "version": "9.1.0-alpha.0", "publishConfig": { "access": "public" }, @@ -32,12 +32,12 @@ "src" ], "dependencies": { - "@luma.gl/test-utils": "^9.0.17" + "@luma.gl/test-utils": "^9.1.0-alpha.19" }, "peerDependencies": { - "@deck.gl/core": "^9.0.0", - "@luma.gl/core": "^9.0.0", - "@luma.gl/engine": "^9.0.0", + "@deck.gl/core": "^9.1.0-alpha.0", + "@luma.gl/core": "^9.1.0-alpha.19", + "@luma.gl/engine": "^9.1.0-alpha.19", "@probe.gl/test-utils": "^4.0.0" }, "scripts": {}, diff --git a/modules/test-utils/src/utils/layer.ts b/modules/test-utils/src/utils/layer.ts index 687ccf8b561..e6c77bffaee 100644 --- a/modules/test-utils/src/utils/layer.ts +++ b/modules/test-utils/src/utils/layer.ts @@ -4,11 +4,14 @@ import {Layer} from '@deck.gl/core'; /** * Extract uniform values set for a Layer in the underlying UniformBlock store */ -export function getLayerUniforms(layer: Layer): Record { +export function getLayerUniforms(layer: Layer, blockName?: string): Record { const uniforms = {}; - const uniformBlocks = layer.getModels()[0]._uniformStore.uniformBlocks.values(); + const uniformStore = layer.getModels()[0]._uniformStore; + const uniformBlocks = blockName + ? [uniformStore.uniformBlocks.get(blockName)] + : uniformStore.uniformBlocks.values(); for (const block of uniformBlocks) { - Object.assign(uniforms, block.uniforms); + Object.assign(uniforms, block!.uniforms); } return uniforms; diff --git a/modules/test-utils/src/utils/setup-gl.ts b/modules/test-utils/src/utils/setup-gl.ts index 0f6c2934c9b..9c418094b63 100644 --- a/modules/test-utils/src/utils/setup-gl.ts +++ b/modules/test-utils/src/utils/setup-gl.ts @@ -1,16 +1,12 @@ -import {createTestContext, webglDevice, NullDevice} from '@luma.gl/test-utils'; +import {createTestDevice, webglDevice, NullDevice} from '@luma.gl/test-utils'; /** Test device */ export const device = webglDevice || new NullDevice({}); /** Test context */ -export const gl = createTestContext({ - width: 1, - height: 1, - debug: true - // throwOnFailure: false, - // throwOnError: false -}); +const testDevice = createTestDevice(); + +export const gl = webglDevice?.gl || 1; // // TODO - Seems to be an issue in luma.gl // (createContext && createContext(100, 100, {})); diff --git a/modules/widgets/package.json b/modules/widgets/package.json index 9e891adda1e..7e60e4d9bdf 100644 --- a/modules/widgets/package.json +++ b/modules/widgets/package.json @@ -3,7 +3,7 @@ "description": "UI widgets for deck.gl", "license": "MIT", "type": "module", - "version": "9.0.0-beta.11", + "version": "9.1.0-alpha.0", "publishConfig": { "access": "public" }, @@ -45,7 +45,7 @@ "preact": "^10.17.0" }, "peerDependencies": { - "@deck.gl/core": "^9.0.0" + "@deck.gl/core": "9.0.0-alpha.0" }, "gitHead": "13ace64fc2cee08c133afc882fc307253489a4e4" } diff --git a/package.json b/package.json index fd67da1dd41..85997567059 100644 --- a/package.json +++ b/package.json @@ -50,8 +50,8 @@ "devDependencies": { "@loaders.gl/csv": "^4.2.0", "@loaders.gl/polyfills": "^4.2.0", - "@luma.gl/webgpu": "^9.0.17", - "@math.gl/proj4": "^4.0.0", + "@luma.gl/webgpu": "^9.1.0-alpha.19", + "@math.gl/proj4": "^4.1.0-alpha.3", "@probe.gl/bench": "^4.0.9", "jsdom": "^20.0.0", "ocular-dev-tools": "2.0.0-alpha.33", diff --git a/test/apps/glsl-debugger/package.json b/test/apps/glsl-debugger/package.json index 30008f6e15b..215eaf24f8c 100644 --- a/test/apps/glsl-debugger/package.json +++ b/test/apps/glsl-debugger/package.json @@ -4,7 +4,7 @@ "start-local": "vite --config ../vite.config.local.mjs" }, "dependencies": { - "@luma.gl/debug": "9.0.0-beta.4", + "@luma.gl/debug": "^9.1.0-alpha.17", "deck.gl": "^8.4.0", "glsl-transpiler": "^1.8.5" }, diff --git a/test/apps/mask-first-person/package.json b/test/apps/mask-first-person/package.json index 773748afab3..aa0872475a5 100644 --- a/test/apps/mask-first-person/package.json +++ b/test/apps/mask-first-person/package.json @@ -5,7 +5,7 @@ }, "dependencies": { "deck.gl": "^8.4.0", - "@math.gl/core": "^4.0.0", + "@math.gl/core": "^4.1.0-alpha.3", "@turf/circle": "6.5.0" }, "devDependencies": { diff --git a/test/apps/multi-viewport/package.json b/test/apps/multi-viewport/package.json index a7c2bc0ded3..261f2594d36 100644 --- a/test/apps/multi-viewport/package.json +++ b/test/apps/multi-viewport/package.json @@ -5,7 +5,7 @@ }, "dependencies": { "deck.gl": "^8.4.0", - "@math.gl/core": "^4.0.0", + "@math.gl/core": "^4.1.0-alpha.3", "maplibre-gl": "^3.0.0", "react": "^18.0.0", "react-dom": "^18.0.0", diff --git a/test/modules/aggregation-layers/aggregation-layer.spec.ts b/test/modules/aggregation-layers/aggregation-layer.spec.ts index 871e233897f..021f9ee2430 100644 --- a/test/modules/aggregation-layers/aggregation-layer.spec.ts +++ b/test/modules/aggregation-layers/aggregation-layer.spec.ts @@ -19,7 +19,7 @@ // THE SOFTWARE. import test from 'tape-promise/tape'; -import AggregationLayer from '@deck.gl/aggregation-layers/aggregation-layer'; +import AggregationLayer from '@deck.gl/aggregation-layers/heatmap-layer/aggregation-layer'; import {Layer} from 'deck.gl'; import {DataFilterExtension} from '@deck.gl/extensions'; import {testLayer} from '@deck.gl/test-utils'; diff --git a/test/modules/aggregation-layers/aggregation-layer-v9/cpu-aggregator/cpu-aggregator.spec.ts b/test/modules/aggregation-layers/common/cpu-aggregator/cpu-aggregator.spec.ts similarity index 100% rename from test/modules/aggregation-layers/aggregation-layer-v9/cpu-aggregator/cpu-aggregator.spec.ts rename to test/modules/aggregation-layers/common/cpu-aggregator/cpu-aggregator.spec.ts diff --git a/test/modules/aggregation-layers/aggregation-layer-v9/cpu-aggregator/vertex-accessor.spec.ts b/test/modules/aggregation-layers/common/cpu-aggregator/vertex-accessor.spec.ts similarity index 97% rename from test/modules/aggregation-layers/aggregation-layer-v9/cpu-aggregator/vertex-accessor.spec.ts rename to test/modules/aggregation-layers/common/cpu-aggregator/vertex-accessor.spec.ts index 864d5868e29..c690898c0e3 100644 --- a/test/modules/aggregation-layers/aggregation-layer-v9/cpu-aggregator/vertex-accessor.spec.ts +++ b/test/modules/aggregation-layers/common/cpu-aggregator/vertex-accessor.spec.ts @@ -3,7 +3,7 @@ import {Attribute} from '@deck.gl/core'; import { VertexAccessor, evaluateVertexAccessor -} from '@deck.gl/aggregation-layers/aggregation-layer-v9/cpu-aggregator/vertex-accessor'; +} from '@deck.gl/aggregation-layers/common/aggregator/cpu-aggregator/vertex-accessor'; import {device} from '@deck.gl/test-utils'; test('evaluateVertexAccessor#sources', t => { diff --git a/test/modules/aggregation-layers/aggregation-layer-v9/data-sample.ts b/test/modules/aggregation-layers/common/data-sample.ts similarity index 100% rename from test/modules/aggregation-layers/aggregation-layer-v9/data-sample.ts rename to test/modules/aggregation-layers/common/data-sample.ts diff --git a/test/modules/aggregation-layers/aggregation-layer-v9/test-utils.ts b/test/modules/aggregation-layers/common/test-utils.ts similarity index 100% rename from test/modules/aggregation-layers/aggregation-layer-v9/test-utils.ts rename to test/modules/aggregation-layers/common/test-utils.ts diff --git a/test/modules/aggregation-layers/utils/color-utils.spec.ts b/test/modules/aggregation-layers/common/utils/color-utils.spec.ts similarity index 97% rename from test/modules/aggregation-layers/utils/color-utils.spec.ts rename to test/modules/aggregation-layers/common/utils/color-utils.spec.ts index 12121dbd146..95d7911699b 100644 --- a/test/modules/aggregation-layers/utils/color-utils.spec.ts +++ b/test/modules/aggregation-layers/common/utils/color-utils.spec.ts @@ -1,5 +1,5 @@ import test from 'tape-promise/tape'; -import {colorRangeToFlatArray} from '@deck.gl/aggregation-layers/utils/color-utils'; +import {colorRangeToFlatArray} from '@deck.gl/aggregation-layers/common/utils/color-utils'; test('color-utils#colorRangeToFlatArray', t => { const TESTS = [ diff --git a/test/modules/aggregation-layers/common/utils/scale-utils.spec.ts b/test/modules/aggregation-layers/common/utils/scale-utils.spec.ts new file mode 100644 index 00000000000..f524aedb144 --- /dev/null +++ b/test/modules/aggregation-layers/common/utils/scale-utils.spec.ts @@ -0,0 +1,258 @@ +import test from 'tape-promise/tape'; +import { + AttributeWithScale, + applyScaleQuantile, + applyScaleOrdinal +} from '@deck.gl/aggregation-layers/common/utils/scale-utils'; +import {device} from '@deck.gl/test-utils'; + +const QUANTILE_SCALE_TEST_CASES = [ + { + title: 'multi-values', + rangeSize: 4, + values: [1, 3, 6, 6.9, 7, 7.1, 8, 8.9, 9, 9.1, 10, 13, 14.9, 15, 15.1, 16], + results: [0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3] + }, + { + title: 'multi-values-2', + rangeSize: 8, + values: [1, 3, 6, 6.9, 7, 7.1, 8, 8.9, 9, 9.1, 10, 13, 14.9, 15, 15.1, 16], + results: [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7] + }, + { + title: 'unsorted', + rangeSize: 4, + values: [13, 7, 6, 3, 8.9, 1, 9.1, 8, 16, 7.1, 10, 15.1, 15, 14.9, 9, 6.9], + results: [2, 1, 0, 0, 1, 0, 2, 1, 3, 1, 2, 3, 3, 3, 2, 0] + }, + { + title: 'single-value', + rangeSize: 4, + values: new Array(20).fill(0), + results: new Array(20).fill(3) + }, + { + title: 'with-NaN', + rangeSize: 4, + values: [NaN, NaN, 0, NaN, 6, 3, NaN, 3, NaN, 2, 0], + results: [NaN, NaN, 0, NaN, 3, 3, NaN, 3, NaN, 1, 0] + } +]; + +const ORDINAL_SCALE_TEST_CASES = [ + { + title: 'unique-values', + values: [0.5, 1, 3, 3, 3], + results: [0, 1, 2, 2, 2] + }, + { + title: 'unsorted', + values: [3, 0.5, 1, 3, 0.5], + results: [2, 0, 1, 2, 0] + }, + { + title: 'with-NaN', + values: [NaN, NaN, 1, NaN, 0.5, NaN, 3], + results: [NaN, NaN, 1, NaN, 0, NaN, 2] + } +]; + +const ATTRIBUTE_TEST_CASES = [ + { + title: 'sequence-value', + input: { + value: new Float32Array(Array.from({length: 101}, (_, i) => i * 10)), + offset: 0, + stride: 4 + }, + length: 101, + testCases: [ + { + props: { + scaleType: 'linear', + lowerPercentile: 0, + upperPercentile: 100 + }, + expected: { + domain: null, + cutoff: null + } + }, + { + props: { + scaleType: 'linear', + lowerPercentile: 0, + upperPercentile: 90 + }, + expected: { + domain: null, + cutoff: [-Infinity, 900] + } + }, + { + props: { + scaleType: 'linear', + lowerPercentile: 10, + upperPercentile: 100 + }, + expected: { + domain: null, + cutoff: [100, Infinity] + } + }, + { + props: { + scaleType: 'quantile', + lowerPercentile: 10, + upperPercentile: 100 + }, + expected: { + domain: [0, 99], + cutoff: [10, 99] + } + } + ] + }, + { + title: 'sparse-value', + input: { + value: new Float32Array([1, 1, 1, 1, 1, 1, 1, 1, 1, 2]), + offset: 0, + stride: 4 + }, + length: 10, + testCases: [ + { + props: { + scaleType: 'quantize', + lowerPercentile: 0, + upperPercentile: 100 + }, + expected: { + domain: null, + cutoff: null + } + }, + { + props: { + scaleType: 'quantize', + lowerPercentile: 20, + upperPercentile: 80 + }, + expected: { + domain: null, + cutoff: [1, 1] + } + }, + { + props: { + scaleType: 'ordinal', + lowerPercentile: 0, + upperPercentile: 80 + }, + expected: { + domain: [0, 1], + cutoff: [0, 0] + } + }, + { + props: { + scaleType: 'ordinal', + lowerPercentile: 20, + upperPercentile: 100 + }, + expected: { + domain: [0, 1], + cutoff: [0, 1] + } + } + ] + }, + { + title: 'interleaved', + input: { + value: new Float32Array(new Array(101).fill(0).flatMap((_, i) => [Math.random(), i * 10, 1])), + offset: 4, + stride: 12 + }, + length: 101, + testCases: [ + { + props: { + scaleType: 'linear', + lowerPercentile: 10, + upperPercentile: 90 + }, + expected: { + domain: null, + cutoff: [100, 900] + } + } + ] + } +]; + +test('scale-utils#quantileScale', t => { + for (const tc of QUANTILE_SCALE_TEST_CASES) { + const output = applyScaleQuantile(new Float32Array(tc.values), tc.rangeSize); + t.deepEqual( + output.attribute.value, + tc.results, + `applyScaleQuantile ${tc.title} returned expected value` + ); + } + t.end(); +}); + +test('scale-utils#ordinalScale', t => { + for (const tc of ORDINAL_SCALE_TEST_CASES) { + const output = applyScaleOrdinal(new Float32Array(tc.values)); + t.deepEqual( + output.attribute.value, + tc.results, + `applyScaleOrdinal ${tc.title} returned expected value` + ); + } + t.end(); +}); + +test('AttributeWithScale#CPU#update', t => { + for (const {title, input, length, testCases} of ATTRIBUTE_TEST_CASES) { + const a = new AttributeWithScale(input, length); + for (const testCase of testCases) { + a.update(testCase.props); + for (const key in testCase.expected) { + t.deepEqual( + a[key], + testCase.expected[key], + `${title} ${testCase.props.scaleType} returns expected ${key}` + ); + } + } + } + t.end(); +}); + +test('AttributeWithScale#GPU#update', t => { + for (const {title, input, length, testCases} of ATTRIBUTE_TEST_CASES) { + // Simulate a binary attribute with only GPU buffer + const gpuInput = { + ...input, + value: undefined, + buffer: device.createBuffer({data: input.value}) + }; + + const a = new AttributeWithScale(gpuInput, length); + for (const testCase of testCases) { + a.update(testCase.props); + for (const key in testCase.expected) { + t.deepEqual( + a[key], + testCase.expected[key], + `${title} ${testCase.props.scaleType} returns expected ${key}` + ); + } + } + } + t.end(); +}); diff --git a/test/modules/aggregation-layers/aggregation-layer-v9/webgl-aggregator.spec.ts b/test/modules/aggregation-layers/common/webgl-aggregator.spec.ts similarity index 94% rename from test/modules/aggregation-layers/aggregation-layer-v9/webgl-aggregator.spec.ts rename to test/modules/aggregation-layers/common/webgl-aggregator.spec.ts index b4b797f9867..67a68a90684 100644 --- a/test/modules/aggregation-layers/aggregation-layer-v9/webgl-aggregator.spec.ts +++ b/test/modules/aggregation-layers/common/webgl-aggregator.spec.ts @@ -1,3 +1,4 @@ +import type {ShaderModule} from '@luma.gl/shadertools'; import test from 'tape-promise/tape'; import {Attribute} from '@deck.gl/core'; import {WebGLAggregator} from '@deck.gl/aggregation-layers'; @@ -73,6 +74,19 @@ test('WebGLAggregator#resources', t => { t.end(); }); +const uniformBlock = /* glsl */ `\ +uniform binOptionsUniforms { + float ageGroupSize; +} binOptions; +`; + +type BinOptions = {ageGroupSize: number}; +const binOptionsUniforms = { + name: 'binOptions', + vs: uniformBlock, + uniformTypes: {ageGroupSize: 'f32'} +} as const satisfies ShaderModule; + test('WebGLAggregator#1D', t => { // An aggregator that calculates: // [0] total count [1] average income [2] highest education, grouped by age @@ -84,14 +98,14 @@ test('WebGLAggregator#1D', t => { {name: 'income', format: 'float32', stepMode: 'vertex'}, {name: 'education', format: 'float32', stepMode: 'vertex'} ], + modules: [binOptionsUniforms], vs: ` - uniform float ageGroupSize; in float age; in float income; in float education; void getBin(out int binId) { - binId = int(floor(age / ageGroupSize)); + binId = int(floor(age / binOptions.ageGroupSize)); } void getValue(out vec3 value) { value = vec3(1.0, income, education); @@ -147,6 +161,7 @@ test('WebGLAggregator#1D', t => { [NaN, 25, 48, 54, 100, 145, 250, 72.5, 252.5, 107.5, 0, 127.5, 0, 40, 25], 'getResult() - mean income' ); + t.deepEqual(aggregator.getResultDomain(1), [0, 252.5], 'getResultDomain() - mean income'); t.deepEqual( @@ -155,6 +170,7 @@ test('WebGLAggregator#1D', t => { [NaN, 1, 3, 4, 5, 4, 5, 3, 3, 5, 3, 4, 1, 2, 3], 'getResult() - max education' ); + t.deepEqual(aggregator.getResultDomain(2), [1, 5], 'getResultDomain() - max education'); // Empty bin @@ -186,14 +202,14 @@ test('WebGLAggregator#2D', t => { {name: 'income', format: 'float32', stepMode: 'vertex'}, {name: 'education', format: 'float32', stepMode: 'vertex'} ], + modules: [binOptionsUniforms], vs: ` - uniform float ageGroupSize; in float age; in float income; in float education; void getBin(out ivec2 binId) { - binId.x = int(floor(age / ageGroupSize)); + binId.x = int(floor(age / binOptions.ageGroupSize)); binId.y = int(education); } void getValue(out vec2 value) { @@ -287,14 +303,14 @@ test('CPUAggregator#setNeedsUpdate', t => { {name: 'income', format: 'float32', stepMode: 'vertex'}, {name: 'education', format: 'float32', stepMode: 'vertex'} ], + modules: [binOptionsUniforms], vs: ` - uniform float ageGroupSize; in float age; in float income; in float education; void getBin(out int binId) { - binId = int(floor(age / ageGroupSize)); + binId = int(floor(age / binOptions.ageGroupSize)); } void getValue(out vec2 value) { value = vec2(income, education); diff --git a/test/modules/aggregation-layers/contour-layer/contour-layer.spec.ts b/test/modules/aggregation-layers/contour-layer/contour-layer.spec.ts index a2888e63178..0432b3ec24a 100644 --- a/test/modules/aggregation-layers/contour-layer/contour-layer.spec.ts +++ b/test/modules/aggregation-layers/contour-layer/contour-layer.spec.ts @@ -21,22 +21,17 @@ import test from 'tape-promise/tape'; import * as FIXTURES from 'deck.gl-test/data'; -import {testLayer, testInitializeLayer, generateLayerTests} from '@deck.gl/test-utils'; +import {testLayer, testLayerAsync, generateLayerTests} from '@deck.gl/test-utils'; -import {LineLayer, SolidPolygonLayer} from '@deck.gl/layers'; -import {ContourLayer} from '@deck.gl/aggregation-layers'; +import {PathLayer, SolidPolygonLayer} from '@deck.gl/layers'; +import {ContourLayer, ContourLayerProps} from '@deck.gl/aggregation-layers'; const getPosition = d => d.COORDINATES; -const CONTOURS1 = [ +const CONTOURS: ContourLayerProps['contours'] = [ {threshold: 1, color: [255, 0, 0]}, // => Isoline for threshold 1 {threshold: 5, color: [0, 255, 0]}, // => Isoline for threshold 5 {threshold: [6, 10], color: [0, 0, 255]} // => Isoband for threshold range [6, 10) ]; -const CONTOURS2 = [ - // contours count changed - {threshold: 5, color: [0, 255, 0]}, - {threshold: [6, 10], color: [0, 0, 255]} -]; test('ContourLayer', t => { const testCases = generateLayerTests({ @@ -48,10 +43,7 @@ test('ContourLayer', t => { assert: t.ok, onBeforeUpdate: ({testCase}) => t.comment(testCase.title), onAfterUpdate({layer}) { - if (layer.getNumInstances() > 0) { - const {aggregationData} = layer.state.weights.count; - t.ok(aggregationData, 'should create aggregationData'); - } + t.ok(layer.state.aggregator, 'should create aggregator'); } }); @@ -60,114 +52,137 @@ test('ContourLayer', t => { t.end(); }); -test('ContourLayer#renderSubLayer', t => { - const layer = new ContourLayer({ - id: 'contourLayer', - data: FIXTURES.points, - contours: CONTOURS1, - cellSize: 200, - getPosition - }); - - testInitializeLayer({layer, onError: t.notOk}); - - // render sublayer - const subLayers = layer.renderLayers(); - testInitializeLayer({layer: subLayers[0], onError: t.notOk}); - testInitializeLayer({layer: subLayers[1], onError: t.notOk}); - - t.ok(subLayers[0] instanceof LineLayer, 'Sublayer Line layer rendered'); - t.ok(subLayers[1] instanceof SolidPolygonLayer, 'Sublayer SolidPolygon layer rendered'); - - t.end(); -}); - -test('ContourLayer#updates', t => { - testLayer({ +test('ContourLayer#updates', async t => { + let prevState: ContourLayer['state']; + await testLayerAsync({ Layer: ContourLayer, - onError: t.notOk, testCases: [ { + title: 'Render sublayers for both iso-lines and iso-bands', props: { data: FIXTURES.points, - cellSize: 400, - contours: CONTOURS1, - getPosition, - pickable: true + gpuAggregation: true, + contours: CONTOURS, + cellSize: 200, + getPosition }, - onAfterUpdate({layer}) { - const {aggregationData} = layer.state.weights.count; - const {contourData, thresholdData} = layer.state; - - t.ok(aggregationData.length > 0, 'ContourLayer data is aggregated'); - t.ok( - Array.isArray(contourData.contourSegments) && contourData.contourSegments.length > 1, - 'ContourLayer iso-lines calculated' + onBeforeUpdate: ({testCase}) => t.comment(testCase.title), + onAfterUpdate: ({layer, subLayers}) => { + t.ok(subLayers[0] instanceof PathLayer, 'Sublayer Line layer rendered'); + t.ok(subLayers[1] instanceof SolidPolygonLayer, 'Sublayer SolidPolygon layer rendered'); + prevState = {...layer.state}; + } + }, + { + title: 'Update zOffset', + updateProps: { + zOffset: 0.1 + }, + onBeforeUpdate: ({testCase}) => t.comment(testCase.title), + onAfterUpdate: ({layer}) => { + t.is( + prevState.aggregatedValueReader, + (layer as ContourLayer).state.aggregatedValueReader, + 'aggregation not updated' + ); + t.is( + prevState.contourData, + (layer as ContourLayer).state.contourData, + 'contour data not updated' ); - t.ok( - Array.isArray(contourData.contourPolygons) && contourData.contourPolygons.length > 1, - 'ContourLayer iso-bands calculated' + } + }, + { + title: 'Update cellSize', + updateProps: { + cellSize: 300 + }, + onBeforeUpdate: ({testCase}) => t.comment(testCase.title), + onAfterUpdate: ({layer}) => { + t.not( + prevState.aggregatedValueReader, + (layer as ContourLayer).state.aggregatedValueReader, + 'aggregation is updated' ); - // contours array prop has 3 elements - t.ok( - Array.isArray(thresholdData) && thresholdData.length === 3, - 'ContourLayer threshold data is calculated' + t.not( + prevState.contourData, + (layer as ContourLayer).state.contourData, + 'contour data is recalculated' ); + prevState = {...layer.state}; } }, { + title: 'Render sublayer for iso-lines', updateProps: { - gpuAggregation: false // default value is true + contours: CONTOURS.slice(0, 1) }, - spies: ['_updateAggregation'], - onAfterUpdate({spies, layer, oldState}) { - if (oldState.gpuAggregation) { - // Under WebGL1, gpuAggregation will be false - t.ok( - spies._updateAggregation.called, - 'should re-aggregate data on gpuAggregation change' - ); - } + onBeforeUpdate: ({testCase}) => t.comment(testCase.title), + onAfterUpdate: ({layer, subLayers}) => { + t.is( + prevState.aggregatedValueReader, + (layer as ContourLayer).state.aggregatedValueReader, + 'aggregation not updated' + ); + t.not( + prevState.contourData, + (layer as ContourLayer).state.contourData, + 'contour data is recalculated' + ); + t.ok(subLayers[0] instanceof PathLayer, 'Sublayer Line layer rendered'); + t.is(subLayers.length, 1, 'Sublayer SolidPolygon layer not rendered'); + prevState = {...layer.state}; } }, { + title: 'Render sublayer for iso-bands', updateProps: { - cellSize: 500 // changed from 400 to 500 + contours: CONTOURS.slice(2, 3) }, - spies: ['_updateAggregation', '_generateContours'], - onAfterUpdate({layer, subLayers, spies}) { - t.ok(subLayers.length === 2, 'Sublayers rendered'); - - t.ok(spies._updateAggregation.called, 'should re-aggregate data on cellSize change'); - t.ok(spies._generateContours.called, 'should re-generate contours on cellSize change'); - spies._updateAggregation.restore(); - spies._generateContours.restore(); + onBeforeUpdate: ({testCase}) => t.comment(testCase.title), + onAfterUpdate: ({layer, subLayers}) => { + t.is( + prevState.aggregatedValueReader, + (layer as ContourLayer).state.aggregatedValueReader, + 'aggregation not updated' + ); + t.not( + prevState.contourData, + (layer as ContourLayer).state.contourData, + 'contour data is recalculated' + ); + t.is(subLayers.length, 1, 'Sublayer Line layer not rendered'); + t.ok(subLayers[0] instanceof SolidPolygonLayer, 'Sublayer SolidPolygon layer rendered'); + prevState = {...layer.state}; } }, { + title: 'Use CPU aggregation', updateProps: { - contours: CONTOURS2 + gpuAggregation: false }, - spies: ['_updateThresholdData', '_generateContours', '_updateAggregation'], - onAfterUpdate({subLayers, spies}) { - t.ok(subLayers.length === 2, 'Sublayers rendered'); - - t.ok( - spies._updateThresholdData.called, - 'should update threshold data on countours change' + onBeforeUpdate: ({testCase}) => t.comment(testCase.title), + onAfterUpdate: ({layer}) => { + t.not( + prevState.aggregator, + (layer as ContourLayer).state.aggregator, + 'aggregator changed' ); - t.ok(spies._generateContours.called, 'should re-generate contours on countours change'); - t.ok( - !spies._updateAggregation.called, - 'should NOT re-aggregate data on countours count change' + t.not( + prevState.aggregatedValueReader, + (layer as ContourLayer).state.aggregatedValueReader, + 'aggregation is updated' ); - - spies._updateThresholdData.restore(); - spies._generateContours.restore(); - spies._updateAggregation.restore(); + t.not( + prevState.contourData, + (layer as ContourLayer).state.contourData, + 'contour data is recalculated' + ); + prevState = {...layer.state}; } } - ] + ], + onError: t.notOk }); t.end(); diff --git a/test/modules/aggregation-layers/contour-layer/marching-squares.spec.ts b/test/modules/aggregation-layers/contour-layer/marching-squares.spec.ts index 9e1431fa57b..650705fc6be 100644 --- a/test/modules/aggregation-layers/contour-layer/marching-squares.spec.ts +++ b/test/modules/aggregation-layers/contour-layer/marching-squares.spec.ts @@ -1,8 +1,8 @@ import test from 'tape-promise/tape'; import { getCode, - getVertices, - CONTOUR_TYPE + getLines, + getPolygons } from '@deck.gl/aggregation-layers/contour-layer/marching-squares'; const GETCODE_TESTS = [ @@ -212,250 +212,219 @@ const GETCODE_TESTS = [ } ]; -const GETVERTEX_TESTS = [ +const GETLINES_TESTS = [ // ISO-LINES { - gridOrigin: [100, 200], code: 4, vertices: [ - [110, 230], - [115, 220] + [1, 1.5, 0], + [1.5, 1, 0] ] }, { - gridOrigin: [100, 200], code: 0, vertices: [] }, { - gridOrigin: [100, 200], code: 6, vertices: [ - [110, 230], - [110, 210] + [1, 1.5, 0], + [1, 0.5, 0] ] }, { - gridOrigin: [100, 200], code: 15, vertices: [] }, // non zero cellIndex { - gridOrigin: [100, 200], code: 12, x: 1, y: 1, vertices: [ - [115, 240], - [125, 240] - ], - gridSize: [3, 3] + [1.5, 2, 0], + [2.5, 2, 0] + ] }, { - gridOrigin: [100, 200], code: 9, x: 0, y: 1, vertices: [ - [110, 250], - [110, 230] - ], - gridSize: [3, 3] + [1, 2.5, 0], + [1, 1.5, 0] + ] }, // saddle cases { - gridOrigin: [100, 200], code: 5, meanCode: 1, x: 0, y: 0, vertices: [ - [105, 220], - [110, 230], - [110, 210], - [115, 220] - ], - gridSize: [3, 3] + [0.5, 1, 0], + [1, 1.5, 0], + [1, 0.5, 0], + [1.5, 1, 0] + ] }, { - gridOrigin: [100, 200], code: 5, meanCode: 0, x: 0, y: 0, vertices: [ - [105, 220], - [110, 210], - [110, 230], - [115, 220] - ], - gridSize: [3, 3] - }, + [0.5, 1, 0], + [1, 0.5, 0], + [1, 1.5, 0], + [1.5, 1, 0] + ] + } +]; +const GETPOLYGONS_TESTS = [ // ISO-BANDS { // 2222 - gridOrigin: [100, 200], code: 170, - vertices: [], - type: CONTOUR_TYPE.ISO_BANDS + vertices: [] }, { // 2122 name: 'single-triangle', - gridOrigin: [100, 200], code: 154, vertices: [ [ - [115, 220], - [115, 230], - [110, 230] + [1.5, 1, 0], + [1.5, 1.5, 0], + [1, 1.5, 0] ] - ], - type: CONTOUR_TYPE.ISO_BANDS + ] }, { // 0020 name: 'single-trapezoid', - gridOrigin: [100, 200], code: 8, cellSize: [12, 24], vertices: [ [ - [110, 212], - [114, 212], - [118, 220], - [118, 228] + [5 / 6, 0.5, 0], + [7 / 6, 0.5, 0], + [1.5, 5 / 6, 0], + [1.5, 7 / 6, 0] ] - ], - type: CONTOUR_TYPE.ISO_BANDS + ] }, { // 0220 name: 'single-rectangle', - gridOrigin: [100, 200], code: 40, cellSize: [12, 24], vertices: [ [ - [110, 212], - [114, 212], - [114, 236], - [110, 236] + [5 / 6, 0.5, 0], + [7 / 6, 0.5, 0], + [7 / 6, 1.5, 0], + [5 / 6, 1.5, 0] ] - ], - type: CONTOUR_TYPE.ISO_BANDS + ] }, { // 1111 name: 'single-rectangle', - gridOrigin: [100, 200], code: 85, - cellSize: [12, 24], vertices: [ [ - [106, 236], - [106, 212], - [118, 212], - [118, 236] + [0.5, 1.5, 0], + [0.5, 0.5, 0], + [1.5, 0.5, 0], + [1.5, 1.5, 0] ] - ], - type: CONTOUR_TYPE.ISO_BANDS + ] }, { // 2001 name: 'single-pentagon', - gridOrigin: [100, 200], code: 129, - cellSize: [12, 24], vertices: [ [ - [106, 224], - [106, 212], - [112, 212], - [114, 236], - [110, 236] + [0.5, 1, 0], + [0.5, 0.5, 0], + [1, 0.5, 0], + [7 / 6, 1.5, 0], + [5 / 6, 1.5, 0] ] - ], - type: CONTOUR_TYPE.ISO_BANDS + ] }, { // 0211 name: 'single-hexagon', - gridOrigin: [100, 200], code: 37, - cellSize: [12, 24], vertices: [ [ - [106, 224], - [106, 212], - [118, 212], - [118, 224], - [114, 236], - [110, 236] + [0.5, 1, 0], + [0.5, 0.5, 0], + [1.5, 0.5, 0], + [1.5, 1, 0], + [7 / 6, 1.5, 0], + [5 / 6, 1.5, 0] ] - ], - type: CONTOUR_TYPE.ISO_BANDS + ] }, // saddle cases { // 1010 name: 'saddle-6-sided-mean-0', - gridOrigin: [100, 200], code: 68, meanCode: 0, - cellSize: [12, 24], vertices: [ [ - [106, 236], - [106, 224], - [112, 236] + [0.5, 1.5, 0], + [0.5, 1, 0], + [1, 1.5, 0] ], [ - [112, 212], - [118, 212], - [118, 224] + [1, 0.5, 0], + [1.5, 0.5, 0], + [1.5, 1, 0] ] - ], - type: CONTOUR_TYPE.ISO_BANDS + ] }, { // 1010 name: 'saddle-6-sided-mean-0', - gridOrigin: [100, 200], code: 68, meanCode: 2, // merged with mean-code 1 - cellSize: [12, 24], vertices: [ [ - [106, 236], - [106, 224], - [112, 212], - [118, 212], - [118, 224], - [112, 236] + [0.5, 1.5, 0], + [0.5, 1, 0], + [1, 0.5, 0], + [1.5, 0.5, 0], + [1.5, 1, 0], + [1, 1.5, 0] ] - ], - type: CONTOUR_TYPE.ISO_BANDS + ] } ]; +function getValueReader(cellWeights: number[], gridSize: number[]) { + return (x: number, y: number) => cellWeights[y * gridSize[0] + x]; +} + test('MarchingSquares#getCode', t => { - const threshold = 6; - const x = 0; - const y = 0; - const gridSize = [2, 2]; - GETCODE_TESTS.forEach(testCase => { + for (const testCase of GETCODE_TESTS) { + const {cellWeights, threshold = 6, x = 0, y = 0, gridSize = [2, 2]} = testCase; + const {code, meanCode} = getCode({ - cellWeights: testCase.cellWeights, + getValue: getValueReader(cellWeights, gridSize), threshold: testCase.threshold || threshold, - x: testCase.x || x, - y: testCase.y || y, - width: testCase.gridSize ? testCase.gridSize[0] : gridSize[0], - height: testCase.gridSize ? testCase.gridSize[1] : gridSize[1] + x: x, + y: y, + xRange: [0, gridSize[0]], + yRange: [0, gridSize[1]] }); t.equals(code, testCase.code, `Code: expected=${testCase.code}, actual=${code}`); if (testCase.meanCode) { @@ -463,51 +432,27 @@ test('MarchingSquares#getCode', t => { t.equals( meanCode, testCase.meanCode, - `manCoode: expected=${testCase.meanCode}, actual=${meanCode}` + `meanCode: expected=${testCase.meanCode}, actual=${meanCode}` ); } - }); + } t.end(); }); -/* eslint-disable max-nested-callbacks */ -test('MarchingSquares#getVertices', t => { - const x = 0; - const y = 0; - const cellSize = [10, 20]; - GETVERTEX_TESTS.forEach(testCase => { - const vertices = getVertices({ - gridOrigin: testCase.gridOrigin, - x: testCase.x || x, - y: testCase.y || y, - cellSize: testCase.cellSize || cellSize, - code: testCase.code, - meanCode: testCase.meanCode, - type: testCase.type || CONTOUR_TYPE.ISO_LINES - }); - // Set z coordinate to 0 if not present. - let expectedVertices = []; - if (testCase.type === CONTOUR_TYPE.ISO_BANDS) { - testCase.vertices.forEach(polygon => { - if (!polygon) { - return; - } - const expectedPolygon = polygon.map(vertex => - vertex.length === 2 ? vertex.concat(0) : vertex - ); - expectedVertices.push(expectedPolygon); - }); - } else { - expectedVertices = testCase.vertices.map(vertex => - vertex.length === 2 ? vertex.concat(0) : vertex - ); - } - t.deepEquals( - vertices, - expectedVertices, - `Vertices: expected=${expectedVertices}, actual=${vertices}` - ); - }); +test('MarchingSquares#getLines', t => { + for (const testCase of GETLINES_TESTS) { + const {x = 0, y = 0, code, meanCode} = testCase; + const vertices = getLines({x, y, z: 0, code, meanCode}); + t.deepEquals(vertices, testCase.vertices, 'Returns expected vertices'); + } + t.end(); +}); + +test('MarchingSquares#getPolygons', t => { + for (const testCase of GETPOLYGONS_TESTS) { + const {code, meanCode} = testCase; + const vertices = getPolygons({x: 0, y: 0, z: 0, code, meanCode}); + t.deepEquals(vertices, testCase.vertices, 'Returns expected vertices'); + } t.end(); }); -/* eslint-enable max-nested-callbacks */ diff --git a/test/modules/aggregation-layers/cpu-grid-layer/cpu-grid-layer.spec.ts b/test/modules/aggregation-layers/cpu-grid-layer/cpu-grid-layer.spec.ts deleted file mode 100644 index 7d55d48c15a..00000000000 --- a/test/modules/aggregation-layers/cpu-grid-layer/cpu-grid-layer.spec.ts +++ /dev/null @@ -1,937 +0,0 @@ -// Copyright (c) 2015 - 2017 Uber Technologies, Inc. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -import test from 'tape-promise/tape'; -import {makeSpy} from '@probe.gl/test-utils'; - -import * as FIXTURES from 'deck.gl-test/data'; - -import {testLayer, testInitializeLayer, generateLayerTests} from '@deck.gl/test-utils'; - -import {GridCellLayer} from '@deck.gl/layers'; -import {CPUGridLayer} from '@deck.gl/aggregation-layers'; - -test('CPUGridLayer', t => { - const testCases = generateLayerTests({ - Layer: CPUGridLayer, - sampleProps: { - data: FIXTURES.points.slice(0, 3), - getPosition: d => d.COORDINATES - }, - assert: t.ok, - onBeforeUpdate: ({testCase}) => t.comment(testCase.title), - onAfterUpdate({layer}) { - if (layer.props.data && layer.props.data.length) { - t.ok( - layer.state.aggregatorState.layerData.data.length > 0, - 'should update state.layerData' - ); - } - } - }); - - testLayer({Layer: CPUGridLayer, testCases, onError: t.notOk}); - - t.end(); -}); - -test('CPUGridLayer#renderSubLayer', t => { - makeSpy(CPUGridLayer.prototype, '_onGetSublayerColor'); - makeSpy(CPUGridLayer.prototype, '_onGetSublayerElevation'); - - const layer = new CPUGridLayer({ - data: FIXTURES.points, - cellSize: 500, - getPosition: d => d.COORDINATES, - pickable: true - }); - - testInitializeLayer({layer, onError: t.notOk}); - - // render sublayer - const subLayer = layer.renderLayers(); - testInitializeLayer({layer: subLayer, onError: t.notOk}); - - t.ok(subLayer instanceof GridCellLayer, 'GridCellLayer rendered'); - - // should call attribute updater twice - // because test util calls both initialize and update layer - t.ok(CPUGridLayer.prototype._onGetSublayerColor.called, 'should call _onGetSublayerColor'); - t.ok( - CPUGridLayer.prototype._onGetSublayerElevation.called, - 'should call _onGetSublayerElevation' - ); - CPUGridLayer.prototype._onGetSublayerColor.restore(); - CPUGridLayer.prototype._onGetSublayerElevation.restore(); - - t.end(); -}); - -test('CPUGridLayer#updates', t => { - // assert on state property updates after layer.prop change - function assertStateUpdate(shouldUpdate, prop) { - return function onAfterUpdate({layer, oldState: oldLayerState}) { - function checkIfUpdated(state, oldState, shouldUpdateItem, previousKeys) { - if (typeof shouldUpdateItem === 'object') { - for (const key in shouldUpdateItem) { - checkIfUpdated( - state[key], - oldState[key], - shouldUpdateItem[key], - `${previousKeys}.${key}` - ); - } - } else { - t.ok( - shouldUpdateItem ? state !== oldState : state === oldState, - `update props.${prop} should ${!shouldUpdateItem ? 'not' : ''} update ${previousKeys}` - ); - } - } - - checkIfUpdated( - layer.state.aggregatorState, - oldLayerState.aggregatorState, - shouldUpdate, - 'aggregatorState' - ); - }; - } - - function getChecksForCellSizeChange() { - const shouldUpdate = { - layerData: true, - dimensions: { - fillColor: { - sortedBins: true, - valueDomain: true, - getValue: false, - scaleFunc: true - }, - elevation: { - sortedBins: true, - valueDomain: true, - getValue: false, - scaleFunc: true - } - } - }; - return assertStateUpdate(shouldUpdate, 'cellSize'); - } - function getChecksForFilterChange(triggered) { - const shouldUpdate = { - layerData: false, - dimensions: { - fillColor: { - sortedBins: triggered, - valueDomain: triggered, - getValue: triggered, - scaleFunc: triggered - }, - elevation: { - sortedBins: triggered, - valueDomain: triggered, - getValue: triggered, - scaleFunc: triggered - } - } - }; - return assertStateUpdate(shouldUpdate, '_filterData'); - } - function getChecksForPositionChange(triggerChange) { - const shouldUpdate = { - layerData: triggerChange, - dimensions: { - fillColor: { - sortedBins: triggerChange, - valueDomain: triggerChange, - getValue: false, - scaleFunc: triggerChange - }, - elevation: { - sortedBins: triggerChange, - valueDomain: triggerChange, - getValue: false, - scaleFunc: triggerChange - } - } - }; - return assertStateUpdate( - shouldUpdate, - `getPosition ${triggerChange ? 'w/' : 'w/o'} trigger change` - ); - } - function getCheckForNoBinChange(accessor, dimension) { - const update = dimension; - const noUpdate = ['fillColor', 'elevation'].find(k => k !== dimension); - const shouldUpdate = { - layerData: false, - dimensions: { - [update]: { - sortedBins: false, - valueDomain: false, - getValue: - accessor === 'getColorValue w/o trigger' || - accessor === 'getElevationValue w/o trigger', - scaleFunc: false - }, - [noUpdate]: { - sortedBins: false, - valueDomain: false, - getValue: false, - scaleFunc: false - } - } - }; - return assertStateUpdate(shouldUpdate, accessor); - } - function getCheckForTriggeredBinUpdate(accessor, dimension) { - const update = dimension; - const noUpdate = ['fillColor', 'elevation'].find(k => k !== dimension); - const shouldUpdate = { - layerData: false, - dimensions: { - [update]: { - sortedBins: true, - valueDomain: true, - getValue: true, - scaleFunc: true - }, - [noUpdate]: { - sortedBins: false, - valueDomain: false, - getValue: false, - scaleFunc: false - } - } - }; - return assertStateUpdate(shouldUpdate, accessor); - } - function getChecksForPercentileUpdate(side, dimension) { - const update = dimension; - const noUpdate = ['fillColor', 'elevation'].find(k => k !== dimension); - const shouldUpdate = { - layerData: false, - dimensions: { - [update]: { - sortedBins: false, - valueDomain: true, - getValue: false, - scaleFunc: true - }, - [noUpdate]: { - sortedBins: false, - valueDomain: false, - getValue: false, - scaleFunc: false - } - } - }; - return assertStateUpdate(shouldUpdate, `${side}Percentile`); - } - function getChecksForDomainOrRangeUpdate(prop, dimension) { - const update = dimension; - const noUpdate = ['fillColor', 'elevation'].find(k => k !== dimension); - const shouldUpdate = { - layerData: false, - dimensions: { - [update]: { - sortedBins: false, - valueDomain: false, - getValue: false, - scaleFunc: true - }, - [noUpdate]: { - sortedBins: false, - valueDomain: false, - getValue: false, - scaleFunc: false - } - } - }; - return assertStateUpdate(shouldUpdate, `${dimension}${prop}`); - } - - function getChecksForColorScaleTypeQuantize(scaleType) { - const shouldUpdate = { - dimensions: { - colorScaleType: 'quantize' - } - }; - t.ok( - shouldUpdate.dimensions.colorScaleType === scaleType, - `update aggregatorState.dimension.colorScaleType to ${scaleType}` - ); - } - - function getChecksForColorScaleTypeLinear(scaleType) { - const shouldUpdate = { - dimensions: { - colorScaleType: 'linear' - } - }; - t.ok( - shouldUpdate.dimensions.colorScaleType === scaleType, - `update aggregatorState.dimension.colorScaleType to ${scaleType}` - ); - } - - function getChecksForColorScaleTypeQuantile(scaleType) { - const shouldUpdate = { - dimensions: { - colorScaleType: 'quantile' - } - }; - t.ok( - shouldUpdate.dimensions.colorScaleType === scaleType, - `update aggregatorState.dimension.colorScaleType to ${scaleType}` - ); - } - - function getChecksForColorScaleTypeOrdinal(scaleType) { - const shouldUpdate = { - dimensions: { - colorScaleType: 'ordinal' - } - }; - return t.ok( - shouldUpdate.dimensions.colorScaleType === scaleType, - `update aggregatorState.dimension.colorScaleType to ${scaleType}` - ); - } - - testLayer({ - Layer: CPUGridLayer, - onError: t.notOk, - testCases: [ - { - props: { - data: FIXTURES.points, - cellSize: 400, - getPosition: d => d.COORDINATES, - pickable: true - }, - onAfterUpdate({layer}) { - const { - layerData, - dimensions: {fillColor, elevation} - } = layer.state.aggregatorState; - - t.ok(layerData.data.length > 0, 'aggregatorState.dimensions.layerDate calculated'); - t.ok( - fillColor.sortedBins, - 'aggregatorState.dimensions.fillColor.sortedColorBins calculated' - ); - t.ok( - elevation.sortedBins, - 'aggregatorState.dimensions.elevation.sortedColorBins calculated' - ); - t.ok( - Array.isArray(fillColor.valueDomain), - 'aggregatorState.dimensions.fillColor.valueDomain calculated' - ); - t.ok( - Array.isArray(elevation.valueDomain), - 'aggregatorState.dimensions.elevation.valueDomain calculated' - ); - t.ok( - typeof fillColor.getValue === 'function', - 'aggregatorState.dimensions.fillColor.getValue calculated' - ); - t.ok( - typeof elevation.getValue === 'function', - 'aggregatorState.dimension.elevation.getValue calculated' - ); - - t.ok( - Array.isArray(fillColor.sortedBins.aggregatedBins), - 'aggregatorState.dimension.fillColor.sortedBins.aggregatedBins calculated' - ); - t.ok( - Array.isArray(elevation.sortedBins.aggregatedBins), - 'aggregatorState.dimension.elevation.sortedBins.aggregatedBins calculated' - ); - - const firstSortedBin = fillColor.sortedBins.sortedBins[0]; - const binToCell = layerData.data.find(d => d.index === firstSortedBin.i); - - t.ok( - fillColor.sortedBins.binMap[binToCell.index] === firstSortedBin, - 'Correct aggregatorState.dimension.fillColor.sortedBins.binMap created' - ); - } - }, - { - updateProps: { - _filterData: pt => pt.SPACES >= 4 && pt.SPACES <= 10 - }, - onAfterUpdate: ({layer, oldState}) => { - getChecksForFilterChange(false)({layer, oldState}); - - const {layerData} = layer.state.aggregatorState; - const isPointFiltered = layerData.data.every(bin => bin.filteredPoints === null); - - t.ok(isPointFiltered, 'filteredPoints in bins should be reset to null'); - } - }, - { - updateProps: { - _filterData: pt => pt.SPACES >= 4 && pt.SPACES <= 10, - updateTriggers: { - _filterData: 1 - } - }, - onAfterUpdate: ({layer, oldState}) => { - getChecksForFilterChange(true)({layer, oldState}); - - const { - layerData, - dimensions: {fillColor, elevation} - } = layer.state.aggregatorState; - - const isPointFiltered = layerData.data.every(bin => - bin.filteredPoints.every(pt => pt.SPACES >= 4 && pt.SPACES <= 10) - ); - - t.ok(isPointFiltered, 'filteredPoints in bins should be correct'); - - t.ok( - fillColor.sortedBins, - 'aggregatorState.dimensions.fillColor.sortedColorBins calculated' - ); - t.ok( - elevation.sortedBins, - 'aggregatorState.dimensions.elevation.sortedColorBins calculated' - ); - } - }, - { - updateProps: { - _filterData: null, - updateTriggers: { - _filterData: 0 - } - }, - onAfterUpdate: ({layer, oldState}) => { - getChecksForFilterChange(true)({layer, oldState}); - - const {layerData} = layer.state.aggregatorState; - const isPointFiltered = layerData.data.every(bin => bin.filteredPoints === null); - - t.ok(isPointFiltered, 'filteredPoints in bins should be reset to null'); - } - }, - { - updateProps: { - cellSize: 800 - }, - onAfterUpdate: getChecksForCellSizeChange() - }, - { - updateProps: { - getPosition: d => d.COORDINATES - }, - onAfterUpdate: getChecksForPositionChange(false) - }, - { - updateProps: { - getPosition: d => d.COORDINATES, - updateTriggers: { - getPosition: 1 - } - }, - onAfterUpdate: getChecksForPositionChange(true) - }, - { - updateProps: { - getColorWeight: x => 2 - }, - onAfterUpdate: getCheckForNoBinChange('getColorWeight w/o trigger', 'fillColor') - }, - { - updateProps: { - getColorWeight: x => 2, - updateTriggers: { - getColorWeight: 1 - } - }, - onAfterUpdate: getCheckForTriggeredBinUpdate('getColorWeight w/ trigger', 'fillColor') - }, - { - updateProps: { - getColorValue: x => 2 - }, - onAfterUpdate: getCheckForNoBinChange('getColorValue w/o trigger', 'fillColor') - }, - { - updateProps: { - getColorValue: x => 2, - updateTriggers: { - getColorValue: 1 - } - }, - onAfterUpdate: getCheckForTriggeredBinUpdate('getColorValue w/ trigger', 'fillColor') - }, - { - updateProps: { - colorAggregation: 'MEAN', - getColorValue: null - }, - onAfterUpdate: getCheckForTriggeredBinUpdate( - 'colorAggregation w/o getColorValue', - 'fillColor' - ) - }, - { - updateProps: { - upperPercentile: 90 - }, - onAfterUpdate: getChecksForPercentileUpdate('upper', 'fillColor') - }, - { - updateProps: { - lowerPercentile: 90 - }, - onAfterUpdate: getChecksForPercentileUpdate('lower', 'fillColor') - }, - { - updateProps: { - colorDomain: [0, 10] - }, - onAfterUpdate: getChecksForDomainOrRangeUpdate('Domain', 'fillColor') - }, - { - updateProps: { - colorRange: [ - [1, 1, 1], - [2, 2, 2], - [3, 3, 3] - ] - }, - onAfterUpdate: getChecksForDomainOrRangeUpdate('Range', 'fillColor') - }, - { - updateProps: { - getElevationWeight: x => 2 - }, - onAfterUpdate: getCheckForNoBinChange('getElevationWeight', 'elevation') - }, - { - updateProps: { - getElevationWeight: x => 2, - updateTriggers: { - getElevationWeight: 1 - } - }, - onAfterUpdate: getCheckForTriggeredBinUpdate('getElevationWeight', 'elevation') - }, - { - updateProps: { - getElevationValue: x => 2 - }, - onAfterUpdate: getCheckForNoBinChange('getElevationValue w/o trigger', 'elevation') - }, - { - updateProps: { - getElevationValue: x => 2, - updateTriggers: { - getElevationValue: 1 - } - }, - onAfterUpdate: getCheckForTriggeredBinUpdate('getElevationValue', 'elevation') - }, - { - updateProps: { - elevationAggregation: 'MEAN', - getElevationValue: null - }, - onAfterUpdate: getCheckForTriggeredBinUpdate('elevationAggregation', 'elevation') - }, - { - updateProps: { - elevationUpperPercentile: 80 - }, - onAfterUpdate: getChecksForPercentileUpdate('elevationUpper', 'elevation') - }, - { - updateProps: { - elevationLowerPercentile: 10 - }, - onAfterUpdate: getChecksForPercentileUpdate('elevationLower', 'elevation') - }, - { - updateProps: { - elevationRange: [1, 10] - }, - onAfterUpdate: getChecksForDomainOrRangeUpdate('Range', 'elevation') - }, - { - updateProps: { - elevationDomain: [0, 10] - }, - onAfterUpdate: getChecksForDomainOrRangeUpdate('Domain', 'elevation') - }, - { - updateProps: { - colorScaleType: 'quantize' - }, - onAfterUpdate: getChecksForColorScaleTypeQuantize('quantize') - }, - { - updateProps: { - colorScaleType: 'linear' - }, - onAfterUpdate: getChecksForColorScaleTypeLinear('linear') - }, - { - updateProps: { - colorScaleType: 'quantile' - }, - onAfterUpdate: getChecksForColorScaleTypeQuantile('quantile') - }, - { - updateProps: { - colorScaleType: 'ordinal' - }, - onAfterUpdate: getChecksForColorScaleTypeOrdinal('ordinal') - } - ] - }); - - t.end(); -}); - -test('CPUGridLayer#updateTriggers', t => { - // setup spies - const SPIES = ['_onGetSublayerColor', '_onGetSublayerElevation']; - function getSublayerAttributeUpdateCheck(prop, result = {}) { - return function onAfterUpdate({subLayer, spies}) { - t.ok( - result.color ? spies._onGetSublayerColor.called : !spies._onGetSublayerColor.called, - `update ${prop} should ${result.color ? '' : 'not'} call _onGetSublayerColor` - ); - t.ok( - result.elevation - ? spies._onGetSublayerElevation.called - : !spies._onGetSublayerElevation.called, - `update ${prop} should ${result.elevation ? '' : 'not'} call _onGetSublayerElevation` - ); - }; - } - - testLayer({ - Layer: CPUGridLayer, - spies: SPIES, - onError: t.notOk, - testCases: [ - { - props: { - data: FIXTURES.points, - cellSize: 400, - getColorValue: d => 3, - getElevationValue: d => 4, - getPosition: d => d.COORDINATES - } - }, - { - updateProps: { - cellSize: 800 - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('cellSize', {color: true, elevation: true}) - }, - { - updateProps: { - opacity: 0.1 - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('opacity', {color: false, elevation: false}) - }, - { - updateProps: { - coverage: 0.1 - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('coverage', {color: false, elevation: false}) - }, - { - updateProps: { - extruded: true - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('extruded', {color: false, elevation: false}) - }, - { - updateProps: { - getColorWeight: x => 2 - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('getColorWeight w/o triggers', { - color: false, - elevation: false - }) - }, - { - updateProps: { - getColorWeight: x => 2, - updateTriggers: { - getColorWeight: 1 - } - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('getColorWeight w triggers', { - color: true, - elevation: false - }) - }, - { - updateProps: { - getColorWeight: x => 3 - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('getColorWeight w/o triggers', { - color: false, - elevation: false - }) - }, - { - updateProps: { - getColorValue: x => 2 - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('getColorValue null to assigned ', { - color: false, - elevation: false - }) - }, - // { - // updateProps: { - // getColorValue: x => 3 - // }, - // onAfterUpdate: getSublayerAttributeUpdateCheck('getColorValue w/o triggers', { - // color: false, - // elevation: false - // }) - // }, - { - updateProps: { - getColorValue: x => 4, - updateTriggers: { - getColorValue: 1 - } - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('getColorValue w triggers', { - color: true, - elevation: false - }) - }, - { - updateProps: { - getColorValue: x => 4, - updateTriggers: { - getColorValue: { - a: 1, - b: 2 - } - } - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('getColorValue w triggers as object', { - color: true, - elevation: false - }) - }, - { - updateProps: { - getColorValue: x => 4, - updateTriggers: { - getColorValue: { - a: 1, - b: 2 - } - } - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('getColorValue w triggers as object', { - color: false, - elevation: false - }) - }, - { - updateProps: { - getColorValue: x => 4, - updateTriggers: { - getColorValue: { - a: 2, - b: 2 - } - } - }, - onAfterUpdate: getSublayerAttributeUpdateCheck( - 'getColorValue w triggers as changed object', - { - color: true, - elevation: false - } - ) - }, - { - updateProps: { - upperPercentile: 90 - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('upperPercentile', { - color: true, - elevation: false - }) - }, - { - updateProps: { - lowerPercentile: 10 - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('lowerPercentile', { - color: true, - elevation: false - }) - }, - { - updateProps: { - colorDomain: [10, 20] - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('colorDomain', { - color: true, - elevation: false - }) - }, - { - updateProps: { - colorRange: [ - [1, 2, 3], - [2, 3, 4], - [3, 4, 5] - ] - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('colorRange', { - color: true, - elevation: false - }) - }, - { - updateProps: { - elevationAggregation: 'MEAN' - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('elevationAggregation', { - color: false, - elevation: true - }) - }, - { - updateProps: { - getElevationWeight: x => 2 - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('getElevationWeight w/o triggers', { - color: false, - elevation: false - }) - }, - { - updateProps: { - getElevationWeight: x => 2, - updateTriggers: { - getElevationWeight: 1, - // persist color updateTriggers to avoid triggering color update - getColorValue: 1 - } - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('getElevationWeight w triggers', { - color: true, - elevation: true - }) - }, - { - updateProps: { - getElevationWeight: x => 3 - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('getElevationWeight w/o triggers', { - color: false, - elevation: false - }) - }, - { - updateProps: { - getElevationValue: x => 2 - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('getElevationValue null to assigned', { - color: false, - elevation: false - }) - }, - { - updateProps: { - getElevationValue: x => 3 - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('getElevationValue w/o triggers', { - color: false, - elevation: false - }) - }, - { - updateProps: { - getElevationValue: x => 4, - updateTriggers: { - getElevationValue: 1, - // persist getColorValue update triggers - getColorValue: 1 - } - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('getElevationValue w triggers', { - color: false, - elevation: true - }) - }, - { - updateProps: { - elevationUpperPercentile: 90 - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('elevationUpperPercentile', { - color: false, - elevation: true - }) - }, - { - updateProps: { - elevationLowerPercentile: 10 - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('elevationLowerPercentile', { - color: false, - elevation: true - }) - }, - { - updateProps: { - elevationDomain: [10, 20] - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('elevationDomain', { - color: false, - elevation: true - }) - }, - { - updateProps: { - elevationRange: [2, 20] - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('elevationRange', { - color: false, - elevation: true - }) - } - ] - }); - - t.end(); -}); diff --git a/test/modules/aggregation-layers/gpu-cpu-aggregator.spec.ts b/test/modules/aggregation-layers/gpu-cpu-aggregator.spec.ts deleted file mode 100644 index 4d65f20e707..00000000000 --- a/test/modules/aggregation-layers/gpu-cpu-aggregator.spec.ts +++ /dev/null @@ -1,149 +0,0 @@ -import test from 'tape-promise/tape'; -import {device} from '@deck.gl/test-utils'; -import GPUGridAggregator from '@deck.gl/aggregation-layers/utils/gpu-grid-aggregation/gpu-grid-aggregator'; -import { - AGGREGATION_OPERATION, - getValueFunc -} from '@deck.gl/aggregation-layers/utils/aggregation-operation-utils'; -import {pointToDensityGridDataCPU} from '@deck.gl/aggregation-layers/cpu-grid-layer/grid-aggregator'; -import BinSorter from '@deck.gl/aggregation-layers/utils/bin-sorter'; -import { - getBoundingBox, - getGridParams -} from '@deck.gl/aggregation-layers/utils/grid-aggregation-utils'; -import {COORDINATE_SYSTEM} from '@deck.gl/core'; -import {GridAggregationData} from 'deck.gl-test/data'; -import {equals, config} from '@math.gl/core'; - -const {fixture, buildAttributes, generateRandomGridPoints} = GridAggregationData; - -function verifyResults({t, cpuResults, gpuResults, testName, skipTotalCount = false}) { - for (const name in cpuResults) { - if ( - equals(cpuResults[name][0], gpuResults[name][0]) && - (skipTotalCount || equals(cpuResults[name][3], gpuResults[name][3])) - ) { - t.pass(`${testName}: ${name} CPU and GPU results matched`); - } else { - t.fail( - `${testName}: ${name}: results didn't match cpu: ${cpuResults[name]} gpu: ${gpuResults[name]}` - ); - } - } -} - -function cpuAggregator(props, aggregationParms) { - const layerData = pointToDensityGridDataCPU(props, aggregationParms); - // const {getWeight} = opts.weights.weight1; - const {aggregation} = aggregationParms; - const getValue = getValueFunc(aggregation, x => x.weight1[0]); - const {minValue, maxValue, totalCount} = new BinSorter(layerData.data, {getValue}); - const maxMinData = new Float32Array([maxValue, 0, 0, minValue]); - const maxData = new Float32Array([maxValue, 0, 0, totalCount]); - const minData = new Float32Array([minValue, 0, 0, totalCount]); - return {minData, maxData, maxMinData}; -} - -function testAggregationOperations(opts) { - const {t, op, aggregation, params, skipTotalCount = false} = opts; - const oldEpsilon = config.EPSILON; - if (op === AGGREGATION_OPERATION.MEAN) { - // cpu: 4.692307472229004 VS gpu: 4.692307949066162 - // cpu: 4.21212100982666 VS gpu: 4.212121486663818 - config.EPSILON = 1e-6; - } - - const gpuAggregator = new GPUGridAggregator(device); - - const weight1 = Object.assign({}, params.weights.weight1, {operation: op}); - const maxMinweight = Object.assign({}, weight1, {combineMaxMin: true}); - const aggregationOpts = Object.assign({}, params, {weights: {weight1}}); - - // const props = Object.assign({}, fixture, pointsData); - const cpuResults = cpuAggregator( - { - data: params.data - }, - { - aggregation, - viewport: fixture.moduleSettings.viewport, - gridOffset: params.gridOffset || {xOffset: params.cellSize[0], yOffset: params.cellSize[1]}, - projectPoints: params.projectPoints, - attributes: params.attributes, - posOffset: params.posOffset, - numInstances: params.vertexCount - } - ); - let results = gpuAggregator.run(aggregationOpts); - - const gpuResults = { - minData: results.weight1.minBuffer.getData(), - maxData: results.weight1.maxBuffer.getData() - }; - results = gpuAggregator.run(Object.assign(aggregationOpts, {weights: {weight1: maxMinweight}})); - gpuResults.maxMinData = results.weight1.maxMinBuffer.getData(); - - // Compare aggregation details for each grid-cell, total count and max count. - verifyResults({t, cpuResults, gpuResults, testName: aggregation, skipTotalCount}); - config.EPSILON = oldEpsilon; -} - -// TODO - luma v9 disabled test -test.skip('Aggregation#ScreenSpace', t => { - const data = generateRandomGridPoints(5000); - const {weights} = fixture; - const params = Object.assign({posOffset: [0, 0]}, fixture, buildAttributes({data, weights}), { - data - }); - - for (const aggregation in AGGREGATION_OPERATION) { - testAggregationOperations({t, aggregation, op: AGGREGATION_OPERATION[aggregation], params}); - } - t.end(); -}); - -// TODO - luma v9 disabled test -test.skip('Aggregation#WorldSpace', t => { - const cellSize = 800; // meters - const coordinateSystem = COORDINATE_SYSTEM.LNGLAT; - const data = generateRandomGridPoints(5000); - const {weights, moduleSettings} = fixture; - const {viewport} = moduleSettings; - const {attributes, vertexCount} = buildAttributes({data, weights}); - const boundingBox = getBoundingBox(attributes, vertexCount); - const {gridOffset, translation, numCol, numRow} = getGridParams( - boundingBox, - cellSize, - viewport, - coordinateSystem - ); - - for (const aggregation in AGGREGATION_OPERATION) { - testAggregationOperations({ - t, - aggregation, - op: AGGREGATION_OPERATION[aggregation], - // TODO - This is failing in headless browser test. Might be related to - // https://github.com/visgl/deck.gl/issues/3156 - skipTotalCount: true, - params: { - data, - cellSize: [gridOffset.xOffset, gridOffset.yOffset], - weights, - gridOffset, - projectPoints: false, - attributes, - viewport, - translation, - posOffset: translation.slice(), - numCol, - numRow, - scaling: [0, 0, 0], - vertexCount, - moduleSettings, - boundingBox - } - }); - } - t.end(); -}); diff --git a/test/modules/aggregation-layers/gpu-grid-layer/gpu-grid-cell-layer-vertex.spec.ts b/test/modules/aggregation-layers/gpu-grid-layer/gpu-grid-cell-layer-vertex.spec.ts deleted file mode 100644 index 47a927316e2..00000000000 --- a/test/modules/aggregation-layers/gpu-grid-layer/gpu-grid-cell-layer-vertex.spec.ts +++ /dev/null @@ -1,103 +0,0 @@ -import test from 'tape-promise/tape'; -// import VS from '@deck.gl/aggregation-layers/gpu-grid-layer/gpu-grid-cell-layer-vertex.glsl'; -import {getQuantizeScale} from '@deck.gl/aggregation-layers/utils/scale-utils'; -import {project32, gouraudLighting, picking} from '@deck.gl/core'; -import {device} from '@deck.gl/test-utils'; -import {Transform} from '@luma.gl/engine'; -import {equals, config} from '@math.gl/core'; - -test('gpu-grid-cell-layer-vertex#quantizeScale', t => { - if (!Transform.isSupported(device)) { - t.comment('Transform not supported skipping the test'); - t.end(); - return; - } - - // TODO: remove this duplication using `inject` (blocked due to UBO binding.) - const vs = `\ -#define RANGE_COUNT 6 -#define ROUNDING_ERROR 0.00001 -in float inValue; -uniform vec2 domain; -out vec4 outColor; -uniform vec4 colorRange[RANGE_COUNT]; -vec4 quantizeScale(vec2 domain, vec4 range[RANGE_COUNT], float value) { - vec4 outColor = vec4(-1., 0., 0., 0.); - if (value >= (domain.x - ROUNDING_ERROR) && value <= (domain.y + ROUNDING_ERROR)) { - float domainRange = domain.y - domain.x; - if (domainRange <= 0.) { - outColor = colorRange[0]; - } else { - float rangeCount = float(RANGE_COUNT); - float rangeStep = domainRange / rangeCount; - float idx = floor(((value - domain.x) / rangeStep) + ROUNDING_ERROR); - idx = clamp(idx, 0., rangeCount - 1.); - int intIdx = int(idx); - outColor = colorRange[intIdx]; - } - } - outColor = outColor / 255.; - return outColor; -} - -void main(void) { - outColor = quantizeScale(domain, colorRange, inValue); -} -`; - - // const inject = { - // 'vs:#decl': ` - // in float inValue; - // uniform vec2 domain; - // out vec4 outColor; - // `, - // 'vs:#main-start': ' if (true) { outColor = quantizeScale(domain, colorRange, inValue); } else {\n', - // 'vs:#main-end': ' }\n' - // }; - const values = [2, 2, 2, 2, 2, 2, 20.999998092651367, 2, 20, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2]; - const valueBuffer = device.createBuffer(new Float32Array(values)); - const outBuffer = device.createBuffer(values.length * 4 * 4); - const domain = [2, 20.999998092651367]; - const colorRange = [ - [0, 0, 0, 0], - [1, 1, 1, 1], - [2, 2, 2, 2], - [3, 3, 3, 3], - [4, 4, 4, 4], - [5, 5, 5, 5] - ]; - const cpuFunc = getQuantizeScale(domain, colorRange); - const expected = []; - values.forEach(v => { - cpuFunc(v).forEach(vv => expected.push(vv)); - }); - const colorRangeUniform = []; - colorRange.forEach(color => { - const c = color.map(v => v); - colorRangeUniform.push(c[0] * 255, c[1] * 255, c[2] * 255, c[3] * 255); - }); - const transform = new Transform(device, { - sourceBuffers: { - inValue: valueBuffer - }, - vs, - modules: [project32, gouraudLighting, picking], - // inject, - feedbackBuffers: { - outColor: outBuffer - }, - varyings: ['outColor'], - elementCount: values.length - }); - transform.run({uniforms: {colorRange: colorRangeUniform, domain}}); - const result = transform.getData({varyingName: 'outColor'}); - const oldEpsilon = config.EPSILON; - config.EPSILON = 1e-6; - if (equals(expected, result)) { - t.pass(`quantizeScale: returned correct value`); - } else { - t.fail(`quantizeScale: should return correct value`); - } - config.EPSILON = oldEpsilon; - t.end(); -}); diff --git a/test/modules/aggregation-layers/gpu-grid-layer/gpu-grid-cell-layer.spec.ts b/test/modules/aggregation-layers/gpu-grid-layer/gpu-grid-cell-layer.spec.ts deleted file mode 100644 index 1bf6f45eb57..00000000000 --- a/test/modules/aggregation-layers/gpu-grid-layer/gpu-grid-cell-layer.spec.ts +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright (c) 2015 - 2019 Uber Technologies, Inc. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -import test from 'tape-promise/tape'; -import {testLayer, testInitializeLayer} from '@deck.gl/test-utils'; -import GPUGridCellLayer from '@deck.gl/aggregation-layers/gpu-grid-layer/gpu-grid-cell-layer'; -import {setupSpysForWebGL1, restoreSpies} from './webgl1-spies-utils'; -import {device} from '@deck.gl/test-utils'; - -const SAMPLE_BUFFER = device.createBuffer({}); -const SAMPLE_PROPS = { - data: { - attributes: { - color: { - aggregationBuffer: SAMPLE_BUFFER - }, - elevation: { - aggregationBuffer: SAMPLE_BUFFER - } - } - }, - colorMaxMinBuffer: SAMPLE_BUFFER, - elevationMaxMinBuffer: SAMPLE_BUFFER -}; - -test('GPUGridCellLayer#initializeState', t => { - const deviceSpies = setupSpysForWebGL1(device); - const layer = new GPUGridCellLayer(SAMPLE_PROPS); - - testInitializeLayer({layer, onError: t.notOk}); - - t.ok(layer.state.model, 'should set state.model'); - - restoreSpies(deviceSpies); - t.end(); -}); - -test('GPUGridCellLayer#updates', t => { - const deviceSpies = setupSpysForWebGL1(device); - - testLayer({ - Layer: GPUGridCellLayer, - onError: t.notOk, - testCases: [ - { - props: SAMPLE_PROPS, - onAfterUpdate({layer}) { - t.ok(layer.state.model, 'should set state.model'); - } - }, - { - updateProps: { - cellSize: 123 - }, - onAfterUpdate({layer, spies}) { - t.equal(layer.state.model.uniforms.cellSize, 123, 'cellSize uniform should get updated'); - } - } - ] - }); - - restoreSpies(deviceSpies); - t.end(); -}); diff --git a/test/modules/aggregation-layers/grid-aggregation-layer.spec.ts b/test/modules/aggregation-layers/grid-aggregation-layer.spec.ts deleted file mode 100644 index c7ceeacc1c4..00000000000 --- a/test/modules/aggregation-layers/grid-aggregation-layer.spec.ts +++ /dev/null @@ -1,454 +0,0 @@ -// Copyright (c) 2015 - 2019 Uber Technologies, Inc. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -import test from 'tape-promise/tape'; -import GridAggregationLayer from '@deck.gl/aggregation-layers/grid-aggregation-layer'; -import GPUGridAggregator from '@deck.gl/aggregation-layers/utils/gpu-grid-aggregation/gpu-grid-aggregator'; -import { - AGGREGATION_OPERATION, - getValueFunc -} from '@deck.gl/aggregation-layers/utils/aggregation-operation-utils'; -import {Layer} from 'deck.gl'; -import {testLayer, device} from '@deck.gl/test-utils'; -import {GridAggregationData} from 'deck.gl-test/data'; -import {equals} from '@math.gl/core'; -import {GL} from '@luma.gl/constants'; - -const BASE_LAYER_ID = 'composite-layer-id'; -const PROPS = { - cellSize: 10, - prop1: 5 -}; - -class TestLayer extends Layer { - initializeState() {} -} - -TestLayer.layerName = 'TestLayer'; - -const DIMENSIONS = { - data: { - props: ['cellSize'] - }, - weights: { - props: ['aggregation'], - accessors: ['getWeight'] - } -}; - -// Sample layer to test GridAggregationLayer, performs screen space aggregation -class TestGridAggregationLayer extends GridAggregationLayer { - initializeState() { - super.initializeAggregationLayer({ - dimensions: DIMENSIONS - }); - this.setState({ - weights: { - count: { - needMax: true, - size: 1, - maxBuffer: device.createBuffer({ - byteLength: 4 * 4, - accessor: {size: 4, type: GL.FLOAT, divisor: 1} - }) - } - }, - positionAttributeName: 'positions', - projectPoints: true, - posOffset: [0, 0], - translation: [1, -1] - }); - const attributeManager = this.getAttributeManager(); - attributeManager.add({ - positions: { - size: 3, - accessor: 'getPosition', - type: GL.DOUBLE, - fp64: this.use64bitPositions() - }, - count: {size: 3, accessor: 'getWeight'} - }); - } - - renderLayers() { - return [ - new TestLayer(this.getSubLayerProps(), { - scale: this.state.scale - }) - ]; - } - - updateState(opts) { - super.updateState(opts); - } - - finalizeState() { - super.finalizeState(); - - const {gpuGridAggregator} = this.state; - const {aggregationBuffer, maxBuffer} = this.state.weights.count; - gpuGridAggregator.delete(); - if (aggregationBuffer) { - aggregationBuffer.delete(); - } - if (maxBuffer) { - maxBuffer.delete(); - } - } - - // Aggregation Overrides - - updateResults({aggregationData, maxData}) { - const {count} = this.state.weights; - count.aggregationData = aggregationData; - count.maxData = maxData; - this.setState({cpuResults: {aggregationData, maxData}}); - } - - /* eslint-disable complexity, max-statements */ - updateAggregationState(opts) { - const cellSize = opts.props.cellSize; - const cellSizeChanged = opts.oldProps.cellSize !== cellSize; - - let gpuAggregation = opts.props.gpuAggregation; - if (this.state.gpuAggregation !== opts.props.gpuAggregation) { - if (gpuAggregation && !GPUGridAggregator.isSupported(this.context.device)) { - gpuAggregation = false; - } - } - const gpuAggregationChanged = gpuAggregation !== this.state.gpuAggregation; - this.setState({ - gpuAggregation - }); - - const {dimensions} = this.state; - const {data, weights} = dimensions; - const aggregationDataDirty = - this.isAttributeChanged('positions') || - gpuAggregationChanged || - this.isAggregationDirty(opts, { - compareAll: gpuAggregation, // check for all (including extentions props) when using gpu aggregation - dimension: data - }); - const aggregationWeightsDirty = this.isAggregationDirty(opts, {dimension: weights}); - - this.setState({ - aggregationDataDirty, - aggregationWeightsDirty - }); - - const {viewport} = this.context; - - if (cellSizeChanged) { - const {width, height} = viewport; - const numCol = Math.ceil(width / cellSize); - const numRow = Math.ceil(height / cellSize); - this.allocateResources(numRow, numCol); - this.setState({ - // transformation from clipspace to screen(pixel) space - scaling: [width / 2, -height / 2, 1], - - gridOffset: {xOffset: cellSize, yOffset: cellSize}, - width, - height, - numCol, - numRow - }); - } - - if (aggregationWeightsDirty) { - this._updateAccessors(opts); - } - if (aggregationDataDirty || aggregationWeightsDirty) { - this._resetResults(); - } - } - /* eslint-enable complexity, max-statements */ - - // Private - - _updateAccessors(opts) { - const {getWeight, aggregation, data} = opts.props; - const {count} = this.state.weights; - if (count) { - count.getWeight = getWeight; - count.operation = AGGREGATION_OPERATION[aggregation]; - } - this.setState({getValue: getValueFunc(aggregation, getWeight, {data})}); - } - - _resetResults() { - const {count} = this.state.weights; - if (count) { - count.aggregationData = null; - count.maxData = null; - } - } -} - -TestGridAggregationLayer.defaultProps = { - cellSize: {type: 'number', min: 1, max: 1000, value: 1000}, - getPosition: {type: 'accessor', value: x => x.position}, - getWeight: {type: 'accessor', value: x => 1}, - gpuAggregation: true, - aggregation: 'SUM' -}; -TestGridAggregationLayer.layerName = 'TestGridAggregationLayer'; - -const {fixture} = GridAggregationData; - -test('GridAggregationLayer#constructor', t => { - const layer = new TestGridAggregationLayer(Object.assign({id: BASE_LAYER_ID}, PROPS)); - t.ok(layer, 'AggregationLayer created'); - t.end(); -}); - -function verifyAggregationResults(t, {layer, gpu}) { - const {cpuResults} = layer.state; - let gpuResults; - if (gpu) { - const {aggregationBuffer, maxBuffer} = layer.state.weights.count; - gpuResults = { - aggregationData: aggregationBuffer.getData(), - maxData: maxBuffer.getData() - }; - layer.setState({gpuResults}); - } - t.ok( - gpu ? gpuResults.aggregationData : cpuResults.aggregationData, - 'should calculate aggregationData' - ); -} - -function compareAggregationResults(t, layer) { - const {cpuResults, gpuResults} = layer.state; - t.ok( - equals( - filterEmptyChannels(cpuResults.aggregationData), - filterEmptyChannels(gpuResults.aggregationData), - 1e-6 - ), - 'aggregationData should match' - ); - t.ok( - equals(filterEmptyChannels(cpuResults.maxData), filterEmptyChannels(gpuResults.maxData)), - 'maxData should match' - ); - - // DEBUG - // logNonZero('cpu : aggregation', cpuResults.aggregationData); - // logNonZero('gpu : aggregation', gpuResults.aggregationData); - // logNonZero('cpu : max', cpuResults.maxData); - // logNonZero('gpu : max', gpuResults.maxData); - - // clear cpuResults - layer.setState({cpuResults: null, gpuResults: null}); -} - -function getTestCases(t, updateProps) { - return [ - { - updateProps: Object.assign({}, updateProps, {gpuAggregation: false}), - onAfterUpdate({layer}) { - verifyAggregationResults(t, {layer, gpu: false}); - } - }, - { - updateProps: Object.assign({gpuAggregation: true}), - onAfterUpdate({layer}) { - verifyAggregationResults(t, {layer, gpu: true}); - compareAggregationResults(t, layer); - } - } - ]; -} - -test('GridAggregationLayer#state updates', t => { - let testCases = [ - { - props: { - data: fixture.data, - getWeight: x => x.weight1[0], - aggregation: 'SUM', - cellSize: 50, - gpuAggregation: false - }, - onAfterUpdate({layer, spies}) { - verifyAggregationResults(t, {layer, gpu: false}); - } - }, - { - updateProps: { - gpuAggregation: true - }, - spies: [ - 'updateAggregationState', - '_updateAggregation', - '_updateWeightBins', - '_uploadAggregationResults' - ], - onAfterUpdate({layer, spies}) { - t.ok(spies.updateAggregationState.called, 'should call updateAggregationState'); - if (GPUGridAggregator.isSupported(layer.context.device)) { - t.comment('GPU Aggregation is supported'); - t.ok(spies._updateAggregation.called, 'should call _updateAggregation'); - t.notOk( - spies._updateWeightBins.called, - 'should not call _updateWeightBins for GPU aggregation' - ); - t.ok(layer.state.gpuAggregation, 'should set gpuAggregation'); - - verifyAggregationResults(t, {layer, gpu: true}); - compareAggregationResults(t, layer); - } else { - t.notOk(layer.state.gpuAggregation, 'gpuAggregation should be false when not supported'); - } - } - }, - { - updateProps: { - // switch to CPU Aggregation - gpuAggregation: false - }, - spies: ['_updateAggregation', '_updateWeightBins', '_uploadAggregationResults'], - onAfterUpdate({layer, spies}) { - // applicable only when switching from GPU to CPU - if (GPUGridAggregator.isSupported(layer.context.device)) { - t.ok(spies._updateAggregation.called, 'should call _updateAggregation'); - t.ok(spies._updateWeightBins.called, 'should call _updateWeightBins'); - t.ok(spies._uploadAggregationResults.called, 'should call _uploadAggregationResults'); - t.notOk(layer.state.gpuAggregation, 'gpuAggregation should be set to false'); - } - } - }, - { - updateProps: { - updateTriggers: { - all: 1 - } - }, - spies: ['_updateAggregation', '_updateWeightBins', '_uploadAggregationResults'], - onAfterUpdate({layer, spies}) { - // Should re do the aggregation. - t.ok(spies._updateAggregation.called, 'should call _updateAggregation'); - t.ok(spies._updateWeightBins.called, 'should call _updateWeightBins'); - t.ok(spies._uploadAggregationResults.called, 'should call _uploadAggregationResults'); - t.notOk(layer.state.gpuAggregation, 'gpuAggregation should be set to false'); - } - }, - { - updateProps: { - // only chnage weight accessor - updateTriggers: { - getWeight: 1 - } - }, - spies: ['_updateAggregation', '_updateWeightBins'], - onAfterUpdate({layer, spies}) { - t.notOk(spies._updateAggregation.called, 'should not call _updateAggregation'); - t.ok(spies._updateWeightBins.called, 'should call _updateWeightBins'); - t.notOk(layer.state.gpuAggregation, 'gpuAggregation should be set to false'); - } - }, - { - updateProps: { - // while in CPU aggregation change weight prop - aggregation: 'MAX' - }, - spies: ['_updateAggregation', '_updateWeightBins', '_uploadAggregationResults'], - onAfterUpdate({layer, spies}) { - t.notOk( - spies._updateAggregation.called, - 'should not call _updateAggregation when only weight changed' - ); - t.ok(spies._updateWeightBins.called, 'should call _updateWeightBins'); - t.ok(spies._uploadAggregationResults.called, 'should call _uploadAggregationResults'); - } - }, - { - updateProps: { - // switch to GPU aggregation - gpuAggregation: true - } - }, - { - updateProps: { - // while in GPU aggregation change weight prop - aggregation: 'MEAN' - }, - spies: ['_updateAggregation', '_updateWeightBins', '_uploadAggregationResults'], - onAfterUpdate({layer, spies}) { - if (GPUGridAggregator.isSupported(layer.context.device)) { - t.ok(spies._updateAggregation.called, 'should not call _updateAggregation'); - t.notOk(spies._updateWeightBins.called, 'should not call _updateWeightBins'); - } else { - // weight dimenstion changed while in CPU aggregation - t.notOk(spies._updateAggregation.called, 'should not call _updateAggregation'); - t.ok(spies._updateWeightBins.called, 'should not call _updateWeightBins'); - t.notOk(layer.state.gpuAggregation, 'gpuAggregation should be false when not supported'); - } - } - } - ]; - - if (GPUGridAggregator.isSupported(device)) { - testCases = testCases.concat([ - ...getTestCases(t, {cellSize: 60, aggregation: 'SUM'}), - ...getTestCases(t, {aggregation: 'MAX'}), - ...getTestCases(t, {aggregation: 'MIN'}), - ...getTestCases(t, {aggregation: 'MEAN'}) - ]); - } - - testLayer({ - Layer: TestGridAggregationLayer, - onError: t.notOk, - viewport: fixture.moduleSettings.viewport, - testCases - }); - - t.end(); -}); - -function filterEmptyChannels(inArray) { - const outArray = []; - for (let i = 0; i < inArray.length; i += 4) { - if (inArray[i + 3] > 0) { - // something is being rendered to this pixel - outArray.push(inArray[i], inArray[i + 3]); - } - } - return outArray; -} - -// DEBUG ONLY -/* eslint-disable no-console, no-undef */ -// function logNonZero(name, array) { -// console.log(`${name}: length: ${array.length}`); -// for (let i = 0; i < array.length; i += 4) { -// // if (i*4 === 4143988) { -// // console.log(`==> ${i}: ${array[i*4]} ${array[i*4 + 1]} ${array[i*4 + 2]} ${array[i*4 + 3]}`); -// // } -// if (array[i + 3] > 0) { -// console.log(`${i}: ${array[i]} ${array[i + 1]} ${array[i + 2]} ${array[i + 3]}`); -// } -// } -// } -/* eslint-enable no-console, no-undef */ diff --git a/test/modules/aggregation-layers/grid-aggregator.spec.ts b/test/modules/aggregation-layers/grid-aggregator.spec.ts deleted file mode 100644 index f50824fc20c..00000000000 --- a/test/modules/aggregation-layers/grid-aggregator.spec.ts +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright (c) 2015 - 2017 Uber Technologies, Inc. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -import test from 'tape-promise/tape'; - -import * as FIXTURES from 'deck.gl-test/data'; - -import {pointToDensityGridDataCPU} from '@deck.gl/aggregation-layers/cpu-grid-layer/grid-aggregator'; - -const getPosition = d => d.COORDINATES; -const {points, sampleViewport} = FIXTURES; -const iterableData = new Set(points); -const cellSize = 500; -function getAccessor() { - return {size: 3}; -} - -test('pointToDensityGridDataCPU', t => { - // fill with some dummy data - const positions = new Array(iterableData.size * 3); - const props = { - data: iterableData, - cellSize, - getPosition - }; - const aggregationParams = { - attributes: {positions: {value: positions, getAccessor}}, - numInstances: iterableData.size, - viewport: sampleViewport - }; - t.ok( - typeof pointToDensityGridDataCPU(props, aggregationParams) === 'object', - 'should work with iterables' - ); - t.end(); -}); diff --git a/test/modules/aggregation-layers/grid-layer.spec.ts b/test/modules/aggregation-layers/grid-layer.spec.ts index ff9919e4d9b..dcd8448d68c 100644 --- a/test/modules/aggregation-layers/grid-layer.spec.ts +++ b/test/modules/aggregation-layers/grid-layer.spec.ts @@ -20,7 +20,7 @@ import test from 'tape-promise/tape'; import {testLayer, generateLayerTests} from '@deck.gl/test-utils'; -import {GridLayer, _GPUGridAggregator as GPUGridAggregator} from '@deck.gl/aggregation-layers'; +import {GridLayer, WebGLAggregator, CPUAggregator} from '@deck.gl/aggregation-layers'; import * as FIXTURES from 'deck.gl-test/data'; import {device} from '@deck.gl/test-utils'; @@ -37,7 +37,7 @@ test('GridLayer', t => { assert: t.ok, onBeforeUpdate: ({testCase}) => t.comment(testCase.title), onAfterUpdate({layer}) { - t.ok(layer.state.useGPUAggregation !== undefined, 'should update state.useGPUAggregation'); + t.ok(layer.state.aggregator, 'should have aggregator'); } }); @@ -46,9 +46,9 @@ test('GridLayer', t => { t.end(); }); -test('GridLayer#updates', t => { - if (!GPUGridAggregator.isSupported(device)) { - t.comment('GPUGridLayer not supported, skipping'); +test('GridLayer#getAggregatorType', t => { + if (!WebGLAggregator.isSupported(device)) { + t.comment('GPU aggregation not supported, skipping'); t.end(); return; } @@ -57,112 +57,50 @@ test('GridLayer#updates', t => { onError: t.notOk, testCases: [ { + title: 'Default', props: SAMPLE_PROPS, onAfterUpdate({layer}) { - t.ok(layer.state.useGPUAggregation === false, 'By default should use CPU Aggregation'); - } - }, - { - updateProps: { - gpuAggregation: true - }, - onAfterUpdate({layer}) { - t.ok( - layer.state.useGPUAggregation === true, - 'Should use GPU Aggregation (gpuAggregation: true)' - ); - } - }, - { - updateProps: { - upperPercentile: 90 - }, - onAfterUpdate({layer, subLayers, spies}) { - t.ok( - layer.state.useGPUAggregation === false, - 'Should use CPU Aggregation (upperPercentile: 90)' - ); - } - }, - { - updateProps: { - upperPercentile: 100 - }, - onAfterUpdate({layer, subLayers, spies}) { - t.ok( - layer.state.useGPUAggregation === true, - 'Should use GPU Aggregation (upperPercentile: 100)' - ); - } - }, - { - updateProps: { - gpuAggregation: false - }, - onAfterUpdate({layer, subLayers, spies}) { t.ok( - layer.state.useGPUAggregation === false, - 'Should use CPU Aggregation (gpuAggregation: false)' + layer.state.aggregator instanceof CPUAggregator, + 'By default should use CPU Aggregation' ); } }, { + title: 'Enable gpuAggregation', updateProps: { gpuAggregation: true }, - onAfterUpdate({layer, subLayers, spies}) { + onAfterUpdate({layer}) { t.ok( - layer.state.useGPUAggregation === true, + layer.state.aggregator instanceof WebGLAggregator, 'Should use GPU Aggregation (gpuAggregation: true)' ); } }, { + title: 'fallback to CPU aggregation', updateProps: { - colorAggregation: 'MEAN' + getColorValue: points => points.length }, onAfterUpdate({layer, subLayers, spies}) { t.ok( - layer.state.useGPUAggregation === true, - 'Should use GPU Aggregation (gpuAggregation: true)' + layer.state.aggregator instanceof CPUAggregator, + 'Should use CPU Aggregation (getColorValue)' ); } }, { + title: 'fallback to CPU aggregation', updateProps: { - getElevationValue: points => points.length, - updateTriggers: { - getElevationValue: 1 - } + getElevationValue: points => points.length }, onAfterUpdate({layer, subLayers, spies}) { t.ok( - layer.state.useGPUAggregation === false, + layer.state.aggregator instanceof CPUAggregator, 'Should use CPU Aggregation (getElevationValue)' ); } - }, - { - updateProps: { - colorScaleType: 'quantile' - }, - onAfterUpdate({layer, subLayers, spies}) { - t.ok( - layer.state.useGPUAggregation === false, - "Should use CPU Aggregation (colorScaleType: 'quantile')" - ); - } - }, - { - updateProps: { - colorScaleType: 'ordinal' - }, - onAfterUpdate({layer, subLayers, spies}) { - t.ok( - layer.state.useGPUAggregation === false, - "Should use CPU Aggregation (colorScaleType: 'ordinal')" - ); - } } ] }); @@ -174,19 +112,20 @@ test('GridLayer#non-iterable data', t => { length: 3, positions: FIXTURES.points.slice(0, 3).flatMap(d => d.COORDINATES), weights: FIXTURES.points.slice(0, 3).map(d => d.SPACES) - }; + } as const; testLayer({ Layer: GridLayer, onError: t.notOk, testCases: [ { + title: 'Non-iterable data with constant weights', props: { data: dataNonIterable, - radius: 400, - getPosition: (_, {index, data}) => [ - data.positions[index * 2], - data.positions[index * 2 + 1] + cellSize: 400, + getPosition: (_, {index}) => [ + dataNonIterable.positions[index * 2], + dataNonIterable.positions[index * 2 + 1] ], getColorWeight: 1, getElevationWeight: 1 @@ -196,14 +135,15 @@ test('GridLayer#non-iterable data', t => { } }, { + title: 'Non-iterable data with accessors', updateProps: { getColorWeight: (_, {index, data}) => { t.ok(Number.isFinite(index) && data, 'point index and context are populated'); - return data.weights[index * 2]; + return (data as any).weights[index * 2]; }, getElevationWeight: (_, {index, data}) => { t.ok(Number.isFinite(index) && data, 'point index and context are populated'); - return data.weights[index * 2]; + return (data as any).weights[index * 2]; }, updateTriggers: { getColorWeight: 1, @@ -215,6 +155,7 @@ test('GridLayer#non-iterable data', t => { } }, { + title: 'Non-iterable data with custom aggregation', updateProps: { getColorValue: (points, {indices, data: {weights}}) => { t.ok(indices && weights, 'context is populated'); diff --git a/test/modules/aggregation-layers/hexagon-aggregator.spec.ts b/test/modules/aggregation-layers/hexagon-aggregator.spec.ts deleted file mode 100644 index 3dfff9abf00..00000000000 --- a/test/modules/aggregation-layers/hexagon-aggregator.spec.ts +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright (c) 2015 - 2017 Uber Technologies, Inc. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -import test from 'tape-promise/tape'; -import {WebMercatorViewport} from 'deck.gl'; - -import * as FIXTURES from 'deck.gl-test/data'; - -import {pointToHexbin} from '@deck.gl/aggregation-layers/hexagon-layer/hexagon-aggregator'; -import {makeSpy} from '@probe.gl/test-utils'; -import {log} from '@deck.gl/core'; - -const getPosition = d => d.COORDINATES; -const iterableData = new Set(FIXTURES.points); -const radius = 500; -const viewport = FIXTURES.sampleViewport; -const positionValue = Array.from(iterableData).reduce((acc, pt) => { - const pos = getPosition(pt); - acc = acc.concat([pos[0], pos[1], pos[2] || 0]); - return acc; -}, []); -function getAccessor() { - return {size: 3}; -} -const attributes = {positions: {value: positionValue, getAccessor}}; - -test('pointToHexbin', t => { - const props = { - data: iterableData, - radius, - getPosition - }; - const aggregationParams = { - attributes, - viewport - }; - t.ok(typeof pointToHexbin(props, aggregationParams) === 'object', 'should work with iterables'); - t.end(); -}); - -test('pointToHexbin#invalidData', t => { - makeSpy(log, 'warn'); - const onePoint = Object.assign({}, FIXTURES.points[0]); - onePoint.COORDINATES = ['', '']; - const props = { - data: [onePoint], - radius, - getPosition - }; - const aggregationParams = { - attributes: {positions: {value: (onePoint.COORDINATES = ['', '']), getAccessor}}, - viewport - }; - t.ok( - typeof pointToHexbin(props, aggregationParams) === 'object', - 'should still produce an object in the presence of non-finite values' - ); - - t.ok(log.warn.called, 'should produce a warning message in the presence of non-finite values'); - - log.warn.restore(); - t.end(); -}); - -test('pointToHexbin#radius', t => { - // test viewport far away from data center - const testViewport = new WebMercatorViewport({ - width: 1024, - height: 768, - longitude: 0, - latitude: 0, - zoom: 11, - pitch: 30, - bearing: 0 - }); - - const props = { - data: iterableData, - radius, - getPosition - }; - const aggregationParams = { - attributes, - viewport: testViewport - }; - - const result = pointToHexbin(props, aggregationParams); - t.ok(typeof result === 'object', 'should work with iterables'); - t.ok(typeof result.radiusCommon === 'number', 'should return radiusCommon'); - - t.end(); -}); diff --git a/test/modules/aggregation-layers/hexagon-layer.spec.ts b/test/modules/aggregation-layers/hexagon-layer.spec.ts index 63eefcd3655..dc91c8fbf41 100644 --- a/test/modules/aggregation-layers/hexagon-layer.spec.ts +++ b/test/modules/aggregation-layers/hexagon-layer.spec.ts @@ -1,45 +1,27 @@ -// Copyright (c) 2015 - 2017 Uber Technologies, Inc. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. +// deck.gl +// SPDX-License-Identifier: MIT +// Copyright (c) vis.gl contributors import test from 'tape-promise/tape'; -import {makeSpy} from '@probe.gl/test-utils'; +import {testLayer, generateLayerTests} from '@deck.gl/test-utils'; +import {HexagonLayer, WebGLAggregator, CPUAggregator} from '@deck.gl/aggregation-layers'; +import * as FIXTURES from 'deck.gl-test/data'; +import {device} from '@deck.gl/test-utils'; -import * as data from 'deck.gl-test/data'; -import {testLayer, testInitializeLayer, generateLayerTests} from '@deck.gl/test-utils'; - -import {ColumnLayer} from '@deck.gl/layers'; -import {HexagonLayer} from '@deck.gl/aggregation-layers'; +const SAMPLE_PROPS = { + data: FIXTURES.points.slice(0, 3), + getPosition: d => d.COORDINATES + // gpuAggregation: false +}; test('HexagonLayer', t => { const testCases = generateLayerTests({ Layer: HexagonLayer, - sampleProps: { - data: data.points.slice(0, 3), - getPosition: d => d.COORDINATES - }, + sampleProps: SAMPLE_PROPS, assert: t.ok, onBeforeUpdate: ({testCase}) => t.comment(testCase.title), onAfterUpdate({layer}) { - if (layer.props.data && layer.props.data.length) { - t.ok(layer.state.aggregatorState.layerData.data.length > 0, 'should update state.hexagons'); - } + t.ok(layer.state.aggregator, 'should have aggregator'); } }); @@ -48,847 +30,86 @@ test('HexagonLayer', t => { t.end(); }); -// props to initialize layer with -// update props -// asserts on the resulting layer -test('HexagonLayer#updateLayer', t => { - // assert on state property updates after layer.prop change - function assertStateUpdate(shouldUpdate, prop) { - return function onAfterUpdate({layer, oldState: oldLayerState}) { - function checkIfUpdated(state, oldState, shouldUpdateItem, previousKeys) { - if (typeof shouldUpdateItem === 'object') { - for (const key in shouldUpdateItem) { - checkIfUpdated( - state[key], - oldState[key], - shouldUpdateItem[key], - `${previousKeys}.${key}` - ); - } - } else { - t.ok( - shouldUpdateItem ? state !== oldState : state === oldState, - `update props.${prop} should ${!shouldUpdateItem ? 'not' : ''} update ${previousKeys}` - ); - } - } - - checkIfUpdated( - layer.state.aggregatorState, - oldLayerState.aggregatorState, - shouldUpdate, - 'aggregatorState' - ); - }; +test('HexagonLayer#getAggregatorType', t => { + if (!WebGLAggregator.isSupported(device)) { + t.comment('GPU aggregation not supported, skipping'); + t.end(); + return; } - function getChecksForFilterChange(triggered) { - const shouldUpdate = { - layerData: false, - dimensions: { - fillColor: { - sortedBins: triggered, - valueDomain: triggered, - getValue: triggered, - scaleFunc: triggered - }, - elevation: { - sortedBins: triggered, - valueDomain: triggered, - getValue: triggered, - scaleFunc: triggered - } - } - }; - return assertStateUpdate(shouldUpdate, 'getFitlerBy'); - } - function getChecksForRadiusChange() { - const shouldUpdate = { - layerData: true, - dimensions: { - fillColor: { - sortedBins: true, - valueDomain: true, - getValue: false, - scaleFunc: true - }, - elevation: { - sortedBins: true, - valueDomain: true, - getValue: false, - scaleFunc: true - } - } - }; - return assertStateUpdate(shouldUpdate, 'radius'); - } - function getChecksForPositionChange(triggerChange) { - const shouldUpdate = { - layerData: triggerChange, - dimensions: { - fillColor: { - sortedBins: triggerChange, - valueDomain: triggerChange, - getValue: false, - scaleFunc: triggerChange - }, - elevation: { - sortedBins: triggerChange, - valueDomain: triggerChange, - getValue: false, - scaleFunc: triggerChange - } - } - }; - return assertStateUpdate( - shouldUpdate, - `getPosition ${triggerChange ? 'w/' : 'w/o'} trigger change` - ); - } - function getCheckForNoBinChange(accessor, dimension) { - const update = dimension; - const noUpdate = ['fillColor', 'elevation'].find(k => k !== dimension); - const shouldUpdate = { - layerData: false, - dimensions: { - [update]: { - sortedBins: false, - valueDomain: false, - getValue: - accessor === 'getColorValue w/o trigger' || - accessor === 'getElevationValue w/o trigger', - scaleFunc: false - }, - [noUpdate]: { - sortedBins: false, - valueDomain: false, - getValue: false, - scaleFunc: false - } - } - }; - return assertStateUpdate(shouldUpdate, accessor); - } - function getCheckForTriggeredBinUpdate(accessor, dimension) { - const update = dimension; - const noUpdate = ['fillColor', 'elevation'].find(k => k !== dimension); - const shouldUpdate = { - layerData: false, - dimensions: { - [update]: { - sortedBins: true, - valueDomain: true, - getValue: true, - scaleFunc: true - }, - [noUpdate]: { - sortedBins: false, - valueDomain: false, - getValue: false, - scaleFunc: false - } - } - }; - return assertStateUpdate(shouldUpdate, accessor); - } - function getChecksForPercentileUpdate(side, dimension) { - const update = dimension; - const noUpdate = ['fillColor', 'elevation'].find(k => k !== dimension); - const shouldUpdate = { - layerData: false, - dimensions: { - [update]: { - sortedBins: false, - valueDomain: true, - getValue: false, - scaleFunc: true - }, - [noUpdate]: { - sortedBins: false, - valueDomain: false, - getValue: false, - scaleFunc: false - } - } - }; - return assertStateUpdate(shouldUpdate, `${side}Percentile`); - } - function getChecksForDomainOrRangeUpdate(prop, dimension) { - const update = dimension; - const noUpdate = ['fillColor', 'elevation'].find(k => k !== dimension); - const shouldUpdate = { - layerData: false, - dimensions: { - [update]: { - sortedBins: false, - valueDomain: false, - getValue: false, - scaleFunc: true - }, - [noUpdate]: { - sortedBins: false, - valueDomain: false, - getValue: false, - scaleFunc: false - } - } - }; - return assertStateUpdate(shouldUpdate, `${dimension}${prop}`); - } - - /* - * Test layer update with test cases - */ testLayer({ Layer: HexagonLayer, onError: t.notOk, testCases: [ { - title: 'Initialize', - props: { - data: data.points, - radius: 400, - getPosition: d => d.COORDINATES - }, + title: 'Default', + props: SAMPLE_PROPS, onAfterUpdate({layer}) { - const { - layerData, - dimensions: {fillColor, elevation} - } = layer.state.aggregatorState; - - t.ok(layerData.data.length > 0, 'aggregatorState.dimensions.layerDate calculated'); - t.ok( - fillColor.sortedBins, - 'aggregatorState.dimensions.fillColor.sortedColorBins calculated' - ); - t.ok( - elevation.sortedBins, - 'aggregatorState.dimensions.elevation.sortedColorBins calculated' - ); t.ok( - Array.isArray(fillColor.valueDomain), - 'aggregatorState.dimensions.fillColor.valueDomain calculated' - ); - t.ok( - Array.isArray(elevation.valueDomain), - 'aggregatorState.dimensions.elevation.valueDomain calculated' - ); - t.ok( - typeof fillColor.getValue === 'function', - 'aggregatorState.dimensions.fillColor.getValue calculated' - ); - t.ok( - typeof elevation.getValue === 'function', - 'aggregatorState.dimension.elevation.getValue calculated' - ); - - t.ok( - Array.isArray(fillColor.sortedBins.aggregatedBins), - 'aggregatorState.dimension.fillColor.sortedBins.aggregatedBins calculated' - ); - t.ok( - Array.isArray(elevation.sortedBins.aggregatedBins), - 'aggregatorState.dimension.elevation.sortedBins.aggregatedBins calculated' - ); - - const firstSortedBin = fillColor.sortedBins.aggregatedBins[0]; - const binTocell = layerData.data.find(d => d.index === firstSortedBin.i); - - t.ok( - fillColor.sortedBins.binMap[binTocell.index] === firstSortedBin, - 'Correct aggregatorState.dimension.fillColor.sortedBins.binMap created' + layer.state.aggregator instanceof CPUAggregator, + 'By default should use CPU Aggregation' ); } }, { + title: 'Enable gpuAggregation', updateProps: { - hexagonAggregator: points => ({hexagons: []}) + gpuAggregation: true }, - onAfterUpdate: getChecksForRadiusChange() - }, - { - updateProps: { - _filterData: pt => pt.SPACES >= 4 && pt.SPACES <= 10 - }, - onAfterUpdate: ({layer, oldState}) => { - getChecksForFilterChange(false)({layer, oldState}); - - const {layerData} = layer.state.aggregatorState; - const isPointFiltered = layerData.data.every(bin => bin.filteredPoints === null); - - t.ok(isPointFiltered, 'filteredPoints in bins should be reset to null'); - } - }, - { - updateProps: { - _filterData: pt => pt.SPACES >= 4 && pt.SPACES <= 10, - updateTriggers: { - _filterData: 1 - } - }, - onAfterUpdate: ({layer, oldState}) => { - getChecksForFilterChange(true)({layer, oldState}); - - const { - layerData, - dimensions: {fillColor, elevation} - } = layer.state.aggregatorState; - - const isPointFiltered = layerData.data.every(bin => - bin.filteredPoints.every(pt => pt.SPACES >= 4 && pt.SPACES <= 10) - ); - - t.ok(isPointFiltered, 'filteredPoints in bins should be correct'); - - t.ok( - fillColor.sortedBins, - 'aggregatorState.dimensions.fillColor.sortedColorBins calculated' - ); + onAfterUpdate({layer}) { t.ok( - elevation.sortedBins, - 'aggregatorState.dimensions.elevation.sortedColorBins calculated' + layer.state.aggregator instanceof WebGLAggregator, + 'Should use GPU Aggregation (gpuAggregation: true)' ); } }, { + title: 'fallback to CPU aggregation', updateProps: { - _filterData: null, - updateTriggers: { - _filterData: 0 - } + getColorValue: points => points.length }, - onAfterUpdate: ({layer, oldState}) => { - getChecksForFilterChange(true)({layer, oldState}); - - const {layerData} = layer.state.aggregatorState; - const isPointFiltered = layerData.data.every(bin => bin.filteredPoints === null); - - t.ok(isPointFiltered, 'filteredPoints in bins should be reset to null'); + onAfterUpdate({layer, subLayers, spies}) { + t.ok( + layer.state.aggregator instanceof CPUAggregator, + 'Should use CPU Aggregation (getColorValue)' + ); } }, { + title: 'fallback to CPU aggregation', updateProps: { - radius: 800 - }, - onAfterUpdate: getChecksForRadiusChange() - }, - { - updateProps: { - getPosition: d => d.COORDINATES - }, - onAfterUpdate: getChecksForPositionChange(false) - }, - { - updateProps: { - getPosition: d => d.COORDINATES, - updateTriggers: { - getPosition: 1 - } - }, - onAfterUpdate: getChecksForPositionChange(true) - }, - { - updateProps: { - getColorWeight: x => 2 - }, - onAfterUpdate: getCheckForNoBinChange('getColorWeight w/o trigger', 'fillColor') - }, - { - updateProps: { - getColorWeight: x => 2, - updateTriggers: { - getColorWeight: 1 - } - }, - onAfterUpdate: getCheckForTriggeredBinUpdate('getColorWeight w/ trigger', 'fillColor') - }, - { - updateProps: { - getColorValue: x => 2 - }, - onAfterUpdate: getCheckForNoBinChange('getColorValue w/o trigger', 'fillColor') - }, - { - updateProps: { - getColorValue: x => 2, - updateTriggers: { - getColorValue: 1 - } - }, - onAfterUpdate: getCheckForTriggeredBinUpdate('getColorValue w/ trigger', 'fillColor') - }, - { - updateProps: { - colorAggregation: 'MEAN', - getColorValue: null - }, - onAfterUpdate: getCheckForTriggeredBinUpdate( - 'colorAggregation w/o getColorValue', - 'fillColor' - ) - }, - { - updateProps: { - upperPercentile: 90 - }, - onAfterUpdate: getChecksForPercentileUpdate('upper', 'fillColor') - }, - { - updateProps: { - lowerPercentile: 90 + getElevationValue: points => points.length }, - onAfterUpdate: getChecksForPercentileUpdate('lower', 'fillColor') - }, - { - updateProps: { - colorDomain: [0, 10] - }, - onAfterUpdate: getChecksForDomainOrRangeUpdate('Domain', 'fillColor') - }, - { - updateProps: { - colorRange: [ - [1, 1, 1], - [2, 2, 2], - [3, 3, 3] - ] - }, - onAfterUpdate: getChecksForDomainOrRangeUpdate('Range', 'fillColor') - }, - { - updateProps: { - getElevationWeight: x => 2 - }, - onAfterUpdate: getCheckForNoBinChange('getElevationWeight', 'elevation') - }, - { - updateProps: { - getElevationWeight: x => 2, - updateTriggers: { - getElevationWeight: 1 - } - }, - onAfterUpdate: getCheckForTriggeredBinUpdate('getElevationWeight', 'elevation') - }, - { - updateProps: { - getElevationValue: x => 2 - }, - onAfterUpdate: getCheckForNoBinChange('getElevationValue w/o trigger', 'elevation') - }, - { - updateProps: { - getElevationValue: x => 2, - updateTriggers: { - getElevationValue: 1 - } - }, - onAfterUpdate: getCheckForTriggeredBinUpdate('getElevationValue', 'elevation') - }, - { - updateProps: { - elevationAggregation: 'MEAN', - getElevationValue: null - }, - onAfterUpdate: getCheckForTriggeredBinUpdate('elevationAggregation', 'elevation') - }, - { - updateProps: { - elevationUpperPercentile: 80 - }, - onAfterUpdate: getChecksForPercentileUpdate('elevationUpper', 'elevation') - }, - { - updateProps: { - elevationLowerPercentile: 10 - }, - onAfterUpdate: getChecksForPercentileUpdate('elevationLower', 'elevation') - }, - { - updateProps: { - elevationRange: [1, 10] - }, - onAfterUpdate: getChecksForDomainOrRangeUpdate('Range', 'elevation') - }, - { - updateProps: { - elevationDomain: [0, 10] - }, - onAfterUpdate: getChecksForDomainOrRangeUpdate('Domain', 'elevation') - } - ] - }); - - t.end(); -}); - -test('HexagonLayer#updateTriggers', t => { - const SPIES = ['_onGetSublayerColor', '_onGetSublayerElevation']; - function getSublayerAttributeUpdateCheck(prop, result = {}) { - return function onAfterUpdate({subLayer, spies}) { - t.ok( - result.color ? spies._onGetSublayerColor.called : !spies._onGetSublayerColor.called, - `update ${prop} should ${result.color ? '' : 'not'} call _onGetSublayerColor` - ); - t.ok( - result.elevation - ? spies._onGetSublayerElevation.called - : !spies._onGetSublayerElevation.called, - `update ${prop} should ${result.elevation ? '' : 'not'} call _onGetSublayerElevation` - ); - }; - } - testLayer({ - Layer: HexagonLayer, - onError: t.notOk, - spies: SPIES, - testCases: [ - { - // props to initialize layer with - props: { - data: data.points, - radius: 400, - getPosition: d => d.COORDINATES + onAfterUpdate({layer, subLayers, spies}) { + t.ok( + layer.state.aggregator instanceof CPUAggregator, + 'Should use CPU Aggregation (getElevationValue)' + ); } - }, - { - updateProps: { - radius: 800 - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('radius', {color: true, elevation: true}) - }, - { - updateProps: { - opacity: 0.1 - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('opacity', {color: false, elevation: false}) - }, - { - updateProps: { - coverage: 0.1 - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('coverage', {color: false, elevation: false}) - }, - { - updateProps: { - extruded: true - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('extruded', {color: false, elevation: false}) - }, - { - updateProps: { - colorAggregation: 'MEAN' - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('colorAggregation', { - color: true, - elevation: false - }) - }, - { - updateProps: { - getColorWeight: x => 2 - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('getColorWeight w/o triggers', { - color: false, - elevation: false - }) - }, - { - updateProps: { - getColorWeight: x => 2, - updateTriggers: { - getColorWeight: 1 - } - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('getColorWeight w triggers', { - color: true, - elevation: false - }) - }, - { - updateProps: { - getColorWeight: x => 3 - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('getColorWeight w/o triggers', { - color: false, - elevation: false - }) - }, - { - updateProps: { - getColorValue: x => 2 - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('getColorValue null to assigned ', { - color: false, - elevation: false - }) - }, - { - updateProps: { - getColorValue: x => 3 - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('getColorValue w/o triggers', { - color: false, - elevation: false - }) - }, - { - updateProps: { - getColorValue: x => 4, - updateTriggers: { - getColorValue: 1 - } - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('getColorValue w triggers', { - color: true, - elevation: false - }) - }, - { - updateProps: { - upperPercentile: 90 - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('upperPercentile', { - color: true, - elevation: false - }) - }, - { - updateProps: { - lowerPercentile: 10 - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('lowerPercentile', { - color: true, - elevation: false - }) - }, - { - updateProps: { - colorDomain: [10, 20] - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('colorDomain', { - color: true, - elevation: false - }) - }, - { - updateProps: { - colorRange: [ - [1, 2, 3], - [2, 3, 4], - [3, 4, 5] - ] - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('colorRange', { - color: true, - elevation: false - }) - }, - { - updateProps: { - elevationAggregation: 'MEAN' - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('elevationAggregation', { - color: false, - elevation: true - }) - }, - { - updateProps: { - getElevationWeight: x => 2 - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('getElevationWeight w/o triggers', { - color: false, - elevation: false - }) - }, - { - updateProps: { - getElevationWeight: x => 2, - updateTriggers: { - getElevationWeight: 1, - // persist color updateTriggers to avoid triggering color update - getColorValue: 1 - } - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('getElevationWeight w triggers', { - color: false, - elevation: true - }) - }, - { - updateProps: { - getElevationWeight: x => 3 - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('getElevationWeight w/o triggers', { - color: false, - elevation: false - }) - }, - { - updateProps: { - getElevationValue: x => 2 - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('getElevationValue null to assigned', { - color: false, - elevation: false - }) - }, - { - updateProps: { - getElevationValue: x => 3 - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('getElevationValue w/o triggers', { - color: false, - elevation: false - }) - }, - { - updateProps: { - getElevationValue: x => 4, - updateTriggers: { - getElevationValue: 1, - // persist getColorValue update triggers - getColorValue: 1 - } - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('getElevationValue w triggers', { - color: false, - elevation: true - }) - }, - { - updateProps: { - elevationUpperPercentile: 90 - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('elevationUpperPercentile', { - color: false, - elevation: true - }) - }, - { - updateProps: { - elevationLowerPercentile: 10 - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('elevationLowerPercentile', { - color: false, - elevation: true - }) - }, - { - updateProps: { - elevationDomain: [10, 20] - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('elevationDomain', { - color: false, - elevation: true - }) - }, - { - updateProps: { - elevationRange: [2, 20] - }, - onAfterUpdate: getSublayerAttributeUpdateCheck('elevationRange', { - color: false, - elevation: true - }) } ] }); t.end(); }); -test('HexagonLayer#constructor', t => { - let layer = new HexagonLayer({ - id: 'emptyGeoJsonLayer', - data: [], - radius: 1, - pickable: true - }); - t.ok(layer instanceof HexagonLayer, 'Empty HexagonLayer created'); - - layer = new HexagonLayer({ - data: data.points, - pickable: true - }); - t.ok(layer instanceof HexagonLayer, 'HexagonLayer created'); - t.equal(layer.props.radius, 1000, 'set to default radius if not specified'); - - layer = new HexagonLayer({ - data: data.points, - radius: 500, - getPosition: d => d.COORDINATES, - pickable: true - }); - t.ok(layer instanceof HexagonLayer, 'HexagonLayer created'); - - testInitializeLayer({layer, onError: t.notOk}); - - t.doesNotThrow( - () => - new HexagonLayer({ - id: 'nullHexagonLayer', - data: null, - pickable: true - }), - 'Null HexagonLayer did not throw exception' - ); - - t.end(); -}); - -test('HexagonLayer#renderSubLayer', t => { - makeSpy(HexagonLayer.prototype, '_onGetSublayerColor'); - makeSpy(HexagonLayer.prototype, '_onGetSublayerElevation'); - - const layer = new HexagonLayer({ - data: data.points, - radius: 500, - getPosition: d => d.COORDINATES, - pickable: true - }); - - testInitializeLayer({layer, onError: t.notOk}); - - // render sublayer - const subLayer = layer.renderLayers(); - testInitializeLayer({layer: subLayer, onError: t.notOk}); - - t.ok(subLayer instanceof ColumnLayer, 'ColumnLayer rendered'); - - // should call attribute updater twice - // because test util calls both initialize and update layer - t.ok( - HexagonLayer.prototype._onGetSublayerColor.called, - 'should call _onGetSublayerColor number of hexagons times 2' - ); - t.ok( - HexagonLayer.prototype._onGetSublayerElevation.called, - 'should call _onGetSublayerElevation number of hexagons times 2' - ); - HexagonLayer.prototype._onGetSublayerColor.restore(); - HexagonLayer.prototype._onGetSublayerElevation.restore(); - - t.end(); -}); - test('HexagonLayer#non-iterable data', t => { const dataNonIterable = { length: 3, - positions: data.points.slice(0, 3).flatMap(d => d.COORDINATES), - weights: data.points.slice(0, 3).map(d => d.SPACES) - }; + positions: FIXTURES.points.slice(0, 3).flatMap(d => d.COORDINATES), + weights: FIXTURES.points.slice(0, 3).map(d => d.SPACES) + } as const; testLayer({ Layer: HexagonLayer, onError: t.notOk, testCases: [ { + title: 'Non-iterable data with constant weights', props: { data: dataNonIterable, - radius: 400, - getPosition: (_, {index, data: {positions}}) => [ - positions[index * 2], - positions[index * 2 + 1] + cellSize: 400, + getPosition: (_, {index}) => [ + dataNonIterable.positions[index * 2], + dataNonIterable.positions[index * 2 + 1] ], getColorWeight: 1, getElevationWeight: 1 @@ -898,14 +119,15 @@ test('HexagonLayer#non-iterable data', t => { } }, { + title: 'Non-iterable data with accessors', updateProps: { - getColorWeight: (_, {index, data: {weights}}) => { - t.ok(Number.isFinite(index) && weights, 'point index and context are populated'); - return weights[index * 2]; + getColorWeight: (_, {index, data}) => { + t.ok(Number.isFinite(index) && data, 'point index and context are populated'); + return (data as any).weights[index * 2]; }, - getElevationWeight: (_, {index, data: {weights}}) => { - t.ok(Number.isFinite(index) && weights, 'point index and context are populated'); - return weights[index * 2]; + getElevationWeight: (_, {index, data}) => { + t.ok(Number.isFinite(index) && data, 'point index and context are populated'); + return (data as any).weights[index * 2]; }, updateTriggers: { getColorWeight: 1, @@ -917,6 +139,7 @@ test('HexagonLayer#non-iterable data', t => { } }, { + title: 'Non-iterable data with custom aggregation', updateProps: { getColorValue: (points, {indices, data: {weights}}) => { t.ok(indices && weights, 'context is populated'); diff --git a/test/modules/aggregation-layers/hexbin.spec.ts b/test/modules/aggregation-layers/hexbin.spec.ts new file mode 100644 index 00000000000..13aa33603e5 --- /dev/null +++ b/test/modules/aggregation-layers/hexbin.spec.ts @@ -0,0 +1,112 @@ +// deck.gl +// SPDX-License-Identifier: MIT +// Copyright (c) vis.gl contributors + +import test from 'tape-promise/tape'; +import { + pointToHexbin, + pointToHexbinGLSL, + getHexbinCentroid, + getHexbinCentroidGLSL +} from '@deck.gl/aggregation-layers/hexagon-layer/hexbin'; +import {hexbin} from 'd3-hexbin'; +import {device} from '@deck.gl/test-utils'; +import {BufferTransform} from '@luma.gl/engine'; +import {equals} from '@math.gl/core'; + +function pointToHexbinCentroidD3(p: [number, number], radius: number): [number, number] { + const bins = hexbin().radius(radius)([p]); + return [bins[0].x, bins[0].y]; +} + +const TestData: {p: [number, number]; radius: number}[] = [ + {p: [0, 0], radius: 1}, + {p: [3.14159, -1.5], radius: 2}, + {p: [0.567, -0.702], radius: 1}, + {p: [1.3333, 2], radius: 1}, + {p: [-124, -613], radius: 0.04}, + {p: [427, 508], radius: 0.04} +]; + +test('pointToHexbin vs d3-hexbin', t => { + for (const d of TestData) { + const bin = pointToHexbin(d.p, d.radius); + const actual = getHexbinCentroid(bin, d.radius); + const expected = pointToHexbinCentroidD3(d.p, d.radius); + t.ok(equals(actual, expected, 1e-7), `point (${d.p}) bin ${bin}`); + } + + t.end(); +}); + +test('pointToHexbin CPU vs GPU', t => { + const transform = new BufferTransform(device, { + vs: `#version 300 es + uniform vec2 position; + uniform float radius; + out vec2 binId; + ${pointToHexbinGLSL} + void main() { + binId = vec2(pointToHexbin(position, radius)); + } + `, + topology: 'point-list', + varyings: ['binId'] + }); + transform.model.setVertexCount(1); + const outputBuffer = device.createBuffer({ + byteLength: 8 + }); + transform.transformFeedback.setBuffer('binId', outputBuffer); + + for (const d of TestData) { + const expected = pointToHexbin(d.p, d.radius); + transform.model.setUniforms({position: d.p, radius: d.radius}); + transform.run({discard: true}); + const result = new Float32Array(outputBuffer.readSyncWebGL().buffer); + // tape does not consider -0 == 0 + if (equals(result, expected)) { + t.pass(`point (${d.p}) bin ${result}`); + } else { + t.fail(`point (${d.p}) bin ${result}, expecting ${expected}`); + } + } + + transform.destroy(); + outputBuffer.destroy(); + t.end(); +}); + +test('getHexbinCentroid CPU vs GPU', t => { + const transform = new BufferTransform(device, { + vs: `#version 300 es + uniform vec2 binId; + uniform float radius; + out vec2 position; + ${getHexbinCentroidGLSL} + void main() { + position = hexbinCentroid(binId, radius); + } + `, + topology: 'point-list', + varyings: ['position'] + }); + transform.model.setVertexCount(1); + const outputBuffer = device.createBuffer({ + byteLength: 8 + }); + transform.transformFeedback.setBuffer('position', outputBuffer); + + for (const d of TestData) { + const bin = pointToHexbin(d.p, d.radius); + transform.model.setUniforms({binId: bin, radius: d.radius}); + transform.run({discard: true}); + const expected = getHexbinCentroid(bin, d.radius); + const result = new Float32Array(outputBuffer.readSyncWebGL().buffer); + t.ok(equals(result, expected, 1e-7), `bin ${bin}`); + } + + transform.destroy(); + outputBuffer.destroy(); + t.end(); +}); diff --git a/test/modules/aggregation-layers/index.ts b/test/modules/aggregation-layers/index.ts index 71e5acdd820..63da817fe1c 100644 --- a/test/modules/aggregation-layers/index.ts +++ b/test/modules/aggregation-layers/index.ts @@ -19,28 +19,17 @@ // THE SOFTWARE. import './aggregation-layer.spec'; -// import './contour-layer/contour-layer.spec'; +import './contour-layer/contour-layer.spec'; import './contour-layer/marching-squares.spec'; -// import './cpu-grid-layer/cpu-grid-layer.spec'; -// import './gpu-cpu-aggregator.spec'; -// import './gpu-grid-layer/gpu-grid-cell-layer-vertex.spec'; -// import './gpu-grid-layer/gpu-grid-cell-layer.spec'; -// import './gpu-grid-layer/gpu-grid-layer.spec'; -// import './grid-aggregation-layer.spec'; -import './grid-aggregator.spec'; -// import './grid-layer.spec'; +import './grid-layer.spec'; // import './heatmap-layer/heatmap-layer.spec'; import './heatmap-layer/heatmap-layer-utils.spec'; -// import './hexagon-layer.spec'; -import './hexagon-aggregator.spec'; +import './hexagon-layer.spec'; +import './hexbin.spec'; import './screen-grid-layer.spec'; import './screengrid-cell-layer.spec'; -import './utils/aggregation-operation-utils.spec'; -import './utils/bin-sorter.spec'; -import './utils/color-utils.spec'; -// import './utils/gpu-grid-aggregator.spec'; -import './utils/scale-utils.spec'; - -import './aggregation-layer-v9/webgl-aggregator.spec'; -import './aggregation-layer-v9/cpu-aggregator/cpu-aggregator.spec'; -import './aggregation-layer-v9/cpu-aggregator/vertex-accessor.spec'; +import './common/utils/color-utils.spec'; +import './common/utils/scale-utils.spec'; +import './common/webgl-aggregator.spec'; +import './common/cpu-aggregator/cpu-aggregator.spec'; +import './common/cpu-aggregator/vertex-accessor.spec'; diff --git a/test/modules/aggregation-layers/screengrid-cell-layer.spec.ts b/test/modules/aggregation-layers/screengrid-cell-layer.spec.ts index 69b5c64eaf3..0b1df5c999a 100644 --- a/test/modules/aggregation-layers/screengrid-cell-layer.spec.ts +++ b/test/modules/aggregation-layers/screengrid-cell-layer.spec.ts @@ -19,7 +19,7 @@ // THE SOFTWARE. /* eslint-disable func-style, no-console, max-len */ import test from 'tape-promise/tape'; -import {device} from '@deck.gl/test-utils'; +import {device, getLayerUniforms} from '@deck.gl/test-utils'; import ScreenGridCellLayer from '@deck.gl/aggregation-layers/screen-grid-layer/screen-grid-cell-layer'; import {testLayer} from '@deck.gl/test-utils'; @@ -50,12 +50,14 @@ test('ScreenGridCellLayer#constructor', t => { cellSizePixels: 50 // default 100 }, onBeforeUpdate({layer}) { - cellSize = layer.state.model.uniforms.cellSizeClipspace; + const uniforms = getLayerUniforms(layer); + cellSize = uniforms.cellSizeClipspace; }, onAfterUpdate({layer}) { t.ok(layer.state, 'should update layer state'); + const uniforms = getLayerUniforms(layer); t.notDeepEqual( - layer.state.model.uniforms.cellSizeClipspace, + uniforms.cellSizeClipspace, cellSize, 'should update cellSizeClipspace uniform' ); @@ -66,11 +68,8 @@ test('ScreenGridCellLayer#constructor', t => { colorDomain: () => [5, 50] }, onAfterUpdate({layer, oldState}) { - t.deepEqual( - layer.state.model.uniforms.colorDomain, - [5, 50], - 'should update colorDomain uniform' - ); + const uniforms = getLayerUniforms(layer); + t.deepEqual(uniforms.colorDomain, [5, 50], 'should update colorDomain uniform'); } } ] diff --git a/test/modules/aggregation-layers/utils/aggregation-operation-utils.spec.ts b/test/modules/aggregation-layers/utils/aggregation-operation-utils.spec.ts deleted file mode 100644 index 45277754a0a..00000000000 --- a/test/modules/aggregation-layers/utils/aggregation-operation-utils.spec.ts +++ /dev/null @@ -1,128 +0,0 @@ -// Copyright (c) 2015 - 2019 Uber Technologies, Inc. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -import test from 'tape-promise/tape'; - -import { - getValueFunc, - wrapGetValueFunc -} from '@deck.gl/aggregation-layers/utils/aggregation-operation-utils'; - -const data = [ - {source: 10, index: 0}, - {source: 'a', index: 1}, - {source: null, index: 2}, - {source: 14, index: 3}, - {source: -3, index: 4}, - {source: 16, index: 5}, - {source: 0.2, index: 6} -]; -const nonFiniteData = [ - {source: 'a', index: 0}, - {source: null, index: 1}, - {source: {a: 'a'}, index: 2} -]; -const TEST_CASES = [ - { - name: 'Min Function', - op: 'MIN', - data, - accessor: x => x, - expected: -3 - }, - { - name: 'Max Function', - op: 'MAX', - data, - accessor: x => x, - expected: 16 - }, - { - name: 'Sum Function', - op: 'SUM', - data, - accessor: x => x, - expected: 37.2 - }, - { - name: 'Mean Function', - op: 'MEAN', - data, - accessor: x => x, - expected: 37.2 / 5 - }, - { - name: 'Invalid(should default to SUM)', - op: 'Invalid', - data, - accessor: x => x, - expected: 37.2 - }, - { - name: 'Constant accessor/SUM', - op: 'SUM', - data, - accessor: 1, - expected: data.length - }, - { - name: 'Constant accessor/MEAN', - op: 'MEAN', - data, - accessor: 1, - expected: 1 - }, - { - name: 'Constant accessor/MAX', - op: 'MAX', - data, - accessor: 1, - expected: 1 - }, - { - name: 'Constant accessor/MIN', - op: 'MIN', - data, - accessor: 1, - expected: 1 - } -]; - -test('GridAggregationOperationUtils#getValueFunc', t => { - TEST_CASES.forEach(tc => { - const func = getValueFunc(tc.op, tc.accessor); - t.is(func(data), tc.expected, `${tc.name} should return expected result`); - - const altData = typeof accessor === 'function' ? nonFiniteData : []; - t.is(func(altData), null, `${tc.name} should return expected result on non-finite data`); - }); - t.end(); -}); - -test('GridAggregationOperationUtils#wrapGetValueFunc', t => { - const func = wrapGetValueFunc((values, {indices}) => { - t.deepEqual(indices, [0, 1, 2, 3, 4, 5, 6], 'indices are populated'); - return Math.max.apply(null, values.filter(Number.isFinite)); - }); - - t.is(func(data), 16, 'returns expected result'); - - t.end(); -}); diff --git a/test/modules/aggregation-layers/utils/bin-sorter.spec.ts b/test/modules/aggregation-layers/utils/bin-sorter.spec.ts deleted file mode 100644 index dd108e7311d..00000000000 --- a/test/modules/aggregation-layers/utils/bin-sorter.spec.ts +++ /dev/null @@ -1,136 +0,0 @@ -// Copyright (c) 2015 - 2017 Uber Technologies, Inc. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -import test from 'tape-promise/tape'; -import BinSorter from '@deck.gl/aggregation-layers/utils/bin-sorter'; - -const mockBins = [ - {points: [{a: null}]}, - {points: [{a: 7}, {a: 8}, {a: 2}]}, - {points: [{a: 1}, {a: 4}]} -]; - -test('BinSorter.init', t => { - let sortedBins; - - t.doesNotThrow(() => { - sortedBins = new BinSorter([]); - }, 'create sortedBins with empty array should not fail'); - - sortedBins = new BinSorter(mockBins); - - const expectedSortedBins = [ - {i: 0, value: 1, counts: 1}, - {i: 1, value: 3, counts: 3}, - {i: 2, value: 2, counts: 2} - ]; - - const expectedResult = { - aggregatedBins: expectedSortedBins, - maxCount: 3, - minValue: 1, - maxValue: 3, - totalCount: 6, - binMap: { - 0: expectedSortedBins[0], - 1: expectedSortedBins[1], - 2: expectedSortedBins[2] - }, - sortedBins: undefined - }; - - t.deepEqual( - sortedBins.aggregatedBins, - expectedResult.aggregatedBins, - 'should create correct sorted bins' - ); - t.deepEqual(sortedBins.binMap, expectedResult.binMap, 'should create correct bin map'); - t.is(sortedBins.maxCount, expectedResult.maxCount, 'maxCount'); - t.is(sortedBins.minValue, expectedResult.minValue, 'minValue'); - t.is(sortedBins.maxValue, expectedResult.maxValue, 'maxValue'); - t.is(sortedBins.totalCount, expectedResult.totalCount, 'totalCount'); - t.end(); -}); - -test('BinSorter', t => { - let sortedBins; - // calculate sum - const getValue = points => - points.reduce((accu, p) => (Number.isFinite(p.a) ? accu + p.a : accu), 0); - - t.doesNotThrow(() => { - sortedBins = new BinSorter([], {getValue}); - }, 'create sortedBins with empyt bin and getValue should not fail'); - - sortedBins = new BinSorter(mockBins, {getValue}); - - const expectedBins = [ - {i: 0, value: 0, counts: 1}, - {i: 1, value: 17, counts: 3}, - {i: 2, value: 5, counts: 2} - ]; - - t.deepEqual(sortedBins.aggregatedBins, expectedBins, 'should create correct sorted bins'); - - const {aggregatedBins, binMap} = new BinSorter(mockBins, {getValue: () => null}); - t.deepEqual( - {aggregatedBins, binMap}, - {aggregatedBins: [], binMap: {}}, - 'should empty bins if getValue return null' - ); - - t.end(); -}); - -test('BinSorter.getValueDomain', t => { - let sortedBins = new BinSorter([]); - const domainEmpty = sortedBins.getValueDomainByScale('quantize'); - t.deepEqual(domainEmpty, [], 'should create correct domain if bins are empty'); - - sortedBins = new BinSorter([{points: []}]); - const domainOne = sortedBins.getValueDomainByScale('quantize'); - t.deepEqual(domainOne, [], 'should create correct domain if there is only 1 bin'); - - sortedBins = new BinSorter(mockBins); - - const quantizeDomain = sortedBins.getValueDomainByScale('quantize'); - t.deepEqual(quantizeDomain, [1, 3], 'should create correct quantizeDomain'); - - const linearDomain = sortedBins.getValueDomainByScale('linear'); - t.deepEqual(linearDomain, [1, 3], 'should create correct linearDomain'); - - const quantileDomain = sortedBins.getValueDomainByScale('quantile'); - t.deepEqual(quantileDomain, [1, 2, 3], 'should create correct quantileDomain'); - - sortedBins = new BinSorter(mockBins, {getValue: points => ['b', 'c', 'a'][points.length % 3]}); - - const ordinalDomain = sortedBins.getValueDomainByScale('ordinal'); - t.deepEqual(ordinalDomain, ['a', 'b', 'c'], 'should create correct ordinalDomain'); - - t.end(); -}); - -test('BinSorter.getValueDomain.Percentile', t => { - const sortedBins = new BinSorter(mockBins); - const quantizeDomain = sortedBins.getValueDomainByScale('quantize', [0, 20]); - t.deepEqual(quantizeDomain, [1, 1], 'should create correct quantizeDomain'); - - t.end(); -}); diff --git a/test/modules/aggregation-layers/utils/gpu-grid-aggregator.spec.ts b/test/modules/aggregation-layers/utils/gpu-grid-aggregator.spec.ts deleted file mode 100644 index 68de006693c..00000000000 --- a/test/modules/aggregation-layers/utils/gpu-grid-aggregator.spec.ts +++ /dev/null @@ -1,59 +0,0 @@ -import test from 'tape-promise/tape'; -import GPUGridAggregator from '@deck.gl/aggregation-layers/utils/gpu-grid-aggregation/gpu-grid-aggregator'; - -import {device} from '@deck.gl/test-utils'; -import {GridAggregationData} from 'deck.gl-test/data'; - -const {fixture, buildAttributes} = GridAggregationData; - -/* eslint-disable max-statements */ -function testCounterMinMax(aggregator, t, opts) { - const {params, size = 1} = opts; - const testName = `GPU : size: ${size}:`; - - let weight1 = Object.assign({}, params.weights.weight1, {size}); - let results = aggregator.run(Object.assign({}, params, {weights: {weight1}})); - - const {minData, maxData} = aggregator.getData('weight1'); - t.equal(maxData[3], 3, `${testName} needMax: total count should match`); - t.equal(minData[3], 3, `${testName} needMin: total count should match`); - t.equal(maxData[0], 4, `${testName} needMax: max weight should match`); - t.equal(minData[0], 2, `${testName} needMin: min weight should match`); - if (size > 1) { - t.equal(maxData[1], 53, `${testName} needMax: max weight should match for weight#2`); - t.equal(minData[1], 11, `${testName} needMin: min weight should match for weight#2`); - if (size > 2) { - t.equal(maxData[2], 704, `${testName} needMax: max weight should match for weight#3`); - t.equal(minData[2], 101, `${testName} needMin: min weight should match for weight#3`); - } - } - - weight1 = Object.assign({}, weight1, {combineMaxMin: true}); - results = aggregator.run(Object.assign({}, params, {weights: {weight1}})); - - const maxMinData = results.weight1.maxMinBuffer.getData(); - t.equal(maxMinData[0], 4, `${testName} combineMaxMin: max weight should match`); - if (size > 1) { - t.equal(maxMinData[1], 53, `${testName} combineMaxMin: max weight should match for weight#2`); - if (size > 2) { - t.equal( - maxMinData[2], - 704, - `${testName} combineMaxMin: max weight should match for weight#3` - ); - } - } - t.equal(maxMinData[3], 2, `${testName} combineMaxMin: min weight should match`); -} -/* eslint-enable max-statements */ - -// TODO luma v9 -test.skip('GPUGridAggregator#GPU', t => { - const sa = new GPUGridAggregator(device); - const {data, weights} = fixture; - const params = Object.assign({}, fixture, buildAttributes({data, weights})); - testCounterMinMax(sa, t, {params, size: 1}); - testCounterMinMax(sa, t, {params, size: 2}); - testCounterMinMax(sa, t, {params, size: 3}); - t.end(); -}); diff --git a/test/modules/aggregation-layers/utils/grid-aggregation-utils.spec.ts b/test/modules/aggregation-layers/utils/grid-aggregation-utils.spec.ts deleted file mode 100644 index fcd99300b21..00000000000 --- a/test/modules/aggregation-layers/utils/grid-aggregation-utils.spec.ts +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (c) 2015 - 2018 Uber Technologies, Inc. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -import test from 'tape-promise/tape'; - -import {alignToCell} from '@deck.gl/aggregation-layers/utils/grid-aggregation-utils'; - -test('GridAggregationUtils#alignToCell (CPU)', t => { - t.equal(alignToCell(-3, 5), -5); - t.equal(alignToCell(3, 5), 0); - - t.end(); -}); diff --git a/test/modules/aggregation-layers/utils/scale-utils.spec.ts b/test/modules/aggregation-layers/utils/scale-utils.spec.ts deleted file mode 100644 index 24b7d754d85..00000000000 --- a/test/modules/aggregation-layers/utils/scale-utils.spec.ts +++ /dev/null @@ -1,162 +0,0 @@ -import test from 'tape-promise/tape'; -import { - quantizeScale, - getQuantileScale, - getOrdinalScale, - getLinearScale -} from '@deck.gl/aggregation-layers/utils/scale-utils'; - -const RANGE = [100, 200, 300, 400, 500, 600, 700, 800, 900, 1000]; -const LINEAR_SCALE_TEST_CASES = [ - { - title: 'multi-value-domain', - domain: [1, 10], - range: [2, 20], - value: 5, - result: 10 - } -]; - -const QUANTIZE_SCALE_TEST_CASES = [ - { - title: 'multi-value-domain', - domain: [1, 10], - range: RANGE, - value: 5, - result: 500 - }, - { - title: 'single-value-domain', - domain: [1, 1], - range: RANGE, - value: 1, - result: RANGE[0] - }, - { - title: 'negative-value-domain', - domain: [10, 1], - range: RANGE, - value: 1, - result: RANGE[0] - } -]; - -const QUANTILE_SCALE_TEST_CASES = [ - { - title: 'multi-value-domain', - domain: [3, 6, 7, 8, 8, 10, 13, 15, 16, 20], - range: [11, 22, 33, 44], - values: [1, 3, 6, 6.9, 7, 7.1, 8, 8.9, 9, 9.1, 10, 13, 14.9, 15, 15.1, 16, 20, 100], - results: [11, 11, 11, 11, 11, 11, 22, 22, 33, 33, 33, 33, 44, 44, 44, 44, 44, 44] - }, - { - title: 'unsorted-domain', - domain: [8, 16, 15, 3, 6, 7, 8, 20, 10, 13], - range: [11, 22, 33, 44], - values: [1, 3, 6, 6.9, 7, 7.1, 8, 8.9, 9, 9.1, 10, 13, 14.9, 15, 15.1, 16, 20, 100], - results: [11, 11, 11, 11, 11, 11, 22, 22, 33, 33, 33, 33, 44, 44, 44, 44, 44, 44] - }, - { - title: 'single-value-domain', - domain: [8], - range: [11, 22, 33, 44], - values: [1, 3, 6, 6.9, 7, 7.1, 8, 8.9, 9, 9.1, 10, 13, 14.9, 15, 15.1, 16, 20, 100], - results: [11, 11, 11, 11, 11, 11, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44] - }, - { - title: 'single-value-range', - domain: [3, 6, 7, 8, 8, 10, 13, 15, 16, 20], - range: [11], - values: [1, 3, 6, 6.9, 7, 7.1, 8, 8.9, 9, 9.1, 10, 13, 14.9, 15, 15.1, 16, 20, 44], - result: 11 - } -]; - -const ORDINAL_SCALE_TEST_CASES = [ - { - title: 'uniquely-maps-domain-to-range', - domain: [0, 1], - range: [11, 22], - values: [0, 1], - results: [11, 22] - }, - { - title: 'string-value-domain', - domain: ['0', '1'], - range: [11, 22], - values: [0, '0', 1, '1'], - results: [11, 11, 22, 22] - }, - { - title: 'extends-domain', - domain: [0, 1], - range: [11, 22, 33], - values: [0, 1, 2], - results: [11, 22, 33] - }, - { - title: 'recycles values', - domain: [0, 1], - range: [11, 22, 33], - values: [0, 1, 2, 3, 4, 5, 6], - results: [11, 22, 33, 11, 22, 33, 11] - } -]; - -test('scale-utils#import', t => { - t.ok(quantizeScale, 'quantizeScale imported OK'); - t.end(); -}); - -test('scale-utils@linearScale', t => { - for (const tc of LINEAR_SCALE_TEST_CASES) { - const linearScale = getLinearScale(tc.domain, tc.range); - const result = linearScale(tc.value); - t.deepEqual(result, tc.result, `quantizeScale ${tc.title} returned expected value`); - } - t.end(); -}); - -test('scale-utils#quantizeScale', t => { - for (const tc of QUANTIZE_SCALE_TEST_CASES) { - const result = quantizeScale(tc.domain, tc.range, tc.value); - t.deepEqual(result, tc.result, `quantizeScale ${tc.title} returned expected value`); - } - t.end(); -}); - -test('scale-utils#quantileScale', t => { - for (const tc of QUANTILE_SCALE_TEST_CASES) { - const quantileScale = getQuantileScale(tc.domain, tc.range); - t.deepEqual( - quantileScale.domain(), - tc.domain, - `quantileScale.domain() ${tc.title} returned expected value` - ); - for (const i in tc.values) { - const result = quantileScale(tc.values[i]); - t.deepEqual( - result, - tc.results ? tc.results[i] : tc.result, - `quantileScale ${tc.title} returned expected value` - ); - } - } - t.end(); -}); - -test('scale-utils#ordinalScale', t => { - for (const tc of ORDINAL_SCALE_TEST_CASES) { - const ordinalScale = getOrdinalScale(tc.domain, tc.range); - t.deepEqual( - ordinalScale.domain(), - tc.domain, - `ordinalScale.domain() ${tc.title} returned expected value` - ); - for (const i in tc.values) { - const result = ordinalScale(tc.values[i]); - t.deepEqual(result, tc.results[i], `ordinalScale ${tc.title} returned expected value`); - } - } - t.end(); -}); diff --git a/test/modules/carto/api/parse-map.spec.ts b/test/modules/carto/api/parse-map.spec.ts index 03b92dd244d..78cc6d91b93 100644 --- a/test/modules/carto/api/parse-map.spec.ts +++ b/test/modules/carto/api/parse-map.spec.ts @@ -3,7 +3,7 @@ import {parseMap} from '@deck.gl/carto/api/parse-map'; import {GeoJsonLayer} from '@deck.gl/layers'; import {H3TileLayer, QuadbinTileLayer, VectorTileLayer, HeatmapTileLayer} from '@deck.gl/carto'; import {H3HexagonLayer} from '@deck.gl/geo-layers'; -import {CPUGridLayer, HeatmapLayer, HexagonLayer} from '@deck.gl/aggregation-layers'; +import {GridLayer, HeatmapLayer, HexagonLayer} from '@deck.gl/aggregation-layers'; const METADATA = { id: 1234, @@ -1384,11 +1384,11 @@ test(`parseMap#visState Grid layer`, async t => { t.deepEquals( map.layers.map(l => l.toString()), - [`CPUGridLayer({id: 'ij06t3e'})`], + [`GridLayer({id: 'ij06t3e'})`], 'layer names' ); - const layer = map.layers[0] as CPUGridLayer; + const layer = map.layers[0] as GridLayer; t.equal(layer.props.id, 'ij06t3e', 'id'); t.equal(layer.props.pickable, true, 'pickable'); t.equal(layer.props.visible, true, 'visible'); diff --git a/test/modules/carto/layers/point-label-layer.spec.ts b/test/modules/carto/layers/point-label-layer.spec.ts index fed97edfb19..0fda44e05c9 100644 --- a/test/modules/carto/layers/point-label-layer.spec.ts +++ b/test/modules/carto/layers/point-label-layer.spec.ts @@ -28,7 +28,7 @@ test('PointLabelLayer', t => { const {vs} = textBackgroundLayer.getShaders(); t.ok( - vs.includes('_padding = padding + instancePixelOffsets.xyxy'), + vs.includes('_padding = textBackground.padding + instancePixelOffsets.xyxy'), 'text background layer shader patched' ); diff --git a/test/modules/core/effects/lighting-effect.spec.ts b/test/modules/core/effects/lighting-effect.spec.ts index d3cfc01cd83..31f6882eb8c 100644 --- a/test/modules/core/effects/lighting-effect.spec.ts +++ b/test/modules/core/effects/lighting-effect.spec.ts @@ -66,7 +66,7 @@ test('LightingEffect#getModuleParameters', t => { ); t.deepEqual(lightSources.pointLights[1].color, [255, 0, 0], 'point light color is ok'); - t.equal(lightSources.ambientLight, null, 'Lighting effect getGLParameters is ok'); + t.equal(lightSources.ambientLight, undefined, 'Lighting effect getGLParameters is ok'); t.deepEqual(lightSources.directionalLights, [], 'Lighting effect getGLParameters is ok'); lightingEffect.cleanup(effectContext); diff --git a/test/modules/core/lib/layer.spec.ts b/test/modules/core/lib/layer.spec.ts index 0b5f792a44d..1c8f8dc9941 100644 --- a/test/modules/core/lib/layer.spec.ts +++ b/test/modules/core/lib/layer.spec.ts @@ -390,22 +390,20 @@ test('Layer#Async Iterable Data', async t => { }); test('Layer#uniformTransitions', t => { - const drawCalls = []; + const drawCalls: {opacity: number; modelMatrix: number[]}[] = []; const timeline = new Timeline(); class TestLayer extends Layer { initializeState() {} - setModuleParameters(params) { - super.setModuleParameters(params); - this.state.moduleParameters = params; + setShaderModuleProps(props) { + super.setShaderModuleProps(props); + this.state.shaderModuleProps = props; } draw() { - drawCalls.push({ - opacity: this.props.opacity, - modelMatrix: this.state.moduleParameters.modelMatrix - }); + let {layer, project} = this.state.shaderModuleProps as any; + drawCalls.push({opacity: layer.opacity, modelMatrix: project.modelMatrix}); } } @@ -467,7 +465,7 @@ test('Layer#uniformTransitions', t => { onAfterUpdate: () => t.deepEquals( drawCalls.pop(), - {opacity: 0.5, modelMatrix: scale2Mat4}, + {opacity: Math.pow(0.5, 1 / 2.2), modelMatrix: scale2Mat4}, 'layer drawn with opacity in transition' ) }, diff --git a/test/modules/core/lib/pick-layers.spec.ts b/test/modules/core/lib/pick-layers.spec.ts index 23a33bf2504..79123726ab3 100644 --- a/test/modules/core/lib/pick-layers.spec.ts +++ b/test/modules/core/lib/pick-layers.spec.ts @@ -21,24 +21,24 @@ /* eslint-disable dot-notation, max-statements, no-unused-vars */ import test from 'tape-promise/tape'; +import {Deck} from '@deck.gl/core'; import { - MapView, ScatterplotLayer, ColumnLayer, - Deck, PolygonLayer, PathLayer, - GeoJsonLayer, - GridLayer -} from 'deck.gl'; + GeoJsonLayer +} from '@deck.gl/layers'; +import {GridLayer} from '@deck.gl/aggregation-layers'; + import {MaskExtension} from '@deck.gl/extensions'; import * as DATA from '../../../../examples/layer-browser/src/data-samples'; import type {DeckProps} from '@deck.gl/core'; import {equals} from '@math.gl/core'; const VIEW_STATE = { - latitude: 37.751537058389985, longitude: -122.42694203247012, + latitude: 37.751537058389985, zoom: 11.5, pitch: 0, bearing: 0 @@ -47,18 +47,17 @@ const VIEW_STATE = { const DECK_PROPS: DeckProps = { width: 500, height: 550, - views: [new MapView()], viewState: VIEW_STATE, useDevicePixels: false, layerFilter: null }; -const NEW_GRID_LAYER_PICK_METHODS = { +const GRID_LAYER_PICK_METHODS = { pickObject: [ { parameters: { x: 60, - y: 160 + y: 1 }, results: { count: 0 @@ -66,13 +65,13 @@ const NEW_GRID_LAYER_PICK_METHODS = { }, { parameters: { - x: 300, - y: 209 + x: 120, + y: 120 }, results: { count: 1, // point count in the aggregated cell for each pickInfo object - cellCounts: [8] + cellCounts: [7] } } ], @@ -81,12 +80,12 @@ const NEW_GRID_LAYER_PICK_METHODS = { parameters: { x: 300, y: 300, - width: 100, - height: 100 + width: 50, + height: 50 }, results: { - count: 23, - cellCounts: [1, 3, 1, 2, 3, 1, 1, 1, 1, 2, 2, 5, 1, 2, 5, 1, 3, 4, 1, 2, 1, 1, 1] + count: 8, + cellCounts: [1, 2, 11, 2, 1, 4, 4, 1] } }, { @@ -104,22 +103,13 @@ const NEW_GRID_LAYER_PICK_METHODS = { pickMultipleObjects: [ { parameters: { - x: 86, - y: 215, + x: 350, + y: 60, radius: 1 }, results: { - count: 4, - cellCounts: [4, 22, 3, 4] - } - }, - { - parameters: { - x: 90, - y: 350 - }, - results: { - count: 0 + count: 2, + cellCounts: [43, 26] } } ] @@ -162,7 +152,6 @@ const TEST_CASES = [ } } ], - /* luma.gl v9 test disable pickObjects: [ { parameters: { @@ -187,7 +176,6 @@ const TEST_CASES = [ } } ], - */ pickMultipleObjects: [ { parameters: { @@ -719,37 +707,37 @@ const TEST_CASES = [ } }, { - id: 'newgridlayer - cpu', + id: 'Gridlayer - cpu', props: { layers: [ new GridLayer({ data: DATA.points, getPosition: d => d.COORDINATES, pickable: true, - cellSize: 200, + cellSize: 400, gpuAggregation: false, extruded: true }) ] }, - pickingMethods: NEW_GRID_LAYER_PICK_METHODS + pickingMethods: GRID_LAYER_PICK_METHODS }, { - id: 'newgridlayer - gpu', + id: 'Gridlayer - gpu', props: { layers: [ new GridLayer({ data: DATA.points, getPosition: d => d.COORDINATES, pickable: true, - cellSize: 200, + cellSize: 400, gpuAggregation: true, extruded: true, fp64: true }) ] }, - pickingMethods: NEW_GRID_LAYER_PICK_METHODS + pickingMethods: GRID_LAYER_PICK_METHODS } ]; @@ -767,8 +755,13 @@ test(`pickingTest`, async t => { if (!Array.isArray(pickInfos)) { pickInfos = pickInfos ? [pickInfos] : []; } + let count = pickInfos.length; + // @ts-expect-error + if (deck.device.info.gpu === 'apple') { + count = count === 32 ? 33 : pickInfos.length; + } t.equal( - pickInfos.length, + count, pickingCase.results.count, `${testCase.id}: ${pickingMethod} should find expected number of objects` ); @@ -781,15 +774,14 @@ test(`pickingTest`, async t => { ); } - // TODO - fix aggregation layers - // if (pickingCase.results.cellCounts) { - // const cellCounts = pickInfos.map(x => x.object.count); - // t.deepEqual( - // cellCounts, - // pickingCase.results.cellCounts, - // 'Aggregation count for individual cells should match' - // ); - // } + if (pickingCase.results.cellCounts) { + const cellCounts = pickInfos.map(x => x.object.count); + t.deepEqual( + cellCounts, + pickingCase.results.cellCounts, + 'Aggregation count for individual cells should match' + ); + } } } } @@ -815,10 +807,10 @@ test('pickingTest#unproject3D', async t => { }); let pickInfo = deck.pickObject({x: 250, y: 275, unproject3D: true}); - t.is(pickInfo.object, VIEW_STATE, 'object is picked'); - t.comment(`pickInfo.coordinate: ${pickInfo.coordinate}`); + t.is(pickInfo?.object, VIEW_STATE, 'object is picked'); + t.comment(`pickInfo.coordinate: ${pickInfo?.coordinate}`); t.ok( - equals(pickInfo.coordinate, [VIEW_STATE.longitude, VIEW_STATE.latitude, 1000], 0.0001), + equals(pickInfo?.coordinate, [VIEW_STATE.longitude, VIEW_STATE.latitude, 1000], 0.0001), 'unprojects to 3D coordinate' ); @@ -831,7 +823,12 @@ function updateDeckProps(deck: Deck, props: DeckProps): Promise { deck.setProps({ ...DECK_PROPS, ...props, - onAfterRender: () => resolve() + onAfterRender: () => { + // @ts-expect-error private member + if (!deck.layerManager.needsUpdate()) { + resolve(); + } + } }); }); } diff --git a/test/modules/core/passes/pick-layers-pass.spec.ts b/test/modules/core/passes/pick-layers-pass.spec.ts index c01158d2aa5..b5f0c9ae0f3 100644 --- a/test/modules/core/passes/pick-layers-pass.spec.ts +++ b/test/modules/core/passes/pick-layers-pass.spec.ts @@ -3,7 +3,7 @@ import test from 'tape-promise/tape'; import {LayerManager, MapView, PolygonLayer} from 'deck.gl'; import PickLayersPass from '@deck.gl/core/passes/pick-layers-pass'; import * as FIXTURES from 'deck.gl-test/data'; -import {device} from '@deck.gl/test-utils'; +import {device, getLayerUniforms} from '@deck.gl/test-utils'; test('PickLayersPass#drawPickingBuffer', t => { const pickingFBO = device.createFramebuffer({colorAttachments: ['rgba8unorm']}); @@ -37,12 +37,11 @@ test('PickLayersPass#drawPickingBuffer', t => { }); const subLayers = layer.getSubLayers(); - const models = subLayers[0].getModels(); t.ok(`PickLayersPass rendered`); t.equal( - models[0].pipeline.uniforms.lighting_uEnabled, - false, + getLayerUniforms(subLayers[0], 'lighting').enabled, + 0, `PickLayersPass lighting disabled correctly` ); diff --git a/test/modules/core/passes/shadow-pass.spec.ts b/test/modules/core/passes/shadow-pass.spec.ts index e9df0e3a444..6d96714253f 100644 --- a/test/modules/core/passes/shadow-pass.spec.ts +++ b/test/modules/core/passes/shadow-pass.spec.ts @@ -9,14 +9,10 @@ test('ShadowPass#constructor and delete', t => { const shadowPass = new ShadowPass(device, {pixelRatio: 1.0}); t.ok(shadowPass, `ShadowPass is constructed`); - t.ok(shadowPass.shadowMap, `ShadowPass creates shadow map`); - t.ok(shadowPass.depthBuffer, `ShadowPass creates depth buffer`); t.ok(shadowPass.fbo, `ShadowPass creates fbo`); shadowPass.delete(); - t.notOk(shadowPass.shadowMap, `ShadowPass deletes shadow map`); - t.notOk(shadowPass.depthBuffer, `ShadowPass deletes depth buffer`); t.notOk(shadowPass.fbo, `ShadowPass deletes fbo`); t.end(); }); @@ -48,8 +44,10 @@ test('ShadowPass#render', t => { effectProps: {shadow_lightId: 0} }); - t.equal(shadowPass.shadowMap.width, 100, `ShadowPass resize shadow map width`); - t.equal(shadowPass.shadowMap.height, 100, `ShadowPass resize shadow map height`); + // These will likely fail locally due to DPR (200, 200) + const shadowMap = shadowPass.fbo.colorAttachments[0].texture; + t.equal(shadowMap.width, 100, `ShadowPass resize shadow map width`); + t.equal(shadowMap.height, 100, `ShadowPass resize shadow map height`); shadowPass.delete(); t.end(); }); diff --git a/test/modules/extensions/collision-filter/collision-filter-pass.spec.ts b/test/modules/extensions/collision-filter/collision-filter-pass.spec.ts index ae45f6eb72c..89f188800f4 100644 --- a/test/modules/extensions/collision-filter/collision-filter-pass.spec.ts +++ b/test/modules/extensions/collision-filter/collision-filter-pass.spec.ts @@ -1,14 +1,8 @@ import test from 'tape-promise/tape'; -import {Layer, LayerManager, Viewport} from '@deck.gl/core'; -import {CollisionFilterExtension} from '@deck.gl/extensions'; import CollisionFilterPass from '@deck.gl/extensions/collision-filter/collision-filter-pass'; import {device} from '@deck.gl/test-utils'; -class TestLayer extends Layer { - initializeState() {} -} - test('CollisionFilterPass#getModuleParameters', t => { const collisionFilterPass = new CollisionFilterPass(device); const moduleParameters = collisionFilterPass.getModuleParameters(); @@ -30,8 +24,8 @@ test('CollisionFilterPass#getModuleParameters', t => { ); t.deepEqual( moduleParameters.lightSources, - {}, - `CollisionFilterPass has empty lightSources module parameter` + {enabled: false}, + `CollisionFilterPass disables lighting module` ); t.end(); }); diff --git a/test/modules/extensions/data-filter.spec.ts b/test/modules/extensions/data-filter.spec.ts index 824fd7703ff..1491a6eed6a 100644 --- a/test/modules/extensions/data-filter.spec.ts +++ b/test/modules/extensions/data-filter.spec.ts @@ -105,8 +105,8 @@ test('DataFilterExtension#categories', t => { const attributes = layer.getAttributeManager().getAttributes(); t.deepEqual( - attributes.filterCategoryValues.value, - [0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0], + attributes.filterCategoryValues.value.slice(0, 4), + [0, 0, 1, 1], 'filterCategoryValues attribute is populated' ); t.notOk(attributes.filterValues, 'filterValues attribute is not populated'); diff --git a/test/modules/aggregation-layers/gpu-grid-layer/gpu-grid-layer.spec.ts b/test/modules/gpu-grid-layer.spec.ts similarity index 100% rename from test/modules/aggregation-layers/gpu-grid-layer/gpu-grid-layer.spec.ts rename to test/modules/gpu-grid-layer.spec.ts diff --git a/test/modules/index.ts b/test/modules/index.ts index 3ca152e4949..a7290abda3e 100644 --- a/test/modules/index.ts +++ b/test/modules/index.ts @@ -18,17 +18,22 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. -import './aggregation-layers'; +// Core +import './imports-spec'; import './core'; -import './carto'; -import './extensions'; + +// Layers and extensions +import './layers'; +import './mesh-layers'; import './geo-layers'; +import './aggregation-layers'; +import './extensions'; + +// Integration +import './carto'; +import './mapbox'; import './google-maps'; -import './imports-spec'; import './json'; import './jupyter-widget'; -import './layers'; -import './mapbox'; -import './mesh-layers'; import './react'; import './main/bundle'; diff --git a/test/modules/json/index.ts b/test/modules/json/index.ts index abc460444e9..3da271c0cb5 100644 --- a/test/modules/json/index.ts +++ b/test/modules/json/index.ts @@ -1,3 +1,4 @@ +import './utils/expression-eval.spec'; import './utils/get.spec'; import './utils/shallow-equal-objects.spec'; diff --git a/test/modules/json/utils/expression-eval.spec.ts b/test/modules/json/utils/expression-eval.spec.ts new file mode 100644 index 00000000000..8eb9e8585ee --- /dev/null +++ b/test/modules/json/utils/expression-eval.spec.ts @@ -0,0 +1,181 @@ +import test from 'tape-promise/tape'; +import {compile, compileAsync, addUnaryOp, addBinaryOp} from '@deck.gl/json/utils/expression-eval'; + +const fixtures = [ + // array expression + {expr: '([1,2,3])[0]', expected: 1}, + {expr: '(["one","two","three"])[1]', expected: 'two'}, + {expr: '([true,false,true])[2]', expected: true}, + {expr: '([1,true,"three"]).length', expected: 3}, + {expr: 'isArray([1,2,3])', expected: true}, + {expr: 'list[3]', expected: 4}, + {expr: 'numMap[1 + two]', expected: 'three'}, + + // binary expression + {expr: '1+2', expected: 3}, + {expr: '2-1', expected: 1}, + {expr: '2*2', expected: 4}, + {expr: '6/3', expected: 2}, + {expr: '5|3', expected: 7}, + {expr: '5&3', expected: 1}, + {expr: '5^3', expected: 6}, + {expr: '4<<2', expected: 16}, + {expr: '256>>4', expected: 16}, + {expr: '-14>>>2', expected: 1073741820}, + {expr: '10%6', expected: 4}, + {expr: '"a"+"b"', expected: 'ab'}, + {expr: 'one + three', expected: 4}, + + // call expression + {expr: 'func(5)', expected: 6}, + {expr: 'func(1+2)', expected: 4}, + + // conditional expression + {expr: '(true ? "true" : "false")', expected: 'true'}, + {expr: '( ( bool || false ) ? "true" : "false")', expected: 'true'}, + {expr: '( true ? ( 123*456 ) : "false")', expected: 123 * 456}, + {expr: '( false ? "true" : one + two )', expected: 3}, + + // identifier + {expr: 'string', expected: 'string'}, + {expr: 'number', expected: 123}, + {expr: 'bool', expected: true}, + + // literal + {expr: '"foo"', expected: 'foo'}, // string literal + {expr: "'foo'", expected: 'foo'}, // string literal + {expr: '123', expected: 123}, // numeric literal + {expr: 'true', expected: true}, // boolean literal + + // logical expression + {expr: 'true || false', expected: true}, + {expr: 'true && false', expected: false}, + {expr: '1 == "1"', expected: true}, + {expr: '2 != "2"', expected: false}, + {expr: '1.234 === 1.234', expected: true}, + {expr: '123 !== "123"', expected: true}, + {expr: '1 < 2', expected: true}, + {expr: '1 > 2', expected: false}, + {expr: '2 <= 2', expected: true}, + {expr: '1 >= 2', expected: false}, + + // logical expression lazy evaluation + {expr: 'true || throw()', expected: true}, + {expr: 'false || true', expected: true}, + {expr: 'false && throw()', expected: false}, + {expr: 'true && false', expected: false}, + + // member expression + {expr: 'foo.bar', expected: 'baz'}, + {expr: 'foo["bar"]', expected: 'baz'}, + {expr: 'foo[foo.bar]', expected: 'wow'}, + + // call expression with member + {expr: 'foo.func("bar")', expected: 'baz'}, + + // unary expression + {expr: '-one', expected: -1}, + {expr: '+two', expected: 2}, + {expr: '!false', expected: true}, + {expr: '!!true', expected: true}, + {expr: '~15', expected: -16}, + {expr: '+[]', expected: 0}, + + // 'this' context + {expr: 'this.three', expected: 3}, + + // custom operators + {expr: '@2', expected: 'two'}, + {expr: '3#4', expected: 3.4}, + {expr: '(1 # 2 # 3)', expected: 1.5}, // Fails with undefined precedence, see issue #45 + {expr: '1 + 2 ~ 3', expected: 9} // ~ is * but with low precedence +]; + +const context = { + string: 'string', + number: 123, + bool: true, + one: 1, + two: 2, + three: 3, + foo: { + bar: 'baz', + baz: 'wow', + func: function (x) { + return this[x]; + } + }, + numMap: {10: 'ten', 3: 'three'}, + list: [1, 2, 3, 4, 5], + func: function (x) { + return x + 1; + }, + isArray: Array.isArray, + throw: () => { + throw new Error('Should not be called.'); + } +}; + +addUnaryOp('@', a => { + if (a === 2) { + return 'two'; + } + throw new Error('Unexpected value: ' + a); +}); + +addBinaryOp('#', (a: number, b: number) => a + b / 10); + +addBinaryOp('~', 1, (a: number, b: number) => a * b); + +test('sync', t => { + fixtures.forEach(o => { + const val = compile(o.expr)(context); + t.equal(val, o.expected, `${o.expr} (${val}) === ${o.expected}`); + }); + + t.end(); +}); + +test('async', async t => { + const asyncContext = context; + (asyncContext as Record).asyncFunc = async function ( + a: number | Promise, + b: number + ) { + return (await a) + b; + }; + (asyncContext as Record).promiseFunc = function (a: number, b: number) { + return new Promise(resolve => setTimeout(() => resolve(a + b), 1000)); + }; + const asyncFixtures = fixtures; + asyncFixtures.push( + { + expr: 'asyncFunc(one, two)', + expected: 3 + }, + { + expr: 'promiseFunc(one, two)', + expected: 3 + } + ); + + for (let o of asyncFixtures) { + const val = await compileAsync(o.expr)(asyncContext); + t.equal(val, o.expected, `${o.expr} (${val}) === ${o.expected}`); + } + t.end(); +}); + +test('errors', async t => { + const expectedMsg = /Access to member "\w+" disallowed/; + t.throws(() => compile(`o.__proto__`)({o: {}}), expectedMsg, '.__proto__'); + t.throws(() => compile(`o.prototype`)({o: {}}), expectedMsg, '.prototype'); + t.throws(() => compile(`o.constructor`)({o: {}}), expectedMsg, '.constructor'); + t.throws(() => compile(`o['__proto__']`)({o: {}}), expectedMsg, '["__proto__"]'); + t.throws(() => compile(`o['prototype']`)({o: {}}), expectedMsg, '["prototype"]'); + t.throws(() => compile(`o['constructor']`)({o: {}}), expectedMsg, '["constructor"]'); + t.throws(() => compile(`o[p]`)({o: {}, p: '__proto__'}), expectedMsg, '[~__proto__]'); + t.throws(() => compile(`o[p]`)({o: {}, p: 'prototype'}), expectedMsg, '[~prototype]'); + t.throws(() => compile(`o[p]`)({o: {}, p: 'constructor'}), expectedMsg, '[~constructor]'); + t.end(); +}); diff --git a/test/modules/layers/geojson-layer.spec.ts b/test/modules/layers/geojson-layer.spec.ts index 91fcd651d6a..624ac6df14f 100644 --- a/test/modules/layers/geojson-layer.spec.ts +++ b/test/modules/layers/geojson-layer.spec.ts @@ -218,7 +218,7 @@ test('GeoJsonLayer#tests', t => { subLayers.every(_subLayer => _subLayer.props.data.attributes.getFilterValue), 'every subLayer should receive getFilterValue binary attribute' ); - const uniforms = getLayerUniforms(subLayer); + const uniforms = getLayerUniforms(subLayer, 'dataFilter'); t.is(uniforms.min, 1, 'has correct uniforms'); t.is(uniforms.max, 1, 'has correct uniforms'); t.is(uniforms.useSoftMargin, false, 'has correct uniforms'); diff --git a/test/render/golden-images/contour-isobands-lnglat.png b/test/render/golden-images/contour-isobands-lnglat.png index 873aec25a18..5152f12083c 100644 Binary files a/test/render/golden-images/contour-isobands-lnglat.png and b/test/render/golden-images/contour-isobands-lnglat.png differ diff --git a/test/render/golden-images/contour-lnglat.png b/test/render/golden-images/contour-lnglat.png index 6a2c146f372..b8207f5b53c 100644 Binary files a/test/render/golden-images/contour-lnglat.png and b/test/render/golden-images/contour-lnglat.png differ diff --git a/test/render/golden-images/cpu-layer-ordinal.png b/test/render/golden-images/cpu-layer-ordinal.png index 951719985f2..0b42a5d18d7 100644 Binary files a/test/render/golden-images/cpu-layer-ordinal.png and b/test/render/golden-images/cpu-layer-ordinal.png differ diff --git a/test/render/golden-images/cpu-layer-quantile.png b/test/render/golden-images/cpu-layer-quantile.png index 7781c50f34c..7ea565d9090 100644 Binary files a/test/render/golden-images/cpu-layer-quantile.png and b/test/render/golden-images/cpu-layer-quantile.png differ diff --git a/test/render/golden-images/grid-lnglat-side.png b/test/render/golden-images/grid-lnglat-side.png index 03a8d54fa9f..8e6e964ddc4 100644 Binary files a/test/render/golden-images/grid-lnglat-side.png and b/test/render/golden-images/grid-lnglat-side.png differ diff --git a/test/render/golden-images/grid-lnglat.png b/test/render/golden-images/grid-lnglat.png index 4133df51ad4..b5475b63273 100644 Binary files a/test/render/golden-images/grid-lnglat.png and b/test/render/golden-images/grid-lnglat.png differ diff --git a/test/render/index.js b/test/render/index.js index 7c776491a1a..be9f722a799 100644 --- a/test/render/index.js +++ b/test/render/index.js @@ -25,11 +25,13 @@ import {SnapshotTestRunner} from '@deck.gl/test-utils'; import './jupyter-widget'; test('Render Test', t => { + const testCases = TEST_CASES; // .filter(testCase => testCase.name === 'geojson-icon'); + // tape's default timeout is 500ms - t.timeoutAfter(TEST_CASES.length * 10000 + 10000); + t.timeoutAfter(testCases.length * 10000 + 10000); new SnapshotTestRunner({width: WIDTH, height: HEIGHT}) - .add(TEST_CASES) + .add(testCases) .run({ onTestStart: testCase => t.comment(testCase.name), onTestPass: (testCase, result) => t.pass(`match: ${result.matchPercentage}`), diff --git a/test/render/test-cases/column-layer.js b/test/render/test-cases/column-layer.ts similarity index 97% rename from test/render/test-cases/column-layer.js rename to test/render/test-cases/column-layer.ts index ae1056a3ca0..d2875e228b6 100644 --- a/test/render/test-cases/column-layer.js +++ b/test/render/test-cases/column-layer.ts @@ -1,6 +1,7 @@ import {ColumnLayer, GridCellLayer} from '@deck.gl/layers'; import {GL} from '@luma.gl/constants'; import {hexagons, worldGrid} from 'deck.gl-test/data'; +import type {SnapshotTestCase} from '@deck.gl/test-utils'; const cullBackParameters = { cull: true, @@ -15,7 +16,7 @@ export const polygonCCW = [ [0, -1, 0] ]; -function genColumnLayerTestCase(settings, props = {}, visState = {}) { +function genColumnLayerTestCase(settings, props = {}, visState = {}): SnapshotTestCase { return { name: settings.name, viewState: { diff --git a/test/render/test-cases/contour-layer.js b/test/render/test-cases/contour-layer.js index 5b17933eeaf..148218d44e9 100644 --- a/test/render/test-cases/contour-layer.js +++ b/test/render/test-cases/contour-layer.js @@ -23,6 +23,7 @@ export default [ getPosition: d => d, coordinateSystem: COORDINATE_SYSTEM.CARTESIAN, cellSize: 40, + gridOrigin: [0, 15], contours: [ {threshold: 1, color: [50, 50, 50]}, {threshold: 2, color: [100, 100, 100]}, @@ -49,6 +50,7 @@ export default [ getPosition: d => d, coordinateSystem: COORDINATE_SYSTEM.CARTESIAN, cellSize: 40, + gridOrigin: [0, 15], contours: [ {threshold: [1, 2], color: [150, 0, 0]}, {threshold: [2, 5], color: [0, 150, 0]} diff --git a/test/render/test-cases/grid-layer.js b/test/render/test-cases/grid-layer.js index 4bc1a0c642d..f7918198c8b 100644 --- a/test/render/test-cases/grid-layer.js +++ b/test/render/test-cases/grid-layer.js @@ -1,4 +1,4 @@ -import {GPUGridLayer, GridLayer, CPUGridLayer} from '@deck.gl/aggregation-layers'; +import {GridLayer} from '@deck.gl/aggregation-layers'; import * as dataSamples from 'deck.gl-test/data'; const VIEW_STATE = { @@ -48,14 +48,14 @@ export default [ name: 'cpu-grid-layer:quantile', viewState: VIEW_STATE, layers: [ - new CPUGridLayer( - Object.assign({}, PROPS, { - id: 'cpu-grid-layer:quantile', - getColorValue: points => getMean(points, 'SPACES'), - getElevationValue: points => getMax(points, 'SPACES'), - colorScaleType: 'quantile' - }) - ) + new GridLayer({ + ...PROPS, + gpuAggregation: false, + id: 'cpu-grid-layer:quantile', + getColorValue: points => getMean(points, 'SPACES'), + getElevationValue: points => getMax(points, 'SPACES'), + colorScaleType: 'quantile' + }) ], goldenImage: './test/render/golden-images/cpu-layer-quantile.png' }, @@ -63,128 +63,98 @@ export default [ name: 'cpu-grid-layer:ordinal', viewState: VIEW_STATE, layers: [ - new CPUGridLayer( - Object.assign({}, PROPS, { - id: 'cpu-grid-layer:ordinal', - getColorValue: points => getMean(points, 'SPACES'), - getElevationValue: points => getMax(points, 'SPACES'), - colorScaleType: 'ordinal' - }) - ) + new GridLayer({ + ...PROPS, + gpuAggregation: false, + id: 'cpu-grid-layer:ordinal', + getColorValue: points => getMean(points, 'SPACES'), + getElevationValue: points => getMax(points, 'SPACES'), + colorScaleType: 'ordinal' + }) ], goldenImage: './test/render/golden-images/cpu-layer-ordinal.png' }, { - name: 'cpu-grid-layer:value-accessors', + name: 'grid-layer#cpu:value-accessors', viewState: VIEW_STATE, layers: [ - new CPUGridLayer( - Object.assign({}, PROPS, { - id: 'cpu-grid-layer:value-accessors', - getColorValue: points => getMean(points, 'SPACES'), - getElevationValue: points => getMax(points, 'SPACES') - }) - ) + new GridLayer({ + ...PROPS, + id: 'grid-layer#cpu-1', + gpuAggregation: false, + getColorValue: points => getMean(points, 'SPACES'), + getElevationValue: points => getMax(points, 'SPACES') + }) ], goldenImage: GOLDEN_IMAGE }, { - name: 'cpu-grid-layer:weight-accessors and operation', + name: 'grid-layer#cpu:weight-accessors and operation', viewState: VIEW_STATE, layers: [ - new CPUGridLayer( - Object.assign({}, PROPS, { - id: 'cpu-grid-layer:weight-accessors and operation', - getColorWeight: x => x.SPACES, - colorAggregation: 'MEAN', - getElevationWeight: x => x.SPACES, - elevationAggregation: 'MAX' - }) - ) + new GridLayer({ + ...PROPS, + id: 'grid-layer#cpu-2', + gpuAggregation: false, + getColorWeight: x => x.SPACES, + colorAggregation: 'MEAN', + getElevationWeight: x => x.SPACES, + elevationAggregation: 'MAX' + }) ], goldenImage: GOLDEN_IMAGE }, { - name: 'grid-layer:cpu', + name: 'grid-layer#gpu', viewState: VIEW_STATE, layers: [ - new GridLayer( - Object.assign({}, PROPS, { - id: 'grid-layer:cpu', - getColorWeight: x => x.SPACES, - colorAggregation: 'MEAN', - getElevationWeight: x => x.SPACES, - elevationAggregation: 'MAX', - gpuAggregation: false - }) - ) + new GridLayer({ + ...PROPS, + id: 'grid-layer#gpu', + gpuAggregation: true, + getColorWeight: x => x.SPACES, + colorAggregation: 'MEAN', + getElevationWeight: x => x.SPACES, + elevationAggregation: 'MAX', + gpuAggregation: true + }) ], goldenImage: GOLDEN_IMAGE }, { - name: 'grid-layer:gpu', - viewState: VIEW_STATE, - layers: [ - new GridLayer( - Object.assign({}, PROPS, { - id: 'grid-layer:gpu', - getColorWeight: x => x.SPACES, - colorAggregation: 'MEAN', - getElevationWeight: x => x.SPACES, - elevationAggregation: 'MAX', - gpuAggregation: true - }) - ) - ], - goldenImage: GOLDEN_IMAGE - }, - { - name: 'grid-layer:cpu-side', + name: 'grid-layer#cpu:side', viewState: VIEW_STATE_SIDE, layers: [ - new GridLayer( - Object.assign({}, PROPS, { - id: 'grid-layer:cpu-side', - getColorWeight: x => x.SPACES, - colorAggregation: 'MEAN', - getElevationWeight: x => x.SPACES, - elevationAggregation: 'MAX', - gpuAggregation: false, - elevationScale: 5 - }) - ) + new GridLayer({ + ...PROPS, + id: 'grid-layer#cpu', + gpuAggregation: false, + getColorWeight: x => x.SPACES, + colorAggregation: 'MEAN', + getElevationWeight: x => x.SPACES, + elevationAggregation: 'MAX', + gpuAggregation: false, + elevationScale: 5 + }) ], goldenImage: GOLDEN_IMAGE_SIDE }, { - name: 'grid-layer:gpu-side', + name: 'grid-layer#gpu:side', viewState: VIEW_STATE_SIDE, layers: [ - new GridLayer( - Object.assign({}, PROPS, { - id: 'grid-layer:gpu-side', - getColorWeight: x => x.SPACES, - colorAggregation: 'MEAN', - getElevationWeight: x => x.SPACES, - elevationAggregation: 'MAX', - gpuAggregation: true, - elevationScale: 5 - }) - ) + new GridLayer({ + ...PROPS, + id: 'grid-layer#gpu', + gpuAggregation: true, + getColorWeight: x => x.SPACES, + colorAggregation: 'MEAN', + getElevationWeight: x => x.SPACES, + elevationAggregation: 'MAX', + gpuAggregation: true, + elevationScale: 5 + }) ], goldenImage: GOLDEN_IMAGE_SIDE - }, - { - name: 'gpu-grid-lnglat', - viewState: VIEW_STATE, - layers: [ - new GPUGridLayer( - Object.assign({}, PROPS, { - id: 'gpu-grid-lnglat', - gpuAggregation: true - }) - ) - ], - goldenImage: './test/render/golden-images/gpu-grid-lnglat.png' } ]; diff --git a/test/render/test-cases/hexagon-layer.js b/test/render/test-cases/hexagon-layer.js index 3f39b77661b..a78c1381299 100644 --- a/test/render/test-cases/hexagon-layer.js +++ b/test/render/test-cases/hexagon-layer.js @@ -25,32 +25,47 @@ const GOLDEN_IMAGE = './test/render/golden-images/hexagon-lnglat.png'; export default [ { - name: 'hexagon-lnglat:value-accessors', + name: 'hexagon#cpu:value-accessors', viewState: VIEW_STATE, layers: [ - new HexagonLayer( - Object.assign({}, PROPS, { - id: 'hexagon-lnglat:value-accessors', - getColorValue: points => getMean(points, 'SPACES'), - getElevationValue: points => getMax(points, 'SPACES') - }) - ) + new HexagonLayer({ + ...PROPS, + id: 'hexagon#cpu-1', + getColorValue: points => getMean(points, 'SPACES'), + getElevationValue: points => getMax(points, 'SPACES') + }) ], goldenImage: GOLDEN_IMAGE }, { - name: 'hexagon:weight-accessors and operation', + name: 'hexagon#cpu:weight-accessors and operation', viewState: VIEW_STATE, layers: [ - new HexagonLayer( - Object.assign({}, PROPS, { - id: 'hexagon-lnglat:weight-accessors and operation', - getColorWeight: x => x.SPACES, - colorAggregation: 'MEAN', - getElevationWeight: x => x.SPACES, - elevationAggregation: 'MAX' - }) - ) + new HexagonLayer({ + ...PROPS, + id: 'hexagon#cpu-2', + gpuAggregation: false, + getColorWeight: x => x.SPACES, + colorAggregation: 'MEAN', + getElevationWeight: x => x.SPACES, + elevationAggregation: 'MAX' + }) + ], + goldenImage: GOLDEN_IMAGE + }, + { + name: 'hexagon#gpu', + viewState: VIEW_STATE, + layers: [ + new HexagonLayer({ + ...PROPS, + id: 'hexagon#gpu', + gpuAggregation: true, + getColorWeight: x => x.SPACES, + colorAggregation: 'MEAN', + getElevationWeight: x => x.SPACES, + elevationAggregation: 'MAX' + }) ], goldenImage: GOLDEN_IMAGE } diff --git a/test/render/test-cases/index.js b/test/render/test-cases/index.js index db339f4ba33..073c891d654 100644 --- a/test/render/test-cases/index.js +++ b/test/render/test-cases/index.js @@ -42,11 +42,11 @@ export default [].concat( polygonLayerTests, iconLayerTests, textLayerTests, - // contourLayerTests, - // gridLayerTests, + contourLayerTests, + gridLayerTests, hexagonLayerTests, screenGridLayerTests, - // heatmapLayerTests, + heatmapLayerTests, h3LayersTests, quadkeyLayerTests, s2LayerTests, diff --git a/test/render/test-cases/polygon-layer.js b/test/render/test-cases/polygon-layer.js index 3e7bdff5e03..7cba88613d0 100644 --- a/test/render/test-cases/polygon-layer.js +++ b/test/render/test-cases/polygon-layer.js @@ -210,6 +210,9 @@ export default [ widthMinPixels: 4 }) ], + imageDiffOptions: { + threshold: 0.985 + }, goldenImage: './test/render/golden-images/polygon-globe-extruded.png' } ]; diff --git a/website/package.json b/website/package.json index a779ed35c2e..bc97caa2982 100644 --- a/website/package.json +++ b/website/package.json @@ -1,6 +1,6 @@ { "name": "project-website", - "version": "9.0.0-beta.8", + "version": "9.1.0-alpha", "private": true, "description": "Website for vis.gl project", "scripts": { diff --git a/yarn.lock b/yarn.lock index a0ca3226e80..c9a5aa89ca3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,520 +2,320 @@ # yarn lockfile v1 -"@aashutoshrathi/word-wrap@^1.2.3": - version "1.2.6" - resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" - integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== +"@ampproject/remapping@^2.2.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" "@arcgis/core@^4.21.0": - version "4.29.9" - resolved "https://registry.yarnpkg.com/@arcgis/core/-/core-4.29.9.tgz#8e85a3cb6a7c7b5013e5c462fb8b7c1d4e639d5b" - integrity sha512-Un7CgnKmN3miGJbP8gd6iln5lgxoE0jnStYaBE5H3h8Ag6OSKaaULlj4ow7SRrOBUDSnU5xkMe1RRlhsZ5jqeQ== + version "4.30.9" + resolved "https://registry.yarnpkg.com/@arcgis/core/-/core-4.30.9.tgz#ab3db79d1829faf8faf3165c9087902cc23e7e0e" + integrity sha512-tOM6QmXRikmD26uqIsFk2yxBwUpmAYJjp4vd9tl+VEfAXaLyArjHC8/op/OvyJZtfHNiL5zcSR7/YsiUddHPXA== dependencies: - "@esri/arcgis-html-sanitizer" "~3.0.1" + "@esri/arcgis-html-sanitizer" "~4.0.3" "@esri/calcite-colors" "~6.1.0" - "@esri/calcite-components" "^2.4.0" - "@popperjs/core" "~2.11.8" - "@vaadin/grid" "~24.3.6" - "@zip.js/zip.js" "~2.7.34" + "@esri/calcite-components" "^2.8.5" + "@vaadin/grid" "~24.3.13" + "@zip.js/zip.js" "~2.7.44" luxon "~3.4.4" + marked "~12.0.2" sortablejs "~1.15.2" "@babel/cli@^7.14.5": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.15.4.tgz#00e21e192b738dec7900c8bb36270e377217c0a4" - integrity sha512-9RhhQ7tgKRcSO/jI3rNLxalLSk30cHqeM8bb+nGOJTyYBDpkoXw/A9QHZ2SYjlslAt4tr90pZQGIEobwWHSIDw== + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.24.8.tgz#79eaa55a69c77cafbea3e87537fd1df5a5a2edf8" + integrity sha512-isdp+G6DpRyKc+3Gqxy2rjzgF7Zj9K0mzLNnxz+E/fgeag8qT3vVulX4gY9dGO1q0y+0lUv6V3a+uhUzMzrwXg== dependencies: - commander "^4.0.1" - convert-source-map "^1.1.0" + "@jridgewell/trace-mapping" "^0.3.25" + commander "^6.2.0" + convert-source-map "^2.0.0" fs-readdir-recursive "^1.1.0" - glob "^7.0.0" + glob "^7.2.0" make-dir "^2.1.0" slash "^2.0.0" - source-map "^0.5.0" optionalDependencies: - "@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents.2" + "@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents.3" chokidar "^3.4.0" -"@babel/code-frame@^7.0.0": - version "7.22.13" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" - integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== - dependencies: - "@babel/highlight" "^7.22.13" - chalk "^2.4.2" - -"@babel/code-frame@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb" - integrity sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" + integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== dependencies: - "@babel/highlight" "^7.14.5" + "@babel/highlight" "^7.24.7" + picocolors "^1.0.0" -"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.15.0": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.15.0.tgz#2dbaf8b85334796cafbb0f5793a90a2fc010b176" - integrity sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA== +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.25.2", "@babel/compat-data@^7.25.4": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.25.4.tgz#7d2a80ce229890edcf4cc259d4d696cb4dae2fcb" + integrity sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ== "@babel/core@^7.14.5": - version "7.15.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.15.5.tgz#f8ed9ace730722544609f90c9bb49162dc3bf5b9" - integrity sha512-pYgXxiwAgQpgM1bNkZsDEq85f0ggXMA5L7c+o3tskGMh2BunCI9QUwB9Z4jpvXUOuMdyGKiGKQiRe11VS6Jzvg== - dependencies: - "@babel/code-frame" "^7.14.5" - "@babel/generator" "^7.15.4" - "@babel/helper-compilation-targets" "^7.15.4" - "@babel/helper-module-transforms" "^7.15.4" - "@babel/helpers" "^7.15.4" - "@babel/parser" "^7.15.5" - "@babel/template" "^7.15.4" - "@babel/traverse" "^7.15.4" - "@babel/types" "^7.15.4" - convert-source-map "^1.7.0" + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.25.2.tgz#ed8eec275118d7613e77a352894cd12ded8eba77" + integrity sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.25.0" + "@babel/helper-compilation-targets" "^7.25.2" + "@babel/helper-module-transforms" "^7.25.2" + "@babel/helpers" "^7.25.0" + "@babel/parser" "^7.25.0" + "@babel/template" "^7.25.0" + "@babel/traverse" "^7.25.2" + "@babel/types" "^7.25.2" + convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" - json5 "^2.1.2" - semver "^6.3.0" - source-map "^0.5.0" + json5 "^2.2.3" + semver "^6.3.1" "@babel/eslint-parser@^7.14.5": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.15.4.tgz#46385943726291fb3e8db99522c8099b15684387" - integrity sha512-hPMIAmGNbmQzXJIo2P43Zj9UhRmGev5f9nqdBFOWNGDGh6XKmjby79woBvg6y0Jur6yRfQBneDbUQ8ZVc1krFw== + version "7.25.1" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.25.1.tgz#469cee4bd18a88ff3edbdfbd227bd20e82aa9b82" + integrity sha512-Y956ghgTT4j7rKesabkh5WeqgSFZVFwaPR0IWFm7KFHFmmJ4afbG49SmfW4S+GyRPx0Dy5jxEWA5t0rpxfElWg== dependencies: - eslint-scope "^5.1.1" + "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" eslint-visitor-keys "^2.1.0" - semver "^6.3.0" + semver "^6.3.1" -"@babel/generator@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.15.4.tgz#85acb159a267ca6324f9793986991ee2022a05b0" - integrity sha512-d3itta0tu+UayjEORPNz6e1T3FtvWlP5N4V5M+lhp/CxT4oAA7/NcScnpRyspUMLK6tu9MNHmQHxRykuN2R7hw== +"@babel/generator@^7.25.0", "@babel/generator@^7.25.4": + version "7.25.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.5.tgz#b31cf05b3fe8c32d206b6dad03bb0aacbde73450" + integrity sha512-abd43wyLfbWoxC6ahM8xTkqLpGB2iWBVyuKC9/srhFunCd1SDNrV1s72bBpK4hLj8KLzHBBcOblvLQZBNw9r3w== dependencies: - "@babel/types" "^7.15.4" + "@babel/types" "^7.25.4" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" - source-map "^0.5.0" -"@babel/helper-annotate-as-pure@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz#5bf0d495a3f757ac3bda48b5bf3b3ba309c72ba3" - integrity sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA== - dependencies: - "@babel/types" "^7.10.4" - -"@babel/helper-annotate-as-pure@^7.14.5", "@babel/helper-annotate-as-pure@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.15.4.tgz#3d0e43b00c5e49fdb6c57e421601a7a658d5f835" - integrity sha512-QwrtdNvUNsPCj2lfNQacsGSQvGX8ee1ttrBrcozUP2Sv/jylewBP/8QFe6ZkBsC8T/GYWonNAWJV4aRR9AL2DA== - dependencies: - "@babel/types" "^7.15.4" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.14.5": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.15.4.tgz#21ad815f609b84ee0e3058676c33cf6d1670525f" - integrity sha512-P8o7JP2Mzi0SdC6eWr1zF+AEYvrsZa7GSY1lTayjF5XJhVH0kjLYUZPvTMflP7tBgZoe9gIhTa60QwFpqh/E0Q== +"@babel/helper-annotate-as-pure@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz#5373c7bc8366b12a033b4be1ac13a206c6656aab" + integrity sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg== dependencies: - "@babel/helper-explode-assignable-expression" "^7.15.4" - "@babel/types" "^7.15.4" + "@babel/types" "^7.24.7" -"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz#cf6d94f30fbefc139123e27dd6b02f65aeedb7b9" - integrity sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz#37d66feb012024f2422b762b9b2a7cfe27c7fba3" + integrity sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA== dependencies: - "@babel/compat-data" "^7.15.0" - "@babel/helper-validator-option" "^7.14.5" - browserslist "^4.16.6" - semver "^6.3.0" + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" -"@babel/helper-create-class-features-plugin@^7.14.5", "@babel/helper-create-class-features-plugin@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.4.tgz#7f977c17bd12a5fba363cb19bea090394bf37d2e" - integrity sha512-7ZmzFi+DwJx6A7mHRwbuucEYpyBwmh2Ca0RvI6z2+WLZYCqV0JOaLb+u0zbtmDicebgKBZgqbYfLaKNqSgv5Pw== +"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.24.7", "@babel/helper-compilation-targets@^7.24.8", "@babel/helper-compilation-targets@^7.25.2": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz#e1d9410a90974a3a5a66e84ff55ef62e3c02d06c" + integrity sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw== dependencies: - "@babel/helper-annotate-as-pure" "^7.15.4" - "@babel/helper-function-name" "^7.15.4" - "@babel/helper-member-expression-to-functions" "^7.15.4" - "@babel/helper-optimise-call-expression" "^7.15.4" - "@babel/helper-replace-supers" "^7.15.4" - "@babel/helper-split-export-declaration" "^7.15.4" + "@babel/compat-data" "^7.25.2" + "@babel/helper-validator-option" "^7.24.8" + browserslist "^4.23.1" + lru-cache "^5.1.1" + semver "^6.3.1" -"@babel/helper-create-regexp-features-plugin@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz#fdd60d88524659a0b6959c0579925e425714f3b8" - integrity sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g== - dependencies: - "@babel/helper-annotate-as-pure" "^7.10.4" - "@babel/helper-regex" "^7.10.4" - regexpu-core "^4.7.0" +"@babel/helper-create-class-features-plugin@^7.24.7", "@babel/helper-create-class-features-plugin@^7.25.0", "@babel/helper-create-class-features-plugin@^7.25.4": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.4.tgz#57eaf1af38be4224a9d9dd01ddde05b741f50e14" + integrity sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-member-expression-to-functions" "^7.24.8" + "@babel/helper-optimise-call-expression" "^7.24.7" + "@babel/helper-replace-supers" "^7.25.0" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" + "@babel/traverse" "^7.25.4" + semver "^6.3.1" -"@babel/helper-create-regexp-features-plugin@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz#c7d5ac5e9cf621c26057722fb7a8a4c5889358c4" - integrity sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A== +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.24.7", "@babel/helper-create-regexp-features-plugin@^7.25.0", "@babel/helper-create-regexp-features-plugin@^7.25.2": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz#24c75974ed74183797ffd5f134169316cd1808d9" + integrity sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g== dependencies: - "@babel/helper-annotate-as-pure" "^7.14.5" - regexpu-core "^4.7.1" + "@babel/helper-annotate-as-pure" "^7.24.7" + regexpu-core "^5.3.1" + semver "^6.3.1" -"@babel/helper-define-polyfill-provider@^0.2.2": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz#0525edec5094653a282688d34d846e4c75e9c0b6" - integrity sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew== +"@babel/helper-define-polyfill-provider@^0.6.2": + version "0.6.2" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz#18594f789c3594acb24cfdb4a7f7b7d2e8bd912d" + integrity sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ== dependencies: - "@babel/helper-compilation-targets" "^7.13.0" - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/traverse" "^7.13.0" + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" debug "^4.1.1" lodash.debounce "^4.0.8" resolve "^1.14.2" - semver "^6.1.2" - -"@babel/helper-explode-assignable-expression@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.15.4.tgz#f9aec9d219f271eaf92b9f561598ca6b2682600c" - integrity sha512-J14f/vq8+hdC2KoWLIQSsGrC9EFBKE4NFts8pfMpymfApds+fPqR30AOUWc4tyr56h9l/GA1Sxv2q3dLZWbQ/g== - dependencies: - "@babel/types" "^7.15.4" - -"@babel/helper-function-name@^7.14.5", "@babel/helper-function-name@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz#845744dafc4381a4a5fb6afa6c3d36f98a787ebc" - integrity sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw== - dependencies: - "@babel/helper-get-function-arity" "^7.15.4" - "@babel/template" "^7.15.4" - "@babel/types" "^7.15.4" - -"@babel/helper-get-function-arity@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz#098818934a137fce78b536a3e015864be1e2879b" - integrity sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA== - dependencies: - "@babel/types" "^7.15.4" - -"@babel/helper-hoist-variables@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz#09993a3259c0e918f99d104261dfdfc033f178df" - integrity sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA== - dependencies: - "@babel/types" "^7.15.4" -"@babel/helper-member-expression-to-functions@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz#bfd34dc9bba9824a4658b0317ec2fd571a51e6ef" - integrity sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA== - dependencies: - "@babel/types" "^7.15.4" - -"@babel/helper-module-imports@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz#ec67e4404f41750463e455cc3203f6a32e93fcb0" - integrity sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g== - dependencies: - "@babel/types" "^7.12.13" - -"@babel/helper-module-imports@^7.14.5", "@babel/helper-module-imports@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz#e18007d230632dea19b47853b984476e7b4e103f" - integrity sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA== - dependencies: - "@babel/types" "^7.15.4" - -"@babel/helper-module-transforms@^7.14.5", "@babel/helper-module-transforms@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.15.4.tgz#962cc629a7f7f9a082dd62d0307fa75fe8788d7c" - integrity sha512-9fHHSGE9zTC++KuXLZcB5FKgvlV83Ox+NLUmQTawovwlJ85+QMhk1CnVk406CQVj97LaWod6KVjl2Sfgw9Aktw== - dependencies: - "@babel/helper-module-imports" "^7.15.4" - "@babel/helper-replace-supers" "^7.15.4" - "@babel/helper-simple-access" "^7.15.4" - "@babel/helper-split-export-declaration" "^7.15.4" - "@babel/helper-validator-identifier" "^7.14.9" - "@babel/template" "^7.15.4" - "@babel/traverse" "^7.15.4" - "@babel/types" "^7.15.4" - -"@babel/helper-optimise-call-expression@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz#f310a5121a3b9cc52d9ab19122bd729822dee171" - integrity sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw== - dependencies: - "@babel/types" "^7.15.4" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.8.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670" - integrity sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ== - -"@babel/helper-plugin-utils@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" - integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== - -"@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.3": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" - integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== - -"@babel/helper-regex@^7.10.4": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.10.5.tgz#32dfbb79899073c415557053a19bd055aae50ae0" - integrity sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg== - dependencies: - lodash "^4.17.19" - -"@babel/helper-remap-async-to-generator@^7.14.5", "@babel/helper-remap-async-to-generator@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.15.4.tgz#2637c0731e4c90fbf58ac58b50b2b5a192fc970f" - integrity sha512-v53MxgvMK/HCwckJ1bZrq6dNKlmwlyRNYM6ypaRTdXWGOE2c1/SCa6dL/HimhPulGhZKw9W0QhREM583F/t0vQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.15.4" - "@babel/helper-wrap-function" "^7.15.4" - "@babel/types" "^7.15.4" - -"@babel/helper-replace-supers@^7.14.5", "@babel/helper-replace-supers@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz#52a8ab26ba918c7f6dee28628b07071ac7b7347a" - integrity sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.15.4" - "@babel/helper-optimise-call-expression" "^7.15.4" - "@babel/traverse" "^7.15.4" - "@babel/types" "^7.15.4" - -"@babel/helper-simple-access@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz#ac368905abf1de8e9781434b635d8f8674bcc13b" - integrity sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg== - dependencies: - "@babel/types" "^7.15.4" - -"@babel/helper-skip-transparent-expression-wrappers@^7.14.5", "@babel/helper-skip-transparent-expression-wrappers@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.15.4.tgz#707dbdba1f4ad0fa34f9114fc8197aec7d5da2eb" - integrity sha512-BMRLsdh+D1/aap19TycS4eD1qELGrCBJwzaY9IE8LrpJtJb+H7rQkPIdsfgnMtLBA6DJls7X9z93Z4U8h7xw0A== - dependencies: - "@babel/types" "^7.15.4" - -"@babel/helper-split-export-declaration@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz#aecab92dcdbef6a10aa3b62ab204b085f776e257" - integrity sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw== - dependencies: - "@babel/types" "^7.15.4" - -"@babel/helper-validator-identifier@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" - integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== - -"@babel/helper-validator-identifier@^7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" - integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== - -"@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9": - version "7.14.9" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz#6654d171b2024f6d8ee151bf2509699919131d48" - integrity sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g== - -"@babel/helper-validator-identifier@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" - integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== - -"@babel/helper-validator-option@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" - integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== - -"@babel/helper-wrap-function@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.15.4.tgz#6f754b2446cfaf3d612523e6ab8d79c27c3a3de7" - integrity sha512-Y2o+H/hRV5W8QhIfTpRIBwl57y8PrZt6JM3V8FOo5qarjshHItyH5lXlpMfBfmBefOqSCpKZs/6Dxqp0E/U+uw== - dependencies: - "@babel/helper-function-name" "^7.15.4" - "@babel/template" "^7.15.4" - "@babel/traverse" "^7.15.4" - "@babel/types" "^7.15.4" - -"@babel/helpers@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.15.4.tgz#5f40f02050a3027121a3cf48d497c05c555eaf43" - integrity sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ== - dependencies: - "@babel/template" "^7.15.4" - "@babel/traverse" "^7.15.4" - "@babel/types" "^7.15.4" - -"@babel/highlight@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" - integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== - dependencies: - "@babel/helper-validator-identifier" "^7.14.5" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/highlight@^7.22.13": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" - integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== - dependencies: - "@babel/helper-validator-identifier" "^7.22.20" +"@babel/helper-member-expression-to-functions@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz#6155e079c913357d24a4c20480db7c712a5c3fb6" + integrity sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA== + dependencies: + "@babel/traverse" "^7.24.8" + "@babel/types" "^7.24.8" + +"@babel/helper-module-imports@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b" + integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-module-transforms@^7.24.7", "@babel/helper-module-transforms@^7.24.8", "@babel/helper-module-transforms@^7.25.0", "@babel/helper-module-transforms@^7.25.2": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz#ee713c29768100f2776edf04d4eb23b8d27a66e6" + integrity sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ== + dependencies: + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-simple-access" "^7.24.7" + "@babel/helper-validator-identifier" "^7.24.7" + "@babel/traverse" "^7.25.2" + +"@babel/helper-optimise-call-expression@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz#8b0a0456c92f6b323d27cfd00d1d664e76692a0f" + integrity sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A== + dependencies: + "@babel/types" "^7.24.7" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.24.8", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz#94ee67e8ec0e5d44ea7baeb51e571bd26af07878" + integrity sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg== + +"@babel/helper-remap-async-to-generator@^7.24.7", "@babel/helper-remap-async-to-generator@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz#d2f0fbba059a42d68e5e378feaf181ef6055365e" + integrity sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-wrap-function" "^7.25.0" + "@babel/traverse" "^7.25.0" + +"@babel/helper-replace-supers@^7.24.7", "@babel/helper-replace-supers@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz#ff44deac1c9f619523fe2ca1fd650773792000a9" + integrity sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.24.8" + "@babel/helper-optimise-call-expression" "^7.24.7" + "@babel/traverse" "^7.25.0" + +"@babel/helper-simple-access@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz#bcade8da3aec8ed16b9c4953b74e506b51b5edb3" + integrity sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-skip-transparent-expression-wrappers@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz#5f8fa83b69ed5c27adc56044f8be2b3ea96669d9" + integrity sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-string-parser@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d" + integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== + +"@babel/helper-validator-identifier@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" + integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== + +"@babel/helper-validator-option@^7.24.7", "@babel/helper-validator-option@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz#3725cdeea8b480e86d34df15304806a06975e33d" + integrity sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q== + +"@babel/helper-wrap-function@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz#dab12f0f593d6ca48c0062c28bcfb14ebe812f81" + integrity sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ== + dependencies: + "@babel/template" "^7.25.0" + "@babel/traverse" "^7.25.0" + "@babel/types" "^7.25.0" + +"@babel/helpers@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.25.0.tgz#e69beb7841cb93a6505531ede34f34e6a073650a" + integrity sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw== + dependencies: + "@babel/template" "^7.25.0" + "@babel/types" "^7.25.0" + +"@babel/highlight@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" + integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== + dependencies: + "@babel/helper-validator-identifier" "^7.24.7" chalk "^2.4.2" js-tokens "^4.0.0" + picocolors "^1.0.0" -"@babel/parser@^7.15.4", "@babel/parser@^7.15.5": - version "7.15.6" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.6.tgz#043b9aa3c303c0722e5377fef9197f4cf1796549" - integrity sha512-S/TSCcsRuCkmpUuoWijua0Snt+f3ewU/8spLo+4AXJCZfT0bVCzLD5MuOKdrx0mlAptbKzn5AdgEIIKXxXkz9Q== - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.15.4.tgz#dbdeabb1e80f622d9f0b583efb2999605e0a567e" - integrity sha512-eBnpsl9tlhPhpI10kU06JHnrYXwg3+V6CaP2idsCXNef0aeslpqyITXQ74Vfk5uHgY7IG7XP0yIH8b42KSzHog== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.15.4" - "@babel/plugin-proposal-optional-chaining" "^7.14.5" - -"@babel/plugin-proposal-async-generator-functions@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.15.4.tgz#f82aabe96c135d2ceaa917feb9f5fca31635277e" - integrity sha512-2zt2g5vTXpMC3OmK6uyjvdXptbhBXfA77XGrd3gh93zwG8lZYBLOBImiGBEG0RANu3JqKEACCz5CGk73OJROBw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-remap-async-to-generator" "^7.15.4" - "@babel/plugin-syntax-async-generators" "^7.8.4" - -"@babel/plugin-proposal-class-properties@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz#40d1ee140c5b1e31a350f4f5eed945096559b42e" - integrity sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-proposal-class-static-block@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.15.4.tgz#3e7ca6128453c089e8b477a99f970c63fc1cb8d7" - integrity sha512-M682XWrrLNk3chXCjoPUQWOyYsB93B9z3mRyjtqqYJWDf2mfCdIYgDrA11cgNVhAQieaq6F2fn2f3wI0U4aTjA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.15.4" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - -"@babel/plugin-proposal-dynamic-import@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz#0c6617df461c0c1f8fff3b47cd59772360101d2c" - integrity sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - -"@babel/plugin-proposal-export-namespace-from@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz#dbad244310ce6ccd083072167d8cea83a52faf76" - integrity sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - -"@babel/plugin-proposal-json-strings@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz#38de60db362e83a3d8c944ac858ddf9f0c2239eb" - integrity sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-json-strings" "^7.8.3" - -"@babel/plugin-proposal-logical-assignment-operators@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz#6e6229c2a99b02ab2915f82571e0cc646a40c738" - integrity sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - -"@babel/plugin-proposal-nullish-coalescing-operator@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz#ee38589ce00e2cc59b299ec3ea406fcd3a0fdaf6" - integrity sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - -"@babel/plugin-proposal-numeric-separator@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz#83631bf33d9a51df184c2102a069ac0c58c05f18" - integrity sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - -"@babel/plugin-proposal-object-rest-spread@^7.15.6": - version "7.15.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.15.6.tgz#ef68050c8703d07b25af402cb96cf7f34a68ed11" - integrity sha512-qtOHo7A1Vt+O23qEAX+GdBpqaIuD3i9VRrWgCJeq7WO6H2d14EK3q11urj5Te2MAeK97nMiIdRpwd/ST4JFbNg== +"@babel/parser@^7.25.0", "@babel/parser@^7.25.4": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.4.tgz#af4f2df7d02440286b7de57b1c21acfb2a6f257a" + integrity sha512-nq+eWrOgdtu3jG5Os4TQP3x3cLA8hR8TvJNjD8vnPa20WGycimcparWnLK4jJhElTK6SDyuJo1weMKO/5LpmLA== dependencies: - "@babel/compat-data" "^7.15.0" - "@babel/helper-compilation-targets" "^7.15.4" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.15.4" + "@babel/types" "^7.25.4" -"@babel/plugin-proposal-optional-catch-binding@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz#939dd6eddeff3a67fdf7b3f044b5347262598c3c" - integrity sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ== +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.3": + version "7.25.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.3.tgz#dca427b45a6c0f5c095a1c639dfe2476a3daba7f" + integrity sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/traverse" "^7.25.3" -"@babel/plugin-proposal-optional-chaining@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz#fa83651e60a360e3f13797eef00b8d519695b603" - integrity sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ== +"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.0.tgz#cd0c583e01369ef51676bdb3d7b603e17d2b3f73" + integrity sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/helper-plugin-utils" "^7.24.8" -"@babel/plugin-proposal-private-methods@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz#37446495996b2945f30f5be5b60d5e2aa4f5792d" - integrity sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g== +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.0.tgz#749bde80356b295390954643de7635e0dffabe73" + integrity sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.24.8" -"@babel/plugin-proposal-private-property-in-object@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.15.4.tgz#55c5e3b4d0261fd44fe637e3f624cfb0f484e3e5" - integrity sha512-X0UTixkLf0PCCffxgu5/1RQyGGbgZuKoI+vXP4iSbJSYwPb7hu06omsFGBvQ9lJEvwgrxHdS8B5nbfcd8GyUNA== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz#e4eabdd5109acc399b38d7999b2ef66fc2022f89" + integrity sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ== dependencies: - "@babel/helper-annotate-as-pure" "^7.15.4" - "@babel/helper-create-class-features-plugin" "^7.15.4" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" + "@babel/plugin-transform-optional-chaining" "^7.24.7" -"@babel/plugin-proposal-unicode-property-regex@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz#0f95ee0e757a5d647f378daa0eca7e93faa8bbe8" - integrity sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q== +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz#3a82a70e7cb7294ad2559465ebcb871dfbf078fb" + integrity sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/traverse" "^7.25.0" -"@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz#4483cda53041ce3413b7fe2f00022665ddfaa75d" - integrity sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": + version "7.21.0-placeholder-for-preset-env.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" + integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -552,6 +352,27 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" +"@babel/plugin-syntax-import-assertions@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz#2a0b406b5871a20a841240586b1300ce2088a778" + integrity sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-syntax-import-attributes@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz#b4f9ea95a79e6912480c4b626739f86a076624ca" + integrity sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-syntax-import-meta@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" @@ -559,12 +380,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz#000e2e25d8673cce49300517a3eda44c263e4201" - integrity sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw== +"@babel/plugin-syntax-jsx@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz#39a1fa4a7e3d3d7f34e2acc6be585b718d30e02d" + integrity sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" @@ -622,353 +443,493 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz#b82c6ce471b165b5ce420cf92914d6fb46225716" - integrity sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q== +"@babel/plugin-syntax-typescript@^7.24.7": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.4.tgz#04db9ce5a9043d9c635e75ae7969a2cd50ca97ff" + integrity sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.24.8" -"@babel/plugin-transform-arrow-functions@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz#f7187d9588a768dd080bf4c9ffe117ea62f7862a" - integrity sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A== +"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" + integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-async-to-generator@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz#72c789084d8f2094acb945633943ef8443d39e67" - integrity sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA== +"@babel/plugin-transform-arrow-functions@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz#4f6886c11e423bd69f3ce51dbf42424a5f275514" + integrity sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ== dependencies: - "@babel/helper-module-imports" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-remap-async-to-generator" "^7.14.5" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-block-scoped-functions@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz#e48641d999d4bc157a67ef336aeb54bc44fd3ad4" - integrity sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ== +"@babel/plugin-transform-async-generator-functions@^7.25.4": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.4.tgz#2afd4e639e2d055776c9f091b6c0c180ed8cf083" + integrity sha512-jz8cV2XDDTqjKPwVPJBIjORVEmSGYhdRa8e5k5+vN+uwcjSrSxUaebBRa4ko1jqNF2uxyg8G6XYk30Jv285xzg== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-remap-async-to-generator" "^7.25.0" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/traverse" "^7.25.4" -"@babel/plugin-transform-block-scoping@^7.15.3": - version "7.15.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.15.3.tgz#94c81a6e2fc230bcce6ef537ac96a1e4d2b3afaf" - integrity sha512-nBAzfZwZb4DkaGtOes1Up1nOAp9TDRRFw4XBzBBSG9QK7KVFmYzgj9o9sbPv7TX5ofL4Auq4wZnxCoPnI/lz2Q== +"@babel/plugin-transform-async-to-generator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz#72a3af6c451d575842a7e9b5a02863414355bdcc" + integrity sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-remap-async-to-generator" "^7.24.7" -"@babel/plugin-transform-classes@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.15.4.tgz#50aee17aaf7f332ae44e3bce4c2e10534d5d3bf1" - integrity sha512-Yjvhex8GzBmmPQUvpXRPWQ9WnxXgAFuZSrqOK/eJlOGIXwvv8H3UEdUigl1gb/bnjTrln+e8bkZUYCBt/xYlBg== +"@babel/plugin-transform-block-scoped-functions@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz#a4251d98ea0c0f399dafe1a35801eaba455bbf1f" + integrity sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ== dependencies: - "@babel/helper-annotate-as-pure" "^7.15.4" - "@babel/helper-function-name" "^7.15.4" - "@babel/helper-optimise-call-expression" "^7.15.4" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-replace-supers" "^7.15.4" - "@babel/helper-split-export-declaration" "^7.15.4" + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-block-scoping@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz#23a6ed92e6b006d26b1869b1c91d1b917c2ea2ac" + integrity sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.8" + +"@babel/plugin-transform-class-properties@^7.25.4": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.4.tgz#bae7dbfcdcc2e8667355cd1fb5eda298f05189fd" + integrity sha512-nZeZHyCWPfjkdU5pA/uHiTaDAFUEqkpzf1YoQT2NeSynCGYq9rxfyI3XpQbfx/a0hSnFH6TGlEXvae5Vi7GD8g== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.25.4" + "@babel/helper-plugin-utils" "^7.24.8" + +"@babel/plugin-transform-class-static-block@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz#c82027ebb7010bc33c116d4b5044fbbf8c05484d" + integrity sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-transform-classes@^7.25.4": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.4.tgz#d29dbb6a72d79f359952ad0b66d88518d65ef89a" + integrity sha512-oexUfaQle2pF/b6E0dwsxQtAol9TLSO88kQvym6HHBWFliV2lGdrPieX+WgMRLSJDVzdYywk7jXbLPuO2KLTLg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-compilation-targets" "^7.25.2" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-replace-supers" "^7.25.0" + "@babel/traverse" "^7.25.4" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz#1b9d78987420d11223d41195461cc43b974b204f" - integrity sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg== +"@babel/plugin-transform-computed-properties@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz#4cab3214e80bc71fae3853238d13d097b004c707" + integrity sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/template" "^7.24.7" -"@babel/plugin-transform-destructuring@^7.14.7": - version "7.14.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz#0ad58ed37e23e22084d109f185260835e5557576" - integrity sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw== +"@babel/plugin-transform-destructuring@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz#c828e814dbe42a2718a838c2a2e16a408e055550" + integrity sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.24.8" -"@babel/plugin-transform-dotall-regex@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz#2f6bf76e46bdf8043b4e7e16cf24532629ba0c7a" - integrity sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw== +"@babel/plugin-transform-dotall-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz#5f8bf8a680f2116a7207e16288a5f974ad47a7a0" + integrity sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-create-regexp-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz#469c2062105c1eb6a040eaf4fac4b488078395ee" - integrity sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA== +"@babel/plugin-transform-duplicate-keys@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz#dd20102897c9a2324e5adfffb67ff3610359a8ee" + integrity sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-duplicate-keys@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz#365a4844881bdf1501e3a9f0270e7f0f91177954" - integrity sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A== +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.0.tgz#809af7e3339466b49c034c683964ee8afb3e2604" + integrity sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-create-regexp-features-plugin" "^7.25.0" + "@babel/helper-plugin-utils" "^7.24.8" -"@babel/plugin-transform-exponentiation-operator@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz#5154b8dd6a3dfe6d90923d61724bd3deeb90b493" - integrity sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA== +"@babel/plugin-transform-dynamic-import@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz#4d8b95e3bae2b037673091aa09cd33fecd6419f4" + integrity sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-transform-for-of@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.15.4.tgz#25c62cce2718cfb29715f416e75d5263fb36a8c2" - integrity sha512-DRTY9fA751AFBDh2oxydvVm4SYevs5ILTWLs6xKXps4Re/KG5nfUkr+TdHCrRWB8C69TlzVgA9b3RmGWmgN9LA== +"@babel/plugin-transform-exponentiation-operator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz#b629ee22645f412024297d5245bce425c31f9b0d" + integrity sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-function-name@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz#e81c65ecb900746d7f31802f6bed1f52d915d6f2" - integrity sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ== +"@babel/plugin-transform-export-namespace-from@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz#176d52d8d8ed516aeae7013ee9556d540c53f197" + integrity sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA== dependencies: - "@babel/helper-function-name" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-transform-literals@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz#41d06c7ff5d4d09e3cf4587bd3ecf3930c730f78" - integrity sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A== +"@babel/plugin-transform-for-of@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz#f25b33f72df1d8be76399e1b8f3f9d366eb5bc70" + integrity sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" -"@babel/plugin-transform-member-expression-literals@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz#b39cd5212a2bf235a617d320ec2b48bcc091b8a7" - integrity sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q== +"@babel/plugin-transform-function-name@^7.25.1": + version "7.25.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz#b85e773097526c1a4fc4ba27322748643f26fc37" + integrity sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-compilation-targets" "^7.24.8" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/traverse" "^7.25.1" -"@babel/plugin-transform-modules-amd@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz#4fd9ce7e3411cb8b83848480b7041d83004858f7" - integrity sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g== +"@babel/plugin-transform-json-strings@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz#f3e9c37c0a373fee86e36880d45b3664cedaf73a" + integrity sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw== dependencies: - "@babel/helper-module-transforms" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - babel-plugin-dynamic-import-node "^2.3.3" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-transform-modules-commonjs@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.15.4.tgz#8201101240eabb5a76c08ef61b2954f767b6b4c1" - integrity sha512-qg4DPhwG8hKp4BbVDvX1s8cohM8a6Bvptu4l6Iingq5rW+yRUAhe/YRup/YcW2zCOlrysEWVhftIcKzrEZv3sA== +"@babel/plugin-transform-literals@^7.25.2": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz#deb1ad14fc5490b9a65ed830e025bca849d8b5f3" + integrity sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw== dependencies: - "@babel/helper-module-transforms" "^7.15.4" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-simple-access" "^7.15.4" - babel-plugin-dynamic-import-node "^2.3.3" + "@babel/helper-plugin-utils" "^7.24.8" -"@babel/plugin-transform-modules-systemjs@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.15.4.tgz#b42890c7349a78c827719f1d2d0cd38c7d268132" - integrity sha512-fJUnlQrl/mezMneR72CKCgtOoahqGJNVKpompKwzv3BrEXdlPspTcyxrZ1XmDTIr9PpULrgEQo3qNKp6dW7ssw== +"@babel/plugin-transform-logical-assignment-operators@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz#a58fb6eda16c9dc8f9ff1c7b1ba6deb7f4694cb0" + integrity sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw== dependencies: - "@babel/helper-hoist-variables" "^7.15.4" - "@babel/helper-module-transforms" "^7.15.4" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-validator-identifier" "^7.14.9" - babel-plugin-dynamic-import-node "^2.3.3" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-transform-modules-umd@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz#fb662dfee697cce274a7cda525190a79096aa6e0" - integrity sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA== +"@babel/plugin-transform-member-expression-literals@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz#3b4454fb0e302e18ba4945ba3246acb1248315df" + integrity sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw== dependencies: - "@babel/helper-module-transforms" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-named-capturing-groups-regex@^7.14.9": - version "7.14.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.9.tgz#c68f5c5d12d2ebaba3762e57c2c4f6347a46e7b2" - integrity sha512-l666wCVYO75mlAtGFfyFwnWmIXQm3kSH0C3IRnJqWcZbWkoihyAdDhFm2ZWaxWTqvBvhVFfJjMRQ0ez4oN1yYA== +"@babel/plugin-transform-modules-amd@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz#65090ed493c4a834976a3ca1cde776e6ccff32d7" + integrity sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.14.5" + "@babel/helper-module-transforms" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-new-target@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz#31bdae8b925dc84076ebfcd2a9940143aed7dbf8" - integrity sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ== +"@babel/plugin-transform-modules-commonjs@^7.24.7", "@babel/plugin-transform-modules-commonjs@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz#ab6421e564b717cb475d6fff70ae7f103536ea3c" + integrity sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-module-transforms" "^7.24.8" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-simple-access" "^7.24.7" -"@babel/plugin-transform-object-super@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz#d0b5faeac9e98597a161a9cf78c527ed934cdc45" - integrity sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg== +"@babel/plugin-transform-modules-systemjs@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz#8f46cdc5f9e5af74f3bd019485a6cbe59685ea33" + integrity sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-replace-supers" "^7.14.5" + "@babel/helper-module-transforms" "^7.25.0" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-validator-identifier" "^7.24.7" + "@babel/traverse" "^7.25.0" -"@babel/plugin-transform-parameters@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.15.4.tgz#5f2285cc3160bf48c8502432716b48504d29ed62" - integrity sha512-9WB/GUTO6lvJU3XQsSr6J/WKvBC2hcs4Pew8YxZagi6GkTdniyqp8On5kqdK8MN0LMeu0mGbhPN+O049NV/9FQ== +"@babel/plugin-transform-modules-umd@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz#edd9f43ec549099620df7df24e7ba13b5c76efc8" + integrity sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-module-transforms" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-property-literals@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz#0ddbaa1f83db3606f1cdf4846fa1dfb473458b34" - integrity sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw== +"@babel/plugin-transform-named-capturing-groups-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz#9042e9b856bc6b3688c0c2e4060e9e10b1460923" + integrity sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-create-regexp-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-react-display-name@^7.14.5": - version "7.15.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.15.1.tgz#6aaac6099f1fcf6589d35ae6be1b6e10c8c602b9" - integrity sha512-yQZ/i/pUCJAHI/LbtZr413S3VT26qNrEm0M5RRxQJA947/YNYwbZbBaXGDrq6CG5QsZycI1VIP6d7pQaBfP+8Q== +"@babel/plugin-transform-new-target@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz#31ff54c4e0555cc549d5816e4ab39241dfb6ab00" + integrity sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-react-jsx-development@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.14.5.tgz#1a6c73e2f7ed2c42eebc3d2ad60b0c7494fcb9af" - integrity sha512-rdwG/9jC6QybWxVe2UVOa7q6cnTpw8JRRHOxntG/h6g/guAOe6AhtQHJuJh5FwmnXIT1bdm5vC2/5huV8ZOorQ== +"@babel/plugin-transform-nullish-coalescing-operator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz#1de4534c590af9596f53d67f52a92f12db984120" + integrity sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ== dependencies: - "@babel/plugin-transform-react-jsx" "^7.14.5" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-transform-react-jsx@^7.14.5": - version "7.14.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.9.tgz#3314b2163033abac5200a869c4de242cd50a914c" - integrity sha512-30PeETvS+AeD1f58i1OVyoDlVYQhap/K20ZrMjLmmzmC2AYR/G43D4sdJAaDAqCD3MYpSWbmrz3kES158QSLjw== +"@babel/plugin-transform-numeric-separator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz#bea62b538c80605d8a0fac9b40f48e97efa7de63" + integrity sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA== dependencies: - "@babel/helper-annotate-as-pure" "^7.14.5" - "@babel/helper-module-imports" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-jsx" "^7.14.5" - "@babel/types" "^7.14.9" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-transform-react-pure-annotations@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.14.5.tgz#18de612b84021e3a9802cbc212c9d9f46d0d11fc" - integrity sha512-3X4HpBJimNxW4rhUy/SONPyNQHp5YRr0HhJdT2OH1BRp0of7u3Dkirc7x9FRJMKMqTBI079VZ1hzv7Ouuz///g== +"@babel/plugin-transform-object-rest-spread@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz#d13a2b93435aeb8a197e115221cab266ba6e55d6" + integrity sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q== dependencies: - "@babel/helper-annotate-as-pure" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-compilation-targets" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.24.7" -"@babel/plugin-transform-regenerator@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz#9676fd5707ed28f522727c5b3c0aa8544440b04f" - integrity sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg== +"@babel/plugin-transform-object-super@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz#66eeaff7830bba945dd8989b632a40c04ed625be" + integrity sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg== dependencies: - regenerator-transform "^0.14.2" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-replace-supers" "^7.24.7" -"@babel/plugin-transform-reserved-words@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz#c44589b661cfdbef8d4300dcc7469dffa92f8304" - integrity sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg== +"@babel/plugin-transform-optional-catch-binding@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz#00eabd883d0dd6a60c1c557548785919b6e717b4" + integrity sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-transform-optional-chaining@^7.24.7", "@babel/plugin-transform-optional-chaining@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz#bb02a67b60ff0406085c13d104c99a835cdf365d" + integrity sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-transform-parameters@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz#5881f0ae21018400e320fc7eb817e529d1254b68" + integrity sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-private-methods@^7.25.4": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.4.tgz#9bbefbe3649f470d681997e0b64a4b254d877242" + integrity sha512-ao8BG7E2b/URaUQGqN3Tlsg+M3KlHY6rJ1O1gXAEUnZoyNQnvKyH87Kfg+FoxSeyWUB8ISZZsC91C44ZuBFytw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.25.4" + "@babel/helper-plugin-utils" "^7.24.8" + +"@babel/plugin-transform-private-property-in-object@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz#4eec6bc701288c1fab5f72e6a4bbc9d67faca061" + integrity sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-create-class-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-transform-property-literals@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz#f0d2ed8380dfbed949c42d4d790266525d63bbdc" + integrity sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-react-display-name@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.7.tgz#9caff79836803bc666bcfe210aeb6626230c293b" + integrity sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-react-jsx-development@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.24.7.tgz#eaee12f15a93f6496d852509a850085e6361470b" + integrity sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.24.7" + +"@babel/plugin-transform-react-jsx@^7.24.7": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.2.tgz#e37e8ebfa77e9f0b16ba07fadcb6adb47412227a" + integrity sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/plugin-syntax-jsx" "^7.24.7" + "@babel/types" "^7.25.2" + +"@babel/plugin-transform-react-pure-annotations@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.7.tgz#bdd9d140d1c318b4f28b29a00fb94f97ecab1595" + integrity sha512-PLgBVk3fzbmEjBJ/u8kFzOqS9tUeDjiaWud/rRym/yjCo/M9cASPlnrd2ZmmZpQT40fOOrvR8jh+n8jikrOhNA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-regenerator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz#021562de4534d8b4b1851759fd7af4e05d2c47f8" + integrity sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + regenerator-transform "^0.15.2" + +"@babel/plugin-transform-reserved-words@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz#80037fe4fbf031fc1125022178ff3938bb3743a4" + integrity sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-transform-runtime@^7.14.5": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.15.0.tgz#d3aa650d11678ca76ce294071fda53d7804183b3" - integrity sha512-sfHYkLGjhzWTq6xsuQ01oEsUYjkHRux9fW1iUA68dC7Qd8BS1Unq4aZ8itmQp95zUzIcyR2EbNMTzAicFj+guw== + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.4.tgz#96e4ad7bfbbe0b4a7b7e6f2a533ca326cf204963" + integrity sha512-8hsyG+KUYGY0coX6KUCDancA0Vw225KJ2HJO0yCNr1vq5r+lJTleDaJf0K7iOhjw4SWhu03TMBzYTJ9krmzULQ== + dependencies: + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.8" + babel-plugin-polyfill-corejs2 "^0.4.10" + babel-plugin-polyfill-corejs3 "^0.10.6" + babel-plugin-polyfill-regenerator "^0.6.1" + semver "^6.3.1" + +"@babel/plugin-transform-shorthand-properties@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz#85448c6b996e122fa9e289746140aaa99da64e73" + integrity sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA== dependencies: - "@babel/helper-module-imports" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - babel-plugin-polyfill-corejs2 "^0.2.2" - babel-plugin-polyfill-corejs3 "^0.2.2" - babel-plugin-polyfill-regenerator "^0.2.2" - semver "^6.3.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-shorthand-properties@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz#97f13855f1409338d8cadcbaca670ad79e091a58" - integrity sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g== +"@babel/plugin-transform-spread@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz#e8a38c0fde7882e0fb8f160378f74bd885cc7bb3" + integrity sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" -"@babel/plugin-transform-spread@^7.14.6": - version "7.14.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz#6bd40e57fe7de94aa904851963b5616652f73144" - integrity sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag== +"@babel/plugin-transform-sticky-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz#96ae80d7a7e5251f657b5cf18f1ea6bf926f5feb" + integrity sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-sticky-regex@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz#5b617542675e8b7761294381f3c28c633f40aeb9" - integrity sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A== +"@babel/plugin-transform-template-literals@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz#a05debb4a9072ae8f985bcf77f3f215434c8f8c8" + integrity sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-template-literals@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz#a5f2bc233937d8453885dc736bdd8d9ffabf3d93" - integrity sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg== +"@babel/plugin-transform-typeof-symbol@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz#383dab37fb073f5bfe6e60c654caac309f92ba1c" + integrity sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.24.8" -"@babel/plugin-transform-typeof-symbol@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz#39af2739e989a2bd291bf6b53f16981423d457d4" - integrity sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw== +"@babel/plugin-transform-typescript@^7.24.7": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.2.tgz#237c5d10de6d493be31637c6b9fa30b6c5461add" + integrity sha512-lBwRvjSmqiMYe/pS0+1gggjJleUJi7NzjvQ1Fkqtt69hBa/0t1YuW/MLQMAPixfwaQOHUXsd6jeU3Z+vdGv3+A== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-create-class-features-plugin" "^7.25.0" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" + "@babel/plugin-syntax-typescript" "^7.24.7" -"@babel/plugin-transform-typescript@^7.15.0": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.15.4.tgz#db7a062dcf8be5fc096bc0eeb40a13fbfa1fa251" - integrity sha512-sM1/FEjwYjXvMwu1PJStH11kJ154zd/lpY56NQJ5qH2D0mabMv1CAy/kdvS9RP4Xgfj9fBBA3JiSLdDHgXdzOA== +"@babel/plugin-transform-unicode-escapes@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz#2023a82ced1fb4971630a2e079764502c4148e0e" + integrity sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.15.4" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-typescript" "^7.14.5" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-unicode-escapes@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz#9d4bd2a681e3c5d7acf4f57fa9e51175d91d0c6b" - integrity sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA== +"@babel/plugin-transform-unicode-property-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz#9073a4cd13b86ea71c3264659590ac086605bbcd" + integrity sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-create-regexp-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-unicode-regex@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz#4cd09b6c8425dd81255c7ceb3fb1836e7414382e" - integrity sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw== +"@babel/plugin-transform-unicode-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz#dfc3d4a51127108099b19817c0963be6a2adf19f" + integrity sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-create-regexp-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/preset-env@^7.14.5": - version "7.15.6" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.15.6.tgz#0f3898db9d63d320f21b17380d8462779de57659" - integrity sha512-L+6jcGn7EWu7zqaO2uoTDjjMBW+88FXzV8KvrBl2z6MtRNxlsmUNRlZPaNNPUTgqhyC5DHNFk/2Jmra+ublZWw== +"@babel/plugin-transform-unicode-sets-regex@^7.25.4": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.4.tgz#be664c2a0697ffacd3423595d5edef6049e8946c" + integrity sha512-qesBxiWkgN1Q+31xUE9RcMk79eOXXDCv6tfyGMRSs4RGlioSg2WVyQAm07k726cSE56pa+Kb0y9epX2qaXzTvA== dependencies: - "@babel/compat-data" "^7.15.0" - "@babel/helper-compilation-targets" "^7.15.4" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-validator-option" "^7.14.5" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.15.4" - "@babel/plugin-proposal-async-generator-functions" "^7.15.4" - "@babel/plugin-proposal-class-properties" "^7.14.5" - "@babel/plugin-proposal-class-static-block" "^7.15.4" - "@babel/plugin-proposal-dynamic-import" "^7.14.5" - "@babel/plugin-proposal-export-namespace-from" "^7.14.5" - "@babel/plugin-proposal-json-strings" "^7.14.5" - "@babel/plugin-proposal-logical-assignment-operators" "^7.14.5" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.14.5" - "@babel/plugin-proposal-numeric-separator" "^7.14.5" - "@babel/plugin-proposal-object-rest-spread" "^7.15.6" - "@babel/plugin-proposal-optional-catch-binding" "^7.14.5" - "@babel/plugin-proposal-optional-chaining" "^7.14.5" - "@babel/plugin-proposal-private-methods" "^7.14.5" - "@babel/plugin-proposal-private-property-in-object" "^7.15.4" - "@babel/plugin-proposal-unicode-property-regex" "^7.14.5" + "@babel/helper-create-regexp-features-plugin" "^7.25.2" + "@babel/helper-plugin-utils" "^7.24.8" + +"@babel/preset-env@^7.14.5": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.25.4.tgz#be23043d43a34a2721cd0f676c7ba6f1481f6af6" + integrity sha512-W9Gyo+KmcxjGahtt3t9fb14vFRWvPpu5pT6GBlovAK6BTBcxgjfVMSQCfJl4oi35ODrxP6xx2Wr8LNST57Mraw== + dependencies: + "@babel/compat-data" "^7.25.4" + "@babel/helper-compilation-targets" "^7.25.2" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-validator-option" "^7.24.8" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.25.3" + "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.25.0" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.25.0" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.24.7" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.25.0" + "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-import-assertions" "^7.24.7" + "@babel/plugin-syntax-import-attributes" "^7.24.7" + "@babel/plugin-syntax-import-meta" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" @@ -978,85 +939,99 @@ "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-transform-arrow-functions" "^7.14.5" - "@babel/plugin-transform-async-to-generator" "^7.14.5" - "@babel/plugin-transform-block-scoped-functions" "^7.14.5" - "@babel/plugin-transform-block-scoping" "^7.15.3" - "@babel/plugin-transform-classes" "^7.15.4" - "@babel/plugin-transform-computed-properties" "^7.14.5" - "@babel/plugin-transform-destructuring" "^7.14.7" - "@babel/plugin-transform-dotall-regex" "^7.14.5" - "@babel/plugin-transform-duplicate-keys" "^7.14.5" - "@babel/plugin-transform-exponentiation-operator" "^7.14.5" - "@babel/plugin-transform-for-of" "^7.15.4" - "@babel/plugin-transform-function-name" "^7.14.5" - "@babel/plugin-transform-literals" "^7.14.5" - "@babel/plugin-transform-member-expression-literals" "^7.14.5" - "@babel/plugin-transform-modules-amd" "^7.14.5" - "@babel/plugin-transform-modules-commonjs" "^7.15.4" - "@babel/plugin-transform-modules-systemjs" "^7.15.4" - "@babel/plugin-transform-modules-umd" "^7.14.5" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.14.9" - "@babel/plugin-transform-new-target" "^7.14.5" - "@babel/plugin-transform-object-super" "^7.14.5" - "@babel/plugin-transform-parameters" "^7.15.4" - "@babel/plugin-transform-property-literals" "^7.14.5" - "@babel/plugin-transform-regenerator" "^7.14.5" - "@babel/plugin-transform-reserved-words" "^7.14.5" - "@babel/plugin-transform-shorthand-properties" "^7.14.5" - "@babel/plugin-transform-spread" "^7.14.6" - "@babel/plugin-transform-sticky-regex" "^7.14.5" - "@babel/plugin-transform-template-literals" "^7.14.5" - "@babel/plugin-transform-typeof-symbol" "^7.14.5" - "@babel/plugin-transform-unicode-escapes" "^7.14.5" - "@babel/plugin-transform-unicode-regex" "^7.14.5" - "@babel/preset-modules" "^0.1.4" - "@babel/types" "^7.15.6" - babel-plugin-polyfill-corejs2 "^0.2.2" - babel-plugin-polyfill-corejs3 "^0.2.2" - babel-plugin-polyfill-regenerator "^0.2.2" - core-js-compat "^3.16.0" - semver "^6.3.0" - -"@babel/preset-modules@^0.1.4": - version "0.1.4" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e" - integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg== + "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.24.7" + "@babel/plugin-transform-async-generator-functions" "^7.25.4" + "@babel/plugin-transform-async-to-generator" "^7.24.7" + "@babel/plugin-transform-block-scoped-functions" "^7.24.7" + "@babel/plugin-transform-block-scoping" "^7.25.0" + "@babel/plugin-transform-class-properties" "^7.25.4" + "@babel/plugin-transform-class-static-block" "^7.24.7" + "@babel/plugin-transform-classes" "^7.25.4" + "@babel/plugin-transform-computed-properties" "^7.24.7" + "@babel/plugin-transform-destructuring" "^7.24.8" + "@babel/plugin-transform-dotall-regex" "^7.24.7" + "@babel/plugin-transform-duplicate-keys" "^7.24.7" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.25.0" + "@babel/plugin-transform-dynamic-import" "^7.24.7" + "@babel/plugin-transform-exponentiation-operator" "^7.24.7" + "@babel/plugin-transform-export-namespace-from" "^7.24.7" + "@babel/plugin-transform-for-of" "^7.24.7" + "@babel/plugin-transform-function-name" "^7.25.1" + "@babel/plugin-transform-json-strings" "^7.24.7" + "@babel/plugin-transform-literals" "^7.25.2" + "@babel/plugin-transform-logical-assignment-operators" "^7.24.7" + "@babel/plugin-transform-member-expression-literals" "^7.24.7" + "@babel/plugin-transform-modules-amd" "^7.24.7" + "@babel/plugin-transform-modules-commonjs" "^7.24.8" + "@babel/plugin-transform-modules-systemjs" "^7.25.0" + "@babel/plugin-transform-modules-umd" "^7.24.7" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.24.7" + "@babel/plugin-transform-new-target" "^7.24.7" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.24.7" + "@babel/plugin-transform-numeric-separator" "^7.24.7" + "@babel/plugin-transform-object-rest-spread" "^7.24.7" + "@babel/plugin-transform-object-super" "^7.24.7" + "@babel/plugin-transform-optional-catch-binding" "^7.24.7" + "@babel/plugin-transform-optional-chaining" "^7.24.8" + "@babel/plugin-transform-parameters" "^7.24.7" + "@babel/plugin-transform-private-methods" "^7.25.4" + "@babel/plugin-transform-private-property-in-object" "^7.24.7" + "@babel/plugin-transform-property-literals" "^7.24.7" + "@babel/plugin-transform-regenerator" "^7.24.7" + "@babel/plugin-transform-reserved-words" "^7.24.7" + "@babel/plugin-transform-shorthand-properties" "^7.24.7" + "@babel/plugin-transform-spread" "^7.24.7" + "@babel/plugin-transform-sticky-regex" "^7.24.7" + "@babel/plugin-transform-template-literals" "^7.24.7" + "@babel/plugin-transform-typeof-symbol" "^7.24.8" + "@babel/plugin-transform-unicode-escapes" "^7.24.7" + "@babel/plugin-transform-unicode-property-regex" "^7.24.7" + "@babel/plugin-transform-unicode-regex" "^7.24.7" + "@babel/plugin-transform-unicode-sets-regex" "^7.25.4" + "@babel/preset-modules" "0.1.6-no-external-plugins" + babel-plugin-polyfill-corejs2 "^0.4.10" + babel-plugin-polyfill-corejs3 "^0.10.6" + babel-plugin-polyfill-regenerator "^0.6.1" + core-js-compat "^3.37.1" + semver "^6.3.1" + +"@babel/preset-modules@0.1.6-no-external-plugins": + version "0.1.6-no-external-plugins" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" + integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" - "@babel/plugin-transform-dotall-regex" "^7.4.4" "@babel/types" "^7.4.4" esutils "^2.0.2" "@babel/preset-react@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.14.5.tgz#0fbb769513f899c2c56f3a882fa79673c2d4ab3c" - integrity sha512-XFxBkjyObLvBaAvkx1Ie95Iaq4S/GUEIrejyrntQ/VCMKUYvKLoyKxOBzJ2kjA3b6rC9/KL6KXfDC2GqvLiNqQ== + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.24.7.tgz#480aeb389b2a798880bf1f889199e3641cbb22dc" + integrity sha512-AAH4lEkpmzFWrGVlHaxJB7RLH21uPQ9+He+eFLWHmF9IuFQVugz8eAsamaW0DXRrTfco5zj1wWtpdcXJUOfsag== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-validator-option" "^7.14.5" - "@babel/plugin-transform-react-display-name" "^7.14.5" - "@babel/plugin-transform-react-jsx" "^7.14.5" - "@babel/plugin-transform-react-jsx-development" "^7.14.5" - "@babel/plugin-transform-react-pure-annotations" "^7.14.5" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-validator-option" "^7.24.7" + "@babel/plugin-transform-react-display-name" "^7.24.7" + "@babel/plugin-transform-react-jsx" "^7.24.7" + "@babel/plugin-transform-react-jsx-development" "^7.24.7" + "@babel/plugin-transform-react-pure-annotations" "^7.24.7" "@babel/preset-typescript@^7.14.5": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.15.0.tgz#e8fca638a1a0f64f14e1119f7fe4500277840945" - integrity sha512-lt0Y/8V3y06Wq/8H/u0WakrqciZ7Fz7mwPDHWUJAXlABL5hiUG42BNlRXiELNjeWjO5rWmnNKlx+yzJvxezHow== + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz#66cd86ea8f8c014855671d5ea9a737139cbbfef1" + integrity sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-validator-option" "^7.14.5" - "@babel/plugin-transform-typescript" "^7.15.0" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-validator-option" "^7.24.7" + "@babel/plugin-syntax-jsx" "^7.24.7" + "@babel/plugin-transform-modules-commonjs" "^7.24.7" + "@babel/plugin-transform-typescript" "^7.24.7" -"@babel/runtime-corejs3@^7.10.2": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.15.4.tgz#403139af262b9a6e8f9ba04a6fdcebf8de692bf1" - integrity sha512-lWcAqKeB624/twtTc3w6w/2o9RqJPaNBhPGK6DKLSiwuVWC7WFkypWyNg+CpZoyJH0jVzv1uMtXZ/5/lQOLtCg== - dependencies: - core-js-pure "^3.16.0" - regenerator-runtime "^0.13.4" +"@babel/regjsgen@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" + integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== "@babel/runtime@7.14.5": version "7.14.5" @@ -1065,61 +1040,42 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.8.4": - version "7.15.3" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.15.3.tgz#2e1c2880ca118e5b2f9988322bd8a7656a32502b" - integrity sha512-OvwMLqNXkCXSz1kSm58sEsNuhqOx/fKpnUnKnFB5v8uDda5bLNEHNgKPvhDN6IU0LDcnHQ90LlJ0Q6jnyBSIBA== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/template@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.15.4.tgz#51898d35dcf3faa670c4ee6afcfd517ee139f194" - integrity sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg== - dependencies: - "@babel/code-frame" "^7.14.5" - "@babel/parser" "^7.15.4" - "@babel/types" "^7.15.4" - -"@babel/traverse@^7.13.0", "@babel/traverse@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.15.4.tgz#ff8510367a144bfbff552d9e18e28f3e2889c22d" - integrity sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA== - dependencies: - "@babel/code-frame" "^7.14.5" - "@babel/generator" "^7.15.4" - "@babel/helper-function-name" "^7.15.4" - "@babel/helper-hoist-variables" "^7.15.4" - "@babel/helper-split-export-declaration" "^7.15.4" - "@babel/parser" "^7.15.4" - "@babel/types" "^7.15.4" - debug "^4.1.0" +"@babel/runtime@^7.8.4": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.4.tgz#6ef37d678428306e7d75f054d5b1bdb8cf8aa8ee" + integrity sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/template@^7.24.7", "@babel/template@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.0.tgz#e733dc3134b4fede528c15bc95e89cb98c52592a" + integrity sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/parser" "^7.25.0" + "@babel/types" "^7.25.0" + +"@babel/traverse@^7.24.7", "@babel/traverse@^7.24.8", "@babel/traverse@^7.25.0", "@babel/traverse@^7.25.1", "@babel/traverse@^7.25.2", "@babel/traverse@^7.25.3", "@babel/traverse@^7.25.4": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.4.tgz#648678046990f2957407e3086e97044f13c3e18e" + integrity sha512-VJ4XsrD+nOvlXyLzmLzUs/0qjFS4sK30te5yEFlvbbUNEgKaVb2BHZUpAL+ttLPQAHNrsI3zZisbfha5Cvr8vg== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.25.4" + "@babel/parser" "^7.25.4" + "@babel/template" "^7.25.0" + "@babel/types" "^7.25.4" + debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.10.4", "@babel/types@^7.4.4": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.5.tgz#d88ae7e2fde86bfbfe851d4d81afa70a997b5d15" - integrity sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q== +"@babel/types@^7.24.7", "@babel/types@^7.24.8", "@babel/types@^7.25.0", "@babel/types@^7.25.2", "@babel/types@^7.25.4", "@babel/types@^7.4.4": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.4.tgz#6bcb46c72fdf1012a209d016c07f769e10adcb5f" + integrity sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ== dependencies: - "@babel/helper-validator-identifier" "^7.10.4" - lodash "^4.17.19" - to-fast-properties "^2.0.0" - -"@babel/types@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.13.tgz#8be1aa8f2c876da11a9cf650c0ecf656913ad611" - integrity sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ== - dependencies: - "@babel/helper-validator-identifier" "^7.12.11" - lodash "^4.17.19" - to-fast-properties "^2.0.0" - -"@babel/types@^7.14.9", "@babel/types@^7.15.4", "@babel/types@^7.15.6": - version "7.15.6" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.6.tgz#99abdc48218b2881c058dd0a7ab05b99c9be758f" - integrity sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig== - dependencies: - "@babel/helper-validator-identifier" "^7.14.9" + "@babel/helper-string-parser" "^7.24.8" + "@babel/helper-validator-identifier" "^7.24.7" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": @@ -1134,6 +1090,28 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" +"@emnapi/core@^1.1.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.2.0.tgz#7b738e5033738132bf6af0b8fae7b05249bdcbd7" + integrity sha512-E7Vgw78I93we4ZWdYCb4DGAwRROGkMIXk7/y87UmANR+J6qsWusmC3gLt0H+O0KOt5e6O38U8oJamgbudrES/w== + dependencies: + "@emnapi/wasi-threads" "1.0.1" + tslib "^2.4.0" + +"@emnapi/runtime@^1.1.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.2.0.tgz#71d018546c3a91f3b51106530edbc056b9f2f2e3" + integrity sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ== + dependencies: + tslib "^2.4.0" + +"@emnapi/wasi-threads@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@emnapi/wasi-threads/-/wasi-threads-1.0.1.tgz#d7ae71fd2166b1c916c6cd2d0df2ef565a2e1a5b" + integrity sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw== + dependencies: + tslib "^2.4.0" + "@esbuild-plugins/node-globals-polyfill@^0.2.0": version "0.2.3" resolved "https://registry.yarnpkg.com/@esbuild-plugins/node-globals-polyfill/-/node-globals-polyfill-0.2.3.tgz#0e4497a2b53c9e9485e149bc92ddb228438d6bcf" @@ -1147,225 +1125,225 @@ escape-string-regexp "^4.0.0" rollup-plugin-node-polyfills "^0.2.1" -"@esbuild/android-arm64@0.16.7": - version "0.16.7" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.16.7.tgz#2df472016c77dba3e79596a84da74c541698910f" - integrity sha512-tYFw0lBJSEvLoGzzYh1kXuzoX1iPkbOk3O29VqzQb0HbOy7t/yw1hGkvwoJhXHwzQUPsShyYcTgRf6bDBcfnTw== - -"@esbuild/android-arm64@0.18.11": - version "0.18.11" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.11.tgz#fa6f0cc7105367cb79cc0a8bf32bf50cb1673e45" - integrity sha512-snieiq75Z1z5LJX9cduSAjUr7vEI1OdlzFPMw0HH5YI7qQHDd3qs+WZoMrWYDsfRJSq36lIA6mfZBkvL46KoIw== - -"@esbuild/android-arm@0.16.7": - version "0.16.7" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.16.7.tgz#15f1a9b27b1637c38377b3e1f2d90b9782cdc141" - integrity sha512-yhzDbiVcmq6T1/XEvdcJIVcXHdLjDJ5cQ0Dp9R9p9ERMBTeO1dR5tc8YYv8zwDeBw1xZm+Eo3MRo8cwclhBS0g== - -"@esbuild/android-arm@0.18.11": - version "0.18.11" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.11.tgz#ae84a410696c9f549a15be94eaececb860bacacb" - integrity sha512-q4qlUf5ucwbUJZXF5tEQ8LF7y0Nk4P58hOsGk3ucY0oCwgQqAnqXVbUuahCddVHfrxmpyewRpiTHwVHIETYu7Q== - -"@esbuild/android-x64@0.16.7": - version "0.16.7" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.16.7.tgz#cb34b7d666bf52266061cfb1a19c1d788b6c5ac1" - integrity sha512-3P2OuTxwAtM3k/yEWTNUJRjMPG1ce8rXs51GTtvEC5z1j8fC1plHeVVczdeHECU7aM2/Buc0MwZ6ciM/zysnWg== - -"@esbuild/android-x64@0.18.11": - version "0.18.11" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.11.tgz#0e58360bbc789ad0d68174d32ba20e678c2a16b6" - integrity sha512-iPuoxQEV34+hTF6FT7om+Qwziv1U519lEOvekXO9zaMMlT9+XneAhKL32DW3H7okrCOBQ44BMihE8dclbZtTuw== - -"@esbuild/darwin-arm64@0.16.7": - version "0.16.7" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.16.7.tgz#be1fabd0c2f6af111c16e9e9b18bf336c1e11634" - integrity sha512-VUb9GK23z8jkosHU9yJNUgQpsfJn+7ZyBm6adi2Ec5/U241eR1tAn82QicnUzaFDaffeixiHwikjmnec/YXEZg== - -"@esbuild/darwin-arm64@0.18.11": - version "0.18.11" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.11.tgz#fcdcd2ef76ca656540208afdd84f284072f0d1f9" - integrity sha512-Gm0QkI3k402OpfMKyQEEMG0RuW2LQsSmI6OeO4El2ojJMoF5NLYb3qMIjvbG/lbMeLOGiW6ooU8xqc+S0fgz2w== - -"@esbuild/darwin-x64@0.16.7": - version "0.16.7" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.16.7.tgz#2206042ac4396bb18dd53b379df83bec47eeb5fb" - integrity sha512-duterlv3tit3HI9vhzMWnSVaB1B6YsXpFq1Ntd6Fou82BB1l4tucYy3FI9dHv3tvtDuS0NiGf/k6XsdBqPZ01w== - -"@esbuild/darwin-x64@0.18.11": - version "0.18.11" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.11.tgz#c5ac602ec0504a8ff81e876bc8a9811e94d69d37" - integrity sha512-N15Vzy0YNHu6cfyDOjiyfJlRJCB/ngKOAvoBf1qybG3eOq0SL2Lutzz9N7DYUbb7Q23XtHPn6lMDF6uWbGv9Fw== - -"@esbuild/freebsd-arm64@0.16.7": - version "0.16.7" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.7.tgz#ca52bd64b0bba69ae4063245366f25838357c332" - integrity sha512-9kkycpBFes/vhi7B7o0cf+q2WdJi+EpVzpVTqtWFNiutARWDFFLcB93J8PR1cG228sucsl3B+7Ts27izE6qiaQ== - -"@esbuild/freebsd-arm64@0.18.11": - version "0.18.11" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.11.tgz#7012fb06ee3e6e0d5560664a65f3fefbcc46db2e" - integrity sha512-atEyuq6a3omEY5qAh5jIORWk8MzFnCpSTUruBgeyN9jZq1K/QI9uke0ATi3MHu4L8c59CnIi4+1jDKMuqmR71A== - -"@esbuild/freebsd-x64@0.16.7": - version "0.16.7" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.16.7.tgz#bc01c146e6af5430c5eb325844de43f01e0264c4" - integrity sha512-5Ahf6jzWXJ4J2uh9dpy5DKOO+PeRUE/9DMys6VuYfwgQzd6n5+pVFm58L2Z2gRe611RX6SdydnNaiIKM3svY7g== - -"@esbuild/freebsd-x64@0.18.11": - version "0.18.11" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.11.tgz#c5de1199f70e1f97d5c8fca51afa9bf9a2af5969" - integrity sha512-XtuPrEfBj/YYYnAAB7KcorzzpGTvOr/dTtXPGesRfmflqhA4LMF0Gh/n5+a9JBzPuJ+CGk17CA++Hmr1F/gI0Q== - -"@esbuild/linux-arm64@0.16.7": - version "0.16.7" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.16.7.tgz#23267ff1cdd2a8f150d5aca1d6d2a4dfd4be7909" - integrity sha512-2wv0xYDskk2+MzIm/AEprDip39a23Chptc4mL7hsHg26P0gD8RUhzmDu0KCH2vMThUI1sChXXoK9uH0KYQKaDg== - -"@esbuild/linux-arm64@0.18.11": - version "0.18.11" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.11.tgz#2a6d3a74e0b8b5f294e22b4515b29f76ebd42660" - integrity sha512-c6Vh2WS9VFKxKZ2TvJdA7gdy0n6eSy+yunBvv4aqNCEhSWVor1TU43wNRp2YLO9Vng2G+W94aRz+ILDSwAiYog== - -"@esbuild/linux-arm@0.16.7": - version "0.16.7" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.16.7.tgz#2c7cf7244e4b8a6f757a87a113d83d8a0c1f5297" - integrity sha512-QqJnyCfu5OF78Olt7JJSZ7OSv/B4Hf+ZJWp4kkq9xwMsgu7yWq3crIic8gGOpDYTqVKKMDAVDgRXy5Wd/nWZyQ== - -"@esbuild/linux-arm@0.18.11": - version "0.18.11" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.11.tgz#5175bd61b793b436e4aece6328aa0d9be07751e1" - integrity sha512-Idipz+Taso/toi2ETugShXjQ3S59b6m62KmLHkJlSq/cBejixmIydqrtM2XTvNCywFl3VC7SreSf6NV0i6sRyg== - -"@esbuild/linux-ia32@0.16.7": - version "0.16.7" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.16.7.tgz#a15dc3edf6953c5414add4264fd8335f48775490" - integrity sha512-APVYbEilKbD5ptmKdnIcXej2/+GdV65TfTjxR2Uk8t1EsOk49t6HapZW6DS/Bwlvh5hDwtLapdSumIVNGxgqLg== - -"@esbuild/linux-ia32@0.18.11": - version "0.18.11" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.11.tgz#20ee6cfd65a398875f321a485e7b2278e5f6f67b" - integrity sha512-S3hkIF6KUqRh9n1Q0dSyYcWmcVa9Cg+mSoZEfFuzoYXXsk6196qndrM+ZiHNwpZKi3XOXpShZZ+9dfN5ykqjjw== - -"@esbuild/linux-loong64@0.16.7": - version "0.16.7" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.16.7.tgz#b3ce8539cf307b543796530839cf62507d9c7e84" - integrity sha512-5wPUAGclplQrAW7EFr3F84Y/d++7G0KykohaF4p54+iNWhUnMVU8Bh2sxiEOXUy4zKIdpHByMgJ5/Ko6QhtTUw== - -"@esbuild/linux-loong64@0.18.11": - version "0.18.11" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.11.tgz#8e7b251dede75083bf44508dab5edce3f49d052b" - integrity sha512-MRESANOoObQINBA+RMZW+Z0TJWpibtE7cPFnahzyQHDCA9X9LOmGh68MVimZlM9J8n5Ia8lU773te6O3ILW8kw== - -"@esbuild/linux-mips64el@0.16.7": - version "0.16.7" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.16.7.tgz#7c1c8f3de254b4e975ac2580bba187b87b959256" - integrity sha512-hxzlXtWF6yWfkE/SMTscNiVqLOAn7fOuIF3q/kiZaXxftz1DhZW/HpnTmTTWrzrS7zJWQxHHT4QSxyAj33COmA== - -"@esbuild/linux-mips64el@0.18.11": - version "0.18.11" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.11.tgz#a3125eb48538ac4932a9d05089b157f94e443165" - integrity sha512-qVyPIZrXNMOLYegtD1u8EBccCrBVshxMrn5MkuFc3mEVsw7CCQHaqZ4jm9hbn4gWY95XFnb7i4SsT3eflxZsUg== - -"@esbuild/linux-ppc64@0.16.7": - version "0.16.7" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.16.7.tgz#72a00c9788f3ca5df56ecec060d5b92f945c9a2d" - integrity sha512-WM83Dac0LdXty5xPhlOuCD5Egfk1xLND/oRLYeB7Jb/tY4kzFSDgLlq91wYbHua/s03tQGA9iXvyjgymMw62Vw== - -"@esbuild/linux-ppc64@0.18.11": - version "0.18.11" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.11.tgz#842abadb7a0995bd539adee2be4d681b68279499" - integrity sha512-T3yd8vJXfPirZaUOoA9D2ZjxZX4Gr3QuC3GztBJA6PklLotc/7sXTOuuRkhE9W/5JvJP/K9b99ayPNAD+R+4qQ== - -"@esbuild/linux-riscv64@0.16.7": - version "0.16.7" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.16.7.tgz#545fd57e44dc3331a86956889f2a5b42bd116c9b" - integrity sha512-3nkNnNg4Ax6MS/l8O8Ynq2lGEVJYyJ2EoY3PHjNJ4PuZ80EYLMrFTFZ4L/Hc16AxgtXKwmNP9TM0YKNiBzBiJQ== - -"@esbuild/linux-riscv64@0.18.11": - version "0.18.11" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.11.tgz#7ce6e6cee1c72d5b4d2f4f8b6fcccf4a9bea0e28" - integrity sha512-evUoRPWiwuFk++snjH9e2cAjF5VVSTj+Dnf+rkO/Q20tRqv+644279TZlPK8nUGunjPAtQRCj1jQkDAvL6rm2w== - -"@esbuild/linux-s390x@0.16.7": - version "0.16.7" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.16.7.tgz#a36fd4605904c49310616dd648c0c25a267a19c0" - integrity sha512-3SA/2VJuv0o1uD7zuqxEP+RrAyRxnkGddq0bwHQ98v1KNlzXD/JvxwTO3T6GM5RH6JUd29RTVQTOJfyzMkkppA== - -"@esbuild/linux-s390x@0.18.11": - version "0.18.11" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.11.tgz#98fbc794363d02ded07d300df2e535650b297b96" - integrity sha512-/SlRJ15XR6i93gRWquRxYCfhTeC5PdqEapKoLbX63PLCmAkXZHY2uQm2l9bN0oPHBsOw2IswRZctMYS0MijFcg== - -"@esbuild/linux-x64@0.16.7": - version "0.16.7" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.16.7.tgz#104f3f8f3f25f1f26b70cee05470974861ca5a5e" - integrity sha512-xi/tbqCqvPIzU+zJVyrpz12xqciTAPMi2fXEWGnapZymoGhuL2GIWIRXg4O2v5BXaYA5TSaiKYE14L0QhUTuQg== - -"@esbuild/linux-x64@0.18.11": - version "0.18.11" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.11.tgz#f8458ec8cf74c8274e4cacd00744d8446cac52eb" - integrity sha512-xcncej+wF16WEmIwPtCHi0qmx1FweBqgsRtEL1mSHLFR6/mb3GEZfLQnx+pUDfRDEM4DQF8dpXIW7eDOZl1IbA== - -"@esbuild/netbsd-x64@0.16.7": - version "0.16.7" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.16.7.tgz#0fd59fea5e6b94ee82e81b3b389e561efe77b347" - integrity sha512-NUsYbq3B+JdNKn8SXkItFvdes9qTwEoS3aLALtiWciW/ystiCKM20Fgv9XQBOXfhUHyh5CLEeZDXzLOrwBXuCQ== - -"@esbuild/netbsd-x64@0.18.11": - version "0.18.11" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.11.tgz#a7b2f991b8293748a7be42eac1c4325faf0c7cca" - integrity sha512-aSjMHj/F7BuS1CptSXNg6S3M4F3bLp5wfFPIJM+Km2NfIVfFKhdmfHF9frhiCLIGVzDziggqWll0B+9AUbud/Q== - -"@esbuild/openbsd-x64@0.16.7": - version "0.16.7" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.16.7.tgz#c04072a70f31be1bd47204955d2c71ca393c9eb4" - integrity sha512-qjwzsgeve9I8Tbsko2FEkdSk2iiezuNGFgipQxY/736NePXDaDZRodIejYGWOlbYXugdxb0nif5yvypH6lKBmA== - -"@esbuild/openbsd-x64@0.18.11": - version "0.18.11" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.11.tgz#3e50923de84c54008f834221130fd23646072b2f" - integrity sha512-tNBq+6XIBZtht0xJGv7IBB5XaSyvYPCm1PxJ33zLQONdZoLVM0bgGqUrXnJyiEguD9LU4AHiu+GCXy/Hm9LsdQ== - -"@esbuild/sunos-x64@0.16.7": - version "0.16.7" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.16.7.tgz#11c4cd341be1de93cb5e3bf096f3b63ae1497626" - integrity sha512-mFWDz4RoBTzPphTCkM7Kc7Qpa0o/Z01acajR+Ai7LdfKgcP/C6jYOaKwv7nKzD0+MjOT20j7You9g4ozYy1dKQ== - -"@esbuild/sunos-x64@0.18.11": - version "0.18.11" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.11.tgz#ae47a550b0cd395de03606ecfba03cc96c7c19e2" - integrity sha512-kxfbDOrH4dHuAAOhr7D7EqaYf+W45LsAOOhAet99EyuxxQmjbk8M9N4ezHcEiCYPaiW8Dj3K26Z2V17Gt6p3ng== - -"@esbuild/win32-arm64@0.16.7": - version "0.16.7" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.16.7.tgz#95091269394f16352e318124790a3906bf370141" - integrity sha512-m39UmX19RvEIuC8sYZ0M+eQtdXw4IePDSZ78ZQmYyFaXY9krq4YzQCK2XWIJomNLtg4q+W5aXr8bW3AbqWNoVg== - -"@esbuild/win32-arm64@0.18.11": - version "0.18.11" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.11.tgz#05d364582b7862d7fbf4698ef43644f7346dcfcc" - integrity sha512-Sh0dDRyk1Xi348idbal7lZyfSkjhJsdFeuC13zqdipsvMetlGiFQNdO+Yfp6f6B4FbyQm7qsk16yaZk25LChzg== - -"@esbuild/win32-ia32@0.16.7": - version "0.16.7" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.16.7.tgz#2bda285a0b7084a93417472c460b0209bef0c39d" - integrity sha512-1cbzSEZA1fANwmT6rjJ4G1qQXHxCxGIcNYFYR9ctI82/prT38lnwSRZ0i5p/MVXksw9eMlHlet6pGu2/qkXFCg== - -"@esbuild/win32-ia32@0.18.11": - version "0.18.11" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.11.tgz#a3372095a4a1939da672156a3c104f8ce85ee616" - integrity sha512-o9JUIKF1j0rqJTFbIoF4bXj6rvrTZYOrfRcGyL0Vm5uJ/j5CkBD/51tpdxe9lXEDouhRgdr/BYzUrDOvrWwJpg== - -"@esbuild/win32-x64@0.16.7": - version "0.16.7" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.16.7.tgz#966ac3fc41758e6843cbd5844b2466bbdc34dada" - integrity sha512-QaQ8IH0JLacfGf5cf0HCCPnQuCTd/dAI257vXBgb/cccKGbH/6pVtI1gwhdAQ0Y48QSpTIFrh9etVyNdZY+zzw== - -"@esbuild/win32-x64@0.18.11": - version "0.18.11" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.11.tgz#6526c7e1b40d5b9f0a222c6b767c22f6fb97aa57" - integrity sha512-rQI4cjLHd2hGsM1LqgDI7oOCYbQ6IBOVsX9ejuRMSze0GqXUG2ekwiKkiBU1pRGSeCqFFHxTrcEydB2Hyoz9CA== +"@esbuild/android-arm64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz#cf91e86df127aa3d141744edafcba0abdc577d23" + integrity sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg== + +"@esbuild/android-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622" + integrity sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ== + +"@esbuild/android-arm@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.16.17.tgz#025b6246d3f68b7bbaa97069144fb5fb70f2fff2" + integrity sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw== + +"@esbuild/android-arm@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682" + integrity sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw== + +"@esbuild/android-x64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.16.17.tgz#c820e0fef982f99a85c4b8bfdd582835f04cd96e" + integrity sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ== + +"@esbuild/android-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2" + integrity sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg== + +"@esbuild/darwin-arm64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz#edef4487af6b21afabba7be5132c26d22379b220" + integrity sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w== + +"@esbuild/darwin-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1" + integrity sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA== + +"@esbuild/darwin-x64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz#42829168730071c41ef0d028d8319eea0e2904b4" + integrity sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg== + +"@esbuild/darwin-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz#d70d5790d8bf475556b67d0f8b7c5bdff053d85d" + integrity sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ== + +"@esbuild/freebsd-arm64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz#1f4af488bfc7e9ced04207034d398e793b570a27" + integrity sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw== + +"@esbuild/freebsd-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54" + integrity sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw== + +"@esbuild/freebsd-x64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz#636306f19e9bc981e06aa1d777302dad8fddaf72" + integrity sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug== + +"@esbuild/freebsd-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e" + integrity sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ== + +"@esbuild/linux-arm64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz#a003f7ff237c501e095d4f3a09e58fc7b25a4aca" + integrity sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g== + +"@esbuild/linux-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0" + integrity sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA== + +"@esbuild/linux-arm@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz#b591e6a59d9c4fe0eeadd4874b157ab78cf5f196" + integrity sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ== + +"@esbuild/linux-arm@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0" + integrity sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg== + +"@esbuild/linux-ia32@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz#24333a11027ef46a18f57019450a5188918e2a54" + integrity sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg== + +"@esbuild/linux-ia32@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7" + integrity sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA== + +"@esbuild/linux-loong64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz#d5ad459d41ed42bbd4d005256b31882ec52227d8" + integrity sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ== + +"@esbuild/linux-loong64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d" + integrity sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg== + +"@esbuild/linux-mips64el@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz#4e5967a665c38360b0a8205594377d4dcf9c3726" + integrity sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw== + +"@esbuild/linux-mips64el@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231" + integrity sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ== + +"@esbuild/linux-ppc64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz#206443a02eb568f9fdf0b438fbd47d26e735afc8" + integrity sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g== + +"@esbuild/linux-ppc64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb" + integrity sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA== + +"@esbuild/linux-riscv64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz#c351e433d009bf256e798ad048152c8d76da2fc9" + integrity sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw== + +"@esbuild/linux-riscv64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6" + integrity sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A== + +"@esbuild/linux-s390x@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz#661f271e5d59615b84b6801d1c2123ad13d9bd87" + integrity sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w== + +"@esbuild/linux-s390x@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071" + integrity sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ== + +"@esbuild/linux-x64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz#e4ba18e8b149a89c982351443a377c723762b85f" + integrity sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw== + +"@esbuild/linux-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz#c7690b3417af318a9b6f96df3031a8865176d338" + integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w== + +"@esbuild/netbsd-x64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz#7d4f4041e30c5c07dd24ffa295c73f06038ec775" + integrity sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA== + +"@esbuild/netbsd-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1" + integrity sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A== + +"@esbuild/openbsd-x64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz#970fa7f8470681f3e6b1db0cc421a4af8060ec35" + integrity sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg== + +"@esbuild/openbsd-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae" + integrity sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg== + +"@esbuild/sunos-x64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz#abc60e7c4abf8b89fb7a4fe69a1484132238022c" + integrity sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw== + +"@esbuild/sunos-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d" + integrity sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ== + +"@esbuild/win32-arm64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz#7b0ff9e8c3265537a7a7b1fd9a24e7bd39fcd87a" + integrity sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw== + +"@esbuild/win32-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9" + integrity sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg== + +"@esbuild/win32-ia32@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz#e90fe5267d71a7b7567afdc403dfd198c292eb09" + integrity sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig== + +"@esbuild/win32-ia32@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102" + integrity sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g== + +"@esbuild/win32-x64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz#c5a1a4bfe1b57f0c3e61b29883525c6da3e5c091" + integrity sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q== + +"@esbuild/win32-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d" + integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ== "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" @@ -1375,9 +1353,9 @@ eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": - version "4.10.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" - integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== + version "4.11.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.0.tgz#b0ffd0312b4a3fd2d6f77237e7248a5ad3a680ae" + integrity sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A== "@eslint/eslintrc@^2.1.4": version "2.1.4" @@ -1394,15 +1372,15 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.56.0": - version "8.56.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.56.0.tgz#ef20350fec605a7f7035a01764731b2de0f3782b" - integrity sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A== +"@eslint/js@8.57.0": + version "8.57.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" + integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== -"@esri/arcgis-html-sanitizer@~3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@esri/arcgis-html-sanitizer/-/arcgis-html-sanitizer-3.0.1.tgz#a4feaf3744bdd532012593fdb929b376a22c39cd" - integrity sha512-cwZJwsYCJZwtBQU2AmaiIVFg5nZcVwInPYja1/OgC9iKYO+ytZRoc5h+0S9/ygbFNoS8Nd0RX9A85stLX/BgiA== +"@esri/arcgis-html-sanitizer@~4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@esri/arcgis-html-sanitizer/-/arcgis-html-sanitizer-4.0.3.tgz#1cf641a997bf7785766920bdcc004d017b646bc4" + integrity sha512-B06V4Spjhcy2zcKH9SaTrZwRGjUTlsCSGImdCpe7fN/Q3HxLa4QosMgrRJQ+Q8guLhBA177+6Fjwzl/xIrmY7A== dependencies: xss "1.0.13" @@ -1411,49 +1389,57 @@ resolved "https://registry.yarnpkg.com/@esri/calcite-colors/-/calcite-colors-6.1.0.tgz#2d75e859a88772d8de91ccae40cbe29b8a4d27b8" integrity sha512-wHQYWFtDa6c328EraXEVZvgOiaQyYr0yuaaZ0G3cB4C3lSkWefW34L/e5TLAhtuG3zJ/wR6pl5X1YYNfBc0/4Q== -"@esri/calcite-components@^2.4.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@esri/calcite-components/-/calcite-components-2.6.0.tgz#25fdd68476805a498032427795458849ec043db1" - integrity sha512-GbpascF/mI3TvC5EQejzMi8zDG/wv0pzGU5HzUsrzHqIkIwRruuIe7qdg/srjaEQkXwwpJKxfd8r5QaBXjlQWw== +"@esri/calcite-components@^2.8.5": + version "2.11.1" + resolved "https://registry.yarnpkg.com/@esri/calcite-components/-/calcite-components-2.11.1.tgz#c9171cf5e47b7261435c040c7d51c125a8fd42bf" + integrity sha512-ICUk5cnC5fbh/laODpmSO3S5mVd046K2taNHF3p3B+VkHUncnMCRX4qzobwmZRKW5JqzwDb2E6u+Ssdz08mERA== dependencies: - "@floating-ui/dom" "1.6.3" - "@stencil/core" "4.9.0" + "@esri/calcite-ui-icons" "^3.30.0" + "@floating-ui/dom" "1.6.8" + "@stencil/core" "4.19.2" "@types/color" "3.0.6" + "@types/sortablejs" "1.15.7" color "4.2.3" - composed-offset-position "0.0.4" - dayjs "1.11.10" + composed-offset-position "0.0.6" + dayjs "1.11.12" focus-trap "7.5.4" lodash-es "4.17.21" sortablejs "1.15.1" timezone-groups "0.8.0" + type-fest "4.18.2" -"@floating-ui/core@^1.0.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.0.tgz#fa41b87812a16bf123122bf945946bae3fdf7fc1" - integrity sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g== +"@esri/calcite-ui-icons@^3.30.0": + version "3.30.0" + resolved "https://registry.yarnpkg.com/@esri/calcite-ui-icons/-/calcite-ui-icons-3.30.0.tgz#d4c5a48cd24fb4460cdf5b871250f15bc25d6a19" + integrity sha512-r6Ev82ksCT55qwK361Qm0FgsPd16s/d+to9n/nmgOdejsRvqDl5Nc64IsAtUD20y4XyKY7eyyneKm8NGI9VrFA== + +"@floating-ui/core@^1.6.0": + version "1.6.7" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.7.tgz#7602367795a390ff0662efd1c7ae8ca74e75fb12" + integrity sha512-yDzVT/Lm101nQ5TCVeK65LtdN7Tj4Qpr9RTXJ2vPFLqtLxwOrpoxAHAJI8J3yYWUc40J0BDBheaitK5SJmno2g== dependencies: - "@floating-ui/utils" "^0.2.1" + "@floating-ui/utils" "^0.2.7" -"@floating-ui/dom@1.6.3": - version "1.6.3" - resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.3.tgz#954e46c1dd3ad48e49db9ada7218b0985cee75ef" - integrity sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw== +"@floating-ui/dom@1.6.8": + version "1.6.8" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.8.tgz#45e20532b6d8a061b356a4fb336022cf2609754d" + integrity sha512-kx62rP19VZ767Q653wsP1XZCGIirkE09E0QUGNYTM/ttbbQHqcGPdSfWFxUyyNLc/W6aoJRBajOSXhP6GXjC0Q== dependencies: - "@floating-ui/core" "^1.0.0" - "@floating-ui/utils" "^0.2.0" + "@floating-ui/core" "^1.6.0" + "@floating-ui/utils" "^0.2.5" -"@floating-ui/utils@^0.2.0", "@floating-ui/utils@^0.2.1": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.1.tgz#16308cea045f0fc777b6ff20a9f25474dd8293d2" - integrity sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q== +"@floating-ui/utils@^0.2.5", "@floating-ui/utils@^0.2.7": + version "0.2.7" + resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.7.tgz#d0ece53ce99ab5a8e37ebdfe5e32452a2bfc073e" + integrity sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA== -"@humanwhocodes/config-array@^0.11.13": - version "0.11.13" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.13.tgz#075dc9684f40a531d9b26b0822153c1e832ee297" - integrity sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ== +"@humanwhocodes/config-array@^0.11.14": + version "0.11.14" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" + integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== dependencies: - "@humanwhocodes/object-schema" "^2.0.1" - debug "^4.1.1" + "@humanwhocodes/object-schema" "^2.0.2" + debug "^4.3.1" minimatch "^3.0.5" "@humanwhocodes/module-importer@^1.0.1": @@ -1461,10 +1447,10 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz#e5211452df060fa8522b55c7b3c0c4d1981cb044" - integrity sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw== +"@humanwhocodes/object-schema@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" + integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== "@hutson/parse-repository-url@^3.0.0": version "3.0.2" @@ -1483,6 +1469,11 @@ wrap-ansi "^8.1.0" wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" +"@isaacs/string-locale-compare@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz#291c227e93fd407a96ecd59879a35809120e432b" + integrity sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ== + "@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": version "0.1.3" resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" @@ -1495,15 +1486,29 @@ dependencies: "@sinclair/typebox" "^0.27.8" -"@jridgewell/resolve-uri@3.1.0", "@jridgewell/resolve-uri@^3.0.3": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" -"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== +"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== "@jridgewell/trace-mapping@0.3.9": version "0.3.9" @@ -1513,18 +1518,18 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@jridgewell/trace-mapping@^0.3.12": - version "0.3.17" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" - integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" "@jupyter-widgets/base@^1.1.10 || ^2 || ^3 || ^4": - version "4.1.5" - resolved "https://registry.yarnpkg.com/@jupyter-widgets/base/-/base-4.1.5.tgz#113aab2947ddae4cdc0fd3623c82c256ee3a403b" - integrity sha512-Op/REB6+VFYBn6E1KkwixpvdKspOEXkXXaPnj91Qf4cI5UZuUGDM0HesRiAYzKhJ2f4KValR070CguzJoy6ngw== + version "4.1.6" + resolved "https://registry.yarnpkg.com/@jupyter-widgets/base/-/base-4.1.6.tgz#b275b52e3f1ac756e3e9f3a179b9eda5c0bbd7ad" + integrity sha512-GFnOAFCoiC2bEmGlTT7xKRNNgAi1H9i4EeWpZwdkZe8lg7pHnP4E6dgL+rBGO3wB3cwjeBDf2BkH4WM60Iyjwg== dependencies: "@jupyterlab/services" "^6.0.0" "@lumino/coreutils" "^1.2.0" @@ -1610,80 +1615,87 @@ "@lumino/properties" "^1.8.0" "@lumino/signaling" "^1.10.0" -"@lerna/create@8.1.2": - version "8.1.2" - resolved "https://registry.yarnpkg.com/@lerna/create/-/create-8.1.2.tgz#4dc8b3f59c963275bfb8b390491068751101f477" - integrity sha512-GzScCIkAW3tg3+Yn/MKCH9963bzG+zpjGz2NdfYDlYWI7p0f/SH46v1dqpPpYmZ2E/m3JK8HjTNNNL8eIm8/YQ== +"@lerna/create@8.1.8": + version "8.1.8" + resolved "https://registry.yarnpkg.com/@lerna/create/-/create-8.1.8.tgz#be70d620f1d6b71e9d6b9d20049b784168b6ca19" + integrity sha512-wi72R01tgjBjzG2kjRyTHl4yCTKDfDMIXRyKz9E/FBa9SkFvUOAE4bdyY9MhEsRZmSWL7+CYE8Flv/HScRpBbA== dependencies: - "@npmcli/run-script" "7.0.2" - "@nx/devkit" ">=17.1.2 < 19" + "@npmcli/arborist" "7.5.4" + "@npmcli/package-json" "5.2.0" + "@npmcli/run-script" "8.1.0" + "@nx/devkit" ">=17.1.2 < 20" "@octokit/plugin-enterprise-rest" "6.0.1" "@octokit/rest" "19.0.11" + aproba "2.0.0" byte-size "8.1.1" chalk "4.1.0" clone-deep "4.0.1" - cmd-shim "6.0.1" + cmd-shim "6.0.3" + color-support "1.1.3" columnify "1.6.0" + console-control-strings "^1.1.0" conventional-changelog-core "5.0.1" conventional-recommended-bump "7.0.1" cosmiconfig "^8.2.0" - dedent "0.7.0" + dedent "1.5.3" execa "5.0.0" - fs-extra "^11.1.1" + fs-extra "^11.2.0" get-stream "6.0.0" - git-url-parse "13.1.0" - glob-parent "5.1.2" + git-url-parse "14.0.0" + glob-parent "6.0.2" globby "11.1.0" graceful-fs "4.2.11" has-unicode "2.0.1" ini "^1.3.8" - init-package-json "5.0.0" + init-package-json "6.0.3" inquirer "^8.2.4" is-ci "3.0.1" is-stream "2.0.0" js-yaml "4.1.0" - libnpmpublish "7.3.0" + libnpmpublish "9.0.9" load-json-file "6.2.0" lodash "^4.17.21" make-dir "4.0.0" minimatch "3.0.5" multimatch "5.0.0" node-fetch "2.6.7" - npm-package-arg "8.1.1" - npm-packlist "5.1.1" - npm-registry-fetch "^14.0.5" - npmlog "^6.0.2" - nx ">=17.1.2 < 19" + npm-package-arg "11.0.2" + npm-packlist "8.0.2" + npm-registry-fetch "^17.1.0" + nx ">=17.1.2 < 20" p-map "4.0.0" p-map-series "2.1.0" p-queue "6.6.2" p-reduce "^2.1.0" - pacote "^17.0.5" + pacote "^18.0.6" pify "5.0.0" read-cmd-shim "4.0.0" - read-package-json "6.0.4" resolve-from "5.0.0" rimraf "^4.4.1" semver "^7.3.4" + set-blocking "^2.0.0" signal-exit "3.0.7" slash "^3.0.0" - ssri "^9.0.1" + ssri "^10.0.6" + string-width "^4.2.3" + strip-ansi "^6.0.1" strong-log-transformer "2.1.0" - tar "6.1.11" + tar "6.2.1" temp-dir "1.0.0" upath "2.0.1" - uuid "^9.0.0" + uuid "^10.0.0" validate-npm-package-license "^3.0.4" - validate-npm-package-name "5.0.0" + validate-npm-package-name "5.0.1" + wide-align "1.1.5" write-file-atomic "5.0.1" write-pkg "4.0.0" yargs "17.7.2" yargs-parser "21.1.1" "@lit-labs/ssr-dom-shim@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.2.0.tgz#353ce4a76c83fadec272ea5674ede767650762fd" - integrity sha512-yWJKmpGE6lUURKAaIltoPIE/wrbY3TEkqQt+X0m+7fQNnAv0keydnYvbiJFP1PnMhizmIWRWOG5KLhYyc/xl+g== + version "1.2.1" + resolved "https://registry.yarnpkg.com/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.2.1.tgz#2f3a8f1d688935c704dbc89132394a41029acbb8" + integrity sha512-wx4aBmgeGvFmOKucFKY+8VFJSYZxs9poN3SDNQFF6lT6NrQUnHiPB2PWz2sc4ieEcAaYYzN+1uWahEeTq2aRIQ== "@lit/reactive-element@^2.0.4": version "2.0.4" @@ -1692,33 +1704,47 @@ dependencies: "@lit-labs/ssr-dom-shim" "^1.2.0" +"@ljharb/resumer@~0.0.1": + version "0.0.1" + resolved "https://registry.yarnpkg.com/@ljharb/resumer/-/resumer-0.0.1.tgz#8a940a9192dd31f6a1df17564bbd26dc6ad3e68d" + integrity sha512-skQiAOrCfO7vRTq53cxznMpks7wS1va95UCidALlOVWqvBAzwPVErwizDwoMqNVMEn1mDq0utxZd02eIrvF1lw== + dependencies: + "@ljharb/through" "^2.3.9" + +"@ljharb/through@^2.3.9", "@ljharb/through@~2.3.9": + version "2.3.13" + resolved "https://registry.yarnpkg.com/@ljharb/through/-/through-2.3.13.tgz#b7e4766e0b65aa82e529be945ab078de79874edc" + integrity sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ== + dependencies: + call-bind "^1.0.7" + "@loaders.gl/3d-tiles@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@loaders.gl/3d-tiles/-/3d-tiles-4.2.0.tgz#6fc3b94ffb4fdb90654d706a8abc0a9c3afac067" - integrity sha512-WkHj5m5tk6Ga1AI276UTSzYERy9FL2CXFT08j6IvWGhmjNFAPHvckGlgDS/bciVj0IpsrR61xEtks73Q5YIFlQ== - dependencies: - "@loaders.gl/compression" "4.2.0" - "@loaders.gl/crypto" "4.2.0" - "@loaders.gl/draco" "4.2.0" - "@loaders.gl/gltf" "4.2.0" - "@loaders.gl/images" "4.2.0" - "@loaders.gl/loader-utils" "4.2.0" - "@loaders.gl/math" "4.2.0" - "@loaders.gl/tiles" "4.2.0" - "@loaders.gl/zip" "4.2.0" + version "4.2.2" + resolved "https://registry.yarnpkg.com/@loaders.gl/3d-tiles/-/3d-tiles-4.2.2.tgz#2948a697e40ce36a724efcfa1170742d2ed6885f" + integrity sha512-op7KelDjEahz+ViFmavJdHw10n6lRZeTefC/cVYVQ1Jfvb8T+55KaOOXGoZODo14/B8Z53FnyPGVqR68dBYARw== + dependencies: + "@loaders.gl/compression" "4.2.2" + "@loaders.gl/crypto" "4.2.2" + "@loaders.gl/draco" "4.2.2" + "@loaders.gl/gltf" "4.2.2" + "@loaders.gl/images" "4.2.2" + "@loaders.gl/loader-utils" "4.2.2" + "@loaders.gl/math" "4.2.2" + "@loaders.gl/tiles" "4.2.2" + "@loaders.gl/zip" "4.2.2" "@math.gl/core" "^4.0.1" "@math.gl/culling" "^4.0.1" "@math.gl/geospatial" "^4.0.1" "@probe.gl/log" "^4.0.4" long "^5.2.1" -"@loaders.gl/compression@4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@loaders.gl/compression/-/compression-4.2.0.tgz#8d7763b1350007e02c20546d326d32f60e91268a" - integrity sha512-7dDR3h/y8HB73HVX4dVybEePzBJKQH6Gpb2VSPptZ0BoftWjctI+BRjKI8+SgPqIsJ0qOHkfvvIVLWalYuuzvA== +"@loaders.gl/compression@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@loaders.gl/compression/-/compression-4.2.2.tgz#57c7a3f397638859e75a0a47769cb17d6862fb06" + integrity sha512-dBFjMe4zLhE4NXfVsPkhs267/55qnxgP/AIhksOKTx30gQxCtcty6RWhfWGnluTnbAEXID2Uq/vfp1HYH7ZYCg== dependencies: - "@loaders.gl/loader-utils" "4.2.0" - "@loaders.gl/worker-utils" "4.2.0" + "@loaders.gl/loader-utils" "4.2.2" + "@loaders.gl/worker-utils" "4.2.2" "@types/brotli" "^1.3.0" "@types/pako" "^1.0.1" fflate "0.7.4" @@ -1731,109 +1757,109 @@ zstd-codec "^0.1" "@loaders.gl/core@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@loaders.gl/core/-/core-4.2.0.tgz#bb76e278f04e32636b58cffd9bf633d3af39d3d7" - integrity sha512-HCl+1BdNTcfKGi5+MhZh7ABKhybAjbhsJUsjhJxp2kYEW+2zybHoYPLvZLJFSuu88J/e5FqnL1HmdEFwn6oPXQ== + version "4.2.2" + resolved "https://registry.yarnpkg.com/@loaders.gl/core/-/core-4.2.2.tgz#36b30b364fe95bcfdbe4a493f6497425aa644b74" + integrity sha512-d3YElSsqL29MaiOwzGB97v994SPotbTvJnooCqoQsYGoYYrECdIetv1/zlfDsh5UB2Wl/NaUMJrzyOqlLmDz5Q== dependencies: - "@loaders.gl/loader-utils" "4.2.0" - "@loaders.gl/schema" "4.2.0" - "@loaders.gl/worker-utils" "4.2.0" + "@loaders.gl/loader-utils" "4.2.2" + "@loaders.gl/schema" "4.2.2" + "@loaders.gl/worker-utils" "4.2.2" "@probe.gl/log" "^4.0.2" -"@loaders.gl/crypto@4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@loaders.gl/crypto/-/crypto-4.2.0.tgz#80d31e96262fd28f7b5c564c64019646714efe7a" - integrity sha512-/SJI8NB1SrPWeRdkwtIN3lOzYJgcQw0USmLt+cQhux5lLqxw6MjsLeVU8k559KEhEQvIAvIiYLNtPHflKdQTrA== +"@loaders.gl/crypto@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@loaders.gl/crypto/-/crypto-4.2.2.tgz#b0a9001c794527a3e2572a2eb697fe48435e9494" + integrity sha512-0rbpHX8784wkcTb8+gjkzAxdA4p2CH3W5xxzdvpG4r37jVQwKYrh2NJxeF+xGIuuxlEaxD8x4kcyadKgCVtspA== dependencies: - "@loaders.gl/loader-utils" "4.2.0" - "@loaders.gl/worker-utils" "4.2.0" + "@loaders.gl/loader-utils" "4.2.2" + "@loaders.gl/worker-utils" "4.2.2" "@types/crypto-js" "^4.0.2" "@loaders.gl/csv@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@loaders.gl/csv/-/csv-4.2.0.tgz#781ca6268694751c7a46cde74448f2377565d23e" - integrity sha512-y5rBcgzBhUKkRJDV/8ZgfoKmbdhxjYjxyxxXEa80oQTfONVF1yuDKLPD9EWCpmRD1Rg0PaCM5KmkrmKmh7yhMg== + version "4.2.2" + resolved "https://registry.yarnpkg.com/@loaders.gl/csv/-/csv-4.2.2.tgz#dce89ef32cf4d3a255c0aacef3e21df2112175c4" + integrity sha512-ieJtVtcUsnB8twqP58e/cMiX05afKsq92I5o9hph9PhPKH5+6o0dcAW5sviB/a025aDWyEFz59LlmNhg8H8t/A== dependencies: - "@loaders.gl/loader-utils" "4.2.0" - "@loaders.gl/schema" "4.2.0" + "@loaders.gl/loader-utils" "4.2.2" + "@loaders.gl/schema" "4.2.2" -"@loaders.gl/draco@4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@loaders.gl/draco/-/draco-4.2.0.tgz#4806c311412b3021da3e9fb8e0d369830f68015a" - integrity sha512-nOcAt7/Dj2GeRstQMfWY0E5QMO55DanEbvXhIrSNh8ebk3XqOEMjhIxzy81VadPydSrnDhi6dVmmcEQXbL3Dpw== +"@loaders.gl/draco@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@loaders.gl/draco/-/draco-4.2.2.tgz#f26c8a98bf3675cdbe47bc0637cbd4cf95ad7682" + integrity sha512-WM7Zw6+04QzqlXjUYibR63Zi4I2iuBaDR41Rguur1s+ns2faiHDyEvuFlKtArTChFPQ8Xzf+6MNt7JeR8kpZTA== dependencies: - "@loaders.gl/loader-utils" "4.2.0" - "@loaders.gl/schema" "4.2.0" - "@loaders.gl/worker-utils" "4.2.0" + "@loaders.gl/loader-utils" "4.2.2" + "@loaders.gl/schema" "4.2.2" + "@loaders.gl/worker-utils" "4.2.2" draco3d "1.5.7" -"@loaders.gl/gis@4.2.0", "@loaders.gl/gis@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@loaders.gl/gis/-/gis-4.2.0.tgz#d246f03fdea8aaa4146468aee33d33d8994e1793" - integrity sha512-rwpchq5iAvFShhXsRcd1cZfRFdsA6gNzYwIgwK1UsoXiBzFvCoJ3Hn8b2fn3Z/x3wuTWX83Cxobr8aoVymMzwQ== +"@loaders.gl/gis@4.2.2", "@loaders.gl/gis@^4.2.0": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@loaders.gl/gis/-/gis-4.2.2.tgz#8b233d7c5c8c7d882a4d7f076b3a39d07cf89340" + integrity sha512-s9kD6yLMKn8+jAhDFDVWBeeKcDkJHFrscTnVWveGBfnC7IYT4gD6lQeHRIfXrJKs0LWmKPrAS8grTq7Ull8V6Q== dependencies: - "@loaders.gl/loader-utils" "4.2.0" - "@loaders.gl/schema" "4.2.0" + "@loaders.gl/loader-utils" "4.2.2" + "@loaders.gl/schema" "4.2.2" "@mapbox/vector-tile" "^1.3.1" "@math.gl/polygon" "^4.0.0" pbf "^3.2.1" -"@loaders.gl/gltf@4.2.0", "@loaders.gl/gltf@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@loaders.gl/gltf/-/gltf-4.2.0.tgz#eeb01d1afee13a27d336d1ff4b445a238b11a06a" - integrity sha512-t15dYnnfmQCGa5mar9KoShVxIVHNH5zAcoLRKpIXhPEvRmOdMeXETwAYQeJ73+IfK/EzY6OwkTlu6Kwm/0EgEw== - dependencies: - "@loaders.gl/draco" "4.2.0" - "@loaders.gl/images" "4.2.0" - "@loaders.gl/loader-utils" "4.2.0" - "@loaders.gl/schema" "4.2.0" - "@loaders.gl/textures" "4.2.0" +"@loaders.gl/gltf@4.2.2", "@loaders.gl/gltf@^4.2.0": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@loaders.gl/gltf/-/gltf-4.2.2.tgz#4258fbd079640bd29db0c27b18d60fe140102858" + integrity sha512-AK90PnRoaZ1jw/QWkg6TEJG8Yxd/QefxwlbMRJvtgk7QafsYo8dMm0e7EYgyOms0wDOcPflm5LHkIoqViRp/ww== + dependencies: + "@loaders.gl/draco" "4.2.2" + "@loaders.gl/images" "4.2.2" + "@loaders.gl/loader-utils" "4.2.2" + "@loaders.gl/schema" "4.2.2" + "@loaders.gl/textures" "4.2.2" "@math.gl/core" "^4.0.0" -"@loaders.gl/images@4.2.0", "@loaders.gl/images@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@loaders.gl/images/-/images-4.2.0.tgz#961504856a3a997e71c116acc908eef6c945c67b" - integrity sha512-0rntM3HheRsvlIESZiy39GDBj6FJ1L85wcMaIzmgre+AlCVZnuc0s619tgsbk+oJ+syPEtbzdyg+Ud05TIXhzA== +"@loaders.gl/images@4.2.2", "@loaders.gl/images@^4.2.0": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@loaders.gl/images/-/images-4.2.2.tgz#a6f37ad3778ab74aeb90f7ead45ef21751aea88c" + integrity sha512-R53rkexvVT0i4YXt++r8gLq3reB6kWTLvdJL81J3R4YJbM5+kNSe40jJOA94LFYlsTN+oirF4lkLTe5YXGZPYQ== dependencies: - "@loaders.gl/loader-utils" "4.2.0" + "@loaders.gl/loader-utils" "4.2.2" -"@loaders.gl/loader-utils@4.2.0", "@loaders.gl/loader-utils@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@loaders.gl/loader-utils/-/loader-utils-4.2.0.tgz#cb8ec688687ab5cfd06daceb57d133c17b6e4e8e" - integrity sha512-kWM3yMTGLqkBwb/CdWhzQU6P17PZelyFvUm5LtPm1LHo1tVuxutBeo5wl0FuAraJIx4O4/oCR0iNdb4l58wKRg== +"@loaders.gl/loader-utils@4.2.2", "@loaders.gl/loader-utils@^4.2.0": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@loaders.gl/loader-utils/-/loader-utils-4.2.2.tgz#7c4e930c2343bf20d3750ccc770c7368b5cb447a" + integrity sha512-5udJQhFx1KNIcRBYkFMi8QZitAsK+m3PkZ9GejM8VpOSsJUHD2Yal3wBHOPTRsOjQ0zXG/nqM7BHOojjeetNTg== dependencies: - "@loaders.gl/schema" "4.2.0" - "@loaders.gl/worker-utils" "4.2.0" + "@loaders.gl/schema" "4.2.2" + "@loaders.gl/worker-utils" "4.2.2" "@probe.gl/stats" "^4.0.2" -"@loaders.gl/math@4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@loaders.gl/math/-/math-4.2.0.tgz#f688df333c1adb5c698cd2098f1821f835bbab31" - integrity sha512-Z3NRoVJcmKPrkSfsd9bwpvRmWy/VI6MjD/eZ4AWObqtbVPsbaupUvk5Cc26djYkJ373nCE38D8jE25+lKvPqAQ== +"@loaders.gl/math@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@loaders.gl/math/-/math-4.2.2.tgz#8f93c3c21c16514fabb66cf08f0cf32f23d192af" + integrity sha512-nfiNNxXobhdKJILlHDWvm92SMEMMh1XAsb4BYvRIHyTzw4KzflFMS6C62v8ctAW6P8pQKyRvuos9LcRyroty1A== dependencies: - "@loaders.gl/images" "4.2.0" - "@loaders.gl/loader-utils" "4.2.0" + "@loaders.gl/images" "4.2.2" + "@loaders.gl/loader-utils" "4.2.2" "@math.gl/core" "^4.0.0" "@loaders.gl/mvt@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@loaders.gl/mvt/-/mvt-4.2.0.tgz#9c1b921f611ced39b7a6d9fa74f90a52ef9a9587" - integrity sha512-W/JHmWSP4hwWJb3xWtGqjTvn/TPSOhA651FptXT9SXWyLglEwKCrlSy4uTr1fFu1fxSJXxo6cQmWVVmVmYN7VA== + version "4.2.2" + resolved "https://registry.yarnpkg.com/@loaders.gl/mvt/-/mvt-4.2.2.tgz#5cf45ee7b72c65325ed97c44605c105661c1f36a" + integrity sha512-KglhYp1rwIs6h6AtrmKjrEYWxcX6xhlG3c3pTIFJwfA5nMBa+cmzD19vBRo1po9hzWKq4oqqhi7JL0ovH6GAqw== dependencies: - "@loaders.gl/gis" "4.2.0" - "@loaders.gl/images" "4.2.0" - "@loaders.gl/loader-utils" "4.2.0" - "@loaders.gl/schema" "4.2.0" + "@loaders.gl/gis" "4.2.2" + "@loaders.gl/images" "4.2.2" + "@loaders.gl/loader-utils" "4.2.2" + "@loaders.gl/schema" "4.2.2" "@math.gl/polygon" "^4.0.0" pbf "^3.2.1" "@loaders.gl/polyfills@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@loaders.gl/polyfills/-/polyfills-4.2.0.tgz#6d8ece084634fbd94d0005ea13403a01bcd6fd22" - integrity sha512-oQ6IMz0JCj0MLhsCxmfB0Ij/b7bntNJAz318pya9wLlWgdmChh/bIwgeyPGH/3Y1EslevgwfeeX/mE/y4kifyA== + version "4.2.2" + resolved "https://registry.yarnpkg.com/@loaders.gl/polyfills/-/polyfills-4.2.2.tgz#782b3efe92382a841a7e2ab3455725907c5b7f31" + integrity sha512-f4opMX1vX+Qj7Tuf1UE7ItUvDw8AE/SUkeDC4vIVvgDqnpOPxBuYwYd0Sl9cxuEwvTwVjGvCQCzarHOVlVN14w== dependencies: - "@loaders.gl/crypto" "4.2.0" - "@loaders.gl/loader-utils" "4.2.0" + "@loaders.gl/crypto" "4.2.2" + "@loaders.gl/loader-utils" "4.2.2" buffer "^6.0.3" get-pixels "^3.3.3" ndarray "^1.0.19" @@ -1842,43 +1868,43 @@ through "^2.3.8" web-streams-polyfill "^3.2.1" -"@loaders.gl/schema@4.2.0", "@loaders.gl/schema@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@loaders.gl/schema/-/schema-4.2.0.tgz#87c1da01aa15a45060ea54010504bc0c87689d38" - integrity sha512-xM5PY3k9UvyXz6rgCyouGSIbfzdsmrR2zYEhI5prFYwgjnOJX0D5Wz4TpsuNQaVpsAGC6cZXgQU6nmhScQYJyQ== +"@loaders.gl/schema@4.2.2", "@loaders.gl/schema@^4.2.0": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@loaders.gl/schema/-/schema-4.2.2.tgz#c5399343ce6103aebb21ba51bda956478247c133" + integrity sha512-vrQ6vlGWWptJXDP1DrL5x/j70xmyt2l36QZcGyDYptrohTGvQLc3yrOEHuD5v96fXX5WR619pT3zSYhuf1FnIg== dependencies: "@types/geojson" "^7946.0.7" "@loaders.gl/terrain@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@loaders.gl/terrain/-/terrain-4.2.0.tgz#553e61baf6dae1eb8af87cd2a6cc523d7074ef2c" - integrity sha512-j7LA5kU5Y4ZWEEXzpQOnmyIaQoIh07AkQj2FSnrEM0AwYgq9xSVa31otPk5WegEzOwbUOsWgHLtxju52HDUHJQ== + version "4.2.2" + resolved "https://registry.yarnpkg.com/@loaders.gl/terrain/-/terrain-4.2.2.tgz#163ed9e5a031428e96dd2991d4e615908f1f5e54" + integrity sha512-M5wDS20y0TTq9giCONLOWSIznD9H4JxfU1wicyEGUOa8U2u0Fdau5TObr//fOcT+Tvemkvcn01Oxj8acJWIsGw== dependencies: - "@loaders.gl/images" "4.2.0" - "@loaders.gl/loader-utils" "4.2.0" - "@loaders.gl/schema" "4.2.0" + "@loaders.gl/images" "4.2.2" + "@loaders.gl/loader-utils" "4.2.2" + "@loaders.gl/schema" "4.2.2" "@mapbox/martini" "^0.2.0" -"@loaders.gl/textures@4.2.0", "@loaders.gl/textures@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@loaders.gl/textures/-/textures-4.2.0.tgz#d1473e3b4933725ef130c66ec18502bd810d79ec" - integrity sha512-T+MoSyVCUQAjPTbDRnEXhQxyn5iU5nMzYiMI59VElp43WkShU3s7k4OB6HhAFPfIeqlD0ZPnm3ecgYZ/BZbZ6w== +"@loaders.gl/textures@4.2.2", "@loaders.gl/textures@^4.2.0": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@loaders.gl/textures/-/textures-4.2.2.tgz#3413f9f7ffa0341ffb075d079e47c6155a1f05f0" + integrity sha512-UlxCCi7VbCloj4VCzSULASgGVA059jglQYLc3kIHclvGoMcx3MJi0hID0MEQ6IhdO9Zyn4F42doVPrriNDVJFQ== dependencies: - "@loaders.gl/images" "4.2.0" - "@loaders.gl/loader-utils" "4.2.0" - "@loaders.gl/schema" "4.2.0" - "@loaders.gl/worker-utils" "4.2.0" + "@loaders.gl/images" "4.2.2" + "@loaders.gl/loader-utils" "4.2.2" + "@loaders.gl/schema" "4.2.2" + "@loaders.gl/worker-utils" "4.2.2" "@math.gl/types" "^4.0.1" ktx-parse "^0.0.4" texture-compressor "^1.0.2" -"@loaders.gl/tiles@4.2.0", "@loaders.gl/tiles@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@loaders.gl/tiles/-/tiles-4.2.0.tgz#2d8a32b9bdf7fe9df01801424eeca947ae653536" - integrity sha512-PjOFSZfiA5ioqRObF0sPVwnqnrCRU9Mw1gt36buga4UF7AYvbirKY/BysrM1NkqCSG0SWNbMGUdhBn41jlQv5g== +"@loaders.gl/tiles@4.2.2", "@loaders.gl/tiles@^4.2.0": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@loaders.gl/tiles/-/tiles-4.2.2.tgz#6cda3db676fff4d83dfb44fa317e8fdb97465c09" + integrity sha512-mozBA1FOrOFXa0lBxrRvHoRxsSb9T8D6ZfFIpbVR1z0zEWKm+NgRQzO8yS4IJD/CPFOn/r31SolZII6yXnzWbg== dependencies: - "@loaders.gl/loader-utils" "4.2.0" - "@loaders.gl/math" "4.2.0" + "@loaders.gl/loader-utils" "4.2.2" + "@loaders.gl/math" "4.2.2" "@math.gl/core" "^4.0.0" "@math.gl/culling" "^4.0.0" "@math.gl/geospatial" "^4.0.0" @@ -1886,108 +1912,109 @@ "@probe.gl/stats" "^4.0.2" "@loaders.gl/wms@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@loaders.gl/wms/-/wms-4.2.0.tgz#d324306acd566ae0b4093d8d5b00f5d8b9bd00c9" - integrity sha512-dN/q2rCaY9m3Sg06uq6Jq96reyYc+A8WwaMs0ehWIg7fQ1R/mh2cHCvmx/fBnY97fmIMPjrd+7wG3hluYcnssw== + version "4.2.2" + resolved "https://registry.yarnpkg.com/@loaders.gl/wms/-/wms-4.2.2.tgz#35d220ce3d0e31b88f982a86ca6eec21b7dad289" + integrity sha512-MoZqOgebyXsElfNbjX/el4jA9Rypusq7Z+cJ1tiP2yBTepuLkPBpXLeuUgt/v0MOqGoUWrkUY8I811ijkZYyjA== dependencies: - "@loaders.gl/images" "4.2.0" - "@loaders.gl/loader-utils" "4.2.0" - "@loaders.gl/schema" "4.2.0" - "@loaders.gl/xml" "4.2.0" + "@loaders.gl/images" "4.2.2" + "@loaders.gl/loader-utils" "4.2.2" + "@loaders.gl/schema" "4.2.2" + "@loaders.gl/xml" "4.2.2" "@turf/rewind" "^5.1.5" deep-strict-equal "^0.2.0" -"@loaders.gl/worker-utils@4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@loaders.gl/worker-utils/-/worker-utils-4.2.0.tgz#8dc31b2aac6bc2a5ae80b174aca370926c9f3d3f" - integrity sha512-sTfalI6utDO7/0i89bE5Ex+uXK6Kull7U3IozkDNPSn6JhNwCvkujhcmQWEFxEPY0CQRVZBq95pjbCYbYYLJpQ== +"@loaders.gl/worker-utils@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@loaders.gl/worker-utils/-/worker-utils-4.2.2.tgz#1c6c639f059b03ca3c443dc029bbbeede1aa571b" + integrity sha512-7Ad83VS/PmS0T3LXo+LB6cq5oHhAUW3GvYWizm4OfeuBDQRtYK7iRehgC13/BomkNtWIn0y7iAphlQMVrNdvhQ== -"@loaders.gl/xml@4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@loaders.gl/xml/-/xml-4.2.0.tgz#53508e0ee79936e07fff40a788ba67d81e6814d7" - integrity sha512-du9s+dubvLsJPzSvugUY3WwBuDvv3ZKOVtLaiakeqsQeOwbcvXa6LQgSR2nT79KQ2DL1+U51ctQHjtXLyOc6PA== +"@loaders.gl/xml@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@loaders.gl/xml/-/xml-4.2.2.tgz#4d2e751ca106a29dc89e01dec552d491ab55884e" + integrity sha512-ADikkGCwkS6d2IwFPomVAZfTNEHC6xXqDFbzfhYThsG3ptPpeosjJmn4GdI4dyazTsQnKIeiqV/RLS4CvJgxzw== dependencies: - "@loaders.gl/loader-utils" "4.2.0" - "@loaders.gl/schema" "4.2.0" + "@loaders.gl/loader-utils" "4.2.2" + "@loaders.gl/schema" "4.2.2" fast-xml-parser "^4.2.5" -"@loaders.gl/zip@4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@loaders.gl/zip/-/zip-4.2.0.tgz#602b77f1e6f41892bcbe36a02721610eb8ba200d" - integrity sha512-BrdGE0AIt9ZwlLMx7knZ/fsEUr2bL5RHDYE2f4A4vlH3LBRnXaiZDSfMPwQWJinEKpSHRnysGwqD6zSSUyhVHQ== +"@loaders.gl/zip@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@loaders.gl/zip/-/zip-4.2.2.tgz#48a7297488ffdfcc3aba7e98be0f235f44f89141" + integrity sha512-8wuhWrmGFUb9X7i1E9ObhqyiYuwQj6x0ttzujXE6o83T8TI1i88fySttMe0LSV2aIrTLo8A5n6MOf2LPSefPYg== dependencies: - "@loaders.gl/compression" "4.2.0" - "@loaders.gl/crypto" "4.2.0" - "@loaders.gl/loader-utils" "4.2.0" + "@loaders.gl/compression" "4.2.2" + "@loaders.gl/crypto" "4.2.2" + "@loaders.gl/loader-utils" "4.2.2" jszip "^3.1.5" md5 "^2.3.0" -"@luma.gl/constants@9.0.17", "@luma.gl/constants@^9.0.17": - version "9.0.17" - resolved "https://registry.yarnpkg.com/@luma.gl/constants/-/constants-9.0.17.tgz#7c06cb3a8079fd9d5224de52d0ccc803218f8e7a" - integrity sha512-epyW9CrNuEvPfdHQ1yOe/flFfDaihmrdgzw9M7JaKR6XlLDmjL1hKdCKugJjgNQ9wWpnOiiZAlfd7LzsNYW7lA== +"@luma.gl/constants@9.1.0-alpha.19", "@luma.gl/constants@^9.1.0-alpha.19": + version "9.1.0-alpha.19" + resolved "https://registry.yarnpkg.com/@luma.gl/constants/-/constants-9.1.0-alpha.19.tgz#ff96a96b96cdf40793b66bd3fc12592fbc373730" + integrity sha512-R8jdokqf8sArwboivrF98SXK02e2oj5hxQI/ZbPcx/Hg/ARTxiCwM+zH0P5WoS/5VqGWMdf3pHr5Q+QD/JLZMw== -"@luma.gl/core@^9.0.17": - version "9.0.17" - resolved "https://registry.yarnpkg.com/@luma.gl/core/-/core-9.0.17.tgz#683e287188fc150269b26647b20ded92c1ba87e6" - integrity sha512-AQJEvYcbkMBOywy/h5opZja0ay2DZ5aU88GyG5dRnA00usEocJf7qQGol2Skpm8Y258jdnV3yf2f3uzklKCnFQ== +"@luma.gl/core@^9.1.0-alpha.19": + version "9.1.0-alpha.19" + resolved "https://registry.yarnpkg.com/@luma.gl/core/-/core-9.1.0-alpha.19.tgz#a3b250deebb34ea711081bb22c29beeaed64124e" + integrity sha512-9uV7gIpj9Tr3n+0G0jiSJv4ya9FxmPLuQCmRZzbwuZh4+g+sZJ5ObPtMotpffouZ7CI+Uy96/xxQAeMgjyQrzg== dependencies: - "@math.gl/types" "^4.0.0" - "@probe.gl/env" "^4.0.2" - "@probe.gl/log" "^4.0.2" - "@probe.gl/stats" "^4.0.2" + "@math.gl/types" "4.1.0-alpha.3" + "@probe.gl/env" "^4.0.8" + "@probe.gl/log" "^4.0.8" + "@probe.gl/stats" "^4.0.8" "@types/offscreencanvas" "^2019.6.4" -"@luma.gl/engine@^9.0.17": - version "9.0.17" - resolved "https://registry.yarnpkg.com/@luma.gl/engine/-/engine-9.0.17.tgz#c6fc0e353578c96c116d9aae1d16d9b63a840e34" - integrity sha512-pTKDdWI8Pm5bVJUY46Jlvpz3qXTubYpIFwodmd4kmrl8UDQnrUt2Yq4sYuE9oLRxer788gLxWCp2SoJZZJJcfQ== +"@luma.gl/engine@^9.1.0-alpha.19": + version "9.1.0-alpha.19" + resolved "https://registry.yarnpkg.com/@luma.gl/engine/-/engine-9.1.0-alpha.19.tgz#e6ec04dcfbdab02e6f5779f206ba4b36a67a6d2d" + integrity sha512-yxaeqMFdSA2s9AGMZZ10MhYx/eVzjJ6KijaNWxg1Ca4oVIymkKgeuBoE6DAsx5nNd3fxDlua2atckVzT7AfLqQ== dependencies: - "@luma.gl/shadertools" "9.0.17" - "@math.gl/core" "^4.0.0" - "@probe.gl/log" "^4.0.2" - "@probe.gl/stats" "^4.0.2" + "@math.gl/core" "4.1.0-alpha.3" + "@math.gl/types" "4.1.0-alpha.3" + "@probe.gl/log" "^4.0.8" + "@probe.gl/stats" "^4.0.8" -"@luma.gl/gltf@^9.0.17": - version "9.0.17" - resolved "https://registry.yarnpkg.com/@luma.gl/gltf/-/gltf-9.0.17.tgz#7b693ed4eb88bf9f821794935c285047a3222fd2" - integrity sha512-25JNOJUeVPeotrJy7khgsKUphlY1ngnl1A/XFoEvoPHRBkRhGxU/CfdrkxagPh7A7KxAhH9gKTFHe58dFF4GvA== +"@luma.gl/gltf@^9.1.0-alpha.19": + version "9.1.0-alpha.19" + resolved "https://registry.yarnpkg.com/@luma.gl/gltf/-/gltf-9.1.0-alpha.19.tgz#28ab16f8d427101e3ec92dd6c84807db37571c0a" + integrity sha512-9kGidMqRhoX045oHAHzcC+ZfP33pJWRFFGlU9pkaOf38u+VReKjVX5pOatUboliWFSu7pSqQAx5OeCKSpUoyrA== dependencies: + "@loaders.gl/core" "^4.2.0" "@loaders.gl/textures" "^4.2.0" - "@luma.gl/shadertools" "9.0.17" - "@math.gl/core" "^4.0.0" + "@math.gl/core" "4.1.0-alpha.3" -"@luma.gl/shadertools@9.0.17", "@luma.gl/shadertools@^9.0.17": - version "9.0.17" - resolved "https://registry.yarnpkg.com/@luma.gl/shadertools/-/shadertools-9.0.17.tgz#623189fdcdb4b87dc911d2af6e8353e1867d491a" - integrity sha512-ph/9EKoWD8SLY9qj4F/wknRPQ6Lw/bBQg5ia2CwJPZ0jPqg3e1LzOd/AkD4epr0yg6jg7loXFs2ET7btM0CItA== +"@luma.gl/shadertools@^9.1.0-alpha.19": + version "9.1.0-alpha.19" + resolved "https://registry.yarnpkg.com/@luma.gl/shadertools/-/shadertools-9.1.0-alpha.19.tgz#92d1e7c896f60e68d713b2b8369277722847089e" + integrity sha512-RCedjibBd3oxcxyk4M/4/6jFSe21CgcIAmRnriNLyxY4P4dNdOCzEQFHrmVU+rDporX/rWKoforfgcz2oa6dwg== dependencies: - "@math.gl/core" "^4.0.0" - "@math.gl/types" "^4.0.0" + "@math.gl/core" "4.1.0-alpha.3" + "@math.gl/types" "4.1.0-alpha.3" wgsl_reflect "^1.0.1" -"@luma.gl/test-utils@^9.0.17": - version "9.0.17" - resolved "https://registry.yarnpkg.com/@luma.gl/test-utils/-/test-utils-9.0.17.tgz#e1b4dca2a29ff19feb3ccb4d77d5c30390ad2ff4" - integrity sha512-xJ4NSBwhMsBVj0cqFXVaaTxVX8KyK9qPqc4MWd2akxiEybyeW2YFHBic21fyBfKHeqh27fFkVPFUQi8h9XYbjQ== +"@luma.gl/test-utils@^9.1.0-alpha.19": + version "9.1.0-alpha.19" + resolved "https://registry.yarnpkg.com/@luma.gl/test-utils/-/test-utils-9.1.0-alpha.19.tgz#e0ed51bc973b6f6aebdb8a5b64543de7643bda82" + integrity sha512-+42K4Qqfak1P+33pPI1xZRuM2gh8DA1ZsURe/0iqxhCr06MiyJozIUjgjaktwewxPuAy7ifw675s4yclt9fKjw== dependencies: - "@probe.gl/env" "^4.0.2" - "@probe.gl/stats" "^4.0.2" + "@probe.gl/env" "^4.0.8" + "@probe.gl/stats" "^4.0.8" -"@luma.gl/webgl@^9.0.17": - version "9.0.17" - resolved "https://registry.yarnpkg.com/@luma.gl/webgl/-/webgl-9.0.17.tgz#0198f9582158cb804bed04aac016b328ff1a58ae" - integrity sha512-6LpqdCOFK+B3a9L/gRy9UwupEG3RWMdnn0sZusSmbjknEylugZQCdz+yjXHqxko6S6QGu8LimVPJf1QZLav8GA== +"@luma.gl/webgl@^9.1.0-alpha.19": + version "9.1.0-alpha.19" + resolved "https://registry.yarnpkg.com/@luma.gl/webgl/-/webgl-9.1.0-alpha.19.tgz#baa4f26dee6de231927a158a053742586ad920c8" + integrity sha512-wBtENBaqead4z/BH3VGWU1Yv1geozMtQhaHZ8rkaUqqN/yT2MzbdMQE4r0+hLR8VAhln4+7h6tmZhy9/p8pr9A== dependencies: - "@luma.gl/constants" "9.0.17" - "@probe.gl/env" "^4.0.2" + "@luma.gl/constants" "9.1.0-alpha.19" + "@math.gl/types" "4.1.0-alpha.3" + "@probe.gl/env" "^4.0.8" -"@luma.gl/webgpu@^9.0.17": - version "9.0.17" - resolved "https://registry.yarnpkg.com/@luma.gl/webgpu/-/webgpu-9.0.17.tgz#299f63427d958c299322c0aac5a7c16754005ece" - integrity sha512-YG/9g2KGyVh++PLAFEFnPE2xloAelAeanlOa7zKgw5fTVat642RIyqLsXa7cZRvzAwUHBdx+XPezD9lSPD6/dQ== +"@luma.gl/webgpu@^9.1.0-alpha.19": + version "9.1.0-alpha.19" + resolved "https://registry.yarnpkg.com/@luma.gl/webgpu/-/webgpu-9.1.0-alpha.19.tgz#6d7aa392fb2b27fe10867c8f023f782d397eab9f" + integrity sha512-1nB+YQt7mPp5gNrht47Rp29SSsS/VxHRzgBQoMlSbaFdP1awgxmQgOKlp+y49OrupMLHgoEwW3wa5DWe9GGQIA== dependencies: - "@probe.gl/env" "^4.0.2" + "@probe.gl/env" "^4.0.8" "@webgpu/types" "^0.1.34" "@lumino/algorithm@^1.9.0", "@lumino/algorithm@^1.9.2": @@ -2167,14 +2194,6 @@ resolved "https://registry.yarnpkg.com/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz#497c67a1cef50d1a2459ba60f315e448d2ad87fe" integrity sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q== -"@math.gl/core@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@math.gl/core/-/core-4.0.0.tgz#db64af16743ee4def7c1e294b3d1247621d2dabc" - integrity sha512-qGbP4R8G0dsh5OUO+eWKX5NJwZitkV8CdVEolRFSoPteE0lrWxsg01FwAjegKv4jCm975VJ4HxDcb4L6KAiGGw== - dependencies: - "@babel/runtime" "^7.12.0" - "@math.gl/types" "4.0.0" - "@math.gl/core@4.0.1", "@math.gl/core@^4.0.0", "@math.gl/core@^4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@math.gl/core/-/core-4.0.1.tgz#0deafe0f0cab7afb119aa58c57671c86a2659e80" @@ -2182,6 +2201,13 @@ dependencies: "@math.gl/types" "4.0.1" +"@math.gl/core@4.1.0-alpha.3", "@math.gl/core@^4.1.0-alpha.3": + version "4.1.0-alpha.3" + resolved "https://registry.yarnpkg.com/@math.gl/core/-/core-4.1.0-alpha.3.tgz#099856fcbeaad840d629e348a6b283360ff8e24b" + integrity sha512-+F8IhuRvoNFEsE2WZWqIwjU0bvF1MzF91szWNHQUIeBF0taPf8lZ1e/Y8bTY8FxdB9xHld5wsxAxZcIs0uVMxA== + dependencies: + "@math.gl/types" "4.1.0-alpha.3" + "@math.gl/culling@^4.0.0", "@math.gl/culling@^4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@math.gl/culling/-/culling-4.0.1.tgz#1b61e40dc89a83364f5c5a334759b009a3ea60cf" @@ -2189,6 +2215,14 @@ dependencies: "@math.gl/core" "4.0.1" +"@math.gl/culling@^4.1.0-alpha.3": + version "4.1.0-alpha.3" + resolved "https://registry.yarnpkg.com/@math.gl/culling/-/culling-4.1.0-alpha.3.tgz#7d6cbfafd6dbfc2ee2a069bbe4bc010ba87c9437" + integrity sha512-YVUifQ39fQl1ibDhox9PgkGP9UsRabASPjak5JFl2us83xBkyYqVjG3vWT+0sIh76wmJVZtv8D2B5duE9xKC3g== + dependencies: + "@math.gl/core" "4.1.0-alpha.3" + "@math.gl/types" "4.1.0-alpha.3" + "@math.gl/geospatial@^4.0.0", "@math.gl/geospatial@^4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@math.gl/geospatial/-/geospatial-4.0.1.tgz#d41205c03b8a3f2bc95f4c2636c1844c7c2cf10e" @@ -2203,52 +2237,69 @@ dependencies: "@math.gl/core" "4.0.1" -"@math.gl/proj4@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@math.gl/proj4/-/proj4-4.0.0.tgz#5073be8eedfb61decca9cb20d07116bee37748f4" - integrity sha512-gMVTlhzb1Mbq1F32jDph2nJivkipcGNU+Nx+jovFT9shplXwXeEdZxObjngYCtQiZEM3HqFFTbTnA1YhhZsG7A== +"@math.gl/polygon@^4.1.0-alpha.3": + version "4.1.0-alpha.3" + resolved "https://registry.yarnpkg.com/@math.gl/polygon/-/polygon-4.1.0-alpha.3.tgz#fc1d30583171189ac194a37d8f3cb7cfe7bd3407" + integrity sha512-R0yBs11skiHEKMbSTDTU/UI0c1rIk5frX2wTE3RLZ4sQG0EPs3O21jPAXytuXxRHpCrcYWeHlQb4qBea9vA2fQ== + dependencies: + "@math.gl/core" "4.1.0-alpha.3" + +"@math.gl/proj4@^4.1.0-alpha.3": + version "4.1.0-alpha.3" + resolved "https://registry.yarnpkg.com/@math.gl/proj4/-/proj4-4.1.0-alpha.3.tgz#2377e227e89bfa70b2972f072de0fc528eaaaa67" + integrity sha512-9cAG3AUgWp4pCOtdU/yo/CfUOTiv41WUTqP4w9+AWBdmAV4J/k1NM25NAYPf1gWDsE5txcB82OWpaVrZsz7F3g== dependencies: - "@babel/runtime" "^7.12.0" - "@math.gl/core" "4.0.0" + "@math.gl/core" "4.1.0-alpha.3" "@types/proj4" "^2.5.0" proj4 "2.6.2" -"@math.gl/sun@^4.0.0": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@math.gl/sun/-/sun-4.0.1.tgz#e56ab019ced715a063ad357cac74cfb93899e187" - integrity sha512-nDkQZ9PKd5iMySRM1j01hYG6MwA/MkKXZe4JvArggWUtPXL6nCcPSeiifPXQGIvE9eZdQkbn81StNY9q5l0cFg== - -"@math.gl/types@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@math.gl/types/-/types-4.0.0.tgz#20c649dcef8459d9dd1f83a708d7410fe06a3309" - integrity sha512-ZqU7o0LFaWQK/0wYobCwQKrKhRHaihps8oE74CLnWAdTTjXkM2vA8dU7vdx238QfXkNkz4Mv+KYklHpXMQJ8Hw== +"@math.gl/sun@^4.1.0-alpha.3": + version "4.1.0-alpha.3" + resolved "https://registry.yarnpkg.com/@math.gl/sun/-/sun-4.1.0-alpha.3.tgz#c16b2c019bb493e70dede7ac2bf89ec7ff30576e" + integrity sha512-RstlRMqaSkdAa+TBsc5wsCEtOKnx552vwYFTpbXClYE+c2a2Y4JkohcIWp16erkkBrAUYxNvhwlTdI/uHjJULA== -"@math.gl/types@4.0.1", "@math.gl/types@^4.0.0", "@math.gl/types@^4.0.1": +"@math.gl/types@4.0.1", "@math.gl/types@^4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@math.gl/types/-/types-4.0.1.tgz#a6f8539f6de39e5483a305d70f8bfa44b3248b69" integrity sha512-E9qBKAjVBiZD8Is7TbygiLGtYBP3GSLus6RUJSuzFQegdYXeVagvrs4UkBJxhrRAxw4crfH0Tq7IhTMKuuJNQw== +"@math.gl/types@4.1.0-alpha.3", "@math.gl/types@^4.1.0-alpha.3": + version "4.1.0-alpha.3" + resolved "https://registry.yarnpkg.com/@math.gl/types/-/types-4.1.0-alpha.3.tgz#ecffc5280d7c55d1b03663b85ea61892e57e5492" + integrity sha512-ZQzaAhDz14y9s6SscXZWjU51UnwpTPuWuRzdTvcwhWPZ2QbnYwyyGXO7OzlCPrqlh9pJCm8kcEOcrwvL5AJ91w== + "@math.gl/web-mercator@^4.0.0": version "4.0.1" resolved "https://registry.yarnpkg.com/@math.gl/web-mercator/-/web-mercator-4.0.1.tgz#138a9d32da0e810e919c1908fa1534adbdc2ef27" integrity sha512-eJ0nDw8140kJorf8ASyKRC53rI+UG6vPxpsKJiGRD6lXsoKTeKYebeEAXiGDWTvi2AMe6+xngxTqqwm58fL3Fw== -"@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.2": - version "2.1.8-no-fsevents.2" - resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.2.tgz#e324c0a247a5567192dd7180647709d7e2faf94b" - integrity sha512-Fb8WxUFOBQVl+CX4MWet5o7eCc6Pj04rXIwVKZ6h1NnqTo45eOQW6aWyhG25NIODvWFwTDMwBsYxrQ3imxpetg== +"@math.gl/web-mercator@^4.1.0-alpha.3": + version "4.1.0-alpha.3" + resolved "https://registry.yarnpkg.com/@math.gl/web-mercator/-/web-mercator-4.1.0-alpha.3.tgz#dd5ca2682f5d392fe3dca9639a0fcc0a8416a599" + integrity sha512-Jiu+i/E5WBWuvp7rAElAylU7dNTiXncdlUejd6hO7TIq/miF5ONOtsiK5fcJQJEVhm8CK4ymPYnyHACWtUzbLw== dependencies: - anymatch "^2.0.0" - async-each "^1.0.1" - braces "^2.3.2" - glob-parent "^5.1.2" - inherits "^2.0.3" - is-binary-path "^1.0.0" - is-glob "^4.0.0" - normalize-path "^3.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.2.1" - upath "^1.1.1" + "@math.gl/core" "4.1.0-alpha.3" + +"@napi-rs/wasm-runtime@0.2.4": + version "0.2.4" + resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.4.tgz#d27788176f250d86e498081e3c5ff48a17606918" + integrity sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ== + dependencies: + "@emnapi/core" "^1.1.0" + "@emnapi/runtime" "^1.1.0" + "@tybys/wasm-util" "^0.9.0" + +"@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3": + version "2.1.8-no-fsevents.3" + resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz#323d72dd25103d0c4fbdce89dadf574a787b1f9b" + integrity sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ== + +"@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": + version "5.1.1-v1" + resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz#dbf733a965ca47b1973177dc0bb6c889edcfb129" + integrity sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg== + dependencies: + eslint-scope "5.1.1" "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -2282,19 +2333,61 @@ lru-cache "^10.0.1" socks-proxy-agent "^8.0.3" -"@npmcli/fs@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-3.1.0.tgz#233d43a25a91d68c3a863ba0da6a3f00924a173e" - integrity sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w== +"@npmcli/arborist@7.5.4": + version "7.5.4" + resolved "https://registry.yarnpkg.com/@npmcli/arborist/-/arborist-7.5.4.tgz#3dd9e531d6464ef6715e964c188e0880c471ac9b" + integrity sha512-nWtIc6QwwoUORCRNzKx4ypHqCk3drI+5aeYdMTQQiRCcn4lOOgfQh7WyZobGYTxXPSq1VwV53lkpN/BRlRk08g== + dependencies: + "@isaacs/string-locale-compare" "^1.1.0" + "@npmcli/fs" "^3.1.1" + "@npmcli/installed-package-contents" "^2.1.0" + "@npmcli/map-workspaces" "^3.0.2" + "@npmcli/metavuln-calculator" "^7.1.1" + "@npmcli/name-from-folder" "^2.0.0" + "@npmcli/node-gyp" "^3.0.0" + "@npmcli/package-json" "^5.1.0" + "@npmcli/query" "^3.1.0" + "@npmcli/redact" "^2.0.0" + "@npmcli/run-script" "^8.1.0" + bin-links "^4.0.4" + cacache "^18.0.3" + common-ancestor-path "^1.0.1" + hosted-git-info "^7.0.2" + json-parse-even-better-errors "^3.0.2" + json-stringify-nice "^1.1.4" + lru-cache "^10.2.2" + minimatch "^9.0.4" + nopt "^7.2.1" + npm-install-checks "^6.2.0" + npm-package-arg "^11.0.2" + npm-pick-manifest "^9.0.1" + npm-registry-fetch "^17.0.1" + pacote "^18.0.6" + parse-conflict-json "^3.0.0" + proc-log "^4.2.0" + proggy "^2.0.0" + promise-all-reject-late "^1.0.0" + promise-call-limit "^3.0.1" + read-package-json-fast "^3.0.2" + semver "^7.3.7" + ssri "^10.0.6" + treeverse "^3.0.0" + walk-up-path "^3.0.1" + +"@npmcli/fs@^3.1.0", "@npmcli/fs@^3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-3.1.1.tgz#59cdaa5adca95d135fc00f2bb53f5771575ce726" + integrity sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg== dependencies: semver "^7.3.5" "@npmcli/git@^5.0.0": - version "5.0.6" - resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-5.0.6.tgz#d7b24eb2cff98754c8868faab40405abfa1abe28" - integrity sha512-4x/182sKXmQkf0EtXxT26GEsaOATpD7WVtza5hrYivWZeo6QefC6xq9KAXrnjtFKBZ4rZwR7aX/zClYYXgtwLw== + version "5.0.8" + resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-5.0.8.tgz#8ba3ff8724192d9ccb2735a2aa5380a992c5d3d1" + integrity sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ== dependencies: "@npmcli/promise-spawn" "^7.0.0" + ini "^4.1.3" lru-cache "^10.0.1" npm-pick-manifest "^9.0.0" proc-log "^4.0.0" @@ -2303,7 +2396,7 @@ semver "^7.3.5" which "^4.0.0" -"@npmcli/installed-package-contents@^2.0.1": +"@npmcli/installed-package-contents@^2.0.1", "@npmcli/installed-package-contents@^2.1.0": version "2.1.0" resolved "https://registry.yarnpkg.com/@npmcli/installed-package-contents/-/installed-package-contents-2.1.0.tgz#63048e5f6e40947a3a88dcbcb4fd9b76fdd37c17" integrity sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w== @@ -2311,15 +2404,41 @@ npm-bundled "^3.0.0" npm-normalize-package-bin "^3.0.0" +"@npmcli/map-workspaces@^3.0.2": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@npmcli/map-workspaces/-/map-workspaces-3.0.6.tgz#27dc06c20c35ef01e45a08909cab9cb3da08cea6" + integrity sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA== + dependencies: + "@npmcli/name-from-folder" "^2.0.0" + glob "^10.2.2" + minimatch "^9.0.0" + read-package-json-fast "^3.0.0" + +"@npmcli/metavuln-calculator@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@npmcli/metavuln-calculator/-/metavuln-calculator-7.1.1.tgz#4d3b6c3192f72bc8ad59476de0da939c33877fcf" + integrity sha512-Nkxf96V0lAx3HCpVda7Vw4P23RILgdi/5K1fmj2tZkWIYLpXAN8k2UVVOsW16TsS5F8Ws2I7Cm+PU1/rsVF47g== + dependencies: + cacache "^18.0.0" + json-parse-even-better-errors "^3.0.0" + pacote "^18.0.0" + proc-log "^4.1.0" + semver "^7.3.5" + +"@npmcli/name-from-folder@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/name-from-folder/-/name-from-folder-2.0.0.tgz#c44d3a7c6d5c184bb6036f4d5995eee298945815" + integrity sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg== + "@npmcli/node-gyp@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz#101b2d0490ef1aa20ed460e4c0813f0db560545a" integrity sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA== -"@npmcli/package-json@^5.0.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@npmcli/package-json/-/package-json-5.1.0.tgz#10d117b5fb175acc14c70901a151c52deffc843e" - integrity sha512-1aL4TuVrLS9sf8quCLerU3H9J4vtCtgu8VauYozrmEyU57i/EdKleCnsQ7vpnABIH6c9mnTxcH5sFkO3BlV8wQ== +"@npmcli/package-json@5.2.0", "@npmcli/package-json@^5.0.0", "@npmcli/package-json@^5.1.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@npmcli/package-json/-/package-json-5.2.0.tgz#a1429d3111c10044c7efbfb0fce9f2c501f4cfad" + integrity sha512-qe/kiqqkW0AGtvBjL8TJKZk/eBBSpnJkUWvHdQ9jM2lKHXRYYJuyNpJPlJw3c8QjC2ow6NZYiLExhUaeJelbxQ== dependencies: "@npmcli/git" "^5.0.0" glob "^10.2.2" @@ -2330,117 +2449,115 @@ semver "^7.5.3" "@npmcli/promise-spawn@^7.0.0": - version "7.0.1" - resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-7.0.1.tgz#a836de2f42a2245d629cf6fbb8dd6c74c74c55af" - integrity sha512-P4KkF9jX3y+7yFUxgcUdDtLy+t4OlDGuEBLNs57AZsfSfg+uV6MLndqGpnl4831ggaEdXwR50XFoZP4VFtHolg== + version "7.0.2" + resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-7.0.2.tgz#1d53d34ffeb5d151bfa8ec661bcccda8bbdfd532" + integrity sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ== dependencies: which "^4.0.0" -"@npmcli/redact@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@npmcli/redact/-/redact-1.1.0.tgz#78e53a6a34f013543a73827a07ebdc3a6f10454b" - integrity sha512-PfnWuOkQgu7gCbnSsAisaX7hKOdZ4wSAhAzH3/ph5dSGau52kCRrMMGbiSQLwyTZpgldkZ49b0brkOr1AzGBHQ== - -"@npmcli/run-script@7.0.2": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-7.0.2.tgz#497e7f058799497889df65900c711312252276d3" - integrity sha512-Omu0rpA8WXvcGeY6DDzyRoY1i5DkCBkzyJ+m2u7PD6quzb0TvSqdIPOkTn8ZBOj7LbbcbMfZ3c5skwSu6m8y2w== +"@npmcli/query@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@npmcli/query/-/query-3.1.0.tgz#bc202c59e122a06cf8acab91c795edda2cdad42c" + integrity sha512-C/iR0tk7KSKGldibYIB9x8GtO/0Bd0I2mhOaDb8ucQL/bQVTmGoeREaFj64Z5+iCBRf3dQfed0CjJL7I8iTkiQ== dependencies: - "@npmcli/node-gyp" "^3.0.0" - "@npmcli/promise-spawn" "^7.0.0" - node-gyp "^10.0.0" - read-package-json-fast "^3.0.0" - which "^4.0.0" + postcss-selector-parser "^6.0.10" -"@npmcli/run-script@^7.0.0": - version "7.0.4" - resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-7.0.4.tgz#9f29aaf4bfcf57f7de2a9e28d1ef091d14b2e6eb" - integrity sha512-9ApYM/3+rBt9V80aYg6tZfzj3UWdiYyCt7gJUD1VJKvWF5nwKDSICXbYIQbspFTq6TOpbsEtIC0LArB8d9PFmg== +"@npmcli/redact@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@npmcli/redact/-/redact-2.0.1.tgz#95432fd566e63b35c04494621767a4312c316762" + integrity sha512-YgsR5jCQZhVmTJvjduTOIHph0L73pK8xwMVaDY0PatySqVM9AZj93jpoXYSJqfHFxFkN9dmqTw6OiqExsS3LPw== + +"@npmcli/run-script@8.1.0", "@npmcli/run-script@^8.0.0", "@npmcli/run-script@^8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-8.1.0.tgz#a563e5e29b1ca4e648a6b1bbbfe7220b4bfe39fc" + integrity sha512-y7efHHwghQfk28G2z3tlZ67pLG0XdfYbcVG26r7YIXALRsrVQcTq4/tdenSmdOrEsNahIYA/eh8aEVROWGFUDg== dependencies: "@npmcli/node-gyp" "^3.0.0" "@npmcli/package-json" "^5.0.0" "@npmcli/promise-spawn" "^7.0.0" node-gyp "^10.0.0" + proc-log "^4.0.0" which "^4.0.0" -"@nrwl/devkit@18.3.3": - version "18.3.3" - resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-18.3.3.tgz#9ec5575afe6d14b17acd5e8da4e98a0de27704c6" - integrity sha512-3zZLE1vfwsNie7qjVUt9lqaM1slU0RTr/dW+Yt/2lxe8Peu6f8bnCM1Pf3kSlzoxQroctfocRtVHFXJsAuAt4g== +"@nrwl/devkit@19.6.2": + version "19.6.2" + resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-19.6.2.tgz#a06ac1786601c2ef36ffbb5ac46bc674c345939f" + integrity sha512-1caQTLJBcvOLDZpB3yHY0zczcaaOh044MeegS0oyllPYYbCi6PiJK33HC8qoH1TGiahT6+VxSFN7OYnD3QK4vQ== dependencies: - "@nx/devkit" "18.3.3" + "@nx/devkit" "19.6.2" -"@nrwl/tao@18.3.3": - version "18.3.3" - resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-18.3.3.tgz#2d0c60d233f2cc07c85ba08126dd46f21dda1ef0" - integrity sha512-f/PUDLpSMEObiLQ5sIDySJM+5DxSCNunkxxbY1R9rmQ1cFcgrHaXIHQqbSj91mMa3mmtbKACk8u1LbI+oQV0Tg== +"@nrwl/tao@19.6.2": + version "19.6.2" + resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-19.6.2.tgz#48a38e91f05acb83ab6ee07459103ad6ec733120" + integrity sha512-DcqpaKpkUbF+J2kVRoLtYZOFpr8mu4+fHiKIjrdliKVabSOzekwRAx0DN+VZdpUoaZ2+5W+F8RFhSak1216ZCg== dependencies: - nx "18.3.3" + nx "19.6.2" tslib "^2.3.0" -"@nx/devkit@18.3.3", "@nx/devkit@>=17.1.2 < 19": - version "18.3.3" - resolved "https://registry.yarnpkg.com/@nx/devkit/-/devkit-18.3.3.tgz#2ec37855020da74ad1e77b51711b057b3cb12fec" - integrity sha512-FtkZ6mA5//vEA5lcbT80m080ROVacHYV5F1peztTRA+IY2JZGJoqx425kn5ylDO8aCSAIAwcn2qIdhI8BnpG3Q== +"@nx/devkit@19.6.2", "@nx/devkit@>=17.1.2 < 20": + version "19.6.2" + resolved "https://registry.yarnpkg.com/@nx/devkit/-/devkit-19.6.2.tgz#8db7eaae181f22dbbf00a548619a184432ace732" + integrity sha512-fyZ+z0CnpXsGbnOTgsxwjOJH/K1cgSkhyHSOW3BcIvncx4Q4o8Y74flRz2mrZLJeURBs+IelYI2REkCPdba2cg== dependencies: - "@nrwl/devkit" "18.3.3" + "@nrwl/devkit" "19.6.2" ejs "^3.1.7" enquirer "~2.3.6" ignore "^5.0.4" + minimatch "9.0.3" semver "^7.5.3" tmp "~0.2.1" tslib "^2.3.0" yargs-parser "21.1.1" -"@nx/nx-darwin-arm64@18.3.3": - version "18.3.3" - resolved "https://registry.yarnpkg.com/@nx/nx-darwin-arm64/-/nx-darwin-arm64-18.3.3.tgz#dcdbcfe2796bbe3f1dfd61bce81389b05a50e69b" - integrity sha512-NpA2/7o1uUuaocMYopX9muxKif9HlGfWaXo2UeiR918usF6xri4aUqweZbaXVc9iqCAEbVMWUsjaLYGKPXHAjw== - -"@nx/nx-darwin-x64@18.3.3": - version "18.3.3" - resolved "https://registry.yarnpkg.com/@nx/nx-darwin-x64/-/nx-darwin-x64-18.3.3.tgz#aa7bdd1a3ea0bb81682422b805914efccab3b179" - integrity sha512-aydPLbc7DeceJ6szRf6DLT4ERoPvwfWyFiGXdAlEZYWhjEuNZLeG8K6jA3yHeWltKfX/qJqhnyKbnubBNzBKlQ== - -"@nx/nx-freebsd-x64@18.3.3": - version "18.3.3" - resolved "https://registry.yarnpkg.com/@nx/nx-freebsd-x64/-/nx-freebsd-x64-18.3.3.tgz#331f5dbb56c90b08e99c1ce9ff51e0c5b956f030" - integrity sha512-sEYEWsK/fwC1l7wzls7RNOjhmrooH0lK0mpgj1vDXesLBSZ7k+pddAqaHFECN4QXBSbHZI2PWOEhbnIH+Errsg== - -"@nx/nx-linux-arm-gnueabihf@18.3.3": - version "18.3.3" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-18.3.3.tgz#d66d4787f5cfc56b5a7aa9a0453174b96b4729a8" - integrity sha512-B9GGMkrrzwiAfvew22x85ITO9TiNxbgRbKJQWQaoopNpXrnSWpY8WTNxpDT24fwV1qdQfsPKcY3F4O0NOUgPRA== - -"@nx/nx-linux-arm64-gnu@18.3.3": - version "18.3.3" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-18.3.3.tgz#2ab08df1d052a55d4a52ba910fe41c25701d5361" - integrity sha512-1EucHf5/0JeqZmhritqkpEdOcdo9Dl32gpFvhNfS6kCAYmaDlEl4zqedz3VIoj4C7+C0pV3mcRO9qB9H7GM5bQ== - -"@nx/nx-linux-arm64-musl@18.3.3": - version "18.3.3" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-18.3.3.tgz#69376454bb9759c376d0a90aa876dfff6bbf4d15" - integrity sha512-HPgOgnYYLPVCBEaAkSEGPGzZqTDCiyCAF/qtvx5z0f1U/hZYb1ubgxw70ogY82Cafr7X4gQBz5k4/ZCnoCXlOQ== - -"@nx/nx-linux-x64-gnu@18.3.3": - version "18.3.3" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-18.3.3.tgz#0b8ba8ec0c2371f0df462742460d52d63b1cc715" - integrity sha512-FgYTQ3VEE6EUOGtJT9riRK8IBwPGFjKS+N2mudQJn2bB/9IumUvVRYQUIX08gqGLlqZPO6uUUhUjwZY8SnjRLQ== - -"@nx/nx-linux-x64-musl@18.3.3": - version "18.3.3" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-18.3.3.tgz#c96d6f8d2d94b99ac8da723077ebbc92f833beea" - integrity sha512-QnWjGViR1Wj9gJXa1RJ9mXyy2/JzQ7NF2C4ulTYSH5St1HoxhkfnLsV0+uNLFEV9PSZq+2BfxmQuT8Appefv1A== - -"@nx/nx-win32-arm64-msvc@18.3.3": - version "18.3.3" - resolved "https://registry.yarnpkg.com/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-18.3.3.tgz#0d2c7396e7a063849edbd6e3d34ea81445c389b5" - integrity sha512-Xn3LUaPsF8QkEYUVV3lc693NTCMWrfZBFXTy1cQpvLzQ+idsXQ/EGWoq93cIM3Nc2YWyblT2hHHelb8dHCZAlw== - -"@nx/nx-win32-x64-msvc@18.3.3": - version "18.3.3" - resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-18.3.3.tgz#ea1a60ae1ffe805529d5cb95e7b28e6b8ae24621" - integrity sha512-t8HvOnQEiaaoTFOOIrql30NPhIwDFO7jg0Jtz3Tbneulh7ceswJp71yFHsRGGrYZ23Tgg+Sna6M9qLRGzlRGkg== +"@nx/nx-darwin-arm64@19.6.2": + version "19.6.2" + resolved "https://registry.yarnpkg.com/@nx/nx-darwin-arm64/-/nx-darwin-arm64-19.6.2.tgz#4545fb0d9a54dbd78a54981f743306817a158c7e" + integrity sha512-WCt9bK5CiuXiiE/8ivoeOEy3J2xYx2Eduea+8PdyK+21FzWakSV4GK0DUfC/dmLPyc+osx2kpmVO+l4HVBIEJw== + +"@nx/nx-darwin-x64@19.6.2": + version "19.6.2" + resolved "https://registry.yarnpkg.com/@nx/nx-darwin-x64/-/nx-darwin-x64-19.6.2.tgz#c8d32aae59f5169f43c1f73b2227883cc9a59201" + integrity sha512-jCB4yTE97/UkUd1V7ttFLJkVRx2vkQgHAqcmU0l8pAPRWKplYkO43J4g4M3M8SyLsX6arPIlfIT3uBh8TzqxXA== + +"@nx/nx-freebsd-x64@19.6.2": + version "19.6.2" + resolved "https://registry.yarnpkg.com/@nx/nx-freebsd-x64/-/nx-freebsd-x64-19.6.2.tgz#bdbb811251ef138abfdbd44d8baccb9f03deadd1" + integrity sha512-ZBFTHO9vhaSpzuopAww9xznseNjE2CUXGSq5be0CUBoIvGn4TWvjOfv+tinIbKSYiWdfL1PYMqnE2FIqyxscNA== + +"@nx/nx-linux-arm-gnueabihf@19.6.2": + version "19.6.2" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-19.6.2.tgz#8d12fc6142802882b21e9270cdf4f39d7ae31398" + integrity sha512-Aubnlvx/47zAOIlp+ZWxe6Xq3cX9sSMRsB7xZhLkGnpcKwsKEh+uDWi6yfdnmLBp02ZY16qwcpAeYlyBRHZRUA== + +"@nx/nx-linux-arm64-gnu@19.6.2": + version "19.6.2" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-19.6.2.tgz#f9fafc6b3fd20f08b7d676f7830f13317ddac8fa" + integrity sha512-LorZsjhaz7vajwzGVAGUMtMpu5232UvJceB7XzUXF1TEWM2FZfSUCdLKdQgR2YZHeALYzVoEQgU/j6zKldMqpw== + +"@nx/nx-linux-arm64-musl@19.6.2": + version "19.6.2" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-19.6.2.tgz#2ae6083852c1f0e13129a2178d700ec1df5ea7bb" + integrity sha512-+s4BD6NkmsrnxYHWpJ84Lm49rsTa5tY4Zpz09kpMCc7NNQdIYtWimexGmaHGiIY9FmwqaQCx54lCxSXUXQ3hoQ== + +"@nx/nx-linux-x64-gnu@19.6.2": + version "19.6.2" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-19.6.2.tgz#c17085ce00610c2a20d1fd7e029b4fbc8a49047a" + integrity sha512-O7ao0x7j7mwgPS8DkWmMtewTRyharQSURq2kUgWwyCJgVbr5ggV8RySmt/uLT9Tv/2LUDerWdBnd30oDr70M5g== + +"@nx/nx-linux-x64-musl@19.6.2": + version "19.6.2" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-19.6.2.tgz#93a928e7295ece2c1834fb0c932254d322dc105b" + integrity sha512-7tVOQoorw8o1n5CAtLTlJx9oI/py+V3NX0PTdX/Pa7tA6gxyrZW51HlpODssRZ5PM9171G8VAZVROP9eDLfntQ== + +"@nx/nx-win32-arm64-msvc@19.6.2": + version "19.6.2" + resolved "https://registry.yarnpkg.com/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-19.6.2.tgz#57c44287a0ebec6740763bf05dbda6d9ca2aa828" + integrity sha512-l12NsHLaCAYdZPOP8KrXnSWxrytcJuifBJTejy7Xu9rFQMEDWI7dKap8vKJrYIRUtJjOsF8Yjq38064noZkLdw== + +"@nx/nx-win32-x64-msvc@19.6.2": + version "19.6.2" + resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-19.6.2.tgz#d0f703b68f106c21f5084551aa29d790fee48d0f" + integrity sha512-B+80FY1kDWHMCOZubt786BtQOZn+LJ6CzjDGHSocqVMVqJDvBzrlf4qwmHeOIACWAsbZtJmWu+do3FriZ53ovA== "@octokit/auth-token@^3.0.0": version "3.0.4" @@ -2575,11 +2692,6 @@ dependencies: "@webcomponents/shadycss" "^1.9.1" -"@popperjs/core@~2.11.8": - version "2.11.8" - resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" - integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== - "@probe.gl/bench@^4.0.9": version "4.0.9" resolved "https://registry.yarnpkg.com/@probe.gl/bench/-/bench-4.0.9.tgz#169fb15e6d50ebfee06d0234cd85cd96b9c07aa3" @@ -2587,19 +2699,19 @@ dependencies: "@probe.gl/log" "4.0.9" -"@probe.gl/env@4.0.9", "@probe.gl/env@^4.0.2", "@probe.gl/env@^4.0.9": +"@probe.gl/env@4.0.9", "@probe.gl/env@^4.0.8", "@probe.gl/env@^4.0.9": version "4.0.9" resolved "https://registry.yarnpkg.com/@probe.gl/env/-/env-4.0.9.tgz#cd0ed5214ed68021f3facc82cd885faebad21642" integrity sha512-AOmVMD0/j78mX+k4+qX7ZhE0sY9H+EaJgIO6trik0BwV6VcrwxTGCGFAeuRsIGhETDnye06tkLXccYatYxAYwQ== -"@probe.gl/log@4.0.9", "@probe.gl/log@^4.0.2", "@probe.gl/log@^4.0.4", "@probe.gl/log@^4.0.9": +"@probe.gl/log@4.0.9", "@probe.gl/log@^4.0.2", "@probe.gl/log@^4.0.4", "@probe.gl/log@^4.0.8", "@probe.gl/log@^4.0.9": version "4.0.9" resolved "https://registry.yarnpkg.com/@probe.gl/log/-/log-4.0.9.tgz#5971bb12558c470634f7e30b490252965af22c2a" integrity sha512-ebuZaodSRE9aC+3bVC7cKRHT8garXeT1jTbj1R5tQRqQYc9iGeT3iemVOHx5bN9Q6gAs/0j54iPI+1DvWMAW4A== dependencies: "@probe.gl/env" "4.0.9" -"@probe.gl/stats@^4.0.2", "@probe.gl/stats@^4.0.9": +"@probe.gl/stats@^4.0.2", "@probe.gl/stats@^4.0.8", "@probe.gl/stats@^4.0.9": version "4.0.9" resolved "https://registry.yarnpkg.com/@probe.gl/stats/-/stats-4.0.9.tgz#3a175c1a0207d54bf911bd01f4f5414b9f3e6f2a" integrity sha512-Q9Xt/sJUQaMsbjRKjOscv2t7wXIymTrOEJ4a3da4FTCn7bkKvcdxdyFAQySCrtPxE+YZ5I5lXpWPgv9BwmpE1g== @@ -2613,102 +2725,75 @@ "@types/pngjs" "^6.0.1" pixelmatch "^4.0.2" -"@puppeteer/browsers@2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@puppeteer/browsers/-/browsers-2.1.0.tgz#2683d3c908ecfc9af6b63111b5037679d3cebfd8" - integrity sha512-xloWvocjvryHdUjDam/ZuGMh7zn4Sn3ZAaV4Ah2e2EwEt90N3XphZlSsU3n0VDc1F7kggCjMuH0UuxfPQ5mD9w== - dependencies: - debug "4.3.4" - extract-zip "2.0.1" - progress "2.0.3" - proxy-agent "6.4.0" - semver "7.6.0" - tar-fs "3.0.5" - unbzip2-stream "1.4.3" - yargs "17.7.2" - -"@sigstore/bundle@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@sigstore/bundle/-/bundle-1.1.0.tgz#17f8d813b09348b16eeed66a8cf1c3d6bd3d04f1" - integrity sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog== - dependencies: - "@sigstore/protobuf-specs" "^0.2.0" - -"@sigstore/bundle@^2.3.0", "@sigstore/bundle@^2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@sigstore/bundle/-/bundle-2.3.1.tgz#f6cdc67c8400e58ca27f0ef495b27a9327512073" - integrity sha512-eqV17lO3EIFqCWK3969Rz+J8MYrRZKw9IBHpSo6DEcEX2c+uzDFOgHE9f2MnyDpfs48LFO4hXmk9KhQ74JzU1g== +"@puppeteer/browsers@2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@puppeteer/browsers/-/browsers-2.3.0.tgz#791ea7d80450fea24eb19fb1d70c367ad4e08cae" + integrity sha512-ioXoq9gPxkss4MYhD+SFaU9p1IHFUX0ILAWFPyjGaBdjLsYAlZw6j1iLA0N/m12uVHLFDfSYNF7EQccjinIMDA== + dependencies: + debug "^4.3.5" + extract-zip "^2.0.1" + progress "^2.0.3" + proxy-agent "^6.4.0" + semver "^7.6.3" + tar-fs "^3.0.6" + unbzip2-stream "^1.4.3" + yargs "^17.7.2" + +"@sigstore/bundle@^2.3.2": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@sigstore/bundle/-/bundle-2.3.2.tgz#ad4dbb95d665405fd4a7a02c8a073dbd01e4e95e" + integrity sha512-wueKWDk70QixNLB363yHc2D2ItTgYiMTdPwK8D9dKQMR3ZQ0c35IxP5xnwQ8cNLoCgCRcHf14kE+CLIvNX1zmA== dependencies: - "@sigstore/protobuf-specs" "^0.3.1" + "@sigstore/protobuf-specs" "^0.3.2" "@sigstore/core@^1.0.0", "@sigstore/core@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@sigstore/core/-/core-1.1.0.tgz#5583d8f7ffe599fa0a89f2bf289301a5af262380" integrity sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg== -"@sigstore/protobuf-specs@^0.2.0": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz#be9ef4f3c38052c43bd399d3f792c97ff9e2277b" - integrity sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A== - -"@sigstore/protobuf-specs@^0.3.0", "@sigstore/protobuf-specs@^0.3.1": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@sigstore/protobuf-specs/-/protobuf-specs-0.3.1.tgz#7095819fa7c5743efde48a858c37b30fab190a09" - integrity sha512-aIL8Z9NsMr3C64jyQzE0XlkEyBLpgEJJFDHLVVStkFV5Q3Il/r/YtY6NJWKQ4cy4AE7spP1IX5Jq7VCAxHHMfQ== - -"@sigstore/sign@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@sigstore/sign/-/sign-1.0.0.tgz#6b08ebc2f6c92aa5acb07a49784cb6738796f7b4" - integrity sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA== - dependencies: - "@sigstore/bundle" "^1.1.0" - "@sigstore/protobuf-specs" "^0.2.0" - make-fetch-happen "^11.0.1" +"@sigstore/protobuf-specs@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@sigstore/protobuf-specs/-/protobuf-specs-0.3.2.tgz#5becf88e494a920f548d0163e2978f81b44b7d6f" + integrity sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw== -"@sigstore/sign@^2.3.0": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@sigstore/sign/-/sign-2.3.0.tgz#c35e10a3d707e0c69a29bd9f93fa2bdc6275817c" - integrity sha512-tsAyV6FC3R3pHmKS880IXcDJuiFJiKITO1jxR1qbplcsBkZLBmjrEw5GbC7ikD6f5RU1hr7WnmxB/2kKc1qUWQ== +"@sigstore/sign@^2.3.2": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@sigstore/sign/-/sign-2.3.2.tgz#d3d01e56d03af96fd5c3a9b9897516b1233fc1c4" + integrity sha512-5Vz5dPVuunIIvC5vBb0APwo7qKA4G9yM48kPWJT+OEERs40md5GoUR1yedwpekWZ4m0Hhw44m6zU+ObsON+iDA== dependencies: - "@sigstore/bundle" "^2.3.0" + "@sigstore/bundle" "^2.3.2" "@sigstore/core" "^1.0.0" - "@sigstore/protobuf-specs" "^0.3.1" - make-fetch-happen "^13.0.0" - -"@sigstore/tuf@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@sigstore/tuf/-/tuf-1.0.3.tgz#2a65986772ede996485728f027b0514c0b70b160" - integrity sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg== - dependencies: - "@sigstore/protobuf-specs" "^0.2.0" - tuf-js "^1.1.7" + "@sigstore/protobuf-specs" "^0.3.2" + make-fetch-happen "^13.0.1" + proc-log "^4.2.0" + promise-retry "^2.0.1" -"@sigstore/tuf@^2.3.1": - version "2.3.2" - resolved "https://registry.yarnpkg.com/@sigstore/tuf/-/tuf-2.3.2.tgz#e9c5bffc2a5f3434f87195902d7f9cd7f48c70fa" - integrity sha512-mwbY1VrEGU4CO55t+Kl6I7WZzIl+ysSzEYdA1Nv/FTrl2bkeaPXo5PnWZAVfcY2zSdhOpsUTJW67/M2zHXGn5w== +"@sigstore/tuf@^2.3.4": + version "2.3.4" + resolved "https://registry.yarnpkg.com/@sigstore/tuf/-/tuf-2.3.4.tgz#da1d2a20144f3b87c0172920cbc8dcc7851ca27c" + integrity sha512-44vtsveTPUpqhm9NCrbU8CWLe3Vck2HO1PNLw7RIajbB7xhtn5RBPm1VNSCMwqGYHhDsBJG8gDF0q4lgydsJvw== dependencies: - "@sigstore/protobuf-specs" "^0.3.0" - tuf-js "^2.2.0" + "@sigstore/protobuf-specs" "^0.3.2" + tuf-js "^2.2.1" -"@sigstore/verify@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@sigstore/verify/-/verify-1.2.0.tgz#48549186305d8a5e471a3a304cf4cb3e0c99dde7" - integrity sha512-hQF60nc9yab+Csi4AyoAmilGNfpXT+EXdBgFkP9OgPwIBPwyqVf7JAWPtmqrrrneTmAT6ojv7OlH1f6Ix5BG4Q== +"@sigstore/verify@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@sigstore/verify/-/verify-1.2.1.tgz#c7e60241b432890dcb8bd8322427f6062ef819e1" + integrity sha512-8iKx79/F73DKbGfRf7+t4dqrc0bRr0thdPrxAtCKWRm/F0tG71i6O1rvlnScncJLLBZHn3h8M3c1BSUAb9yu8g== dependencies: - "@sigstore/bundle" "^2.3.1" + "@sigstore/bundle" "^2.3.2" "@sigstore/core" "^1.1.0" - "@sigstore/protobuf-specs" "^0.3.1" + "@sigstore/protobuf-specs" "^0.3.2" "@sinclair/typebox@^0.27.8": version "0.27.8" resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== -"@stencil/core@4.9.0": - version "4.9.0" - resolved "https://registry.yarnpkg.com/@stencil/core/-/core-4.9.0.tgz#f224813dde3a2b7f3cdccc5d39eaf777ad2d0ef2" - integrity sha512-aWSkhBmk3yPwRAkUwBbzRwmdhb8hKiQ/JMr9m5jthpBZLjtppYbzz6PN2MhSMDfRp6K93eQw5WogSEH4HHuB6w== +"@stencil/core@4.19.2": + version "4.19.2" + resolved "https://registry.yarnpkg.com/@stencil/core/-/core-4.19.2.tgz#02d377aa0133fa211f5e4c1ace4baa329ed1cde2" + integrity sha512-ZdnbHmHEl8E5vN0GWDtONe5w6j3CrSqqxZM4hNLBPkV/aouWKug7D5/Mi6RazfYO5U4fmHQYLwMz60rHcx0G4g== "@tootallnate/once@2": version "2.0.0" @@ -2721,9 +2806,9 @@ integrity sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA== "@tsconfig/node10@^1.0.7": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" - integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" + integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== "@tsconfig/node12@^1.0.7": version "1.0.11" @@ -2736,35 +2821,22 @@ integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== "@tsconfig/node16@^1.0.2": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" - integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== - -"@tufjs/canonical-json@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz#eade9fd1f537993bc1f0949f3aea276ecc4fab31" - integrity sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ== + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== "@tufjs/canonical-json@2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz#a52f61a3d7374833fca945b2549bc30a2dd40d0a" integrity sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA== -"@tufjs/models@1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@tufjs/models/-/models-1.0.4.tgz#5a689630f6b9dbda338d4b208019336562f176ef" - integrity sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A== - dependencies: - "@tufjs/canonical-json" "1.0.0" - minimatch "^9.0.0" - -"@tufjs/models@2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@tufjs/models/-/models-2.0.0.tgz#c7ab241cf11dd29deb213d6817dabb8c99ce0863" - integrity sha512-c8nj8BaOExmZKO2DXhDfegyhSGcG9E/mPN3U13L+/PsoWm1uaGiHHjxqSHQiasDBQwDA3aHuw9+9spYAP1qvvg== +"@tufjs/models@2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@tufjs/models/-/models-2.0.1.tgz#e429714e753b6c2469af3212e7f320a6973c2812" + integrity sha512-92F7/SFyufn4DXsha9+QfKnN03JGqtMFMXgSHbZOo8JG59WkTni7UzAouNQDf7AuP9OAMxVOPQcqG3sB7w+kkg== dependencies: "@tufjs/canonical-json" "2.0.0" - minimatch "^9.0.3" + minimatch "^9.0.4" "@turf/boolean-clockwise@^5.1.5": version "5.1.5" @@ -2811,6 +2883,13 @@ "@turf/invariant" "^5.1.5" "@turf/meta" "^5.1.5" +"@tybys/wasm-util@^0.9.0": + version "0.9.0" + resolved "https://registry.yarnpkg.com/@tybys/wasm-util/-/wasm-util-0.9.0.tgz#3e75eb00604c8d6db470bf18c37b7d984a0e3355" + integrity sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw== + dependencies: + tslib "^2.4.0" + "@types/backbone@^1.4.1": version "1.4.19" resolved "https://registry.yarnpkg.com/@types/backbone/-/backbone-1.4.19.tgz#f6e8406fed40ca3fe224f6e59115142b62be76d6" @@ -2834,9 +2913,9 @@ "@types/color-name" "*" "@types/color-name@*": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.3.tgz#c488ac2e519c9795faa0d54e8156d54e66adc4e6" - integrity sha512-87W6MJCKZYDhLAx/J1ikW8niMvmGRyY+rpUxWpL1cO7F8Uu5CHuQoFv+R0/L5pgNdW4jTyda42kv60uwVIPjLw== + version "1.1.4" + resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.4.tgz#e002611ff627347818d440a05e81650e9a4053b8" + integrity sha512-hulKeREDdLFesGQjl96+4aoJSHY5b2GRjagzzcqCfIrWhe5vkCqIvrLbqzBaI1q94Vg8DNJZZqTR5ocdWmWclg== "@types/color@3.0.6": version "3.0.6" @@ -2846,9 +2925,9 @@ "@types/color-convert" "*" "@types/crypto-js@^4.0.2": - version "4.1.3" - resolved "https://registry.yarnpkg.com/@types/crypto-js/-/crypto-js-4.1.3.tgz#7f2fa22857ae2b5d3221edcba9644f67f8ea984c" - integrity sha512-YP1sYYayLe7Eg5oXyLLvOLfxBfZ5Fgpz6sVWkpB18wDMywCLPWmqzRz+9gyuOoLF0fzDTTFwlyNbx7koONUwqA== + version "4.2.2" + resolved "https://registry.yarnpkg.com/@types/crypto-js/-/crypto-js-4.2.2.tgz#771c4a768d94eb5922cc202a3009558204df0cea" + integrity sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ== "@types/d3-array@^3.0.2": version "3.2.1" @@ -2872,20 +2951,15 @@ resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-2.1.4.tgz#43587aa57d565ab60a1d2201edeebc497d5c1252" integrity sha512-BTfLsxTeo7yFxI/haOOf1ZwJ6xKgQLT9dCp+EcmQv87Gox6X+oKl4mLKfO6fnWm3P22+A6DknMNEZany8ql2Rw== -"@types/geojson@^7946.0.7": - version "7946.0.8" - resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.8.tgz#30744afdb385e2945e22f3b033f897f76b1f12ca" - integrity sha512-1rkryxURpr6aWP7R786/UQOkJ3PcpQiWkAXBmdWc7ryFWqN6a4xfK7BtjXvFBKO9LjQ+MWQSWxYeZX1OApnArA== - -"@types/geojson@^7946.0.8": +"@types/geojson@^7946.0.7", "@types/geojson@^7946.0.8": version "7946.0.14" resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.14.tgz#319b63ad6df705ee2a65a73ef042c8271e696613" integrity sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg== "@types/google.maps@^3.48.6": - version "3.55.5" - resolved "https://registry.yarnpkg.com/@types/google.maps/-/google.maps-3.55.5.tgz#cee2391af1e32aae9f1c1a8d0c2dec265fb60645" - integrity sha512-U1QwCo1GeeLm0YI/GoHvfd1VfwgnoUSBcKCMXXFAM+2izSSuqqwZUJ9XNO6NxZxmYKjBNI+NF5eGF6uUSb1aSg== + version "3.55.12" + resolved "https://registry.yarnpkg.com/@types/google.maps/-/google.maps-3.55.12.tgz#66b50be48533d116dddb3d705d277d06457735b0" + integrity sha512-Q8MsLE+YYIrE1H8wdN69YHHAF8h7ApvF5MiMXh/zeCpP9Ut745mV9M0F4X4eobZ2WJe9k8tW2ryYjLa87IO2Sg== "@types/hammerjs@^2.0.41": version "2.0.45" @@ -2893,14 +2967,14 @@ integrity sha512-qkcUlZmX6c4J8q45taBKTL3p+LbITgyx7qhlPYOdOHZB7B31K0mXbP5YA7i7SgDeEGuI9MnumiKPEMrxg8j3KQ== "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" - integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" + integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== "@types/jquery@*": - version "3.5.29" - resolved "https://registry.yarnpkg.com/@types/jquery/-/jquery-3.5.29.tgz#3c06a1f519cd5fc3a7a108971436c00685b5dcea" - integrity sha512-oXQQC9X9MOPRrMhPHHOsXqeQDnWeCDT3PelUIg/Oy8FAbzSZtFHRjc7IpbfFVmpLtJ+UOoywpRsuO5Jxjybyeg== + version "3.5.30" + resolved "https://registry.yarnpkg.com/@types/jquery/-/jquery-3.5.30.tgz#888d584cbf844d3df56834b69925085038fd80f7" + integrity sha512-nbWKkkyb919DOUxjmRVk8vwtDb0/k8FKncmUKFi+NY+QXqWltooxTrswvz4LspQwxvLdvzBN1TImr6cw3aQx2A== dependencies: "@types/sizzle" "*" @@ -2912,19 +2986,19 @@ "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== "@types/lodash@^4.14.134": - version "4.17.0" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.0.tgz#d774355e41f372d5350a4d0714abb48194a489c3" - integrity sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA== + version "4.17.7" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.7.tgz#2f776bcb53adc9e13b2c0dfd493dfcbd7de43612" + integrity sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA== "@types/mdast@^3.0.0": - version "3.0.10" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.10.tgz#4724244a82a4598884cbbe9bcfd73dff927ee8af" - integrity sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA== + version "3.0.15" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.15.tgz#49c524a263f30ffa28b71ae282f813ed000ab9f5" + integrity sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ== dependencies: - "@types/unist" "*" + "@types/unist" "^2" "@types/minimatch@^3.0.3": version "3.0.5" @@ -2937,9 +3011,11 @@ integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag== "@types/node@*": - version "13.1.6" - resolved "https://registry.yarnpkg.com/@types/node/-/node-13.1.6.tgz#076028d0b0400be8105b89a0a55550c86684ffec" - integrity sha512-Jg1F+bmxcpENHP23sVKkNuU3uaxPnsBMW0cLjleiikFKomJQbsn0Cqk2yDvQArqzZN6ABfBkZ0To7pQ8sLdWDg== + version "22.5.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.5.0.tgz#10f01fe9465166b4cab72e75f60d8b99d019f958" + integrity sha512-DkFrJOe+rfdHTqqMg0bSNlGlQ85hSoh2TPzZyhHsXnMtligRWpxUySiyw8FY14ITt24HVCiQPWxS3KO/QlGmWg== + dependencies: + undici-types "~6.19.2" "@types/normalize-package-data@^2.4.0": version "2.4.4" @@ -2957,53 +3033,52 @@ integrity sha512-YBtzT2ztNF6R/9+UXj2wTGFnC9NklAnASt3sC0h2m1bbH7G6FyBIkt4AN8ThZpNfxUo1b2iMVO0UawiJymEt8A== "@types/pngjs@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@types/pngjs/-/pngjs-6.0.1.tgz#c711ec3fbbf077fed274ecccaf85dd4673130072" - integrity sha512-J39njbdW1U/6YyVXvC9+1iflZghP8jgRf2ndYghdJb5xL49LYDB+1EuAxfbuJ2IBbWIL3AjHPQhgaTxT3YaYeg== + version "6.0.5" + resolved "https://registry.yarnpkg.com/@types/pngjs/-/pngjs-6.0.5.tgz#6dec2f7eb8284543ca4e423f3c09b119fa939ea3" + integrity sha512-0k5eKfrA83JOZPppLtS2C7OUtyNAl2wKNxfyYl9Q5g9lPkgBl/9hNyAu6HuEH2J4XmIv2znEpkDd0SaZVxW6iQ== dependencies: "@types/node" "*" "@types/proj4@^2.5.0": - version "2.5.2" - resolved "https://registry.yarnpkg.com/@types/proj4/-/proj4-2.5.2.tgz#e3afa4e09e5cf08d8bc74e1b3de3b2111324ee33" - integrity sha512-/Nmfn9p08yaYw6xo5f2b0L+2oHk2kZeOkp5v+4VCeNfq+ETlLQbmHmC97/pjDIEZy8jxwz7pdPpwNzDHM5cuJw== + version "2.5.5" + resolved "https://registry.yarnpkg.com/@types/proj4/-/proj4-2.5.5.tgz#044d53782dc75f20335577ca3af2643962a56980" + integrity sha512-y4tHUVVoMEOm2nxRLQ2/ET8upj/pBmoutGxFw2LZJTQWPgWXI+cbxVEUFFmIzr/bpFR83hGDOTSXX6HBeObvZA== "@types/prop-types@*": - version "15.7.11" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.11.tgz#2596fb352ee96a1379c657734d4b913a613ad563" - integrity sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng== + version "15.7.12" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" + integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== "@types/react-dom@^18.2.0": - version "18.2.22" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.22.tgz#d332febf0815403de6da8a97e5fe282cbe609bae" - integrity sha512-fHkBXPeNtfvri6gdsMYyW+dW7RXFo6Ad09nLFK0VQWR7yGLai/Cyvyj696gbwYvBnhGtevUG9cET0pmUbMtoPQ== + version "18.3.0" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.0.tgz#0cbc818755d87066ab6ca74fbedb2547d74a82b0" + integrity sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg== dependencies: "@types/react" "*" "@types/react@*", "@types/react@^18.2.0": - version "18.2.67" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.67.tgz#96b7af0b5e79c756f4bdd981de2ca28472c858e5" - integrity sha512-vkIE2vTIMHQ/xL0rgmuoECBCkZFZeHr49HeWSc24AptMbNRo7pwSBvj73rlJJs9fGKj0koS+V7kQB1jHS0uCgw== + version "18.3.4" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.4.tgz#dfdd534a1d081307144c00e325c06e00312c93a3" + integrity sha512-J7W30FTdfCxDDjmfRM+/JqLHBIyl7xUIp9kwK637FGmY7+mkSFSe6L4jpZzhj5QMfLssSDP4/i75AKkrdC7/Jw== dependencies: "@types/prop-types" "*" - "@types/scheduler" "*" csstype "^3.0.2" -"@types/scheduler@*": - version "0.16.8" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.8.tgz#ce5ace04cfeabe7ef87c0091e50752e36707deff" - integrity sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A== - "@types/semver@^7.5.0": - version "7.5.6" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.6.tgz#c65b2bfce1bec346582c07724e3f8c1017a20339" - integrity sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A== + version "7.5.8" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" + integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== "@types/sizzle@*": version "2.3.8" resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.8.tgz#518609aefb797da19bf222feb199e8f653ff7627" integrity sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg== +"@types/sortablejs@1.15.7": + version "1.15.7" + resolved "https://registry.yarnpkg.com/@types/sortablejs/-/sortablejs-1.15.7.tgz#11f85e98fce2854708e5c6d6011f7a236d79ae9f" + integrity sha512-PvgWCx1Lbgm88FdQ6S7OGvLIjWS66mudKPlfdrWil0TjsO5zmoZmzoKiiwRShs1dwPgrlkr0N4ewuy0/+QUXYQ== + "@types/trusted-types@^2.0.2": version "2.0.7" resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.7.tgz#baccb07a970b91707df3a3e8ba6896c57ead2d11" @@ -3014,28 +3089,28 @@ resolved "https://registry.yarnpkg.com/@types/underscore/-/underscore-1.11.15.tgz#29c776daecf6f1935da9adda17509686bf979947" integrity sha512-HP38xE+GuWGlbSRq9WrZkousaQ7dragtZCruBVMi0oX1migFZavZ3OROKHSkNp/9ouq82zrWtZpg18jFnVN96g== -"@types/unist@*", "@types/unist@^2.0.2": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" - integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== +"@types/unist@^2", "@types/unist@^2.0.2": + version "2.0.11" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.11.tgz#11af57b127e32487774841f7a4e54eab166d03c4" + integrity sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA== "@types/yauzl@^2.9.1": - version "2.9.1" - resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.9.1.tgz#d10f69f9f522eef3cf98e30afb684a1e1ec923af" - integrity sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA== + version "2.10.3" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.3.tgz#e9b2808b4f109504a03cda958259876f61017999" + integrity sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q== dependencies: "@types/node" "*" "@typescript-eslint/eslint-plugin@^6.14.0": - version "6.15.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.15.0.tgz#b0b3e15fa8c3e67ed4386b765cc0ba98ad3a303b" - integrity sha512-j5qoikQqPccq9QoBAupOP+CBu8BaJ8BLjaXSioDISeTZkVO3ig7oSIKh3H+rEpee7xCXtWwSB4KIL5l6hWZzpg== + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz#30830c1ca81fd5f3c2714e524c4303e0194f9cd3" + integrity sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA== dependencies: "@eslint-community/regexpp" "^4.5.1" - "@typescript-eslint/scope-manager" "6.15.0" - "@typescript-eslint/type-utils" "6.15.0" - "@typescript-eslint/utils" "6.15.0" - "@typescript-eslint/visitor-keys" "6.15.0" + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/type-utils" "6.21.0" + "@typescript-eslint/utils" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" debug "^4.3.4" graphemer "^1.4.0" ignore "^5.2.4" @@ -3044,71 +3119,72 @@ ts-api-utils "^1.0.1" "@typescript-eslint/parser@^6.14.0": - version "6.15.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.15.0.tgz#1af69741cfa314a13c1434d0bdd5a0c3096699d7" - integrity sha512-MkgKNnsjC6QwcMdlNAel24jjkEO/0hQaMDLqP4S9zq5HBAUJNQB6y+3DwLjX7b3l2b37eNAxMPLwb3/kh8VKdA== - dependencies: - "@typescript-eslint/scope-manager" "6.15.0" - "@typescript-eslint/types" "6.15.0" - "@typescript-eslint/typescript-estree" "6.15.0" - "@typescript-eslint/visitor-keys" "6.15.0" + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.21.0.tgz#af8fcf66feee2edc86bc5d1cf45e33b0630bf35b" + integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ== + dependencies: + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/typescript-estree" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@6.15.0": - version "6.15.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.15.0.tgz#40e5214a3e9e048aca55ce33381bc61b6b51c32a" - integrity sha512-+BdvxYBltqrmgCNu4Li+fGDIkW9n//NrruzG9X1vBzaNK+ExVXPoGB71kneaVw/Jp+4rH/vaMAGC6JfMbHstVg== +"@typescript-eslint/scope-manager@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz#ea8a9bfc8f1504a6ac5d59a6df308d3a0630a2b1" + integrity sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg== dependencies: - "@typescript-eslint/types" "6.15.0" - "@typescript-eslint/visitor-keys" "6.15.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" -"@typescript-eslint/type-utils@6.15.0": - version "6.15.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.15.0.tgz#c22261bd00566821a300d08f4632533a8f9bed01" - integrity sha512-CnmHKTfX6450Bo49hPg2OkIm/D/TVYV7jO1MCfPYGwf6x3GO0VU8YMO5AYMn+u3X05lRRxA4fWCz87GFQV6yVQ== +"@typescript-eslint/type-utils@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz#6473281cfed4dacabe8004e8521cee0bd9d4c01e" + integrity sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag== dependencies: - "@typescript-eslint/typescript-estree" "6.15.0" - "@typescript-eslint/utils" "6.15.0" + "@typescript-eslint/typescript-estree" "6.21.0" + "@typescript-eslint/utils" "6.21.0" debug "^4.3.4" ts-api-utils "^1.0.1" -"@typescript-eslint/types@6.15.0": - version "6.15.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.15.0.tgz#a9f7b006aee52b0948be6e03f521814bf435ddd5" - integrity sha512-yXjbt//E4T/ee8Ia1b5mGlbNj9fB9lJP4jqLbZualwpP2BCQ5is6BcWwxpIsY4XKAhmdv3hrW92GdtJbatC6dQ== +"@typescript-eslint/types@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.21.0.tgz#205724c5123a8fef7ecd195075fa6e85bac3436d" + integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg== -"@typescript-eslint/typescript-estree@6.15.0": - version "6.15.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.15.0.tgz#2f8a513df1ce5e6e1ba8e5c6aa52f392ae023fc5" - integrity sha512-7mVZJN7Hd15OmGuWrp2T9UvqR2Ecg+1j/Bp1jXUEY2GZKV6FXlOIoqVDmLpBiEiq3katvj/2n2mR0SDwtloCew== +"@typescript-eslint/typescript-estree@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz#c47ae7901db3b8bddc3ecd73daff2d0895688c46" + integrity sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ== dependencies: - "@typescript-eslint/types" "6.15.0" - "@typescript-eslint/visitor-keys" "6.15.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" + minimatch "9.0.3" semver "^7.5.4" ts-api-utils "^1.0.1" -"@typescript-eslint/utils@6.15.0": - version "6.15.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.15.0.tgz#f80dbb79f3b0f569077a8711dd44186a8933fa4c" - integrity sha512-eF82p0Wrrlt8fQSRL0bGXzK5nWPRV2dYQZdajcfzOD9+cQz9O7ugifrJxclB+xVOvWvagXfqS4Es7vpLP4augw== +"@typescript-eslint/utils@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.21.0.tgz#4714e7a6b39e773c1c8e97ec587f520840cd8134" + integrity sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ== dependencies: "@eslint-community/eslint-utils" "^4.4.0" "@types/json-schema" "^7.0.12" "@types/semver" "^7.5.0" - "@typescript-eslint/scope-manager" "6.15.0" - "@typescript-eslint/types" "6.15.0" - "@typescript-eslint/typescript-estree" "6.15.0" + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/typescript-estree" "6.21.0" semver "^7.5.4" -"@typescript-eslint/visitor-keys@6.15.0": - version "6.15.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.15.0.tgz#5baf97a7bfeec6f4894d400437055155a46b2330" - integrity sha512-1zvtdC1a9h5Tb5jU9x3ADNXO9yjP8rXlaoChu0DQX40vf5ACVpYIVIZhIMZ6d5sDXH7vq4dsZBT1fEGj8D2n2w== +"@typescript-eslint/visitor-keys@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz#87a99d077aa507e20e238b11d56cc26ade45fe47" + integrity sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A== dependencies: - "@typescript-eslint/types" "6.15.0" + "@typescript-eslint/types" "6.21.0" eslint-visitor-keys "^3.4.1" "@ungap/structured-clone@^1.2.0": @@ -3116,35 +3192,35 @@ resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== -"@vaadin/a11y-base@~24.3.9": - version "24.3.9" - resolved "https://registry.yarnpkg.com/@vaadin/a11y-base/-/a11y-base-24.3.9.tgz#f9a442d62e69a52b438aaea50e213aeda354b39e" - integrity sha512-4oD42LX8WuhGmJoFENb6viaHGelcXhZxzxcq5HjRi/w5MvIk6PgFcRYlzrW7i+vzh5YeHeSl1RxAMQX88xIe6Q== +"@vaadin/a11y-base@~24.3.20": + version "24.3.20" + resolved "https://registry.yarnpkg.com/@vaadin/a11y-base/-/a11y-base-24.3.20.tgz#0550bdf95f5af2eebede76acb8383e279880ddcf" + integrity sha512-ugdNR391PTmdTdrJ3QPUFQowKSjGWXsTGa6KvD0VXV8jKyQbE1C/H98x9yatcZQa8ShxpEforax/dRBkbnLhdQ== dependencies: "@open-wc/dedupe-mixin" "^1.3.0" "@polymer/polymer" "^3.0.0" - "@vaadin/component-base" "~24.3.9" + "@vaadin/component-base" "~24.3.20" lit "^3.0.0" -"@vaadin/checkbox@~24.3.9": - version "24.3.9" - resolved "https://registry.yarnpkg.com/@vaadin/checkbox/-/checkbox-24.3.9.tgz#95f92e9962ed078937652cace140c4a259fe4c52" - integrity sha512-bdw9UU1OZjkhF5XwYMVxIsP1ILv1y3+jyyiJgWsBCUuLY4LCtNvd+xRuecePv+UWzhjfW2Ci3ieTGRW1AANyIw== +"@vaadin/checkbox@~24.3.20": + version "24.3.20" + resolved "https://registry.yarnpkg.com/@vaadin/checkbox/-/checkbox-24.3.20.tgz#f38b2d3d4d464b587f52ed37c24a89692c0445bb" + integrity sha512-hdStCSsp800RZGmOfzLDfdnnKYqpFOWh1p5S9B5tMINDeAAWCrws0H1Rj3M/gYQyuRtl0RV0xn7Q1fOntNOaxg== dependencies: "@open-wc/dedupe-mixin" "^1.3.0" "@polymer/polymer" "^3.0.0" - "@vaadin/a11y-base" "~24.3.9" - "@vaadin/component-base" "~24.3.9" - "@vaadin/field-base" "~24.3.9" - "@vaadin/vaadin-lumo-styles" "~24.3.9" - "@vaadin/vaadin-material-styles" "~24.3.9" - "@vaadin/vaadin-themable-mixin" "~24.3.9" + "@vaadin/a11y-base" "~24.3.20" + "@vaadin/component-base" "~24.3.20" + "@vaadin/field-base" "~24.3.20" + "@vaadin/vaadin-lumo-styles" "~24.3.20" + "@vaadin/vaadin-material-styles" "~24.3.20" + "@vaadin/vaadin-themable-mixin" "~24.3.20" lit "^3.0.0" -"@vaadin/component-base@~24.3.9": - version "24.3.9" - resolved "https://registry.yarnpkg.com/@vaadin/component-base/-/component-base-24.3.9.tgz#9acb02fc62c8bb0a1355df1a5e12a42529971f0e" - integrity sha512-SZ4tV9CeI6EZjpxEmoezwzdTd8td0BrQ7fU3H0JKZNSrfPEm85MdtFd4+ob0MSZRIV0oiukQhXxpU3WtCvU4OQ== +"@vaadin/component-base@~24.3.20": + version "24.3.20" + resolved "https://registry.yarnpkg.com/@vaadin/component-base/-/component-base-24.3.20.tgz#e7721a550c12fe4ffebfbc96e03eddd34e63302f" + integrity sha512-FwtKDdLpaSGdO85/1n44BPYzqsAcOUq32CxRYfKIoFb3mKJaygW8HTd+IKvU3cgjskaPoigiCg64tm6oPup5Zw== dependencies: "@open-wc/dedupe-mixin" "^1.3.0" "@polymer/polymer" "^3.0.0" @@ -3152,108 +3228,108 @@ "@vaadin/vaadin-usage-statistics" "^2.1.0" lit "^3.0.0" -"@vaadin/field-base@~24.3.9": - version "24.3.9" - resolved "https://registry.yarnpkg.com/@vaadin/field-base/-/field-base-24.3.9.tgz#6879e960d124cec8ea4e4f9a64db06e0b1f74efa" - integrity sha512-2au/ad6s5PgQdCE8osWHsdUTsjykUBBcP2+wO0bi4rgV3KWgU3HVmftfDZC96cGXGlwB5DmnOBgumiWwwl9Mqw== +"@vaadin/field-base@~24.3.20": + version "24.3.20" + resolved "https://registry.yarnpkg.com/@vaadin/field-base/-/field-base-24.3.20.tgz#a38d17ccb5c989f7e8d99818f4e8d4ba4659bd3f" + integrity sha512-miaYzV48gTT9bxQJDTxkCPqq9uss1ctyRKJHCd97w4f4y901hdgw+nIcJ7W1nxbuAUnn3wttdgDLkmEbgeTlLg== dependencies: "@open-wc/dedupe-mixin" "^1.3.0" "@polymer/polymer" "^3.0.0" - "@vaadin/a11y-base" "~24.3.9" - "@vaadin/component-base" "~24.3.9" + "@vaadin/a11y-base" "~24.3.20" + "@vaadin/component-base" "~24.3.20" lit "^3.0.0" -"@vaadin/grid@~24.3.6": - version "24.3.9" - resolved "https://registry.yarnpkg.com/@vaadin/grid/-/grid-24.3.9.tgz#f1b4f97bf1cde78bcf271d2d638e24a1cb0df932" - integrity sha512-0gOUE4NfxcifadOxTBkAh5S5tSYNIT4Jmm9K19FHAnN935z3xJMlASzllywn0eKkISvk6ms2GXJ62gTgjjZHMA== +"@vaadin/grid@~24.3.13": + version "24.3.20" + resolved "https://registry.yarnpkg.com/@vaadin/grid/-/grid-24.3.20.tgz#c6c7b475cbdd86bfbe2644e3210cee8ab8435099" + integrity sha512-rATcxxujOnofQ9MyzutMEvEPPgPF/sOA3hytMEfQRfNnGQKvXlTtS6bnpw5dceIhlQaGI0qKYabD+04G+5G9jg== dependencies: "@open-wc/dedupe-mixin" "^1.3.0" "@polymer/polymer" "^3.0.0" - "@vaadin/a11y-base" "~24.3.9" - "@vaadin/checkbox" "~24.3.9" - "@vaadin/component-base" "~24.3.9" - "@vaadin/lit-renderer" "~24.3.9" - "@vaadin/text-field" "~24.3.9" - "@vaadin/vaadin-lumo-styles" "~24.3.9" - "@vaadin/vaadin-material-styles" "~24.3.9" - "@vaadin/vaadin-themable-mixin" "~24.3.9" - -"@vaadin/icon@~24.3.9": - version "24.3.9" - resolved "https://registry.yarnpkg.com/@vaadin/icon/-/icon-24.3.9.tgz#5094e5bbb21aedc1be5029a4446447fc161243fe" - integrity sha512-gisYrtL2auElq2EnDcFLaIeUBiHzrwSzbrUvoupSWbotDnKIYRZVMGyPLRkWCQBqdncH+R0Doj9AuM6No7Pdag== + "@vaadin/a11y-base" "~24.3.20" + "@vaadin/checkbox" "~24.3.20" + "@vaadin/component-base" "~24.3.20" + "@vaadin/lit-renderer" "~24.3.20" + "@vaadin/text-field" "~24.3.20" + "@vaadin/vaadin-lumo-styles" "~24.3.20" + "@vaadin/vaadin-material-styles" "~24.3.20" + "@vaadin/vaadin-themable-mixin" "~24.3.20" + +"@vaadin/icon@~24.3.20": + version "24.3.20" + resolved "https://registry.yarnpkg.com/@vaadin/icon/-/icon-24.3.20.tgz#014094cdf59c6ca6ecf33e7f27b42e3649b5d350" + integrity sha512-e01XVBq95YTZO3G6IuVWGe2nh1Nqw3yDm/SQpO0S846KYHt3lI4utFioY8rIVtk9ZJJ6aQ9DSNSckuNAYB93ZQ== dependencies: "@open-wc/dedupe-mixin" "^1.3.0" "@polymer/polymer" "^3.0.0" - "@vaadin/component-base" "~24.3.9" - "@vaadin/vaadin-lumo-styles" "~24.3.9" - "@vaadin/vaadin-themable-mixin" "~24.3.9" + "@vaadin/component-base" "~24.3.20" + "@vaadin/vaadin-lumo-styles" "~24.3.20" + "@vaadin/vaadin-themable-mixin" "~24.3.20" lit "^3.0.0" -"@vaadin/input-container@~24.3.9": - version "24.3.9" - resolved "https://registry.yarnpkg.com/@vaadin/input-container/-/input-container-24.3.9.tgz#cfb0086c108eefe202e6cdb03fbb6ed6fba95990" - integrity sha512-d6dcN+TIhE4wq8a1/ONv6zSNV6L0pfaCbbc9XMkOtWsY4IrPsrbLKTfaAD0CG/V7I4xQIR64I/5fKUGPqn+jsg== +"@vaadin/input-container@~24.3.20": + version "24.3.20" + resolved "https://registry.yarnpkg.com/@vaadin/input-container/-/input-container-24.3.20.tgz#6a910b3c25ebc903b0d82dd66d95575a4d16d44a" + integrity sha512-BsNOKMhzkhWkfAgVMADQzGh7B7siqXXpeKwMQ6K0tluG217jNC3rNPmIsbCY4EqIiJhKRuDaWnbTurSlGRdx6w== dependencies: "@polymer/polymer" "^3.0.0" - "@vaadin/component-base" "~24.3.9" - "@vaadin/vaadin-lumo-styles" "~24.3.9" - "@vaadin/vaadin-material-styles" "~24.3.9" - "@vaadin/vaadin-themable-mixin" "~24.3.9" + "@vaadin/component-base" "~24.3.20" + "@vaadin/vaadin-lumo-styles" "~24.3.20" + "@vaadin/vaadin-material-styles" "~24.3.20" + "@vaadin/vaadin-themable-mixin" "~24.3.20" lit "^3.0.0" -"@vaadin/lit-renderer@~24.3.9": - version "24.3.9" - resolved "https://registry.yarnpkg.com/@vaadin/lit-renderer/-/lit-renderer-24.3.9.tgz#10abc831f205ee5a7c165820954a453bf604c972" - integrity sha512-KaOwU8Up4UGUE51H3wgsGyDGplkvL1pP7cyduO7b+wVu8enqboarkKIAHb5jSS5/ImZzfs9lZZLh5zQVlejgpw== +"@vaadin/lit-renderer@~24.3.20": + version "24.3.20" + resolved "https://registry.yarnpkg.com/@vaadin/lit-renderer/-/lit-renderer-24.3.20.tgz#9eba6602590478d5fa1a801cce951a6532f32fad" + integrity sha512-7iOKHWjltiWUjnA9/b+HcPub2LSr/N6Hq+Sz83EBbNcXgLPpYYXQFy99/w4wAWN+iyKWd2gKsd9DigTx6ND+Uw== dependencies: lit "^3.0.0" -"@vaadin/text-field@~24.3.9": - version "24.3.9" - resolved "https://registry.yarnpkg.com/@vaadin/text-field/-/text-field-24.3.9.tgz#058e17949d82d1403e079ebafce2bb809af4e18c" - integrity sha512-q3lvEfhBTD/iaqDysH0nNyfkbyoTWIuk3/wRaWxwahzQ8zH9VajHUm6gifLVM6DBDgQJHTu3kSA15l2ka3b/pw== +"@vaadin/text-field@~24.3.20": + version "24.3.20" + resolved "https://registry.yarnpkg.com/@vaadin/text-field/-/text-field-24.3.20.tgz#3fe7a5eb8905f80521263704cb3f84bb8869992e" + integrity sha512-RsDYqYG3frHc5EIjTAGXmP3MXOu5TFQOjEcJzZjSba/mm9eCfhyJyhHUh77SVJLbqEJIdsQfJspO3VwhuT3Ffw== dependencies: "@open-wc/dedupe-mixin" "^1.3.0" "@polymer/polymer" "^3.0.0" - "@vaadin/a11y-base" "~24.3.9" - "@vaadin/component-base" "~24.3.9" - "@vaadin/field-base" "~24.3.9" - "@vaadin/input-container" "~24.3.9" - "@vaadin/vaadin-lumo-styles" "~24.3.9" - "@vaadin/vaadin-material-styles" "~24.3.9" - "@vaadin/vaadin-themable-mixin" "~24.3.9" + "@vaadin/a11y-base" "~24.3.20" + "@vaadin/component-base" "~24.3.20" + "@vaadin/field-base" "~24.3.20" + "@vaadin/input-container" "~24.3.20" + "@vaadin/vaadin-lumo-styles" "~24.3.20" + "@vaadin/vaadin-material-styles" "~24.3.20" + "@vaadin/vaadin-themable-mixin" "~24.3.20" lit "^3.0.0" "@vaadin/vaadin-development-mode-detector@^2.0.0": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@vaadin/vaadin-development-mode-detector/-/vaadin-development-mode-detector-2.0.6.tgz#2acb568975c18b7965e56ed765638dcf183d8dd1" - integrity sha512-N6a5nLT/ytEUlpPo+nvdCKIGoyNjPsj3rzPGvGYK8x9Ceg76OTe1xI/GtN71mRW9e2HUScR0kCNOkl1Z63YDjw== + version "2.0.7" + resolved "https://registry.yarnpkg.com/@vaadin/vaadin-development-mode-detector/-/vaadin-development-mode-detector-2.0.7.tgz#fea2f6c8cd8e16a312a28d5d1acfb5206892a752" + integrity sha512-9FhVhr0ynSR3X2ao+vaIEttcNU5XfzCbxtmYOV8uIRnUCtNgbvMOIcyGBvntsX9I5kvIP2dV3cFAOG9SILJzEA== -"@vaadin/vaadin-lumo-styles@~24.3.9": - version "24.3.9" - resolved "https://registry.yarnpkg.com/@vaadin/vaadin-lumo-styles/-/vaadin-lumo-styles-24.3.9.tgz#909e5bcd699ee757e1fdb8977104c998a4c9ef71" - integrity sha512-ZLgLpM97JH5eyAvVdbIaLNm+AHnyVhVlTfPEieYPNcJAv1bBCRDf3DFVuX2+A61u2imik+JfMtlqgEzJd7U9zg== +"@vaadin/vaadin-lumo-styles@~24.3.20": + version "24.3.20" + resolved "https://registry.yarnpkg.com/@vaadin/vaadin-lumo-styles/-/vaadin-lumo-styles-24.3.20.tgz#2ededf1b32cfc2d067e7214c318af1d5bd181ab6" + integrity sha512-3vFWn4ZJgf3oUxtX9VdS7A8hXZYpqBY9786SA6yx9LR1aXJsEI4VbXmXvNieVkAiStNNnjP+G0bVXIbvqmar3w== dependencies: "@polymer/polymer" "^3.0.0" - "@vaadin/component-base" "~24.3.9" - "@vaadin/icon" "~24.3.9" - "@vaadin/vaadin-themable-mixin" "~24.3.9" + "@vaadin/component-base" "~24.3.20" + "@vaadin/icon" "~24.3.20" + "@vaadin/vaadin-themable-mixin" "~24.3.20" -"@vaadin/vaadin-material-styles@~24.3.9": - version "24.3.9" - resolved "https://registry.yarnpkg.com/@vaadin/vaadin-material-styles/-/vaadin-material-styles-24.3.9.tgz#704bf4becb72833fda9496c901a6ddb61c49cfba" - integrity sha512-pXLWn6IEX1sBnlXmUzhBs77D+fyu0VlbvFonjV9ImbcA3DzFqpf8vtT82pL0SGBeJRfdimGQmjDS+R0FMjPlyw== +"@vaadin/vaadin-material-styles@~24.3.20": + version "24.3.20" + resolved "https://registry.yarnpkg.com/@vaadin/vaadin-material-styles/-/vaadin-material-styles-24.3.20.tgz#e94d209563ca88301c4520bba75e6a1c9eb12c3d" + integrity sha512-Ug+e3QqW5rqHToKzoBMQQF4K+wA0I9pJje2WsCwHCSeRo6tvfRM0f3HiCuKP2GqfhAYMSGUUpmZgQwxVQeCCKg== dependencies: "@polymer/polymer" "^3.0.0" - "@vaadin/component-base" "~24.3.9" - "@vaadin/vaadin-themable-mixin" "~24.3.9" + "@vaadin/component-base" "~24.3.20" + "@vaadin/vaadin-themable-mixin" "~24.3.20" -"@vaadin/vaadin-themable-mixin@~24.3.9": - version "24.3.9" - resolved "https://registry.yarnpkg.com/@vaadin/vaadin-themable-mixin/-/vaadin-themable-mixin-24.3.9.tgz#811e259f9f5a25a017822f458fa6791618e6a0fc" - integrity sha512-PB/zz+E8Y6ly7FASMTyOI7ibKwWg4O+ud+OjD1OK9KqKasPLdj33rU11y/T6DrRD7k46Wk5FFy26olbUfg3/QQ== +"@vaadin/vaadin-themable-mixin@~24.3.20": + version "24.3.20" + resolved "https://registry.yarnpkg.com/@vaadin/vaadin-themable-mixin/-/vaadin-themable-mixin-24.3.20.tgz#404450e63914c720767afbfa593c7035feb185db" + integrity sha512-V3XgXbErMZ9pGXoBvVswJd4mDUBAecOgkORHJVwroafmyirARYgEUSEkjItpsRAYDX3uSP2sOh0tYcAht/AFRA== dependencies: "@open-wc/dedupe-mixin" "^1.3.0" lit "^3.0.0" @@ -3271,9 +3347,9 @@ integrity sha512-vRq+GniJAYSBmTRnhCYPAPq6THYqovJ/gzGThWbgEZUQaBccndGTi1hdiUP15HzEco0I6t4RCtXyX0rsSmwgPw== "@webgpu/types@^0.1.34": - version "0.1.40" - resolved "https://registry.yarnpkg.com/@webgpu/types/-/types-0.1.40.tgz#cf72d1df6f9f8adc5d39556041f20ff2e8a58885" - integrity sha512-/BBkHLS6/eQjyWhY2H7Dx5DHcVrS2ICj9owvSRdgtQT6KcafLZA86tPze0xAOsd4FbsYKCUBUQyNi87q7gV7kw== + version "0.1.44" + resolved "https://registry.yarnpkg.com/@webgpu/types/-/types-0.1.44.tgz#1b264c0bfcb298df59d0943dad8ef02b4ff98d14" + integrity sha512-JDpYJN5E/asw84LTYhKyvPpxGnD+bAKPtpW9Ilurf7cZpxaTbxkQcGwOd7jgB9BPBrTYQ+32ufo4HiuomTjHNQ== "@yarnpkg/lockfile@^1.1.0": version "1.1.0" @@ -3288,15 +3364,15 @@ js-yaml "^3.10.0" tslib "^2.4.0" -"@zip.js/zip.js@~2.7.34": - version "2.7.40" - resolved "https://registry.yarnpkg.com/@zip.js/zip.js/-/zip.js-2.7.40.tgz#e53626cfe051119df97bf1672188b9f36dfe75b8" - integrity sha512-kSYwO0Wth6G66QM4CejZqG0nRhBsVVTaR18M/Ta8EcqcvaV0dYrnDDyKAstfy0V5+ejK4b9w5xc1W0ECATJTvA== +"@zip.js/zip.js@~2.7.44": + version "2.7.51" + resolved "https://registry.yarnpkg.com/@zip.js/zip.js/-/zip.js-2.7.51.tgz#a434e285048b951a5788d3d2d59aa68f209e7141" + integrity sha512-RKHaebzZZgQkUuzb49/qweN69e8Np9AUZ9QygydDIrbG1njypSAKwkeqIVeuf2JVGBDyB7Z9HKvzPgYrSlv9gw== -"@zkochan/js-yaml@0.0.6": - version "0.0.6" - resolved "https://registry.yarnpkg.com/@zkochan/js-yaml/-/js-yaml-0.0.6.tgz#975f0b306e705e28b8068a07737fa46d3fc04826" - integrity sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg== +"@zkochan/js-yaml@0.0.7": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@zkochan/js-yaml/-/js-yaml-0.0.7.tgz#4b0cb785220d7c28ce0ec4d0804deb5d821eae89" + integrity sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ== dependencies: argparse "^2.0.1" @@ -3332,53 +3408,36 @@ acorn-jsx@^5.3.2: integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn-walk@^8.0.2, acorn-walk@^8.1.1: - version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== - -acorn@^8.1.0, acorn@^8.4.1, acorn@^8.8.1: - version "8.8.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" - integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== + version "8.3.3" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.3.tgz#9caeac29eefaa0c41e3d4c65137de4d6f34df43e" + integrity sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw== + dependencies: + acorn "^8.11.0" -acorn@^8.9.0: - version "8.11.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.2.tgz#ca0d78b51895be5390a5903c5b3bdcdaf78ae40b" - integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== +acorn@^8.1.0, acorn@^8.11.0, acorn@^8.4.1, acorn@^8.8.1, acorn@^8.9.0: + version "8.12.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" + integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== add-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa" integrity sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ== -agent-base@6, agent-base@^6.0.2: +agent-base@6: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== dependencies: debug "4" -agent-base@^7.0.2, agent-base@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.0.tgz#536802b76bc0b34aa50195eb2442276d613e3434" - integrity sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg== - dependencies: - debug "^4.3.4" - -agent-base@^7.1.1: +agent-base@^7.0.2, agent-base@^7.1.0, agent-base@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.1.tgz#bdbded7dfb096b751a2a087eeeb9664725b2e317" integrity sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA== dependencies: debug "^4.3.4" -agentkeepalive@^4.2.1: - version "4.5.0" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" - integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== - dependencies: - humanize-ms "^1.2.1" - aggregate-error@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" @@ -3412,12 +3471,7 @@ ansi-escapes@^4.2.1: ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= - -ansi-regex@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" - integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== ansi-regex@^5.0.1: version "5.0.1" @@ -3458,35 +3512,19 @@ ansi-styles@^6.1.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" - anymatch@~3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" picomatch "^2.0.4" -"aproba@^1.0.3 || ^2.0.0": +aproba@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== -are-we-there-yet@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz#679df222b278c64f2cdba1175cdc00b0d96164bd" - integrity sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg== - dependencies: - delegates "^1.0.0" - readable-stream "^3.6.0" - arg@^4.1.0: version "4.1.3" resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" @@ -3504,36 +3542,20 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -aria-query@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b" - integrity sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA== +aria-query@~5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" + integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== dependencies: - "@babel/runtime" "^7.10.2" - "@babel/runtime-corejs3" "^7.10.2" - -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + deep-equal "^2.0.5" -array-buffer-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" - integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== +array-buffer-byte-length@^1.0.0, array-buffer-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" + integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== dependencies: - call-bind "^1.0.2" - is-array-buffer "^3.0.1" + call-bind "^1.0.5" + is-array-buffer "^3.0.4" array-differ@^3.0.0: version "3.0.0" @@ -3543,28 +3565,18 @@ array-differ@^3.0.0: array-ify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" - integrity sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4= - -array-includes@^3.1.1, array-includes@^3.1.2, array-includes@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.3.tgz#c7f619b382ad2afaf5326cddfdc0afc61af7690a" - integrity sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.18.0-next.2" - get-intrinsic "^1.1.1" - is-string "^1.0.5" - -array-includes@^3.1.7: - version "3.1.7" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.7.tgz#8cd2e01b26f7a3086cbc87271593fe921c62abda" - integrity sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" + integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng== + +array-includes@^3.1.6, array-includes@^3.1.7, array-includes@^3.1.8: + version "3.1.8" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" + integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" is-string "^1.0.7" array-union@^2.1.0: @@ -3572,23 +3584,31 @@ array-union@^2.1.0: resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= +array.prototype.findlast@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" + integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" array.prototype.findlastindex@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz#b37598438f97b579166940814e2c0493a4f50207" - integrity sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA== + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" + integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - get-intrinsic "^1.2.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" -array.prototype.flat@^1.3.2: +array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== @@ -3596,17 +3616,7 @@ array.prototype.flat@^1.3.2: call-bind "^1.0.2" define-properties "^1.2.0" es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -array.prototype.flatmap@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz#94cfd47cc1556ec0747d97f7c7738c58122004c9" - integrity sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" - function-bind "^1.1.1" + es-shim-unscopables "^1.0.0" array.prototype.flatmap@^1.3.2: version "1.3.2" @@ -3618,23 +3628,35 @@ array.prototype.flatmap@^1.3.2: es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" -arraybuffer.prototype.slice@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz#98bd561953e3e74bb34938e77647179dfe6e9f12" - integrity sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw== +array.prototype.tosorted@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz#fe954678ff53034e717ea3352a03f0b0b86f7ffc" + integrity sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA== dependencies: - array-buffer-byte-length "^1.0.0" - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" - is-array-buffer "^3.0.2" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.3" + es-errors "^1.3.0" + es-shim-unscopables "^1.0.2" + +arraybuffer.prototype.slice@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" + integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.2.1" + get-intrinsic "^1.2.3" + is-array-buffer "^3.0.4" is-shared-array-buffer "^1.0.2" arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= + integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== arrify@^2.0.1: version "2.0.1" @@ -3642,26 +3664,21 @@ arrify@^2.0.1: integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== asn1@~0.2.3: - version "0.2.4" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" - integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + version "0.2.6" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== dependencies: safer-buffer "~2.1.0" assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= - -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== -ast-types-flow@^0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" - integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= +ast-types-flow@^0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.8.tgz#0a85e1c92695769ac13a428bb653e7538bea27d6" + integrity sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ== ast-types@^0.13.4: version "0.13.4" @@ -3670,100 +3687,87 @@ ast-types@^0.13.4: dependencies: tslib "^2.0.1" -async-each@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" - integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== - async@^3.2.3: - version "3.2.5" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" - integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== + version "3.2.6" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" + integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== aws4@^1.8.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" - integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== + version "1.13.1" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.13.1.tgz#bb5f8b8a20739f6ae1caeaf7eea2c7913df8048e" + integrity sha512-u5w79Rd7SU4JaIlA/zFqG+gOiuq25q5VLyZ8E+ijJeILuTxVzZgp2CaGw/UTw6pXYN9XMO9yiqj/nEHmhTG5CA== -axe-core@^4.0.2: - version "4.3.3" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.3.3.tgz#b55cd8e8ddf659fe89b064680e1c6a4dceab0325" - integrity sha512-/lqqLAmuIPi79WYfRpy2i8z+x+vxU3zX2uAm0gs1q52qTuKwolOj1P8XbufpXcsydrpKx2yGn2wzAnxCMV86QA== +axe-core@^4.9.1: + version "4.10.0" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.10.0.tgz#d9e56ab0147278272739a000880196cdfe113b59" + integrity sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g== -axios@^1.6.0: - version "1.6.8" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.8.tgz#66d294951f5d988a00e87a0ffb955316a619ea66" - integrity sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ== +axios@^1.7.4: + version "1.7.5" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.5.tgz#21eed340eb5daf47d29b6e002424b3e88c8c54b1" + integrity sha512-fZu86yCo+svH3uqJ/yTdQ0QHpQu5oL+/QE+QPSv6BZSkDAoky9vytxp7u5qk83OJFS3kEBcesWni9WTZAv3tSw== dependencies: follow-redirects "^1.15.6" form-data "^4.0.0" proxy-from-env "^1.1.0" -axobject-query@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" - integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== +axobject-query@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.1.1.tgz#3b6e5c6d4e43ca7ba51c5babf99d22a9c68485e1" + integrity sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg== + dependencies: + deep-equal "^2.0.5" b4a@^1.6.4: - version "1.6.4" - resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.6.4.tgz#ef1c1422cae5ce6535ec191baeed7567443f36c9" - integrity sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw== - -babel-plugin-dynamic-import-node@^2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" - integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== - dependencies: - object.assign "^4.1.0" + version "1.6.6" + resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.6.6.tgz#a4cc349a3851987c3c4ac2d7785c18744f6da9ba" + integrity sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg== -babel-plugin-polyfill-corejs2@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz#e9124785e6fd94f94b618a7954e5693053bf5327" - integrity sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ== +babel-plugin-polyfill-corejs2@^0.4.10: + version "0.4.11" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz#30320dfe3ffe1a336c15afdcdafd6fd615b25e33" + integrity sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q== dependencies: - "@babel/compat-data" "^7.13.11" - "@babel/helper-define-polyfill-provider" "^0.2.2" - semver "^6.1.1" + "@babel/compat-data" "^7.22.6" + "@babel/helper-define-polyfill-provider" "^0.6.2" + semver "^6.3.1" -babel-plugin-polyfill-corejs3@^0.2.2: - version "0.2.4" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.4.tgz#68cb81316b0e8d9d721a92e0009ec6ecd4cd2ca9" - integrity sha512-z3HnJE5TY/j4EFEa/qpQMSbcUJZ5JQi+3UFjXzn6pQCmIKc5Ug5j98SuYyH+m4xQnvKlMDIW4plLfgyVnd0IcQ== +babel-plugin-polyfill-corejs3@^0.10.6: + version "0.10.6" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz#2deda57caef50f59c525aeb4964d3b2f867710c7" + integrity sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA== dependencies: - "@babel/helper-define-polyfill-provider" "^0.2.2" - core-js-compat "^3.14.0" + "@babel/helper-define-polyfill-provider" "^0.6.2" + core-js-compat "^3.38.0" -babel-plugin-polyfill-regenerator@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz#b310c8d642acada348c1fa3b3e6ce0e851bee077" - integrity sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg== +babel-plugin-polyfill-regenerator@^0.6.1: + version "0.6.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz#addc47e240edd1da1058ebda03021f382bba785e" + integrity sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg== dependencies: - "@babel/helper-define-polyfill-provider" "^0.2.2" + "@babel/helper-define-polyfill-provider" "^0.6.2" babel-plugin-version-inline@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/babel-plugin-version-inline/-/babel-plugin-version-inline-1.0.0.tgz#b99b6f925db4a4c6789eb08836e66d128dd5993f" - integrity sha1-uZtvkl20pMZ4nrCINuZtEo3VmT8= + integrity sha512-PtxgDcPQbFsNMPVnmvZn1uRWJSO+oPhicEvbFRuv1FtApTxrhssI1bhtjkfYDJD0T2+MtjC+W40xH0+2yoI3dg== backbone@1.2.3: version "1.2.3" @@ -3778,59 +3782,52 @@ balanced-match@^1.0.0: integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== bare-events@^2.0.0, bare-events@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.2.1.tgz#7b6d421f26a7a755e20bf580b727c84b807964c1" - integrity sha512-9GYPpsPFvrWBkelIhOhTWtkeZxVxZOdb3VnFTCzlOo3OjvmTvzLoZFUT8kNFACx0vJej6QPney1Cf9BvzCNE/A== + version "2.4.2" + resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.4.2.tgz#3140cca7a0e11d49b3edc5041ab560659fd8e1f8" + integrity sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q== bare-fs@^2.1.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/bare-fs/-/bare-fs-2.2.1.tgz#c1985d8d3e07a178956b072d3af67cb8c1fa9391" - integrity sha512-+CjmZANQDFZWy4PGbVdmALIwmt33aJg8qTkVjClU6X4WmZkTPBDxRHiBn7fpqEWEfF3AC2io++erpViAIQbSjg== + version "2.3.1" + resolved "https://registry.yarnpkg.com/bare-fs/-/bare-fs-2.3.1.tgz#cdbd63dac7a552dfb2b87d18c822298d1efd213d" + integrity sha512-W/Hfxc/6VehXlsgFtbB5B4xFcsCl+pAh30cYhoFyXErf6oGrwjh8SwiPAdHgpmWonKuYpZgGywN0SXt7dgsADA== dependencies: bare-events "^2.0.0" - bare-os "^2.0.0" bare-path "^2.0.0" - streamx "^2.13.0" + bare-stream "^2.0.0" -bare-os@^2.0.0, bare-os@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/bare-os/-/bare-os-2.2.0.tgz#24364692984d0bd507621754781b31d7872736b2" - integrity sha512-hD0rOPfYWOMpVirTACt4/nK8mC55La12K5fY1ij8HAdfQakD62M+H4o4tpfKzVGLgRDTuk3vjA4GqGXXCeFbag== +bare-os@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/bare-os/-/bare-os-2.4.0.tgz#5de5e3ba7704f459c9656629edca7cc736e06608" + integrity sha512-v8DTT08AS/G0F9xrhyLtepoo9EJBJ85FRSMbu1pQUlAf6A8T0tEEQGMVObWeqpjhSPXsE0VGlluFBJu2fdoTNg== bare-path@^2.0.0, bare-path@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/bare-path/-/bare-path-2.1.0.tgz#830f17fd39842813ca77d211ebbabe238a88cb4c" - integrity sha512-DIIg7ts8bdRKwJRJrUMy/PICEaQZaPGZ26lsSx9MJSwIhSrcdHn7/C8W+XmnG/rKi6BaRcz+JO00CjZteybDtw== + version "2.1.3" + resolved "https://registry.yarnpkg.com/bare-path/-/bare-path-2.1.3.tgz#594104c829ef660e43b5589ec8daef7df6cedb3e" + integrity sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA== dependencies: bare-os "^2.1.0" +bare-stream@^2.0.0: + version "2.1.3" + resolved "https://registry.yarnpkg.com/bare-stream/-/bare-stream-2.1.3.tgz#070b69919963a437cc9e20554ede079ce0a129b2" + integrity sha512-tiDAH9H/kP+tvNO5sczyn9ZAA7utrSMobyDchsnyyXBuUe2FSQWbxhtuHB8jwpHYYevVo2UJpcmvvjrbHboUUQ== + dependencies: + streamx "^2.18.0" + base64-js@^1.1.2, base64-js@^1.2.1, base64-js@^1.3.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - basic-ftp@^5.0.2: - version "5.0.3" - resolved "https://registry.yarnpkg.com/basic-ftp/-/basic-ftp-5.0.3.tgz#b14c0fe8111ce001ec913686434fe0c2fb461228" - integrity sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g== + version "5.0.5" + resolved "https://registry.yarnpkg.com/basic-ftp/-/basic-ftp-5.0.5.tgz#14a474f5fffecca1f4f406f1c26b18f800225ac0" + integrity sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg== bcrypt-pbkdf@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== dependencies: tweetnacl "^0.14.3" @@ -3839,15 +3836,20 @@ before-after-hook@^2.2.0: resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c" integrity sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ== -binary-extensions@^1.0.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" - integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== +bin-links@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-4.0.4.tgz#c3565832b8e287c85f109a02a17027d152a58a63" + integrity sha512-cMtq4W5ZsEwcutJrVId+a/tjt8GSbS+h0oNkdl6+6rBuEv8Ot33Bevj5KPm40t309zuhVic8NjpuL42QCiJWWA== + dependencies: + cmd-shim "^6.0.0" + npm-normalize-package-bin "^3.0.0" + read-cmd-shim "^4.0.0" + write-file-atomic "^5.0.0" binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== bl@^4.0.3, bl@^4.1.0: version "4.1.0" @@ -3873,28 +3875,12 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@^2.3.1, braces@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -braces@^3.0.1, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== +braces@^3.0.3, braces@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: - fill-range "^7.0.1" + fill-range "^7.1.1" brotli@^1.3.2: version "1.3.3" @@ -3903,16 +3889,15 @@ brotli@^1.3.2: dependencies: base64-js "^1.1.2" -browserslist@^4.16.6, browserslist@^4.17.0: - version "4.17.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.17.0.tgz#1fcd81ec75b41d6d4994fb0831b92ac18c01649c" - integrity sha512-g2BJ2a0nEYvEFQC208q8mVAhfNwpZ5Mu8BwgtCdZKO3qx98HChmeg448fPdUzld8aFmfLgVh7yymqV+q1lJZ5g== +browserslist@^4.23.1, browserslist@^4.23.3: + version "4.23.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.3.tgz#debb029d3c93ebc97ffbc8d9cbb03403e227c800" + integrity sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA== dependencies: - caniuse-lite "^1.0.30001254" - colorette "^1.3.0" - electron-to-chromium "^1.3.830" - escalade "^3.1.1" - node-releases "^1.1.75" + caniuse-lite "^1.0.30001646" + electron-to-chromium "^1.5.4" + node-releases "^2.0.18" + update-browserslist-db "^1.1.0" buf-compare@^1.0.0: version "1.0.1" @@ -3922,7 +3907,7 @@ buf-compare@^1.0.0: buffer-crc32@~0.2.3: version "0.2.13" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" - integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= + integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== buffer-from@^1.0.0: version "1.1.2" @@ -3950,27 +3935,15 @@ buffer@^6.0.3: base64-js "^1.3.1" ieee754 "^1.2.1" -builtins@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" - integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og= - -builtins@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.1.0.tgz#6d85eeb360c4ebc166c3fdef922a15aa7316a5e8" - integrity sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg== - dependencies: - semver "^7.0.0" - byte-size@8.1.1: version "8.1.1" resolved "https://registry.yarnpkg.com/byte-size/-/byte-size-8.1.1.tgz#3424608c62d59de5bfda05d31e0313c6174842ae" integrity sha512-tUkzZWK0M/qdoLEqikxBWe4kumyuwjl3HO6zHTr4yEI23EojPtLYXdG1+AQY7MN0cGyNDvEaJ8wiYQm6P2bPxg== c8@^7.12.0: - version "7.12.0" - resolved "https://registry.yarnpkg.com/c8/-/c8-7.12.0.tgz#402db1c1af4af5249153535d1c84ad70c5c96b14" - integrity sha512-CtgQrHOkyxr5koX1wEUmN/5cfDa2ckbHRA4Gy5LAL0zaCFtVWJS5++n+w4/sr2GWGerBxgTjpKeDclk/Qk6W/A== + version "7.14.0" + resolved "https://registry.yarnpkg.com/c8/-/c8-7.14.0.tgz#f368184c73b125a80565e9ab2396ff0be4d732f3" + integrity sha512-i04rtkkcNcCf7zsQcSv/T9EbUn4RXQ6mropeMcjFOsQXQ0iGLAr/xT6TImQg4+U9hmNpN9XdvPkjUL1IzbgxJw== dependencies: "@bcoe/v8-coverage" "^0.2.3" "@istanbuljs/schema" "^0.1.3" @@ -3985,28 +3958,10 @@ c8@^7.12.0: yargs "^16.2.0" yargs-parser "^20.2.9" -cacache@^17.0.0: - version "17.1.4" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-17.1.4.tgz#b3ff381580b47e85c6e64f801101508e26604b35" - integrity sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A== - dependencies: - "@npmcli/fs" "^3.1.0" - fs-minipass "^3.0.0" - glob "^10.2.2" - lru-cache "^7.7.1" - minipass "^7.0.3" - minipass-collect "^1.0.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.4" - p-map "^4.0.0" - ssri "^10.0.0" - tar "^6.1.11" - unique-filename "^3.0.0" - -cacache@^18.0.0: - version "18.0.2" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-18.0.2.tgz#fd527ea0f03a603be5c0da5805635f8eef00c60c" - integrity sha512-r3NU8h/P+4lVUHfeRw1dtgQYar3DZMm4/cm2bZgOvrFC/su7budSOeqh52VJIC4U4iG1WWwV6vRW0znqBvxNuw== +cacache@^18.0.0, cacache@^18.0.3: + version "18.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-18.0.4.tgz#4601d7578dadb59c66044e157d02a3314682d6a5" + integrity sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ== dependencies: "@npmcli/fs" "^3.1.0" fs-minipass "^3.0.0" @@ -4021,37 +3976,16 @@ cacache@^18.0.0: tar "^6.1.11" unique-filename "^3.0.0" -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -call-bind@^1.0.0, call-bind@^1.0.2, call-bind@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -call-bind@^1.0.4, call-bind@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" - integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== +call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7, call-bind@~1.0.2: + version "1.0.7" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" function-bind "^1.1.2" - get-intrinsic "^1.2.1" - set-function-length "^1.1.1" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" callsites@^3.0.0: version "3.1.0" @@ -4072,10 +4006,10 @@ camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -caniuse-lite@^1.0.30001254: - version "1.0.30001523" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001523.tgz" - integrity sha512-I5q5cisATTPZ1mc588Z//pj/Ox80ERYDfR71YnvY7raS/NOk8xXlZcB0sF7JdqaV//kOaa6aus7lRfpdnt1eBA== +caniuse-lite@^1.0.30001646: + version "1.0.30001651" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz#52de59529e8b02b1aedcaaf5c05d9e23c0c28138" + integrity sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg== cartocolor@^5.0.2: version "5.0.2" @@ -4087,7 +4021,7 @@ cartocolor@^5.0.2: caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== chalk@4.1.0: version "4.1.0" @@ -4108,7 +4042,7 @@ chalk@^1.0.0: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.4.2: +chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -4151,9 +4085,9 @@ charenc@0.0.2: integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== chokidar@^3.4.0: - version "3.5.2" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" - integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== dependencies: anymatch "~3.1.2" braces "~3.0.2" @@ -4170,28 +4104,24 @@ chownr@^2.0.0: resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== -chromium-bidi@0.5.12: - version "0.5.12" - resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-0.5.12.tgz#19f8576b5284169a340b7c38c9cd1e01f74fc695" - integrity sha512-sZMgEBWKbupD0Q7lyFu8AWkrE+rs5ycE12jFkGwIgD/VS8lDPtelPlXM7LYaq4zrkZ/O2L3f4afHUHL0ICdKog== +chromium-bidi@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-0.6.3.tgz#363fe1ca6b9c6122b9f1b2a47f9449ecf712f755" + integrity sha512-qXlsCmpCZJAnoTYI83Iu6EdYQpMYdVkCfq08KDh2pmlVqK5t5IA9mGs4/LwCwp4fqisSOMXZxP3HIh8w8aRn0A== dependencies: mitt "3.0.1" urlpattern-polyfill "10.0.0" + zod "3.23.8" -ci-info@^3.2.0, ci-info@^3.6.1: +ci-info@^3.2.0: version "3.9.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" +ci-info@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-4.0.0.tgz#65466f8b280fc019b9f50a5388115d17a63a44f2" + integrity sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg== clean-stack@^2.0.0: version "2.2.0" @@ -4250,20 +4180,12 @@ clone-deep@4.0.1: clone@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= - -cmd-shim@6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-6.0.1.tgz#a65878080548e1dca760b3aea1e21ed05194da9d" - integrity sha512-S9iI9y0nKR4hwEQsVWpyxld/6kRfGepGfzff83FcaiEBpmvlbA2nnGe7Cylgrx2f/p1P5S5wpRm9oL8z1PbS3Q== + integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" +cmd-shim@6.0.3, cmd-shim@^6.0.0: + version "6.0.3" + resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-6.0.3.tgz#c491e9656594ba17ac83c4bd931590a9d6e26033" + integrity sha512-FMabTRlc5t5zjdenF6mS0MBeFZm0XqHqeOkcskKFb/LYCcRQ5fVgLOHVc4Lq9CqABd9zhjwPjMBCJvMCziSVtA== color-convert@^1.9.0: version "1.9.3" @@ -4282,7 +4204,7 @@ color-convert@^2.0.1: color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== color-name@^1.0.0, color-name@~1.1.4: version "1.1.4" @@ -4297,7 +4219,7 @@ color-string@^1.9.0: color-name "^1.0.0" simple-swizzle "^0.2.2" -color-support@^1.1.3: +color-support@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== @@ -4315,11 +4237,6 @@ colorbrewer@1.5.6: resolved "https://registry.yarnpkg.com/colorbrewer/-/colorbrewer-1.5.6.tgz#5b6c81bcf2ee584642375143b210a9049d9e5ab5" integrity sha512-fONg2pGXyID8zNgKHBlagW8sb/AMShGzj4rRJfz5biZ7iuHQZYquSCLE/Co1oSQFmt/vvwjyezJCejQl7FG/tg== -colorette@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" - integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== - columnify@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.6.0.tgz#6989531713c9008bb29735e61e37acf5bd553cf3" @@ -4340,10 +4257,15 @@ commander@2, commander@^2.20.3: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commander@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.0.tgz#545983a0603fe425bc672d66c9e3c89c42121a83" - integrity sha512-NIQrwvv9V39FHgGFm36+U9SMQzbiHvU79k+iADraJTpmrFFfx7Ds0IvDoAdZsDrknlkRk14OYoWXb57uTh7/sw== +commander@^6.2.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" + integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== + +common-ancestor-path@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz#4f7d2d1394d91b7abdf51871c62f71eadb0182a7" + integrity sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w== compare-func@^2.0.0: version "2.0.0" @@ -4353,15 +4275,10 @@ compare-func@^2.0.0: array-ify "^1.0.0" dot-prop "^5.1.0" -component-emitter@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - -composed-offset-position@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/composed-offset-position/-/composed-offset-position-0.0.4.tgz#ca8854abf15e3c235ecf4df125a27fe88af76ea4" - integrity sha512-vMlvu1RuNegVE0YsCDSV/X4X10j56mq7PCIyOKK74FxkXzGLwhOUmdkJLSdOBOMwWycobGUMgft2lp+YgTe8hw== +composed-offset-position@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/composed-offset-position/-/composed-offset-position-0.0.6.tgz#0b027a880401ed5a9f777f59134ff606b406d0a7" + integrity sha512-Q7dLompI6lUwd7LWyIcP66r4WcS9u7AL2h8HaeipiRfCRPLMWqRx8fYsjb4OHi6UQFifO7XtNC2IlEJ1ozIFxw== concat-map@0.0.1: version "0.0.1" @@ -4396,7 +4313,7 @@ console-control-strings@^1.1.0: contentstream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/contentstream/-/contentstream-1.0.0.tgz#0bdcfa46da30464a86ce8fa7ece565410dc6f9a5" - integrity sha1-C9z6RtowRkqGzo+n7OVlQQ3G+aU= + integrity sha512-jqWbfFZFG9tZbdej7+TzXI4kanABh3BLtTWY6NxqTK5zo6iTIeo5aq4iRVfYsLQ0y8ccQqmJR/J4NeMmEdnR2w== dependencies: readable-stream "~1.0.33-1" @@ -4473,22 +4390,10 @@ conventional-recommended-bump@7.0.1: git-semver-tags "^5.0.0" meow "^8.1.2" -convert-source-map@^1.1.0, convert-source-map@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" - integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== - dependencies: - safe-buffer "~5.1.1" - -convert-source-map@^1.6.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== core-assert@^0.2.0: version "0.2.1" @@ -4498,33 +4403,22 @@ core-assert@^0.2.0: buf-compare "^1.0.0" is-error "^2.2.0" -core-js-compat@^3.14.0, core-js-compat@^3.16.0: - version "3.17.3" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.17.3.tgz#b39c8e4dec71ecdc735c653ce5233466e561324e" - integrity sha512-+in61CKYs4hQERiADCJsdgewpdl/X0GhEX77pjKgbeibXviIt2oxEjTc8O2fqHX8mDdBrDvX8MYD/RYsBv4OiA== +core-js-compat@^3.37.1, core-js-compat@^3.38.0: + version "3.38.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.38.1.tgz#2bc7a298746ca5a7bcb9c164bcb120f2ebc09a09" + integrity sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw== dependencies: - browserslist "^4.17.0" - semver "7.0.0" + browserslist "^4.23.3" -core-js-pure@^3.16.0: - version "3.17.3" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.17.3.tgz#98ea3587188ab7ef4695db6518eeb71aec42604a" - integrity sha512-YusrqwiOTTn8058JDa0cv9unbXdIiIgcgI9gXso0ey4WgkFLd3lYlV9rp9n7nDCsYxXsMDTjA4m1h3T348mdlQ== - -core-util-is@1.0.2, core-util-is@~1.0.0: +core-util-is@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== -cosmiconfig@9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-9.0.0.tgz#34c3fc58287b915f3ae905ab6dc3de258b55ad9d" - integrity sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg== - dependencies: - env-paths "^2.2.1" - import-fresh "^3.3.0" - js-yaml "^4.1.0" - parse-json "^5.2.0" +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== cosmiconfig@^8.2.0: version "8.3.6" @@ -4536,6 +4430,16 @@ cosmiconfig@^8.2.0: parse-json "^5.2.0" path-type "^4.0.0" +cosmiconfig@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-9.0.0.tgz#34c3fc58287b915f3ae905ab6dc3de258b55ad9d" + integrity sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg== + dependencies: + env-paths "^2.2.1" + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" + coveralls@^3.0.3: version "3.1.1" resolved "https://registry.yarnpkg.com/coveralls/-/coveralls-3.1.1.tgz#f5d4431d8b5ae69c5079c8f8ca00d64ac77cf081" @@ -4552,17 +4456,10 @@ create-require@^1.1.0: resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== -cross-fetch@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-4.0.0.tgz#f037aef1580bb3a1a35164ea2a848ba81b445983" - integrity sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g== - dependencies: - node-fetch "^2.6.12" - cross-spawn@^5.0.1: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= + integrity sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A== dependencies: lru-cache "^4.0.1" shebang-command "^1.2.0" @@ -4587,6 +4484,11 @@ csscolorparser@~1.0.3: resolved "https://registry.yarnpkg.com/csscolorparser/-/csscolorparser-1.0.3.tgz#b34f391eea4da8f3e98231e2ccd8df9c041f171b" integrity sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w== +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + cssfilter@0.0.10: version "0.0.10" resolved "https://registry.yarnpkg.com/cssfilter/-/cssfilter-0.0.10.tgz#c6d2672632a2e5c83e013e6864a42ce8defd20ae" @@ -4617,7 +4519,7 @@ csstype@^3.0.2: cwise-compiler@^1.0.0, cwise-compiler@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/cwise-compiler/-/cwise-compiler-1.1.3.tgz#f4d667410e850d3a313a7d2db7b1e505bb034cc5" - integrity sha1-9NZnQQ6FDToxOn0tt7HlBbsDTMU= + integrity sha512-WXlK/m+Di8DMMcCjcWr4i+XzcQra9eCdXIJrgh4TUgh0pIS/yJduLxS9JgefsHJ/YVLdgPtXm9r62W92MvanEQ== dependencies: uniq "^1.0.0" @@ -4684,10 +4586,10 @@ d3-scale@^4.0.0: dependencies: d3-array "2 - 3" -damerau-levenshtein@^1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz#64368003512a1a6992593741a09a9d31a836f55d" - integrity sha512-VvdQIPGdWP0SqFXghj79Wf/5LArmreyMsGLa6FG6iC4t3j7j5s71TrwWmT/4akbDQIqjfACkLZmjXhA7g2oUZw== +damerau-levenshtein@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" + integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== dargs@^7.0.0: version "7.0.0" @@ -4697,19 +4599,19 @@ dargs@^7.0.0: dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== dependencies: assert-plus "^1.0.0" data-uri-to-buffer@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-0.0.3.tgz#18ae979a6a0ca994b0625853916d2662bbae0b1a" - integrity sha1-GK6XmmoMqZSwYlhTkW0mYruuCxo= + integrity sha512-Cp+jOa8QJef5nXS5hU7M1DWzXPEIoVR3kbV0dQuVGwROZg8bGf1DcCnkmajBTnvghTtSNMUdRrPjgaT6ZQucbw== -data-uri-to-buffer@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-6.0.1.tgz#540bd4c8753a25ee129035aebdedf63b078703c7" - integrity sha512-MZd3VlchQkp8rdend6vrx7MmVDJzSNTBvghvKjirLkD+WTChA3KUf0jkE68Q4UyctNqI11zZO9/x2Yx+ub5Cvg== +data-uri-to-buffer@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz#8a58bb67384b261a38ef18bea1810cb01badd28b" + integrity sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw== data-urls@^3.0.2: version "3.0.2" @@ -4720,30 +4622,50 @@ data-urls@^3.0.2: whatwg-mimetype "^3.0.0" whatwg-url "^11.0.0" +data-view-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" + integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" + integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" + integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + dateformat@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== -dayjs@1.11.10: - version "1.11.10" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.10.tgz#68acea85317a6e164457d6d6947564029a6a16a0" - integrity sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ== +dayjs@1.11.12: + version "1.11.12" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.12.tgz#5245226cc7f40a15bf52e0b99fd2a04669ccac1d" + integrity sha512-Rt2g+nTbLlDWZTwwrIXjy9MeiZmSDI375FvZs72ngxx8PDC6YXOeR3q5LAuPzjZQxhiWdRKac7RKV+YyQYfYIg== -debug@4, debug@4.3.4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== +debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5, debug@^4.3.6: + version "4.3.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b" + integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== dependencies: ms "2.1.2" -debug@^2.2.0, debug@^2.3.3: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" @@ -4762,45 +4684,59 @@ decamelize-keys@^1.1.0: decamelize@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== decimal.js@^10.4.2: version "10.4.3" resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== -decode-uri-component@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" - integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== +dedent@1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.3.tgz#99aee19eb9bae55a67327717b6e848d0bf777e5a" + integrity sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ== -dedent@0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" - integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== +deep-equal@^2.0.5: + version "2.2.3" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.3.tgz#af89dafb23a396c7da3e862abc0be27cf51d56e1" + integrity sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.5" + es-get-iterator "^1.1.3" + get-intrinsic "^1.2.2" + is-arguments "^1.1.1" + is-array-buffer "^3.0.2" + is-date-object "^1.0.5" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + isarray "^2.0.5" + object-is "^1.1.5" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.1" + side-channel "^1.0.4" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.13" deep-equal@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" - integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== + version "1.1.2" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.2.tgz#78a561b7830eef3134c7f6f3a3d6af272a678761" + integrity sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg== dependencies: - is-arguments "^1.0.4" - is-date-object "^1.0.1" - is-regex "^1.0.4" - object-is "^1.0.1" + is-arguments "^1.1.1" + is-date-object "^1.0.5" + is-regex "^1.1.4" + object-is "^1.1.5" object-keys "^1.1.1" - regexp.prototype.flags "^1.2.0" + regexp.prototype.flags "^1.5.1" deep-is@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== -deep-is@~0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= - deep-strict-equal@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/deep-strict-equal/-/deep-strict-equal-0.2.0.tgz#4a078147a8ab57f6a0d4f5547243cd22f44eb4e4" @@ -4809,47 +4745,32 @@ deep-strict-equal@^0.2.0: core-assert "^0.2.0" deepmerge@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" - integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== defaults@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" - integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= + version "1.0.4" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" + integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== dependencies: clone "^1.0.2" -define-data-property@^1.0.1, define-data-property@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" - integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== +define-data-property@^1.0.1, define-data-property@^1.1.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== dependencies: - get-intrinsic "^1.2.1" + es-define-property "^1.0.0" + es-errors "^1.3.0" gopd "^1.0.1" - has-property-descriptors "^1.0.0" define-lazy-prop@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== -define-properties@^1.1.2, define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== - dependencies: - object-keys "^1.0.12" - -define-properties@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" - integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== - dependencies: - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -define-properties@^1.2.0: +define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== @@ -4858,32 +4779,10 @@ define-properties@^1.2.0: has-property-descriptors "^1.0.0" object-keys "^1.1.1" -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -defined@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" - integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= +defined@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.1.tgz#c0b9db27bfaffd95d6f61399419b893df0f91ebf" + integrity sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q== degenerator@^5.0.0: version "5.0.1" @@ -4897,12 +4796,7 @@ degenerator@^5.0.0: delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= - -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== deprecation@^2.0.0: version "2.3.1" @@ -4912,12 +4806,12 @@ deprecation@^2.0.0: detect-indent@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" - integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50= + integrity sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g== -devtools-protocol@0.0.1249869: - version "0.0.1249869" - resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1249869.tgz#000c3cf1afc189a18db98135a50d4a8f95a47d29" - integrity sha512-Ctp4hInA0BEavlUoRy9mhGq0i+JSo/AwVyX2EFgZmV1kYB+Zq+EMBAn52QWu6FbRr10hRb6pBl420upbp4++vg== +devtools-protocol@0.0.1312386: + version "0.0.1312386" + resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1312386.tgz#5ab824d6f1669ec6c6eb0fba047e73601d969052" + integrity sha512-DPnhUXvmvKT2dFA/j7B+riVLUt9Q6RKJlcppojL5CoRywJJKLDYnRlw0gTFKfgDPHP5E04UoB71SxoJlVZy8FA== diff-sequences@^29.6.3: version "29.6.3" @@ -4969,15 +4863,17 @@ dot-prop@^5.1.0: dependencies: is-obj "^2.0.0" -dotenv-expand@~10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-10.0.0.tgz#12605d00fb0af6d0a592e6558585784032e4ef37" - integrity sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A== +dotenv-expand@~11.0.6: + version "11.0.6" + resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-11.0.6.tgz#f2c840fd924d7c77a94eff98f153331d876882d3" + integrity sha512-8NHi73otpWsZGBSZwwknTXS5pqMOrk9+Ssrna8xCaxkzEpU9OTf9R5ArQGVw03//Zmk9MOwLPng9WwndvpAJ5g== + dependencies: + dotenv "^16.4.4" -dotenv@~16.3.1: - version "16.3.2" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.2.tgz#3cb611ce5a63002dbabf7c281bc331f69d28f03f" - integrity sha512-HTlk5nmhkm8F6JcdXvHIzaorzCoziNQT9mGxLPVXW8wJF1TiGSL60ZGB4gHWabHOaMmWmhvk2/lPHfnBiT78AQ== +dotenv@^16.4.4, dotenv@~16.4.5: + version "16.4.5" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" + integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== dotignore@~0.1.2: version "0.1.2" @@ -4992,9 +4888,9 @@ draco3d@1.5.7: integrity sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ== duplexer@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" - integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E= + version "0.1.2" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== earcut@^2.2.2, earcut@^2.2.4: version "2.2.4" @@ -5009,7 +4905,7 @@ eastasianwidth@^0.2.0: ecc-jsbn@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== dependencies: jsbn "~0.1.0" safer-buffer "^2.1.0" @@ -5021,17 +4917,17 @@ ejs@^3.1.7: dependencies: jake "^10.8.5" -electron-to-chromium@^1.3.830: - version "1.3.835" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.835.tgz#98fa4402ab7bc6afbe4953a8ca9b63cb3a6bf08b" - integrity sha512-rHQszGg2KLMqOWPNTpwCnlp7Kb85haJa8j089DJCreZueykoSN/in+EMlay3SSDMNKR4VGPvfskxofHV18xVJg== +electron-to-chromium@^1.5.4: + version "1.5.13" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz#1abf0410c5344b2b829b7247e031f02810d442e6" + integrity sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q== emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== -emoji-regex@^9.0.0, emoji-regex@^9.2.2: +emoji-regex@^9.2.2: version "9.2.2" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== @@ -5058,24 +4954,19 @@ enquirer@~2.3.6: ansi-colors "^4.1.1" entities@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174" - integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== - -env-paths@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.0.tgz#cdca557dc009152917d6166e2febe1f039685e43" - integrity sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA== + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== -env-paths@^2.2.1: +env-paths@^2.2.0, env-paths@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== -envinfo@7.8.1: - version "7.8.1" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" - integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== +envinfo@7.13.0: + version "7.13.0" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.13.0.tgz#81fbb81e5da35d74e814941aeab7c325a606fb31" + integrity sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q== err-code@^2.0.2: version "2.0.3" @@ -5089,133 +4980,122 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.17.0-next.1: - version "1.17.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.0.tgz#f42a517d0036a5591dbb2c463591dc8bb50309b1" - integrity sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug== - dependencies: - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.1.5" - is-regex "^1.0.5" - object-inspect "^1.7.0" - object-keys "^1.1.1" - object.assign "^4.1.0" - string.prototype.trimleft "^2.1.1" - string.prototype.trimright "^2.1.1" - -es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2, es-abstract@^1.18.2: - version "1.18.6" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.6.tgz#2c44e3ea7a6255039164d26559777a6d978cb456" - integrity sha512-kAeIT4cku5eNLNuUKhlmtuk1/TRZvQoYccn6TO0cSVdf1kzB0T7+dYuVK9MWM7l+/53W2Q8M7N2c6MQvhXFcUQ== - dependencies: - call-bind "^1.0.2" - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - get-intrinsic "^1.1.1" - get-symbol-description "^1.0.0" - has "^1.0.3" - has-symbols "^1.0.2" - internal-slot "^1.0.3" - is-callable "^1.2.4" - is-negative-zero "^2.0.1" - is-regex "^1.1.4" - is-string "^1.0.7" - object-inspect "^1.11.0" - object-keys "^1.1.1" - object.assign "^4.1.2" - string.prototype.trimend "^1.0.4" - string.prototype.trimstart "^1.0.4" - unbox-primitive "^1.0.1" - -es-abstract@^1.19.0, es-abstract@^1.20.4: - version "1.20.5" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.5.tgz#e6dc99177be37cacda5988e692c3fa8b218e95d2" - integrity sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ== - dependencies: - call-bind "^1.0.2" +es-abstract@^1.17.5, es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2, es-abstract@^1.23.3: + version "1.23.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" + integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== + dependencies: + array-buffer-byte-length "^1.0.1" + arraybuffer.prototype.slice "^1.0.3" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + data-view-buffer "^1.0.1" + data-view-byte-length "^1.0.1" + data-view-byte-offset "^1.0.0" + es-define-property "^1.0.0" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-set-tostringtag "^2.0.3" es-to-primitive "^1.2.1" - function-bind "^1.1.1" - function.prototype.name "^1.1.5" - get-intrinsic "^1.1.3" - get-symbol-description "^1.0.0" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.4" + get-symbol-description "^1.0.2" + globalthis "^1.0.3" gopd "^1.0.1" - has "^1.0.3" - has-property-descriptors "^1.0.0" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" has-symbols "^1.0.3" - internal-slot "^1.0.3" + hasown "^2.0.2" + internal-slot "^1.0.7" + is-array-buffer "^3.0.4" is-callable "^1.2.7" - is-negative-zero "^2.0.2" + is-data-view "^1.0.1" + is-negative-zero "^2.0.3" is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" + is-shared-array-buffer "^1.0.3" is-string "^1.0.7" + is-typed-array "^1.1.13" is-weakref "^1.0.2" - object-inspect "^1.12.2" + object-inspect "^1.13.1" object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.4.3" - safe-regex-test "^1.0.0" - string.prototype.trimend "^1.0.6" - string.prototype.trimstart "^1.0.6" + object.assign "^4.1.5" + regexp.prototype.flags "^1.5.2" + safe-array-concat "^1.1.2" + safe-regex-test "^1.0.3" + string.prototype.trim "^1.2.9" + string.prototype.trimend "^1.0.8" + string.prototype.trimstart "^1.0.8" + typed-array-buffer "^1.0.2" + typed-array-byte-length "^1.0.1" + typed-array-byte-offset "^1.0.2" + typed-array-length "^1.0.6" unbox-primitive "^1.0.2" + which-typed-array "^1.1.15" -es-abstract@^1.22.1: - version "1.22.3" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.3.tgz#48e79f5573198de6dee3589195727f4f74bc4f32" - integrity sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA== +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== dependencies: - array-buffer-byte-length "^1.0.0" - arraybuffer.prototype.slice "^1.0.2" - available-typed-arrays "^1.0.5" - call-bind "^1.0.5" - es-set-tostringtag "^2.0.1" - es-to-primitive "^1.2.1" - function.prototype.name "^1.1.6" - get-intrinsic "^1.2.2" - get-symbol-description "^1.0.0" - globalthis "^1.0.3" - gopd "^1.0.1" - has-property-descriptors "^1.0.0" - has-proto "^1.0.1" + get-intrinsic "^1.2.4" + +es-errors@^1.2.1, es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-get-iterator@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" + integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" has-symbols "^1.0.3" - hasown "^2.0.0" - internal-slot "^1.0.5" - is-array-buffer "^3.0.2" - is-callable "^1.2.7" - is-negative-zero "^2.0.2" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" + is-arguments "^1.1.1" + is-map "^2.0.2" + is-set "^2.0.2" is-string "^1.0.7" - is-typed-array "^1.1.12" - is-weakref "^1.0.2" - object-inspect "^1.13.1" - object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.5.1" - safe-array-concat "^1.0.1" - safe-regex-test "^1.0.0" - string.prototype.trim "^1.2.8" - string.prototype.trimend "^1.0.7" - string.prototype.trimstart "^1.0.7" - typed-array-buffer "^1.0.0" - typed-array-byte-length "^1.0.0" - typed-array-byte-offset "^1.0.0" - typed-array-length "^1.0.4" - unbox-primitive "^1.0.2" - which-typed-array "^1.1.13" + isarray "^2.0.5" + stop-iteration-iterator "^1.0.0" -es-set-tostringtag@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz#11f7cc9f63376930a5f20be4915834f4bc74f9c9" - integrity sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q== +es-iterator-helpers@^1.0.19: + version "1.0.19" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz#117003d0e5fec237b4b5c08aded722e0c6d50ca8" + integrity sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.3" + es-errors "^1.3.0" + es-set-tostringtag "^2.0.3" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + globalthis "^1.0.3" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" + has-symbols "^1.0.3" + internal-slot "^1.0.7" + iterator.prototype "^1.1.2" + safe-array-concat "^1.1.2" + +es-object-atoms@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" + integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== dependencies: - get-intrinsic "^1.2.2" - has-tostringtag "^1.0.0" - hasown "^2.0.0" + es-errors "^1.3.0" -es-shim-unscopables@^1.0.0: +es-set-tostringtag@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" + integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== + dependencies: + get-intrinsic "^1.2.4" + has-tostringtag "^1.0.2" + hasown "^2.0.1" + +es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== @@ -5237,89 +5117,77 @@ esbuild-plugin-external-global@^1.0.1: integrity sha512-NDzYHRoShpvLqNcrgV8ZQh61sMIFAry5KLTQV83BPG5iTXCCu7h72SCfJ97bW0GqtuqDD/1aqLbKinI/rNgUsg== esbuild@^0.16.7: - version "0.16.7" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.16.7.tgz#3288f685a83c6097dea8ddf1759ca30d6e06535b" - integrity sha512-P6OBFYFSQOGzfApqCeYKqfKRRbCIRsdppTXFo4aAvtiW3o8TTyiIplBvHJI171saPAiy3WlawJHCveJVIOIx1A== + version "0.16.17" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.16.17.tgz#fc2c3914c57ee750635fee71b89f615f25065259" + integrity sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg== optionalDependencies: - "@esbuild/android-arm" "0.16.7" - "@esbuild/android-arm64" "0.16.7" - "@esbuild/android-x64" "0.16.7" - "@esbuild/darwin-arm64" "0.16.7" - "@esbuild/darwin-x64" "0.16.7" - "@esbuild/freebsd-arm64" "0.16.7" - "@esbuild/freebsd-x64" "0.16.7" - "@esbuild/linux-arm" "0.16.7" - "@esbuild/linux-arm64" "0.16.7" - "@esbuild/linux-ia32" "0.16.7" - "@esbuild/linux-loong64" "0.16.7" - "@esbuild/linux-mips64el" "0.16.7" - "@esbuild/linux-ppc64" "0.16.7" - "@esbuild/linux-riscv64" "0.16.7" - "@esbuild/linux-s390x" "0.16.7" - "@esbuild/linux-x64" "0.16.7" - "@esbuild/netbsd-x64" "0.16.7" - "@esbuild/openbsd-x64" "0.16.7" - "@esbuild/sunos-x64" "0.16.7" - "@esbuild/win32-arm64" "0.16.7" - "@esbuild/win32-ia32" "0.16.7" - "@esbuild/win32-x64" "0.16.7" + "@esbuild/android-arm" "0.16.17" + "@esbuild/android-arm64" "0.16.17" + "@esbuild/android-x64" "0.16.17" + "@esbuild/darwin-arm64" "0.16.17" + "@esbuild/darwin-x64" "0.16.17" + "@esbuild/freebsd-arm64" "0.16.17" + "@esbuild/freebsd-x64" "0.16.17" + "@esbuild/linux-arm" "0.16.17" + "@esbuild/linux-arm64" "0.16.17" + "@esbuild/linux-ia32" "0.16.17" + "@esbuild/linux-loong64" "0.16.17" + "@esbuild/linux-mips64el" "0.16.17" + "@esbuild/linux-ppc64" "0.16.17" + "@esbuild/linux-riscv64" "0.16.17" + "@esbuild/linux-s390x" "0.16.17" + "@esbuild/linux-x64" "0.16.17" + "@esbuild/netbsd-x64" "0.16.17" + "@esbuild/openbsd-x64" "0.16.17" + "@esbuild/sunos-x64" "0.16.17" + "@esbuild/win32-arm64" "0.16.17" + "@esbuild/win32-ia32" "0.16.17" + "@esbuild/win32-x64" "0.16.17" esbuild@^0.18.10: - version "0.18.11" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.18.11.tgz#cbf94dc3359d57f600a0dbf281df9b1d1b4a156e" - integrity sha512-i8u6mQF0JKJUlGR3OdFLKldJQMMs8OqM9Cc3UCi9XXziJ9WERM5bfkHaEAy0YAvPRMgqSW55W7xYn84XtEFTtA== + version "0.18.20" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.18.20.tgz#4709f5a34801b43b799ab7d6d82f7284a9b7a7a6" + integrity sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA== optionalDependencies: - "@esbuild/android-arm" "0.18.11" - "@esbuild/android-arm64" "0.18.11" - "@esbuild/android-x64" "0.18.11" - "@esbuild/darwin-arm64" "0.18.11" - "@esbuild/darwin-x64" "0.18.11" - "@esbuild/freebsd-arm64" "0.18.11" - "@esbuild/freebsd-x64" "0.18.11" - "@esbuild/linux-arm" "0.18.11" - "@esbuild/linux-arm64" "0.18.11" - "@esbuild/linux-ia32" "0.18.11" - "@esbuild/linux-loong64" "0.18.11" - "@esbuild/linux-mips64el" "0.18.11" - "@esbuild/linux-ppc64" "0.18.11" - "@esbuild/linux-riscv64" "0.18.11" - "@esbuild/linux-s390x" "0.18.11" - "@esbuild/linux-x64" "0.18.11" - "@esbuild/netbsd-x64" "0.18.11" - "@esbuild/openbsd-x64" "0.18.11" - "@esbuild/sunos-x64" "0.18.11" - "@esbuild/win32-arm64" "0.18.11" - "@esbuild/win32-ia32" "0.18.11" - "@esbuild/win32-x64" "0.18.11" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + "@esbuild/android-arm" "0.18.20" + "@esbuild/android-arm64" "0.18.20" + "@esbuild/android-x64" "0.18.20" + "@esbuild/darwin-arm64" "0.18.20" + "@esbuild/darwin-x64" "0.18.20" + "@esbuild/freebsd-arm64" "0.18.20" + "@esbuild/freebsd-x64" "0.18.20" + "@esbuild/linux-arm" "0.18.20" + "@esbuild/linux-arm64" "0.18.20" + "@esbuild/linux-ia32" "0.18.20" + "@esbuild/linux-loong64" "0.18.20" + "@esbuild/linux-mips64el" "0.18.20" + "@esbuild/linux-ppc64" "0.18.20" + "@esbuild/linux-riscv64" "0.18.20" + "@esbuild/linux-s390x" "0.18.20" + "@esbuild/linux-x64" "0.18.20" + "@esbuild/netbsd-x64" "0.18.20" + "@esbuild/openbsd-x64" "0.18.20" + "@esbuild/sunos-x64" "0.18.20" + "@esbuild/win32-arm64" "0.18.20" + "@esbuild/win32-ia32" "0.18.20" + "@esbuild/win32-x64" "0.18.20" + +escalade@^3.1.1, escalade@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" + integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -escodegen@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" - integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== - dependencies: - esprima "^4.0.1" - estraverse "^5.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - -escodegen@^2.1.0: +escodegen@^2.0.0, escodegen@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== @@ -5331,9 +5199,9 @@ escodegen@^2.1.0: source-map "~0.6.1" eslint-config-prettier@^6.7.0: - version "6.9.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.9.0.tgz#430d24822e82f7deb1e22a435bfa3999fae4ad64" - integrity sha512-k4E14HBtcLv0uqThaI6I/n1LEqROp8XaPu6SO9Z32u5NlGRC07Enu1Bh2KEFw4FNHbekH8yzbIU9kUGxbiGmCA== + version "6.15.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz#7f93f6cb7d45a92f1537a70ecc06366e1ac6fed9" + integrity sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw== dependencies: get-stdin "^6.0.0" @@ -5347,9 +5215,9 @@ eslint-import-resolver-node@^0.3.9: resolve "^1.22.4" eslint-module-utils@^2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" - integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== + version "2.8.1" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz#52f2404300c3bd33deece9d7372fb337cc1d7c34" + integrity sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q== dependencies: debug "^3.2.7" @@ -5384,59 +5252,69 @@ eslint-plugin-import@^2.28.0: tsconfig-paths "^3.15.0" eslint-plugin-jsx-a11y@^6.1.2: - version "6.4.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.4.1.tgz#a2d84caa49756942f42f1ffab9002436391718fd" - integrity sha512-0rGPJBbwHoGNPU73/QCLP/vveMlM1b1Z9PponxO87jfr6tuH5ligXbDT6nHSSzBC8ovX2Z+BQu7Bk5D/Xgq9zg== - dependencies: - "@babel/runtime" "^7.11.2" - aria-query "^4.2.2" - array-includes "^3.1.1" - ast-types-flow "^0.0.7" - axe-core "^4.0.2" - axobject-query "^2.2.0" - damerau-levenshtein "^1.0.6" - emoji-regex "^9.0.0" - has "^1.0.3" - jsx-ast-utils "^3.1.0" - language-tags "^1.0.5" + version "6.9.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.9.0.tgz#67ab8ff460d4d3d6a0b4a570e9c1670a0a8245c8" + integrity sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g== + dependencies: + aria-query "~5.1.3" + array-includes "^3.1.8" + array.prototype.flatmap "^1.3.2" + ast-types-flow "^0.0.8" + axe-core "^4.9.1" + axobject-query "~3.1.1" + damerau-levenshtein "^1.0.8" + emoji-regex "^9.2.2" + es-iterator-helpers "^1.0.19" + hasown "^2.0.2" + jsx-ast-utils "^3.3.5" + language-tags "^1.0.9" + minimatch "^3.1.2" + object.fromentries "^2.0.8" + safe-regex-test "^1.0.3" + string.prototype.includes "^2.0.0" eslint-plugin-markdown@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-markdown/-/eslint-plugin-markdown-2.2.0.tgz#9c30bd51538a815e87e96646c69f11466b4c165f" - integrity sha512-Ctuc7aP1tU92qnFwVO1wDLEzf1jqMxwRkcSTw7gjbvnEqfh5CKUcTXM0sxg8CB2KDXrqpTuMZPgJ1XE9Olr7KA== + version "2.2.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-markdown/-/eslint-plugin-markdown-2.2.1.tgz#76b8a970099fbffc6cc1ffcad9772b96911c027a" + integrity sha512-FgWp4iyYvTFxPwfbxofTvXxgzPsDuSKHQy2S+a8Ve6savbujey+lgrFFbXQA0HPygISpRYWYBjooPzhYSF81iA== dependencies: mdast-util-from-markdown "^0.8.5" eslint-plugin-react-hooks@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz#8c229c268d468956334c943bb45fc860280f5556" - integrity sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ== + version "4.6.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz#c829eb06c0e6f484b3fbb85a97e57784f328c596" + integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== eslint-plugin-react@^7.22.0: - version "7.25.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.25.1.tgz#9286b7cd9bf917d40309760f403e53016eda8331" - integrity sha512-P4j9K1dHoFXxDNP05AtixcJEvIT6ht8FhYKsrkY0MPCPaUMYijhpWwNiRDZVtA8KFuZOkGSeft6QwH8KuVpJug== + version "7.35.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.35.0.tgz#00b1e4559896710e58af6358898f2ff917ea4c41" + integrity sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA== dependencies: - array-includes "^3.1.3" - array.prototype.flatmap "^1.2.4" + array-includes "^3.1.8" + array.prototype.findlast "^1.2.5" + array.prototype.flatmap "^1.3.2" + array.prototype.tosorted "^1.1.4" doctrine "^2.1.0" - estraverse "^5.2.0" - has "^1.0.3" + es-iterator-helpers "^1.0.19" + estraverse "^5.3.0" + hasown "^2.0.2" jsx-ast-utils "^2.4.1 || ^3.0.0" - minimatch "^3.0.4" - object.entries "^1.1.4" - object.fromentries "^2.0.4" - object.values "^1.1.4" - prop-types "^15.7.2" - resolve "^2.0.0-next.3" - string.prototype.matchall "^4.0.5" + minimatch "^3.1.2" + object.entries "^1.1.8" + object.fromentries "^2.0.8" + object.values "^1.2.0" + prop-types "^15.8.1" + resolve "^2.0.0-next.5" + semver "^6.3.1" + string.prototype.matchall "^4.0.11" + string.prototype.repeat "^1.0.0" eslint-rule-composer@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz#79320c927b0c5c0d3d3d2b76c8b4a488f25bbaf9" integrity sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg== -eslint-scope@^5.1.1: +eslint-scope@5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== @@ -5463,15 +5341,15 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4 integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== eslint@^8.52.0: - version "8.56.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.56.0.tgz#4957ce8da409dc0809f99ab07a1b94832ab74b15" - integrity sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ== + version "8.57.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" + integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.6.1" "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.56.0" - "@humanwhocodes/config-array" "^0.11.13" + "@eslint/js" "8.57.0" + "@humanwhocodes/config-array" "^0.11.14" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" "@ungap/structured-clone" "^1.2.0" @@ -5521,9 +5399,9 @@ esprima@^4.0.0, esprima@^4.0.1: integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esquery@^1.4.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" - integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + version "1.6.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== dependencies: estraverse "^5.1.0" @@ -5544,10 +5422,10 @@ estraverse@^4.1.1: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" - integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== estree-walker@^0.6.1: version "0.6.1" @@ -5582,7 +5460,7 @@ execa@5.0.0: execa@^0.6.0: version "0.6.3" resolved "https://registry.yarnpkg.com/execa/-/execa-0.6.3.tgz#57b69a594f081759c69e5370f0d17b9cb11658fe" - integrity sha1-V7aaWU8IF1nGnlNw8NF7nLEWWP4= + integrity sha512-/teX3MDLFBdYUhRk8WCBYboIMUmqeizu0m9Z3YF3JWrbEh/SlZg00vLJSaAGWw3wrZ9tE0buNw79eaAPYhUuvg== dependencies: cross-spawn "^5.0.1" get-stream "^3.0.0" @@ -5592,46 +5470,11 @@ execa@^0.6.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - exponential-backoff@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6" integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== -expression-eval@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/expression-eval/-/expression-eval-5.0.1.tgz#845758fa9ba64d9edc7b6804ae404934a6cfee6b" - integrity sha512-7SL4miKp19lI834/F6y156xlNg+i9Q41tteuGNCq9C06S78f1bm3BXuvf0+QpQxv369Pv/P2R7Hb17hzxLpbDA== - dependencies: - jsep "^0.3.0" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" @@ -5646,21 +5489,7 @@ external-editor@^3.0.3: iconv-lite "^0.4.24" tmp "^0.0.33" -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -extract-zip@2.0.1: +extract-zip@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== @@ -5674,19 +5503,19 @@ extract-zip@2.0.1: extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== extsprintf@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + version "1.4.1" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-fifo@^1.1.0, fast-fifo@^1.2.0: +fast-fifo@^1.2.0, fast-fifo@^1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== @@ -5707,29 +5536,29 @@ fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: +fast-levenshtein@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fast-xml-parser@^4.2.5: - version "4.3.6" - resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.3.6.tgz#190f9d99097f0c8f2d3a0e681a10404afca052ff" - integrity sha512-M2SovcRxD4+vC493Uc2GZVcZaj66CCJhWurC4viynVSTvrpErCShNcDz1lAho6n9REQKvL/ll4A4/fw6Y9z8nw== + version "4.4.1" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz#86dbf3f18edf8739326447bcaac31b4ae7f6514f" + integrity sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw== dependencies: strnum "^1.0.5" fastq@^1.6.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" - integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + version "1.17.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== dependencies: reusify "^1.0.4" fd-slicer@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" - integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= + integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== dependencies: pend "~1.2.0" @@ -5767,27 +5596,17 @@ filelist@^1.0.4: dependencies: minimatch "^5.0.1" -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" find-up@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== dependencies: locate-path "^2.0.0" @@ -5808,11 +5627,12 @@ find-up@^5.0.0: path-exists "^4.0.0" flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + version "3.2.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== dependencies: - flatted "^3.1.0" + flatted "^3.2.9" + keyv "^4.5.3" rimraf "^3.0.2" flat@^5.0.2: @@ -5820,10 +5640,10 @@ flat@^5.0.2: resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== -flatted@^3.1.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.2.tgz#64bfed5cb68fe3ca78b3eb214ad97b63bedce561" - integrity sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA== +flatted@^3.2.9: + version "3.3.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" + integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== focus-trap@7.5.4: version "7.5.4" @@ -5844,11 +5664,6 @@ for-each@^0.3.3, for-each@~0.3.3: dependencies: is-callable "^1.1.3" -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= - foreground-child@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53" @@ -5858,9 +5673,9 @@ foreground-child@^2.0.0: signal-exit "^3.0.2" foreground-child@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" - integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== + version "3.3.0" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.0.tgz#0ac8644c06e431439f8561db8ecf29a7b5519c77" + integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg== dependencies: cross-spawn "^7.0.0" signal-exit "^4.0.1" @@ -5868,7 +5683,7 @@ foreground-child@^3.1.0: forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== form-data@^4.0.0: version "4.0.0" @@ -5888,19 +5703,19 @@ form-data@~2.3.2: combined-stream "^1.0.6" mime-types "^2.1.12" -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= +front-matter@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/front-matter/-/front-matter-4.0.2.tgz#b14e54dc745cfd7293484f3210d15ea4edd7f4d5" + integrity sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg== dependencies: - map-cache "^0.2.2" + js-yaml "^3.13.1" fs-constants@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== -fs-extra@^11.1.0, fs-extra@^11.1.1: +fs-extra@^11.1.0, fs-extra@^11.2.0: version "11.2.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b" integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== @@ -5909,15 +5724,6 @@ fs-extra@^11.1.0, fs-extra@^11.1.1: jsonfile "^6.0.1" universalify "^2.0.0" -fs-extra@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" - integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.1.0" - fs-minipass@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" @@ -5940,33 +5746,18 @@ fs-readdir-recursive@^1.1.0: fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== function-bind@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== -function.prototype.name@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" - integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" - functions-have-names "^1.2.2" - function.prototype.name@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" @@ -5977,25 +5768,11 @@ function.prototype.name@^1.1.6: es-abstract "^1.22.1" functions-have-names "^1.2.3" -functions-have-names@^1.2.2, functions-have-names@^1.2.3: +functions-have-names@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== -gauge@^4.0.3: - version "4.0.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce" - integrity sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg== - dependencies: - aproba "^1.0.3 || ^2.0.0" - color-support "^1.1.3" - console-control-strings "^1.1.0" - has-unicode "^2.0.1" - signal-exit "^3.0.7" - string-width "^4.2.3" - strip-ansi "^6.0.1" - wide-align "^1.1.5" - gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" @@ -6011,29 +5788,12 @@ get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" - integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.3" - -get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" - integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - -get-intrinsic@^1.2.0, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" - integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== +get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== dependencies: + es-errors "^1.3.0" function-bind "^1.1.2" has-proto "^1.0.1" has-symbols "^1.0.3" @@ -6084,7 +5844,7 @@ get-stream@6.0.0: get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= + integrity sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ== get-stream@^5.1.0: version "5.2.0" @@ -6098,40 +5858,36 @@ get-stream@^6.0.0, get-stream@^6.0.1: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== +get-symbol-description@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" + integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" + call-bind "^1.0.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" get-uri@^6.0.1: - version "6.0.2" - resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-6.0.2.tgz#e019521646f4a8ff6d291fbaea2c46da204bb75b" - integrity sha512-5KLucCJobh8vBY1K07EFV4+cPZH3mrV9YeAruUseCQKHB58SGjjT2l9/eA9LD082IiuMjSlFJEcdJ27TXvbZNw== + version "6.0.3" + resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-6.0.3.tgz#0d26697bc13cf91092e519aa63aa60ee5b6f385a" + integrity sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw== dependencies: basic-ftp "^5.0.2" - data-uri-to-buffer "^6.0.0" + data-uri-to-buffer "^6.0.2" debug "^4.3.4" - fs-extra "^8.1.0" - -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + fs-extra "^11.2.0" getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== dependencies: assert-plus "^1.0.0" gif-encoder@~0.4.1: version "0.4.3" resolved "https://registry.yarnpkg.com/gif-encoder/-/gif-encoder-0.4.3.tgz#8a2b4fe8ca895a48e3a0b6cbb340a0a6a3571899" - integrity sha1-iitP6MqJWkjjoLbLs0CgpqNXGJk= + integrity sha512-HMfSa+EIng62NbDhM63QGYoc49/m8DcZ9hhBtw+CXX9mKboSpeFVxjZ2WEWaMFZ14MUjfACK7jsrxrJffIVrCg== dependencies: readable-stream "~1.1.9" @@ -6147,7 +5903,7 @@ git-raw-commits@^3.0.0: git-remote-origin-url@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz#5282659dae2107145a11126112ad3216ec5fa65f" - integrity sha1-UoJlna4hBxRaERJhEq0yFuxfpl8= + integrity sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw== dependencies: gitconfiglocal "^1.0.0" pify "^2.3.0" @@ -6168,17 +5924,17 @@ git-up@^7.0.0: is-ssh "^1.4.0" parse-url "^8.1.0" -git-url-parse@13.1.0: - version "13.1.0" - resolved "https://registry.yarnpkg.com/git-url-parse/-/git-url-parse-13.1.0.tgz#07e136b5baa08d59fabdf0e33170de425adf07b4" - integrity sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA== +git-url-parse@14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/git-url-parse/-/git-url-parse-14.0.0.tgz#18ce834726d5fbca0c25a4555101aa277017418f" + integrity sha512-NnLweV+2A4nCvn4U/m2AoYu0pPKlsmhK9cknG7IMwsjFY1S2jxM+mAhsDxyxfCIGfGaD+dozsyX4b6vkYc83yQ== dependencies: git-up "^7.0.0" gitconfiglocal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz#41d045f3851a5ea88f03f24ca1c6178114464b9b" - integrity sha1-QdBF84UaXqiPA/JMocYXgRRGS5s= + integrity sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ== dependencies: ini "^1.3.2" @@ -6187,54 +5943,44 @@ gl-matrix@^3.0.0, gl-matrix@^3.2.1: resolved "https://registry.yarnpkg.com/gl-matrix/-/gl-matrix-3.4.3.tgz#fc1191e8320009fd4d20e9339595c6041ddc22c9" integrity sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA== -glob-parent@5.1.2, glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.2: +glob-parent@6.0.2, glob-parent@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: is-glob "^4.0.3" +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + glob@^10.2.2, glob@^10.3.10: - version "10.3.12" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.12.tgz#3a65c363c2e9998d220338e88a5f6ac97302960b" - integrity sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg== + version "10.4.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" + integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== dependencies: foreground-child "^3.1.0" - jackspeak "^2.3.6" - minimatch "^9.0.1" - minipass "^7.0.4" - path-scurry "^1.10.2" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^1.11.1" -glob@^7.0.0, glob@^7.1.3, glob@^7.1.4: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== +glob@^7.1.3, glob@^7.1.4, glob@^7.2.0, glob@~7.2.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.0.4" + minimatch "^3.1.1" once "^1.3.0" path-is-absolute "^1.0.0" -glob@^8.0.1: - version "8.1.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" - integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^5.0.1" - once "^1.3.0" - glob@^9.2.0: version "9.3.5" resolved "https://registry.yarnpkg.com/glob/-/glob-9.3.5.tgz#ca2ed8ca452781a3009685607fdf025a899dfe21" @@ -6245,18 +5991,6 @@ glob@^9.2.0: minipass "^4.2.4" path-scurry "^1.6.1" -glob@~7.2.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - global-prefix@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" @@ -6269,7 +6003,7 @@ global-prefix@^3.0.0: global@~4.3.0: version "4.3.2" resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f" - integrity sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8= + integrity sha512-/4AybdwIDU4HkCUbJkZdWpe4P6vuw/CUtu+0I1YlLIPe7OlUO7KNJ+q/rO70CW2/NW6Jc6I62++Hzsf5Alu6rQ== dependencies: min-document "^2.19.0" process "~0.5.1" @@ -6287,11 +6021,12 @@ globals@^13.19.0: type-fest "^0.20.2" globalthis@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" - integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + version "1.0.4" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" + integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== dependencies: - define-properties "^1.1.3" + define-properties "^1.2.1" + gopd "^1.0.1" globby@11.1.0, globby@^11.1.0: version "11.1.0" @@ -6312,21 +6047,11 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -graceful-fs@4.2.11, graceful-fs@^4.2.6: +graceful-fs@4.2.11, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.6: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.6, graceful-fs@^4.2.0: - version "4.2.3" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" - integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== - -graceful-fs@^4.1.2: - version "4.2.4" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" - integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== - graphemer@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" @@ -6362,9 +6087,9 @@ handlebars@^4.7.7: har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q== -har-validator@~5.1.0, har-validator@~5.1.3: +har-validator@~5.1.3: version "5.1.5" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== @@ -6384,12 +6109,7 @@ has-ansi@^2.0.0: dependencies: ansi-regex "^2.0.0" -has-bigints@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" - integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== - -has-bigints@^1.0.2: +has-bigints@^1.0.1, has-bigints@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== @@ -6397,94 +6117,51 @@ has-bigints@^1.0.2: has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== dependencies: - get-intrinsic "^1.1.1" - -has-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" - integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + es-define-property "^1.0.0" -has-symbols@^1.0.0, has-symbols@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" - integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== - -has-symbols@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" - integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== +has-proto@^1.0.1, has-proto@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== -has-symbols@^1.0.3: +has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== +has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== dependencies: - has-symbols "^1.0.2" + has-symbols "^1.0.3" -has-unicode@2.0.1, has-unicode@^2.0.1: +has-unicode@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -has@^1.0.3, has@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" +has@~1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.4.tgz#2eb2860e000011dae4f1406a86fe80e530fb2ec6" + integrity sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ== -hasown@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" - integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== +hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: function-bind "^1.1.2" @@ -6493,13 +6170,6 @@ hosted-git-info@^2.1.4: resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== -hosted-git-info@^3.0.6: - version "3.0.8" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-3.0.8.tgz#6e35d4cc87af2c5f816e4cb9ce350ba87a3f370d" - integrity sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw== - dependencies: - lru-cache "^6.0.0" - hosted-git-info@^4.0.0, hosted-git-info@^4.0.1: version "4.1.0" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" @@ -6507,17 +6177,10 @@ hosted-git-info@^4.0.0, hosted-git-info@^4.0.1: dependencies: lru-cache "^6.0.0" -hosted-git-info@^6.0.0: - version "6.1.1" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-6.1.1.tgz#629442c7889a69c05de604d52996b74fe6f26d58" - integrity sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w== - dependencies: - lru-cache "^7.5.1" - -hosted-git-info@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-7.0.1.tgz#9985fcb2700467fecf7f33a4d4874e30680b5322" - integrity sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA== +hosted-git-info@^7.0.0, hosted-git-info@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-7.0.2.tgz#9b751acac097757667f30114607ef7b661ff4f17" + integrity sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w== dependencies: lru-cache "^10.0.1" @@ -6529,9 +6192,9 @@ html-encoding-sniffer@^3.0.0: whatwg-encoding "^2.0.0" html-escaper@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.0.tgz#71e87f931de3fe09e56661ab9a29aadec707b491" - integrity sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig== + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== http-cache-semantics@^4.1.1: version "4.1.1" @@ -6547,15 +6210,7 @@ http-proxy-agent@^5.0.0: agent-base "6" debug "4" -http-proxy-agent@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz#e9096c5afd071a3fce56e6252bb321583c124673" - integrity sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ== - dependencies: - agent-base "^7.1.0" - debug "^4.3.4" - -http-proxy-agent@^7.0.1: +http-proxy-agent@^7.0.0, http-proxy-agent@^7.0.1: version "7.0.2" resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e" integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== @@ -6566,13 +6221,13 @@ http-proxy-agent@^7.0.1: http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== dependencies: assert-plus "^1.0.0" jsprim "^1.2.2" sshpk "^1.7.0" -https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1: +https-proxy-agent@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== @@ -6580,18 +6235,10 @@ https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1: agent-base "6" debug "4" -https-proxy-agent@^7.0.1, https-proxy-agent@^7.0.3: - version "7.0.4" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz#8e97b841a029ad8ddc8731f26595bad868cb4168" - integrity sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg== - dependencies: - agent-base "^7.0.2" - debug "4" - -https-proxy-agent@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz#e2645b846b90e96c6e6f347fb5b2e41f1590b09b" - integrity sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA== +https-proxy-agent@^7.0.1, https-proxy-agent@^7.0.3, https-proxy-agent@^7.0.5: + version "7.0.5" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz#9e8b5013873299e11fab6fd548405da2d6c602b2" + integrity sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw== dependencies: agent-base "^7.0.2" debug "4" @@ -6601,13 +6248,6 @@ human-signals@^2.1.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -humanize-ms@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" - integrity sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0= - dependencies: - ms "^2.0.0" - iconv-lite@0.4, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -6627,29 +6267,17 @@ ieee754@^1.1.12, ieee754@^1.1.13, ieee754@^1.2.1: resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -ignore-walk@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-5.0.1.tgz#5f199e23e1288f518d90358d461387788a154776" - integrity sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw== - dependencies: - minimatch "^5.0.1" - ignore-walk@^6.0.4: - version "6.0.4" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-6.0.4.tgz#89950be94b4f522225eb63a13c56badb639190e9" - integrity sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw== + version "6.0.5" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-6.0.5.tgz#ef8d61eab7da169078723d1f82833b36e200b0dd" + integrity sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A== dependencies: minimatch "^9.0.0" -ignore@^5.0.4: - version "5.3.1" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" - integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== - -ignore@^5.2.0, ignore@^5.2.4: - version "5.3.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.0.tgz#67418ae40d34d6999c95ff56016759c718c82f78" - integrity sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg== +ignore@^5.0.4, ignore@^5.2.0, ignore@^5.2.4: + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== image-size@^0.7.4: version "0.7.5" @@ -6680,7 +6308,7 @@ import-local@3.1.0: imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== indent-string@^4.0.0: version "4.0.0" @@ -6690,7 +6318,7 @@ indent-string@^4.0.0: inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" wrappy "1" @@ -6700,25 +6328,25 @@ inherits@2, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -ini@^1.3.2: - version "1.3.5" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" - integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== - -ini@^1.3.5, ini@^1.3.8: +ini@^1.3.2, ini@^1.3.5, ini@^1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -init-package-json@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-5.0.0.tgz#030cf0ea9c84cfc1b0dc2e898b45d171393e4b40" - integrity sha512-kBhlSheBfYmq3e0L1ii+VKe3zBTLL5lDCDWR+f9dLmEGSB3MqLlMlsolubSsyI88Bg6EA+BIMlomAnQ1SwgQBw== +ini@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.3.tgz#4c359675a6071a46985eb39b14e4a2c0ec98a795" + integrity sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg== + +init-package-json@6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-6.0.3.tgz#2552fba75b6eed2495dc97f44183e2e5a5bcf8b0" + integrity sha512-Zfeb5ol+H+eqJWHTaGca9BovufyGeIfr4zaaBorPmJBMrJ+KBnN+kQx2ZtXdsotUTgldHmHQV44xvUWOUA7E2w== dependencies: - npm-package-arg "^10.0.0" + "@npmcli/package-json" "^5.0.0" + npm-package-arg "^11.0.0" promzard "^1.0.0" - read "^2.0.0" - read-package-json "^6.0.0" + read "^3.0.1" semver "^7.3.5" validate-npm-package-license "^3.0.4" validate-npm-package-name "^5.0.0" @@ -6744,21 +6372,12 @@ inquirer@^8.2.4: through "^2.3.6" wrap-ansi "^6.0.1" -internal-slot@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" - integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== - dependencies: - get-intrinsic "^1.1.0" - has "^1.0.3" - side-channel "^1.0.4" - -internal-slot@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.6.tgz#37e756098c4911c5e912b8edbf71ed3aa116f930" - integrity sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg== +internal-slot@^1.0.4, internal-slot@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" + integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== dependencies: - get-intrinsic "^1.2.2" + es-errors "^1.3.0" hasown "^2.0.0" side-channel "^1.0.4" @@ -6770,7 +6389,7 @@ internal-slot@^1.0.5: iota-array@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/iota-array/-/iota-array-1.0.0.tgz#81ef57fe5d05814cd58c2483632a99c30a0e8087" - integrity sha1-ge9X/l0FgUzVjCSDYyqZwwoOgIc= + integrity sha512-pZ2xT+LOHckCatGQ3DcG/a+QuEqvoxqkiL7tvE8nn3uuu+f6i1TtpB5/FtWFbxUuVr5PZCx8KskuGatbJDXOWA== ip-address@^9.0.5: version "9.0.5" @@ -6780,30 +6399,6 @@ ip-address@^9.0.5: jsbn "1.1.0" sprintf-js "^1.1.3" -ip@^1.1.8: - version "1.1.9" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.9.tgz#8dfbcc99a754d07f425310b86a99546b1151e396" - integrity sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ== - -ip@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.1.tgz#e8f3595d33a3ea66490204234b77636965307105" - integrity sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ== - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== - dependencies: - kind-of "^6.0.0" - is-alphabetical@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" @@ -6817,30 +6412,39 @@ is-alphanumerical@^1.0.0: is-alphabetical "^1.0.0" is-decimal "^1.0.0" -is-arguments@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" - integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA== +is-arguments@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" -is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" - integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== +is-array-buffer@^3.0.2, is-array-buffer@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" + integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== dependencies: call-bind "^1.0.2" - get-intrinsic "^1.2.0" - is-typed-array "^1.1.10" + get-intrinsic "^1.2.1" is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== is-arrayish@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== +is-async-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" + integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== + dependencies: + has-tostringtag "^1.0.0" + is-bigint@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" @@ -6848,13 +6452,6 @@ is-bigint@^1.0.1: dependencies: has-bigints "^1.0.1" -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= - dependencies: - binary-extensions "^1.0.0" - is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" @@ -6870,22 +6467,12 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-buffer@^1.0.2, is-buffer@^1.1.5, is-buffer@~1.1.6: +is-buffer@^1.0.2, is-buffer@~1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" - integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== - -is-callable@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" - integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== - -is-callable@^1.2.7: +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== @@ -6897,69 +6484,32 @@ is-ci@3.0.1: dependencies: ci-info "^3.2.0" -is-core-module@^2.13.0, is-core-module@^2.13.1, is-core-module@^2.5.0, is-core-module@^2.8.1: - version "2.13.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" - integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== - dependencies: - hasown "^2.0.0" - -is-core-module@^2.2.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.6.0.tgz#d7553b2526fe59b92ba3e40c8df757ec8a709e19" - integrity sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ== - dependencies: - has "^1.0.3" - -is-core-module@^2.9.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" - integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== +is-core-module@^2.13.0, is-core-module@^2.13.1, is-core-module@^2.5.0: + version "2.15.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" + integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== dependencies: - has "^1.0.3" + hasown "^2.0.2" -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= +is-data-view@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" + integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== dependencies: - kind-of "^3.0.2" + is-typed-array "^1.1.13" -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== +is-date-object@^1.0.1, is-date-object@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== dependencies: - kind-of "^6.0.0" - -is-date-object@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" - integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + has-tostringtag "^1.0.0" is-decimal@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - is-docker@^2.0.0, is-docker@^2.1.1: version "2.2.1" resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" @@ -6970,22 +6520,17 @@ is-error@^2.2.0: resolved "https://registry.yarnpkg.com/is-error/-/is-error-2.2.2.tgz#c10ade187b3c93510c5470a5567833ee25649843" integrity sha512-IOQqts/aHWbiisY5DuPJQ0gcbvaLFCa7fBa9xoLfxBZvQ+ZI/Zh9xoI7Gk+G64N0FdK4AbibytHht2tWgpJWLg== -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-finalizationregistry@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" + integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== + dependencies: + call-bind "^1.0.2" is-finite@^1.0.1: version "1.1.0" @@ -6997,14 +6542,14 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== +is-generator-function@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== dependencies: - is-extglob "^2.1.1" + has-tostringtag "^1.0.0" -is-glob@^4.0.3: +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== @@ -7026,30 +6571,23 @@ is-lambda@^1.0.1: resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== -is-negative-zero@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" - integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== +is-map@^2.0.2, is-map@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" + integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== -is-negative-zero@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== +is-negative-zero@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== is-number-object@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" - integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== dependencies: has-tostringtag "^1.0.0" -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= - dependencies: - kind-of "^3.0.2" - is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -7068,9 +6606,9 @@ is-path-inside@^3.0.3: is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== -is-plain-object@^2.0.3, is-plain-object@^2.0.4: +is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== @@ -7088,16 +6626,9 @@ is-potential-custom-element-name@^1.0.1: integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== is-promise@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" - integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= - -is-regex@^1.0.4, is-regex@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" - integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== - dependencies: - has "^1.0.3" + version "2.2.2" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" + integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== is-regex@^1.1.4, is-regex@~1.1.4: version "1.1.4" @@ -7107,12 +6638,17 @@ is-regex@^1.1.4, is-regex@~1.1.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== +is-set@^2.0.2, is-set@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" + integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== + +is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" + integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== dependencies: - call-bind "^1.0.2" + call-bind "^1.0.7" is-ssh@^1.4.0: version "1.4.0" @@ -7129,33 +6665,21 @@ is-stream@2.0.0: is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== is-stream@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -is-string@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" - integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== - -is-string@^1.0.7: +is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== dependencies: has-tostringtag "^1.0.0" -is-symbol@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" - integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== - dependencies: - has-symbols "^1.0.1" - -is-symbol@^1.0.3: +is-symbol@^1.0.2, is-symbol@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== @@ -7165,27 +6689,32 @@ is-symbol@^1.0.3: is-text-path@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" - integrity sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4= + integrity sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w== dependencies: text-extensions "^1.0.0" -is-typed-array@^1.1.10, is-typed-array@^1.1.12, is-typed-array@^1.1.9: - version "1.1.12" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" - integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== +is-typed-array@^1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" + integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== dependencies: - which-typed-array "^1.1.11" + which-typed-array "^1.1.14" is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== is-unicode-supported@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== +is-weakmap@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" + integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== + is-weakref@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" @@ -7193,10 +6722,13 @@ is-weakref@^1.0.2: dependencies: call-bind "^1.0.2" -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== +is-weakset@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.3.tgz#e801519df8c0c43e12ff2834eead84ec9e624007" + integrity sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ== + dependencies: + call-bind "^1.0.7" + get-intrinsic "^1.2.4" is-wsl@^2.2.0: version "2.2.0" @@ -7208,85 +6740,84 @@ is-wsl@^2.2.0: isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= - -isarray@1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== isarray@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== isexe@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/isexe/-/isexe-3.1.1.tgz#4a407e2bd78ddfb14bea0c27c6f7072dde775f0d" integrity sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ== -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: +isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= - -istanbul-lib-coverage@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" - integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== + integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== -istanbul-lib-coverage@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" - integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" + integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + version "3.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" + integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== dependencies: istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" + make-dir "^4.0.0" supports-color "^7.1.0" istanbul-reports@^3.1.4: - version "3.1.5" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" - integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== + version "3.1.7" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" + integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -jackspeak@^2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" - integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== +iterator.prototype@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" + integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== + dependencies: + define-properties "^1.2.1" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + reflect.getprototypeof "^1.0.4" + set-function-name "^2.0.1" + +jackspeak@^3.1.2: + version "3.4.3" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" + integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== dependencies: "@isaacs/cliui" "^8.0.2" optionalDependencies: "@pkgjs/parseargs" "^0.11.0" jake@^10.8.5: - version "10.8.7" - resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.7.tgz#63a32821177940c33f356e0ba44ff9d34e1c7d8f" - integrity sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w== + version "10.9.2" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.9.2.tgz#6ae487e6a69afec3a5e167628996b59f35ae2b7f" + integrity sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA== dependencies: async "^3.2.3" chalk "^4.0.2" @@ -7330,7 +6861,7 @@ js-yaml@4.1.0, js-yaml@^4.1.0: dependencies: argparse "^2.0.1" -js-yaml@^3.10.0: +js-yaml@^3.10.0, js-yaml@^3.13.1: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== @@ -7338,14 +6869,6 @@ js-yaml@^3.10.0: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@^3.13.1: - version "3.13.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" - integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - jsbn@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" @@ -7354,7 +6877,7 @@ jsbn@1.1.0: jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== jsdom@^20.0.0: version "20.0.3" @@ -7401,7 +6924,12 @@ jsesc@^2.5.1: jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== json-parse-better-errors@^1.0.1: version "1.0.2" @@ -7413,30 +6941,35 @@ json-parse-even-better-errors@^2.3.0: resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== -json-parse-even-better-errors@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz#02bb29fb5da90b5444581749c22cedd3597c6cb0" - integrity sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg== +json-parse-even-better-errors@^3.0.0, json-parse-even-better-errors@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz#b43d35e89c0f3be6b5fbbe9dc6c82467b30c28da" + integrity sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ== json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= +json-schema@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json-stringify-nice@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz#2c937962b80181d3f317dd39aa323e14f5a60a67" + integrity sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw== json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== json5@^1.0.2: version "1.0.2" @@ -7445,28 +6978,16 @@ json5@^1.0.2: dependencies: minimist "^1.2.0" -json5@^2.1.1, json5@^2.2.2: +json5@^2.1.1, json5@^2.2.2, json5@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== -json5@^2.1.2, json5@^2.2.1: - version "2.2.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.2.tgz#64471c5bdcc564c18f7c1d4df2e2297f2457c5ab" - integrity sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ== - jsonc-parser@3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= - optionalDependencies: - graceful-fs "^4.1.6" - jsonfile@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" @@ -7479,25 +7000,27 @@ jsonfile@^6.0.1: jsonparse@^1.2.0, jsonparse@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" - integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= + integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== jsprim@^1.2.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + version "1.4.2" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" + integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== dependencies: assert-plus "1.0.0" extsprintf "1.3.0" - json-schema "0.2.3" + json-schema "0.4.0" verror "1.10.0" -"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz#41108d2cec408c3453c1bbe8a4aae9e1e2bd8f82" - integrity sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q== +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.5: + version "3.3.5" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" + integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== dependencies: - array-includes "^3.1.2" - object.assign "^4.1.2" + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" jszip@^3.1.5: version "3.10.1" @@ -7509,36 +7032,29 @@ jszip@^3.1.5: readable-stream "~2.3.6" setimmediate "^1.0.5" +just-diff-apply@^5.2.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/just-diff-apply/-/just-diff-apply-5.5.0.tgz#771c2ca9fa69f3d2b54e7c3f5c1dfcbcc47f9f0f" + integrity sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw== + +just-diff@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/just-diff/-/just-diff-6.0.2.tgz#03b65908543ac0521caf6d8eb85035f7d27ea285" + integrity sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA== + kdbush@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/kdbush/-/kdbush-3.0.0.tgz#f8484794d47004cc2d85ed3a79353dbe0abc2bf0" integrity sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew== -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + json-buffer "3.0.1" -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" - integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== - -kind-of@^6.0.3: +kind-of@^6.0.2, kind-of@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== @@ -7548,98 +7064,105 @@ ktx-parse@^0.0.4: resolved "https://registry.yarnpkg.com/ktx-parse/-/ktx-parse-0.0.4.tgz#6fd3eca82490de8a1e48cb8367a9980451fa1ac4" integrity sha512-LY3nrmfXl+wZZdPxgJ3ZmLvG+wkOZZP3/dr4RbQj1Pk3Qwz44esOOSFFVQJcNWpXAtiNIC66WgXufX/SYgYz6A== -language-subtag-registry@~0.3.2: - version "0.3.21" - resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz#04ac218bea46f04cb039084602c6da9e788dd45a" - integrity sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg== +language-subtag-registry@^0.3.20: + version "0.3.23" + resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz#23529e04d9e3b74679d70142df3fd2eb6ec572e7" + integrity sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ== -language-tags@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" - integrity sha1-0yHbxNowuovzAk4ED6XBRmH5GTo= +language-tags@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.9.tgz#1ffdcd0ec0fafb4b1be7f8b11f306ad0f9c08777" + integrity sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA== dependencies: - language-subtag-registry "~0.3.2" + language-subtag-registry "^0.3.20" lcov-parse@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lcov-parse/-/lcov-parse-1.0.0.tgz#eb0d46b54111ebc561acb4c408ef9363bdc8f7e0" - integrity sha1-6w1GtUER68VhrLTECO+TY73I9+A= + integrity sha512-aprLII/vPzuQvYZnDRU78Fns9I2Ag3gi4Ipga/hxnVMCZC8DnR2nI7XBqrPoywGfxqIx/DgarGvDJZAD3YBTgQ== lerna@^8.1.0: - version "8.1.2" - resolved "https://registry.yarnpkg.com/lerna/-/lerna-8.1.2.tgz#441e8078d0b68557b4ef5b33202a16a6bc2a50d3" - integrity sha512-RCyBAn3XsqqvHbz3TxLfD7ylqzCi1A2UJnFEZmhURgx589vM3qYWQa/uOMeEEf565q6cAdtmulITciX1wgkAtw== - dependencies: - "@lerna/create" "8.1.2" - "@npmcli/run-script" "7.0.2" - "@nx/devkit" ">=17.1.2 < 19" + version "8.1.8" + resolved "https://registry.yarnpkg.com/lerna/-/lerna-8.1.8.tgz#9edc9ce4fb4b6c7e22c994e9ef91d4e0370595b2" + integrity sha512-Rmo5ShMx73xM2CUcRixjmpZIXB7ZFlWEul1YvJyx/rH4onAwDHtUGD7Rx4NZYL8QSRiQHroglM2Oyq+WqA4BYg== + dependencies: + "@lerna/create" "8.1.8" + "@npmcli/arborist" "7.5.4" + "@npmcli/package-json" "5.2.0" + "@npmcli/run-script" "8.1.0" + "@nx/devkit" ">=17.1.2 < 20" "@octokit/plugin-enterprise-rest" "6.0.1" "@octokit/rest" "19.0.11" + aproba "2.0.0" byte-size "8.1.1" chalk "4.1.0" clone-deep "4.0.1" - cmd-shim "6.0.1" + cmd-shim "6.0.3" + color-support "1.1.3" columnify "1.6.0" + console-control-strings "^1.1.0" conventional-changelog-angular "7.0.0" conventional-changelog-core "5.0.1" conventional-recommended-bump "7.0.1" cosmiconfig "^8.2.0" - dedent "0.7.0" - envinfo "7.8.1" + dedent "1.5.3" + envinfo "7.13.0" execa "5.0.0" - fs-extra "^11.1.1" + fs-extra "^11.2.0" get-port "5.1.1" get-stream "6.0.0" - git-url-parse "13.1.0" - glob-parent "5.1.2" + git-url-parse "14.0.0" + glob-parent "6.0.2" globby "11.1.0" graceful-fs "4.2.11" has-unicode "2.0.1" import-local "3.1.0" ini "^1.3.8" - init-package-json "5.0.0" + init-package-json "6.0.3" inquirer "^8.2.4" is-ci "3.0.1" is-stream "2.0.0" jest-diff ">=29.4.3 < 30" js-yaml "4.1.0" - libnpmaccess "7.0.2" - libnpmpublish "7.3.0" + libnpmaccess "8.0.6" + libnpmpublish "9.0.9" load-json-file "6.2.0" lodash "^4.17.21" make-dir "4.0.0" minimatch "3.0.5" multimatch "5.0.0" node-fetch "2.6.7" - npm-package-arg "8.1.1" - npm-packlist "5.1.1" - npm-registry-fetch "^14.0.5" - npmlog "^6.0.2" - nx ">=17.1.2 < 19" + npm-package-arg "11.0.2" + npm-packlist "8.0.2" + npm-registry-fetch "^17.1.0" + nx ">=17.1.2 < 20" p-map "4.0.0" p-map-series "2.1.0" p-pipe "3.1.0" p-queue "6.6.2" p-reduce "2.1.0" p-waterfall "2.1.1" - pacote "^17.0.5" + pacote "^18.0.6" pify "5.0.0" read-cmd-shim "4.0.0" - read-package-json "6.0.4" resolve-from "5.0.0" rimraf "^4.4.1" semver "^7.3.8" + set-blocking "^2.0.0" signal-exit "3.0.7" slash "3.0.0" - ssri "^9.0.1" + ssri "^10.0.6" + string-width "^4.2.3" + strip-ansi "^6.0.1" strong-log-transformer "2.1.0" - tar "6.1.11" + tar "6.2.1" temp-dir "1.0.0" typescript ">=3 < 6" upath "2.0.1" - uuid "^9.0.0" + uuid "^10.0.0" validate-npm-package-license "3.0.4" - validate-npm-package-name "5.0.0" + validate-npm-package-name "5.0.1" + wide-align "1.1.5" write-file-atomic "5.0.1" write-pkg "4.0.0" yargs "17.7.2" @@ -7653,35 +7176,27 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= +libnpmaccess@8.0.6: + version "8.0.6" + resolved "https://registry.yarnpkg.com/libnpmaccess/-/libnpmaccess-8.0.6.tgz#73be4c236258babc0a0bca6d3b6a93a6adf937cf" + integrity sha512-uM8DHDEfYG6G5gVivVl+yQd4pH3uRclHC59lzIbSvy7b5FEwR+mU49Zq1jEyRtRFv7+M99mUW9S0wL/4laT4lw== dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" + npm-package-arg "^11.0.2" + npm-registry-fetch "^17.0.1" -libnpmaccess@7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/libnpmaccess/-/libnpmaccess-7.0.2.tgz#7f056c8c933dd9c8ba771fa6493556b53c5aac52" - integrity sha512-vHBVMw1JFMTgEk15zRsJuSAg7QtGGHpUSEfnbcRL1/gTBag9iEfJbyjpDmdJmwMhvpoLoNBtdAUCdGnaP32hhw== - dependencies: - npm-package-arg "^10.1.0" - npm-registry-fetch "^14.0.3" - -libnpmpublish@7.3.0: - version "7.3.0" - resolved "https://registry.yarnpkg.com/libnpmpublish/-/libnpmpublish-7.3.0.tgz#2ceb2b36866d75a6cd7b4aa748808169f4d17e37" - integrity sha512-fHUxw5VJhZCNSls0KLNEG0mCD2PN1i14gH5elGOgiVnU3VgTcRahagYP2LKI1m0tFCJ+XrAm0zVYyF5RCbXzcg== - dependencies: - ci-info "^3.6.1" - normalize-package-data "^5.0.0" - npm-package-arg "^10.1.0" - npm-registry-fetch "^14.0.3" - proc-log "^3.0.0" +libnpmpublish@9.0.9: + version "9.0.9" + resolved "https://registry.yarnpkg.com/libnpmpublish/-/libnpmpublish-9.0.9.tgz#e737378c09f09738377d2a276734be35cffb85e2" + integrity sha512-26zzwoBNAvX9AWOPiqqF6FG4HrSCPsHFkQm7nT+xU1ggAujL/eae81RnCv4CJ2In9q9fh10B88sYSzKCUh/Ghg== + dependencies: + ci-info "^4.0.0" + normalize-package-data "^6.0.1" + npm-package-arg "^11.0.2" + npm-registry-fetch "^17.0.1" + proc-log "^4.2.0" semver "^7.3.7" - sigstore "^1.4.0" - ssri "^10.0.1" + sigstore "^2.2.0" + ssri "^10.0.6" lie@~3.3.0: version "3.3.0" @@ -7700,30 +7215,30 @@ lines-and-columns@~2.0.3: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-2.0.4.tgz#d00318855905d2660d8c0822e3f5a4715855fc42" integrity sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A== -lit-element@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/lit-element/-/lit-element-4.0.4.tgz#e0b37ebbe2394bcb9578d611a409f49475dff361" - integrity sha512-98CvgulX6eCPs6TyAIQoJZBCQPo80rgXR+dVBs61cstJXqtI+USQZAbA4gFHh6L/mxBx9MrgPLHLsUgDUHAcCQ== +lit-element@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/lit-element/-/lit-element-4.1.0.tgz#cea3eb25f15091e3fade07c4d917fa6aaf56ba7d" + integrity sha512-gSejRUQJuMQjV2Z59KAS/D4iElUhwKpIyJvZ9w+DIagIQjfJnhR20h2Q5ddpzXGS+fF0tMZ/xEYGMnKmaI/iww== dependencies: "@lit-labs/ssr-dom-shim" "^1.2.0" "@lit/reactive-element" "^2.0.4" - lit-html "^3.1.2" + lit-html "^3.2.0" -lit-html@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/lit-html/-/lit-html-3.1.2.tgz#6655ce82367472de7680c62b1bcb0beb0e426fa1" - integrity sha512-3OBZSUrPnAHoKJ9AMjRL/m01YJxQMf+TMHanNtTHG68ubjnZxK0RFl102DPzsw4mWnHibfZIBJm3LWCZ/LmMvg== +lit-html@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lit-html/-/lit-html-3.2.0.tgz#cb09071a8a1f5f0850873f9143f18f0260be1fda" + integrity sha512-pwT/HwoxqI9FggTrYVarkBKFN9MlTUpLrDHubTmW4SrkL3kkqW5gxwbxMMUnbbRHBC0WTZnYHcjDSCM559VyfA== dependencies: "@types/trusted-types" "^2.0.2" lit@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/lit/-/lit-3.1.2.tgz#f276258e8a56593f1d834a5fd00a7eb5e891ae73" - integrity sha512-VZx5iAyMtX7CV4K8iTLdCkMaYZ7ipjJZ0JcSdJ0zIdGxxyurjIn7yuuSxNBD7QmjvcNJwr0JS4cAdAtsy7gZ6w== + version "3.2.0" + resolved "https://registry.yarnpkg.com/lit/-/lit-3.2.0.tgz#2189d72bccbc335f733a67bfbbd295f015e68e05" + integrity sha512-s6tI33Lf6VpDu7u4YqsSX78D28bYQulM+VAzsGch4fx2H0eLZnJsUBsPWmGYSGoKDNbjtRv02rio1o+UdPVwvw== dependencies: "@lit/reactive-element" "^2.0.4" - lit-element "^4.0.4" - lit-html "^3.1.2" + lit-element "^4.1.0" + lit-html "^3.2.0" load-json-file@6.2.0: version "6.2.0" @@ -7738,7 +7253,7 @@ load-json-file@6.2.0: load-json-file@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" - integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + integrity sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw== dependencies: graceful-fs "^4.1.2" parse-json "^4.0.0" @@ -7748,7 +7263,7 @@ load-json-file@^4.0.0: locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== dependencies: p-locate "^2.0.0" path-exists "^3.0.0" @@ -7775,19 +7290,19 @@ lodash-es@4.17.21: lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== lodash.ismatch@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37" - integrity sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc= + integrity sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g== lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash@^4.17.10, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.17.4: +lodash@^4.17.10, lodash@^4.17.21, lodash@^4.17.4: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -7808,7 +7323,7 @@ log-symbols@^4.0.0, log-symbols@^4.1.0: long@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/long/-/long-3.2.0.tgz#d821b7138ca1cb581c172990ef14db200b5c474b" - integrity sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s= + integrity sha512-ZYvPPOMqUwPoDsbJaR10iQJYnMuZhRTvHYl62ErLIEX7RgFlziSBUUvrt3OVfc47QlHHpzPZYP17g3Fv7oeJkg== long@^5.2.1: version "5.2.3" @@ -7822,10 +7337,10 @@ loose-envify@^1.1.0, loose-envify@^1.4.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" -lru-cache@^10.0.1, lru-cache@^10.2.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" - integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== +lru-cache@^10.0.1, lru-cache@^10.2.0, lru-cache@^10.2.2: + version "10.4.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== lru-cache@^4.0.1: version "4.1.5" @@ -7835,6 +7350,13 @@ lru-cache@^4.0.1: pseudomap "^1.0.2" yallist "^2.1.2" +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" @@ -7842,7 +7364,7 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -lru-cache@^7.14.1, lru-cache@^7.5.1, lru-cache@^7.7.1: +lru-cache@^7.14.1: version "7.18.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== @@ -7869,7 +7391,7 @@ magic-string@^0.25.3: dependencies: sourcemap-codec "^1.4.8" -make-dir@4.0.0: +make-dir@4.0.0, make-dir@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== @@ -7884,43 +7406,15 @@ make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" -make-dir@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - make-error@^1.1.1: version "1.3.6" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== -make-fetch-happen@^11.0.0, make-fetch-happen@^11.0.1, make-fetch-happen@^11.1.1: - version "11.1.1" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz#85ceb98079584a9523d4bf71d32996e7e208549f" - integrity sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w== - dependencies: - agentkeepalive "^4.2.1" - cacache "^17.0.0" - http-cache-semantics "^4.1.1" - http-proxy-agent "^5.0.0" - https-proxy-agent "^5.0.0" - is-lambda "^1.0.1" - lru-cache "^7.7.1" - minipass "^5.0.0" - minipass-fetch "^3.0.0" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.4" - negotiator "^0.6.3" - promise-retry "^2.0.1" - socks-proxy-agent "^7.0.0" - ssri "^10.0.0" - -make-fetch-happen@^13.0.0: - version "13.0.0" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-13.0.0.tgz#705d6f6cbd7faecb8eac2432f551e49475bfedf0" - integrity sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A== +make-fetch-happen@^13.0.0, make-fetch-happen@^13.0.1: + version "13.0.1" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-13.0.1.tgz#273ba2f78f45e1f3a6dca91cede87d9fa4821e36" + integrity sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA== dependencies: "@npmcli/agent" "^2.0.0" cacache "^18.0.0" @@ -7931,31 +7425,20 @@ make-fetch-happen@^13.0.0: minipass-flush "^1.0.5" minipass-pipeline "^1.2.4" negotiator "^0.6.3" + proc-log "^4.2.0" promise-retry "^2.0.1" ssri "^10.0.0" -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= - map-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= + integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== map-obj@^4.0.0: version "4.3.0" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= - dependencies: - object-visit "^1.0.0" - mapbox-gl@^1.13.2: version "1.13.3" resolved "https://registry.yarnpkg.com/mapbox-gl/-/mapbox-gl-1.13.3.tgz#e024829cfc353f6e99275592061d15dfd7f41a71" @@ -7984,6 +7467,11 @@ mapbox-gl@^1.13.2: tinyqueue "^2.0.3" vt-pbf "^3.1.1" +marked@~12.0.2: + version "12.0.2" + resolved "https://registry.yarnpkg.com/marked/-/marked-12.0.2.tgz#b31578fe608b599944c69807b00f18edab84647e" + integrity sha512-qXUm7e/YKFoqFPYPa3Ukg9xlI5cyAtGmyEIzMfW//m6kXwCy2Ps9DYf5ioijFKQ8qyuscrHoY04iJGctu2Kg0Q== + md5@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f" @@ -8049,56 +7537,25 @@ micromark@~2.11.0: debug "^4.0.0" parse-entities "^2.0.0" -micromatch@^3.1.10, micromatch@^3.1.4: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - micromatch@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" - integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: - braces "^3.0.1" - picomatch "^2.2.3" - -mime-db@1.43.0: - version "1.43.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" - integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== + braces "^3.0.3" + picomatch "^2.3.1" -mime-db@1.45.0: - version "1.45.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.45.0.tgz#cceeda21ccd7c3a745eba2decd55d4b73e7879ea" - integrity sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w== +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.0.1: - version "2.1.26" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" - integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== +mime-types@^2.0.1, mime-types@^2.1.12, mime-types@~2.1.19: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: - mime-db "1.43.0" - -mime-types@^2.1.12, mime-types@~2.1.19: - version "2.1.28" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.28.tgz#1160c4757eab2c5363888e005273ecf79d2a0ecd" - integrity sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ== - dependencies: - mime-db "1.45.0" + mime-db "1.52.0" mimic-fn@^1.0.0: version "1.2.0" @@ -8113,7 +7570,7 @@ mimic-fn@^2.1.0: min-document@^2.19.0: version "2.19.0" resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" - integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU= + integrity sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ== dependencies: dom-walk "^0.1.0" @@ -8157,10 +7614,10 @@ minimatch@^8.0.2: dependencies: brace-expansion "^2.0.1" -minimatch@^9.0.0, minimatch@^9.0.1, minimatch@^9.0.3: - version "9.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" - integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== +minimatch@^9.0.0, minimatch@^9.0.4: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== dependencies: brace-expansion "^2.0.1" @@ -8173,23 +7630,11 @@ minimist-options@4.1.0: is-plain-obj "^1.1.0" kind-of "^6.0.3" -minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6, minimist@~1.2.6: - version "1.2.7" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" - integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== - -minimist@^1.2.8, minimist@~1.2.0: +minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.8, minimist@~1.2.0, minimist@~1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -minipass-collect@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" - integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== - dependencies: - minipass "^3.0.0" - minipass-collect@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-2.0.1.tgz#1621bc77e12258a12c60d34e2276ec5c20680863" @@ -8198,9 +7643,9 @@ minipass-collect@^2.0.1: minipass "^7.0.3" minipass-fetch@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-3.0.4.tgz#4d4d9b9f34053af6c6e597a64be8e66e42bf45b7" - integrity sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg== + version "3.0.5" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-3.0.5.tgz#f0f97e40580affc4a35cc4a1349f05ae36cb1e4c" + integrity sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg== dependencies: minipass "^7.0.3" minipass-sized "^1.0.3" @@ -8215,14 +7660,6 @@ minipass-flush@^1.0.5: dependencies: minipass "^3.0.0" -minipass-json-stream@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz#7edbb92588fbfc2ff1db2fc10397acb7b6b44aa7" - integrity sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg== - dependencies: - jsonparse "^1.3.1" - minipass "^3.0.0" - minipass-pipeline@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" @@ -8237,7 +7674,7 @@ minipass-sized@^1.0.3: dependencies: minipass "^3.0.0" -minipass@^3.0.0, minipass@^3.1.1: +minipass@^3.0.0: version "3.3.6" resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== @@ -8254,10 +7691,10 @@ minipass@^5.0.0: resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.2, minipass@^7.0.3, minipass@^7.0.4: - version "7.0.4" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" - integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.2, minipass@^7.0.3, minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== minizlib@^2.1.1, minizlib@^2.1.2: version "2.1.2" @@ -8272,18 +7709,10 @@ mitt@3.0.1: resolved "https://registry.yarnpkg.com/mitt/-/mitt-3.0.1.tgz#ea36cf0cc30403601ae074c8f77b7092cdab36d1" integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw== -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - mjolnir.js@^2.7.0: - version "2.7.1" - resolved "https://registry.yarnpkg.com/mjolnir.js/-/mjolnir.js-2.7.1.tgz#4e12590fe168b377c9c669b9c31aa5a62f8b8460" - integrity sha512-72BeUWgTv2cj5aZQKpwL8caNUFhXZ9bDm1hxpNj70XJQ62IBnTZmtv/WPxJvtaVNhzNo+D2U8O6ryNI0zImYcw== + version "2.7.3" + resolved "https://registry.yarnpkg.com/mjolnir.js/-/mjolnir.js-2.7.3.tgz#b71902edaa387f14c7fe6e9b1f611c0ce814240a" + integrity sha512-Z5z/+FzZqOSO3juSVKV3zcm4R2eAlWwlKMcqHmyFEJAaLILNcDKnIbnb4/kbcGyIuhtdWrzu8WOIR7uM6I34aw== dependencies: "@types/hammerjs" "^2.0.41" hammerjs "^2.0.8" @@ -8293,6 +7722,18 @@ mkdirp@^1.0.3: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== +mock-property@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/mock-property/-/mock-property-1.0.3.tgz#3e37c50a56609d548cabd56559fde3dd8767b10c" + integrity sha512-2emPTb1reeLLYwHxyVx993iYyCHEiRRO+y8NFXFPL5kl5q14sgTK76cXyEKkeKCHeRw35SfdkUJ10Q1KfHuiIQ== + dependencies: + define-data-property "^1.1.1" + functions-have-names "^1.2.3" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + hasown "^2.0.0" + isarray "^2.0.5" + modify-values@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" @@ -8310,16 +7751,16 @@ moment@^2.24.0, moment@^2.29.4: resolved "https://registry.yarnpkg.com/moment/-/moment-2.30.1.tgz#f8c91c07b7a786e30c59926df530b4eac96974ae" integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how== -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -ms@2.1.2, ms@^2.0.0, ms@^2.1.1: +ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + multimatch@5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-5.0.0.tgz#932b800963cea7a31a033328fa1e0c3a1874dbe6" @@ -8341,49 +7782,32 @@ mute-stream@0.0.8: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== -mute-stream@^1.0.0, mute-stream@~1.0.0: +mute-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-1.0.0.tgz#e31bd9fe62f0aed23520aa4324ea6671531e013e" integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA== -nanoid@^3.3.6: - version "3.3.6" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" - integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" +nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== ndarray-ops@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/ndarray-ops/-/ndarray-ops-1.2.2.tgz#59e88d2c32a7eebcb1bc690fae141579557a614e" - integrity sha1-WeiNLDKn7ryxvGkPrhQVeVV6YU4= + integrity sha512-BppWAFRjMYF7N/r6Ie51q6D4fs0iiGmeXIACKY66fLpnwIui3Wc3CXiD/30mgLbDjPpSLrsqcp3Z62+IcHZsDw== dependencies: cwise-compiler "^1.0.0" ndarray-pack@^1.1.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ndarray-pack/-/ndarray-pack-1.2.1.tgz#8caebeaaa24d5ecf70ff86020637977da8ee585a" - integrity sha1-jK6+qqJNXs9w/4YCBjeXfajuWFo= + integrity sha512-51cECUJMT0rUZNQa09EoKsnFeDL4x2dHRT0VR5U2H5ZgEcm95ZDWcMA5JShroXjHOejmAD/fg8+H+OvUnVXz2g== dependencies: cwise-compiler "^1.1.2" ndarray "^1.0.13" @@ -8414,7 +7838,7 @@ netmask@^2.0.2: node-bitmap@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/node-bitmap/-/node-bitmap-0.0.1.tgz#180eac7003e0c707618ef31368f62f84b2a69091" - integrity sha1-GA6scAPgxwdhjvMTaPYvhLKmkJE= + integrity sha512-Jx5lPaaLdIaOsj2mVLWMWulXF6GQVdyLvNSxmiYCvZ8Ma2hfKX0POoR2kgKOqz+oFsRreq0yYZjQ2wjE9VNzCA== node-fetch@2.6.7: version "2.6.7" @@ -8423,7 +7847,7 @@ node-fetch@2.6.7: dependencies: whatwg-url "^5.0.0" -node-fetch@^2.6.0, node-fetch@^2.6.12, node-fetch@^2.6.7: +node-fetch@^2.6.0, node-fetch@^2.6.7: version "2.7.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== @@ -8431,9 +7855,9 @@ node-fetch@^2.6.0, node-fetch@^2.6.12, node-fetch@^2.6.7: whatwg-url "^5.0.0" node-gyp@^10.0.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-10.1.0.tgz#75e6f223f2acb4026866c26a2ead6aab75a8ca7e" - integrity sha512-B4J5M1cABxPc5PwfjhbV5hoy2DP9p8lFXASnEN6hugXOa61416tnTZ29x9sSwAd0o99XNIcpvDDy1swAExsVKA== + version "10.2.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-10.2.0.tgz#80101c4aa4f7ab225f13fcc8daaaac4eb1a8dd86" + integrity sha512-sp3FonBAaFe4aYTcFdZUn2NYkbP7xroPGYvQmP4Nl5PxamznItBnNCgjrVTKrEfQynInMsJvZrdmqUnysCJ8rw== dependencies: env-paths "^2.2.0" exponential-backoff "^3.1.1" @@ -8441,9 +7865,9 @@ node-gyp@^10.0.0: graceful-fs "^4.2.6" make-fetch-happen "^13.0.0" nopt "^7.0.0" - proc-log "^3.0.0" + proc-log "^4.1.0" semver "^7.3.5" - tar "^6.1.2" + tar "^6.2.1" which "^4.0.0" node-machine-id@1.1.12: @@ -8451,15 +7875,15 @@ node-machine-id@1.1.12: resolved "https://registry.yarnpkg.com/node-machine-id/-/node-machine-id-1.1.12.tgz#37904eee1e59b320bb9c5d6c0a59f3b469cb6267" integrity sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ== -node-releases@^1.1.75: - version "1.1.75" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.75.tgz#6dd8c876b9897a1b8e5a02de26afa79bb54ebbfe" - integrity sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw== +node-releases@^2.0.18: + version "2.0.18" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" + integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== -nopt@^7.0.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-7.2.0.tgz#067378c68116f602f552876194fd11f1292503d7" - integrity sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA== +nopt@^7.0.0, nopt@^7.2.1: + version "7.2.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-7.2.1.tgz#1cac0eab9b8e97c9093338446eddd40b2c8ca1e7" + integrity sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w== dependencies: abbrev "^2.0.0" @@ -8483,89 +7907,40 @@ normalize-package-data@^3.0.0, normalize-package-data@^3.0.3: semver "^7.3.4" validate-npm-package-license "^3.0.1" -normalize-package-data@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-5.0.0.tgz#abcb8d7e724c40d88462b84982f7cbf6859b4588" - integrity sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q== - dependencies: - hosted-git-info "^6.0.0" - is-core-module "^2.8.1" - semver "^7.3.5" - validate-npm-package-license "^3.0.4" - -normalize-package-data@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-6.0.0.tgz#68a96b3c11edd462af7189c837b6b1064a484196" - integrity sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg== +normalize-package-data@^6.0.0, normalize-package-data@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-6.0.2.tgz#a7bc22167fe24025412bcff0a9651eb768b03506" + integrity sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g== dependencies: hosted-git-info "^7.0.0" - is-core-module "^2.8.1" semver "^7.3.5" validate-npm-package-license "^3.0.4" -normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= - dependencies: - remove-trailing-separator "^1.0.1" - normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -npm-bundled@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.2.tgz#944c78789bd739035b70baa2ca5cc32b8d860bc1" - integrity sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ== - dependencies: - npm-normalize-package-bin "^1.0.1" - npm-bundled@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-3.0.0.tgz#7e8e2f8bb26b794265028491be60321a25a39db7" - integrity sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ== + version "3.0.1" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-3.0.1.tgz#cca73e15560237696254b10170d8f86dad62da25" + integrity sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ== dependencies: npm-normalize-package-bin "^3.0.0" -npm-install-checks@^6.0.0: +npm-install-checks@^6.0.0, npm-install-checks@^6.2.0: version "6.3.0" resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-6.3.0.tgz#046552d8920e801fa9f919cad569545d60e826fe" integrity sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw== dependencies: - semver "^7.1.1" - -npm-normalize-package-bin@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" - integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== - -npm-normalize-package-bin@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz#25447e32a9a7de1f51362c61a559233b89947832" - integrity sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ== - -npm-package-arg@8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-8.1.1.tgz#00ebf16ac395c63318e67ce66780a06db6df1b04" - integrity sha512-CsP95FhWQDwNqiYS+Q0mZ7FAEDytDZAkNxQqea6IaAFJTAY9Lhhqyl0irU/6PMc7BGfUmnsbHcqxJD7XuVM/rg== - dependencies: - hosted-git-info "^3.0.6" - semver "^7.0.0" - validate-npm-package-name "^3.0.0" - -npm-package-arg@^10.0.0, npm-package-arg@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-10.1.0.tgz#827d1260a683806685d17193073cc152d3c7e9b1" - integrity sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA== - dependencies: - hosted-git-info "^6.0.0" - proc-log "^3.0.0" - semver "^7.3.5" - validate-npm-package-name "^5.0.0" + semver "^7.1.1" + +npm-normalize-package-bin@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz#25447e32a9a7de1f51362c61a559233b89947832" + integrity sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ== -npm-package-arg@^11.0.0: +npm-package-arg@11.0.2: version "11.0.2" resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-11.0.2.tgz#1ef8006c4a9e9204ddde403035f7ff7d718251ca" integrity sha512-IGN0IAwmhDJwy13Wc8k+4PEbTPhpJnMtfR53ZbOyjkvmEcLS4nCwp6mvMWjS5sUjeiW3mpx6cHmuhKEu9XmcQw== @@ -8575,56 +7950,43 @@ npm-package-arg@^11.0.0: semver "^7.3.5" validate-npm-package-name "^5.0.0" -npm-packlist@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-5.1.1.tgz#79bcaf22a26b6c30aa4dd66b976d69cc286800e0" - integrity sha512-UfpSvQ5YKwctmodvPPkK6Fwk603aoVsf8AEbmVKAEECrfvL8SSe1A2YIwrJ6xmTHAITKPwwZsWo7WwEbNk0kxw== +npm-package-arg@^11.0.0, npm-package-arg@^11.0.2: + version "11.0.3" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-11.0.3.tgz#dae0c21199a99feca39ee4bfb074df3adac87e2d" + integrity sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw== dependencies: - glob "^8.0.1" - ignore-walk "^5.0.1" - npm-bundled "^1.1.2" - npm-normalize-package-bin "^1.0.1" + hosted-git-info "^7.0.0" + proc-log "^4.0.0" + semver "^7.3.5" + validate-npm-package-name "^5.0.0" -npm-packlist@^8.0.0: +npm-packlist@8.0.2, npm-packlist@^8.0.0: version "8.0.2" resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-8.0.2.tgz#5b8d1d906d96d21c85ebbeed2cf54147477c8478" integrity sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA== dependencies: ignore-walk "^6.0.4" -npm-pick-manifest@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-9.0.0.tgz#f87a4c134504a2c7931f2bb8733126e3c3bb7e8f" - integrity sha512-VfvRSs/b6n9ol4Qb+bDwNGUXutpy76x6MARw/XssevE0TnctIKcmklJZM5Z7nqs5z5aW+0S63pgCNbpkUNNXBg== +npm-pick-manifest@^9.0.0, npm-pick-manifest@^9.0.1: + version "9.1.0" + resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-9.1.0.tgz#83562afde52b0b07cb6244361788d319ce7e8636" + integrity sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA== dependencies: npm-install-checks "^6.0.0" npm-normalize-package-bin "^3.0.0" npm-package-arg "^11.0.0" semver "^7.3.5" -npm-registry-fetch@^14.0.3, npm-registry-fetch@^14.0.5: - version "14.0.5" - resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz#fe7169957ba4986a4853a650278ee02e568d115d" - integrity sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA== - dependencies: - make-fetch-happen "^11.0.0" - minipass "^5.0.0" - minipass-fetch "^3.0.0" - minipass-json-stream "^1.0.1" - minizlib "^2.1.2" - npm-package-arg "^10.0.0" - proc-log "^3.0.0" - -npm-registry-fetch@^16.0.0: - version "16.2.1" - resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-16.2.1.tgz#c367df2d770f915da069ff19fd31762f4bca3ef1" - integrity sha512-8l+7jxhim55S85fjiDGJ1rZXBWGtRLi1OSb4Z3BPLObPuIaeKRlPRiYMSHU4/81ck3t71Z+UwDDl47gcpmfQQA== +npm-registry-fetch@^17.0.0, npm-registry-fetch@^17.0.1, npm-registry-fetch@^17.1.0: + version "17.1.0" + resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-17.1.0.tgz#fb69e8e762d456f08bda2f5f169f7638fb92beb1" + integrity sha512-5+bKQRH0J1xG1uZ1zMNvxW0VEyoNWgJpY9UDuluPFLKDfJ9u2JmmjmTJV1srBGQOROfdBMiVvnH2Zvpbm+xkVA== dependencies: - "@npmcli/redact" "^1.1.0" + "@npmcli/redact" "^2.0.0" + jsonparse "^1.3.1" make-fetch-happen "^13.0.0" minipass "^7.0.2" minipass-fetch "^3.0.0" - minipass-json-stream "^1.0.1" minizlib "^2.1.2" npm-package-arg "^11.0.0" proc-log "^4.0.0" @@ -8632,7 +7994,7 @@ npm-registry-fetch@^16.0.0: npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== dependencies: path-key "^2.0.0" @@ -8643,44 +8005,35 @@ npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" -npmlog@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830" - integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg== - dependencies: - are-we-there-yet "^3.0.0" - console-control-strings "^1.1.0" - gauge "^4.0.3" - set-blocking "^2.0.0" - nwsapi@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.2.tgz#e5418863e7905df67d51ec95938d67bf801f0bb0" - integrity sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw== + version "2.2.12" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.12.tgz#fb6af5c0ec35b27b4581eb3bbad34ec9e5c696f8" + integrity sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w== -nx@18.3.3, "nx@>=17.1.2 < 19": - version "18.3.3" - resolved "https://registry.yarnpkg.com/nx/-/nx-18.3.3.tgz#ab96811961b631efd4f0c83550e92f7b0a625e83" - integrity sha512-GqC5ANfTWV6SFbgquZwuRMI2Z2nO0c0Yx4JzM3x32aJOgXsmRml3WcV0a5648bIXSen34gylHYl2EHaxVWkzNQ== +nx@19.6.2, "nx@>=17.1.2 < 20": + version "19.6.2" + resolved "https://registry.yarnpkg.com/nx/-/nx-19.6.2.tgz#774ddb2788c3f837d4c88fea2512022422ac979c" + integrity sha512-uUC9glC/QDsDhfOSzWl1id9rfUVepVwLhwBGRMeO5K6+Tju7qAsRGZ2NGPoUz6J1AZuWtlKZcr+MOSK2U4+2wQ== dependencies: - "@nrwl/tao" "18.3.3" + "@napi-rs/wasm-runtime" "0.2.4" + "@nrwl/tao" "19.6.2" "@yarnpkg/lockfile" "^1.1.0" "@yarnpkg/parsers" "3.0.0-rc.46" - "@zkochan/js-yaml" "0.0.6" - axios "^1.6.0" + "@zkochan/js-yaml" "0.0.7" + axios "^1.7.4" chalk "^4.1.0" cli-cursor "3.1.0" cli-spinners "2.6.1" cliui "^8.0.1" - dotenv "~16.3.1" - dotenv-expand "~10.0.0" + dotenv "~16.4.5" + dotenv-expand "~11.0.6" enquirer "~2.3.6" figures "3.2.0" flat "^5.0.2" + front-matter "^4.0.2" fs-extra "^11.1.0" ignore "^5.0.4" jest-diff "^29.4.1" - js-yaml "4.1.0" jsonc-parser "3.2.0" lines-and-columns "~2.0.3" minimatch "9.0.3" @@ -8698,16 +8051,16 @@ nx@18.3.3, "nx@>=17.1.2 < 19": yargs "^17.6.2" yargs-parser "21.1.1" optionalDependencies: - "@nx/nx-darwin-arm64" "18.3.3" - "@nx/nx-darwin-x64" "18.3.3" - "@nx/nx-freebsd-x64" "18.3.3" - "@nx/nx-linux-arm-gnueabihf" "18.3.3" - "@nx/nx-linux-arm64-gnu" "18.3.3" - "@nx/nx-linux-arm64-musl" "18.3.3" - "@nx/nx-linux-x64-gnu" "18.3.3" - "@nx/nx-linux-x64-musl" "18.3.3" - "@nx/nx-win32-arm64-msvc" "18.3.3" - "@nx/nx-win32-x64-msvc" "18.3.3" + "@nx/nx-darwin-arm64" "19.6.2" + "@nx/nx-darwin-x64" "19.6.2" + "@nx/nx-freebsd-x64" "19.6.2" + "@nx/nx-linux-arm-gnueabihf" "19.6.2" + "@nx/nx-linux-arm64-gnu" "19.6.2" + "@nx/nx-linux-arm64-musl" "19.6.2" + "@nx/nx-linux-x64-gnu" "19.6.2" + "@nx/nx-linux-x64-musl" "19.6.2" + "@nx/nx-win32-arm64-msvc" "19.6.2" + "@nx/nx-win32-x64-msvc" "19.6.2" oauth-sign@~0.9.0: version "0.9.0" @@ -8717,146 +8070,77 @@ oauth-sign@~0.9.0: object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-inspect@^1.11.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" - integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== - -object-inspect@^1.12.2, object-inspect@^1.9.0, object-inspect@~1.12.2: - version "1.12.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" - integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== object-inspect@^1.13.1: - version "1.13.1" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" - integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== + version "1.13.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" + integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== -object-inspect@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" - integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== +object-inspect@~1.12.3: + version "1.12.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== -object-is@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.2.tgz#6b80eb84fe451498f65007982f035a5b445edec4" - integrity sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ== +object-is@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.6.tgz#1a6a53aed2dd8f7e6775ff870bea58545956ab07" + integrity sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" -object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: +object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= - dependencies: - isobject "^3.0.0" - -object.assign@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" - integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== - dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" - -object.assign@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" - integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - has-symbols "^1.0.1" - object-keys "^1.1.1" - -object.assign@^4.1.4: - version "4.1.4" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" - integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== +object.assign@^4.1.4, object.assign@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" + call-bind "^1.0.5" + define-properties "^1.2.1" has-symbols "^1.0.3" object-keys "^1.1.1" -object.entries@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.4.tgz#43ccf9a50bc5fd5b649d45ab1a579f24e088cafd" - integrity sha512-h4LWKWE+wKQGhtMjZEBud7uLGhqyLwj8fpHOarZhD2uY3C9cRtk57VQ89ke3moByLXMedqs3XCHzyb4AmA2DjA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.18.2" - -object.fromentries@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.4.tgz#26e1ba5c4571c5c6f0890cef4473066456a120b8" - integrity sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ== +object.entries@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41" + integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.18.0-next.2" - has "^1.0.3" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" -object.fromentries@^2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.7.tgz#71e95f441e9a0ea6baf682ecaaf37fa2a8d7e616" - integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA== +object.fromentries@^2.0.7, object.fromentries@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" + integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" object.groupby@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.1.tgz#d41d9f3c8d6c778d9cbac86b4ee9f5af103152ee" - integrity sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" - -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= - dependencies: - isobject "^3.0.1" - -object.values@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.4.tgz#0d273762833e816b693a637d30073e7051535b30" - integrity sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg== + version "1.0.3" + resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" + integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.18.2" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" -object.values@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a" - integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng== +object.values@^1.1.6, object.values@^1.1.7, object.values@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" + integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" ocular-dev-tools@2.0.0-alpha.33: version "2.0.0-alpha.33" @@ -8911,14 +8195,14 @@ omggif@^1.0.5: once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" onetime@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= + integrity sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ== dependencies: mimic-fn "^1.0.0" @@ -8938,29 +8222,17 @@ open@^8.4.0: is-docker "^2.1.1" is-wsl "^2.2.0" -optionator@^0.8.1: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - optionator@^0.9.3: - version "0.9.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" - integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + version "0.9.4" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== dependencies: - "@aashutoshrathi/word-wrap" "^1.2.3" deep-is "^0.1.3" fast-levenshtein "^2.0.6" levn "^0.4.1" prelude-ls "^1.2.1" type-check "^0.4.0" + word-wrap "^1.2.5" ora@5.3.0: version "5.3.0" @@ -8994,17 +8266,17 @@ ora@^5.4.1: os-shim@^0.1.2: version "0.1.3" resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917" - integrity sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc= + integrity sha512-jd0cvB8qQ5uVt0lvCIexBaROw1KyKm5sbulg2fWOHjETisuCzWyt+eTZKEMs8v6HwzoGs8xik26jg7eCM6pS+A== os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== p-limit@^1.1.0: version "1.3.0" @@ -9030,7 +8302,7 @@ p-limit@^3.0.2: p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== dependencies: p-limit "^1.1.0" @@ -9088,7 +8360,7 @@ p-timeout@^3.2.0: p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== p-try@^2.0.0: version "2.2.0" @@ -9103,48 +8375,51 @@ p-waterfall@2.1.1: p-reduce "^2.0.0" pac-proxy-agent@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz#6b9ddc002ec3ff0ba5fdf4a8a21d363bcc612d75" - integrity sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A== + version "7.0.2" + resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-7.0.2.tgz#0fb02496bd9fb8ae7eb11cfd98386daaac442f58" + integrity sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg== dependencies: "@tootallnate/quickjs-emscripten" "^0.23.0" agent-base "^7.0.2" debug "^4.3.4" get-uri "^6.0.1" http-proxy-agent "^7.0.0" - https-proxy-agent "^7.0.2" - pac-resolver "^7.0.0" - socks-proxy-agent "^8.0.2" + https-proxy-agent "^7.0.5" + pac-resolver "^7.0.1" + socks-proxy-agent "^8.0.4" -pac-resolver@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-7.0.0.tgz#79376f1ca26baf245b96b34c339d79bff25e900c" - integrity sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg== +pac-resolver@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-7.0.1.tgz#54675558ea368b64d210fd9c92a640b5f3b8abb6" + integrity sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg== dependencies: degenerator "^5.0.0" - ip "^1.1.8" netmask "^2.0.2" -pacote@^17.0.5: - version "17.0.7" - resolved "https://registry.yarnpkg.com/pacote/-/pacote-17.0.7.tgz#14b59a9bf5e3442c891af86825b97b7d72f48fba" - integrity sha512-sgvnoUMlkv9xHwDUKjKQFXVyUi8dtJGKp3vg6sYy+TxbDic5RjZCHF3ygv0EJgNRZ2GfRONjlKPUfokJ9lDpwQ== +package-json-from-dist@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00" + integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw== + +pacote@^18.0.0, pacote@^18.0.6: + version "18.0.6" + resolved "https://registry.yarnpkg.com/pacote/-/pacote-18.0.6.tgz#ac28495e24f4cf802ef911d792335e378e86fac7" + integrity sha512-+eK3G27SMwsB8kLIuj4h1FUhHtwiEUo21Tw8wNjmvdlpOEr613edv+8FUsTj/4F/VN5ywGE19X18N7CC2EJk6A== dependencies: "@npmcli/git" "^5.0.0" "@npmcli/installed-package-contents" "^2.0.1" + "@npmcli/package-json" "^5.1.0" "@npmcli/promise-spawn" "^7.0.0" - "@npmcli/run-script" "^7.0.0" + "@npmcli/run-script" "^8.0.0" cacache "^18.0.0" fs-minipass "^3.0.0" minipass "^7.0.2" npm-package-arg "^11.0.0" npm-packlist "^8.0.0" npm-pick-manifest "^9.0.0" - npm-registry-fetch "^16.0.0" + npm-registry-fetch "^17.0.0" proc-log "^4.0.0" promise-retry "^2.0.1" - read-package-json "^7.0.0" - read-package-json-fast "^3.0.0" sigstore "^2.2.0" ssri "^10.0.0" tar "^6.1.11" @@ -9161,10 +8436,19 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" +parse-conflict-json@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/parse-conflict-json/-/parse-conflict-json-3.0.1.tgz#67dc55312781e62aa2ddb91452c7606d1969960c" + integrity sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw== + dependencies: + json-parse-even-better-errors "^3.0.0" + just-diff "^6.0.0" + just-diff-apply "^5.2.0" + parse-data-uri@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/parse-data-uri/-/parse-data-uri-0.2.0.tgz#bf04d851dd5c87b0ab238e5d01ace494b604b4c9" - integrity sha1-vwTYUd1ch7CrI45dAazklLYEtMk= + integrity sha512-uOtts8NqDcaCt1rIsO3VFDRsAfgE4c6osG4d9z3l4dCBlxYFzni6Di/oNU270SDrjkfZuUvLZx1rxMyqh46Y9w== dependencies: data-uri-to-buffer "0.0.3" @@ -9183,7 +8467,7 @@ parse-entities@^2.0.0: parse-json@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== dependencies: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" @@ -9224,11 +8508,6 @@ parse5@^7.1.1: dependencies: entities "^4.4.0" -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= - path-browserify@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" @@ -9237,7 +8516,7 @@ path-browserify@^1.0.0: path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== path-exists@^4.0.0: version "4.0.0" @@ -9247,27 +8526,27 @@ path-exists@^4.0.0: path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-key@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-parse@^1.0.6, path-parse@^1.0.7: +path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-scurry@^1.10.2, path-scurry@^1.6.1: - version "1.10.2" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.2.tgz#8f6357eb1239d5fa1da8b9f70e9c080675458ba7" - integrity sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA== +path-scurry@^1.11.1, path-scurry@^1.6.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== dependencies: lru-cache "^10.2.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" @@ -9285,9 +8564,9 @@ path-type@^4.0.0: integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== pbf@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/pbf/-/pbf-3.2.1.tgz#b4c1b9e72af966cd82c6531691115cc0409ffe2a" - integrity sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ== + version "3.3.0" + resolved "https://registry.yarnpkg.com/pbf/-/pbf-3.3.0.tgz#1790f3d99118333cc7f498de816028a346ef367f" + integrity sha512-XDF38WCH3z5OV/OVa8GKUNtLAyneuzbCisx7QUCF8Q6Nutx0WnJrQe5O+kOtBlLfRNUws98Y58Lblp+NJG5T4Q== dependencies: ieee754 "^1.1.12" resolve-protobuf-schema "^2.1.0" @@ -9295,22 +8574,22 @@ pbf@^3.2.1: pend@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" - integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= + integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== +picocolors@^1.0.0, picocolors@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" + integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" - integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== pify@5.0.0: version "5.0.0" @@ -9320,12 +8599,12 @@ pify@5.0.0: pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== pify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== pify@^4.0.1: version "4.0.1" @@ -9335,7 +8614,7 @@ pify@^4.0.1: pixelmatch@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/pixelmatch/-/pixelmatch-4.0.2.tgz#8f47dcec5011b477b67db03c243bc1f3085e8854" - integrity sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ= + integrity sha512-J8B6xqiO37sU/gkcMglv6h5Jbd9xNER7aHzpfRdNmV4IbQBzBpe4l9XmbG+xPF/znacgu2jfEw+wHffaq/YkXA== dependencies: pngjs "^3.0.0" @@ -9354,26 +8633,34 @@ plur@^1.0.0: pngjs-nozlib@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/pngjs-nozlib/-/pngjs-nozlib-1.0.0.tgz#9e64d602cfe9cce4d9d5997d0687429a73f0b7d7" - integrity sha1-nmTWAs/pzOTZ1Zl9BodCmnPwt9c= + integrity sha512-N1PggqLp9xDqwAoKvGohmZ3m4/N9xpY0nDZivFqQLcpLHmliHnCp9BuNCsOeqHWMuEEgFjpEaq9dZq6RZyy0fA== pngjs@^3.0.0, pngjs@^3.3.3: version "3.4.0" resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= +possible-typed-array-names@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== + +postcss-selector-parser@^6.0.10: + version "6.1.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz#27ecb41fb0e3b6ba7a1ec84fff347f734c7929de" + integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" postcss@^8.4.27: - version "8.4.27" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.27.tgz#234d7e4b72e34ba5a92c29636734349e0d9c3057" - integrity sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ== + version "8.4.41" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.41.tgz#d6104d3ba272d882fe18fc07d15dc2da62fa2681" + integrity sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ== dependencies: - nanoid "^3.3.6" - picocolors "^1.0.0" - source-map-js "^1.0.2" + nanoid "^3.3.7" + picocolors "^1.0.1" + source-map-js "^1.2.0" potpack@^1.0.1: version "1.0.2" @@ -9383,34 +8670,31 @@ potpack@^1.0.1: pre-commit@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/pre-commit/-/pre-commit-1.2.2.tgz#dbcee0ee9de7235e57f79c56d7ce94641a69eec6" - integrity sha1-287g7p3nI15X95xW186UZBpp7sY= + integrity sha512-qokTiqxD6GjODy5ETAIgzsRgnBWWQHQH2ghy86PU7mIn/wuWeTwF3otyNQZxWBwVn8XNr8Tdzj/QfUXpH+gRZA== dependencies: cross-spawn "^5.0.1" spawn-sync "^1.0.15" which "1.2.x" pre-push@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pre-push/-/pre-push-0.1.1.tgz#2a2a79827d243a76c91089897ac707f45e716aac" - integrity sha1-Kip5gn0kOnbJEImJescH9F5xaqw= + version "0.1.4" + resolved "https://registry.yarnpkg.com/pre-push/-/pre-push-0.1.4.tgz#48e7a29e15d3d7a83b62d5a02e10ba5dc40ab3aa" + integrity sha512-bIdVuDQR3r5AWV7bM6OMHD3mCXA53Ql0LXmW5UfcSmJZq+J+TytqZ5YJcTmMLcojJysN65vcFIeCqRn6YidA+Q== dependencies: - shelljs "0.3.x" + cross-spawn "^5.0.1" + spawn-sync "^1.0.15" + which "1.2.x" preact@^10.17.0: - version "10.20.0" - resolved "https://registry.yarnpkg.com/preact/-/preact-10.20.0.tgz#191c10a2ee3b9fca1a7ded6375266266380212f6" - integrity sha512-wU7iZw2BjsaKDal3pDRDy/HpPB6cuFOnVUCcw9aIPKG98+ZrXx3F+szkos8BVME5bquyKDKvRlOJFG8kMkcAbg== + version "10.23.2" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.23.2.tgz#52deec92796ae0f0cc6b034d9c66e0fbc1b837dc" + integrity sha512-kKYfePf9rzKnxOAKDpsWhg/ysrHPqT+yQ7UW4JjdnqjFIeNUnNcEJvhuA8fDenxAGWzUqtd51DfVg7xp/8T9NA== prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= - prettier-check@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/prettier-check/-/prettier-check-2.0.0.tgz#edd086ee12d270579233ccb136a16e6afcfba1ae" @@ -9441,12 +8725,7 @@ pretty-ms@^2.1.0: parse-ms "^1.0.0" plur "^1.0.0" -proc-log@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-3.0.0.tgz#fb05ef83ccd64fd7b20bbe9c8c1070fc08338dd8" - integrity sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A== - -proc-log@^4.0.0: +proc-log@^4.0.0, proc-log@^4.1.0, proc-log@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-4.2.0.tgz#b6f461e4026e75fdfe228b265e9f7a00779d7034" integrity sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA== @@ -9464,9 +8743,14 @@ process-nextick-args@~2.0.0: process@~0.5.1: version "0.5.2" resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" - integrity sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8= + integrity sha512-oNpcutj+nYX2FjdEW7PGltWhXulAnFlM0My/k48L90hARCOJtvBbQXc/6itV2jDvU5xAAtonP+r6wmQgCcbAUA== -progress@2.0.3: +proggy@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/proggy/-/proggy-2.0.0.tgz#154bb0e41d3125b518ef6c79782455c2c47d94e1" + integrity sha512-69agxLtnI8xBs9gUGqEnK26UfiexpHy+KUpBQWabiytQjnn5wFY8rklAi7GRfABIuPNnQ/ik48+LGLkYYJcy4A== + +progress@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== @@ -9479,10 +8763,20 @@ proj4@2.6.2: mgrs "1.0.0" wkt-parser "^1.2.4" +promise-all-reject-late@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz#f8ebf13483e5ca91ad809ccc2fcf25f26f8643c2" + integrity sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw== + +promise-call-limit@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/promise-call-limit/-/promise-call-limit-3.0.1.tgz#3570f7a3f2aaaf8e703623a552cd74749688cf19" + integrity sha512-utl+0x8gIDasV5X+PI5qWEPqH6fJS0pFtQ/4gZ95xfEFb/89dmh+/b895TbFDBLiafBvxD/PGTKfvxl4kH/pQg== + promise-inflight@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= + integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== promise-retry@^2.0.1: version "2.0.1" @@ -9493,20 +8787,20 @@ promise-retry@^2.0.1: retry "^0.12.0" promzard@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/promzard/-/promzard-1.0.1.tgz#3b77251a24f988c0886f5649d4f642bcdd53e558" - integrity sha512-ulDF77aULEHUoJkN5XZgRV5loHXBaqd9eorMvLNLvi2gXMuRAtwH6Gh4zsMHQY1kTt7tyv/YZwZW5C2gtj8F2A== + version "1.0.2" + resolved "https://registry.yarnpkg.com/promzard/-/promzard-1.0.2.tgz#2226e7c6508b1da3471008ae17066a7c3251e660" + integrity sha512-2FPputGL+mP3jJ3UZg/Dl9YOkovB7DX0oOr+ck5QbZ5MtORtds8k/BZdn+02peDLI8/YWbmzx34k5fA+fHvCVQ== dependencies: read "^3.0.1" -prop-types@^15.7.2: - version "15.7.2" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" - integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== +prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== dependencies: loose-envify "^1.4.0" object-assign "^4.1.1" - react-is "^16.8.1" + react-is "^16.13.1" protocol-buffers-schema@^3.3.1: version "3.6.0" @@ -9518,7 +8812,7 @@ protocols@^2.0.0, protocols@^2.0.1: resolved "https://registry.yarnpkg.com/protocols/-/protocols-2.0.1.tgz#8f155da3fc0f32644e83c5782c8e8212ccf70a86" integrity sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q== -proxy-agent@6.4.0: +proxy-agent@^6.4.0: version "6.4.0" resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-6.4.0.tgz#b4e2dd51dee2b377748aef8d45604c2d7608652d" integrity sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ== @@ -9540,19 +8834,9 @@ proxy-from-env@^1.1.0: pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== -psl@^1.1.24: - version "1.8.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" - integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== - -psl@^1.1.28: - version "1.7.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.7.0.tgz#f1c4c47a8ef97167dea5d6bbf4816d736e884a3c" - integrity sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ== - -psl@^1.1.33: +psl@^1.1.28, psl@^1.1.33: version "1.9.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== @@ -9565,36 +8849,31 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" -punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= - punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== -puppeteer-core@22.4.0: - version "22.4.0" - resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-22.4.0.tgz#26ea98c7392da0c617d587398e345c0013f2228f" - integrity sha512-MZttAbttrxi6O/B//rY6zQihjFe/vXeCLb5YvKH2xG6yrcVESo0Hc5/Cv49omwZyZzAJ1BK8BnDeatDsj+3hMw== +puppeteer-core@22.15.0: + version "22.15.0" + resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-22.15.0.tgz#c76926cce5dbc177572797a9dacc325c313fa91a" + integrity sha512-cHArnywCiAAVXa3t4GGL2vttNxh7GqXtIYGym99egkNJ3oG//wL9LkvO4WE8W1TJe95t1F1ocu9X4xWaGsOKOA== dependencies: - "@puppeteer/browsers" "2.1.0" - chromium-bidi "0.5.12" - cross-fetch "4.0.0" - debug "4.3.4" - devtools-protocol "0.0.1249869" - ws "8.16.0" + "@puppeteer/browsers" "2.3.0" + chromium-bidi "0.6.3" + debug "^4.3.6" + devtools-protocol "0.0.1312386" + ws "^8.18.0" puppeteer@^22.4.0: - version "22.4.0" - resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-22.4.0.tgz#9713a291fbeb0733b3732b3b8be759e688e1f544" - integrity sha512-tR+JsDbA2qD1DqRX4F9k9SxQhk6UzcaCN+Qux7+WrDceS7wcR7tlFmMNB8+g8zE4Fmr/iRTOtf5wNnTW9cGUFQ== + version "22.15.0" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-22.15.0.tgz#4f842087090f1d9017ce947512e7baff55a10e75" + integrity sha512-XjCY1SiSEi1T7iSYuxS82ft85kwDJUS7wj1Z0eGVXKdtr5g4xnVcbjwxhq5xBnpK/E7x1VZZoJDxpjAOasHT4Q== dependencies: - "@puppeteer/browsers" "2.1.0" - cosmiconfig "9.0.0" - puppeteer-core "22.4.0" + "@puppeteer/browsers" "2.3.0" + cosmiconfig "^9.0.0" + devtools-protocol "0.0.1312386" + puppeteer-core "22.15.0" qs@~6.5.2: version "6.5.3" @@ -9639,36 +8918,36 @@ re-emitter@1.1.3: integrity sha512-bHJul9CWcocrS+w5e5QrKYXV9NkbSA9hxSEyhYuctwm6keY9NXR2Xt/4A0vbMP0QvuwyfEyb4bkowYXv1ziEbg== react-dom@^18.2.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" - integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" + integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== dependencies: loose-envify "^1.1.0" - scheduler "^0.23.0" + scheduler "^0.23.2" -react-is@^16.8.1: - version "16.12.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.12.0.tgz#2cc0fe0fba742d97fd527c42a13bec4eeb06241c" - integrity sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q== +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== react-is@^18.0.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" - integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" + integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== react@^18.2.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" - integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== + version "18.3.1" + resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" + integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== dependencies: loose-envify "^1.1.0" -read-cmd-shim@4.0.0: +read-cmd-shim@4.0.0, read-cmd-shim@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-4.0.0.tgz#640a08b473a49043e394ae0c7a34dd822c73b9bb" integrity sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q== -read-package-json-fast@^3.0.0: +read-package-json-fast@^3.0.0, read-package-json-fast@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz#394908a9725dc7a5f14e70c8e7556dff1d2b1049" integrity sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw== @@ -9676,30 +8955,10 @@ read-package-json-fast@^3.0.0: json-parse-even-better-errors "^3.0.0" npm-normalize-package-bin "^3.0.0" -read-package-json@6.0.4, read-package-json@^6.0.0: - version "6.0.4" - resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-6.0.4.tgz#90318824ec456c287437ea79595f4c2854708836" - integrity sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw== - dependencies: - glob "^10.2.2" - json-parse-even-better-errors "^3.0.0" - normalize-package-data "^5.0.0" - npm-normalize-package-bin "^3.0.0" - -read-package-json@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-7.0.0.tgz#d605c9dcf6bc5856da24204aa4e9518ee9714be0" - integrity sha512-uL4Z10OKV4p6vbdvIXB+OzhInYtIozl/VxUBPgNkBuUi2DeRonnuspmaVAMcrkmfjKGNmRndyQAbE7/AmzGwFg== - dependencies: - glob "^10.2.2" - json-parse-even-better-errors "^3.0.0" - normalize-package-data "^6.0.0" - npm-normalize-package-bin "^3.0.0" - read-pkg-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" - integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= + integrity sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw== dependencies: find-up "^2.0.0" read-pkg "^3.0.0" @@ -9716,7 +8975,7 @@ read-pkg-up@^7.0.1: read-pkg@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" - integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + integrity sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA== dependencies: load-json-file "^4.0.0" normalize-package-data "^2.3.2" @@ -9732,13 +8991,6 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -read@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/read/-/read-2.1.0.tgz#69409372c54fe3381092bc363a00650b6ac37218" - integrity sha512-bvxi1QLJHcaywCAEsAk4DG3nVoqiY2Csps3qzWalhj5hFqRn1d/OixkFXtLO1PrgHUcAP0FNaSY/5GYNfENFFQ== - dependencies: - mute-stream "~1.0.0" - read@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/read/-/read-3.0.1.tgz#926808f0f7c83fa95f1ef33c0e2c09dbb28fd192" @@ -9759,10 +9011,10 @@ readable-stream@2.2.9: string_decoder "~1.0.0" util-deprecate "~1.0.1" -readable-stream@^2.0.2, readable-stream@^2.2.2, readable-stream@~2.3.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== +readable-stream@^2.2.2, readable-stream@~2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -9772,7 +9024,7 @@ readable-stream@^2.0.2, readable-stream@^2.2.2, readable-stream@~2.3.6: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.0.0, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: +readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== @@ -9781,19 +9033,10 @@ readable-stream@^3.0.0, readable-stream@^3.1.1, readable-stream@^3.4.0, readable string_decoder "^1.1.1" util-deprecate "^1.0.1" -readable-stream@^3.0.2: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - readable-stream@~1.0.33-1: version "1.0.34" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= + integrity sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg== dependencies: core-util-is "~1.0.0" inherits "~2.0.1" @@ -9803,22 +9046,13 @@ readable-stream@~1.0.33-1: readable-stream@~1.1.9: version "1.1.14" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" - integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= + integrity sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ== dependencies: core-util-is "~1.0.0" inherits "~2.0.1" isarray "0.0.1" string_decoder "~0.10.x" -readdirp@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" - integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== - dependencies: - graceful-fs "^4.1.11" - micromatch "^3.1.10" - readable-stream "^2.0.2" - readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -9834,150 +9068,83 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" -regenerate-unicode-properties@^8.2.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" - integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA== +reflect.getprototypeof@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz#3ab04c32a8390b770712b7a8633972702d278859" + integrity sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.1" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + globalthis "^1.0.3" + which-builtin-type "^1.1.3" + +regenerate-unicode-properties@^10.1.0: + version "10.1.1" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" + integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q== dependencies: - regenerate "^1.4.0" + regenerate "^1.4.2" -regenerate@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" - integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== regenerator-runtime@^0.13.4: - version "0.13.9" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" - integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== - -regenerator-transform@^0.14.2: - version "0.14.5" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" - integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== - dependencies: - "@babel/runtime" "^7.8.4" - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" + version "0.13.11" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== -regexp.prototype.flags@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75" - integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== -regexp.prototype.flags@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26" - integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA== +regenerator-transform@^0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" + integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" + "@babel/runtime" "^7.8.4" -regexp.prototype.flags@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" - integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== +regexp.prototype.flags@^1.5.1, regexp.prototype.flags@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" + integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - functions-have-names "^1.2.2" + call-bind "^1.0.6" + define-properties "^1.2.1" + es-errors "^1.3.0" + set-function-name "^2.0.1" -regexp.prototype.flags@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e" - integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg== +regexpu-core@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" + integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - set-function-name "^2.0.0" - -regexpu-core@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.0.tgz#fcbf458c50431b0bb7b45d6967b8192d91f3d938" - integrity sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ== - dependencies: - regenerate "^1.4.0" - regenerate-unicode-properties "^8.2.0" - regjsgen "^0.5.1" - regjsparser "^0.6.4" - unicode-match-property-ecmascript "^1.0.4" - unicode-match-property-value-ecmascript "^1.2.0" - -regexpu-core@^4.7.1: - version "4.7.1" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.1.tgz#2dea5a9a07233298fbf0db91fa9abc4c6e0f8ad6" - integrity sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ== - dependencies: - regenerate "^1.4.0" - regenerate-unicode-properties "^8.2.0" - regjsgen "^0.5.1" - regjsparser "^0.6.4" - unicode-match-property-ecmascript "^1.0.4" - unicode-match-property-value-ecmascript "^1.2.0" - -regjsgen@^0.5.1: - version "0.5.2" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" - integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== + "@babel/regjsgen" "^0.8.0" + regenerate "^1.4.2" + regenerate-unicode-properties "^10.1.0" + regjsparser "^0.9.1" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.0" -regjsparser@^0.6.4: - version "0.6.4" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.4.tgz#a769f8684308401a66e9b529d2436ff4d0666272" - integrity sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw== +regjsparser@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" + integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== dependencies: jsesc "~0.5.0" -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= - -repeat-element@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" - integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== - -repeat-string@^1.5.2, repeat-string@^1.6.1: +repeat-string@^1.5.2: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= - -request@^2.44.0: - version "2.88.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" - integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.0" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.4.3" - tunnel-agent "^0.6.0" - uuid "^3.3.2" + integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== -request@^2.88.2: +request@^2.44.0, request@^2.88.2: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== @@ -10006,12 +9173,12 @@ request@^2.88.2: require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== resolve-cwd@^3.0.0: version "3.0.0" @@ -10037,27 +9204,7 @@ resolve-protobuf-schema@^2.1.0: dependencies: protocol-buffers-schema "^3.3.1" -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= - -resolve@^1.10.0: - version "1.14.2" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.14.2.tgz#dbf31d0fa98b1f29aa5169783b9c290cb865fea2" - integrity sha512-EjlOBLBO1kxsUxsKjLt7TAECyKW6fOh1VRkykQkKGzcBbjjPIxBqGh0jf7GJ3k/f5mxMqW3htMD3WdTUVtW8HQ== - dependencies: - path-parse "^1.0.6" - -resolve@^1.14.2: - version "1.20.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" - integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== - dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" - -resolve@^1.22.2, resolve@^1.22.4: +resolve@^1.10.0, resolve@^1.14.2, resolve@^1.22.2, resolve@^1.22.4, resolve@~1.22.6: version "1.22.8" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== @@ -10066,20 +9213,12 @@ resolve@^1.22.2, resolve@^1.22.4: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^2.0.0-next.3: - version "2.0.0-next.3" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.3.tgz#d41016293d4a8586a39ca5d9b5f15cbea1f55e46" - integrity sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q== - dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" - -resolve@~1.22.1: - version "1.22.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== +resolve@^2.0.0-next.5: + version "2.0.0-next.5" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" + integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== dependencies: - is-core-module "^2.9.0" + is-core-module "^2.13.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" @@ -10091,18 +9230,6 @@ restore-cursor@^3.1.0: onetime "^5.1.0" signal-exit "^3.0.2" -resumer@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759" - integrity sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k= - dependencies: - through "~2.3.4" - -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== - retry@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" @@ -10151,9 +9278,9 @@ rollup-pluginutils@^2.8.1: estree-walker "^0.6.1" rollup@^3.27.1: - version "3.27.2" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.27.2.tgz#59adc973504408289be89e5978e938ce852c9520" - integrity sha512-YGwmHf7h2oUHkVBT248x0yt6vZkYQ3/rvE5iQuVBh3WO8GcJ6BNeOkpoX1yMHIiBm18EMLjBPIoUDkhgnyxGOQ== + version "3.29.4" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.29.4.tgz#4d70c0f9834146df8705bfb69a9a19c9e1109981" + integrity sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw== optionalDependencies: fsevents "~2.3.2" @@ -10184,17 +9311,17 @@ rxjs@^7.5.5: s2-geometry@^1.2.10: version "1.2.10" resolved "https://registry.yarnpkg.com/s2-geometry/-/s2-geometry-1.2.10.tgz#c6ff22f3eccafd0eea491b60b44c141b9887acab" - integrity sha1-xv8i8+zK/Q7qSRtgtEwUG5iHrKs= + integrity sha512-5WejfQu1XZ25ZerW8uL6xP1sM2krcOYKhI6TbfybGRf+vTQLrm3E+4n0+1lWg+MYqFjPzoe51zKhn2sBRMCt5g== dependencies: long "^3.2.0" -safe-array-concat@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.1.tgz#91686a63ce3adbea14d61b14c99572a8ff84754c" - integrity sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q== +safe-array-concat@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" + integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" + call-bind "^1.0.7" + get-intrinsic "^1.2.4" has-symbols "^1.0.3" isarray "^2.0.5" @@ -10208,22 +9335,15 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-regex-test@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" - integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== +safe-regex-test@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" + integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" + call-bind "^1.0.6" + es-errors "^1.3.0" is-regex "^1.1.4" -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= - dependencies: - ret "~0.1.10" - "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -10249,10 +9369,10 @@ saxes@^6.0.0: dependencies: xmlchars "^2.2.0" -scheduler@^0.23.0: - version "0.23.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" - integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== +scheduler@^0.23.2: + version "0.23.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" + integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== dependencies: loose-envify "^1.1.0" @@ -10261,63 +9381,42 @@ scheduler@^0.23.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== -semver@7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" - integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== - -semver@7.6.0, semver@^7.0.0, semver@^7.1.1, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3: - version "7.6.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" - integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== - dependencies: - lru-cache "^6.0.0" - -semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0, semver@^6.3.1: +semver@^6.3.1: version "6.3.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.5.4: - version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" +semver@^7.0.0, semver@^7.1.1, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4, semver@^7.6.3: + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== -set-function-length@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.1.1.tgz#4bc39fafb0307224a33e106a7d35ca1218d659ed" - integrity sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ== +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== dependencies: - define-data-property "^1.1.1" - get-intrinsic "^1.2.1" + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" gopd "^1.0.1" - has-property-descriptors "^1.0.0" - -set-function-name@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" - integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== - dependencies: - define-data-property "^1.0.1" - functions-have-names "^1.2.3" - has-property-descriptors "^1.0.0" + has-property-descriptors "^1.0.2" -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== +set-function-name@^2.0.1, set-function-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" + define-data-property "^1.1.4" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" setimmediate@^1.0.5: version "1.0.5" @@ -10334,7 +9433,7 @@ shallow-clone@^3.0.0: shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== dependencies: shebang-regex "^1.0.0" @@ -10348,69 +9447,44 @@ shebang-command@^2.0.0: shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== shebang-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shelljs@0.3.x: - version "0.3.0" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.3.0.tgz#3596e6307a781544f591f37da618360f31db57b1" - integrity sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E= - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== +side-channel@^1.0.4, side-channel@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" -signal-exit@3.0.7, signal-exit@^3.0.3, signal-exit@^3.0.7: +signal-exit@3.0.7, signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -signal-exit@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" - integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== - -signal-exit@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= - signal-exit@^4.0.1: version "4.1.0" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== -sigstore@^1.4.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/sigstore/-/sigstore-1.9.0.tgz#1e7ad8933aa99b75c6898ddd0eeebc3eb0d59875" - integrity sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A== - dependencies: - "@sigstore/bundle" "^1.1.0" - "@sigstore/protobuf-specs" "^0.2.0" - "@sigstore/sign" "^1.0.0" - "@sigstore/tuf" "^1.0.3" - make-fetch-happen "^11.0.1" - sigstore@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/sigstore/-/sigstore-2.3.0.tgz#c56b32818d4dc989f6ea3c0897f4d9bff5d14bed" - integrity sha512-q+o8L2ebiWD1AxD17eglf1pFrl9jtW7FHa0ygqY6EKvibK8JHyq9Z26v9MZXeDiw+RbfOJ9j2v70M10Hd6E06A== + version "2.3.1" + resolved "https://registry.yarnpkg.com/sigstore/-/sigstore-2.3.1.tgz#0755dd2cc4820f2e922506da54d3d628e13bfa39" + integrity sha512-8G+/XDU8wNsJOQS5ysDVO0Etg9/2uA5gR9l4ZwijjlwxBcrU6RPfwi2+jJmbP+Ap1Hlp/nVAaEO4Fj22/SL2gQ== dependencies: - "@sigstore/bundle" "^2.3.1" + "@sigstore/bundle" "^2.3.2" "@sigstore/core" "^1.0.0" - "@sigstore/protobuf-specs" "^0.3.1" - "@sigstore/sign" "^2.3.0" - "@sigstore/tuf" "^2.3.1" - "@sigstore/verify" "^1.2.0" + "@sigstore/protobuf-specs" "^0.3.2" + "@sigstore/sign" "^2.3.2" + "@sigstore/tuf" "^2.3.4" + "@sigstore/verify" "^1.2.1" simple-swizzle@^0.2.2: version "0.2.2" @@ -10434,69 +9508,21 @@ smart-buffer@^4.2.0: resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - snappyjs@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/snappyjs/-/snappyjs-0.6.1.tgz#9bca9ff8c54b133a9cc84a71d22779e97fc51878" integrity sha512-YIK6I2lsH072UE0aOFxxY1dPDCS43I5ktqHpeAsuLNYWkE5pGxRGWfDM4/vSUfNzXjC1Ivzt3qx31PCLmc9yqg== -socks-proxy-agent@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz#dc069ecf34436621acb41e3efa66ca1b5fed15b6" - integrity sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww== - dependencies: - agent-base "^6.0.2" - debug "^4.3.3" - socks "^2.6.2" - -socks-proxy-agent@^8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz#5acbd7be7baf18c46a3f293a840109a430a640ad" - integrity sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g== - dependencies: - agent-base "^7.0.2" - debug "^4.3.4" - socks "^2.7.1" - -socks-proxy-agent@^8.0.3: - version "8.0.3" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.3.tgz#6b2da3d77364fde6292e810b496cb70440b9b89d" - integrity sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A== +socks-proxy-agent@^8.0.2, socks-proxy-agent@^8.0.3, socks-proxy-agent@^8.0.4: + version "8.0.4" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz#9071dca17af95f483300316f4b063578fa0db08c" + integrity sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw== dependencies: agent-base "^7.1.1" debug "^4.3.4" - socks "^2.7.1" + socks "^2.8.3" -socks@^2.6.2: +socks@^2.8.3: version "2.8.3" resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.3.tgz#1ebd0f09c52ba95a09750afe3f3f9f724a800cb5" integrity sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw== @@ -10504,18 +9530,10 @@ socks@^2.6.2: ip-address "^9.0.5" smart-buffer "^4.2.0" -socks@^2.7.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" - integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== - dependencies: - ip "^2.0.0" - smart-buffer "^4.2.0" - sort-keys@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" - integrity sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg= + integrity sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg== dependencies: is-plain-obj "^1.0.0" @@ -10529,31 +9547,10 @@ sortablejs@~1.15.2: resolved "https://registry.yarnpkg.com/sortablejs/-/sortablejs-1.15.2.tgz#4e9f7bda4718bd1838add9f1866ec77169149809" integrity sha512-FJF5jgdfvoKn1MAKSdGs33bIqLi3LmsgVTliuX6iITj834F+JRQZN90Z93yql8h0K2t0RwDPBmxwlbZfDcxNZA== -source-map-js@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" - integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== - -source-map-resolve@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" - integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-url@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" - integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= - -source-map@^0.5.0, source-map@^0.5.6: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= +source-map-js@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" + integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" @@ -10568,43 +9565,36 @@ sourcemap-codec@^1.4.8: spawn-sync@^1.0.15: version "1.0.15" resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.15.tgz#b00799557eb7fb0c8376c29d44e8a1ea67e57476" - integrity sha1-sAeZVX63+wyDdsKdROih6mfldHY= + integrity sha512-9DWBgrgYZzNghseho0JOuh+5fg9u6QWhAWa51QC7+U5rCheZ/j1DrEZnyE0RBBRqZ9uEXGPgSSM0nky6burpVw== dependencies: concat-stream "^1.4.7" os-shim "^0.1.2" spdx-correct@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" - integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== + version "3.2.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" + integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" spdx-exceptions@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" - integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== + version "2.5.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz#5d607d27fc806f66d7b64a766650fa890f04ed66" + integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== spdx-expression-parse@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" - integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== dependencies: spdx-exceptions "^2.1.0" spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.5" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" - integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" + version "3.0.20" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz#e44ed19ed318dd1e5888f93325cee800f0f51b89" + integrity sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw== split2@^3.2.2: version "3.2.2" @@ -10635,12 +9625,12 @@ sprintf-js@^1.1.3: sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== sshpk@^1.7.0: - version "1.16.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" - integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + version "1.18.0" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.18.0.tgz#1663e55cddf4d688b86a46b77f0d5fe363aba028" + integrity sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ== dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" @@ -10652,52 +9642,37 @@ sshpk@^1.7.0: safer-buffer "^2.0.2" tweetnacl "~0.14.0" -ssri@^10.0.0, ssri@^10.0.1: - version "10.0.5" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-10.0.5.tgz#e49efcd6e36385196cb515d3a2ad6c3f0265ef8c" - integrity sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A== +ssri@^10.0.0, ssri@^10.0.6: + version "10.0.6" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-10.0.6.tgz#a8aade2de60ba2bce8688e3fa349bad05c7dc1e5" + integrity sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ== dependencies: minipass "^7.0.3" -ssri@^9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-9.0.1.tgz#544d4c357a8d7b71a19700074b6883fcb4eae057" - integrity sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q== - dependencies: - minipass "^3.1.1" - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= +stop-iteration-iterator@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" + integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" + internal-slot "^1.0.4" stream-to-async-iterator@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/stream-to-async-iterator/-/stream-to-async-iterator-1.0.0.tgz#d7af183a1fc28655741a1b1810fd008d4b1cd566" integrity sha512-y7IQUStB2pOmq36KaOnLhaxIXjEYkKqzIxRW7grC3ByVKW7yDf88vXw9kS1wxdX5BrJvw/uh5N52NZ8COFy8tA== -streamx@^2.13.0: - version "2.16.1" - resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.16.1.tgz#2b311bd34832f08aa6bb4d6a80297c9caef89614" - integrity sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ== +streamx@^2.15.0, streamx@^2.18.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.19.0.tgz#c66a43ad667539e81967d1bacc68c1575eb9fdde" + integrity sha512-5z6CNR4gtkPbwlxyEqoDGDmWIzoNJqCBt4Eac1ICP9YaIT08ct712cFj0u1rx4F8luAuL+3Qc+RFIdI4OX00kg== dependencies: - fast-fifo "^1.1.0" + fast-fifo "^1.3.2" queue-tick "^1.0.1" + text-decoder "^1.1.0" optionalDependencies: bare-events "^2.2.0" -streamx@^2.15.0: - version "2.15.1" - resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.15.1.tgz#396ad286d8bc3eeef8f5cea3f029e81237c024c6" - integrity sha512-fQMzy2O/Q47rgwErk/eGeLu/roaFWV0jVsogDmrszM9uIw8L5OA+t+V93MgYlufNptfjmYR1tOMWhei/Eh7TQA== - dependencies: - fast-fifo "^1.1.0" - queue-tick "^1.0.1" - -"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -10706,15 +9681,6 @@ streamx@^2.15.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^4.1.0, string-width@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" - integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" - string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" @@ -10724,105 +9690,67 @@ string-width@^5.0.1, string-width@^5.1.2: emoji-regex "^9.2.2" strip-ansi "^7.0.1" -string.prototype.matchall@^4.0.5: - version "4.0.5" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.5.tgz#59370644e1db7e4c0c045277690cf7b01203c4da" - integrity sha512-Z5ZaXO0svs0M2xd/6By3qpeKpLKd9mO4v4q3oMEQrk8Ck4xOD5d5XeBOOjGrmVZZ/AHB1S0CgG4N5r1G9N3E2Q== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.18.2" - get-intrinsic "^1.1.1" - has-symbols "^1.0.2" - internal-slot "^1.0.3" - regexp.prototype.flags "^1.3.1" - side-channel "^1.0.4" - -string.prototype.trim@^1.2.8: - version "1.2.8" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd" - integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - -string.prototype.trim@~1.2.6: - version "1.2.7" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" - integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -string.prototype.trimend@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" - integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -string.prototype.trimend@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" - integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -string.prototype.trimend@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz#1bb3afc5008661d73e2dc015cd4853732d6c471e" - integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - -string.prototype.trimleft@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74" - integrity sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag== +string.prototype.includes@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.includes/-/string.prototype.includes-2.0.0.tgz#8986d57aee66d5460c144620a6d873778ad7289f" + integrity sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg== dependencies: define-properties "^1.1.3" - function-bind "^1.1.1" + es-abstract "^1.17.5" + +string.prototype.matchall@^4.0.11: + version "4.0.11" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz#1092a72c59268d2abaad76582dccc687c0297e0a" + integrity sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.7" + regexp.prototype.flags "^1.5.2" + set-function-name "^2.0.2" + side-channel "^1.0.6" -string.prototype.trimright@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz#440314b15996c866ce8a0341894d45186200c5d9" - integrity sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g== +string.prototype.repeat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz#e90872ee0308b29435aa26275f6e1b762daee01a" + integrity sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w== dependencies: define-properties "^1.1.3" - function-bind "^1.1.1" + es-abstract "^1.17.5" -string.prototype.trimstart@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" - integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== +string.prototype.trim@^1.2.9, string.prototype.trim@~1.2.8: + version "1.2.9" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" + integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.0" + es-object-atoms "^1.0.0" -string.prototype.trimstart@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" - integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== +string.prototype.trimend@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" + integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" -string.prototype.trimstart@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298" - integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" string_decoder@^1.1.1: version "1.3.0" @@ -10834,7 +9762,7 @@ string_decoder@^1.1.1: string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= + integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== string_decoder@~1.0.0: version "1.0.3" @@ -10850,7 +9778,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -10860,17 +9788,10 @@ string_decoder@~1.1.1: strip-ansi@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== dependencies: ansi-regex "^2.0.0" -strip-ansi@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== - dependencies: - ansi-regex "^5.0.0" - strip-ansi@^7.0.1: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -10881,7 +9802,7 @@ strip-ansi@^7.0.1: strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== strip-bom@^4.0.0: version "4.0.0" @@ -10891,7 +9812,7 @@ strip-bom@^4.0.0: strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== strip-final-newline@^2.0.0: version "2.0.0" @@ -10992,7 +9913,7 @@ tap-spec@^5.0.0: tape-catch@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/tape-catch/-/tape-catch-1.0.6.tgz#12931d5ea60a03a97d9bd19d0d7d8cfc3f6cecf1" - integrity sha1-EpMdXqYKA6l9m9GdDX2M/D9s7PE= + integrity sha512-YnnfczmfAlVu+iAPiGfpMx+qNs6crYM3qPLJ0b9mKaiN0Sc0vOiBNr0yQ9WZqybngJvdlh7MzdutFwGrqYxlsA== dependencies: global "~4.3.0" @@ -11005,30 +9926,31 @@ tape-promise@^4.0.0: onetime "^2.0.0" tape@^4.11.0: - version "4.16.1" - resolved "https://registry.yarnpkg.com/tape/-/tape-4.16.1.tgz#8d511b3a0be1a30441885972047c1dac822fd9be" - integrity sha512-U4DWOikL5gBYUrlzx+J0oaRedm2vKLFbtA/+BRAXboGWpXO7bMP8ddxlq3Cse2bvXFQ0jZMOj6kk3546mvCdFg== + version "4.17.0" + resolved "https://registry.yarnpkg.com/tape/-/tape-4.17.0.tgz#de89f3671ddc5dad178d04c28dc6b0183f42268e" + integrity sha512-KCuXjYxCZ3ru40dmND+oCLsXyuA8hoseu2SS404Px5ouyS0A99v8X/mdiLqsR5MTAyamMBN7PRwt2Dv3+xGIxw== dependencies: + "@ljharb/resumer" "~0.0.1" + "@ljharb/through" "~2.3.9" call-bind "~1.0.2" deep-equal "~1.1.1" - defined "~1.0.0" + defined "~1.0.1" dotignore "~0.1.2" for-each "~0.3.3" glob "~7.2.3" has "~1.0.3" inherits "~2.0.4" is-regex "~1.1.4" - minimist "~1.2.6" - object-inspect "~1.12.2" - resolve "~1.22.1" - resumer "~0.0.0" - string.prototype.trim "~1.2.6" - through "~2.3.8" - -tar-fs@3.0.5: - version "3.0.5" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-3.0.5.tgz#f954d77767e4e6edf973384e1eb95f8f81d64ed9" - integrity sha512-JOgGAmZyMgbqpLwct7ZV8VzkEB6pxXFBVErLtb+XCOqzc6w1xiWKI9GVd6bwk68EX7eJ4DWmfXVmq8K2ziZTGg== + minimist "~1.2.8" + mock-property "~1.0.0" + object-inspect "~1.12.3" + resolve "~1.22.6" + string.prototype.trim "~1.2.8" + +tar-fs@^3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-3.0.6.tgz#eaccd3a67d5672f09ca8e8f9c3d2b89fa173f217" + integrity sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w== dependencies: pump "^3.0.0" tar-stream "^3.1.5" @@ -11037,9 +9959,9 @@ tar-fs@3.0.5: bare-path "^2.1.0" tar-stream@^3.1.5: - version "3.1.6" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-3.1.6.tgz#6520607b55a06f4a2e2e04db360ba7d338cc5bab" - integrity sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg== + version "3.1.7" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-3.1.7.tgz#24b3fb5eabada19fe7338ed6d26e5f7c482e792b" + integrity sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ== dependencies: b4a "^1.6.4" fast-fifo "^1.2.0" @@ -11056,19 +9978,7 @@ tar-stream@~2.2.0: inherits "^2.0.3" readable-stream "^3.1.1" -tar@6.1.11: - version "6.1.11" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" - integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== - dependencies: - chownr "^2.0.0" - fs-minipass "^2.0.0" - minipass "^3.0.0" - minizlib "^2.1.1" - mkdirp "^1.0.3" - yallist "^4.0.0" - -tar@^6.1.11, tar@^6.1.2: +tar@6.2.1, tar@^6.1.11, tar@^6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== @@ -11094,6 +10004,13 @@ test-exclude@^6.0.0: glob "^7.1.4" minimatch "^3.0.4" +text-decoder@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/text-decoder/-/text-decoder-1.1.1.tgz#5df9c224cebac4a7977720b9f083f9efa1aefde8" + integrity sha512-8zll7REEv4GDD3x4/0pW+ppIxSNs7H1J10IKFZsuOMscumCdM2a+toDGLPA3T+1+fLBql4zbt5z83GEQGGV5VA== + dependencies: + b4a "^1.6.4" + text-extensions@^1.0.0: version "1.9.0" resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" @@ -11102,7 +10019,7 @@ text-extensions@^1.0.0: text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== texture-compressor@^1.0.2: version "1.0.2" @@ -11120,10 +10037,10 @@ through2@^2.0.0: readable-stream "~2.3.6" xtend "~4.0.1" -through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6, through@^2.3.8, through@~2.3.4, through@~2.3.8: +through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6, through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== tilebelt@^1.0.1: version "1.0.1" @@ -11155,22 +10072,7 @@ tmp@~0.2.1: to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= - -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== to-regex-range@^5.0.1: version "5.0.1" @@ -11179,34 +10081,16 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - tough-cookie@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.2.tgz#e53e84b85f24e0b65dd526f46628db6c85f6b874" - integrity sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ== + version "4.1.4" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36" + integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== dependencies: psl "^1.1.33" punycode "^2.1.1" universalify "^0.2.0" url-parse "^1.5.3" -tough-cookie@~2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" - integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== - dependencies: - psl "^1.1.24" - punycode "^1.4.1" - tough-cookie@~2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" @@ -11227,6 +10111,11 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== +treeverse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/treeverse/-/treeverse-3.0.0.tgz#dd82de9eb602115c6ebd77a574aae67003cb48c8" + integrity sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ== + trim-newlines@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" @@ -11238,14 +10127,14 @@ trim@0.0.1: integrity sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ== ts-api-utils@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.0.3.tgz#f12c1c781d04427313dbac808f453f050e54a331" - integrity sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg== + version "1.3.0" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" + integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== ts-node@~10.9.0: - version "10.9.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" - integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== + version "10.9.2" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" + integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== dependencies: "@cspotcode/source-map-support" "^0.8.0" "@tsconfig/node10" "^1.0.7" @@ -11262,9 +10151,9 @@ ts-node@~10.9.0: yn "3.1.1" ts-patch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/ts-patch/-/ts-patch-3.1.2.tgz#9d4832eca34ed0b9eb1f8456cb00c941f50b442b" - integrity sha512-n58F5AqjUMdp9RAKq+E1YBkmONltPVbt1nN+wrmZXoYZek6QcvaTuqvKMhYhr5BxtC53kD/exxIPA1cP1RQxsA== + version "3.2.1" + resolved "https://registry.yarnpkg.com/ts-patch/-/ts-patch-3.2.1.tgz#0c1ecfcb6b6633bf23e533016ffda4d566518628" + integrity sha512-hlR43v+GUIUy8/ZGFP1DquEqPh7PFKQdDMTAmYt671kCCA6AkDQMoeFaFmZ7ObPLYOmpMgyKUqL1C+coFMf30w== dependencies: chalk "^4.1.2" global-prefix "^3.0.0" @@ -11283,16 +10172,7 @@ tsconfig-paths@^3.15.0: minimist "^1.2.6" strip-bom "^3.0.0" -tsconfig-paths@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-4.1.1.tgz#7f23094ce897fcf4a93f67c4776e813003e48b75" - integrity sha512-VgPrtLKpRgEAJsMj5Q/I/mXouC6A/7eJ/X4Nuk6o0cRPwBtznYxTCU4FodbexbzH9somBPEXYi0ZkUViUpJ21Q== - dependencies: - json5 "^2.2.1" - minimist "^1.2.6" - strip-bom "^3.0.0" - -tsconfig-paths@^4.1.2: +tsconfig-paths@^4.1.1, tsconfig-paths@^4.1.2: version "4.2.0" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz#ef78e19039133446d244beac0fd6a1632e2d107c" integrity sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg== @@ -11302,39 +10182,30 @@ tsconfig-paths@^4.1.2: strip-bom "^3.0.0" tslib@^2.0.1, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.4.0: - version "2.6.2" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" - integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== - -tuf-js@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/tuf-js/-/tuf-js-1.1.7.tgz#21b7ae92a9373015be77dfe0cb282a80ec3bbe43" - integrity sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg== - dependencies: - "@tufjs/models" "1.0.4" - debug "^4.3.4" - make-fetch-happen "^11.1.1" + version "2.7.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01" + integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== -tuf-js@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/tuf-js/-/tuf-js-2.2.0.tgz#4daaa8620ba7545501d04dfa933c98abbcc959b9" - integrity sha512-ZSDngmP1z6zw+FIkIBjvOp/II/mIub/O7Pp12j1WNsiCpg5R5wAc//i555bBQsE44O94btLt0xM/Zr2LQjwdCg== +tuf-js@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tuf-js/-/tuf-js-2.2.1.tgz#fdd8794b644af1a75c7aaa2b197ddffeb2911b56" + integrity sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA== dependencies: - "@tufjs/models" "2.0.0" + "@tufjs/models" "2.0.1" debug "^4.3.4" - make-fetch-happen "^13.0.0" + make-fetch-happen "^13.0.1" tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== dependencies: safe-buffer "^5.0.1" tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" @@ -11343,12 +10214,10 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= - dependencies: - prelude-ls "~1.1.2" +type-fest@4.18.2: + version "4.18.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.18.2.tgz#8d765c42e7280a11f4d04fb77a00dacc417c8b05" + integrity sha512-+suCYpfJLAe4OXS6+PPXjW3urOS4IoP9waSiLuXfLgqZODKw/aWwASvzqE886wA0kQgGy0mIWyhd87VpqIy6Xg== type-fest@^0.18.0: version "0.18.1" @@ -11380,74 +10249,64 @@ type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== -typed-array-buffer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" - integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== +typed-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" + integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" - is-typed-array "^1.1.10" + call-bind "^1.0.7" + es-errors "^1.3.0" + is-typed-array "^1.1.13" -typed-array-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" - integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== +typed-array-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" + integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== dependencies: - call-bind "^1.0.2" + call-bind "^1.0.7" for-each "^0.3.3" - has-proto "^1.0.1" - is-typed-array "^1.1.10" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" -typed-array-byte-offset@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" - integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== +typed-array-byte-offset@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" + integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" for-each "^0.3.3" - has-proto "^1.0.1" - is-typed-array "^1.1.10" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" -typed-array-length@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" - integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== +typed-array-length@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" + integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== dependencies: - call-bind "^1.0.2" + call-bind "^1.0.7" for-each "^0.3.3" - is-typed-array "^1.1.9" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== -"typescript@>=3 < 6": - version "5.4.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" - integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== - -typescript@^5.2.2: - version "5.3.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" - integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== +"typescript@>=3 < 6", typescript@^5.2.2: + version "5.5.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba" + integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== uglify-js@^3.1.4: - version "3.13.5" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.5.tgz#5d71d6dbba64cf441f32929b1efce7365bb4f113" - integrity sha512-xtB8yEqIkn7zmOyS2zUNBsYCBRhDkvlNxMMY2smuJ/qA8NCHeQvKCF3i9Z4k8FJH4+PJvZRtMrPynfZ75+CSZw== - -unbox-primitive@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" - integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== - dependencies: - function-bind "^1.1.1" - has-bigints "^1.0.1" - has-symbols "^1.0.2" - which-boxed-primitive "^1.0.2" + version "3.19.2" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.19.2.tgz#319ae26a5fbd18d03c7dc02496cfa1d6f1cd4307" + integrity sha512-S8KA6DDI47nQXJSi2ctQ629YzwOVs+bQML6DAtvy0wgNdpi+0ySpQK0g2pxBq2xfF2z3YCscu7NNA8nXT9PlIQ== unbox-primitive@^1.0.2: version "1.0.2" @@ -11459,7 +10318,7 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" -unbzip2-stream@1.4.3: +unbzip2-stream@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7" integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg== @@ -11468,47 +10327,42 @@ unbzip2-stream@1.4.3: through "^2.3.8" underscore@>=1.7.0: - version "1.13.6" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.6.tgz#04786a1f589dc6c09f761fc5f45b89e935136441" - integrity sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A== + version "1.13.7" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.7.tgz#970e33963af9a7dda228f17ebe8399e5fbe63a10" + integrity sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g== -unicode-canonical-property-names-ecmascript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" - integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== +undici-types@~6.19.2: + version "6.19.8" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" + integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== -unicode-match-property-ecmascript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" - integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== - dependencies: - unicode-canonical-property-names-ecmascript "^1.0.4" - unicode-property-aliases-ecmascript "^1.0.4" +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== -unicode-match-property-value-ecmascript@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" - integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" -unicode-property-aliases-ecmascript@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57" - integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== +unicode-match-property-value-ecmascript@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" + integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" +unicode-property-aliases-ecmascript@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== uniq@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" - integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= + integrity sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA== unique-filename@^3.0.0: version "3.0.0" @@ -11536,11 +10390,6 @@ universal-user-agent@^6.0.0: resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.1.tgz#15f20f55da3c930c57bddbf1734c6654d5fd35aa" integrity sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ== -universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - universalify@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" @@ -11551,23 +10400,18 @@ universalify@^2.0.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - upath@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/upath/-/upath-2.0.1.tgz#50c73dea68d6f6b990f51d279ce6081665d61a8b" integrity sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w== -upath@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" - integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== +update-browserslist-db@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e" + integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ== + dependencies: + escalade "^3.1.2" + picocolors "^1.0.1" uri-js@^4.2.2: version "4.4.1" @@ -11576,11 +10420,6 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= - url-parse@^1.5.3, url-parse@~1.5.1: version "1.5.10" resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" @@ -11594,39 +10433,34 @@ urlpattern-polyfill@10.0.0: resolved "https://registry.yarnpkg.com/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz#f0a03a97bfb03cdf33553e5e79a2aadd22cac8ec" integrity sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg== -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - -util-deprecate@^1.0.1, util-deprecate@~1.0.1: +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +uuid@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-10.0.0.tgz#5a95aa454e6e002725c79055fd42aaba30ca6294" + integrity sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ== uuid@^3.3.2: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -uuid@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" - integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== - v8-compile-cache-lib@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== v8-to-istanbul@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz#b6f994b0b5d4ef255e17a0d17dc444a9f5132fa4" - integrity sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w== + version "9.3.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz#b9572abfa62bd556c16d75fdebc1a411d5ff3175" + integrity sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA== dependencies: "@jridgewell/trace-mapping" "^0.3.12" "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^1.6.0" + convert-source-map "^2.0.0" validate-npm-package-license@3.0.4, validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: version "3.0.4" @@ -11636,24 +10470,15 @@ validate-npm-package-license@3.0.4, validate-npm-package-license@^3.0.1, validat spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" -validate-npm-package-name@5.0.0, validate-npm-package-name@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz#f16afd48318e6f90a1ec101377fa0384cfc8c713" - integrity sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ== - dependencies: - builtins "^5.0.0" - -validate-npm-package-name@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" - integrity sha1-X6kS2B630MdK/BQN5zF/DKffQ34= - dependencies: - builtins "^1.0.3" +validate-npm-package-name@5.0.1, validate-npm-package-name@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz#a316573e9b49f3ccd90dbb6eb52b3f06c6d604e8" + integrity sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ== verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== dependencies: assert-plus "^1.0.0" core-util-is "1.0.2" @@ -11686,17 +10511,22 @@ w3c-xmlserializer@^4.0.0: dependencies: xml-name-validator "^4.0.0" +walk-up-path@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/walk-up-path/-/walk-up-path-3.0.1.tgz#c8d78d5375b4966c717eb17ada73dbd41490e886" + integrity sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA== + wcwidth@^1.0.0, wcwidth@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" - integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= + integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== dependencies: defaults "^1.0.3" web-streams-polyfill@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz#71c2718c52b45fd49dbeee88634b3a60ceab42a6" - integrity sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q== + version "3.3.3" + resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz#2073b91a2fdb1fbfbd401e7de0ac9f8214cecb4b" + integrity sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw== webidl-conversions@^3.0.0: version "3.0.1" @@ -11709,9 +10539,9 @@ webidl-conversions@^7.0.0: integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== wgsl_reflect@^1.0.1: - version "1.0.8" - resolved "https://registry.yarnpkg.com/wgsl_reflect/-/wgsl_reflect-1.0.8.tgz#7f6940ae9a49d5a125f3782ce710139357441945" - integrity sha512-0kdpA5H3SF2CMeCBijYqQz+ZT+uW310nJORFX8QPFOvrkfSGNPHFDE7aGPCUnsuDi1kzpj+9SEFIhqjf9iHGSQ== + version "1.0.9" + resolved "https://registry.yarnpkg.com/wgsl_reflect/-/wgsl_reflect-1.0.9.tgz#38719f27a3894f039af840e55179de2be988fc4f" + integrity sha512-NgO7ApUnFuB3FTsBVYjWizMIM5qOawlkSsi7j5BsYlMAW/e+j5IgB2M9kdKzR5lgUECFDSZZK3zdJ4yDmjfx4Q== whatwg-encoding@^2.0.0: version "2.0.0" @@ -11752,21 +10582,49 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" -which-typed-array@^1.1.11, which-typed-array@^1.1.13: - version "1.1.13" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.13.tgz#870cd5be06ddb616f504e7b039c4c24898184d36" - integrity sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow== +which-builtin-type@^1.1.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.4.tgz#592796260602fc3514a1b5ee7fa29319b72380c3" + integrity sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w== + dependencies: + function.prototype.name "^1.1.6" + has-tostringtag "^1.0.2" + is-async-function "^2.0.0" + is-date-object "^1.0.5" + is-finalizationregistry "^1.0.2" + is-generator-function "^1.0.10" + is-regex "^1.1.4" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.2" + which-typed-array "^1.1.15" + +which-collection@^1.0.1, which-collection@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" + integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== + dependencies: + is-map "^2.0.3" + is-set "^2.0.3" + is-weakmap "^2.0.2" + is-weakset "^2.0.3" + +which-typed-array@^1.1.13, which-typed-array@^1.1.14, which-typed-array@^1.1.15: + version "1.1.15" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" + integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.4" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" for-each "^0.3.3" gopd "^1.0.1" - has-tostringtag "^1.0.0" + has-tostringtag "^1.0.2" which@1.2.x: version "1.2.14" resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" - integrity sha1-mofEN48D6CfOyvGs31bHNsAcFOU= + integrity sha512-16uPglFkRPzgiUXYMi1Jf8Z5EzN1iB4V0ZtMXcHZnwsBtQhhHeCqoWw7tsUY42hJGNDWtUsVLTjakIa5BgAxCw== dependencies: isexe "^2.0.0" @@ -11791,7 +10649,7 @@ which@^4.0.0: dependencies: isexe "^3.1.1" -wide-align@^1.1.5: +wide-align@1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== @@ -11799,11 +10657,11 @@ wide-align@^1.1.5: string-width "^1.0.2 || 2 || 3 || 4" wkt-parser@^1.2.4: - version "1.3.2" - resolved "https://registry.yarnpkg.com/wkt-parser/-/wkt-parser-1.3.2.tgz#deeff04a21edc5b170a60da418e9ed1d1ab0e219" - integrity sha512-A26BOOo7sHAagyxG7iuRhnKMO7Q3mEOiOT4oGUmohtN/Li5wameeU4S6f8vWw6NADTVKljBs8bzA8JPQgSEMVQ== + version "1.3.3" + resolved "https://registry.yarnpkg.com/wkt-parser/-/wkt-parser-1.3.3.tgz#46b4e3032dd9c86907f7e630b57e3c6ea2bb772b" + integrity sha512-ZnV3yH8/k58ZPACOXeiHaMuXIiaTk1t0hSUVisbO0t4RjA5wPpUytcxeyiN2h+LZRrmuHIh/1UlrR9e7DHDvTw== -word-wrap@~1.2.3: +word-wrap@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== @@ -11811,7 +10669,7 @@ word-wrap@~1.2.3: wordwrap@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= + integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" @@ -11843,9 +10701,9 @@ wrap-ansi@^8.1.0: wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -write-file-atomic@5.0.1: +write-file-atomic@5.0.1, write-file-atomic@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-5.0.1.tgz#68df4717c55c6fa4281a7860b4c2ba0a6d2b11e7" integrity sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw== @@ -11883,20 +10741,15 @@ write-pkg@4.0.0: type-fest "^0.4.1" write-json-file "^3.2.0" -ws@8.16.0: - version "8.16.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.16.0.tgz#d1cd774f36fbc07165066a60e40323eab6446fd4" - integrity sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ== - ws@^7.4.6: - version "7.5.9" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" - integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + version "7.5.10" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" + integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== -ws@^8.11.0: - version "8.11.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" - integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== +ws@^8.11.0, ws@^8.18.0: + version "8.18.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" + integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== xml-name-validator@^4.0.0: version "4.0.0" @@ -11929,7 +10782,12 @@ y18n@^5.0.5: yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= + integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yallist@^4.0.0: version "4.0.0" @@ -11946,7 +10804,7 @@ yargs-parser@^20.2.2, yargs-parser@^20.2.3, yargs-parser@^20.2.9: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== -yargs@17.7.2, yargs@^17.6.2: +yargs@17.7.2, yargs@^17.6.2, yargs@^17.7.2: version "17.7.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== @@ -11975,7 +10833,7 @@ yargs@^16.2.0: yauzl@^2.10.0: version "2.10.0" resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" - integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= + integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== dependencies: buffer-crc32 "~0.2.3" fd-slicer "~1.1.0" @@ -11990,7 +10848,12 @@ yocto-queue@^0.1.0: resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== +zod@3.23.8: + version "3.23.8" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.23.8.tgz#e37b957b5d52079769fb8097099b592f0ef4067d" + integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g== + zstd-codec@^0.1: - version "0.1.4" - resolved "https://registry.yarnpkg.com/zstd-codec/-/zstd-codec-0.1.4.tgz#6abb311b63cfacbd06e72797ee6c6e1c7c65248c" - integrity sha512-KYnWoFWgGtWyQEKNnUcb3u8ZtKO8dn5d8u+oGpxPlopqsPyv60U8suDyfk7Z7UtAO6Sk5i1aVcAs9RbaB1n36A== + version "0.1.5" + resolved "https://registry.yarnpkg.com/zstd-codec/-/zstd-codec-0.1.5.tgz#c180193e4603ef74ddf704bcc835397d30a60e42" + integrity sha512-v3fyjpK8S/dpY/X5WxqTK3IoCnp/ZOLxn144GZVlNUjtwAchzrVo03h+oMATFhCIiJ5KTr4V3vDQQYz4RU684g==