+
+[![ArrowSource Example][ArrowSource]](./ArrowSource.html "ArrowSource")
+[![CircleSource Example][CircleSource]](./CircleSource.html "CircleSource")
+[![ConcentricCylinderSource Example][ConcentricCylinderSource]](./ConcentricCylinderSource.html "ConcentricCylinderSource")
+[![ConeSource Example][ConeSource]](./ConeSource.html "ConeSource")
+[![Cone Example][Cone]](./Cone.html "Cone source")
+[![CubeSource Example][CubeSource]](./CubeSource.html "CubeSource")
+[![Cursor3D Example][Cursor3D]](./Cursor3D.html "Cursor3D")
+[![CylinderSource Example][CylinderSource]](./CylinderSource.html "CylinderSource")
+[![LineSource Example][LineSource]](./LineSource.html "LineSource")
+[![PlaneSource Example][PlaneSource]](./PlaneSource.html "PlaneSource")
+[![PointSource Example][PointSource]](./PointSource.html "PointSource")
+[![SLICSource Example][SLICSource]](./SLICSource.html "SLICSource")
+[![SphereSource Example][SphereSource]](./SphereSource.html "SphereSource")
+[![WarpScalar Example][WarpScalargif]](./WarpScalar.html "WarpScalar")
+[![WindowedSincPolyDataFilter Example][WindowedSincPolyDataFilter]](./WindowedSincPolyDataFilter.html "WindowedSincPolyDataFilter")
+
+
+
+[ArrowSource]: ../docs/gallery/ArrowSource.jpg
+[CircleSource]: ../docs/gallery/CircleSource.jpg
+[ConcentricCylinderSource]: ../docs/gallery/ConcentricCylinderSource.jpg
+[ConeSource]: ../docs/gallery/ConeSource.jpg
+[Cone]: ../docs/gallery/Cone.jpg
+[CubeSource]: ../docs/gallery/CubeSource.jpg
+[Cursor3D]: ../docs/gallery/Cursor3D.gif
+[CylinderSource]: ../docs/gallery/CylinderSource.jpg
+[LineSource]: ../docs/gallery/LineSource.jpg
+[PlaneSource]: ../docs/gallery/PlaneSource.jpg
+[PointSource]: ../docs/gallery/PointSource.jpg
+[SLICSource]: ../docs/gallery/SLICSource.jpg
+[SphereSource]: ../docs/gallery/SphereSource.gif
+[WarpScalargif]: ../docs/gallery/WarpScalar.gif
+[WindowedSincPolyDataFilter]: ../docs/gallery/WindowedSincPolyDataFilter.gif
+
+# IO
+
+
+
+[![DracoReader Example][DracoReaderWithIcon]](./DracoReader.html "Draco reader(drc)")
+[![PLYReader Example][PLYReaderWithIcon]](./PLYReader.html "PLY reader(ply)")
+[![PLYWriter Example][PLYWriterWithIcon]](./PLYWriter.html "PLY writer(ply)")
+[![STLReader Example][STLReaderWithIcon]](./STLReader.html "STL reader(stl)")
+[![STLWriter Example][STLWriterWithIcon]](./STLWriter.html "STL writer(stl)")
+[![GLTFImporter Example][GLTFImporterWithIcon]](./GLTFImporter.html "GLTF importer(gltf, glb)")
+[![IFCImporter Example][IFCImporterWithIcon]](./IFCImporter.html "IFC importer(ifc)")
+[![PolyDataReader Example][PolyDataReaderWithIcon]](./PolyDataReader.html "VTK legacy reader(VTK)")
+[![ElevationReader Example][ElevationReaderWithIcon]](./ElevationReader.html "Elevation reader(CSV, JPG)")
+[![OBJReader Example][OBJReaderWithIcon]](./OBJReader.html "OBJ reader(OBJ, MTL, JPG)")
+[![PDBReader Example][PDBReaderWithIcon]](./PDBReader.html "PDB reader(OBJ, MTL, JPG)")
+[![XMLImageDataWriter Example][XMLImageDataWriterWithIcon]](./XMLImageDataWriter.html "ImageData XML writer(VTI)")
+[![XMLPolyDataDataWriter Example][XMLPolyDataWriterWithIcon]](./XMLPolyDataWriter.html "PolyData XML writer(VTP)")
+[![ZipHttpReader Example][ZipHttpReaderWithIcon]](./ZipHttpReader.html "ZIP http reader(ZIP)")
+[![HttpDataSetReader Example][HttpDataSetReaderWithIcon]](./HttpDataSetReader.html "Import a VTK dataset")
+[![HttpDataSetSeriesReader Example][HttpDataSetSeriesReaderWithIcon]](./HttpDataSetSeriesReader.html "Import a VTK dataset with time support.")
+[![HttpSceneLoader Example][HttpSceneLoaderWithIcon]](./HttpSceneLoader.html "Import a VTK scene (data + representation)")
+[![OfflineLocalView Example][OfflineLocalViewWithIcon]](./OfflineLocalView.html "Load a serialized scene (VTKSZ)")
+[![G-Code Example][GCodeReaderWithIcon]](./GCodeReader.html "G-Code reader(gcode)")
+[![HDRReader Example][HDRReaderWithIcon]](./HDRReader.html "Load an HDR image")
+[![TGAReader Example][TGAReaderWithIcon]](./TGAReader.html "Load a TGA image")
+[![TIFFReader Example][TIFFReaderWithIcon]](./TGAReader.html "Load a TIFF image")
+
+
+
+[DracoReaderWithIcon]: ../docs/gallery/DracoReaderWithIcon.jpg
+[PLYReaderWithIcon]: ../docs/gallery/PLYReaderWithIcon.jpg
+[PLYWriterWithIcon]: ../docs/gallery/PLYWriterWithIcon.jpg
+[STLReaderWithIcon]: ../docs/gallery/STLReaderWithIcon.jpg
+[STLWriterWithIcon]: ../docs/gallery/STLWriterWithIcon.jpg
+[GLTFImporterWithIcon]: ../docs/gallery/GLTFImporterWithIcon.jpg
+[IFCImporterWithIcon]: ../docs/gallery/IFCImporterWithIcon.jpg
+[PolyDataReaderWithIcon]: ../docs/gallery/VTKReaderWithIcon.jpg
+[ElevationReaderWithIcon]: ../docs/gallery/ElevationReaderWithIcon.jpg
+[OBJReaderWithIcon]: ../docs/gallery/OBJReaderWithIcon.jpg
+[PDBReaderWithIcon]: ../docs/gallery/PDBReaderWithIcon.jpg
+[XMLImageDataWriterWithIcon]: ../docs/gallery/XMLImageDataWriterWithIcon.jpg
+[XMLPolyDataWriterWithIcon]: ../docs/gallery/XMLPolyDataWriterWithIcon.jpg
+[ZipHttpReaderWithIcon]: ../docs/gallery/ZipHttpReaderWithIcon.jpg
+[HttpDataSetReaderWithIcon]: ../docs/gallery/HttpDataSetReaderWithIcon.jpg
+[HttpDataSetSeriesReaderWithIcon]: ../docs/gallery/HttpDataSetSeriesReaderWithIcon.gif
+[HttpSceneLoaderWithIcon]: ../docs/gallery/HttpSceneLoaderWithIcon.jpg
+[OfflineLocalViewWithIcon]: ../docs/gallery/OfflineLocalViewWithIcon.jpg
+[GCodeReaderWithIcon]: ../docs/gallery/GCodeReaderWithIcon.jpg
+[HDRReaderWithIcon]: ../docs/gallery/HDRReaderWithIcon.jpg
+[TGAReaderWithIcon]: ../docs/gallery/TGAReaderWithIcon.jpg
+[TIFFReaderWithIcon]: ../docs/gallery/TIFFReaderWithIcon.jpg
+
+# Actors
+
+
+
+[![ScalarBarActor Example][ScalarBarActor]](./ScalarBarActor.html "Scalar bar/color legend/LUT actor")
+[![Actor2D Example][Actor2D]](./Actor2D.html "Actor2D")
+[![CubeAxes Example][CubeAxes]](./CubeAxes.html "Cube axes around an actor")
+
+
+
+[ScalarBarActor]: ../docs/gallery/ScalarBarActor.jpg
+[Actor2D]: ../docs/gallery/Actor2D.jpg
+[CubeAxes]: ../docs/gallery/CubeAxes.jpg
+
+# Rendering
+
+
+
+[![DepthTest Example][DepthTest]](./DepthTest.html "Capture and render the depth buffer of the scene")
+[![Texture Example][Texture]](./Texture.html "Apply a texture on a sphere")
+[![Convolution2DPass Example][Convolution2DPass]](./Convolution2DPass.html "Convolution2DPass")
+[![ManyRenderers Example][ManyRenderers]](./ManyRenderers.html "ManyRenderers")
+[![ManyRenderWindows Example][ManyRenderWindows]](./ManyRenderWindows.html "ManyRenderWindows")
+
+
+
+[Convolution2DPass]: ../docs/gallery/Convolution2DPass.gif
+[DepthTest]: ../docs/gallery/DepthTest.jpg
+[Texture]: ../docs/gallery/Texture.jpg
+[ManyRenderers]: ../docs/gallery/ManyRenderers.gif
+[ManyRenderWindows]: ../docs/gallery/ManyRenderWindows.jpg
+
+## Geometry Rendering
+
+
+
+[![SphereMapper Example][SphereMapper]](./SphereMapper.html "GPU sphere mapper")
+[![StickMapper Example][StickMapper]](./StickMapper.html "GPU stick/cylinder/column mapper")
+[![Glyph3DMapper Example][Glyph3DMapper]](./Glyph3DMapper.html "Glyph mapper to render the same object multiple times")
+[![SphereArrays Example][SphereArray]](./SphereArray.html "SphereArray")
+[![GlyphRotation Example][GlyphRotation]](./GlyphRotation.html "Apply rotations on the glyph mapper")
+[![TimeSeries Example][TimeSeries]](./TimeSeries.html "Time based dataset")
+[![SurfaceLICMapper Example][SurfaceLICMapper]](./SurfaceLICMapper.html "Surface Line Integral Convolution (LIC) mapper")
+
+
+
+[SurfaceLICMapper]: ../docs/gallery/SurfaceLICMapper.jpg
+[Glyph3DMapper]: ../docs/gallery/Glyph3DMapper.jpg
+[SphereMapper]: ../docs/gallery/SphereMapper.jpg
+[StickMapper]: ../docs/gallery/StickMapper.jpg
+[SphereArray]: ../docs/gallery/SphereArray.jpg
+[GlyphRotation]: ../docs/gallery/GlyphRotation.jpg
+[TimeSeries]: ../docs/gallery/TimeSeries.gif
+
+## Image Rendering
+
+
+
+[![ImageLabelOutline Example][ImageLabelOutline]](./ImageLabelOutline.html "ImageLabelOutline")
+[![ImageMapper Example][ImageMapper]](./ImageMapper.html "2D orthogonal axis image mapper")
+[![ImageResliceMapper Example][ImageResliceMapper]](./ImageResliceMapper.html "GPU 2D reslice/oblique/MPR mapper")
+[![ImageCPRMapper Example][ImageCPRMapper]](./ImageCPRMapper.html "Curved Planar Reformat GPU mapper, stretched and straightened")
+[![VolumeOutline Example][VolumeOutline]](./VolumeOutline.html "VolumeOutline")
+
+
+
+[ImageLabelOutline]: ../docs/gallery/ImageLabelOutline.jpg
+[ImageCPRMapper]: ../docs/gallery/ImageCPRMapper.jpg
+[ImageResliceMapper]: ../docs/gallery/ImageResliceMapper.gif
+[ImageMapper]: ../docs/gallery/ImageMapper.jpg
+[VolumeOutline]: ../docs/gallery/VolumeOutline.jpg
+
+## Volume Rendering
+
+
+
+[![VolumeClipPlane Example][VolumeClipPlane]](./VolumeClipPlane.html "VolumeClipPlane")
+[![VolumeContour Example][VolumeContourgif]](./VolumeContour.html "VolumeContour")
+[![VolumeMapperBlendModes Example][VolumeMapperBlendModes]](./VolumeMapperBlendModes.html "VolumeMapperBlendModes")
+[![VolumeMapperLightAndShadow Example][VolumeMapperLightAndShadow]](./VolumeMapperLightAndShadow.html "VolumeMapperLightAndShadow")
+[![VolumeMapperParallelProjection Example][VolumeMapperParallelProjection]](./VolumeMapperParallelProjection.html "VolumeMapperParallelProjection")
+[![VolumeRenderingWithPolyData Example][VolumeRenderingWithPolyData]](./VolumeRenderingWithPolyData.html "VolumeRenderingWithPolyData")
+[![VolumeMapper Example][VolumeMapper]](./VolumeMapper.html "3D volume ray cast mapper witch volumetric scattering")
+[![LabelmapEdgeProjection Example][LabelmapEdgeProjection]](./LabelmapEdgeProjection.html "Labelmap edge projection in the volume")
+
+
+
+[VolumeClipPlane]: ../docs/gallery/VolumeClipPlane.jpg
+[VolumeContourgif]: ../docs/gallery/VolumeContour.gif
+[VolumeMapperBlendModes]: ../docs/gallery/VolumeMapperBlendModes.gif
+[VolumeMapperLightAndShadow]: ../docs/gallery/VolumeMapperLightAndShadow.jpg
+[VolumeMapperParallelProjection]: ../docs/gallery/VolumeMapperParallelProjection.jpg
+[VolumeRenderingWithPolyData]: ../docs/gallery/VolumeRenderingWithPolyData.jpg
+[VolumeMapper]: ../docs/gallery/VolumeMapper.jpg
+[LabelmapEdgeProjection]: ../docs/gallery/LabelmapEdgeProjection.gif
+
+
+# Interaction/Picking/Selecting
+
+
+
+[![DeviceOrientationToCamera Example][DeviceOrientationToCamera]](./DeviceOrientationToCamera.html "DeviceOrientationToCamera")
+[![InteractorStyleHMDXR Example][InteractorStyleHMDXR]](./InteractorStyleHMDXR.html "InteractorStyleHMDXR")
+[![InteractorStyleManipulator Example][InteractorStyleManipulator]](./InteractorStyleManipulator.html "InteractorStyleManipulator")
+[![InteractorStyleTrackballCamera Example][InteractorStyleTrackballCamera]](./InteractorStyleTrackballCamera.html "InteractorStyleTrackballCamera")
+[![InteractorStyleUnicam Example][InteractorStyleUnicam]](./InteractorStyleUnicam.html "InteractorStyleUnicam")
+[![KeyboardCameraManipulator Example][KeyboardCameraManipulator]](./KeyboardCameraManipulator.html "KeyboardCameraManipulator")
+[![MouseRangeManipulator Example][MouseRangeManipulator]](./MouseRangeManipulator.html "MouseRangeManipulator")
+[![PiecewiseGaussianWidget Example][PiecewiseGaussianWidget]](./PiecewiseGaussianWidget.html "PiecewiseGaussianWidget")
+[![TimeStepBasedAnimationHandler Example][TimeStepBasedAnimationHandler]](./TimeStepBasedAnimationHandler.html "TimeStepBasedAnimationHandler")
+[![CellPicker Example][CellPicker]](./CellPicker.html "CPU cell picker/selector")
+[![PointPicker Example][PointPicker]](./PointPicker.html "CPU point picker/selector")
+[![HardwareSelector Example][HardwareSelector]](./HardwareSelector.html "GPU point/cell picker/selector with properties")
+
+
+
+[DeviceOrientationToCamera]: ../docs/gallery/DeviceOrientationToCamera.jpg
+[InteractorStyleHMDXR]: ../docs/gallery/InteractorStyleHMDXR.jpg
+[InteractorStyleManipulator]: ../docs/gallery/InteractorStyleManipulator.jpg
+[InteractorStyleTrackballCamera]: ../docs/gallery/InteractorStyleTrackballCamera.jpg
+[InteractorStyleUnicam]: ../docs/gallery/InteractorStyleUnicam.jpg
+[KeyboardCameraManipulator]: ../docs/gallery/KeyboardCameraManipulator.jpg
+[MouseRangeManipulator]: ../docs/gallery/MouseRangeManipulator.jpg
+[PiecewiseGaussianWidget]: ../docs/gallery/PiecewiseGaussianWidget.jpg
+[TimeStepBasedAnimationHandler]: ../docs/gallery/TimeStepBasedAnimationHandler.gif
+[CellPicker]: ../docs/gallery/CellPicker.jpg
+[PointPicker]: ../docs/gallery/PointPicker.jpg
+[HardwareSelector]: ../docs/gallery/HardwareSelector.jpg
+
+# Widgets
+
+
+
+[![AngleWidget Example][AngleWidget]](./AngleWidget.html "Angle (radian, degree) widget example")
+[![Box Example][Box]](./Box.html "Box")
+[![ImageCroppingWidget Example][ImageCroppingWidget]](./ImageCroppingWidget.html "Crop/Clip volume rendering with a bounding box/cube/orthogonal planes")
+[![ImplicitPlaneWidget Example][ImplicitPlaneWidget]](./ImplicitPlaneWidget.html "Translate and orient an implicit plane with normal and origin")
+[![InteractiveOrientationWidget Example][InteractiveOrientationWidget]](./InteractiveOrientationWidget.html "Corner coordinate system orientation widget")
+[![LabelWidget Example][LabelWidget]](./LabelWidget.html "Place, edit text size and color of label widget")
+[![LineWidget Example][LineWidget]](./LineWidget.html "Place and edit line/distance widget with handles")
+[![PaintWidget Example][PaintWidget]](./PaintWidget.html "Draw strokes, create rectangle, square, ellipse and disk 2D widgets")
+[![PolyLineWidget Example][PolyLineWidget]](./PolyLineWidget.html "Place multiple connected handles with text")
+[![ResliceCursorWidget Example][ResliceCursorWidget]](./ResliceCursorWidget.html "Axial Coronal and Sagittal MPR/Oblique/Reformatted/Resliced/Slab/MIP views")
+[![ShapeWidget Example][ShapeWidget]](./ShapeWidget.html "2D shape widgets with text information")
+[![SphereWidget Example][SphereWidget]](./SphereWidget.html "2D sphere widget controlled with radius")
+[![SplineWidget Example][SplineWidget]](./PaintWidget.html "Widget to draw open or closed (triangularized) sharp/smooth polygon widget")
+
+
+
+[AngleWidget]: ../docs/gallery/AngleWidget.png
+[ImageCroppingWidget]: ../docs/gallery/ImageCroppingWidget.jpg
+[ImplicitPlaneWidget]: ../docs/gallery/ImplicitPlaneWidget.png
+[InteractiveOrientationWidget]: ../docs/gallery/InteractiveOrientationWidget.png
+[LabelWidget]: ../docs/gallery/LabelWidget.png
+[LineWidget]: ../docs/gallery/LineWidget.png
+[PaintWidget]: ../docs/gallery/PaintWidget.gif
+[PolyLineWidget]: ../docs/gallery/PolyLineWidget.png
+[ResliceCursorWidget]: ../docs/gallery/ResliceCursorWidget.gif
+[ShapeWidget]: ../docs/gallery/ShapeWidget.png
+[SphereWidget]: ../docs/gallery/SphereWidget.jpg
+[SplineWidget]: ../docs/gallery/SplineWidget.gif
+[Box]: ../docs/gallery/Box.jpg
+
+# Connectivity
+
+
+
+[![AR Example][ARWithLogo]](./AR.html "AR with WebXR")
+[![VR Example][VRWithLogo]](./VR.html "VR with WebXR")
+[![LookingGlass Example][LookingGlassWithLogo]](./LookingGlass.html "Render scene into a LookingGlass device")
+[![ItkWasmVolume Example][ItkWasmVolumeWithLogo]](./ItkWasmVolume.html "ItkWasmVolume")
+[![RemoteView Example][RemoteViewWithLogos]](./RemoteView.html "Connect a VTK or ParaView Python backend server via WebSockets")
+[![ImageStream Example][ImageStreamWithLogos]](./ImageStream.html "Stream a ParaView Python backend server via WebSockets under a VTK.js rendering")
+
+
+
+[ARWithLogo]: ../docs/gallery/ArConeWithLogo.jpg
+[VRWithLogo]: ../docs/gallery/VrConeWithLogo.jpg
+[LookingGlassWithLogo]: ../docs/gallery/LookingGlassConeWithLogo.jpg
+[ItkWasmVolumeWithLogo]: ../docs/gallery/ItkWasmVolumeWithLogo.jpg
+[RemoteViewWithLogos]: ../docs/gallery/RemoteViewWithLogos.jpg
+[ImageStreamWithLogos]: ../docs/gallery/ImageStreamWithLogos.jpg
diff --git a/Documentation/content/index.pug b/Documentation/content/index.pug
index 852c9474cba..d9bec4178f2 100644
--- a/Documentation/content/index.pug
+++ b/Documentation/content/index.pug
@@ -11,7 +11,7 @@ ul#intro-feature-list
.intro-feature-icon
i.fa.fa-cloud-download
h3.intro-feature-title
- a(href="https://www.npmjs.com/package/vtk.js").link Releases
+ a(href="https://www.npmjs.com/package/@kitware/vtk.js").link Releases
img(style="padding-left: 25px",src="https://badge.fury.io/js/vtk.js.svg")
p.intro-feature-desc VTK.js is a JavaScript library available for scientific visualization in your browser. The library is available via #[a(href="https://www.npmjs.com/package/vtk.js").link NPM] and #[a(href="https://www.npmjs.com/package/@kitware/vtk.js").link (NPM ESM)] or #[a(href="https://unpkg.com/vtk.js").link unpkg.com] CDN so it can directly be imported as a script tag inside your Web page like shown if that #[a(href="https://codepen.io/jourdain/pen/RQZWYa").link CodePen] example.
@@ -40,4 +40,4 @@ ul#intro-feature-list
p.intro-feature-desc VTK/Web Discourse is here to help you find any existing discussion
div#intro-get-started-wrap
- a(href="https://blog.kitware.com/vtk-js-the-visualization-toolkit-on-the-web/", id="intro-get-started-link") Want to read more?
+ a(href="https://blog.kitware.com/vtk-js-the-visualization-toolkit-on-the-web/", id="intro-get-started-link") Want to learn more?
diff --git a/Sources/Common/Core/DataArray/index.d.ts b/Sources/Common/Core/DataArray/index.d.ts
index 08573949c52..e3054c53e19 100644
--- a/Sources/Common/Core/DataArray/index.d.ts
+++ b/Sources/Common/Core/DataArray/index.d.ts
@@ -408,6 +408,10 @@ export function extend(
/**
* Method use to create a new instance of vtkDataArray
+ *
+ * If the provided `values` is a plain Array and `dataType` is not explicitly provided,
+ * then the vtkDataArray data type will be a Float32Array.
+ *
* @param {object} [initialValues] for pre-setting some of its content
*/
export function newInstance(initialValues?: object): vtkDataArray;
diff --git a/Sources/Common/Core/DataArray/index.js b/Sources/Common/Core/DataArray/index.js
index bfbfa0dc171..8bdba544a0a 100644
--- a/Sources/Common/Core/DataArray/index.js
+++ b/Sources/Common/Core/DataArray/index.js
@@ -534,6 +534,15 @@ const DEFAULT_VALUES = {
export function extend(publicAPI, model, initialValues = {}) {
Object.assign(model, DEFAULT_VALUES, initialValues);
+ if (
+ Array.isArray(initialValues.values) &&
+ initialValues.dataType === undefined
+ ) {
+ console.warn(
+ 'vtkDataArray.newInstance: no dataType provided, converting to Float32Array'
+ );
+ }
+
if (!model.empty && !model.values && !model.size) {
throw new TypeError(
'Cannot create vtkDataArray object without: size > 0, values'
diff --git a/Sources/Common/Core/LookupTable/test/testCategoricalColors.js b/Sources/Common/Core/LookupTable/test/testCategoricalColors.js
index 9e15f87c78c..88db510343b 100644
--- a/Sources/Common/Core/LookupTable/test/testCategoricalColors.js
+++ b/Sources/Common/Core/LookupTable/test/testCategoricalColors.js
@@ -13,7 +13,7 @@ import vtkPolyData from 'vtk.js/Sources/Common/DataModel/PolyData';
import baseline from './testCategoricalColors.png';
test.onlyIfWebGL('Test Categorical Colors', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkLookupTable TestCategoricalColors');
// testUtils.keepDOM();
@@ -108,15 +108,18 @@ test.onlyIfWebGL('Test Categorical Colors', (t) => {
renderWindow.addView(glwindow);
glwindow.setSize(400, 400);
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline],
- 'Common/Core/LookupTable/testCategoricalColors',
- t,
- 5,
- gc.releaseResources
- );
- });
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline],
+ 'Common/Core/LookupTable/testCategoricalColors',
+ t,
+ 5
+ )
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
+ return promise;
});
diff --git a/Sources/Common/Core/LookupTable/test/testScalarBar.js b/Sources/Common/Core/LookupTable/test/testScalarBar.js
index 94cf20dda3c..8a9f76cc35a 100644
--- a/Sources/Common/Core/LookupTable/test/testScalarBar.js
+++ b/Sources/Common/Core/LookupTable/test/testScalarBar.js
@@ -11,8 +11,8 @@ import vtkScalarBarActor from 'vtk.js/Sources/Rendering/Core/ScalarBarActor';
import baseline from './testScalarBar.png';
import baseline2 from './testScalarBar2.png';
-test('Test ScalarBar', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+test.onlyIfWebGL('Test ScalarBar', (t) => {
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkLookupTable TestScalarBar');
// Create some control UI
@@ -87,15 +87,18 @@ test('Test ScalarBar', (t) => {
renderer.resetCamera();
renderWindow.render();
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline, baseline2],
- 'Common/Core/LookupTable/testScalarBar',
- t,
- 5,
- gc.releaseResources
- );
- });
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline, baseline2],
+ 'Common/Core/LookupTable/testScalarBar',
+ t,
+ 5
+ )
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
+ return promise;
});
diff --git a/Sources/Common/Core/LookupTable/test/testSetTable.js b/Sources/Common/Core/LookupTable/test/testSetTable.js
index e87f49b8d3c..a15599ae30a 100644
--- a/Sources/Common/Core/LookupTable/test/testSetTable.js
+++ b/Sources/Common/Core/LookupTable/test/testSetTable.js
@@ -13,7 +13,7 @@ import vtkPolyData from 'vtk.js/Sources/Common/DataModel/PolyData';
import baseline from './testSetTable.png';
test.onlyIfWebGL('Test LookupTable setTable', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkLookupTable TestSetTable');
// testUtils.keepDOM();
@@ -132,15 +132,18 @@ test.onlyIfWebGL('Test LookupTable setTable', (t) => {
renderWindow.addView(glwindow);
glwindow.setSize(400, 400);
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline],
- 'Common/Core/LookupTable/testSetTable',
- t,
- 5,
- gc.releaseResources
- );
- });
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline],
+ 'Common/Core/LookupTable/testSetTable',
+ t,
+ 5
+ )
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
+ return promise;
});
diff --git a/Sources/Common/Core/URLExtract/index.js b/Sources/Common/Core/URLExtract/index.js
index 4a6408805c1..65402cd72d6 100644
--- a/Sources/Common/Core/URLExtract/index.js
+++ b/Sources/Common/Core/URLExtract/index.js
@@ -39,13 +39,8 @@ function extractURLParameters(
) {
const summary = {};
const convert = castToNativeType ? toNativeType : identity;
- const queryTokens = (query || '')
- .replace(/#.*/, '') // remove hash query
- .replace('?', '') // Remove ? from the head
- .split('&'); // extract token pair
-
- queryTokens.forEach((token) => {
- const [key, value] = token.split('=').map((s) => decodeURIComponent(s));
+ const params = new URLSearchParams(query);
+ params.forEach((value, key) => {
if (key) {
summary[key] = value ? convert(value) : true;
}
diff --git a/Sources/Common/DataModel/Cone/test/testConeImplicitFunction.js b/Sources/Common/DataModel/Cone/test/testConeImplicitFunction.js
index c497ec42f52..b50c3f8eebe 100644
--- a/Sources/Common/DataModel/Cone/test/testConeImplicitFunction.js
+++ b/Sources/Common/DataModel/Cone/test/testConeImplicitFunction.js
@@ -13,7 +13,7 @@ import vtkActor from 'vtk.js/Sources/Rendering/Core/Actor';
import baseline from './testConeImplicitFunction.png';
test.onlyIfWebGL('Test Cone Implicit Function', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'Cone Implicit Function');
// Create some control UI
@@ -59,15 +59,18 @@ test.onlyIfWebGL('Test Cone Implicit Function', (t) => {
renderWindow.render();
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline],
- 'Common/DataModel/Cone/testConeImplicitFunction',
- t,
- 1.0,
- gc.releaseResources
- );
- });
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline],
+ 'Common/DataModel/Cone/testConeImplicitFunction',
+ t,
+ 1.0
+ )
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
+ return promise;
});
diff --git a/Sources/Filters/Core/ThresholdPoints/example/controlPanel.html b/Sources/Filters/Core/ThresholdPoints/example/controlPanel.html
new file mode 100644
index 00000000000..774cab3b5c0
--- /dev/null
+++ b/Sources/Filters/Core/ThresholdPoints/example/controlPanel.html
@@ -0,0 +1,28 @@
+
\ No newline at end of file
diff --git a/Sources/Filters/Core/ThresholdPoints/example/index.js b/Sources/Filters/Core/ThresholdPoints/example/index.js
new file mode 100644
index 00000000000..5bdcdc4ecd0
--- /dev/null
+++ b/Sources/Filters/Core/ThresholdPoints/example/index.js
@@ -0,0 +1,176 @@
+import '@kitware/vtk.js/favicon';
+
+// Load the rendering pieces we want to use (for both WebGL and WebGPU)
+import '@kitware/vtk.js/Rendering/Profiles/Geometry';
+import '@kitware/vtk.js/Rendering/Profiles/Glyph';
+
+import vtkFullScreenRenderWindow from '@kitware/vtk.js/Rendering/Misc/FullScreenRenderWindow';
+import '@kitware/vtk.js/IO/Core/DataAccessHelper/HttpDataAccessHelper';
+
+import vtkActor from '@kitware/vtk.js/Rendering/Core/Actor';
+import vtkHttpDataSetReader from '@kitware/vtk.js/IO/Core/HttpDataSetReader';
+import vtkLookupTable from '@kitware/vtk.js/Common/Core/LookupTable';
+import vtkMapper from '@kitware/vtk.js/Rendering/Core/Mapper';
+import vtkThresholdPoints from '@kitware/vtk.js/Filters/Core/ThresholdPoints';
+import vtkCalculator from '@kitware/vtk.js/Filters/General/Calculator';
+import { FieldDataTypes } from '@kitware/vtk.js/Common/DataModel/DataSet/Constants';
+import { AttributeTypes } from '@kitware/vtk.js/Common/DataModel/DataSetAttributes/Constants';
+import vtkScalarBarActor from '@kitware/vtk.js/Rendering/Core/ScalarBarActor';
+
+import controlPanel from './controlPanel.html';
+
+const { ColorMode, ScalarMode } = vtkMapper;
+
+// ----------------------------------------------------------------------------
+// Standard rendering code setup
+// ----------------------------------------------------------------------------
+
+const fullScreenRenderer = vtkFullScreenRenderWindow.newInstance({
+ background: [0.9, 0.9, 0.9],
+});
+fullScreenRenderer.addController(controlPanel);
+
+const renderer = fullScreenRenderer.getRenderer();
+const renderWindow = fullScreenRenderer.getRenderWindow();
+
+// ----------------------------------------------------------------------------
+// Example code
+// ----------------------------------------------------------------------------
+
+const lookupTable = vtkLookupTable.newInstance({ hueRange: [0.666, 0] });
+
+const reader = vtkHttpDataSetReader.newInstance({ fetchGzip: true });
+reader.setUrl(`${__BASE_PATH__}/data/cow.vtp`).then(() => {
+ reader.loadData().then(() => {
+ renderer.resetCamera();
+ renderWindow.render();
+ });
+});
+
+const calc = vtkCalculator.newInstance();
+calc.setInputConnection(reader.getOutputPort());
+calc.setFormula({
+ getArrays: (inputDataSets) => ({
+ input: [{ location: FieldDataTypes.COORDINATE }], // Require point coordinates as input
+ output: [
+ // Generate two output arrays:
+ {
+ location: FieldDataTypes.POINT, // This array will be point-data ...
+ name: 'sine wave', // ... with the given name ...
+ dataType: 'Float64Array', // ... of this type ...
+ attribute: AttributeTypes.SCALARS, // ... and will be marked as the default scalars.
+ },
+ {
+ location: FieldDataTypes.UNIFORM, // This array will be field data ...
+ name: 'global', // ... with the given name ...
+ dataType: 'Float32Array', // ... of this type ...
+ numberOfComponents: 1, // ... with this many components ...
+ tuples: 1, // ... and this many tuples.
+ },
+ ],
+ }),
+ evaluate: (arraysIn, arraysOut) => {
+ // Convert in the input arrays of vtkDataArrays into variables
+ // referencing the underlying JavaScript typed-data arrays:
+ const [coords] = arraysIn.map((d) => d.getData());
+ const [sine, glob] = arraysOut.map((d) => d.getData());
+
+ // Since we are passed coords as a 3-component array,
+ // loop over all the points and compute the point-data output:
+ for (let i = 0, sz = coords.length / 3; i < sz; ++i) {
+ const dx = coords[3 * i] - 0.5;
+ const dy = coords[3 * i + 1] - 0.5;
+ sine[i] = 10 * dx * dx + dy * dy;
+ }
+ // Use JavaScript's reduce method to sum the output
+ // point-data array and set the uniform array's value:
+ glob[0] = sine.reduce((result, value) => result + value, 0);
+ // Mark the output vtkDataArray as modified
+ arraysOut.forEach((x) => x.modified());
+ },
+});
+
+const mapper = vtkMapper.newInstance({
+ interpolateScalarsBeforeMapping: true,
+ colorMode: ColorMode.DEFAULT,
+ scalarMode: ScalarMode.DEFAULT,
+ useLookupTableScalarRange: true,
+ lookupTable,
+});
+const actor = vtkActor.newInstance();
+actor.getProperty().setEdgeVisibility(true);
+
+const scalarBarActor = vtkScalarBarActor.newInstance();
+scalarBarActor.setScalarsToColors(lookupTable);
+renderer.addActor(scalarBarActor);
+
+const thresholder = vtkThresholdPoints.newInstance();
+thresholder.setInputConnection(calc.getOutputPort());
+
+mapper.setInputConnection(thresholder.getOutputPort());
+actor.setMapper(mapper);
+renderer.addActor(actor);
+
+// ----------------------------------------------------------------------------
+// UI control handling
+// ----------------------------------------------------------------------------
+
+const thresholdArray = document.querySelector('#thresholdArray');
+const thresholdOperation = document.querySelector('#thresholdOperation');
+const thresholdValue = document.querySelector('#thresholdValue');
+function updateCriterias(arrayName, operation, value) {
+ thresholder.setCriterias([
+ {
+ arrayName,
+ fieldAssociation: arrayName === 'sine wave' ? 'PointData' : 'Points',
+ operation,
+ value: Number(value),
+ },
+ ]);
+}
+function onCriteriaChanged(event) {
+ updateCriterias(
+ thresholdArray.value,
+ thresholdOperation.value,
+ thresholdValue.value
+ );
+ if (event != null) {
+ renderWindow.render();
+ }
+}
+onCriteriaChanged();
+function onArrayChanged(event) {
+ if (thresholdArray.value === 'x' || thresholdArray.value === 'y') {
+ thresholdValue.min = '-5';
+ thresholdValue.max = '5';
+ thresholdValue.step = '1';
+ thresholdValue.value = '0';
+ } else if (thresholdArray.value === 'z') {
+ thresholdValue.min = '-2';
+ thresholdValue.max = '2';
+ thresholdValue.step = '0.1';
+ thresholdValue.value = '0';
+ } else {
+ thresholdValue.min = 0;
+ thresholdValue.max = 256;
+ thresholdValue.step = 10;
+ thresholdValue.value = 30;
+ }
+ onCriteriaChanged(event);
+}
+thresholdArray.addEventListener('change', onArrayChanged);
+thresholdOperation.addEventListener('change', onCriteriaChanged);
+thresholdValue.addEventListener('input', onCriteriaChanged);
+
+// -----------------------------------------------------------
+// Make some variables global so that you can inspect and
+// modify objects in your browser's developer console:
+// -----------------------------------------------------------
+
+global.mapper = mapper;
+global.actor = actor;
+global.source = reader;
+global.renderer = renderer;
+global.renderWindow = renderWindow;
+global.lookupTable = lookupTable;
+global.thresholder = thresholder;
diff --git a/Sources/Filters/Core/ThresholdPoints/index.d.ts b/Sources/Filters/Core/ThresholdPoints/index.d.ts
new file mode 100644
index 00000000000..5eaeb484ed0
--- /dev/null
+++ b/Sources/Filters/Core/ThresholdPoints/index.d.ts
@@ -0,0 +1,72 @@
+import { vtkAlgorithm, vtkObject } from '../../../interfaces';
+
+export interface ThresholdCriteria {
+ arrayName: string;
+ fieldAssociation: string;
+ operation: string;
+ value: number;
+}
+
+/**
+ *
+ */
+export interface IThresholdPointsInitialValues {
+ criterias?: ThresholdCriteria[];
+}
+
+type vtkThresholdPointsBase = vtkObject & vtkAlgorithm;
+
+export interface vtkThresholdPoints extends vtkThresholdPointsBase {
+ /**
+ * Get the desired precision for the output types.
+ */
+ getCriterias(): ThresholdCriteria[];
+
+ /**
+ * Set the desired precision for the output types.
+ * @param outputPointsPrecision
+ */
+ setCriterias(criterias: ThresholdCriteria[]): boolean;
+
+ /**
+ *
+ * @param inData
+ * @param outData
+ */
+ requestData(inData: any, outData: any): void;
+}
+
+/**
+ * Method used to decorate a given object (publicAPI+model) with vtkThresholdPoints characteristics.
+ *
+ * @param publicAPI object on which methods will be bounds (public)
+ * @param model object on which data structure will be bounds (protected)
+ * @param {IThresholdPointsInitialValues} [initialValues] (default: {})
+ */
+export function extend(
+ publicAPI: object,
+ model: object,
+ initialValues?: IThresholdPointsInitialValues
+): void;
+
+/**
+ * Method used to create a new instance of vtkThresholdPoints
+ * @param {IThresholdPointsInitialValues} [initialValues] for pre-setting some of its content
+ */
+export function newInstance(
+ initialValues?: IThresholdPointsInitialValues
+): vtkThresholdPoints;
+
+/**
+ * vtkThresholdPoints - extracts points whose scalar value satisfies threshold criterion
+ *
+ * vtkThresholdPoints is a filter that extracts points from a dataset that
+ * satisfy a threshold criterion. The criterion can take three forms:
+ * 1) greater than a particular value; 2) less than a particular value; or
+ * 3) between a particular value. The output of the filter is polygonal data.
+ */
+export declare const vtkThresholdPoints: {
+ newInstance: typeof newInstance;
+ extend: typeof extend;
+};
+export default vtkThresholdPoints;
diff --git a/Sources/Filters/Core/ThresholdPoints/index.js b/Sources/Filters/Core/ThresholdPoints/index.js
new file mode 100644
index 00000000000..6df86871114
--- /dev/null
+++ b/Sources/Filters/Core/ThresholdPoints/index.js
@@ -0,0 +1,251 @@
+import macro from 'vtk.js/Sources/macros';
+import vtkCellArray from 'vtk.js/Sources/Common/Core/CellArray';
+import vtkDataArray from 'vtk.js/Sources/Common/Core/DataArray';
+import vtkPoints from 'vtk.js/Sources/Common/Core/Points';
+import vtkPolyData from 'vtk.js/Sources/Common/DataModel/PolyData';
+import { POLYDATA_FIELDS } from 'vtk.js/Sources/Common/DataModel/PolyData/Constants';
+
+const { vtkErrorMacro } = macro;
+
+const OperationType = {
+ Below: 'Below',
+ Above: 'Above',
+};
+
+// Function to perform binary search on a sorted array
+function binarySearch(items, value) {
+ let firstIndex = 0;
+ let lastIndex = items.length - 1;
+ let middleIndex = Math.floor((lastIndex + firstIndex) / 2);
+
+ while (items[middleIndex] !== value && firstIndex < lastIndex) {
+ if (value < items[middleIndex]) {
+ lastIndex = middleIndex - 1;
+ } else if (value > items[middleIndex]) {
+ firstIndex = middleIndex + 1;
+ }
+ middleIndex = Math.floor((lastIndex + firstIndex) / 2);
+ }
+
+ return {
+ found: items[middleIndex] === value,
+ index: Math.max(
+ items[middleIndex] < value ? middleIndex + 1 : middleIndex,
+ 0
+ ),
+ };
+}
+
+function camelize(str) {
+ return str
+ .replace(/(?:^\w|[A-Z]|\b\w)/g, (letter) => letter.toUpperCase())
+ .replace(/\s+/g, '');
+}
+// ----------------------------------------------------------------------------
+// vtkThresholdPoints methods
+// ----------------------------------------------------------------------------
+
+function vtkThresholdPoints(publicAPI, model) {
+ // Set our classname
+ model.classHierarchy.push('vtkThresholdPoints');
+
+ publicAPI.requestData = (inData, outData) => {
+ const input = inData[0];
+ const output = vtkPolyData.newInstance();
+ outData[0] = output;
+
+ if (model.criterias.length === 0) {
+ output.shallowCopy(input);
+ return;
+ }
+ const oldPoints = input.getPoints();
+ const oldPointCount = oldPoints.getNumberOfPoints();
+ const oldPointData = input.getPointData();
+ const oldPointsData = oldPoints.getData();
+ const newPointsData = macro.newTypedArray(
+ input.getPoints().getDataType(),
+ 3 * oldPointCount
+ );
+ const oldArrays = [];
+ const newArraysData = [];
+ const numArrays = oldPointData.getNumberOfArrays();
+ for (let i = 0; i < numArrays; ++i) {
+ const oldArray = oldPointData.getArrayByIndex(i);
+ oldArrays.push(oldArray);
+ newArraysData.push(
+ macro.newTypedArray(
+ oldArray.getDataType(),
+ oldPointCount * oldArray.getNumberOfComponents()
+ )
+ );
+ }
+ const pointAcceptanceFunctions = model.criterias.map((criteria) => {
+ let inputArray = null;
+ let component = 0;
+ let numberOfComponents = 1;
+ if (criteria.fieldAssociation === 'PointData') {
+ inputArray = oldArrays.find(
+ (oldArray) => oldArray.getName() === criteria.arrayName
+ );
+ numberOfComponents = inputArray.getNumberOfComponents();
+ } else if (criteria.fieldAssociation === 'Points') {
+ inputArray = oldPoints;
+ if (criteria.arrayName === 'z') {
+ component = 2;
+ } else {
+ component = criteria.arrayName === 'y' ? 1 : 0;
+ }
+ numberOfComponents = 3;
+ } else {
+ vtkErrorMacro('No field association');
+ }
+ const inputArrayData = inputArray.getData();
+ const operation =
+ criteria.operation === OperationType.Below
+ ? (a, b) => a < b
+ : (a, b) => a > b;
+ const pointAcceptanceFunction = (pointId) =>
+ operation(
+ inputArrayData[numberOfComponents * pointId + component],
+ criteria.value
+ );
+ return pointAcceptanceFunction;
+ });
+
+ const thresholdedPointIds = []; // sorted list
+ let newI = 0;
+ for (let i = 0; i < oldPointCount; ++i) {
+ const keepPoint = pointAcceptanceFunctions.reduce(
+ (keep, pointAcceptanceFunction) => keep && pointAcceptanceFunction(i),
+ true
+ );
+ if (keepPoint) {
+ let ii = 3 * i;
+ let newII = 3 * newI;
+ for (let c = 0; c < 3; ++c) {
+ newPointsData[newII++] = oldPointsData[ii++];
+ }
+ for (let j = 0; j < numArrays; ++j) {
+ const oldArrayData = oldArrays[j].getData();
+ const newArrayData = newArraysData[j];
+ const cc = oldArrays[j].getNumberOfComponents();
+ ii = cc * i;
+ newII = cc * newI;
+ for (let c = 0; c < cc; ++c) {
+ newArrayData[newII++] = oldArrayData[ii++];
+ }
+ }
+ ++newI;
+ } else {
+ thresholdedPointIds.push(i);
+ }
+ }
+ if (thresholdedPointIds.length === 0) {
+ output.shallowCopy(input);
+ return;
+ }
+
+ output.setPoints(
+ vtkPoints.newInstance({ values: newPointsData, size: 3 * newI })
+ );
+ for (let i = 0; i < numArrays; ++i) {
+ const oldArray = oldArrays[i];
+ const newArray = vtkDataArray.newInstance({
+ name: oldArray.getName(),
+ values: newArraysData[i],
+ dataType: oldArray.getDataType(),
+ numberOfComponents: oldArray.getNumberOfComponents(),
+ size: newI * oldArray.getNumberOfComponents(),
+ });
+ output.getPointData().addArray(newArray);
+ oldPointData.getAttributes(oldArray).forEach((attrType) => {
+ output.getPointData().setAttribute(newArray, attrType);
+ });
+ }
+
+ POLYDATA_FIELDS.forEach((cellType) => {
+ const oldPolysData = input[`get${camelize(cellType)}`]().getData();
+ const newCellData = macro.newTypedArray(
+ input.getPolys().getDataType(),
+ oldPolysData.length
+ );
+ const newPointIds = []; // first point starts at [1]
+ const firstPointIndex = cellType === 'verts' ? 0 : 1;
+ let numberOfPoints = 1;
+ let newP = 0;
+ for (
+ let c = 0;
+ c < oldPolysData.length;
+ c += numberOfPoints + firstPointIndex
+ ) {
+ if (firstPointIndex === 1) {
+ // not for verts
+ numberOfPoints = oldPolysData[c];
+ }
+ let keepCell = true;
+
+ for (let p = firstPointIndex; p <= numberOfPoints; ++p) {
+ const { found, index } = binarySearch(
+ thresholdedPointIds,
+ oldPolysData[c + p]
+ );
+ if (found) {
+ keepCell = false;
+ break;
+ }
+ newPointIds[p] = oldPolysData[c + p] - index;
+ }
+ if (keepCell) {
+ newCellData[newP++] = numberOfPoints;
+ for (let p = firstPointIndex; p <= numberOfPoints; ) {
+ newCellData[newP++] = newPointIds[p++];
+ }
+ }
+ }
+ output[`set${camelize(cellType)}`](
+ vtkCellArray.newInstance({
+ values: newCellData,
+ size: newP, // it may shorter than original array if cells are not kept
+ dataType: input.getPolys().getDataType(),
+ })
+ );
+ });
+
+ outData[0] = output;
+ };
+}
+
+// ----------------------------------------------------------------------------
+
+function defaultValues(publicAPI, model, initialValues = {}) {
+ return {
+ criterias: [], // arrayName: string, fieldAssociation: string, operation: string, value: number
+ ...initialValues,
+ };
+}
+
+// ----------------------------------------------------------------------------
+
+export function extend(publicAPI, model, initialValues = {}) {
+ Object.assign(model, defaultValues(publicAPI, model, initialValues));
+
+ // Build VTK API
+ macro.setGet(publicAPI, model, []);
+ macro.get(publicAPI, model, []);
+ macro.setGetArray(publicAPI, model, ['criterias']);
+
+ // Make this a VTK object
+ macro.obj(publicAPI, model);
+ macro.algo(publicAPI, model, 1, 1);
+
+ // Object specific methods
+ vtkThresholdPoints(publicAPI, model);
+}
+
+// ----------------------------------------------------------------------------
+
+export const newInstance = macro.newInstance(extend, 'vtkThresholdPoints');
+
+// ----------------------------------------------------------------------------
+
+export default { newInstance, extend, OperationType };
diff --git a/Sources/Filters/General/AppendPolyData/test/testAppendPolyData.js b/Sources/Filters/General/AppendPolyData/test/testAppendPolyData.js
index 34afa8b99c6..64602297a2e 100644
--- a/Sources/Filters/General/AppendPolyData/test/testAppendPolyData.js
+++ b/Sources/Filters/General/AppendPolyData/test/testAppendPolyData.js
@@ -90,7 +90,7 @@ test('Test addInputData edge case', (t) => {
});
test.onlyIfWebGL('Test vtkAppendPolyData rendering', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkAppendPolyData Rendering');
// Create some control UI
@@ -162,15 +162,18 @@ test.onlyIfWebGL('Test vtkAppendPolyData rendering', (t) => {
camera.azimuth(40);
renderer.resetCamera();
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline],
- 'Filters/General/AppendPolyData/testAppendPolyData',
- t,
- 2.5,
- gc.releaseResources
- );
- });
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline],
+ 'Filters/General/AppendPolyData/testAppendPolyData',
+ t,
+ 2.5
+ )
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
+ return promise;
});
diff --git a/Sources/Filters/General/ContourTriangulator/helper.js b/Sources/Filters/General/ContourTriangulator/helper.js
index 89aa0326947..7b8aa995783 100644
--- a/Sources/Filters/General/ContourTriangulator/helper.js
+++ b/Sources/Filters/General/ContourTriangulator/helper.js
@@ -1775,6 +1775,7 @@ export function vtkCCSFindCuts(
// Search for potential cuts (need to find two cuts)
let cutId = 0;
+
cuts[0][0] = 0;
cuts[0][1] = 0;
cuts[1][0] = 0;
@@ -2016,12 +2017,15 @@ export function vtkCCSCutHoleyPolys(
// Do a quick search first, then do an exhaustive search.
let madeCut = 0;
let inner = 0;
+ const cuts = [
+ [0, 0],
+ [0, 0],
+ ];
for (let exhaustive = 0; exhaustive < 2 && !madeCut; exhaustive++) {
for (let j = 1; j < polyGroup.length; j++) {
inner = innerBySize[j][1];
innerPolyId = polyGroup[inner];
- const cuts = [];
if (
vtkCCSFindCuts(
polys,
diff --git a/Sources/Filters/General/ImageDataOutlineFilter/test/testImageDataOutlineFilter.js b/Sources/Filters/General/ImageDataOutlineFilter/test/testImageDataOutlineFilter.js
index f12e81aaa4a..5f9a47539b6 100644
--- a/Sources/Filters/General/ImageDataOutlineFilter/test/testImageDataOutlineFilter.js
+++ b/Sources/Filters/General/ImageDataOutlineFilter/test/testImageDataOutlineFilter.js
@@ -22,7 +22,7 @@ import baselineFaces from './testImageDataOutlineFilter_Faces.png';
import baselineLines from './testImageDataOutlineFilter_Lines.png';
test.onlyIfWebGL('Test ImageDataOutlineFilter', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+ const gc = testUtils.createGarbageCollector();
// Create some control UI
const container = document.querySelector('body');
@@ -140,21 +140,17 @@ test.onlyIfWebGL('Test ImageDataOutlineFilter', (t) => {
idoline.setGenerateLines(true);
idoline.setGenerateFaces(false);
- let resolve;
- const promise = new Promise((res) => {
- resolve = res;
- });
-
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baselineLines],
- 'Filters/General/ImageDataOutlineFilter_Lines',
- t,
- 1,
- resolve
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baselineLines],
+ 'Filters/General/ImageDataOutlineFilter_Lines',
+ t,
+ 1
+ )
);
- });
renderWindow.render();
return promise;
@@ -169,29 +165,23 @@ test.onlyIfWebGL('Test ImageDataOutlineFilter', (t) => {
idoline.setGenerateLines(false);
idoline.setGenerateFaces(true);
- let resolve;
- const promise = new Promise((res) => {
- resolve = res;
- });
-
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baselineFaces],
- 'Filters/General/ImageDataOutlineFilter_Faces',
- t,
- 1,
- resolve
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baselineFaces],
+ 'Filters/General/ImageDataOutlineFilter_Faces',
+ t,
+ 1
+ )
);
- });
renderWindow.render();
return promise;
}
- [
- testImageDataOutlineAsLines,
- testImageDataOutlineAsFaces,
- gc.releaseResources,
- ].reduce((current, next) => current.then(next), Promise.resolve());
+ return [testImageDataOutlineAsLines, testImageDataOutlineAsFaces]
+ .reduce((current, next) => current.then(next), Promise.resolve())
+ .finally(gc.releaseResources);
});
diff --git a/Sources/Filters/General/MoleculeToRepresentation/test/testMultipleBonds.js b/Sources/Filters/General/MoleculeToRepresentation/test/testMultipleBonds.js
index 774ea973598..d57809990d1 100644
--- a/Sources/Filters/General/MoleculeToRepresentation/test/testMultipleBonds.js
+++ b/Sources/Filters/General/MoleculeToRepresentation/test/testMultipleBonds.js
@@ -14,7 +14,7 @@ import testMolecule from 'vtk.js/Data/molecule/test-multiple-bonds.cjson';
import baseline from './testMolecule_multiple_bonds.png';
test.onlyIfWebGL('Test MultipleBonds', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+ const gc = testUtils.createGarbageCollector();
t.ok('Filter: MoleculeToRepresentation');
// Create some control UI
@@ -71,15 +71,18 @@ test.onlyIfWebGL('Test MultipleBonds', (t) => {
glwindow.setSize(400, 400);
// capturing and comparing the images
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline],
- 'Filters/General/MoleculeToRepresentation/testMultipleBonds',
- t,
- 1,
- gc.releaseResources
- );
- });
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline],
+ 'Filters/General/MoleculeToRepresentation/testMultipleBonds',
+ t,
+ 1
+ )
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
+ return promise;
});
diff --git a/Sources/Filters/General/OBBTree/test/testOBBTree.js b/Sources/Filters/General/OBBTree/test/testOBBTree.js
index df643a9b4d4..68637e66d90 100644
--- a/Sources/Filters/General/OBBTree/test/testOBBTree.js
+++ b/Sources/Filters/General/OBBTree/test/testOBBTree.js
@@ -1,4 +1,5 @@
import test from 'tape';
+import testUtils from 'vtk.js/Sources/Testing/testUtils';
import vtkCubeSource from 'vtk.js/Sources/Filters/Sources/CubeSource';
import vtkMath from 'vtk.js/Sources/Common/Core/Math';
@@ -92,11 +93,12 @@ test('Test OBB tree transform', (t) => {
});
test('Test OBB tree deep copy', (t) => {
- const source = vtkCubeSource.newInstance();
+ const gc = testUtils.createGarbageCollector(t);
+ const source = gc.registerResource(vtkCubeSource.newInstance());
source.update();
- const mesh = source.getOutputData();
+ const mesh = gc.registerResource(source.getOutputData());
- const obbTreeSource = vtkOBBTree.newInstance();
+ const obbTreeSource = gc.registerResource(vtkOBBTree.newInstance());
obbTreeSource.setDataset(mesh);
obbTreeSource.setMaxLevel(2);
obbTreeSource.setAutomatic(false);
@@ -110,7 +112,7 @@ test('Test OBB tree deep copy', (t) => {
obbTreeSource.computeOBBFromDataset(mesh, corner, max, mid, min, size);
const sourceNode = obbTreeSource.getTree();
- const obbTreeTarget = vtkOBBTree.newInstance();
+ const obbTreeTarget = gc.registerResource(vtkOBBTree.newInstance());
obbTreeTarget.deepCopy(obbTreeSource);
const copiedTree = obbTreeTarget.getTree();
@@ -135,7 +137,7 @@ test('Test OBB tree deep copy', (t) => {
'Cells per node'
);
- t.end();
+ gc.releaseResources();
});
test('Test OBB tree collision', (t) => {
diff --git a/Sources/Filters/General/PaintFilter/test/testPaintEllipse.js b/Sources/Filters/General/PaintFilter/test/testPaintEllipse.js
index e34959e5ce0..a2fc767d305 100644
--- a/Sources/Filters/General/PaintFilter/test/testPaintEllipse.js
+++ b/Sources/Filters/General/PaintFilter/test/testPaintEllipse.js
@@ -23,7 +23,7 @@ test.onlyIfWebGL(
const ellipseCenter = [(size / 2) * spacing, (size / 2) * spacing, zSlice];
const ellipseScale = [radius * spacing, 2 * radius * spacing, 10];
- const gc = testUtils.createGarbageCollector(t);
+ const gc = testUtils.createGarbageCollector();
// Create some control UI
const container = document.querySelector('body');
@@ -99,18 +99,21 @@ test.onlyIfWebGL(
renderWindow.addView(glwindow);
glwindow.setSize(400, 400);
- paintFilter.endStroke().then(() => {
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline],
- 'Filters/General/PaintFilter/test/testPaintEllipse',
- t,
- 1,
- gc.releaseResources
- );
- });
+ return paintFilter.endStroke().then(() => {
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline],
+ 'Filters/General/PaintFilter/test/testPaintEllipse',
+ t,
+ 1
+ )
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
+ return promise;
});
}
);
diff --git a/Sources/Filters/General/TubeFilter/test/testTubeColors.js b/Sources/Filters/General/TubeFilter/test/testTubeColors.js
index 7c21377bb6d..77d9ac3ddf9 100644
--- a/Sources/Filters/General/TubeFilter/test/testTubeColors.js
+++ b/Sources/Filters/General/TubeFilter/test/testTubeColors.js
@@ -118,7 +118,7 @@ test('Test vtkTubeFilter colorMapping', (t) => {
});
test.onlyIfWebGL('Test vtkTubeFilter color map rendering', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+ const gc = testUtils.createGarbageCollector();
// Create some control UI
const container = document.querySelector('body');
@@ -154,15 +154,19 @@ test.onlyIfWebGL('Test vtkTubeFilter color map rendering', (t) => {
camera.yaw(40);
renderer.resetCamera();
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline],
- 'Filters/General/TubeFilter/testTubeColors',
- t,
- 2.5,
- gc.releaseResources
- );
- });
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline],
+ 'Filters/General/TubeFilter/testTubeColors',
+ t,
+ 2.5
+ )
+ )
+ .finally(gc.releaseResources);
+
renderWindow.render();
+ return promise;
});
diff --git a/Sources/Filters/General/TubeFilter/test/testTubeFilter.js b/Sources/Filters/General/TubeFilter/test/testTubeFilter.js
index 1969b9a0d1f..5d5d5114282 100644
--- a/Sources/Filters/General/TubeFilter/test/testTubeFilter.js
+++ b/Sources/Filters/General/TubeFilter/test/testTubeFilter.js
@@ -120,7 +120,7 @@ test('Test vtkTubeFilter execution', (t) => {
});
test.onlyIfWebGL('Test vtkTubeFilter rendering', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkTubeFilter Rendering');
// Create some control UI
@@ -170,17 +170,20 @@ test.onlyIfWebGL('Test vtkTubeFilter rendering', (t) => {
camera.yaw(40);
renderer.resetCamera();
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline],
- 'Filters/General/TubeFilter/testTubeFilter',
- t,
- 2.5,
- gc.releaseResources
- );
- });
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline],
+ 'Filters/General/TubeFilter/testTubeFilter',
+ t,
+ 2.5
+ )
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
+ return promise;
});
test('Test vtkTubeFilter numberOfPoints', (t) => {
diff --git a/Sources/Filters/Sources/ConcentricCylinderSource/test/testConcentricCylinder.js b/Sources/Filters/Sources/ConcentricCylinderSource/test/testConcentricCylinder.js
index 56cb74c03b4..7c9f837ab65 100644
--- a/Sources/Filters/Sources/ConcentricCylinderSource/test/testConcentricCylinder.js
+++ b/Sources/Filters/Sources/ConcentricCylinderSource/test/testConcentricCylinder.js
@@ -11,7 +11,7 @@ import vtkMapper from 'vtk.js/Sources/Rendering/Core/Mapper';
import baseline from './testConcentricCylinder.png';
test.onlyIfWebGL('Test vtkConcentricCylinderSource Rendering', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkConcentricCylinderSource Rendering');
// Create some control UI
@@ -59,15 +59,18 @@ test.onlyIfWebGL('Test vtkConcentricCylinderSource Rendering', (t) => {
renderWindow.addView(glwindow);
glwindow.setSize(400, 400);
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline],
- 'Filters/Sources/ConcentricCylinderSource/testConcenticCylinder',
- t,
- 2.5,
- gc.releaseResources
- );
- });
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline],
+ 'Filters/Sources/ConcentricCylinderSource/testConcenticCylinder',
+ t,
+ 2.5
+ )
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
+ return promise;
});
diff --git a/Sources/Filters/Sources/ConeSource/test/testCone.js b/Sources/Filters/Sources/ConeSource/test/testCone.js
index 632f5328fa5..4d4482d4fa2 100644
--- a/Sources/Filters/Sources/ConeSource/test/testCone.js
+++ b/Sources/Filters/Sources/ConeSource/test/testCone.js
@@ -12,7 +12,7 @@ import vtkMapper from 'vtk.js/Sources/Rendering/Core/Mapper';
import baseline from './testCone.png';
test.onlyIfWebGL('Test vtkConeSource Rendering', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkConeSource Rendering');
// Create some control UI
@@ -55,15 +55,18 @@ test.onlyIfWebGL('Test vtkConeSource Rendering', (t) => {
renderWindow.addView(glwindow);
glwindow.setSize(400, 400);
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline],
- 'Filters/Sources/ConeSource/testCone',
- t,
- 2.5,
- gc.releaseResources
- );
- });
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline],
+ 'Filters/Sources/ConeSource/testCone',
+ t,
+ 2.5
+ )
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
+ return promise;
});
diff --git a/Sources/Filters/Sources/CubeSource/test/testCube.js b/Sources/Filters/Sources/CubeSource/test/testCube.js
index 8b2922a78c8..6cb2c552695 100644
--- a/Sources/Filters/Sources/CubeSource/test/testCube.js
+++ b/Sources/Filters/Sources/CubeSource/test/testCube.js
@@ -12,7 +12,7 @@ import baseline1 from './testCube.png';
import baseline2 from './testCube_2.png';
test.onlyIfWebGL('Test vtkCubeSource Rendering', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkCubeSource Rendering');
// Create some control UI
@@ -73,15 +73,18 @@ test.onlyIfWebGL('Test vtkCubeSource Rendering', (t) => {
renderWindow.addView(glwindow);
glwindow.setSize(400, 400);
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline1, baseline2],
- 'Filters/Sources/CubeSource/testCube',
- t,
- 2.5,
- gc.releaseResources
- );
- });
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline1, baseline2],
+ 'Filters/Sources/CubeSource/testCube',
+ t,
+ 2.5
+ )
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
+ return promise;
});
diff --git a/Sources/Filters/Sources/CylinderSource/test/testCylinder.js b/Sources/Filters/Sources/CylinderSource/test/testCylinder.js
index ab137acd4c6..b06be576938 100644
--- a/Sources/Filters/Sources/CylinderSource/test/testCylinder.js
+++ b/Sources/Filters/Sources/CylinderSource/test/testCylinder.js
@@ -12,7 +12,7 @@ import vtkMapper from 'vtk.js/Sources/Rendering/Core/Mapper';
import baseline from './testCylinder.png';
test.onlyIfWebGL('Test vtkCylinderSource Rendering', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkCylinderSource Rendering');
// Create some control UI
@@ -55,15 +55,18 @@ test.onlyIfWebGL('Test vtkCylinderSource Rendering', (t) => {
renderWindow.addView(glwindow);
glwindow.setSize(400, 400);
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline],
- 'Filters/Sources/CylinderSource/testCylinder',
- t,
- 2.5,
- gc.releaseResources
- );
- });
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline],
+ 'Filters/Sources/CylinderSource/testCylinder',
+ t,
+ 2.5
+ )
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
+ return promise;
});
diff --git a/Sources/Filters/Sources/LineSource/test/testLine.js b/Sources/Filters/Sources/LineSource/test/testLine.js
index d9dd5291e78..ba8e208cd52 100644
--- a/Sources/Filters/Sources/LineSource/test/testLine.js
+++ b/Sources/Filters/Sources/LineSource/test/testLine.js
@@ -11,7 +11,7 @@ import vtkMapper from 'vtk.js/Sources/Rendering/Core/Mapper';
import baseline from './baseline.png';
test.onlyIfWebGL('Test vtkLineSource Rendering', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkLineSource Rendering');
// Create some control UI
@@ -44,15 +44,18 @@ test.onlyIfWebGL('Test vtkLineSource Rendering', (t) => {
renderWindow.addView(glwindow);
glwindow.setSize(400, 400);
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline],
- 'Filters/Sources/LineSource/testLine',
- t,
- 1,
- gc.releaseResources
- );
- });
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline],
+ 'Filters/Sources/LineSource/testLine',
+ t,
+ 1
+ )
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
+ return promise;
});
diff --git a/Sources/Filters/Sources/PlaneSource/test/testPlane.js b/Sources/Filters/Sources/PlaneSource/test/testPlane.js
index 7de3f13e4c3..91ca9cecaca 100644
--- a/Sources/Filters/Sources/PlaneSource/test/testPlane.js
+++ b/Sources/Filters/Sources/PlaneSource/test/testPlane.js
@@ -12,7 +12,7 @@ import vtkMapper from 'vtk.js/Sources/Rendering/Core/Mapper';
import baseline from './testPlane.png';
test.onlyIfWebGL('Test vtkPlaneSource Rendering', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkPlaneSource Rendering');
// Create some control UI
@@ -59,16 +59,19 @@ test.onlyIfWebGL('Test vtkPlaneSource Rendering', (t) => {
renderWindow.addView(glwindow);
glwindow.setSize(400, 400);
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline],
- 'Filters/Sources/PlaneSource/testPlane',
- t,
- 1,
- gc.releaseResources
- );
- });
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline],
+ 'Filters/Sources/PlaneSource/testPlane',
+ t,
+ 1
+ )
+ )
+ .finally(gc.releaseResources);
renderer.resetCamera();
renderWindow.render();
+ return promise;
});
diff --git a/Sources/Filters/Sources/PointSource/test/testPointSource.js b/Sources/Filters/Sources/PointSource/test/testPointSource.js
index add1a4f4230..52e31954a3b 100644
--- a/Sources/Filters/Sources/PointSource/test/testPointSource.js
+++ b/Sources/Filters/Sources/PointSource/test/testPointSource.js
@@ -12,7 +12,7 @@ import * as vtkMath from 'vtk.js/Sources/Common/Core/Math';
import basepoint from './testPointSource.png';
test.onlyIfWebGL('Test vtkPointSource Rendering', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkPointSource Rendering');
// Create some control UI
@@ -48,15 +48,18 @@ test.onlyIfWebGL('Test vtkPointSource Rendering', (t) => {
renderWindow.addView(glwindow);
glwindow.setSize(400, 400);
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [basepoint],
- 'Filters/Sources/PointSource/testPointSource',
- t,
- 1.0,
- gc.releaseResources
- );
- });
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [basepoint],
+ 'Filters/Sources/PointSource/testPointSource',
+ t,
+ 1.0
+ )
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
+ return promise;
});
diff --git a/Sources/IO/Geometry/DracoReader/example/index.js b/Sources/IO/Geometry/DracoReader/example/index.js
index 26466b986b1..0eaa10df760 100644
--- a/Sources/IO/Geometry/DracoReader/example/index.js
+++ b/Sources/IO/Geometry/DracoReader/example/index.js
@@ -49,16 +49,13 @@ function update() {
// Dynamic script loading from CDN
// ----------------------------------------------------------------------------
-// Prevent error when draco try to set the export on module
-window.module = {};
-
// Add new script tag with draco CDN
vtkResourceLoader
- .loadScript('https://unpkg.com/draco3d@1.3.4/draco_decoder_nodejs.js')
- .then(() => {
+ .loadScript('https://unpkg.com/draco3d@1.5.7/draco_decoder_nodejs.js')
+ .then(async () => {
// Set decoder function to the vtk reader
- vtkDracoReader.setDracoDecoder(window.CreateDracoModule);
-
+ // eslint-disable-next-line no-undef
+ await vtkDracoReader.setDracoDecoder(DracoDecoderModule);
// Trigger data download
reader
.setUrl(
diff --git a/Sources/IO/Geometry/DracoReader/index.d.ts b/Sources/IO/Geometry/DracoReader/index.d.ts
index cf63c658be0..4545268060e 100755
--- a/Sources/IO/Geometry/DracoReader/index.d.ts
+++ b/Sources/IO/Geometry/DracoReader/index.d.ts
@@ -118,15 +118,15 @@ export function newInstance(
): vtkDracoReader;
/**
- *
+ * Get the draco decoder
*/
export function getDracoDecoder(): any;
/**
- *
- * @param createDracoModule
+ * Set the draco decoder
+ * @param dracoDecoder
*/
-export function setDracoDecoder(createDracoModule: any): void;
+export function setDracoDecoder(dracoDecoder: any): Promise
;
/**
* Load the WASM decoder from url and set the decoderModule
diff --git a/Sources/IO/Geometry/DracoReader/index.js b/Sources/IO/Geometry/DracoReader/index.js
index a07ef724002..58076989029 100644
--- a/Sources/IO/Geometry/DracoReader/index.js
+++ b/Sources/IO/Geometry/DracoReader/index.js
@@ -1,8 +1,9 @@
-import DataAccessHelper from 'vtk.js/Sources/IO/Core/DataAccessHelper';
import macro from 'vtk.js/Sources/macros';
+import DataAccessHelper from 'vtk.js/Sources/IO/Core/DataAccessHelper';
import vtkCellArray from 'vtk.js/Sources/Common/Core/CellArray';
import vtkDataArray from 'vtk.js/Sources/Common/Core/DataArray';
import vtkPolyData from 'vtk.js/Sources/Common/DataModel/PolyData';
+import vtkPolyDataNormals from 'vtk.js/Sources/Filters/Core/PolyDataNormals';
// Enable data soure for DataAccessHelper
import 'vtk.js/Sources/IO/Core/DataAccessHelper/LiteHttpDataAccessHelper'; // Just need HTTP
@@ -11,8 +12,7 @@ import 'vtk.js/Sources/IO/Core/DataAccessHelper/LiteHttpDataAccessHelper'; // Ju
// import 'vtk.js/Sources/IO/Core/DataAccessHelper/JSZipDataAccessHelper'; // zip
const { vtkErrorMacro } = macro;
-let decoderModule = {};
-
+let decoderModule = null;
// ----------------------------------------------------------------------------
// static methods
// ----------------------------------------------------------------------------
@@ -52,8 +52,12 @@ function setWasmBinary(url, binaryName) {
});
}
-function setDracoDecoder(createDracoModule) {
- decoderModule = createDracoModule({});
+/**
+ * Set the Draco decoder module
+ * @param {*} dracoDecoder
+ */
+async function setDracoDecoder(dracoDecoder) {
+ decoderModule = await dracoDecoder({});
}
function getDracoDecoder() {
@@ -63,161 +67,192 @@ function getDracoDecoder() {
// ----------------------------------------------------------------------------
// vtkDracoReader methods
// ----------------------------------------------------------------------------
-
-function decodeBuffer(buffer) {
- const byteArray = new Int8Array(buffer);
- const decoder = new decoderModule.Decoder();
- const decoderBuffer = new decoderModule.DecoderBuffer();
- decoderBuffer.Init(byteArray, byteArray.length);
-
- const geometryType = decoder.GetEncodedGeometryType(decoderBuffer);
-
- let dracoGeometry;
- if (geometryType === decoderModule.TRIANGULAR_MESH) {
- dracoGeometry = new decoderModule.Mesh();
- const status = decoder.DecodeBufferToMesh(decoderBuffer, dracoGeometry);
- if (!status.ok()) {
- vtkErrorMacro(`Could not decode Draco file: ${status.error_msg()}`);
- }
- } else {
- vtkErrorMacro('Wrong geometry type, expected mesh, got point cloud.');
+function getDracoDataType(attributeType) {
+ switch (attributeType) {
+ case Float32Array:
+ return decoderModule.DT_FLOAT32;
+ case Int8Array:
+ return decoderModule.DT_INT8;
+ case Int16Array:
+ return decoderModule.DT_INT16;
+ case Int32Array:
+ return decoderModule.DT_INT32;
+ case Uint8Array:
+ return decoderModule.DT_UINT8;
+ case Uint16Array:
+ return decoderModule.DT_UINT16;
+ case Uint32Array:
+ return decoderModule.DT_UINT32;
+ default:
+ return decoderModule.DT_FLOAT32;
}
-
- decoderModule.destroy(decoderBuffer);
- decoderModule.destroy(decoder);
- return dracoGeometry;
}
-function getDracoAttributeAsFloat32Array(dracoGeometry, attributeId) {
- const decoder = new decoderModule.Decoder();
- const attribute = decoder.GetAttribute(dracoGeometry, attributeId);
- const numberOfComponents = attribute.num_components();
- const numberOfPoints = dracoGeometry.num_points();
-
- const attributeData = new decoderModule.DracoFloat32Array();
- decoder.GetAttributeFloatForAllPoints(
+/**
+ * Decode a single attribute
+ * @param {*} decoder The Draco decoder
+ * @param {*} dracoGeometry The geometry to decode
+ * @param {*} attributeName The name of the attribute
+ * @param {*} attributeType The type of the attribute
+ * @param {*} attribute The attribute to decode
+ * @returns object with name, array, itemSize
+ */
+function decodeAttribute(
+ decoder,
+ dracoGeometry,
+ attributeName,
+ attributeType,
+ attribute
+) {
+ const numComponents = attribute.num_components();
+ const numPoints = dracoGeometry.num_points();
+ const numValues = numPoints * numComponents;
+
+ const byteLength = numValues * attributeType.BYTES_PER_ELEMENT;
+ const dataType = getDracoDataType(attributeType);
+
+ const ptr = decoderModule._malloc(byteLength);
+ decoder.GetAttributeDataArrayForAllPoints(
dracoGeometry,
attribute,
- attributeData
+ dataType,
+ byteLength,
+ ptr
);
- let i = numberOfPoints * numberOfComponents;
- const attributeArray = new Float32Array(i);
- while (i--) {
- attributeArray[i] = attributeData.GetValue(i);
- }
-
- return attributeArray;
-}
+ // eslint-disable-next-line new-cap
+ const array = new attributeType(
+ decoderModule.HEAPF32.buffer,
+ ptr,
+ numValues
+ ).slice();
-function getPolyDataFromDracoGeometry(dracoGeometry) {
- const decoder = new decoderModule.Decoder();
+ decoderModule._free(ptr);
- // Get position attribute ID
- const positionAttributeId = decoder.GetAttributeId(
- dracoGeometry,
- decoderModule.POSITION
- );
-
- if (positionAttributeId === -1) {
- console.error('No position attribute found in the decoded model.');
- decoderModule.destroy(decoder);
- decoderModule.destroy(dracoGeometry);
- return null;
- }
+ return {
+ name: attributeName,
+ array,
+ itemSize: numComponents,
+ };
+}
- const positionArray = getDracoAttributeAsFloat32Array(
- dracoGeometry,
- positionAttributeId,
- decoderModule
- );
+/**
+ * Decode the indices of the geometry
+ * @param {*} decoder The Draco decoder
+ * @param {*} dracoGeometry The geometry to decode
+ * @returns The indices array of the geometry
+ */
+function decodeIndices(decoder, dracoGeometry) {
+ const numFaces = dracoGeometry.num_faces();
+ const numIndices = numFaces * 3;
+ const byteLength = numIndices * 4;
+
+ const ptr = decoderModule._malloc(byteLength);
+ decoder.GetTrianglesUInt32Array(dracoGeometry, byteLength, ptr);
+ const indices = new Uint32Array(
+ decoderModule.HEAPF32.buffer,
+ ptr,
+ numIndices
+ ).slice();
+ decoderModule._free(ptr);
+ return indices;
+}
- // Read indices
- let i = dracoGeometry.num_faces();
- const indices = new Uint32Array(i * 4);
- const indicesArray = new decoderModule.DracoInt32Array();
- while (i--) {
- decoder.GetFaceFromMesh(dracoGeometry, i, indicesArray);
- const index = i * 4;
- indices[index] = 3;
- indices[index + 1] = indicesArray.GetValue(0);
- indices[index + 2] = indicesArray.GetValue(1);
- indices[index + 3] = indicesArray.GetValue(2);
+/**
+ * Get the polyData from the Draco geometry
+ * @param {*} decoder The Draco decoder
+ * @param {*} dracoGeometry The geometry to decode
+ * @returns {vtkPolyData} The polyData of the geometry
+ */
+function getPolyDataFromDracoGeometry(decoder, dracoGeometry) {
+ const indices = decodeIndices(decoder, dracoGeometry);
+ const nCells = indices.length - 2;
+
+ const cells = vtkCellArray.newInstance();
+ cells.resize((4 * indices.length) / 3);
+ for (let cellId = 0; cellId < nCells; cellId += 3) {
+ const cell = indices.slice(cellId, cellId + 3);
+ cells.insertNextCell(cell);
}
- // Create polyData and add positions and indinces
- const cellArray = vtkCellArray.newInstance({ values: indices });
- const polyData = vtkPolyData.newInstance({ polys: cellArray });
- polyData.getPoints().setData(positionArray);
+ const polyData = vtkPolyData.newInstance({ polys: cells });
- // Look for other attributes
- const pointData = polyData.getPointData();
-
- // Normals
- const normalAttributeId = decoder.GetAttributeId(
- dracoGeometry,
- decoderModule.NORMAL
- );
-
- if (normalAttributeId !== -1) {
- const normalArray = getDracoAttributeAsFloat32Array(
- dracoGeometry,
- decoderModule.NORMAL,
- decoderModule
- );
-
- const normals = vtkDataArray.newInstance({
- numberOfComponents: 3,
- values: normalArray,
- name: 'Normals',
- });
- pointData.setNormals(normals);
- }
+ // Look for attributes
+ const attributeIDs = {
+ points: 'POSITION',
+ normals: 'NORMAL',
+ scalars: 'COLOR',
+ tcoords: 'TEX_COORD',
+ };
- // Texture coordinates
- const texCoordAttributeId = decoder.GetAttributeId(
- dracoGeometry,
- decoderModule.TEX_COORD
- );
+ Object.keys(attributeIDs).forEach((attributeName) => {
+ const attributeType = Float32Array;
- if (texCoordAttributeId !== -1) {
- const texCoordArray = getDracoAttributeAsFloat32Array(
+ const attributeID = decoder.GetAttributeId(
dracoGeometry,
- texCoordAttributeId,
- decoderModule
+ decoderModule[attributeIDs[attributeName]]
);
- const texCoords = vtkDataArray.newInstance({
- numberOfComponents: 2,
- values: texCoordArray,
- name: 'TCoords',
- });
- pointData.setTCoords(texCoords);
- }
+ if (attributeID === -1) return;
- // Scalars
- const colorAttributeId = decoder.GetAttributeId(
- dracoGeometry,
- decoderModule.COLOR
- );
+ const attribute = decoder.GetAttribute(dracoGeometry, attributeID);
- if (colorAttributeId !== -1) {
- const colorArray = getDracoAttributeAsFloat32Array(
+ const attributeResult = decodeAttribute(
+ decoder,
dracoGeometry,
- colorAttributeId,
- decoderModule
+ attributeName,
+ attributeType,
+ attribute
);
- const scalars = vtkDataArray.newInstance({
- numberOfComponents: 3,
- values: colorArray,
- name: 'Scalars',
- });
+ const pointData = polyData.getPointData();
+ switch (attributeName) {
+ case 'points':
+ polyData
+ .getPoints()
+ .setData(attributeResult.array, attributeResult.itemSize);
+ break;
+ case 'normals':
+ pointData.setNormals(
+ vtkDataArray.newInstance({
+ numberOfComponents: attributeResult.itemSize,
+ values: attributeResult.array,
+ name: 'Normals',
+ })
+ );
+ break;
+ case 'scalars':
+ pointData.setScalars(
+ vtkDataArray.newInstance({
+ numberOfComponents: attributeResult.itemSize,
+ values: attributeResult.array,
+ name: 'Scalars',
+ })
+ );
+ break;
+ case 'tcoords':
+ pointData.setTCoords(
+ vtkDataArray.newInstance({
+ numberOfComponents: attributeResult.itemSize,
+ values: attributeResult.array,
+ name: 'TCoords',
+ })
+ );
+ break;
+ default:
+ break;
+ }
+ });
- pointData.setScalars(scalars);
+ // we will generate normals if they're missing
+ const hasNormals = polyData.getPointData().getNormals();
+ if (!hasNormals) {
+ const pdn = vtkPolyDataNormals.newInstance();
+ pdn.setInputData(polyData);
+ pdn.setComputePointNormals(true);
+ return pdn.getOutputData();
}
- decoderModule.destroy(decoder);
return polyData;
}
@@ -285,9 +320,30 @@ function vtkDracoReader(publicAPI, model) {
}
model.parseData = content;
- const dracoGeometry = decodeBuffer(content);
- const polyData = getPolyDataFromDracoGeometry(dracoGeometry);
+
+ const byteArray = new Int8Array(content);
+
+ const decoder = new decoderModule.Decoder();
+ const buffer = new decoderModule.DecoderBuffer();
+ buffer.Init(byteArray, byteArray.length);
+
+ const geometryType = decoder.GetEncodedGeometryType(buffer);
+ let dracoGeometry;
+ if (geometryType === decoderModule.TRIANGULAR_MESH) {
+ dracoGeometry = new decoderModule.Mesh();
+ const status = decoder.DecodeBufferToMesh(buffer, dracoGeometry);
+ if (!status.ok()) {
+ vtkErrorMacro(`Could not decode Draco file: ${status.error_msg()}`);
+ return;
+ }
+ } else {
+ vtkErrorMacro('Wrong geometry type, expected mesh, got point cloud.');
+ return;
+ }
+ const polyData = getPolyDataFromDracoGeometry(decoder, dracoGeometry);
decoderModule.destroy(dracoGeometry);
+ decoderModule.destroy(buffer);
+ decoderModule.destroy(decoder);
model.output[0] = polyData;
};
diff --git a/Sources/IO/Geometry/GLTFImporter/Animations.js b/Sources/IO/Geometry/GLTFImporter/Animations.js
new file mode 100644
index 00000000000..2ed0f17d1f8
--- /dev/null
+++ b/Sources/IO/Geometry/GLTFImporter/Animations.js
@@ -0,0 +1,256 @@
+import macro from 'vtk.js/Sources/macros';
+import * as vtkMath from 'vtk.js/Sources/Common/Core/Math';
+import { quat, vec3 } from 'gl-matrix';
+
+const { vtkDebugMacro, vtkWarningMacro } = macro;
+
+/**
+ * Create an animation channel
+ * @param {glTFChannel} glTFChannel
+ * @param {glTFChannel[]} glTFSamplers
+ * @returns
+ */
+function createAnimationChannel(glTFChannel, glTFSamplers) {
+ const path = glTFChannel.target.path;
+ const node = glTFChannel.target.node;
+
+ function applyAnimation(value) {
+ let axisAngle;
+ let w;
+ let nq;
+ switch (path) {
+ case 'translation':
+ node.setPosition(value[0], value[1], value[2]);
+ break;
+ case 'rotation':
+ // Convert quaternion to axis-angle representation
+ nq = quat.normalize(quat.create(), value);
+ axisAngle = new Float64Array(3);
+ w = quat.getAxisAngle(axisAngle, nq);
+ // Apply rotation using rotateWXYZ
+ node.rotateWXYZ(
+ vtkMath.degreesFromRadians(w),
+ axisAngle[0],
+ axisAngle[1],
+ axisAngle[2]
+ );
+ break;
+ case 'scale':
+ node.setScale(value[0], value[1], value[2]);
+ break;
+ default:
+ vtkWarningMacro(`Unsupported animation path: ${path}`);
+ }
+ }
+
+ function animate(currentTime) {
+ const sampler = glTFSamplers[glTFChannel.sampler];
+ const value = sampler.evaluate(currentTime, path);
+ applyAnimation(value);
+ }
+
+ return { ...glTFChannel, animate };
+}
+
+/**
+ * Create an animation sampler
+ * @param {glTFSampler} glTFSampler
+ * @returns
+ */
+function createAnimationSampler(glTFSampler) {
+ let lastKeyframeIndex = 0;
+
+ function findKeyframes(time) {
+ let i1 = lastKeyframeIndex;
+ while (i1 < glTFSampler.input.length - 1 && glTFSampler.input[i1] <= time) {
+ i1++;
+ }
+ const i0 = Math.max(0, i1 - 1);
+ lastKeyframeIndex = i0;
+ return [glTFSampler.input[i0], glTFSampler.input[i1], i0, i1];
+ }
+
+ function stepInterpolate(path, i0) {
+ const startIndex = i0 * 3;
+ const v0 = new Array(3);
+ for (let i = 0; i < 3; ++i) {
+ v0[i] = glTFSampler.output[startIndex + i];
+ }
+
+ return v0;
+ }
+
+ function linearInterpolate(path, t0, t1, i0, i1, t) {
+ const ratio = (t - t0) / (t1 - t0);
+ const startIndex = i0 * 4;
+ const endIndex = i1 * 4;
+
+ const v0 = new Array(4);
+ const v1 = new Array(4);
+ for (let i = 0; i < 4; ++i) {
+ v0[i] = glTFSampler.output[startIndex + i];
+ v1[i] = glTFSampler.output[endIndex + i];
+ }
+
+ switch (path) {
+ case 'translation':
+ case 'scale':
+ return vec3.lerp(vec3.create(), v0, v1, ratio);
+ case 'rotation':
+ return quat.slerp(quat.create(), v0, v1, ratio);
+ default:
+ vtkWarningMacro(`Unsupported animation path: ${path}`);
+ return null;
+ }
+ }
+
+ function cubicSplineInterpolate(path, t0, t1, i0, i1, time) {
+ const dt = t1 - t0;
+ const t = (time - t0) / dt;
+ const t2 = t * t;
+ const t3 = t2 * t;
+
+ const p0 = glTFSampler.output[i0 * 3 + 1];
+ const m0 = dt * glTFSampler.output[i0 * 3 + 2];
+ const p1 = glTFSampler.output[i1 * 3 + 1];
+ const m1 = dt * glTFSampler.output[i1 * 3];
+
+ if (Array.isArray(p0)) {
+ return p0.map((v, j) => {
+ const a = 2 * t3 - 3 * t2 + 1;
+ const b = t3 - 2 * t2 + t;
+ const c = -2 * t3 + 3 * t2;
+ const d = t3 - t2;
+ return a * v + b * m0[j] + c * p1[j] + d * m1[j];
+ });
+ }
+
+ const a = 2 * t3 - 3 * t2 + 1;
+ const b = t3 - 2 * t2 + t;
+ const c = -2 * t3 + 3 * t2;
+ const d = t3 - t2;
+ return a * p0 + b * m0 + c * p1 + d * m1;
+ }
+
+ function evaluate(time, path) {
+ const [t0, t1, i0, i1] = findKeyframes(time);
+
+ let result;
+
+ switch (glTFSampler.interpolation) {
+ case 'STEP':
+ result = stepInterpolate(path, i0);
+ break;
+ case 'LINEAR':
+ result = linearInterpolate(path, t0, t1, i0, i1, time);
+ break;
+ case 'CUBICSPLINE':
+ result = cubicSplineInterpolate(path, t0, t1, i0, i1, time);
+ break;
+ default:
+ vtkWarningMacro(
+ `Unknown interpolation method: ${glTFSampler.interpolation}`
+ );
+ }
+ return result;
+ }
+
+ return { ...glTFSampler, evaluate };
+}
+
+/**
+ * Create an animation
+ * @param {glTFAnimation} glTFAnimation
+ * @param {Map} nodes
+ * @returns
+ */
+function createAnimation(glTFAnimation, nodes) {
+ glTFAnimation.samplers = glTFAnimation.samplers.map((sampler) =>
+ createAnimationSampler(sampler)
+ );
+
+ glTFAnimation.channels = glTFAnimation.channels.map((channel) => {
+ channel.target.node = nodes.get(`node-${channel.target.node}`);
+ return createAnimationChannel(channel, glTFAnimation.samplers);
+ });
+
+ function update(currentTime) {
+ glTFAnimation.channels.forEach((channel) => channel.animate(currentTime));
+ }
+
+ return { ...glTFAnimation, update };
+}
+
+/**
+ * Create an animation mixer
+ * @param {Map} nodes
+ * @param {*} accessors
+ * @returns
+ */
+function createAnimationMixer(nodes, accessors) {
+ const animations = new Map();
+ const activeAnimations = new Map();
+
+ function addAnimation(glTFAnimation) {
+ const annimation = createAnimation(glTFAnimation, nodes, accessors);
+ animations.set(glTFAnimation.id, annimation);
+ vtkDebugMacro(`Animation "${glTFAnimation.id}" added to mixer`);
+ }
+
+ function play(name, weight = 1) {
+ if (!animations.has(name)) {
+ vtkWarningMacro(`Animation "${name}" not found in mixer`);
+ return;
+ }
+ activeAnimations.set(name, {
+ animation: animations.get(name),
+ weight,
+ time: 0,
+ });
+ vtkDebugMacro(`Playing animation "${name}" with weight ${weight}`);
+ }
+
+ function stop(name) {
+ if (activeAnimations.delete(name)) {
+ vtkWarningMacro(`Stopped animation "${name}"`);
+ } else {
+ vtkWarningMacro(`Animation "${name}" was not playing`);
+ }
+ }
+
+ function stopAll() {
+ activeAnimations.clear();
+ vtkWarningMacro('Stopped all animations');
+ }
+
+ function update(deltaTime) {
+ // Normalize weights
+ const totalWeight = Array.from(activeAnimations.values()).reduce(
+ (sum, { weight }) => sum + weight,
+ 0
+ );
+
+ activeAnimations.forEach(({ animation, weight, time }, name) => {
+ const normalizedWeight = totalWeight > 0 ? weight / totalWeight : 0;
+ const newTime = time + deltaTime;
+ activeAnimations.set(name, { animation, weight, time: newTime });
+
+ vtkDebugMacro(
+ `Updating animation "${name}" at time ${newTime.toFixed(
+ 3
+ )} with normalized weight ${normalizedWeight.toFixed(3)}`
+ );
+
+ animation.update(newTime, normalizedWeight);
+ });
+ }
+
+ return { addAnimation, play, stop, stopAll, update };
+}
+
+export {
+ createAnimation,
+ createAnimationChannel,
+ createAnimationMixer,
+ createAnimationSampler,
+};
diff --git a/Sources/IO/Geometry/GLTFImporter/Constants.js b/Sources/IO/Geometry/GLTFImporter/Constants.js
new file mode 100644
index 00000000000..e86353e40f2
--- /dev/null
+++ b/Sources/IO/Geometry/GLTFImporter/Constants.js
@@ -0,0 +1,85 @@
+export const BINARY_HEADER_MAGIC = 'glTF';
+export const BINARY_HEADER_LENGTH = 12;
+export const BINARY_CHUNK_TYPES = { JSON: 0x4e4f534a, BIN: 0x004e4942 };
+export const BINARY_HEADER_INTS = 3;
+export const BINARY_CHUNK_HEADER_INTS = 2;
+
+export const MIN_LIGHT_ATTENUATION = 0.01;
+
+export const COMPONENTS = {
+ SCALAR: 1,
+ VEC2: 2,
+ VEC3: 3,
+ VEC4: 4,
+ MAT2: 4,
+ MAT3: 9,
+ MAT4: 16,
+};
+
+export const BYTES = {
+ 5120: 1, // BYTE
+ 5121: 1, // UNSIGNED_BYTE
+ 5122: 2, // SHORT
+ 5123: 2, // UNSIGNED_SHORT
+ 5125: 4, // UNSIGNED_INT
+ 5126: 4, // FLOAT
+};
+
+export const MODES = {
+ GL_POINTS: 0,
+ GL_LINES: 1,
+ GL_LINE_LOOP: 2,
+ GL_LINE_STRIP: 3,
+ GL_TRIANGLES: 4,
+ GL_TRIANGLE_STRIP: 5,
+ GL_TRIANGLE_FAN: 6,
+};
+
+export const ARRAY_TYPES = {
+ 5120: Int8Array,
+ 5121: Uint8Array,
+ 5122: Int16Array,
+ 5123: Uint16Array,
+ 5125: Uint32Array,
+ 5126: Float32Array,
+};
+
+export const GL_SAMPLER = {
+ NEAREST: 9728,
+ LINEAR: 9729,
+ NEAREST_MIPMAP_NEAREST: 9984,
+ LINEAR_MIPMAP_NEAREST: 9985,
+ NEAREST_MIPMAP_LINEAR: 9986,
+ LINEAR_MIPMAP_LINEAR: 9987,
+ REPEAT: 10497,
+ CLAMP_TO_EDGE: 33071,
+ MIRRORED_REPEAT: 33648,
+ TEXTURE_MAG_FILTER: 10240,
+ TEXTURE_MIN_FILTER: 10241,
+ TEXTURE_WRAP_S: 10242,
+ TEXTURE_WRAP_T: 10243,
+};
+
+export const DEFAULT_SAMPLER = {
+ magFilter: GL_SAMPLER.NEAREST,
+ minFilter: GL_SAMPLER.LINEAR_MIPMAP_LINEAR,
+ wrapS: GL_SAMPLER.REPEAT,
+ wrapT: GL_SAMPLER.REPEAT,
+};
+
+export const SEMANTIC_ATTRIBUTE_MAP = {
+ NORMAL: 'normal',
+ POSITION: 'position',
+ TEXCOORD_0: 'texcoord0',
+ TEXCOORD_1: 'texcoord1',
+ WEIGHTS_0: 'weight',
+ JOINTS_0: 'joint',
+ COLOR_0: 'color',
+ TANGENT: 'tangent',
+};
+
+export const ALPHA_MODE = {
+ OPAQUE: 'OPAQUE',
+ MASK: 'MASK',
+ BLEND: 'BLEND',
+};
diff --git a/Sources/IO/Geometry/GLTFImporter/Decoder.js b/Sources/IO/Geometry/GLTFImporter/Decoder.js
new file mode 100644
index 00000000000..7a4011f1899
--- /dev/null
+++ b/Sources/IO/Geometry/GLTFImporter/Decoder.js
@@ -0,0 +1,78 @@
+import BinaryHelper from 'vtk.js/Sources/IO/Core/BinaryHelper';
+import {
+ BINARY_CHUNK_TYPES,
+ BINARY_CHUNK_HEADER_INTS,
+ BINARY_HEADER_INTS,
+ BINARY_HEADER_LENGTH,
+ BINARY_HEADER_MAGIC,
+} from 'vtk.js/Sources/IO/Geometry/GLTFImporter/Constants';
+
+function getChunkInfo(headerStart, data) {
+ const header = new Uint32Array(data, headerStart, BINARY_CHUNK_HEADER_INTS);
+ const chunkStart = headerStart + BINARY_CHUNK_HEADER_INTS * 4;
+ const chunkLength = header[0];
+ const chunkType = header[1];
+ return { start: chunkStart, length: chunkLength, type: chunkType };
+}
+
+function getAllChunkInfos(data) {
+ const infos = [];
+ let chunkStart = BINARY_HEADER_INTS * 4;
+ while (chunkStart < data.byteLength) {
+ const chunkInfo = getChunkInfo(chunkStart, data);
+ infos.push(chunkInfo);
+ chunkStart += chunkInfo.length + BINARY_CHUNK_HEADER_INTS * 4;
+ }
+ return infos;
+}
+
+function getJsonFromChunk(chunkInfo, data) {
+ const chunkLength = chunkInfo.length;
+ const jsonStart = (BINARY_HEADER_INTS + BINARY_CHUNK_HEADER_INTS) * 4;
+ const jsonSlice = new Uint8Array(data, jsonStart, chunkLength);
+ const stringBuffer = BinaryHelper.arrayBufferToString(jsonSlice);
+ return JSON.parse(stringBuffer);
+}
+
+function getBufferFromChunk(chunkInfo, data) {
+ return data.slice(chunkInfo.start, chunkInfo.start + chunkInfo.length);
+}
+
+function parseGLB(data) {
+ let json;
+ const buffers = [];
+
+ const headerView = new DataView(data, 0, BINARY_HEADER_LENGTH);
+
+ const header = {
+ magic: BinaryHelper.arrayBufferToString(new Uint8Array(data, 0, 4)),
+ version: headerView.getUint32(4, true),
+ length: headerView.getUint32(8, true),
+ };
+
+ if (header.magic !== BINARY_HEADER_MAGIC) {
+ throw new Error('Unsupported glTF-Binary header.');
+ } else if (header.version < 2.0) {
+ throw new Error('Unsupported legacy binary file detected.');
+ }
+
+ const chunkInfos = getAllChunkInfos(data);
+
+ chunkInfos.forEach((chunkInfo) => {
+ if (chunkInfo.type === BINARY_CHUNK_TYPES.JSON && !json) {
+ json = getJsonFromChunk(chunkInfo, data);
+ } else if (chunkInfo.type === BINARY_CHUNK_TYPES.BIN) {
+ buffers.push(getBufferFromChunk(chunkInfo, data));
+ }
+ });
+
+ if (!json) {
+ throw new Error('glTF-Binary: JSON content not found.');
+ }
+ if (!buffers) {
+ throw new Error('glTF-Binary: Binary chunk not found.');
+ }
+ return { json, buffers };
+}
+
+export default parseGLB;
diff --git a/Sources/IO/Geometry/GLTFImporter/Extensions.js b/Sources/IO/Geometry/GLTFImporter/Extensions.js
new file mode 100644
index 00000000000..897c0c10ea3
--- /dev/null
+++ b/Sources/IO/Geometry/GLTFImporter/Extensions.js
@@ -0,0 +1,103 @@
+import macro from 'vtk.js/Sources/macros';
+import * as vtkMath from 'vtk.js/Sources/Common/Core/Math';
+import vtkDracoReader from 'vtk.js/Sources/IO/Geometry/DracoReader';
+import vtkLight from 'vtk.js/Sources/Rendering/Core/Light';
+
+import { MIN_LIGHT_ATTENUATION } from 'vtk.js/Sources/IO/Geometry/GLTFImporter/Constants';
+
+const { vtkWarningMacro } = macro;
+
+/**
+ * Handles the KHR_materials_unlit extension.
+ *
+ * @param {object} extension - The KHR_materials_unlit extension object.
+ * @param {vtkProperty} property - The vtkProperty instance to update.
+ */
+export function handleKHRMaterialsUnlit(extension, property) {
+ property.setLighting(true);
+}
+
+/**
+ * Handles the KHR_materials_ior extension.
+ *
+ * @param {object} extension - The KHR_materials_unlit extension object.
+ * @param {vtkProperty} property - The vtkProperty instance to update.
+ */
+export function handleKHRMaterialsIor(extension, property) {
+ property.setBaseIOR(extension.ior);
+}
+
+/**
+ * Handles the KHR_materials_specular extension.
+ * @param {object} extension - The KHR_materials_specular extension object.
+ * @param {vtkProperty} property - The vtkProperty instance to update.
+ */
+export function handleKHRMaterialsSpecular(extension, property) {
+ property.setSpecular(extension.specularFactor);
+ property.setSpecularColor(extension.specularColorFactor);
+}
+
+/**
+ * Handles the KHR_lights_punctual extension.
+ *
+ * @param {object} extension - The KHR_lights_punctual extension object.
+ * @param {vtkRenderer} renderer - The vtkRenderer instance to add the light to.
+ */
+export function handleKHRLightsPunctual(extension, transformMatrix, model) {
+ const { light } = extension;
+
+ const { color, intensity, range, spot, type } = light;
+
+ const l = vtkLight.newInstance({
+ color: color || [1, 1, 1],
+ intensity: intensity || 1.0,
+ });
+
+ // Apply the global transform to the light
+ l.setTransformMatrix(transformMatrix);
+
+ // Handle range
+ if (range > 0) {
+ // Set quadratic values to get attenuation(range) ~= MIN_LIGHT_ATTENUATION
+ l.setAttenuationValues(1, 0, 1.0 / (range * range * MIN_LIGHT_ATTENUATION));
+ }
+
+ switch (type) {
+ case 'directional':
+ l.setPositional(false);
+ break;
+ case 'point':
+ l.setPositional(true);
+ l.setConeAngle(90);
+ break;
+ case 'spot':
+ l.setPositional(true);
+ l.setConeAngle(vtkMath.radiansFromDegrees(spot.outerConeAngle));
+ break;
+ default:
+ vtkWarningMacro(`Unsupported light type: ${type}`);
+ }
+
+ model.lights.set(light.name, l);
+}
+
+/**
+ * Handles the KHR_draco_mesh_compression extension.
+ *
+ * @param {object} extension - The KHR_draco_mesh_compression extension object.
+ */
+export function handleKHRDracoMeshCompression(extension) {
+ const reader = vtkDracoReader.newInstance();
+ reader.parse(extension.bufferView);
+ return reader.getOutputData();
+}
+
+/**
+ * Handles the KHR_materials_variants extension.
+ *
+ * @param {object} extension - The KHR_materials_variants extension object.
+ * @param {object} model - The model object to update with variant information.
+ */
+export function handleKHRMaterialsVariants(extension, model) {
+ model.variants = extension.variants.map((v) => v.name);
+}
diff --git a/Sources/IO/Geometry/GLTFImporter/ORMTexture.worker.js b/Sources/IO/Geometry/GLTFImporter/ORMTexture.worker.js
new file mode 100644
index 00000000000..7c48f871149
--- /dev/null
+++ b/Sources/IO/Geometry/GLTFImporter/ORMTexture.worker.js
@@ -0,0 +1,35 @@
+import registerWebworker from 'webworker-promise/lib/register';
+
+/**
+ *
+ * @param {ArrayBuffer} imageBuffer
+ * @param {string} mimeType
+ * @param {string} channel
+ * @returns {Promise}
+ */
+registerWebworker(async ({ imageBuffer, mimeType, channel }) => {
+ const channelsMap = {
+ r: 0,
+ g: 1,
+ b: 2,
+ };
+
+ const blob = new Blob([imageBuffer], { type: mimeType });
+ const img = await createImageBitmap(blob);
+ const canvas = new OffscreenCanvas(img.width, img.height);
+ const ctx = canvas.getContext('2d');
+
+ ctx.drawImage(img, 0, 0, img.width, img.height);
+ const bitmap = ctx.getImageData(0, 0, img.width, img.height);
+
+ if (channel) {
+ const idx = channelsMap[channel];
+ for (let i = 0; i < bitmap.data.length; i += 4) {
+ const channelValue = bitmap.data[i + idx];
+ bitmap.data[i] = channelValue; // red channel
+ bitmap.data[i + 1] = channelValue; // green channel
+ bitmap.data[i + 2] = channelValue; // blue channel
+ }
+ }
+ return { bitmap };
+});
diff --git a/Sources/IO/Geometry/GLTFImporter/Parser.js b/Sources/IO/Geometry/GLTFImporter/Parser.js
new file mode 100644
index 00000000000..4ce28299149
--- /dev/null
+++ b/Sources/IO/Geometry/GLTFImporter/Parser.js
@@ -0,0 +1,505 @@
+/* eslint-disable guard-for-in */
+/* eslint-disable no-restricted-syntax */
+/* eslint-disable class-methods-use-this */
+import macro from 'vtk.js/Sources/macros';
+
+import {
+ ALPHA_MODE,
+ BYTES,
+ COMPONENTS,
+ DEFAULT_SAMPLER,
+ GL_SAMPLER,
+ MODES,
+ SEMANTIC_ATTRIBUTE_MAP,
+} from 'vtk.js/Sources/IO/Geometry/GLTFImporter/Constants';
+
+import {
+ getAccessorArrayTypeAndLength,
+ getGLEnumFromSamplerParameter,
+ resolveUrl,
+} from 'vtk.js/Sources/IO/Geometry/GLTFImporter/Utils';
+
+const { vtkDebugMacro, vtkWarningMacro } = macro;
+
+class GLTFParser {
+ constructor(glTF, options = {}) {
+ const { json, baseUri = '' } = glTF;
+
+ this.glTF = glTF;
+ this.options = options;
+ this.baseUri = baseUri;
+ this.json = json;
+ this.extensions = json.extensions || {};
+ this.extensionsUsed = json.extensionsUsed || [];
+ }
+
+ async parse() {
+ const buffers = this.json.buffers || [];
+ this.buffers = new Array(buffers.length).fill(null);
+
+ const images = this.json.images || [];
+ this.images = new Array(images.length).fill({});
+ await this.loadBuffers();
+ await this.loadImages();
+ this.resolveTree();
+
+ return this.glTF.json;
+ }
+
+ resolveTree() {
+ this.json.scenes = this.json.scenes?.map((scene, idx) =>
+ this.resolveScene(scene, idx)
+ );
+
+ this.json.cameras = this.json.cameras?.map((camera, idx) =>
+ this.resolveCamera(camera, idx)
+ );
+
+ this.json.bufferViews = this.json.bufferViews?.map((bufView, idx) =>
+ this.resolveBufferView(bufView, idx)
+ );
+
+ this.json.images = this.json.images?.map((image, idx) =>
+ this.resolveImage(image, idx)
+ );
+
+ this.json.samplers = this.json.samplers?.map((sampler, idx) =>
+ this.resolveSampler(sampler, idx)
+ );
+
+ this.json.textures = this.json.textures?.map((texture, idx) =>
+ this.resolveTexture(texture, idx)
+ );
+
+ this.json.accessors = this.json.accessors?.map((accessor, idx) =>
+ this.resolveAccessor(accessor, idx)
+ );
+
+ this.json.materials = this.json.materials?.map((material, idx) =>
+ this.resolveMaterial(material, idx)
+ );
+
+ this.json.meshes = this.json.meshes?.map((mesh, idx) =>
+ this.resolveMesh(mesh, idx)
+ );
+
+ this.json.nodes = this.json.nodes?.map((node, idx) =>
+ this.resolveNode(node, idx)
+ );
+
+ this.json.skins = this.json.skins?.map((skin, idx) =>
+ this.resolveSkin(skin, idx)
+ );
+
+ this.json.animations = this.json.animations?.map((animation, idx) =>
+ this.resolveAnimation(animation, idx)
+ );
+ }
+
+ get(array, index) {
+ // check if already resolved
+ if (typeof index === 'object') {
+ return index;
+ }
+ const object = this.json[array] && this.json[array][index];
+ if (!object) {
+ vtkWarningMacro(`glTF file error: Could not find ${array}[${index}]`);
+ }
+ return object;
+ }
+
+ resolveScene(scene, index) {
+ scene.id = scene.id || `scene-${index}`;
+ scene.nodes = (scene.nodes || []).map((node) => this.get('nodes', node));
+ return scene;
+ }
+
+ resolveNode(node, index) {
+ node.id = node.id || `node-${index}`;
+ if (node.children) {
+ node.children = node.children.map((child) => this.get('nodes', child));
+ }
+ if (node.mesh !== undefined) {
+ node.mesh = this.get('meshes', node.mesh);
+ } else if (node.meshes !== undefined && node.meshes.length) {
+ node.mesh = node.meshes.reduce(
+ (accum, meshIndex) => {
+ const mesh = this.get('meshes', meshIndex);
+ accum.id = mesh.id;
+ accum.primitives = accum.primitives.concat(mesh.primitives);
+ return accum;
+ },
+ { primitives: [] }
+ );
+ }
+ if (node.camera !== undefined) {
+ node.camera = this.get('cameras', node.camera);
+ }
+ if (node.skin !== undefined) {
+ node.skin = this.get('skins', node.skin);
+ }
+
+ // Fill punctual lights objects
+ if (node.extensions?.KHR_lights_punctual) {
+ node.extensions.KHR_lights_punctual.light =
+ this.extensions?.KHR_lights_punctual.lights[
+ node.extensions.KHR_lights_punctual.light
+ ];
+ }
+ return node;
+ }
+
+ resolveSkin(skin, index) {
+ skin.id = skin.id || `skin-${index}`;
+ skin.inverseBindMatrices = this.get('accessors', skin.inverseBindMatrices);
+ return skin;
+ }
+
+ resolveMesh(mesh, index) {
+ mesh.id = mesh.id || `mesh-${index}`;
+ if (mesh.primitives) {
+ mesh.primitives = mesh.primitives.map((primitive, idx) => {
+ const attributes = primitive.attributes;
+ primitive.name = `primitive-${idx}`;
+ primitive.attributes = {};
+ for (const attribute in attributes) {
+ const attr = SEMANTIC_ATTRIBUTE_MAP[attribute];
+ primitive.attributes[attr] = this.get(
+ 'accessors',
+ attributes[attribute]
+ );
+ }
+ if (primitive.indices !== undefined) {
+ primitive.indices = this.get('accessors', primitive.indices);
+ }
+ if (primitive.material !== undefined) {
+ primitive.material = this.get('materials', primitive.material);
+ }
+ if (primitive.mode === undefined) {
+ primitive.mode = MODES.GL_TRIANGLES; // Default one
+ }
+
+ if (primitive.extensions?.KHR_draco_mesh_compression) {
+ vtkDebugMacro('Using Draco mesh compression');
+ const bufferView = this.get(
+ 'bufferViews',
+ primitive.extensions.KHR_draco_mesh_compression.bufferView
+ );
+ primitive.extensions.KHR_draco_mesh_compression.bufferView =
+ bufferView.data;
+ }
+
+ return primitive;
+ });
+ }
+ return mesh;
+ }
+
+ resolveMaterial(material, index) {
+ material.id = material.id || `material-${index}`;
+
+ if (material.alphaMode === undefined)
+ material.alphaMode = ALPHA_MODE.OPAQUE;
+ if (material.doubleSided === undefined) material.doubleSided = false;
+ if (material.alphaCutoff === undefined) material.alphaCutoff = 0.5;
+
+ if (material.normalTexture) {
+ material.normalTexture = { ...material.normalTexture };
+ material.normalTexture.texture = this.get(
+ 'textures',
+ material.normalTexture.index
+ );
+ }
+ if (material.occlusionTexture) {
+ material.occlusionTexture = { ...material.occlusionTexture };
+ material.occlusionTexture.texture = this.get(
+ 'textures',
+ material.occlusionTexture.index
+ );
+ }
+ if (material.emissiveTexture) {
+ material.emissiveTexture = { ...material.emissiveTexture };
+ material.emissiveTexture.texture = this.get(
+ 'textures',
+ material.emissiveTexture.index
+ );
+ }
+ if (!material.emissiveFactor) {
+ material.emissiveFactor = material.emissiveTexture ? 1 : 0;
+ } else material.emissiveFactor = material.emissiveFactor[0];
+
+ if (material.pbrMetallicRoughness) {
+ material.pbrMetallicRoughness = { ...material.pbrMetallicRoughness };
+ const mr = material.pbrMetallicRoughness;
+ if (mr.baseColorTexture) {
+ mr.baseColorTexture = { ...mr.baseColorTexture };
+ mr.baseColorTexture.texture = this.get(
+ 'textures',
+ mr.baseColorTexture.index
+ );
+ }
+ if (mr.metallicRoughnessTexture) {
+ mr.metallicRoughnessTexture = { ...mr.metallicRoughnessTexture };
+ mr.metallicRoughnessTexture.texture = this.get(
+ 'textures',
+ mr.metallicRoughnessTexture.index
+ );
+ }
+ } else {
+ material.pbrMetallicRoughness = {
+ baseColorFactor: [1, 1, 1, 1],
+ metallicFactor: 1.0,
+ roughnessFactor: 1.0,
+ };
+ }
+ return material;
+ }
+
+ /**
+ * Take values of particular accessor from interleaved buffer various parts of
+ * the buffer
+ */
+ getValueFromInterleavedBuffer(
+ buffer,
+ byteOffset,
+ byteStride,
+ bytesPerElement,
+ count
+ ) {
+ const result = new Uint8Array(count * bytesPerElement);
+ for (let i = 0; i < count; i++) {
+ const elementOffset = byteOffset + i * byteStride;
+ result.set(
+ new Uint8Array(
+ buffer.arrayBuffer.slice(
+ elementOffset,
+ elementOffset + bytesPerElement
+ )
+ ),
+ i * bytesPerElement
+ );
+ }
+ return result.buffer;
+ }
+
+ resolveAccessor(accessor, index) {
+ accessor.id = accessor.id || `accessor-${index}`;
+ if (accessor.bufferView !== undefined) {
+ // Draco encoded meshes don't have bufferView
+ accessor.bufferView = this.get('bufferViews', accessor.bufferView);
+ }
+
+ // Look up enums
+ accessor.bytesPerComponent = BYTES[accessor.componentType];
+ accessor.components = COMPONENTS[accessor.type];
+ accessor.bytesPerElement = accessor.bytesPerComponent * accessor.components;
+
+ // Create TypedArray for the accessor
+ // Note: The canonical way to instantiate is to ignore this array and create
+ // WebGLBuffer's using the bufferViews.
+ if (accessor.bufferView) {
+ const buffer = accessor.bufferView.buffer;
+ const { ArrayType, byteLength } = getAccessorArrayTypeAndLength(
+ accessor,
+ accessor.bufferView
+ );
+ const byteOffset =
+ (accessor.bufferView.byteOffset || 0) +
+ (accessor.byteOffset || 0) +
+ buffer.byteOffset;
+
+ let slicedBufffer = buffer.arrayBuffer.slice(
+ byteOffset,
+ byteOffset + byteLength
+ );
+
+ if (accessor.bufferView.byteStride) {
+ slicedBufffer = this.getValueFromInterleavedBuffer(
+ buffer,
+ byteOffset,
+ accessor.bufferView.byteStride,
+ accessor.bytesPerElement,
+ accessor.count
+ );
+ }
+ accessor.value = new ArrayType(slicedBufffer);
+ }
+
+ return accessor;
+ }
+
+ resolveTexture(texture, index) {
+ texture.id = texture.id || `texture-${index}`;
+ texture.sampler =
+ 'sampler' in texture
+ ? this.get('samplers', texture.sampler)
+ : DEFAULT_SAMPLER;
+
+ texture.source = this.get('images', texture.source);
+
+ // Handle texture extensions sources
+ if (texture.extensions !== undefined) {
+ const extensionsNames = Object.keys(texture.extensions);
+ extensionsNames.forEach((extensionName) => {
+ const extension = texture.extensions[extensionName];
+ switch (extensionName) {
+ case 'KHR_texture_basisu':
+ case 'EXT_texture_webp':
+ case 'EXT_texture_avif':
+ texture.source = this.get('images', extension.source);
+ break;
+ default:
+ vtkWarningMacro(`Unhandled extension: ${extensionName}`);
+ }
+ });
+ }
+ return texture;
+ }
+
+ resolveSampler(sampler, index) {
+ sampler.id = sampler.id || `sampler-${index}`;
+
+ if (!Object.hasOwn(sampler, 'wrapS')) sampler.wrapS = GL_SAMPLER.REPEAT;
+ if (!Object.hasOwn(sampler, 'wrapT')) sampler.wrapT = GL_SAMPLER.REPEAT;
+
+ if (!Object.hasOwn(sampler, 'minFilter'))
+ sampler.minFilter = GL_SAMPLER.LINEAR_MIPMAP_LINEAR;
+ if (!Object.hasOwn(sampler, 'magFilter'))
+ sampler.magFilter = GL_SAMPLER.NEAREST;
+
+ // Map textual parameters to GL parameter values
+ sampler.parameters = {};
+ for (const key in sampler) {
+ const glEnum = getGLEnumFromSamplerParameter(key);
+ if (glEnum !== undefined) {
+ sampler.parameters[glEnum] = sampler[key];
+ }
+ }
+ return sampler;
+ }
+
+ resolveImage(image, index) {
+ image.id = image.id || `image-${index}`;
+ if (image.bufferView !== undefined) {
+ image.bufferView = this.get('bufferViews', image.bufferView);
+ }
+ return image;
+ }
+
+ resolveBufferView(bufferView, index) {
+ bufferView.id = bufferView.id || `bufferView-${index}`;
+ const bufferIndex = bufferView.buffer;
+ bufferView.buffer = this.buffers[bufferIndex];
+
+ const arrayBuffer = this.buffers[bufferIndex].arrayBuffer;
+ let byteOffset = this.buffers[bufferIndex].byteOffset || 0;
+
+ if ('byteOffset' in bufferView) {
+ byteOffset += bufferView.byteOffset;
+ }
+
+ bufferView.data = new Uint8Array(
+ arrayBuffer,
+ byteOffset,
+ bufferView.byteLength
+ );
+ return bufferView;
+ }
+
+ resolveCamera(camera, index) {
+ camera.id = camera.id || `camera-${index}`;
+ return camera;
+ }
+
+ resolveAnimation(animation, index) {
+ animation.id = animation.id || `animation-${index}`;
+ animation.samplers.map((sampler) => {
+ sampler.input = this.get('accessors', sampler.input).value;
+ sampler.output = this.get('accessors', sampler.output).value;
+ return sampler;
+ });
+ return animation;
+ }
+
+ loadBuffers() {
+ const promises = this.json.buffers.map((buffer, idx) =>
+ this.loadBuffer(buffer, idx).then(() => {
+ delete buffer.uri;
+ })
+ );
+ return Promise.all(promises);
+ }
+
+ async loadBuffer(buffer, index) {
+ let arrayBuffer = buffer;
+
+ if (buffer.uri) {
+ vtkDebugMacro('Loading uri', buffer.uri);
+ const uri = resolveUrl(buffer.uri, this.options.baseUri);
+ const response = await fetch(uri);
+ arrayBuffer = await response.arrayBuffer();
+ } else if (this.glTF.glbBuffers) {
+ arrayBuffer = this.glTF.glbBuffers[index];
+ }
+
+ this.buffers[index] = {
+ arrayBuffer,
+ byteOffset: 0,
+ byteLength: arrayBuffer.byteLength,
+ };
+ }
+
+ loadImages() {
+ const images = this.json.images || [];
+ const promises = [];
+
+ return new Promise((resolve, reject) => {
+ for (let i = 0; i < images.length; ++i) {
+ promises.push(
+ Promise.resolve(
+ this.loadImage(images[i], i).then(() => {
+ vtkDebugMacro('Texture loaded ', images[i]);
+ })
+ )
+ );
+ }
+
+ Promise.all(promises).then(() => resolve(this.images));
+ });
+ }
+
+ async loadImage(image, index) {
+ let arrayBuffer;
+ let buffer;
+
+ if (image.uri) {
+ vtkDebugMacro('Loading texture', image.uri);
+ const uri = resolveUrl(image.uri, this.options.baseUri);
+ const response = await fetch(uri);
+
+ arrayBuffer = await response.arrayBuffer();
+ image.uri = uri;
+ image.bufferView = {
+ data: arrayBuffer,
+ };
+ } else if (image.bufferView) {
+ const bufferView = this.get('bufferViews', image.bufferView);
+ buffer = this.get('buffers', bufferView.buffer);
+
+ // GLB buffer
+ if (this.glTF.glbBuffers) {
+ buffer = this.glTF.glbBuffers[bufferView.buffer];
+ arrayBuffer = buffer.slice(
+ bufferView.byteOffset,
+ bufferView.byteOffset + bufferView.byteLength
+ );
+ }
+
+ image.bufferView = {
+ data: arrayBuffer,
+ };
+ }
+ }
+}
+
+export default GLTFParser;
diff --git a/Sources/IO/Geometry/GLTFImporter/Reader.js b/Sources/IO/Geometry/GLTFImporter/Reader.js
new file mode 100644
index 00000000000..df2314e52fd
--- /dev/null
+++ b/Sources/IO/Geometry/GLTFImporter/Reader.js
@@ -0,0 +1,630 @@
+import macro from 'vtk.js/Sources/macros';
+import * as vtkMath from 'vtk.js/Sources/Common/Core/Math';
+
+import vtkActor from 'vtk.js/Sources/Rendering/Core/Actor';
+import vtkCamera from 'vtk.js/Sources/Rendering/Core/Camera';
+import vtkDataArray from 'vtk.js/Sources/Common/Core/DataArray';
+import vtkPolyData from 'vtk.js/Sources/Common/DataModel/PolyData';
+import vtkMapper from 'vtk.js/Sources/Rendering/Core/Mapper';
+import vtkCellArray from 'vtk.js/Sources/Common/Core/CellArray';
+import vtkTransform from 'vtk.js/Sources/Common/Transform/Transform';
+import GLTFParser from 'vtk.js/Sources/IO/Geometry/GLTFImporter/Parser';
+import {
+ ALPHA_MODE,
+ MODES,
+ SEMANTIC_ATTRIBUTE_MAP,
+} from 'vtk.js/Sources/IO/Geometry/GLTFImporter/Constants';
+import {
+ createVTKTextureFromGLTFTexture,
+ loadImage,
+} from 'vtk.js/Sources/IO/Geometry/GLTFImporter/Utils';
+import {
+ handleKHRDracoMeshCompression,
+ handleKHRLightsPunctual,
+ handleKHRMaterialsIor,
+ handleKHRMaterialsSpecular,
+ handleKHRMaterialsUnlit,
+ handleKHRMaterialsVariants,
+} from 'vtk.js/Sources/IO/Geometry/GLTFImporter/Extensions';
+
+import { mat4, quat, vec3 } from 'gl-matrix';
+
+const { vtkWarningMacro, vtkDebugMacro } = macro;
+
+/**
+ * Parses a GLTF objects
+ * @param {Object} gltf - The GLTF object to parse
+ * @returns {glTF} The parsed GLTF object
+ */
+async function parseGLTF(gltf, options) {
+ const parser = new GLTFParser(gltf, options);
+ const tree = await parser.parse();
+ return tree;
+}
+
+/**
+ * Creates VTK polydata from a GLTF mesh primitive
+ * @param {GLTFPrimitive} primitive - The GLTF mesh primitive
+ * @returns {vtkPolyData} The created VTK polydata
+ */
+async function createPolyDataFromGLTFMesh(primitive) {
+ if (!primitive || !primitive.attributes) {
+ vtkWarningMacro('Primitive has no position data, skipping');
+ return null;
+ }
+
+ if (primitive.extensions?.KHR_draco_mesh_compression) {
+ return handleKHRDracoMeshCompression(
+ primitive.extensions.KHR_draco_mesh_compression
+ );
+ }
+
+ const polyData = vtkPolyData.newInstance();
+ const cells = vtkCellArray.newInstance();
+ const pointData = polyData.getPointData();
+
+ const attrs = Object.entries(primitive.attributes);
+ attrs.forEach(async ([attributeName, accessor]) => {
+ switch (attributeName) {
+ case SEMANTIC_ATTRIBUTE_MAP.POSITION: {
+ const position = primitive.attributes.position.value;
+ polyData
+ .getPoints()
+ .setData(position, primitive.attributes.position.component);
+ break;
+ }
+ case SEMANTIC_ATTRIBUTE_MAP.NORMAL: {
+ const normals = primitive.attributes.normal.value;
+ pointData.setNormals(
+ vtkDataArray.newInstance({
+ name: 'Normals',
+ values: normals,
+ numberOfComponents: primitive.attributes.normal.components,
+ })
+ );
+ break;
+ }
+ case SEMANTIC_ATTRIBUTE_MAP.COLOR_0: {
+ const color = primitive.attributes.color.value;
+ pointData.setScalars(
+ vtkDataArray.newInstance({
+ name: 'Scalars',
+ values: color,
+ numberOfComponents: primitive.attributes.color.components,
+ })
+ );
+ break;
+ }
+ case SEMANTIC_ATTRIBUTE_MAP.TEXCOORD_0: {
+ const tcoords0 = primitive.attributes.texcoord0.value;
+ const da = vtkDataArray.newInstance({
+ name: 'TEXCOORD_0',
+ values: tcoords0,
+ numberOfComponents: primitive.attributes.texcoord0.components,
+ });
+ pointData.addArray(da);
+ pointData.setActiveTCoords(da.getName());
+ break;
+ }
+ case SEMANTIC_ATTRIBUTE_MAP.TEXCOORD_1: {
+ const tcoords = primitive.attributes.texcoord1.value;
+ const dac = vtkDataArray.newInstance({
+ name: 'TEXCOORD_1',
+ values: tcoords,
+ numberOfComponents: primitive.attributes.texcoord1.components,
+ });
+ pointData.addArray(dac);
+ break;
+ }
+ case SEMANTIC_ATTRIBUTE_MAP.TANGENT: {
+ const tangent = primitive.attributes.tangent.value;
+ const dat = vtkDataArray.newInstance({
+ name: 'Tangents',
+ values: tangent,
+ numberOfComponents: primitive.attributes.tangent.components,
+ });
+ pointData.addArray(dat);
+ break;
+ }
+ default:
+ vtkWarningMacro(`Unhandled attribute: ${attributeName}`);
+ }
+ });
+
+ // Handle indices if available
+ if (primitive.indices != null) {
+ const indices = primitive.indices.value;
+ const nCells = indices.length - 2;
+ switch (primitive.mode) {
+ case MODES.GL_LINE_STRIP:
+ case MODES.GL_TRIANGLE_STRIP:
+ case MODES.GL_LINE_LOOP:
+ vtkWarningMacro('GL_LINE_LOOP not implemented');
+ break;
+ default:
+ cells.resize((4 * indices.length) / 3);
+ for (let cellId = 0; cellId < nCells; cellId += 3) {
+ const cell = indices.slice(cellId, cellId + 3);
+ cells.insertNextCell(cell);
+ }
+ }
+ }
+
+ switch (primitive.mode) {
+ case MODES.GL_TRIANGLES:
+ case MODES.GL_TRIANGLE_FAN:
+ polyData.setPolys(cells);
+ break;
+ case MODES.GL_LINES:
+ case MODES.GL_LINE_STRIP:
+ case MODES.GL_LINE_LOOP:
+ polyData.setLines(cells);
+ break;
+ case MODES.GL_POINTS:
+ polyData.setVerts(cells);
+ break;
+ case MODES.GL_TRIANGLE_STRIP:
+ polyData.setStrips(cells);
+ break;
+ default:
+ vtkWarningMacro('Invalid primitive draw mode. Ignoring connectivity.');
+ }
+
+ return polyData;
+}
+
+/**
+ * Creates a VTK property from a GLTF material
+ * @param {object} model - The vtk model object
+ * @param {GLTFMaterial} material - The GLTF material
+ * @param {vtkActor} actor - The VTK actor
+ */
+async function createPropertyFromGLTFMaterial(model, material, actor) {
+ let metallicFactor = 1.0;
+ let roughnessFactor = 1.0;
+ const emissiveFactor = material.emissiveFactor;
+
+ const property = actor.getProperty();
+ const pbr = material.pbrMetallicRoughness;
+
+ if (pbr != null) {
+ if (
+ !pbr?.metallicFactor ||
+ pbr?.metallicFactor <= 0 ||
+ pbr?.metallicFactor >= 1
+ ) {
+ vtkDebugMacro(
+ 'Invalid material.pbrMetallicRoughness.metallicFactor value. Using default value instead.'
+ );
+ } else metallicFactor = pbr.metallicFactor;
+ if (
+ !pbr?.roughnessFactor ||
+ pbr?.roughnessFactor <= 0 ||
+ pbr?.roughnessFactor >= 1
+ ) {
+ vtkDebugMacro(
+ 'Invalid material.pbrMetallicRoughness.roughnessFactor value. Using default value instead.'
+ );
+ } else roughnessFactor = pbr.roughnessFactor;
+
+ const color = pbr.baseColorFactor;
+
+ if (color != null) {
+ property.setDiffuseColor(color[0], color[1], color[2]);
+ property.setOpacity(color[3]);
+ }
+
+ property.setMetallic(metallicFactor);
+ property.setRoughness(roughnessFactor);
+ property.setEmission(emissiveFactor);
+
+ if (pbr.baseColorTexture) {
+ const extensions = pbr.baseColorTexture.extensions;
+ const tex = pbr.baseColorTexture.texture;
+
+ if (tex.extensions != null) {
+ const extensionsNames = Object.keys(tex.extensions);
+ extensionsNames.forEach((extensionName) => {
+ // TODO: Handle KHR_texture_basisu extension
+ // const extension = tex.extensions[extensionName];
+ switch (extensionName) {
+ default:
+ vtkWarningMacro(`Unhandled extension: ${extensionName}`);
+ }
+ });
+ }
+
+ const sampler = tex.sampler;
+ const image = await loadImage(tex.source);
+ const diffuseTex = createVTKTextureFromGLTFTexture(
+ image,
+ sampler,
+ extensions
+ );
+
+ // FIXME: Workaround for textures not showing up in WebGL
+ const viewAPI = model.renderer.getRenderWindow();
+ const isWebGL = viewAPI.getViews()[0].isA('vtkOpenGLRenderWindow');
+ if (isWebGL) {
+ actor.addTexture(diffuseTex);
+ } else {
+ property.setDiffuseTexture(diffuseTex);
+ }
+ }
+
+ if (pbr.metallicRoughnessTexture) {
+ const extensions = pbr.metallicRoughnessTexture.extensions;
+ const tex = pbr.metallicRoughnessTexture.texture;
+ const sampler = tex.sampler;
+ const metallicImage = await loadImage(tex.source, 'b');
+ const metallicTex = createVTKTextureFromGLTFTexture(
+ metallicImage,
+ sampler,
+ extensions
+ );
+ property.setMetallicTexture(metallicTex);
+
+ const roughnessImage = await loadImage(tex.source, 'g');
+ const roughnessTex = createVTKTextureFromGLTFTexture(
+ roughnessImage,
+ sampler,
+ extensions
+ );
+ property.setRoughnessTexture(roughnessTex);
+ }
+
+ // Handle ambient occlusion texture (occlusionTexture)
+ if (material.occlusionTexture) {
+ const extensions = material.occlusionTexture.extensions;
+ const tex = material.occlusionTexture.texture;
+ const sampler = tex.sampler;
+ const aoImage = await loadImage(tex.source, 'r');
+ const aoTex = createVTKTextureFromGLTFTexture(
+ aoImage,
+ sampler,
+ extensions
+ );
+ property.setAmbientOcclusionTexture(aoTex);
+ }
+
+ // Handle emissive texture (emissiveTexture)
+ if (material.emissiveTexture) {
+ const extensions = material.emissiveTexture.extensions;
+ const tex = material.emissiveTexture.texture;
+ const sampler = tex.sampler;
+ const emissiveImage = await loadImage(tex.source);
+ const emissiveTex = createVTKTextureFromGLTFTexture(
+ emissiveImage,
+ sampler,
+ extensions
+ );
+ property.setEmissionTexture(emissiveTex);
+
+ // Handle mutiple Uvs
+ if (material.emissiveTexture.texCoord != null) {
+ const pd = actor.getMapper().getInputData().getPointData();
+ pd.setActiveTCoords(`TEXCOORD_${material.emissiveTexture.texCoord}`);
+ }
+ }
+
+ // Handle normal texture (normalTexture)
+ if (material.normalTexture) {
+ const extensions = material.normalTexture.extensions;
+ const tex = material.normalTexture.texture;
+ const sampler = tex.sampler;
+ const normalImage = await loadImage(tex.source);
+ const normalTex = createVTKTextureFromGLTFTexture(
+ normalImage,
+ sampler,
+ extensions
+ );
+ property.setNormalTexture(normalTex);
+
+ if (material.normalTexture.scale != null) {
+ property.setNormalStrength(material.normalTexture.scale);
+ }
+ }
+ }
+
+ // Material extensions
+ if (material.extensions != null) {
+ const extensionsNames = Object.keys(material.extensions);
+ extensionsNames.forEach((extensionName) => {
+ const extension = material.extensions[extensionName];
+ switch (extensionName) {
+ case 'KHR_materials_unlit':
+ handleKHRMaterialsUnlit(extension, property);
+ break;
+ case 'KHR_materials_ior':
+ handleKHRMaterialsIor(extension, property);
+ break;
+ case 'KHR_materials_specular':
+ handleKHRMaterialsSpecular(extension, property);
+ break;
+ default:
+ vtkWarningMacro(`Unhandled extension: ${extensionName}`);
+ }
+ });
+ }
+
+ if (material.alphaMode !== ALPHA_MODE.OPAQUE) {
+ actor.setForceTranslucent(true);
+ }
+
+ property.setBackfaceCulling(!material.doubleSided);
+}
+
+/**
+ * Handles primitive extensions
+ * @param {string} nodeId The GLTF node id
+ * @param {*} extensions The extensions object
+ * @param {*} model The vtk model object
+ */
+function handlePrimitiveExtensions(nodeId, extensions, model) {
+ const extensionsNames = Object.keys(extensions);
+ extensionsNames.forEach((extensionName) => {
+ const extension = extensions[extensionName];
+ switch (extensionName) {
+ case 'KHR_materials_variants':
+ model.variantMappings.set(nodeId, extension.mappings);
+ break;
+ default:
+ vtkWarningMacro(`Unhandled extension: ${extensionName}`);
+ }
+ });
+}
+
+/**
+ * Creates a VTK actor from a GLTF mesh
+ * @param {GLTFMesh} mesh - The GLTF mesh
+ * @returns {vtkActor} The created VTK actor
+ */
+async function createActorFromGTLFNode(worldMatrix) {
+ const actor = vtkActor.newInstance();
+ const mapper = vtkMapper.newInstance();
+ mapper.setColorModeToDirectScalars();
+ actor.setMapper(mapper);
+ actor.setUserMatrix(worldMatrix);
+
+ const polydata = vtkPolyData.newInstance();
+ mapper.setInputData(polydata);
+ return actor;
+}
+
+/**
+ * Creates a VTK actor from a GLTF mesh
+ * @param {GLTFMesh} mesh - The GLTF mesh
+ * @returns {vtkActor} The created VTK actor
+ */
+async function createActorFromGTLFPrimitive(model, primitive, worldMatrix) {
+ const actor = vtkActor.newInstance();
+ const mapper = vtkMapper.newInstance();
+ mapper.setColorModeToDirectScalars();
+ actor.setMapper(mapper);
+ actor.setUserMatrix(worldMatrix);
+
+ const polydata = await createPolyDataFromGLTFMesh(primitive);
+ mapper.setInputData(polydata);
+
+ // Support for materials
+ if (primitive.material != null) {
+ await createPropertyFromGLTFMaterial(model, primitive.material, actor);
+ }
+
+ if (primitive.extensions != null) {
+ handlePrimitiveExtensions(`${primitive.name}`, primitive.extensions, model);
+ }
+
+ return actor;
+}
+
+/**
+ * Creates a GLTF animation object
+ * @param {GLTFAnimation} animation
+ * @returns
+ */
+function createGLTFAnimation(animation) {
+ vtkDebugMacro('Creating animation:', animation);
+ return {
+ name: animation.name,
+ channels: animation.channels,
+ samplers: animation.samplers,
+ getChannelByTargetNode(nodeIndex) {
+ return this.channels.filter(
+ (channel) => channel.target.node === nodeIndex
+ );
+ },
+ };
+}
+
+/**
+ * Gets the transformation matrix for a GLTF node
+ * @param {GLTFNode} node - The GLTF node
+ * @returns {mat4} The transformation matrix
+ */
+function getTransformationMatrix(node) {
+ // TRS
+ const translation = node.translation ?? vec3.create();
+ const rotation = node.rotation ?? quat.create();
+ const scale = node.scale ?? vec3.fromValues(1.0, 1.0, 1.0);
+
+ const matrix =
+ node.matrix != null
+ ? mat4.clone(node.matrix)
+ : mat4.fromRotationTranslationScale(
+ mat4.create(),
+ rotation,
+ translation,
+ scale
+ );
+ return matrix;
+}
+
+/**
+ * Processes a GLTF node
+ * @param {GLTFnode} node - The GLTF node
+ * @param {object} model The model object
+ * @param {vtkActor} parentActor The parent actor
+ * @param {mat4} parentMatrix The parent matrix
+ */
+async function processNode(
+ node,
+ model,
+ parentActor = null,
+ parentMatrix = mat4.create()
+) {
+ node.transform = getTransformationMatrix(node);
+ const worldMatrix = mat4.multiply(
+ mat4.create(),
+ parentMatrix,
+ node.transform
+ );
+
+ // Create actor for the current node
+ if (node.mesh != null) {
+ const nodeActor = await createActorFromGTLFNode(worldMatrix);
+ if (parentActor) {
+ nodeActor.setParentProp(parentActor);
+ }
+ model.actors.set(`${node.id}`, nodeActor);
+
+ await Promise.all(
+ node.mesh.primitives.map(async (primitive, i) => {
+ const actor = await createActorFromGTLFPrimitive(
+ model,
+ primitive,
+ worldMatrix
+ );
+ actor.setParentProp(nodeActor);
+ model.actors.set(`${node.id}_${primitive.name}`, actor);
+ })
+ );
+ }
+
+ // Handle KHRLightsPunctual extension
+ if (node.extensions?.KHR_lights_punctual) {
+ handleKHRLightsPunctual(
+ node.extensions.KHR_lights_punctual,
+ node.transform,
+ model
+ );
+ }
+
+ if (
+ node.children &&
+ Array.isArray(node.children) &&
+ node.children.length > 0
+ ) {
+ await Promise.all(
+ node.children.map(async (child) => {
+ const parent = model.actors.get(node.id);
+ await processNode(child, model, parent, worldMatrix);
+ })
+ );
+ }
+}
+
+/**
+ * Creates VTK actors from a GLTF object
+ * @param {glTF} glTF - The GLTF object
+ * @param {number} sceneId - The scene index to create actors for
+ * @returns {vtkActor[]} The created VTK actors
+ */
+async function createVTKObjects(model) {
+ model.animations = model.glTFTree.animations?.map(createGLTFAnimation);
+
+ const extensionsNames = Object.keys(model.glTFTree?.extensions || []);
+ extensionsNames.forEach((extensionName) => {
+ const extension = model.glTFTree.extensions[extensionName];
+ switch (extensionName) {
+ case 'KHR_materials_variants':
+ handleKHRMaterialsVariants(extension, model);
+ break;
+ case 'KHR_draco_mesh_compression':
+ break;
+ default:
+ vtkWarningMacro(`Unhandled extension: ${extensionName}`);
+ }
+ });
+
+ // Get the sceneId to process
+ const sceneId = model.sceneId ?? model.glTFTree.scene;
+ if (model.glTFTree.scenes?.length && model.glTFTree.scenes[sceneId]?.nodes) {
+ await Promise.all(
+ model.glTFTree.scenes[sceneId].nodes.map(async (node) => {
+ if (node) {
+ await processNode(node, model);
+ } else {
+ vtkWarningMacro(`Node not found in glTF.nodes`);
+ }
+ })
+ );
+ } else {
+ vtkWarningMacro('No valid scenes found in the glTF data');
+ }
+}
+
+/**
+ * Sets up the camera for a vtk renderer based on the bounds of the given actors.
+ *
+ * @param {GLTCamera} camera - The GLTF camera object
+ */
+function GLTFCameraToVTKCamera(glTFCamera) {
+ const camera = vtkCamera.newInstance();
+ if (glTFCamera.type === 'perspective') {
+ const { yfov, znear, zfar } = glTFCamera.perspective;
+ camera.setClippingRange(znear, zfar);
+ camera.setParallelProjection(false);
+ camera.setViewAngle(vtkMath.degreesFromRadians(yfov));
+ } else if (glTFCamera.type === 'orthographic') {
+ const { ymag, znear, zfar } = glTFCamera.orthographic;
+ camera.setClippingRange(znear, zfar);
+ camera.setParallelProjection(true);
+ camera.setParallelScale(ymag);
+ } else {
+ throw new Error('Unsupported camera type');
+ }
+
+ return camera;
+}
+
+/**
+ *
+ * @param {vtkCamera} camera
+ * @param {*} transformMatrix
+ */
+function applyTransformToCamera(camera, transformMatrix) {
+ if (!camera || !transformMatrix) {
+ return;
+ }
+
+ // At identity, camera position is origin, +y up, -z view direction
+ const position = [0, 0, 0];
+ const viewUp = [0, 1, 0];
+ const focus = [0, 0, -1];
+
+ const t = vtkTransform.newInstance();
+ t.setMatrix(transformMatrix);
+
+ // Transform position
+ t.transformPoint(position, position);
+ t.transformPoints(viewUp, viewUp);
+ t.transformPoints(focus, focus);
+
+ focus[0] += position[0];
+ focus[1] += position[1];
+ focus[2] += position[2];
+
+ // Apply the transformed values to the camera
+ camera.setPosition(position);
+ camera.setFocalPoint(focus);
+ camera.setViewUp(viewUp);
+}
+
+export {
+ applyTransformToCamera,
+ createPropertyFromGLTFMaterial,
+ parseGLTF,
+ createVTKObjects,
+ GLTFCameraToVTKCamera,
+};
diff --git a/Sources/IO/Geometry/GLTFImporter/Utils.js b/Sources/IO/Geometry/GLTFImporter/Utils.js
new file mode 100644
index 00000000000..b03cc87d9ba
--- /dev/null
+++ b/Sources/IO/Geometry/GLTFImporter/Utils.js
@@ -0,0 +1,195 @@
+import WebworkerPromise from 'webworker-promise';
+import macro from 'vtk.js/Sources/macros';
+import vtkTexture from 'vtk.js/Sources/Rendering/Core/Texture';
+import Worker from 'vtk.js/Sources/IO/Geometry/GLTFImporter/ORMTexture.worker';
+import {
+ BYTES,
+ COMPONENTS,
+ ARRAY_TYPES,
+ GL_SAMPLER,
+} from 'vtk.js/Sources/IO/Geometry/GLTFImporter/Constants';
+
+const { vtkWarningMacro, vtkErrorMacro } = macro;
+
+/**
+ * Get GL enum from sampler parameter
+ * @param {*} parameter The sampler parameter
+ * @returns The GL enum
+ */
+export function getGLEnumFromSamplerParameter(parameter) {
+ const GL_TEXTURE_MAG_FILTER = 0x2800;
+ const GL_TEXTURE_MIN_FILTER = 0x2801;
+ const GL_TEXTURE_WRAP_S = 0x2802;
+ const GL_TEXTURE_WRAP_T = 0x2803;
+
+ const Mapping = {
+ magFilter: GL_TEXTURE_MAG_FILTER,
+ minFilter: GL_TEXTURE_MIN_FILTER,
+ wrapS: GL_TEXTURE_WRAP_S,
+ wrapT: GL_TEXTURE_WRAP_T,
+ };
+
+ return Mapping[parameter];
+}
+
+export function getAccessorArrayTypeAndLength(accessor, bufferView) {
+ const ArrayType = ARRAY_TYPES[accessor.componentType];
+ const components = COMPONENTS[accessor.type];
+ const bytesPerComponent = BYTES[accessor.componentType];
+ const length = accessor.count * components;
+ const byteLength = accessor.count * components * bytesPerComponent;
+ return { ArrayType, length, byteLength };
+}
+
+/**
+ * Resolves a URL based on the original path
+ * @param {*} url The URL to resolve
+ * @param {*} originalPath The original path to resolve the URL against
+ * @returns The resolved URL or an empty string if the URL is invalid
+ */
+export function resolveUrl(url, originalPath) {
+ // Invalid URL
+ if (typeof url !== 'string' || url === '') return '';
+
+ try {
+ // Data URI
+ if (url.startsWith('data:')) return url;
+
+ // Blob URL
+ if (url.startsWith('blob:')) return url;
+
+ // Create URL object from the original path
+ const baseUrl = new URL(originalPath);
+ if (!baseUrl.pathname.includes('.') && !baseUrl.pathname.endsWith('/')) {
+ baseUrl.pathname += '/';
+ }
+
+ // Absolute URL (http://, https://, //)
+ if (
+ url.startsWith('http:') ||
+ url.startsWith('https:') ||
+ url.startsWith('//')
+ ) {
+ return new URL(url, baseUrl).href;
+ }
+
+ // Host Relative URL
+ if (url.startsWith('/')) {
+ return new URL(url, baseUrl).href;
+ }
+
+ // Relative URL
+ return new URL(url, baseUrl).href;
+ } catch (error) {
+ vtkErrorMacro('Error resolving URL:', error);
+ return '';
+ }
+}
+
+/**
+ * Loads image from buffer or URI
+ * @param {*} image
+ * @param {*} channel
+ * @returns
+ */
+export async function loadImage(image, channel, forceReLoad = false) {
+ // Initialize cache if it doesn't exist
+ if (!image.cache) {
+ image.cache = {};
+ }
+
+ // Return cached result for the channel if available and not forced to reload
+ if (!forceReLoad && image.cache[channel]) {
+ return image.cache[channel];
+ }
+
+ const worker = new WebworkerPromise(new Worker());
+
+ if (image.bufferView) {
+ return worker
+ .postMessage({
+ imageBuffer: image.bufferView.data,
+ mimeType: image.mimeType,
+ channel,
+ })
+ .then((result) => {
+ // Cache the bitmap based on the channel
+ image.cache[channel] = result.bitmap;
+ return result.bitmap;
+ })
+ .finally(() => {
+ worker.terminate();
+ });
+ }
+
+ if (image.uri) {
+ vtkWarningMacro('Falling back to image uri', image.uri);
+ return new Promise((resolve, reject) => {
+ const img = new Image();
+ img.crossOrigin = 'Anonymous';
+ img.onload = () => {
+ image.cache[channel] = img; // Cache the loaded image based on the channel
+ resolve(img);
+ };
+ img.onerror = reject;
+ img.src = image.uri;
+ });
+ }
+
+ return null;
+}
+
+/**
+ *
+ * @param {*} image
+ * @param {*} sampler
+ * @param {*} extensions
+ * @returns
+ */
+export function createVTKTextureFromGLTFTexture(image, sampler, extensions) {
+ const texture = vtkTexture.newInstance();
+ // Apply sampler settings
+ if (sampler) {
+ if (
+ ('wrapS' in sampler && 'wrapT' in sampler) ||
+ ('minFilter' in sampler && 'magFilter' in sampler)
+ ) {
+ if (
+ sampler.wrapS === GL_SAMPLER.CLAMP_TO_EDGE ||
+ sampler.wrapT === GL_SAMPLER.CLAMP_TO_EDGE
+ ) {
+ texture.setRepeat(false);
+ texture.setEdgeClamp(true);
+ } else if (
+ sampler.wrapS === GL_SAMPLER.REPEAT ||
+ sampler.wrapT === GL_SAMPLER.REPEAT
+ ) {
+ texture.setRepeat(true);
+ texture.setEdgeClamp(false);
+ } else {
+ vtkWarningMacro('Mirrored texture wrapping is not supported!');
+ }
+
+ const linearFilters = [
+ GL_SAMPLER.LINEAR,
+ GL_SAMPLER.LINEAR_MIPMAP_NEAREST,
+ GL_SAMPLER.NEAREST_MIPMAP_LINEAR,
+ GL_SAMPLER.LINEAR_MIPMAP_LINEAR,
+ ];
+
+ if (
+ linearFilters.includes(sampler.minFilter) ||
+ linearFilters.includes(sampler.magFilter)
+ ) {
+ texture.setInterpolate(true);
+ }
+ } else {
+ texture.setMipLevel(8);
+ texture.setInterpolate(true);
+ texture.setEdgeClamp(true);
+ }
+ }
+
+ texture.setJsImageData(image);
+ return texture;
+}
diff --git a/Sources/IO/Geometry/GLTFImporter/example/controller.html b/Sources/IO/Geometry/GLTFImporter/example/controller.html
new file mode 100644
index 00000000000..0470eff0f47
--- /dev/null
+++ b/Sources/IO/Geometry/GLTFImporter/example/controller.html
@@ -0,0 +1,89 @@
+
+
diff --git a/Sources/IO/Geometry/GLTFImporter/example/index.js b/Sources/IO/Geometry/GLTFImporter/example/index.js
new file mode 100644
index 00000000000..260de4f6ae9
--- /dev/null
+++ b/Sources/IO/Geometry/GLTFImporter/example/index.js
@@ -0,0 +1,351 @@
+import '@kitware/vtk.js/Rendering/Profiles/Geometry';
+
+// Enable data soure for DataAccessHelper
+import '@kitware/vtk.js/IO/Core/DataAccessHelper/LiteHttpDataAccessHelper'; // Just need HTTP
+// import '@kitware/vtk.js/IO/Core/DataAccessHelper/HttpDataAccessHelper'; // HTTP + zip
+// import '@kitware/vtk.js/IO/Core/DataAccessHelper/HtmlDataAccessHelper'; // html + base64 + zip
+// import '@kitware/vtk.js/IO/Core/DataAccessHelper/JSZipDataAccessHelper'; // zip
+
+import vtkFullScreenRenderWindow from '@kitware/vtk.js/Rendering/Misc/FullScreenRenderWindow';
+import vtkTexture from '@kitware/vtk.js/Rendering/Core/Texture';
+import vtkURLExtract from '@kitware/vtk.js/Common/Core/URLExtract';
+import vtkResourceLoader from '@kitware/vtk.js/IO/Core/ResourceLoader';
+
+import vtkGLTFImporter from '@kitware/vtk.js/IO/Geometry/GLTFImporter';
+
+import controlPanel from './controller.html';
+
+// ----------------------------------------------------------------------------
+// Example code
+// ----------------------------------------------------------------------------
+let mixer;
+let selectedModel;
+let selectedFlavor;
+const userParms = vtkURLExtract.extractURLParameters();
+const selectedScene = userParms.scene || 0;
+const viewAPI = userParms.viewAPI || 'WebGL';
+
+const baseUrl =
+ 'https://raw.githubusercontent.com/KhronosGroup/glTF-Sample-Assets/main';
+const modelsFolder = 'Models';
+const modelsDictionary = {};
+
+function createTextureWithMipmap(src, level) {
+ const img = new Image();
+ img.crossOrigin = 'Anonymous';
+ img.src = src;
+ const tex = vtkTexture.newInstance();
+ tex.setMipLevel(level);
+ img.onload = () => {
+ tex.setInterpolate(true);
+ tex.setEdgeClamp(true);
+ tex.setImage(img);
+ };
+ return tex;
+}
+
+const fullScreenRenderer = vtkFullScreenRenderWindow.newInstance();
+fullScreenRenderer.addController(controlPanel);
+
+const renderer = fullScreenRenderer.getRenderer();
+const renderWindow = fullScreenRenderer.getRenderWindow();
+
+// Workaround for the variant switch
+const variantsModels = [
+ 'MaterialsVariantsShoe',
+ 'GlamVelvetSofa',
+ 'SheenChair',
+ 'AntiqueCamera',
+];
+
+const environmentTex = createTextureWithMipmap(
+ `${__BASE_PATH__}/data/pbr/kiara_dawn_4k.jpg`,
+ 8
+);
+renderer.setUseEnvironmentTextureAsBackground(false);
+
+if (variantsModels.includes(userParms.model)) {
+ renderer.setEnvironmentTextureDiffuseStrength(0);
+ renderer.setEnvironmentTextureSpecularStrength(0);
+} else {
+ renderer.setEnvironmentTexture(environmentTex);
+ renderer.setEnvironmentTextureDiffuseStrength(1);
+ renderer.setEnvironmentTextureSpecularStrength(1);
+}
+
+const reader = vtkGLTFImporter.newInstance({
+ renderer,
+});
+
+const rootContainer = document.querySelector('body');
+const modelSelector = document.querySelector('.models');
+const flavorSelector = document.querySelector('.flavor');
+const scenesSelector = document.querySelector('.scenes');
+const camerasSelector = document.querySelector('.cameras');
+const animationsSelector = document.querySelector('.animations');
+const variantsSelector = document.querySelector('.variants');
+
+const eSpecularChange = document.querySelector('.e-specular');
+const eDiffuseChange = document.querySelector('.e-diffuse');
+const angleChange = document.querySelector('.angle');
+const useTextureBackgroundChange = document.querySelector('.use-background');
+
+// add a loading svg to the container and remove once the reader is ready
+const loading = document.createElement('div');
+loading.innerHTML = `
+
+
+
+
+
+`;
+// loading message should center in the window
+loading.style.position = 'absolute';
+loading.style.left = '50%';
+loading.style.top = '50%';
+loading.style.transform = 'translate(-50%, -50%)';
+
+// ----------------------------------------------------------------------------
+function animateScene(lastTime = 0) {
+ const currentTime = performance.now();
+ const dt = (currentTime - lastTime) / 1000;
+
+ mixer.update(dt);
+
+ renderWindow.render();
+ requestAnimationFrame(() => animateScene(currentTime));
+}
+
+function ready() {
+ console.log('Ready');
+ // remove loading message
+ loading.remove();
+
+ reader.importActors();
+ reader.importCameras();
+ reader.importLights();
+ reader.importAnimations();
+
+ renderer.resetCamera();
+ renderWindow.render();
+
+ // Play animations
+ const animations = reader.getAnimations();
+ if (animations.length > 0) {
+ animations.forEach((animation, name) => {
+ const option = document.createElement('option');
+ option.value = animation.id;
+ option.textContent = animation.id;
+ animationsSelector.appendChild(option);
+ });
+
+ // Play the first animation by default
+ const defaultAnimation = animations[0];
+ mixer = reader.getAnimationMixer();
+ mixer.play(defaultAnimation.id);
+ animateScene();
+ document.querySelector('.animations-container').style.display = 'table-row';
+ }
+
+ const cameras = reader.getCameras();
+ cameras.forEach((camera, name) => {
+ const option = document.createElement('option');
+ option.value = name;
+ option.textContent = name;
+ camerasSelector.appendChild(option);
+ });
+
+ const scenes = reader.getScenes();
+ if (scenes.length > 1) {
+ scenesSelector.innerHTML = '';
+ scenes.forEach((scene, index) => {
+ const option = document.createElement('option');
+ option.value = index;
+ option.textContent = `Scene ${index}`;
+ if (index === selectedScene) {
+ option.selected = true;
+ }
+ scenesSelector.appendChild(option);
+ });
+ }
+
+ const variants = reader.getVariants();
+ if (variants.length > 1) {
+ variantsSelector.innerHTML = '';
+ variants.forEach((variant, index) => {
+ console.log('Adding variant', variant);
+ const option = document.createElement('option');
+ option.value = index;
+ option.textContent = variant;
+ variantsSelector.appendChild(option);
+ });
+ document.querySelector('.variants-container').style.display = 'table-row';
+ }
+}
+
+// Convert the await fetch to a promise chain
+fetch(`${baseUrl}/${modelsFolder}/model-index.json`)
+ .then((response) => response.json())
+ .then((modelsJson) => {
+ modelsJson.forEach((entry) => {
+ if (entry.variants !== undefined && entry.name !== undefined) {
+ const variants = [];
+
+ Object.keys(entry.variants).forEach((variant) => {
+ const fileName = entry.variants[variant];
+ variants[
+ variant
+ ] = `${modelsFolder}/${entry.name}/${variant}/${fileName}`;
+ });
+
+ modelsDictionary[entry.name] = variants;
+ }
+ });
+
+ const modelsNames = Object.keys(modelsDictionary);
+ modelsNames.forEach((modelName) => {
+ const option = document.createElement('option');
+ option.value = modelName;
+ option.textContent = modelName;
+ if (userParms.model === modelName) {
+ option.selected = true;
+ }
+ modelSelector.appendChild(option);
+ });
+
+ selectedModel = userParms.model || modelsNames[0];
+ const variants = Object.keys(modelsDictionary[selectedModel]).sort();
+
+ selectedFlavor = userParms.flavor || variants[0];
+ variants.forEach((variant) => {
+ const option = document.createElement('option');
+ option.value = variant;
+ option.textContent = variant;
+ if (variant === selectedFlavor) {
+ option.selected = true;
+ }
+ flavorSelector.appendChild(option);
+ });
+
+ const path = modelsDictionary[selectedModel][selectedFlavor];
+ const url = `${baseUrl}/${path}`;
+
+ if (selectedFlavor === 'glTF-Draco') {
+ vtkResourceLoader
+ .loadScript(
+ 'https://unpkg.com/draco3dgltf@1.5.7/draco_decoder_gltf_nodejs.js'
+ )
+ .then(async () => {
+ // Set decoder function to the vtk reader
+ // eslint-disable-next-line no-undef
+ await reader.setDracoDecoder(DracoDecoderModule);
+ reader
+ .setUrl(url, { binary: true, sceneId: selectedScene })
+ .then(reader.onReady(ready));
+ });
+ } else {
+ reader
+ .setUrl(url, { binary: true, sceneId: selectedScene })
+ .then(reader.onReady(ready));
+ }
+ })
+ .catch((error) => {
+ console.error('Error fetching the model index:', error);
+ });
+
+// ----------------------------------------------------------------------------
+// Use a file reader to load a local file
+// ----------------------------------------------------------------------------
+
+// Get the value of the radio button named 'renderer' and set the view API accordingly
+document.querySelectorAll("input[name='viewAPI']").forEach((input) => {
+ if (input.value === viewAPI) {
+ input.checked = true;
+ }
+ input.addEventListener('change', (evt) => {
+ window.location = `?model=${selectedModel}&viewAPI=${evt.target.value}`;
+ });
+});
+
+modelSelector.onchange = (evt) => {
+ window.location = `?model=${evt.target.value}&viewAPI=${viewAPI}`;
+};
+
+flavorSelector.onchange = (evt) => {
+ window.location = `?model=${selectedModel}&flavor=${evt.target.value}&scene=${selectedScene}&viewAPI=${viewAPI}`;
+};
+
+scenesSelector.onchange = (evt) => {
+ window.location = `?model=${selectedModel}&flavor=${selectedFlavor}&scene=${evt.target.value}&viewAPI=${viewAPI}`;
+};
+
+camerasSelector.onchange = (evt) => {
+ reader.setCamera(evt.target.value);
+ renderWindow.render();
+};
+
+variantsSelector.onchange = async (evt) => {
+ console.log('Switching to variant', evt.target.value);
+ await reader.switchToVariant(Number(evt.target.value));
+ renderWindow.render();
+};
+
+useTextureBackgroundChange.addEventListener('input', (e) => {
+ const useTexturedBackground = Boolean(e.target.checked);
+ renderer.setUseEnvironmentTextureAsBackground(useTexturedBackground);
+ renderWindow.render();
+});
+
+angleChange.addEventListener('input', (e) => {
+ const angle = Number(e.target.value);
+ renderer.getActiveCamera().setViewAngle(angle);
+ renderWindow.render();
+});
+
+eSpecularChange.addEventListener('input', (e) => {
+ const specular = Number(e.target.value);
+ renderer.setEnvironmentTextureSpecularStrength(specular);
+ renderWindow.render();
+});
+
+eDiffuseChange.addEventListener('input', (e) => {
+ const diffuse = Number(e.target.value);
+ renderer.setEnvironmentTextureDiffuseStrength(diffuse);
+ renderWindow.render();
+});
+
+rootContainer.appendChild(loading);
diff --git a/Sources/IO/Geometry/GLTFImporter/index.d.ts b/Sources/IO/Geometry/GLTFImporter/index.d.ts
new file mode 100644
index 00000000000..31c1a9bbd5d
--- /dev/null
+++ b/Sources/IO/Geometry/GLTFImporter/index.d.ts
@@ -0,0 +1,266 @@
+import { vtkAlgorithm, vtkObject } from '../../../interfaces';
+import HtmlDataAccessHelper from '../../Core/DataAccessHelper/HtmlDataAccessHelper';
+import HttpDataAccessHelper from '../../Core/DataAccessHelper/HttpDataAccessHelper';
+import JSZipDataAccessHelper from '../../Core/DataAccessHelper/JSZipDataAccessHelper';
+import LiteHttpDataAccessHelper from '../../Core/DataAccessHelper/LiteHttpDataAccessHelper';
+
+import vtkActor from '../../../Rendering/Core/Actor';
+import vtkRenderer from '../../../Rendering/Core/Renderer';
+import vtkCamera from '../../../Rendering/Core/Camera';
+
+interface IGLTFImporterOptions {
+ binary?: boolean;
+ compression?: string;
+ progressCallback?: any;
+}
+
+export interface IGLTFAnimation {
+ id: string;
+ name: string;
+ channels: any[];
+ samplers: any[];
+}
+
+export interface IGLTFAnimationMixer {
+ addAnimation: (glTFAnimation: object) => void;
+ play: (name: string, weight?: number) => void;
+ stop: (name: string) => void;
+ stopAll: () => void;
+ update: (deltaTime: number) => void;
+}
+
+export interface IGLTFMaterialVariant {
+ material: number;
+ variants: number[];
+}
+
+/**
+ *
+ */
+export interface IGLTFImporterInitialValues {}
+
+type vtkGLTFImporterBase = vtkObject &
+ Omit<
+ vtkAlgorithm,
+ | 'getInputData'
+ | 'setInputData'
+ | 'setInputConnection'
+ | 'getInputConnection'
+ | 'addInputConnection'
+ | 'addInputData'
+ >;
+
+export interface vtkGLTFImporter extends vtkGLTFImporterBase {
+ /**
+ * Get the actors.
+ */
+ getActors(): Map;
+
+ /**
+ * Get the animation mixer.
+ */
+ getAnimationMixer(): IGLTFAnimationMixer;
+
+ /**
+ * Get the animations.
+ */
+ getAnimations(): IGLTFAnimation[];
+
+ /**
+ * Get the base url.
+ */
+ getBaseURL(): string;
+
+ /**
+ * Get the cameras.
+ */
+ getCameras(): Map;
+
+ /**
+ *
+ */
+ getDataAccessHelper():
+ | HtmlDataAccessHelper
+ | HttpDataAccessHelper
+ | JSZipDataAccessHelper
+ | LiteHttpDataAccessHelper;
+
+ /**
+ * Get the url of the object to load.
+ */
+ getUrl(): string;
+
+ /**
+ * Get the variant array.
+ */
+ getVariants(): string[];
+
+ /**
+ * Get the variant mappings.
+ */
+ getVariantMappings(): Map;
+
+ /**
+ * Import the actors.
+ */
+ importActors(): void;
+
+ /**
+ * Import the animations.
+ */
+ importAnimations(): void;
+
+ /**
+ * Import the cameras.
+ */
+ importCameras(): void;
+
+ /**
+ * Import the lights.
+ */
+ importLights(): void;
+
+ /**
+ * Invoke the ready event.
+ */
+ invokeReady(): void;
+
+ /**
+ * Load the object data.
+ * @param {IGLTFImporterOptions} [options]
+ */
+ loadData(options?: IGLTFImporterOptions): Promise;
+
+ /**
+ *
+ * @param callback
+ */
+ onReady(callback: () => void): void;
+
+ /**
+ * Parse data.
+ * @param {String | ArrayBuffer} content The content to parse.
+ */
+ parse(content: string | ArrayBuffer): void;
+
+ /**
+ * Parse data as ArrayBuffer.
+ * @param {ArrayBuffer} content The content to parse.
+ */
+ parseAsArrayBuffer(content: ArrayBuffer): void;
+
+ /**
+ * Parse data as text.
+ * @param {String} content The content to parse.
+ */
+ parseAsText(content: string): void;
+
+ /**
+ *
+ * @param inData
+ * @param outData
+ */
+ requestData(inData: any, outData: any): void;
+
+ /**
+ *
+ * @param dataAccessHelper
+ */
+ setDataAccessHelper(
+ dataAccessHelper:
+ | HtmlDataAccessHelper
+ | HttpDataAccessHelper
+ | JSZipDataAccessHelper
+ | LiteHttpDataAccessHelper
+ ): boolean;
+
+ /**
+ * Set the url of the object to load.
+ * @param {String} url the url of the object to load.
+ * @param {IGLTFImporterOptions} [option] The Draco reader options.
+ */
+ setUrl(url: string, option?: IGLTFImporterOptions): Promise;
+
+ /**
+ * Set the camera id.
+ * @param cameraId The camera id.
+ */
+ setCamera(cameraId: string): void;
+
+ /**
+ * Set the Draco decoder.
+ * @param dracoDecoder
+ */
+ setDracoDecoder(dracoDecoder: any): void;
+
+ /**
+ * Set the vtk Renderer.
+ * @param renderer The vtk Renderer.
+ */
+ setRenderer(renderer: vtkRenderer): void;
+
+ /**
+ * Switch to a variant.
+ * @param variantIndex The index of the variant to switch to.
+ */
+ switchToVariant(variantIndex: number): void;
+}
+
+/**
+ * Method used to decorate a given object (publicAPI+model) with vtkGLTFImporter characteristics.
+ *
+ * @param publicAPI object on which methods will be bounds (public)
+ * @param model object on which data structure will be bounds (protected)
+ * @param {IGLTFImporterInitialValues} [initialValues] (default: {})
+ */
+export function extend(
+ publicAPI: object,
+ model: object,
+ initialValues?: IGLTFImporterInitialValues
+): void;
+
+/**
+ * Method used to create a new instance of vtkGLTFImporter
+ * @param {IGLTFImporterInitialValues} [initialValues] for pre-setting some of its content
+ */
+export function newInstance(
+ initialValues?: IGLTFImporterInitialValues
+): vtkGLTFImporter;
+
+/**
+ * Load the WASM decoder from url and set the decoderModule
+ * @param url
+ * @param binaryName
+ */
+export function setWasmBinary(
+ url: string,
+ binaryName: string
+): Promise;
+
+/**
+ * vtkGLTFImporter can import glTF 2.0 files.
+ *
+ * The GL Transmission Format (glTF) is an API-neutral runtime asset delivery
+ * format. A glTF asset is represented by:
+ * * A JSON-formatted file (.gltf) containing a full scene description: node
+ * hierarchy, materials, cameras, as well as descriptor information for
+ * meshes, animations, and other constructs
+ * * Binary files (.bin) containing geometry and animation data, and other
+ * buffer-based data
+ * * Image files (.jpg, .png) for textures
+ *
+ * Supported extensions:
+ * * KHR_draco_mesh_compression
+ * * KHR_lights_punctual
+ * * KHR_materials_unlit
+ * * KHR_materials_ior
+ * * KHR_materials_specular
+ * * KHR_materials_variants
+ * * EXT_texture_webp
+ * * EXT_texture_avif
+ */
+export declare const vtkGLTFImporter: {
+ newInstance: typeof newInstance;
+ extend: typeof extend;
+};
+export default vtkGLTFImporter;
diff --git a/Sources/IO/Geometry/GLTFImporter/index.js b/Sources/IO/Geometry/GLTFImporter/index.js
new file mode 100644
index 00000000000..e5175f976fa
--- /dev/null
+++ b/Sources/IO/Geometry/GLTFImporter/index.js
@@ -0,0 +1,277 @@
+import macro from 'vtk.js/Sources/macros';
+
+import BinaryHelper from 'vtk.js/Sources/IO/Core/BinaryHelper';
+import DataAccessHelper from 'vtk.js/Sources/IO/Core/DataAccessHelper';
+import vtkDracoReader from 'vtk.js/Sources/IO/Geometry/DracoReader';
+import {
+ createVTKObjects,
+ parseGLTF,
+ GLTFCameraToVTKCamera,
+ applyTransformToCamera,
+ createPropertyFromGLTFMaterial,
+} from 'vtk.js/Sources/IO/Geometry/GLTFImporter/Reader';
+import parseGLB from 'vtk.js/Sources/IO/Geometry/GLTFImporter/Decoder';
+import { createAnimationMixer } from 'vtk.js/Sources/IO/Geometry/GLTFImporter/Animations';
+import { BINARY_HEADER_MAGIC } from 'vtk.js/Sources/IO/Geometry/GLTFImporter/Constants';
+
+const { vtkDebugMacro, vtkErrorMacro } = macro;
+
+// ----------------------------------------------------------------------------
+// vtkGLTFImporter methods
+// ----------------------------------------------------------------------------
+
+function vtkGLTFImporter(publicAPI, model) {
+ // Set our className
+ model.classHierarchy.push('vtkGLTFImporter');
+
+ // Create default dataAccessHelper if not available
+ if (!model.dataAccessHelper) {
+ model.dataAccessHelper = DataAccessHelper.get('http');
+ }
+
+ // Internal method to fetch Array
+ function fetchData(url, option = {}) {
+ const { compression, progressCallback } = model;
+ if (option.binary) {
+ return model.dataAccessHelper.fetchBinary(url, {
+ compression,
+ progressCallback,
+ });
+ }
+ return model.dataAccessHelper.fetchText(publicAPI, url, {
+ compression,
+ progressCallback,
+ });
+ }
+
+ // Set DataSet url
+ publicAPI.setUrl = (url, option = { binary: true }) => {
+ model.url = url;
+
+ // Remove the file in the URL
+ const path = url.split('/');
+ path.pop();
+ model.baseURL = path.join('/');
+
+ model.compression = option.compression;
+ model.sceneId = option.sceneId ? option.sceneId : 0;
+
+ // Fetch metadata
+ return publicAPI.loadData({
+ progressCallback: option.progressCallback,
+ binary: !!option.binary,
+ });
+ };
+
+ // Fetch the actual data arrays
+ publicAPI.loadData = (option = {}) => {
+ const promise = fetchData(model.url, option);
+ promise.then(publicAPI.parse);
+ return promise;
+ };
+
+ publicAPI.parse = (content) => {
+ if (typeof content === 'string') {
+ publicAPI.parseAsText(content);
+ } else {
+ publicAPI.parseAsBinary(content);
+ }
+ };
+
+ publicAPI.parseAsBinary = async (content) => {
+ if (!content) {
+ return;
+ }
+ if (content !== model.parseData) {
+ publicAPI.modified();
+ } else {
+ return;
+ }
+
+ const glTF = {};
+ const options = {
+ baseUri: model.baseURL,
+ };
+
+ const magic = BinaryHelper.arrayBufferToString(
+ new Uint8Array(content, 0, 4)
+ );
+
+ if (magic === BINARY_HEADER_MAGIC) {
+ const { json, buffers } = parseGLB(content);
+ vtkDebugMacro('Loaded GLB', json, buffers);
+ glTF.glbBuffers = buffers;
+ glTF.json = json;
+ } else {
+ glTF.json = JSON.parse(BinaryHelper.arrayBufferToString(content));
+ }
+
+ if (glTF.json.asset === undefined || glTF.json.asset.version[0] < 2) {
+ vtkErrorMacro('Unsupported asset. glTF versions >=2.0 are supported.');
+ return;
+ }
+
+ model.glTFTree = await parseGLTF(glTF, options);
+
+ model.actors = new Map();
+ model.cameras = new Map();
+ model.lights = new Map();
+ model.animations = [];
+ model.variants = [];
+ model.variantMappings = new Map();
+
+ await createVTKObjects(model);
+
+ model.scenes = model.glTFTree.scenes;
+
+ publicAPI.invokeReady();
+ };
+
+ publicAPI.parseAsText = (content) => {
+ if (!content) {
+ return;
+ }
+ if (content !== model.parseData) {
+ publicAPI.modified();
+ } else {
+ return;
+ }
+
+ model.parseData = content;
+ };
+
+ publicAPI.requestData = (inData, outData) => {
+ publicAPI.parse(model.parseData);
+ };
+
+ publicAPI.setDracoDecoder = async (dracoDecoder) => {
+ await vtkDracoReader.setDracoDecoder(dracoDecoder);
+ };
+
+ publicAPI.importActors = () => {
+ // Add actors to renderer
+ model.actors.forEach((actor) => model.renderer.addActor(actor));
+ };
+
+ publicAPI.importCameras = () => {
+ // Set up camera
+ model.glTFTree.cameras?.forEach((glTFcamera) => {
+ const camera = GLTFCameraToVTKCamera(glTFcamera);
+ model.cameras.set(glTFcamera.id, camera);
+ });
+
+ model.scenes.forEach((scene) => {
+ scene.nodes.forEach((node) => {
+ const camera = model.cameras.get(node.camera?.id);
+ if (camera) {
+ applyTransformToCamera(camera, node.transform);
+ }
+ });
+ });
+ };
+
+ publicAPI.importAnimations = () => {
+ // Set up animations
+ if (model.glTFTree.animations?.length > 0) {
+ model.animationMixer = createAnimationMixer(
+ model.actors,
+ model.glTFTree.accessors
+ );
+ model.glTFTree.animations.forEach((animation) => {
+ model.animationMixer.addAnimation(animation);
+ });
+ }
+ model.animations = model.glTFTree.animations || [];
+ };
+
+ publicAPI.importLights = () => {
+ // Set up lights
+ model.lights?.forEach((light) => {
+ vtkDebugMacro('Adding light', light);
+ model.renderer.addLight(light);
+ });
+ };
+
+ publicAPI.setCamera = (cameraId) => {
+ const camera = model.cameras.get(cameraId);
+
+ if (!camera) {
+ vtkErrorMacro(`Camera ${cameraId} not found`);
+ return;
+ }
+ vtkDebugMacro('Setting camera', camera);
+ model.renderer.setActiveCamera(camera);
+ };
+
+ publicAPI.switchToVariant = async (variantIndex) => {
+ const promises = Array.from(model.actors).map(async ([nodeId, actor]) => {
+ vtkDebugMacro('Switching to variant', variantIndex, 'for node', nodeId);
+ const variantMappings = model.variantMappings.get(nodeId);
+
+ if (variantMappings) {
+ const mapping = variantMappings.find((m) =>
+ m.variants.includes(variantIndex)
+ );
+ if (mapping) {
+ const variantMaterial = model.glTFTree.materials[mapping.material];
+ await createPropertyFromGLTFMaterial(model, variantMaterial, actor);
+ }
+ }
+ });
+
+ await Promise.all(promises);
+ };
+}
+
+// ----------------------------------------------------------------------------
+// Object factory
+// ----------------------------------------------------------------------------
+
+const DEFAULT_VALUES = {
+ // baseURL: null,
+ // dataAccessHelper: null,
+ // url: null,
+};
+
+// ----------------------------------------------------------------------------
+
+export function extend(publicAPI, model, initialValues = {}) {
+ Object.assign(model, DEFAULT_VALUES, initialValues);
+
+ // Build VTK API
+ macro.obj(publicAPI, model);
+ macro.get(publicAPI, model, [
+ 'url',
+ 'baseURL',
+ 'actors',
+ 'scenes',
+ 'cameras',
+ 'animations',
+ 'animationMixer',
+ 'variants',
+ 'variantMappings',
+ ]);
+ macro.set(publicAPI, model, ['renderer', 'dracoDecoder']);
+ macro.event(publicAPI, model, 'ready');
+
+ // vtkGLTFImporter methods
+ vtkGLTFImporter(publicAPI, model);
+
+ // To support destructuring
+ if (!model.compression) {
+ model.compression = null;
+ }
+ if (!model.progressCallback) {
+ model.progressCallback = null;
+ }
+}
+// ----------------------------------------------------------------------------
+
+export const newInstance = macro.newInstance(extend, 'vtkGLTFImporter');
+
+// ----------------------------------------------------------------------------
+
+export default {
+ extend,
+ newInstance,
+};
diff --git a/Sources/IO/Geometry/IFCImporter/example/controller.html b/Sources/IO/Geometry/IFCImporter/example/controller.html
new file mode 100644
index 00000000000..d77bd53ba33
--- /dev/null
+++ b/Sources/IO/Geometry/IFCImporter/example/controller.html
@@ -0,0 +1,15 @@
+
diff --git a/Sources/IO/Geometry/IFCImporter/example/index.js b/Sources/IO/Geometry/IFCImporter/example/index.js
new file mode 100644
index 00000000000..418e12418cf
--- /dev/null
+++ b/Sources/IO/Geometry/IFCImporter/example/index.js
@@ -0,0 +1,64 @@
+import '@kitware/vtk.js/favicon';
+
+// Load the rendering pieces we want to use (for both WebGL and WebGPU)
+import '@kitware/vtk.js/Rendering/Profiles/Geometry';
+
+import vtkFullScreenRenderWindow from '@kitware/vtk.js/Rendering/Misc/FullScreenRenderWindow';
+import vtkResourceLoader from '@kitware/vtk.js/IO/Core/ResourceLoader';
+import vtkIFCImporter from '@kitware/vtk.js/IO/Geometry/IFCImporter';
+import vtkURLExtract from '@kitware/vtk.js/Common/Core/URLExtract';
+
+import controlPanel from './controller.html';
+
+// ----------------------------------------------------------------------------
+// Example code
+// ----------------------------------------------------------------------------
+
+const userParams = vtkURLExtract.extractURLParameters();
+const url =
+ userParams.fileURL ||
+ 'https://raw.githubusercontent.com/ThatOpen/engine_web-ifc/refs/heads/main/tests/ifcfiles/public/duplex.ifc';
+const fullScreenRenderer = vtkFullScreenRenderWindow.newInstance();
+fullScreenRenderer.addController(controlPanel);
+
+if (userParams.mergeGeometries === undefined) {
+ userParams.mergeGeometries = true;
+}
+const mergeGeometriesCheckbox = document.querySelector('#mergeGeometries');
+mergeGeometriesCheckbox.checked = Boolean(userParams.mergeGeometries);
+
+const importer = vtkIFCImporter.newInstance({
+ mergeGeometries: mergeGeometriesCheckbox.checked,
+});
+
+// ----------------------------------------------------------------------------
+function update() {
+ const renderer = fullScreenRenderer.getRenderer();
+ const renderWindow = fullScreenRenderer.getRenderWindow();
+
+ const resetCamera = renderer.resetCamera;
+ const render = renderWindow.render;
+
+ importer.onReady(() => {
+ importer.importActors(renderer);
+ resetCamera();
+ render();
+ });
+}
+
+// ----------------------------------------------------------------------------
+// Importer usage example
+// ----------------------------------------------------------------------------
+vtkResourceLoader
+ .loadScript('https://cdn.jsdelivr.net/npm/web-ifc@0.0.64/web-ifc-api-iife.js')
+ .then(() => {
+ // Pass WebIFC api to vtkIFCImporter
+ vtkIFCImporter.setIFCAPI(window.WebIFC);
+
+ // Trigger data download
+ importer.setUrl(url).then(update);
+ });
+
+mergeGeometriesCheckbox.addEventListener('change', (evt) => {
+ window.location = `?mergeGeometries=${evt.target.checked}`;
+});
diff --git a/Sources/IO/Geometry/IFCImporter/index.d.ts b/Sources/IO/Geometry/IFCImporter/index.d.ts
new file mode 100644
index 00000000000..b43841527c0
--- /dev/null
+++ b/Sources/IO/Geometry/IFCImporter/index.d.ts
@@ -0,0 +1,163 @@
+import { vtkAlgorithm, vtkObject } from '../../../interfaces';
+import vtkRenderer from '../../../Rendering/Core/Renderer';
+import HtmlDataAccessHelper from '../../Core/DataAccessHelper/HtmlDataAccessHelper';
+import HttpDataAccessHelper from '../../Core/DataAccessHelper/HttpDataAccessHelper';
+import JSZipDataAccessHelper from '../../Core/DataAccessHelper/JSZipDataAccessHelper';
+import LiteHttpDataAccessHelper from '../../Core/DataAccessHelper/LiteHttpDataAccessHelper';
+
+interface IIFCImporterOptions {
+ compression?: string;
+ progressCallback?: any;
+}
+
+/**
+ *
+ */
+export interface IIFCImporterInitialValues {
+ mergeGeometries?: boolean;
+}
+
+type vtkIFCImporterBase = vtkObject &
+ Omit<
+ vtkAlgorithm,
+ | 'getInputData'
+ | 'setInputData'
+ | 'setInputConnection'
+ | 'getInputConnection'
+ | 'addInputConnection'
+ | 'addInputData'
+ >;
+
+export interface vtkIFCImporter extends vtkIFCImporterBase {
+ /**
+ *
+ */
+ getBaseURL(): string;
+
+ /**
+ *
+ */
+ getDataAccessHelper():
+ | HtmlDataAccessHelper
+ | HttpDataAccessHelper
+ | JSZipDataAccessHelper
+ | LiteHttpDataAccessHelper;
+
+ /**
+ * Get the url of the object to load.
+ */
+ getUrl(): string;
+
+ /**
+ * Import actors into the renderer.
+ * @param {vtkRenderer} renderer The vtkRenderer to import the actors into.
+ */
+ importActors(renderer: vtkRenderer): void;
+
+ /**
+ * Load the object data.
+ * @param {IIFCImporterOptions} [options]
+ */
+ loadData(options?: IIFCImporterOptions): Promise;
+
+ /**
+ * Parse data.
+ * @param {String | ArrayBuffer} content The content to parse.
+ */
+ parse(content: string | ArrayBuffer): void;
+
+ /**
+ * Parse data as ArrayBuffer.
+ * @param {ArrayBuffer} content The content to parse.
+ */
+ parseAsArrayBuffer(content: ArrayBuffer): void;
+
+ /**
+ *
+ * @param inData
+ * @param outData
+ */
+ requestData(inData: any, outData: any): void;
+
+ /**
+ *
+ * @param dataAccessHelper
+ */
+ setDataAccessHelper(
+ dataAccessHelper:
+ | HtmlDataAccessHelper
+ | HttpDataAccessHelper
+ | JSZipDataAccessHelper
+ | LiteHttpDataAccessHelper
+ ): boolean;
+
+ /**
+ * Set the url of the object to load.
+ * @param {String} url the url of the object to load.
+ * @param {IIFCImporterOptions} [option] The PLY reader options.
+ */
+ setUrl(url: string, option?: IIFCImporterOptions): Promise;
+}
+
+/**
+ * Set WebIFC api to be used by vtkIFCImporter
+ * @param {object} ifcApi
+ */
+export function setIFCAPI(ifcApi: any): void;
+
+/**
+ * Method used to decorate a given object (publicAPI+model) with vtkIFCImporter characteristics.
+ *
+ * @param publicAPI object on which methods will be bounds (public)
+ * @param model object on which data structure will be bounds (protected)
+ * @param {IIFCImporterInitialValues} [initialValues] (default: {})
+ */
+export function extend(
+ publicAPI: object,
+ model: object,
+ initialValues?: IIFCImporterInitialValues
+): void;
+
+/**
+ * Method used to create a new instance of vtkIFCImporter
+ * @param {IIFCImporterInitialValues} [initialValues] for pre-setting some of its content
+ */
+export function newInstance(
+ initialValues?: IIFCImporterInitialValues
+): vtkIFCImporter;
+
+/**
+ * vtkIFCImporter is a source object that reads Industry Foundation Class(IFC) files.
+ *
+ * The vtkIFCImporter is using web-ifc library to parse the IFC file.
+ *
+ * @example
+ * ```js
+ * import vtkResourceLoader from '@kitware/vtk.js/IO/Core/ResourceLoader';
+ * import vtkIFCImporter from '@kitware/vtk.js/IO/Geometry/IFCImporter';
+ *
+ * function update() {
+ * importer.onReady(() => {
+ * importer.importActors(renderer);
+ * renderer.resetCamera();
+ * renderWindow.render();
+ * });
+ * }
+ *
+ * vtkResourceLoader
+ * .loadScript('https://cdn.jsdelivr.net/npm/web-ifc@0.0.55/web-ifc-api-iife.js')
+ * .then(() => {
+ * // Pass WebIFC api to vtkIFCImporter
+ * vtkIFCImporter.setIFCAPI(window.WebIFC);
+ *
+ * // Trigger data download
+ * importer.setUrl(`${__BASE_PATH__}/data/ifc/house.ifc`).then(update);
+ * });
+ * ```
+ */
+export declare const vtkIFCImporter: {
+ newInstance: typeof newInstance;
+ extend: typeof extend;
+ setIFCAPI: typeof setIFCAPI;
+};
+export default vtkIFCImporter;
diff --git a/Sources/IO/Geometry/IFCImporter/index.js b/Sources/IO/Geometry/IFCImporter/index.js
new file mode 100644
index 00000000000..4aadc02f534
--- /dev/null
+++ b/Sources/IO/Geometry/IFCImporter/index.js
@@ -0,0 +1,327 @@
+import macro from 'vtk.js/Sources/macros';
+
+// Enable data soure for DataAccessHelper
+import 'vtk.js/Sources/IO/Core/DataAccessHelper/LiteHttpDataAccessHelper'; // Just need HTTP
+// import 'vtk.js/Sources/IO/Core/DataAccessHelper/HttpDataAccessHelper'; // HTTP + zip
+// import 'vtk.js/Sources/IO/Core/DataAccessHelper/HtmlDataAccessHelper'; // html + base64 + zip
+// import 'vtk.js/Sources/IO/Core/DataAccessHelper/JSZipDataAccessHelper'; // zip
+
+import DataAccessHelper from 'vtk.js/Sources/IO/Core/DataAccessHelper';
+import vtkActor from 'vtk.js/Sources/Rendering/Core/Actor';
+import vtkMapper from 'vtk.js/Sources/Rendering/Core/Mapper';
+import vtkDataArray from 'vtk.js/Sources/Common/Core/DataArray';
+import vtkPolyData from 'vtk.js/Sources/Common/DataModel/PolyData';
+import vtkCellArray from 'vtk.js/Sources/Common/Core/CellArray';
+import vtkAppendPolyData from 'vtk.js/Sources/Filters/General/AppendPolyData';
+import vtkMatrixBuilder from 'vtk.js/Sources/Common/Core/MatrixBuilder';
+import { mat3 } from 'gl-matrix';
+
+const { vtkErrorMacro } = macro;
+
+let WebIFC;
+
+/**
+ * Set WebIFC api to be used by vtkIFCImporter
+ * @param {object} ifcApi
+ */
+function setIFCAPI(ifcApi) {
+ WebIFC = ifcApi;
+}
+
+function vtkIFCImporter(publicAPI, model) {
+ model.classHierarchy.push('vtkIFCImporter');
+ const meshes = [];
+
+ /**
+ * Create a vtkPolyData from an IFC mesh object
+ * @param {object} mesh the IFC web mesh object
+ * @returns vtkPolyData
+ */
+ function createPolyDataFromIFCMesh(mesh) {
+ const { vertices, indices } = mesh;
+ const pd = vtkPolyData.newInstance();
+ const cells = vtkCellArray.newInstance();
+
+ const pointValues = new Float32Array(vertices.length / 2);
+ const normalsArray = new Float32Array(vertices.length / 2);
+
+ for (let i = 0; i < vertices.length; i += 6) {
+ pointValues[i / 2] = vertices[i];
+ pointValues[i / 2 + 1] = vertices[i + 1];
+ pointValues[i / 2 + 2] = vertices[i + 2];
+
+ normalsArray[i / 2] = vertices[i + 3];
+ normalsArray[i / 2 + 1] = vertices[i + 4];
+ normalsArray[i / 2 + 2] = vertices[i + 5];
+ }
+
+ const nCells = indices.length;
+ cells.resize((3 * nCells) / 3);
+ for (let cellId = 0; cellId < nCells; cellId += 3) {
+ const cell = indices.slice(cellId, cellId + 3);
+ cells.insertNextCell(cell);
+ }
+
+ pd.getPoints().setData(pointValues, 3);
+ pd.setStrips(cells);
+ pd.getPointData().setNormals(
+ vtkDataArray.newInstance({
+ name: 'Normals',
+ values: normalsArray,
+ numberOfComponents: 3,
+ })
+ );
+
+ return pd;
+ }
+
+ /**
+ * Create a colored vtkPolyData from an IFC mesh object
+ * @param {object} mesh the IFC mesh object
+ * @returns vtkPolyData
+ */
+ function createColoredPolyDataFromIFCMesh(mesh) {
+ const { vertices, indices, color, userMatrix } = mesh;
+
+ const pd = vtkPolyData.newInstance();
+ const cells = vtkCellArray.newInstance();
+
+ const pointValues = new Float32Array(vertices.length / 2);
+ const normalsArray = new Float32Array(vertices.length / 2);
+ const colorArray = new Float32Array(vertices.length / 2);
+
+ if (userMatrix) {
+ const transformMatrix = vtkMatrixBuilder
+ .buildFromRadian()
+ .setMatrix(userMatrix);
+
+ const normalMatrix = vtkMatrixBuilder
+ .buildFromRadian()
+ .multiply3x3(mat3.fromMat4(mat3.create(), userMatrix));
+
+ for (let i = 0; i < vertices.length; i += 6) {
+ const point = [vertices[i], vertices[i + 1], vertices[i + 2]];
+ const normal = [vertices[i + 3], vertices[i + 4], vertices[i + 5]];
+
+ transformMatrix.apply(point);
+ normalMatrix.apply(normal);
+
+ pointValues[i / 2] = point[0];
+ pointValues[i / 2 + 1] = point[1];
+ pointValues[i / 2 + 2] = point[2];
+
+ normalsArray[i / 2] = normal[0];
+ normalsArray[i / 2 + 1] = normal[1];
+ normalsArray[i / 2 + 2] = normal[2];
+
+ const colorIndex = i / 2;
+ colorArray[colorIndex] = color.x;
+ colorArray[colorIndex + 1] = color.y;
+ colorArray[colorIndex + 2] = color.z;
+ }
+ } else {
+ for (let i = 0; i < vertices.length; i += 6) {
+ pointValues[i / 2] = vertices[i];
+ pointValues[i / 2 + 1] = vertices[i + 1];
+ pointValues[i / 2 + 2] = vertices[i + 2];
+
+ normalsArray[i / 2] = vertices[i + 3];
+ normalsArray[i / 2 + 1] = vertices[i + 4];
+ normalsArray[i / 2 + 2] = vertices[i + 5];
+
+ const colorIndex = i / 2;
+ colorArray[colorIndex] = color.x;
+ colorArray[colorIndex + 1] = color.y;
+ colorArray[colorIndex + 2] = color.z;
+ }
+ }
+
+ const nCells = indices.length;
+ cells.resize((3 * nCells) / 3);
+ for (let cellId = 0; cellId < nCells; cellId += 3) {
+ const cell = indices.slice(cellId, cellId + 3);
+ cells.insertNextCell(cell);
+ }
+
+ pd.getPoints().setData(pointValues, 3);
+ pd.setPolys(cells);
+ pd.getPointData().setNormals(
+ vtkDataArray.newInstance({
+ name: 'Normals',
+ values: normalsArray,
+ numberOfComponents: 3,
+ })
+ );
+
+ pd.getPointData().setScalars(
+ vtkDataArray.newInstance({
+ name: 'Colors',
+ values: colorArray,
+ numberOfComponents: 3,
+ })
+ );
+
+ return pd;
+ }
+
+ function parseIfc(content) {
+ const modelID = model._ifcApi.OpenModel(new Uint8Array(content), {
+ COORDINATE_TO_ORIGIN: true,
+ USE_FAST_BOOLS: true,
+ });
+
+ model._ifcApi.StreamAllMeshes(modelID, (mesh) => {
+ const placedGeometries = mesh.geometries;
+
+ for (let i = 0; i < placedGeometries.size(); i++) {
+ const placedGeometry = placedGeometries.get(i);
+
+ const ifcGeometryData = model._ifcApi.GetGeometry(
+ modelID,
+ placedGeometry.geometryExpressID
+ );
+
+ const ifcVertices = model._ifcApi.GetVertexArray(
+ ifcGeometryData.GetVertexData(),
+ ifcGeometryData.GetVertexDataSize()
+ );
+
+ const ifcIndices = model._ifcApi.GetIndexArray(
+ ifcGeometryData.GetIndexData(),
+ ifcGeometryData.GetIndexDataSize()
+ );
+
+ meshes.push({
+ vertices: ifcVertices,
+ indices: ifcIndices,
+ color: placedGeometry.color,
+ userMatrix: placedGeometry.flatTransformation,
+ });
+ }
+ });
+
+ model._ifcApi.CloseModel(modelID);
+ }
+
+ if (!model.dataAccessHelper) {
+ model.dataAccessHelper = DataAccessHelper.get('http');
+ }
+
+ function fetchData(url, options = {}) {
+ const { compression, progressCallback } = model;
+ return model.dataAccessHelper.fetchBinary(url, {
+ compression,
+ progressCallback,
+ });
+ }
+
+ publicAPI.setUrl = (url, options = { binary: true }) => {
+ model.url = url;
+ model.baseURL = url.split('/').slice(0, -1).join('/');
+ model.compression = options.compression;
+ return publicAPI.loadData(options);
+ };
+
+ publicAPI.loadData = (options = {}) =>
+ fetchData(model.url, options).then(publicAPI.parse);
+
+ publicAPI.parse = (content) => {
+ publicAPI.parseAsArrayBuffer(content);
+ };
+
+ publicAPI.parseAsArrayBuffer = (content) => {
+ if (!content) {
+ vtkErrorMacro('No content to parse.');
+ return;
+ }
+
+ if (!WebIFC) {
+ vtkErrorMacro('vtkIFCImporter requires WebIFC API to be set.');
+ return;
+ }
+
+ model._ifcApi = new WebIFC.IfcAPI();
+ model._ifcApi.Init().then(() => {
+ parseIfc(content);
+ publicAPI.invokeReady();
+ });
+ };
+
+ publicAPI.importActors = (renderer) => {
+ if (model.mergeGeometries) {
+ const opaqueMeshes = meshes.filter((mesh) => mesh.color.w === 1);
+ const oapd = vtkAppendPolyData.newInstance();
+
+ opaqueMeshes.forEach((mesh) => {
+ const pd = createColoredPolyDataFromIFCMesh(mesh);
+ oapd.addInputData(pd);
+ });
+
+ let mapper = vtkMapper.newInstance();
+ mapper.setColorModeToDirectScalars();
+ mapper.setInputConnection(oapd.getOutputPort());
+
+ let actor = vtkActor.newInstance();
+ actor.setMapper(mapper);
+ renderer.addActor(actor);
+
+ const transparentMeshes = meshes.filter((mesh) => mesh.color.w < 1);
+ const tapd = vtkAppendPolyData.newInstance();
+
+ transparentMeshes.forEach((mesh) => {
+ const pd = createColoredPolyDataFromIFCMesh(mesh);
+ tapd.addInputData(pd);
+ });
+
+ mapper = vtkMapper.newInstance();
+ mapper.setColorModeToDirectScalars();
+ mapper.setInputConnection(tapd.getOutputPort());
+
+ actor = vtkActor.newInstance();
+ actor.setMapper(mapper);
+ actor.getProperty().setOpacity(0.5);
+ renderer.addActor(actor);
+ } else {
+ meshes.forEach((mesh) => {
+ const pd = createPolyDataFromIFCMesh(mesh);
+
+ const mapper = vtkMapper.newInstance();
+ mapper.setInputData(pd);
+
+ const actor = vtkActor.newInstance();
+ actor.setMapper(mapper);
+
+ const { x, y, z, w } = mesh.color;
+ actor.getProperty().setColor(x, y, z);
+ actor.getProperty().setOpacity(w);
+
+ actor.setUserMatrix(mesh.userMatrix);
+ renderer.addActor(actor);
+ });
+ }
+ };
+}
+
+const DEFAULT_VALUES = {
+ mergeGeometries: false,
+};
+
+export function extend(publicAPI, model, initialValues = {}) {
+ Object.assign(model, DEFAULT_VALUES, initialValues);
+
+ macro.obj(publicAPI, model);
+ macro.get(publicAPI, model, ['url', 'baseURL']);
+ macro.setGet(publicAPI, model, ['dataAccessHelper', 'mergeGeometries']);
+ macro.event(publicAPI, model, 'ready');
+ macro.algo(publicAPI, model, 0, 1);
+
+ vtkIFCImporter(publicAPI, model);
+}
+
+export const newInstance = macro.newInstance(extend, 'vtkIFCImporter');
+
+export default {
+ newInstance,
+ extend,
+ setIFCAPI,
+};
diff --git a/Sources/IO/Geometry/STLReader/example/index.js b/Sources/IO/Geometry/STLReader/example/index.js
index 1fbbe634cfd..b9c4e387c79 100644
--- a/Sources/IO/Geometry/STLReader/example/index.js
+++ b/Sources/IO/Geometry/STLReader/example/index.js
@@ -7,17 +7,20 @@ import vtkActor from '@kitware/vtk.js/Rendering/Core/Actor';
import vtkFullScreenRenderWindow from '@kitware/vtk.js/Rendering/Misc/FullScreenRenderWindow';
import vtkMapper from '@kitware/vtk.js/Rendering/Core/Mapper';
import vtkSTLReader from '@kitware/vtk.js/IO/Geometry/STLReader';
-
+import vtkPolyDataNormals from '@kitware/vtk.js/Filters/Core/PolyDataNormals';
// ----------------------------------------------------------------------------
// Example code
// ----------------------------------------------------------------------------
const reader = vtkSTLReader.newInstance();
+reader.setRemoveDuplicateVertices(5);
const mapper = vtkMapper.newInstance({ scalarVisibility: false });
const actor = vtkActor.newInstance();
actor.setMapper(mapper);
-mapper.setInputConnection(reader.getOutputPort());
+const normals = vtkPolyDataNormals.newInstance();
+normals.setInputConnection(reader.getOutputPort());
+mapper.setInputConnection(normals.getOutputPort());
// ----------------------------------------------------------------------------
diff --git a/Sources/IO/Geometry/STLReader/index.d.ts b/Sources/IO/Geometry/STLReader/index.d.ts
index 0eec1a5c7a1..a2dfb4ff6af 100755
--- a/Sources/IO/Geometry/STLReader/index.d.ts
+++ b/Sources/IO/Geometry/STLReader/index.d.ts
@@ -46,6 +46,11 @@ export interface vtkSTLReader extends vtkSTLReaderBase {
*/
getUrl(): string;
+ /**
+ * Get tolerance when removeDuplicateVertices is set
+ */
+ getRemoveDuplicateVertices(): number;
+
/**
* Load the object data.
* @param {ISTLReaderOptions} [options]
@@ -94,6 +99,15 @@ export interface vtkSTLReader extends vtkSTLReaderBase {
* @param {ISTLReaderOptions} [option] The STL reader options.
*/
setUrl(url: string, option?: ISTLReaderOptions): Promise;
+
+ /**
+ * Turn on/off automatic removeDuplicateVertices
+ * After reading the STL file, if `tolerance` is >= 0, then points with the same coordinates at 10 power tolerance are merged.
+ * For a smooth rendering, you might want to compute normals with vtkPolyDataNormals.
+ *
+ * @param {Number} tolerance
+ */
+ setRemoveDuplicateVertices(tolerance: number): boolean;
}
/**
diff --git a/Sources/IO/Geometry/STLReader/index.js b/Sources/IO/Geometry/STLReader/index.js
index b5ceed34f1a..821f913cc2e 100644
--- a/Sources/IO/Geometry/STLReader/index.js
+++ b/Sources/IO/Geometry/STLReader/index.js
@@ -122,6 +122,64 @@ function vtkSTLReader(publicAPI, model) {
});
}
+ function removeDuplicateVertices(tolerance) {
+ const polydata = model.output[0];
+
+ const points = polydata.getPoints().getData();
+ const faces = polydata.getPolys().getData();
+
+ if (!points || !faces) {
+ console.warn('No valid polydata.');
+ return;
+ }
+
+ const vMap = new Map();
+ const vIndexMap = new Map();
+ let vInc = 0;
+ let pointsChanged = false;
+ for (let i = 0; i < points.length; i += 3) {
+ const k1 = (points[i] * 10 ** tolerance).toFixed(0);
+ const k2 = (points[i + 1] * 10 ** tolerance).toFixed(0);
+ const k3 = (points[i + 2] * 10 ** tolerance).toFixed(0);
+ const key = `${k1},${k2},${k3}`;
+ if (vMap.get(key) !== undefined) {
+ vIndexMap.set(i / 3, vMap.get(key));
+ pointsChanged = true;
+ } else {
+ vIndexMap.set(i / 3, vInc);
+ vMap.set(key, vInc);
+ vInc++;
+ }
+ }
+
+ const outVerts = new Float32Array(vMap.size * 3);
+ const keys = Array.from(vMap.keys());
+
+ for (let i = 0; i < keys.length; i++) {
+ const k = keys[i];
+ const j = vMap.get(k) * 3;
+ const coords = k.split(',').map((e) => +e * 10 ** -tolerance);
+ outVerts[j] = coords[0];
+ outVerts[j + 1] = coords[1];
+ outVerts[j + 2] = coords[2];
+ }
+
+ const outFaces = new Int32Array(faces);
+ for (let i = 0; i < faces.length; i += 4) {
+ outFaces[i] = 3;
+ outFaces[i + 1] = vIndexMap.get(faces[i + 1]);
+ outFaces[i + 2] = vIndexMap.get(faces[i + 2]);
+ outFaces[i + 3] = vIndexMap.get(faces[i + 3]);
+ }
+
+ polydata.getPoints().setData(outVerts);
+ polydata.getPolys().setData(outFaces);
+
+ if (pointsChanged) {
+ publicAPI.modified();
+ }
+ }
+
// Set DataSet url
publicAPI.setUrl = (url, option = { binary: true }) => {
model.url = url;
@@ -289,6 +347,10 @@ function vtkSTLReader(publicAPI, model) {
// Add new output
model.output[0] = polydata;
+
+ if (model.removeDuplicateVertices >= 0) {
+ removeDuplicateVertices(model.removeDuplicateVertices);
+ }
};
publicAPI.parseAsText = (content) => {
@@ -326,6 +388,10 @@ function vtkSTLReader(publicAPI, model) {
// Add new output
model.output[0] = polydata;
+
+ if (model.removeDuplicateVertices >= 0) {
+ removeDuplicateVertices(model.removeDuplicateVertices);
+ }
};
publicAPI.requestData = (inData, outData) => {
@@ -341,6 +407,7 @@ const DEFAULT_VALUES = {
// baseURL: null,
// dataAccessHelper: null,
// url: null,
+ removeDuplicateVertices: -1,
};
// ----------------------------------------------------------------------------
@@ -351,7 +418,10 @@ export function extend(publicAPI, model, initialValues = {}) {
// Build VTK API
macro.obj(publicAPI, model);
macro.get(publicAPI, model, ['url', 'baseURL']);
- macro.setGet(publicAPI, model, ['dataAccessHelper']);
+ macro.setGet(publicAPI, model, [
+ 'dataAccessHelper',
+ 'removeDuplicateVertices',
+ ]);
macro.algo(publicAPI, model, 0, 1);
// vtkSTLReader methods
diff --git a/Sources/IO/Geometry/index.js b/Sources/IO/Geometry/index.js
index 084317488c5..8f31be614be 100644
--- a/Sources/IO/Geometry/index.js
+++ b/Sources/IO/Geometry/index.js
@@ -3,6 +3,8 @@ import vtkPLYReader from './PLYReader';
import vtkDracoReader from './DracoReader';
import vtkSTLWriter from './STLWriter';
import vtkPLYWriter from './PLYWriter';
+import vtkGLTFImporter from './GLTFImporter';
+import vtkIFCImporter from './IFCImporter';
export default {
vtkSTLReader,
@@ -10,4 +12,6 @@ export default {
vtkDracoReader,
vtkSTLWriter,
vtkPLYWriter,
+ vtkGLTFImporter,
+ vtkIFCImporter,
};
diff --git a/Sources/IO/Image/TGAReader/Constants.js b/Sources/IO/Image/TGAReader/Constants.js
new file mode 100644
index 00000000000..661acddd0ec
--- /dev/null
+++ b/Sources/IO/Image/TGAReader/Constants.js
@@ -0,0 +1,27 @@
+const TYPE_INDEXED = 1;
+const TYPE_RGB = 2;
+const TYPE_GREY = 3;
+const TYPE_RLE_INDEXED = 9;
+const TYPE_RLE_RGB = 10;
+const TYPE_RLE_GREY = 11;
+const ORIGIN_MASK = 0x30;
+const ORIGIN_SHIFT = 0x04;
+const ORIGIN_BL = 0x00;
+const ORIGIN_BR = 0x01;
+const ORIGIN_UL = 0x02;
+const ORIGIN_UR = 0x03;
+
+export default {
+ TYPE_INDEXED,
+ TYPE_RGB,
+ TYPE_GREY,
+ TYPE_RLE_INDEXED,
+ TYPE_RLE_RGB,
+ TYPE_RLE_GREY,
+ ORIGIN_MASK,
+ ORIGIN_SHIFT,
+ ORIGIN_BL,
+ ORIGIN_BR,
+ ORIGIN_UL,
+ ORIGIN_UR,
+};
diff --git a/Sources/IO/Image/TGAReader/example/index.js b/Sources/IO/Image/TGAReader/example/index.js
new file mode 100644
index 00000000000..5c951d58332
--- /dev/null
+++ b/Sources/IO/Image/TGAReader/example/index.js
@@ -0,0 +1,122 @@
+import '@kitware/vtk.js/favicon';
+
+// Load the rendering pieces we want to use (for both WebGL and WebGPU)
+import '@kitware/vtk.js/Rendering/Profiles/Geometry';
+
+import vtkFullScreenRenderWindow from '@kitware/vtk.js/Rendering/Misc/FullScreenRenderWindow';
+import vtkActor from '@kitware/vtk.js/Rendering/Core/Actor';
+import vtkMapper from '@kitware/vtk.js/Rendering/Core/Mapper';
+import vtkPlaneSource from '@kitware/vtk.js/Filters/Sources/PlaneSource';
+import vtkTGAReader from '@kitware/vtk.js/IO/Image/TGAReader';
+import vtkTexture from '@kitware/vtk.js/Rendering/Core/Texture';
+import vtkURLExtract from '@kitware/vtk.js/Common/Core/URLExtract';
+
+// ----------------------------------------------------------------------------
+// Example code
+// ----------------------------------------------------------------------------
+const userParams = vtkURLExtract.extractURLParameters();
+
+const reader = vtkTGAReader.newInstance();
+const texture = vtkTexture.newInstance();
+const planeSource = vtkPlaneSource.newInstance();
+const mapper = vtkMapper.newInstance();
+const actor = vtkActor.newInstance();
+mapper.setInputConnection(planeSource.getOutputPort());
+actor.setMapper(mapper);
+
+// ----------------------------------------------------------------------------
+// Use a file reader to load a local file
+// ----------------------------------------------------------------------------
+
+const myContainer = document.querySelector('body');
+const fileContainer = document.createElement('div');
+fileContainer.innerHTML =
+ 'Select a tga file.
';
+myContainer.appendChild(fileContainer);
+
+const fileInput = fileContainer.querySelector('input');
+
+function zoomCameraToFitPlane(camera, planeWidth, planeHeight) {
+ const fov = 60; // Field of view in degrees
+
+ // Calculate the distance needed to fit the plane in view
+ const distance =
+ Math.max(planeWidth, planeHeight) /
+ (2 * Math.tan((fov * Math.PI) / 180 / 2));
+
+ // Set camera position
+ camera.setPosition(planeWidth / 2, planeHeight / 2, distance);
+ camera.setFocalPoint(planeWidth / 2, planeHeight / 2, 0);
+ camera.setViewUp(0, 1, 0);
+
+ // Set parallel scale for orthographic projection
+ camera.setParallelScale(planeHeight / 2);
+}
+
+function update() {
+ // Get the vtkImageData from the reader
+ const imageData = reader.getOutputData(0);
+
+ // Set the vtkImageData as the texture input
+ texture.setInputData(imageData);
+
+ // // Get the image's extent and spacing
+ const [xMin, xMax, yMin, yMax] = imageData.getExtent();
+ const [spacingX, spacingY] = imageData.getSpacing();
+
+ // // Calculate the plane's width and height based on the image's dimensions
+ const planeWidth = (xMax - xMin + 1) * spacingX;
+ const planeHeight = (yMax - yMin + 1) * spacingY;
+
+ // Set the plane's origin and corners based on calculated width and height
+ planeSource.setOrigin(0, 0, 0);
+ planeSource.setPoint1(planeWidth, 0, 0); // Horizontal edge
+ planeSource.setPoint2(0, planeHeight, 0); // Vertical edge
+
+ actor.addTexture(texture);
+
+ const fullScreenRenderer = vtkFullScreenRenderWindow.newInstance();
+ const renderer = fullScreenRenderer.getRenderer();
+ const renderWindow = fullScreenRenderer.getRenderWindow();
+ const camera = renderer.getActiveCamera();
+ const interactor = renderWindow.getInteractor();
+
+ // Disable default interactor style
+ interactor.setInteractorStyle(null);
+
+ renderer.addActor(actor);
+
+ // Adjust the camera to fit the plane in the view
+ zoomCameraToFitPlane(camera, planeWidth, planeHeight);
+ renderer.resetCameraClippingRange();
+
+ renderWindow.render();
+}
+
+function handleFile(event) {
+ event.preventDefault();
+ const dataTransfer = event.dataTransfer;
+ const files = event.target.files || dataTransfer.files;
+ if (files.length === 1) {
+ const file = files[0];
+ const fileReader = new FileReader();
+ fileReader.onload = () => {
+ reader.parse(fileReader.result);
+ update();
+ };
+ fileReader.readAsArrayBuffer(file);
+ }
+}
+
+fileInput.addEventListener('change', handleFile);
+
+// ----------------------------------------------------------------------------
+// Use the reader to download a file
+// ----------------------------------------------------------------------------
+if (userParams.fileURL) {
+ reader.setUrl(userParams.fileURL).then(() => {
+ reader.loadData().then(() => {
+ update();
+ });
+ });
+}
diff --git a/Sources/IO/Image/TGAReader/index.d.ts b/Sources/IO/Image/TGAReader/index.d.ts
new file mode 100644
index 00000000000..8eac6145b54
--- /dev/null
+++ b/Sources/IO/Image/TGAReader/index.d.ts
@@ -0,0 +1,121 @@
+import { vtkAlgorithm, vtkObject } from '../../../interfaces';
+import HtmlDataAccessHelper from '../../Core/DataAccessHelper/HtmlDataAccessHelper';
+import HttpDataAccessHelper from '../../Core/DataAccessHelper/HttpDataAccessHelper';
+import JSZipDataAccessHelper from '../../Core/DataAccessHelper/JSZipDataAccessHelper';
+import LiteHttpDataAccessHelper from '../../Core/DataAccessHelper/LiteHttpDataAccessHelper';
+
+interface ITGAReaderOptions {
+ compression?: string;
+ progressCallback?: any;
+}
+
+/**
+ *
+ */
+export interface ITGAReaderInitialValues {}
+
+type vtkTGAReaderBase = vtkObject &
+ Omit<
+ vtkAlgorithm,
+ | 'getInputData'
+ | 'setInputData'
+ | 'setInputConnection'
+ | 'getInputConnection'
+ | 'addInputConnection'
+ | 'addInputData'
+ >;
+
+export interface vtkTGAReader extends vtkTGAReaderBase {
+ /**
+ * Get the base url.
+ */
+ getBaseURL(): string;
+
+ /**
+ * Get the dataAccess helper.
+ */
+ getDataAccessHelper():
+ | HtmlDataAccessHelper
+ | HttpDataAccessHelper
+ | JSZipDataAccessHelper
+ | LiteHttpDataAccessHelper;
+
+ /**
+ * Get the url of the object to load.
+ */
+ getUrl(): string;
+
+ /**
+ * Load the object data.
+ * @param {ITGAReaderOptions} [options]
+ */
+ loadData(options?: ITGAReaderOptions): Promise;
+
+ /**
+ * Parse data.
+ * @param {ArrayBuffer} content The content to parse.
+ */
+ parse(content: ArrayBuffer): void;
+
+ /**
+ * Parse data as ArrayBuffer.
+ * @param {ArrayBuffer} content The content to parse.
+ */
+ parseAsArrayBuffer(content: ArrayBuffer): void;
+
+ /**
+ *
+ * @param inData
+ * @param outData
+ */
+ requestData(inData: any, outData: any): void;
+
+ /**
+ *
+ * @param dataAccessHelper
+ */
+ setDataAccessHelper(
+ dataAccessHelper:
+ | HtmlDataAccessHelper
+ | HttpDataAccessHelper
+ | JSZipDataAccessHelper
+ | LiteHttpDataAccessHelper
+ ): boolean;
+
+ /**
+ * Set the url of the object to load.
+ * @param {String} url the url of the object to load.
+ * @param {ITGAReaderOptions} [option] The PLY reader options.
+ */
+ setUrl(url: string, option?: ITGAReaderOptions): Promise;
+}
+
+/**
+ * Method used to decorate a given object (publicAPI+model) with vtkTGAReader characteristics.
+ *
+ * @param publicAPI object on which methods will be bounds (public)
+ * @param model object on which data structure will be bounds (protected)
+ * @param {ITGAReaderInitialValues} [initialValues] (default: {})
+ */
+export function extend(
+ publicAPI: object,
+ model: object,
+ initialValues?: ITGAReaderInitialValues
+): void;
+
+/**
+ * Method used to create a new instance of vtkTGAReader
+ * @param {ITGAReaderInitialValues} [initialValues] for pre-setting some of its content
+ */
+export function newInstance(
+ initialValues?: ITGAReaderInitialValues
+): vtkTGAReader;
+
+/**
+ * vtkTGAReader is a source object that reads Truevision Targa(TGA) files.
+ */
+export declare const vtkTGAReader: {
+ newInstance: typeof newInstance;
+ extend: typeof extend;
+};
+export default vtkTGAReader;
diff --git a/Sources/IO/Image/TGAReader/index.js b/Sources/IO/Image/TGAReader/index.js
new file mode 100644
index 00000000000..f08c3b30d37
--- /dev/null
+++ b/Sources/IO/Image/TGAReader/index.js
@@ -0,0 +1,535 @@
+/* eslint-disable no-bitwise */
+// Enable data soure for DataAccessHelper
+import 'vtk.js/Sources/IO/Core/DataAccessHelper/LiteHttpDataAccessHelper'; // Just need HTTP
+// import 'vtk.js/Sources/IO/Core/DataAccessHelper/HttpDataAccessHelper'; // HTTP + zip
+// import 'vtk.js/Sources/IO/Core/DataAccessHelper/HtmlDataAccessHelper'; // html + base64 + zip
+// import 'vtk.js/Sources/IO/Core/DataAccessHelper/JSZipDataAccessHelper'; // zip
+
+import macro from 'vtk.js/Sources/macros';
+import DataAccessHelper from 'vtk.js/Sources/IO/Core/DataAccessHelper';
+import vtkImageData from 'vtk.js/Sources/Common/DataModel/ImageData';
+import vtkDataArray from 'vtk.js/Sources/Common/Core/DataArray';
+import Constants from 'vtk.js/Sources/IO/Image/TGAReader/Constants';
+
+const { vtkErrorMacro } = macro;
+
+// ----------------------------------------------------------------------------
+// vtkTGAReader methods
+// ----------------------------------------------------------------------------
+
+function vtkTGAReader(publicAPI, model) {
+ // Set our className
+ model.classHierarchy.push('vtkTGAReader');
+
+ // Create default dataAccessHelper if not available
+ if (!model.dataAccessHelper) {
+ model.dataAccessHelper = DataAccessHelper.get('http');
+ }
+
+ /**
+ * Gets the header of a TGA file
+ * @param data defines the TGA data
+ * @returns the header
+ */
+ function parseHeader(data) {
+ let offset = 0;
+
+ const header = {
+ idLength: data[offset++],
+ colormap_type: data[offset++],
+ imageType: data[offset++],
+ colormapIndex: data[offset++] | (data[offset++] << 8),
+ colormapLength: data[offset++] | (data[offset++] << 8),
+ colormapSize: data[offset++],
+ origin: [
+ data[offset++] | (data[offset++] << 8),
+ data[offset++] | (data[offset++] << 8),
+ ],
+ width: data[offset++] | (data[offset++] << 8),
+ height: data[offset++] | (data[offset++] << 8),
+ pixelSize: data[offset++],
+ flags: data[offset++],
+ };
+
+ return header;
+ }
+
+ const handlers = {
+ getImageData8bits(
+ header,
+ palettes,
+ pixeData,
+ yStart,
+ yStep,
+ yEnd,
+ xStart,
+ xStep,
+ xEnd
+ ) {
+ const image = pixeData;
+ const colormap = palettes;
+ const width = header.width;
+ const height = header.height;
+ let color;
+ let i = 0;
+ let x;
+ let y;
+
+ const imageData = new Uint8Array(width * height * 4);
+
+ for (y = yStart; y !== yEnd; y += yStep) {
+ for (x = xStart; x !== xEnd; x += xStep, i++) {
+ color = image[i];
+ imageData[(x + width * y) * 4 + 3] = 255;
+ imageData[(x + width * y) * 4 + 2] = colormap[color * 3 + 0];
+ imageData[(x + width * y) * 4 + 1] = colormap[color * 3 + 1];
+ imageData[(x + width * y) * 4 + 0] = colormap[color * 3 + 2];
+ }
+ }
+
+ return imageData;
+ },
+ getImageData16bits(
+ header,
+ palettes,
+ pixeData,
+ yStart,
+ yStep,
+ yEnd,
+ xStart,
+ xStep,
+ xEnd
+ ) {
+ const image = pixeData;
+ const width = header.width;
+ const height = header.height;
+ let color;
+ let i = 0;
+ let x;
+ let y;
+
+ const imageData = new Uint8Array(width * height * 4);
+
+ for (y = yStart; y !== yEnd; y += yStep) {
+ for (x = xStart; x !== xEnd; x += xStep, i += 2) {
+ color = image[i + 0] + (image[i + 1] << 8); // Inversed ?
+ const r = ((((color & 0x7c00) >> 10) * 255) / 0x1f) | 0;
+ const g = ((((color & 0x03e0) >> 5) * 255) / 0x1f) | 0;
+ const b = (((color & 0x001f) * 255) / 0x1f) | 0;
+
+ imageData[(x + width * y) * 4 + 0] = r;
+ imageData[(x + width * y) * 4 + 1] = g;
+ imageData[(x + width * y) * 4 + 2] = b;
+ imageData[(x + width * y) * 4 + 3] = color & 0x8000 ? 0 : 255;
+ }
+ }
+
+ return imageData;
+ },
+ getImageData24bits(
+ header,
+ palettes,
+ pixeData,
+ yStart,
+ yStep,
+ yEnd,
+ xStart,
+ xStep,
+ xEnd
+ ) {
+ const image = pixeData;
+ const width = header.width;
+ const height = header.height;
+ let i = 0;
+ let x;
+ let y;
+
+ const imageData = new Uint8Array(width * height * 4);
+
+ for (y = yStart; y !== yEnd; y += yStep) {
+ for (x = xStart; x !== xEnd; x += xStep, i += 3) {
+ imageData[(x + width * y) * 4 + 3] = 255;
+ imageData[(x + width * y) * 4 + 2] = image[i + 0];
+ imageData[(x + width * y) * 4 + 1] = image[i + 1];
+ imageData[(x + width * y) * 4 + 0] = image[i + 2];
+ }
+ }
+
+ return imageData;
+ },
+ getImageData32bits(
+ header,
+ palettes,
+ pixeData,
+ yStart,
+ yStep,
+ yEnd,
+ xStart,
+ xStep,
+ xEnd
+ ) {
+ const image = pixeData;
+ const width = header.width;
+ const height = header.height;
+ let i = 0;
+ let x;
+ let y;
+
+ const imageData = new Uint8Array(width * height * 4);
+
+ for (y = yStart; y !== yEnd; y += yStep) {
+ for (x = xStart; x !== xEnd; x += xStep, i += 4) {
+ imageData[(x + width * y) * 4 + 2] = image[i + 0];
+ imageData[(x + width * y) * 4 + 1] = image[i + 1];
+ imageData[(x + width * y) * 4 + 0] = image[i + 2];
+ imageData[(x + width * y) * 4 + 3] = image[i + 3];
+ }
+ }
+
+ return imageData;
+ },
+ getImageDataGrey8bits(
+ header,
+ palettes,
+ pixeData,
+ yStart,
+ yStep,
+ yEnd,
+ xStart,
+ xStep,
+ xEnd
+ ) {
+ const image = pixeData;
+ const width = header.width;
+ const height = header.height;
+ let color;
+ let i = 0;
+ let x;
+ let y;
+
+ const imageData = new Uint8Array(width * height * 4);
+
+ for (y = yStart; y !== yEnd; y += yStep) {
+ for (x = xStart; x !== xEnd; x += xStep, i++) {
+ color = image[i];
+ imageData[(x + width * y) * 4 + 0] = color;
+ imageData[(x + width * y) * 4 + 1] = color;
+ imageData[(x + width * y) * 4 + 2] = color;
+ imageData[(x + width * y) * 4 + 3] = 255;
+ }
+ }
+
+ return imageData;
+ },
+ getImageDataGrey16bits(
+ header,
+ palettes,
+ pixeData,
+ yStart,
+ yStep,
+ yEnd,
+ xStart,
+ xStep,
+ xEnd
+ ) {
+ const image = pixeData;
+ const width = header.width;
+ const height = header.height;
+ let i = 0;
+ let x;
+ let y;
+
+ const imageData = new Uint8Array(width * height * 4);
+
+ for (y = yStart; y !== yEnd; y += yStep) {
+ for (x = xStart; x !== xEnd; x += xStep, i += 2) {
+ imageData[(x + width * y) * 4 + 0] = image[i + 0];
+ imageData[(x + width * y) * 4 + 1] = image[i + 0];
+ imageData[(x + width * y) * 4 + 2] = image[i + 0];
+ imageData[(x + width * y) * 4 + 3] = image[i + 1];
+ }
+ }
+
+ return imageData;
+ },
+ };
+
+ // Internal method to fetch Array
+ function fetchData(url, option = {}) {
+ const { compression, progressCallback } = model;
+ return model.dataAccessHelper.fetchBinary(url, {
+ compression,
+ progressCallback,
+ });
+ }
+
+ // Set DataSet url
+ publicAPI.setUrl = (url, option = { binary: true }) => {
+ model.url = url;
+
+ // Remove the file in the URL
+ const path = url.split('/');
+ path.pop();
+ model.baseURL = path.join('/');
+
+ model.compression = option.compression;
+
+ // Fetch metadata
+ return publicAPI.loadData({
+ progressCallback: option.progressCallback,
+ });
+ };
+
+ // Fetch the actual data arrays
+ publicAPI.loadData = (option = {}) => {
+ const promise = fetchData(model.url, option);
+ promise.then(publicAPI.parse);
+ return promise;
+ };
+
+ publicAPI.parse = (content) => {
+ publicAPI.parseAsArrayBuffer(content);
+ };
+
+ publicAPI.parseAsArrayBuffer = (content) => {
+ if (!content) {
+ return;
+ }
+
+ const data = new Uint8Array(content);
+ // Not enough data to contain header ?
+ if (data.length < 19) {
+ vtkErrorMacro(
+ 'Unable to load TGA file - Not enough data to contain header'
+ );
+ return;
+ }
+
+ // Read Header
+ let offset = 18;
+ const header = parseHeader(data);
+
+ // Assume it's a valid Targa file.
+ if (header.idLength + offset > data.length) {
+ vtkErrorMacro('Unable to load TGA file - Not enough data');
+ return;
+ }
+
+ // Skip not needed data
+ offset += header.idLength;
+
+ let useRle = false;
+ let usePal = false;
+ let useGrey = false;
+
+ // Get some informations.
+ switch (header.imageType) {
+ case Constants.TYPE_RLE_INDEXED:
+ useRle = true;
+ // eslint-disable-next-line no-fallthrough
+ case Constants.TYPE_INDEXED:
+ usePal = true;
+ break;
+ case Constants.TYPE_RLE_RGB:
+ useRle = true;
+ // eslint-disable-next-line no-fallthrough
+ case Constants.TYPE_RGB:
+ // use_rgb = true;
+ break;
+ case Constants.TYPE_RLE_GREY:
+ useRle = true;
+ // eslint-disable-next-line no-fallthrough
+ case Constants.TYPE_GREY:
+ useGrey = true;
+ break;
+ default:
+ vtkErrorMacro('TGA file has unknown image type');
+ return;
+ }
+
+ let pixelData;
+
+ const pixelSize = header.pixelSize >> 3;
+ const pixelTotal = header.width * header.height * pixelSize;
+
+ // Read palettes
+ let palettes;
+
+ if (usePal) {
+ palettes = data.subarray(
+ offset,
+ (offset += header.colormapLength * (header.colormapSize >> 3))
+ );
+ }
+
+ // Read LRE
+ if (useRle) {
+ pixelData = new Uint8Array(pixelTotal);
+
+ let c;
+ let count;
+ let i;
+ let localOffset = 0;
+ const pixels = new Uint8Array(pixelSize);
+
+ while (offset < pixelTotal && localOffset < pixelTotal) {
+ c = data[offset++];
+ count = (c & 0x7f) + 1;
+
+ // RLE pixels
+ if (c & 0x80) {
+ // Bind pixel tmp array
+ for (i = 0; i < pixelSize; ++i) {
+ pixels[i] = data[offset++];
+ }
+
+ // Copy pixel array
+ for (i = 0; i < count; ++i) {
+ pixelData.set(pixels, localOffset + i * pixelSize);
+ }
+
+ localOffset += pixelSize * count;
+ }
+ // Raw pixels
+ else {
+ count *= pixelSize;
+ for (i = 0; i < count; ++i) {
+ pixelData[localOffset + i] = data[offset++];
+ }
+ localOffset += count;
+ }
+ }
+ }
+ // RAW Pixels
+ else {
+ pixelData = data.subarray(
+ offset,
+ (offset += usePal ? header.width * header.height : pixelTotal)
+ );
+ }
+
+ // Load to texture
+ let xStart;
+ let yStart;
+ let xStep;
+ let yStep;
+ let yEnd;
+ let xEnd;
+
+ switch ((header.flags & Constants.ORIGIN_MASK) >> Constants.ORIGIN_SHIFT) {
+ case Constants.ORIGIN_UL:
+ xStart = 0;
+ xStep = 1;
+ xEnd = header.width;
+ yStart = 0;
+ yStep = 1;
+ yEnd = header.height;
+ break;
+
+ case Constants.ORIGIN_BL:
+ xStart = 0;
+ xStep = 1;
+ xEnd = header.width;
+ yStart = 0;
+ yStep = 1;
+ yEnd = header.height;
+ break;
+
+ case Constants.ORIGIN_UR:
+ xStart = header.width - 1;
+ xStep = -1;
+ xEnd = -1;
+ yStart = 0;
+ yStep = 1;
+ yEnd = header.height;
+ break;
+
+ case Constants.ORIGIN_BR:
+ xStart = header.width - 1;
+ xStep = -1;
+ xEnd = -1;
+ yStart = header.height - 1;
+ yStep = -1;
+ yEnd = -1;
+ break;
+ default:
+ vtkErrorMacro('TGA file has unknown origin');
+ return;
+ }
+
+ const func = `getImageData${useGrey ? 'Grey' : ''}${header.pixelSize}bits`;
+
+ const output = handlers[func](
+ header,
+ palettes,
+ pixelData,
+ yStart,
+ yStep,
+ yEnd,
+ xStart,
+ xStep,
+ xEnd
+ );
+
+ const dataExtent = [0, header.width - 1, 0, header.height - 1];
+ const dataSpacing = [1, 1, 1];
+
+ const imageData = vtkImageData.newInstance();
+ imageData.setDimensions(header.width, header.height, 1);
+ imageData.setExtent(dataExtent);
+ imageData.setSpacing(dataSpacing);
+
+ const dataArray = vtkDataArray.newInstance({
+ name: 'TGAImage',
+ numberOfComponents: 4,
+ values: output,
+ });
+
+ imageData.getPointData().setScalars(dataArray);
+ model.output[0] = imageData;
+ };
+
+ publicAPI.requestData = (inData, outData) => {
+ publicAPI.parse(model.parseData);
+ };
+}
+
+// ----------------------------------------------------------------------------
+// Object factory
+// ----------------------------------------------------------------------------
+
+const DEFAULT_VALUES = {};
+
+// ----------------------------------------------------------------------------
+
+export function extend(publicAPI, model, initialValues = {}) {
+ Object.assign(model, DEFAULT_VALUES, initialValues);
+
+ // Make this a VTK object
+ macro.obj(publicAPI, model);
+
+ // Also make it an algorithm with one input and one output
+ macro.algo(publicAPI, model, 0, 1);
+
+ macro.get(publicAPI, model, ['url', 'baseURL']);
+ macro.setGet(publicAPI, model, ['dataAccessHelper']);
+
+ // Object specific methods
+ vtkTGAReader(publicAPI, model);
+
+ // To support destructuring
+ if (!model.compression) {
+ model.compression = null;
+ }
+ if (!model.progressCallback) {
+ model.progressCallback = null;
+ }
+}
+
+// ----------------------------------------------------------------------------
+
+export const newInstance = macro.newInstance(extend, 'vtkTGAReader');
+
+// ----------------------------------------------------------------------------
+
+export default { newInstance, extend };
diff --git a/Sources/IO/Image/TIFFReader/example/index.js b/Sources/IO/Image/TIFFReader/example/index.js
new file mode 100644
index 00000000000..dccfc85ec78
--- /dev/null
+++ b/Sources/IO/Image/TIFFReader/example/index.js
@@ -0,0 +1,122 @@
+import '@kitware/vtk.js/favicon';
+
+// Load the rendering pieces we want to use (for both WebGL and WebGPU)
+import '@kitware/vtk.js/Rendering/Profiles/Geometry';
+
+import vtkFullScreenRenderWindow from '@kitware/vtk.js/Rendering/Misc/FullScreenRenderWindow';
+import vtkActor from '@kitware/vtk.js/Rendering/Core/Actor';
+import vtkMapper from '@kitware/vtk.js/Rendering/Core/Mapper';
+import vtkPlaneSource from '@kitware/vtk.js/Filters/Sources/PlaneSource';
+import vtkTIFFReader from '@kitware/vtk.js/IO/Image/TIFFReader';
+import vtkTexture from '@kitware/vtk.js/Rendering/Core/Texture';
+import vtkURLExtract from '@kitware/vtk.js/Common/Core/URLExtract';
+
+// ----------------------------------------------------------------------------
+// Example code
+// ----------------------------------------------------------------------------
+const userParams = vtkURLExtract.extractURLParameters();
+
+const reader = vtkTIFFReader.newInstance();
+const texture = vtkTexture.newInstance();
+const planeSource = vtkPlaneSource.newInstance();
+const mapper = vtkMapper.newInstance();
+const actor = vtkActor.newInstance();
+mapper.setInputConnection(planeSource.getOutputPort());
+actor.setMapper(mapper);
+
+// ----------------------------------------------------------------------------
+// Use a file reader to load a local file
+// ----------------------------------------------------------------------------
+
+const myContainer = document.querySelector('body');
+const fileContainer = document.createElement('div');
+fileContainer.innerHTML =
+ 'Select a tiff file.
';
+myContainer.appendChild(fileContainer);
+
+const fileInput = fileContainer.querySelector('input');
+
+function zoomCameraToFitPlane(camera, planeWidth, planeHeight) {
+ const fov = 60; // Field of view in degrees
+
+ // Calculate the distance needed to fit the plane in view
+ const distance =
+ Math.max(planeWidth, planeHeight) /
+ (2 * Math.tan((fov * Math.PI) / 180 / 2));
+
+ // Set camera position
+ camera.setPosition(planeWidth / 2, planeHeight / 2, distance);
+ camera.setFocalPoint(planeWidth / 2, planeHeight / 2, 0);
+ camera.setViewUp(0, 1, 0);
+
+ // Set parallel scale for orthographic projection
+ camera.setParallelScale(planeHeight / 2);
+}
+
+function update() {
+ // Get the vtkImageData from the reader
+ const imageData = reader.getOutputData(0);
+
+ // Set the vtkImageData as the texture input
+ texture.setInputData(imageData);
+
+ // // Get the image's extent and spacing
+ const [xMin, xMax, yMin, yMax] = imageData.getExtent();
+ const [spacingX, spacingY] = imageData.getSpacing();
+
+ // // Calculate the plane's width and height based on the image's dimensions
+ const planeWidth = (xMax - xMin + 1) * spacingX;
+ const planeHeight = (yMax - yMin + 1) * spacingY;
+
+ // Set the plane's origin and corners based on calculated width and height
+ planeSource.setOrigin(0, 0, 0);
+ planeSource.setPoint1(planeWidth, 0, 0); // Horizontal edge
+ planeSource.setPoint2(0, planeHeight, 0); // Vertical edge
+
+ actor.addTexture(texture);
+
+ const fullScreenRenderer = vtkFullScreenRenderWindow.newInstance();
+ const renderer = fullScreenRenderer.getRenderer();
+ const renderWindow = fullScreenRenderer.getRenderWindow();
+ const camera = renderer.getActiveCamera();
+ const interactor = renderWindow.getInteractor();
+
+ // Disable default interactor style
+ interactor.setInteractorStyle(null);
+
+ renderer.addActor(actor);
+
+ // Adjust the camera to fit the plane in the view
+ zoomCameraToFitPlane(camera, planeWidth, planeHeight);
+ renderer.resetCameraClippingRange();
+
+ renderWindow.render();
+}
+
+function handleFile(event) {
+ event.preventDefault();
+ const dataTransfer = event.dataTransfer;
+ const files = event.target.files || dataTransfer.files;
+ if (files.length === 1) {
+ const file = files[0];
+ const fileReader = new FileReader();
+ fileReader.onload = () => {
+ reader.parse(fileReader.result);
+ update();
+ };
+ fileReader.readAsArrayBuffer(file);
+ }
+}
+
+fileInput.addEventListener('change', handleFile);
+
+// ----------------------------------------------------------------------------
+// Use the reader to download a file
+// ----------------------------------------------------------------------------
+if (userParams.fileURL) {
+ reader.setUrl(userParams.fileURL).then(() => {
+ reader.loadData().then(() => {
+ update();
+ });
+ });
+}
diff --git a/Sources/IO/Image/TIFFReader/index.d.ts b/Sources/IO/Image/TIFFReader/index.d.ts
new file mode 100644
index 00000000000..ad931a93d94
--- /dev/null
+++ b/Sources/IO/Image/TIFFReader/index.d.ts
@@ -0,0 +1,133 @@
+import { vtkAlgorithm, vtkObject } from '../../../interfaces';
+import HtmlDataAccessHelper from '../../Core/DataAccessHelper/HtmlDataAccessHelper';
+import HttpDataAccessHelper from '../../Core/DataAccessHelper/HttpDataAccessHelper';
+import JSZipDataAccessHelper from '../../Core/DataAccessHelper/JSZipDataAccessHelper';
+import LiteHttpDataAccessHelper from '../../Core/DataAccessHelper/LiteHttpDataAccessHelper';
+
+interface ITIFFReaderOptions {
+ compression?: string;
+ progressCallback?: any;
+ flipY?: boolean;
+}
+
+/**
+ *
+ */
+export interface ITIFFReaderInitialValues {}
+
+type vtkTIFFReaderBase = vtkObject &
+ Omit<
+ vtkAlgorithm,
+ | 'getInputData'
+ | 'setInputData'
+ | 'setInputConnection'
+ | 'getInputConnection'
+ | 'addInputConnection'
+ | 'addInputData'
+ >;
+
+export interface vtkTIFFReader extends vtkTIFFReaderBase {
+ /**
+ * Get the base url.
+ */
+ getBaseURL(): string;
+
+ /**
+ * Get if the image is flipped vertically.
+ */
+ getFlipY(): boolean;
+
+ /**
+ * Get the dataAccess helper.
+ */
+ getDataAccessHelper():
+ | HtmlDataAccessHelper
+ | HttpDataAccessHelper
+ | JSZipDataAccessHelper
+ | LiteHttpDataAccessHelper;
+
+ /**
+ * Get the url of the object to load.
+ */
+ getUrl(): string;
+
+ /**
+ * Load the object data.
+ * @param {ITIFFReaderOptions} [options]
+ */
+ loadData(options?: ITIFFReaderOptions): Promise;
+
+ /**
+ * Parse data.
+ * @param {ArrayBuffer} content The content to parse.
+ */
+ parse(content: ArrayBuffer): void;
+
+ /**
+ * Parse data as ArrayBuffer.
+ * @param {ArrayBuffer} content The content to parse.
+ */
+ parseAsArrayBuffer(content: ArrayBuffer): void;
+
+ /**
+ *
+ * @param inData
+ * @param outData
+ */
+ requestData(inData: any, outData: any): void;
+
+ /**
+ * Flip the image vertically.
+ * @param {String} flipY If true, flip the image vertically.
+ */
+ setFlipY(flipY: boolean): boolean;
+
+ /**
+ *
+ * @param dataAccessHelper
+ */
+ setDataAccessHelper(
+ dataAccessHelper:
+ | HtmlDataAccessHelper
+ | HttpDataAccessHelper
+ | JSZipDataAccessHelper
+ | LiteHttpDataAccessHelper
+ ): boolean;
+
+ /**
+ * Set the url of the object to load.
+ * @param {String} url the url of the object to load.
+ * @param {ITIFFReaderOptions} [option] The PLY reader options.
+ */
+ setUrl(url: string, option?: ITIFFReaderOptions): Promise;
+}
+
+/**
+ * Method used to decorate a given object (publicAPI+model) with vtkTIFFReader characteristics.
+ *
+ * @param publicAPI object on which methods will be bounds (public)
+ * @param model object on which data structure will be bounds (protected)
+ * @param {ITIFFReaderInitialValues} [initialValues] (default: {})
+ */
+export function extend(
+ publicAPI: object,
+ model: object,
+ initialValues?: ITIFFReaderInitialValues
+): void;
+
+/**
+ * Method used to create a new instance of vtkTIFFReader
+ * @param {ITIFFReaderInitialValues} [initialValues] for pre-setting some of its content
+ */
+export function newInstance(
+ initialValues?: ITIFFReaderInitialValues
+): vtkTIFFReader;
+
+/**
+ * vtkTIFFReader is a source object that reads TIFF files.
+ */
+export declare const vtkTIFFReader: {
+ newInstance: typeof newInstance;
+ extend: typeof extend;
+};
+export default vtkTIFFReader;
diff --git a/Sources/IO/Image/TIFFReader/index.js b/Sources/IO/Image/TIFFReader/index.js
new file mode 100644
index 00000000000..fcd1537f778
--- /dev/null
+++ b/Sources/IO/Image/TIFFReader/index.js
@@ -0,0 +1,149 @@
+import macro from 'vtk.js/Sources/macros';
+
+// Enable data soure for DataAccessHelper
+import 'vtk.js/Sources/IO/Core/DataAccessHelper/LiteHttpDataAccessHelper'; // Just need HTTP
+// import 'vtk.js/Sources/IO/Core/DataAccessHelper/HttpDataAccessHelper'; // HTTP + zip
+// import 'vtk.js/Sources/IO/Core/DataAccessHelper/HtmlDataAccessHelper'; // html + base64 + zip
+// import 'vtk.js/Sources/IO/Core/DataAccessHelper/JSZipDataAccessHelper'; // zip
+
+import DataAccessHelper from 'vtk.js/Sources/IO/Core/DataAccessHelper';
+import vtkImageData from 'vtk.js/Sources/Common/DataModel/ImageData';
+import vtkDataArray from 'vtk.js/Sources/Common/Core/DataArray';
+import UTIF from 'utif';
+
+// ----------------------------------------------------------------------------
+// vtkTIFFReader methods
+// ----------------------------------------------------------------------------
+
+function vtkTIFFReader(publicAPI, model) {
+ // Set our className
+ model.classHierarchy.push('vtkTIFFReader');
+
+ // Create default dataAccessHelper if not available
+ if (!model.dataAccessHelper) {
+ model.dataAccessHelper = DataAccessHelper.get('http');
+ }
+
+ // Internal method to fetch Array
+ function fetchData(url, option = {}) {
+ const { compression, progressCallback } = model;
+ return model.dataAccessHelper.fetchBinary(url, {
+ compression,
+ progressCallback,
+ });
+ }
+
+ // Set DataSet url
+ publicAPI.setUrl = (url, option = { binary: true }) => {
+ model.url = url;
+
+ // Remove the file in the URL
+ const path = url.split('/');
+ path.pop();
+ model.baseURL = path.join('/');
+
+ model.compression = option.compression;
+
+ // Fetch metadata
+ return publicAPI.loadData({
+ progressCallback: option.progressCallback,
+ });
+ };
+
+ // Fetch the actual data arrays
+ publicAPI.loadData = (option = {}) => {
+ const promise = fetchData(model.url, option);
+ promise.then(publicAPI.parse);
+ return promise;
+ };
+
+ publicAPI.parse = (content) => {
+ publicAPI.parseAsArrayBuffer(content);
+ };
+
+ publicAPI.parseAsArrayBuffer = (content) => {
+ if (!content) {
+ return;
+ }
+
+ // Read Header
+ const ifds = UTIF.decode(content);
+ UTIF.decodeImage(content, ifds[0]);
+ const data = UTIF.toRGBA8(ifds[0]);
+
+ const width = ifds[0].width;
+ const height = ifds[0].height;
+ const output = new Uint8Array(data.length);
+
+ if (model.flipY) {
+ for (let y = 0; y < height; y++) {
+ for (let x = 0; x < width; x++) {
+ const srcIndex = (y * width + x) * 4;
+ const destIndex = ((height - y - 1) * width + x) * 4;
+
+ output[destIndex] = data[srcIndex]; // R
+ output[destIndex + 1] = data[srcIndex + 1]; // G
+ output[destIndex + 2] = data[srcIndex + 2]; // B
+ output[destIndex + 3] = data[srcIndex + 3]; // A
+ }
+ }
+ }
+
+ const dataExtent = [0, width - 1, 0, height - 1];
+ const dataSpacing = [1, 1, 1];
+
+ const imageData = vtkImageData.newInstance();
+ imageData.setDimensions(width, height, 1);
+ imageData.setExtent(dataExtent);
+ imageData.setSpacing(dataSpacing);
+
+ const dataArray = vtkDataArray.newInstance({
+ name: 'TIFFImage',
+ numberOfComponents: 4,
+ values: output,
+ });
+
+ imageData.getPointData().setScalars(dataArray);
+ model.output[0] = imageData;
+ };
+
+ publicAPI.requestData = (inData, outData) => {
+ publicAPI.parse(model.parseData);
+ };
+}
+
+// ----------------------------------------------------------------------------
+// Object factory
+// ----------------------------------------------------------------------------
+
+const DEFAULT_VALUES = {
+ flipY: true,
+ compression: null,
+ progressCallback: null,
+};
+
+// ----------------------------------------------------------------------------
+
+export function extend(publicAPI, model, initialValues = {}) {
+ Object.assign(model, DEFAULT_VALUES, initialValues);
+
+ // Make this a VTK object
+ macro.obj(publicAPI, model);
+
+ // Also make it an algorithm with one input and one output
+ macro.algo(publicAPI, model, 0, 1);
+
+ macro.get(publicAPI, model, ['url', 'baseURL']);
+ macro.setGet(publicAPI, model, ['dataAccessHelper', 'flipY']);
+
+ // Object specific methods
+ vtkTIFFReader(publicAPI, model);
+}
+
+// ----------------------------------------------------------------------------
+
+export const newInstance = macro.newInstance(extend, 'vtkTIFFReader');
+
+// ----------------------------------------------------------------------------
+
+export default { newInstance, extend };
diff --git a/Sources/IO/Image/index.js b/Sources/IO/Image/index.js
index 0fa73fd4be6..88fd5b4b58d 100644
--- a/Sources/IO/Image/index.js
+++ b/Sources/IO/Image/index.js
@@ -1,5 +1,9 @@
import vtkHDRReader from './HDRReader';
+import vtkTGAReader from './TGAReader';
+import vtkTIFFReader from './TIFFReader';
export default {
vtkHDRReader,
+ vtkTGAReader,
+ vtkTIFFReader,
};
diff --git a/Sources/IO/Misc/PDBReader/test/testMolecule.js b/Sources/IO/Misc/PDBReader/test/testMolecule.js
index 882dcc4231e..59ed9e85fcb 100644
--- a/Sources/IO/Misc/PDBReader/test/testMolecule.js
+++ b/Sources/IO/Misc/PDBReader/test/testMolecule.js
@@ -13,7 +13,7 @@ import vtkRenderWindow from 'vtk.js/Sources/Rendering/Core/RenderWindow';
import baseline from './testMolecule_with_bonds.png';
test.onlyIfWebGL('Test MoleculeMapper', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+ const gc = testUtils.createGarbageCollector();
t.ok('IO: PDBReader', 'Filter: MoleculeToRepresentation');
// Create some control UI
@@ -72,24 +72,23 @@ test.onlyIfWebGL('Test MoleculeMapper', (t) => {
// fetch caffeine.pdb file from Girder
t.ok('waiting for download');
- reader.setUrl(`${__BASE_PATH__}/Data/molecule/pdb/caffeine.pdb`).then(() => {
- t.ok('download complete');
-
- // once data upload, render
- renderer.resetCamera();
- renderWindow.render();
-
- // the data have to be uploaded before capturing and comparing the images
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline],
- 'IO/Misc/PDBReader',
- t,
- 1,
- gc.releaseResources
- );
+ return reader
+ .setUrl(`${__BASE_PATH__}/Data/molecule/pdb/caffeine.pdb`)
+ .then(() => {
+ t.ok('download complete');
+
+ // once data upload, render
+ renderer.resetCamera();
+ renderWindow.render();
+
+ // the data have to be uploaded before capturing and comparing the images
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(image, [baseline], 'IO/Misc/PDBReader', t, 1)
+ )
+ .finally(gc.releaseResources);
+ renderWindow.render();
+ return promise;
});
- renderWindow.render();
- });
});
diff --git a/Sources/IO/XML/XMLPolyDataWriter/index.js b/Sources/IO/XML/XMLPolyDataWriter/index.js
index 8edcd7c50f2..dd4744dc704 100644
--- a/Sources/IO/XML/XMLPolyDataWriter/index.js
+++ b/Sources/IO/XML/XMLPolyDataWriter/index.js
@@ -50,6 +50,11 @@ function vtkXMLPolyDataWriter(publicAPI, model) {
'CellData',
dataObject.getCellData()
);
+ publicAPI.processDataSetAttributes(
+ piece,
+ 'FieldData',
+ dataObject.getFieldData()
+ );
publicAPI.processDataArray(piece.ele('Points'), dataObject.getPoints());
POLYDATA_FIELDS.forEach((cellType) => {
diff --git a/Sources/Imaging/Core/ImageReslice/test/testImageReslice.js b/Sources/Imaging/Core/ImageReslice/test/testImageReslice.js
index 839badea216..dae80c80b20 100644
--- a/Sources/Imaging/Core/ImageReslice/test/testImageReslice.js
+++ b/Sources/Imaging/Core/ImageReslice/test/testImageReslice.js
@@ -50,7 +50,7 @@ function createSyntheticImageData(
}
test.onlyIfWebGL('Test vtkImageReslice rendering', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+ const gc = testUtils.createGarbageCollector();
t.comment('vtkImageReslice rendering');
// Create some control UI
@@ -111,26 +111,24 @@ test.onlyIfWebGL('Test vtkImageReslice rendering', (t) => {
renderWindow.addView(glwindow);
glwindow.setSize(400, 400);
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline1],
- 'Imaging/Core/ImageReslice/testImageReslice',
- t,
- 2.5,
- gc.releaseResources
- );
- });
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline1],
+ 'Imaging/Core/ImageReslice/testImageReslice',
+ t,
+ 2.5
+ )
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
- // function sleep(delay) {
- // const start = new Date().getTime();
- // while (new Date().getTime() < start + delay);
- // }
- // sleep(500);
+ return promise;
});
test.onlyIfWebGL('Test vtkImageReslice reslice transform', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+ const gc = testUtils.createGarbageCollector();
t.comment('vtkImageReslice reslice transform');
// Create some control UI
@@ -198,22 +196,20 @@ test.onlyIfWebGL('Test vtkImageReslice reslice transform', (t) => {
renderWindow.addView(glwindow);
glwindow.setSize(400, 400);
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline1],
- 'Imaging/Core/ImageReslice/testImageReslice',
- t,
- 2.5,
- gc.releaseResources
- );
- });
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline1],
+ 'Imaging/Core/ImageReslice/testImageReslice',
+ t,
+ 2.5
+ )
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
- // function sleep(delay) {
- // const start = new Date().getTime();
- // while (new Date().getTime() < start + delay) renderWindow.render();
- // }
- // sleep(500);
+ return promise;
});
// For comparison purpose, see below the same test in VTK/Python:
diff --git a/Sources/Proxy/Core/View2DProxy/test/testView2DProxy.js b/Sources/Proxy/Core/View2DProxy/test/testView2DProxy.js
index 521aed8f0f5..fbee914a5d2 100644
--- a/Sources/Proxy/Core/View2DProxy/test/testView2DProxy.js
+++ b/Sources/Proxy/Core/View2DProxy/test/testView2DProxy.js
@@ -15,7 +15,7 @@ import baseline from './viewProxy2D.png';
test.onlyIfWebGL(
'Test vtkProxy2D Rendering with vtkImageSlice representation',
(t) => {
- const gc = testUtils.createGarbageCollector(t);
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkView2DProxy Rendering');
const source = gc.registerResource(vtkRTAnalyticSource.newInstance());
@@ -54,16 +54,19 @@ test.onlyIfWebGL(
const glWindow = viewProxy.getRenderer().getRenderWindow().getViews()[0];
glWindow.setSize(400, 400);
- glWindow.captureNextImage().then((capturedImage) => {
- testUtils.compareImages(
- capturedImage,
- [baseline],
- 'Proxy/Core/View2DProxy/testView2DProxy',
- t,
- 5,
- gc.releaseResources
- );
- });
+ const promise = glWindow
+ .captureNextImage()
+ .then((capturedImage) =>
+ testUtils.compareImages(
+ capturedImage,
+ [baseline],
+ 'Proxy/Core/View2DProxy/testView2DProxy',
+ t,
+ 5
+ )
+ )
+ .finally(gc.releaseResources);
glWindow.render();
+ return promise;
}
);
diff --git a/Sources/Rendering/Core/Actor/test/testRotate.js b/Sources/Rendering/Core/Actor/test/testRotate.js
index 338b1e8968d..201df65a88c 100644
--- a/Sources/Rendering/Core/Actor/test/testRotate.js
+++ b/Sources/Rendering/Core/Actor/test/testRotate.js
@@ -11,8 +11,8 @@ import vtkRenderWindow from 'vtk.js/Sources/Rendering/Core/RenderWindow';
import baseline from './testRotate.png';
import baseline2 from './testRotate2.png';
-test('Test Actor', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+test.onlyIfWebGL('Test Actor', (t) => {
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkActor testRotate');
// Create some control UI
@@ -55,15 +55,18 @@ test('Test Actor', (t) => {
renderWindow.addView(glwindow);
glwindow.setSize(400, 400);
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline, baseline2],
- 'Rendering/Core/Actor',
- t,
- 1,
- gc.releaseResources
- );
- });
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline, baseline2],
+ 'Rendering/Core/Actor',
+ t,
+ 1
+ )
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
+ return promise;
});
diff --git a/Sources/Rendering/Core/Actor2D/test/testActor2D.js b/Sources/Rendering/Core/Actor2D/test/testActor2D.js
index 493cc72024f..eaf9fe8ec7d 100644
--- a/Sources/Rendering/Core/Actor2D/test/testActor2D.js
+++ b/Sources/Rendering/Core/Actor2D/test/testActor2D.js
@@ -16,8 +16,8 @@ import { Representation } from 'vtk.js/Sources/Rendering/Core/Property/Constants
import baseline from './testActor2D.png';
-test('Test Actor2D', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+test.onlyIfWebGL('Test Actor2D', (t) => {
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkActor2D');
// Create some control UI
@@ -88,15 +88,18 @@ test('Test Actor2D', (t) => {
renderWindow.addView(glwindow);
glwindow.setSize(400, 400);
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline],
- 'Rendering/Core/Actor2D/testActor2D.js',
- t,
- 1,
- gc.releaseResources
- );
- });
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline],
+ 'Rendering/Core/Actor2D/testActor2D.js',
+ t,
+ 1
+ )
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
+ return promise;
});
diff --git a/Sources/Rendering/Core/Actor2D/test/testActor2DMultiViewports.js b/Sources/Rendering/Core/Actor2D/test/testActor2DMultiViewports.js
index 07c44c40c1a..cdc43f64006 100644
--- a/Sources/Rendering/Core/Actor2D/test/testActor2DMultiViewports.js
+++ b/Sources/Rendering/Core/Actor2D/test/testActor2DMultiViewports.js
@@ -14,8 +14,8 @@ import { Representation } from 'vtk.js/Sources/Rendering/Core/Property/Constants
import baseline from './testActor2DMultiViewports.png';
-test('Test Actor2D MultiViewports', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+test.onlyIfWebGL('Test Actor2D MultiViewports', (t) => {
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkActor2D MultiViewports');
// Create some control UI
@@ -85,15 +85,18 @@ test('Test Actor2D MultiViewports', (t) => {
renderWindow.addView(glwindow);
glwindow.setSize(400, 400);
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline],
- 'Rendering/Core/Actor2D/testActor2DMultiViewport.js',
- t,
- 1,
- gc.releaseResources
- );
- });
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline],
+ 'Rendering/Core/Actor2D/testActor2DMultiViewport.js',
+ t,
+ 1
+ )
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
+ return promise;
});
diff --git a/Sources/Rendering/Core/CellPicker/test/testCellPicker.js b/Sources/Rendering/Core/CellPicker/test/testCellPicker.js
index 26b5cd54c02..ba32d6054e5 100644
--- a/Sources/Rendering/Core/CellPicker/test/testCellPicker.js
+++ b/Sources/Rendering/Core/CellPicker/test/testCellPicker.js
@@ -35,12 +35,12 @@ test('Test vtkCellPicker image mapper', (t) => {
rtSource.setCenter(100, 100, 100);
rtSource.setStandardDeviation(0.3);
- const mapper = vtkImageMapper.newInstance();
+ const mapper = gc.registerResource(vtkImageMapper.newInstance());
mapper.setInputConnection(rtSource.getOutputPort());
mapper.setSlicingMode(SlicingMode.K);
mapper.setSlice(12);
- const actor = vtkImageSlice.newInstance();
+ const actor = gc.registerResource(vtkImageSlice.newInstance());
actor.getProperty().setColorWindow(100);
actor.getProperty().setColorLevel(50);
actor.setMapper(mapper);
@@ -110,9 +110,9 @@ test('Test vtkCellPicker on triangles', (t) => {
polyData.getPoints().setData(points);
polyData.getPolys().setData(polys);
- const mapper = vtkMapper.newInstance();
+ const mapper = gc.registerResource(vtkMapper.newInstance());
mapper.setInputData(polyData);
- const actor = vtkActor.newInstance();
+ const actor = gc.registerResource(vtkActor.newInstance());
actor.setMapper(mapper);
renderer.addActor(actor);
@@ -166,13 +166,13 @@ test('Test vtkCellPicker on quads', (t) => {
// Create what we will view
const points = Float32Array.from([0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0]);
const polys = new Float32Array([4, 0, 1, 2, 3]);
- const polyData = vtkPolyData.newInstance();
+ const polyData = gc.registerResource(vtkPolyData.newInstance());
polyData.getPoints().setData(points);
polyData.getPolys().setData(polys);
- const mapper = vtkMapper.newInstance();
+ const mapper = gc.registerResource(vtkMapper.newInstance());
mapper.setInputData(polyData);
- const actor = vtkActor.newInstance();
+ const actor = gc.registerResource(vtkActor.newInstance());
actor.setMapper(mapper);
renderer.addActor(actor);
diff --git a/Sources/Rendering/Core/ColorTransferFunction/test/testColorTransferFunction.js b/Sources/Rendering/Core/ColorTransferFunction/test/testColorTransferFunction.js
index c15556ac546..f1802527142 100644
--- a/Sources/Rendering/Core/ColorTransferFunction/test/testColorTransferFunction.js
+++ b/Sources/Rendering/Core/ColorTransferFunction/test/testColorTransferFunction.js
@@ -15,8 +15,8 @@ import { areEquals } from 'vtk.js/Sources/Common/Core/Math';
import baseline from './testColorTransferFunction.png';
import baseline2 from './testColorTransferFunction2.png';
-test('Test Color Transfer Function', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+test.onlyIfWebGL('Test Color Transfer Function', (t) => {
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkMapper ColorTransferFunction');
// Create some control UI
@@ -109,17 +109,20 @@ test('Test Color Transfer Function', (t) => {
renderWindow.addView(glwindow);
glwindow.setSize(400, 400);
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline, baseline2],
- 'Rendering/Core/ColorTransferFunction/testColorTransferFunction',
- t,
- 5,
- gc.releaseResources
- );
- });
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline, baseline2],
+ 'Rendering/Core/ColorTransferFunction/testColorTransferFunction',
+ t,
+ 5
+ )
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
+ return promise;
});
test('Test discretized color transfer function', (t) => {
diff --git a/Sources/Rendering/Core/ColorTransferFunction/test/testColorTransferFunctionInterpolation.js b/Sources/Rendering/Core/ColorTransferFunction/test/testColorTransferFunctionInterpolation.js
index 186d063f3e6..02496f02256 100644
--- a/Sources/Rendering/Core/ColorTransferFunction/test/testColorTransferFunctionInterpolation.js
+++ b/Sources/Rendering/Core/ColorTransferFunction/test/testColorTransferFunctionInterpolation.js
@@ -11,8 +11,8 @@ import createScalarMap from './createScalarMap';
import baseline from './testColorTransferFunctionInterpolation.png';
import baseline2 from './testColorTransferFunctionInterpolation2.png';
-test('Test ColorTransferFunction Interpolation', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+test.onlyIfWebGL('Test ColorTransferFunction Interpolation', (t) => {
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkMapper ColorTransferFunction Interpolaiton');
// testUtils.keepDOM();
@@ -49,15 +49,18 @@ test('Test ColorTransferFunction Interpolation', (t) => {
renderer.resetCamera();
renderWindow.render();
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline, baseline2],
- 'Rendering/Core/ColorTransferFunction/testColorTransferFunctionInterpolation',
- t,
- 5,
- gc.releaseResources
- );
- });
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline, baseline2],
+ 'Rendering/Core/ColorTransferFunction/testColorTransferFunctionInterpolation',
+ t,
+ 5
+ )
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
+ return promise;
});
diff --git a/Sources/Rendering/Core/ColorTransferFunction/test/testColorTransferFunctionPresets.js b/Sources/Rendering/Core/ColorTransferFunction/test/testColorTransferFunctionPresets.js
index d0e341121a8..001ec649d52 100644
--- a/Sources/Rendering/Core/ColorTransferFunction/test/testColorTransferFunctionPresets.js
+++ b/Sources/Rendering/Core/ColorTransferFunction/test/testColorTransferFunctionPresets.js
@@ -14,8 +14,8 @@ import baseline2 from './testColorTransferFunctionPresets2.png';
const MAX_NUMBER_OF_PRESETS = 200;
const NUMBER_PER_LINE = 20;
-test('Test ColorTransferFunction Presets', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+test.onlyIfWebGL('Test ColorTransferFunction Presets', (t) => {
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkMapper ColorTransferFunction Presets');
// Create some control UI
@@ -58,15 +58,18 @@ test('Test ColorTransferFunction Presets', (t) => {
camera.zoom(1.45);
renderWindow.render();
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline, baseline2],
- 'Rendering/Core/ColorTransferFunction/testColorTransferFunctionPresets',
- t,
- 4.8,
- gc.releaseResources
- );
- });
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline, baseline2],
+ 'Rendering/Core/ColorTransferFunction/testColorTransferFunctionPresets',
+ t,
+ 4.8
+ )
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
+ return promise;
});
diff --git a/Sources/Rendering/Core/Follower/test/testFollower.js b/Sources/Rendering/Core/Follower/test/testFollower.js
index 29b39177995..728b0f186be 100644
--- a/Sources/Rendering/Core/Follower/test/testFollower.js
+++ b/Sources/Rendering/Core/Follower/test/testFollower.js
@@ -10,8 +10,8 @@ import vtkRenderer from 'vtk.js/Sources/Rendering/Core/Renderer';
import baseline from './testFollower.png';
-test('Test Follower class', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+test.onlyIfWebGL('Test Follower class', (t) => {
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkFollower');
// Create some control UI
@@ -42,7 +42,7 @@ test('Test Follower class', (t) => {
actor.setCamera(renderer.getActiveCamera());
renderer.addActor(actor);
- reader
+ return reader
.setUrl(
`${__BASE_PATH__}/Data/obj/space-shuttle-orbiter/space-shuttle-orbiter.obj`
)
@@ -58,16 +58,19 @@ test('Test Follower class', (t) => {
renderer.getActiveCamera().azimuth(10);
renderer.getActiveCamera().elevation(10);
renderer.getActiveCamera().orthogonalizeViewUp();
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline],
- 'Rendering/Core/Follower/testFollower',
- t,
- 1.5,
- gc.releaseResources
- );
- });
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline],
+ 'Rendering/Core/Follower/testFollower',
+ t,
+ 1.5
+ )
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
+ return promise;
});
});
diff --git a/Sources/Rendering/Core/Glyph3DMapper/index.d.ts b/Sources/Rendering/Core/Glyph3DMapper/index.d.ts
index cdc225a1147..85de5154073 100755
--- a/Sources/Rendering/Core/Glyph3DMapper/index.d.ts
+++ b/Sources/Rendering/Core/Glyph3DMapper/index.d.ts
@@ -12,11 +12,11 @@ interface IPrimitiveCount {
export interface IGlyph3DMapperInitialValues extends IMapperInitialValues {
orient?: boolean;
orientationMode?: OrientationModes;
- orientationArray?: number[];
+ orientationArray?: string;
scaling?: boolean;
scaleFactor?: number;
scaleMode?: ScaleModes;
- scaleArray?: number[];
+ scaleArray?: string;
matrixArray?: number[];
normalArray?: number[];
colorArray?: number[];
@@ -24,29 +24,26 @@ export interface IGlyph3DMapperInitialValues extends IMapperInitialValues {
export interface vtkGlyph3DMapper extends vtkMapper {
/**
- * An orientation array is a vtkDataArray with 3 components. The first
- * component is the angle of rotation along the X axis. The second component
- * is the angle of rotation along the Y axis. The third component is the
- * angle of rotation along the Z axis. Orientation is specified in X,Y,Z
- * order but the rotations are performed in Z,X an Y.
- *
- * This definition is compliant with SetOrientation method on vtkProp3D.
+ * Get the bounds for this mapper as [xmin, xmax, ymin, ymax,zmin, zmax].
+ * @return {Bounds} The bounds for the mapper.
+ */
+ getBounds(): Bounds;
+
+ /**
*
- * By using vector or normal there is a degree of freedom or rotation left
- * (underconstrained). With the orientation array, there is no degree of
- * freedom left.
*/
- getOrientationMode(): OrientationModes;
+ buildArrays(): void;
/**
- * Get orientation as string
+ *
*/
- getOrientationModeAsString(): string;
+ getPrimitiveCount(): IPrimitiveCount;
/**
- * Get orientation as array
+ * Get scale mode
+ * @default `SCALE_BY_MAGNITUDE`
*/
- getOrientationArrayData(): number[];
+ getScaleMode(): ScaleModes;
/**
* Get scale factor to scale object by.
@@ -54,15 +51,20 @@ export interface vtkGlyph3DMapper extends vtkMapper {
getScaleFactor(): number;
/**
- * Get scale mode
- * @default `SCALE_BY_MAGNITUDE`
+ * Get scale mode as string
*/
- getScaleMode(): ScaleModes;
+ getScaleModeAsString(): string;
/**
- * Get scale mode as string
+ * Sets the name of the array to use as scale values.
+ * @param {String} arrayName Name of the array
*/
- getScaleModeAsString(): string;
+ setScaleArray(arrayName: Nullable): boolean;
+
+ /**
+ * Gets the name of the array used as scale values.
+ */
+ getScaleArray(): string;
/**
* Get scale mode as array
@@ -70,20 +72,29 @@ export interface vtkGlyph3DMapper extends vtkMapper {
getScaleArrayData(): number[];
/**
- * Get the bounds for this mapper as [xmin, xmax, ymin, ymax,zmin, zmax].
- * @return {Bounds} The bounds for the mapper.
+ * An orientation array is a vtkDataArray with 3 components. The first
+ * component is the angle of rotation along the X axis. The second component
+ * is the angle of rotation along the Y axis. The third component is the
+ * angle of rotation along the Z axis. Orientation is specified in X,Y,Z
+ * order but the rotations are performed in Z,X an Y.
+ *
+ * This definition is compliant with SetOrientation method on vtkProp3D.
+ *
+ * By using vector or normal there is a degree of freedom or rotation left
+ * (underconstrained). With the orientation array, there is no degree of
+ * freedom left.
*/
- getBounds(): Bounds;
+ getOrientationMode(): OrientationModes;
/**
- *
+ * Get orientation as string
*/
- buildArrays(): void;
+ getOrientationModeAsString(): string;
/**
- *
+ * Get orientation as array
*/
- getPrimitiveCount(): IPrimitiveCount;
+ getOrientationArrayData(): number[];
/**
* Sets the name of the array to use as orientation.
@@ -91,6 +102,11 @@ export interface vtkGlyph3DMapper extends vtkMapper {
*/
setOrientationArray(arrayName: Nullable): boolean;
+ /**
+ * Gets the name of the array used as orientation values.
+ */
+ getOrientationArray(): string;
+
/**
* Orientation mode indicates if the OrientationArray provides the direction
* vector for the orientation or the rotations around each axes.
diff --git a/Sources/Rendering/Core/Glyph3DMapper/test/testGlyph3DMapper.js b/Sources/Rendering/Core/Glyph3DMapper/test/testGlyph3DMapper.js
index e73e69f2e4e..32193da23c2 100644
--- a/Sources/Rendering/Core/Glyph3DMapper/test/testGlyph3DMapper.js
+++ b/Sources/Rendering/Core/Glyph3DMapper/test/testGlyph3DMapper.js
@@ -16,8 +16,8 @@ import { FieldDataTypes } from 'vtk.js/Sources/Common/DataModel/DataSet/Constant
import baseline from './testGlyph3DMapper.png';
import baseline2 from './testGlyph3DMapper2.png';
-test('Test vtkGlyph3DMapper Rendering', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+test.onlyIfWebGL('Test vtkGlyph3DMapper Rendering', (t) => {
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkGlyph3DMapper Rendering');
// Create some control UI
@@ -106,15 +106,18 @@ test('Test vtkGlyph3DMapper Rendering', (t) => {
renderWindow.render();
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline, baseline2],
- 'Rendering/Core/Glyph3DMapper/testGlyph3DMapper',
- t,
- 1.0,
- gc.releaseResources
- );
- });
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline, baseline2],
+ 'Rendering/Core/Glyph3DMapper/testGlyph3DMapper',
+ t,
+ 1.0
+ )
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
+ return promise;
});
diff --git a/Sources/Rendering/Core/HardwareSelector/test/testHardwareSelector.js b/Sources/Rendering/Core/HardwareSelector/test/testHardwareSelector.js
index 048c8cb7eb7..bd121accd72 100644
--- a/Sources/Rendering/Core/HardwareSelector/test/testHardwareSelector.js
+++ b/Sources/Rendering/Core/HardwareSelector/test/testHardwareSelector.js
@@ -129,7 +129,7 @@ test('Test HardwareSelector', (tapeContext) => {
})
);
- Promise.all(promises).then(() => {
+ return Promise.all(promises).then(() => {
gc.releaseResources();
});
});
diff --git a/Sources/Rendering/Core/HardwareSelector/test/testHardwareSelectorGlyph.js b/Sources/Rendering/Core/HardwareSelector/test/testHardwareSelectorGlyph.js
index ebff5099ff2..3949b49bf63 100644
--- a/Sources/Rendering/Core/HardwareSelector/test/testHardwareSelectorGlyph.js
+++ b/Sources/Rendering/Core/HardwareSelector/test/testHardwareSelectorGlyph.js
@@ -33,10 +33,10 @@ test('Test HardwareSelectorGlyph', (tapeContext) => {
renderWindow.addRenderer(renderer);
renderer.setBackground(0.32, 0.34, 0.43);
- const planeSource = vtkPlaneSource.newInstance();
- const simpleFilter = vtkCalculator.newInstance();
- const mapper = vtkGlyph3DMapper.newInstance();
- const actor = vtkActor.newInstance();
+ const planeSource = gc.registerResource(vtkPlaneSource.newInstance());
+ const simpleFilter = gc.registerResource(vtkCalculator.newInstance());
+ const mapper = gc.registerResource(vtkGlyph3DMapper.newInstance());
+ const actor = gc.registerResource(vtkActor.newInstance());
simpleFilter.setFormula({
getArrays: (inputDataSets) => ({
@@ -87,7 +87,7 @@ test('Test HardwareSelectorGlyph', (tapeContext) => {
mapper.setInputConnection(simpleFilter.getOutputPort(), 0);
- const coneSource = vtkConeSource.newInstance();
+ const coneSource = gc.registerResource(vtkConeSource.newInstance());
coneSource.setResolution(12);
mapper.setInputConnection(coneSource.getOutputPort(), 1);
mapper.setOrientationArray('pressure');
@@ -107,7 +107,7 @@ test('Test HardwareSelectorGlyph', (tapeContext) => {
const sel = glwindow.getSelector();
sel.setFieldAssociation(FieldAssociations.FIELD_ASSOCIATION_POINTS);
- sel.selectAsync(renderer, 200, 200, 250, 300).then((res) => {
+ return sel.selectAsync(renderer, 200, 200, 250, 300).then((res) => {
const allGood = res.length === 7 && res[0].getProperties().prop === actor;
tapeContext.ok(res.length === 7, 'Seven glyphs selected');
diff --git a/Sources/Rendering/Core/HardwareSelector/test/testHardwareSelectorManyCells.js b/Sources/Rendering/Core/HardwareSelector/test/testHardwareSelectorManyCells.js
index ef1d0a91f11..7b840842fdc 100644
--- a/Sources/Rendering/Core/HardwareSelector/test/testHardwareSelectorManyCells.js
+++ b/Sources/Rendering/Core/HardwareSelector/test/testHardwareSelectorManyCells.js
@@ -14,6 +14,8 @@ import vtkMapper from 'vtk.js/Sources/Rendering/Core/Mapper';
import vtkPolyData from 'vtk.js/Sources/Common/DataModel/PolyData';
import { FieldAssociations } from 'vtk.js/Sources/Common/DataModel/DataSet/Constants';
+// Feb 2025: Github Actions takes a long time to render this dataset,
+// so it could be flaky.
test('Test HardwareSelector', (tapeContext) => {
const gc = testUtils.createGarbageCollector(tapeContext);
tapeContext.ok('rendering', 'vtkHardwareSelector TestHardwareSelector');
diff --git a/Sources/Rendering/Core/HardwareSelector/test/testHardwareSelectorPoints.js b/Sources/Rendering/Core/HardwareSelector/test/testHardwareSelectorPoints.js
index 0f6f977ff38..da1c5b1b4d3 100644
--- a/Sources/Rendering/Core/HardwareSelector/test/testHardwareSelectorPoints.js
+++ b/Sources/Rendering/Core/HardwareSelector/test/testHardwareSelectorPoints.js
@@ -172,7 +172,7 @@ test.onlyIfWebGL('Test HardwareSelector Points', (tapeContext) => {
tapeContext.ok(res[0].getProperties().attributeID === 2);
})
);
- Promise.all(promises).then(() => {
+ return Promise.all(promises).then(() => {
gc.releaseResources();
});
});
diff --git a/Sources/Rendering/Core/HardwareSelector/test/testHardwareSelectorSpeed.js b/Sources/Rendering/Core/HardwareSelector/test/testHardwareSelectorSpeed.js
index 11863933b85..bef472b6b12 100644
--- a/Sources/Rendering/Core/HardwareSelector/test/testHardwareSelectorSpeed.js
+++ b/Sources/Rendering/Core/HardwareSelector/test/testHardwareSelectorSpeed.js
@@ -27,8 +27,8 @@ function addActor(gc, renderer, size) {
mapper.setInputConnection(source.getOutputPort());
}
-test('Test HardwareSelector', (tapeContext) => {
- const gc = testUtils.createGarbageCollector(tapeContext);
+test.onlyIfWebGL('Test HardwareSelector', (tapeContext) => {
+ const gc = testUtils.createGarbageCollector();
tapeContext.ok('rendering', 'vtkHardwareSelector TestHardwareSelector');
// Create some control UI
@@ -57,13 +57,13 @@ test('Test HardwareSelector', (tapeContext) => {
console.time('first normal render');
let previousTime = Date.now();
- glwindow.captureNextImage().then(() => {
+ const p1 = glwindow.captureNextImage().then(() => {
const taTime = Date.now() - previousTime;
console.timeEnd('first normal render');
console.time('second normal render');
previousTime = Date.now();
- glwindow.captureNextImage().then(() => {
+ const p2 = glwindow.captureNextImage().then(() => {
const tbTime = Date.now() - previousTime;
console.timeEnd('second normal render');
@@ -72,7 +72,7 @@ test('Test HardwareSelector', (tapeContext) => {
console.time('hardware render');
previousTime = Date.now();
- sel.selectAsync(renderer, 200, 200, 300, 300).then((res) => {
+ return sel.selectAsync(renderer, 200, 200, 300, 300).then((res) => {
const tcTime = Date.now() - previousTime;
console.timeEnd('hardware render');
@@ -86,6 +86,8 @@ test('Test HardwareSelector', (tapeContext) => {
});
});
renderWindow.render();
+ return p2;
});
renderWindow.render();
+ return p1;
});
diff --git a/Sources/Rendering/Core/ImageArrayMapper/test/testImageArrayMapper.js b/Sources/Rendering/Core/ImageArrayMapper/test/testImageArrayMapper.js
index 8fe7cda94e2..6125c30bdce 100644
--- a/Sources/Rendering/Core/ImageArrayMapper/test/testImageArrayMapper.js
+++ b/Sources/Rendering/Core/ImageArrayMapper/test/testImageArrayMapper.js
@@ -11,8 +11,8 @@ import vtkRenderWindow from 'vtk.js/Sources/Rendering/Core/RenderWindow';
import baseline from '../../ImageMapper/test/testImage.png';
-test('Test ImageArrayMapper', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+test.onlyIfWebGL('Test ImageArrayMapper', (t) => {
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkImageArrayMapper testImage');
// Create some control UI
@@ -65,15 +65,18 @@ test('Test ImageArrayMapper', (t) => {
renderWindow.addView(glwindow);
glwindow.setSize(400, 400);
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline],
- 'Rendering/Core/ImageArrayMapper',
- t,
- 1,
- gc.releaseResources
- );
- });
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline],
+ 'Rendering/Core/ImageArrayMapper',
+ t,
+ 1
+ )
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
+ return promise;
});
diff --git a/Sources/Rendering/Core/ImageArrayMapper/test/testImageArrayMapperColorTF.js b/Sources/Rendering/Core/ImageArrayMapper/test/testImageArrayMapperColorTF.js
index 70a2b93898c..088f5e2f664 100644
--- a/Sources/Rendering/Core/ImageArrayMapper/test/testImageArrayMapperColorTF.js
+++ b/Sources/Rendering/Core/ImageArrayMapper/test/testImageArrayMapperColorTF.js
@@ -12,8 +12,8 @@ import vtkRenderWindow from 'vtk.js/Sources/Rendering/Core/RenderWindow';
import baseline from '../../ImageMapper/test/testImageColorTransferFunction.png';
-test('Test ImageArrayMapper Color TFun', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+test.onlyIfWebGL('Test ImageArrayMapper Color TFun', (t) => {
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkImageArrayMapper Color Transfer Function testImage');
// Create some control UI
@@ -69,15 +69,18 @@ test('Test ImageArrayMapper Color TFun', (t) => {
renderWindow.addView(glwindow);
glwindow.setSize(400, 400);
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline],
- 'Rendering/Core/ImageArrayMapper',
- t,
- 5.0,
- gc.releaseResources
- );
- });
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline],
+ 'Rendering/Core/ImageArrayMapper',
+ t,
+ 5.0
+ )
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
+ return promise;
});
diff --git a/Sources/Rendering/Core/ImageArrayMapper/test/testImageArrayMapperNN.js b/Sources/Rendering/Core/ImageArrayMapper/test/testImageArrayMapperNN.js
index 27f31426bb9..d57e01ba0fb 100644
--- a/Sources/Rendering/Core/ImageArrayMapper/test/testImageArrayMapperNN.js
+++ b/Sources/Rendering/Core/ImageArrayMapper/test/testImageArrayMapperNN.js
@@ -11,68 +11,74 @@ import vtkRenderWindow from 'vtk.js/Sources/Rendering/Core/RenderWindow';
import baseline from '../../ImageMapper/test/testImageNearestNeighbor.png';
-test('Test ImageArrayMapper with Nearest Neighbor interpolation', (t) => {
- const gc = testUtils.createGarbageCollector(t);
- t.ok('rendering', 'vtkImageArrayMapper testImage');
+test.onlyIfWebGL(
+ 'Test ImageArrayMapper with Nearest Neighbor interpolation',
+ (t) => {
+ const gc = testUtils.createGarbageCollector();
+ t.ok('rendering', 'vtkImageArrayMapper testImage');
- // Create some control UI
- const container = document.querySelector('body');
- const renderWindowContainer = gc.registerDOMElement(
- document.createElement('div')
- );
- container.appendChild(renderWindowContainer);
+ // Create some control UI
+ const container = document.querySelector('body');
+ const renderWindowContainer = gc.registerDOMElement(
+ document.createElement('div')
+ );
+ container.appendChild(renderWindowContainer);
- // create what we will view
- const renderWindow = gc.registerResource(vtkRenderWindow.newInstance());
- const renderer = gc.registerResource(vtkRenderer.newInstance());
- renderWindow.addRenderer(renderer);
- renderer.setBackground(0.32, 0.34, 0.43);
+ // create what we will view
+ const renderWindow = gc.registerResource(vtkRenderWindow.newInstance());
+ const renderer = gc.registerResource(vtkRenderer.newInstance());
+ renderWindow.addRenderer(renderer);
+ renderer.setBackground(0.32, 0.34, 0.43);
- // ----------------------------------------------------------------------------
- // Test code
- // ----------------------------------------------------------------------------
+ // ----------------------------------------------------------------------------
+ // Test code
+ // ----------------------------------------------------------------------------
- const gridSource = gc.registerResource(vtkImageGridSource.newInstance());
- gridSource.setDataExtent(0, 200, 0, 200, 0, 0);
- gridSource.setGridSpacing(16, 16, 0);
- gridSource.setGridOrigin(8, 8, 0);
- gridSource.setDataDirection(0.866, 0.5, 0, -0.5, 0.866, 0, 0, 0, 1);
- const collection = gc.registerResource(vtkCollection.newInstance());
- collection.addItem(gridSource.getOutputData());
+ const gridSource = gc.registerResource(vtkImageGridSource.newInstance());
+ gridSource.setDataExtent(0, 200, 0, 200, 0, 0);
+ gridSource.setGridSpacing(16, 16, 0);
+ gridSource.setGridOrigin(8, 8, 0);
+ gridSource.setDataDirection(0.866, 0.5, 0, -0.5, 0.866, 0, 0, 0, 1);
+ const collection = gc.registerResource(vtkCollection.newInstance());
+ collection.addItem(gridSource.getOutputData());
- const mapper = gc.registerResource(vtkImageArrayMapper.newInstance());
- mapper.setInputData(collection);
+ const mapper = gc.registerResource(vtkImageArrayMapper.newInstance());
+ mapper.setInputData(collection);
- const actor = gc.registerResource(vtkImageSlice.newInstance());
- actor.getProperty().setColorWindow(255);
- actor.getProperty().setColorLevel(127);
- actor.getProperty().setInterpolationTypeToNearest();
- actor.setMapper(mapper);
+ const actor = gc.registerResource(vtkImageSlice.newInstance());
+ actor.getProperty().setColorWindow(255);
+ actor.getProperty().setColorLevel(127);
+ actor.getProperty().setInterpolationTypeToNearest();
+ actor.setMapper(mapper);
- renderer.addActor(actor);
- renderer.resetCamera();
- renderWindow.render();
+ renderer.addActor(actor);
+ renderer.resetCamera();
+ renderWindow.render();
- // -----------------------------------------------------------
- // Make some variables global so that you can inspect and
- // modify objects in your browser's developer console:
- // -----------------------------------------------------------
+ // -----------------------------------------------------------
+ // Make some variables global so that you can inspect and
+ // modify objects in your browser's developer console:
+ // -----------------------------------------------------------
- // create something to view it
- const glwindow = gc.registerResource(renderWindow.newAPISpecificView());
- glwindow.setContainer(renderWindowContainer);
- renderWindow.addView(glwindow);
- glwindow.setSize(400, 400);
+ // create something to view it
+ const glwindow = gc.registerResource(renderWindow.newAPISpecificView());
+ glwindow.setContainer(renderWindowContainer);
+ renderWindow.addView(glwindow);
+ glwindow.setSize(400, 400);
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline],
- 'Rendering/Core/ImageArrayMapperNearestNeighbor',
- t,
- 1,
- gc.releaseResources
- );
- });
- renderWindow.render();
-});
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline],
+ 'Rendering/Core/ImageArrayMapperNearestNeighbor',
+ t,
+ 1
+ )
+ )
+ .finally(gc.releaseResources);
+ renderWindow.render();
+ return promise;
+ }
+);
diff --git a/Sources/Rendering/Core/ImageMapper/test/testImage.js b/Sources/Rendering/Core/ImageMapper/test/testImage.js
index 5d4376d900a..68aaa491983 100644
--- a/Sources/Rendering/Core/ImageMapper/test/testImage.js
+++ b/Sources/Rendering/Core/ImageMapper/test/testImage.js
@@ -10,8 +10,8 @@ import vtkRenderWindow from 'vtk.js/Sources/Rendering/Core/RenderWindow';
import baseline from './testImage.png';
-test('Test ImageMapper', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+test.onlyIfWebGL('Test ImageMapper', (t) => {
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkImageMapper testImage');
// Create some control UI
@@ -60,15 +60,18 @@ test('Test ImageMapper', (t) => {
renderWindow.addView(glwindow);
glwindow.setSize(400, 400);
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline],
- 'Rendering/Core/ImageMapper',
- t,
- 1,
- gc.releaseResources
- );
- });
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline],
+ 'Rendering/Core/ImageMapper',
+ t,
+ 1
+ )
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
+ return promise;
});
diff --git a/Sources/Rendering/Core/ImageMapper/test/testImageColorTransferFunction.js b/Sources/Rendering/Core/ImageMapper/test/testImageColorTransferFunction.js
index f8b7ab0f15b..3906a0b3485 100644
--- a/Sources/Rendering/Core/ImageMapper/test/testImageColorTransferFunction.js
+++ b/Sources/Rendering/Core/ImageMapper/test/testImageColorTransferFunction.js
@@ -11,8 +11,8 @@ import vtkColorTransferFunction from 'vtk.js/Sources/Rendering/Core/ColorTransfe
import baseline from './testImageColorTransferFunction.png';
-test('Test ImageMapper Color TFun', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+test.onlyIfWebGL('Test ImageMapper Color TFun', (t) => {
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkImageMapper Color Transfer Function testImage');
// Create some control UI
@@ -66,15 +66,18 @@ test('Test ImageMapper Color TFun', (t) => {
renderWindow.addView(glwindow);
glwindow.setSize(400, 400);
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline],
- 'Rendering/Core/ImageMapper',
- t,
- 5.0,
- gc.releaseResources
- );
- });
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline],
+ 'Rendering/Core/ImageMapper',
+ t,
+ 5.0
+ )
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
+ return promise;
});
diff --git a/Sources/Rendering/Core/ImageMapper/test/testImageLabelOutline.js b/Sources/Rendering/Core/ImageMapper/test/testImageLabelOutline.js
index c83effa3ce3..d57b4f42aa8 100644
--- a/Sources/Rendering/Core/ImageMapper/test/testImageLabelOutline.js
+++ b/Sources/Rendering/Core/ImageMapper/test/testImageLabelOutline.js
@@ -4,6 +4,7 @@ import 'vtk.js/Sources/Rendering/Misc/RenderingAPIs';
import vtkImageMapper from 'vtk.js/Sources/Rendering/Core/ImageMapper';
import vtkImageSlice from 'vtk.js/Sources/Rendering/Core/ImageSlice';
+import { SlicingMode } from 'vtk.js/Sources/Rendering/Core/ImageMapper/Constants';
import vtkRenderer from 'vtk.js/Sources/Rendering/Core/Renderer';
import vtkRenderWindow from 'vtk.js/Sources/Rendering/Core/RenderWindow';
import vtkImageData from 'vtk.js/Sources/Common/DataModel/ImageData';
@@ -11,11 +12,13 @@ import vtkColorTransferFunction from 'vtk.js/Sources/Rendering/Core/ColorTransfe
import vtkDataArray from 'vtk.js/Sources/Common/Core/DataArray';
import vtkPiecewiseFunction from 'vtk.js/Sources/Common/DataModel/PiecewiseFunction';
-import baseline from './testImageLabelOutline.png';
+import baselineI from './testImageLabelOutline_I.png';
+import baselineJ from './testImageLabelOutline_J.png';
+import baselineK from './testImageLabelOutline_K.png';
-test('Test ImageMapper', (t) => {
- const gc = testUtils.createGarbageCollector(t);
- t.ok('rendering', 'vtkImageMapper testImage');
+test.onlyIfWebGL('Test ImageMapper label outline', (t) => {
+ const gc = testUtils.createGarbageCollector();
+ t.ok('rendering', 'vtkImageMapper label outline');
// Create some control UI
const container = document.querySelector('body');
@@ -129,9 +132,9 @@ test('Test ImageMapper', (t) => {
// Create a one slice vtkImageData that has four quadrants of different values
const imageData = gc.registerResource(vtkImageData.newInstance());
- const dims = [10, 10, 1];
+ const dims = [10, 10, 10];
imageData.setSpacing(1, 1, 1);
- imageData.setOrigin(0.1, 0.1, 0.1);
+ imageData.setOrigin(0, 0, 0);
imageData.setDirection(1, 0, 0, 0, 1, 0, 0, 0, 1);
imageData.setExtent(0, dims[0] - 1, 0, dims[1] - 1, 0, dims[2] - 1);
@@ -140,14 +143,16 @@ test('Test ImageMapper', (t) => {
const values = new Uint8Array(dims[0] * dims[1] * dims[2]);
let i = 0;
- for (let y = 0; y < dims[1]; y++) {
- for (let x = 0; x < dims[0]; x++, i++) {
- if ((x < 3 && y < 3) || (x > 7 && y > 7)) {
- values[i] = BACKGROUND;
- } else if (x > 4 && x < 6 && y > 4 && y < 7) {
- values[i] = LOW_VALUE;
- } else {
- values[i] = HIGH_VALUE;
+ for (let z = 0; z < dims[2]; z++) {
+ for (let y = 0; y < dims[1]; y++) {
+ for (let x = 0; x < dims[0]; x++, i++) {
+ if ((x < 3 && y < 3) || (x > 7 && y > 7)) {
+ values[i] = BACKGROUND;
+ } else if (x > 4 && x < 6 && y > 4 && y < 7) {
+ values[i] = LOW_VALUE;
+ } else {
+ values[i] = HIGH_VALUE;
+ }
}
}
}
@@ -185,15 +190,69 @@ test('Test ImageMapper', (t) => {
renderWindow.addView(glwindow);
glwindow.setSize(400, 400);
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline],
- 'Rendering/Core/ImageMapperLabelOutline',
- t,
- 1,
- gc.releaseResources
- );
- });
- renderWindow.render();
+ function testWithSlicing(slicingMode, baseline) {
+ const PARAMS = {
+ I: {
+ mode: SlicingMode.I,
+ cameraPos: [1, 0, 0],
+ cameraDir: [1, 0, 0],
+ cameraUp: [0, 1, 0],
+ slice: 2,
+ },
+ J: {
+ mode: SlicingMode.J,
+ cameraPos: [0, 1, 0],
+ cameraDir: [0, 1, 0],
+ cameraUp: [0, 0, 1],
+ slice: 6,
+ },
+ K: {
+ mode: SlicingMode.K,
+ cameraPos: [0, 0, 1],
+ cameraDir: [0, 0, -1],
+ cameraUp: [0, 1, 0],
+ slice: 5,
+ },
+ };
+
+ const params = PARAMS[slicingMode];
+
+ return function testSlicingLabelOutline() {
+ t.comment(`testImageLabelOutline: ${slicingMode} slicing`);
+
+ mapper.setSlicingMode(params.mode);
+ mapper.setSlice(params.slice);
+ labelMap.mapper.setSlicingMode(params.mode);
+ labelMap.mapper.setSlice(params.slice);
+
+ renderer.getActiveCamera().setPosition(...params.cameraPos);
+ renderer.getActiveCamera().setDirectionOfProjection(...params.cameraDir);
+ renderer.getActiveCamera().setViewUp(...params.cameraUp);
+ renderer.resetCamera();
+ renderer.resetCameraClippingRange();
+
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline],
+ `Rendering/Core/ImageMapperLabelOutline_${slicingMode}`,
+ t,
+ 1
+ )
+ );
+
+ renderWindow.render();
+ return promise;
+ };
+ }
+
+ return [
+ testWithSlicing('I', baselineI),
+ testWithSlicing('J', baselineJ),
+ testWithSlicing('K', baselineK),
+ ]
+ .reduce((cur, next) => cur.then(next), Promise.resolve())
+ .finally(gc.releaseResources);
});
diff --git a/Sources/Rendering/Core/ImageMapper/test/testImageLabelOutline.png b/Sources/Rendering/Core/ImageMapper/test/testImageLabelOutline.png
deleted file mode 100644
index abe786f44e7..00000000000
Binary files a/Sources/Rendering/Core/ImageMapper/test/testImageLabelOutline.png and /dev/null differ
diff --git a/Sources/Rendering/Core/ImageMapper/test/testImageLabelOutline_I.png b/Sources/Rendering/Core/ImageMapper/test/testImageLabelOutline_I.png
new file mode 100644
index 00000000000..f61e441516a
Binary files /dev/null and b/Sources/Rendering/Core/ImageMapper/test/testImageLabelOutline_I.png differ
diff --git a/Sources/Rendering/Core/ImageMapper/test/testImageLabelOutline_J.png b/Sources/Rendering/Core/ImageMapper/test/testImageLabelOutline_J.png
new file mode 100644
index 00000000000..8e46c06e995
Binary files /dev/null and b/Sources/Rendering/Core/ImageMapper/test/testImageLabelOutline_J.png differ
diff --git a/Sources/Rendering/Core/ImageMapper/test/testImageLabelOutline_K.png b/Sources/Rendering/Core/ImageMapper/test/testImageLabelOutline_K.png
new file mode 100644
index 00000000000..a3a2b669846
Binary files /dev/null and b/Sources/Rendering/Core/ImageMapper/test/testImageLabelOutline_K.png differ
diff --git a/Sources/Rendering/Core/ImageMapper/test/testImageNearestNeighbor.js b/Sources/Rendering/Core/ImageMapper/test/testImageNearestNeighbor.js
index 74c3736d325..a67424a497f 100644
--- a/Sources/Rendering/Core/ImageMapper/test/testImageNearestNeighbor.js
+++ b/Sources/Rendering/Core/ImageMapper/test/testImageNearestNeighbor.js
@@ -10,66 +10,72 @@ import vtkRenderWindow from 'vtk.js/Sources/Rendering/Core/RenderWindow';
import baseline from './testImageNearestNeighbor.png';
-test('Test ImageMapper with Nearest Neighbor interpolation', (t) => {
- const gc = testUtils.createGarbageCollector(t);
- t.ok('rendering', 'vtkImageMapper testImage');
+test.onlyIfWebGL(
+ 'Test ImageMapper with Nearest Neighbor interpolation',
+ (t) => {
+ const gc = testUtils.createGarbageCollector();
+ t.ok('rendering', 'vtkImageMapper testImage');
- // Create some control UI
- const container = document.querySelector('body');
- const renderWindowContainer = gc.registerDOMElement(
- document.createElement('div')
- );
- container.appendChild(renderWindowContainer);
+ // Create some control UI
+ const container = document.querySelector('body');
+ const renderWindowContainer = gc.registerDOMElement(
+ document.createElement('div')
+ );
+ container.appendChild(renderWindowContainer);
- // create what we will view
- const renderWindow = gc.registerResource(vtkRenderWindow.newInstance());
- const renderer = gc.registerResource(vtkRenderer.newInstance());
- renderWindow.addRenderer(renderer);
- renderer.setBackground(0.32, 0.34, 0.43);
+ // create what we will view
+ const renderWindow = gc.registerResource(vtkRenderWindow.newInstance());
+ const renderer = gc.registerResource(vtkRenderer.newInstance());
+ renderWindow.addRenderer(renderer);
+ renderer.setBackground(0.32, 0.34, 0.43);
- // ----------------------------------------------------------------------------
- // Test code
- // ----------------------------------------------------------------------------
+ // ----------------------------------------------------------------------------
+ // Test code
+ // ----------------------------------------------------------------------------
- const gridSource = gc.registerResource(vtkImageGridSource.newInstance());
- gridSource.setDataExtent(0, 200, 0, 200, 0, 0);
- gridSource.setGridSpacing(16, 16, 0);
- gridSource.setGridOrigin(8, 8, 0);
- gridSource.setDataDirection(0.866, 0.5, 0, -0.5, 0.866, 0, 0, 0, 1);
+ const gridSource = gc.registerResource(vtkImageGridSource.newInstance());
+ gridSource.setDataExtent(0, 200, 0, 200, 0, 0);
+ gridSource.setGridSpacing(16, 16, 0);
+ gridSource.setGridOrigin(8, 8, 0);
+ gridSource.setDataDirection(0.866, 0.5, 0, -0.5, 0.866, 0, 0, 0, 1);
- const mapper = gc.registerResource(vtkImageMapper.newInstance());
- mapper.setInputConnection(gridSource.getOutputPort());
+ const mapper = gc.registerResource(vtkImageMapper.newInstance());
+ mapper.setInputConnection(gridSource.getOutputPort());
- const actor = gc.registerResource(vtkImageSlice.newInstance());
- actor.getProperty().setColorWindow(255);
- actor.getProperty().setColorLevel(127);
- actor.getProperty().setInterpolationTypeToNearest();
- actor.setMapper(mapper);
+ const actor = gc.registerResource(vtkImageSlice.newInstance());
+ actor.getProperty().setColorWindow(255);
+ actor.getProperty().setColorLevel(127);
+ actor.getProperty().setInterpolationTypeToNearest();
+ actor.setMapper(mapper);
- renderer.addActor(actor);
- renderer.resetCamera();
- renderWindow.render();
+ renderer.addActor(actor);
+ renderer.resetCamera();
+ renderWindow.render();
- // -----------------------------------------------------------
- // Make some variables global so that you can inspect and
- // modify objects in your browser's developer console:
- // -----------------------------------------------------------
+ // -----------------------------------------------------------
+ // Make some variables global so that you can inspect and
+ // modify objects in your browser's developer console:
+ // -----------------------------------------------------------
- // create something to view it
- const glwindow = gc.registerResource(renderWindow.newAPISpecificView());
- glwindow.setContainer(renderWindowContainer);
- renderWindow.addView(glwindow);
- glwindow.setSize(400, 400);
+ // create something to view it
+ const glwindow = gc.registerResource(renderWindow.newAPISpecificView());
+ glwindow.setContainer(renderWindowContainer);
+ renderWindow.addView(glwindow);
+ glwindow.setSize(400, 400);
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline],
- 'Rendering/Core/ImageMapperNearestNeighbor',
- t,
- 1,
- gc.releaseResources
- );
- });
- renderWindow.render();
-});
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline],
+ 'Rendering/Core/ImageMapperNearestNeighbor',
+ t,
+ 1
+ )
+ )
+ .finally(gc.releaseResources);
+ renderWindow.render();
+ return promise;
+ }
+);
diff --git a/Sources/Rendering/Core/ImageProperty/index.d.ts b/Sources/Rendering/Core/ImageProperty/index.d.ts
index ded3913e68e..09c01cf2351 100755
--- a/Sources/Rendering/Core/ImageProperty/index.d.ts
+++ b/Sources/Rendering/Core/ImageProperty/index.d.ts
@@ -94,6 +94,28 @@ export interface vtkImageProperty extends vtkObject {
*/
getScalarOpacity(idx?: number): vtkPiecewiseFunction;
+ /**
+ * Enable label outline rendering.
+ * @param {Boolean} useLabelOutline
+ */
+ setUseLabelOutline(useLabelOutline: boolean): boolean;
+
+ /**
+ * Check if label outline rendering.
+ */
+ getUseLabelOutline(): boolean;
+
+ /**
+ * Set the 0 to 1 opacity of the label outline.
+ * @param {Number} opacity
+ */
+ setLabelOutlineOpacity(opacity: number): boolean;
+
+ /**
+ * Get the 0 to 1 opacity of the label outline.
+ */
+ getLabelOutlineOpacity(): number;
+
/**
* gets the label outline thickness
*/
diff --git a/Sources/Rendering/Core/ImageResliceMapper/test/testImageResliceMapper.js b/Sources/Rendering/Core/ImageResliceMapper/test/testImageResliceMapper.js
index 7d1b00049fb..13ed39f4442 100644
--- a/Sources/Rendering/Core/ImageResliceMapper/test/testImageResliceMapper.js
+++ b/Sources/Rendering/Core/ImageResliceMapper/test/testImageResliceMapper.js
@@ -18,7 +18,7 @@ import vtkPlane from 'vtk.js/Sources/Common/DataModel/Plane';
import baseline from './testImageResliceMapper.png';
test.onlyIfWebGL('Test ImageResliceMapper', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkImageResliceMapper testImageResliceMapper');
// Create some control UI
@@ -99,15 +99,18 @@ test.onlyIfWebGL('Test ImageResliceMapper', (t) => {
renderWindow.addView(glwindow);
glwindow.setSize(400, 400);
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline],
- 'Rendering/Core/ImageResliceMapper',
- t,
- 1,
- gc.releaseResources
- );
- });
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline],
+ 'Rendering/Core/ImageResliceMapper',
+ t,
+ 1
+ )
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
+ return promise;
});
diff --git a/Sources/Rendering/Core/ImageResliceMapper/test/testImageResliceMapperBorderRendering.js b/Sources/Rendering/Core/ImageResliceMapper/test/testImageResliceMapperBorderRendering.js
index a816cd5191b..f0d3d325118 100644
--- a/Sources/Rendering/Core/ImageResliceMapper/test/testImageResliceMapperBorderRendering.js
+++ b/Sources/Rendering/Core/ImageResliceMapper/test/testImageResliceMapperBorderRendering.js
@@ -19,7 +19,7 @@ import baselineOrtho from './testImageResliceMapperBorderRenderingOrtho.png';
import baselineOblique from './testImageResliceMapperBorderRenderingOblique.png';
test.onlyIfWebGL('Test ImageResliceMapper', async (t) => {
- const gc = testUtils.createGarbageCollector(t);
+ const gc = testUtils.createGarbageCollector();
t.ok(
'rendering',
'vtkImageResliceMapper testImageResliceMapperBorderRendering'
@@ -114,22 +114,20 @@ test.onlyIfWebGL('Test ImageResliceMapper', async (t) => {
renderer.resetCameraClippingRange();
function strictBaselineTest(baseline) {
- return new Promise((resolve) => {
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline],
- 'Rendering/Core/ImageResliceMapper',
- t,
- {
- pixelThreshold: 0.001, // 0.1% (range is [0, 1])
- mismatchTolerance: 1, // 1% (raw percentage)
- },
- resolve
- );
- });
- renderWindow.render();
- });
+ const promise = glwindow.captureNextImage().then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline],
+ 'Rendering/Core/ImageResliceMapper',
+ t,
+ {
+ pixelThreshold: 0.001, // 0.1% (range is [0, 1])
+ mismatchTolerance: 1, // 1% (raw percentage)
+ }
+ )
+ );
+ renderWindow.render();
+ return promise;
}
slicePlane.setOrigin([0, imageDimension - 0.5, 0]);
diff --git a/Sources/Rendering/Core/ImageResliceMapper/test/testImageResliceMapperPolyData.js b/Sources/Rendering/Core/ImageResliceMapper/test/testImageResliceMapperPolyData.js
index 474f8846daf..39c1da5a832 100644
--- a/Sources/Rendering/Core/ImageResliceMapper/test/testImageResliceMapperPolyData.js
+++ b/Sources/Rendering/Core/ImageResliceMapper/test/testImageResliceMapperPolyData.js
@@ -18,7 +18,7 @@ import vtkSphereSource from 'vtk.js/Sources/Filters/Sources/SphereSource';
import baseline from './testImageResliceMapperPolyData.png';
test.onlyIfWebGL('Test ImageResliceMapperPolyData', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkImageResliceMapper testImageResliceMapperPolyData');
// Create some control UI
@@ -97,15 +97,18 @@ test.onlyIfWebGL('Test ImageResliceMapperPolyData', (t) => {
renderWindow.addView(glwindow);
glwindow.setSize(400, 400);
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline],
- 'Rendering/Core/ImageResliceMapper',
- t,
- 1,
- gc.releaseResources
- );
- });
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline],
+ 'Rendering/Core/ImageResliceMapper',
+ t,
+ 1
+ )
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
+ return promise;
});
diff --git a/Sources/Rendering/Core/ImageResliceMapper/test/testImageResliceMapperShareOpenGLTexture.js b/Sources/Rendering/Core/ImageResliceMapper/test/testImageResliceMapperShareOpenGLTexture.js
index d14ef62bf77..22cd08c060a 100644
--- a/Sources/Rendering/Core/ImageResliceMapper/test/testImageResliceMapperShareOpenGLTexture.js
+++ b/Sources/Rendering/Core/ImageResliceMapper/test/testImageResliceMapperShareOpenGLTexture.js
@@ -21,7 +21,7 @@ import 'vtk.js/Sources/IO/Core/DataAccessHelper/HttpDataAccessHelper';
import baseline from './testImageResliceMapperShareOpenGLTexture.png';
test.onlyIfWebGL('Test ImageResliceMapperShareOpenGLTexture', async (t) => {
- const gc = testUtils.createGarbageCollector(t);
+ const gc = testUtils.createGarbageCollector();
t.ok(
'rendering',
'vtkImageResliceMapper testImageResliceMapperShareOpenGLTexture'
@@ -127,14 +127,14 @@ test.onlyIfWebGL('Test ImageResliceMapperShareOpenGLTexture', async (t) => {
[baseline],
'Rendering/Core/ImageResliceMapper',
t,
- 1,
- gc.releaseResources
+ 1
)
);
renderWindow.render();
return p;
})
- );
+ )
+ .finally(gc.releaseResources);
const property = gc.registerResource(vtkImageProperty.newInstance());
diff --git a/Sources/Rendering/Core/ImageResliceMapper/test/testImageResliceMapperSlabTypes.js b/Sources/Rendering/Core/ImageResliceMapper/test/testImageResliceMapperSlabTypes.js
index 1fc7b00b7de..e9bef05e2ee 100644
--- a/Sources/Rendering/Core/ImageResliceMapper/test/testImageResliceMapperSlabTypes.js
+++ b/Sources/Rendering/Core/ImageResliceMapper/test/testImageResliceMapperSlabTypes.js
@@ -24,7 +24,7 @@ import 'vtk.js/Sources/IO/Core/DataAccessHelper/HttpDataAccessHelper';
import baseline from './testImageResliceMapperSlabTypes.png';
test.onlyIfWebGL('Test ImageResliceMapperSlabTypes', async (t) => {
- const gc = testUtils.createGarbageCollector(t);
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkImageResliceMapper testImageResliceMapperSlabTypes');
// Create some control UI
@@ -156,14 +156,14 @@ test.onlyIfWebGL('Test ImageResliceMapperSlabTypes', async (t) => {
[baseline],
'Rendering/Core/ImageResliceMapper',
t,
- 1,
- gc.releaseResources
+ 1
)
);
renderWindow.render();
return p;
})
- );
+ )
+ .finally(gc.releaseResources);
const property = gc.registerResource(vtkImageProperty.newInstance());
diff --git a/Sources/Rendering/Core/Mapper/test/testCellData.js b/Sources/Rendering/Core/Mapper/test/testCellData.js
index 0078a8cac66..d64d73ed182 100644
--- a/Sources/Rendering/Core/Mapper/test/testCellData.js
+++ b/Sources/Rendering/Core/Mapper/test/testCellData.js
@@ -21,7 +21,7 @@ import {
import baseline from './testCellData.png';
test.onlyIfWebGL('Test Color Mapping With Cell Data', async (t) => {
- const gc = testUtils.createGarbageCollector(t);
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkMapper CellData');
// Create some control UI
@@ -116,22 +116,20 @@ test.onlyIfWebGL('Test Color Mapping With Cell Data', async (t) => {
glwindow.setSize(400, 400);
function baselineTest(baselineImage) {
- return new Promise((resolve) => {
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baselineImage],
- 'Rendering/Core/Mapper/testCellData',
- t,
- {
- pixelThreshold: 0.01, // 1% (range is [0, 1])
- mismatchTolerance: 1, // 1% (raw percentage)
- },
- resolve
- );
- });
- renderWindow.render();
- });
+ const promise = glwindow.captureNextImage().then((image) =>
+ testUtils.compareImages(
+ image,
+ [baselineImage],
+ 'Rendering/Core/Mapper/testCellData',
+ t,
+ {
+ pixelThreshold: 0.01, // 1% (range is [0, 1])
+ mismatchTolerance: 1, // 1% (raw percentage)
+ }
+ )
+ );
+ renderWindow.render();
+ return promise;
}
// Using a color transfer function
diff --git a/Sources/Rendering/Core/Mapper/test/testEdgeVisibility.js b/Sources/Rendering/Core/Mapper/test/testEdgeVisibility.js
index defc3be0e41..ab65dc57980 100644
--- a/Sources/Rendering/Core/Mapper/test/testEdgeVisibility.js
+++ b/Sources/Rendering/Core/Mapper/test/testEdgeVisibility.js
@@ -11,7 +11,7 @@ import vtkMapper from 'vtk.js/Sources/Rendering/Core/Mapper';
import baseline from './testEdgeVisibility.png';
test.skip('Test Edge Visibility', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkMapper EdgeVisibility');
// Create some control UI
@@ -44,15 +44,18 @@ test.skip('Test Edge Visibility', (t) => {
renderWindow.addView(glwindow);
glwindow.setSize(400, 400);
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline],
- 'Rendering/Core/Mapper/testEdgeVisibility.js',
- t,
- 1,
- gc.releaseResources
- );
- });
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline],
+ 'Rendering/Core/Mapper/testEdgeVisibility.js',
+ t,
+ 1
+ )
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
+ return promise;
});
diff --git a/Sources/Rendering/Core/Mapper/test/testInterpolateScalarsBeforeMapping.js b/Sources/Rendering/Core/Mapper/test/testInterpolateScalarsBeforeMapping.js
index ea0c3a516e0..3cdcb511443 100644
--- a/Sources/Rendering/Core/Mapper/test/testInterpolateScalarsBeforeMapping.js
+++ b/Sources/Rendering/Core/Mapper/test/testInterpolateScalarsBeforeMapping.js
@@ -12,8 +12,8 @@ import vtkPolyData from 'vtk.js/Sources/Common/DataModel/PolyData';
import baseline from './testInterpolateScalarsBeforeMapping.png';
-test('Test Interpolate Scalars Before Mapping', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+test.onlyIfWebGL('Test Interpolate Scalars Before Mapping', (t) => {
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkMapper InterpolateScalarsBeforeColors');
// Create some control UI
@@ -103,15 +103,18 @@ test('Test Interpolate Scalars Before Mapping', (t) => {
renderWindow.addView(glwindow);
glwindow.setSize(400, 400);
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline],
- 'Rendering/Core/Mapper/testInterpolateScalarsBeforeMapping',
- t,
- 5,
- gc.releaseResources
- );
- });
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline],
+ 'Rendering/Core/Mapper/testInterpolateScalarsBeforeMapping',
+ t,
+ 5
+ )
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
+ return promise;
});
diff --git a/Sources/Rendering/Core/Mapper/test/testVectorComponent.js b/Sources/Rendering/Core/Mapper/test/testVectorComponent.js
index abaad7eb157..9801cb1e8e0 100644
--- a/Sources/Rendering/Core/Mapper/test/testVectorComponent.js
+++ b/Sources/Rendering/Core/Mapper/test/testVectorComponent.js
@@ -14,8 +14,8 @@ import baseline2 from './testVectorComponent2.png';
const { GetArray } = vtkMapper;
-test('Test VectorComponent', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+test.onlyIfWebGL('Test VectorComponent', (t) => {
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkMapper Vector Component');
// Create some control UI
@@ -60,15 +60,18 @@ test('Test VectorComponent', (t) => {
renderWindow.render();
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline, baseline2],
- 'Rendering/Core/Mapper/testVectorComponent.js',
- t,
- 5,
- gc.releaseResources
- );
- });
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline, baseline2],
+ 'Rendering/Core/Mapper/testVectorComponent.js',
+ t,
+ 5
+ )
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
+ return promise;
});
diff --git a/Sources/Rendering/Core/PointPicker/index.js b/Sources/Rendering/Core/PointPicker/index.js
index 20af75ecd47..be1b50db8a1 100644
--- a/Sources/Rendering/Core/PointPicker/index.js
+++ b/Sources/Rendering/Core/PointPicker/index.js
@@ -145,7 +145,10 @@ function vtkPointPicker(publicAPI, model) {
}
}
- model.pointId = minPtId;
+ if (minPtId > -1 && tMin < model.globalTMin) {
+ model.globalTMin = tMin;
+ model.pointId = minPtId;
+ }
return tMin;
};
}
diff --git a/Sources/Rendering/Core/PointPicker/test/testPointPicker.js b/Sources/Rendering/Core/PointPicker/test/testPointPicker.js
index e64f348a493..0f6c475ead0 100644
--- a/Sources/Rendering/Core/PointPicker/test/testPointPicker.js
+++ b/Sources/Rendering/Core/PointPicker/test/testPointPicker.js
@@ -104,10 +104,10 @@ test.onlyIfWebGL('Test vtkPointPicker line source', (t) => {
resolution: 10,
});
- const mapper = vtkMapper.newInstance();
+ const mapper = gc.registerResource(vtkMapper.newInstance());
mapper.setInputConnection(lineSource.getOutputPort());
- const actor = vtkActor.newInstance();
+ const actor = gc.registerResource(vtkActor.newInstance());
actor.getProperty().setPointSize(1);
actor.getProperty().setRepresentation(Representation.WIREFRAME);
actor.setMapper(mapper);
diff --git a/Sources/Rendering/Core/Prop3D/test/testUserMatrix.js b/Sources/Rendering/Core/Prop3D/test/testUserMatrix.js
index b284371fdf4..1e0c1f8453f 100644
--- a/Sources/Rendering/Core/Prop3D/test/testUserMatrix.js
+++ b/Sources/Rendering/Core/Prop3D/test/testUserMatrix.js
@@ -12,8 +12,8 @@ import { mat4 } from 'gl-matrix';
import baseline from './testUserMatrix.png';
-test('Test Set Actor User Matrix', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+test.onlyIfWebGL('Test Set Actor User Matrix', (t) => {
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkActor SetUserMatrix');
// Create some control UI
@@ -49,7 +49,7 @@ test('Test Set Actor User Matrix', (t) => {
actor.rotateZ(45);
- reader
+ return reader
.setUrl(
`${__BASE_PATH__}/Data/obj/space-shuttle-orbiter/space-shuttle-orbiter.obj`
)
@@ -62,16 +62,19 @@ test('Test Set Actor User Matrix', (t) => {
renderWindow.addView(glwindow);
glwindow.setSize(400, 400);
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline],
- 'Rendering/Core/Prop3D/testUserMatrix',
- t,
- 1.5,
- gc.releaseResources
- );
- });
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline],
+ 'Rendering/Core/Prop3D/testUserMatrix',
+ t,
+ 1.5
+ )
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
+ return promise;
});
});
diff --git a/Sources/Rendering/Core/RenderWindow/test/testMultipleRenderers.js b/Sources/Rendering/Core/RenderWindow/test/testMultipleRenderers.js
index 6be9a4b8db6..1f55b090248 100644
--- a/Sources/Rendering/Core/RenderWindow/test/testMultipleRenderers.js
+++ b/Sources/Rendering/Core/RenderWindow/test/testMultipleRenderers.js
@@ -13,8 +13,8 @@ import vtkCubeSource from 'vtk.js/Sources/Filters/Sources/CubeSource';
import baseline from './testMultipleRenderers.png';
import baseline2 from './testMultipleRenderers2.png';
-test('Test multiple renderers', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+test.onlyIfWebGL('Test multiple renderers', (t) => {
+ const gc = testUtils.createGarbageCollector();
// Create some control UI
const container = document.querySelector('body');
@@ -82,17 +82,18 @@ test('Test multiple renderers', (t) => {
lowerLeftRenderer.resetCamera();
lowerRightRenderer.resetCamera();
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline, baseline2],
+ 'Rendering/Core/RenderWindow/testMultipleRenderers',
+ t,
+ 5
+ )
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
-
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline, baseline2],
- 'Rendering/Core/RenderWindow/testMultipleRenderers',
- t,
- 5,
- gc.releaseResources
- );
- });
- renderWindow.render();
+ return promise;
});
diff --git a/Sources/Rendering/Core/RenderWindowInteractor/index.d.ts b/Sources/Rendering/Core/RenderWindowInteractor/index.d.ts
index 7405aec6717..10c680c8149 100755
--- a/Sources/Rendering/Core/RenderWindowInteractor/index.d.ts
+++ b/Sources/Rendering/Core/RenderWindowInteractor/index.d.ts
@@ -63,7 +63,7 @@ export interface IRenderWindowInteractorInitialValues {
mouseScrollDebounceByPass?: boolean;
}
-interface IPosition {
+export interface IPosition {
type: string;
}
diff --git a/Sources/Rendering/Core/ScalarBarActor/test/testScalarBar.js b/Sources/Rendering/Core/ScalarBarActor/test/testScalarBar.js
index 47a1503c5a3..eea7281f9b4 100644
--- a/Sources/Rendering/Core/ScalarBarActor/test/testScalarBar.js
+++ b/Sources/Rendering/Core/ScalarBarActor/test/testScalarBar.js
@@ -11,8 +11,8 @@ import vtkColorTransferFunction from 'vtk.js/Sources/Rendering/Core/ColorTransfe
import baseline from './testScalarBar.png';
import baseline2 from './testScalarBar2.png';
-test('Test vtkScalarBarActor Rendering', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+test.onlyIfWebGL('Test vtkScalarBarActor Rendering', (t) => {
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkScalarBarActor Rendering');
// Create some control UI
@@ -53,15 +53,18 @@ test('Test vtkScalarBarActor Rendering', (t) => {
renderer.addActor(scalarBarActor);
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline, baseline2],
- 'Rendering/Core/ScalarBarActor/testScalarBarActor',
- t,
- 0.5,
- gc.releaseResources
- );
- });
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline, baseline2],
+ 'Rendering/Core/ScalarBarActor/testScalarBarActor',
+ t,
+ 0.5
+ )
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
+ return promise;
});
diff --git a/Sources/Rendering/Core/ScalarBarActor/test/testScalarBarNoExtras.js b/Sources/Rendering/Core/ScalarBarActor/test/testScalarBarNoExtras.js
index e6a4970a547..6386829a066 100644
--- a/Sources/Rendering/Core/ScalarBarActor/test/testScalarBarNoExtras.js
+++ b/Sources/Rendering/Core/ScalarBarActor/test/testScalarBarNoExtras.js
@@ -10,58 +10,64 @@ import vtkColorTransferFunction from 'vtk.js/Sources/Rendering/Core/ColorTransfe
import baselineNoExtras from './testScalarBarNoExtras.png';
-test('Test vtkScalarBarActor Rendering without extra colors"', (t) => {
- const gc = testUtils.createGarbageCollector(t);
- t.ok('rendering', 'vtkScalarBarActor Rendering');
+test.onlyIfWebGL(
+ 'Test vtkScalarBarActor Rendering without extra colors"',
+ (t) => {
+ const gc = testUtils.createGarbageCollector();
+ t.ok('rendering', 'vtkScalarBarActor Rendering');
- // Create some control UI
- const container = document.querySelector('body');
- const renderWindowContainer = gc.registerDOMElement(
- document.createElement('div')
- );
- container.appendChild(renderWindowContainer);
+ // Create some control UI
+ const container = document.querySelector('body');
+ const renderWindowContainer = gc.registerDOMElement(
+ document.createElement('div')
+ );
+ container.appendChild(renderWindowContainer);
- // create what we will view
- const renderWindow = gc.registerResource(vtkRenderWindow.newInstance());
- const renderer = gc.registerResource(vtkRenderer.newInstance());
- renderWindow.addRenderer(renderer);
- renderer.setBackground(0.32, 0.34, 0.43);
+ // create what we will view
+ const renderWindow = gc.registerResource(vtkRenderWindow.newInstance());
+ const renderer = gc.registerResource(vtkRenderer.newInstance());
+ renderWindow.addRenderer(renderer);
+ renderer.setBackground(0.32, 0.34, 0.43);
- // now create something to view it, in this case webgl
- const glwindow = gc.registerResource(renderWindow.newAPISpecificView());
- glwindow.setContainer(renderWindowContainer);
- renderWindow.addView(glwindow);
- glwindow.setSize(400, 300);
+ // now create something to view it, in this case webgl
+ const glwindow = gc.registerResource(renderWindow.newAPISpecificView());
+ glwindow.setContainer(renderWindowContainer);
+ renderWindow.addView(glwindow);
+ glwindow.setSize(400, 300);
- // Create color tf
- const colorTransferFunction = gc.registerResource(
- vtkColorTransferFunction.newInstance()
- );
- colorTransferFunction.setUseBelowRangeColor(true);
- colorTransferFunction.setUseAboveRangeColor(true);
- colorTransferFunction.setNanColor(0.8, 0.8, 0.6, 1.0);
- colorTransferFunction.addRGBPoint(0.0, 1.0, 0.2, 0.2);
- colorTransferFunction.addRGBPoint(0.5, 0.2, 1.0, 0.2);
- colorTransferFunction.addRGBPoint(1.0, 0.2, 0.2, 1.0);
+ // Create color tf
+ const colorTransferFunction = gc.registerResource(
+ vtkColorTransferFunction.newInstance()
+ );
+ colorTransferFunction.setUseBelowRangeColor(true);
+ colorTransferFunction.setUseAboveRangeColor(true);
+ colorTransferFunction.setNanColor(0.8, 0.8, 0.6, 1.0);
+ colorTransferFunction.addRGBPoint(0.0, 1.0, 0.2, 0.2);
+ colorTransferFunction.addRGBPoint(0.5, 0.2, 1.0, 0.2);
+ colorTransferFunction.addRGBPoint(1.0, 0.2, 0.2, 1.0);
- // Initialize scalar bar
- const scalarBarActor = gc.registerResource(vtkScalarBarActor.newInstance());
- scalarBarActor.setScalarsToColors(colorTransferFunction);
- scalarBarActor.setDrawNanAnnotation(false);
- scalarBarActor.setDrawBelowRangeSwatch(false);
- scalarBarActor.setDrawAboveRangeSwatch(false);
+ // Initialize scalar bar
+ const scalarBarActor = gc.registerResource(vtkScalarBarActor.newInstance());
+ scalarBarActor.setScalarsToColors(colorTransferFunction);
+ scalarBarActor.setDrawNanAnnotation(false);
+ scalarBarActor.setDrawBelowRangeSwatch(false);
+ scalarBarActor.setDrawAboveRangeSwatch(false);
- renderer.addActor(scalarBarActor);
+ renderer.addActor(scalarBarActor);
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baselineNoExtras],
- 'Rendering/Core/ScalarBarActor/testScalarBarActorNoExtras',
- t,
- 0.5,
- gc.releaseResources
- );
- });
- renderWindow.render();
-});
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baselineNoExtras],
+ 'Rendering/Core/ScalarBarActor/testScalarBarActorNoExtras',
+ t,
+ 0.5
+ )
+ )
+ .finally(gc.releaseResources);
+ renderWindow.render();
+ return promise;
+ }
+);
diff --git a/Sources/Rendering/Core/ScalarBarActor/test/testScalarBarSetGenerateTicks.js b/Sources/Rendering/Core/ScalarBarActor/test/testScalarBarSetGenerateTicks.js
index f8d7e6fc0a2..358b9040593 100644
--- a/Sources/Rendering/Core/ScalarBarActor/test/testScalarBarSetGenerateTicks.js
+++ b/Sources/Rendering/Core/ScalarBarActor/test/testScalarBarSetGenerateTicks.js
@@ -11,8 +11,8 @@ import vtkColorTransferFunction from 'vtk.js/Sources/Rendering/Core/ColorTransfe
import baseline from './testScalarBarSetGenerateTicks.png';
import baseline2 from './testScalarBarSetGenerateTicks2.png';
-test('Test vtkScalarBarActor setGenerateTicks', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+test.onlyIfWebGL('Test vtkScalarBarActor setGenerateTicks', (t) => {
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkScalarBarActor setGenerateTicks');
// Create some control UI
@@ -66,15 +66,18 @@ test('Test vtkScalarBarActor setGenerateTicks', (t) => {
renderer.addActor(scalarBarActor);
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline, baseline2],
- 'Rendering/Core/ScalarBarActor/testScalarBarActorSetGenerateTicks',
- t,
- 0.5,
- gc.releaseResources
- );
- });
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline, baseline2],
+ 'Rendering/Core/ScalarBarActor/testScalarBarActorSetGenerateTicks',
+ t,
+ 0.5
+ )
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
+ return promise;
});
diff --git a/Sources/Rendering/Core/SphereMapper/test/testDisableScalarColoring.js b/Sources/Rendering/Core/SphereMapper/test/testDisableScalarColoring.js
index 7e65612e204..46a9b2a1556 100644
--- a/Sources/Rendering/Core/SphereMapper/test/testDisableScalarColoring.js
+++ b/Sources/Rendering/Core/SphereMapper/test/testDisableScalarColoring.js
@@ -14,8 +14,8 @@ import { FieldDataTypes } from 'vtk.js/Sources/Common/DataModel/DataSet/Constant
import baseline from './testDisableScalarColoring.png';
-test('Test vtkSphereMapper Rendering', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+test.onlyIfWebGL('Test vtkSphereMapper Rendering', (t) => {
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkSphereMapper Rendering');
// Create some control UI
@@ -101,15 +101,18 @@ test('Test vtkSphereMapper Rendering', (t) => {
mapper.setScalarVisibility(false);
mapper.setColorByArrayName(null);
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline],
- 'Rendering/Core/SphereMapper/testDisableScalarColoring',
- t,
- 1.0,
- gc.releaseResources
- );
- });
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline],
+ 'Rendering/Core/SphereMapper/testDisableScalarColoring',
+ t,
+ 1.0
+ )
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
+ return promise;
});
diff --git a/Sources/Rendering/Core/SphereMapper/test/testSphere.js b/Sources/Rendering/Core/SphereMapper/test/testSphere.js
index 4225f5aac6b..5a22d6db030 100644
--- a/Sources/Rendering/Core/SphereMapper/test/testSphere.js
+++ b/Sources/Rendering/Core/SphereMapper/test/testSphere.js
@@ -15,8 +15,8 @@ import { FieldDataTypes } from 'vtk.js/Sources/Common/DataModel/DataSet/Constant
import baseline from './testSphere.png';
import baseline2 from './testSphere2.png';
-test('Test SphereMapper', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+test.onlyIfWebGL('Test SphereMapper', (t) => {
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkSphereMapper testSphere');
// Create some control UI
@@ -105,15 +105,18 @@ test('Test SphereMapper', (t) => {
renderWindow.addView(glwindow);
glwindow.setSize(400, 400);
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline, baseline2],
- 'Rendering/Core/SphereMapper',
- t,
- 1,
- gc.releaseResources
- );
- });
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline, baseline2],
+ 'Rendering/Core/SphereMapper',
+ t,
+ 1
+ )
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
+ return promise;
});
diff --git a/Sources/Rendering/Core/StickMapper/test/testStick.js b/Sources/Rendering/Core/StickMapper/test/testStick.js
index 2979643f21d..05525577472 100644
--- a/Sources/Rendering/Core/StickMapper/test/testStick.js
+++ b/Sources/Rendering/Core/StickMapper/test/testStick.js
@@ -14,8 +14,8 @@ import { FieldDataTypes } from 'vtk.js/Sources/Common/DataModel/DataSet/Constant
import baseline from './testStick.png';
-test('Test StickMapper', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+test.onlyIfWebGL('Test StickMapper', (t) => {
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkStickMapper testStick');
// Create some control UI
@@ -128,15 +128,18 @@ test('Test StickMapper', (t) => {
renderer.getActiveCamera().setClippingRange(1.0, 10.0);
renderer.getActiveCamera().azimuth(10.0);
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline],
- 'Rendering/Core/StickMapper',
- t,
- 1,
- gc.releaseResources
- );
- });
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline],
+ 'Rendering/Core/StickMapper',
+ t,
+ 1
+ )
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
+ return promise;
});
diff --git a/Sources/Rendering/Core/VolumeMapper/test/testColorMix.js b/Sources/Rendering/Core/VolumeMapper/test/testColorMix.js
index 063efe26ea9..a04dea4b369 100644
--- a/Sources/Rendering/Core/VolumeMapper/test/testColorMix.js
+++ b/Sources/Rendering/Core/VolumeMapper/test/testColorMix.js
@@ -17,8 +17,8 @@ import baselineCustom from './testColorMixCustom.png';
import baselineAdditive from './testColorMixAdditive.png';
import baselineColorize from './testColorMixColorize.png';
-test('Test Volume Rendering: custom shader code', async (t) => {
- const gc = testUtils.createGarbageCollector(t);
+test.onlyIfWebGL('Test Volume Rendering: custom shader code', async (t) => {
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkVolumeMapper Custom shader code');
// Create some control UI
@@ -157,21 +157,17 @@ test('Test Volume Rendering: custom shader code', async (t) => {
};
vmapper.modified();
- let testCustomCodeResolve;
- const testCustomCodePromise = new Promise((res) => {
- testCustomCodeResolve = res;
- });
-
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baselineCustom],
- 'Rendering/Core/VolumeMapper/testColorMix',
- t,
- 3.0,
- testCustomCodeResolve
+ const testCustomCodePromise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baselineCustom],
+ 'Rendering/Core/VolumeMapper/testColorMix',
+ t,
+ 3.0
+ )
);
- });
renderWindow.render();
await testCustomCodePromise;
@@ -204,21 +200,17 @@ test('Test Volume Rendering: custom shader code', async (t) => {
light.setIntensity(1.0);
renderer.addLight(light);
- let testAdditiveResolve;
- const testAdditivePromise = new Promise((res) => {
- testAdditiveResolve = res;
- });
-
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baselineAdditive],
- 'Rendering/Core/VolumeMapper/testColorMix',
- t,
- 3.0,
- testAdditiveResolve
+ const testAdditivePromise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baselineAdditive],
+ 'Rendering/Core/VolumeMapper/testColorMix',
+ t,
+ 3.0
+ )
);
- });
renderWindow.render();
await testAdditivePromise;
@@ -231,26 +223,22 @@ test('Test Volume Rendering: custom shader code', async (t) => {
renderer.getActiveCamera().azimuth(-60);
renderer.getActiveCamera().elevation(-20);
- let testColorizeResolve;
- const testColorizePromise = new Promise((res) => {
- testColorizeResolve = res;
- });
-
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baselineColorize],
- 'Rendering/Core/VolumeMapper/testColorMix',
- t,
- 3.0,
- testColorizeResolve
+ const testColorizePromise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baselineColorize],
+ 'Rendering/Core/VolumeMapper/testColorMix',
+ t,
+ 3.0
+ )
);
- });
renderWindow.render();
await testColorizePromise;
// ----------------------------------------------------------------
- await gc.releaseResources();
+ gc.releaseResources();
});
diff --git a/Sources/Rendering/Misc/CanvasView/index.js b/Sources/Rendering/Misc/CanvasView/index.js
index 799b2d8a1d0..23facc6023b 100644
--- a/Sources/Rendering/Misc/CanvasView/index.js
+++ b/Sources/Rendering/Misc/CanvasView/index.js
@@ -148,8 +148,10 @@ export function extend(publicAPI, model, initialValues = {}) {
Object.assign(model, DEFAULT_VALUES, initialValues);
// Create internal instances
- model.canvas = document.createElement('canvas');
- model.canvas.style.width = '100%';
+ if (!model.canvas) {
+ model.canvas = document.createElement('canvas');
+ model.canvas.style.width = '100%';
+ }
// Create internal bgImage
model.bgImage = new Image();
diff --git a/Sources/Rendering/Misc/RemoteView/index.d.ts b/Sources/Rendering/Misc/RemoteView/index.d.ts
index 8434df1f914..106fef4cacf 100644
--- a/Sources/Rendering/Misc/RemoteView/index.d.ts
+++ b/Sources/Rendering/Misc/RemoteView/index.d.ts
@@ -13,21 +13,27 @@ interface IRemoteViewInitialValues {
rpcGestureEvent?: any;
rpcWheelEvent?: any;
viewStream?: vtkViewStream;
+ canvasElement?: HTMLCanvasElement;
}
export interface vtkRemoteView extends vtkObject {
/**
- * Get container element
+ * Get container HTML element
*/
getContainer(): HTMLElement;
/**
- *
+ * Get vtkViewStream object
*/
getViewStream(): vtkViewStream;
/**
- *
+ * Get the canvas HTML element
+ */
+ getCanvasElement(): HTMLCanvasElement;
+
+ /**
+ * Get the vtkCanvasView object
*/
getCanvasView(): vtkCanvasView;
diff --git a/Sources/Rendering/Misc/RemoteView/index.js b/Sources/Rendering/Misc/RemoteView/index.js
index a60e8e96646..b33e538ab51 100644
--- a/Sources/Rendering/Misc/RemoteView/index.js
+++ b/Sources/Rendering/Misc/RemoteView/index.js
@@ -17,7 +17,9 @@ function vtkRemoteView(publicAPI, model) {
model.classHierarchy.push('vtkRemoteView');
// Constructor
- model.canvasView = vtkCanvasView.newInstance();
+ model.canvasView = vtkCanvasView.newInstance({
+ canvas: model.canvasElement,
+ });
model.interactorStyle = vtkInteractorStyleRemoteMouse.newInstance();
model.interactor = vtkRenderWindowInteractor.newInstance();
@@ -62,6 +64,8 @@ function vtkRemoteView(publicAPI, model) {
}
}, publicAPI.delete);
+ publicAPI.getCanvasElement = () => model.canvasView.getCanvas();
+
// --------------------------------------------------------------------------
// remote handing
// --------------------------------------------------------------------------
@@ -201,6 +205,7 @@ const DEFAULT_VALUES = {
rpcMouseEvent: 'viewport.mouse.interaction',
rpcGestureEvent: null,
rpcWheelEvent: null,
+ canvasElement: null,
};
// ----------------------------------------------------------------------------
@@ -219,6 +224,7 @@ export function extend(publicAPI, model, initialValues = {}) {
'interactiveRatio',
'stillQuality',
'stillRatio',
+ 'canvasElement',
]);
macro.setGet(publicAPI, model, [
'session',
diff --git a/Sources/Rendering/OpenGL/ImageMapper/index.js b/Sources/Rendering/OpenGL/ImageMapper/index.js
index 3169b54071c..ac46d877f50 100644
--- a/Sources/Rendering/OpenGL/ImageMapper/index.js
+++ b/Sources/Rendering/OpenGL/ImageMapper/index.js
@@ -272,6 +272,7 @@ function vtkOpenGLImageMapper(publicAPI, model) {
'uniform mat4 PCWCMatrix;',
'uniform mat4 vWCtoIDX;',
'uniform ivec3 imageDimensions;',
+ 'uniform int sliceAxis;',
]
).result;
@@ -301,6 +302,11 @@ function vtkOpenGLImageMapper(publicAPI, model) {
' // half voxel fix for labelmapOutline',
' return (index + vec3(0.5)) / vec3(imageDimensions);',
'}',
+ 'vec2 getSliceCoords(vec3 coord, int axis) {',
+ ' if (axis == 0) return coord.yz;',
+ ' if (axis == 1) return coord.xz;',
+ ' if (axis == 2) return coord.xy;',
+ '}',
'#endif',
]
).result;
@@ -359,7 +365,7 @@ function vtkOpenGLImageMapper(publicAPI, model) {
`
#ifdef vtkImageLabelOutlineOn
vec3 centerPosIS = fragCoordToIndexSpace(gl_FragCoord);
- float centerValue = texture2D(texture1, centerPosIS.xy).r;
+ float centerValue = texture2D(texture1, getSliceCoords(centerPosIS, sliceAxis)).r;
bool pixelOnBorder = false;
vec3 tColor = texture2D(colorTexture1, vec2(centerValue * cscale0 + cshift0, 0.5)).rgb;
float scalarOpacity = texture2D(pwfTexture1, vec2(centerValue * pwfscale0 + pwfshift0, 0.5)).r;
@@ -370,7 +376,7 @@ function vtkOpenGLImageMapper(publicAPI, model) {
int actualThickness = int(textureValue * 255.0);
if (segmentIndex == 0){
- gl_FragData[0] = vec4(0.0, 1.0, 1.0, 0.0);
+ gl_FragData[0] = vec4(0.0, 0.0, 0.0, 0.0);
return;
}
@@ -383,7 +389,7 @@ function vtkOpenGLImageMapper(publicAPI, model) {
gl_FragCoord.y + float(j),
gl_FragCoord.z, gl_FragCoord.w);
vec3 neighborPosIS = fragCoordToIndexSpace(neighborPixelCoord);
- float value = texture2D(texture1, neighborPosIS.xy).r;
+ float value = texture2D(texture1, getSliceCoords(neighborPosIS, sliceAxis)).r;
if (value != centerValue) {
pixelOnBorder = true;
break;
@@ -798,13 +804,20 @@ function vtkOpenGLImageMapper(publicAPI, model) {
const worldToIndex = image.getWorldToIndex();
const imageDimensions = image.getDimensions();
+ let sliceAxis = model.renderable.getClosestIJKAxis().ijkMode;
+
+ // SlicingMode.NONE equates to SlicingMode.K
+ if (sliceAxis === SlicingMode.NONE) {
+ sliceAxis = SlicingMode.K;
+ }
program.setUniform3i(
'imageDimensions',
imageDimensions[0],
imageDimensions[1],
- 1
+ imageDimensions[2]
);
+ program.setUniformi('sliceAxis', sliceAxis);
program.setUniformMatrix('vWCtoIDX', worldToIndex);
const labelOutlineKeyMats = model.openGLCamera.getKeyMatrices(ren);
@@ -1354,7 +1367,7 @@ function vtkOpenGLImageMapper(publicAPI, model) {
publicAPI.updatelabelOutlineThicknessTexture = (image) => {
const labelOutlineThicknessArray = image
.getProperty()
- .getLabelOutlineThickness();
+ .getLabelOutlineThicknessByReference();
const lTex = model._openGLRenderWindow.getGraphicsResourceForObject(
labelOutlineThicknessArray
diff --git a/Sources/Rendering/OpenGL/ImageMapper/test/testImageCroppingPlanes.js b/Sources/Rendering/OpenGL/ImageMapper/test/testImageCroppingPlanes.js
index 27f4796b403..78f6494ebaf 100644
--- a/Sources/Rendering/OpenGL/ImageMapper/test/testImageCroppingPlanes.js
+++ b/Sources/Rendering/OpenGL/ImageMapper/test/testImageCroppingPlanes.js
@@ -24,7 +24,7 @@ function testClippingPlanes(
baseline,
description
) {
- const gc = testUtils.createGarbageCollector(t);
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkOpenGLImageMapper testImage');
// Create some control UI
@@ -136,26 +136,29 @@ function testClippingPlanes(
renderWindow.addView(glwindow);
glwindow.setSize(400, 400);
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline],
- `Rendering/OpenGL/ImageMapper${description}`,
- t,
- 3,
- gc.releaseResources
- );
- });
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline],
+ `Rendering/OpenGL/ImageMapper${description}`,
+ t,
+ 3
+ )
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
+ return promise;
}
-test.onlyIfWebGL('Test ImageMapper ClippingPlanes No Rotation', (t) => {
+test.onlyIfWebGL('Test ImageMapper ClippingPlanes No Rotation', async (t) => {
const direction = [1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0];
const rotation = 0.0;
const clipPlaneNormal = [1.0, 0.0, 0.0];
const description = 'NoRotation';
- testClippingPlanes(
+ await testClippingPlanes(
t,
direction,
rotation,
@@ -165,12 +168,12 @@ test.onlyIfWebGL('Test ImageMapper ClippingPlanes No Rotation', (t) => {
);
});
-test.onlyIfWebGL('Test ImageMapper ClippingPlanes Rotation', (t) => {
+test.onlyIfWebGL('Test ImageMapper ClippingPlanes Rotation', async (t) => {
const direction = [0.866, 0.5, 0, -0.5, 0.866, 0, 0, 0, 1];
const rotation = 30.0;
const clipPlaneNormal = [1.0, 0.0, 0.0];
const description = 'Rotation';
- testClippingPlanes(
+ await testClippingPlanes(
t,
direction,
rotation,
@@ -180,17 +183,20 @@ test.onlyIfWebGL('Test ImageMapper ClippingPlanes Rotation', (t) => {
);
});
-test.onlyIfWebGL('Test ImageMapper ClippingPlanes Rotation Clip Plane', (t) => {
- const direction = [0.866, 0.5, 0, -0.5, 0.866, 0, 0, 0, 1];
- const rotation = 30.0;
- const clipPlaneNormal = [0.707, 0.707, 0.0];
- const description = 'RotationClipPlane';
- testClippingPlanes(
- t,
- direction,
- rotation,
- clipPlaneNormal,
- baselineRotationClipPlane,
- description
- );
-});
+test.onlyIfWebGL(
+ 'Test ImageMapper ClippingPlanes Rotation Clip Plane',
+ async (t) => {
+ const direction = [0.866, 0.5, 0, -0.5, 0.866, 0, 0, 0, 1];
+ const rotation = 30.0;
+ const clipPlaneNormal = [0.707, 0.707, 0.0];
+ const description = 'RotationClipPlane';
+ await testClippingPlanes(
+ t,
+ direction,
+ rotation,
+ clipPlaneNormal,
+ baselineRotationClipPlane,
+ description
+ );
+ }
+);
diff --git a/Sources/Rendering/OpenGL/ImageMapper/test/testImageIntermediateZSlice.js b/Sources/Rendering/OpenGL/ImageMapper/test/testImageIntermediateZSlice.js
index d13f1c3e350..a6f5206ca27 100644
--- a/Sources/Rendering/OpenGL/ImageMapper/test/testImageIntermediateZSlice.js
+++ b/Sources/Rendering/OpenGL/ImageMapper/test/testImageIntermediateZSlice.js
@@ -13,7 +13,7 @@ import baseline from './testImageIntermediateZSlice.png';
import { SlicingMode } from '../../../Core/ImageMapper/Constants';
test.onlyIfWebGL('Test ImageMapper intermediate slices', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkOpenGLImageMapper testImage');
// Create some control UI
@@ -94,15 +94,18 @@ test.onlyIfWebGL('Test ImageMapper intermediate slices', (t) => {
renderWindow.addView(glwindow);
glwindow.setSize(400, 400);
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline],
- 'Rendering/OpenGL/ImageMapper',
- t,
- 0.5,
- gc.releaseResources
- );
- });
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline],
+ 'Rendering/OpenGL/ImageMapper',
+ t,
+ 0.5
+ )
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
+ return promise;
});
diff --git a/Sources/Rendering/OpenGL/ImageMapper/test/testLargeScalarImage.js b/Sources/Rendering/OpenGL/ImageMapper/test/testLargeScalarImage.js
index 5489de64cfc..3f14484e249 100644
--- a/Sources/Rendering/OpenGL/ImageMapper/test/testLargeScalarImage.js
+++ b/Sources/Rendering/OpenGL/ImageMapper/test/testLargeScalarImage.js
@@ -18,7 +18,7 @@ import baseline1 from './testLargeScalarImage.png';
const { SlicingMode } = Constants;
test.onlyIfWebGL('Test Volume Rendering of Large Scalar Values', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkOpenGLVolumeMapper LargeScalars');
// DOM elements
@@ -102,15 +102,18 @@ test.onlyIfWebGL('Test Volume Rendering of Large Scalar Values', (t) => {
renderer.resetCameraClippingRange();
renderer.getActiveCamera().setParallelProjection(true);
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline1],
- 'Rendering/OpenGL/ImageMapper/testLargeScalarsImage',
- t,
- 1.5,
- gc.releaseResources
- );
- });
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline1],
+ 'Rendering/OpenGL/ImageMapper/testLargeScalarsImage',
+ t,
+ 1.5
+ )
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
+ return promise;
});
diff --git a/Sources/Rendering/OpenGL/ImageResliceMapper/index.js b/Sources/Rendering/OpenGL/ImageResliceMapper/index.js
index 68396fb4eab..8fe984a42be 100644
--- a/Sources/Rendering/OpenGL/ImageResliceMapper/index.js
+++ b/Sources/Rendering/OpenGL/ImageResliceMapper/index.js
@@ -1131,6 +1131,10 @@ function vtkOpenGLImageResliceMapper(publicAPI, model) {
shaders.Fragment = FSSource;
};
+ /**
+ * Returns true if the normal is almost axis aligned.
+ * Has a side effect to normalize the vector.
+ */
function isVectorAxisAligned(n) {
vtkMath.normalize(n);
const tmpN = [0, 0, 0];
@@ -1138,7 +1142,7 @@ function vtkOpenGLImageResliceMapper(publicAPI, model) {
vec3.zero(tmpN);
tmpN[i] = 1.0;
const dotP = vtkMath.dot(n, tmpN);
- if (dotP < -0.999 || dotP > 0.999) {
+ if (dotP < -0.999999 || dotP > 0.999999) {
return [true, i];
}
}
diff --git a/Sources/Rendering/OpenGL/ImageSlice/test/testForceRenderPass.js b/Sources/Rendering/OpenGL/ImageSlice/test/testForceRenderPass.js
index 0a7099c3fb3..3dbad90ca3c 100644
--- a/Sources/Rendering/OpenGL/ImageSlice/test/testForceRenderPass.js
+++ b/Sources/Rendering/OpenGL/ImageSlice/test/testForceRenderPass.js
@@ -14,7 +14,7 @@ import forceTranslucentBaseline from './testForceTranslucent.png';
import { SlicingMode } from '../../../Core/ImageMapper/Constants';
const setupSlices = (t) => {
- const gc = testUtils.createGarbageCollector(t);
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkOpenGLImageMapper testImage');
// Create some control UI
@@ -93,17 +93,20 @@ test.onlyIfWebGL('Test ImageMapper forceOpaque', (t) => {
// Make actorBelow get rendered in same pass as actorAbove
actorBelow.setForceOpaque(true);
- glWindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [forceOpaqueBaseline],
- 'Rendering/OpenGL/ImageSlice',
- t,
- 0.5,
- gc.releaseResources
- );
- });
+ const promise = glWindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [forceOpaqueBaseline],
+ 'Rendering/OpenGL/ImageSlice',
+ t,
+ 0.5
+ )
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
+ return promise;
});
test.onlyIfWebGL('Test ImageMapper forceTranslucent', (t) => {
@@ -114,15 +117,18 @@ test.onlyIfWebGL('Test ImageMapper forceTranslucent', (t) => {
// keep translucent blending
actorAbove.setForceTranslucent(true);
- glWindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [forceTranslucentBaseline],
- 'Rendering/OpenGL/ImageSlice',
- t,
- 0.5,
- gc.releaseResources
- );
- });
+ const promise = glWindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [forceTranslucentBaseline],
+ 'Rendering/OpenGL/ImageSlice',
+ t,
+ 0.5
+ )
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
+ return promise;
});
diff --git a/Sources/Rendering/OpenGL/PolyDataMapper/test/testAddShaderReplacements.js b/Sources/Rendering/OpenGL/PolyDataMapper/test/testAddShaderReplacements.js
index 05db537f71f..529648fd988 100644
--- a/Sources/Rendering/OpenGL/PolyDataMapper/test/testAddShaderReplacements.js
+++ b/Sources/Rendering/OpenGL/PolyDataMapper/test/testAddShaderReplacements.js
@@ -11,7 +11,7 @@ import vtkOBJReader from 'vtk.js/Sources/IO/Misc/OBJReader';
import baseline from './testAddShaderReplacement.png';
test.onlyIfWebGL('Test Add Shader Replacements', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkOpenGLPolyDataMapper AddShaderReplacements');
// Create some control UI
@@ -71,7 +71,7 @@ test.onlyIfWebGL('Test Add Shader Replacements', (t) => {
actor.getProperty().setOpacity(1.0);
renderer.addActor(actor);
- reader
+ return reader
.setUrl(
`${__BASE_PATH__}/Data/obj/space-shuttle-orbiter/space-shuttle-orbiter.obj`
)
@@ -122,16 +122,19 @@ test.onlyIfWebGL('Test Add Shader Replacements', (t) => {
renderWindow.addView(glwindow);
glwindow.setSize(400, 400);
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline],
- 'Rendering/OpenGL/PolyDataMapper/testShaderReplacementsAdd',
- t,
- 1.5,
- gc.releaseResources
- );
- });
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline],
+ 'Rendering/OpenGL/PolyDataMapper/testShaderReplacementsAdd',
+ t,
+ 1.5
+ )
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
+ return promise;
});
});
diff --git a/Sources/Rendering/OpenGL/PolyDataMapper/test/testClearShaderReplacements.js b/Sources/Rendering/OpenGL/PolyDataMapper/test/testClearShaderReplacements.js
index d82ce189915..e6a82c9848a 100644
--- a/Sources/Rendering/OpenGL/PolyDataMapper/test/testClearShaderReplacements.js
+++ b/Sources/Rendering/OpenGL/PolyDataMapper/test/testClearShaderReplacements.js
@@ -11,7 +11,7 @@ import vtkOBJReader from 'vtk.js/Sources/IO/Misc/OBJReader';
import baseline from './testClearShaderReplacement.png';
test.onlyIfWebGL('Test Clear Shader Replacements', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkOpenGLPolyDataMapper ClearShaderReplacements');
// Create some control UI
@@ -77,7 +77,7 @@ test.onlyIfWebGL('Test Clear Shader Replacements', (t) => {
actor.getProperty().setOpacity(1.0);
renderer.addActor(actor);
- reader
+ return reader
.setUrl(
`${__BASE_PATH__}/Data/obj/space-shuttle-orbiter/space-shuttle-orbiter.obj`
)
@@ -111,16 +111,19 @@ test.onlyIfWebGL('Test Clear Shader Replacements', (t) => {
renderWindow.addView(glwindow);
glwindow.setSize(400, 400);
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline],
- 'Rendering/OpenGL/PolyDataMapper/testShaderReplacementsClear',
- t,
- 1.5,
- gc.releaseResources
- );
- });
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline],
+ 'Rendering/OpenGL/PolyDataMapper/testShaderReplacementsClear',
+ t,
+ 1.5
+ )
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
+ return promise;
});
});
diff --git a/Sources/Rendering/OpenGL/PolyDataMapper/test/testClippingPlanes.js b/Sources/Rendering/OpenGL/PolyDataMapper/test/testClippingPlanes.js
index ec34002f9c0..03f47592dc3 100644
--- a/Sources/Rendering/OpenGL/PolyDataMapper/test/testClippingPlanes.js
+++ b/Sources/Rendering/OpenGL/PolyDataMapper/test/testClippingPlanes.js
@@ -12,7 +12,7 @@ import vtkRenderWindow from 'vtk.js/Sources/Rendering/Core/RenderWindow';
import baseline from './testClippingPlanes.png';
test.onlyIfWebGL('Test Clipping planes', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkOpenGLPolyDataMapper setClippingPlanes');
// Create some control UI
@@ -83,15 +83,12 @@ test.onlyIfWebGL('Test Clipping planes', (t) => {
renderWindow.addView(glwindow);
glwindow.setSize(400, 400);
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline],
- 'TestClippingPlanes',
- t,
- 2.5,
- gc.releaseResources
- );
- });
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(image, [baseline], 'TestClippingPlanes', t, 2.5)
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
+ return promise;
});
diff --git a/Sources/Rendering/OpenGL/PolyDataMapper/test/testMoreClippingPlanes.js b/Sources/Rendering/OpenGL/PolyDataMapper/test/testMoreClippingPlanes.js
index 2bc29f558fd..fff092d4857 100644
--- a/Sources/Rendering/OpenGL/PolyDataMapper/test/testMoreClippingPlanes.js
+++ b/Sources/Rendering/OpenGL/PolyDataMapper/test/testMoreClippingPlanes.js
@@ -12,9 +12,8 @@ import vtkPlane from 'vtk.js/Sources/Common/DataModel/Plane';
import testUtils from 'vtk.js/Sources/Testing/testUtils';
import baseline from './testMoreClippingPlanes.png';
-test('Test PolyDataMapper Clipping Planes 2', (t) => {
- const gc = testUtils.createGarbageCollector(t);
- // TODO switch back to onlyIfWebGL
+test.onlyIfWebGL('Test PolyDataMapper Clipping Planes 2', (t) => {
+ const gc = testUtils.createGarbageCollector();
// Create some control UI
const container = document.querySelector('body');
const renderWindowContainer = gc.registerDOMElement(
@@ -125,15 +124,12 @@ test('Test PolyDataMapper Clipping Planes 2', (t) => {
vtkMath.multiply3x3_vect3(rotationMatrix, normal, normal);
}
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline],
- 'TestMoreClippingPlanes',
- t,
- 2,
- gc.releaseResources
- );
- });
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(image, [baseline], 'TestMoreClippingPlanes', t, 2)
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
+ return promise;
});
diff --git a/Sources/Rendering/OpenGL/Skybox/test/testSkybox.js b/Sources/Rendering/OpenGL/Skybox/test/testSkybox.js
index 5b5c6794031..a1b2aeee525 100644
--- a/Sources/Rendering/OpenGL/Skybox/test/testSkybox.js
+++ b/Sources/Rendering/OpenGL/Skybox/test/testSkybox.js
@@ -12,7 +12,7 @@ import testUtils from 'vtk.js/Sources/Testing/testUtils';
import baseline from './testSkybox.png';
test.onlyIfWebGL('Test vtkOpenGLSkybox Rendering', async (t) => {
- const gc = testUtils.createGarbageCollector(t);
+ const gc = testUtils.createGarbageCollector();
t.ok('Rendering', 'Filter: OpenGLTexture');
function onLoadedTextures(loadedTextures) {
@@ -55,8 +55,7 @@ test.onlyIfWebGL('Test vtkOpenGLSkybox Rendering', async (t) => {
[baseline],
'Rendering/OpenGL/Skybox/',
t,
- 0.5,
- gc.releaseResources
+ 0.5
)
);
renderWindow.render();
@@ -85,5 +84,7 @@ test.onlyIfWebGL('Test vtkOpenGLSkybox Rendering', async (t) => {
texturePathList.push(`${path}back.jpg`); // +z
texturePathList.push(`${path}front.jpg`); // -z is front from inside a cube
- return onLoadedTextures(await loadTextures(texturePathList));
+ return onLoadedTextures(await loadTextures(texturePathList)).finally(
+ gc.releaseResources
+ );
});
diff --git a/Sources/Rendering/OpenGL/Skybox/test/testSkyboxBackground.js b/Sources/Rendering/OpenGL/Skybox/test/testSkyboxBackground.js
index 5916b52ab69..17ef1eab924 100644
--- a/Sources/Rendering/OpenGL/Skybox/test/testSkyboxBackground.js
+++ b/Sources/Rendering/OpenGL/Skybox/test/testSkyboxBackground.js
@@ -11,7 +11,7 @@ import testUtils from 'vtk.js/Sources/Testing/testUtils';
import baseline from './testSkyboxBackground.png';
test.onlyIfWebGL('Test vtkOpenGLSkybox Background Rendering', async (t) => {
- const gc = testUtils.createGarbageCollector(t);
+ const gc = testUtils.createGarbageCollector();
t.ok('Rendering', 'Filter: OpenGLTexture');
function onLoadedTexture(loadedTexture) {
@@ -53,8 +53,7 @@ test.onlyIfWebGL('Test vtkOpenGLSkybox Background Rendering', async (t) => {
[baseline],
'Rendering/OpenGL/Skybox/',
t,
- 0.5,
- gc.releaseResources
+ 0.5
)
);
renderWindow.render();
@@ -75,5 +74,5 @@ test.onlyIfWebGL('Test vtkOpenGLSkybox Background Rendering', async (t) => {
const path = `${__BASE_PATH__}/Data/skybox/mountains/right.jpg`;
// It will contains all vtkImageData which will textured the cube
- return onLoadedTexture(await loadTexture(path));
+ return onLoadedTexture(await loadTexture(path)).finally(gc.releaseResources);
});
diff --git a/Sources/Rendering/OpenGL/Texture/index.js b/Sources/Rendering/OpenGL/Texture/index.js
index 6ab1b33a542..ce0b7d2bda1 100644
--- a/Sources/Rendering/OpenGL/Texture/index.js
+++ b/Sources/Rendering/OpenGL/Texture/index.js
@@ -7,6 +7,8 @@ import vtkViewNode from 'vtk.js/Sources/Rendering/SceneGraph/ViewNode';
import { registerOverride } from 'vtk.js/Sources/Rendering/OpenGL/ViewNodeFactory';
+import supportsNorm16Linear from './supportsNorm16Linear';
+
const { Wrap, Filter } = Constants;
const { VtkDataTypes } = vtkDataArray;
const { vtkDebugMacro, vtkErrorMacro, vtkWarningMacro } = macro;
@@ -160,6 +162,17 @@ function vtkOpenGLTexture(publicAPI, model) {
}
};
+ const getNorm16Ext = () => {
+ if (
+ (model.minificationFilter === Filter.LINEAR ||
+ model.magnificationFilter === Filter.LINEAR) &&
+ !supportsNorm16Linear()
+ ) {
+ return undefined;
+ }
+ return model.oglNorm16Ext;
+ };
+
//----------------------------------------------------------------------------
publicAPI.destroyTexture = () => {
// deactivate it first
@@ -391,7 +404,7 @@ function vtkOpenGLTexture(publicAPI, model) {
result = model._openGLRenderWindow.getDefaultTextureInternalFormat(
vtktype,
numComps,
- model.oglNorm16Ext,
+ getNorm16Ext(),
publicAPI.useHalfFloat()
);
if (result) {
@@ -478,9 +491,9 @@ function vtkOpenGLTexture(publicAPI, model) {
return model.context.UNSIGNED_BYTE;
// prefer norm16 since that is accurate compared to
// half float which is not
- case model.oglNorm16Ext && !useHalfFloat && VtkDataTypes.SHORT:
+ case getNorm16Ext() && !useHalfFloat && VtkDataTypes.SHORT:
return model.context.SHORT;
- case model.oglNorm16Ext && !useHalfFloat && VtkDataTypes.UNSIGNED_SHORT:
+ case getNorm16Ext() && !useHalfFloat && VtkDataTypes.UNSIGNED_SHORT:
return model.context.UNSIGNED_SHORT;
// use half float type
case useHalfFloat && VtkDataTypes.SHORT:
@@ -820,7 +833,7 @@ function vtkOpenGLTexture(publicAPI, model) {
if (
webGLInfo.RENDERER.value.match(/WebKit/gi) &&
navigator.platform.match(/Mac/gi) &&
- model.oglNorm16Ext &&
+ getNorm16Ext() &&
(dataType === VtkDataTypes.UNSIGNED_SHORT ||
dataType === VtkDataTypes.SHORT)
) {
@@ -925,7 +938,7 @@ function vtkOpenGLTexture(publicAPI, model) {
numComps *
model._openGLRenderWindow.getDefaultTextureByteSize(
dataType,
- model.oglNorm16Ext,
+ getNorm16Ext(),
publicAPI.useHalfFloat()
);
publicAPI.deactivate();
@@ -1049,7 +1062,7 @@ function vtkOpenGLTexture(publicAPI, model) {
numComps *
model._openGLRenderWindow.getDefaultTextureByteSize(
dataType,
- model.oglNorm16Ext,
+ getNorm16Ext(),
publicAPI.useHalfFloat()
);
// generateMipmap must not be called here because we manually upload all levels
@@ -1138,7 +1151,7 @@ function vtkOpenGLTexture(publicAPI, model) {
model.components *
model._openGLRenderWindow.getDefaultTextureByteSize(
dataType,
- model.oglNorm16Ext,
+ getNorm16Ext(),
publicAPI.useHalfFloat()
);
@@ -1248,7 +1261,7 @@ function vtkOpenGLTexture(publicAPI, model) {
model.components *
model._openGLRenderWindow.getDefaultTextureByteSize(
VtkDataTypes.UNSIGNED_CHAR,
- model.oglNorm16Ext,
+ getNorm16Ext(),
publicAPI.useHalfFloat()
);
@@ -1401,11 +1414,7 @@ function vtkOpenGLTexture(publicAPI, model) {
}
// Handle SHORT data type with EXT_texture_norm16 extension
- if (
- model.oglNorm16Ext &&
- !useHalfFloat &&
- dataType === VtkDataTypes.SHORT
- ) {
+ if (getNorm16Ext() && !useHalfFloat && dataType === VtkDataTypes.SHORT) {
for (let c = 0; c < numComps; ++c) {
model.volumeInfo.scale[c] = 32767.0; // Scale to [-1, 1] range
}
@@ -1414,7 +1423,7 @@ function vtkOpenGLTexture(publicAPI, model) {
// Handle UNSIGNED_SHORT data type with EXT_texture_norm16 extension
if (
- model.oglNorm16Ext &&
+ getNorm16Ext() &&
!useHalfFloat &&
dataType === VtkDataTypes.UNSIGNED_SHORT
) {
@@ -1569,7 +1578,7 @@ function vtkOpenGLTexture(publicAPI, model) {
model.components *
model._openGLRenderWindow.getDefaultTextureByteSize(
dataTypeToUse,
- model.oglNorm16Ext,
+ getNorm16Ext(),
publicAPI.useHalfFloat()
);
diff --git a/Sources/Rendering/OpenGL/Texture/supportsNorm16Linear.js b/Sources/Rendering/OpenGL/Texture/supportsNorm16Linear.js
new file mode 100644
index 00000000000..dcdddf0cf74
--- /dev/null
+++ b/Sources/Rendering/OpenGL/Texture/supportsNorm16Linear.js
@@ -0,0 +1,129 @@
+/**
+ * Even when the EXT_texture_norm16 extension is present, linear filtering
+ * might not be supported for normalized fixed point textures.
+ *
+ * This is a driver bug. See https://github.com/KhronosGroup/WebGL/issues/3706
+ * @return {boolean}
+ */
+function supportsNorm16Linear() {
+ try {
+ const canvasSize = 4;
+ const texWidth = 2;
+ const texHeight = 1;
+ const texData = new Int16Array([0, 2 ** 15 - 1]);
+ const pixelToCheck = [1, 1];
+
+ const canvas = document.createElement('canvas');
+ canvas.width = canvasSize;
+ canvas.height = canvasSize;
+ const gl = canvas.getContext('webgl2');
+ if (!gl) {
+ return false;
+ }
+
+ const ext = gl.getExtension('EXT_texture_norm16');
+ if (!ext) {
+ return false;
+ }
+
+ const vs = `#version 300 es
+ void main() {
+ gl_PointSize = ${canvasSize.toFixed(1)};
+ gl_Position = vec4(0, 0, 0, 1);
+ }
+ `;
+ const fs = `#version 300 es
+ precision highp float;
+ precision highp int;
+ precision highp sampler2D;
+
+ uniform sampler2D u_image;
+
+ out vec4 color;
+
+ void main() {
+ vec4 intColor = texture(u_image, gl_PointCoord.xy);
+ color = vec4(vec3(intColor.rrr), 1);
+ }
+ `;
+
+ const vertexShader = gl.createShader(gl.VERTEX_SHADER);
+ gl.shaderSource(vertexShader, vs);
+ gl.compileShader(vertexShader);
+ if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {
+ return false;
+ }
+
+ const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
+ gl.shaderSource(fragmentShader, fs);
+ gl.compileShader(fragmentShader);
+ if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {
+ return false;
+ }
+
+ const program = gl.createProgram();
+ gl.attachShader(program, vertexShader);
+ gl.attachShader(program, fragmentShader);
+ gl.linkProgram(program);
+
+ if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
+ return false;
+ }
+
+ const tex = gl.createTexture();
+ gl.bindTexture(gl.TEXTURE_2D, tex);
+ gl.texImage2D(
+ gl.TEXTURE_2D,
+ 0,
+ ext.R16_SNORM_EXT,
+ texWidth,
+ texHeight,
+ 0,
+ gl.RED,
+ gl.SHORT,
+ texData
+ );
+
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
+ gl.useProgram(program);
+ gl.drawArrays(gl.POINTS, 0, 1);
+
+ const pixel = new Uint8Array(4);
+ gl.readPixels(
+ pixelToCheck[0],
+ pixelToCheck[1],
+ 1,
+ 1,
+ gl.RGBA,
+ gl.UNSIGNED_BYTE,
+ pixel
+ );
+ const [r, g, b] = pixel;
+
+ const webglLoseContext = gl.getExtension('WEBGL_lose_context');
+ if (webglLoseContext) {
+ webglLoseContext.loseContext();
+ }
+
+ return r === g && g === b && r !== 0;
+ } catch (e) {
+ return false;
+ }
+}
+
+/**
+ * @type {boolean | undefined}
+ */
+let supportsNorm16LinearCache;
+
+function supportsNorm16LinearCached() {
+ // Only create a canvas+texture+shaders the first time
+ if (supportsNorm16LinearCache === undefined) {
+ supportsNorm16LinearCache = supportsNorm16Linear();
+ }
+
+ return supportsNorm16LinearCache;
+}
+
+export default supportsNorm16LinearCached;
diff --git a/Sources/Rendering/OpenGL/Texture/test/testCreateCubeFromRawTexture.js b/Sources/Rendering/OpenGL/Texture/test/testCreateCubeFromRawTexture.js
index 1bb7945e01f..60ada12570d 100644
--- a/Sources/Rendering/OpenGL/Texture/test/testCreateCubeFromRawTexture.js
+++ b/Sources/Rendering/OpenGL/Texture/test/testCreateCubeFromRawTexture.js
@@ -14,7 +14,7 @@ import testUtils from 'vtk.js/Sources/Testing/testUtils';
import baseline from './testCreateCubeFromRawTexture.png';
test.onlyIfWebGL('Test vtkOpenGLTexture Rendering', async (t) => {
- const gc = testUtils.createGarbageCollector(t);
+ const gc = testUtils.createGarbageCollector();
t.ok('Rendering', 'Filter: OpenGLTexture');
function onLoadedTextures(loadedTextures) {
@@ -72,8 +72,7 @@ test.onlyIfWebGL('Test vtkOpenGLTexture Rendering', async (t) => {
[baseline],
'Rendering/OpenGL/Texture/',
t,
- 0.5,
- gc.releaseResources
+ 0.5
)
);
renderWindow.render();
@@ -102,5 +101,7 @@ test.onlyIfWebGL('Test vtkOpenGLTexture Rendering', async (t) => {
texturePathList.push(`${path}front.jpg`); // front is +z on a cube
texturePathList.push(`${path}back.jpg`);
- return onLoadedTextures(await loadTexture(texturePathList));
+ return onLoadedTextures(await loadTexture(texturePathList)).finally(
+ gc.releaseResources
+ );
});
diff --git a/Sources/Rendering/OpenGL/VolumeMapper/test/testLargeScalarVolume.js b/Sources/Rendering/OpenGL/VolumeMapper/test/testLargeScalarVolume.js
index 0a729ca02fa..c8d876e9b01 100644
--- a/Sources/Rendering/OpenGL/VolumeMapper/test/testLargeScalarVolume.js
+++ b/Sources/Rendering/OpenGL/VolumeMapper/test/testLargeScalarVolume.js
@@ -15,7 +15,7 @@ import vtkVolumeMapper from 'vtk.js/Sources/Rendering/Core/VolumeMapper';
import baseline1 from './testLargeScalars.png';
test.onlyIfWebGL('Test Volume Rendering of Large Scalar Values', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkOpenGLVolumeMapper LargeScalars');
// testUtils.keepDOM();
@@ -122,15 +122,18 @@ test.onlyIfWebGL('Test Volume Rendering of Large Scalar Values', (t) => {
renderer.getActiveCamera().elevation(70);
renderer.resetCameraClippingRange();
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline1],
- 'Rendering/OpenGL/VolumeMapper/testLargeScalarsVolume',
- t,
- 1.5,
- gc.releaseResources
- );
- });
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline1],
+ 'Rendering/OpenGL/VolumeMapper/testLargeScalarsVolume',
+ t,
+ 1.5
+ )
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
+ return promise;
});
diff --git a/Sources/Rendering/OpenGL/VolumeMapper/test/testLighting.js b/Sources/Rendering/OpenGL/VolumeMapper/test/testLighting.js
index 913e0356cc9..b80100fab64 100644
--- a/Sources/Rendering/OpenGL/VolumeMapper/test/testLighting.js
+++ b/Sources/Rendering/OpenGL/VolumeMapper/test/testLighting.js
@@ -16,7 +16,7 @@ import baseline1 from './testLighting.png';
import baseline2 from './testLighting_2.png';
test.onlyIfWebGL('Test Lighted Volume Rendering', async (t) => {
- const gc = testUtils.createGarbageCollector(t);
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkOpenGLVolumeMapper Lighting');
// testUtils.keepDOM();
@@ -105,10 +105,10 @@ test.onlyIfWebGL('Test Lighted Volume Rendering', async (t) => {
[baseline1, baseline2],
'Rendering/OpenGL/VolumeMapper/testLighting',
t,
- 0.05,
- gc.releaseResources
+ 0.05
)
- );
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
return promise;
});
diff --git a/Sources/Rendering/OpenGL/VolumeMapper/test/testProportionalComponents.js b/Sources/Rendering/OpenGL/VolumeMapper/test/testProportionalComponents.js
index f1f490f7d9f..6833da5c666 100644
--- a/Sources/Rendering/OpenGL/VolumeMapper/test/testProportionalComponents.js
+++ b/Sources/Rendering/OpenGL/VolumeMapper/test/testProportionalComponents.js
@@ -16,7 +16,7 @@ import { OpacityMode } from 'vtk.js/Sources/Rendering/Core/VolumeProperty/Consta
import baseline1 from './testProportionalComponents.png';
test.onlyIfWebGL('Test Volume Rendering with Proportional Component', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkOpenGLVolumeMapper ProportionalComponent');
// testUtils.keepDOM();
@@ -168,15 +168,18 @@ test.onlyIfWebGL('Test Volume Rendering with Proportional Component', (t) => {
renderer.getActiveCamera().setFocalPoint(center[0], center[1], center[2]);
renderer.resetCameraClippingRange();
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline1],
- 'Rendering/OpenGL/VolumeMapper/testProportionalComponents',
- t,
- 1.5,
- gc.releaseResources
- );
- });
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline1],
+ 'Rendering/OpenGL/VolumeMapper/testProportionalComponents',
+ t,
+ 1.5
+ )
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
+ return promise;
});
diff --git a/Sources/Rendering/OpenGL/VolumeMapper/test/testVolumeMapperBounds.js b/Sources/Rendering/OpenGL/VolumeMapper/test/testVolumeMapperBounds.js
index 5c784dd6f3b..844562a780f 100644
--- a/Sources/Rendering/OpenGL/VolumeMapper/test/testVolumeMapperBounds.js
+++ b/Sources/Rendering/OpenGL/VolumeMapper/test/testVolumeMapperBounds.js
@@ -14,7 +14,7 @@ import vtkRenderWindowInteractor from 'vtk.js/Sources/Rendering/Core/RenderWindo
import baseline1 from './testVolumeMapperBounds.png';
test.onlyIfWebGL('Test Volume Mapper Bounds', async (t) => {
- const gc = testUtils.createGarbageCollector(t);
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkVolumeMapper Bounds');
// testUtils.keepDOM();
@@ -82,10 +82,10 @@ test.onlyIfWebGL('Test Volume Mapper Bounds', async (t) => {
[baseline1],
'Rendering/Core/VolumeMapper/testVolumeMapperBounds',
t,
- 1.5,
- gc.releaseResources
+ 1.5
)
- );
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
return promise;
diff --git a/Sources/Rendering/OpenGL/VolumeMapper/test/testVolumeMapperClip.js b/Sources/Rendering/OpenGL/VolumeMapper/test/testVolumeMapperClip.js
index 8ab9938d040..d1344e4fcfa 100644
--- a/Sources/Rendering/OpenGL/VolumeMapper/test/testVolumeMapperClip.js
+++ b/Sources/Rendering/OpenGL/VolumeMapper/test/testVolumeMapperClip.js
@@ -19,7 +19,7 @@ import 'vtk.js/Sources/IO/Core/DataAccessHelper/HttpDataAccessHelper';
import baseline from './testVolumeMapperClip.png';
test.onlyIfWebGL('Test Volume Mapper Clip', async (t) => {
- const gc = testUtils.createGarbageCollector(t);
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkVolumeMapper Clip');
// testUtils.keepDOM();
@@ -112,10 +112,10 @@ test.onlyIfWebGL('Test Volume Mapper Clip', async (t) => {
[baseline],
'Rendering/Core/VolumeMapper/testVolumeMapperClip',
t,
- 1.5,
- gc.releaseResources
+ 1.5
)
- );
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
return promise;
});
diff --git a/Sources/Rendering/OpenGL/VolumeMapper/test/testVolumeMapperShadowClip.js b/Sources/Rendering/OpenGL/VolumeMapper/test/testVolumeMapperShadowClip.js
index 777aa4615f5..f5cba0b9572 100644
--- a/Sources/Rendering/OpenGL/VolumeMapper/test/testVolumeMapperShadowClip.js
+++ b/Sources/Rendering/OpenGL/VolumeMapper/test/testVolumeMapperShadowClip.js
@@ -20,7 +20,7 @@ import baseline from './testVolumeMapperShadowClip.png';
// Test the volume mapper with clipping combined with volumetric scattering
// This tests that the rays cast for volumetric shadow calculation ignore clipped voxels.
test.onlyIfWebGL('Test Volume Mapper Shadow Clip', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+ const gc = testUtils.createGarbageCollector();
t.ok('rendering', 'vtkVolumeMapper Shadow Clip');
// Create some control UI
@@ -127,15 +127,18 @@ test.onlyIfWebGL('Test Volume Mapper Shadow Clip', (t) => {
cam.roll(45);
renderer.resetCameraClippingRange();
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline],
- 'Rendering/Core/VolumeMapper/testVolumeMapperClip',
- t,
- 1.5,
- gc.releaseResources
- );
- });
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline],
+ 'Rendering/Core/VolumeMapper/testVolumeMapperClip',
+ t,
+ 1.5
+ )
+ )
+ .finally(gc.releaseResources);
renderWindow.render();
+ return promise;
});
diff --git a/Sources/Testing/index.js b/Sources/Testing/index.js
index bc1b2b2524e..229c53343c2 100644
--- a/Sources/Testing/index.js
+++ b/Sources/Testing/index.js
@@ -9,5 +9,5 @@ import './setupTestEnv';
// webpack will include files that match the regex
// '..' refers to the Sources/ dir
-const testsContext = require.context('..', true, /test[^/]*\.js$/);
+const testsContext = require.context('..', true, /test[^/]+\.js$/);
testsContext.keys().forEach(testsContext);
diff --git a/Sources/Testing/testUtils.js b/Sources/Testing/testUtils.js
index 18029ae0f73..b0531544b5f 100644
--- a/Sources/Testing/testUtils.js
+++ b/Sources/Testing/testUtils.js
@@ -31,14 +31,7 @@ function getImageDataFromURI(imageDataURI) {
* @param tapeContext tape testing context
* @param opts if number: mismatch tolerance. if object: tolerance and pixel threshold
*/
-async function compareImages(
- image,
- baselines,
- testName,
- tapeContext,
- opts,
- nextCallback
-) {
+async function compareImages(image, baselines, testName, tapeContext, opts) {
// defaults
let pixelThreshold = 0.1;
let mismatchTolerance = 5; // percent
@@ -109,12 +102,6 @@ async function compareImages(
expected: mismatchTolerance,
}
);
-
- if (nextCallback) {
- nextCallback();
- } else {
- tapeContext.end();
- }
}
function createGarbageCollector(testContext) {
diff --git a/Sources/Widgets/Core/WidgetManager/test/testWidgetManager.js b/Sources/Widgets/Core/WidgetManager/test/testWidgetManager.js
index 6d78908d556..c1b9403b845 100644
--- a/Sources/Widgets/Core/WidgetManager/test/testWidgetManager.js
+++ b/Sources/Widgets/Core/WidgetManager/test/testWidgetManager.js
@@ -30,7 +30,7 @@ test('Test vtkWidgetManager', (t) => {
});
test.onlyIfWebGL('Test getPixelWorldHeightAtCoord', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+ const gc = testUtils.createGarbageCollector();
const container = document.querySelector('body');
const rwContainer = gc.registerDOMElement(document.createElement('div'));
@@ -67,23 +67,18 @@ test.onlyIfWebGL('Test getPixelWorldHeightAtCoord', (t) => {
camera.setParallelProjection(false);
camera.setParallelScale(1);
- let resolve;
- const promise = new Promise((res) => {
- resolve = res;
- });
- grw
+ const promise = grw
.getApiSpecificRenderWindow()
.captureNextImage()
- .then((image) => {
+ .then((image) =>
testUtils.compareImages(
image,
[noScaleInPixelsWithPerspectiveBaseline],
'Widgets/Core/WidgetManager/test/testNoScaleInPixelsWithPerspective',
t,
- 0.5,
- resolve
- );
- });
+ 0.5
+ )
+ );
// Trigger a next image
grw.getInteractor().render();
return promise;
@@ -97,23 +92,18 @@ test.onlyIfWebGL('Test getPixelWorldHeightAtCoord', (t) => {
camera.setParallelProjection(true);
camera.setParallelScale(100);
- let resolve;
- const promise = new Promise((res) => {
- resolve = res;
- });
- grw
+ const promise = grw
.getApiSpecificRenderWindow()
.captureNextImage()
- .then((image) => {
+ .then((image) =>
testUtils.compareImages(
image,
[noScaleInPixelsWithParallelBaseline],
'Widgets/Core/WidgetManager/test/testNoScaleInPixelsWithParallel',
t,
- 0.5,
- resolve
- );
- });
+ 0.5
+ )
+ );
// Trigger a next image
grw.getInteractor().render();
return promise;
@@ -127,23 +117,18 @@ test.onlyIfWebGL('Test getPixelWorldHeightAtCoord', (t) => {
camera.setParallelProjection(false);
camera.setParallelScale(1);
- let resolve;
- const promise = new Promise((res) => {
- resolve = res;
- });
- grw
+ const promise = grw
.getApiSpecificRenderWindow()
.captureNextImage()
- .then((image) => {
+ .then((image) =>
testUtils.compareImages(
image,
[scaleInPixelsWithPerspectiveBaseline],
'Widgets/Core/WidgetManager/test/testScaleInPixelsWithPerspective',
t,
- 0.5,
- resolve
- );
- });
+ 0.5
+ )
+ );
// Trigger a next image
grw.getInteractor().render();
return promise;
@@ -154,33 +139,29 @@ test.onlyIfWebGL('Test getPixelWorldHeightAtCoord', (t) => {
camera.setParallelProjection(true);
camera.setParallelScale(100);
- let resolve;
- const promise = new Promise((res) => {
- resolve = res;
- });
- grw
+ const promise = grw
.getApiSpecificRenderWindow()
.captureNextImage()
- .then((image) => {
+ .then((image) =>
testUtils.compareImages(
image,
[scaleInPixelsWithParallelBaseline],
'Widgets/Core/WidgetManager/test/scaleInPixelsWithParallel',
t,
- 0.5,
- resolve
- );
- });
+ 0.5
+ )
+ );
// Trigger a next image
grw.getInteractor().render();
return promise;
}
- [
+ return [
testNoScaleInPixelsWithPerspective,
testNoScaleInPixelsWithParallel,
testScaleInPixelsWithPerspective,
testScaleInPixelsWithParallel,
- gc.releaseResources,
- ].reduce((current, next) => current.then(next), Promise.resolve());
+ ]
+ .reduce((current, next) => current.then(next), Promise.resolve())
+ .finally(gc.releaseResources);
});
diff --git a/Sources/Widgets/Widgets3D/AngleWidget/behavior.js b/Sources/Widgets/Widgets3D/AngleWidget/behavior.js
index d76532aa4bd..5a32327cd46 100644
--- a/Sources/Widgets/Widgets3D/AngleWidget/behavior.js
+++ b/Sources/Widgets/Widgets3D/AngleWidget/behavior.js
@@ -1,5 +1,6 @@
import macro from 'vtk.js/Sources/macros';
import { add } from 'vtk.js/Sources/Common/Core/Math';
+import vtkBoundingBox from 'vtk.js/Sources/Common/DataModel/BoundingBox';
import vtkPointPicker from 'vtk.js/Sources/Rendering/Core/PointPicker';
const MAX_POINTS = 3;
@@ -11,6 +12,18 @@ export default function widgetBehavior(publicAPI, model) {
const picker = vtkPointPicker.newInstance();
picker.setPickFromList(1);
+ publicAPI.getBounds = () =>
+ model.widgetState
+ .getHandleList()
+ .reduce(
+ (bounds, handle) =>
+ vtkBoundingBox.inflate(
+ vtkBoundingBox.addPoint(bounds, ...handle.getOrigin()),
+ publicAPI.getScaleInPixels() ? 0 : handle.getScale1() / 2
+ ),
+ [...vtkBoundingBox.INIT_BOUNDS]
+ );
+
// --------------------------------------------------------------------------
// Display 2D
// --------------------------------------------------------------------------
diff --git a/Sources/Widgets/Widgets3D/AngleWidget/example/index.js b/Sources/Widgets/Widgets3D/AngleWidget/example/index.js
index 7e7dd48ba2b..aca884aa793 100644
--- a/Sources/Widgets/Widgets3D/AngleWidget/example/index.js
+++ b/Sources/Widgets/Widgets3D/AngleWidget/example/index.js
@@ -42,7 +42,7 @@ widgetManager.setRenderer(renderer);
const widget = vtkAngleWidget.newInstance();
// widget.placeWidget(cube.getOutputData().getBounds());
-widgetManager.addWidget(widget);
+const widgetInView = widgetManager.addWidget(widget);
renderer.resetCamera();
widgetManager.enablePicking();
@@ -54,6 +54,8 @@ fullScreenRenderer.getInteractor().render();
fullScreenRenderer.addController(controlPanel);
+widgetInView.onEndInteractionEvent(() => renderer.resetCameraClippingRange());
+
widget.getWidgetState().onModified(() => {
document.querySelector('#angle').innerText = widget.getAngle();
});
diff --git a/Sources/Widgets/Widgets3D/ResliceCursorWidget/behavior.js b/Sources/Widgets/Widgets3D/ResliceCursorWidget/behavior.js
index 19dc07a2544..1a2d8ce9fa5 100644
--- a/Sources/Widgets/Widgets3D/ResliceCursorWidget/behavior.js
+++ b/Sources/Widgets/Widgets3D/ResliceCursorWidget/behavior.js
@@ -499,6 +499,28 @@ export default function widgetBehavior(publicAPI, model) {
};
};
+ /**
+ * Rotate a line by a specified angle
+ * @param {string} lineName The line name to rotate (e.g. YinX, ZinX, XinY, ZinY, XinZ, YinZ)
+ * @param {Number} radianAngle Applied angle in radian
+ */
+ publicAPI.setViewPlane = (viewType, normal, viewUp) => {
+ let newViewUp = viewUp;
+ if (newViewUp == null) {
+ newViewUp = model.widgetState.getPlanes()[viewType].viewUp;
+ }
+ model.widgetState.getPlanes()[viewType] = {
+ normal,
+ viewUp: newViewUp,
+ };
+
+ updateState(
+ model.widgetState,
+ model._factory.getScaleInPixels(),
+ model._factory.getRotationHandlePosition()
+ );
+ };
+
// --------------------------------------------------------------------------
// initialization
// --------------------------------------------------------------------------
diff --git a/Sources/Widgets/Widgets3D/ResliceCursorWidget/helpers.js b/Sources/Widgets/Widgets3D/ResliceCursorWidget/helpers.js
index 739905b1079..5fde4a67331 100644
--- a/Sources/Widgets/Widgets3D/ResliceCursorWidget/helpers.js
+++ b/Sources/Widgets/Widgets3D/ResliceCursorWidget/helpers.js
@@ -161,6 +161,7 @@ export function rotateVector(vectorToBeRotated, axis, angle) {
}
/**
+ * Return ['X'] if there are only 1 plane defined in the widget state.
* Return ['X', 'Y'] if there are only 2 planes defined in the widget state.
* Return ['X', 'Y', 'Z'] if there are 3 planes defined in the widget state.
* @param {object} widgetState the state of the widget
diff --git a/Sources/Widgets/Widgets3D/ShapeWidget/behavior.js b/Sources/Widgets/Widgets3D/ShapeWidget/behavior.js
index 384a1605fce..5eefcc6e42d 100644
--- a/Sources/Widgets/Widgets3D/ShapeWidget/behavior.js
+++ b/Sources/Widgets/Widgets3D/ShapeWidget/behavior.js
@@ -475,6 +475,9 @@ export default function widgetBehavior(publicAPI, model) {
const up = model._camera.getViewUp();
const right = [];
vec3.cross(right, up, normal);
+ vtkMath.normalize(right);
+ vec3.cross(up, normal, right);
+ vtkMath.normalize(up);
model.shapeHandle.setUp(up);
model.shapeHandle.setRight(right);
model.shapeHandle.setDirection(normal);
diff --git a/Sources/Widgets/Widgets3D/ShapeWidget/example/controlPanel.html b/Sources/Widgets/Widgets3D/ShapeWidget/example/controlPanel.html
index 8252a439075..eb1b9f3f4ac 100644
--- a/Sources/Widgets/Widgets3D/ShapeWidget/example/controlPanel.html
+++ b/Sources/Widgets/Widgets3D/ShapeWidget/example/controlPanel.html
@@ -9,9 +9,10 @@
Slice Axis
- I
- J
- K
+ I
+ J
+ K
+ O
diff --git a/Sources/Widgets/Widgets3D/ShapeWidget/example/index.js b/Sources/Widgets/Widgets3D/ShapeWidget/example/index.js
index 38f1bfdf7d5..834a89c2ae0 100644
--- a/Sources/Widgets/Widgets3D/ShapeWidget/example/index.js
+++ b/Sources/Widgets/Widgets3D/ShapeWidget/example/index.js
@@ -12,11 +12,14 @@ import vtkRectangleWidget from '@kitware/vtk.js/Widgets/Widgets3D/RectangleWidge
import vtkEllipseWidget from '@kitware/vtk.js/Widgets/Widgets3D/EllipseWidget';
import vtkInteractorStyleImage from '@kitware/vtk.js/Interaction/Style/InteractorStyleImage';
import vtkHttpDataSetReader from '@kitware/vtk.js/IO/Core/HttpDataSetReader';
+import vtkBoundingBox from '@kitware/vtk.js/Common/DataModel/BoundingBox';
import vtkImageMapper from '@kitware/vtk.js/Rendering/Core/ImageMapper';
import vtkImageSlice from '@kitware/vtk.js/Rendering/Core/ImageSlice';
-import vtkImplicitBoolean from '@kitware/vtk.js/Common/DataModel/ImplicitBoolean';
+import vtkImageReslice from '@kitware/vtk.js/Imaging/Core/ImageReslice';
+
import vtkMatrixBuilder from '@kitware/vtk.js/Common/Core/MatrixBuilder';
import vtkMath from '@kitware/vtk.js/Common/Core/Math';
+import vtkResliceCursorWidget from '@kitware/vtk.js/Widgets/Widgets3D/ResliceCursorWidget';
import vtkPlane from '@kitware/vtk.js/Common/DataModel/Plane';
import vtkSphere from '@kitware/vtk.js/Common/DataModel/Sphere';
import vtkTransform from '@kitware/vtk.js/Common/Transform/Transform';
@@ -37,26 +40,12 @@ import {
import { ViewTypes } from '@kitware/vtk.js/Widgets/Core/WidgetManager/Constants';
-import { vec3 } from 'gl-matrix';
+import { vec3, mat3 } from 'gl-matrix';
import controlPanel from './controlPanel.html';
const { computeWorldToDisplay } = vtkInteractorObserver;
-const { Operation } = vtkImplicitBoolean;
-
-const slicingModeNormal = {
- [vtkImageMapper.SlicingMode.X]: [1, 0, 0],
- [vtkImageMapper.SlicingMode.Y]: [0, 1, 0],
- [vtkImageMapper.SlicingMode.Z]: [0, 0, 0],
- [vtkImageMapper.SlicingMode.I]: [1, 0, 0],
- [vtkImageMapper.SlicingMode.J]: [0, 1, 0],
- [vtkImageMapper.SlicingMode.K]: [0, 0, 1],
-};
-// ----------------------------------------------------------------------------
-// Standard rendering code setup
-// ----------------------------------------------------------------------------
-// scene
const scene = {};
scene.fullScreenRenderer = vtkFullScreenRenderWindow.newInstance({
@@ -70,6 +59,30 @@ scene.openGLRenderWindow =
scene.fullScreenRenderer.getApiSpecificRenderWindow();
scene.camera = scene.renderer.getActiveCamera();
+scene.widgetManager = vtkWidgetManager.newInstance();
+scene.widgetManager.setRenderer(scene.renderer);
+
+scene.rcw = vtkResliceCursorWidget.newInstance({ planes: ['Z'] });
+scene.rcw.getWidgetState().getCenterHandle().setVisible(false);
+scene.rcwInstance = scene.widgetManager.addWidget(
+ scene.rcw,
+ ViewTypes.XY_PLANE,
+ { keepOrthogonality: true }
+);
+scene.widgetManager.enablePicking(); // FIXME: really needed ?
+
+scene.reslice = vtkImageReslice.newInstance();
+// scene.reslice.setSlabMode(SlabMode.MEAN);
+// scene.reslice.setSlabNumberOfSlices(1);
+scene.reslice.setTransformInputSampling(false);
+scene.reslice.setAutoCropOutput(true);
+scene.reslice.setOutputDimensionality(2);
+scene.resliceMapper = vtkImageMapper.newInstance();
+scene.resliceMapper.setInputConnection(scene.reslice.getOutputPort());
+scene.resliceActor = vtkImageSlice.newInstance();
+scene.resliceActor.setMapper(scene.resliceMapper);
+scene.renderer.addActor(scene.resliceActor);
+
// setup 2D view
scene.camera.setParallelProjection(true);
scene.iStyle = vtkInteractorStyleImage.newInstance();
@@ -77,25 +90,10 @@ scene.iStyle.setInteractionMode('IMAGE_SLICING');
scene.renderWindow.getInteractor().setInteractorStyle(scene.iStyle);
scene.fullScreenRenderer.addController(controlPanel);
-function setCamera(sliceMode, renderer, data) {
- const ijk = [0, 0, 0];
- const position = [0, 0, 0];
- const focalPoint = [0, 0, 0];
- const viewUp = sliceMode === 1 ? [0, 0, 1] : [0, 1, 0];
- data.indexToWorld(ijk, focalPoint);
- ijk[sliceMode] = 1;
- data.indexToWorld(ijk, position);
- renderer.getActiveCamera().set({ focalPoint, position, viewUp });
- renderer.resetCamera();
-}
-
// ----------------------------------------------------------------------------
// Widget manager
// ----------------------------------------------------------------------------
-scene.widgetManager = vtkWidgetManager.newInstance();
-scene.widgetManager.setRenderer(scene.renderer);
-
// Widgets
const widgets = {};
widgets.rectangleWidget = vtkRectangleWidget.newInstance({
@@ -156,7 +154,6 @@ scene.circleHandle = scene.widgetManager.addWidget(
);
scene.circleHandle.setGlyphResolution(64);
-scene.widgetManager.grabFocus(widgets.ellipseWidget);
let activeWidget = 'ellipseWidget';
// ----------------------------------------------------------------------------
@@ -177,62 +174,115 @@ function readyAll() {
ready(scene, true);
}
-function updateControlPanel(im, ds) {
- const slicingMode = im.getSlicingMode();
- const extent = ds.getExtent();
- document.querySelector('.slice').setAttribute('min', extent[slicingMode * 2]);
+function updateControlPanel(slicingMode, ds) {
+ const bounds = ds.getBounds();
+ document.querySelector('.slice').setAttribute('min', bounds[slicingMode * 2]);
document
.querySelector('.slice')
- .setAttribute('max', extent[slicingMode * 2 + 1]);
+ .setAttribute('max', bounds[slicingMode * 2 + 1]);
}
-function updateWidgetVisibility(widget, slicePos, i, widgetIndex) {
+function updateWidgetVisibility(widget, slicePos, i, handle) {
/* testing if the widget is on the slice and has been placed to modify visibility */
const widgetVisibility =
- !scene.widgetManager.getWidgets()[widgetIndex].getPoint1() ||
+ !handle.getPoint1() ||
widget.getWidgetState().getPoint1Handle().getOrigin()[i] === slicePos[i];
return widget.setVisibility(widgetVisibility);
}
function updateWidgetsVisibility(slicePos, slicingMode) {
- updateWidgetVisibility(widgets.rectangleWidget, slicePos, slicingMode, 0);
- updateWidgetVisibility(widgets.ellipseWidget, slicePos, slicingMode, 1);
- updateWidgetVisibility(widgets.circleWidget, slicePos, slicingMode, 2);
+ updateWidgetVisibility(
+ widgets.rectangleWidget,
+ slicePos,
+ slicingMode,
+ scene.rectangleHandle
+ );
+ updateWidgetVisibility(
+ widgets.ellipseWidget,
+ slicePos,
+ slicingMode,
+ scene.ellipseHandle
+ );
+ updateWidgetVisibility(
+ widgets.circleWidget,
+ slicePos,
+ slicingMode,
+ scene.circleHandle
+ );
}
// ----------------------------------------------------------------------------
// Load image
// ----------------------------------------------------------------------------
-const image = {
- imageMapper: vtkImageMapper.newInstance(),
- actor: vtkImageSlice.newInstance(),
-};
+let imageData = null;
+let slicingMode = 2;
+
+function updateReslice(
+ interactionContext = {
+ viewType: '',
+ reslice: null, // vtkImageReslice
+ actor: null,
+ renderer: null,
+ resetFocalPoint: false, // Reset the focal point to the center of the display image
+ computeFocalPointOffset: false, // Defines if the display offset between reslice center and focal point has to be
+ // computed. If so, then this offset will be used to keep the focal point position during rotation.
+ }
+) {
+ const modified = scene.rcw.updateReslicePlane(
+ interactionContext.reslice,
+ interactionContext.viewType
+ );
+ if (modified) {
+ const resliceAxes = interactionContext.reslice.getResliceAxes();
+ // Get returned modified from setter to know if we have to render
+ interactionContext.actor.setUserMatrix(resliceAxes);
+ }
+ scene.rcw.updateCameraPoints(
+ interactionContext.renderer,
+ interactionContext.viewType,
+ interactionContext.resetFocalPoint,
+ interactionContext.computeFocalPointOffset
+ );
+ document.querySelector('.slice').value = scene.rcw
+ .getWidgetState()
+ .getCenter()[slicingMode];
+ scene.renderWindow.render();
+ return modified;
+}
-// background image pipeline
-image.actor.setMapper(image.imageMapper);
+scene.rcwInstance.onInteractionEvent((interactionMethodName) => {
+ const computeFocalPointOffset = true;
+ updateReslice({
+ viewType: ViewTypes.XY_PLANE,
+ reslice: scene.reslice,
+ actor: scene.resliceActor,
+ renderer: scene.renderer,
+ resetFocalPoint: true,
+ computeFocalPointOffset,
+ });
+});
const reader = vtkHttpDataSetReader.newInstance({ fetchGzip: true });
reader
.setUrl(`${__BASE_PATH__}/data/volume/LIDC2.vti`, { loadData: true })
.then(() => {
- const data = reader.getOutputData();
- image.data = data;
-
+ imageData = reader.getOutputData();
// set input data
- image.imageMapper.setInputData(data);
-
- // add actors to renderers
- scene.renderer.addViewProp(image.actor);
- // default slice orientation/mode and camera view
- const sliceMode = vtkImageMapper.SlicingMode.K;
- image.imageMapper.setSlicingMode(sliceMode);
- image.imageMapper.setSlice(0);
-
- // set 2D camera position
- setCamera(sliceMode, scene.renderer, image.data);
+ scene.reslice.setInputData(imageData);
+ scene.rcw.setImage(imageData);
+
+ updateReslice({
+ viewType: ViewTypes.XY_PLANE,
+ reslice: scene.reslice,
+ actor: scene.resliceActor,
+ renderer: scene.renderer,
+ resetFocalPoint: true, // At first initilization, center the focal point to the image center
+ computeFocalPointOffset: true, // Allow to compute the current offset between display reslice center and display focal point
+ });
+ scene.renderWindow.getInteractor().render();
- updateControlPanel(image.imageMapper, data);
+ updateControlPanel(slicingMode, imageData);
scene.rectangleHandle.getRepresentations()[1].setDrawBorder(true);
scene.rectangleHandle.getRepresentations()[1].setDrawFace(false);
@@ -244,35 +294,20 @@ reader
scene.ellipseHandle.getRepresentations()[1].setDrawFace(false);
scene.ellipseHandle.getRepresentations()[1].setOpacity(1);
- // isPointInEllipse supports arbitrary plane (not just axis-aligned)
- const isPointInEllipse = vtkImplicitBoolean.newInstance();
- isPointInEllipse.setOperation(Operation.INTERSECTION);
- const positivePlane = vtkPlane.newInstance();
- isPointInEllipse.addFunction(positivePlane);
- const negativePlane = vtkPlane.newInstance();
- isPointInEllipse.addFunction(negativePlane);
+ const isPointInPlane = vtkPlane.newInstance();
const currentEllipse = vtkSphere.newInstance();
const transform = vtkTransform.newInstance();
currentEllipse.setTransform(transform);
- isPointInEllipse.addFunction(currentEllipse);
// set text display callback
scene.ellipseHandle.onInteractionEvent(() => {
const worldBounds = scene.ellipseHandle.getBounds();
- const planeNormal = slicingModeNormal[image.imageMapper.getSlicingMode()];
- const planeOrigin = [0, 0, 0];
- planeOrigin[image.imageMapper.getSlicingMode() % 3] =
- image.imageMapper.getSlice();
- image.data.indexToWorld(planeOrigin, planeOrigin);
- positivePlane.setOrigin(planeOrigin);
- negativePlane.setOrigin(planeOrigin);
- positivePlane.setNormal(planeNormal);
- negativePlane.setNormal(vtkMath.multiplyScalar([...planeNormal], -1));
- const rotationMatrix = vtkMatrixBuilder
- .buildFromRadian()
- .translate(...planeOrigin)
- .rotateFromDirections(planeNormal, [0, 0, 1])
- .translate(...vtkMath.multiplyScalar([...planeOrigin], -1));
+ const plane = scene.rcw.getWidgetState().getPlanes()[ViewTypes.XY_PLANE];
+ const planeNormal = [...plane.normal];
+
+ const planeOrigin = scene.rcw.getWidgetState().getCenter();
+ isPointInPlane.setOrigin(planeOrigin);
+ isPointInPlane.setNormal(planeNormal);
const corner1 = widgets.ellipseWidget
.getWidgetState()
.getPoint1Handle()
@@ -281,25 +316,77 @@ reader
.getWidgetState()
.getPoint2Handle()
.getOrigin();
- rotationMatrix.apply(corner1);
- rotationMatrix.apply(corner2);
- transform.setMatrix(rotationMatrix.getMatrix());
- currentEllipse.setRadius([
- Math.max(Math.abs(corner2[0] - corner1[0]) / 2, 1 + VTK_SMALL_NUMBER),
- Math.max(Math.abs(corner2[1] - corner1[1]) / 2, 1),
- 10,
- ]);
- currentEllipse.setCenter([
+ const center = [
(corner1[0] + corner2[0]) / 2,
(corner1[1] + corner2[1]) / 2,
(corner1[2] + corner2[2]) / 2,
- ]);
+ ];
+ const wcvc = mat3.fromMat4(mat3.create(), scene.camera.getViewMatrix());
+ mat3.invert(wcvc, wcvc);
+
+ const rotationMatrix = vtkMatrixBuilder
+ .buildFromRadian()
+ .translate(...center)
+ .multiply3x3(wcvc)
+ .translate(-center[0], -center[1], -center[2]);
+ rotationMatrix.apply(corner1);
+ rotationMatrix.apply(corner2);
+ transform.setMatrix(rotationMatrix.getMatrix());
+ const spacing = scene.rcw.getWidgetState().getImage().getSpacing();
+ const ijkRadius = [
+ Math.max(
+ Math.abs(corner2[0] - corner1[0]) / 2,
+ spacing[0] + VTK_SMALL_NUMBER
+ ),
+ Math.max(
+ Math.abs(corner2[1] - corner1[1]) / 2,
+ spacing[1] + VTK_SMALL_NUMBER
+ ),
+ 10, // thick enough to cover 1 pixel high
+ ];
+ currentEllipse.setRadius(ijkRadius);
+
+ mat3.invert(wcvc, wcvc);
+ const ijkToWorldMatrix = vtkMatrixBuilder
+ .buildFromRadian()
+ .translate(...center)
+ .multiply3x3(wcvc);
+ const maxRadius = Math.ceil(Math.max(ijkRadius[0], ijkRadius[1]));
+ const ellipseBounds = [
+ -maxRadius,
+ -maxRadius,
+ 0,
+ maxRadius,
+ maxRadius,
+ 0,
+ -maxRadius,
+ maxRadius,
+ 0,
+ maxRadius,
+ -maxRadius,
+ 0,
+ ];
+ ijkToWorldMatrix.apply(ellipseBounds);
+ vtkBoundingBox.addPoints(worldBounds, ellipseBounds);
+
+ currentEllipse.setCenter(center);
+ const halfSpacingAlongNormal =
+ vtkMath.norm([
+ planeNormal[0] * spacing[0],
+ planeNormal[1] * spacing[1],
+ planeNormal[2] * spacing[2],
+ ]) / 2;
const w = [];
- const { average, minimum, maximum } = image.data.computeHistogram(
+ const { average, minimum, maximum } = imageData.computeHistogram(
worldBounds,
- (coord, _) =>
- isPointInEllipse.functionValue(image.data.indexToWorld(coord, w)) <= 0
+ (coord, _) => {
+ imageData.indexToWorld(coord, w);
+ return (
+ Math.abs(isPointInPlane.functionValue(w)) <=
+ halfSpacingAlongNormal && currentEllipse.functionValue(w) < 0
+ );
+ }
);
const text = `average: ${average.toFixed(
@@ -338,15 +425,8 @@ reader
});
const update = () => {
- const slicingMode = image.imageMapper.getSlicingMode() % 3;
-
if (slicingMode > -1) {
- const ijk = [0, 0, 0];
- const slicePos = [0, 0, 0];
-
- // position
- ijk[slicingMode] = image.imageMapper.getSlice();
- data.indexToWorld(ijk, slicePos);
+ const slicePos = scene.rcw.getWidgetState().getCenter();
widgets.rectangleWidget.getManipulator().setUserOrigin(slicePos);
widgets.ellipseWidget.getManipulator().setUserOrigin(slicePos);
@@ -359,13 +439,15 @@ reader
// update UI
document
.querySelector('.slice')
- .setAttribute('max', data.getDimensions()[slicingMode] - 1);
+ .setAttribute('max', imageData.getDimensions()[slicingMode] - 1);
}
};
- image.imageMapper.onModified(update);
+
+ scene.rcw.getWidgetState().onModified(update);
// trigger initial update
update();
+ scene.widgetManager.grabFocus(widgets[activeWidget]);
readyAll();
});
@@ -381,21 +463,54 @@ function resetWidgets() {
scene.rectangleHandle.reset();
scene.ellipseHandle.reset();
scene.circleHandle.reset();
- const slicingMode = image.imageMapper.getSlicingMode() % 3;
updateWidgetsVisibility(null, slicingMode);
scene.widgetManager.grabFocus(widgets[activeWidget]);
}
document.querySelector('.slice').addEventListener('input', (ev) => {
- image.imageMapper.setSlice(Number(ev.target.value));
+ const pos = [...scene.rcw.getWidgetState().getCenter()];
+ pos[slicingMode] = Number(ev.target.value);
+ scene.rcw.setCenter(pos);
+ updateReslice({
+ viewType: ViewTypes.XY_PLANE,
+ reslice: scene.reslice,
+ actor: scene.resliceActor,
+ renderer: scene.renderer,
+ resetFocalPoint: true,
+ computeFocalPointOffset: true,
+ });
+ scene.renderWindow.render();
});
document.querySelector('.axis').addEventListener('input', (ev) => {
- const sliceMode = 'IJKXYZ'.indexOf(ev.target.value) % 3;
- image.imageMapper.setSlicingMode(sliceMode);
+ const sliceMode = 'IJKO'.indexOf(ev.target.value);
+ const normal = [0, 0, 0];
+ if (sliceMode === 3) {
+ // Oblique mode
+ slicingMode = 2;
+ normal[0] = Math.sqrt(3);
+ normal[1] = Math.sqrt(3);
+ normal[2] = Math.sqrt(3);
+ } else {
+ slicingMode = sliceMode;
+ normal[sliceMode] = 1;
+ }
+ scene.rcwInstance.setViewPlane(ViewTypes.XY_PLANE, normal);
+
+ updateControlPanel(slicingMode, imageData);
+ document.querySelector('.slice').value = scene.rcw
+ .getWidgetState()
+ .getCenter()[slicingMode];
- setCamera(sliceMode, scene.renderer, image.data);
resetWidgets();
+ updateReslice({
+ viewType: ViewTypes.XY_PLANE,
+ reslice: scene.reslice,
+ actor: scene.resliceActor,
+ renderer: scene.renderer,
+ resetFocalPoint: true,
+ computeFocalPointOffset: true,
+ });
scene.renderWindow.render();
});
@@ -422,10 +537,9 @@ document.querySelector('.place').addEventListener('click', () => {
: scene.circleHandle;
const coord1 = [0, 0, 0];
const coord2 = [100, 100, 100];
- const slicePos = image.imageMapper.getSlice();
- const axis = image.imageMapper.getSlicingMode() % 3;
- coord1[axis] = slicePos;
- coord2[axis] = slicePos;
+ const center = scene.rcw.getWidgetState().getCenter();
+ coord1[slicingMode] = center[slicingMode];
+ coord2[slicingMode] = center[slicingMode];
handle.grabFocus();
handle.placePoint1(coord1);
handle.placePoint2(coord2);
@@ -434,7 +548,8 @@ document.querySelector('.place').addEventListener('click', () => {
// Recompute text position
handle.invokeInteractionEvent();
handle.loseFocus();
- updateWidgetVisibility(widget, coord1, axis, widgetIndex);
+ // updateWidgetVisibility(widget, coord1, axis, widgetIndex);
+ updateWidgetVisibility(widget, coord1, slicingMode, widgetIndex);
scene.renderWindow.render();
}
});
diff --git a/Sources/Widgets/Widgets3D/SplineWidget/test/testSplineWidget.js b/Sources/Widgets/Widgets3D/SplineWidget/test/testSplineWidget.js
index 8dd03f5927e..a0e9da569e0 100644
--- a/Sources/Widgets/Widgets3D/SplineWidget/test/testSplineWidget.js
+++ b/Sources/Widgets/Widgets3D/SplineWidget/test/testSplineWidget.js
@@ -9,7 +9,7 @@ import vtkWidgetManager from 'vtk.js/Sources/Widgets/Core/WidgetManager';
import baseline from './testSplineWidget.png';
test.onlyIfWebGL('Test vtkSplineWidget rendering and picking', (t) => {
- const gc = testUtils.createGarbageCollector(t);
+ const gc = testUtils.createGarbageCollector();
const container = document.querySelector('body');
const renderWindowContainer = gc.registerDOMElement(
@@ -100,21 +100,17 @@ test.onlyIfWebGL('Test vtkSplineWidget rendering and picking', (t) => {
renderer.resetCamera();
function testRender() {
- let resolve;
- const promise = new Promise((res) => {
- console.log('resolved');
- resolve = res;
- });
- glwindow.captureNextImage().then((image) => {
- testUtils.compareImages(
- image,
- [baseline],
- 'Widgets/Widgets3D/SplineWidget/test/testSplineWidget',
- t,
- 2.5,
- resolve
+ const promise = glwindow
+ .captureNextImage()
+ .then((image) =>
+ testUtils.compareImages(
+ image,
+ [baseline],
+ 'Widgets/Widgets3D/SplineWidget/test/testSplineWidget',
+ t,
+ 2.5
+ )
);
- });
// Trigger a next image
renderWindow.render();
return promise;
@@ -135,8 +131,7 @@ test.onlyIfWebGL('Test vtkSplineWidget rendering and picking', (t) => {
});
}
- [testRender, testSelect, gc.releaseResources].reduce(
- (current, next) => current.then(next),
- Promise.resolve()
- );
+ return [testRender, testSelect]
+ .reduce((current, next) => current.then(next), Promise.resolve())
+ .finally(gc.releaseResources);
});
diff --git a/Utilities/build/rewrite-imports.js b/Utilities/build/rewrite-imports.js
index 37465cb265d..404365c5c2f 100644
--- a/Utilities/build/rewrite-imports.js
+++ b/Utilities/build/rewrite-imports.js
@@ -7,7 +7,7 @@ module.exports = (code, replaceFunc) => {
importRegex.lastIndex++;
}
- if (m[1].startsWith('../') || m[1].startsWith('./')) {
+ if (m[1] === '..' || m[1].startsWith('../') || m[1].startsWith('./')) {
const importPath = replaceFunc(m[1]);
const origLen = code.length;
code = code.replace(m[0], `from '${importPath}'`);
diff --git a/karma.conf.js b/karma.conf.js
index 485cc26724c..35484c8dbf7 100644
--- a/karma.conf.js
+++ b/karma.conf.js
@@ -93,8 +93,8 @@ module.exports = function init(config) {
flags: ['--enable-unsafe-webgpu'],
},
},
- // browserNoActivityTimeout: 600000,
- browserDisconnectTimeout: 100000,
+ browserNoActivityTimeout: 120000,
+ browserDisconnectTimeout: 60000,
browserDisconnectTolerance: 3,
port: 9876,
diff --git a/package-lock.json b/package-lock.json
index 167780d7b26..c4e4df119da 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -7,6 +7,7 @@
"": {
"name": "vtk.js",
"version": "0.0.0-semantically-release",
+ "hasInstallScript": true,
"license": "BSD-3-Clause",
"dependencies": {
"@babel/runtime": "7.22.11",
@@ -22,6 +23,7 @@
"shelljs": "0.8.5",
"spark-md5": "3.0.2",
"stream-browserify": "3.0.0",
+ "utif": "3.1.0",
"webworker-promise": "0.5.0",
"worker-loader": "3.0.8",
"xmlbuilder2": "3.0.2"
@@ -35,8 +37,8 @@
"@babel/eslint-parser": "7.22.11",
"@babel/plugin-transform-runtime": "7.22.10",
"@babel/preset-env": "7.22.10",
- "@commitlint/cli": "16.2.4",
- "@commitlint/config-conventional": "16.2.4",
+ "@commitlint/cli": "19.7.1",
+ "@commitlint/config-conventional": "19.7.1",
"@mapbox/node-pre-gyp": "1.0.9",
"@rollup/plugin-alias": "3.1.9",
"@rollup/plugin-babel": "5.3.1",
@@ -44,6 +46,7 @@
"@rollup/plugin-eslint": "8.0.2",
"@rollup/plugin-json": "4.1.0",
"@rollup/plugin-node-resolve": "13.1.3",
+ "@types/node": "^22.13.1",
"autoprefixer": "10.4.7",
"babel-loader": "8.2.5",
"babel-plugin-istanbul": "6.1.1",
@@ -54,7 +57,7 @@
"cross-env": "7.0.3",
"css-loader": "6.7.1",
"dotenv": "16.0.1",
- "dox": "0.9.1",
+ "dox": "1.0.0",
"eslint": "8.15.0",
"eslint-config-airbnb": "19.0.4",
"eslint-config-prettier": "8.5.0",
@@ -87,7 +90,7 @@
"prettier": "2.6.2",
"process": "0.11.10",
"regenerator-runtime": "0.13.9",
- "rollup": "2.73.0",
+ "rollup": "2.79.2",
"rollup-plugin-auto-external": "2.0.0",
"rollup-plugin-copy": "3.4.0",
"rollup-plugin-ignore": "1.0.10",
@@ -101,14 +104,14 @@
"string-replace-loader": "3.1.0",
"style-loader": "3.3.1",
"tape": "5.5.3",
- "webpack": "5.76.0",
+ "webpack": "5.97.1",
"webpack-bundle-analyzer": "4.5.0",
"webpack-cli": "4.9.2",
"webpack-dashboard": "3.3.7",
"webpack-dev-server": "4.9.0",
"webpack-merge": "5.8.0",
"webpack-notifier": "1.15.0",
- "wslink": "1.6.4",
+ "wslink": "1.12.4",
"xml2js": "0.5.0"
},
"peerDependencies": {
@@ -1938,26 +1941,25 @@
}
},
"node_modules/@commitlint/cli": {
- "version": "16.2.4",
- "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-16.2.4.tgz",
- "integrity": "sha512-rbvqvz9JI+uiKxV2nH65BtSU01fsADd3bxe9fWtO3rM0c+CI/H9FfzKkDLvSRmXjvk1G2/wXlCGeqO9IBT4X9g==",
- "dev": true,
- "dependencies": {
- "@commitlint/format": "^16.2.1",
- "@commitlint/lint": "^16.2.4",
- "@commitlint/load": "^16.2.4",
- "@commitlint/read": "^16.2.1",
- "@commitlint/types": "^16.2.1",
- "lodash": "^4.17.19",
- "resolve-from": "5.0.0",
- "resolve-global": "1.0.0",
+ "version": "19.7.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-19.7.1.tgz",
+ "integrity": "sha512-iObGjR1tE/PfDtDTEfd+tnRkB3/HJzpQqRTyofS2MPPkDn1mp3DBC8SoPDayokfAy+xKhF8+bwRCJO25Nea0YQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@commitlint/format": "^19.5.0",
+ "@commitlint/lint": "^19.7.1",
+ "@commitlint/load": "^19.6.1",
+ "@commitlint/read": "^19.5.0",
+ "@commitlint/types": "^19.5.0",
+ "tinyexec": "^0.3.0",
"yargs": "^17.0.0"
},
"bin": {
"commitlint": "cli.js"
},
"engines": {
- "node": ">=v12"
+ "node": ">=v18"
}
},
"node_modules/@commitlint/cli/node_modules/yargs": {
@@ -1979,86 +1981,132 @@
}
},
"node_modules/@commitlint/config-conventional": {
- "version": "16.2.4",
- "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-16.2.4.tgz",
- "integrity": "sha512-av2UQJa3CuE5P0dzxj/o/B9XVALqYzEViHrMXtDrW9iuflrqCStWBAioijppj9URyz6ONpohJKAtSdgAOE0gkA==",
+ "version": "19.7.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-19.7.1.tgz",
+ "integrity": "sha512-fsEIF8zgiI/FIWSnykdQNj/0JE4av08MudLTyYHm4FlLWemKoQvPNUYU2M/3tktWcCEyq7aOkDDgtjrmgWFbvg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "conventional-changelog-conventionalcommits": "^4.3.1"
+ "@commitlint/types": "^19.5.0",
+ "conventional-changelog-conventionalcommits": "^7.0.2"
},
"engines": {
- "node": ">=v12"
+ "node": ">=v18"
}
},
"node_modules/@commitlint/config-validator": {
- "version": "16.2.1",
- "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-16.2.1.tgz",
- "integrity": "sha512-hogSe0WGg7CKmp4IfNbdNES3Rq3UEI4XRPB8JL4EPgo/ORq5nrGTVzxJh78omibNuB8Ho4501Czb1Er1MoDWpw==",
+ "version": "19.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-19.5.0.tgz",
+ "integrity": "sha512-CHtj92H5rdhKt17RmgALhfQt95VayrUo2tSqY9g2w+laAXyk7K/Ef6uPm9tn5qSIwSmrLjKaXK9eiNuxmQrDBw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@commitlint/types": "^16.2.1",
- "ajv": "^6.12.6"
+ "@commitlint/types": "^19.5.0",
+ "ajv": "^8.11.0"
},
"engines": {
- "node": ">=v12"
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/config-validator/node_modules/ajv": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
+ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
}
},
+ "node_modules/@commitlint/config-validator/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@commitlint/ensure": {
- "version": "16.2.1",
- "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-16.2.1.tgz",
- "integrity": "sha512-/h+lBTgf1r5fhbDNHOViLuej38i3rZqTQnBTk+xEg+ehOwQDXUuissQ5GsYXXqI5uGy+261ew++sT4EA3uBJ+A==",
+ "version": "19.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-19.5.0.tgz",
+ "integrity": "sha512-Kv0pYZeMrdg48bHFEU5KKcccRfKmISSm9MvgIgkpI6m+ohFTB55qZlBW6eYqh/XDfRuIO0x4zSmvBjmOwWTwkg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@commitlint/types": "^16.2.1",
- "lodash": "^4.17.19"
+ "@commitlint/types": "^19.5.0",
+ "lodash.camelcase": "^4.3.0",
+ "lodash.kebabcase": "^4.1.1",
+ "lodash.snakecase": "^4.1.1",
+ "lodash.startcase": "^4.4.0",
+ "lodash.upperfirst": "^4.3.1"
},
"engines": {
- "node": ">=v12"
+ "node": ">=v18"
}
},
"node_modules/@commitlint/execute-rule": {
- "version": "16.2.1",
- "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-16.2.1.tgz",
- "integrity": "sha512-oSls82fmUTLM6cl5V3epdVo4gHhbmBFvCvQGHBRdQ50H/690Uq1Dyd7hXMuKITCIdcnr9umyDkr8r5C6HZDF3g==",
+ "version": "19.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-19.5.0.tgz",
+ "integrity": "sha512-aqyGgytXhl2ejlk+/rfgtwpPexYyri4t8/n4ku6rRJoRhGZpLFMqrZ+YaubeGysCP6oz4mMA34YSTaSOKEeNrg==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=v12"
+ "node": ">=v18"
}
},
"node_modules/@commitlint/format": {
- "version": "16.2.1",
- "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-16.2.1.tgz",
- "integrity": "sha512-Yyio9bdHWmNDRlEJrxHKglamIk3d6hC0NkEUW6Ti6ipEh2g0BAhy8Od6t4vLhdZRa1I2n+gY13foy+tUgk0i1Q==",
+ "version": "19.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-19.5.0.tgz",
+ "integrity": "sha512-yNy088miE52stCI3dhG/vvxFo9e4jFkU1Mj3xECfzp/bIS/JUay4491huAlVcffOoMK1cd296q0W92NlER6r3A==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@commitlint/types": "^16.2.1",
- "chalk": "^4.0.0"
+ "@commitlint/types": "^19.5.0",
+ "chalk": "^5.3.0"
},
"engines": {
- "node": ">=v12"
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/format/node_modules/chalk": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz",
+ "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/@commitlint/is-ignored": {
- "version": "16.2.4",
- "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-16.2.4.tgz",
- "integrity": "sha512-Lxdq9aOAYCOOOjKi58ulbwK/oBiiKz+7Sq0+/SpFIEFwhHkIVugvDvWjh2VRBXmRC/x5lNcjDcYEwS/uYUvlYQ==",
+ "version": "19.7.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-19.7.1.tgz",
+ "integrity": "sha512-3IaOc6HVg2hAoGleRK3r9vL9zZ3XY0rf1RsUf6jdQLuaD46ZHnXBiOPTyQ004C4IvYjSWqJwlh0/u2P73aIE3g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@commitlint/types": "^16.2.1",
- "semver": "7.3.7"
+ "@commitlint/types": "^19.5.0",
+ "semver": "^7.6.0"
},
"engines": {
- "node": ">=v12"
+ "node": ">=v18"
}
},
"node_modules/@commitlint/is-ignored/node_modules/semver": {
- "version": "7.3.7",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
- "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
"dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
+ "license": "ISC",
"bin": {
"semver": "bin/semver.js"
},
@@ -2067,240 +2115,331 @@
}
},
"node_modules/@commitlint/lint": {
- "version": "16.2.4",
- "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-16.2.4.tgz",
- "integrity": "sha512-AUDuwOxb2eGqsXbTMON3imUGkc1jRdtXrbbohiLSCSk3jFVXgJLTMaEcr39pR00N8nE9uZ+V2sYaiILByZVmxQ==",
+ "version": "19.7.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-19.7.1.tgz",
+ "integrity": "sha512-LhcPfVjcOcOZA7LEuBBeO00o3MeZa+tWrX9Xyl1r9PMd5FWsEoZI9IgnGqTKZ0lZt5pO3ZlstgnRyY1CJJc9Xg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@commitlint/is-ignored": "^16.2.4",
- "@commitlint/parse": "^16.2.1",
- "@commitlint/rules": "^16.2.4",
- "@commitlint/types": "^16.2.1"
+ "@commitlint/is-ignored": "^19.7.1",
+ "@commitlint/parse": "^19.5.0",
+ "@commitlint/rules": "^19.6.0",
+ "@commitlint/types": "^19.5.0"
},
"engines": {
- "node": ">=v12"
+ "node": ">=v18"
}
},
"node_modules/@commitlint/load": {
- "version": "16.2.4",
- "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-16.2.4.tgz",
- "integrity": "sha512-HjANm3/29ROV+zt4yfaY/K6gpr9Dbzgtlp0kSwZGW0poDXlD/yqVYgPQ6JolJzZii5FUz5R4yVLC15hVL/w60w==",
+ "version": "19.6.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-19.6.1.tgz",
+ "integrity": "sha512-kE4mRKWWNju2QpsCWt428XBvUH55OET2N4QKQ0bF85qS/XbsRGG1MiTByDNlEVpEPceMkDr46LNH95DtRwcsfA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@commitlint/config-validator": "^16.2.1",
- "@commitlint/execute-rule": "^16.2.1",
- "@commitlint/resolve-extends": "^16.2.1",
- "@commitlint/types": "^16.2.1",
- "@types/node": ">=12",
- "chalk": "^4.0.0",
- "cosmiconfig": "^7.0.0",
- "cosmiconfig-typescript-loader": "^1.0.0",
- "lodash": "^4.17.19",
- "resolve-from": "^5.0.0",
- "typescript": "^4.4.3"
+ "@commitlint/config-validator": "^19.5.0",
+ "@commitlint/execute-rule": "^19.5.0",
+ "@commitlint/resolve-extends": "^19.5.0",
+ "@commitlint/types": "^19.5.0",
+ "chalk": "^5.3.0",
+ "cosmiconfig": "^9.0.0",
+ "cosmiconfig-typescript-loader": "^6.1.0",
+ "lodash.isplainobject": "^4.0.6",
+ "lodash.merge": "^4.6.2",
+ "lodash.uniq": "^4.5.0"
},
"engines": {
- "node": ">=v12"
+ "node": ">=v18"
}
},
- "node_modules/@commitlint/message": {
- "version": "16.2.1",
- "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-16.2.1.tgz",
- "integrity": "sha512-2eWX/47rftViYg7a3axYDdrgwKv32mxbycBJT6OQY/MJM7SUfYNYYvbMFOQFaA4xIVZt7t2Alyqslbl6blVwWw==",
+ "node_modules/@commitlint/load/node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true,
+ "license": "Python-2.0"
+ },
+ "node_modules/@commitlint/load/node_modules/chalk": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz",
+ "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=v12"
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
}
},
- "node_modules/@commitlint/parse": {
- "version": "16.2.1",
- "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-16.2.1.tgz",
- "integrity": "sha512-2NP2dDQNL378VZYioLrgGVZhWdnJO4nAxQl5LXwYb08nEcN+cgxHN1dJV8OLJ5uxlGJtDeR8UZZ1mnQ1gSAD/g==",
+ "node_modules/@commitlint/load/node_modules/cosmiconfig": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz",
+ "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@commitlint/types": "^16.2.1",
- "conventional-changelog-angular": "^5.0.11",
- "conventional-commits-parser": "^3.2.2"
+ "env-paths": "^2.2.1",
+ "import-fresh": "^3.3.0",
+ "js-yaml": "^4.1.0",
+ "parse-json": "^5.2.0"
},
"engines": {
- "node": ">=v12"
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/d-fischer"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.9.5"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
}
},
- "node_modules/@commitlint/read": {
- "version": "16.2.1",
- "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-16.2.1.tgz",
- "integrity": "sha512-tViXGuaxLTrw2r7PiYMQOFA2fueZxnnt0lkOWqKyxT+n2XdEMGYcI9ID5ndJKXnfPGPppD0w/IItKsIXlZ+alw==",
+ "node_modules/@commitlint/load/node_modules/cosmiconfig-typescript-loader": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-6.1.0.tgz",
+ "integrity": "sha512-tJ1w35ZRUiM5FeTzT7DtYWAFFv37ZLqSRkGi2oeCK1gPhvaWjkAtfXvLmvE1pRfxxp9aQo6ba/Pvg1dKj05D4g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@commitlint/top-level": "^16.2.1",
- "@commitlint/types": "^16.2.1",
- "fs-extra": "^10.0.0",
- "git-raw-commits": "^2.0.0"
+ "jiti": "^2.4.1"
},
"engines": {
- "node": ">=v12"
+ "node": ">=v18"
+ },
+ "peerDependencies": {
+ "@types/node": "*",
+ "cosmiconfig": ">=9",
+ "typescript": ">=5"
}
},
- "node_modules/@commitlint/read/node_modules/fs-extra": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
- "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "node_modules/@commitlint/load/node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
+ "argparse": "^2.0.1"
},
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/@commitlint/message": {
+ "version": "19.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-19.5.0.tgz",
+ "integrity": "sha512-R7AM4YnbxN1Joj1tMfCyBryOC5aNJBdxadTZkuqtWi3Xj0kMdutq16XQwuoGbIzL2Pk62TALV1fZDCv36+JhTQ==",
+ "dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=12"
+ "node": ">=v18"
}
},
- "node_modules/@commitlint/read/node_modules/jsonfile": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
- "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "node_modules/@commitlint/parse": {
+ "version": "19.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-19.5.0.tgz",
+ "integrity": "sha512-cZ/IxfAlfWYhAQV0TwcbdR1Oc0/r0Ik1GEessDJ3Lbuma/MRO8FRQX76eurcXtmhJC//rj52ZSZuXUg0oIX0Fw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "universalify": "^2.0.0"
+ "@commitlint/types": "^19.5.0",
+ "conventional-changelog-angular": "^7.0.0",
+ "conventional-commits-parser": "^5.0.0"
},
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
+ "engines": {
+ "node": ">=v18"
}
},
- "node_modules/@commitlint/read/node_modules/universalify": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
- "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
+ "node_modules/@commitlint/read": {
+ "version": "19.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-19.5.0.tgz",
+ "integrity": "sha512-TjS3HLPsLsxFPQj6jou8/CZFAmOP2y+6V4PGYt3ihbQKTY1Jnv0QG28WRKl/d1ha6zLODPZqsxLEov52dhR9BQ==",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@commitlint/top-level": "^19.5.0",
+ "@commitlint/types": "^19.5.0",
+ "git-raw-commits": "^4.0.0",
+ "minimist": "^1.2.8",
+ "tinyexec": "^0.3.0"
+ },
"engines": {
- "node": ">= 10.0.0"
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/read/node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/@commitlint/resolve-extends": {
- "version": "16.2.1",
- "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-16.2.1.tgz",
- "integrity": "sha512-NbbCMPKTFf2J805kwfP9EO+vV+XvnaHRcBy6ud5dF35dxMsvdJqke54W3XazXF1ZAxC4a3LBy4i/GNVBAthsEg==",
+ "version": "19.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-19.5.0.tgz",
+ "integrity": "sha512-CU/GscZhCUsJwcKTJS9Ndh3AKGZTNFIOoQB2n8CmFnizE0VnEuJoum+COW+C1lNABEeqk6ssfc1Kkalm4bDklA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@commitlint/config-validator": "^16.2.1",
- "@commitlint/types": "^16.2.1",
- "import-fresh": "^3.0.0",
- "lodash": "^4.17.19",
- "resolve-from": "^5.0.0",
- "resolve-global": "^1.0.0"
+ "@commitlint/config-validator": "^19.5.0",
+ "@commitlint/types": "^19.5.0",
+ "global-directory": "^4.0.1",
+ "import-meta-resolve": "^4.0.0",
+ "lodash.mergewith": "^4.6.2",
+ "resolve-from": "^5.0.0"
},
"engines": {
- "node": ">=v12"
+ "node": ">=v18"
}
},
"node_modules/@commitlint/rules": {
- "version": "16.2.4",
- "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-16.2.4.tgz",
- "integrity": "sha512-rK5rNBIN2ZQNQK+I6trRPK3dWa0MtaTN4xnwOma1qxa4d5wQMQJtScwTZjTJeallFxhOgbNOgr48AMHkdounVg==",
+ "version": "19.6.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-19.6.0.tgz",
+ "integrity": "sha512-1f2reW7lbrI0X0ozZMesS/WZxgPa4/wi56vFuJENBmed6mWq5KsheN/nxqnl/C23ioxpPO/PL6tXpiiFy5Bhjw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@commitlint/ensure": "^16.2.1",
- "@commitlint/message": "^16.2.1",
- "@commitlint/to-lines": "^16.2.1",
- "@commitlint/types": "^16.2.1",
- "execa": "^5.0.0"
+ "@commitlint/ensure": "^19.5.0",
+ "@commitlint/message": "^19.5.0",
+ "@commitlint/to-lines": "^19.5.0",
+ "@commitlint/types": "^19.5.0"
},
"engines": {
- "node": ">=v12"
+ "node": ">=v18"
}
},
"node_modules/@commitlint/to-lines": {
- "version": "16.2.1",
- "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-16.2.1.tgz",
- "integrity": "sha512-9/VjpYj5j1QeY3eiog1zQWY6axsdWAc0AonUUfyZ7B0MVcRI0R56YsHAfzF6uK/g/WwPZaoe4Lb1QCyDVnpVaQ==",
+ "version": "19.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-19.5.0.tgz",
+ "integrity": "sha512-R772oj3NHPkodOSRZ9bBVNq224DOxQtNef5Pl8l2M8ZnkkzQfeSTr4uxawV2Sd3ui05dUVzvLNnzenDBO1KBeQ==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=v12"
+ "node": ">=v18"
}
},
"node_modules/@commitlint/top-level": {
- "version": "16.2.1",
- "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-16.2.1.tgz",
- "integrity": "sha512-lS6GSieHW9y6ePL73ied71Z9bOKyK+Ib9hTkRsB8oZFAyQZcyRwq2w6nIa6Fngir1QW51oKzzaXfJL94qwImyw==",
+ "version": "19.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-19.5.0.tgz",
+ "integrity": "sha512-IP1YLmGAk0yWrImPRRc578I3dDUI5A2UBJx9FbSOjxe9sTlzFiwVJ+zeMLgAtHMtGZsC8LUnzmW1qRemkFU4ng==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "find-up": "^5.0.0"
+ "find-up": "^7.0.0"
},
"engines": {
- "node": ">=v12"
+ "node": ">=v18"
}
},
"node_modules/@commitlint/top-level/node_modules/find-up": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
- "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-7.0.0.tgz",
+ "integrity": "sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "locate-path": "^6.0.0",
- "path-exists": "^4.0.0"
+ "locate-path": "^7.2.0",
+ "path-exists": "^5.0.0",
+ "unicorn-magic": "^0.1.0"
},
"engines": {
- "node": ">=10"
+ "node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@commitlint/top-level/node_modules/locate-path": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
- "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz",
+ "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "p-locate": "^5.0.0"
+ "p-locate": "^6.0.0"
},
"engines": {
- "node": ">=10"
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@commitlint/top-level/node_modules/p-limit": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
- "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz",
+ "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "yocto-queue": "^0.1.0"
+ "yocto-queue": "^1.0.0"
},
"engines": {
- "node": ">=10"
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@commitlint/top-level/node_modules/p-locate": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
- "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz",
+ "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "p-limit": "^3.0.2"
+ "p-limit": "^4.0.0"
},
"engines": {
- "node": ">=10"
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/@commitlint/top-level/node_modules/path-exists": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz",
+ "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ }
+ },
"node_modules/@commitlint/types": {
- "version": "16.2.1",
- "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-16.2.1.tgz",
- "integrity": "sha512-7/z7pA7BM0i8XvMSBynO7xsB3mVQPUZbVn6zMIlp/a091XJ3qAXRXc+HwLYhiIdzzS5fuxxNIHZMGHVD4HJxdA==",
+ "version": "19.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-19.5.0.tgz",
+ "integrity": "sha512-DSHae2obMSMkAtTBSOulg5X7/z+rGLxcXQIkg3OmWvY6wifojge5uVMydfhUvs7yQj+V7jNmRZ2Xzl8GJyqRgg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "chalk": "^4.0.0"
+ "@types/conventional-commits-parser": "^5.0.0",
+ "chalk": "^5.3.0"
},
"engines": {
- "node": ">=v12"
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/types/node_modules/chalk": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz",
+ "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/@cspotcode/source-map-consumer": {
@@ -2308,6 +2447,8 @@
"resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz",
"integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==",
"dev": true,
+ "optional": true,
+ "peer": true,
"engines": {
"node": ">= 12"
}
@@ -2317,6 +2458,8 @@
"resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz",
"integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==",
"dev": true,
+ "optional": true,
+ "peer": true,
"dependencies": {
"@cspotcode/source-map-consumer": "0.8.0"
},
@@ -2461,30 +2604,33 @@
}
},
"node_modules/@jridgewell/set-array": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz",
- "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
+ "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
+ "license": "MIT",
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@jridgewell/source-map": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz",
- "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==",
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz",
+ "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==",
+ "license": "MIT",
"dependencies": {
- "@jridgewell/gen-mapping": "^0.3.0",
- "@jridgewell/trace-mapping": "^0.3.9"
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25"
}
},
"node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
- "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
+ "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==",
+ "license": "MIT",
"dependencies": {
- "@jridgewell/set-array": "^1.0.1",
+ "@jridgewell/set-array": "^1.2.1",
"@jridgewell/sourcemap-codec": "^1.4.10",
- "@jridgewell/trace-mapping": "^0.3.9"
+ "@jridgewell/trace-mapping": "^0.3.24"
},
"engines": {
"node": ">=6.0.0"
@@ -2496,9 +2642,10 @@
"integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="
},
"node_modules/@jridgewell/trace-mapping": {
- "version": "0.3.19",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz",
- "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==",
+ "version": "0.3.25",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
+ "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+ "license": "MIT",
"dependencies": {
"@jridgewell/resolve-uri": "^3.1.0",
"@jridgewell/sourcemap-codec": "^1.4.14"
@@ -2546,13 +2693,11 @@
}
},
"node_modules/@mapbox/node-pre-gyp/node_modules/semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
"dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
+ "license": "ISC",
"bin": {
"semver": "bin/semver.js"
},
@@ -3182,13 +3327,11 @@
}
},
"node_modules/@rollup/plugin-eslint/node_modules/semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
"dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
+ "license": "ISC",
"bin": {
"semver": "bin/semver.js"
},
@@ -3974,6 +4117,13 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/@socket.io/component-emitter": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz",
+ "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@trysound/sax": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
@@ -3987,25 +4137,33 @@
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz",
"integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==",
- "dev": true
+ "dev": true,
+ "optional": true,
+ "peer": true
},
"node_modules/@tsconfig/node12": {
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz",
"integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==",
- "dev": true
+ "dev": true,
+ "optional": true,
+ "peer": true
},
"node_modules/@tsconfig/node14": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz",
"integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==",
- "dev": true
+ "dev": true,
+ "optional": true,
+ "peer": true
},
"node_modules/@tsconfig/node16": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz",
"integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==",
- "dev": true
+ "dev": true,
+ "optional": true,
+ "peer": true
},
"node_modules/@types/body-parser": {
"version": "1.19.2",
@@ -4026,12 +4184,6 @@
"@types/node": "*"
}
},
- "node_modules/@types/component-emitter": {
- "version": "1.2.10",
- "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.10.tgz",
- "integrity": "sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg==",
- "dev": true
- },
"node_modules/@types/connect": {
"version": "3.4.35",
"resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz",
@@ -4051,17 +4203,25 @@
"@types/node": "*"
}
},
- "node_modules/@types/cookie": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz",
- "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==",
- "dev": true
+ "node_modules/@types/conventional-commits-parser": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@types/conventional-commits-parser/-/conventional-commits-parser-5.0.1.tgz",
+ "integrity": "sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
},
"node_modules/@types/cors": {
- "version": "2.8.12",
- "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz",
- "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==",
- "dev": true
+ "version": "2.8.17",
+ "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz",
+ "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
},
"node_modules/@types/eslint": {
"version": "7.29.0",
@@ -4073,18 +4233,20 @@
}
},
"node_modules/@types/eslint-scope": {
- "version": "3.7.3",
- "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz",
- "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==",
+ "version": "3.7.7",
+ "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz",
+ "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==",
+ "license": "MIT",
"dependencies": {
"@types/eslint": "*",
"@types/estree": "*"
}
},
"node_modules/@types/estree": {
- "version": "0.0.51",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz",
- "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ=="
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
+ "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
+ "license": "MIT"
},
"node_modules/@types/express": {
"version": "4.17.13",
@@ -4166,16 +4328,14 @@
"integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==",
"dev": true
},
- "node_modules/@types/minimist": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz",
- "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==",
- "dev": true
- },
"node_modules/@types/node": {
- "version": "17.0.23",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz",
- "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw=="
+ "version": "22.13.1",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.1.tgz",
+ "integrity": "sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew==",
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~6.20.0"
+ }
},
"node_modules/@types/normalize-package-data": {
"version": "2.4.4",
@@ -4267,133 +4427,148 @@
}
},
"node_modules/@webassemblyjs/ast": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz",
- "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==",
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz",
+ "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==",
+ "license": "MIT",
"dependencies": {
- "@webassemblyjs/helper-numbers": "1.11.1",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.1"
+ "@webassemblyjs/helper-numbers": "1.13.2",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2"
}
},
"node_modules/@webassemblyjs/floating-point-hex-parser": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz",
- "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ=="
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz",
+ "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==",
+ "license": "MIT"
},
"node_modules/@webassemblyjs/helper-api-error": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz",
- "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg=="
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz",
+ "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==",
+ "license": "MIT"
},
"node_modules/@webassemblyjs/helper-buffer": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz",
- "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA=="
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz",
+ "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==",
+ "license": "MIT"
},
"node_modules/@webassemblyjs/helper-numbers": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz",
- "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==",
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz",
+ "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==",
+ "license": "MIT",
"dependencies": {
- "@webassemblyjs/floating-point-hex-parser": "1.11.1",
- "@webassemblyjs/helper-api-error": "1.11.1",
+ "@webassemblyjs/floating-point-hex-parser": "1.13.2",
+ "@webassemblyjs/helper-api-error": "1.13.2",
"@xtuc/long": "4.2.2"
}
},
"node_modules/@webassemblyjs/helper-wasm-bytecode": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz",
- "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q=="
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz",
+ "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==",
+ "license": "MIT"
},
"node_modules/@webassemblyjs/helper-wasm-section": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz",
- "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==",
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz",
+ "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==",
+ "license": "MIT",
"dependencies": {
- "@webassemblyjs/ast": "1.11.1",
- "@webassemblyjs/helper-buffer": "1.11.1",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
- "@webassemblyjs/wasm-gen": "1.11.1"
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-buffer": "1.14.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/wasm-gen": "1.14.1"
}
},
"node_modules/@webassemblyjs/ieee754": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz",
- "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==",
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz",
+ "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==",
+ "license": "MIT",
"dependencies": {
"@xtuc/ieee754": "^1.2.0"
}
},
"node_modules/@webassemblyjs/leb128": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz",
- "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==",
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz",
+ "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==",
+ "license": "Apache-2.0",
"dependencies": {
"@xtuc/long": "4.2.2"
}
},
"node_modules/@webassemblyjs/utf8": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz",
- "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ=="
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz",
+ "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==",
+ "license": "MIT"
},
"node_modules/@webassemblyjs/wasm-edit": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz",
- "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==",
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz",
+ "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==",
+ "license": "MIT",
"dependencies": {
- "@webassemblyjs/ast": "1.11.1",
- "@webassemblyjs/helper-buffer": "1.11.1",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
- "@webassemblyjs/helper-wasm-section": "1.11.1",
- "@webassemblyjs/wasm-gen": "1.11.1",
- "@webassemblyjs/wasm-opt": "1.11.1",
- "@webassemblyjs/wasm-parser": "1.11.1",
- "@webassemblyjs/wast-printer": "1.11.1"
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-buffer": "1.14.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/helper-wasm-section": "1.14.1",
+ "@webassemblyjs/wasm-gen": "1.14.1",
+ "@webassemblyjs/wasm-opt": "1.14.1",
+ "@webassemblyjs/wasm-parser": "1.14.1",
+ "@webassemblyjs/wast-printer": "1.14.1"
}
},
"node_modules/@webassemblyjs/wasm-gen": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz",
- "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==",
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz",
+ "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==",
+ "license": "MIT",
"dependencies": {
- "@webassemblyjs/ast": "1.11.1",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
- "@webassemblyjs/ieee754": "1.11.1",
- "@webassemblyjs/leb128": "1.11.1",
- "@webassemblyjs/utf8": "1.11.1"
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/ieee754": "1.13.2",
+ "@webassemblyjs/leb128": "1.13.2",
+ "@webassemblyjs/utf8": "1.13.2"
}
},
"node_modules/@webassemblyjs/wasm-opt": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz",
- "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==",
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz",
+ "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==",
+ "license": "MIT",
"dependencies": {
- "@webassemblyjs/ast": "1.11.1",
- "@webassemblyjs/helper-buffer": "1.11.1",
- "@webassemblyjs/wasm-gen": "1.11.1",
- "@webassemblyjs/wasm-parser": "1.11.1"
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-buffer": "1.14.1",
+ "@webassemblyjs/wasm-gen": "1.14.1",
+ "@webassemblyjs/wasm-parser": "1.14.1"
}
},
"node_modules/@webassemblyjs/wasm-parser": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz",
- "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==",
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz",
+ "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==",
+ "license": "MIT",
"dependencies": {
- "@webassemblyjs/ast": "1.11.1",
- "@webassemblyjs/helper-api-error": "1.11.1",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
- "@webassemblyjs/ieee754": "1.11.1",
- "@webassemblyjs/leb128": "1.11.1",
- "@webassemblyjs/utf8": "1.11.1"
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-api-error": "1.13.2",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/ieee754": "1.13.2",
+ "@webassemblyjs/leb128": "1.13.2",
+ "@webassemblyjs/utf8": "1.13.2"
}
},
"node_modules/@webassemblyjs/wast-printer": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz",
- "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==",
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz",
+ "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==",
+ "license": "MIT",
"dependencies": {
- "@webassemblyjs/ast": "1.11.1",
+ "@webassemblyjs/ast": "1.14.1",
"@xtuc/long": "4.2.2"
}
},
@@ -4436,12 +4611,14 @@
"node_modules/@xtuc/ieee754": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
- "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA=="
+ "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
+ "license": "BSD-3-Clause"
},
"node_modules/@xtuc/long": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
- "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="
+ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
+ "license": "Apache-2.0"
},
"node_modules/@yarnpkg/lockfile": {
"version": "1.1.0",
@@ -4469,9 +4646,10 @@
}
},
"node_modules/acorn": {
- "version": "8.7.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz",
- "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==",
+ "version": "8.14.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
+ "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
+ "license": "MIT",
"bin": {
"acorn": "bin/acorn"
},
@@ -4479,14 +4657,6 @@
"node": ">=0.4.0"
}
},
- "node_modules/acorn-import-assertions": {
- "version": "1.7.6",
- "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.7.6.tgz",
- "integrity": "sha512-FlVvVFA1TX6l3lp8VjDnYYq7R1nyW6x3svAt4nDgrWQ9SBaSh9CnbwgSUTasgfNfOG5HlM1ehugCvM+hjo56LA==",
- "peerDependencies": {
- "acorn": "^8"
- }
- },
"node_modules/acorn-jsx": {
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
@@ -4566,7 +4736,6 @@
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
"integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
- "dev": true,
"dependencies": {
"ajv": "^8.0.0"
},
@@ -4583,7 +4752,6 @@
"version": "8.8.2",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz",
"integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==",
- "dev": true,
"dependencies": {
"fast-deep-equal": "^3.1.1",
"json-schema-traverse": "^1.0.0",
@@ -4598,8 +4766,7 @@
"node_modules/ajv-formats/node_modules/json-schema-traverse": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
- "dev": true
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
},
"node_modules/ajv-keywords": {
"version": "3.5.2",
@@ -4668,6 +4835,7 @@
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
"integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=0.10.0"
}
@@ -4748,7 +4916,9 @@
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
"integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
- "dev": true
+ "dev": true,
+ "optional": true,
+ "peer": true
},
"node_modules/argparse": {
"version": "1.0.10",
@@ -4888,15 +5058,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/arrify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
- "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/ast-types-flow": {
"version": "0.0.7",
"resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz",
@@ -5096,26 +5257,11 @@
"@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
}
},
- "node_modules/backo2": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
- "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=",
- "dev": true
- },
"node_modules/balanced-match": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
},
- "node_modules/base64-arraybuffer": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz",
- "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=",
- "dev": true,
- "engines": {
- "node": ">= 0.6.0"
- }
- },
"node_modules/base64-js": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
@@ -5141,6 +5287,7 @@
"resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
"integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": "^4.5.0 || >= 5.9"
}
@@ -5223,21 +5370,22 @@
"dev": true
},
"node_modules/body-parser": {
- "version": "1.20.0",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz",
- "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==",
+ "version": "1.20.3",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
+ "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"bytes": "3.1.2",
- "content-type": "~1.0.4",
+ "content-type": "~1.0.5",
"debug": "2.6.9",
"depd": "2.0.0",
"destroy": "1.2.0",
"http-errors": "2.0.0",
"iconv-lite": "0.4.24",
"on-finished": "2.4.1",
- "qs": "6.10.3",
- "raw-body": "2.5.1",
+ "qs": "6.13.0",
+ "raw-body": "2.5.2",
"type-is": "~1.6.18",
"unpipe": "1.0.0"
},
@@ -5317,21 +5465,22 @@
}
},
"node_modules/braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "fill-range": "^7.0.1"
+ "fill-range": "^7.1.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/browserslist": {
- "version": "4.21.10",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz",
- "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==",
+ "version": "4.24.4",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz",
+ "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==",
"funding": [
{
"type": "opencollective",
@@ -5346,11 +5495,12 @@
"url": "https://github.com/sponsors/ai"
}
],
+ "license": "MIT",
"dependencies": {
- "caniuse-lite": "^1.0.30001517",
- "electron-to-chromium": "^1.4.477",
- "node-releases": "^2.0.13",
- "update-browserslist-db": "^1.0.11"
+ "caniuse-lite": "^1.0.30001688",
+ "electron-to-chromium": "^1.5.73",
+ "node-releases": "^2.0.19",
+ "update-browserslist-db": "^1.1.1"
},
"bin": {
"browserslist": "cli.js"
@@ -5414,6 +5564,7 @@
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
"integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 0.8"
}
@@ -5428,13 +5579,50 @@
}
},
"node_modules/call-bind": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
- "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz",
+ "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "function-bind": "^1.1.1",
- "get-intrinsic": "^1.0.2"
+ "call-bind-apply-helpers": "^1.0.0",
+ "es-define-property": "^1.0.0",
+ "get-intrinsic": "^1.2.4",
+ "set-function-length": "^1.2.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz",
+ "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/call-bound": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz",
+ "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -5474,23 +5662,6 @@
"node": ">=6"
}
},
- "node_modules/camelcase-keys": {
- "version": "6.2.2",
- "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz",
- "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==",
- "dev": true,
- "dependencies": {
- "camelcase": "^5.3.1",
- "map-obj": "^4.0.0",
- "quick-lru": "^4.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/caniuse-api": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz",
@@ -5504,9 +5675,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001524",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001524.tgz",
- "integrity": "sha512-Jj917pJtYg9HSJBF95HVX3Cdr89JUyLT4IZ8SvM5aDRni95swKgYi3TgYLH5hnGfPE/U1dg6IfZ50UsIlLkwSA==",
+ "version": "1.0.30001697",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001697.tgz",
+ "integrity": "sha512-GwNPlWJin8E+d7Gxq96jxM6w0w+VFeyyXRsjU58emtkYqnbwHqXm5uT2uCmO0RQE9htWknOP4xtBlLmM/gWxvQ==",
"funding": [
{
"type": "opencollective",
@@ -5520,7 +5691,8 @@
"type": "github",
"url": "https://github.com/sponsors/ai"
}
- ]
+ ],
+ "license": "CC-BY-4.0"
},
"node_modules/chalk": {
"version": "4.1.2",
@@ -5788,6 +5960,7 @@
"resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
"integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==",
"dev": true,
+ "license": "MIT",
"engines": {
"iojs": ">= 1.0.0",
"node": ">= 0.12.0"
@@ -5939,12 +6112,6 @@
"dot-prop": "^5.1.0"
}
},
- "node_modules/component-emitter": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
- "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
- "dev": true
- },
"node_modules/compressible": {
"version": "2.0.18",
"resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
@@ -6154,39 +6321,39 @@
]
},
"node_modules/content-type": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
- "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/conventional-changelog-angular": {
- "version": "5.0.13",
- "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz",
- "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz",
+ "integrity": "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==",
"dev": true,
+ "license": "ISC",
"dependencies": {
- "compare-func": "^2.0.0",
- "q": "^1.5.1"
+ "compare-func": "^2.0.0"
},
"engines": {
- "node": ">=10"
+ "node": ">=16"
}
},
"node_modules/conventional-changelog-conventionalcommits": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.0.tgz",
- "integrity": "sha512-sj9tj3z5cnHaSJCYObA9nISf7eq/YjscLPoq6nmew4SiOjxqL2KRpK20fjnjVbpNDjJ2HR3MoVcWKXwbVvzS0A==",
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz",
+ "integrity": "sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==",
"dev": true,
+ "license": "ISC",
"dependencies": {
- "compare-func": "^2.0.0",
- "lodash": "^4.17.15",
- "q": "^1.5.1"
+ "compare-func": "^2.0.0"
},
"engines": {
- "node": ">=10"
+ "node": ">=16"
}
},
"node_modules/conventional-changelog-writer": {
@@ -6252,32 +6419,22 @@
}
},
"node_modules/conventional-commits-parser": {
- "version": "3.2.4",
- "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz",
- "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz",
+ "integrity": "sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "is-text-path": "^1.0.1",
- "JSONStream": "^1.0.4",
- "lodash": "^4.17.15",
- "meow": "^8.0.0",
- "split2": "^3.0.0",
- "through2": "^4.0.0"
+ "is-text-path": "^2.0.0",
+ "JSONStream": "^1.3.5",
+ "meow": "^12.0.1",
+ "split2": "^4.0.0"
},
"bin": {
- "conventional-commits-parser": "cli.js"
+ "conventional-commits-parser": "cli.mjs"
},
"engines": {
- "node": ">=10"
- }
- },
- "node_modules/conventional-commits-parser/node_modules/through2": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz",
- "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==",
- "dev": true,
- "dependencies": {
- "readable-stream": "3"
+ "node": ">=16"
}
},
"node_modules/convert-hrtime": {
@@ -6303,10 +6460,11 @@
}
},
"node_modules/cookie": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz",
- "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==",
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
+ "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 0.6"
}
@@ -6494,6 +6652,7 @@
"resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
"integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"object-assign": "^4",
"vary": "^1"
@@ -6518,30 +6677,13 @@
"node": ">=10"
}
},
- "node_modules/cosmiconfig-typescript-loader": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-1.0.3.tgz",
- "integrity": "sha512-ARo21VjxdacJUcHxgVMEYNIoVPYiuKOEwWBIYej4M22+pEbe3LzKgmht2UPM+0u7/T/KnZf2r/5IzHv2Nwz+/w==",
- "dev": true,
- "dependencies": {
- "cosmiconfig": "^7",
- "ts-node": "^10.4.0"
- },
- "engines": {
- "node": ">=12",
- "npm": ">=6"
- },
- "peerDependencies": {
- "@types/node": "*",
- "cosmiconfig": ">=7",
- "typescript": ">=3"
- }
- },
"node_modules/create-require": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
"integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
- "dev": true
+ "dev": true,
+ "optional": true,
+ "peer": true
},
"node_modules/cross-env": {
"version": "7.0.3",
@@ -6562,10 +6704,11 @@
}
},
"node_modules/cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"path-key": "^3.1.0",
"shebang-command": "^2.0.0",
@@ -6670,13 +6813,11 @@
}
},
"node_modules/css-loader/node_modules/semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
"dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
+ "license": "ISC",
"bin": {
"semver": "bin/semver.js"
},
@@ -6972,12 +7113,16 @@
"dev": true
},
"node_modules/dargs": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz",
- "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==",
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/dargs/-/dargs-8.1.0.tgz",
+ "integrity": "sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/date-fns": {
@@ -7019,37 +7164,6 @@
}
}
},
- "node_modules/decamelize": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
- "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/decamelize-keys": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz",
- "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=",
- "dev": true,
- "dependencies": {
- "decamelize": "^1.1.0",
- "map-obj": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/decamelize-keys/node_modules/map-obj": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
- "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/dedent": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
@@ -7137,6 +7251,24 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/define-data-property": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/define-lazy-prop": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
@@ -7232,6 +7364,8 @@
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
"integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
"dev": true,
+ "optional": true,
+ "peer": true,
"engines": {
"node": ">=0.3.1"
}
@@ -7404,28 +7538,45 @@
}
},
"node_modules/dox": {
- "version": "0.9.1",
- "resolved": "https://registry.npmjs.org/dox/-/dox-0.9.1.tgz",
- "integrity": "sha512-3bC8QeBn1xYWU628qfW7jlA0ssd7PL/x3ndYdT3tq52arRKFHW5zpVHGgkZPahBCZHU60O+TiJossR+RZZW15w==",
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/dox/-/dox-1.0.0.tgz",
+ "integrity": "sha512-y0borLgGiqcXigOItzeBvWEPtZ5tkKMZ7MTa/9xhVCUz6sU1quXTTvbJGOLFZAu/4/nlj2Ui02A/tLqQFBXo+w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "commander": "9.1.0",
- "jsdoctypeparser": "^1.2.0",
- "markdown-it": "12.3.2"
+ "commander": "9.4.0",
+ "jsdoctypeparser": "^9.0.0",
+ "markdown-it": "13.0.1"
},
"bin": {
"dox": "bin/dox"
}
},
"node_modules/dox/node_modules/commander": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-9.1.0.tgz",
- "integrity": "sha512-i0/MaqBtdbnJ4XQs4Pmyb+oFQl+q0lsAmokVUH92SlSw4fkeAcG3bVon+Qt7hmtF+u3Het6o4VgrcY3qAoEB6w==",
+ "version": "9.4.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.0.tgz",
+ "integrity": "sha512-sRPT+umqkz90UA8M1yqYfnHlZA7fF6nSphDtxeywPZ49ysjxDQybzk13CL+mXekDRG92skbcqCLVovuCusNmFw==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": "^12.20.0 || >=14"
}
},
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/duplexer2": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
@@ -7466,9 +7617,10 @@
"dev": true
},
"node_modules/electron-to-chromium": {
- "version": "1.4.505",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.505.tgz",
- "integrity": "sha512-0A50eL5BCCKdxig2SsCXhpuztnB9PfUgRMojj5tMvt8O54lbwz3t6wNgnpiTRosw5QjlJB7ixhVyeg8daLQwSQ=="
+ "version": "1.5.92",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.92.tgz",
+ "integrity": "sha512-BeHgmNobs05N1HMmMZ7YIuHfYBGlq/UmvlsTgg+fsbFs9xVMj+xJHFg19GN04+9Q+r8Xnh9LXqaYIyEWElnNgQ==",
+ "license": "ISC"
},
"node_modules/email-addresses": {
"version": "3.1.0",
@@ -7507,76 +7659,84 @@
}
},
"node_modules/engine.io": {
- "version": "6.1.3",
- "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.1.3.tgz",
- "integrity": "sha512-rqs60YwkvWTLLnfazqgZqLa/aKo+9cueVfEi/dZ8PyGyaf8TLOxj++4QMIgeG3Gn0AhrWiFXvghsoY9L9h25GA==",
+ "version": "6.6.4",
+ "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.4.tgz",
+ "integrity": "sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@types/cookie": "^0.4.1",
"@types/cors": "^2.8.12",
"@types/node": ">=10.0.0",
"accepts": "~1.3.4",
"base64id": "2.0.0",
- "cookie": "~0.4.1",
+ "cookie": "~0.7.2",
"cors": "~2.8.5",
"debug": "~4.3.1",
- "engine.io-parser": "~5.0.3",
- "ws": "~8.2.3"
+ "engine.io-parser": "~5.2.1",
+ "ws": "~8.17.1"
},
"engines": {
- "node": ">=10.0.0"
+ "node": ">=10.2.0"
}
},
"node_modules/engine.io-client": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-5.2.0.tgz",
- "integrity": "sha512-BcIBXGBkT7wKecwnfrSV79G2X5lSUSgeAGgoo60plXf8UsQEvCQww/KMwXSMhVjb98fFYNq20CC5eo8IOAPqsg==",
+ "version": "6.6.3",
+ "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.3.tgz",
+ "integrity": "sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "base64-arraybuffer": "0.1.4",
- "component-emitter": "~1.3.0",
+ "@socket.io/component-emitter": "~3.1.0",
"debug": "~4.3.1",
- "engine.io-parser": "~4.0.1",
- "has-cors": "1.1.0",
- "parseqs": "0.0.6",
- "parseuri": "0.0.6",
- "ws": "~7.4.2",
- "xmlhttprequest-ssl": "~2.0.0",
- "yeast": "0.1.2"
+ "engine.io-parser": "~5.2.1",
+ "ws": "~8.17.1",
+ "xmlhttprequest-ssl": "~2.1.1"
}
},
- "node_modules/engine.io-parser": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-4.0.3.tgz",
- "integrity": "sha512-xEAAY0msNnESNPc00e19y5heTPX4y/TJ36gr8t1voOaNmTojP9b3oK3BbJLFufW2XFPQaaijpFewm2g2Um3uqA==",
+ "node_modules/engine.io-client/node_modules/ws": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz",
+ "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==",
"dev": true,
- "dependencies": {
- "base64-arraybuffer": "0.1.4"
- },
+ "license": "MIT",
"engines": {
- "node": ">=8.0.0"
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
}
},
- "node_modules/engine.io/node_modules/engine.io-parser": {
- "version": "5.0.4",
- "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz",
- "integrity": "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg==",
+ "node_modules/engine.io-parser": {
+ "version": "5.2.3",
+ "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz",
+ "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=10.0.0"
}
},
"node_modules/engine.io/node_modules/ws": {
- "version": "8.2.3",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz",
- "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==",
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz",
+ "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=10.0.0"
},
"peerDependencies": {
"bufferutil": "^4.0.1",
- "utf-8-validate": "^5.0.2"
+ "utf-8-validate": ">=5.0.2"
},
"peerDependenciesMeta": {
"bufferutil": {
@@ -7876,6 +8036,26 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/es-get-iterator": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz",
@@ -7902,9 +8082,23 @@
"dev": true
},
"node_modules/es-module-lexer": {
- "version": "0.9.3",
- "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz",
- "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ=="
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz",
+ "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==",
+ "license": "MIT"
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
},
"node_modules/es-to-primitive": {
"version": "1.2.1",
@@ -7924,9 +8118,10 @@
}
},
"node_modules/escalade": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
- "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "license": "MIT",
"engines": {
"node": ">=6"
}
@@ -8114,10 +8309,11 @@
}
},
"node_modules/eslint-import-resolver-webpack/node_modules/semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
"dev": true,
+ "license": "ISC",
"bin": {
"semver": "bin/semver"
}
@@ -8460,24 +8656,6 @@
"webpack": "^5.0.0"
}
},
- "node_modules/eslint-webpack-plugin/node_modules/schema-utils": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
- "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
- "dev": true,
- "dependencies": {
- "@types/json-schema": "^7.0.8",
- "ajv": "^6.12.5",
- "ajv-keywords": "^3.5.2"
- },
- "engines": {
- "node": ">= 10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- }
- },
"node_modules/eslint/node_modules/ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
@@ -8697,8 +8875,9 @@
"node_modules/etag": {
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
- "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 0.6"
}
@@ -8778,37 +8957,38 @@
}
},
"node_modules/express": {
- "version": "4.18.1",
- "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz",
- "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==",
+ "version": "4.21.2",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz",
+ "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"accepts": "~1.3.8",
"array-flatten": "1.1.1",
- "body-parser": "1.20.0",
+ "body-parser": "1.20.3",
"content-disposition": "0.5.4",
"content-type": "~1.0.4",
- "cookie": "0.5.0",
+ "cookie": "0.7.1",
"cookie-signature": "1.0.6",
"debug": "2.6.9",
"depd": "2.0.0",
- "encodeurl": "~1.0.2",
+ "encodeurl": "~2.0.0",
"escape-html": "~1.0.3",
"etag": "~1.8.1",
- "finalhandler": "1.2.0",
+ "finalhandler": "1.3.1",
"fresh": "0.5.2",
"http-errors": "2.0.0",
- "merge-descriptors": "1.0.1",
+ "merge-descriptors": "1.0.3",
"methods": "~1.1.2",
"on-finished": "2.4.1",
"parseurl": "~1.3.3",
- "path-to-regexp": "0.1.7",
+ "path-to-regexp": "0.1.12",
"proxy-addr": "~2.0.7",
- "qs": "6.10.3",
+ "qs": "6.13.0",
"range-parser": "~1.2.1",
"safe-buffer": "5.2.1",
- "send": "0.18.0",
- "serve-static": "1.15.0",
+ "send": "0.19.0",
+ "serve-static": "1.16.2",
"setprototypeof": "1.2.0",
"statuses": "2.0.1",
"type-is": "~1.6.18",
@@ -8817,6 +8997,10 @@
},
"engines": {
"node": ">= 0.10.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
"node_modules/express/node_modules/array-flatten": {
@@ -8826,10 +9010,11 @@
"dev": true
},
"node_modules/express/node_modules/cookie": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
- "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz",
+ "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 0.6"
}
@@ -8839,6 +9024,7 @@
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"ms": "2.0.0"
}
@@ -8852,14 +9038,25 @@
"node": ">= 0.8"
}
},
+ "node_modules/express/node_modules/encodeurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/express/node_modules/finalhandler": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
- "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz",
+ "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"debug": "2.6.9",
- "encodeurl": "~1.0.2",
+ "encodeurl": "~2.0.0",
"escape-html": "~1.0.3",
"on-finished": "2.4.1",
"parseurl": "~1.3.3",
@@ -8873,14 +9070,16 @@
"node_modules/express/node_modules/ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
- "dev": true
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/express/node_modules/on-finished": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
"integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"ee-first": "1.1.1"
},
@@ -8913,6 +9112,7 @@
"resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
"integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 0.8"
}
@@ -8976,6 +9176,22 @@
"integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
"dev": true
},
+ "node_modules/fast-uri": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz",
+ "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "BSD-3-Clause"
+ },
"node_modules/fastest-levenshtein": {
"version": "1.0.12",
"resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz",
@@ -9078,10 +9294,11 @@
}
},
"node_modules/fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"to-regex-range": "^5.0.1"
},
@@ -9254,9 +9471,9 @@
"dev": true
},
"node_modules/follow-redirects": {
- "version": "1.15.0",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.0.tgz",
- "integrity": "sha512-aExlJShTV4qOUOL7yF1U5tvLCB0xQuudbf6toyYA0E/acBNw71mvjFTnLaRp50aQaYocMR0a/RMMBIHeZnGyjQ==",
+ "version": "1.15.9",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
+ "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
"dev": true,
"funding": [
{
@@ -9264,6 +9481,7 @@
"url": "https://github.com/sponsors/RubenVerborgh"
}
],
+ "license": "MIT",
"engines": {
"node": ">=4.0"
},
@@ -9319,8 +9537,9 @@
"node_modules/fresh": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
- "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 0.6"
}
@@ -9379,10 +9598,11 @@
}
},
"node_modules/fs-monkey": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz",
- "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==",
- "dev": true
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz",
+ "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==",
+ "dev": true,
+ "license": "Unlicense"
},
"node_modules/fs.realpath": {
"version": "1.0.0",
@@ -9404,9 +9624,13 @@
}
},
"node_modules/function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
},
"node_modules/function-timeout": {
"version": "1.0.2",
@@ -9496,14 +9720,25 @@
}
},
"node_modules/get-intrinsic": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
- "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz",
+ "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-symbols": "^1.0.1"
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.0",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -9518,6 +9753,20 @@
"node": ">=8.0.0"
}
},
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/get-stream": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
@@ -9598,31 +9847,21 @@
}
},
"node_modules/git-raw-commits": {
- "version": "2.0.11",
- "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz",
- "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-4.0.0.tgz",
+ "integrity": "sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "dargs": "^7.0.0",
- "lodash": "^4.17.15",
- "meow": "^8.0.0",
- "split2": "^3.0.0",
- "through2": "^4.0.0"
+ "dargs": "^8.0.0",
+ "meow": "^12.0.1",
+ "split2": "^4.0.0"
},
"bin": {
- "git-raw-commits": "cli.js"
+ "git-raw-commits": "cli.mjs"
},
"engines": {
- "node": ">=10"
- }
- },
- "node_modules/git-raw-commits/node_modules/through2": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz",
- "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==",
- "dev": true,
- "dependencies": {
- "readable-stream": "3"
+ "node": ">=16"
}
},
"node_modules/gl-matrix": {
@@ -9664,7 +9903,8 @@
"node_modules/glob-to-regexp": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
- "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="
+ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
+ "license": "BSD-2-Clause"
},
"node_modules/glob/node_modules/brace-expansion": {
"version": "2.0.1",
@@ -9687,16 +9927,30 @@
"node": ">=10"
}
},
- "node_modules/global-dirs": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz",
- "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=",
+ "node_modules/global-directory": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz",
+ "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "ini": "^1.3.4"
+ "ini": "4.1.1"
},
"engines": {
- "node": ">=4"
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/global-directory/node_modules/ini": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz",
+ "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
"node_modules/global-modules": {
@@ -9797,10 +10051,24 @@
"node": ">=0.10.0"
}
},
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/graceful-fs": {
- "version": "4.2.9",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz",
- "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ=="
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "license": "ISC"
},
"node_modules/growly": {
"version": "1.3.0",
@@ -9865,15 +10133,6 @@
"hanson": "hansoncmd.js"
}
},
- "node_modules/hard-rejection": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz",
- "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/has": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
@@ -9890,6 +10149,7 @@
"resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
"integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"ansi-regex": "^2.0.0"
},
@@ -9906,12 +10166,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/has-cors": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
- "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=",
- "dev": true
- },
"node_modules/has-dynamic-import": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/has-dynamic-import/-/has-dynamic-import-2.0.1.tgz",
@@ -9934,11 +10188,25 @@
"node": ">=4"
}
},
- "node_modules/has-symbols": {
+ "node_modules/has-property-descriptors": {
"version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
- "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 0.4"
},
@@ -9967,6 +10235,19 @@
"integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
"dev": true
},
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/he": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
@@ -10260,10 +10541,11 @@
}
},
"node_modules/http-proxy-middleware": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz",
- "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==",
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz",
+ "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@types/http-proxy": "^1.17.8",
"http-proxy": "^1.18.1",
@@ -10521,15 +10803,6 @@
"node": ">=0.8.19"
}
},
- "node_modules/indent-string": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
- "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/index-to-position": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-0.1.2.tgz",
@@ -10949,6 +11222,7 @@
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=0.12.0"
}
@@ -11078,15 +11352,16 @@
}
},
"node_modules/is-text-path": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz",
- "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz",
+ "integrity": "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "text-extensions": "^1.0.0"
+ "text-extensions": "^2.0.0"
},
"engines": {
- "node": ">=0.10.0"
+ "node": ">=8"
}
},
"node_modules/is-typed-array": {
@@ -11338,6 +11613,16 @@
"url": "https://github.com/chalk/supports-color?sponsor=1"
}
},
+ "node_modules/jiti": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz",
+ "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "jiti": "lib/jiti-cli.mjs"
+ }
+ },
"node_modules/js-message": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/js-message/-/js-message-1.0.7.tgz",
@@ -11379,20 +11664,18 @@
}
},
"node_modules/jsdoctypeparser": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-1.2.0.tgz",
- "integrity": "sha1-597cFToRhJ/8UUEUSuhqfvDCU5I=",
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-9.0.0.tgz",
+ "integrity": "sha512-jrTA2jJIL6/DAEILBEh2/w9QxCuwmvNXIry39Ay/HVfhE3o2yVV0U44blYkqdHA/OKloJEqvJy0xU+GSdE2SIw==",
"dev": true,
- "dependencies": {
- "lodash": "^3.7.0"
+ "license": "MIT",
+ "bin": {
+ "jsdoctypeparser": "bin/jsdoctypeparser"
+ },
+ "engines": {
+ "node": ">=10"
}
},
- "node_modules/jsdoctypeparser/node_modules/lodash": {
- "version": "3.10.1",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
- "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=",
- "dev": true
- },
"node_modules/jsesc": {
"version": "2.5.2",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
@@ -11422,12 +11705,20 @@
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
},
"node_modules/json-stable-stringify": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.2.tgz",
- "integrity": "sha512-eunSSaEnxV12z+Z73y/j5N37/In40GK4GmsSy+tEHJMxknvqnA7/djeYtAgW0GsWHUfg+847WJjKaEylk2y09g==",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.2.1.tgz",
+ "integrity": "sha512-Lp6HbbBgosLmJbjx0pBLbgvx68FaFU1sdkmBuckmhhJ88kL13OA51CDtR2yJB50eCNMH9wRqtQNNiAqQH4YXnA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "jsonify": "^0.0.1"
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "isarray": "^2.0.5",
+ "jsonify": "^0.0.1",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -11439,6 +11730,13 @@
"integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
"dev": true
},
+ "node_modules/json-stable-stringify/node_modules/isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/json5": {
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
@@ -11464,6 +11762,7 @@
"resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz",
"integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==",
"dev": true,
+ "license": "Public Domain",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -11471,17 +11770,19 @@
"node_modules/jsonparse": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
- "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=",
+ "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==",
"dev": true,
"engines": [
"node >= 0.2.0"
- ]
+ ],
+ "license": "MIT"
},
"node_modules/JSONStream": {
"version": "1.3.5",
"resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz",
"integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==",
"dev": true,
+ "license": "(MIT OR Apache-2.0)",
"dependencies": {
"jsonparse": "^1.2.0",
"through": ">=2.2.7 <3"
@@ -11743,50 +12044,6 @@
"StandaloneHTML": "bin/singleHTML.js"
}
},
- "node_modules/kw-doc/node_modules/ajv": {
- "version": "4.11.8",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz",
- "integrity": "sha512-I/bSHSNEcFFqXLf91nchoNB9D1Kie3QKcWdchYUaoIg1+1bdWDkdfdlvdIOJbi9U8xR0y+MWc5D+won9v95WlQ==",
- "dev": true,
- "dependencies": {
- "co": "^4.6.0",
- "json-stable-stringify": "^1.0.1"
- }
- },
- "node_modules/kw-doc/node_modules/ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/kw-doc/node_modules/chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^2.2.1",
- "escape-string-regexp": "^1.0.2",
- "has-ansi": "^2.0.0",
- "strip-ansi": "^3.0.0",
- "supports-color": "^2.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/kw-doc/node_modules/chalk/node_modules/supports-color": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
- "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==",
- "dev": true,
- "engines": {
- "node": ">=0.8.0"
- }
- },
"node_modules/kw-doc/node_modules/commander": {
"version": "6.2.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
@@ -11816,41 +12073,6 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/kw-doc/node_modules/has-flag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
- "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/kw-doc/node_modules/parallel-webpack": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/parallel-webpack/-/parallel-webpack-2.6.0.tgz",
- "integrity": "sha512-aOOLfQ40yWWRt8214F0zNWp0DWbeCs7tJaEur0/XUlYU8Yht1sMTYt+eNrbY4VkM4O/SRSme7cdZJTtIantiOw==",
- "dev": true,
- "dependencies": {
- "ajv": "^4.9.2",
- "bluebird": "^3.0.6",
- "chalk": "^1.1.1",
- "interpret": "^1.0.1",
- "lodash.assign": "^4.0.8",
- "lodash.endswith": "^4.0.1",
- "lodash.flatten": "^4.2.0",
- "minimist": "^1.2.0",
- "node-ipc": "^9.1.0",
- "pluralize": "^1.2.1",
- "supports-color": "^3.1.2",
- "worker-farm": "^1.3.1"
- },
- "bin": {
- "parallel-webpack": "bin/run.js"
- },
- "peerDependencies": {
- "webpack": "^1.12.9 || ^2.2.0 || ^3.x || ^4.x"
- }
- },
"node_modules/kw-doc/node_modules/shelljs": {
"version": "0.8.4",
"resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz",
@@ -11868,18 +12090,6 @@
"node": ">=4"
}
},
- "node_modules/kw-doc/node_modules/supports-color": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
- "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==",
- "dev": true,
- "dependencies": {
- "has-flag": "^1.0.0"
- },
- "engines": {
- "node": ">=0.8.0"
- }
- },
"node_modules/language-subtag-registry": {
"version": "0.3.21",
"resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz",
@@ -11924,10 +12134,11 @@
"dev": true
},
"node_modules/linkify-it": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz",
- "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==",
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz",
+ "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"uc.micro": "^1.0.1"
}
@@ -12084,6 +12295,13 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/lodash.kebabcase": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz",
+ "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/lodash.map": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz",
@@ -12102,6 +12320,27 @@
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
"dev": true
},
+ "node_modules/lodash.mergewith": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz",
+ "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash.snakecase": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz",
+ "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash.startcase": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz",
+ "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/lodash.truncate": {
"version": "4.4.2",
"resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
@@ -12121,6 +12360,13 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/lodash.upperfirst": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz",
+ "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/log-symbols": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
@@ -12190,18 +12436,6 @@
"integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==",
"dev": true
},
- "node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "dev": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/magic-string": {
"version": "0.26.2",
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.2.tgz",
@@ -12233,29 +12467,20 @@
"version": "1.3.6",
"resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
"integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
- "dev": true
- },
- "node_modules/map-obj": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz",
- "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==",
"dev": true,
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
+ "optional": true,
+ "peer": true
},
"node_modules/markdown-it": {
- "version": "12.3.2",
- "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz",
- "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==",
+ "version": "13.0.1",
+ "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz",
+ "integrity": "sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"argparse": "^2.0.1",
- "entities": "~2.1.0",
- "linkify-it": "^3.0.1",
+ "entities": "~3.0.1",
+ "linkify-it": "^4.0.1",
"mdurl": "^1.0.1",
"uc.micro": "^1.0.5"
},
@@ -12267,7 +12492,21 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
- "dev": true
+ "dev": true,
+ "license": "Python-2.0"
+ },
+ "node_modules/markdown-it/node_modules/entities": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz",
+ "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
},
"node_modules/marked": {
"version": "12.0.2",
@@ -12332,6 +12571,16 @@
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/mdn-data": {
"version": "2.0.14",
"resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
@@ -12341,8 +12590,9 @@
"node_modules/mdurl": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
- "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=",
- "dev": true
+ "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/media-typer": {
"version": "0.3.0",
@@ -12354,12 +12604,13 @@
}
},
"node_modules/memfs": {
- "version": "3.4.1",
- "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz",
- "integrity": "sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw==",
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz",
+ "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==",
"dev": true,
+ "license": "Unlicense",
"dependencies": {
- "fs-monkey": "1.0.3"
+ "fs-monkey": "^1.0.4"
},
"engines": {
"node": ">= 4.0.0"
@@ -12372,79 +12623,13 @@
"dev": true
},
"node_modules/meow": {
- "version": "8.1.2",
- "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz",
- "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==",
- "dev": true,
- "dependencies": {
- "@types/minimist": "^1.2.0",
- "camelcase-keys": "^6.2.2",
- "decamelize-keys": "^1.1.0",
- "hard-rejection": "^2.1.0",
- "minimist-options": "4.1.0",
- "normalize-package-data": "^3.0.0",
- "read-pkg-up": "^7.0.1",
- "redent": "^3.0.0",
- "trim-newlines": "^3.0.0",
- "type-fest": "^0.18.0",
- "yargs-parser": "^20.2.3"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/meow/node_modules/hosted-git-info": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
- "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
- "dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/meow/node_modules/normalize-package-data": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz",
- "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==",
- "dev": true,
- "dependencies": {
- "hosted-git-info": "^4.0.1",
- "is-core-module": "^2.5.0",
- "semver": "^7.3.4",
- "validate-npm-package-license": "^3.0.1"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/meow/node_modules/semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
- "dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/meow/node_modules/type-fest": {
- "version": "0.18.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz",
- "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==",
+ "version": "12.1.1",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz",
+ "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=10"
+ "node": ">=16.10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
@@ -12457,10 +12642,14 @@
"dev": true
},
"node_modules/merge-descriptors": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
- "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
- "dev": true
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
+ "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
},
"node_modules/merge-stream": {
"version": "2.0.0",
@@ -12486,30 +12675,19 @@
}
},
"node_modules/micromatch": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
- "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "braces": "^3.0.1",
- "picomatch": "^2.2.3"
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
},
"engines": {
"node": ">=8.6"
}
},
- "node_modules/micromatch/node_modules/picomatch": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
- "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
- "dev": true,
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
"node_modules/mime": {
"version": "2.5.2",
"resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz",
@@ -12550,15 +12728,6 @@
"node": ">=6"
}
},
- "node_modules/min-indent": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
- "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
"node_modules/minimalistic-assert": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
@@ -12581,20 +12750,6 @@
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
"integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q=="
},
- "node_modules/minimist-options": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
- "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
- "dev": true,
- "dependencies": {
- "arrify": "^1.0.1",
- "is-plain-obj": "^1.1.0",
- "kind-of": "^6.0.3"
- },
- "engines": {
- "node": ">= 6"
- }
- },
"node_modules/minipass": {
"version": "3.1.5",
"resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.5.tgz",
@@ -12679,9 +12834,9 @@
}
},
"node_modules/nanoid": {
- "version": "3.3.6",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
- "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==",
+ "version": "3.3.8",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz",
+ "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==",
"dev": true,
"funding": [
{
@@ -12689,6 +12844,7 @@
"url": "https://github.com/sponsors/ai"
}
],
+ "license": "MIT",
"bin": {
"nanoid": "bin/nanoid.cjs"
},
@@ -12831,13 +12987,11 @@
}
},
"node_modules/node-notifier/node_modules/semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
"dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
+ "license": "ISC",
"bin": {
"semver": "bin/semver.js"
},
@@ -12870,9 +13024,10 @@
}
},
"node_modules/node-releases": {
- "version": "2.0.13",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz",
- "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ=="
+ "version": "2.0.19",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
+ "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
+ "license": "MIT"
},
"node_modules/normalize-package-data": {
"version": "2.5.0",
@@ -12887,10 +13042,11 @@
}
},
"node_modules/normalize-package-data/node_modules/semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
"dev": true,
+ "license": "ISC",
"bin": {
"semver": "bin/semver"
}
@@ -16109,10 +16265,14 @@
}
},
"node_modules/object-inspect": {
- "version": "1.12.0",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz",
- "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==",
+ "version": "1.13.4",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
"dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -16519,6 +16679,109 @@
"node": ">=6"
}
},
+ "node_modules/pako": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
+ "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="
+ },
+ "node_modules/parallel-webpack": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/parallel-webpack/-/parallel-webpack-2.6.0.tgz",
+ "integrity": "sha512-aOOLfQ40yWWRt8214F0zNWp0DWbeCs7tJaEur0/XUlYU8Yht1sMTYt+eNrbY4VkM4O/SRSme7cdZJTtIantiOw==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "ajv": "^4.9.2",
+ "bluebird": "^3.0.6",
+ "chalk": "^1.1.1",
+ "interpret": "^1.0.1",
+ "lodash.assign": "^4.0.8",
+ "lodash.endswith": "^4.0.1",
+ "lodash.flatten": "^4.2.0",
+ "minimist": "^1.2.0",
+ "node-ipc": "^9.1.0",
+ "pluralize": "^1.2.1",
+ "supports-color": "^3.1.2",
+ "worker-farm": "^1.3.1"
+ },
+ "bin": {
+ "parallel-webpack": "bin/run.js"
+ },
+ "peerDependencies": {
+ "webpack": "^1.12.9 || ^2.2.0 || ^3.x || ^4.x"
+ }
+ },
+ "node_modules/parallel-webpack/node_modules/ajv": {
+ "version": "4.11.8",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz",
+ "integrity": "sha512-I/bSHSNEcFFqXLf91nchoNB9D1Kie3QKcWdchYUaoIg1+1bdWDkdfdlvdIOJbi9U8xR0y+MWc5D+won9v95WlQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "co": "^4.6.0",
+ "json-stable-stringify": "^1.0.1"
+ }
+ },
+ "node_modules/parallel-webpack/node_modules/ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/parallel-webpack/node_modules/chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^2.2.1",
+ "escape-string-regexp": "^1.0.2",
+ "has-ansi": "^2.0.0",
+ "strip-ansi": "^3.0.0",
+ "supports-color": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/parallel-webpack/node_modules/chalk/node_modules/supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/parallel-webpack/node_modules/has-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/parallel-webpack/node_modules/supports-color": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+ "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
"node_modules/param-case": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
@@ -16611,18 +16874,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/parseqs": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz",
- "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==",
- "dev": true
- },
- "node_modules/parseuri": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz",
- "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==",
- "dev": true
- },
"node_modules/parseurl": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
@@ -16702,10 +16953,11 @@
}
},
"node_modules/patch-package/node_modules/cross-spawn": {
- "version": "6.0.5",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
- "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+ "version": "6.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz",
+ "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"nice-try": "^1.0.4",
"path-key": "^2.0.1",
@@ -16789,10 +17041,11 @@
}
},
"node_modules/patch-package/node_modules/semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
"dev": true,
+ "license": "ISC",
"bin": {
"semver": "bin/semver"
}
@@ -16871,10 +17124,11 @@
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
},
"node_modules/path-to-regexp": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
- "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=",
- "dev": true
+ "version": "0.1.12",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz",
+ "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/path-type": {
"version": "4.0.0",
@@ -16886,15 +17140,17 @@
}
},
"node_modules/picocolors": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
- "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "license": "ISC"
},
"node_modules/picomatch": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
- "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=8.6"
},
@@ -17210,13 +17466,11 @@
}
},
"node_modules/postcss-loader/node_modules/semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
"dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
+ "license": "ISC",
"bin": {
"semver": "bin/semver.js"
},
@@ -17815,16 +18069,6 @@
"node": ">=6"
}
},
- "node_modules/q": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
- "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
- "dev": true,
- "engines": {
- "node": ">=0.6.0",
- "teleport": ">=0.2.0"
- }
- },
"node_modules/qjobs": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz",
@@ -17835,12 +18079,13 @@
}
},
"node_modules/qs": {
- "version": "6.10.3",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz",
- "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==",
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
+ "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
"dev": true,
+ "license": "BSD-3-Clause",
"dependencies": {
- "side-channel": "^1.0.4"
+ "side-channel": "^1.0.6"
},
"engines": {
"node": ">=0.6"
@@ -17882,15 +18127,6 @@
}
]
},
- "node_modules/quick-lru": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
- "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/randombytes": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
@@ -17909,10 +18145,11 @@
}
},
"node_modules/raw-body": {
- "version": "2.5.1",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
- "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
+ "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"bytes": "3.1.2",
"http-errors": "2.0.0",
@@ -18087,56 +18324,6 @@
"node": ">=4"
}
},
- "node_modules/read-pkg-up": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
- "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
- "dev": true,
- "dependencies": {
- "find-up": "^4.1.0",
- "read-pkg": "^5.2.0",
- "type-fest": "^0.8.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/read-pkg-up/node_modules/read-pkg": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
- "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
- "dev": true,
- "dependencies": {
- "@types/normalize-package-data": "^2.4.0",
- "normalize-package-data": "^2.5.0",
- "parse-json": "^5.0.0",
- "type-fest": "^0.6.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/read-pkg-up/node_modules/read-pkg/node_modules/type-fest": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
- "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/read-pkg-up/node_modules/type-fest": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
- "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/read-pkg/node_modules/path-type": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
@@ -18185,19 +18372,6 @@
"node": ">= 0.10"
}
},
- "node_modules/redent": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
- "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
- "dev": true,
- "dependencies": {
- "indent-string": "^4.0.0",
- "strip-indent": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/regenerate": {
"version": "1.4.2",
"resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
@@ -18366,7 +18540,6 @@
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
"integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
- "dev": true,
"engines": {
"node": ">=0.10.0"
}
@@ -18427,18 +18600,6 @@
"node": ">=8"
}
},
- "node_modules/resolve-global": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz",
- "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==",
- "dev": true,
- "dependencies": {
- "global-dirs": "^0.1.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/restore-cursor": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
@@ -18522,10 +18683,11 @@
}
},
"node_modules/rollup": {
- "version": "2.73.0",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.73.0.tgz",
- "integrity": "sha512-h/UngC3S4Zt28mB3g0+2YCMegT5yoftnQplwzPqGZcKvlld5e+kT/QRmJiL+qxGyZKOYpgirWGdLyEO1b0dpLQ==",
+ "version": "2.79.2",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz",
+ "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==",
"dev": true,
+ "license": "MIT",
"bin": {
"rollup": "dist/bin/rollup"
},
@@ -18555,10 +18717,11 @@
}
},
"node_modules/rollup-plugin-auto-external/node_modules/semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
"dev": true,
+ "license": "ISC",
"bin": {
"semver": "bin/semver"
}
@@ -18818,11 +18981,12 @@
"dev": true
},
"node_modules/schema-utils": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz",
- "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==",
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
+ "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+ "license": "MIT",
"dependencies": {
- "@types/json-schema": "^7.0.6",
+ "@types/json-schema": "^7.0.8",
"ajv": "^6.12.5",
"ajv-keywords": "^3.5.2"
},
@@ -19146,13 +19310,11 @@
}
},
"node_modules/semantic-release/node_modules/semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
"dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
+ "license": "ISC",
"bin": {
"semver": "bin/semver.js"
},
@@ -19199,22 +19361,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/semantic-release/node_modules/typescript": {
- "version": "5.6.3",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz",
- "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==",
- "dev": true,
- "license": "Apache-2.0",
- "optional": true,
- "peer": true,
- "bin": {
- "tsc": "bin/tsc",
- "tsserver": "bin/tsserver"
- },
- "engines": {
- "node": ">=14.17"
- }
- },
"node_modules/semantic-release/node_modules/unicorn-magic": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz",
@@ -19315,10 +19461,11 @@
}
},
"node_modules/send": {
- "version": "0.18.0",
- "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
- "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz",
+ "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"debug": "2.6.9",
"depd": "2.0.0",
@@ -19343,6 +19490,7 @@
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"ms": "2.0.0"
}
@@ -19350,14 +19498,16 @@
"node_modules/send/node_modules/debug/node_modules/ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
- "dev": true
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/send/node_modules/depd": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
"integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 0.8"
}
@@ -19367,6 +19517,7 @@
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
"dev": true,
+ "license": "MIT",
"bin": {
"mime": "cli.js"
},
@@ -19378,13 +19529,15 @@
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/send/node_modules/on-finished": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
"integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"ee-first": "1.1.1"
},
@@ -19397,14 +19550,16 @@
"resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
"integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/serialize-javascript": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
- "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
+ "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
+ "license": "BSD-3-Clause",
"dependencies": {
"randombytes": "^2.1.0"
}
@@ -19464,26 +19619,55 @@
"dev": true
},
"node_modules/serve-static": {
- "version": "1.15.0",
- "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
- "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
+ "version": "1.16.2",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz",
+ "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "encodeurl": "~1.0.2",
+ "encodeurl": "~2.0.0",
"escape-html": "~1.0.3",
"parseurl": "~1.3.3",
- "send": "0.18.0"
+ "send": "0.19.0"
},
"engines": {
"node": ">= 0.8.0"
}
},
+ "node_modules/serve-static/node_modules/encodeurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/set-blocking": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
"integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
"dev": true
},
+ "node_modules/set-function-length": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
+ "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "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.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/setprototypeof": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
@@ -19573,14 +19757,76 @@
"dev": true
},
"node_modules/side-channel": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
- "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.0",
- "get-intrinsic": "^1.0.2",
- "object-inspect": "^1.9.0"
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3",
+ "side-channel-list": "^1.0.0",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-list": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
+ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-weakmap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3",
+ "side-channel-map": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -19707,54 +19953,81 @@
}
},
"node_modules/socket.io": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.4.1.tgz",
- "integrity": "sha512-s04vrBswdQBUmuWJuuNTmXUVJhP0cVky8bBDhdkf8y0Ptsu7fKU2LuLbts9g+pdmAdyMMn8F/9Mf1/wbtUN0fg==",
+ "version": "4.8.1",
+ "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.1.tgz",
+ "integrity": "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"accepts": "~1.3.4",
"base64id": "~2.0.0",
+ "cors": "~2.8.5",
"debug": "~4.3.2",
- "engine.io": "~6.1.0",
- "socket.io-adapter": "~2.3.3",
- "socket.io-parser": "~4.0.4"
+ "engine.io": "~6.6.0",
+ "socket.io-adapter": "~2.5.2",
+ "socket.io-parser": "~4.2.4"
},
"engines": {
- "node": ">=10.0.0"
+ "node": ">=10.2.0"
}
},
"node_modules/socket.io-adapter": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.3.tgz",
- "integrity": "sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ==",
- "dev": true
+ "version": "2.5.5",
+ "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz",
+ "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "~4.3.4",
+ "ws": "~8.17.1"
+ }
+ },
+ "node_modules/socket.io-adapter/node_modules/ws": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz",
+ "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
},
"node_modules/socket.io-client": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.2.0.tgz",
- "integrity": "sha512-3GJ2KMh7inJUNAOjgf8NaKJZJa9uRyfryh2LrVJyKyxmzoXlfW9DeDNqylJn0ovOFt4e/kRLNWzMt/YqqEWYSA==",
+ "version": "4.8.1",
+ "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.1.tgz",
+ "integrity": "sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@types/component-emitter": "^1.2.10",
- "backo2": "~1.0.2",
- "component-emitter": "~1.3.0",
+ "@socket.io/component-emitter": "~3.1.0",
"debug": "~4.3.2",
- "engine.io-client": "~5.2.0",
- "parseuri": "0.0.6",
- "socket.io-parser": "~4.0.4"
+ "engine.io-client": "~6.6.1",
+ "socket.io-parser": "~4.2.4"
},
"engines": {
"node": ">=10.0.0"
}
},
"node_modules/socket.io-parser": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz",
- "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==",
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz",
+ "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@types/component-emitter": "^1.2.10",
- "component-emitter": "~1.3.0",
+ "@socket.io/component-emitter": "~3.1.0",
"debug": "~4.3.1"
},
"engines": {
@@ -19887,12 +20160,13 @@
}
},
"node_modules/split2": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz",
- "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==",
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz",
+ "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==",
"dev": true,
- "dependencies": {
- "readable-stream": "^3.0.0"
+ "license": "ISC",
+ "engines": {
+ "node": ">= 10.x"
}
},
"node_modules/sprintf-js": {
@@ -20156,6 +20430,7 @@
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
"integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"ansi-regex": "^2.0.0"
},
@@ -20181,18 +20456,6 @@
"node": ">=6"
}
},
- "node_modules/strip-indent": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
- "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
- "dev": true,
- "dependencies": {
- "min-indent": "^1.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/strip-json-comments": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
@@ -20510,20 +20773,31 @@
}
},
"node_modules/tar": {
- "version": "6.1.11",
- "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz",
- "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==",
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz",
+ "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==",
"dev": true,
+ "license": "ISC",
"dependencies": {
"chownr": "^2.0.0",
"fs-minipass": "^2.0.0",
- "minipass": "^3.0.0",
+ "minipass": "^5.0.0",
"minizlib": "^2.1.1",
"mkdirp": "^1.0.3",
"yallist": "^4.0.0"
},
"engines": {
- "node": ">= 10"
+ "node": ">=10"
+ }
+ },
+ "node_modules/tar/node_modules/minipass": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
+ "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=8"
}
},
"node_modules/tar/node_modules/mkdirp": {
@@ -20594,12 +20868,13 @@
}
},
"node_modules/terser": {
- "version": "5.14.2",
- "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz",
- "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==",
+ "version": "5.38.0",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.38.0.tgz",
+ "integrity": "sha512-a4GD5R1TjEeuCT6ZRiYMHmIf7okbCPEuhQET8bczV6FrQMMlFXA1n+G0KKjdlFCm3TEHV77GxfZB3vZSUQGFpg==",
+ "license": "BSD-2-Clause",
"dependencies": {
- "@jridgewell/source-map": "^0.3.2",
- "acorn": "^8.5.0",
+ "@jridgewell/source-map": "^0.3.3",
+ "acorn": "^8.8.2",
"commander": "^2.20.0",
"source-map-support": "~0.5.20"
},
@@ -20611,16 +20886,16 @@
}
},
"node_modules/terser-webpack-plugin": {
- "version": "5.2.4",
- "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.2.4.tgz",
- "integrity": "sha512-E2CkNMN+1cho04YpdANyRrn8CyN4yMy+WdFKZIySFZrGXZxJwJP6PMNGGc/Mcr6qygQHUUqRxnAPmi0M9f00XA==",
- "dependencies": {
- "jest-worker": "^27.0.6",
- "p-limit": "^3.1.0",
- "schema-utils": "^3.1.1",
- "serialize-javascript": "^6.0.0",
- "source-map": "^0.6.1",
- "terser": "^5.7.2"
+ "version": "5.3.11",
+ "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.11.tgz",
+ "integrity": "sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.25",
+ "jest-worker": "^27.4.5",
+ "schema-utils": "^4.3.0",
+ "serialize-javascript": "^6.0.2",
+ "terser": "^5.31.1"
},
"engines": {
"node": ">= 10.13.0"
@@ -20644,28 +20919,50 @@
}
}
},
- "node_modules/terser-webpack-plugin/node_modules/p-limit": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
- "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "node_modules/terser-webpack-plugin/node_modules/ajv": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
+ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+ "license": "MIT",
"dependencies": {
- "yocto-queue": "^0.1.0"
- },
- "engines": {
- "node": ">=10"
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+ "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3"
+ },
+ "peerDependencies": {
+ "ajv": "^8.8.2"
}
},
+ "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "license": "MIT"
+ },
"node_modules/terser-webpack-plugin/node_modules/schema-utils": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
- "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz",
+ "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==",
+ "license": "MIT",
"dependencies": {
- "@types/json-schema": "^7.0.8",
- "ajv": "^6.12.5",
- "ajv-keywords": "^3.5.2"
+ "@types/json-schema": "^7.0.9",
+ "ajv": "^8.9.0",
+ "ajv-formats": "^2.1.1",
+ "ajv-keywords": "^5.1.0"
},
"engines": {
"node": ">= 10.13.0"
@@ -20724,12 +21021,16 @@
}
},
"node_modules/text-extensions": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz",
- "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==",
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz",
+ "integrity": "sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=0.10"
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/text-table": {
@@ -20820,6 +21121,13 @@
"integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=",
"dev": true
},
+ "node_modules/tinyexec": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz",
+ "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/tmp": {
"version": "0.0.33",
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
@@ -20846,6 +21154,7 @@
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"is-number": "^7.0.0"
},
@@ -20892,15 +21201,6 @@
"tree-kill": "cli.js"
}
},
- "node_modules/trim-newlines": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz",
- "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/trim-repeated": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz",
@@ -20918,6 +21218,8 @@
"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.4.0.tgz",
"integrity": "sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A==",
"dev": true,
+ "optional": true,
+ "peer": true,
"dependencies": {
"@cspotcode/source-map-support": "0.7.0",
"@tsconfig/node10": "^1.0.7",
@@ -21031,16 +21333,18 @@
}
},
"node_modules/typescript": {
- "version": "4.5.4",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz",
- "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==",
+ "version": "5.7.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz",
+ "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==",
"dev": true,
+ "license": "Apache-2.0",
+ "peer": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
},
"engines": {
- "node": ">=4.2.0"
+ "node": ">=14.17"
}
},
"node_modules/ua-parser-js": {
@@ -21066,7 +21370,8 @@
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz",
"integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/uglify-js": {
"version": "3.14.2",
@@ -21096,6 +21401,12 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/undici-types": {
+ "version": "6.20.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz",
+ "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==",
+ "license": "MIT"
+ },
"node_modules/unicode-canonical-property-names-ecmascript": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
@@ -21207,9 +21518,9 @@
}
},
"node_modules/update-browserslist-db": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz",
- "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==",
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz",
+ "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==",
"funding": [
{
"type": "opencollective",
@@ -21224,9 +21535,10 @@
"url": "https://github.com/sponsors/ai"
}
],
+ "license": "MIT",
"dependencies": {
- "escalade": "^3.1.1",
- "picocolors": "^1.0.0"
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
},
"bin": {
"update-browserslist-db": "cli.js"
@@ -21253,6 +21565,14 @@
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
}
},
+ "node_modules/utif": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/utif/-/utif-3.1.0.tgz",
+ "integrity": "sha512-WEo4D/xOvFW53K5f5QTaTbbiORcm2/pCL9P6qmJnup+17eYfKaEhDeX9PeQkuyEoIxlbGklDuGl8xwuXYMrrXQ==",
+ "dependencies": {
+ "pako": "^1.0.5"
+ }
+ },
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
@@ -21328,9 +21648,10 @@
}
},
"node_modules/watchpack": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
- "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==",
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz",
+ "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==",
+ "license": "MIT",
"dependencies": {
"glob-to-regexp": "^0.4.1",
"graceful-fs": "^4.1.2"
@@ -21364,33 +21685,33 @@
"dev": true
},
"node_modules/webpack": {
- "version": "5.76.0",
- "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.0.tgz",
- "integrity": "sha512-l5sOdYBDunyf72HW8dF23rFtWq/7Zgvt/9ftMof71E/yUb1YLOBmTgA2K4vQthB3kotMrSj609txVE0dnr2fjA==",
- "dependencies": {
- "@types/eslint-scope": "^3.7.3",
- "@types/estree": "^0.0.51",
- "@webassemblyjs/ast": "1.11.1",
- "@webassemblyjs/wasm-edit": "1.11.1",
- "@webassemblyjs/wasm-parser": "1.11.1",
- "acorn": "^8.7.1",
- "acorn-import-assertions": "^1.7.6",
- "browserslist": "^4.14.5",
+ "version": "5.97.1",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz",
+ "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/eslint-scope": "^3.7.7",
+ "@types/estree": "^1.0.6",
+ "@webassemblyjs/ast": "^1.14.1",
+ "@webassemblyjs/wasm-edit": "^1.14.1",
+ "@webassemblyjs/wasm-parser": "^1.14.1",
+ "acorn": "^8.14.0",
+ "browserslist": "^4.24.0",
"chrome-trace-event": "^1.0.2",
- "enhanced-resolve": "^5.10.0",
- "es-module-lexer": "^0.9.0",
+ "enhanced-resolve": "^5.17.1",
+ "es-module-lexer": "^1.2.1",
"eslint-scope": "5.1.1",
"events": "^3.2.0",
"glob-to-regexp": "^0.4.1",
- "graceful-fs": "^4.2.9",
+ "graceful-fs": "^4.2.11",
"json-parse-even-better-errors": "^2.3.1",
"loader-runner": "^4.2.0",
"mime-types": "^2.1.27",
"neo-async": "^2.6.2",
- "schema-utils": "^3.1.0",
+ "schema-utils": "^3.2.0",
"tapable": "^2.1.1",
- "terser-webpack-plugin": "^5.1.3",
- "watchpack": "^2.4.0",
+ "terser-webpack-plugin": "^5.3.10",
+ "watchpack": "^2.4.1",
"webpack-sources": "^3.2.3"
},
"bin": {
@@ -21556,13 +21877,14 @@
}
},
"node_modules/webpack-dev-middleware": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.1.tgz",
- "integrity": "sha512-81EujCKkyles2wphtdrnPg/QqegC/AtqNH//mQkBYSMqwFVCQrxM6ktB2O/SPlZy7LqeEfTbV3cZARGQz6umhg==",
+ "version": "5.3.4",
+ "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz",
+ "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"colorette": "^2.0.10",
- "memfs": "^3.4.1",
+ "memfs": "^3.4.3",
"mime-types": "^2.1.31",
"range-parser": "^1.2.1",
"schema-utils": "^4.0.0"
@@ -21753,16 +22075,17 @@
}
},
"node_modules/webpack-dev-server/node_modules/ws": {
- "version": "8.6.0",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.6.0.tgz",
- "integrity": "sha512-AzmM3aH3gk0aX7/rZLYvjdvZooofDu3fFOzGqcSnQ1tOcTWwhM/o+q++E8mAyVVIyUdajrkzWUGftaVSDLn1bw==",
+ "version": "8.18.0",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz",
+ "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=10.0.0"
},
"peerDependencies": {
"bufferutil": "^4.0.1",
- "utf-8-validate": "^5.0.2"
+ "utf-8-validate": ">=5.0.2"
},
"peerDependenciesMeta": {
"bufferutil": {
@@ -21834,9 +22157,10 @@
}
},
"node_modules/webpack/node_modules/enhanced-resolve": {
- "version": "5.12.0",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz",
- "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==",
+ "version": "5.18.1",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz",
+ "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==",
+ "license": "MIT",
"dependencies": {
"graceful-fs": "^4.2.4",
"tapable": "^2.2.0"
@@ -21845,27 +22169,11 @@
"node": ">=10.13.0"
}
},
- "node_modules/webpack/node_modules/schema-utils": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
- "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
- "dependencies": {
- "@types/json-schema": "^7.0.8",
- "ajv": "^6.12.5",
- "ajv-keywords": "^3.5.2"
- },
- "engines": {
- "node": ">= 10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- }
- },
"node_modules/webpack/node_modules/tapable": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
"integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
+ "license": "MIT",
"engines": {
"node": ">=6"
}
@@ -22086,10 +22394,11 @@
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
},
"node_modules/ws": {
- "version": "7.4.6",
- "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz",
- "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==",
+ "version": "7.5.10",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz",
+ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=8.3.0"
},
@@ -22107,27 +22416,13 @@
}
},
"node_modules/wslink": {
- "version": "1.6.4",
- "resolved": "https://registry.npmjs.org/wslink/-/wslink-1.6.4.tgz",
- "integrity": "sha512-mWabC1eJLH+uSdndsnEkZcYpkh6Z+Xgzh8ph7jR8KRDQ61akeebVB2xZ/rzvltu/xGdzZe+ngoDgwkXiD5fMCw==",
- "dev": true,
- "dependencies": {
- "json5": "2.2.0"
- }
- },
- "node_modules/wslink/node_modules/json5": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz",
- "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==",
+ "version": "1.12.4",
+ "resolved": "https://registry.npmjs.org/wslink/-/wslink-1.12.4.tgz",
+ "integrity": "sha512-4AJtHZ0qtBa7zOp0e3R5OJxQ6HY9eo+jDPcjms6E2ChXgQ5D4hlMynFF8mEFXx54+PmLo8f2DMiM9bxN6QTAjg==",
"dev": true,
+ "license": "BSD-3-Clause",
"dependencies": {
- "minimist": "^1.2.5"
- },
- "bin": {
- "json5": "lib/cli.js"
- },
- "engines": {
- "node": ">=6"
+ "json5": "2.2.3"
}
},
"node_modules/xml2js": {
@@ -22180,9 +22475,9 @@
}
},
"node_modules/xmlhttprequest-ssl": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz",
- "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==",
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz",
+ "integrity": "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==",
"dev": true,
"engines": {
"node": ">=0.4.0"
@@ -22248,27 +22543,25 @@
"node": ">=10"
}
},
- "node_modules/yeast": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
- "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=",
- "dev": true
- },
"node_modules/yn": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
"integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
"dev": true,
+ "optional": true,
+ "peer": true,
"engines": {
"node": ">=6"
}
},
"node_modules/yocto-queue": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
- "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz",
+ "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==",
+ "dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=10"
+ "node": ">=12.20"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
@@ -23567,19 +23860,17 @@
"dev": true
},
"@commitlint/cli": {
- "version": "16.2.4",
- "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-16.2.4.tgz",
- "integrity": "sha512-rbvqvz9JI+uiKxV2nH65BtSU01fsADd3bxe9fWtO3rM0c+CI/H9FfzKkDLvSRmXjvk1G2/wXlCGeqO9IBT4X9g==",
- "dev": true,
- "requires": {
- "@commitlint/format": "^16.2.1",
- "@commitlint/lint": "^16.2.4",
- "@commitlint/load": "^16.2.4",
- "@commitlint/read": "^16.2.1",
- "@commitlint/types": "^16.2.1",
- "lodash": "^4.17.19",
- "resolve-from": "5.0.0",
- "resolve-global": "1.0.0",
+ "version": "19.7.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-19.7.1.tgz",
+ "integrity": "sha512-iObGjR1tE/PfDtDTEfd+tnRkB3/HJzpQqRTyofS2MPPkDn1mp3DBC8SoPDayokfAy+xKhF8+bwRCJO25Nea0YQ==",
+ "dev": true,
+ "requires": {
+ "@commitlint/format": "^19.5.0",
+ "@commitlint/lint": "^19.7.1",
+ "@commitlint/load": "^19.6.1",
+ "@commitlint/read": "^19.5.0",
+ "@commitlint/types": "^19.5.0",
+ "tinyexec": "^0.3.0",
"yargs": "^17.0.0"
},
"dependencies": {
@@ -23601,261 +23892,333 @@
}
},
"@commitlint/config-conventional": {
- "version": "16.2.4",
- "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-16.2.4.tgz",
- "integrity": "sha512-av2UQJa3CuE5P0dzxj/o/B9XVALqYzEViHrMXtDrW9iuflrqCStWBAioijppj9URyz6ONpohJKAtSdgAOE0gkA==",
+ "version": "19.7.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-19.7.1.tgz",
+ "integrity": "sha512-fsEIF8zgiI/FIWSnykdQNj/0JE4av08MudLTyYHm4FlLWemKoQvPNUYU2M/3tktWcCEyq7aOkDDgtjrmgWFbvg==",
"dev": true,
"requires": {
- "conventional-changelog-conventionalcommits": "^4.3.1"
+ "@commitlint/types": "^19.5.0",
+ "conventional-changelog-conventionalcommits": "^7.0.2"
}
},
"@commitlint/config-validator": {
- "version": "16.2.1",
- "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-16.2.1.tgz",
- "integrity": "sha512-hogSe0WGg7CKmp4IfNbdNES3Rq3UEI4XRPB8JL4EPgo/ORq5nrGTVzxJh78omibNuB8Ho4501Czb1Er1MoDWpw==",
+ "version": "19.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-19.5.0.tgz",
+ "integrity": "sha512-CHtj92H5rdhKt17RmgALhfQt95VayrUo2tSqY9g2w+laAXyk7K/Ef6uPm9tn5qSIwSmrLjKaXK9eiNuxmQrDBw==",
"dev": true,
"requires": {
- "@commitlint/types": "^16.2.1",
- "ajv": "^6.12.6"
+ "@commitlint/types": "^19.5.0",
+ "ajv": "^8.11.0"
+ },
+ "dependencies": {
+ "ajv": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
+ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ }
+ },
+ "json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true
+ }
}
},
"@commitlint/ensure": {
- "version": "16.2.1",
- "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-16.2.1.tgz",
- "integrity": "sha512-/h+lBTgf1r5fhbDNHOViLuej38i3rZqTQnBTk+xEg+ehOwQDXUuissQ5GsYXXqI5uGy+261ew++sT4EA3uBJ+A==",
+ "version": "19.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-19.5.0.tgz",
+ "integrity": "sha512-Kv0pYZeMrdg48bHFEU5KKcccRfKmISSm9MvgIgkpI6m+ohFTB55qZlBW6eYqh/XDfRuIO0x4zSmvBjmOwWTwkg==",
"dev": true,
"requires": {
- "@commitlint/types": "^16.2.1",
- "lodash": "^4.17.19"
+ "@commitlint/types": "^19.5.0",
+ "lodash.camelcase": "^4.3.0",
+ "lodash.kebabcase": "^4.1.1",
+ "lodash.snakecase": "^4.1.1",
+ "lodash.startcase": "^4.4.0",
+ "lodash.upperfirst": "^4.3.1"
}
},
"@commitlint/execute-rule": {
- "version": "16.2.1",
- "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-16.2.1.tgz",
- "integrity": "sha512-oSls82fmUTLM6cl5V3epdVo4gHhbmBFvCvQGHBRdQ50H/690Uq1Dyd7hXMuKITCIdcnr9umyDkr8r5C6HZDF3g==",
+ "version": "19.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-19.5.0.tgz",
+ "integrity": "sha512-aqyGgytXhl2ejlk+/rfgtwpPexYyri4t8/n4ku6rRJoRhGZpLFMqrZ+YaubeGysCP6oz4mMA34YSTaSOKEeNrg==",
"dev": true
},
"@commitlint/format": {
- "version": "16.2.1",
- "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-16.2.1.tgz",
- "integrity": "sha512-Yyio9bdHWmNDRlEJrxHKglamIk3d6hC0NkEUW6Ti6ipEh2g0BAhy8Od6t4vLhdZRa1I2n+gY13foy+tUgk0i1Q==",
+ "version": "19.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-19.5.0.tgz",
+ "integrity": "sha512-yNy088miE52stCI3dhG/vvxFo9e4jFkU1Mj3xECfzp/bIS/JUay4491huAlVcffOoMK1cd296q0W92NlER6r3A==",
"dev": true,
"requires": {
- "@commitlint/types": "^16.2.1",
- "chalk": "^4.0.0"
+ "@commitlint/types": "^19.5.0",
+ "chalk": "^5.3.0"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz",
+ "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==",
+ "dev": true
+ }
}
},
"@commitlint/is-ignored": {
- "version": "16.2.4",
- "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-16.2.4.tgz",
- "integrity": "sha512-Lxdq9aOAYCOOOjKi58ulbwK/oBiiKz+7Sq0+/SpFIEFwhHkIVugvDvWjh2VRBXmRC/x5lNcjDcYEwS/uYUvlYQ==",
+ "version": "19.7.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-19.7.1.tgz",
+ "integrity": "sha512-3IaOc6HVg2hAoGleRK3r9vL9zZ3XY0rf1RsUf6jdQLuaD46ZHnXBiOPTyQ004C4IvYjSWqJwlh0/u2P73aIE3g==",
"dev": true,
"requires": {
- "@commitlint/types": "^16.2.1",
- "semver": "7.3.7"
+ "@commitlint/types": "^19.5.0",
+ "semver": "^7.6.0"
},
"dependencies": {
"semver": {
- "version": "7.3.7",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
- "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
- "dev": true,
- "requires": {
- "lru-cache": "^6.0.0"
- }
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "dev": true
}
}
},
"@commitlint/lint": {
- "version": "16.2.4",
- "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-16.2.4.tgz",
- "integrity": "sha512-AUDuwOxb2eGqsXbTMON3imUGkc1jRdtXrbbohiLSCSk3jFVXgJLTMaEcr39pR00N8nE9uZ+V2sYaiILByZVmxQ==",
+ "version": "19.7.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-19.7.1.tgz",
+ "integrity": "sha512-LhcPfVjcOcOZA7LEuBBeO00o3MeZa+tWrX9Xyl1r9PMd5FWsEoZI9IgnGqTKZ0lZt5pO3ZlstgnRyY1CJJc9Xg==",
"dev": true,
"requires": {
- "@commitlint/is-ignored": "^16.2.4",
- "@commitlint/parse": "^16.2.1",
- "@commitlint/rules": "^16.2.4",
- "@commitlint/types": "^16.2.1"
+ "@commitlint/is-ignored": "^19.7.1",
+ "@commitlint/parse": "^19.5.0",
+ "@commitlint/rules": "^19.6.0",
+ "@commitlint/types": "^19.5.0"
}
},
"@commitlint/load": {
- "version": "16.2.4",
- "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-16.2.4.tgz",
- "integrity": "sha512-HjANm3/29ROV+zt4yfaY/K6gpr9Dbzgtlp0kSwZGW0poDXlD/yqVYgPQ6JolJzZii5FUz5R4yVLC15hVL/w60w==",
+ "version": "19.6.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-19.6.1.tgz",
+ "integrity": "sha512-kE4mRKWWNju2QpsCWt428XBvUH55OET2N4QKQ0bF85qS/XbsRGG1MiTByDNlEVpEPceMkDr46LNH95DtRwcsfA==",
"dev": true,
"requires": {
- "@commitlint/config-validator": "^16.2.1",
- "@commitlint/execute-rule": "^16.2.1",
- "@commitlint/resolve-extends": "^16.2.1",
- "@commitlint/types": "^16.2.1",
- "@types/node": ">=12",
- "chalk": "^4.0.0",
- "cosmiconfig": "^7.0.0",
- "cosmiconfig-typescript-loader": "^1.0.0",
- "lodash": "^4.17.19",
- "resolve-from": "^5.0.0",
- "typescript": "^4.4.3"
+ "@commitlint/config-validator": "^19.5.0",
+ "@commitlint/execute-rule": "^19.5.0",
+ "@commitlint/resolve-extends": "^19.5.0",
+ "@commitlint/types": "^19.5.0",
+ "chalk": "^5.3.0",
+ "cosmiconfig": "^9.0.0",
+ "cosmiconfig-typescript-loader": "^6.1.0",
+ "lodash.isplainobject": "^4.0.6",
+ "lodash.merge": "^4.6.2",
+ "lodash.uniq": "^4.5.0"
+ },
+ "dependencies": {
+ "argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "chalk": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz",
+ "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==",
+ "dev": true
+ },
+ "cosmiconfig": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz",
+ "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==",
+ "dev": true,
+ "requires": {
+ "env-paths": "^2.2.1",
+ "import-fresh": "^3.3.0",
+ "js-yaml": "^4.1.0",
+ "parse-json": "^5.2.0"
+ }
+ },
+ "cosmiconfig-typescript-loader": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-6.1.0.tgz",
+ "integrity": "sha512-tJ1w35ZRUiM5FeTzT7DtYWAFFv37ZLqSRkGi2oeCK1gPhvaWjkAtfXvLmvE1pRfxxp9aQo6ba/Pvg1dKj05D4g==",
+ "dev": true,
+ "requires": {
+ "jiti": "^2.4.1"
+ }
+ },
+ "js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "requires": {
+ "argparse": "^2.0.1"
+ }
+ }
}
},
"@commitlint/message": {
- "version": "16.2.1",
- "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-16.2.1.tgz",
- "integrity": "sha512-2eWX/47rftViYg7a3axYDdrgwKv32mxbycBJT6OQY/MJM7SUfYNYYvbMFOQFaA4xIVZt7t2Alyqslbl6blVwWw==",
+ "version": "19.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-19.5.0.tgz",
+ "integrity": "sha512-R7AM4YnbxN1Joj1tMfCyBryOC5aNJBdxadTZkuqtWi3Xj0kMdutq16XQwuoGbIzL2Pk62TALV1fZDCv36+JhTQ==",
"dev": true
},
"@commitlint/parse": {
- "version": "16.2.1",
- "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-16.2.1.tgz",
- "integrity": "sha512-2NP2dDQNL378VZYioLrgGVZhWdnJO4nAxQl5LXwYb08nEcN+cgxHN1dJV8OLJ5uxlGJtDeR8UZZ1mnQ1gSAD/g==",
+ "version": "19.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-19.5.0.tgz",
+ "integrity": "sha512-cZ/IxfAlfWYhAQV0TwcbdR1Oc0/r0Ik1GEessDJ3Lbuma/MRO8FRQX76eurcXtmhJC//rj52ZSZuXUg0oIX0Fw==",
"dev": true,
"requires": {
- "@commitlint/types": "^16.2.1",
- "conventional-changelog-angular": "^5.0.11",
- "conventional-commits-parser": "^3.2.2"
+ "@commitlint/types": "^19.5.0",
+ "conventional-changelog-angular": "^7.0.0",
+ "conventional-commits-parser": "^5.0.0"
}
},
"@commitlint/read": {
- "version": "16.2.1",
- "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-16.2.1.tgz",
- "integrity": "sha512-tViXGuaxLTrw2r7PiYMQOFA2fueZxnnt0lkOWqKyxT+n2XdEMGYcI9ID5ndJKXnfPGPppD0w/IItKsIXlZ+alw==",
+ "version": "19.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-19.5.0.tgz",
+ "integrity": "sha512-TjS3HLPsLsxFPQj6jou8/CZFAmOP2y+6V4PGYt3ihbQKTY1Jnv0QG28WRKl/d1ha6zLODPZqsxLEov52dhR9BQ==",
"dev": true,
"requires": {
- "@commitlint/top-level": "^16.2.1",
- "@commitlint/types": "^16.2.1",
- "fs-extra": "^10.0.0",
- "git-raw-commits": "^2.0.0"
+ "@commitlint/top-level": "^19.5.0",
+ "@commitlint/types": "^19.5.0",
+ "git-raw-commits": "^4.0.0",
+ "minimist": "^1.2.8",
+ "tinyexec": "^0.3.0"
},
"dependencies": {
- "fs-extra": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
- "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- }
- },
- "jsonfile": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
- "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.6",
- "universalify": "^2.0.0"
- }
- },
- "universalify": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
- "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
+ "minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
"dev": true
}
}
},
"@commitlint/resolve-extends": {
- "version": "16.2.1",
- "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-16.2.1.tgz",
- "integrity": "sha512-NbbCMPKTFf2J805kwfP9EO+vV+XvnaHRcBy6ud5dF35dxMsvdJqke54W3XazXF1ZAxC4a3LBy4i/GNVBAthsEg==",
+ "version": "19.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-19.5.0.tgz",
+ "integrity": "sha512-CU/GscZhCUsJwcKTJS9Ndh3AKGZTNFIOoQB2n8CmFnizE0VnEuJoum+COW+C1lNABEeqk6ssfc1Kkalm4bDklA==",
"dev": true,
"requires": {
- "@commitlint/config-validator": "^16.2.1",
- "@commitlint/types": "^16.2.1",
- "import-fresh": "^3.0.0",
- "lodash": "^4.17.19",
- "resolve-from": "^5.0.0",
- "resolve-global": "^1.0.0"
+ "@commitlint/config-validator": "^19.5.0",
+ "@commitlint/types": "^19.5.0",
+ "global-directory": "^4.0.1",
+ "import-meta-resolve": "^4.0.0",
+ "lodash.mergewith": "^4.6.2",
+ "resolve-from": "^5.0.0"
}
},
"@commitlint/rules": {
- "version": "16.2.4",
- "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-16.2.4.tgz",
- "integrity": "sha512-rK5rNBIN2ZQNQK+I6trRPK3dWa0MtaTN4xnwOma1qxa4d5wQMQJtScwTZjTJeallFxhOgbNOgr48AMHkdounVg==",
+ "version": "19.6.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-19.6.0.tgz",
+ "integrity": "sha512-1f2reW7lbrI0X0ozZMesS/WZxgPa4/wi56vFuJENBmed6mWq5KsheN/nxqnl/C23ioxpPO/PL6tXpiiFy5Bhjw==",
"dev": true,
"requires": {
- "@commitlint/ensure": "^16.2.1",
- "@commitlint/message": "^16.2.1",
- "@commitlint/to-lines": "^16.2.1",
- "@commitlint/types": "^16.2.1",
- "execa": "^5.0.0"
+ "@commitlint/ensure": "^19.5.0",
+ "@commitlint/message": "^19.5.0",
+ "@commitlint/to-lines": "^19.5.0",
+ "@commitlint/types": "^19.5.0"
}
},
"@commitlint/to-lines": {
- "version": "16.2.1",
- "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-16.2.1.tgz",
- "integrity": "sha512-9/VjpYj5j1QeY3eiog1zQWY6axsdWAc0AonUUfyZ7B0MVcRI0R56YsHAfzF6uK/g/WwPZaoe4Lb1QCyDVnpVaQ==",
+ "version": "19.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-19.5.0.tgz",
+ "integrity": "sha512-R772oj3NHPkodOSRZ9bBVNq224DOxQtNef5Pl8l2M8ZnkkzQfeSTr4uxawV2Sd3ui05dUVzvLNnzenDBO1KBeQ==",
"dev": true
},
"@commitlint/top-level": {
- "version": "16.2.1",
- "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-16.2.1.tgz",
- "integrity": "sha512-lS6GSieHW9y6ePL73ied71Z9bOKyK+Ib9hTkRsB8oZFAyQZcyRwq2w6nIa6Fngir1QW51oKzzaXfJL94qwImyw==",
+ "version": "19.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-19.5.0.tgz",
+ "integrity": "sha512-IP1YLmGAk0yWrImPRRc578I3dDUI5A2UBJx9FbSOjxe9sTlzFiwVJ+zeMLgAtHMtGZsC8LUnzmW1qRemkFU4ng==",
"dev": true,
"requires": {
- "find-up": "^5.0.0"
+ "find-up": "^7.0.0"
},
"dependencies": {
"find-up": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
- "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-7.0.0.tgz",
+ "integrity": "sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==",
"dev": true,
"requires": {
- "locate-path": "^6.0.0",
- "path-exists": "^4.0.0"
+ "locate-path": "^7.2.0",
+ "path-exists": "^5.0.0",
+ "unicorn-magic": "^0.1.0"
}
},
"locate-path": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
- "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz",
+ "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==",
"dev": true,
"requires": {
- "p-locate": "^5.0.0"
+ "p-locate": "^6.0.0"
}
},
"p-limit": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
- "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz",
+ "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==",
"dev": true,
"requires": {
- "yocto-queue": "^0.1.0"
+ "yocto-queue": "^1.0.0"
}
},
"p-locate": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
- "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz",
+ "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==",
"dev": true,
"requires": {
- "p-limit": "^3.0.2"
+ "p-limit": "^4.0.0"
}
+ },
+ "path-exists": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz",
+ "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==",
+ "dev": true
}
}
},
"@commitlint/types": {
- "version": "16.2.1",
- "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-16.2.1.tgz",
- "integrity": "sha512-7/z7pA7BM0i8XvMSBynO7xsB3mVQPUZbVn6zMIlp/a091XJ3qAXRXc+HwLYhiIdzzS5fuxxNIHZMGHVD4HJxdA==",
+ "version": "19.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-19.5.0.tgz",
+ "integrity": "sha512-DSHae2obMSMkAtTBSOulg5X7/z+rGLxcXQIkg3OmWvY6wifojge5uVMydfhUvs7yQj+V7jNmRZ2Xzl8GJyqRgg==",
"dev": true,
"requires": {
- "chalk": "^4.0.0"
+ "@types/conventional-commits-parser": "^5.0.0",
+ "chalk": "^5.3.0"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz",
+ "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==",
+ "dev": true
+ }
}
},
"@cspotcode/source-map-consumer": {
"version": "0.8.0",
"resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz",
"integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==",
- "dev": true
+ "dev": true,
+ "optional": true,
+ "peer": true
},
"@cspotcode/source-map-support": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz",
"integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==",
"dev": true,
+ "optional": true,
+ "peer": true,
"requires": {
"@cspotcode/source-map-consumer": "0.8.0"
}
@@ -23966,27 +24329,27 @@
"integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA=="
},
"@jridgewell/set-array": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz",
- "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ=="
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
+ "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A=="
},
"@jridgewell/source-map": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz",
- "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==",
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz",
+ "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==",
"requires": {
- "@jridgewell/gen-mapping": "^0.3.0",
- "@jridgewell/trace-mapping": "^0.3.9"
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25"
},
"dependencies": {
"@jridgewell/gen-mapping": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
- "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
+ "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==",
"requires": {
- "@jridgewell/set-array": "^1.0.1",
+ "@jridgewell/set-array": "^1.2.1",
"@jridgewell/sourcemap-codec": "^1.4.10",
- "@jridgewell/trace-mapping": "^0.3.9"
+ "@jridgewell/trace-mapping": "^0.3.24"
}
}
}
@@ -23997,9 +24360,9 @@
"integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="
},
"@jridgewell/trace-mapping": {
- "version": "0.3.19",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz",
- "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==",
+ "version": "0.3.25",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
+ "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
"requires": {
"@jridgewell/resolve-uri": "^3.1.0",
"@jridgewell/sourcemap-codec": "^1.4.14"
@@ -24038,13 +24401,10 @@
}
},
"semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
- "dev": true,
- "requires": {
- "lru-cache": "^6.0.0"
- }
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "dev": true
}
}
},
@@ -24503,13 +24863,10 @@
}
},
"semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
- "dev": true,
- "requires": {
- "lru-cache": "^6.0.0"
- }
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "dev": true
},
"strip-ansi": {
"version": "6.0.1",
@@ -25008,6 +25365,12 @@
"integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==",
"dev": true
},
+ "@socket.io/component-emitter": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz",
+ "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==",
+ "dev": true
+ },
"@trysound/sax": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
@@ -25018,25 +25381,33 @@
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz",
"integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==",
- "dev": true
+ "dev": true,
+ "optional": true,
+ "peer": true
},
"@tsconfig/node12": {
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz",
"integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==",
- "dev": true
+ "dev": true,
+ "optional": true,
+ "peer": true
},
"@tsconfig/node14": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz",
"integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==",
- "dev": true
+ "dev": true,
+ "optional": true,
+ "peer": true
},
"@tsconfig/node16": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz",
"integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==",
- "dev": true
+ "dev": true,
+ "optional": true,
+ "peer": true
},
"@types/body-parser": {
"version": "1.19.2",
@@ -25057,12 +25428,6 @@
"@types/node": "*"
}
},
- "@types/component-emitter": {
- "version": "1.2.10",
- "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.10.tgz",
- "integrity": "sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg==",
- "dev": true
- },
"@types/connect": {
"version": "3.4.35",
"resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz",
@@ -25082,17 +25447,23 @@
"@types/node": "*"
}
},
- "@types/cookie": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz",
- "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==",
- "dev": true
+ "@types/conventional-commits-parser": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@types/conventional-commits-parser/-/conventional-commits-parser-5.0.1.tgz",
+ "integrity": "sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==",
+ "dev": true,
+ "requires": {
+ "@types/node": "*"
+ }
},
"@types/cors": {
- "version": "2.8.12",
- "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz",
- "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==",
- "dev": true
+ "version": "2.8.17",
+ "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz",
+ "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==",
+ "dev": true,
+ "requires": {
+ "@types/node": "*"
+ }
},
"@types/eslint": {
"version": "7.29.0",
@@ -25104,18 +25475,18 @@
}
},
"@types/eslint-scope": {
- "version": "3.7.3",
- "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz",
- "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==",
+ "version": "3.7.7",
+ "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz",
+ "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==",
"requires": {
"@types/eslint": "*",
"@types/estree": "*"
}
},
"@types/estree": {
- "version": "0.0.51",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz",
- "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ=="
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
+ "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="
},
"@types/express": {
"version": "4.17.13",
@@ -25197,16 +25568,13 @@
"integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==",
"dev": true
},
- "@types/minimist": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz",
- "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==",
- "dev": true
- },
"@types/node": {
- "version": "17.0.23",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz",
- "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw=="
+ "version": "22.13.1",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.1.tgz",
+ "integrity": "sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew==",
+ "requires": {
+ "undici-types": "~6.20.0"
+ }
},
"@types/normalize-package-data": {
"version": "2.4.4",
@@ -25296,133 +25664,133 @@
}
},
"@webassemblyjs/ast": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz",
- "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==",
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz",
+ "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==",
"requires": {
- "@webassemblyjs/helper-numbers": "1.11.1",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.1"
+ "@webassemblyjs/helper-numbers": "1.13.2",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2"
}
},
"@webassemblyjs/floating-point-hex-parser": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz",
- "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ=="
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz",
+ "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA=="
},
"@webassemblyjs/helper-api-error": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz",
- "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg=="
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz",
+ "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ=="
},
"@webassemblyjs/helper-buffer": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz",
- "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA=="
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz",
+ "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA=="
},
"@webassemblyjs/helper-numbers": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz",
- "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==",
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz",
+ "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==",
"requires": {
- "@webassemblyjs/floating-point-hex-parser": "1.11.1",
- "@webassemblyjs/helper-api-error": "1.11.1",
+ "@webassemblyjs/floating-point-hex-parser": "1.13.2",
+ "@webassemblyjs/helper-api-error": "1.13.2",
"@xtuc/long": "4.2.2"
}
},
"@webassemblyjs/helper-wasm-bytecode": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz",
- "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q=="
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz",
+ "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA=="
},
"@webassemblyjs/helper-wasm-section": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz",
- "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==",
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz",
+ "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==",
"requires": {
- "@webassemblyjs/ast": "1.11.1",
- "@webassemblyjs/helper-buffer": "1.11.1",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
- "@webassemblyjs/wasm-gen": "1.11.1"
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-buffer": "1.14.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/wasm-gen": "1.14.1"
}
},
"@webassemblyjs/ieee754": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz",
- "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==",
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz",
+ "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==",
"requires": {
"@xtuc/ieee754": "^1.2.0"
}
},
"@webassemblyjs/leb128": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz",
- "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==",
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz",
+ "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==",
"requires": {
"@xtuc/long": "4.2.2"
}
},
"@webassemblyjs/utf8": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz",
- "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ=="
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz",
+ "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ=="
},
"@webassemblyjs/wasm-edit": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz",
- "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==",
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz",
+ "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==",
"requires": {
- "@webassemblyjs/ast": "1.11.1",
- "@webassemblyjs/helper-buffer": "1.11.1",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
- "@webassemblyjs/helper-wasm-section": "1.11.1",
- "@webassemblyjs/wasm-gen": "1.11.1",
- "@webassemblyjs/wasm-opt": "1.11.1",
- "@webassemblyjs/wasm-parser": "1.11.1",
- "@webassemblyjs/wast-printer": "1.11.1"
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-buffer": "1.14.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/helper-wasm-section": "1.14.1",
+ "@webassemblyjs/wasm-gen": "1.14.1",
+ "@webassemblyjs/wasm-opt": "1.14.1",
+ "@webassemblyjs/wasm-parser": "1.14.1",
+ "@webassemblyjs/wast-printer": "1.14.1"
}
},
"@webassemblyjs/wasm-gen": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz",
- "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==",
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz",
+ "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==",
"requires": {
- "@webassemblyjs/ast": "1.11.1",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
- "@webassemblyjs/ieee754": "1.11.1",
- "@webassemblyjs/leb128": "1.11.1",
- "@webassemblyjs/utf8": "1.11.1"
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/ieee754": "1.13.2",
+ "@webassemblyjs/leb128": "1.13.2",
+ "@webassemblyjs/utf8": "1.13.2"
}
},
"@webassemblyjs/wasm-opt": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz",
- "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==",
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz",
+ "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==",
"requires": {
- "@webassemblyjs/ast": "1.11.1",
- "@webassemblyjs/helper-buffer": "1.11.1",
- "@webassemblyjs/wasm-gen": "1.11.1",
- "@webassemblyjs/wasm-parser": "1.11.1"
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-buffer": "1.14.1",
+ "@webassemblyjs/wasm-gen": "1.14.1",
+ "@webassemblyjs/wasm-parser": "1.14.1"
}
},
"@webassemblyjs/wasm-parser": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz",
- "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==",
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz",
+ "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==",
"requires": {
- "@webassemblyjs/ast": "1.11.1",
- "@webassemblyjs/helper-api-error": "1.11.1",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
- "@webassemblyjs/ieee754": "1.11.1",
- "@webassemblyjs/leb128": "1.11.1",
- "@webassemblyjs/utf8": "1.11.1"
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-api-error": "1.13.2",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/ieee754": "1.13.2",
+ "@webassemblyjs/leb128": "1.13.2",
+ "@webassemblyjs/utf8": "1.13.2"
}
},
"@webassemblyjs/wast-printer": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz",
- "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==",
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz",
+ "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==",
"requires": {
- "@webassemblyjs/ast": "1.11.1",
+ "@webassemblyjs/ast": "1.14.1",
"@xtuc/long": "4.2.2"
}
},
@@ -25482,15 +25850,9 @@
}
},
"acorn": {
- "version": "8.7.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz",
- "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A=="
- },
- "acorn-import-assertions": {
- "version": "1.7.6",
- "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.7.6.tgz",
- "integrity": "sha512-FlVvVFA1TX6l3lp8VjDnYYq7R1nyW6x3svAt4nDgrWQ9SBaSh9CnbwgSUTasgfNfOG5HlM1ehugCvM+hjo56LA==",
- "requires": {}
+ "version": "8.14.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
+ "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA=="
},
"acorn-jsx": {
"version": "5.3.2",
@@ -25547,7 +25909,6 @@
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
"integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
- "dev": true,
"requires": {
"ajv": "^8.0.0"
},
@@ -25556,7 +25917,6 @@
"version": "8.8.2",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz",
"integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==",
- "dev": true,
"requires": {
"fast-deep-equal": "^3.1.1",
"json-schema-traverse": "^1.0.0",
@@ -25567,8 +25927,7 @@
"json-schema-traverse": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
- "dev": true
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
}
}
},
@@ -25681,7 +26040,9 @@
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
"integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
- "dev": true
+ "dev": true,
+ "optional": true,
+ "peer": true
},
"argparse": {
"version": "1.0.10",
@@ -25788,12 +26149,6 @@
"es-abstract": "^1.19.0"
}
},
- "arrify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
- "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
- "dev": true
- },
"ast-types-flow": {
"version": "0.0.7",
"resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz",
@@ -25932,23 +26287,11 @@
"@babel/helper-define-polyfill-provider": "^0.4.2"
}
},
- "backo2": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
- "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=",
- "dev": true
- },
"balanced-match": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
},
- "base64-arraybuffer": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz",
- "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=",
- "dev": true
- },
"base64-js": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
@@ -26020,21 +26363,21 @@
"dev": true
},
"body-parser": {
- "version": "1.20.0",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz",
- "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==",
+ "version": "1.20.3",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
+ "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==",
"dev": true,
"requires": {
"bytes": "3.1.2",
- "content-type": "~1.0.4",
+ "content-type": "~1.0.5",
"debug": "2.6.9",
"depd": "2.0.0",
"destroy": "1.2.0",
"http-errors": "2.0.0",
"iconv-lite": "0.4.24",
"on-finished": "2.4.1",
- "qs": "6.10.3",
- "raw-body": "2.5.1",
+ "qs": "6.13.0",
+ "raw-body": "2.5.2",
"type-is": "~1.6.18",
"unpipe": "1.0.0"
},
@@ -26105,23 +26448,23 @@
}
},
"braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
"dev": true,
"requires": {
- "fill-range": "^7.0.1"
+ "fill-range": "^7.1.1"
}
},
"browserslist": {
- "version": "4.21.10",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz",
- "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==",
+ "version": "4.24.4",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz",
+ "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==",
"requires": {
- "caniuse-lite": "^1.0.30001517",
- "electron-to-chromium": "^1.4.477",
- "node-releases": "^2.0.13",
- "update-browserslist-db": "^1.0.11"
+ "caniuse-lite": "^1.0.30001688",
+ "electron-to-chromium": "^1.5.73",
+ "node-releases": "^2.0.19",
+ "update-browserslist-db": "^1.1.1"
}
},
"buffer": {
@@ -26167,13 +26510,35 @@
"dev": true
},
"call-bind": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
- "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz",
+ "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==",
"dev": true,
"requires": {
- "function-bind": "^1.1.1",
- "get-intrinsic": "^1.0.2"
+ "call-bind-apply-helpers": "^1.0.0",
+ "es-define-property": "^1.0.0",
+ "get-intrinsic": "^1.2.4",
+ "set-function-length": "^1.2.2"
+ }
+ },
+ "call-bind-apply-helpers": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz",
+ "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==",
+ "dev": true,
+ "requires": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ }
+ },
+ "call-bound": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz",
+ "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==",
+ "dev": true,
+ "requires": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "get-intrinsic": "^1.2.6"
}
},
"callsites": {
@@ -26206,17 +26571,6 @@
"integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
"dev": true
},
- "camelcase-keys": {
- "version": "6.2.2",
- "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz",
- "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==",
- "dev": true,
- "requires": {
- "camelcase": "^5.3.1",
- "map-obj": "^4.0.0",
- "quick-lru": "^4.0.1"
- }
- },
"caniuse-api": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz",
@@ -26230,9 +26584,9 @@
}
},
"caniuse-lite": {
- "version": "1.0.30001524",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001524.tgz",
- "integrity": "sha512-Jj917pJtYg9HSJBF95HVX3Cdr89JUyLT4IZ8SvM5aDRni95swKgYi3TgYLH5hnGfPE/U1dg6IfZ50UsIlLkwSA=="
+ "version": "1.0.30001697",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001697.tgz",
+ "integrity": "sha512-GwNPlWJin8E+d7Gxq96jxM6w0w+VFeyyXRsjU58emtkYqnbwHqXm5uT2uCmO0RQE9htWknOP4xtBlLmM/gWxvQ=="
},
"chalk": {
"version": "4.1.2",
@@ -26542,12 +26896,6 @@
"dot-prop": "^5.1.0"
}
},
- "component-emitter": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
- "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
- "dev": true
- },
"compressible": {
"version": "2.0.18",
"resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
@@ -26717,30 +27065,27 @@
}
},
"content-type": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
- "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
"dev": true
},
"conventional-changelog-angular": {
- "version": "5.0.13",
- "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz",
- "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz",
+ "integrity": "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==",
"dev": true,
"requires": {
- "compare-func": "^2.0.0",
- "q": "^1.5.1"
+ "compare-func": "^2.0.0"
}
},
"conventional-changelog-conventionalcommits": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.0.tgz",
- "integrity": "sha512-sj9tj3z5cnHaSJCYObA9nISf7eq/YjscLPoq6nmew4SiOjxqL2KRpK20fjnjVbpNDjJ2HR3MoVcWKXwbVvzS0A==",
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz",
+ "integrity": "sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==",
"dev": true,
"requires": {
- "compare-func": "^2.0.0",
- "lodash": "^4.17.15",
- "q": "^1.5.1"
+ "compare-func": "^2.0.0"
}
},
"conventional-changelog-writer": {
@@ -26783,28 +27128,15 @@
"dev": true
},
"conventional-commits-parser": {
- "version": "3.2.4",
- "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz",
- "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz",
+ "integrity": "sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==",
"dev": true,
"requires": {
- "is-text-path": "^1.0.1",
- "JSONStream": "^1.0.4",
- "lodash": "^4.17.15",
- "meow": "^8.0.0",
- "split2": "^3.0.0",
- "through2": "^4.0.0"
- },
- "dependencies": {
- "through2": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz",
- "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==",
- "dev": true,
- "requires": {
- "readable-stream": "3"
- }
- }
+ "is-text-path": "^2.0.0",
+ "JSONStream": "^1.3.5",
+ "meow": "^12.0.1",
+ "split2": "^4.0.0"
}
},
"convert-hrtime": {
@@ -26823,9 +27155,9 @@
}
},
"cookie": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz",
- "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==",
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
+ "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
"dev": true
},
"cookie-signature": {
@@ -26974,21 +27306,13 @@
"yaml": "^1.10.0"
}
},
- "cosmiconfig-typescript-loader": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-1.0.3.tgz",
- "integrity": "sha512-ARo21VjxdacJUcHxgVMEYNIoVPYiuKOEwWBIYej4M22+pEbe3LzKgmht2UPM+0u7/T/KnZf2r/5IzHv2Nwz+/w==",
- "dev": true,
- "requires": {
- "cosmiconfig": "^7",
- "ts-node": "^10.4.0"
- }
- },
"create-require": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
"integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
- "dev": true
+ "dev": true,
+ "optional": true,
+ "peer": true
},
"cross-env": {
"version": "7.0.3",
@@ -27000,9 +27324,9 @@
}
},
"cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
"dev": true,
"requires": {
"path-key": "^3.1.0",
@@ -27070,13 +27394,10 @@
},
"dependencies": {
"semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
- "dev": true,
- "requires": {
- "lru-cache": "^6.0.0"
- }
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "dev": true
}
}
},
@@ -27293,9 +27614,9 @@
"dev": true
},
"dargs": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz",
- "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==",
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/dargs/-/dargs-8.1.0.tgz",
+ "integrity": "sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==",
"dev": true
},
"date-fns": {
@@ -27319,30 +27640,6 @@
"ms": "2.1.2"
}
},
- "decamelize": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
- "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
- "dev": true
- },
- "decamelize-keys": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz",
- "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=",
- "dev": true,
- "requires": {
- "decamelize": "^1.1.0",
- "map-obj": "^1.0.0"
- },
- "dependencies": {
- "map-obj": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
- "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
- "dev": true
- }
- }
- },
"dedent": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
@@ -27416,6 +27713,17 @@
"clone": "^1.0.2"
}
},
+ "define-data-property": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+ "dev": true,
+ "requires": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.0.1"
+ }
+ },
"define-lazy-prop": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
@@ -27488,7 +27796,9 @@
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
"integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
- "dev": true
+ "dev": true,
+ "optional": true,
+ "peer": true
},
"dir-glob": {
"version": "3.0.1",
@@ -27624,24 +27934,35 @@
}
},
"dox": {
- "version": "0.9.1",
- "resolved": "https://registry.npmjs.org/dox/-/dox-0.9.1.tgz",
- "integrity": "sha512-3bC8QeBn1xYWU628qfW7jlA0ssd7PL/x3ndYdT3tq52arRKFHW5zpVHGgkZPahBCZHU60O+TiJossR+RZZW15w==",
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/dox/-/dox-1.0.0.tgz",
+ "integrity": "sha512-y0borLgGiqcXigOItzeBvWEPtZ5tkKMZ7MTa/9xhVCUz6sU1quXTTvbJGOLFZAu/4/nlj2Ui02A/tLqQFBXo+w==",
"dev": true,
"requires": {
- "commander": "9.1.0",
- "jsdoctypeparser": "^1.2.0",
- "markdown-it": "12.3.2"
+ "commander": "9.4.0",
+ "jsdoctypeparser": "^9.0.0",
+ "markdown-it": "13.0.1"
},
"dependencies": {
"commander": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-9.1.0.tgz",
- "integrity": "sha512-i0/MaqBtdbnJ4XQs4Pmyb+oFQl+q0lsAmokVUH92SlSw4fkeAcG3bVon+Qt7hmtF+u3Het6o4VgrcY3qAoEB6w==",
+ "version": "9.4.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.0.tgz",
+ "integrity": "sha512-sRPT+umqkz90UA8M1yqYfnHlZA7fF6nSphDtxeywPZ49ysjxDQybzk13CL+mXekDRG92skbcqCLVovuCusNmFw==",
"dev": true
}
}
},
+ "dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "dev": true,
+ "requires": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ }
+ },
"duplexer2": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
@@ -27681,9 +28002,9 @@
"dev": true
},
"electron-to-chromium": {
- "version": "1.4.505",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.505.tgz",
- "integrity": "sha512-0A50eL5BCCKdxig2SsCXhpuztnB9PfUgRMojj5tMvt8O54lbwz3t6wNgnpiTRosw5QjlJB7ixhVyeg8daLQwSQ=="
+ "version": "1.5.92",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.92.tgz",
+ "integrity": "sha512-BeHgmNobs05N1HMmMZ7YIuHfYBGlq/UmvlsTgg+fsbFs9xVMj+xJHFg19GN04+9Q+r8Xnh9LXqaYIyEWElnNgQ=="
},
"email-addresses": {
"version": "3.1.0",
@@ -27715,64 +28036,58 @@
"dev": true
},
"engine.io": {
- "version": "6.1.3",
- "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.1.3.tgz",
- "integrity": "sha512-rqs60YwkvWTLLnfazqgZqLa/aKo+9cueVfEi/dZ8PyGyaf8TLOxj++4QMIgeG3Gn0AhrWiFXvghsoY9L9h25GA==",
+ "version": "6.6.4",
+ "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.4.tgz",
+ "integrity": "sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==",
"dev": true,
"requires": {
- "@types/cookie": "^0.4.1",
"@types/cors": "^2.8.12",
"@types/node": ">=10.0.0",
"accepts": "~1.3.4",
"base64id": "2.0.0",
- "cookie": "~0.4.1",
+ "cookie": "~0.7.2",
"cors": "~2.8.5",
"debug": "~4.3.1",
- "engine.io-parser": "~5.0.3",
- "ws": "~8.2.3"
+ "engine.io-parser": "~5.2.1",
+ "ws": "~8.17.1"
},
"dependencies": {
- "engine.io-parser": {
- "version": "5.0.4",
- "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz",
- "integrity": "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg==",
- "dev": true
- },
"ws": {
- "version": "8.2.3",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz",
- "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==",
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz",
+ "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==",
"dev": true,
"requires": {}
}
}
},
"engine.io-client": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-5.2.0.tgz",
- "integrity": "sha512-BcIBXGBkT7wKecwnfrSV79G2X5lSUSgeAGgoo60plXf8UsQEvCQww/KMwXSMhVjb98fFYNq20CC5eo8IOAPqsg==",
+ "version": "6.6.3",
+ "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.3.tgz",
+ "integrity": "sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w==",
"dev": true,
"requires": {
- "base64-arraybuffer": "0.1.4",
- "component-emitter": "~1.3.0",
+ "@socket.io/component-emitter": "~3.1.0",
"debug": "~4.3.1",
- "engine.io-parser": "~4.0.1",
- "has-cors": "1.1.0",
- "parseqs": "0.0.6",
- "parseuri": "0.0.6",
- "ws": "~7.4.2",
- "xmlhttprequest-ssl": "~2.0.0",
- "yeast": "0.1.2"
+ "engine.io-parser": "~5.2.1",
+ "ws": "~8.17.1",
+ "xmlhttprequest-ssl": "~2.1.1"
+ },
+ "dependencies": {
+ "ws": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz",
+ "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==",
+ "dev": true,
+ "requires": {}
+ }
}
},
"engine.io-parser": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-4.0.3.tgz",
- "integrity": "sha512-xEAAY0msNnESNPc00e19y5heTPX4y/TJ36gr8t1voOaNmTojP9b3oK3BbJLFufW2XFPQaaijpFewm2g2Um3uqA==",
- "dev": true,
- "requires": {
- "base64-arraybuffer": "0.1.4"
- }
+ "version": "5.2.3",
+ "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz",
+ "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==",
+ "dev": true
},
"enhanced-resolve": {
"version": "0.9.1",
@@ -27959,6 +28274,18 @@
"unbox-primitive": "^1.0.1"
}
},
+ "es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "dev": true
+ },
+ "es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "dev": true
+ },
"es-get-iterator": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz",
@@ -27984,9 +28311,18 @@
}
},
"es-module-lexer": {
- "version": "0.9.3",
- "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz",
- "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ=="
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz",
+ "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ=="
+ },
+ "es-object-atoms": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+ "dev": true,
+ "requires": {
+ "es-errors": "^1.3.0"
+ }
},
"es-to-primitive": {
"version": "1.2.1",
@@ -28000,9 +28336,9 @@
}
},
"escalade": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
- "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw=="
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="
},
"escape-html": {
"version": "1.0.3",
@@ -28229,9 +28565,9 @@
"dev": true
},
"semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
"dev": true
}
}
@@ -28486,19 +28822,6 @@
"micromatch": "^4.0.4",
"normalize-path": "^3.0.0",
"schema-utils": "^3.1.1"
- },
- "dependencies": {
- "schema-utils": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
- "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
- "dev": true,
- "requires": {
- "@types/json-schema": "^7.0.8",
- "ajv": "^6.12.5",
- "ajv-keywords": "^3.5.2"
- }
- }
}
},
"espree": {
@@ -28577,7 +28900,7 @@
"etag": {
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
- "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
"dev": true
},
"event-pubsub": {
@@ -28631,37 +28954,37 @@
"requires": {}
},
"express": {
- "version": "4.18.1",
- "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz",
- "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==",
+ "version": "4.21.2",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz",
+ "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==",
"dev": true,
"requires": {
"accepts": "~1.3.8",
"array-flatten": "1.1.1",
- "body-parser": "1.20.0",
+ "body-parser": "1.20.3",
"content-disposition": "0.5.4",
"content-type": "~1.0.4",
- "cookie": "0.5.0",
+ "cookie": "0.7.1",
"cookie-signature": "1.0.6",
"debug": "2.6.9",
"depd": "2.0.0",
- "encodeurl": "~1.0.2",
+ "encodeurl": "~2.0.0",
"escape-html": "~1.0.3",
"etag": "~1.8.1",
- "finalhandler": "1.2.0",
+ "finalhandler": "1.3.1",
"fresh": "0.5.2",
"http-errors": "2.0.0",
- "merge-descriptors": "1.0.1",
+ "merge-descriptors": "1.0.3",
"methods": "~1.1.2",
"on-finished": "2.4.1",
"parseurl": "~1.3.3",
- "path-to-regexp": "0.1.7",
+ "path-to-regexp": "0.1.12",
"proxy-addr": "~2.0.7",
- "qs": "6.10.3",
+ "qs": "6.13.0",
"range-parser": "~1.2.1",
"safe-buffer": "5.2.1",
- "send": "0.18.0",
- "serve-static": "1.15.0",
+ "send": "0.19.0",
+ "serve-static": "1.16.2",
"setprototypeof": "1.2.0",
"statuses": "2.0.1",
"type-is": "~1.6.18",
@@ -28676,9 +28999,9 @@
"dev": true
},
"cookie": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
- "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz",
+ "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==",
"dev": true
},
"debug": {
@@ -28696,14 +29019,20 @@
"integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
"dev": true
},
+ "encodeurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
+ "dev": true
+ },
"finalhandler": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
- "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz",
+ "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==",
"dev": true,
"requires": {
"debug": "2.6.9",
- "encodeurl": "~1.0.2",
+ "encodeurl": "~2.0.0",
"escape-html": "~1.0.3",
"on-finished": "2.4.1",
"parseurl": "~1.3.3",
@@ -28714,7 +29043,7 @@
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"dev": true
},
"on-finished": {
@@ -28792,6 +29121,11 @@
"integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
"dev": true
},
+ "fast-uri": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz",
+ "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw=="
+ },
"fastest-levenshtein": {
"version": "1.0.12",
"resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz",
@@ -28873,9 +29207,9 @@
"dev": true
},
"fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
"dev": true,
"requires": {
"to-regex-range": "^5.0.1"
@@ -29015,9 +29349,9 @@
"dev": true
},
"follow-redirects": {
- "version": "1.15.0",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.0.tgz",
- "integrity": "sha512-aExlJShTV4qOUOL7yF1U5tvLCB0xQuudbf6toyYA0E/acBNw71mvjFTnLaRp50aQaYocMR0a/RMMBIHeZnGyjQ==",
+ "version": "1.15.9",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
+ "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
"dev": true
},
"for-each": {
@@ -29056,7 +29390,7 @@
"fresh": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
- "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
"dev": true
},
"from2": {
@@ -29107,9 +29441,9 @@
}
},
"fs-monkey": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz",
- "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==",
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz",
+ "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==",
"dev": true
},
"fs.realpath": {
@@ -29125,9 +29459,9 @@
"optional": true
},
"function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="
},
"function-timeout": {
"version": "1.0.2",
@@ -29197,14 +29531,21 @@
"dev": true
},
"get-intrinsic": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
- "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz",
+ "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==",
"dev": true,
"requires": {
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-symbols": "^1.0.1"
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.0",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
}
},
"get-package-type": {
@@ -29213,6 +29554,16 @@
"integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
"dev": true
},
+ "get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "dev": true,
+ "requires": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ }
+ },
"get-stream": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
@@ -29278,27 +29629,14 @@
}
},
"git-raw-commits": {
- "version": "2.0.11",
- "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz",
- "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-4.0.0.tgz",
+ "integrity": "sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==",
"dev": true,
"requires": {
- "dargs": "^7.0.0",
- "lodash": "^4.17.15",
- "meow": "^8.0.0",
- "split2": "^3.0.0",
- "through2": "^4.0.0"
- },
- "dependencies": {
- "through2": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz",
- "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==",
- "dev": true,
- "requires": {
- "readable-stream": "3"
- }
- }
+ "dargs": "^8.0.0",
+ "meow": "^12.0.1",
+ "split2": "^4.0.0"
}
},
"gl-matrix": {
@@ -29353,13 +29691,21 @@
"resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
"integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="
},
- "global-dirs": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz",
- "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=",
+ "global-directory": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz",
+ "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==",
"dev": true,
"requires": {
- "ini": "^1.3.4"
+ "ini": "4.1.1"
+ },
+ "dependencies": {
+ "ini": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz",
+ "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==",
+ "dev": true
+ }
}
},
"global-modules": {
@@ -29435,10 +29781,16 @@
}
}
},
+ "gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "dev": true
+ },
"graceful-fs": {
- "version": "4.2.9",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz",
- "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ=="
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
},
"growly": {
"version": "1.3.0",
@@ -29488,12 +29840,6 @@
"integrity": "sha1-LRmNXKA+vM3K63ydnEkuGEBb4AI=",
"dev": true
},
- "hard-rejection": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz",
- "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==",
- "dev": true
- },
"has": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
@@ -29517,12 +29863,6 @@
"integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==",
"dev": true
},
- "has-cors": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
- "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=",
- "dev": true
- },
"has-dynamic-import": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/has-dynamic-import/-/has-dynamic-import-2.0.1.tgz",
@@ -29539,10 +29879,19 @@
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
"dev": true
},
- "has-symbols": {
+ "has-property-descriptors": {
"version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
- "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+ "dev": true,
+ "requires": {
+ "es-define-property": "^1.0.0"
+ }
+ },
+ "has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
"dev": true
},
"has-tostringtag": {
@@ -29560,6 +29909,15 @@
"integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
"dev": true
},
+ "hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "dev": true,
+ "requires": {
+ "function-bind": "^1.1.2"
+ }
+ },
"he": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
@@ -29789,9 +30147,9 @@
}
},
"http-proxy-middleware": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz",
- "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==",
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz",
+ "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==",
"dev": true,
"requires": {
"@types/http-proxy": "^1.17.8",
@@ -29960,12 +30318,6 @@
"integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
"dev": true
},
- "indent-string": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
- "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
- "dev": true
- },
"index-to-position": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-0.1.2.tgz",
@@ -30349,12 +30701,12 @@
}
},
"is-text-path": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz",
- "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz",
+ "integrity": "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==",
"dev": true,
"requires": {
- "text-extensions": "^1.0.0"
+ "text-extensions": "^2.0.0"
}
},
"is-typed-array": {
@@ -30537,6 +30889,12 @@
}
}
},
+ "jiti": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz",
+ "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==",
+ "dev": true
+ },
"js-message": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/js-message/-/js-message-1.0.7.tgz",
@@ -30569,21 +30927,10 @@
}
},
"jsdoctypeparser": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-1.2.0.tgz",
- "integrity": "sha1-597cFToRhJ/8UUEUSuhqfvDCU5I=",
- "dev": true,
- "requires": {
- "lodash": "^3.7.0"
- },
- "dependencies": {
- "lodash": {
- "version": "3.10.1",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
- "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=",
- "dev": true
- }
- }
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-9.0.0.tgz",
+ "integrity": "sha512-jrTA2jJIL6/DAEILBEh2/w9QxCuwmvNXIry39Ay/HVfhE3o2yVV0U44blYkqdHA/OKloJEqvJy0xU+GSdE2SIw==",
+ "dev": true
},
"jsesc": {
"version": "2.5.2",
@@ -30608,12 +30955,24 @@
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
},
"json-stable-stringify": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.2.tgz",
- "integrity": "sha512-eunSSaEnxV12z+Z73y/j5N37/In40GK4GmsSy+tEHJMxknvqnA7/djeYtAgW0GsWHUfg+847WJjKaEylk2y09g==",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.2.1.tgz",
+ "integrity": "sha512-Lp6HbbBgosLmJbjx0pBLbgvx68FaFU1sdkmBuckmhhJ88kL13OA51CDtR2yJB50eCNMH9wRqtQNNiAqQH4YXnA==",
"dev": true,
"requires": {
- "jsonify": "^0.0.1"
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "isarray": "^2.0.5",
+ "jsonify": "^0.0.1",
+ "object-keys": "^1.1.1"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+ "dev": true
+ }
}
},
"json-stable-stringify-without-jsonify": {
@@ -30645,7 +31004,7 @@
"jsonparse": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
- "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=",
+ "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==",
"dev": true
},
"JSONStream": {
@@ -30858,43 +31217,6 @@
"webpack": "^5.31.2"
},
"dependencies": {
- "ajv": {
- "version": "4.11.8",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz",
- "integrity": "sha512-I/bSHSNEcFFqXLf91nchoNB9D1Kie3QKcWdchYUaoIg1+1bdWDkdfdlvdIOJbi9U8xR0y+MWc5D+won9v95WlQ==",
- "dev": true,
- "requires": {
- "co": "^4.6.0",
- "json-stable-stringify": "^1.0.1"
- }
- },
- "ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==",
- "dev": true
- },
- "chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==",
- "dev": true,
- "requires": {
- "ansi-styles": "^2.2.1",
- "escape-string-regexp": "^1.0.2",
- "has-ansi": "^2.0.0",
- "strip-ansi": "^3.0.0",
- "supports-color": "^2.0.0"
- },
- "dependencies": {
- "supports-color": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
- "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==",
- "dev": true
- }
- }
- },
"commander": {
"version": "6.2.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
@@ -30915,32 +31237,6 @@
"path-is-absolute": "^1.0.0"
}
},
- "has-flag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
- "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==",
- "dev": true
- },
- "parallel-webpack": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/parallel-webpack/-/parallel-webpack-2.6.0.tgz",
- "integrity": "sha512-aOOLfQ40yWWRt8214F0zNWp0DWbeCs7tJaEur0/XUlYU8Yht1sMTYt+eNrbY4VkM4O/SRSme7cdZJTtIantiOw==",
- "dev": true,
- "requires": {
- "ajv": "^4.9.2",
- "bluebird": "^3.0.6",
- "chalk": "^1.1.1",
- "interpret": "^1.0.1",
- "lodash.assign": "^4.0.8",
- "lodash.endswith": "^4.0.1",
- "lodash.flatten": "^4.2.0",
- "minimist": "^1.2.0",
- "node-ipc": "^9.1.0",
- "pluralize": "^1.2.1",
- "supports-color": "^3.1.2",
- "worker-farm": "^1.3.1"
- }
- },
"shelljs": {
"version": "0.8.4",
"resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz",
@@ -30951,15 +31247,6 @@
"interpret": "^1.0.0",
"rechoir": "^0.6.2"
}
- },
- "supports-color": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
- "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==",
- "dev": true,
- "requires": {
- "has-flag": "^1.0.0"
- }
}
}
},
@@ -31001,9 +31288,9 @@
"dev": true
},
"linkify-it": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz",
- "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==",
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz",
+ "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==",
"dev": true,
"requires": {
"uc.micro": "^1.0.1"
@@ -31139,6 +31426,12 @@
"integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==",
"dev": true
},
+ "lodash.kebabcase": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz",
+ "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==",
+ "dev": true
+ },
"lodash.map": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz",
@@ -31157,6 +31450,24 @@
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
"dev": true
},
+ "lodash.mergewith": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz",
+ "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==",
+ "dev": true
+ },
+ "lodash.snakecase": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz",
+ "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==",
+ "dev": true
+ },
+ "lodash.startcase": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz",
+ "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==",
+ "dev": true
+ },
"lodash.truncate": {
"version": "4.4.2",
"resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
@@ -31175,6 +31486,12 @@
"integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==",
"dev": true
},
+ "lodash.upperfirst": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz",
+ "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==",
+ "dev": true
+ },
"log-symbols": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
@@ -31231,15 +31548,6 @@
}
}
},
- "lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "dev": true,
- "requires": {
- "yallist": "^4.0.0"
- }
- },
"magic-string": {
"version": "0.26.2",
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.2.tgz",
@@ -31262,23 +31570,19 @@
"version": "1.3.6",
"resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
"integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
- "dev": true
- },
- "map-obj": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz",
- "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==",
- "dev": true
+ "dev": true,
+ "optional": true,
+ "peer": true
},
"markdown-it": {
- "version": "12.3.2",
- "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz",
- "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==",
+ "version": "13.0.1",
+ "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz",
+ "integrity": "sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==",
"dev": true,
"requires": {
"argparse": "^2.0.1",
- "entities": "~2.1.0",
- "linkify-it": "^3.0.1",
+ "entities": "~3.0.1",
+ "linkify-it": "^4.0.1",
"mdurl": "^1.0.1",
"uc.micro": "^1.0.5"
},
@@ -31288,6 +31592,12 @@
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
"dev": true
+ },
+ "entities": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz",
+ "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==",
+ "dev": true
}
}
},
@@ -31328,6 +31638,12 @@
}
}
},
+ "math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "dev": true
+ },
"mdn-data": {
"version": "2.0.14",
"resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
@@ -31337,7 +31653,7 @@
"mdurl": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
- "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=",
+ "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==",
"dev": true
},
"media-typer": {
@@ -31347,12 +31663,12 @@
"dev": true
},
"memfs": {
- "version": "3.4.1",
- "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz",
- "integrity": "sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw==",
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz",
+ "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==",
"dev": true,
"requires": {
- "fs-monkey": "1.0.3"
+ "fs-monkey": "^1.0.4"
}
},
"memory-fs": {
@@ -31362,61 +31678,10 @@
"dev": true
},
"meow": {
- "version": "8.1.2",
- "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz",
- "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==",
- "dev": true,
- "requires": {
- "@types/minimist": "^1.2.0",
- "camelcase-keys": "^6.2.2",
- "decamelize-keys": "^1.1.0",
- "hard-rejection": "^2.1.0",
- "minimist-options": "4.1.0",
- "normalize-package-data": "^3.0.0",
- "read-pkg-up": "^7.0.1",
- "redent": "^3.0.0",
- "trim-newlines": "^3.0.0",
- "type-fest": "^0.18.0",
- "yargs-parser": "^20.2.3"
- },
- "dependencies": {
- "hosted-git-info": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
- "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
- "dev": true,
- "requires": {
- "lru-cache": "^6.0.0"
- }
- },
- "normalize-package-data": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz",
- "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==",
- "dev": true,
- "requires": {
- "hosted-git-info": "^4.0.1",
- "is-core-module": "^2.5.0",
- "semver": "^7.3.4",
- "validate-npm-package-license": "^3.0.1"
- }
- },
- "semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
- "dev": true,
- "requires": {
- "lru-cache": "^6.0.0"
- }
- },
- "type-fest": {
- "version": "0.18.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz",
- "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==",
- "dev": true
- }
- }
+ "version": "12.1.1",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz",
+ "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==",
+ "dev": true
},
"merge": {
"version": "2.1.1",
@@ -31425,9 +31690,9 @@
"dev": true
},
"merge-descriptors": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
- "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
+ "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
"dev": true
},
"merge-stream": {
@@ -31448,21 +31713,13 @@
"dev": true
},
"micromatch": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
- "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
"dev": true,
"requires": {
- "braces": "^3.0.1",
- "picomatch": "^2.2.3"
- },
- "dependencies": {
- "picomatch": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
- "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
- "dev": true
- }
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
}
},
"mime": {
@@ -31490,12 +31747,6 @@
"integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
"dev": true
},
- "min-indent": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
- "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
- "dev": true
- },
"minimalistic-assert": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
@@ -31515,17 +31766,6 @@
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
"integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q=="
},
- "minimist-options": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
- "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
- "dev": true,
- "requires": {
- "arrify": "^1.0.1",
- "is-plain-obj": "^1.1.0",
- "kind-of": "^6.0.3"
- }
- },
"minipass": {
"version": "3.1.5",
"resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.5.tgz",
@@ -31594,9 +31834,9 @@
}
},
"nanoid": {
- "version": "3.3.6",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
- "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==",
+ "version": "3.3.8",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz",
+ "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==",
"dev": true
},
"natural-compare": {
@@ -31705,13 +31945,10 @@
},
"dependencies": {
"semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
- "dev": true,
- "requires": {
- "lru-cache": "^6.0.0"
- }
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "dev": true
},
"uuid": {
"version": "8.3.2",
@@ -31731,9 +31968,9 @@
}
},
"node-releases": {
- "version": "2.0.13",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz",
- "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ=="
+ "version": "2.0.19",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
+ "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw=="
},
"normalize-package-data": {
"version": "2.5.0",
@@ -31748,9 +31985,9 @@
},
"dependencies": {
"semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
"dev": true
}
}
@@ -33929,9 +34166,9 @@
"dev": true
},
"object-inspect": {
- "version": "1.12.0",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz",
- "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==",
+ "version": "1.13.4",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
"dev": true
},
"object-is": {
@@ -34207,6 +34444,85 @@
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
"dev": true
},
+ "pako": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
+ "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="
+ },
+ "parallel-webpack": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/parallel-webpack/-/parallel-webpack-2.6.0.tgz",
+ "integrity": "sha512-aOOLfQ40yWWRt8214F0zNWp0DWbeCs7tJaEur0/XUlYU8Yht1sMTYt+eNrbY4VkM4O/SRSme7cdZJTtIantiOw==",
+ "dev": true,
+ "requires": {
+ "ajv": "^4.9.2",
+ "bluebird": "^3.0.6",
+ "chalk": "^1.1.1",
+ "interpret": "^1.0.1",
+ "lodash.assign": "^4.0.8",
+ "lodash.endswith": "^4.0.1",
+ "lodash.flatten": "^4.2.0",
+ "minimist": "^1.2.0",
+ "node-ipc": "^9.1.0",
+ "pluralize": "^1.2.1",
+ "supports-color": "^3.1.2",
+ "worker-farm": "^1.3.1"
+ },
+ "dependencies": {
+ "ajv": {
+ "version": "4.11.8",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz",
+ "integrity": "sha512-I/bSHSNEcFFqXLf91nchoNB9D1Kie3QKcWdchYUaoIg1+1bdWDkdfdlvdIOJbi9U8xR0y+MWc5D+won9v95WlQ==",
+ "dev": true,
+ "requires": {
+ "co": "^4.6.0",
+ "json-stable-stringify": "^1.0.1"
+ }
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^2.2.1",
+ "escape-string-regexp": "^1.0.2",
+ "has-ansi": "^2.0.0",
+ "strip-ansi": "^3.0.0",
+ "supports-color": "^2.0.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==",
+ "dev": true
+ }
+ }
+ },
+ "has-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+ "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^1.0.0"
+ }
+ }
+ }
+ },
"param-case": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
@@ -34281,18 +34597,6 @@
}
}
},
- "parseqs": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz",
- "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==",
- "dev": true
- },
- "parseuri": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz",
- "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==",
- "dev": true
- },
"parseurl": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
@@ -34359,9 +34663,9 @@
}
},
"cross-spawn": {
- "version": "6.0.5",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
- "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+ "version": "6.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz",
+ "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==",
"dev": true,
"requires": {
"nice-try": "^1.0.4",
@@ -34422,9 +34726,9 @@
}
},
"semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
"dev": true
},
"shebang-command": {
@@ -34482,9 +34786,9 @@
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
},
"path-to-regexp": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
- "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=",
+ "version": "0.1.12",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz",
+ "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==",
"dev": true
},
"path-type": {
@@ -34494,14 +34798,14 @@
"dev": true
},
"picocolors": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
- "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="
},
"picomatch": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
- "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
"dev": true
},
"pify": {
@@ -34700,13 +35004,10 @@
},
"dependencies": {
"semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
- "dev": true,
- "requires": {
- "lru-cache": "^6.0.0"
- }
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "dev": true
}
}
},
@@ -35106,12 +35407,6 @@
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
},
- "q": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
- "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
- "dev": true
- },
"qjobs": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz",
@@ -35119,12 +35414,12 @@
"dev": true
},
"qs": {
- "version": "6.10.3",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz",
- "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==",
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
+ "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
"dev": true,
"requires": {
- "side-channel": "^1.0.4"
+ "side-channel": "^1.0.6"
}
},
"query-string": {
@@ -35143,12 +35438,6 @@
"integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
"dev": true
},
- "quick-lru": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
- "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
- "dev": true
- },
"randombytes": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
@@ -35164,9 +35453,9 @@
"dev": true
},
"raw-body": {
- "version": "2.5.1",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
- "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
+ "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
"dev": true,
"requires": {
"bytes": "3.1.2",
@@ -35299,45 +35588,6 @@
}
}
},
- "read-pkg-up": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
- "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
- "dev": true,
- "requires": {
- "find-up": "^4.1.0",
- "read-pkg": "^5.2.0",
- "type-fest": "^0.8.1"
- },
- "dependencies": {
- "read-pkg": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
- "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
- "dev": true,
- "requires": {
- "@types/normalize-package-data": "^2.4.0",
- "normalize-package-data": "^2.5.0",
- "parse-json": "^5.0.0",
- "type-fest": "^0.6.0"
- },
- "dependencies": {
- "type-fest": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
- "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
- "dev": true
- }
- }
- },
- "type-fest": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
- "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
- "dev": true
- }
- }
- },
"readable-stream": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
@@ -35365,16 +35615,6 @@
"resolve": "^1.1.6"
}
},
- "redent": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
- "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
- "dev": true,
- "requires": {
- "indent-string": "^4.0.0",
- "strip-indent": "^3.0.0"
- }
- },
"regenerate": {
"version": "1.4.2",
"resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
@@ -35506,8 +35746,7 @@
"require-from-string": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
- "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
- "dev": true
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="
},
"requires-port": {
"version": "1.0.0",
@@ -35550,15 +35789,6 @@
"integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
"dev": true
},
- "resolve-global": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz",
- "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==",
- "dev": true,
- "requires": {
- "global-dirs": "^0.1.1"
- }
- },
"restore-cursor": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
@@ -35622,9 +35852,9 @@
}
},
"rollup": {
- "version": "2.73.0",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.73.0.tgz",
- "integrity": "sha512-h/UngC3S4Zt28mB3g0+2YCMegT5yoftnQplwzPqGZcKvlld5e+kT/QRmJiL+qxGyZKOYpgirWGdLyEO1b0dpLQ==",
+ "version": "2.79.2",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz",
+ "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==",
"dev": true,
"requires": {
"fsevents": "~2.3.2"
@@ -35643,9 +35873,9 @@
},
"dependencies": {
"semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
"dev": true
}
}
@@ -35853,11 +36083,11 @@
"dev": true
},
"schema-utils": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz",
- "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==",
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
+ "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
"requires": {
- "@types/json-schema": "^7.0.6",
+ "@types/json-schema": "^7.0.8",
"ajv": "^6.12.5",
"ajv-keywords": "^3.5.2"
}
@@ -36068,13 +36298,10 @@
"dev": true
},
"semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
- "dev": true,
- "requires": {
- "lru-cache": "^6.0.0"
- }
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "dev": true
},
"signal-exit": {
"version": "4.1.0",
@@ -36097,14 +36324,6 @@
"integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==",
"dev": true
},
- "typescript": {
- "version": "5.6.3",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz",
- "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==",
- "dev": true,
- "optional": true,
- "peer": true
- },
"unicorn-magic": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz",
@@ -36170,9 +36389,9 @@
"dev": true
},
"send": {
- "version": "0.18.0",
- "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
- "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz",
+ "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
"dev": true,
"requires": {
"debug": "2.6.9",
@@ -36202,7 +36421,7 @@
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"dev": true
}
}
@@ -36243,9 +36462,9 @@
}
},
"serialize-javascript": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
- "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
+ "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
"requires": {
"randombytes": "^2.1.0"
}
@@ -36301,15 +36520,23 @@
}
},
"serve-static": {
- "version": "1.15.0",
- "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
- "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
+ "version": "1.16.2",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz",
+ "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==",
"dev": true,
"requires": {
- "encodeurl": "~1.0.2",
+ "encodeurl": "~2.0.0",
"escape-html": "~1.0.3",
"parseurl": "~1.3.3",
- "send": "0.18.0"
+ "send": "0.19.0"
+ },
+ "dependencies": {
+ "encodeurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
+ "dev": true
+ }
}
},
"set-blocking": {
@@ -36318,6 +36545,20 @@
"integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
"dev": true
},
+ "set-function-length": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
+ "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+ "dev": true,
+ "requires": {
+ "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.2"
+ }
+ },
"setprototypeof": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
@@ -36388,14 +36629,51 @@
"dev": true
},
"side-channel": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
- "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
"dev": true,
"requires": {
- "call-bind": "^1.0.0",
- "get-intrinsic": "^1.0.2",
- "object-inspect": "^1.9.0"
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3",
+ "side-channel-list": "^1.0.0",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
+ }
+ },
+ "side-channel-list": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
+ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
+ "dev": true,
+ "requires": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3"
+ }
+ },
+ "side-channel-map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+ "dev": true,
+ "requires": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3"
+ }
+ },
+ "side-channel-weakmap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+ "dev": true,
+ "requires": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3",
+ "side-channel-map": "^1.0.1"
}
},
"signal-exit": {
@@ -36490,48 +36768,58 @@
"dev": true
},
"socket.io": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.4.1.tgz",
- "integrity": "sha512-s04vrBswdQBUmuWJuuNTmXUVJhP0cVky8bBDhdkf8y0Ptsu7fKU2LuLbts9g+pdmAdyMMn8F/9Mf1/wbtUN0fg==",
+ "version": "4.8.1",
+ "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.1.tgz",
+ "integrity": "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==",
"dev": true,
"requires": {
"accepts": "~1.3.4",
"base64id": "~2.0.0",
+ "cors": "~2.8.5",
"debug": "~4.3.2",
- "engine.io": "~6.1.0",
- "socket.io-adapter": "~2.3.3",
- "socket.io-parser": "~4.0.4"
+ "engine.io": "~6.6.0",
+ "socket.io-adapter": "~2.5.2",
+ "socket.io-parser": "~4.2.4"
}
},
"socket.io-adapter": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.3.tgz",
- "integrity": "sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ==",
- "dev": true
+ "version": "2.5.5",
+ "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz",
+ "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==",
+ "dev": true,
+ "requires": {
+ "debug": "~4.3.4",
+ "ws": "~8.17.1"
+ },
+ "dependencies": {
+ "ws": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz",
+ "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==",
+ "dev": true,
+ "requires": {}
+ }
+ }
},
"socket.io-client": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.2.0.tgz",
- "integrity": "sha512-3GJ2KMh7inJUNAOjgf8NaKJZJa9uRyfryh2LrVJyKyxmzoXlfW9DeDNqylJn0ovOFt4e/kRLNWzMt/YqqEWYSA==",
+ "version": "4.8.1",
+ "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.1.tgz",
+ "integrity": "sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==",
"dev": true,
"requires": {
- "@types/component-emitter": "^1.2.10",
- "backo2": "~1.0.2",
- "component-emitter": "~1.3.0",
+ "@socket.io/component-emitter": "~3.1.0",
"debug": "~4.3.2",
- "engine.io-client": "~5.2.0",
- "parseuri": "0.0.6",
- "socket.io-parser": "~4.0.4"
+ "engine.io-client": "~6.6.1",
+ "socket.io-parser": "~4.2.4"
}
},
"socket.io-parser": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz",
- "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==",
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz",
+ "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==",
"dev": true,
"requires": {
- "@types/component-emitter": "^1.2.10",
- "component-emitter": "~1.3.0",
+ "@socket.io/component-emitter": "~3.1.0",
"debug": "~4.3.1"
}
},
@@ -36649,13 +36937,10 @@
}
},
"split2": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz",
- "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==",
- "dev": true,
- "requires": {
- "readable-stream": "^3.0.0"
- }
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz",
+ "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==",
+ "dev": true
},
"sprintf-js": {
"version": "1.0.3",
@@ -36897,15 +37182,6 @@
"integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
"dev": true
},
- "strip-indent": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
- "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
- "dev": true,
- "requires": {
- "min-indent": "^1.0.0"
- }
- },
"strip-json-comments": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
@@ -37139,19 +37415,25 @@
}
},
"tar": {
- "version": "6.1.11",
- "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz",
- "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==",
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz",
+ "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==",
"dev": true,
"requires": {
"chownr": "^2.0.0",
"fs-minipass": "^2.0.0",
- "minipass": "^3.0.0",
+ "minipass": "^5.0.0",
"minizlib": "^2.1.1",
"mkdirp": "^1.0.3",
"yallist": "^4.0.0"
},
"dependencies": {
+ "minipass": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
+ "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
+ "dev": true
+ },
"mkdirp": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
@@ -37193,12 +37475,12 @@
}
},
"terser": {
- "version": "5.14.2",
- "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz",
- "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==",
+ "version": "5.38.0",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.38.0.tgz",
+ "integrity": "sha512-a4GD5R1TjEeuCT6ZRiYMHmIf7okbCPEuhQET8bczV6FrQMMlFXA1n+G0KKjdlFCm3TEHV77GxfZB3vZSUQGFpg==",
"requires": {
- "@jridgewell/source-map": "^0.3.2",
- "acorn": "^8.5.0",
+ "@jridgewell/source-map": "^0.3.3",
+ "acorn": "^8.8.2",
"commander": "^2.20.0",
"source-map-support": "~0.5.20"
},
@@ -37220,34 +37502,50 @@
}
},
"terser-webpack-plugin": {
- "version": "5.2.4",
- "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.2.4.tgz",
- "integrity": "sha512-E2CkNMN+1cho04YpdANyRrn8CyN4yMy+WdFKZIySFZrGXZxJwJP6PMNGGc/Mcr6qygQHUUqRxnAPmi0M9f00XA==",
- "requires": {
- "jest-worker": "^27.0.6",
- "p-limit": "^3.1.0",
- "schema-utils": "^3.1.1",
- "serialize-javascript": "^6.0.0",
- "source-map": "^0.6.1",
- "terser": "^5.7.2"
+ "version": "5.3.11",
+ "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.11.tgz",
+ "integrity": "sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==",
+ "requires": {
+ "@jridgewell/trace-mapping": "^0.3.25",
+ "jest-worker": "^27.4.5",
+ "schema-utils": "^4.3.0",
+ "serialize-javascript": "^6.0.2",
+ "terser": "^5.31.1"
},
"dependencies": {
- "p-limit": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
- "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "ajv": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
+ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
"requires": {
- "yocto-queue": "^0.1.0"
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ }
+ },
+ "ajv-keywords": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+ "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
+ "requires": {
+ "fast-deep-equal": "^3.1.3"
}
},
+ "json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
+ },
"schema-utils": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
- "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz",
+ "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==",
"requires": {
- "@types/json-schema": "^7.0.8",
- "ajv": "^6.12.5",
- "ajv-keywords": "^3.5.2"
+ "@types/json-schema": "^7.0.9",
+ "ajv": "^8.9.0",
+ "ajv-formats": "^2.1.1",
+ "ajv-keywords": "^5.1.0"
}
}
}
@@ -37280,9 +37578,9 @@
}
},
"text-extensions": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz",
- "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==",
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz",
+ "integrity": "sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==",
"dev": true
},
"text-table": {
@@ -37363,6 +37661,12 @@
"integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=",
"dev": true
},
+ "tinyexec": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz",
+ "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==",
+ "dev": true
+ },
"tmp": {
"version": "0.0.33",
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
@@ -37417,12 +37721,6 @@
"integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
"dev": true
},
- "trim-newlines": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz",
- "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==",
- "dev": true
- },
"trim-repeated": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz",
@@ -37437,6 +37735,8 @@
"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.4.0.tgz",
"integrity": "sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A==",
"dev": true,
+ "optional": true,
+ "peer": true,
"requires": {
"@cspotcode/source-map-support": "0.7.0",
"@tsconfig/node10": "^1.0.7",
@@ -37513,10 +37813,11 @@
}
},
"typescript": {
- "version": "4.5.4",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz",
- "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==",
- "dev": true
+ "version": "5.7.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz",
+ "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==",
+ "dev": true,
+ "peer": true
},
"ua-parser-js": {
"version": "0.7.35",
@@ -37549,6 +37850,11 @@
"which-boxed-primitive": "^1.0.2"
}
},
+ "undici-types": {
+ "version": "6.20.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz",
+ "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg=="
+ },
"unicode-canonical-property-names-ecmascript": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
@@ -37623,12 +37929,12 @@
"dev": true
},
"update-browserslist-db": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz",
- "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==",
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz",
+ "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==",
"requires": {
- "escalade": "^3.1.1",
- "picocolors": "^1.0.0"
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
}
},
"uri-js": {
@@ -37645,6 +37951,14 @@
"integrity": "sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==",
"dev": true
},
+ "utif": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/utif/-/utif-3.1.0.tgz",
+ "integrity": "sha512-WEo4D/xOvFW53K5f5QTaTbbiORcm2/pCL9P6qmJnup+17eYfKaEhDeX9PeQkuyEoIxlbGklDuGl8xwuXYMrrXQ==",
+ "requires": {
+ "pako": "^1.0.5"
+ }
+ },
"util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
@@ -37703,9 +38017,9 @@
"dev": true
},
"watchpack": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
- "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==",
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz",
+ "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==",
"requires": {
"glob-to-regexp": "^0.4.1",
"graceful-fs": "^4.1.2"
@@ -37736,55 +38050,44 @@
"dev": true
},
"webpack": {
- "version": "5.76.0",
- "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.0.tgz",
- "integrity": "sha512-l5sOdYBDunyf72HW8dF23rFtWq/7Zgvt/9ftMof71E/yUb1YLOBmTgA2K4vQthB3kotMrSj609txVE0dnr2fjA==",
- "requires": {
- "@types/eslint-scope": "^3.7.3",
- "@types/estree": "^0.0.51",
- "@webassemblyjs/ast": "1.11.1",
- "@webassemblyjs/wasm-edit": "1.11.1",
- "@webassemblyjs/wasm-parser": "1.11.1",
- "acorn": "^8.7.1",
- "acorn-import-assertions": "^1.7.6",
- "browserslist": "^4.14.5",
+ "version": "5.97.1",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz",
+ "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==",
+ "requires": {
+ "@types/eslint-scope": "^3.7.7",
+ "@types/estree": "^1.0.6",
+ "@webassemblyjs/ast": "^1.14.1",
+ "@webassemblyjs/wasm-edit": "^1.14.1",
+ "@webassemblyjs/wasm-parser": "^1.14.1",
+ "acorn": "^8.14.0",
+ "browserslist": "^4.24.0",
"chrome-trace-event": "^1.0.2",
- "enhanced-resolve": "^5.10.0",
- "es-module-lexer": "^0.9.0",
+ "enhanced-resolve": "^5.17.1",
+ "es-module-lexer": "^1.2.1",
"eslint-scope": "5.1.1",
"events": "^3.2.0",
"glob-to-regexp": "^0.4.1",
- "graceful-fs": "^4.2.9",
+ "graceful-fs": "^4.2.11",
"json-parse-even-better-errors": "^2.3.1",
"loader-runner": "^4.2.0",
"mime-types": "^2.1.27",
"neo-async": "^2.6.2",
- "schema-utils": "^3.1.0",
+ "schema-utils": "^3.2.0",
"tapable": "^2.1.1",
- "terser-webpack-plugin": "^5.1.3",
- "watchpack": "^2.4.0",
+ "terser-webpack-plugin": "^5.3.10",
+ "watchpack": "^2.4.1",
"webpack-sources": "^3.2.3"
},
"dependencies": {
"enhanced-resolve": {
- "version": "5.12.0",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz",
- "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==",
+ "version": "5.18.1",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz",
+ "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==",
"requires": {
"graceful-fs": "^4.2.4",
"tapable": "^2.2.0"
}
},
- "schema-utils": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
- "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
- "requires": {
- "@types/json-schema": "^7.0.8",
- "ajv": "^6.12.5",
- "ajv-keywords": "^3.5.2"
- }
- },
"tapable": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
@@ -37892,13 +38195,13 @@
}
},
"webpack-dev-middleware": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.1.tgz",
- "integrity": "sha512-81EujCKkyles2wphtdrnPg/QqegC/AtqNH//mQkBYSMqwFVCQrxM6ktB2O/SPlZy7LqeEfTbV3cZARGQz6umhg==",
+ "version": "5.3.4",
+ "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz",
+ "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==",
"dev": true,
"requires": {
"colorette": "^2.0.10",
- "memfs": "^3.4.1",
+ "memfs": "^3.4.3",
"mime-types": "^2.1.31",
"range-parser": "^1.2.1",
"schema-utils": "^4.0.0"
@@ -38039,9 +38342,9 @@
}
},
"ws": {
- "version": "8.6.0",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.6.0.tgz",
- "integrity": "sha512-AzmM3aH3gk0aX7/rZLYvjdvZooofDu3fFOzGqcSnQ1tOcTWwhM/o+q++E8mAyVVIyUdajrkzWUGftaVSDLn1bw==",
+ "version": "8.18.0",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz",
+ "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==",
"dev": true,
"requires": {}
}
@@ -38260,30 +38563,19 @@
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
},
"ws": {
- "version": "7.4.6",
- "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz",
- "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==",
+ "version": "7.5.10",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz",
+ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==",
"dev": true,
"requires": {}
},
"wslink": {
- "version": "1.6.4",
- "resolved": "https://registry.npmjs.org/wslink/-/wslink-1.6.4.tgz",
- "integrity": "sha512-mWabC1eJLH+uSdndsnEkZcYpkh6Z+Xgzh8ph7jR8KRDQ61akeebVB2xZ/rzvltu/xGdzZe+ngoDgwkXiD5fMCw==",
+ "version": "1.12.4",
+ "resolved": "https://registry.npmjs.org/wslink/-/wslink-1.12.4.tgz",
+ "integrity": "sha512-4AJtHZ0qtBa7zOp0e3R5OJxQ6HY9eo+jDPcjms6E2ChXgQ5D4hlMynFF8mEFXx54+PmLo8f2DMiM9bxN6QTAjg==",
"dev": true,
"requires": {
- "json5": "2.2.0"
- },
- "dependencies": {
- "json5": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz",
- "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==",
- "dev": true,
- "requires": {
- "minimist": "^1.2.5"
- }
- }
+ "json5": "2.2.3"
}
},
"xml2js": {
@@ -38328,9 +38620,9 @@
}
},
"xmlhttprequest-ssl": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz",
- "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==",
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz",
+ "integrity": "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==",
"dev": true
},
"xtend": {
@@ -38378,22 +38670,19 @@
"integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
"dev": true
},
- "yeast": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
- "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=",
- "dev": true
- },
"yn": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
"integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
- "dev": true
+ "dev": true,
+ "optional": true,
+ "peer": true
},
"yocto-queue": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
- "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz",
+ "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==",
+ "dev": true
},
"yoctocolors": {
"version": "2.1.1",
diff --git a/package.json b/package.json
index a402e60d822..c436f311e92 100644
--- a/package.json
+++ b/package.json
@@ -43,6 +43,7 @@
"shelljs": "0.8.5",
"spark-md5": "3.0.2",
"stream-browserify": "3.0.0",
+ "utif": "3.1.0",
"webworker-promise": "0.5.0",
"worker-loader": "3.0.8",
"xmlbuilder2": "3.0.2"
@@ -52,8 +53,8 @@
"@babel/eslint-parser": "7.22.11",
"@babel/plugin-transform-runtime": "7.22.10",
"@babel/preset-env": "7.22.10",
- "@commitlint/cli": "16.2.4",
- "@commitlint/config-conventional": "16.2.4",
+ "@commitlint/cli": "19.7.1",
+ "@commitlint/config-conventional": "19.7.1",
"@mapbox/node-pre-gyp": "1.0.9",
"@rollup/plugin-alias": "3.1.9",
"@rollup/plugin-babel": "5.3.1",
@@ -61,6 +62,7 @@
"@rollup/plugin-eslint": "8.0.2",
"@rollup/plugin-json": "4.1.0",
"@rollup/plugin-node-resolve": "13.1.3",
+ "@types/node": "^22.13.1",
"autoprefixer": "10.4.7",
"babel-loader": "8.2.5",
"babel-plugin-istanbul": "6.1.1",
@@ -71,7 +73,7 @@
"cross-env": "7.0.3",
"css-loader": "6.7.1",
"dotenv": "16.0.1",
- "dox": "0.9.1",
+ "dox": "1.0.0",
"eslint": "8.15.0",
"eslint-config-airbnb": "19.0.4",
"eslint-config-prettier": "8.5.0",
@@ -104,7 +106,7 @@
"prettier": "2.6.2",
"process": "0.11.10",
"regenerator-runtime": "0.13.9",
- "rollup": "2.73.0",
+ "rollup": "2.79.2",
"rollup-plugin-auto-external": "2.0.0",
"rollup-plugin-copy": "3.4.0",
"rollup-plugin-ignore": "1.0.10",
@@ -118,14 +120,14 @@
"string-replace-loader": "3.1.0",
"style-loader": "3.3.1",
"tape": "5.5.3",
- "webpack": "5.76.0",
+ "webpack": "5.97.1",
"webpack-bundle-analyzer": "4.5.0",
"webpack-cli": "4.9.2",
"webpack-dashboard": "3.3.7",
"webpack-dev-server": "4.9.0",
"webpack-merge": "5.8.0",
"webpack-notifier": "1.15.0",
- "wslink": "1.6.4",
+ "wslink": "1.12.4",
"xml2js": "0.5.0"
},
"peerDependencies": {
@@ -141,7 +143,7 @@
"lint": "eslint Sources Examples",
"doc": "kw-doc -c ./Documentation/config.js",
"doc:www": "npm t -- --single-run && kw-doc -c ./Documentation/config.js -s",
- "doc:publish": "kw-doc -c ./Documentation/config.js -mp",
+ "doc:minified": "kw-doc -c ./Documentation/config.js -m",
"doc:generate-api": "node ./Documentation/generate-api-docs.js",
"example": "node ./Utilities/ExampleRunner/example-runner-cli.js -c ./Documentation/config.js",
"example:https": "node ./Utilities/ExampleRunner/example-runner-cli.js --server-type https -c ./Documentation/config.js",
@@ -149,7 +151,7 @@
"dev:esm": "npm run build:esm -- -w",
"dev:umd": "webpack --watch --config webpack.dev.js --progress",
"build": "npm run build:release",
- "build:esm": "npm run patch-build-deps && rollup -c rollup.config.js",
+ "build:esm": "rollup -c rollup.config.js",
"build:umd": "webpack --config webpack.prod.js --progress",
"build:release": "npm run lint && concurrently \"cross-env NOLINT=1 npm run build:esm\" \"cross-env NOLINT=1 npm run build:umd\"",
"release:create-packages": "node ./Utilities/ci/build-npm-package.js",
@@ -162,7 +164,7 @@
"commit": "git cz",
"semantic-release": "semantic-release",
"prepare": "node ./Utilities/prepare.js",
- "patch-build-deps": "patch-package --patch-dir ./Utilities/build/patches"
+ "postinstall": "patch-package"
},
"config": {
"commitizen": {
diff --git a/patches/dox+1.0.0.patch b/patches/dox+1.0.0.patch
new file mode 100644
index 00000000000..9d347414c65
--- /dev/null
+++ b/patches/dox+1.0.0.patch
@@ -0,0 +1,13 @@
+diff --git a/node_modules/dox/lib/dox.js b/node_modules/dox/lib/dox.js
+index be4786e..8fb9a0b 100644
+--- a/node_modules/dox/lib/dox.js
++++ b/node_modules/dox/lib/dox.js
+@@ -450,6 +450,8 @@ exports.parseTagTypes = function(str, tag) {
+ return [type.subject.name]
+ } else if (type && type.value) {
+ return transform(type.value);
++ } else if (type && type.type === "ANY") {
++ return ['*'];
+ } else {
+ return type.toString();
+ }
diff --git a/Utilities/build/patches/rollup-plugin-copy+3.4.0.patch b/patches/rollup-plugin-copy+3.4.0.patch
similarity index 100%
rename from Utilities/build/patches/rollup-plugin-copy+3.4.0.patch
rename to patches/rollup-plugin-copy+3.4.0.patch
diff --git a/Utilities/build/patches/rollup-plugin-web-worker-loader+1.6.1.patch b/patches/rollup-plugin-web-worker-loader+1.6.1.patch
similarity index 100%
rename from Utilities/build/patches/rollup-plugin-web-worker-loader+1.6.1.patch
rename to patches/rollup-plugin-web-worker-loader+1.6.1.patch
diff --git a/rollup.config.js b/rollup.config.js
index 627650cc8b5..5f58c65efcd 100644
--- a/rollup.config.js
+++ b/rollup.config.js
@@ -183,15 +183,26 @@ export default {
return relatifyImports(content.toString(), (relImport) => {
let importPath = relImport;
const baseName = path.basename(base);
+ const baseDir = path.dirname(base);
if (
- baseName === 'index.d.ts' &&
- path.dirname(base) !== 'Sources' &&
- (importPath.startsWith('../') || importPath.startsWith('./'))
+ baseName !== 'index.d.ts' ||
+ path.dirname(base) === 'Sources'
+ ) {
+ return importPath;
+ }
+
+ // implicity imports ../index.d.ts -> ../.d.ts
+ if (importPath === '..') {
+ return `../${path.basename(path.dirname(baseDir))}`;
+ }
+
+ if (
+ importPath.startsWith('../') ||
+ importPath.startsWith('./')
) {
// this file will be moved up one folder, so
// all of its relative imports must be adjusted.
- const baseDir = path.dirname(base);
const resolvedImportPath = path.resolve(
`${baseDir}/${importPath}`
);