@macrostrat/cesium-martini 1.3.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.idea/misc.xml ADDED
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="21" project-jdk-type="JavaSDK">
4
+ <output url="file://$PROJECT_DIR$/out" />
5
+ </component>
6
+ </project>
@@ -0,0 +1,8 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="ProjectModuleManager">
4
+ <modules>
5
+ <module fileurl="file://$PROJECT_DIR$/.idea/cesium-martini.iml" filepath="$PROJECT_DIR$/.idea/cesium-martini.iml" />
6
+ </modules>
7
+ </component>
8
+ </project>
@@ -0,0 +1,8 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="PrettierConfiguration">
4
+ <option name="myConfigurationMode" value="MANUAL" />
5
+ <option name="myRunOnSave" value="true" />
6
+ <option name="myFilesPattern" value="**/*.{js,ts,jsx,tsx,cjs,cts,mjs,mts,vue,astro,md}" />
7
+ </component>
8
+ </project>
package/.idea/vcs.xml ADDED
@@ -0,0 +1,20 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="IssueNavigationConfiguration">
4
+ <option name="links">
5
+ <list>
6
+ <IssueNavigationLink>
7
+ <option name="issueRegexp" value="\(#(\d+)\)" />
8
+ <option name="linkRegexp" value="https://github.com/davenquinn/cesium-martini/issues/$1" />
9
+ </IssueNavigationLink>
10
+ <IssueNavigationLink>
11
+ <option name="issueRegexp" value="\(#(\d+)\)" />
12
+ <option name="linkRegexp" value="https://github.com/davenquinn/martini/issues/$1" />
13
+ </IssueNavigationLink>
14
+ </list>
15
+ </option>
16
+ </component>
17
+ <component name="VcsDirectoryMappings">
18
+ <mapping directory="" vcs="Git" />
19
+ </component>
20
+ </project>
@@ -0,0 +1,125 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="AutoImportSettings">
4
+ <option name="autoReloadType" value="SELECTIVE" />
5
+ </component>
6
+ <component name="ChangeListManager">
7
+ <list default="true" id="c63fbe16-a437-4e92-9177-f56de7f7200d" name="Changes" comment="">
8
+ <change beforePath="$PROJECT_DIR$/README.md" beforeDir="false" afterPath="$PROJECT_DIR$/README.md" afterDir="false" />
9
+ <change beforePath="$PROJECT_DIR$/package.json" beforeDir="false" afterPath="$PROJECT_DIR$/package.json" afterDir="false" />
10
+ </list>
11
+ <option name="SHOW_DIALOG" value="false" />
12
+ <option name="HIGHLIGHT_CONFLICTS" value="true" />
13
+ <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
14
+ <option name="LAST_RESOLUTION" value="IGNORE" />
15
+ </component>
16
+ <component name="Git.Settings">
17
+ <option name="RECENT_BRANCH_BY_REPOSITORY">
18
+ <map>
19
+ <entry key="$PROJECT_DIR$" value="b35a980e6b6d6bdd4e6fe12f48dea9d5d1fee27a" />
20
+ </map>
21
+ </option>
22
+ <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
23
+ </component>
24
+ <component name="GitHubPullRequestSearchHistory">{
25
+ &quot;lastFilter&quot;: {
26
+ &quot;state&quot;: &quot;OPEN&quot;,
27
+ &quot;assignee&quot;: &quot;davenquinn&quot;
28
+ }
29
+ }</component>
30
+ <component name="GithubPullRequestsUISettings">{
31
+ &quot;selectedUrlAndAccountId&quot;: {
32
+ &quot;url&quot;: &quot;https://github.com/davenquinn/cesium-martini.git&quot;,
33
+ &quot;accountId&quot;: &quot;52565d3a-d148-4d26-a021-78a3e61fe000&quot;
34
+ }
35
+ }</component>
36
+ <component name="ProjectColorInfo">{
37
+ &quot;associatedIndex&quot;: 1
38
+ }</component>
39
+ <component name="ProjectId" id="2scR6KJfXRgKYtH9HK3HqkyDJQi" />
40
+ <component name="ProjectViewState">
41
+ <option name="autoscrollToSource" value="true" />
42
+ <option name="hideEmptyMiddlePackages" value="true" />
43
+ <option name="openDirectoriesWithSingleClick" value="true" />
44
+ <option name="showExcludedFiles" value="false" />
45
+ <option name="showLibraryContents" value="true" />
46
+ </component>
47
+ <component name="PropertiesComponent"><![CDATA[{
48
+ "keyToString": {
49
+ "RunOnceActivity.ShowReadmeOnStart": "true",
50
+ "RunOnceActivity.git.unshallow": "true",
51
+ "git-widget-placeholder": "overscaled-tiles",
52
+ "kotlin-language-version-configured": "true",
53
+ "last_opened_file_path": "/Users/Daven/Projects/Macrostrat/Software/cesium-martini/examples/vite/src",
54
+ "node.js.detected.package.eslint": "true",
55
+ "node.js.detected.package.tslint": "true",
56
+ "node.js.selected.package.eslint": "(autodetect)",
57
+ "node.js.selected.package.tslint": "(autodetect)",
58
+ "nodejs_package_manager_path": "yarn",
59
+ "prettierjs.PrettierConfiguration.Package": "yarn:package.json:prettier",
60
+ "project.structure.last.edited": "Modules",
61
+ "project.structure.proportion": "0.0",
62
+ "project.structure.side.proportion": "0.0",
63
+ "settings.editor.selected.configurable": "settings.javascript.prettier",
64
+ "ts.external.directory.path": "yarn:examples/_webpack-config/package.json:typescript",
65
+ "vue.rearranger.settings.migration": "true"
66
+ }
67
+ }]]></component>
68
+ <component name="RecentsManager">
69
+ <key name="CopyFile.RECENT_KEYS">
70
+ <recent name="$PROJECT_DIR$/examples/vite/src" />
71
+ <recent name="$PROJECT_DIR$/examples/vite-mapzen-worker" />
72
+ <recent name="$PROJECT_DIR$/examples" />
73
+ <recent name="$PROJECT_DIR$/examples/webpack-worker" />
74
+ </key>
75
+ <key name="MoveFile.RECENT_KEYS">
76
+ <recent name="$PROJECT_DIR$/examples/webpack" />
77
+ <recent name="$PROJECT_DIR$/examples/_shared" />
78
+ <recent name="$PROJECT_DIR$/examples/vite-mapzen-worker" />
79
+ </key>
80
+ </component>
81
+ <component name="SharedIndexes">
82
+ <attachedChunks>
83
+ <set>
84
+ <option value="bundled-jdk-9823dce3aa75-125ca727e0f0-intellij.indexing.shared.core-IU-243.23654.189" />
85
+ <option value="bundled-js-predefined-d6986cc7102b-822845ee3bb5-JavaScript-IU-243.23654.189" />
86
+ </set>
87
+ </attachedChunks>
88
+ </component>
89
+ <component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
90
+ <component name="TaskManager">
91
+ <task active="true" id="Default" summary="Default task">
92
+ <changelist id="c63fbe16-a437-4e92-9177-f56de7f7200d" name="Changes" comment="" />
93
+ <created>1738752699502</created>
94
+ <option name="number" value="Default" />
95
+ <option name="presentableId" value="Default" />
96
+ <updated>1738752699502</updated>
97
+ <workItem from="1738752700650" duration="46117000" />
98
+ <workItem from="1739406376299" duration="20669000" />
99
+ </task>
100
+ <servers />
101
+ </component>
102
+ <component name="TypeScriptGeneratedFilesManager">
103
+ <option name="version" value="3" />
104
+ <option name="exactExcludedFiles">
105
+ <list>
106
+ <option value="$PROJECT_DIR$/src/index.d.ts" />
107
+ </list>
108
+ </option>
109
+ </component>
110
+ <component name="Vcs.Log.Tabs.Properties">
111
+ <option name="TAB_STATES">
112
+ <map>
113
+ <entry key="MAIN">
114
+ <value>
115
+ <State />
116
+ </value>
117
+ </entry>
118
+ </map>
119
+ </option>
120
+ </component>
121
+ <component name="XSLT-Support.FileAssociations.UIState">
122
+ <expand />
123
+ <select />
124
+ </component>
125
+ </project>
package/.prettierrc ADDED
@@ -0,0 +1,3 @@
1
+ {
2
+ "proseWrap": "always"
3
+ }
package/README.md CHANGED
@@ -2,28 +2,30 @@
2
2
 
3
3
  **On-the-fly meshing of raster elevation tiles for the CesiumJS virtual globe**
4
4
 
5
+ [![npm version](https://badge.fury.io/js/@macrostrat%2Fcesium-martini.svg)](https://badge.fury.io/js/@macrostrat%2Fcesium-martini)
6
+
5
7
  ![Himalayas](/img/himalayas.jpg)
6
8
 
7
9
  This package contains a Cesium
8
10
  [TerrainProvider](https://cesium.com/docs/cesiumjs-ref-doc/TerrainProvider.html)
9
11
  that uses right-triangular irregular networks (RTIN) pioneered by
10
- [Mapbox's Martini](https://observablehq.com/@mourner/martin-real-time-rtin-terrain-mesh) to
11
- transform [Terrain-RGB elevation tiles](https://blog.mapbox.com/global-elevation-data-6689f1d0ba65) into
12
- [quantized mesh terrain](https://github.com/CesiumGS/quantized-mesh),
13
- for rendering in the [CesiumJS digital globe](https://cesium.com).
14
- The module provides a general technique applicable to all raster imagery
15
- (although the Terrain-RGB format is near-ideal for streaming elevation data).
16
- Fixes for performance and better control of rendering quality are in progress.
17
-
18
- This module was created to support our geologic map visualization work
19
- at [Macrostrat](https://macrostrat.org) and as a building block
20
- for future rich geoscience visualizations.
21
-
12
+ [Mapbox's Martini](https://observablehq.com/@mourner/martin-real-time-rtin-terrain-mesh)
13
+ to transform
14
+ [Terrain-RGB elevation tiles](https://blog.mapbox.com/global-elevation-data-6689f1d0ba65)
15
+ into [quantized mesh terrain](https://github.com/CesiumGS/quantized-mesh), for
16
+ rendering in the [CesiumJS digital globe](https://cesium.com). The module
17
+ provides a general technique applicable to all raster imagery (although the
18
+ Terrain-RGB format is near-ideal for streaming elevation data). Fixes for
19
+ performance and better control of rendering quality are in progress.
20
+
21
+ This module was created to support our geologic map visualization work at
22
+ [Macrostrat](https://macrostrat.org) and as a building block for future rich
23
+ geoscience visualizations.
22
24
 
23
25
  ## Installation
24
26
 
25
- This package is listed on NPM as `@macrostrat/cesium-martini`. It can be installed
26
- using the command
27
+ This package is listed on NPM as `@macrostrat/cesium-martini`. It can be
28
+ installed using the command
27
29
 
28
30
  ```
29
31
  npm install --save @macrostrat/cesium-martini
@@ -33,13 +35,12 @@ npm install --save @macrostrat/cesium-martini
33
35
 
34
36
  ## Development
35
37
 
36
- As of version `1.3.x`, `cesium-martini` development is tested with the Yarn package manager.
37
- Your mileage with `npm` may vary.
38
+ As of version `1.3.x`, `cesium-martini` development is tested with the Yarn
39
+ package manager. Your mileage with `npm` may vary.
38
40
 
39
41
  ### Quick start
40
42
 
41
43
  1. Clone the repository
42
- 2. Run `git submodule update --init` to fetch the [martini](https://github.com/mapbox/martini) submodule
43
44
  2. Install dependencies with `yarn install`
44
45
  3. Build the package with `yarn run build`
45
46
 
@@ -48,76 +49,93 @@ After cloning this repository, you can build the module (using Rollup) with
48
49
 
49
50
  ### Example applications
50
51
 
51
- Several example applications are available in the [`examples/`](examples/) directory and runnable from the root project.
52
- The main example is built with Vite and others are built with Webpack v5. As well as showing how to use this module, these examples contain configuration for bundling Cesium in each packaging environment.
52
+ Several example applications are available in the [`examples/`](examples/)
53
+ directory and runnable from the root project. The main example is built with
54
+ Vite and others are built with Webpack v5. As well as showing how to use this
55
+ module, these examples contain configuration for bundling Cesium in each
56
+ packaging system.
53
57
 
54
- To run an example application, add `MAPBOX_API_TOKEN=<your-mapbox-token>` to a `.env` file.
55
- in the root of this repository, and then start the appropriate example:
58
+ To run an example application, add `MAPBOX_API_TOKEN=<your-mapbox-token>` to a
59
+ `.env` file. in the root of this repository, and then start the appropriate
60
+ example:
56
61
 
57
62
  - `yarn run example` (Vite)
63
+ - `yarn run example:mapzen` (Vite + Mapzen)
58
64
  - `yarn run example:webpack` (Webpack)
65
+ - `yarn run example:webpack-mapzen` (Webpack + Mapzen)
59
66
  - `yarn run example:webpack-react` (Webpack + React)
60
67
 
61
- Contributions in the form of bug reports and pull requests are welcome.
62
- These can be to add functionality (e.g. optional normal-map generation) or for
68
+ Contributions in the form of bug reports and pull requests are welcome. These
69
+ can be to add functionality (e.g. optional normal-map generation) or for
63
70
  performance. See list of [known limitations](#current-known-limitations) below.
64
71
 
65
72
  ## Motivation
66
73
 
67
74
  The Cesium digital globe is a powerful platform for visualization of geospatial
68
- data in 3D. Cesium maintains a global elevation dataset as a prebuilt terrain mesh,
69
- which caches the computationally-intensive step of meshing height-field data
70
- into a triangle irregular network (TIN). Unfortunately, this
71
- [quantized mesh](https://github.com/CesiumGS/quantized-mesh) format is relatively
72
- new, narrowly supported and tailored to Cesium itself. Going forward, supporting
73
- a TIN format for elevation datasets requires maintenance of significant single-purpose
74
- processing pipelines and storage resources.
75
+ data in 3D. Cesium maintains a global elevation dataset as a prebuilt terrain
76
+ mesh, which caches the computationally-intensive step of meshing height-field
77
+ data into a triangle irregular network (TIN). Unfortunately, this
78
+ [quantized mesh](https://github.com/CesiumGS/quantized-mesh) format is
79
+ relatively new, narrowly supported and tailored to Cesium itself. Supporting a
80
+ TIN format for elevation datasets requires maintenance of significant
81
+ single-purpose processing pipelines and storage resources.
82
+
83
+ ### Fast raster meshing
75
84
 
76
85
  Mapbox maintains a multiscale global elevation dataset in their clever
77
86
  [terrain-RGB](https://blog.mapbox.com/global-elevation-data-6689f1d0ba65)
78
- format, which bridges web standard file formats (PNG images) with traditional raster GIS
79
- formats for representing terrain. Rasters are the standard representation of elevation data across the
80
- geosciences, and many pipelines are available to create and modify raster images.
81
- Basically any elevation dataset can be easily rescaled to the Terrain-RGB
82
- format, but the jump from there to a "Quantized mesh" is more complicated.
83
-
84
- Recently, the [MARTINI](https://github.com/mapbox/martini) project by
85
- [Vladimir Agafonkin](https://agafonkin.com/) at Mapbox demonstrated an
87
+ format, which bridges web standard file formats (PNG images) with traditional
88
+ raster GIS formats for representing terrain. Rasters are the standard
89
+ representation of elevation data across the geosciences, and many pipelines are
90
+ available to create and modify raster images. Basically any elevation dataset
91
+ can be easily rescaled to the Terrain-RGB format, but the jump from there to a
92
+ "Quantized mesh" is more complicated.
93
+
94
+ More recently, [Vladimir Agafonkin](https://agafonkin.com/) at Mapbox
95
+ demonstrated an
86
96
  [elegant algorithmic approach](https://observablehq.com/@mourner/martin-real-time-rtin-terrain-mesh)
87
- that sidesteps this issue.
88
- MARTINI meshes based on right-triangulated irregular networks (RTIN, _Evans et al., 1998_)
89
- and is far quicker than the traditional TIN generation techniques.
90
-
91
- A speedy meshing algorithm allows this data-preparation step to be handled
92
- in the browser after elevation tiles are loaded. Integrating this
93
- toolchain into the Cesium digital globe enables the usage of Mapbox global
94
- data and other raster terrain layers (e.g. planetary and bathymetric data!),
95
- without adding overhead of TIN processing and storage.
96
-
97
- ## Current limitations
98
-
99
- ### Lack of support for overzooming
100
-
101
- Cesium's implementations of the `TerrainProvider` interface are generally geared
102
- towards representing static terrain meshes. The RTIN algorithm used here can
103
- dynamically build meshes at a variety of error levels, and the input height
104
- field are data-dense and can represent extremely detailed meshes at a given zoom level. Currently,
105
- meshes are generated at levels of detail that undersample the available structure
106
- in a terrain tile — levels of detail are calibrated to what Cesium needs to
107
- render visually pleasing output at a given zoom level.
108
-
109
- A smarter and more parsimonious solution would use much lower zoom levels
110
- for terrain than imagery, using the full resolution of the dataset in
111
- mesh construction. Done correctly, this could lead to an extremely
112
- data-efficient and adaptive terrain render, but this seems to run somewhat
113
- counter to how Cesium internally manages levels of detail. Ideally, someone familiar with the inner workings
114
- of Cesium would provide some guidance here.
97
+ that sidesteps this issue. His [MARTINI](https://github.com/mapbox/martini)
98
+ project constructs meshes based on right-triangulated irregular networks (RTIN,
99
+ _Evans et al., 1998_) and is far quicker than the traditional TIN generation
100
+ techniques.
101
+
102
+ A speedy meshing algorithm allows this data-preparation step to be handled in
103
+ the browser after elevation tiles are loaded. Integrating this toolchain into
104
+ the Cesium digital globe enables the usage of Mapbox global data and other
105
+ raster terrain layers (e.g. planetary and bathymetric data!), without adding
106
+ overhead of TIN processing and storage.
107
+
108
+ ### Progressive mesh enhancement (added in version `1.5.0`)
109
+
110
+ Cesium `TerrainProvider`s are generally designed to represent static terrain
111
+ meshes. The RTIN algorithm used here can dynamically build meshes at a variety
112
+ of error levels, and the input height fields can represent extremely detailed
113
+ meshes at a given zoom level.
114
+
115
+ By default, meshes are generated at levels of detail that undersample the
116
+ available structure in a terrain tile, calibrated to what Cesium needs to render
117
+ visually pleasing output at a given zoom level. To more fully exploit the
118
+ available data, we can generate meshes at progressively higher resolution from
119
+ the same input data. This allows some zoom levels to be skipped, greatly
120
+ increasing efficiency.
121
+
122
+ This "overzooming" can be enabled using the `skipZoomLevels` configuration. For
123
+ instance, the below function will refuse to load tiles except in
124
+
125
+ ```js
126
+ function skipZoomLevels(z) {
127
+ return z % 3 != 0;
128
+ }
129
+ ```
130
+
131
+ The configuration also takes a single number and array.
115
132
 
116
133
  ### Outstanding bugs and issues
117
134
 
118
135
  - [x] High-resolution `@2x` tiles are notionally supported but not well-tested.
119
136
  - [ ] There is no formal testing framework to catch regressions.
120
- - [ ] TypeScript types are discarded on compilation rather than checked properly.
137
+ - [x] TypeScript types are discarded on compilation rather than checked
138
+ properly.
121
139
 
122
140
  ## Prior art and relevant examples
123
141
 
@@ -130,26 +148,41 @@ of Cesium would provide some guidance here.
130
148
  - [Cesium globe materials example](https://sandcastle.cesium.com/?src=Globe%20Materials.html)
131
149
  - [Cesium sky/atmosphere example](https://sandcastle.cesium.com/?src=Sky%20Atmosphere.html)
132
150
 
133
- ## TODO
151
+ ## Changelog
134
152
 
135
- - Make compatible with Mapbox's new `terrain-dem` tileset if possible
136
- - Better masking of unavailable tiles
137
- - Bathymetry option
138
- - Tie to hillshade generator so the same tiles are loaded
153
+ ### `[1.5.0]`: February 2025
139
154
 
140
- Pull requests for any and all of these priorities are appreciated!
155
+ - Allow overzooming of tiles when zoom levels are skipped
156
+ - Improve and deduplicate examples
157
+ - Fix typescript types
158
+ - Improve some internal organization of code
141
159
 
142
- ## Changelog
160
+ ### `[1.4.0]`: February 2025
161
+
162
+ - Merge [**PR #10**](https://github.com/davenquinn/cesium-martini/pull/10) from
163
+ [_Stuart Attenborrow_](https://github.com/stuarta0) to allow loading of
164
+ non-Mapbox terrain tiles
165
+ - Created Vite and Webpack examples of using the module with Mapzen Terrarium
166
+ tiles
167
+ - Migrated Vite examples to Vite 5
168
+ - Upgraded `axios` dependency
169
+ - Remove submodule dependency for `@mapbox/martini` in favor of directly
170
+ importing from [my fork](https://github.com/davenquinn/martini)
171
+ - Upgrade `yarn` to `4.6.0`
143
172
 
144
173
  ### `[1.3.0]`: September 2023
145
174
 
146
- - Add compilation to ESModules, which allows the package to be used with modern bundlers like [**Vite**](https://vitejs.dev). *Contributed by [@fc](https://github.com/fc).*
147
- - Change latitude-based scaling factor for tile error to improve fidelity at high latitudes.
175
+ - Add compilation to ESModules, which allows the package to be used with modern
176
+ bundlers like [**Vite**](https://vitejs.dev). _Contributed by
177
+ [@fc](https://github.com/fc)._
178
+ - Change latitude-based scaling factor for tile error to improve fidelity at
179
+ high latitudes.
148
180
  - Remove `regenerator-runtime` from web-worker code, targeting modern platforms.
149
181
 
150
182
  #### Development environment
151
183
 
152
- We reorganized the development environment and examples through a set of interrelated changes, for a more modern overall design.
184
+ We reorganized the development environment and examples for a more modern
185
+ overall design.
153
186
 
154
187
  - Switched to `yarn` from `npm` as the default package manager
155
188
  - Enabled Yarn Plug'n'Play for faster development
@@ -158,15 +191,15 @@ We reorganized the development environment and examples through a set of interre
158
191
  - Moved all examples to the `examples/` directory as Yarn workspaces, enabling
159
192
  separation of dependencies
160
193
 
161
-
162
194
  ### `[1.2.0]`: November 2021
163
195
 
164
196
  - Globe caps! (disable using the `fillPoles` option).
165
197
  - Some fixes for efficiency
166
198
  - Fixed small errors in tile occlusion code
167
- - Added a `minZoom` configuration option to prevent excessive loading of low-resolution tiles
168
- - Four (!) pull requests from [@stuarta0](https://github.com/stuarta0) to improve loading of non-Mapbox tilesets
169
-
199
+ - Added a `minZoom` configuration option to prevent excessive loading of
200
+ low-resolution tiles
201
+ - Four (!) pull requests from [@stuarta0](https://github.com/stuarta0) to
202
+ improve loading of non-Mapbox tilesets
170
203
 
171
204
  ### `[1.1.3]`: June 2021
172
205
 
@@ -175,8 +208,8 @@ We reorganized the development environment and examples through a set of interre
175
208
  ### `[1.1.2]`: May 2021
176
209
 
177
210
  - Fixed a bug with loading high-resolution tiles
178
- - Added a `skipOddLevels` option that significantly reduces the load of zooming through many terrain levels.
179
- This is enabled by default.
211
+ - Added a `skipOddLevels` option that significantly reduces the load of zooming
212
+ through many terrain levels. This is enabled by default.
180
213
  - Greatly increase skirt height
181
214
 
182
215
  ### `[1.1.0]`: May 2021
@@ -0,0 +1,3 @@
1
+ module.exports = {
2
+ presets: ["@babel/preset-env", "@babel/preset-typescript"],
3
+ };